diff --git a/lib/storage/storage_interface.cpp b/lib/storage/storage_interface.cpp index eda8f48..bbd505a 100644 --- a/lib/storage/storage_interface.cpp +++ b/lib/storage/storage_interface.cpp @@ -101,33 +101,38 @@ void Storage_interface::get_struct(uint16_t offset, bool* timestamp, bool* is_fi flags = EEPROM.read(offset); // Checking there if a struct is possibly at the index - if ((flags & 0b1) == 0){ + if ((flags & 0b10000000) == 0){ DLOGLN("Missing struct index or bad index") //while(true); } + // is the final package ? + if ((flags & 0b00000100) != 0){ + *is_final_set = true; + } + // timestamps reads *timestamp = false; - if ((flags & 0b001) != 0 ){ + if ((flags & 0b00100000) != 0 ){ *timestamp = true; *timestamp_schedule = EEPROM.read(offset + OFFSET_MEASURES_SCH); } *timestamp_schedule = 0; - if (flags & 0b01){ + if (flags & 0b01000000){ *timestamp = true; WARN_IF(EEPROM.read(offset + OFFSET_MEASURES_SCH) != 0, "Incoherent timestamp parameter in the header.") } // photo res reads *photo_sensor = false; - if (flags & 0b0001){ + if (flags & 0b00010000){ *photo_sensor = true; *nb_photo_sensor = EEPROM.read(offset + OFFSET_NB_PHOTO_SENSOR); } // temp res reads *temp_sensor = false; - if (flags & 0b00001){ + if (flags & 0b00001000){ *temp_sensor = true; *nb_temp_sensor = EEPROM.read(offset + OFFSET_NB_TEMP_SENSOR); } @@ -136,7 +141,11 @@ void Storage_interface::get_struct(uint16_t offset, bool* timestamp, bool* is_fi *p_next_package = read_eeprom_uint16(offset + OFFSET_NEXT_PACKAGE); // gather the number of measures - *nb_measures = read_eeprom_uint16(offset + OFFSET_NB_TEMP_SENSOR); + *nb_measures = read_eeprom_uint16(offset + OFFSET_NB_MEASURES); + + // read type size of photo temperature measures + *photo_size = EEPROM.read(offset + OFFSET_PHOTO_MEASURES_SIZE); + *temp_size = EEPROM.read(offset + OFFSET_TEMP_MEASURES_SIZE); } void Storage_interface::set_struct(uint16_t offset, bool timestamp, bool is_final_set, bool photo_sensor, bool temp_sensor, uint8_t timestamp_schedule, uint8_t nb_photo_sensor, uint8_t nb_temp_sensor, uint8_t photo_size, uint8_t temp_size){ @@ -151,18 +160,15 @@ void Storage_interface::set_struct(uint16_t offset, bool timestamp, bool is_fina // Timestamp init struct - if (timestamp && (timestamp_schedule == 0)) { flags = flags | 0b01000000; EEPROM.write(offset + OFFSET_MEASURES_SCH, 0); // Écrire 0 si pas de schedule - } - else if (timestamp_schedule != 0) { + } else if (timestamp_schedule != 0) { flags = flags | 0b00100000; EEPROM.write(offset + OFFSET_MEASURES_SCH, timestamp_schedule); WARN_IF(!timestamp, "Redundant/conflicting timestamp parameter (expected true for schedule).") - } - else { + } else { EEPROM.write(offset + OFFSET_MEASURES_SCH, 0); } @@ -198,7 +204,9 @@ void Storage_interface::set_struct(uint16_t offset, bool timestamp, bool is_fina // write flags header EEPROM.write(offset , flags); - //clear_eeprom_at(offset + OFFSET_START_DATA_MEASURES); + // write types measures size + EEPROM.write(offset + OFFSET_PHOTO_MEASURES_SIZE, photo_size); + EEPROM.write(offset + OFFSET_TEMP_MEASURES_SIZE, temp_size); } void Storage_interface::add_last_package(bool timestamp, bool is_final_set, bool photo_sensor, bool temp_sensor, uint8_t timestamp_schedule, uint8_t nb_photo_sensor, uint8_t nb_temp_sensor, uint8_t photo_size, uint8_t temp_size, uint16_t nb_measures){ @@ -246,10 +254,10 @@ void Storage_interface::get_measure(uint8_t* array_photo_val, uint8_t* array_tem *nb_temp = EEPROM.read(p_last_header + OFFSET_NB_TEMP_SENSOR); flags = EEPROM.read(p_last_header); - if((flags & 0b010) != 0){ + if((flags & 0b01000000) != 0){ EEPROM.get(p_last_header + OFFSET_START_DATA_MEASURES, timestamp); idx += sizeof(uint32_t) * idx_measure; - }else if ((flags & 0b001) != 0){ + }else if ((flags & 0b00100000) != 0){ uint8_t schedule; schedule = EEPROM.read(p_last_header + OFFSET_MEASURES_SCH); WARN_IF(schedule == 0, "Struct error for timestamp scheduling.") diff --git a/test/EEPROM_test_struct.cpp b/test/EEPROM_test_struct.cpp index c311a2c..915b74c 100644 --- a/test/EEPROM_test_struct.cpp +++ b/test/EEPROM_test_struct.cpp @@ -4,60 +4,144 @@ #include // uint32_t epoch = 1764249314; + +// WARNING : copy from storage interface (if somes changes are apply on storageinterface's OFFSET_ apply it here too) static constexpr uint8_t OFFSET_MEASURES_SCH = 1, OFFSET_NB_PHOTO_SENSOR = 2, OFFSET_NB_TEMP_SENSOR = 3, OFFSET_PHOTO_MEASURES_SIZE = 4, OFFSET_TEMP_MEASURES_SIZE = 5, OFFSET_NB_MEASURES = 6, OFFSET_NEXT_PACKAGE = 8, OFFSET_START_DATA_MEASURES = 10; // unit in byte static constexpr uint16_t MEGA_2560_EEPROM_SIZE = 4096; -void test_put_get_struct(){ +void test_set_struct(){ Storage_interface test; - uint16_t offset = 0, r_next_package, r_nb_measures; + uint16_t offset = 0; uint8_t schedule = 0, nb_photo_sensor = 2, nb_temp_sensor = 1, sizeofuint8 = sizeof(uint8_t); bool timestamp = true, is_final = true, photo_sensor = true, temp_sensor = true; + + /**** classic case test ****/ test.set_struct(offset, timestamp, is_final, photo_sensor, temp_sensor, schedule, nb_photo_sensor, nb_temp_sensor, sizeofuint8, sizeofuint8); - - - - uint8_t r_schedule, r_nb_photo_sensor, r_nb_temp_sensor, r_sizeofuint8; - bool r_timestamp, r_is_final, r_photo_sensor, r_temp_sensor; + uint8_t flags; flags = EEPROM.read(offset); // if package flag right set - TEST_ASSERT((flags & 0b10000000) != 0); + TEST_ASSERT(flags & 0b10000000); // test schedule flags - TEST_ASSERT((flags & 0b01000000)!= 0); - TEST_ASSERT(!((flags & 0b00100000) != 0)); + TEST_ASSERT(flags & 0b01000000); + TEST_ASSERT(!(flags & 0b00100000)); - // test schedule - TEST_ASSERT(EEPROM.read(offset + OFFSET_MEASURES_SCH) == 0); + // test schedule + TEST_ASSERT(EEPROM.read(offset + OFFSET_MEASURES_SCH) == schedule); - TEST_ASSERT((flags & 0b00000100) != 0); + // test photo res flag + TEST_ASSERT(flags & 0b00010000); + TEST_ASSERT(EEPROM.read(offset + OFFSET_NB_PHOTO_SENSOR) == nb_photo_sensor); + + // test temp flag + TEST_ASSERT(flags & 0b00001000); + TEST_ASSERT(EEPROM.read(offset + OFFSET_NB_TEMP_SENSOR) == nb_temp_sensor); + + // test if this package is the latest write + TEST_ASSERT(flags & 0b00000100); + + // test type size write + TEST_ASSERT(EEPROM.read(offset + OFFSET_PHOTO_MEASURES_SIZE) == sizeofuint8); + TEST_ASSERT(EEPROM.read(offset + OFFSET_TEMP_MEASURES_SIZE) == sizeofuint8); + + /**** partial schedule timestamp case test ****/ + schedule = 3; + test.set_struct(offset, timestamp, is_final, photo_sensor, temp_sensor, schedule, nb_photo_sensor, nb_temp_sensor, sizeofuint8, sizeofuint8); + + flags = EEPROM.read(offset); + + // test schedule flags + TEST_ASSERT(!(flags & 0b01000000)); + TEST_ASSERT(flags & 0b00100000); + + // test schedule + TEST_ASSERT(EEPROM.read(offset + OFFSET_MEASURES_SCH) == schedule); + /**** without timestamp case test ****/ + schedule = 0; + timestamp = false; + test.set_struct(offset, timestamp, is_final, photo_sensor, temp_sensor, schedule, nb_photo_sensor, nb_temp_sensor, sizeofuint8, sizeofuint8); + + flags = EEPROM.read(offset); + + // test schedule flags + TEST_ASSERT(!(flags & 0b01000000)); + TEST_ASSERT(!(flags & 0b00100000)); + + // test schedule + TEST_ASSERT(EEPROM.read(offset + OFFSET_MEASURES_SCH) == schedule); - // test.get_struct(offset, &r_timestamp, &r_is_final, &r_photo_sensor, &r_temp_sensor, &r_schedule, &r_nb_photo_sensor, &r_nb_temp_sensor, &r_sizeofuint8, &r_sizeofuint8, &r_next_package, &r_nb_measures); - // Serial.println(r_nb_,DEC); - // if(r_is_final){ - // TEST_FAIL_MESSAGE("true"); - // }else{ - // TEST_FAIL_MESSAGE("false"); - // } - // TEST_ASSERT(r_is_final == is_final); - // TEST_ASSERT(r_nb_measures == 0); - // TEST_ASSERT(r_timestamp == timestamp); - // TEST_ASSERT(r_photo_sensor == photo_sensor); - // TEST_ASSERT(r_temp_sensor == temp_sensor); - // TEST_ASSERT(r_schedule == schedule); - // TEST_ASSERT(r_nb_photo_sensor == nb_photo_sensor); - // TEST_ASSERT(r_nb_temp_sensor == nb_temp_sensor); - // TEST_ASSERT(r_sizeofuint8 == sizeofuint8); + /**** without a type of sensor ****/ + schedule = 0; + timestamp = true; + photo_sensor = true; + nb_photo_sensor = 14; + temp_sensor = false; + nb_temp_sensor = 0; + test.set_struct(offset, timestamp, is_final, photo_sensor, temp_sensor, schedule, nb_photo_sensor, nb_temp_sensor, sizeofuint8, sizeofuint8); + + flags = EEPROM.read(offset); + + // test photo res flag + TEST_ASSERT(flags & 0b00010000); + TEST_ASSERT(EEPROM.read(offset + OFFSET_NB_PHOTO_SENSOR) == nb_photo_sensor); + + // test temp flag + TEST_ASSERT(!(flags & 0b00001000)); + TEST_ASSERT(EEPROM.read(offset + OFFSET_NB_TEMP_SENSOR) == nb_temp_sensor); + + photo_sensor = false; + nb_photo_sensor = 0; + temp_sensor = true; + nb_temp_sensor = 15; + test.set_struct(offset, timestamp, is_final, photo_sensor, temp_sensor, schedule, nb_photo_sensor, nb_temp_sensor, sizeofuint8, sizeofuint8); + + flags = EEPROM.read(offset); + + // test photo res flag + TEST_ASSERT(!(flags & 0b00010000)); + TEST_ASSERT(EEPROM.read(offset + OFFSET_NB_PHOTO_SENSOR) == nb_photo_sensor); + + // test temp flag + TEST_ASSERT(flags & 0b00001000); + TEST_ASSERT(EEPROM.read(offset + OFFSET_NB_TEMP_SENSOR) == nb_temp_sensor); } +void test_get_struct(){ + + Storage_interface test; + uint16_t offset = 0, r_next_package, r_nb_measures; + uint8_t schedule = 0, nb_photo_sensor = 2, nb_temp_sensor = 1, sizeofuint8 = sizeof(uint8_t); + bool timestamp = true, is_final = true, photo_sensor = true, temp_sensor = true; -void test(){ - bool yes = true; - TEST_ASSERT(yes); + /**** classic case test ****/ + test.set_struct(offset, timestamp, is_final, photo_sensor, temp_sensor, schedule, nb_photo_sensor, nb_temp_sensor, sizeofuint8, sizeofuint8); + + uint8_t r_schedule, r_nb_photo_sensor, r_nb_temp_sensor, r_sizeof_temp, r_sizeof_photo; + bool r_timestamp, r_is_final, r_photo_sensor, r_temp_sensor; + //uint8_t flags; + //flags = EEPROM.read(offset); + + test.get_struct(offset, &r_timestamp, &r_is_final, &r_photo_sensor, &r_temp_sensor, &r_schedule, &r_nb_photo_sensor, &r_nb_temp_sensor, &r_sizeof_photo, &r_sizeof_temp, &r_next_package, &r_nb_measures); + + // test if this package is the latest write + TEST_ASSERT(r_is_final); + + //EEPROM.get(offset + OFFSET_NB_MEASURES, r_nb_measures); + TEST_ASSERT(EEPROM.read(offset + OFFSET_PHOTO_MEASURES_SIZE) == sizeofuint8); + TEST_ASSERT(r_nb_measures == 0); + TEST_ASSERT(r_timestamp == timestamp); + TEST_ASSERT(r_photo_sensor == photo_sensor); + TEST_ASSERT(r_temp_sensor == temp_sensor); + TEST_ASSERT(r_schedule == schedule); + TEST_ASSERT(r_nb_photo_sensor == nb_photo_sensor); + TEST_ASSERT(r_nb_temp_sensor == nb_temp_sensor); + TEST_ASSERT(r_sizeof_temp == sizeofuint8); + TEST_ASSERT(r_sizeof_photo == sizeofuint8); } void setup(void) @@ -66,9 +150,10 @@ void setup(void) } +//WARNING: Tests are not exhaustive and do not cover all possibilities. int main( int argc, char **argv) { UNITY_BEGIN(); - //RUN_TEST(test); - RUN_TEST(test_put_get_struct); + RUN_TEST(test_get_struct); + RUN_TEST(test_set_struct); UNITY_END(); } \ No newline at end of file