#include "clock.h"
|
|
|
|
#include <ESP8266WiFi.h>
|
|
#include <DS1307RTC.h>
|
|
|
|
Clock::Clock(ClockSettings const& settings):
|
|
m_settings(settings),
|
|
m_last_NTP_check(0),
|
|
m_NTP_waiting_for_response(false),
|
|
m_UDP(),
|
|
m_NTP_ip()
|
|
{
|
|
setSyncProvider(RTC.get);
|
|
m_UDP.begin(NTP_PORT);
|
|
}
|
|
|
|
void Clock::internet_update()
|
|
{
|
|
ntp_update();
|
|
}
|
|
|
|
void Clock::ntp_update()
|
|
{
|
|
bool need_to_ask = false;
|
|
if(timeStatus() != timeSet)
|
|
need_to_ask = !m_NTP_waiting_for_response;
|
|
else if(m_NTP_waiting_for_response)
|
|
{
|
|
//5 minutes timeout for the NTP response
|
|
if((now() - m_last_NTP_check) > 5*60)
|
|
m_NTP_waiting_for_response = false;
|
|
}
|
|
else
|
|
need_to_ask = (now() - m_last_NTP_check) > m_settings.cooldown();
|
|
|
|
if(need_to_ask) ntp_ask();
|
|
ntp_checkResponse();
|
|
}
|
|
|
|
void Clock::ntp_ask()
|
|
{
|
|
if(!WiFi.hostByName(m_settings.server(), m_NTP_ip))
|
|
{
|
|
Serial.print("DNS lookup for \"");
|
|
Serial.print(m_settings.server());
|
|
Serial.println("\" failed");
|
|
return;
|
|
}
|
|
|
|
Serial.print("time server IP: \"");
|
|
Serial.print(m_NTP_ip);
|
|
Serial.println("\"");
|
|
|
|
Serial.println("Sending NTP request...");
|
|
//creating the NTP packet
|
|
memset(m_NTP_buffer, 0, NTP_BUFFER_SIZE);
|
|
m_NTP_buffer[0] = 0b11100011; //LI, version, mode
|
|
m_UDP.beginPacket(m_NTP_ip, NTP_PORT);
|
|
m_UDP.write(m_NTP_buffer, NTP_BUFFER_SIZE);
|
|
m_UDP.endPacket();
|
|
|
|
m_last_NTP_check = now();
|
|
m_NTP_waiting_for_response = true;
|
|
}
|
|
|
|
void Clock::ntp_checkResponse()
|
|
{
|
|
//no packet available
|
|
if(m_UDP.parsePacket() == 0)
|
|
return;
|
|
|
|
m_NTP_waiting_for_response = false;
|
|
|
|
m_UDP.read(m_NTP_buffer, NTP_BUFFER_SIZE);
|
|
|
|
time_t NTP_time = (m_NTP_buffer[40] << 24) |
|
|
(m_NTP_buffer[41] << 16) |
|
|
(m_NTP_buffer[42] << 8) |
|
|
(m_NTP_buffer[43]);
|
|
|
|
time_t UNIX_time = NTP_time - 2208988800UL;
|
|
|
|
m_last_NTP_check = UNIX_time;
|
|
RTC.set(UNIX_time);
|
|
setTime(UNIX_time);
|
|
|
|
Serial.print("Time: ");
|
|
Serial.println(UNIX_time);
|
|
}
|