NTPClient/NTPClient.h

127 lines
3.0 KiB
C
Raw Normal View History

2015-12-08 17:21:16 +01:00
#pragma once
#include <functional>
2015-12-08 17:21:16 +01:00
#include "Arduino.h"
#include <Udp.h>
2015-12-08 17:21:16 +01:00
#define SEVENZYYEARS 2208988800UL
#define NTP_PACKET_SIZE 48
#define NTP_DEFAULT_LOCAL_PORT 1337
2015-12-08 17:21:16 +01:00
class NTPClient {
public:
typedef std::function<void(void)> HandlerFunction;
2015-12-08 17:21:16 +01:00
private:
UDP* _udp;
bool _udpSetup = false;
2015-12-08 17:21:16 +01:00
const char* _poolServerName = "pool.ntp.org"; // Default time server
int _port = NTP_DEFAULT_LOCAL_PORT;
long _timeOffset = 0;
2015-12-08 17:21:16 +01:00
unsigned long _updateInterval = 60000; // In ms
2015-12-08 17:21:16 +01: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];
HandlerFunction _updateStartHandler;
HandlerFunction _updateEndHandler;
void sendNTPPacket();
2015-12-08 17:21:16 +01:00
public:
NTPClient(UDP& udp);
NTPClient(UDP& udp, long timeOffset);
NTPClient(UDP& udp, const char* poolServerName);
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);
/**
* 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.
*
* @return true on success, false on failure
2015-12-08 17:21:16 +01:00
*/
bool update();
2015-12-08 17:21:16 +01:00
/**
* This will force the update from the NTP Server.
*
* @return true on success, false on failure
2015-12-08 17:21:16 +01: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
/**
* 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
*/
void setUpdateInterval(unsigned long updateInterval);
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();
/**
*
*/
inline void onStartUpdate (HandlerFunction);
/**
*
*/
inline void onEndUpdate (HandlerFunction);
2015-12-08 17:21:16 +01:00
};
inline void
NTPClient::onStartUpdate (NTPClient::HandlerFunction handler) {
_updateStartHandler = handler;
}
inline void
NTPClient::onEndUpdate (NTPClient::HandlerFunction handler) {
_updateEndHandler = handler;
}