A GPS disciplined clock

Dependencies:   net lpc1768 crypto clock web log

Revision:
48:9f1ab7784067
Child:
49:115a5e4fac0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/http-derived/nmea/http-nmea-script.js	Wed Mar 27 18:40:21 2019 +0000
@@ -0,0 +1,116 @@
+'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
+
+function hexToBit(iChar, iBit)
+{
+   var value = parseInt(response.charAt(iChar), 16);
+   value >>= iBit;
+   return value & 1;
+}
+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++)
+    {
+        buckets += i.padStart(2, '0') + ' ' + parseInt(response.substr(73 + i * 8, 8), 16) + '\r\n';
+    }
+}
+function degToString(plus, minus, deg)
+{
+    deg /= 10000000;
+    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);
+}
+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-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-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-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;
+
+   elem = document.getElementById('ajax-response'     ); if (elem) elem.textContent = response;
+   elem = document.getElementById('ajax-headers'      ); if (elem) elem.textContent = headers;
+}
+
+var ajax;
+function AjaxRequest(request) //Used by this script and from HTML page
+{
+   ajax=new XMLHttpRequest();
+   ajax.onreadystatechange=handleAjaxResponse;
+   if (request) ajax.open('GET', '/nmea-ajax' + '?' + request, true);
+   else         ajax.open('GET', '/nmea-ajax'                , true);
+   ajax.send();
+}
+function requestAjax() //Used in this script
+{
+   AjaxRequest('');
+}
+
+function handleAjaxResponse()
+{
+   if (ajax.readyState==4 && ajax.status==200)
+   {
+       response = ajax.responseText;
+       headers  = ajax.getAllResponseHeaders();
+       parseAjax();
+       displayGeneral();
+   }
+}
+
+function init()
+{
+    setInterval(requestAjax, 10000);
+    requestAjax();
+}
+if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init ); // Loading hasn't finished yet
+else                                                                                 init(); //`DOMContentLoaded` has already fired