Andrew Boyson / gps

Dependencies:   net lpc1768 crypto clock web log

Committer:
andrewboyson
Date:
Fri Jan 18 14:37:57 2019 +0000
Revision:
28:7fb6b4e9ab80
Parent:
27:eb5728b9052b
Child:
33:e79c9d7d4a76
Updated libraries

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