-
Notifications
You must be signed in to change notification settings - Fork 5
/
counter.h
80 lines (59 loc) · 1.76 KB
/
counter.h
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
#ifndef COUNTER_H
#define COUNTER_H
#include <stdint.h>
/**
* Class that implements a counter that is persisted in flash-memory.
*/
class Counter {
public:
/**
* @brief Create a counter.
*/
Counter();
/**
* @brief Initialize the counter and restore the latest state from flash.
* @param sector First sector used for persisting the counter.
* @param sectorSize Size (in bytes) of a sector.
*/
void init(uint16_t sector, uint32_t sectorSize);
/**
* @brief Increment the counter by one.
*/
void increment();
/**
* @brief Get the current value of the counter.
*/
uint32_t get();
/**
* @brief Print the internal state of the counter.
*/
void info();
private:
// Size of a sector in flash-memory
uint16_t sectorSize;
// Start offsets of the two flash-memory blocks used for counting
uint32_t blockStart[2];
// Current bits which are used for counting
uint32_t currentBits;
// Current value of the counter
uint32_t currentValue;
// Active block which is used for counting
int activeBlock;
// Offset in the active block
int blockOffset;
// Indicates whether the counter is successfully initialized
bool initalized;
/// Count the bits which are *cleared* in the given DWORD.
static uint32_t countBits(uint32_t value);
/// Clear the next available bit. Returns true, if there was no bit to clear left (overflow).
static bool incrementBits(uint32_t &value);
/// Initialize the flash
void initFlash();
/// Initialize a block
void initializeBlock(int blockId, uint32_t startValue);
/// Restore the counter from flash
void restoreCounter(uint32_t startValue);
/// Switch the active block
void switchBlock();
};
#endif // COUNTER_H