5 A Linux/Unix toolset and driver for Nokia mobile phones.
7 Released under the terms of the GNU GPL, see file COPYING for more details.
12 #include "devices/unixserial.h"
13 #include "devices/unixirda.h"
14 #include "devices/tekram.h"
15 #include <sys/ioctl.h>
22 #include "devices/winserial.h"
26 #include "devices/device.h"
31 /* for VC6 make scripts save VERSION constant in mversion.h file */
35 char PortDevice[GSM_MAX_DEVICE_NAME_LENGTH]={0x00};
42 #if defined(__svr4__) || defined(__FreeBSD__)
46 int device_portfd = -1;
49 * Structure to store the filedescriptor we use.
52 int device_getfd(void)
57 int device_open(__const char *__file, int __with_odd_parity) {
59 switch (CurrentConnectionType) {
61 device_portfd = tekram_open(__file);
64 device_portfd = irda_open();
67 device_portfd = serial_opendevice(__file, __with_odd_parity, true, false);
71 return (device_portfd >= 0);
74 void device_close(void)
76 AppendLogText("CLOSE\n",false);
78 /* Now wait for thread to terminate. */
79 //pthread_join(Thread, NULL);
81 switch (CurrentConnectionType) {
82 case GCT_Tekram: tekram_close(device_portfd); break;
83 case GCT_Irda : irda_close(device_portfd); break;
84 default : serial_close(device_portfd); break;
90 void device_reset(void) {
93 void device_setdtrrts(int __dtr, int __rts)
95 switch (CurrentConnectionType) {
100 serial_setdtrrts(device_portfd, __dtr, __rts);
108 void device_changespeed(int __speed)
110 switch (CurrentConnectionType) {
114 tekram_changespeed(device_portfd, __speed);
117 serial_changespeed(device_portfd, __speed);
119 fprintf(stdout,_("Serial device: changing speed to %i\n"),__speed);
125 size_t device_read(__ptr_t __buf, size_t __nbytes)
127 switch (CurrentConnectionType) {
128 case GCT_Tekram: return (tekram_read(device_portfd, __buf, __nbytes)); break;
129 case GCT_Irda : return ( irda_read(device_portfd, __buf, __nbytes)); break;
130 default : return (serial_read(device_portfd, __buf, __nbytes)); break;
134 size_t device_write(__const __ptr_t __buf, size_t __n) {
138 while (duringwrite) {}
140 memcpy(buffer,__buf,__n);
141 AppendLog(buffer,__n,true);
144 switch (CurrentConnectionType) {
145 case GCT_Irda : mysize = irda_write(device_portfd, __buf, __n); break;
146 case GCT_Tekram: mysize = tekram_write(device_portfd, __buf, __n); break;
147 default : mysize = serial_write(device_portfd, __buf, __n); break;
154 void device_dumpserial(void)
157 unsigned int Flags=0;
159 PortFD = device_getfd();
161 ioctl(PortFD, TIOCMGET, &Flags);
163 fprintf(stdout, _("Serial device:"));
164 fprintf(stdout, _(" DTR is %s"), Flags&TIOCM_DTR?_("up"):_("down"));
165 fprintf(stdout, _(", RTS is %s"), Flags&TIOCM_RTS?_("up"):_("down"));
166 fprintf(stdout, _(", CAR is %s"), Flags&TIOCM_CAR?_("up"):_("down"));
167 fprintf(stdout, _(", CTS is %s\n"), Flags&TIOCM_CTS?_("up"):_("down"));
171 void SigHandler(int status)
174 unsigned char buffer[2048];
178 res = device_read(buffer, 255);
180 for (count = 0; count < res ; count ++) {
181 Protocol->StateMachine(buffer[count]);
186 #if defined(__svr4__) || defined(__FreeBSD__)
187 /* thread for handling incoming data */
191 struct timeval timeout;
194 FD_SET(device_portfd,&readfds);
195 /* set timeout to 15 seconds */
198 while (!CurrentRequestTerminate) {
199 err=select(device_portfd+1,&readfds,NULL,NULL,&timeout);
201 /* call singal handler to process incoming data */
203 /* refresh timeout, just for linux :-( */
\r
204 /* required for irda */
208 perror("Error in SelectLoop");
214 bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionType con)
220 #if defined(__svr4__) || defined(__FreeBSD__)
223 struct sigaction sig_io;
227 if ((strstr(GSM_Info->IrdaModels,"decode")!=NULL) && (CurrentConnectionType == GCT_Irda))
229 printf("DEBUG and Irda decode Model -> not realy open ;-)\n");
234 if (PortDevice[0]!=0x00) return true;
238 strncpy(PortDevice, port_device, GSM_MAX_DEVICE_NAME_LENGTH);
241 fprintf(stdout,_("Opening \"%s\" device...\n"),PortDevice);
244 strcpy(text,"\n\n\nMygnokii ");
245 sprintf(text+strlen(text), "%s",VERSION);
246 strcpy(text+strlen(text),"\n");
247 AppendLogText(text,false);
249 strcpy(text,"Port ");
250 strcpy(text+strlen(text),PortDevice);
251 strcpy(text+strlen(text),"\n");
252 AppendLogText(text,false);
254 strcpy(text,"Connection ");
256 case GCT_FBUS :strcpy(text+strlen(text),"FBUS");break;
257 case GCT_Infrared:strcpy(text+strlen(text),"infrared");break;
258 case GCT_Irda :strcpy(text+strlen(text),"irda sockets");break;
259 case GCT_MBUS :strcpy(text+strlen(text),"MBUS");break;
260 case GCT_DLR3 :strcpy(text+strlen(text),"DLR3");break;
261 case GCT_Tekram :strcpy(text+strlen(text),"Tekram");break;
262 case GCT_AT :strcpy(text+strlen(text),"AT");break;
263 default :strcpy(text+strlen(text),"unknown");break;
265 strcpy(text+strlen(text),"\n");
266 AppendLogText(text,false);
268 /* Ralf Thelen: In this moment there is NO method of communication,
269 which require keepalive packets and GSM->KeepAlive is
270 always NULL_KeepAlive, I comment this thread, */
272 /* Create and start main thread. */
273 // rtn = pthread_create(&Thread, NULL,(void*)GSM->KeepAlive, (void *)NULL);
276 // fprintf(stdout,_("Error\n"));
280 #if defined(__svr4__) || defined(__FreeBSD__)
282 /* Set up and install handler before enabling async IO on port. */
283 sig_io.sa_handler = SigHandler;
285 sigaction (SIGIO, &sig_io, NULL);
289 result = device_open(PortDevice, with_odd_parity);
292 fprintf(stdout,_("Error\n"));
296 #if defined(__svr4__) || defined(__FreeBSD__)
297 /* create a thread to handle incoming data from mobile phone */
298 rtn=pthread_create(&selThread,NULL,(void*)SelectLoop,(void*)NULL);
300 fprintf(stdout,_("Error\n"));
308 /* ---------------- RTH: #ifdef WIN32 ------------------ */
312 extern HANDLE hPhone;
314 void device_close(void)
316 AppendLogText("CLOSE\n",false);
324 void device_dumpserial(void)
328 dcb.DCBlength = sizeof(DCB);
329 GetCommState(hPhone, &dcb);
331 fprintf(stdout, _("Serial device:"));
332 fprintf(stdout, _(" DTR is "));
333 switch (dcb.fDtrControl) {
334 case DTR_CONTROL_ENABLE : fprintf(stdout, _("up")); break;
335 case DTR_CONTROL_DISABLE : fprintf(stdout, _("down")); break;
336 case DTR_CONTROL_HANDSHAKE: fprintf(stdout, _("handshake"));break;
338 fprintf(stdout, _(", RTS is "));
339 switch (dcb.fRtsControl) {
340 case RTS_CONTROL_ENABLE : fprintf(stdout, _("up\n")); break;
341 case RTS_CONTROL_DISABLE : fprintf(stdout, _("down\n")); break;
342 case RTS_CONTROL_HANDSHAKE: fprintf(stdout, _("handshake\n"));break;
343 case RTS_CONTROL_TOGGLE : fprintf(stdout, _("toggle\n")); break;
348 void device_setdtrrts(int __dtr, int __rts)
352 dcb.DCBlength = sizeof(DCB);
353 GetCommState(hPhone, &dcb);
355 if (__dtr==1) dcb.fDtrControl = DTR_CONTROL_ENABLE;
356 else dcb.fDtrControl = DTR_CONTROL_DISABLE;
358 if (__rts==1) dcb.fRtsControl = RTS_CONTROL_ENABLE;
359 else dcb.fRtsControl = RTS_CONTROL_DISABLE;
361 SetCommState(hPhone, &dcb);
368 void device_changespeed(int __speed)
373 dcb.DCBlength = sizeof(DCB);
374 GetCommState(hPhone, &dcb);
377 case 115200: dcb.BaudRate=CBR_115200; break;
378 case 19200 : dcb.BaudRate=CBR_19200; break;
379 case 9600 : dcb.BaudRate=CBR_9600; break;
382 SetCommState(hPhone, &dcb);
385 fprintf(stdout,_("Serial device: changing speed to %i\n"),__speed);
389 bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionType con)
396 if (PortDevice[0]!=0x00) return true;
399 strncpy(PortDevice, port_device, GSM_MAX_DEVICE_NAME_LENGTH);
402 fprintf(stdout,_("Opening \"%s\" device...\n"),PortDevice);
405 strcpy(text,"\n\n\nMygnokii ");
406 sprintf(text+strlen(text), "%s",VERSION);
407 strcpy(text+strlen(text),"\n");
408 AppendLogText(text,false);
410 strcpy(text,"Port ");
411 strcpy(text+strlen(text),PortDevice);
412 strcpy(text+strlen(text),"\n");
413 AppendLogText(text,false);
415 strcpy(text,"Connection ");
417 case GCT_FBUS :strcpy(text+strlen(text),"FBUS");break;
418 case GCT_Infrared:strcpy(text+strlen(text),"infrared");break;
419 case GCT_Irda :strcpy(text+strlen(text),"irda sockets");break;
420 case GCT_MBUS :strcpy(text+strlen(text),"MBUS");break;
421 case GCT_DLR3 :strcpy(text+strlen(text),"DLR3");break;
422 case GCT_Tekram :strcpy(text+strlen(text),"Tekram");break;
423 case GCT_AT :strcpy(text+strlen(text),"AT");break;
424 default :strcpy(text+strlen(text),"unknown");break;
426 strcpy(text+strlen(text),"\n");
427 AppendLogText(text,false);
429 CurrentDisableKeepAlive = true;
431 /* Create and start main thread. */
432 rtn = ! OpenConnection(PortDevice, Protocol->StateMachine, GSM->KeepAlive);
436 fprintf(stdout,_("Error\n"));
439 CurrentDisableKeepAlive = false;
442 if (with_odd_parity) {
443 dcb.DCBlength = sizeof(DCB);
444 GetCommState(hPhone, &dcb);
446 dcb.Parity=ODDPARITY;
448 SetCommState(hPhone, &dcb);
454 size_t device_write(const __ptr_t __buf, size_t __n) {
456 while (duringwrite) {}
458 AppendLog(__buf,__n,true);
459 i=WriteCommBlock(__buf,__n);
461 if (i) return __n; else return 0;