A GPS disciplined clock

Dependencies:   net lpc1768 crypto clock web log

Revision:
49:115a5e4fac0c
Parent:
48:9f1ab7784067
--- a/http-derived/nmea/http-nmea-script.js	Wed Mar 27 18:40:21 2019 +0000
+++ b/http-derived/nmea/http-nmea-script.js	Sat Apr 06 11:35:55 2019 +0000
@@ -1,21 +1,25 @@
 'use strict';
 
-var response        = '';
-var headers         = '';
-var gpsTrace        = false; //nibble  0      : bit 0
-var gpsVerbose      = false; //nibble  0      : bit 1
-var nmeaMsgTrace    = false; //nibble  0      : bit 2
-var nmeaCmdTrace    = false; //nibble  0      : bit 3
-var nmeaLat         = 0;     //nibble  1
-var nmeaLng         = 0;     //nibble  9
-var nmeaHgt         = 0;     //nibble 17
-var nmeaHgtAboveMsl = 0;     //nibble 25
-var nmeaDop         = 0;     //nibble 33
-var nmeaSatCount    = 0;     //nibble 41
-var nmeaFixQuality  = 0;     //nibble 49
-var sensorheight    = 0;     //nibble 57
-var bucketCount     = 0;     //nibble 65
-var buckets         = '';    //nibble 73
+const NMEA_DEG_UNIT = 10000000;
+const NMEA_HGT_UNIT =  1000000;
+
+var response     = '';
+var headers      = '';
+var gpsTrace     = false;
+var gpsVerbose   = false;
+var msgTrace     = false;
+var cmdTrace     = false;
+var lat          = 0;
+var lng          = 0;
+var hgt          = 0;
+var hgtAboveMsl  = 0;
+var mslAboveWgs  = 0;
+var dop          = 0;
+var satCount     = 0;
+var fixQuality   = 0;
+var sensorHeight = 0;
+var bucketCount  = 0;
+var buckets      = '';
 
 function hexToBit(iChar, iBit)
 {
@@ -23,57 +27,66 @@
    value >>= iBit;
    return value & 1;
 }
