1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 8 #include "serial.h" 9 #include "ip.h" 10 #include "debug.h" 11 #include "tcpser.h" 12 13 14 15 int main(int argc, char* argv[]) { 16 struct timeval timer; 17 struct timeval* ptimer; 18 unsigned char tty[255]="/dev/ttyS2"; 19 //unsigned char addy[255]="dilbert:6400"; 20 unsigned char init[255]="at"; 21 unsigned char cr[1]="\x0d"; 22 int speed=38400; 23 int sfd=-1; 24 int csd=-1; 25 //int ssd=-1; 26 int max_fd=0; 27 fd_set readfs; 28 int res=0; 29 unsigned char buf[255]; 30 int rc; 31 32 log_init(); 33 log_set_trace_flags(TRACE_MODEM_IN | TRACE_MODEM_OUT); 34 log_set_level(7); 35 // open serial port 36 // config serial port 37 if(0 > (sfd = ser_init_conn(tty,speed))) { 38 ELOG(LOG_FATAL,"Could not open serial port"); 39 exit(-1); 40 } 41 42 // send init string 43 if(strlen(init) > 0) { 44 ser_write(sfd,init,strlen(init)); 45 ser_write(sfd,cr,1); 46 } 47 48 // if configured, listen on ip address 49 50 // check for carrier detect line 51 // when line goes high, connect to IP:port 52 // when line goes low, disconnect 53 for(;;) { 54 FD_ZERO(&readfs); 55 max_fd=sfd; 56 FD_SET(sfd, &readfs); 57 if(-1 < csd) { 58 // we are connected. 59 max_fd=MAX(max_fd,csd); 60 FD_SET(csd, &readfs); 61 } 62 max_fd++; 63 64 timer.tv_sec=0; 65 timer.tv_usec=1000; 66 ptimer=&timer; 67 68 LOG(LOG_ALL,"csd=%d",csd); 69 rc=select(max_fd, &readfs, NULL, NULL, ptimer); 70 if(-1 == rc) { 71 ELOG(LOG_WARN,"Select returned error"); 72 } else if (0 == rc) { 73 // timer popped. 74 if(-1 == csd && (ser_get_control_lines(sfd) & TIOCM_CD) > 0) { 75 // we need to connect 76 // commented out for now. 77 //csd=ip_connect(addy); 78 } else if(-1 < csd && (ser_get_control_lines(sfd) & TIOCM_CD) == 0) { 79 // we need to disconnect. 80 ip_disconnect(csd); 81 csd=-1; 82 } 83 } else if(rc > 0) { 84 // we got data from someone. 85 if (FD_ISSET(sfd,&readfs)) { // serial port 86 LOG(LOG_DEBUG,"Data available on serial port"); 87 res = ser_read(sfd,buf,sizeof(buf) -1); 88 if(res > 0 && csd > -1) { 89 ip_write(csd,buf,res); 90 } 91 } 92 if (csd > -1 && FD_ISSET(csd,&readfs)) { // ip port 93 LOG(LOG_DEBUG,"Data available on tcp/ip port"); 94 res = ip_read(sfd,buf,sizeof(buf) -1); 95 if(res==0) { 96 // conn closed, disconnect. 97 ip_disconnect(csd); 98 csd=-1; 99 } 100 if(res > 0 && csd > -1) { 101 ser_write(csd,buf,res); 102 } 103 } 104 105 } 106 107 108 109 } 110 111 112 113 114 115 116 }