1

Voila, je fais cette année un tipe sur les codes de corrections d'erreurs, notemment sur les transmissions de données.
J'ai donc pensé à utilliser deux tis et à créer une perturbation lors de la transmission.

alors mes questions:

Les fonctions utillisées seront bien évidemment des fonctions de bas niveau pour l'envoi et la reception des données.
Je voulais savoir si la ti vérifiait par elle meme (meme en bas niveau) l'integrité des données? si c'est le cas ca pose probleme, le but étant de générer des erreurs dans la transmission afin de créer un algorithme qui les retrouve et les corrige!

2eme question, je viens de passer l'apres midi à regarder les doc sur le link, et j'ai vraiment du mal à en trouver... Mis à part celle de tigcc qui décrit les fonctions et quelques vagues sources de progs, j'ai rien trouvé. est ce que quelqu'un a fait un tuto dessus?

3emme question
En zieutant les codes sources certains progs utillisent transmit() et receive() et d'autres OSWriteLinkBlock() et OSReadLinkBlock(). en regardant dans l'aide de tigcc l'une renvoie sur l'autre... c'est les mêmes?

sinon vaut il mieux utilliser ces fonctions ou les pokeIO ou peek IO que j'ai trouvé par hasard dans peekpoke.h?

Enfait j'y connais pas grand chose, j'aimerais un avis éclairé sur la question, avant de foncer tete baissée
Merci d'avance smile

2

swal89 :
3emme question En zieutant les codes sources certains progs utillisent transmit() et receive() et d'autres OSWriteLinkBlock() et OSReadLinkBlock(). en regardant dans l'aide de tigcc l'une renvoie sur l'autre... c'est les mêmes?

Oui.
sinon vaut il mieux utilliser ces fonctions ou les pokeIO ou peek IO que j'ai trouvé par hasard dans peekpoke.h?

pokeIO et peekIO ne sont pas des fonction de link. Ce sont des fonctions pour accéder aux ports matériels. Maintenant, il y a des ports matériels correspondant au port link. Tout est décrit dans J89hw.txt. Mais les fonctions de plus haut niveau sont plus simples à utiliser.

