/* beacon.c v. 1.1 28 mai 2006 Manipulateur pour balise QRSS3 à QRSS120 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_interval = 1; /* 1 mn, modif. par -d délai balise */ int morse_speed = 3; /* QRSS3, modif. par -s facteur de QRSS */ 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, 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 //) */ sleep(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) sleep(morse_speed); d++; sleep(morse_speed); /* delai inter-signe */ } sleep(2 * 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\ Options supplémentaires (à placer en premier) :\n\ Délai balise : %s -d délai entre transmissions (defaut: 1 min)\n\ Facteur QRSS : %s -s durée d'un point en sec. (defaut: QRSS3)\n\n\ Exemples : beacon -t \"f5yg\"\n\ (F5YG est manipulé en mode QRSS3 avec un espace de 1 mn entre chaque)\n\n\ beacon -s 120 -d 30 -t \"NA\"\n\ (NA est manipulé en mode QRSS120 avec un espace de 30 mn entre chaque)\n\n", argv[0], argv[0], argv[0]); exit(1); } argp = argv; while(argc > 2) { if(strcmp(argp[1], "-d") == 0) { if(sscanf(argp[2], "%d", &num1) == 0) { fprintf(stderr, "Doit être un nombre.\n"); exit(1); } if(num1 < 1 || num1 > 30) { fprintf(stderr, "Délai de 1 à 30min.\n"); exit(1); } morse_interval = num1; argc -= 2; argp += 2; } else if(strcmp(argp[1], "-s") == 0) { if(sscanf(argp[2], "%d", &num1) == 0) { fprintf(stderr, "Doit être un nombre.\n"); exit(1); } if(num1 < 3 || num1 > 120) { fprintf(stderr, "QRSS entre 3 et 120.\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]); sleep(morse_interval * 60); } break; default: fprintf(stderr, "Option inconnue'%c', %s -h pour aide.\n",argp[1][1],argv[0]); exit(1); } }