Index: firmware/App/Modes/ModeUpdate.c =================================================================== diff -u -rabb9687e52d9db5df1abe7626ba04a6d431ba823 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision abb9687e52d9db5df1abe7626ba04a6d431ba823) +++ firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -5,4 +5,107 @@ * Author: fw */ +#include "CommBuffers.h" #include "ModeUpdate.h" +#include "NVDataMgmt.h" +#include "OperationModes.h" + +static MODE_SW_UPDATE_STATE_T updateCurrentState; + +static MODE_SW_UPDATE_STATE_T handleUpdateModeUpdateState( void ); +static MODE_SW_UPDATE_STATE_T handleUpdateModeVerifyState( void ); +static MODE_SW_UPDATE_STATE_T handleUpdateModeAbortState( void ); + +void initUpdateMode( void ) +{ + updateCurrentState = SW_UPDATE_UPDATE_STATE; +} + +U32 transitionToUpdateMode( void ) +{ + initUpdateMode(); + // Clear the NV status to start from the start address of the firmware + clearSWUpdateNVStatus(); + // TODO clear FPGA clear stuff here + // Clear the command CAN buffer after it got the mode changed to update mode + clearSWUpdateBuffer( SW_UPDATE_COMMAD ); + + return 0; +} + +U32 execUpdateMode( void ) +{ + switch( updateCurrentState ) + { + case SW_UPDATE_UPDATE_STATE: + updateCurrentState = handleUpdateModeUpdateState(); + break; + + case SW_UPDATE_ABORT_STATE: + updateCurrentState = handleUpdateModeAbortState(); + break; + + case SW_UPDATE_VERIFY_STATE: + updateCurrentState = handleUpdateModeVerifyState(); + break; + + default: + // Do nothing + break; + } + + return 0; +} + + +static MODE_SW_UPDATE_STATE_T handleUpdateModeUpdateState( void ) +{ + SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; + + MODE_SW_UPDATE_STATE_T state = SW_UPDATE_UPDATE_STATE; + + getSWUpdateCmdStatus( &SWUpdateCmdStatus ); + + switch( SWUpdateCmdStatus.updateCmd ) + { + case UPDATE_CMD_VERIFY: + state = SW_UPDATE_VERIFY_STATE; + break; + + case UPDATE_CMD_ABORT: + state = SW_UPDATE_ABORT_STATE; + break; + + default: + // Do nothing, keep updating + break; + } + + return state; +} + + +static MODE_SW_UPDATE_STATE_T handleUpdateModeVerifyState( void ) +{ + MODE_SW_UPDATE_STATE_T state = SW_UPDATE_VERIFY_STATE; + + requestNewOperationMode( MODE_STAND ); + + return state; +} + +static MODE_SW_UPDATE_STATE_T handleUpdateModeAbortState( void ) +{ + MODE_SW_UPDATE_STATE_T state = SW_UPDATE_ABORT_STATE; + + requestNewOperationMode( MODE_STAND ); + + return state; +} + + + + + + +