NetBurner 3.5.6
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
12const uint32_t target_sec_count =1000000000u;
13const uint32_t max_valid_interval=1000200000u;
14const uint32_t min_valid_interval= 999899999u;
15
16
28{
29 private:
30 // Ring buffer for PPS captures (256 entries, using uint8_t indices for automatic wraparound)
31 volatile uint32_t PPSCaptures[256];
32 volatile uint32_t PPSTimeTick[256];
33 volatile uint32_t PPSNTPTime[256];
34 volatile uint32_t PPSNTPSetCap[256];
35 volatile uint32_t PPSNTPSetTT[256];
36 volatile uint32_t PPSLoop;
37
38 // Static instance pointer for ISR access
39 static IEEE1588Timer *instance;
40
41 public:
42 // GPS synchronization tracking
43 volatile uint32_t ConsecutiveSecs;
44 volatile uint32_t LastValidTime;
45
47
53 bool init();
54
60 uint32_t getCurrentTime(EthernetVars &ev);
61
66 void enablePPSCapture();
67
75 void markValidTime(uint32_t tt, uint32_t cap_1588, uint32_t ntpTime);
76
81 uint32_t getConsecutiveValidSeconds() const { return ConsecutiveSecs; }
82
88 void updateConsecutiveSeconds(uint32_t currentTimeTick);
89
95
100 uint32_t getPPSLoop() const { return PPSLoop; }
101
107 uint32_t getPPSCapture(uint32_t index) const { return PPSCaptures[index&0xFF]; }
108 uint32_t getPPSTimeTick(uint32_t index) const { return PPSTimeTick[index&0xFF]; }
109 uint32_t getPPSNTPTime(uint32_t index) const { return PPSNTPTime[index&0xFF]; }
110 uint32_t getPPSNTPSetCap(uint32_t index) const { return PPSNTPSetCap[index&0xFF]; }
111 uint32_t getPPSNTPSetTT(uint32_t index) const { return PPSNTPSetTT[index&0xFF]; }
116 static void PPS_1588_TimeCapIsr();
117
122 static inline uint32_t ring_diff_forward(uint32_t a, uint32_t b)
123 {
124 return a - b; // (a after b) mod 2^32
125 }
126
127 static inline uint32_t ring_diff_min(uint32_t a, uint32_t b)
128 {
129 uint32_t d1 = a - b; // forward
130 uint32_t d2 = b - a; // backward
131 return (d1 < d2) ? d1 : d2;
132 }
133};
134
135// Global instance declaration - defined in IEEE1588Timer.cpp
136extern IEEE1588Timer ieee1588Timer;
137
138#endif // IEEE1588TIMER_H
Definition IEEE1588Timer.h:28
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:100
void resetConsecutiveSeconds()
Definition IEEE1588Timer.h:94
volatile uint32_t ConsecutiveSecs
Count of consecutive valid GPS seconds.
Definition IEEE1588Timer.h:43
volatile uint32_t LastValidTime
Last OS tick when GPS time was valid.
Definition IEEE1588Timer.h:44
static uint32_t ring_diff_forward(uint32_t a, uint32_t b)
Definition IEEE1588Timer.h:122
bool init()
Definition IEEE1588Timer.cpp:35
static void PPS_1588_TimeCapIsr()
Definition IEEE1588Timer.cpp:167
uint32_t getConsecutiveValidSeconds() const
Definition IEEE1588Timer.h:81
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:107
void enablePPSCapture()
Definition IEEE1588Timer.cpp:99