A GPS disciplined clock

Dependencies:   net lpc1768 crypto clock web log

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?

UserRevisionLine numberNew 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