From 852f758be3ef92594819f09d11d2353a18991db4 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Mon, 24 May 2021 19:05:34 +0200 Subject: [PATCH] Subsecond accuracy NTP --- platformio.ini | 1 + usermods/EleksTube_IPS/usermod_elekstube_ips.h | 7 ++++--- wled00/ntp.cpp | 13 +++++++++---- wled00/src/dependencies/toki/Toki.h | 6 +++--- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/platformio.ini b/platformio.ini index d5c936f18..183a93c23 100644 --- a/platformio.ini +++ b/platformio.ini @@ -481,6 +481,7 @@ build_flags = ${common.build_flags_esp8266} board = esp32dev platform = espressif32@3.2 upload_speed = 921600 +upload_port = COM8 lib_deps = ${env.lib_deps} TFT_eSPI build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_BROWNOUT_DET -D WLED_DISABLE_INFRARED diff --git a/usermods/EleksTube_IPS/usermod_elekstube_ips.h b/usermods/EleksTube_IPS/usermod_elekstube_ips.h index f2f03466c..f2ce8eb08 100644 --- a/usermods/EleksTube_IPS/usermod_elekstube_ips.h +++ b/usermods/EleksTube_IPS/usermod_elekstube_ips.h @@ -40,9 +40,10 @@ class ElekstubeIPSUsermod : public Usermod { void setup() { tfts.begin(); tfts.fillScreen(TFT_BLACK); - tfts.setTextColor(TFT_WHITE, TFT_BLACK); - tfts.setCursor(0, 100, 2); - tfts.println(""); + + for (int8_t i = 5; i >= 0; i--) { + tfts.setDigit(i, 255, TFTs::force); //turn all off + } } void loop() { diff --git a/wled00/ntp.cpp b/wled00/ntp.cpp index dd823486c..f61e00af4 100644 --- a/wled00/ntp.cpp +++ b/wled00/ntp.cpp @@ -192,16 +192,21 @@ bool checkNTPResponse() Toki::Time arrived = toki.fromNTP(pbuf + 32); Toki::Time departed = toki.fromNTP(pbuf + 40); //basic half roundtrip estimation - uint32_t offset = (ntpPacketReceivedTime - ntpPacketSentTime - toki.msDifference(arrived, departed)) >> 1; - offset += millis() - ntpPacketReceivedTime +1; + uint32_t serverDelay = toki.msDifference(arrived, departed); + uint32_t offset = (ntpPacketReceivedTime - ntpPacketSentTime - serverDelay) >> 1; + toki.printTime(departed); toki.adjust(departed, offset); toki.setTime(departed); + Serial.print("Arrived: "); + toki.printTime(arrived); + Serial.print("Time: "); + toki.printTime(departed); Serial.print("Roundtrip: "); Serial.println(ntpPacketReceivedTime - ntpPacketSentTime); Serial.print("Offset: "); Serial.println(offset); - Serial.print("Time: "); - toki.printTime(toki.getTime()); + Serial.print("Serverdelay: "); + Serial.println(serverDelay); DEBUG_PRINT(F("Unix time = ")); uint32_t epoch = toki.second(); diff --git a/wled00/src/dependencies/toki/Toki.h b/wled00/src/dependencies/toki/Toki.h index 6ab404c26..bc6cd3d03 100644 --- a/wled00/src/dependencies/toki/Toki.h +++ b/wled00/src/dependencies/toki/Toki.h @@ -62,7 +62,7 @@ class Toki { if (!unix) return {0,0}; unix -= YEARS_70; //NTP begins 1900, Unix 1970 - unsigned long frac = word(timestamp[5], timestamp[6]); //65536ths of a second + unsigned long frac = word(timestamp[4], timestamp[5]); //65536ths of a second frac = (frac*1000) >> 16; //convert to ms return {unix, (uint16_t)frac}; } @@ -96,11 +96,11 @@ class Toki { void adjust(Time&t, int32_t offset) { int32_t secs = offset /1000; int32_t ms = offset - secs*1000; - t.sec += offset /1000; + t.sec += secs; int32_t nms = t.ms + ms; if (nms > 1000) {nms -= 1000; t.sec++;} if (nms < 0) {nms += 1000; t.sec--;} - t.ms += nms; + t.ms = nms; } Time getTime() {