Andrew Boyson / gps

Dependencies:   net lpc1768 crypto clock web log

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