Andrew Boyson / gps

Dependencies:   net lpc1768 crypto clock web log

Committer:
andrewboyson
Date:
Wed Feb 06 19:57:29 2019 +0000
Revision:
34:d9586fc921dc
Parent:
33:e79c9d7d4a76
Child:
38:b7879c0ae0d9
Tidied nmea and pps modules including giving each their own confidence measure.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 27:eb5728b9052b 1 "'use strict';\n"
andrewboyson 27:eb5728b9052b 2 "\n"
andrewboyson 27:eb5728b9052b 3 "var response = '';\n"
andrewboyson 27:eb5728b9052b 4 "var headers = '';\n"
andrewboyson 27:eb5728b9052b 5 "var msRtc = 0; //nibbles 0 to 3: 16 bits\n"
andrewboyson 27:eb5728b9052b 6 "var msCountAtRtcSet = 0;\n"
andrewboyson 27:eb5728b9052b 7 "var msDiff = 0;\n"
andrewboyson 27:eb5728b9052b 8 "var rtcIsSet = false; //nibble 4: bit 0\n"
andrewboyson 27:eb5728b9052b 9 "var clockIsSet = false; //nibble 4: bit 1\n"
andrewboyson 28:7fb6b4e9ab80 10 "var ppsStable = false; //nibble 4: bit 2\n"
andrewboyson 34:d9586fc921dc 11 "var nmeaStable = false; //nibble 4: bit 3\n"
andrewboyson 34:d9586fc921dc 12 "var rateIsLocked = false; //nibble 5: bit 0\n"
andrewboyson 34:d9586fc921dc 13 "var timeIsLocked = false; //nibble 5: bit 1\n"
andrewboyson 34:d9586fc921dc 14 "var leapEnable = false; //nibble 5: bit 2\n"
andrewboyson 34:d9586fc921dc 15 "var leapForward = false; //nibble 5: bit 3\n"
andrewboyson 27:eb5728b9052b 16 "var leapmonths1970 = 0; //nibbles 6 to 8: 12 bits\n"
andrewboyson 27:eb5728b9052b 17 "var leapmonth = 0;\n"
andrewboyson 27:eb5728b9052b 18 "var leapyear = 0;\n"
andrewboyson 27:eb5728b9052b 19 "var leaps = 0; //nibbles 9 to 12: 16 bits\n"
andrewboyson 27:eb5728b9052b 20 "var msCount = 0;\n"
andrewboyson 27:eb5728b9052b 21 "\n"
andrewboyson 27:eb5728b9052b 22 "const TICK_MS = 100;\n"
andrewboyson 27:eb5728b9052b 23 "const AJAX_REFRESH_MS = 10000;\n"
andrewboyson 27:eb5728b9052b 24 "const AJAX_QUIET_MS = 3000;\n"
andrewboyson 27:eb5728b9052b 25 "\n"
andrewboyson 27:eb5728b9052b 26 "function hexToBit(iChar, iBit)\n"
andrewboyson 27:eb5728b9052b 27 "{\n"
andrewboyson 27:eb5728b9052b 28 " var value = parseInt(response.charAt(iChar), 16);\n"
andrewboyson 27:eb5728b9052b 29 " value >>= iBit;\n"
andrewboyson 27:eb5728b9052b 30 " return value & 1;\n"
andrewboyson 27:eb5728b9052b 31 "}\n"
andrewboyson 27:eb5728b9052b 32 "function parseAjax()\n"
andrewboyson 27:eb5728b9052b 33 "{\n"
andrewboyson 33:e79c9d7d4a76 34 " var iDateStart = headers.toLowerCase().indexOf('date:');\n"
andrewboyson 27:eb5728b9052b 35 " var iDateEnd = headers.indexOf('\\r', iDateStart);\n"
andrewboyson 27:eb5728b9052b 36 " var rtcDate = new Date(headers.slice(iDateStart + 5, iDateEnd));\n"
andrewboyson 27:eb5728b9052b 37 " msRtc = parseInt(response.substr(0, 4), 16);\n"
andrewboyson 27:eb5728b9052b 38 " msRtc += rtcDate.getTime();\n"
andrewboyson 27:eb5728b9052b 39 " msDiff = msRtc - Date.now();\n"
andrewboyson 27:eb5728b9052b 40 " msCountAtRtcSet = msCount;\n"
andrewboyson 27:eb5728b9052b 41 " rtcIsSet = hexToBit(4, 0);\n"
andrewboyson 27:eb5728b9052b 42 " clockIsSet = hexToBit(4, 1);\n"
andrewboyson 28:7fb6b4e9ab80 43 " ppsStable = hexToBit(4, 2);\n"
andrewboyson 34:d9586fc921dc 44 " nmeaStable = hexToBit(4, 3);\n"
andrewboyson 34:d9586fc921dc 45 " rateIsLocked = hexToBit(5, 0);\n"
andrewboyson 34:d9586fc921dc 46 " timeIsLocked = hexToBit(5, 1);\n"
andrewboyson 34:d9586fc921dc 47 " leapEnable = hexToBit(5, 2);\n"
andrewboyson 34:d9586fc921dc 48 " leapForward = hexToBit(5, 3);\n"
andrewboyson 27:eb5728b9052b 49 " leapmonths1970 = parseInt(response.substr(6, 3), 16);\n"
andrewboyson 27:eb5728b9052b 50 " leapmonth = leapmonths1970 % 12;\n"
andrewboyson 27:eb5728b9052b 51 " leapyear = (leapmonths1970 - leapmonth) / 12;\n"
andrewboyson 27:eb5728b9052b 52 " leapmonth += 1;\n"
andrewboyson 27:eb5728b9052b 53 " leapyear += 1970;\n"
andrewboyson 27:eb5728b9052b 54 " leaps = parseInt(response.substr(9, 4), 16);\n"
andrewboyson 27:eb5728b9052b 55 "}\n"
andrewboyson 27:eb5728b9052b 56 "function displayGeneral()\n"
andrewboyson 27:eb5728b9052b 57 "{\n"
andrewboyson 27:eb5728b9052b 58 " var elem;\n"
andrewboyson 27:eb5728b9052b 59 " elem = document.getElementById('ajax-rtc-set' ); if (elem) elem.setAttribute('dir', rtcIsSet ? 'rtl' : 'ltr');\n"
andrewboyson 27:eb5728b9052b 60 " elem = document.getElementById('ajax-clock-set' ); if (elem) elem.setAttribute('dir', clockIsSet ? 'rtl' : 'ltr');\n"
andrewboyson 28:7fb6b4e9ab80 61 " elem = document.getElementById('ajax-pps-stable' ); if (elem) elem.setAttribute('dir', ppsStable ? 'rtl' : 'ltr');\n"
andrewboyson 34:d9586fc921dc 62 " elem = document.getElementById('ajax-nmea-stable' ); if (elem) elem.setAttribute('dir', nmeaStable ? 'rtl' : 'ltr');\n"
andrewboyson 27:eb5728b9052b 63 " elem = document.getElementById('ajax-rate-locked' ); if (elem) elem.setAttribute('dir', rateIsLocked ? 'rtl' : 'ltr');\n"
andrewboyson 27:eb5728b9052b 64 " elem = document.getElementById('ajax-time-locked' ); if (elem) elem.setAttribute('dir', timeIsLocked ? 'rtl' : 'ltr');\n"
andrewboyson 27:eb5728b9052b 65 "\n"
andrewboyson 27:eb5728b9052b 66 " elem = document.getElementById('ajax-leap-enable' ); if (elem) elem.setAttribute('dir', leapEnable ? 'rtl' : 'ltr');\n"
andrewboyson 27:eb5728b9052b 67 " elem = document.getElementById('ajax-leap-forward' ); if (elem) elem.setAttribute('dir', leapForward ? 'rtl' : 'ltr');\n"
andrewboyson 27:eb5728b9052b 68 "\n"
andrewboyson 27:eb5728b9052b 69 " elem = document.getElementById('ajax-leap-year' ); if (elem) elem.value = leapmonths1970 ? leapyear : '';\n"
andrewboyson 27:eb5728b9052b 70 " elem = document.getElementById('ajax-leap-month' ); if (elem) elem.value = leapmonths1970 ? leapmonth : '';\n"
andrewboyson 27:eb5728b9052b 71 "\n"
andrewboyson 27:eb5728b9052b 72 " elem = document.getElementById('ajax-leap-count' ); if (elem) elem.value = leaps;\n"
andrewboyson 27:eb5728b9052b 73 "\n"
andrewboyson 27:eb5728b9052b 74 " elem = document.getElementById('ajax-response' ); if (elem) elem.innerHTML = response;\n"
andrewboyson 27:eb5728b9052b 75 " elem = document.getElementById('ajax-headers' ); if (elem) elem.innerHTML = headers;\n"
andrewboyson 27:eb5728b9052b 76 " \n"
andrewboyson 27:eb5728b9052b 77 " elem = document.getElementById('date-diff' ); if (elem) elem.innerHTML = msDiff;\n"
andrewboyson 27:eb5728b9052b 78 "}\n"
andrewboyson 27:eb5728b9052b 79 "\n"
andrewboyson 27:eb5728b9052b 80 "function formatNumbers00(i)\n"
andrewboyson 27:eb5728b9052b 81 "{\n"
andrewboyson 27:eb5728b9052b 82 " if (i<10) i='0' + i;\n"
andrewboyson 27:eb5728b9052b 83 " return i;\n"
andrewboyson 27:eb5728b9052b 84 "}\n"
andrewboyson 27:eb5728b9052b 85 "function formatDayOfWeek(wday)\n"
andrewboyson 27:eb5728b9052b 86 "{\n"
andrewboyson 27:eb5728b9052b 87 " switch(wday)\n"
andrewboyson 27:eb5728b9052b 88 " {\n"
andrewboyson 27:eb5728b9052b 89 " case 0: return 'Sun';\n"
andrewboyson 27:eb5728b9052b 90 " case 1: return 'Mon';\n"
andrewboyson 27:eb5728b9052b 91 " case 2: return 'Tue';\n"
andrewboyson 27:eb5728b9052b 92 " case 3: return 'Wed';\n"
andrewboyson 27:eb5728b9052b 93 " case 4: return 'Thu';\n"
andrewboyson 27:eb5728b9052b 94 " case 5: return 'Fri';\n"
andrewboyson 27:eb5728b9052b 95 " case 6: return 'Sat';\n"
andrewboyson 27:eb5728b9052b 96 " default: return '---';\n"
andrewboyson 27:eb5728b9052b 97 " }\n"
andrewboyson 27:eb5728b9052b 98 "}\n"
andrewboyson 27:eb5728b9052b 99 "function adjustLeap()\n"
andrewboyson 27:eb5728b9052b 100 "{\n"
andrewboyson 27:eb5728b9052b 101 " if (msRtc == 0) return; //Don't attempt to adjust an invalid time\n"
andrewboyson 27:eb5728b9052b 102 " \n"
andrewboyson 27:eb5728b9052b 103 " if (!leapEnable) return; // Adjustment disabled\n"
andrewboyson 27:eb5728b9052b 104 " \n"
andrewboyson 27:eb5728b9052b 105 " //Get the calander date and time from the ms\n"
andrewboyson 27:eb5728b9052b 106 " var now = msCount - msCountAtRtcSet + msRtc;\n"
andrewboyson 27:eb5728b9052b 107 " var leapStart = Date.UTC(leapyear, leapmonth - 1, 1, 0, 0, leapForward ? 0: -1);\n"
andrewboyson 27:eb5728b9052b 108 " \n"
andrewboyson 27:eb5728b9052b 109 " if (now < leapStart) return; //Do nothing until reached the leap start\n"
andrewboyson 27:eb5728b9052b 110 " \n"
andrewboyson 27:eb5728b9052b 111 " if (leapForward) { msRtc -= 1000; leaps += 1; } //repeat 59\n"
andrewboyson 27:eb5728b9052b 112 " else { msRtc += 1000; leaps -= 1; } //skip 59\n"
andrewboyson 27:eb5728b9052b 113 " \n"
andrewboyson 27:eb5728b9052b 114 " leapEnable = false;\n"
andrewboyson 27:eb5728b9052b 115 "}\n"
andrewboyson 27:eb5728b9052b 116 "function displayTime()\n"
andrewboyson 27:eb5728b9052b 117 "{\n"
andrewboyson 27:eb5728b9052b 118 " if (msRtc == 0) return; //Don't attempt to display an invalid time\n"
andrewboyson 27:eb5728b9052b 119 " \n"
andrewboyson 27:eb5728b9052b 120 " //Get the calander date and time from the ms\n"
andrewboyson 27:eb5728b9052b 121 " var now = new Date(msCount - msCountAtRtcSet + msRtc);\n"
andrewboyson 27:eb5728b9052b 122 " var y = now.getUTCFullYear();\n"
andrewboyson 27:eb5728b9052b 123 " var n = now.getUTCMonth () + 1;\n"
andrewboyson 27:eb5728b9052b 124 " var d = now.getUTCDate ();\n"
andrewboyson 27:eb5728b9052b 125 " var w = now.getUTCDay (); // 0 == Sunday\n"
andrewboyson 27:eb5728b9052b 126 " var h = now.getUTCHours ();\n"
andrewboyson 27:eb5728b9052b 127 " var m = now.getUTCMinutes ();\n"
andrewboyson 27:eb5728b9052b 128 " var s = now.getUTCSeconds ();\n"
andrewboyson 27:eb5728b9052b 129 " \n"
andrewboyson 27:eb5728b9052b 130 " //Format time\n"
andrewboyson 27:eb5728b9052b 131 " n = formatNumbers00(n);\n"
andrewboyson 27:eb5728b9052b 132 " d = formatNumbers00(d);\n"
andrewboyson 27:eb5728b9052b 133 " h = formatNumbers00(h);\n"
andrewboyson 27:eb5728b9052b 134 " m = formatNumbers00(m);\n"
andrewboyson 27:eb5728b9052b 135 " s = formatNumbers00(s);\n"
andrewboyson 27:eb5728b9052b 136 " w = formatDayOfWeek(w);\n"
andrewboyson 27:eb5728b9052b 137 " \n"
andrewboyson 27:eb5728b9052b 138 " //Display time\n"
andrewboyson 27:eb5728b9052b 139 " var elem;\n"
andrewboyson 27:eb5728b9052b 140 " \n"
andrewboyson 27:eb5728b9052b 141 " elem = document.getElementById('date-utc');\n"
andrewboyson 27:eb5728b9052b 142 " if (elem) elem.innerHTML = y + '-' + n + '-' + d + ' ' + w + ' ' + h + ':' + m + ':' + s + ' TAI-UTC=' + leaps;\n"
andrewboyson 27:eb5728b9052b 143 "\n"
andrewboyson 27:eb5728b9052b 144 " elem = document.getElementById('date-pc');\n"
andrewboyson 27:eb5728b9052b 145 " //if (elem) elem.innerHTML = now.toString();\n"
andrewboyson 27:eb5728b9052b 146 " var options = \n"
andrewboyson 27:eb5728b9052b 147 " {\n"
andrewboyson 27:eb5728b9052b 148 " year: 'numeric',\n"
andrewboyson 27:eb5728b9052b 149 " month: 'short',\n"
andrewboyson 27:eb5728b9052b 150 " day: '2-digit',\n"
andrewboyson 27:eb5728b9052b 151 " weekday: 'short',\n"
andrewboyson 27:eb5728b9052b 152 " hour: '2-digit',\n"
andrewboyson 27:eb5728b9052b 153 " minute: '2-digit',\n"
andrewboyson 27:eb5728b9052b 154 " second: '2-digit',\n"
andrewboyson 27:eb5728b9052b 155 " timeZoneName: 'short'\n"
andrewboyson 27:eb5728b9052b 156 " };\n"
andrewboyson 27:eb5728b9052b 157 " if (elem) elem.innerHTML = now.toLocaleString(undefined, options);\n"
andrewboyson 27:eb5728b9052b 158 "}\n"
andrewboyson 27:eb5728b9052b 159 "\n"
andrewboyson 27:eb5728b9052b 160 "var ajax;\n"
andrewboyson 27:eb5728b9052b 161 "var msCountAtAjaxSend = 0;\n"
andrewboyson 27:eb5728b9052b 162 "function AjaxRequest(request) //Used by this script and from HTML page\n"
andrewboyson 27:eb5728b9052b 163 "{\n"
andrewboyson 27:eb5728b9052b 164 " ajax=new XMLHttpRequest();\n"
andrewboyson 27:eb5728b9052b 165 " ajax.onreadystatechange=handleAjaxResponse;\n"
andrewboyson 27:eb5728b9052b 166 " if (request) ajax.open('GET', '/ajax-home' + '?' + request, true);\n"
andrewboyson 27:eb5728b9052b 167 " else ajax.open('GET', '/ajax-home' , true);\n"
andrewboyson 27:eb5728b9052b 168 " ajax.send();\n"
andrewboyson 27:eb5728b9052b 169 "}\n"
andrewboyson 27:eb5728b9052b 170 "function requestAjax() //Used in this script\n"
andrewboyson 27:eb5728b9052b 171 "{\n"
andrewboyson 27:eb5728b9052b 172 " \n"
andrewboyson 27:eb5728b9052b 173 " AjaxRequest('');\n"
andrewboyson 27:eb5728b9052b 174 " msCountAtAjaxSend = msCount;\n"
andrewboyson 27:eb5728b9052b 175 "}\n"
andrewboyson 27:eb5728b9052b 176 "\n"
andrewboyson 27:eb5728b9052b 177 "function counter()\n"
andrewboyson 27:eb5728b9052b 178 "{\n"
andrewboyson 27:eb5728b9052b 179 " msCount += TICK_MS; //Don't use Date.now() as we don't know when its clock will be updated around a leap second\n"
andrewboyson 27:eb5728b9052b 180 " adjustLeap();\n"
andrewboyson 27:eb5728b9052b 181 " displayTime();\n"
andrewboyson 27:eb5728b9052b 182 " if (msCount >= msCountAtRtcSet + AJAX_REFRESH_MS && //Wait until time to refresh\n"
andrewboyson 27:eb5728b9052b 183 " msCount >= msCountAtAjaxSend + AJAX_QUIET_MS) //Don't repeat during quiet period\n"
andrewboyson 27:eb5728b9052b 184 " {\n"
andrewboyson 27:eb5728b9052b 185 " requestAjax(); //RequestAjax will set msRtc and reset msCount\n"
andrewboyson 27:eb5728b9052b 186 " }\n"
andrewboyson 27:eb5728b9052b 187 "}\n"
andrewboyson 27:eb5728b9052b 188 "\n"
andrewboyson 27:eb5728b9052b 189 "function handleAjaxResponse()\n"
andrewboyson 27:eb5728b9052b 190 "{\n"
andrewboyson 27:eb5728b9052b 191 " if (ajax.readyState==4 && ajax.status==200)\n"
andrewboyson 27:eb5728b9052b 192 " {\n"
andrewboyson 27:eb5728b9052b 193 " response = ajax.responseText;\n"
andrewboyson 27:eb5728b9052b 194 " headers = ajax.getAllResponseHeaders();\n"
andrewboyson 27:eb5728b9052b 195 " parseAjax();\n"
andrewboyson 27:eb5728b9052b 196 " displayGeneral();\n"
andrewboyson 27:eb5728b9052b 197 " }\n"
andrewboyson 27:eb5728b9052b 198 "}\n"
andrewboyson 27:eb5728b9052b 199 "\n"
andrewboyson 27:eb5728b9052b 200 "function DisplayLeap() //Called by display leap button in HTML\n"
andrewboyson 27:eb5728b9052b 201 "{\n"
andrewboyson 27:eb5728b9052b 202 " leapEnable = true;\n"
andrewboyson 27:eb5728b9052b 203 " msRtc = Date.UTC(leapyear, leapmonth - 1, 1) - AJAX_REFRESH_MS / 2; //displays the refresh period around the latest leap second\n"
andrewboyson 27:eb5728b9052b 204 " msCountAtRtcSet = msCount;\n"
andrewboyson 27:eb5728b9052b 205 "}\n"
andrewboyson 27:eb5728b9052b 206 "\n"
andrewboyson 27:eb5728b9052b 207 "function init()\n"
andrewboyson 27:eb5728b9052b 208 "{\n"
andrewboyson 27:eb5728b9052b 209 " setInterval(counter, TICK_MS);\n"
andrewboyson 27:eb5728b9052b 210 " requestAjax();\n"
andrewboyson 27:eb5728b9052b 211 "}\n"
andrewboyson 27:eb5728b9052b 212 "if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init ); // Loading hasn't finished yet\n"
andrewboyson 27:eb5728b9052b 213 "else init(); //`DOMContentLoaded` has already fired\n"
andrewboyson 34:d9586fc921dc 214 ""