A GPS disciplined clock

Dependencies:   net lpc1768 crypto clock web log

Revision:
60:7cab896b0fd4
Parent:
59:d2d25c2265f8
--- a/web-this/nmea/web-nmea-script.js	Wed May 01 10:14:26 2019 +0000
+++ b/web-this/nmea/web-nmea-script.js	Wed May 01 14:08:56 2019 +0000
@@ -1,60 +1,58 @@
+//Nmea script
 'use strict';
 
 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      = '';
+let gpsTrace     = false;
+let gpsVerbose   = false;
+let msgTrace     = false;
+let cmdTrace     = false;
+let lat          = 0;
+let lng          = 0;
+let hgt          = 0;
+let hgtAboveMsl  = 0;
+let mslAboveWgs  = 0;
+let dop          = 0;
+let satCount     = 0;
+let fixQuality   = 0;
+let sensorHeight = 0;
+let bucketCount  = 0;
+let buckets      = '';
 
-function hexToBit(iChar, iBit)
-{
-   var value = parseInt(response.charAt(iChar), 16);
-   value >>= iBit;
-   return value & 1;
-}
-function parseSint32fromHex(value)
+function parseVariables(text)
 {
-    value = parseInt(value, 16);
-    if (value > 0x7FFFFFFF) value -= 0xFFFFFFFF;
-    return value;
+    let lines = text.split('\n');
+    gpsTrace     = Ajax.hexToBit        (lines[0], 0);
+    gpsVerbose   = Ajax.hexToBit        (lines[0], 1);
+    msgTrace     = Ajax.hexToBit        (lines[0], 2);
+    cmdTrace     = Ajax.hexToBit        (lines[0], 3);
+    lat          = Ajax.hexToSignedInt32(lines[1]);
+    lng          = Ajax.hexToSignedInt32(lines[2]);
+    hgt          = Ajax.hexToSignedInt32(lines[3]);
+    hgtAboveMsl  = Ajax.hexToSignedInt32(lines[4]);
+    mslAboveWgs  = Ajax.hexToSignedInt32(lines[5]);
+    dop          = Ajax.hexToSignedInt32(lines[6]);
+    satCount     = Ajax.hexToSignedInt32(lines[7]);
+    fixQuality   = Ajax.hexToSignedInt32(lines[8]);
+    sensorHeight = Ajax.hexToSignedInt32(lines[9]);
 }
-function parseAjax()
+function parseBuckets(text)
 {
-    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));
+    let lines = text.split('\n');
+    bucketCount  = Ajax.hexToSignedInt32(lines[0]);
     buckets      = '';
-    for (var i = 0; i < bucketCount; i++)
+    for (let i = 0; i < bucketCount; i++)
     {
-        buckets += (i * 50).toString().padStart(3, '0') + ' ' + parseInt(response.substr(81 + i * 8, 8), 16) + '\r\n';
+        buckets += (i * 50).toString().padStart(3, '0') + ' ' + Ajax.hexToSignedInt32(lines[i + 1]) + '\r\n';
     }
 }
+function parse()
+{
+    let topics = Ajax.response.split('\f');
+    parseVariables(topics[0]);
+    parseBuckets  (topics[1]);
+}
 function degToString(plus, minus, deg)
 {
     deg /= NMEA_DEG_UNIT;
@@ -67,63 +65,31 @@
     if (hgt >= 0) return plus  +    hgt.toFixed(1);
     else          return minus + (-hgt).toFixed(1);
 }
-function displayGeneral()
+function display()
 {
-   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', msgTrace   ? 'rtl' : 'ltr');
-   elem = document.getElementById('ajax-trace-cmd'    ); if (elem) elem.setAttribute('dir', cmdTrace   ? 'rtl' : 'ltr');
+   let elem;
+   elem = Ajax.getElementOrNull('ajax-trace-gps'    ); if (elem) elem.setAttribute('dir', gpsTrace   ? 'rtl' : 'ltr');
+   elem = Ajax.getElementOrNull('ajax-trace-verbose'); if (elem) elem.setAttribute('dir', gpsVerbose ? 'rtl' : 'ltr');
+   elem = Ajax.getElementOrNull('ajax-trace-msg'    ); if (elem) elem.setAttribute('dir', msgTrace   ? 'rtl' : 'ltr');
+   elem = Ajax.getElementOrNull('ajax-trace-cmd'    ); if (elem) elem.setAttribute('dir', cmdTrace   ? 'rtl' : 'ltr');
 
-   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 = Ajax.getElementOrNull('ajax-position'     ); if (elem) elem.textContent = degToString('N', 'S', lat) + ' ' +
+                                                                                    degToString('E', 'W', lng) + ' ' +
+                                                                                    hgtToString('H', 'D', hgt);
+   elem = Ajax.getElementOrNull('ajax-msl-above-wgs'); if (elem) elem.textContent = hgtToString('H', 'D', mslAboveWgs);
+   elem = Ajax.getElementOrNull('ajax-hgt-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl);
+   elem = Ajax.getElementOrNull('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 = 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 = Ajax.getElementOrNull('ajax-dop'          ); if (elem) elem.textContent = dop / 100;
+   elem = Ajax.getElementOrNull('ajax-sat-count'    ); if (elem) elem.textContent = satCount;
+   elem = Ajax.getElementOrNull('ajax-fix-quality'  ); if (elem) elem.textContent = fixQuality;
    
-   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;
+   elem = Ajax.getElementOrNull('ajax-sensor-hgt'   ); if (elem) elem.value       = sensorHeight;
+   
+   elem = Ajax.getElementOrNull('ajax-bucket-count' ); if (elem) elem.textContent = bucketCount;
+   elem = Ajax.getElementOrNull('ajax-buckets' );      if (elem) elem.textContent = buckets;
 }
 
-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
+Ajax.server     = '/nmea-ajax';
+Ajax.onResponse = function() { parse(); display(); };
+Ajax.init();
\ No newline at end of file