forked from novag/SlimLoRa
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSlimLoRa_ArduinoEEPROM.cpp
More file actions
executable file
·339 lines (307 loc) · 9.4 KB
/
SlimLoRa_ArduinoEEPROM.cpp
File metadata and controls
executable file
·339 lines (307 loc) · 9.4 KB
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
#if ARDUINO_EEPROM >= 1
// TxFrameCounter
uint32_t SlimLoRa::GetTxFrameCounter() {
uint32_t value;
EEPROM.get(EEPROM_TX_COUNTER, value );
if (value == 0xFFFFFFFF) { // This check might need adjustment if 0xFFFFFFFF is a valid frame counter
return 0;
}
return value;
}
void SlimLoRa::SetTxFrameCounter() {
// BUG: Why it does not work?
//EEPROM.update(EEPROM_TX_COUNTER, tx_frame_counter_);
#if ARDUINO_EEPROM == 2
EEPROM.putChanged(EEPROM_TX_COUNTER, tx_frame_counter_);
#else
EEPROM.put(EEPROM_TX_COUNTER, tx_frame_counter_);
#endif
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE Tx#: "));Serial.print(tx_frame_counter_);
#endif
}
// RxFrameCounter
uint32_t SlimLoRa::GetRxFrameCounter() {
uint32_t value;
EEPROM.get(EEPROM_RX_COUNTER, value);
if (value == 0xFFFFFFFF) {
return 0;
}
return value;
}
void SlimLoRa::SetRxFrameCounter(){
#if ARDUINO_EEPROM == 2
EEPROM.putChanged(EEPROM_RX_COUNTER, rx_frame_counter_);
#else
EEPROM.put(EEPROM_RX_COUNTER, rx_frame_counter_);
#endif
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE Rx#: "));Serial.print(rx_frame_counter_);
#endif
}
// Rx1DataRateOffset
uint8_t SlimLoRa::GetRx1DataRateOffset() {
uint8_t value;
value = EEPROM.read(EEPROM_RX1DR_OFFSET) & 0x7F; // Get 7 bytes [0-6] strip last bit. Shared byte with EEPROM_JOINED
if (value > 0x3F ) { // since we stripped last bit full value 0xFF is 0x3F: bits: 00111111
return 0;
}
return value;
}
void SlimLoRa::SetRx1DataRateOffset(uint8_t value) {
uint8_t tmp_joined;
tmp_joined = EEPROM.read(EEPROM_JOINED) << 7; // Get only [7] bit
value |= tmp_joined; // shared byte with EEPROM_joined. Merge them.
EEPROM.write(EEPROM_RX1DR_OFFSET, value);
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE Rx1_offset: "));Serial.print(value &= 0x0F);
Serial.print(F("\nWRITE Rx1_offset RAW: "));Serial.print(value);
#endif
}
// Rx2DataRate
uint8_t SlimLoRa::GetRx2DataRate() {
uint8_t value;
value = EEPROM.read(EEPROM_RX2_DR) & 0x0F; // Get only [0-3] 4 bits. Shared byte with EEPROM_RX_DELAY
if (value == 0x0F) { // probably erased EEPROM.
#if LORAWAN_OTAA_ENABLED
return SF12BW125; // default LORAWAN 1.0.3
#if NETWORK == NET_TTN // TTN
return SF9BW125;
#endif
#if NETWORK == NET_HLM // Helium
return SF12BW125;
#endif
#else // ABP settings
return SF12BW125; // default LORAWAN 1.0.3
#if NETWORK == NET_TTN // TTN
return SF9BW125;
#endif
#if NETWORK == NET_HLM // Helium
return SF12BW125;
#endif
#endif // LORAWAN_OTAA_ENABLED
}
return value;
}
void SlimLoRa::SetRx2DataRate(uint8_t value) {
uint8_t tmp_rx_delay;
tmp_rx_delay = EEPROM.read(EEPROM_RX_DELAY) & 0xF0; // get only [7-4] bits.
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE Rx2_DR: "));Serial.print(value);
#endif
value |= tmp_rx_delay; // shared byte with EEPROM_RX_DELAY
EEPROM.update(EEPROM_RX2_DR, value);
}
// Rx1Delay
uint8_t SlimLoRa::GetRx1Delay() {
uint8_t value;
value = EEPROM.read(EEPROM_RX_DELAY) >> 4; // shared byte with EEPROM_RX2_DATARATE
if ( value == 0 || value >= 0xF ) { // probably erased EEPROM
#if NETWORK == NET_TTN
value = NET_TTN_RX_DELAY; // default for TTN
#endif
#if NETWORK == NET_HELIUM
value = NET_HELIUM_RX_DELAY; // default for Helium
#endif
}
return value;
}
void SlimLoRa::SetRx1Delay(uint8_t value) {
uint8_t temp_rx2_dr;
temp_rx2_dr = EEPROM.read(EEPROM_RX2_DR) & 0x0F; // Get only the [0-3] bits
value = (value << 4) | temp_rx2_dr; // shared byte with EEPROM_RX2_DATARATE
EEPROM.update(EEPROM_RX_DELAY, value);
#if DEBUG_SLIM >= 1
// EVAL something wrong here? RAW value is 7 (binary 111) vs 0101 0011 (83 or 0x53)
Serial.print(F("\nWRITE Rx1_delay: "));Serial.print(value >> 4);
Serial.print(F("\nWRITE Rx1_delay RAW: "));Serial.print(value);
#endif
}
// ChMask
void SlimLoRa::GetChMask() {
EEPROM.get(EEPROM_CHMASK, ChMask);
#if DEBUG_SLIM >= 1
Serial.print(F("\nGetChMask: "));Serial.print(ChMask);
#endif
}
void SlimLoRa::SetChMask() {
EEPROM.put(EEPROM_CHMASK, ChMask); // BUG: EEPROM.update does not work?
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE ChMask\t: "));Serial.print(ChMask);
GetChMask();
#endif
}
// NbTrans
void SlimLoRa::GetNbTrans() {
if ( EEPROM.read(EEPROM_NBTRANS) == 0xFF ) {
NbTrans = NBTRANS; // EEPROM erased, default NbTrans
} else {
NbTrans = EEPROM.read(EEPROM_NBTRANS) & 0x0F; // EEPROM is not erased. Get the LSB bits
}
#if DEBUG_SLIM >= 1
Serial.print(F("\nGet NbTrans: "));Serial.print(NbTrans);
#endif
}
void SlimLoRa::SetNbTrans() {
#if DEBUG_SLIM >= 1
GetChMask();
#endif
uint8_t temp_none;
temp_none = (EEPROM.read(EEPROM_NBTRANS) & 0xF0) | NbTrans; // Get the MSB bits
//EEPROM.update(EEPROM_NBTRANS, temp_none);
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE temp_none\t: "));Serial.print(temp_none >> 4);
Serial.print(F("\nWRITE NbTrans\t: "));Serial.print(NbTrans);
Serial.print(F("\nWRITE RAW\t: "));Serial.print( temp_none | NbTrans );
GetChMask();
#endif
}
#endif // ARDUINO_EEPROM >= 1
// ARDUINO style EEPROM. I had problems with avr/eeprom.h with debugging.
// When added Serial.print commands to either sketch or library the avr/eeprom.h
// for unknown to me reason changes the locations of EEMEM variables.
// Sooooooo... Static addressing. :-(
//
// In fact it seems that it's bug on linker
// https://arduino.stackexchange.com/questions/93873/how-eemem-maps-the-variables-avr-eeprom-h
#if LORAWAN_OTAA_ENABLED && ARDUINO_EEPROM >= 1
#if LORAWAN_KEEP_SESSION
uint8_t eeprom_lw_has_joined = 0;
#endif // LORAWAN_KEEP_SESSION
uint8_t eeprom_lw_dev_addr[4];
uint16_t eeprom_lw_dev_nonce = 1;
uint32_t eeprom_lw_join_nonce = 0;
uint8_t eeprom_lw_app_s_key[16];
uint8_t eeprom_lw_f_nwk_s_int_key[16];
uint8_t eeprom_lw_s_nwk_s_int_key[16];
uint8_t eeprom_lw_nwk_s_enc_key[16];
#if LORAWAN_KEEP_SESSION
bool SlimLoRa::GetHasJoined() {
uint8_t value = EEPROM.read(EEPROM_JOINED);
#if DEBUG_SLIM >= 1
Serial.print(F("\nEEPROM join value (shared with DR1_OFFSET): "));Serial.println(value);Serial.print(F("addr : 0x"));Serial.print(EEPROM_JOINED, HEX);
#endif
if ( value == 0xFF ) { // Erased EEPROM
return 0;
}
value = value >> 7; // Same address with DR1_OFFSET. Take the last bit.
#if DEBUG_SLIM >= 1
Serial.print(F("\nEEPROM join value: "));Serial.println(value);
#endif
return value;
}
void SlimLoRa::SetHasJoined(bool value) {
uint8_t temp;
EEPROM.get(EEPROM_JOINED, temp); // Same address with DR1_OFFSET. Keep the first bits.
if ( value == true ) {
temp = ( ( value << 7 ) | temp );
} else {
temp &= 0x7F;
}
EEPROM.write(EEPROM_JOINED, temp);
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE EEPROM: joined: ")); Serial.print(value);Serial.print(F(", RAW value: "));Serial.print(temp, BIN);
#endif
}
#endif // LORAWAN_KEEP_SESSION
// DevAddr
void SlimLoRa::GetDevAddr(uint8_t *dev_addr) {
getArrayEEPROM(EEPROM_DEVADDR, dev_addr, 4);
}
void SlimLoRa::SetDevAddr(uint8_t *dev_addr) {
setArrayEEPROM(EEPROM_DEVADDR, dev_addr, 4);
#if DEBUG_SLIM >= 1
Serial.print(F("\nWRITE DevAddr: "));printHex(dev_addr, 4);
#endif
}
// DevNonce
uint16_t SlimLoRa::GetDevNonce() {
uint16_t value;
EEPROM.get(EEPROM_DEVNONCE, value);
if (value == 0xFFFF) {
return 0;
}
return value;
}
void SlimLoRa::SetDevNonce(uint16_t dev_nonce) {
EEPROM.put(EEPROM_DEVNONCE, dev_nonce);
#if DEBUG_SLIM >= 1
uint8_t temp[2];
temp[0] = dev_nonce >> 8;
temp[1] = dev_nonce;
Serial.print(F("\nWRITE DevNonce: "));printHex(temp, 2);
#endif
}
// JoinNonce
uint32_t SlimLoRa::GetJoinNonce() {
uint32_t value;
EEPROM.get(EEPROM_JOINNONCE, value);
if (value == 0xFFFFFFFF) {
return 0;
}
return value;
}
void SlimLoRa::SetJoinNonce(uint32_t join_nonce) {
EEPROM.put(EEPROM_JOINNONCE, join_nonce);
#if DEBUG_SLIM >= 1
uint8_t temp[4];
temp[0] = join_nonce >> 24;
temp[1] = join_nonce >> 16;
temp[2] = join_nonce >> 8;
temp[3] = join_nonce;
Serial.print(F("\nWRITE JoinNonce: "));printHex(temp, 4);
#endif
}
// AppSKey
void SlimLoRa::GetAppSKey(uint8_t *key) {
getArrayEEPROM(EEPROM_APPSKEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("Read appSkey\t: "));printHex(key, 16);
#endif
}
void SlimLoRa::SetAppSKey(uint8_t *key) {
setArrayEEPROM(EEPROM_APPSKEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("WRITE appSkey\t: "));printHex(key, 16);
#endif
}
// FNwkSIntKey
void SlimLoRa::GetFNwkSIntKey(uint8_t *key) {
getArrayEEPROM(EEPROM_FNWKSIKEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("FNwkSInt\t: "));printHex(key, 16);
#endif
}
void SlimLoRa::SetFNwkSIntKey(uint8_t *key) {
setArrayEEPROM(EEPROM_FNWKSIKEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("WRITE FNwkSInt\t: "));printHex(key, 16);
#endif
}
// SNwkSIntKey
void SlimLoRa::GetSNwkSIntKey(uint8_t *key) {
getArrayEEPROM(EEPROM_SNWKSIKEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("SNwkSInt\t: "));printHex(key, 16);
#endif
}
void SlimLoRa::SetSNwkSIntKey(uint8_t *key) {
setArrayEEPROM(EEPROM_SNWKSIKEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("WRITE SNwkSInt\t: "));printHex(key, 16);
#endif
}
// NwkSEncKey
void SlimLoRa::GetNwkSEncKey(uint8_t *key) {
getArrayEEPROM(EEPROM_NW_ENC_KEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("NwkSEncKey\t: "));printHex(key, 16);
#endif
}
void SlimLoRa::SetNwkSEncKey(uint8_t *key) {
setArrayEEPROM(EEPROM_NW_ENC_KEY, key, 16);
#if (DEBUG_SLIM & 0x08) == 0x08
printNOWEB();Serial.print(F("WRITE NwkSEnc\t: "));printHex(key, 16);
#endif
}
#endif // LORAWAN_OTAA_ENABLED && ARDUINO_EEPROM >= 1