/* loop.c v. 1.0 28 mai 2006 Manipulateur pour boucle d'appel CW 5 à 35 mots minute via la pin 17 SLCTIN du port parallèle. Codage CW des caractères écrit sur la base du programme d'entraînement à la CW d'Alan Cox GW4PTS. */ #include #include #include /* Configuration globale */ #define BASEPORT 0x378 /* lp0=0x3bc, lp1=0x378, lp2=0x278 */ int morse_speed = 15; /* 15 wpm, modif. par -s mots / minute */ typedef struct { char code; enum { NIL, DIH, DAH, SPA } data[7]; } Morse; Morse MorseTable[]= { ' ',SPA,NIL,NIL,NIL,NIL,NIL,NIL, 'A',DIH,DAH,NIL,NIL,NIL,NIL,NIL, 'B',DAH,DIH,DIH,DIH,NIL,NIL,NIL, 'C',DAH,DIH,DAH,DIH,NIL,NIL,NIL, 'D',DAH,DIH,DIH,NIL,NIL,NIL,NIL, 'E',DIH,NIL,NIL,NIL,NIL,NIL,NIL, 'F',DIH,DIH,DAH,DIH,NIL,NIL,NIL, 'G',DAH,DAH,DIH,NIL,NIL,NIL,NIL, 'H',DIH,DIH,DIH,DIH,NIL,NIL,NIL, 'I',DIH,DIH,NIL,NIL,NIL,NIL,NIL, 'J',DIH,DAH,DAH,DAH,NIL,NIL,NIL, 'K',DAH,DIH,DAH,NIL,NIL,NIL,NIL, 'L',DIH,DAH,DIH,DIH,NIL,NIL,NIL, 'M',DAH,DAH,NIL,NIL,NIL,NIL,NIL, 'N',DAH,DIH,NIL,NIL,NIL,NIL,NIL, 'O',DAH,DAH,DAH,NIL,NIL,NIL,NIL, 'P',DIH,DAH,DAH,DIH,NIL,NIL,NIL, 'Q',DAH,DAH,DIH,DAH,NIL,NIL,NIL, 'R',DIH,DAH,DIH,NIL,NIL,NIL,NIL, 'S',DIH,DIH,DIH,NIL,NIL,NIL,NIL, 'T',DAH,NIL,NIL,NIL,NIL,NIL,NIL, 'U',DIH,DIH,DAH,NIL,NIL,NIL,NIL, 'V',DIH,DIH,DIH,DAH,NIL,NIL,NIL, 'W',DIH,DAH,DAH,NIL,NIL,NIL,NIL, 'X',DAH,DIH,DIH,DAH,NIL,NIL,NIL, 'Y',DAH,DIH,DAH,DAH,NIL,NIL,NIL, 'Z',DAH,DAH,DIH,DIH,NIL,NIL,NIL, '1',DIH,DAH,DAH,DAH,DAH,NIL,NIL, '2',DIH,DIH,DAH,DAH,DAH,NIL,NIL, '3',DIH,DIH,DIH,DAH,DAH,NIL,NIL, '4',DIH,DIH,DIH,DIH,DAH,NIL,NIL, '5',DIH,DIH,DIH,DIH,DIH,NIL,NIL, '6',DAH,DIH,DIH,DIH,DIH,NIL,NIL, '7',DAH,DAH,DIH,DIH,DIH,NIL,NIL, '8',DAH,DAH,DAH,DIH,DIH,NIL,NIL, '9',DAH,DAH,DAH,DAH,DIH,NIL,NIL, '0',DAH,DAH,DAH,DAH,DAH,NIL,NIL, '/',DAH,DIH,DIH,DAH,DIH,NIL,NIL, '+',DIH,DAH,DIH,DAH,DIH,NIL,NIL, '.',DIH,DAH,DIH,DAH,DIH,DAH,NIL, '-',DAH,DIH,DIH,DIH,DIH,DAH,NIL, '=',DAH,DIH,DIH,DIH,DAH,NIL,NIL, ',',DAH,DAH,DIH,DIH,DAH,DAH,NIL, '?',DIH,DIH,DAH,DAH,DIH,DIH,NIL, 0, NIL,NIL,NIL,NIL,NIL,NIL,NIL /* marqueur de fin TAB */ }; Morse *CharToMorse(char c) { int ct=0; while(MorseTable[ct].code) { if(MorseTable[ct].code==c) return(&MorseTable[ct]); ct++; } return(NULL); } void PlayBeep(long duration) { ioperm(BASEPORT + 2, 1, 1); /* dem. accès offset 2 de lp */ outb(0, BASEPORT + 2); /* bit D4 (pin 17 du port //) */ usleep(1000000 * duration / morse_speed); outb(8, BASEPORT + 2); } void PlayMorse(Morse *m) { int d = 0; while(d < 6 && m->data[d] != NIL) { if(m->data[d] ==DIH) PlayBeep(1); if(m->data[d] == DAH) PlayBeep(3); if(m->data[d] == SPA) usleep(1000000 / morse_speed); d++; usleep(1000000 / morse_speed); /* delai inter-signe */ } usleep(2000000 / morse_speed); /* delai inter-caractères */ } void PlayMorseString(char *x) { while(*x) { char c = islower(*x) ? toupper(*x) : *x; Morse *m = CharToMorse(c); if(m != NULL) { PlayMorse(m); } x++; } } void main(int argc, char *argv[]) { char **argp; int num1; if(argc==1 || argv[1][0]!='-' || argv[1][1] == 'h') { fprintf(stderr, "\n\ USAGE :\n\n\ Texte balise : %s -t \"message\"\n\ \n\ Option supplémentaire (à placer en premier) :\n\ Vitesse CW : %s -v vitesse en mots par minute (defaut: 15 wpm)\n\n\ Exemples : loop -t \"cq de f5yg + k \"\n\ (CQ DE F5YG + K manipulé en boucle à 15 mots par minute)\n\n\ loop -v 25 -t \"TEST DE F5YG \"\n\ (TEST DE F5YG manipulé en boucle à 25 mots par minute)\n\n", argv[0], argv[0], argv[0]); exit(1); } argp = argv; while(argc > 2) { if(strcmp(argp[1], "-v") == 0) { if(sscanf(argp[2], "%d", &num1) == 0) { fprintf(stderr, "Doit être un nombre.\n"); exit(1); } if(num1 < 5 || num1 > 35) { fprintf(stderr, "Vitesse entre 5 et 35 wpm.\n"); exit(1); } morse_speed = num1; argc -= 2; argp += 2; } else break; } if(argc < 2) { fprintf(stderr, "-t et texte entre guillemets obligatoire.\n"); exit(1); } /* Arguments de la ligne de commande */ switch(argp[1][1]) { case 't': if(argc != 3) { fprintf(stderr, "%s -t \"texte\".\n", argv[0]); exit(1); } for (;;) { PlayMorseString(argp[2]); } break; default: fprintf(stderr, "Option inconnue'%c', %s -h pour aide.\n",argp[1][1],argv[0]); exit(1); } }