A GPS disciplined clock
Dependencies: net lpc1768 crypto clock web log
http-derived/nmea/http-nmea-script.js@49:115a5e4fac0c, 2019-04-06 (annotated)
- Committer:
- andrewboyson
- Date:
- Sat Apr 06 11:35:55 2019 +0000
- Revision:
- 49:115a5e4fac0c
- Parent:
- 48:9f1ab7784067
Updated libraries
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 48:9f1ab7784067 | 1 | 'use strict'; |
andrewboyson | 48:9f1ab7784067 | 2 | |
andrewboyson | 49:115a5e4fac0c | 3 | const NMEA_DEG_UNIT = 10000000; |
andrewboyson | 49:115a5e4fac0c | 4 | const NMEA_HGT_UNIT = 1000000; |
andrewboyson | 49:115a5e4fac0c | 5 | |
andrewboyson | 49:115a5e4fac0c | 6 | var response = ''; |
andrewboyson | 49:115a5e4fac0c | 7 | var headers = ''; |
andrewboyson | 49:115a5e4fac0c | 8 | var gpsTrace = false; |
andrewboyson | 49:115a5e4fac0c | 9 | var gpsVerbose = false; |
andrewboyson | 49:115a5e4fac0c | 10 | var msgTrace = false; |
andrewboyson | 49:115a5e4fac0c | 11 | var cmdTrace = false; |
andrewboyson | 49:115a5e4fac0c | 12 | var lat = 0; |
andrewboyson | 49:115a5e4fac0c | 13 | var lng = 0; |
andrewboyson | 49:115a5e4fac0c | 14 | var hgt = 0; |
andrewboyson | 49:115a5e4fac0c | 15 | var hgtAboveMsl = 0; |
andrewboyson | 49:115a5e4fac0c | 16 | var mslAboveWgs = 0; |
andrewboyson | 49:115a5e4fac0c | 17 | var dop = 0; |
andrewboyson | 49:115a5e4fac0c | 18 | var satCount = 0; |
andrewboyson | 49:115a5e4fac0c | 19 | var fixQuality = 0; |
andrewboyson | 49:115a5e4fac0c | 20 | var sensorHeight = 0; |
andrewboyson | 49:115a5e4fac0c | 21 | var bucketCount = 0; |
andrewboyson | 49:115a5e4fac0c | 22 | var buckets = ''; |
andrewboyson | 48:9f1ab7784067 | 23 | |
andrewboyson | 48:9f1ab7784067 | 24 | function hexToBit(iChar, iBit) |
andrewboyson | 48:9f1ab7784067 | 25 | { |
andrewboyson | 48:9f1ab7784067 | 26 | var value = parseInt(response.charAt(iChar), 16); |
andrewboyson | 48:9f1ab7784067 | 27 | value >>= iBit; |
andrewboyson | 48:9f1ab7784067 | 28 | return value & 1; |
andrewboyson | 48:9f1ab7784067 | 29 | } |
andrewboyson | 49:115a5e4fac0c | 30 | function parseSint32fromHex(value) |
andrewboyson | 49:115a5e4fac0c | 31 | { |
andrewboyson | 49:115a5e4fac0c | 32 | value = parseInt(value, 16); |
andrewboyson | 49:115a5e4fac0c | 33 | if (value > 0x7FFFFFFF) value -= 0xFFFFFFFF; |
andrewboyson | 49:115a5e4fac0c | 34 | return value; |
andrewboyson | 49:115a5e4fac0c | 35 | } |
andrewboyson | 48:9f1ab7784067 | 36 | function parseAjax() |
andrewboyson | 48:9f1ab7784067 | 37 | { |
andrewboyson | 49:115a5e4fac0c | 38 | gpsTrace = hexToBit(0, 0); |
andrewboyson | 49:115a5e4fac0c | 39 | gpsVerbose = hexToBit(0, 1); |
andrewboyson | 49:115a5e4fac0c | 40 | msgTrace = hexToBit(0, 2); |
andrewboyson | 49:115a5e4fac0c | 41 | cmdTrace = hexToBit(0, 3); |
andrewboyson | 49:115a5e4fac0c | 42 | lat = parseSint32fromHex(response.substr( 1, 8)); |
andrewboyson | 49:115a5e4fac0c | 43 | lng = parseSint32fromHex(response.substr( 9, 8)); |
andrewboyson | 49:115a5e4fac0c | 44 | hgt = parseSint32fromHex(response.substr(17, 8)); |
andrewboyson | 49:115a5e4fac0c | 45 | hgtAboveMsl = parseSint32fromHex(response.substr(25, 8)); |
andrewboyson | 49:115a5e4fac0c | 46 | mslAboveWgs = parseSint32fromHex(response.substr(33, 8)); |
andrewboyson | 49:115a5e4fac0c | 47 | dop = parseSint32fromHex(response.substr(41, 8)); |
andrewboyson | 49:115a5e4fac0c | 48 | satCount = parseSint32fromHex(response.substr(49, 8)); |
andrewboyson | 49:115a5e4fac0c | 49 | fixQuality = parseSint32fromHex(response.substr(57, 8)); |
andrewboyson | 49:115a5e4fac0c | 50 | sensorHeight = parseSint32fromHex(response.substr(65, 8)); |
andrewboyson | 49:115a5e4fac0c | 51 | bucketCount = parseSint32fromHex(response.substr(73, 8)); |
andrewboyson | 49:115a5e4fac0c | 52 | buckets = ''; |
andrewboyson | 49:115a5e4fac0c | 53 | for (var i = 0; i < bucketCount; i++) |
andrewboyson | 48:9f1ab7784067 | 54 | { |
andrewboyson | 49:115a5e4fac0c | 55 | buckets += (i * 50).toString().padStart(3, '0') + ' ' + parseInt(response.substr(81 + i * 8, 8), 16) + '\r\n'; |
andrewboyson | 48:9f1ab7784067 | 56 | } |
andrewboyson | 48:9f1ab7784067 | 57 | } |
andrewboyson | 48:9f1ab7784067 | 58 | function degToString(plus, minus, deg) |
andrewboyson | 48:9f1ab7784067 | 59 | { |
andrewboyson | 49:115a5e4fac0c | 60 | deg /= NMEA_DEG_UNIT; |
andrewboyson | 48:9f1ab7784067 | 61 | if (deg >= 0) return plus + deg.toFixed(5); |
andrewboyson | 48:9f1ab7784067 | 62 | else return minus + (-deg).toFixed(5); |
andrewboyson | 48:9f1ab7784067 | 63 | } |
andrewboyson | 48:9f1ab7784067 | 64 | function hgtToString(plus, minus, hgt) |
andrewboyson | 48:9f1ab7784067 | 65 | { |
andrewboyson | 49:115a5e4fac0c | 66 | hgt /= NMEA_HGT_UNIT; |
andrewboyson | 49:115a5e4fac0c | 67 | if (hgt >= 0) return plus + hgt.toFixed(1); |
andrewboyson | 49:115a5e4fac0c | 68 | else return minus + (-hgt).toFixed(1); |
andrewboyson | 48:9f1ab7784067 | 69 | } |
andrewboyson | 48:9f1ab7784067 | 70 | function displayGeneral() |
andrewboyson | 48:9f1ab7784067 | 71 | { |
andrewboyson | 48:9f1ab7784067 | 72 | var elem; |
andrewboyson | 49:115a5e4fac0c | 73 | elem = document.getElementById('ajax-trace-gps' ); if (elem) elem.setAttribute('dir', gpsTrace ? 'rtl' : 'ltr'); |
andrewboyson | 49:115a5e4fac0c | 74 | elem = document.getElementById('ajax-trace-verbose'); if (elem) elem.setAttribute('dir', gpsVerbose ? 'rtl' : 'ltr'); |
andrewboyson | 49:115a5e4fac0c | 75 | elem = document.getElementById('ajax-trace-msg' ); if (elem) elem.setAttribute('dir', msgTrace ? 'rtl' : 'ltr'); |
andrewboyson | 49:115a5e4fac0c | 76 | elem = document.getElementById('ajax-trace-cmd' ); if (elem) elem.setAttribute('dir', cmdTrace ? 'rtl' : 'ltr'); |
andrewboyson | 48:9f1ab7784067 | 77 | |
andrewboyson | 49:115a5e4fac0c | 78 | elem = document.getElementById('ajax-position' ); if (elem) elem.textContent = degToString('N', 'S', lat) + ' ' + |
andrewboyson | 49:115a5e4fac0c | 79 | degToString('E', 'W', lng) + ' ' + |
andrewboyson | 49:115a5e4fac0c | 80 | hgtToString('H', 'D', hgt); |
andrewboyson | 49:115a5e4fac0c | 81 | elem = document.getElementById('ajax-msl-above-wgs'); if (elem) elem.textContent = hgtToString('H', 'D', mslAboveWgs); |
andrewboyson | 49:115a5e4fac0c | 82 | elem = document.getElementById('ajax-hgt-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl); |
andrewboyson | 49:115a5e4fac0c | 83 | elem = document.getElementById('ajax-gnd-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl - sensorHeight * NMEA_HGT_UNIT); |
andrewboyson | 48:9f1ab7784067 | 84 | |
andrewboyson | 49:115a5e4fac0c | 85 | elem = document.getElementById('ajax-dop' ); if (elem) elem.textContent = dop / 100; |
andrewboyson | 49:115a5e4fac0c | 86 | elem = document.getElementById('ajax-sat-count' ); if (elem) elem.textContent = satCount; |
andrewboyson | 49:115a5e4fac0c | 87 | elem = document.getElementById('ajax-fix-quality' ); if (elem) elem.textContent = fixQuality; |
andrewboyson | 48:9f1ab7784067 | 88 | |
andrewboyson | 49:115a5e4fac0c | 89 | elem = document.getElementById('ajax-sensor-hgt' ); if (elem) elem.value = sensorHeight; |
andrewboyson | 48:9f1ab7784067 | 90 | |
andrewboyson | 48:9f1ab7784067 | 91 | elem = document.getElementById('ajax-bucket-count' ); if (elem) elem.textContent = bucketCount; |
andrewboyson | 48:9f1ab7784067 | 92 | elem = document.getElementById('ajax-buckets' ); if (elem) elem.textContent = buckets; |
andrewboyson | 48:9f1ab7784067 | 93 | |
andrewboyson | 48:9f1ab7784067 | 94 | elem = document.getElementById('ajax-response' ); if (elem) elem.textContent = response; |
andrewboyson | 48:9f1ab7784067 | 95 | elem = document.getElementById('ajax-headers' ); if (elem) elem.textContent = headers; |
andrewboyson | 48:9f1ab7784067 | 96 | } |
andrewboyson | 48:9f1ab7784067 | 97 | |
andrewboyson | 48:9f1ab7784067 | 98 | var ajax; |
andrewboyson | 48:9f1ab7784067 | 99 | function AjaxRequest(request) //Used by this script and from HTML page |
andrewboyson | 48:9f1ab7784067 | 100 | { |
andrewboyson | 48:9f1ab7784067 | 101 | ajax=new XMLHttpRequest(); |
andrewboyson | 48:9f1ab7784067 | 102 | ajax.onreadystatechange=handleAjaxResponse; |
andrewboyson | 48:9f1ab7784067 | 103 | if (request) ajax.open('GET', '/nmea-ajax' + '?' + request, true); |
andrewboyson | 48:9f1ab7784067 | 104 | else ajax.open('GET', '/nmea-ajax' , true); |
andrewboyson | 48:9f1ab7784067 | 105 | ajax.send(); |
andrewboyson | 48:9f1ab7784067 | 106 | } |
andrewboyson | 48:9f1ab7784067 | 107 | function requestAjax() //Used in this script |
andrewboyson | 48:9f1ab7784067 | 108 | { |
andrewboyson | 48:9f1ab7784067 | 109 | AjaxRequest(''); |
andrewboyson | 48:9f1ab7784067 | 110 | } |
andrewboyson | 48:9f1ab7784067 | 111 | |
andrewboyson | 48:9f1ab7784067 | 112 | function handleAjaxResponse() |
andrewboyson | 48:9f1ab7784067 | 113 | { |
andrewboyson | 48:9f1ab7784067 | 114 | if (ajax.readyState==4 && ajax.status==200) |
andrewboyson | 48:9f1ab7784067 | 115 | { |
andrewboyson | 48:9f1ab7784067 | 116 | response = ajax.responseText; |
andrewboyson | 48:9f1ab7784067 | 117 | headers = ajax.getAllResponseHeaders(); |
andrewboyson | 48:9f1ab7784067 | 118 | parseAjax(); |
andrewboyson | 48:9f1ab7784067 | 119 | displayGeneral(); |
andrewboyson | 48:9f1ab7784067 | 120 | } |
andrewboyson | 48:9f1ab7784067 | 121 | } |
andrewboyson | 48:9f1ab7784067 | 122 | |
andrewboyson | 48:9f1ab7784067 | 123 | function init() |
andrewboyson | 48:9f1ab7784067 | 124 | { |
andrewboyson | 48:9f1ab7784067 | 125 | setInterval(requestAjax, 10000); |
andrewboyson | 48:9f1ab7784067 | 126 | requestAjax(); |
andrewboyson | 48:9f1ab7784067 | 127 | } |
andrewboyson | 48:9f1ab7784067 | 128 | if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init ); // Loading hasn't finished yet |
andrewboyson | 48:9f1ab7784067 | 129 | else init(); //`DOMContentLoaded` has already fired |