A GPS disciplined clock

Dependencies:   net lpc1768 crypto clock web log

http-derived/nmea/http-nmea-script.js

Committer:
andrewboyson
Date:
2019-03-27
Revision:
48:9f1ab7784067
Child:
49:115a5e4fac0c

File content as of revision 48:9f1ab7784067:

'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