Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
sdk:gps2serial [2015/05/15 13:30]
juraschek
sdk:gps2serial [2020/03/25 12:08]
fachet [Script Summary]
Line 5: Line 5:
 ===== Script Summary ​ ===== ===== Script Summary ​ =====
  
-This Script connects to the GPS server ​via tcp. The NMEA Frames will be startet by the request "​R" ​and will be then written ​to the serial interface.  +This Script connects to the GPS server and forwards the data to the first serial interface. 
- +GPS must be enabled and in RAW mode. 
-The default serial ​parameter ​are 115200 ​8N1 (8 databit, no parity, 1 stop bit, no flow controll). This parameter can be configured at the begining of the script. ​+The default serial ​parameters for GPS are 4800 8N1 (8 databit, no parity, 1 stop bit, no flow controll). This parameter can be configured at the begining of the script.  
 +Please use if possible a higher data rate e.g. 115200.
  
 ===== Pre Requierments ===== ===== Pre Requierments =====
Line 30: Line 31:
 <code c> <code c>
  
-/* Serial Baud Rate 9600, 19200, 38400, 57600, 115200 */ +/* Serial Baud Rate 4800, 9600, 19200, 38400, 57600, 115200 */ 
-SER_SPEED=115200;+SER_SPEED=4800;
 /*  number of data bits (5, 6, 7, 8) */ /*  number of data bits (5, 6, 7, 8) */
 SER_DATABIT=8;​ SER_DATABIT=8;​
Line 68: Line 69:
  
 <code c gps-to-serial.are>​ <code c gps-to-serial.are>​
- 
- 
-/* DESC: This script sends the local GPS NMEA stream (incl. serial/​checksum) to a remote UDP server. 
- * Copyright (C) 2013-2015 NetModule AG, Switzerland 
- */ 
- 
 /* Options to configure by user*/ /* Options to configure by user*/
-/* Serial Baud Rate 9600, 19200, 38400, 57600, 115200 */ +SER_SPEED = 4800; /* Serial Baud Rate 4800, 9600, 19200, 38400, 57600, 115200 */ 
-SER_SPEED=115200; +SER_DATABIT ​8; /*  number of data bits (5, 6, 7, 8) */ 
-/*  number of data bits (5, 6, 7, 8) */ +SER_STOPBIT ​1; /*  number of stop bits (1, 2) */  
-SER_DATABIT=8; +SER_PARITY ​0; /* parity (0=no parity, 1=odd parity, 2=even parity) */ 
-/*  number of stop bits (1, 2) */ +SER_FLOW ​= 0; /*  flow control (0=none, 1=xon/xoff, 2=hardware) */ 
-SER_STOPBIT=1; +DEV "​SERIAL1"​; /*  name of the Serial Interface */ 
-/* parity (0=no parity, 1=odd parity, 2=even parity) */ +  
-SER_PARITY=0; +/* GPS Deamon Parameters */ 
-/*  flow control (0=none, 1=xon/xoff, 2=hardware) */ +HOST = "127.0.0.1"; /* local host */ 
-SER_FLOW=0; +PORT = (int) nb_config_get("​gpsd.0.port"​);​ 
-/*  name of the Serial Interface ​(Only changed if your device has more then one serial Interface (NB3710) ​*/ +  
-DEV = "SERIAL1"; +void usage() { 
- +    nb_syslog("​Usage: ​gps2serial.are\n");
- +
- +
-void usage() ​ +
-+
-    nb_syslog("​Usage: ​gps-udp-client.are <​server>​ <​port>​");+
     exit(1);     exit(1);
 } }
- + 
 int start_serial() { int start_serial() {
- +    ​// printf("set serial ​attributes\n"); 
-    ​/* check serial port config */ +    if ((rc = nb_serial_setattr(DEV,​ SER_SPEED, SER_DATABIT,​ SER_STOPBIT,​ SER_PARITY, SER_FLOW)) ​!= 0) { 
-    status = nb_config_get("​serial.0.status"); +        nb_syslog("​ERROR: unable to set serial attributes (rc %d) to %s\n", rc, DEV);
-    if (status ​!= "​2"​) { +
-        nb_syslog("​Serial port is not enabled for us");+
         return -1;         return -1;
     }     }
- +    ​// nb_syslog("Open serial device %s\n"DEV); 
-    ​/* set attributes */ +    if ((fd nb_serial_open(DEV)) < 0) { 
-    rc = nb_serial_setattr(DEVSER_SPEED, SER_DATABIT,​ SER_STOPBIT,​ SER_PARITY, SER_FLOW); +        nb_syslog("​ERROR: ​can't open serial ​port %s\n", ​DEV);
-    if (rc != 0) { +
-        nb_syslog("​ERROR: ​unable to set serial ​attributes (rc %d)", ​rc);+
         return -1;         return -1;
     }     }
- 
-    /* open serial port */ 
-    fd = nb_serial_open(DEV);​ 
-    if (fd < 0) { 
-        return -1; 
-    } 
- 
     return fd;     return fd;
 } }
