Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
app_data.cpp
00001 //------------------------------------------------------------------------------ 00002 //This module: 00003 //------------------------------------------------------------------------------ 00004 #include "app_data.h" 00005 //------------------------------------------------------------------------------ 00006 //LOCAL Macros 00007 FlashIAP flash; 00008 //------------------------------------------------------------------------------ 00009 //debugging state 00010 #define DEBUG_THIS DEBUG_APP_DATA 00011 //------------------------------------------------------------------------------ 00012 //IO pin setup 00013 //------------------------------------------------------------------------------ 00014 //NONE 00015 //------------------------------------------------------------------------------ 00016 //GLOBAL Variables 00017 //------------------------------------------------------------------------------ 00018 app_data_t app_data; 00019 //------------------------------------------------------------------------------ 00020 //LOCAL Data structures 00021 //------------------------------------------------------------------------------ 00022 //NONE 00023 //------------------------------------------------------------------------------ 00024 //LOCAL Constants 00025 //------------------------------------------------------------------------------ 00026 //NONE 00027 //------------------------------------------------------------------------------ 00028 //LOCAL Variables 00029 //------------------------------------------------------------------------------ 00030 //NONE 00031 //------------------------------------------------------------------------------ 00032 //LOCAL Function prototypes 00033 //------------------------------------------------------------------------------ 00034 //NONE 00035 //------------------------------------------------------------------------------ 00036 //LOCAL Function definitions 00037 //------------------------------------------------------------------------------ 00038 //NONE 00039 //------------------------------------------------------------------------------ 00040 //GLOBAL Function definitions 00041 //------------------------------------------------------------------------------ 00042 extern bool set_flag(app_data_t *ptr, uint32_t flag) 00043 { 00044 ptr->status_flags |= flag; 00045 return 0; 00046 } 00047 //------------------------------------------------------------------------------ 00048 extern bool get_flag(app_data_t *ptr, uint32_t flag) 00049 { 00050 bool result; 00051 result = (ptr->status_flags & flag); 00052 return result; 00053 } 00054 //------------------------------------------------------------------------------ 00055 extern bool clr_flag(app_data_t *ptr, uint32_t flag) 00056 { 00057 ptr->status_flags &= ~flag; 00058 return 0; 00059 } 00060 //------------------------------------------------------------------------------ 00061 extern bool tgl_flag(app_data_t *ptr, uint32_t flag) 00062 { 00063 ptr->status_flags ^= flag; 00064 return 0; 00065 } 00066 //------------------------------------------------------------------------------ 00067 extern bool rst_flag_buffer(app_data_t *ptr) 00068 { 00069 ptr->status_flags = 0; 00070 return 0; 00071 } 00072 //------------------------------------------------------------------------------ 00073 extern bool write_app_data_to_flash(app_data_t *ptr) 00074 //write the app data to the memory location defined by APPDATA_START 00075 { 00076 bool pass = false; 00077 int8_t error = 0; //used to catch errors in the flash operations 00078 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Flash - Init 1");debug_exe(); 00079 error = flash.init(); 00080 if(error != 0) 00081 { 00082 //DEBUG(DEBUG_THIS, "ERROR: flash init %d \r\n", error); 00083 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERROR: flash init %d",error);debug_exe(); 00084 return false; 00085 } 00086 const uint32_t page_size = flash.get_page_size(); 00087 char page_buffer[page_size]; 00088 uint32_t addr = APPDATA_START; 00089 uint32_t value[1] = {0}; 00090 uint32_t val = 0; 00091 uint8_t setting = 1; 00092 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Flash - Init 2");debug_exe(); 00093 flash.init(); 00094 // DEBUGGING APP DATA MEMORY CRASH 00095 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Flash - Erase");debug_exe(); 00096 error = flash.erase(addr, flash.get_sector_size(addr)); 00097 if(error != 0) 00098 { 00099 //DEBUG(DEBUG_THIS, "ERROR: flash erase %d \r\n", error); 00100 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERROR: flash erase %d",error);debug_exe(); 00101 return false; 00102 } 00103 00104 //DEBUG(DEBUG_THIS, "WRITE VALUES FROM RAM TO FLASH... \r\n\n"); 00105 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Flash - Write 1");debug_exe(); 00106 for(setting=1; setting<=N_SETTINGS; setting++) 00107 { 00108 switch(setting) 00109 { 00110 case 1: val = ptr->current_firmware_version; break; 00111 case 2: val = ptr->target_firmware_version; break; 00112 case 3: val = ptr->app_execution_fail_counter; break; 00113 case 4: val = ptr->blinky_state; break; 00114 case 5: val = ptr->sleep_counter; break; 00115 case 6: val = ptr->sleep_duration; break; 00116 case 7: val = ptr->update_duration; break; 00117 case 8: val = ptr->reset_counter; break; 00118 case 9: val = ptr->wd_counter; break; 00119 case 10: val = ptr->status_flags; break; 00120 default: 00121 //DEBUG(DEBUG_THIS, "Undefined state in function: %s() \r\n", __FUNCTION__); 00122 break; 00123 } 00124 00125 //DEBUG(DEBUG_THIS, "COPY : %u to BUFFER \r\n", val); 00126 //transfer the 32bit uint to the char page buffer 00127 page_buffer[0] = (char)(val & 0x000000FF); 00128 page_buffer[1] = (char)((val & 0x0000FF00) >> 8); 00129 page_buffer[2] = (char)((val & 0x00FF0000) >> 16); 00130 page_buffer[3] = (char)((val & 0xFF000000) >> 24); 00131 00132 //transfer the page buffer to the flash memory 00133 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Flash - Write 2");debug_exe(); 00134 error = flash.program(page_buffer, addr, page_size); 00135 if(error != 0) 00136 { 00137 //DEBUG(DEBUG_THIS, "ERROR: flash program %d \r\n", error); 00138 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERROR: flash program %d",error);debug_exe(); 00139 return false; 00140 } 00141 //for debug check read back the value... 00142 //doesn't need error checking, not essential. 00143 memset(value, 0x00, 4); 00144 flash.read(value, addr, 4); 00145 //DEBUG(DEBUG_THIS, "READ FROM ADDR: 0x%08x \t VALUE: %u \r\n", addr, value[0]); 00146 addr += page_size; 00147 } 00148 00149 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Flash - Deinit");debug_exe(); 00150 error = flash.deinit(); 00151 if(error != 0) 00152 { 00153 //DEBUG(DEBUG_THIS, "ERROR: flash deinit %d \r\n", error); 00154 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERROR: flash deinit %d",error);debug_exe(); 00155 return false; 00156 } 00157 //DEBUG(DEBUG_THIS, "DONE \r\n"); 00158 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Flash - Done");debug_exe(); 00159 return pass; 00160 } 00161 //------------------------------------------------------------------------------ 00162 extern bool read_app_data_from_flash(app_data_t *ptr) 00163 //read the app data from the memory location defined by APPDATA_START 00164 //and restore to APP_DATA 00165 { 00166 bool pass = false; 00167 int8_t error = 0; 00168 error = flash.init(); 00169 if(error != 0) 00170 { 00171 //DEBUG(DEBUG_THIS, "ERROR: flash init %d \r\n", error); 00172 return false; 00173 } 00174 const uint32_t page_size = flash.get_page_size(); 00175 uint32_t addr = APPDATA_START; 00176 uint32_t value[1] = {0}; 00177 uint8_t setting = 1; 00178 00179 //DEBUG(DEBUG_THIS, "\r\nLOAD VALUES TO RAM FROM FLASH... \r\n"); 00180 00181 for(setting=1; setting<=N_SETTINGS; setting++) 00182 { 00183 error = flash.read(value, addr, 4); 00184 if(error != 0) 00185 { 00186 //DEBUG(DEBUG_THIS, "ERROR: flash read %d \r\n", error); 00187 return false; 00188 } 00189 switch(setting) 00190 { 00191 case 1: ptr->current_firmware_version = value[0]; break; 00192 case 2: ptr->target_firmware_version = value[0]; break; 00193 case 3: ptr->app_execution_fail_counter = value[0]; break; 00194 case 4: ptr->blinky_state = value[0]; break; 00195 case 5: ptr->sleep_counter = value[0]; break; 00196 case 6: ptr->sleep_duration = value[0]; break; 00197 case 7: ptr->update_duration = value[0]; break; 00198 case 8: ptr->reset_counter = value[0]; break; 00199 case 9: ptr->wd_counter = value[0]; break; 00200 case 10: ptr->status_flags = value[0]; break; 00201 default: 00202 //DEBUG(DEBUG_THIS, "Undefined state in function: %s() \r\n", __FUNCTION__); 00203 break; 00204 } 00205 //DEBUG(DEBUG_THIS, "READ FROM ADDR: 0x%08x \t VALUE: %u \r\n", addr, value[0]); 00206 addr += page_size; 00207 } 00208 00209 error = flash.deinit(); 00210 if(error != 0) 00211 { 00212 //DEBUG(DEBUG_THIS, "ERROR: flash deinit %d \r\n", error); 00213 return false; 00214 } 00215 //DEBUG(DEBUG_THIS, "DONE \r\n"); 00216 return pass; 00217 } 00218 //------------------------------------------------------------------------------ 00219 extern void clear_app_data(app_data_t *ptr) 00220 //reset the app data values 00221 { 00222 ptr->current_firmware_version = 0; 00223 ptr->target_firmware_version = 0; 00224 ptr->app_execution_fail_counter = 0; 00225 ptr->blinky_state = 0; 00226 ptr->sleep_counter = 0; 00227 ptr->sleep_duration = 0; 00228 ptr->update_duration = 0; 00229 ptr->reset_counter = 0; 00230 ptr->wd_counter = 0; 00231 ptr->status_flags = 0; 00232 return; 00233 } 00234 //------------------------------------------------------------------------------ 00235 extern void set_app_data(app_data_t *ptr) 00236 //test function - load some initial values for testing 00237 { 00238 ptr->current_firmware_version = 0xFFFF0000; 00239 ptr->target_firmware_version = 0x0000FFFF; 00240 ptr->app_execution_fail_counter = 0x00FFFF00; 00241 //set flags in one go... 00242 ptr->status_flags = 0xAAAAAAAA; //flag - load from bank 2 to bank 1. 00243 //...or one at a time 00244 set_flag(ptr, rollback_flag); 00245 clr_flag(ptr, app_execution_flag); 00246 tgl_flag(ptr, registered_flag); 00247 set_flag(ptr, first_run_flag); 00248 return; 00249 } 00250 //------------------------------------------------------------------------------
Generated on Sat Jul 16 2022 03:03:28 by
1.7.2