/* stiskanje ptt poteka z uporabo RTS (request to send) linije RS-232. * to linijo nastavlja terminal --- računalnik. če gledamo terminalov konektor: * * potrebujemo en N-channel enchancement MOSFET od -15 V do +15 V UGS in 3,3 V UDS za majhen tok * * * * * * * <- GND priklopimo na skupen ground plane * * * * * * ^-. RTS ima napetost od +3 V do +15 V, ko je v stanju 1 * | ima napetost od -3 V do -15 V, ko je v stanju 0 * >-[ R ]-> GND * | dovolj upora mora biti. recimo 10k, da teče maksimalno 15 mA * G * GND <-S D-v-[ R ]-> 3V3 * | * `-> PTT je torej 0, ko je RTS 1, torej takrat odddaja * ko je RTS 0 ali pa je odklopljen, pa je PTT 1, torej ne TXa * * da preprečimo smetenje spektra, je treba v primeru programske napake, torej ko ptt() ne vrne 0, * zapreti celoten program z neničelno kodo. lupina, ki program zažene, mora v primeru neničelne kode * pognati program ptt z argumentom 0, ki izklopi PTT. v kolikor še program ptt vrne neničelno kodo, * lahko lupina poizkusi še s programom ptt0, ki je suid datoteka, ali pa izklopi računalnik. * * ptt0 bo, v kolikor nastavitev RTS ni uspela, sam izklopil računalnik. računalnik je treba izklopiti zato, ker stanje RTS ostane nespremenjeno po izklopu procesa, ki je odprl tty napravo in lahko le s prekinitvijo napajanja zagotovimo, da gre RTS v stanje 0 * * program ptt dobimo tako, da prevedemo to datoteko direktno -- ne kot #include. * program ptt0 dobimo tako, da prevedemo to datoteko direktno in dodamo -DPTT0=/dev/ttyS0 stikalo v prevajalnik, kjer je treba pravilno nastaviti pot do uporabljene serijske naprave * */ #include #include #include #include #include #include #include #include #include #include #include #define S0(x) ((x) ? (x) : "") int ptt (int fd, int stanje) { int status; if (fd < 0) return EBADF; if (ioctl(fd, TIOCMGET, &status) == -1) return errno; status &= ~TIOCM_RTS; if (stanje) status |= TIOCM_RTS; if (ioctl(fd, TIOCMSET, &status) == -1) return errno; return 0; } #if __INCLUDE_LEVEL__ == 0 int main (int argc, char ** argv) { int r = 0; #ifndef PTT0 if (argc != 1+2) error_at_line(1, 0, __FILE__, __LINE__, "%s /dev/ttyS0 0/1", S0(argv[0])); #define DEV (argv[1]) #define STATUS (atoi(argv[2])) #else #define DEV (PTT0) #define STATUS (0) #endif int dev = open(DEV, O_RDWR); if (dev == -1) error_at_line(2, errno, __FILE__, __LINE__, "open(DEV, O_RDWR)"); int ret = ptt(dev, STATUS); if (ret) { error_at_line(0, ret, __FILE__, __LINE__, "ptt(dev, STATUS)"); r = 3; goto r; } r: if (close(dev) == -1) error_at_line(0, errno, __FILE__, __LINE__, "close(dev)"); return r; } #endif