A GPS disciplined clock
Dependencies: net lpc1768 crypto clock web log
Diff: http-derived/nmea/http-nmea-script.js
- Revision:
- 49:115a5e4fac0c
- Parent:
- 48:9f1ab7784067
diff -r 9f1ab7784067 -r 115a5e4fac0c http-derived/nmea/http-nmea-script.js --- a/http-derived/nmea/http-nmea-script.js Wed Mar 27 18:40:21 2019 +0000 +++ b/http-derived/nmea/http-nmea-script.js Sat Apr 06 11:35:55 2019 +0000 @@ -1,21 +1,25 @@ '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 +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) { @@ -23,57 +27,66 @@ 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); - 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++) + 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.padStart(2, '0') + ' ' + parseInt(response.substr(73 + i * 8, 8), 16) + '\r\n'; + buckets += (i * 50).toString().padStart(3, '0') + ' ' + parseInt(response.substr(81 + i * 8, 8), 16) + '\r\n'; } } function degToString(plus, minus, deg) { - deg /= 10000000; + deg /= NMEA_DEG_UNIT; 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); + 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', nmeaMsgTrace ? 'rtl' : 'ltr'); - elem = document.getElementById('ajax-trace-cmd' ); if (elem) elem.setAttribute('dir', nmeaCmdTrace ? 'rtl' : 'ltr'); + 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', 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-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 = 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-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-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;