gpsd-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gpsd-dev] [PATCH 3/4] [isync] Parse iSync $PTNTA oscillator status pack


From: Michael Brown
Subject: [gpsd-dev] [PATCH 3/4] [isync] Parse iSync $PTNTA oscillator status packets
Date: Wed, 3 Feb 2016 22:40:25 +0000

Signed-off-by: Michael Brown <address@hidden>
---
 driver_nmea0183.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/driver_nmea0183.c b/driver_nmea0183.c
index 8d63eb5..84945de 100644
--- a/driver_nmea0183.c
+++ b/driver_nmea0183.c
@@ -1105,6 +1105,63 @@ static gps_mask_t processTNTHTM(int c UNUSED, char 
*field[],
             session->gpsdata.attitude.mag_st);
     return mask;
 }
+
+static gps_mask_t processTNTA(int c UNUSED, char *field[],
+                             struct gps_device_t *session)
+{
+    /*
+     * Proprietary sentence for iSync GRClok/LNRClok.
+
+     $PTNTA,20000102173852,1,T4,,,6,1,0*32
+
+     1. Date/time in format year, month, day, hour, minute, second
+     2. Oscillator quality 0:warming up, 1:freerun, 2:disciplined.
+     3. Always T4. Format indicator.
+     4. Interval ppsref-ppsout in [ns]. Blank if no ppsref.
+     5. Fine phase comparator in approx. [ns]. Always close to -500 or
+        +500 if not disciplined. Blank if no ppsref.
+     6. iSync Status.  0:warming up or no light, 1:tracking set-up,
+        2:track to PPSREF, 3:synch to PPSREF, 4:Free Run. Track OFF,
+        5:FR. PPSREF unstable, 6:FR. No PPSREF, 7:FREEZE, 8:factory
+        used, 9:searching Rb line
+     7. GPS messages indicator. 0:do not take account, 1:take account,
+        but no message, 2:take account, partially ok, 3:take account,
+        totally ok.
+     8. Transfer quality of date/time. 0:no, 1:manual, 2:GPS, older
+        than x hours, 3:GPS, fresh.
+
+     */
+    gps_mask_t mask;
+    mask = ONLINE_SET;
+
+    if (strcmp(field[3], "T4") == 0) {
+       struct oscillator_t *osc = &session->gpsdata.osc;
+       unsigned int quality = atoi(field[2]);
+       unsigned int delta = atoi(field[4]);
+       unsigned int fine = atoi(field[5]);
+       unsigned int status = atoi(field[6]);
+       char deltachar = field[4][0];
+
+       osc->running = (quality > 0);
+       osc->reference = (deltachar && (deltachar != '?'));
+       if (osc->reference) {
+           if (abs(delta) < 500) {
+               osc->delta = fine;
+           } else {
+               osc->delta = ((delta < 500000000) ? delta : 1000000000 - delta);
+           }
+       } else {
+           osc->delta = 0;
+       }
+       osc->disciplined = ((quality == 2) && (status == 3));
+       mask |= OSCILLATOR_SET;
+
+       gpsd_log(&session->context->errout, LOG_DATA,
+                "PTNTA,T4: quality=%s, delta=%s, fine=%s, status=%s\n",
+                field[2], field[4], field[5], field[6]);
+    }
+    return mask;
+}
 #endif /* TNT_ENABLE */
 
 #ifdef OCEANSERVER_ENABLE
@@ -1408,6 +1465,7 @@ gps_mask_t nmea_parse(char *sentence, struct gps_device_t 
* session)
 #endif /* MTK3301_ENABLE */
 #ifdef TNT_ENABLE
        {"PTNTHTM", 9, false, processTNTHTM},
+       {"PTNTA", 8, false, processTNTA},
 #endif /* TNT_ENABLE */
        {"RMC", 8,  false, processRMC},
        {"TXT", 5,  false, processTXT},
-- 
2.3.8




reply via email to

[Prev in Thread] Current Thread [Next in Thread]