00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00025 #include "korebot.h"
00026 #include "knet_rs232.h"
00027
00028 #include <stdlib.h>
00029 #include <fcntl.h>
00030 #include <sys/stat.h>
00031 #include <termio.h>
00032
00033 static struct knet_dev_s * knet_rs232_open( struct knet_bus_s * bus ,
00034 knet_ext_t ext ,
00035 knet_mod_t mod ,
00036 const char * dev_name ,
00037 int argc , char * argv[] );
00038
00039 static void knet_rs232_close( knet_bus_t * bus ,
00040 knet_dev_t * dev );
00041
00042 static int knet_rs232_read( knet_bus_t * bus ,
00043 knet_dev_t * dev ,
00044 char * buf ,
00045 unsigned int len );
00046
00047 static int knet_rs232_write( knet_bus_t * bus ,
00048 knet_dev_t * dev ,
00049 const char * buf ,
00050 unsigned int len );
00051
00052
00063 int knet_rs232_init( knet_bus_t * bus , int argc , char * argv [] )
00064 {
00065 bus->exit = NULL;
00066 bus->open = knet_rs232_open;
00067 bus->close = knet_rs232_close;
00068 bus->transfer = NULL;
00069 bus->read = knet_rs232_read;
00070 bus->write = knet_rs232_write;
00071 return 0;
00072 }
00073
00074
00090 static struct knet_dev_s * knet_rs232_open( struct knet_bus_s * bus ,
00091 knet_ext_t ext ,
00092 knet_mod_t mod ,
00093 const char * name ,
00094 int argc , char * argv[] )
00095 {
00096 knet_dev_t * dev;
00097 knet_rs232_t * rs232;
00098 int fd;
00099
00100 dev = knet_bus_find_device_by_name( bus , name );
00101
00102 if ( dev == NULL ) {
00103
00104
00105
00106
00107
00108 if ( !access( name , (F_OK|R_OK|W_OK)) ) {
00109 dev = knet_device_create( bus , 0 , 0 , name );
00110 }
00111
00112
00113 }
00114
00115 if ( dev == NULL ) {
00116 kb_error( __FILE__ ,
00117 __LINE__ ,
00118 "knet_rs232_open" ,
00119 KB_ERROR_NODEVFOUNDSTR , name );
00120 return NULL;
00121 }
00122
00123 if ((fd=open(name,O_RDWR))<0) {
00124 kb_error( __FILE__ ,
00125 __LINE__ ,
00126 "knet_rs232_open" ,
00127 KB_ERROR_FILEOPEN ,
00128 name );
00129 return NULL;
00130 }
00131
00132 rs232 = KB_ALLOC(knet_rs232_t,1);
00133
00134 rs232->fd = fd;
00135
00136 tcgetattr(fd , &rs232->tios);
00137 rs232->tios.c_cflag = ( CS8 | CLOCAL | CREAD | B115200 );
00138 rs232->tios.c_iflag = IGNPAR;
00139 rs232->tios.c_oflag = 0;
00140 rs232->tios.c_lflag = 0;
00141 rs232->tios.c_cc[VMIN] = 0;
00142 rs232->tios.c_cc[VTIME] = 0;
00143 tcsetattr( fd , TCSANOW , &rs232->tios );
00144
00145 dev->info = (knet_dev_info_t*)rs232;
00146
00147 return (dev);
00148 }
00149
00150
00159 static void knet_rs232_close( knet_bus_t * bus ,
00160 knet_dev_t * dev )
00161 {
00162 knet_rs232_t * rs232 = dev->info;
00163
00164 if ( rs232 != NULL ) {
00165
00166 if ( rs232->fd != -1 )
00167 close(rs232->fd );
00168
00169 kb_free( rs232 );
00170 dev->info = NULL;
00171 }
00172 }
00173
00174
00189 static int knet_rs232_read( knet_bus_t * bus ,
00190 knet_dev_t * dev ,
00191 char * buf , unsigned int len )
00192 {
00193 knet_rs232_t * rs232 = dev->info;
00194
00195 if ( rs232 != NULL && rs232->fd != -1 )
00196 return read( rs232->fd , buf , len );
00197
00198 return -1;
00199 }
00200
00201
00202
00218 static int knet_rs232_write( knet_bus_t * bus ,
00219 knet_dev_t * dev ,
00220 const char * buf , unsigned int len )
00221 {
00222 knet_rs232_t * rs232 = dev->info;
00223
00224 if ( rs232 != NULL && rs232->fd != -1 )
00225 return write( rs232->fd , buf , len );
00226
00227 return -1;
00228 }