- +  
-int connect_gpsd ()+int connect_gpsd()
 { {
-    ​for (attempt ​= 0; attempt < 60; attempt++) { +    ​if (nb_config_get("​gpsd.0.status"​) !"​1"​ || nb_config_get("​gpsd.0.cmode"​) != "​1"​) { 
-        ​sleep(1); +    nb_syslog("​gpsd not enabled or not in RAW mode\n"​);​ 
 +        ​exit(2); 
 +    } 
 +    while (1) {
         sock = socket(AF_INET,​ SOCK_STREAM,​ IPPROTO_TCP);​         sock = socket(AF_INET,​ SOCK_STREAM,​ IPPROTO_TCP);​
-        if (sock < 0) { +        if (sock < 0) 
-            nb_syslog("​Unable to create socket"); +            nb_syslog("​Unable to create socket\n"); 
-            continue; +        ​else if (connect(sock, ​HOSTPORT) < 0){ 
-        } +            nb_syslog("​Could not connect to GPS daemon\n");
-        nb_syslog("​Connecting to GPS daemon"); +
-        if (connect(sock, ​"​127.0.0.1"​2947) < 0){ +
-            nb_syslog("​Could not connect to GPS daemon"​);​+
             close(sock);​             close(sock);​
-            continue;+        } else { 
 +            nb_syslog("​Successfully connected to GPS daemon\n"​);​ 
 +            return sock;
         }         }
-        nb_syslog("​Requesting raw NMEA stream"​)+      sleep(10);
-        if (send(sock, "​R\n"​) < 0) { +
-            nb_syslog("​Unable to request raw NMEA stream"​);​ +
-            close(sock);​ +
-            continue; +
-        } +
- +
-        nb_syslog("​Successfully connected to GPS daemon"​);​ +
-        return sock;+
     }     }
- +    /* no return ​*/
-    ​return ​-1;+
 } }
- +  
- + 
-SERVER = trim((string) argv[1]); +
-PORT = (int) argv[2]; +
- +
-SERIAL = struct_get(nb_status("​system"​),​ "​SERIAL_NUMBER"​);​ +
-if (SERIAL == ""​) { +
-    nb_syslog("​Unable to obtain serial number"​);​ +
-    exit(1); +
-} +
 nb_syslog("​starting serial"​);​ nb_syslog("​starting serial"​);​
-serial_fd = start_serial()+if ((serial_fd = start_serial()< 0 ) { 
-if (serial_fd ​< 0 ) { +    nb_syslog("​Could not start serial, exiting\n"); 
-    nb_syslog("​Could not start serial, exiting"​);​ +    exit(3);
-    exit(1);+
 } }
 +// printf("​connect to gpsd\n"​);​
 gpsd = connect_gpsd();​ gpsd = connect_gpsd();​
-if (gpsd < 0) { 
-    nb_syslog("​Could not start gpsd socket, exiting"​);​ 
-    exit(1); 
-} 
- 
-/* process NMEA stream */ 
-nb_syslog("​Processing NMEA data"​);​ 
  
 +// printf("​Processing NMEA data\n"​); ​
 while (1) { while (1) {
-    /wait for socket ​data  */ +    // printf("​wait for data\n"); 
-    rv = select(gpsd, ​3)+    ​if ((rv = select(gpsd, ​10)) == 0) { 
-    if (rv > 0) { + // printf("​Select timed out\n");  
-        data = recv(gpsd); +      ​ continue; 
-        len = strlen(data)+ } 
-    ​} else if (rv < 0) { +    if (rv < 0 || ( data = recv(gpsd)) == ""​) { 
-        nb_syslog("​select ​failed"​);​ +        nb_syslog("​Select or recv failed, re-connecting to GPS daemon\n"); 
-        ​len -1; +        ​if ((gpsd ​connect_gpsd()) < 0) 
-    } else { +            ​exit(4);​ /* can't connect ​*/
-        ​/* nothing received ​*/+
         continue;         continue;
-    }  
-    if (len <= 0) { 
-        nb_syslog("​Receive failed, re-connecting to GPS daemon"​);​ 
-        close(gpsd);​ 
-        gpsd = connect_gpsd();​ 
-        if (gpsd < 0) { 
-            exit(1); 
-        } 
-    } else { 
-        str = strcat("​PNMID,",​ SERIAL); 
-        chars = explode(str);​ 
- 
-        checksum = 0; 
-        for (i = 0; i < length(chars);​ i++) { 
-            c = ord(chars[i]);​ 
-            checksum ^= c; 
-        } 
-        sentence = sprintf("​$%s*%02X\r\n",​ str, checksum); 
-        data = strcat(data,​ sentence); 
-        len = strlen(data);​ 
-        nb_syslog("​len:​ %i", len); 
-        if (len > 0) { 
-            sent = write(serial_fd,​ data, len); 
-            if (sent != len) { 
-                nb_syslog("​Unable to send message via Serial, sent: %i, len: %i",​sent,​ len); 
-            } 
-        } 
     }     }
- +    len = strlen(data);​ 
-    ​+ // printf("​write data to serial <%s> [%i]\n",​ data, len); 
 +    ​if (write(serial_fd,​ data, len) != len) 
 +       ​nb_syslog("​Unable to send message via Serial, data %s, len: %i\n", data, len);
 } }
 + 
 close(gpsd);​ close(gpsd);​
 close(serial_fd);​ close(serial_fd);​
- +exit(5);
-exit(0); +
  
 </​code>​ </​code>​