This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| sdk:gps2serial-gnsstogps [2021/03/21 09:57] – created fachet | sdk:gps2serial-gnsstogps [2021/03/21 10:03] (current) – [SDK Script gps2serial-GNSStoGPS.are] fachet | ||
|---|---|---|---|
| Line 30: | Line 30: | ||
| ====== SDK Script gps2serial-GNSStoGPS.are ====== | ====== SDK Script gps2serial-GNSStoGPS.are ====== | ||
| <code c gps2serial-gnsstogps.are> | <code c gps2serial-gnsstogps.are> | ||
| - | | + | /* DESC: This script sends the local GPS NMEA stream to the serial interface. |
| - | * DESC: It checks for the correct CR/LF end of line characters and convert messages $GN to $GP | + | * DESC: It checks for the correct CR/LF end of line characters and convert messages $GN to $GP |
| - | * Copyright (C) 2013-2021) NetModule AG, Switzerland | + | * Copyright (C) 2013-2021) NetModule AG, Switzerland |
| - | */ | + | */ |
| - | | + | /* Options to configure by user*/ |
| - | SER_SPEED = (int) argv[2]; /* Serial Baud Rate 4800, 9600, 19200, 38400, 57600, 115200 */ | + | SER_SPEED = (int) argv[2]; |
| - | SER_DATABIT = 8; /* number of data bits (5, 6, 7, 8) */ | + | SER_DATABIT = 8; |
| - | SER_STOPBIT = 1; /* number of stop bits (1, 2) */ | + | SER_STOPBIT = 1; |
| - | SER_PARITY = 0; /* parity (0=no parity, 1=odd parity, 2=even parity) */ | + | SER_PARITY = 0; /* parity (0=no parity, 1=odd parity, 2=even parity) */ |
| - | SER_FLOW = 0; /* flow control (0=none, 1=xon/xoff, 2=hardware) */ | + | SER_FLOW = 0; /* flow control (0=none, 1=xon/xoff, 2=hardware) */ |
| - | DEV = " | + | DEV = " |
| + | |||
| + | /* default values */ | ||
| + | local_ip = " | ||
| + | local_port = (int) nb_config_get(" | ||
| - | /* default values */ | + | gpsd = -1; |
| - | local_ip = " | + | |
| - | local_port = (int) nb_config_get(" | + | // start serial connection |
| - | + | int start_serial() | |
| - | | + | { |
| - | + | | |
| - | // start serial connection | + | nb_syslog(" |
| - | int start_serial() | + | exit(2); |
| - | { | + | |
| - | if (nb_config_get(" | + | |
| - | nb_syslog(" | + | |
| - | exit(2); | + | nb_syslog(" |
| - | } | + | return -1; |
| - | // printf(" | + | |
| - | if ((rc = nb_serial_setattr(DEV, | + | |
| - | nb_syslog(" | + | |
| - | return -1; | + | nb_syslog(" |
| - | } | + | return -1; |
| - | // nb_syslog(" | + | |
| - | if ((fd = nb_serial_open(DEV)) < 0) { | + | |
| - | nb_syslog(" | + | } |
| - | return -1; | + | // restart GPS deamon |
| - | } | + | int gpsd_restart () |
| - | return fd; | + | { |
| - | } | + | |
| - | // restart GPS deamon | + | |
| - | int gpsd_restart () | + | |
| - | { | + | |
| - | nb_syslog(" | + | |
| - | + | ||
| - | nb_config_set(" | + | |
| - | do { | + | |
| - | sleep(3); | + | |
| - | } while ( nb_config_done != 0) | + | |
| - | + | ||
| - | nb_config_set(" | + | |
| - | do { | + | |
| - | sleep(5); | + | |
| - | } while ( nb_config_done != 0) | + | |
| - | return 0; | + | |
| - | } | + | |
| - | // start TCP Socket for GPS deamon loop | + | nb_config_set("gpsd.0.status=0" |
| - | int gpsd_connect () | + | |
| - | { | + | sleep(3); |
| - | nb_syslog("Connecting to GPS daemon" | + | } while ( nb_config_done != 0) |
| - | + | ||
| - | gpsd = socket(AF_INET, | + | nb_config_set("gpsd.0.status=1" |
| - | if (gpsd < 0) { | + | |
| - | nb_syslog(" | + | sleep(5); |
| - | | + | } while ( nb_config_done != 0) |
| - | } | + | |
| - | for (attempt = 0; attempt <= 15; attempt++) | + | } |
| - | sleep(15); | + | |
| - | + | ||
| - | if (connect(gpsd, | + | |
| - | | + | |
| - | if (attempt == 12) { | + | |
| - | nb_syslog("Unable to connect, restarting daemon" | + | |
| - | gpsd_restart(); | + | |
| - | } | + | |
| - | } else { | + | |
| - | break; | + | |
| - | } | + | |
| - | } | + | |
| - | nb_syslog(" | + | |
| - | send(gpsd, "R=1\n"); | + | |
| - | + | ||
| - | nb_syslog(" | + | |
| - | + | ||
| - | return gpsd; | + | |
| - | } | + | |
| - | + | ||
| - | string checksum(string s) | + | |
| - | { | + | |
| - | pos = strchr(s, " | + | |
| - | + | ||
| - | if (is_void(pos)) | + | |
| - | return s; /* no checksum to correct */ | + | |
| - | + | ||
| - | cs = 0; | + | |
| - | chars = explode(s); | + | |
| - | | + | |
| - | | + | |
| - | cs ^= c; | + | |
| - | } | + | |
| - | r = sprintf(" | + | |
| - | return | + | |
| - | } | + | |
| - | + | ||
| - | /* main() */ | + | |
| - | + | ||
| - | if (argc < 2) { | + | |
| - | usage(); | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | /* starting serial */ | + | |
| - | nb_syslog(" | + | |
| - | if ((serial_fd = start_serial()) < 0 ) { | + | |
| - | nb_syslog(" | + | |
| - | | + | |
| - | | + | |
| - | + | // start TCP Socket for GPS deamon loop | |
| - | /* process NMEA stream */ | + | int gpsd_connect () |
| - | nb_syslog(" | + | { |
| - | while(1) { | + | |
| - | /* connect to gpsd */ | + | |
| - | if(gpsd < 0) { | + | gpsd = socket(AF_INET, |
| - | gpsd = gpsd_connect(gpsd); | + | if (gpsd < 0) { |
| - | if(gpsd < 0) { | + | nb_syslog(" |
| - | nb_syslog(" | + | exit(-1); |
| - | sleep(5); | + | } |
| - | continue; | + | for (attempt = 0; attempt <= 15; attempt++) { |
| - | } | + | sleep(15); |
| - | } | + | |
| - | | + | if (connect(gpsd, |
| - | /* wait for client socket data */ | + | |
| - | rv = select(gpsd, | + | if (attempt == 12) { |
| - | | + | nb_syslog(" |
| - | if(rv == -1) { | + | gpsd_restart(); |
| - | nb_syslog(" | + | } |
| - | close(gpsd); | + | } else { |
| - | gpsd = -1; | + | |
| - | continue; | + | } |
| - | } else if(rv == 0) { | + | } |
| - | /* nothing received */ | + | |
| - | continue; | + | |
| - | } | + | |
| - | | + | |
| - | | + | |
| - | data = recv(gpsd); | + | |
| - | len = strlen(data); | + | } |
| - | /* Check for correct framing: CR+LF */ | + | |
| - | if(len > 2) { | + | string checksum(string s) |
| - | if(strrchr(data, | + | { |
| - | nb_syslog(" | + | pos = strchr(s, " |
| - | close(gpsd); | + | |
| - | gpsd = -1; | + | if (is_void(pos)) |
| - | gpsd_restart(); | + | return s; /* no checksum to correct */ |
| - | continue; | + | |
| - | } | + | cs = 0; |
| - | } | + | chars = explode(s); |
| - | | + | for (i = 1; i < pos; i++) { /* skip $ and *XX */ |
| - | if(len == 0) { | + | c = ord(chars[i]); |
| - | nb_syslog(" | + | cs ^= c; |
| - | close(gpsd); | + | } |
| - | gpsd = -1; | + | r = sprintf(" |
| - | continue; | + | |
| - | } | + | } |
| - | /* Convert message $GN to $GP for backward compatibility */ | + | |
| - | if(strstr(data, | + | /* main() */ |
| - | a_arr = explode(data); | + | |
| - | a_arr[2] = " | + | if (argc < 2) { |
| - | data = checksum(implode(a_arr)); | + | |
| - | } | + | } |
| - | /* skip all messages different from GPGGA | + | |
| - | * if(strstr(data," | + | |
| - | * continue; | + | /* starting serial */ |
| - | */ | + | nb_syslog(" |
| - | sent = write(serial_fd, | + | if ((serial_fd = start_serial()) < 0 ) { |
| - | nb_syslog(" | + | |
| - | | + | |
| - | | + | } |
| - | | + | |
| - | } | + | |
| - | | + | /* process NMEA stream */ |
| - | close(gpsd); | + | nb_syslog(" |
| - | close(serial_fd); | + | while(1) { |
| - | exit(6); | + | |
| + | | ||
| + | gpsd = gpsd_connect(gpsd); | ||
| + | if(gpsd < 0) { | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | nb_syslog(" | ||
| + | close(gpsd); | ||
| + | gpsd = -1; | ||
| + | continue; | ||
| + | | ||
| + | /* nothing received */ | ||
| + | continue; | ||
| + | | ||
| + | |||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | if(strrchr(data, | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | | ||
| + | |||
| + | | ||
| + | nb_syslog(" | ||
| + | close(gpsd); | ||
| + | gpsd = -1; | ||
| + | continue; | ||
| + | | ||
| + | | ||
| + | | ||
| + | a_arr = explode(data); | ||
| + | a_arr[2] = " | ||
| + | data = checksum(implode(a_arr)); | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | |||
| + | close(gpsd); | ||
| + | close(serial_fd); | ||
| + | exit(6); | ||
| </ | </ | ||