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
00088 static struct knet_dev_s * knet_rs232_open( struct knet_bus_s * bus ,
00089 knet_ext_t ext ,
00090 knet_mod_t mod ,
00091 const char * name ,
00092 int argc , char * argv[] )
00093 {
00094 knet_dev_t * dev;
00095 knet_rs232_t * rs232;
00096 int fd;
00097
00098 dev = knet_bus_find_device_by_name( bus , name );
00099
00100 if ( dev == NULL ) {
00101
00102
00103
00104
00105
00106 if ( !access( name , (F_OK|R_OK|W_OK)) ) {
00107 dev = knet_device_create( bus , 0 , 0 , name );
00108 }
00109
00110
00111 }
00112
00113 if ( dev == NULL ) {
00114 kb_error( __FILE__ ,
00115 __LINE__ ,
00116 "knet_rs232_open" ,
00117 KB_ERROR_NODEVFOUNDSTR , name );
00118 return NULL;
00119 }
00120
00121 if ((fd=open(name,O_RDWR))<0) {
00122 kb_error( __FILE__ ,
00123 __LINE__ ,
00124 "knet_rs232_open" ,
00125 KB_ERROR_FILEOPEN ,
00126 name );
00127 return NULL;
00128 }
00129
00130 rs232 = KB_ALLOC(knet_rs232_t,1);
00131
00132 rs232->fd = fd;
00133
00134 tcgetattr(fd , &rs232->tios);
00135 rs232->tios.c_cflag = ( CS8 | CLOCAL | CREAD | B115200 );
00136 rs232->tios.c_iflag = IGNPAR;
00137 rs232->tios.c_oflag = 0;
00138 rs232->tios.c_lflag = 0;
00139 rs232->tios.c_cc[VMIN] = 0;
00140 rs232->tios.c_cc[VTIME] = 0;
00141 tcsetattr( fd , TCSANOW , &rs232->tios );
00142
00143 dev->info = (knet_dev_info_t*)rs232;
00144
00145 return (dev);
00146 }
00147
00148
00157 static void knet_rs232_close( knet_bus_t * bus ,
00158 knet_dev_t * dev )
00159 {
00160 knet_rs232_t * rs232 = dev->info;
00161
00162 if ( rs232 != NULL ) {
00163
00164 if ( rs232->fd != -1 )
00165 close(rs232->fd );
00166
00167 kb_free( rs232 );
00168 dev->info = NULL;
00169 }
00170 }
00171
00172
00187 static int knet_rs232_read( knet_bus_t * bus ,
00188 knet_dev_t * dev ,
00189 char * buf , unsigned int len )
00190 {
00191 knet_rs232_t * rs232 = dev->info;
00192
00193 if ( rs232 != NULL && rs232->fd != -1 )
00194 return read( rs232->fd , buf , len );
00195
00196 return -1;
00197 }
00198
00199
00200
00216 static int knet_rs232_write( knet_bus_t * bus ,
00217 knet_dev_t * dev ,
00218 const char * buf , unsigned int len )
00219 {
00220 knet_rs232_t * rs232 = dev->info;
00221
00222 if ( rs232 != NULL && rs232->fd != -1 )
00223 return write( rs232->fd , buf , len );
00224
00225 return -1;
00226 }