/* Emulation terminal pour carte FORTH. Version 0.60 du 2 Novembre 2003. Ecrit par jpb.forth . */ /* Fichiers utilises */ #include #include #include #include #include #include #include /* Constantes */ #define SOH 1 #define EOT 4 #define ACK 6 #define CANCEL 24 #define NAK 21 /* Retour au debut de la ligne avec prompt "UNIX>" */ void crunix(void) { printf("\rUNIX>"); } /* Edition d'une chaine de caracteres */ void editln(char str[]) { int i; char entree[2]; entree[0] = 0; printf("\n"); crunix(); printf("%s",str); while(entree[0]!=13) { refresh(); while(read(fileno(stdin),entree,1)!=1); switch(entree[0]) { case 10: case 13: { entree[0] = 13; break; } case '\b': case 127: { i = strlen(str); if(i>0) { printf("\b \b"); str[i-1] = '\0'; } else putchar(7); break; } default: { i = strlen(str); if(i<74) { putchar(entree[0]); str[i] = entree[0]; str[i+1] = '\0'; } else putchar(7); break; } } } } /* Programme principal */ main() { unsigned char xmd_no_bloc,xmd_etat,xmd_tmp[128],xmd_pnt,xmd_somme; int xmd_nb_ok,xmd_nb_ko; int i,j,port; FILE *fichier; struct timeval tp; struct timezone tzp; struct termios configuration; long microsecondes,millisecondes,vitesse,parite,stop; unsigned char entree[1],sortie[1]; char strport[100],strrecu[100],stremis[100],strvite[10],strpari[10],strstop[10]; char c = ' '; initscr(); refresh(); cbreak(); noecho(); fcntl(fileno(stdin),F_SETFL,O_NONBLOCK); fichier = fopen("rs232.cfg","r"); if(fichier==NULL) { strcpy(strport,"inexistant\0"); strcpy(strrecu,"inexistant\0"); strcpy(stremis,"inexistant\0"); strcpy(strvite,"9600\0"); strcpy(strpari,"IMPAIRE\0"); strcpy(strstop,"1\0"); } else { fgets(strport,99,fichier); strport[strlen(strport)-1] = '\0'; fgets(strrecu,99,fichier); strrecu[strlen(strrecu)-1] = '\0'; fgets(stremis,99,fichier); stremis[strlen(stremis)-1] = '\0'; fgets(strvite,9,fichier); strvite[strlen(strvite)-1] = '\0'; fgets(strpari,9,fichier); strpari[strlen(strpari)-1] = '\0'; fgets(strstop,9,fichier); strstop[strlen(strstop)-1] = '\0'; fclose(fichier); }; printf("%c",'l'&31); crunix(); printf("Entrez dans le monde du FORTH\n"); crunix(); printf("\n"); crunix(); printf(" Copyright jpb.forth\n"); crunix(); printf("\n"); crunix(); printf(" Version 0.60 du 02/11/2003\n"); crunix(); printf(" http://jpb.forth.free.fr/\n"); crunix(); printf(" jpb_forth@yahoogroups.com\n"); crunix(); printf("\n"); crunix(); printf(" Que le FORTH soit avec TOI!\n"); crunix(); printf("\n"); crunix(); printf("Le port serie actuel est :\n"); crunix(); printf("%s\n",strport); crunix(); printf("Voulez-vous le changer (o/n) ? "); while((entree[0]!='o')&&(entree[0]!='O')&&(entree[0]!='n')&&(entree[0]!='N')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); }; if((entree[0]=='o')||(entree[0]=='O')) { printf("Oui alors faites la modification :"); editln(strport); } else printf("Non"); printf("\n"); crunix(); printf("La vitesse de transmission est de %s bauds,\n",strvite); crunix(); printf("voulez-vous la changer (o/n) ? "); entree[0] = 0; while((entree[0]!='o')&&(entree[0]!='O')&&(entree[0]!='n')&&(entree[0]!='N')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); }; if((entree[0]=='o')||(entree[0]=='O')) { printf("Oui alors choisissez :\n"); crunix(); printf(" 1->4800 2->9600 3->19200 4->38400 5->56600 6->115200 : "); c = ' '; while((c<'1')||(c>'6')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); c = entree[0]; } putchar(c); switch(c) { case '1': { strcpy(strvite,"4800\0"); vitesse = B4800; break; }; case '2': { strcpy(strvite,"9600\0"); vitesse = B9600; break; }; case '3': { strcpy(strvite,"19200\0"); vitesse = B19200; break; }; case '4': { strcpy(strvite,"38400\0"); vitesse = B38400; break; }; case '5': { strcpy(strvite,"57600\0"); vitesse = B57600; break; }; case '6': { strcpy(strvite,"115200\0"); vitesse = B115200; break; }; } } else { printf("Non"); if(strcmp(strvite,"4800\0")==0) vitesse = B4800; if(strcmp(strvite,"9600\0")==0) vitesse = B9600; if(strcmp(strvite,"19200\0")==0) vitesse = B19200; if(strcmp(strvite,"38400\0")==0) vitesse = B38400; if(strcmp(strvite,"57600\0")==0) vitesse = B57600; if(strcmp(strvite,"115200\0")==0) vitesse = B115200; }; printf("\n"); crunix(); printf("L'etat de la parite est %s,\n",strpari); crunix(); printf("voulez-vous le changer (o/n) ? "); entree[0] = 0; while((entree[0]!='o')&&(entree[0]!='O')&&(entree[0]!='n')&&(entree[0]!='N')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); }; if((entree[0]=='o')||(entree[0]=='O')) { printf("Oui alors choisissez :\n"); crunix(); printf(" 1->SANS 2->IMPAIRE 3->PAIRE : "); c = ' '; while((c<'1')||(c>'3')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); c = entree[0]; } putchar(c); switch(c) { case '1': { strcpy(strpari,"SANS\0"); parite = 0; break; }; case '2': { strcpy(strpari,"IMPAIRE\0"); parite = 1; break; }; case '3': { strcpy(strpari,"PAIRE\0"); parite = 2; break; }; } } else { printf("Non"); if(strcmp(strpari,"SANS\0")==0) parite = 0; if(strcmp(strpari,"IMPAIRE\0")==0) parite = 1; if(strcmp(strpari,"PAIRE\0")==0) parite = 2; }; printf("\n"); crunix(); printf("Le nombre de bit(s) de stop est de %s,\n",strstop); crunix(); printf("voulez-vous le changer (o/n) ? "); entree[0] = 0; while((entree[0]!='o')&&(entree[0]!='O')&&(entree[0]!='n')&&(entree[0]!='N')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); }; if((entree[0]=='o')||(entree[0]=='O')) { printf("Oui alors choisissez :\n"); crunix(); printf(" 1 ou 2 bit(s) de stop : "); c = ' '; while((c<'1')||(c>'2')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); c = entree[0]; } putchar(c); switch(c) { case '1': { strcpy(strstop,"1\0"); stop = 1; break; }; case '2': { strcpy(strstop,"2\0"); stop = 2; break; }; } } else { printf("Non"); if(strcmp(strstop,"1\0")==0) stop = 1; if(strcmp(strstop,"2\0")==0) stop = 2; }; port = open(strport,O_RDWR|O_NONBLOCK|O_NOCTTY); tcgetattr(port,&configuration); cfsetispeed(&configuration,vitesse); cfsetospeed(&configuration,vitesse); configuration.c_cflag &= ~CSIZE; configuration.c_cflag |= CS8; if(parite==0) configuration.c_cflag &= ~PARENB; else { configuration.c_cflag |= PARENB; if(parite==1) configuration.c_cflag |= PARODD; else configuration.c_cflag &= ~PARODD; }; if(stop==1) configuration.c_cflag &= ~CSTOPB; else configuration.c_cflag |= CSTOPB; configuration.c_cflag |= CREAD; configuration.c_cflag |= CLOCAL; configuration.c_cflag &= ~CRTSCTS; tcsetattr(port,TCSANOW,&configuration); c = '1'; while(c!='4') { switch(c) { case '1': { printf("\n"); crunix(); printf("\n"); crunix(); printf(" Dialogue FORTH, ^X pour en sortir.\n\r"); refresh(); entree[0] = 13; while(write(port,entree,1)!=1); while(entree[0]!=('X'&31)) { if(read(fileno(stdin),entree,1)==1) { if(entree[0]!=('X'&31)) while(write(port,entree,1)!=1); }; if(read(port,sortie,1)==1) { while(write(fileno(stdout),sortie,1)!=1); refresh(); } }; printf("\n"); crunix(); printf("\n"); crunix(); printf(" Interruption du dialogue FORTH.\n"); crunix(); printf("\n"); crunix(); printf(" Menu general :\n"); crunix(); printf("\n"); crunix(); printf(" 1 - Retour au dialogue FORTH,\n"); crunix(); printf(" 2 - Reception d'un fichier sous protocole XMODEM,\n"); crunix(); printf(" 3 - Transmission d'un fichier sous protocole XMODEM,\n"); crunix(); printf(" 4 - Fin de la connexion FORTH.\n"); crunix(); printf("\n"); crunix(); printf(" Choisir la fonction desiree : "); c = ' '; while((c<'1')||(c>'4')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); c = entree[0]; } putchar(c); break; }; case '2': { printf("\n"); crunix(); printf("\n"); crunix(); printf("Le fichier a recevoir est :\n"); crunix(); printf("%s\n",strrecu); crunix(); printf("Voulez-vous le changer (o/n) ? "); entree[0] = 0; while((entree[0]!='o')&&(entree[0]!='O')&&(entree[0]!='n')&&(entree[0]!='N')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); }; if((entree[0]=='o')||(entree[0]=='O')) { printf("Oui alors faites la modification :"); editln(strrecu); } else printf("Non"); printf("\n"); crunix(); printf(" Reception du fichier sous protocole XMODEM, ^X pour annuler.\n"); xmd_no_bloc = 1; xmd_etat = 1; xmd_nb_ok = 0; xmd_nb_ko = 0; crunix(); printf("\n"); crunix(); printf(" Blocs corrects : %4d , incorrects : %4d",xmd_nb_ok,xmd_nb_ko); fichier = fopen(strrecu,"w"); if(fichier==NULL) { printf("\n"); crunix(); printf(" Le chemin du fichier est incorrect."); c = '2'; } else { millisecondes = 0; microsecondes = 0; sortie[0] = NAK; while(write(port,sortie,1)!=1); while(xmd_etat!=0) { refresh(); entree[0] = 0; while((entree[0]==0)&&(read(port,sortie,1)!=1)) { if(read(fileno(stdin),entree,1)==1) { if(entree[0]==('X'&31)) { printf("\n"); crunix(); printf(" Annulation de la reception."); xmd_etat = 6; } else entree[0] = 0; }; gettimeofday(&tp,&tzp); if(((tp.tv_sec)&1)==1) { if(microsecondes==0) { microsecondes = 1; millisecondes += 1000; } } else { if(microsecondes==1) { microsecondes = 0; millisecondes += 1000; } }; if(millisecondes>9000) { millisecondes = 0; xmd_etat = 1; sortie[0] = NAK; while(write(port,sortie,1)!=1); } }; switch(xmd_etat) { case 1: { switch(sortie[0]) { case SOH: { xmd_etat = 2; millisecondes = 0; break; }; case EOT: { xmd_etat = 0; entree[0] = ACK; while(write(port,entree,1)!=1); break; }; case CANCEL: { xmd_etat = 0; break; }; default: { xmd_etat = 7; millisecondes = 8000; } }; break; }; case 2: { if(sortie[0]==(xmd_no_bloc&255)) xmd_etat = 3; else { xmd_etat = 7; millisecondes = 8000; }; break; }; case 3: { if(sortie[0]==((xmd_no_bloc^255)&255)) { xmd_etat = 4; xmd_pnt = 0; xmd_somme = 0; } else { xmd_etat = 7; millisecondes = 8000; }; break; }; case 4: { xmd_tmp[xmd_pnt] = sortie[0]; xmd_pnt += 1; xmd_somme += sortie[0]; if(xmd_pnt>127) xmd_etat = 5; break; }; case 5: { xmd_etat = 1; if((xmd_somme&255)==sortie[0]) { entree[0] = ACK; xmd_no_bloc += 1; xmd_nb_ok += 1; write(fileno(fichier),xmd_tmp,128); } else { entree[0] = NAK; xmd_nb_ko += 1; }; crunix(); printf(" Blocs corrects : %4d , incorrects : %4d",xmd_nb_ok,xmd_nb_ko); while(write(port,entree,1)!=1); break; }; case 6: { entree[0] = CANCEL; xmd_etat = 0; while(write(port,entree,1)!=1); break; } default: { /* Attente de la fin de la rŽception d'un mauvais bloc */ break; } } }; fclose(fichier); printf("\n"); crunix(); printf("\n"); crunix(); printf(" Fin de reception."); c = '1'; }; break; }; case '3': { printf("\n"); crunix(); printf("\n"); crunix(); printf("Le fichier a transmettre est :\n"); crunix(); printf("%s\n",stremis); crunix(); printf("Voulez-vous le changer (o/n) ? "); entree[0] = 0; while((entree[0]!='o')&&(entree[0]!='O')&&(entree[0]!='n')&&(entree[0]!='N')) { putchar(7); refresh(); while(read(fileno(stdin),entree,1)!=1); } if((entree[0]=='o')||(entree[0]=='O')) { printf("Oui alors faites la modification :"); editln(stremis); } else printf("Non"); xmd_no_bloc = 0; xmd_etat = 0; xmd_nb_ok = 0; xmd_nb_ko = 0; printf("\n"); crunix(); fichier = fopen(stremis,"r"); if(fichier==NULL) { printf(" Le fichier a transmettre n'existe pas."); c = '3'; } else { printf(" Transmission du fichier sous protocole XMODEM, ^X pour annuler.\n"); crunix(); printf("\n"); crunix(); xmd_etat = 1; sortie[0] = ACK; while(xmd_etat!=0) { switch(sortie[0]) { case ACK: { xmd_no_bloc += 1; j = read(fileno(fichier),xmd_tmp,128); if(j==0) xmd_etat = 2; else { if(j<128) { for(i=j;i<128;i++) xmd_tmp[i] = 0; }; xmd_nb_ok += 1; xmd_etat = 1; } break; }; case NAK: { xmd_nb_ko += 1; xmd_etat = 1; break; }; case CANCEL: { xmd_etat = 0; break; }; default: { break; } }; if(xmd_etat==1) { entree[0] = SOH; while(write(port,entree,1)!=1); entree[0] = xmd_no_bloc; while(write(port,entree,1)!=1); entree[0] = xmd_no_bloc^255; while(write(port,entree,1)!=1); xmd_somme = 0; for(i=0;i<128;i++) { entree[0] = xmd_tmp[i]; xmd_somme += entree[0]; while(write(port,entree,1)!=1); }; entree[0] = xmd_somme; while(write(port,entree,1)!=1); crunix(); printf(" Blocs transmis : %4d , retransmis : %4d",xmd_nb_ok,xmd_nb_ko); refresh(); entree[0] = 0; while((read(fileno(stdin),entree,1)!=1)&&(read(port,sortie,1)!=1)); if(entree[0]==('X'&31)) { entree[0] = CANCEL; while(write(port,entree,1)!=1); printf("\n"); crunix(); printf(" Annulation de la transmission."); xmd_etat = 0; } } else { if(xmd_etat==2) { xmd_etat = 0; entree[0] = EOT; while(write(port,entree,1)!=1); } } }; fclose(fichier); printf("\n"); crunix(); printf("\n"); crunix(); printf(" Fin de transmission."); c = '1'; }; break; } } }; close(port); fichier = fopen("rs232.cfg","w"); fputs(strport,fichier); fputc('\n',fichier); fputs(strrecu,fichier); fputc('\n',fichier); fputs(stremis,fichier); fputc('\n',fichier); fputs(strvite,fichier); fputc('\n',fichier); fputs(strpari,fichier); fputc('\n',fichier); fputs(strstop,fichier); fputc('\n',fichier); fclose(fichier); printf("\n"); crunix(); printf("\n"); crunix(); printf("Fin de la connexion FORTH.\n\r"); } /* FIN */