146 lines
4.2 KiB
C++
146 lines
4.2 KiB
C++
#include "TimeClient.h"
|
|
|
|
TimeClient::TimeClient(float utcOffset, DebugController * debugController) {
|
|
this->myUtcOffset = utcOffset;
|
|
this->debugController = debugController;
|
|
}
|
|
|
|
bool TimeClient::handleSync(int snycDelayMinutes) {
|
|
//Get Time Update
|
|
if((this->getMinutesFromLastRefresh() >= snycDelayMinutes) || this->lastEpoch == 0) {
|
|
this->debugController->printLn("Updating Time...");
|
|
this->updateTime();
|
|
this->lastEpoch = this->getCurrentEpoch();
|
|
this->debugController->printLn("Local time: " + this->getAmPmFormattedTime());
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int TimeClient::getMinutesFromLastRefresh() {
|
|
int minutes = (this->getCurrentEpoch() - this->lastEpoch) / 60;
|
|
return minutes;
|
|
}
|
|
|
|
void TimeClient::resetLastEpoch() {
|
|
this->lastEpoch = 0;
|
|
}
|
|
|
|
void TimeClient::updateTime() {
|
|
WiFiClient client;
|
|
|
|
if (!client.connect(ntpServerName, httpPort)) {
|
|
this->debugController->printLn("connection failed");
|
|
return;
|
|
}
|
|
|
|
// This will send the request to the server
|
|
client.print(String("GET / HTTP/1.1\r\n") +
|
|
String("Host: www.google.com\r\n") +
|
|
String("Connection: close\r\n\r\n"));
|
|
int repeatCounter = 0;
|
|
while(!client.available() && repeatCounter < 10) {
|
|
delay(1000);
|
|
this->debugController->printLn(".");
|
|
repeatCounter++;
|
|
}
|
|
|
|
String line;
|
|
|
|
int size = 0;
|
|
client.setNoDelay(false);
|
|
while(client.connected()) {
|
|
while((size = client.available()) > 0) {
|
|
line = client.readStringUntil('\n');
|
|
line.toUpperCase();
|
|
// example:
|
|
// date: Thu, 19 Nov 2015 20:25:40 GMT
|
|
if (line.startsWith("DATE: ")) {
|
|
this->debugController->printLn(line.substring(23, 25) + ":" + line.substring(26, 28) + ":" +line.substring(29, 31));
|
|
int parsedHours = line.substring(23, 25).toInt();
|
|
int parsedMinutes = line.substring(26, 28).toInt();
|
|
int parsedSeconds = line.substring(29, 31).toInt();
|
|
this->debugController->printLn(String(parsedHours) + ":" + String(parsedMinutes) + ":" + String(parsedSeconds));
|
|
|
|
localEpoc = (parsedHours * 60 * 60 + parsedMinutes * 60 + parsedSeconds);
|
|
this->debugController->printLn(localEpoc);
|
|
localMillisAtUpdate = millis();
|
|
client.stop();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void TimeClient::setUtcOffset(float utcOffset) {
|
|
myUtcOffset = utcOffset;
|
|
}
|
|
|
|
String TimeClient::getHours() {
|
|
if (localEpoc == 0) {
|
|
return "--";
|
|
}
|
|
int hours = ((getCurrentEpochWithUtcOffset() % 86400L) / 3600) % 24;
|
|
if (hours < 10) {
|
|
return "0" + String(hours);
|
|
}
|
|
return String(hours); // print the hour (86400 equals secs per day)
|
|
|
|
}
|
|
String TimeClient::getMinutes() {
|
|
if (localEpoc == 0) {
|
|
return "--";
|
|
}
|
|
int minutes = ((getCurrentEpochWithUtcOffset() % 3600) / 60);
|
|
if (minutes < 10 ) {
|
|
// In the first 10 minutes of each hour, we'll want a leading '0'
|
|
return "0" + String(minutes);
|
|
}
|
|
return String(minutes);
|
|
}
|
|
String TimeClient::getSeconds() {
|
|
if (localEpoc == 0) {
|
|
return "--";
|
|
}
|
|
int seconds = getCurrentEpochWithUtcOffset() % 60;
|
|
if ( seconds < 10 ) {
|
|
// In the first 10 seconds of each minute, we'll want a leading '0'
|
|
return "0" + String(seconds);
|
|
}
|
|
return String(seconds);
|
|
}
|
|
|
|
String TimeClient::getAmPmHours() {
|
|
int hours = getHours().toInt();
|
|
if (hours >= 13) {
|
|
hours = hours - 12;
|
|
}
|
|
if (hours == 0) {
|
|
hours = 12;
|
|
}
|
|
return String(hours);
|
|
}
|
|
|
|
String TimeClient::getAmPm() {
|
|
int hours = getHours().toInt();
|
|
String ampmValue = "AM";
|
|
if (hours >= 12) {
|
|
ampmValue = "PM";
|
|
}
|
|
return ampmValue;
|
|
}
|
|
|
|
String TimeClient::getFormattedTime() {
|
|
return getHours() + ":" + getMinutes() + ":" + getSeconds();
|
|
}
|
|
|
|
String TimeClient::getAmPmFormattedTime() {
|
|
return getAmPmHours() + ":" + getMinutes() + " " + getAmPm();
|
|
}
|
|
|
|
long TimeClient::getCurrentEpoch() {
|
|
return localEpoc + ((millis() - localMillisAtUpdate) / 1000);
|
|
}
|
|
|
|
long TimeClient::getCurrentEpochWithUtcOffset() {
|
|
return (long)round(getCurrentEpoch() + 3600 * myUtcOffset + 86400L) % 86400L;
|
|
} |