Pathfindr / Mbed OS mbed-os-PF-UWBBEACON_v1_dev

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers app_data.cpp Source File

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 //------------------------------------------------------------------------------