init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
34:4493c9f6d707
Child:
51:9078e6928412
--- /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;   
+}
+//------------------------------------------------------------------------------