/
TimePermRingBuffer.cpp
123 lines (110 loc) · 3.07 KB
/
TimePermRingBuffer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "TimePermRingBuffer.h"
//#include <stdint.h>
#ifdef SERIAL_DEBUG
#include <HardwareSerial.h>
#endif
TimePermRingBuffer::TimePermRingBuffer(uint16_t startAddr, uint16_t bufferSize,
size_t dataSize, int timePeriod,
uint16_t endurFactor) :
EepromRingBuffer(startAddr, bufferSize, dataSize, endurFactor),
m_period(timePeriod),
m_lastTimeStamp(startAddr+storageSize(), endurFactor, sizeof(long))
{
// long time;
// m_lastTimeStamp.readData((void *)&time);
// if ( 0xFFFFFFFFl == time ) {
// time = INT32_MIN;
// m_lastTimeStamp.writeData((void *)&time);
// }
}
int TimePermRingBuffer::period()
{
return m_period;
}
long TimePermRingBuffer::timeSpan()
{
return m_period * bufferSize();
}
void TimePermRingBuffer::setTimeStamp(long ts)
{
m_lastTimeStamp.writeData((void *)&ts);
}
bool TimePermRingBuffer::insert(DataSample &data, long current_time)
{
long last_time, delta, steps;
m_lastTimeStamp.readData((void*)&last_time);
delta = current_time - last_time;
#ifdef SERIAL_DEBUG
Serial.print("==== TimePermRingBuffer[");
Serial.print(m_bufferStart, DEC);
Serial.print("]::insert -> current=");
Serial.print(current_time, DEC);
Serial.print(" - last_time=");
Serial.print(last_time, DEC);
Serial.print(" : delta=");
Serial.println(delta, DEC);
#endif
if ( delta < 0 ) {
// something happened: we are going back in the past
// just let clear everything and start orer
#ifdef SERIAL_DEBUG
Serial.println("------ back to the past -> clear");
#endif
clear();
m_lastTimeStamp.writeData((void*)¤t_time);
push(data.data());
return true;
}
if ( delta > timeSpan() ) {
// elapsed time greater than buffer time span
#ifdef SERIAL_DEBUG
Serial.println("------ elapsed time greater than buffer time span -> clear");
#endif
clear();
m_lastTimeStamp.writeData((void*)¤t_time);
push(data.data());
}
else {
if ( 0 == delta % m_period ) {
steps = delta / m_period;
if ( steps > 0 ) {
// this is time to insert the new sample
if ( steps > 1 ) {
// elapsed time more than one single period
#ifdef SERIAL_DEBUG
Serial.print("------ elapsed time more than a single period -> rotate steps = ");
Serial.println(steps-1, DEC);
#endif
rotate(steps-1);
}
m_lastTimeStamp.writeData((void*)¤t_time);
push(data.data());
}
}
else {
#ifdef SERIAL_DEBUG
Serial.println("------ period not elapsed -> no insertion");
#endif
return false;
}
}
return true;
}
long TimePermRingBuffer::read(int index, DataSample &data)
{
get(index, (void*)data.data());
long time;
m_lastTimeStamp.readData((void*)&time);
time -= ( index % bufferSize() ) * m_period;
return time;
}
uint16_t TimePermRingBuffer::storageSize()
{
return m_eepromIndex.storageSize() + m_bufferLength + m_lastTimeStamp.storageSize();
}
long TimePermRingBuffer::lastTimeStamp()
{
long time;
m_lastTimeStamp.readData((void *)&time);
return time;
}