![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Diff: app_data.cpp
- Revision:
- 34:4493c9f6d707
- Child:
- 51:9078e6928412
diff -r 760005331b4c -r 4493c9f6d707 app_data.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app_data.cpp Sun Jan 13 23:40:56 2019 +0000 @@ -0,0 +1,239 @@ +//------------------------------------------------------------------------------ +//This module: +//------------------------------------------------------------------------------ +#include "app_data.h" +//------------------------------------------------------------------------------ +//LOCAL Macros +FlashIAP flash; +//------------------------------------------------------------------------------ +//debugging state +#define DEBUG_THIS DEBUG_APP_DATA +//------------------------------------------------------------------------------ +//IO pin setup +//------------------------------------------------------------------------------ +//NONE +//------------------------------------------------------------------------------ +//GLOBAL Variables +//------------------------------------------------------------------------------ +app_data_t app_data; +//------------------------------------------------------------------------------ +//LOCAL Data structures +//------------------------------------------------------------------------------ +//NONE +//------------------------------------------------------------------------------ +//LOCAL Constants +//------------------------------------------------------------------------------ +//NONE +//------------------------------------------------------------------------------ +//LOCAL Variables +//------------------------------------------------------------------------------ +//NONE +//------------------------------------------------------------------------------ +//LOCAL Function prototypes +//------------------------------------------------------------------------------ +//NONE +//------------------------------------------------------------------------------ +//LOCAL Function definitions +//------------------------------------------------------------------------------ +//NONE +//------------------------------------------------------------------------------ +//GLOBAL Function definitions +//------------------------------------------------------------------------------ +extern bool set_flag(app_data_t *ptr, uint32_t flag) +{ + ptr->status_flags |= flag; + return 0; +} +//------------------------------------------------------------------------------ +extern bool get_flag(app_data_t *ptr, uint32_t flag) +{ + bool result; + result = (ptr->status_flags & flag); + return result; +} +//------------------------------------------------------------------------------ +extern bool clr_flag(app_data_t *ptr, uint32_t flag) +{ + ptr->status_flags &= ~flag; + return 0; +} +//------------------------------------------------------------------------------ +extern bool tgl_flag(app_data_t *ptr, uint32_t flag) +{ + ptr->status_flags ^= flag; + return 0; +} +//------------------------------------------------------------------------------ +extern bool rst_flag_buffer(app_data_t *ptr) +{ + ptr->status_flags = 0; + return 0; +} +//------------------------------------------------------------------------------ +extern bool write_app_data_to_flash(app_data_t *ptr) +//write the app data to the memory location defined by APPDATA_START +{ + bool pass = false; + int8_t error = 0; //used to catch errors in the flash operations + error = flash.init(); + if(error != 0) + { + //DEBUG(DEBUG_THIS, "ERROR: flash init %d \r\n", error); + return false; + } + const uint32_t page_size = flash.get_page_size(); + char page_buffer[page_size]; + uint32_t addr = APPDATA_START; + uint32_t value[1] = {0}; + uint32_t val = 0; + uint8_t setting = 1; + flash.init(); + // DEBUGGING APP DATA MEMORY CRASH + error = flash.erase(addr, flash.get_sector_size(addr)); + if(error != 0) + { + //DEBUG(DEBUG_THIS, "ERROR: flash erase %d \r\n", error); + return false; + } + + //DEBUG(DEBUG_THIS, "WRITE VALUES FROM RAM TO FLASH... \r\n\n"); + for(setting=1; setting<=N_SETTINGS; setting++) + { + switch(setting) + { + case 1: val = ptr->current_firmware_version; break; + case 2: val = ptr->target_firmware_version; break; + case 3: val = ptr->app_execution_fail_counter; break; + case 4: val = ptr->blinky_state; break; + case 5: val = ptr->sleep_counter; break; + case 6: val = ptr->sleep_duration; break; + case 7: val = ptr->update_duration; break; + case 8: val = ptr->reset_counter; break; + case 9: val = ptr->wd_counter; break; + case 10: val = ptr->status_flags; break; + default: + //DEBUG(DEBUG_THIS, "Undefined state in function: %s() \r\n", __FUNCTION__); + break; + } + + //DEBUG(DEBUG_THIS, "COPY : %u to BUFFER \r\n", val); + //transfer the 32bit uint to the char page buffer + page_buffer[0] = (char)(val & 0x000000FF); + page_buffer[1] = (char)((val & 0x0000FF00) >> 8); + page_buffer[2] = (char)((val & 0x00FF0000) >> 16); + page_buffer[3] = (char)((val & 0xFF000000) >> 24); + + //transfer the page buffer to the flash memory + error = flash.program(page_buffer, addr, page_size); + if(error != 0) + { + //DEBUG(DEBUG_THIS, "ERROR: flash program %d \r\n", error); + return false; + } + //for debug check read back the value... + //doesn't need error checking, not essential. + memset(value, 0x00, 4); + flash.read(value, addr, 4); + //DEBUG(DEBUG_THIS, "READ FROM ADDR: 0x%08x \t VALUE: %u \r\n", addr, value[0]); + addr += page_size; + } + + error = flash.deinit(); + if(error != 0) + { + //DEBUG(DEBUG_THIS, "ERROR: flash deinit %d \r\n", error); + return false; + } + //DEBUG(DEBUG_THIS, "DONE \r\n"); + return pass; +} +//------------------------------------------------------------------------------ +extern bool read_app_data_from_flash(app_data_t *ptr) +//read the app data from the memory location defined by APPDATA_START +//and restore to APP_DATA +{ + bool pass = false; + int8_t error = 0; + error = flash.init(); + if(error != 0) + { + //DEBUG(DEBUG_THIS, "ERROR: flash init %d \r\n", error); + return false; + } + const uint32_t page_size = flash.get_page_size(); + uint32_t addr = APPDATA_START; + uint32_t value[1] = {0}; + uint8_t setting = 1; + + //DEBUG(DEBUG_THIS, "\r\nLOAD VALUES TO RAM FROM FLASH... \r\n"); + + for(setting=1; setting<=N_SETTINGS; setting++) + { + error = flash.read(value, addr, 4); + if(error != 0) + { + //DEBUG(DEBUG_THIS, "ERROR: flash read %d \r\n", error); + return false; + } + switch(setting) + { + case 1: ptr->current_firmware_version = value[0]; break; + case 2: ptr->target_firmware_version = value[0]; break; + case 3: ptr->app_execution_fail_counter = value[0]; break; + case 4: ptr->blinky_state = value[0]; break; + case 5: ptr->sleep_counter = value[0]; break; + case 6: ptr->sleep_duration = value[0]; break; + case 7: ptr->update_duration = value[0]; break; + case 8: ptr->reset_counter = value[0]; break; + case 9: ptr->wd_counter = value[0]; break; + case 10: ptr->status_flags = value[0]; break; + default: + //DEBUG(DEBUG_THIS, "Undefined state in function: %s() \r\n", __FUNCTION__); + break; + } + //DEBUG(DEBUG_THIS, "READ FROM ADDR: 0x%08x \t VALUE: %u \r\n", addr, value[0]); + addr += page_size; + } + + error = flash.deinit(); + if(error != 0) + { + //DEBUG(DEBUG_THIS, "ERROR: flash deinit %d \r\n", error); + return false; + } + //DEBUG(DEBUG_THIS, "DONE \r\n"); + return pass; +} +//------------------------------------------------------------------------------ +extern void clear_app_data(app_data_t *ptr) +//reset the app data values +{ + ptr->current_firmware_version = 0; + ptr->target_firmware_version = 0; + ptr->app_execution_fail_counter = 0; + ptr->blinky_state = 0; + ptr->sleep_counter = 0; + ptr->sleep_duration = 0; + ptr->update_duration = 0; + ptr->reset_counter = 0; + ptr->wd_counter = 0; + ptr->status_flags = 0; + return; +} +//------------------------------------------------------------------------------ +extern void set_app_data(app_data_t *ptr) +//test function - load some initial values for testing +{ + ptr->current_firmware_version = 0xFFFF0000; + ptr->target_firmware_version = 0x0000FFFF; + ptr->app_execution_fail_counter = 0x00FFFF00; + //set flags in one go... + ptr->status_flags = 0xAAAAAAAA; //flag - load from bank 2 to bank 1. + //...or one at a time + set_flag(ptr, rollback_flag); + clr_flag(ptr, app_execution_flag); + tgl_flag(ptr, registered_flag); + set_flag(ptr, first_run_flag); + return; +} +//------------------------------------------------------------------------------