+function parseSint32fromHex(value)
+{
+    value = parseInt(value, 16);
+    if (value > 0x7FFFFFFF) value -= 0xFFFFFFFF;
+    return value;
+}
 function parseAjax()
 {
-    gpsTrace        = hexToBit(0, 0);
-    gpsVerbose      = hexToBit(0, 1);
-    nmeaMsgTrace    = hexToBit(0, 2);
-    nmeaCmdTrace    = hexToBit(0, 3);
-    nmeaLat         = parseInt(response.substr( 1, 8), 16);
-    nmeaLng         = parseInt(response.substr( 9, 8), 16);
-    nmeaHgt         = parseInt(response.substr(17, 8), 16);
-    nmeaHgtAboveMsl = parseInt(response.substr(25, 8), 16);
-    nmeaDop         = parseInt(response.substr(33, 8), 16);
-    nmeaSatCount    = parseInt(response.substr(41, 8), 16);
-    nmeaFixQuality  = parseInt(response.substr(49, 8), 16);
-    sensorheight    = parseInt(response.substr(57, 8), 16);
-    bucketCount     = parseInt(response.substr(65, 8), 16);
-    for(var i = 0; i < bucketCount; i++)
+    gpsTrace     = hexToBit(0, 0);
+    gpsVerbose   = hexToBit(0, 1);
+    msgTrace     = hexToBit(0, 2);
+    cmdTrace     = hexToBit(0, 3);
+    lat          = parseSint32fromHex(response.substr( 1, 8));
+    lng          = parseSint32fromHex(response.substr( 9, 8));
+    hgt          = parseSint32fromHex(response.substr(17, 8));
+    hgtAboveMsl  = parseSint32fromHex(response.substr(25, 8));
+    mslAboveWgs  = parseSint32fromHex(response.substr(33, 8));
+    dop          = parseSint32fromHex(response.substr(41, 8));
+    satCount     = parseSint32fromHex(response.substr(49, 8));
+    fixQuality   = parseSint32fromHex(response.substr(57, 8));
+    sensorHeight = parseSint32fromHex(response.substr(65, 8));
+    bucketCount  = parseSint32fromHex(response.substr(73, 8));
+    buckets      = '';
+    for (var i = 0; i < bucketCount; i++)
     {
-        buckets += i.padStart(2, '0') + ' ' + parseInt(response.substr(73 + i * 8, 8), 16) + '\r\n';
+        buckets += (i * 50).toString().padStart(3, '0') + ' ' + parseInt(response.substr(81 + i * 8, 8), 16) + '\r\n';
     }
 }
 function degToString(plus, minus, deg)
 {
-    deg /= 10000000;
+    deg /= NMEA_DEG_UNIT;
     if (deg >= 0) return plus  +    deg.toFixed(5);
     else          return minus + (-deg).toFixed(5);
 }
 function hgtToString(plus, minus, hgt)
 {
-    hgt /= 1000000;
-    if (hgt >= 0) return plus  +    hgt.toFixed(5);
-    else          return minus + (-hgt).toFixed(5);
+    hgt /= NMEA_HGT_UNIT;
+    if (hgt >= 0) return plus  +    hgt.toFixed(1);
+    else          return minus + (-hgt).toFixed(1);
 }
 function displayGeneral()
 {
    var elem;
-   elem = document.getElementById('ajax-trace-gps'    ); if (elem) elem.setAttribute('dir', gpsTrace     ? 'rtl' : 'ltr');
-   elem = document.getElementById('ajax-trace-verbose'); if (elem) elem.setAttribute('dir', gpsVerbose   ? 'rtl' : 'ltr');
-   elem = document.getElementById('ajax-trace-msg'    ); if (elem) elem.setAttribute('dir', nmeaMsgTrace ? 'rtl' : 'ltr');
-   elem = document.getElementById('ajax-trace-cmd'    ); if (elem) elem.setAttribute('dir', nmeaCmdTrace ? 'rtl' : 'ltr');
+   elem = document.getElementById('ajax-trace-gps'    ); if (elem) elem.setAttribute('dir', gpsTrace   ? 'rtl' : 'ltr');
+   elem = document.getElementById('ajax-trace-verbose'); if (elem) elem.setAttribute('dir', gpsVerbose ? 'rtl' : 'ltr');
+   elem = document.getElementById('ajax-trace-msg'    ); if (elem) elem.setAttribute('dir', msgTrace   ? 'rtl' : 'ltr');
+   elem = document.getElementById('ajax-trace-cmd'    ); if (elem) elem.setAttribute('dir', cmdTrace   ? 'rtl' : 'ltr');
 
-   elem = document.getElementById('ajax-position'     ); if (elem) elem.textContent = degToString('N', 'S', nmeaLat) + ' ' +
-                                                                                      degToString('E', 'W', nmeaLng) + ' ' +
-                                                                                      hgtToString('H', 'D', nmeaHgt);
-   elem = document.getElementById('ajax-hgt-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', nmeaHgtAboveMsl);
-   elem = document.getElementById('ajax-gnd-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', nmeaHgtAboveMslAv - sensorHeight * NMEA_HGT_UNIT);
+   elem = document.getElementById('ajax-position'     ); if (elem) elem.textContent = degToString('N', 'S', lat) + ' ' +
+                                                                                      degToString('E', 'W', lng) + ' ' +
+                                                                                      hgtToString('H', 'D', hgt);
+   elem = document.getElementById('ajax-msl-above-wgs'); if (elem) elem.textContent = hgtToString('H', 'D', mslAboveWgs);
+   elem = document.getElementById('ajax-hgt-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl);
+   elem = document.getElementById('ajax-gnd-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl - sensorHeight * NMEA_HGT_UNIT);
 
-   elem = document.getElementById('ajax-dop'          ); if (elem) elem.textContent = nmeaDop / 100;
-   elem = document.getElementById('ajax-sat-count'    ); if (elem) elem.textContent = nmeaSatCount;
-   elem = document.getElementById('ajax-fix-quality'  ); if (elem) elem.textContent = nmeaFixQuality;
+   elem = document.getElementById('ajax-dop'          ); if (elem) elem.textContent = dop / 100;
+   elem = document.getElementById('ajax-sat-count'    ); if (elem) elem.textContent = satCount;
+   elem = document.getElementById('ajax-fix-quality'  ); if (elem) elem.textContent = fixQuality;
    
-   elem = document.getElementById('ajax-sensor-hgt'   ); if (elem) elem.value       = sensorheight;
+   elem = document.getElementById('ajax-sensor-hgt'   ); if (elem) elem.value       = sensorHeight;
    
    elem = document.getElementById('ajax-bucket-count' ); if (elem) elem.textContent = bucketCount;
    elem = document.getElementById('ajax-buckets' );      if (elem) elem.textContent = buckets;