Et sinon, je ne conseille pas OSWriteLinkBlock et OSReadLinkBlock, mais LIO_SendData et LIO_RecvData. Le linking est très simple en utilisant ces fonctions (vraiment un jeu d'enfants).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

oui, mais le probleme est le suivant, si j'utillise les fonctions traditionelles, je ne controle rien sur la transmission, qui est le but du programme...
Donc si j'ai bien compris avec peekUO et pokeIO on récupere et on envoie durectement sur le port?

En fait je cherche à envoyer normalement, mais récupérer exactement ce qu'il arrive au port, afin de pouvoir travailler sur les données éventuellement endomagées par la transmission...

4

Ça te dirait de lire J89hw.txt? Tout est écrit dedans...
$60000C RW ($8D when idle, write $E0 then $8D to reset, $8F when sending)
	Read to begin acknowledging link interrupt (level 4)
	:7	Autostart enable, should be set if $600005:3 is set
	:6	Disable byte sender/receiver (also disables interrupts)
	:5	Link timeout disable
	:4	-
	Trigger interrupt level 4 on ...
	:3	... error (timeout or protocol violation)
	:2	... any link activity
	:1	... transmit buffer empty
	:0	... byte in receive buffer
	Note: The link hardware generates lots of interrupts and the
	interrupt handler must know the reason for every one to be able to
	acknowledge them properly.  Otherwise the CPU will loop the
	interrupt handler over and over again...
	If OSC2 is turned off (in calc power-off mode), the only condition
	that can be detected and generate an interrupt (to wake up the
	processor) is "any link activity" (:2).

$60000D R- Current link status (interrupt reason)
	:7	Error (undefined if :3 =1)
		Reset link (#$E0 then #$8D to $60000C) to finish acknowledge.
	:6	Transmit buffer empty (undefined if :5 =1 or :7 =1)
		Write another byte to $60000F or clear $60000C:1 to finish
		acknowledge.
	:5	Byte in receive buffer (undefined if :7 =1)
		Read the byte from $60000F to finish acknowledge
	:4	Interrupt pending (always =1 in interrupt handler)
	:3	Link activity (AMS int handler quits immediately)
	:2	(?)External activity ("someone's talking to me!")
	:1	?? Almost always set
	:0	?? Always zero?
	The bits must be checked in this order: :3, :7, :5, :6.

$60000E RW Direct link port access
	:7-4	-
	:3	Live status of D1/ring/white  (1=pulled down)
	:2	Live status of D0/tip/red  (1=pulled down)
	:1	Activate (pull down) D1/ring/white
	:0	Activate (pull down) D0/tip/red
	Note: The byte sender/receiver will be confused by direct link port
	access, it should be disabled first.  (See $60000C:6.)
	* D0/tip/red is pulled down first (by sender) when sending a '0'.
	* D1/ring/white is pulled down first (by sender) when sending a '1'.
	* The innermost ring is signal ground.
	* The link port normally operates in a half-duplex mode where a bit
	  is sent by activating the corresponding line ("ring" or "tip") and
	  the receiver acknowledges by activating the other line.  The
	  sender now releases its line and finally the receiver releases the
	  acknowledge.  Whole bytes are always sent, LSB first.  An "error"
	  condition (="abort") is signalled by activating both lines at the
	  same time for ~250us.
	* When generating stereo sound, use tip/red for right channel and
	  ring/white for left channel.

$60000F RW One-byte link buffer
	:7-0	READ:  Read one byte from receive (incoming) buffer
		WRITE: Write one byte to transmit (outgoing) buffer
	See also $60000D.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

je viens de créer un petit programme tout con qui permet d'envoyer une chaine de caractaire via le link

explication: d'un coté on lance mon_programme("chaine_a_envoyer")
et de l'autre monprogramme() qui est censé retourner la chaine de carataire une fois recue

la variable r correspond à l'accusé de réception...

Mais voila rien ne marche, j'ai des erreurs à la compilation, je sais pas pourquoi...

Merci d'étre indulgent je suis débutant en C.... ;       } voila le code:// C Source File // Created 25/09/2004; 11:10:55 #include <tigcclib.h> // Main Function void _main(void) {        INT_HANDLER save_int_1;         save_int_1 = GetIntVec(AUTO_INT_1);     SetIntVec(AUTO_INT_1, DUMMY_HANDLER);                 ESI argptr; //argument    short argtype = 0; //type de l'agument    const char *envoi; //ptr vers la chaine de caratère    const char recu; //chaine à recevoir    char r=0; //byte de confirmation de reception    short key;    argptr = top_estack;    argtype = GetArgType(argptr);    envoi = GetStrnArg(argptr);        OSLinkOpen();        if (argtype == STR_TAG) //sender           {                ST_helpMsg("Connection en cours... [esc] pour annuler");             OSWriteLinkBlock(envoi,sizeof(char));                          for(;;)           {               OSReadLinkBlock(&r,1);                     key=kbhit();                          if(r==1)                               {                                    ST_helpMsg("Element envoyé avec succès");                                    break;                               }                          else                               {                                    OSWriteLinkBlock(envoi,sizeof(char));                               }                                                    if(kbhit())                       {                           OSdequeue (&key, kbd_queue());                           if(key==KEY_ESC)                              break;     //transmission interrompue                       }                                           }           }                             else //receiver     {          ST_helpMsg("Attente du message... [esc] pour annuler");          while(LIO_RecvData((char *)&recu,sizeof(char),7)!=0)               {                    key=kbhit();                                                                   if(kbhit())                                         {                                         OSdequeue (&key, kbd_queue());                                         if(key==KEY_ESC)                                         break;     //transmission interrompue                                         }                                              }                         OSWriteLinkBlock(&r,1);              push_END_TAG();         push_ANSI_string(&recu);         push_LIST_TAG();         }      OSLinkClose();  SetIntVec(AUTO_INT_1, save_int_1)

6

Des erreurs ? Nan j'ai compilé ton truc... ça compile nickel, il te manque juste la définition de la calculatrice pour laquelle tu compile en haut de ton fichier =>

Par exemple =>
#define USE_TI89
#define USE_TI92PLUS
#define USE_V200
#include <tigcclib.h>

7

Implicit declaration of function 'OSdequeue'.
Implicit declaration of function 'push_ANSI_string'.
Unresolved reference to 'OSdequeue'.
Unresolved reference to 'OSdequeue'.
Unresolved reference to 'push_ANSI_string'.

Voila la liste des erreurs que j'ai de mon coté... et je vois pas ou sont les problèmes...

8

Ce sont probablement des ROM_CALLs AMS 2.0x
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

Oui, ce sont des ROM_CALLs AMS 1.01 or Higher,
Vas dans project->options->compilation options->operating system->minimum AMS version
et remplace 1.00 par 1.01
Apres ça compile sans problemes smile
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/

10

oky merci ca compile...
mais ça ne marche pas ca fait meme planter vti (pour la ti qui envoie)

11

Deja pour utiliser des fonction comme kbhit il ne faut pas desactiver l'auto int1!!!

12

Rgarde deja les quelques modifs que j'ai fait. Que la partie reception! #include <tigcclib.h> // Main Function void _main(void) {      ESI argptr; //argument      short argtype = 0; //type de l'agument      const char *envoi; //ptr vers la chaine de caratère      char *recu; //chaine à recevoir      char r=0; //byte de confirmation de reception      short key;      argptr = top_estack;      argtype = GetArgType(argptr);      envoi = GetStrnArg(argptr);      OSLinkOpen();      if (argtype == STR_TAG) //sender      {           ST_helpMsg("Connection en cours... [esc] pour annuler");           OSWriteLinkBlock(envoi,sizeof(char));           for(;;)           {                OSReadLinkBlock(&r,1);                key=kbhit();                if(r==1)                {                     ST_helpMsg("Element envoyé avec succès");                     break;                }                else OSWriteLinkBlock(envoi,sizeof(char));                if(kbhit())                {                     OSdequeue (&key, kbd_queue());                     if(key==KEY_ESC)                     break;     //transmission interrompue                }           }      }      else //receiver      {           ST_helpMsg("Attente du message... [esc] pour annuler");           while(LIO_RecvData(&recu,sizeof(char),7)!=0)           {                if(kbhit())                {                     OSdequeue (&key, kbd_queue());                     if(key==KEY_ESC)                     break;     //transmission interrompue                }           }      OSWriteLinkBlock(&r,1);           push_END_TAG();      push_ANSI_string(recu);      push_LIST_TAG();      }      OSLinkClose();       }

13

oui, comme ca ca plante plus lol, je sais pas pkoi j'avait désactivé l'auto int 1, il me semblait l'avoir lu...

Sinon, apparement ca tranmet la chaine mais ya des bugs:
1 la caltos qui recoit, s'arrete bien apres avoir recu la cahine mais ne la renvoie pas, pourquoi? j'ai réussi à l'afficher dans la status line en ajoutant à la fin avant de quitter
ST_helpMsg(recu);
mais ca n'affiche pas la chaine envoyé mais d'autres caractaires!

Sinon, la calcu emetteuse, elle ne s'arrete pas, pourquoi?

[edit] en fait ca marche pas du tout ca m'affiche tjs la meme chaine à la réception... confus fou

14

15

lol, ui, mais pas comme ca smile la je cherche à transmettre un truc et que ca marche, on verra apres pr la génération d'erreurs...

16

17

oui, oui, j'ai regardé quelques sources. un pong et titron

18

j'ai recommencé le programme avec une autre méthode:
envoyer le nombre de lettres puis le message lettre par lettre mais ca ne marche pas sad
pourquoi?
// C Source File // Created 26/09/2004; 10:33:26 // Delete or comment out the items you do not need. #include <tigcclib.h> // Main Function void _main(void) {      ESI argptr; //argument   short argtype = 0; //type de l'agument   const char *envoi; //ptr vers la chaine de caratère à envoyer   unsigned short i; //compteur   argptr = top_estack; //pointeur vers le dernier élément de la pile   argtype = GetArgType(argptr); //type de l'argument   envoi = GetStrnArg(argptr); //pointeur vers l'argument (chaine de caractères)   char s=1; //initialisation de la connection   unsigned char nb; //nb de caractères à envoyer/recevoir...      char r=0; //char de lecture   char* message=NULL; //pointeur vers le message à recevoir   short key;        if (argtype != STR_TAG)       {       ST_helpMsg("Attente d'un message...");       i=0;       for(;;)                     {                                                 if(OSReadLinkBlock (&r,sizeof(char))) //reception d'un caractère                          {                               if(i==0) //réception du nombre de caractères                                {                                     nb=r;               message = (char*)malloc((nb+1)*sizeof(char)); //création du message de nb+1 caractères                                 OSWriteLinkBlock(&s,sizeof(char)); //envoi de l'accusé de connection                                }                               else                                {                                     message[i-1]=r;                                     if ((short)i==nb-1)                                     {                                      DlgMessage ("Message recu",message, BT_OK, 0);                                      break;                                          }                                }                                                              i++;                          }                                                    if(kbhit())                               {                                    OSdequeue (&key, kbd_queue());                                    if(key==KEY_ESC)                                         break;     //transmission interrompue                               }                                  }       }      else      {                    nb=strlen(envoi);                 ST_helpMsg("Connection en cours...");                 OSWriteLinkBlock(&nb,sizeof(char)); //envoi du nb de caractères                 for(;;)                     {                                     if(OSReadLinkBlock (&r,sizeof(char)))                  {                                       if(r==1)                           {                               for(i=0; i<strlen(envoi); i++)                                      {                                           OSWriteLinkBlock((char*)envoi[i],sizeof(char)); //envoi du message                                       break;                                      }                   }                         else                              {                               OSWriteLinkBlock(&nb,sizeof(char)); //envoi du nb de caractères                              }                                                         }                                            if(kbhit())                           {                                    OSdequeue (&key, kbd_queue());                                    if(key==KEY_ESC)                                    break;     //transmission interrompue                           }                                                                   }                     }       }

[edit] le OSLinkOpen() est manquant dans le source mais ce n'est pas la cause du pb...