v08 - add error handling
This commit is contained in:
@ -153,27 +153,40 @@ BOOL INIT_boCreateTask( VOID )
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
PRIVATE VOID vTask( PVOID arg )
|
||||
{
|
||||
UNUSED( arg );
|
||||
UNUSED( arg );
|
||||
|
||||
BOOL boOK = TRUE;
|
||||
|
||||
boOK &= ERRH_boInitializeModule();
|
||||
boOK &= USFL_boInitializeModule();
|
||||
boOK &= VARH_boInitializeModule();
|
||||
BOOL boOK = TRUE;
|
||||
|
||||
boOK &= DIPO_boInitializeModule();
|
||||
boOK &= ANPI_boInitializeModule();
|
||||
uint32_t reset_flags = RCC->CSR;
|
||||
|
||||
boOK &= ERRH_boInitializeModule();
|
||||
boOK &= USFL_boInitializeModule();
|
||||
boOK &= VARH_boInitializeModule();
|
||||
|
||||
if (reset_flags & RCC_CSR_IWDGRSTF) {
|
||||
// This was IWDG
|
||||
ERRH_vSetError(HARDFAULT_ERROR_MASK | HARDFAULT_ERROR_IWDG);
|
||||
}else if (reset_flags & RCC_CSR_SFTRSTF) {
|
||||
// Software reset (NVIC_SystemReset or by debugger)
|
||||
ERRH_vSetError(HARDFAULT_ERROR_MASK | HARDFAULT_ERROR_SWRST);
|
||||
}
|
||||
|
||||
boOK &= DIPO_boInitializeModule();
|
||||
boOK &= ANPI_boInitializeModule();
|
||||
boOK &= ANPO_boInitializeModule();
|
||||
boOK &= SPID_boInitializeModule();
|
||||
boOK &= ADCD_boInitializeModule();
|
||||
boOK &= SPID_boInitializeModule();
|
||||
boOK &= ADCD_boInitializeModule();
|
||||
boOK &= TEMP_boInitializeModule();
|
||||
boOK &= CAND_boInitializeModule();
|
||||
|
||||
boOK &= PECO_boInitializeModule();
|
||||
boOK &= MAIN_boInitializeModule();
|
||||
boOK &= PECO_boInitializeModule();
|
||||
boOK &= MAIN_boInitializeModule();
|
||||
|
||||
|
||||
|
||||
if( !boOK ){
|
||||
osKernelLock(); // lock kernel to prevent task switch
|
||||
PECO_Enable( FALSE );
|
||||
while( 1 ){ // Toggle Error LED fast
|
||||
DIPO_vToggleOutput( DIPO_eLED );
|
||||
DELAY_MS( 100 );
|
||||
|
@ -43,6 +43,8 @@
|
||||
#include "../Drivers/ANPI_AnalogPortsIn.h"
|
||||
#include "../Drivers/ANPO_AnalogPortsOut.h"
|
||||
|
||||
#include "../Drivers/ERRH_ErrorHandler.h"
|
||||
|
||||
// Toolbox
|
||||
#include "../Toolbox/UTIL_Utility.h"
|
||||
|
||||
@ -57,7 +59,7 @@
|
||||
//=================================================================================================
|
||||
|
||||
/* Software Version */
|
||||
#define SW_VERSION 7
|
||||
#define SW_VERSION 8
|
||||
|
||||
#define MSG_QUEUE_SIZE 8
|
||||
|
||||
@ -206,14 +208,14 @@ BOOL MAIN_boInitializeModule( VOID )
|
||||
|
||||
boOK &= ( ( m_pstEventID = osEventFlagsNew( &stEventAttribute ) ) == NULL ) ? FALSE : TRUE;
|
||||
boOK &= ( ( m_pstThreadID = osThreadNew( vTask, NULL, &stTaskAttribute ) ) == NULL ) ? FALSE : TRUE;
|
||||
boOK &= ( ( m_pstCANRxMsgQueueID = osMessageQueueNew( MSG_QUEUE_SIZE, sizeof( CAND_Message ), &stCANRxMsgQueueAttribute ) ) == NULL ) ? FALSE : TRUE;
|
||||
boOK &= ( ( m_pstCANRxMsgQueueID = osMessageQueueNew( MSG_QUEUE_SIZE, sizeof( CAND_Message ), &stCANRxMsgQueueAttribute ) ) == NULL ) ? FALSE : TRUE;
|
||||
boOK &= ( m_pstUpdateTimer = osTimerNew( vEventCallback, osTimerPeriodic, (PVOID)EVENT_TIMER_UPDATE, &stTimerAttribute ) ) == NULL ? FALSE : TRUE;
|
||||
boOK &= ( m_pstWatchdogTimer = osTimerNew( vEventCallback, osTimerPeriodic, (PVOID)EVENT_WATCHDOG, &stWatchdogTimerAttribute ) ) == NULL ? FALSE : TRUE;
|
||||
|
||||
boOK &= (osTimerStart( m_pstUpdateTimer, 1000 ) == osOK ) ? TRUE : FALSE;
|
||||
boOK &= (osTimerStart( m_pstWatchdogTimer, WATCHDOG ) == osOK ) ? TRUE : FALSE;
|
||||
|
||||
CAND_vSetRxCallback( vMsgRxCallback );
|
||||
CAND_vSetRxCallback( vMsgRxCallback );
|
||||
|
||||
return( boOK );
|
||||
}
|
||||
@ -244,77 +246,81 @@ PRIVATE VOID vTask( PVOID arg )
|
||||
if( u32Flags & EVENT_NEW_MESSAGE ) { // New message from CAN
|
||||
|
||||
CAND_Message stMessage;
|
||||
osMessageQueueGet( m_pstCANRxMsgQueueID, &stMessage, NULL, 0 ); // get message from queue
|
||||
osMessageQueueGet( m_pstCANRxMsgQueueID, &stMessage, NULL, 0 ); // get message from queue
|
||||
|
||||
U8 u8Register = stMessage.au8Data[0];
|
||||
U8 u8Type = stMessage.u8Type;
|
||||
U8 u8Register = stMessage.au8Data[0];
|
||||
U8 u8Type = stMessage.u8Type;
|
||||
|
||||
if( u8Type == MESSAGE_TYPE_READ ){ // Message type read
|
||||
if( u8Type == MESSAGE_TYPE_READ ){ // Message type read
|
||||
|
||||
if( u8Register >= VARH_eNumberOfVariables ){ // check register
|
||||
// send register not found
|
||||
au8Buffer[0] = 0xFF;
|
||||
CAND_boSendMessage( au8Buffer, 1, stMessage.boIsPrivate, stMessage.u8Type );
|
||||
} else {
|
||||
VARH_UVariable uVariable = VARH_uGetVariableData(u8Register); // get data
|
||||
au8Buffer[0] = u8Register;
|
||||
UTIL_vMemCopy(&uVariable, &au8Buffer[1], 4); // copy data in buffer
|
||||
if( u8Register >= VARH_eNumberOfVariables ){ // check register
|
||||
// send register not found
|
||||
ERRH_vSetError(MAIN_ERROR_MASK | MAIN_ERROR_REG_NOT_FOUND);
|
||||
|
||||
CAND_boSendMessage( au8Buffer, 5, stMessage.boIsPrivate, stMessage.u8Type );
|
||||
}
|
||||
|
||||
} else if( u8Type == MESSAGE_TYPE_WRITE ){ // Message type write
|
||||
VARH_UVariable uData;
|
||||
UTIL_vMemCopy(&stMessage.au8Data[1], &uData, 4);
|
||||
au8Buffer[0] = 0xFF;
|
||||
CAND_boSendMessage( au8Buffer, 1, stMessage.boIsPrivate, stMessage.u8Type );
|
||||
} else {
|
||||
VARH_UVariable uVariable = VARH_uGetVariableData(u8Register); // get data
|
||||
au8Buffer[0] = u8Register;
|
||||
UTIL_vMemCopy(&uVariable, &au8Buffer[1], 4); // copy data in buffer
|
||||
|
||||
VARH_vSetVariableData(u8Register, uData);
|
||||
} else if( u8Type == MESSAGE_TYPE_COMMAND ){ // Message type command
|
||||
CAND_boSendMessage( au8Buffer, 5, stMessage.boIsPrivate, stMessage.u8Type );
|
||||
}
|
||||
|
||||
switch (u8Register)
|
||||
{
|
||||
case COMMAND_ON:
|
||||
PECO_Enable( TRUE );
|
||||
break;
|
||||
case COMMAND_OFF:
|
||||
PECO_Enable( FALSE );
|
||||
break;
|
||||
case COMMAND_WATCHDOG:
|
||||
osTimerStart( m_pstWatchdogTimer, WATCHDOG );
|
||||
break;
|
||||
case COMMAND_CLEAR_ERROR:
|
||||
VARH_vSetVariableDataFromSystemU32( VARH_eError, 0x00000000 );
|
||||
break;
|
||||
case COMMAND_REBOOT:
|
||||
PECO_Enable( FALSE );
|
||||
HAL_NVIC_SystemReset();
|
||||
break;
|
||||
case COMMAND_GET_SW_VERSION:
|
||||
au8Buffer[0] = COMMAND_GET_SW_VERSION;
|
||||
au8Buffer[1] = SW_VERSION;
|
||||
CAND_boSendMessage( au8Buffer, 2, stMessage.boIsPrivate, stMessage.u8Type );
|
||||
break;
|
||||
case COMMAND_SAVE_VARIABLES:
|
||||
VARH_vSaveVariablestoFlash();
|
||||
// @TODO Error handling Flash Save
|
||||
break;
|
||||
case COMMAND_LOAD_VARIABLES:
|
||||
VARH_vLoadVariablesfromFlash();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if( u8Type == MESSAGE_TYPE_WRITE ){ // Message type write
|
||||
VARH_UVariable uData;
|
||||
UTIL_vMemCopy(&stMessage.au8Data[1], &uData, 4);
|
||||
|
||||
VARH_vSetVariableData(u8Register, uData);
|
||||
} else if( u8Type == MESSAGE_TYPE_COMMAND ){ // Message type command
|
||||
|
||||
switch (u8Register)
|
||||
{
|
||||
case COMMAND_ON:
|
||||
PECO_Enable( TRUE );
|
||||
break;
|
||||
case COMMAND_OFF:
|
||||
PECO_Enable( FALSE );
|
||||
break;
|
||||
case COMMAND_WATCHDOG:
|
||||
osTimerStart( m_pstWatchdogTimer, WATCHDOG );
|
||||
break;
|
||||
case COMMAND_CLEAR_ERROR:
|
||||
ERRH_vClearError();
|
||||
break;
|
||||
case COMMAND_REBOOT:
|
||||
PECO_Enable( FALSE );
|
||||
HAL_NVIC_SystemReset();
|
||||
break;
|
||||
case COMMAND_GET_SW_VERSION:
|
||||
au8Buffer[0] = COMMAND_GET_SW_VERSION;
|
||||
au8Buffer[1] = SW_VERSION;
|
||||
CAND_boSendMessage( au8Buffer, 2, stMessage.boIsPrivate, stMessage.u8Type );
|
||||
break;
|
||||
case COMMAND_SAVE_VARIABLES:
|
||||
if(!VARH_vSaveVariablestoFlash()){
|
||||
ERRH_vSetError(MAIN_ERROR_MASK | MAIN_ERROR_SAVE_FLASH);
|
||||
}
|
||||
break;
|
||||
case COMMAND_LOAD_VARIABLES:
|
||||
VARH_vLoadVariablesfromFlash();
|
||||
break;
|
||||
default:
|
||||
ERRH_vSetError(MAIN_ERROR_MASK | MAIN_ERROR_CMD_NOT_FOUND);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( u32Flags & EVENT_TIMER_UPDATE )
|
||||
{
|
||||
{
|
||||
DIPO_vToggleOutput( DIPO_eLED );
|
||||
}
|
||||
|
||||
if( u32Flags & EVENT_WATCHDOG )
|
||||
{
|
||||
if( u32Flags & EVENT_WATCHDOG )
|
||||
{
|
||||
PECO_Enable( FALSE );
|
||||
// TODO: WATCHDOG: what else?
|
||||
// ERRH_vSetError(MAIN_ERROR_MASK | MAIN_ERROR_WATCHDOG);
|
||||
}
|
||||
|
||||
}
|
||||
@ -339,7 +345,7 @@ PRIVATE VOID vEventCallback( PVOID pvData )
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
PRIVATE VOID vMsgRxCallback( CAND_Message stMessage )
|
||||
{
|
||||
osMessageQueuePut( m_pstCANRxMsgQueueID, &stMessage, 0, 0 );
|
||||
osMessageQueuePut( m_pstCANRxMsgQueueID, &stMessage, 0, 0 );
|
||||
osEventFlagsSet( m_pstEventID, EVENT_NEW_MESSAGE );
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,8 @@
|
||||
// Application
|
||||
#include "../Application/VARH_VariableHandler.h"
|
||||
|
||||
#include "ERRH_ErrorHandler.h"
|
||||
|
||||
// Driver
|
||||
#include "ANPO_AnalogPortsOut.h"
|
||||
#include "DIPO_DigitalPorts.h"
|
||||
@ -56,7 +58,7 @@
|
||||
|
||||
#define EVENT_FLAGS_ALL (EVENT_TIMER_UPDATE)
|
||||
|
||||
#define MAX_POWER_PELTIER 100
|
||||
#define MAX_POWER_PELTIER 110 // safety for pid regulations
|
||||
|
||||
//=================================================================================================
|
||||
// Section: MACROS
|
||||
@ -234,9 +236,9 @@ VOID vTask(PVOID arg)
|
||||
FLOAT power = VARH_flGetVariableData(VARH_ePeltier_P);
|
||||
if(power > MAX_POWER_PELTIER){
|
||||
PECO_Enable(FALSE);
|
||||
ERRH_vSetError(PELTIER_ERROR_MASK | PELTIER_ERROR_MAX_POWER);
|
||||
}
|
||||
|
||||
|
||||
// PID Regelung
|
||||
|
||||
FLOAT Kp = VARH_flGetVariableData(VARH_ePID_kp);
|
||||
@ -285,11 +287,11 @@ VOID vTask(PVOID arg)
|
||||
d_prev = D;
|
||||
i_prev = I;
|
||||
|
||||
boSetPeltierVoltage(Uout); // set the output
|
||||
if(!boSetPeltierVoltage(Uout)) ERRH_vSetError(PELTIER_ERROR_MASK | PELTIER_ERROR_SETVOLTAGE_PID); // set the output
|
||||
}
|
||||
else if (VARH_u32GetVariableData(VARH_eMode) == PECO_eConst_Voltage)
|
||||
{
|
||||
boSetPeltierVoltage(VARH_flGetVariableData(VARH_eControlVoltage)); // set the output
|
||||
if(!boSetPeltierVoltage(VARH_flGetVariableData(VARH_eControlVoltage))) ERRH_vSetError(PELTIER_ERROR_MASK | PELTIER_ERROR_SETVOLTAGE); // set the output
|
||||
|
||||
// reset PID Vars
|
||||
error_prev = 0;
|
||||
|
@ -32,6 +32,8 @@
|
||||
|
||||
#include "USFL_UserFlash.h"
|
||||
|
||||
#include "ERRH_ErrorHandler.h"
|
||||
|
||||
// Toolbox
|
||||
#include "../Toolbox/UTIL_Utility.h"
|
||||
|
||||
@ -153,7 +155,7 @@ BOOL VARH_boInitializeModule( VOID )
|
||||
{
|
||||
BOOL boOK = TRUE;
|
||||
|
||||
boOK &= ( ( m_pstMutexID = osMutexNew( &m_stMutexAttr ) ) == NULL ) ? FALSE : TRUE;
|
||||
boOK &= ( ( m_pstMutexID = osMutexNew( &m_stMutexAttr ) ) == NULL ) ? FALSE : TRUE;
|
||||
|
||||
VARH_vSetAllVariablesToInitData();
|
||||
|
||||
@ -172,11 +174,14 @@ VOID VARH_vSetVariableData( U8 u8Variable, VARH_UVariable uData )
|
||||
// check parameters
|
||||
if( m_astVarInfo[u8Variable].u8Flags & VARH_FLAGINFO_READONLY )
|
||||
{
|
||||
return;
|
||||
ERRH_vSetError(VARH_ERROR_MASK | VARH_ERROR_READONLY);
|
||||
return;
|
||||
}
|
||||
|
||||
osMutexAcquire( m_pstMutexID, osWaitForever ); // aquire mutex
|
||||
if( boCheckRange( u8Variable, uData ) ) { m_auVariable[u8Variable].uData = uData; } // store new value
|
||||
if( boCheckRange( u8Variable, uData ) ) {
|
||||
m_auVariable[u8Variable].uData = uData; // store new value
|
||||
} else ERRH_vSetError(VARH_ERROR_MASK | VARH_ERROR_OUTOFRANGE);
|
||||
osMutexRelease( m_pstMutexID ); // release mutex
|
||||
}
|
||||
|
||||
@ -231,6 +236,7 @@ VOID VARH_vSetVariableDataFromSystem( U8 u8Variable, VARH_UVariable uData )
|
||||
if( !boCheckRange( u8Variable, uData ) )
|
||||
{
|
||||
m_auVariable[u8Variable].u8Flags |= VARH_FLAG_OUTOFRANGE; // check the value
|
||||
ERRH_vSetError(VARH_ERROR_MASK | VARH_ERROR_OUTOFRANGE_INT);
|
||||
}
|
||||
m_auVariable[u8Variable].uData = uData; // store new value
|
||||
osMutexRelease( m_pstMutexID ); // release mutex
|
||||
@ -401,6 +407,7 @@ VOID VARH_vLoadVariablesfromFlash( VOID )
|
||||
}
|
||||
}
|
||||
if( !boOK ){
|
||||
ERRH_vSetError(VARH_ERROR_MASK | VARH_ERROR_LOAD_FLASH);
|
||||
for( U8 u8Var = 0; u8Var < VARH_eNumberOfVariables; u8Var++ )
|
||||
{
|
||||
if( (m_astVarInfo[u8Var].u8Flags & VARH_FLAGINFO_FLASH) == VARH_FLAGINFO_FLASH ){
|
||||
|
Reference in New Issue
Block a user