Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: oldheating gps motorhome heating
clock/http-clock-script.inc
- Committer:
- andrewboyson
- Date:
- 2019-02-25
- Revision:
- 46:1822fdbe6c0c
- Parent:
- 40:1dc51ae32787
- Child:
- 77:4689596a2f3f
File content as of revision 46:1822fdbe6c0c:
"'use strict';\n"
"\n"
"var response = '';\n"
"var headers = '';\n"
"var msRtc = 0; //nibbles 0 to 3: 16 bits\n"
"var msCountAtRtcSet = 0;\n"
"var msDiff = 0;\n"
"var rtcIsSet = false; //nibble 4: bit 0\n"
"var clockIsSet = false; //nibble 4: bit 1\n"
"var sourceIsOk = false; //nibble 4: bit 2\n"
"var rateIsLocked = false; //nibble 4: bit 3\n"
"var timeIsLocked = false; //nibble 5: bit 0\n"
"var leapEnable = false; //nibble 5: bit 1\n"
"var leapForward = false; //nibble 5: bit 2\n"
"var leapmonths1970 = 0; //nibbles 6 to 8: 12 bits\n"
"var leapmonth = 0;\n"
"var leapyear = 0;\n"
"var leaps = 0; //nibbles 9 to 12: 16 bits\n"
"var msCount = 0;\n"
"\n"
"const TICK_MS = 100;\n"
"const AJAX_REFRESH_MS = 10000;\n"
"const AJAX_QUIET_MS = 3000;\n"
"\n"
"function hexToBit(iChar, iBit)\n"
"{\n"
" var value = parseInt(response.charAt(iChar), 16);\n"
" value >>= iBit;\n"
" return value & 1;\n"
"}\n"
"function parseAjax()\n"
"{\n"
" var iDateStart = headers.toLowerCase().indexOf('date:');\n"
" var iDateEnd = headers.indexOf('\\r', iDateStart);\n"
" var rtcDate = new Date(headers.slice(iDateStart + 5, iDateEnd));\n"
" msRtc = parseInt(response.substr(0, 4), 16);\n"
" msRtc += rtcDate.getTime();\n"
" msDiff = msRtc - Date.now();\n"
" msCountAtRtcSet = msCount;\n"
" rtcIsSet = hexToBit(4, 0);\n"
" clockIsSet = hexToBit(4, 1);\n"
" sourceIsOk = hexToBit(4, 2);\n"
" rateIsLocked = hexToBit(4, 3);\n"
" timeIsLocked = hexToBit(5, 0);\n"
" leapEnable = hexToBit(5, 1);\n"
" leapForward = hexToBit(5, 2);\n"
" leapmonths1970 = parseInt(response.substr(6, 3), 16);\n"
" leapmonth = leapmonths1970 % 12;\n"
" leapyear = (leapmonths1970 - leapmonth) / 12;\n"
" leapmonth += 1;\n"
" leapyear += 1970;\n"
" leaps = parseInt(response.substr(9, 4), 16);\n"
"}\n"
"function displayGeneral()\n"
"{\n"
" var elem;\n"
" elem = document.getElementById('ajax-rtc-set' ); if (elem) elem.setAttribute('dir', rtcIsSet ? 'rtl' : 'ltr');\n"
" elem = document.getElementById('ajax-clock-set' ); if (elem) elem.setAttribute('dir', clockIsSet ? 'rtl' : 'ltr');\n"
" elem = document.getElementById('ajax-source-ok' ); if (elem) elem.setAttribute('dir', sourceIsOk ? 'rtl' : 'ltr');\n"
" elem = document.getElementById('ajax-rate-locked' ); if (elem) elem.setAttribute('dir', rateIsLocked ? 'rtl' : 'ltr');\n"
" elem = document.getElementById('ajax-time-locked' ); if (elem) elem.setAttribute('dir', timeIsLocked ? 'rtl' : 'ltr');\n"
"\n"
" elem = document.getElementById('ajax-leap-enable' ); if (elem) elem.setAttribute('dir', leapEnable ? 'rtl' : 'ltr');\n"
" elem = document.getElementById('ajax-leap-forward' ); if (elem) elem.setAttribute('dir', leapForward ? 'rtl' : 'ltr');\n"
"\n"
" elem = document.getElementById('ajax-leap-year' ); if (elem) elem.value = leapmonths1970 ? leapyear : '';\n"
" elem = document.getElementById('ajax-leap-month' ); if (elem) elem.value = leapmonths1970 ? leapmonth : '';\n"
"\n"
" elem = document.getElementById('ajax-leap-count' ); if (elem) elem.value = leaps;\n"
"\n"
" elem = document.getElementById('ajax-response' ); if (elem) elem.innerHTML = response;\n"
" elem = document.getElementById('ajax-headers' ); if (elem) elem.innerHTML = headers;\n"
" \n"
" elem = document.getElementById('date-diff' ); if (elem) elem.innerHTML = msDiff;\n"
"}\n"
"\n"
"function formatNumbers00(i)\n"
"{\n"
" if (i<10) i='0' + i;\n"
" return i;\n"
"}\n"
"function formatDayOfWeek(wday)\n"
"{\n"
" switch(wday)\n"
" {\n"
" case 0: return 'Sun';\n"
" case 1: return 'Mon';\n"
" case 2: return 'Tue';\n"
" case 3: return 'Wed';\n"
" case 4: return 'Thu';\n"
" case 5: return 'Fri';\n"
" case 6: return 'Sat';\n"
" default: return '---';\n"
" }\n"
"}\n"
"function adjustLeap()\n"
"{\n"
" if (msRtc == 0) return; //Don't attempt to adjust an invalid time\n"
" \n"
" if (!leapEnable) return; // Adjustment disabled\n"
" \n"
" //Get the calander date and time from the ms\n"
" var now = msCount - msCountAtRtcSet + msRtc;\n"
" var leapStart = Date.UTC(leapyear, leapmonth - 1, 1, 0, 0, leapForward ? 0: -1);\n"
" \n"
" if (now < leapStart) return; //Do nothing until reached the leap start\n"
" \n"
" if (leapForward) { msRtc -= 1000; leaps += 1; } //repeat 59\n"
" else { msRtc += 1000; leaps -= 1; } //skip 59\n"
" \n"
" leapEnable = false;\n"
"}\n"
"function displayTime()\n"
"{\n"
" if (msRtc == 0) return; //Don't attempt to display an invalid time\n"
" \n"
" //Get the calander date and time from the ms\n"
" var now = new Date(msCount - msCountAtRtcSet + msRtc);\n"
" var y = now.getUTCFullYear();\n"
" var n = now.getUTCMonth () + 1;\n"
" var d = now.getUTCDate ();\n"
" var w = now.getUTCDay (); // 0 == Sunday\n"
" var h = now.getUTCHours ();\n"
" var m = now.getUTCMinutes ();\n"
" var s = now.getUTCSeconds ();\n"
" \n"
" //Format time\n"
" n = formatNumbers00(n);\n"
" d = formatNumbers00(d);\n"
" h = formatNumbers00(h);\n"
" m = formatNumbers00(m);\n"
" s = formatNumbers00(s);\n"
" w = formatDayOfWeek(w);\n"
" \n"
" //Display time\n"
" var elem;\n"
" \n"
" elem = document.getElementById('date-utc');\n"
" if (elem) elem.innerHTML = y + '-' + n + '-' + d + ' ' + w + ' ' + h + ':' + m + ':' + s + ' TAI-UTC=' + leaps;\n"
"\n"
" elem = document.getElementById('date-pc');\n"
" //if (elem) elem.innerHTML = now.toString();\n"
" var options = \n"
" {\n"
" year: 'numeric',\n"
" month: 'short',\n"
" day: '2-digit',\n"
" weekday: 'short',\n"
" hour: '2-digit',\n"
" minute: '2-digit',\n"
" second: '2-digit',\n"
" timeZoneName: 'short'\n"
" };\n"
" if (elem) elem.innerHTML = now.toLocaleString(undefined, options);\n"
"}\n"
"\n"
"var ajax;\n"
"var msCountAtAjaxSend = 0;\n"
"function AjaxRequest(request) //Used by this script and from HTML page\n"
"{\n"
" ajax=new XMLHttpRequest();\n"
" ajax.onreadystatechange=handleAjaxResponse;\n"
" if (request) ajax.open('GET', '/clock-ajax' + '?' + request, true);\n"
" else ajax.open('GET', '/clock-ajax' , true);\n"
" ajax.send();\n"
"}\n"
"function requestAjax() //Used in this script\n"
"{\n"
" \n"
" AjaxRequest('');\n"
" msCountAtAjaxSend = msCount;\n"
"}\n"
"\n"
"function counter()\n"
"{\n"
" msCount += TICK_MS; //Don't use Date.now() as we don't know when its clock will be updated around a leap second\n"
" adjustLeap();\n"
" displayTime();\n"
" if (msCount >= msCountAtRtcSet + AJAX_REFRESH_MS && //Wait until time to refresh\n"
" msCount >= msCountAtAjaxSend + AJAX_QUIET_MS) //Don't repeat during quiet period\n"
" {\n"
" requestAjax(); //RequestAjax will set msRtc and reset msCount\n"
" }\n"
"}\n"
"\n"
"function handleAjaxResponse()\n"
"{\n"
" if (ajax.readyState==4 && ajax.status==200)\n"
" {\n"
" response = ajax.responseText;\n"
" headers = ajax.getAllResponseHeaders();\n"
" parseAjax();\n"
" displayGeneral();\n"
" }\n"
"}\n"
"\n"
"function DisplayLeap() //Called by display leap button in HTML\n"
"{\n"
" leapEnable = true;\n"
" msRtc = Date.UTC(leapyear, leapmonth - 1, 1) - AJAX_REFRESH_MS / 2; //displays the refresh period around the latest leap second\n"
" msCountAtRtcSet = msCount;\n"
"}\n"
"\n"
"function init()\n"
"{\n"
" setInterval(counter, TICK_MS);\n"
" requestAjax();\n"
"}\n"
"if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init ); // Loading hasn't finished yet\n"
"else init(); //`DOMContentLoaded` has already fired\n"
""