From: Stephane F. <f4...@us...> - 2001-06-02 17:56:41
|
Update of /cvsroot/hamlib/hamlib/src In directory usw-pr-cvs1:/tmp/cvs-serv23099 Modified Files: event.c misc.c serial.c serial.h Log Message: try to make hamlib more portable Index: event.c =================================================================== RCS file: /cvsroot/hamlib/hamlib/src/event.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** event.c 2001/03/04 13:06:36 1.3 --- event.c 2001/06/02 17:56:37 1.4 *************** *** 1,4 **** /* hamlib - Ham Radio Control Libraries ! Copyright (C) 2000 Stephane Fillod and Frank Singleton This file is part of the hamlib package. --- 1,4 ---- /* hamlib - Ham Radio Control Libraries ! Copyright (C) 2000,2001 Stephane Fillod and Frank Singleton This file is part of the hamlib package. *************** *** 29,32 **** --- 29,33 ---- #include <stdio.h> #include <sys/types.h> + #include <sys/time.h> #include <sys/stat.h> #include <sys/ioctl.h> *************** *** 40,44 **** #include "event.h" ! static void sa_sigio(int signum, siginfo_t *si, void *data); /* This one should be in an include file */ --- 41,49 ---- #include "event.h" ! #ifdef _WIN32 ! static void sa_sigiohandler(int signum); ! #else ! static void sa_sigioaction(int signum, siginfo_t *si, void *data); ! #endif /* This one should be in an include file */ *************** *** 58,64 **** * FIXME: multiple open will register several time SIGIO hndlr */ ! act.sa_sigaction = sa_sigio; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO; status = sigaction(SIGIO, &act, NULL); if (status < 0) --- 63,80 ---- * FIXME: multiple open will register several time SIGIO hndlr */ ! #ifdef _WIN32 ! act.sa_handler = sa_sigiohandler; ! #else ! act.sa_sigaction = sa_sigioaction; ! #endif ! sigemptyset(&act.sa_mask); + + #ifdef _WIN32 + act.sa_flags = 0; + #else act.sa_flags = SA_SIGINFO; + #endif + status = sigaction(SIGIO, &act, NULL); if (status < 0) *************** *** 71,74 **** --- 87,91 ---- strerror(errno)); + #ifndef _WIN32 status = fcntl(rig->state.fd, F_SETSIG, SIGIO); if (status < 0) *************** *** 80,83 **** --- 97,101 ---- rig_debug(RIG_DEBUG_ERR,"rig_open fcntl SETASYNC failed: %s\n", strerror(errno)); + #endif return RIG_OK; *************** *** 98,116 **** * to find out which rig generated this event, * and decode/process it. */ static int search_rig_and_decode(RIG *rig, void *data) { #if 0 siginfo_t *si = (siginfo_t*)data; - #endif - int bytes; - #if 0 if (rig->state.fd != si->si_fd) return -1; #else ! ioctl(rig->state.fd, FIONREAD, &bytes); /* get bytes in buffer */ ! if (bytes <= 0) ! return -1; #endif --- 116,149 ---- * to find out which rig generated this event, * and decode/process it. + * + * assumes rig!=NULL, rig->state.fd>=0 */ static int search_rig_and_decode(RIG *rig, void *data) { + fd_set rfds; + struct timeval tv; + int retval; #if 0 siginfo_t *si = (siginfo_t*)data; if (rig->state.fd != si->si_fd) return -1; #else ! FD_ZERO(&rfds); ! FD_SET(rig->state.fd, &rfds); ! /* Read status immediately. */ ! tv.tv_sec = 0; ! tv.tv_usec = 0; ! ! /* don't use FIONREAD to detect activity ! * since it is less portable than select ! * REM: EINTR possible with 0sec timeout? retval==0? ! */ ! retval = select(rig->state.fd+1, &rfds, NULL, NULL, &tv); ! if (retval < 0) { ! rig_debug(RIG_DEBUG_ERR, "search_rig_and_decode: select: %s\n", ! strerror(errno)); ! return -1; ! } #endif *************** *** 135,144 **** * then call rig->caps->decode_event() (this is done by search_rig) */ ! static void sa_sigio(int signum, siginfo_t *si, void *data) { ! rig_debug(RIG_DEBUG_VERBOSE, "sa_sigio: activity detected\n"); foreach_opened_rig(search_rig_and_decode, si); } --- 168,187 ---- * then call rig->caps->decode_event() (this is done by search_rig) */ ! #ifdef _WIN32 ! static void sa_sigiohandler(int signum) ! { ! rig_debug(RIG_DEBUG_VERBOSE, "sa_sigiohandler: activity detected\n"); ! ! foreach_opened_rig(search_rig_and_decode, NULL); ! } ! ! #else ! static void sa_sigioaction(int signum, siginfo_t *si, void *data) { ! rig_debug(RIG_DEBUG_VERBOSE, "sa_sigioaction: activity detected\n"); foreach_opened_rig(search_rig_and_decode, si); } + #endif Index: misc.c =================================================================== RCS file: /cvsroot/hamlib/hamlib/src/misc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** misc.c 2001/05/04 22:41:22 1.6 --- misc.c 2001/06/02 17:56:37 1.7 *************** *** 26,29 **** --- 26,33 ---- */ + #ifdef HAVE_CONFIG_H + #include "config.h" + #endif + #include <stdlib.h> #include <stdarg.h> *************** *** 207,211 **** * rig_debug * Debugging messages are done through stderr ! * TODO: add syslog suport if needed */ void rig_debug(enum rig_debug_level_e debug_level, const char *fmt, ...) --- 211,215 ---- * rig_debug * Debugging messages are done through stderr ! * TODO: add syslog support if needed */ void rig_debug(enum rig_debug_level_e debug_level, const char *fmt, ...) Index: serial.c =================================================================== RCS file: /cvsroot/hamlib/hamlib/src/serial.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -r1.9 -r1.10 *** serial.c 2001/02/15 00:00:11 1.9 --- serial.c 2001/06/02 17:56:37 1.10 *************** *** 3,12 **** * * serial.c - (C) Frank Singleton 2000 (vk...@ix...), ! * Stephane Fillod 2000 * Provides useful routines for read/write serial data for communicating * via serial interface. * ! * Parts of the PTT handling are inspired from soundmodem, an excellent ! * packet softmodem written by Thomas Sailer, HB9JNX. * * --- 3,12 ---- * * serial.c - (C) Frank Singleton 2000 (vk...@ix...), ! * Stephane Fillod 2000,2001 * Provides useful routines for read/write serial data for communicating * via serial interface. * ! * Parts of the PTT handling are derived from soundmodem, an excellent ! * ham packet softmodem written by Thomas Sailer, HB9JNX. * * *************** *** 54,60 **** #endif ! #ifdef __CYGWIN32__ ! /* include <winsock.h> for FIONREAD?? */ ! /* TODO: have a look in <winbase.h> for CTS/RTS and DTR/DSR control --SF */ #endif --- 54,61 ---- #endif ! #ifdef _WIN32 ! /* for CTS/RTS and DTR/DSR control --SF */ ! #include <windows.h> ! #include <winioctl.h> #endif *************** *** 158,161 **** --- 159,165 ---- speed = B57600; /* cool.. */ break; + case 115200: + speed = B115200; /* awsome! */ + break; default: rig_debug(RIG_DEBUG_ERR, "open_serial: unsupported rate specified: %d\n", *************** *** 350,353 **** --- 354,359 ---- */ + /* please, use read_block instead, and forget about non-portable FIONREAD */ + #ifdef WANT_DEPRECATED_READSLEEP int read_sleep(int fd, unsigned char *rxbuffer, int num , int read_delay) { *************** *** 373,376 **** --- 379,384 ---- } + #endif /* WANT_DEPRECATED_READSLEEP */ + /* * Write a block of count characters to file descriptor, *************** *** 586,593 **** --- 594,623 ---- */ + #ifdef _WIN32 + int ser_ptt_open(struct rig_state *rs) + { + const char *path = rs->ptt_path; + HANDLE h; + DCB dcb; + + h = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + if (h == INVALID_HANDLE_VALUE) { + rig_debug(RIG_DEBUG_ERR, "Cannot open PTT device \"%s\"\n", path); + return -1; + } + /* Check if it is a comm device */ + if (!GetCommState(h, &dcb)) { + rig_debug(RIG_DEBUG_ERR, "Device \"%s\" not a COM device\n", path); + CloseHandle(h); + return -1; + } + return (int)h; + } + #else int ser_ptt_open(struct rig_state *rs) { return open(rs->ptt_path, O_RDWR | O_NOCTTY); } + #endif /* *************** *** 612,615 **** --- 642,653 ---- switch(rs->ptt_type) { + #ifdef _WIN32 + /* TODO: log error with 0x%lx GetLastError() */ + case RIG_PTT_SERIAL_RTS: + return !EscapeCommFunction((HANDLE)rs->ptt_fd, pttx ? SETRTS : CLRRTS); + + case RIG_PTT_SERIAL_DTR: + return !EscapeCommFunction((HANDLE)rs->ptt_fd, pttx ? SETDTR : CLRDTR); + #else case RIG_PTT_SERIAL_RTS: y = TIOCM_RTS; *************** *** 619,622 **** --- 657,661 ---- y = TIOCM_DTR; return ioctl(rs->ptt_fd, pttx ? TIOCMBIS : TIOCMBIC, &y); + #endif default: *************** *** 657,660 **** --- 696,701 ---- switch(rs->ptt_type) { + #ifdef _WIN32 + #else case RIG_PTT_SERIAL_RTS: status = ioctl(rs->ptt_fd, TIOCMGET, &y); *************** *** 667,671 **** *pttx = y & TIOCM_DTR ? RIG_PTT_ON:RIG_PTT_OFF; return status; ! default: rig_debug(RIG_DEBUG_ERR,"Unsupported PTT type %d\n", --- 708,712 ---- *pttx = y & TIOCM_DTR ? RIG_PTT_ON:RIG_PTT_OFF; return status; ! #endif default: rig_debug(RIG_DEBUG_ERR,"Unsupported PTT type %d\n", *************** *** 712,715 **** --- 753,758 ---- switch(rs->dcd_type) { + #ifdef _WIN32 + #else case RIG_DCD_SERIAL_CTS: status = ioctl(rs->ptt_fd, TIOCMGET, &y); *************** *** 722,726 **** *dcdx = y & TIOCM_DSR ? RIG_DCD_ON:RIG_DCD_OFF; return status; ! default: rig_debug(RIG_DEBUG_ERR,"Unsupported DCD type %d\n", --- 765,769 ---- *dcdx = y & TIOCM_DSR ? RIG_DCD_ON:RIG_DCD_OFF; return status; ! #endif default: rig_debug(RIG_DEBUG_ERR,"Unsupported DCD type %d\n", *************** *** 758,765 **** --- 801,815 ---- } + #ifdef _WIN32 int ser_ptt_close(struct rig_state *rs) { + return CloseHandle((HANDLE)rs->ptt_fd); + } + #else + int ser_ptt_close(struct rig_state *rs) + { return close(rs->ptt_fd); } + #endif int par_ptt_close(struct rig_state *rs) Index: serial.h =================================================================== RCS file: /cvsroot/hamlib/hamlib/src/serial.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** serial.h 2001/02/15 00:00:11 1.5 --- serial.h 2001/06/02 17:56:37 1.6 *************** *** 34,38 **** --- 34,40 ---- int serial_open(struct rig_state *rs); + #if 0 int read_sleep(int fd, unsigned char *rxbuffer, int num , int read_delay); + #endif int read_block(int fd, unsigned char *rxbuffer, size_t count, int timeout); int write_block(int fd, const unsigned char *txbuffer, size_t count, int write_delay, int post_write_delay); |