A GPS disciplined clock

Dependencies:   net lpc1768 crypto clock web log

web-this/nmea/web-nmea-script.js

Committer:
andrewboyson
Date:
2019-05-01
Revision:
59:d2d25c2265f8
Parent:
web-derived/nmea/web-nmea-script.js@ 55:a1bd0572c8b6
Child:
60:7cab896b0fd4

File content as of revision 59:d2d25c2265f8:

'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      = '';

function hexToBit(iChar, iBit)
{
   var value = parseInt(response.charAt(iChar), 16);
   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);
    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 * 50).toString().padStart(3, '0') + ' ' + parseInt(response.substr(81 + i * 8, 8), 16) + '\r\n';
    }
}
function degToString(plus, minus, deg)
{
    deg /= NMEA_DEG_UNIT;
    if (deg >= 0) return plus  +    deg.toFixed(5);
    else          return minus + (-deg).toFixed(5);
}
function hgtToString(plus, minus, hgt)
{
    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', 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', 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 = 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-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