Skip to content

Commit b2f9620

Browse files
committed
Merge branch 'develop'
2 parents dd92ad1 + 0333a75 commit b2f9620

File tree

14 files changed

+212
-37
lines changed

14 files changed

+212
-37
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
* When using the debugger with a ST-Link, the connection of the debugger SW to the ST-Link/STM32 takes several seconds, in which the STM32 is reset a few times. If the STM32 goes into sleep in this time (or changes the debugport pins, ..), then the debugger will not connect. Solution is to add a HAL_Delay(7000) at the very beginning of the code.
2+
3+
* When after debugging or programming, the device is reset with RST button, the debug port is NOT disabled and stays active, resulting in increased power consumption. A power cycle reset (with debug probe removed) is needed to get rid of this and ensure lowest power consumption.
4+
5+
*

lib/application/maincontroller.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ void mainController::showHelp() {
601601
cli::sendResponse("er : enable radio\n");
602602
cli::sendResponse("dr : disable radio\n");
603603
cli::sendResponse("rml : reset mac layer\n");
604-
cli::sendResponse("res : restart device - soft reset\n");
604+
cli::sendResponse("swr : restart device - soft reset\n");
605605
cli::sendResponse("sda <address> : set device address\n");
606606
cli::sendResponse("snk <key> : set network key\n");
607607
cli::sendResponse("sak <key> : set application key\n");
@@ -779,7 +779,7 @@ void mainController::showMeasurementsStatus() {
779779
uint32_t startOffset = measurementGroupCollection::getOldestMeasurementOffset();
780780
uint32_t endOffset = measurementGroupCollection::getNewMeasurementsOffset();
781781
if (endOffset < startOffset) {
782-
endOffset += nonVolatileStorage::measurementsSize;
782+
endOffset += nonVolatileStorage::getMeasurementsAreaSize();
783783
}
784784
uint32_t offset{startOffset};
785785
uint32_t nmbrOfGroups{0};
@@ -797,18 +797,18 @@ void mainController::showMeasurementsStatus() {
797797
newestMeasurementTime = tmpGroup.getTimeStamp();
798798
offset += measurementGroup::lengthInBytes(tmpGroup.getNumberOfMeasurements());
799799
}
800-
cli::sendResponse("%d measurements in %d groups\n", nmbrOfMeasurements, nmbrOfGroups);
801-
cli::sendResponse("oldest : %s", ctime(&oldestMeasurementTime));
802-
cli::sendResponse("newest : %s", ctime(&newestMeasurementTime));
803-
cli::sendResponse("%d bytes available\n", measurementGroupCollection::getFreeSpace());
800+
cli::sendResponse("%u measurements in %u groups\n", nmbrOfMeasurements, nmbrOfGroups);
801+
cli::sendResponse("oldoffset %u %s", measurementGroupCollection::getOldestMeasurementOffset(), ctime(&oldestMeasurementTime));
802+
cli::sendResponse("newoffset %u %s", measurementGroupCollection::getNewMeasurementsOffset(), ctime(&newestMeasurementTime));
803+
cli::sendResponse("%u bytes available\n", measurementGroupCollection::getFreeSpace());
804804
}
805805

806806
void mainController::showMeasurements() {
807807
measurementGroup tmpGroup;
808808
uint32_t startOffset = measurementGroupCollection::getOldestMeasurementOffset();
809809
uint32_t endOffset = measurementGroupCollection::getNewMeasurementsOffset();
810810
if (endOffset < startOffset) {
811-
endOffset += nonVolatileStorage::measurementsSize;
811+
endOffset += nonVolatileStorage::getMeasurementsAreaSize();
812812
}
813813
uint32_t offset{startOffset};
814814
uint32_t nmbrOfGroups{0};

lib/nvs/nvs.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,12 @@ void nonVolatileStorage::enableWriteProtect() {
203203
}
204204
#endif
205205
}
206+
207+
uint32_t nonVolatileStorage::getMeasurementsAreaSize() {
208+
if (totalSize() > 0) {
209+
return totalSize() - settingsSize;
210+
} else {
211+
return 0;
212+
}
213+
}
214+

lib/nvs/nvs.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class nonVolatileStorage {
1111
nonVolatileStorage() = delete;
1212
static uint32_t detectNmbr64KBanks();
1313
static uint32_t totalSize() { return nmbr64KBanks * 64U * 1024U; };
14+
static uint32_t getMeasurementsAreaSize();
1415

1516
static constexpr uint32_t maxNmbr64KBanks{8};
1617
static constexpr uint32_t pageSize{128};
@@ -27,7 +28,6 @@ class nonVolatileStorage {
2728
static constexpr uint32_t settingStartAddress{0};
2829
static constexpr uint32_t settingsSize{4 * 1024};
2930
static constexpr uint32_t measurementsStartAddress{settingStartAddress + settingsSize};
30-
static constexpr uint32_t measurementsSize{60 * 1024};
3131

3232
#ifndef unitTesting
3333

lib/sensors/measurementgroupcollection.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ void measurementGroupCollection::reset() {
2828
}
2929

3030
void measurementGroupCollection::addNew(measurementGroup& aMeasurementGroup) {
31-
uint32_t lengthInBytes = measurementGroup::lengthInBytes(aMeasurementGroup.getNumberOfMeasurements());
31+
uint32_t lengthInBytes = measurementGroup::lengthInBytes(aMeasurementGroup.getNumberOfMeasurements());
32+
uint32_t nmbrOfFreeBytes = getFreeSpace();
33+
while (nmbrOfFreeBytes < lengthInBytes) {
34+
eraseOldest();
35+
nmbrOfFreeBytes = getFreeSpace();
36+
}
3237
uint8_t buffer[lengthInBytes];
3338
aMeasurementGroup.toBytes(buffer, lengthInBytes);
3439

@@ -48,21 +53,19 @@ void measurementGroupCollection::addNew(measurementGroup& aMeasurementGroup) {
4853

4954
// TODO : put NVS back to sleep if it was sleeping
5055

51-
newMeasurementsOffset = (newMeasurementsOffset + lengthInBytes) % nonVolatileStorage::measurementsSize;
56+
newMeasurementsOffset = (newMeasurementsOffset + lengthInBytes) % nonVolatileStorage::getMeasurementsAreaSize();
5257
settingsCollection::save(newMeasurementsOffset, settingsCollection::settingIndex::newMeasurementsOffset);
5358
}
5459

5560
void measurementGroupCollection::eraseOldest() {
5661
measurementGroup oldestMeasurementGroup;
5762
uint32_t nmbrOfMeasurements = nonVolatileStorage::read(getAddressFromOffset(oldestMeasurementOffset));
5863
uint32_t lengthInBytes = measurementGroup::lengthInBytes(nmbrOfMeasurements);
59-
oldestMeasurementOffset = (oldestMeasurementOffset + lengthInBytes) % nonVolatileStorage::measurementsSize;
64+
oldestMeasurementOffset = (oldestMeasurementOffset + lengthInBytes) % nonVolatileStorage::getMeasurementsAreaSize();
6065
settingsCollection::save(oldestMeasurementOffset, settingsCollection::settingIndex::oldestMeasurementOffset);
6166
}
6267

63-
64-
void measurementGroupCollection::get(measurementGroup &aMeasurementGroup, uint32_t offset) {
65-
68+
void measurementGroupCollection::get(measurementGroup& aMeasurementGroup, uint32_t offset) {
6669
uint32_t lengthInBytes = measurementGroup::lengthInBytes(nonVolatileStorage::read(getAddressFromOffset(offset)));
6770
uint8_t buffer[lengthInBytes];
6871

@@ -84,3 +87,11 @@ void measurementGroupCollection::get(measurementGroup &aMeasurementGroup, uint32
8487

8588
// TODO : put NVS back to sleep if it was sleeping
8689
}
90+
91+
uint32_t measurementGroupCollection::getFreeSpace() {
92+
if (oldestMeasurementOffset == 0 && newMeasurementsOffset == 0) {
93+
return nonVolatileStorage::getMeasurementsAreaSize();
94+
} else {
95+
return ((nonVolatileStorage::getMeasurementsAreaSize() + oldestMeasurementOffset) - newMeasurementsOffset) % nonVolatileStorage::getMeasurementsAreaSize();
96+
}
97+
}

lib/sensors/measurementgroupcollection.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class measurementGroupCollection {
1818

1919
static uint32_t getOldestMeasurementOffset() { return oldestMeasurementOffset; };
2020
static uint32_t getNewMeasurementsOffset() { return newMeasurementsOffset; };
21-
static uint32_t getFreeSpace() { return nonVolatileStorage::measurementsSize + oldestMeasurementOffset - newMeasurementsOffset; };
21+
static uint32_t getFreeSpace();
2222

2323
#ifndef unitTesting
2424

@@ -27,5 +27,5 @@ class measurementGroupCollection {
2727
static uint32_t oldestMeasurementOffset;
2828
static uint32_t newMeasurementsOffset;
2929
static bool isValid() { return ((oldestMeasurementOffset != 0xFFFFFFFF) && (newMeasurementsOffset != 0xFFFFFFFF)); };
30-
static uint32_t getAddressFromOffset(uint32_t offset) { return nonVolatileStorage::measurementsStartAddress + (offset % nonVolatileStorage::measurementsSize); };
30+
static uint32_t getAddressFromOffset(uint32_t offset) { return nonVolatileStorage::measurementsStartAddress + (offset % nonVolatileStorage::getMeasurementsAreaSize()); };
3131
};

platformio.ini

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ test_filter =
127127
;generic/test_sht40
128128
;generic/test_sps30
129129
;test_generic_screen
130-
generic/test_maincontroller
130+
;generic/test_maincontroller
131131
;test_generic_applicationevent
132132
; generic/test_graphics
133133
;generic/test_lorawan_deviceaddress
@@ -167,7 +167,7 @@ test_filter =
167167

168168

169169

170-
debug_test = generic/test_sensordevicecollection
170+
debug_test = generic/test_measurementgroupcollection
171171

172172

173173
; #############################################################################
@@ -215,7 +215,7 @@ test_port = ${options.host_test_port}
215215

216216
test_filter =
217217
;target_no_jigs/test_aes
218-
target_no_jigs/test_lorawan_crypto
218+
;target_no_jigs/test_lorawan_crypto
219219
;target_no_jigs/test_vdd_enable
220220
;target_no_jigs/test_eeprom
221221
;target_no_jigs/test_tsl2591
@@ -242,6 +242,7 @@ test_filter =
242242
;tools/test_read_uid64
243243
;target_no_jigs/test_nvs
244244
;target_no_jigs/test_HAL_timeout
245+
target_no_jigs/test_measurementgroupcollection
245246

246247
debug_test = target_no_jigs/test_HAL_timeout
247248

src/main.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,19 @@ int main(void) {
5353
gpio::disableGpio(gpio::group::debugPort);
5454
}
5555

56-
if (power::hasUsbPower()) {
57-
HAL_RCC_DeInit();
58-
HAL_DeInit();
59-
executeRomBootloader();
60-
}
56+
gpio::enableGpio(gpio::group::usbPresent);
57+
if (power::hasUsbPower()) {
58+
HAL_RCC_DeInit();
59+
HAL_DeInit();
60+
executeRomBootloader();
61+
}
6162

6263
MX_RTC_Init();
6364
MX_ADC_Init();
6465
MX_AES_Init();
6566
MX_RNG_Init();
6667
MX_LPTIM1_Init();
6768

68-
gpio::enableGpio(gpio::group::usbPresent);
6969
uart1::initialize();
7070
uart2::initialize();
7171

test/generic/test_measurementgroupcollection/test.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,23 @@ void test_reset(void) {
4444
}
4545

4646
void test_getFreeSpace(void) {
47+
nonVolatileStorage::mockEepromNmbr64KPages = 2;
48+
nonVolatileStorage::detectNmbr64KBanks();
49+
4750
// No measurements stored -> free space should equal the size of the measurements area
4851
measurementGroupCollection::oldestMeasurementOffset = 0;
4952
measurementGroupCollection::newMeasurementsOffset = 0;
50-
TEST_ASSERT_EQUAL_UINT32(nonVolatileStorage::measurementsSize, measurementGroupCollection::getFreeSpace());
53+
TEST_ASSERT_EQUAL_UINT32(nonVolatileStorage::getMeasurementsAreaSize(), measurementGroupCollection::getFreeSpace());
5154

52-
// Simulate some measurements stored
53-
measurementGroupCollection::newMeasurementsOffset = nonVolatileStorage::measurementsSize / 2;
54-
TEST_ASSERT_EQUAL_UINT32(nonVolatileStorage::measurementsSize / 2, measurementGroupCollection::getFreeSpace());
55+
// Simulate some measurements stored, at the first half of the memory
56+
measurementGroupCollection::oldestMeasurementOffset = 0;
57+
measurementGroupCollection::newMeasurementsOffset = nonVolatileStorage::getMeasurementsAreaSize() / 2;
58+
TEST_ASSERT_EQUAL_UINT32(nonVolatileStorage::getMeasurementsAreaSize() / 2, measurementGroupCollection::getFreeSpace());
5559

56-
// Now assume the free area is wrapping around the end of the memory
57-
measurementGroupCollection::oldestMeasurementOffset = nonVolatileStorage::measurementsSize / 4;
58-
measurementGroupCollection::newMeasurementsOffset = (nonVolatileStorage::measurementsSize * 3) / 4;
59-
TEST_ASSERT_EQUAL_UINT32(nonVolatileStorage::measurementsSize / 2, measurementGroupCollection::getFreeSpace());
60+
// Now assume the free area is wrapping around the end of the memory, measurements stored at the last quarter and the first quarter of the memory
61+
measurementGroupCollection::oldestMeasurementOffset = nonVolatileStorage::getMeasurementsAreaSize() * 3 / 4;
62+
measurementGroupCollection::newMeasurementsOffset = (nonVolatileStorage::getMeasurementsAreaSize()) / 4;
63+
TEST_ASSERT_EQUAL_UINT32(nonVolatileStorage::getMeasurementsAreaSize() / 2, measurementGroupCollection::getFreeSpace());
6064
}
6165

6266
void test_getAddressFromOffset() {
@@ -88,7 +92,7 @@ void test_add(void) {
8892
void test_add_wrap(void) { // addresses in NVS need to wrap around end of measurements area, not overwriting settings in settings area.
8993
static constexpr uint32_t expectLengthInBytes{16};
9094
measurementGroupCollection::reset();
91-
measurementGroupCollection::newMeasurementsOffset = nonVolatileStorage::measurementsSize - (expectLengthInBytes / 2); // 8 from the end, writing 16 bytes, should wrap
95+
measurementGroupCollection::newMeasurementsOffset = nonVolatileStorage::getMeasurementsAreaSize() - (expectLengthInBytes / 2); // 8 from the end, writing 16 bytes, should wrap
9296

9397
measurementGroup testMeasurementGroup;
9498
testMeasurementGroup.addMeasurement(0, 0, 0.0f);
@@ -104,7 +108,7 @@ void test_add_wrap(void) { // addresses in NVS need to wrap around end of
104108
testMeasurementGroup.toBytes(expectedBytes, expectLengthInBytes);
105109

106110
uint8_t actualBytes[expectLengthInBytes];
107-
TEST_ASSERT_EQUAL_UINT8_ARRAY(expectedBytes, nonVolatileStorage::mockEepromMemory + nonVolatileStorage::measurementsStartAddress + nonVolatileStorage::measurementsSize - (expectLengthInBytes / 2), expectLengthInBytes / 2);
111+
TEST_ASSERT_EQUAL_UINT8_ARRAY(expectedBytes, nonVolatileStorage::mockEepromMemory + nonVolatileStorage::measurementsStartAddress + nonVolatileStorage::getMeasurementsAreaSize() - (expectLengthInBytes / 2), expectLengthInBytes / 2);
108112
TEST_ASSERT_EQUAL_UINT8_ARRAY(expectedBytes + (expectLengthInBytes / 2), nonVolatileStorage::mockEepromMemory + nonVolatileStorage::measurementsStartAddress, expectLengthInBytes / 2);
109113
}
110114

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
In order to run this target unit tests, you need to take following HW setup :
2+
* testPort = UART1 = ST-Link, normally COM14
3+
4+
Important Remark : This test will overwrite any data already in the EEPROM, so existing device settings may be overwritten

0 commit comments

Comments
 (0)