/* * ModeUpdate.c * * Created on: Jul 31, 2024 * 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; }