2015-12-08 17:21:16 +01:00
|
|
|
#pragma once
|
|
|
|
|
2018-10-20 12:16:28 +02:00
|
|
|
#include <functional>
|
|
|
|
|
2015-12-08 17:21:16 +01:00
|
|
|
#include "Arduino.h"
|
|
|
|
|
2016-04-08 22:34:51 +02:00
|
|
|
#include <Udp.h>
|
2015-12-08 17:21:16 +01:00
|
|
|
|
|
|
|
#define SEVENZYYEARS 2208988800UL
|
|
|
|
#define NTP_PACKET_SIZE 48
|
2016-04-12 17:44:45 +02:00
|
|
|
#define NTP_DEFAULT_LOCAL_PORT 1337
|
2015-12-08 17:21:16 +01:00
|
|
|
|
|
|
|
class NTPClient {
|
2018-10-20 12:16:28 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
typedef std::function<void(void)> HandlerFunction;
|
|
|
|
|
2015-12-08 17:21:16 +01:00
|
|
|
private:
|
2016-04-08 22:34:51 +02:00
|
|
|
UDP* _udp;
|
2016-04-12 20:46:48 +02:00
|
|
|
bool _udpSetup = false;
|
2015-12-08 17:21:16 +01:00
|
|
|
|
2017-07-23 08:05:51 +02:00
|
|
|
const char* _poolServerName = "pool.ntp.org"; // Default time server
|
2016-04-12 17:44:45 +02:00
|
|
|
int _port = NTP_DEFAULT_LOCAL_PORT;
|
2018-06-27 12:17:09 +02:00
|
|
|
long _timeOffset = 0;
|
2015-12-08 17:21:16 +01:00
|
|
|
|
2017-03-27 17:17:43 +02:00
|
|
|
unsigned long _updateInterval = 60000; // In ms
|
2015-12-08 17:21:16 +01:00
|
|
|
|
2016-04-13 15:29:27 +02:00
|
|
|
unsigned long _currentEpoc = 0; // In s
|
2015-12-08 17:21:16 +01:00
|
|
|
unsigned long _lastUpdate = 0; // In ms
|
|
|
|
|
|
|
|
byte _packetBuffer[NTP_PACKET_SIZE];
|
|
|
|
|
2018-10-20 12:16:28 +02:00
|
|
|
HandlerFunction _updateStartHandler;
|
|
|
|
HandlerFunction _updateEndHandler;
|
|
|
|
|
2016-04-08 22:34:51 +02:00
|
|
|
void sendNTPPacket();
|
2015-12-08 17:21:16 +01:00
|
|
|
|
|
|
|
public:
|
2016-04-08 22:34:51 +02:00
|
|
|
NTPClient(UDP& udp);
|
2018-06-27 12:17:09 +02:00
|
|
|
NTPClient(UDP& udp, long timeOffset);
|
2016-04-08 22:34:51 +02:00
|
|
|
NTPClient(UDP& udp, const char* poolServerName);
|
2018-06-27 12:17:09 +02:00
|
|
|
NTPClient(UDP& udp, const char* poolServerName, long timeOffset);
|
|
|
|
NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
|
2015-12-08 17:21:16 +01:00
|
|
|
|
2017-10-31 10:01:47 +01:00
|
|
|
/**
|
|
|
|
* Set time server name
|
|
|
|
*
|
|
|
|
* @param poolServerName
|
|
|
|
*/
|
|
|
|
void setPoolServerName(const char* poolServerName);
|
|
|
|
|
2016-04-12 17:44:45 +02:00
|
|
|
/**
|
|
|
|
* Starts the underlying UDP client with the default local port
|
|
|
|
*/
|
|
|
|
void begin();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Starts the underlying UDP client with the specified local port
|
|
|
|
*/
|
|
|
|
void begin(int port);
|
|
|
|
|
2015-12-08 17:21:16 +01:00
|
|
|
/**
|
|
|
|
* This should be called in the main loop of your application. By default an update from the NTP Server is only
|
|
|
|
* made every 60 seconds. This can be configured in the NTPClient constructor.
|
2016-04-12 21:30:40 +02:00
|
|
|
*
|
|
|
|
* @return true on success, false on failure
|
2015-12-08 17:21:16 +01:00
|
|
|
*/
|
2016-04-12 21:30:40 +02:00
|
|
|
bool update();
|
2015-12-08 17:21:16 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This will force the update from the NTP Server.
|
2016-04-12 21:30:40 +02:00
|
|
|
*
|
|
|
|
* @return true on success, false on failure
|
2015-12-08 17:21:16 +01:00
|
|
|
*/
|
2016-04-12 21:30:40 +02:00
|
|
|
bool forceUpdate();
|
2015-12-08 17:21:16 +01:00
|
|
|
|
2018-02-20 21:32:17 +01:00
|
|
|
int getDay() const;
|
|
|
|
int getHours() const;
|
|
|
|
int getMinutes() const;
|
|
|
|
int getSeconds() const;
|
2015-12-08 17:21:16 +01:00
|
|
|
|
2016-05-14 12:04:18 +02:00
|
|
|
/**
|
|
|
|
* Changes the time offset. Useful for changing timezones dynamically
|
|
|
|
*/
|
|
|
|
void setTimeOffset(int timeOffset);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the update interval to another frequency. E.g. useful when the
|
|
|
|
* timeOffset should not be set in the constructor
|
|
|
|
*/
|
2017-03-27 17:17:43 +02:00
|
|
|
void setUpdateInterval(unsigned long updateInterval);
|
2016-05-14 12:04:18 +02:00
|
|
|
|
2015-12-08 17:21:16 +01:00
|
|
|
/**
|
|
|
|
* @return time formatted like `hh:mm:ss`
|
|
|
|
*/
|
2018-02-20 21:32:17 +01:00
|
|
|
String getFormattedTime() const;
|
2015-12-08 17:21:16 +01:00
|
|
|
|
|
|
|
/**
|
2016-04-13 15:41:16 +02:00
|
|
|
* @return time in seconds since Jan. 1, 1970
|
2015-12-08 17:21:16 +01:00
|
|
|
*/
|
2018-02-20 21:32:17 +01:00
|
|
|
unsigned long getEpochTime() const;
|
2016-04-12 16:45:21 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Stops the underlying UDP client
|
|
|
|
*/
|
|
|
|
void end();
|
2018-10-20 12:16:28 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
inline void onStartUpdate (HandlerFunction);
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
inline void onEndUpdate (HandlerFunction);
|
2015-12-08 17:21:16 +01:00
|
|
|
};
|
2018-10-20 12:16:28 +02:00
|
|
|
|
|
|
|
inline void
|
|
|
|
NTPClient::onStartUpdate (NTPClient::HandlerFunction handler) {
|
|
|
|
_updateStartHandler = handler;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void
|
|
|
|
NTPClient::onEndUpdate (NTPClient::HandlerFunction handler) {
|
|
|
|
_updateEndHandler = handler;
|
|
|
|
}
|