Index: firmware/App/Common.h =================================================================== diff -u -rd9cc76524777a12ba77b58ce95416dddfb032997 -r620104f4a9e3148575703981a3063b9605b6e9b8 --- firmware/App/Common.h (.../Common.h) (revision d9cc76524777a12ba77b58ce95416dddfb032997) +++ firmware/App/Common.h (.../Common.h) (revision 620104f4a9e3148575703981a3063b9605b6e9b8) @@ -138,6 +138,7 @@ #pragma WEAK(can1HighLevelInterrupt) void can1HighLevelInterrupt(void) {} #endif + #define fabs(v) ((v) < 0.0 ? ((v) * -1.0) : (v)) #endif Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r244ab856d139a328b8cd3f070266b9a170446ab7 -r620104f4a9e3148575703981a3063b9605b6e9b8 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 244ab856d139a328b8cd3f070266b9a170446ab7) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 620104f4a9e3148575703981a3063b9605b6e9b8) @@ -14,7 +14,9 @@ * **************************************************************************/ -#include +#ifndef _VECTORCAST_ + #include +#endif #include "can.h" #include "etpwm.h" @@ -217,9 +219,9 @@ } result = TRUE; } - else + else // requested flow rate too high { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH, bloodPumpState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH, flowRate ) } } @@ -630,7 +632,26 @@ *************************************************************************/ DATA_GET( F32, getMeasuredBloodPumpCurrent, adcBloodPumpCurrentmA ) +/************************************************************************* + * @brief execBloodFlowTest + * The execBloodFlowTest function executes the state machine for the \n + * BloodFlow self test. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return the current state of the BloodFlow self test. + *************************************************************************/ +SELF_TEST_STATUS_T execBloodFlowTest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_FAILED; + // TODO - implement self test(s) + + return result; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Drivers/Comm.c =================================================================== diff -u -rd9cc76524777a12ba77b58ce95416dddfb032997 -r620104f4a9e3148575703981a3063b9605b6e9b8 --- firmware/App/Drivers/Comm.c (.../Comm.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) +++ firmware/App/Drivers/Comm.c (.../Comm.c) (revision 620104f4a9e3148575703981a3063b9605b6e9b8) @@ -26,8 +26,8 @@ // ********** private data ********** -static canXmitsInProgress = FALSE; -static uartXmitsInProgress = FALSE; +static BOOL canXmitsInProgress = FALSE; +static BOOL uartXmitsInProgress = FALSE; /************************************************************************* * @brief signalCANXmitsInitiated Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rd9cc76524777a12ba77b58ce95416dddfb032997 -r620104f4a9e3148575703981a3063b9605b6e9b8 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 620104f4a9e3148575703981a3063b9605b6e9b8) @@ -58,7 +58,7 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE } // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK }; -const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_U32, 0 }; +const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_NONE, 0 }; // ********** private data ********** @@ -177,14 +177,18 @@ // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { - // if alarm is a fault and not already triggered, request transition to fault mode - if ( ( FALSE == getAlarmActive(alarm) ) && ( TRUE == alarmTable[alarm].alarmIsFault ) ) + // no need to do anything if alarm is already active + if ( FALSE == getAlarmActive( alarm ) ) { - requestNewOperationMode( MODE_FAUL ); + // if alarm is a fault, request transition to fault mode + if ( TRUE == alarmTable[alarm].alarmIsFault ) + { + requestNewOperationMode( MODE_FAUL ); + } + // activate alarm + alarmIsActive[alarm].data = TRUE; + alarmStartedAt[alarm].data = getMSTimerCount(); } - // activate alarm - alarmIsActive[alarm].data = TRUE; - alarmStartedAt[alarm].data = getMSTimerCount(); } else { @@ -277,18 +281,18 @@ // verify alarm can be cleared if ( FALSE == alarmTable[alarm].alarmNoClear ) { - // broadcast alarm clear if not already cleared + // clear alarm and broadcast alarm clear if not already cleared if ( TRUE == alarmIsActive[alarm].data ) { broadcastAlarmCleared( alarm ); + alarmIsActive[alarm].data = FALSE; + alarmStartedAt[alarm].data = 0; + // clear FIFO if this alarm was in it + if ( alarmPriorityFIFO[alarmTable[alarm].alarmPriority] == alarm ) + { + resetAlarmPriorityFIFO( alarmTable[alarm].alarmPriority ); + } } - alarmIsActive[alarm].data = FALSE; - alarmStartedAt[alarm].data = 0; - // clear FIFO if this alarm was in it - if ( alarmPriorityFIFO[alarmTable[alarm].alarmPriority] == alarm ) - { - resetAlarmPriorityFIFO( alarmTable[alarm].alarmPriority ); - } } } else @@ -348,25 +352,32 @@ *************************************************************************/ static void updateAlarmsState( void ) { - ALARM_PRIORITY_T tempState = ALARM_PRIORITY_NONE; + ALARM_PRIORITY_T highestPriority = ALARM_PRIORITY_NONE; ALARM_ID_T a; + BOOL faultsActive = FALSE; // update FIFOs per alarm status table for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { if ( TRUE == getAlarmActive(a) ) { - tempState = alarmTable[a].alarmPriority; - if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[tempState] ) + ALARM_PRIORITY_T almPriority = alarmTable[a].alarmPriority; + if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[almPriority] ) { - alarmPriorityFIFO[tempState] = a; + alarmPriorityFIFO[almPriority] = a; } + highestPriority = MAX( almPriority, highestPriority ); + if ( TRUE == alarmTable[a].alarmIsFault ) + { + faultsActive = TRUE; + } } } // update alarm to display per highest priority FIFO - alarmStatus.alarmsState = tempState; - alarmStatus.alarmTop = alarmPriorityFIFO[tempState]; + alarmStatus.alarmsState = highestPriority; + alarmStatus.alarmTop = alarmPriorityFIFO[highestPriority]; + alarmStatus.systemFault = faultsActive; } /************************************************************************* @@ -476,6 +487,10 @@ { alarmPriorityFIFO[priority] = ALARM_ID_NO_ALARM; } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, priority ) + } } /************************************************************************* Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r8e53754325653805a454de6d82c0c8ca90e068a0 -r620104f4a9e3148575703981a3063b9605b6e9b8 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8e53754325653805a454de6d82c0c8ca90e068a0) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 620104f4a9e3148575703981a3063b9605b6e9b8) @@ -146,6 +146,7 @@ SW_FAULT_ID_MSG_QUEUES_IS_EMPTY_INVALID_QUEUE, SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, // 35 SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rd9cc76524777a12ba77b58ce95416dddfb032997 -r620104f4a9e3148575703981a3063b9605b6e9b8 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 620104f4a9e3148575703981a3063b9605b6e9b8) @@ -537,10 +537,9 @@ // construct bulk write command to write actuator data registers starting at address 3 (TODO - change address later) fpgaWriteCmdBuffer[0] = FPGA_WRITE_CMD_CODE; - fpgaWriteCmdBuffer[1] = 0x03; // start at FPGA address 8 + fpgaWriteCmdBuffer[1] = 0x08; // start at FPGA address 8 fpgaWriteCmdBuffer[2] = 0x00; fpgaWriteCmdBuffer[3] = sizeof(FPGA_ACTUATORS_T); - //fpgaActuatorSetPoints.bloodValveSetState = 0x03; // TODO - remove memcpy( &(fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN]), &fpgaActuatorSetPoints, sizeof(FPGA_ACTUATORS_T) ); crc = crc16( fpgaWriteCmdBuffer, FPGA_WRITE_CMD_HDR_LEN+sizeof(FPGA_ACTUATORS_T) ); fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN+sizeof(FPGA_ACTUATORS_T)] = GET_MSB_OF_WORD( crc );