NetBurner 3.5.7
PDF Version
IEEE1588Timer.h
1/*NB_REVISION*/
2
3/*NB_COPYRIGHT*/
4
5#ifndef IEEE1588TIMER_H
6#define IEEE1588TIMER_H
7
8#include <nbrtos.h>
9#include <ethervars.h>
10#include <cstdint>
11#include <sys/types.h>
12
13const uint32_t target_sec_count =1000000000u;
14const uint32_t max_valid_interval=1000200000u;
15const uint32_t min_valid_interval= 999899999u;
16
17// Offset between Unix epoch (1970) and NTP epoch (1900) in seconds
18const uint32_t UNIX_NTP_OFFSET = 2208988800u;
19
20
32{
33 private:
34 // Ring buffer for PPS captures (256 entries, using uint8_t indices for automatic wraparound)
35 volatile uint32_t PPSCaptures[256];
36 volatile uint32_t PPSTimeTick[256];
37 volatile uint32_t PPSNTPTime[256];
38 volatile uint32_t PPSNTPSetCap[256];
39 volatile uint32_t PPSNTPSetTT[256];
40 volatile uint32_t PPSLoop;
41
42 // Static instance pointer for ISR access
43 static IEEE1588Timer *instance;
44
45 public:
46 // GPS synchronization tracking
47 volatile uint32_t ConsecutiveSecs;
48 volatile uint32_t LastValidTime;
49
51
57 bool init();
58
64 uint32_t getCurrentTime(EthernetVars &ev);
65
70 void enablePPSCapture();
71
79 void markValidTime(uint32_t tt, uint32_t cap_1588, uint32_t ntpTime);
80
85 uint32_t getConsecutiveValidSeconds() const { return ConsecutiveSecs; }
86
92 void updateConsecutiveSeconds(uint32_t currentTimeTick);
93
99
104 uint32_t getPPSLoop() const { return PPSLoop; }
105
111 uint32_t getPPSCapture(uint32_t index) const { return PPSCaptures[index&0xFF]; }
112 uint32_t getPPSTimeTick(uint32_t index) const { return PPSTimeTick[index&0xFF]; }
113 uint32_t getPPSNTPTime(uint32_t index) const { return PPSNTPTime[index&0xFF]; }
114 uint32_t getPPSNTPSetCap(uint32_t index) const { return PPSNTPSetCap[index&0xFF]; }
115 uint32_t getPPSNTPSetTT(uint32_t index) const { return PPSNTPSetTT[index&0xFF]; }
122 bool hasValidGPSTime() const;
123
129 time_t getGPSUnixTime() const;
130
140 bool getGPSTimeWithMillis(EthernetVars &ev, time_t &unixSecs, uint32_t &millis);
141
146 static void PPS_1588_TimeCapIsr();
147
152 static inline uint32_t ring_diff_forward(uint32_t a, uint32_t b)
153 {
154 return a - b; // (a after b) mod 2^32
155 }
156
157 static inline uint32_t ring_diff_min(uint32_t a, uint32_t b)
158 {
159 uint32_t d1 = a - b; // forward
160 uint32_t d2 = b - a; // backward
161 return (d1 < d2) ? d1 : d2;
162 }
163};
164
165// Global instance declaration - defined in IEEE1588Timer.cpp
166extern IEEE1588Timer ieee1588Timer;
167
168#endif // IEEE1588TIMER_H
Definition IEEE1588Timer.h:32
uint32_t getCurrentTime(EthernetVars &ev)
Definition IEEE1588Timer.cpp:72
void updateConsecutiveSeconds(uint32_t currentTimeTick)
Definition IEEE1588Timer.cpp:139
uint32_t getPPSLoop() const
Definition IEEE1588Timer.h:104
void resetConsecutiveSeconds()
Definition IEEE1588Timer.h:98
volatile uint32_t ConsecutiveSecs
Count of consecutive valid GPS seconds.
Definition IEEE1588Timer.h:47
volatile uint32_t LastValidTime
Last OS tick when GPS time was valid.
Definition IEEE1588Timer.h:48
bool getGPSTimeWithMillis(EthernetVars &ev, time_t &unixSecs, uint32_t &millis)
Definition IEEE1588Timer.cpp:219
static uint32_t ring_diff_forward(uint32_t a, uint32_t b)
Definition IEEE1588Timer.h:152
time_t getGPSUnixTime() const
Definition IEEE1588Timer.cpp:194
bool init()
Definition IEEE1588Timer.cpp:35
static void PPS_1588_TimeCapIsr()
Definition IEEE1588Timer.cpp:254
uint32_t getConsecutiveValidSeconds() const
Definition IEEE1588Timer.h:85
void markValidTime(uint32_t tt, uint32_t cap_1588, uint32_t ntpTime)
Definition IEEE1588Timer.cpp:110
uint32_t getPPSCapture(uint32_t index) const
Definition IEEE1588Timer.h:111
bool hasValidGPSTime() const
Definition IEEE1588Timer.cpp:166
void enablePPSCapture()
Definition IEEE1588Timer.cpp:99