Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -196,7 +196,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, drainPumpState ) // TODO - replace 1st param with s/w fault enum + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, drainPumpState ) // TODO - replace 1st param with s/w fault enum drainPumpState = DRAIN_PUMP_OFF_STATE; break; } Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -354,7 +354,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_SELF_TEST_INVALID_STATE, + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_SELF_TEST_INVALID_STATE, heatersSelfTestState ); heatersSelfTestState = HEATERS_SELF_TEST_COMPLETE; break; @@ -385,7 +385,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, primaryHeatersExecState ); primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; break; @@ -414,7 +414,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, trimmerHeaterExecState ); trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; break; Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -152,7 +152,7 @@ } else { - activateAlarmNoData( ALARM_ID_SOFTWARE_FAULT ); + activateAlarmNoData( ALARM_ID_DG_SOFTWARE_FAULT ); } return result; Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -131,7 +131,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, pressuresState ) // TODO - replace 1st param with s/w fault enum + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, pressuresState ) // TODO - replace 1st param with s/w fault enum pressuresState = PRESSURE_INIT_STATE; break; } @@ -272,7 +272,7 @@ } else { - activateAlarmNoData( ALARM_ID_SOFTWARE_FAULT ); + activateAlarmNoData( ALARM_ID_DG_SOFTWARE_FAULT ); } return result; Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -168,7 +168,7 @@ } else // requested pressure out of range { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, roPressure ) // TODO - replace 1st param with s/w fault enum + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, roPressure ) // TODO - replace 1st param with s/w fault enum } return result; @@ -255,7 +255,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, roPumpState ) // TODO - replace 1st param with s/w fault enum + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, roPumpState ) // TODO - replace 1st param with s/w fault enum roPumpState = RO_PUMP_OFF_STATE; break; } Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -274,7 +274,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_INVALID_SELF_TEST_STATE, + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_INVALID_SELF_TEST_STATE, tempSensorsSelfTestState ); tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_COMPLETE; break; @@ -307,7 +307,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_TEMPERATURE_SENSORS_EXEC_INVALID_STATE, tempSensorsExecState ); tempSensorsExecState = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -215,7 +215,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) break; } @@ -331,7 +331,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, valveStateName ) break; } @@ -387,7 +387,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ID, valveID ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ID, valveID ) } return valveState; Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -155,7 +155,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, adcRawReadingsCount ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, adcRawReadingsCount ) } // start an adc channel group conversion @@ -182,7 +182,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, channel ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, channel ) } return result; Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -93,7 +93,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, drainState ) // TODO - add s/w fault enum to 1st data param + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, drainState ) // TODO - add s/w fault enum to 1st data param drainState = DG_DRAIN_STATE_START; break; } Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -101,7 +101,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, fillState ) // TODO - add s/w fault enum to 1st data param + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, fillState ) // TODO - add s/w fault enum to 1st data param fillState = DG_FILL_MODE_STATE_START; break; } Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -77,6 +77,7 @@ initRecirculateMode(); // set initial actuator states + setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); @@ -125,7 +126,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, recircState ) // TODO - add s/w fault enum to 1st data param + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, recircState ) // TODO - add s/w fault enum to 1st data param recircState = DG_RECIRCULATE_MODE_STATE_START; break; } Index: firmware/App/Modes/ModeSolo.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Modes/ModeSolo.c (.../ModeSolo.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Modes/ModeSolo.c (.../ModeSolo.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -15,9 +15,10 @@ * ***************************************************************************/ -#include "OperationModes.h" -#include "ModeSolo.h" #include "CPLD.h" +#include "ModeSolo.h" +#include "OperationModes.h" +#include "SystemComm.h" /** * @addtogroup DGSoloStandbyMode @@ -32,6 +33,8 @@ // ********** private function prototypes ********** +static DG_SOLO_STANDBY_STATE_T handleIdleDGSoloStandbyState( void ); + /*********************************************************************//** * @brief * The initSoloMode function initializes the Standby-Solo Mode module. @@ -72,8 +75,13 @@ switch ( soloState ) { case DG_SOLO_STANDBY_STATE_START: + soloState = DG_SOLO_IDLE_STATE; break; + case DG_SOLO_IDLE_STATE: + soloState = handleIdleDGSoloStandbyState(); + break; + default: // TODO - s/w fault soloState = DG_SOLO_STANDBY_STATE_START; @@ -85,6 +93,28 @@ /*********************************************************************//** * @brief + * The handleIdleDGSoloStandbyState function handles the idle state of DG \n + * standby-solo mode. + * @details + * Inputs : none + * Outputs : none + * @return the next state of standby-solo mode. + *************************************************************************/ +static DG_SOLO_STANDBY_STATE_T handleIdleDGSoloStandbyState( void ) +{ + DG_SOLO_STANDBY_STATE_T result = DG_SOLO_IDLE_STATE; + + // if HD is on, transition to DG standby mode + if ( TRUE == isHDCommunicating() ) + { + requestNewOperationMode( DG_MODE_STAN ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The getCurrentSoloState function returns the current state of the \n * standby-solo mode. * @details Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -115,7 +115,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, standbyState ) // TODO - add s/w fault enum to 1st data param + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, standbyState ) // TODO - add s/w fault enum to 1st data param standbyState = DG_STANDBY_MODE_STATE_START; break; } @@ -139,14 +139,15 @@ // go to standby solo mode if HD is turned off or stops communicating. if ( FALSE == isHDCommunicating() ) { // TODO if HD comm loss, should we wait an hour or so before going to solo standby? -// requestNewOperationMode( DG_MODE_SOLO ); // TODO - uncomment when solo mode is implemented. + requestNewOperationMode( DG_MODE_SOLO ); } // if HD requests water sample, go to water sample state else if ( TRUE == pendingSampleWaterRequest ) { pendingSampleWaterRequest = FALSE; waterSampleStartTime = getMSTimerCount(); - // TODO - open VPi and VSP valves + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VSP, VALVE_STATE_OPEN ); result = DG_STANDBY_MODE_STATE_SAMPLE_WATER; } else if ( TRUE == pendingStartDGRequest ) @@ -174,7 +175,8 @@ // VPi and VSP valves open for 10 seconds, then close and return to idle state if ( TRUE == didTimeout( waterSampleStartTime, WATER_SAMPLE_TIME_MS ) ) { - // TODO - close VPi and VSP valves. + setValveState( VPI, VALVE_STATE_CLOSED ); + setValveState( VSP, VALVE_STATE_CLOSED ); result = DG_STANDBY_MODE_STATE_IDLE; } Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -324,7 +324,7 @@ transitionToChemicalDisinfectMode(); break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, (U32)newMode ) // TODO - add s/w fault enum to 1st data param + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, (U32)newMode ) // TODO - add s/w fault enum to 1st data param break; } } Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r439894cb0508e69af3ece09ae57a62feac09e3f2 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 439894cb0508e69af3ece09ae57a62feac09e3f2) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -102,7 +102,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) } } @@ -245,7 +245,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, alarm ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, alarm ) } } Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -131,7 +131,12 @@ SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, SW_FAULT_ID_VALVES_INVALID_VALVE_STATE_NAME, - SW_FAULT_ID_VALVES_INVALID_VALVE_ID, + SW_FAULT_ID_VALVES_INVALID_VALVE_ID, + SW_FAULT_ID_CAN_PARITY_ERROR, + SW_FAULT_ID_CAN_PASSIVE_WARNING, + SW_FAULT_ID_CAN_OFF_ERROR, + SW_FAULT_ID_FPGA_UART_FRAME_ERROR, + SW_FAULT_ID_FPGA_UART_OVERRUN_ERROR, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -r3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -17,7 +17,8 @@ #include // for memcpy() -#include "CommBuffers.h" +#include "CommBuffers.h" +#include "SystemComm.h" #include "SystemCommMessages.h" #include "Timers.h" @@ -118,34 +119,40 @@ { BOOL bufferFull = FALSE; U32 activeBuffer; - U32 currentActiveBufCount; // where to start adding new data to buffer (after existing data) + U32 currentActiveBufCount; // where to start adding new data to buffer (after existing data) + + // prevent adding to out-going CAN buffer if DG is only node on CAN bus + if ( ( FALSE == isDGOnlyCANNode() ) || + ( FALSE == isCANBoxForXmit( (CAN_MESSAGE_BOX_T)buffer ) ) ) + { + // thread protection for queue operations + _disable_IRQ(); - // thread protection for queue operations - _disable_IRQ(); + activeBuffer = activeDoubleBuffer[ buffer ]; + currentActiveBufCount = commBufferByteCount[ buffer ][ activeBuffer ]; - activeBuffer = activeDoubleBuffer[ buffer ]; - currentActiveBufCount = commBufferByteCount[ buffer ][ activeBuffer ]; + // check to make sure buffer is not too full to service this add + if ( len <= ( COMM_BUFFER_LENGTH - currentActiveBufCount ) ) + { + U08 *buffPtr; // buffer destination for added data - // check to make sure buffer is not too full to service this add - if ( len <= ( COMM_BUFFER_LENGTH - currentActiveBufCount ) ) - { - U08 *buffPtr; // buffer destination for added data + // set destination pointer to end of active buffer data + buffPtr = &commBuffers[ buffer ][ activeBuffer ][ currentActiveBufCount ]; + // copy source data to destination buffer + memcpy( buffPtr, data, len ); + // adjust buffer count per this data add (also reserves space to add data before releasing thread protection) + commBufferByteCount[ buffer ][ activeBuffer ] += len; + // data successfully added to buffer + result = TRUE; + } + else // buffer too full to add this much data + { + bufferFull = TRUE; + } + // release thread protection + _enable_IRQ(); + } - // set destination pointer to end of active buffer data - buffPtr = &commBuffers[ buffer ][ activeBuffer ][ currentActiveBufCount ]; - // copy source data to destination buffer - memcpy( buffPtr, data, len ); - // adjust buffer count per this data add (also reserves space to add data before releasing thread protection) - commBufferByteCount[ buffer ][ activeBuffer ] += len; - // data successfully added to buffer - result = TRUE; - } - else // buffer too full to add this much data - { - bufferFull = TRUE; - } - // release thread protection - _enable_IRQ(); // if buffer was full, check persistence - trigger s/w fault if persists if ( TRUE == bufferFull ) { @@ -162,7 +169,7 @@ // if buffer overflows persists, fault if ( calcTimeSince( firstBufferOverflowTimeStamp ) > BUFFER_OVERFLOW_PERSISTENCE_MS ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, len ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, (U32)buffer ) } } else // first overflow - set time stamp for persistence check @@ -180,7 +187,7 @@ } else // invalid buffer given { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_ADD_INVALID_BUFFER, buffer ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_ADD_INVALID_BUFFER, buffer ) } return result; @@ -241,7 +248,7 @@ } else // invalid buffer given { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_GET_INVALID_BUFFER, buffer ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_GET_INVALID_BUFFER, buffer ) } return result; @@ -299,7 +306,7 @@ } else // invalid buffer given { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_PEEK_INVALID_BUFFER, buffer ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_PEEK_INVALID_BUFFER, buffer ) } return numOfBytesPeeked; @@ -330,7 +337,7 @@ } else // invalid buffer { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_COUNT_INVALID_BUFFER, buffer ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_COMM_BUFFERS_COUNT_INVALID_BUFFER, buffer ) } return result; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r439894cb0508e69af3ece09ae57a62feac09e3f2 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 439894cb0508e69af3ece09ae57a62feac09e3f2) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -44,7 +44,7 @@ #define FPGA_HEADER_START_ADDR 0x0000 #define FPGA_BULK_READ_START_ADDR 0x0100 -#define FPGA_BULK_WRITE_START_ADDR 0x000C +#define FPGA_BULK_WRITE_START_ADDR 0x000E #define FPGA_WRITE_CMD_BUFFER_LEN (FPGA_PAGE_SIZE+8) #define FPGA_READ_CMD_BUFFER_LEN 8 @@ -434,7 +434,7 @@ default: if ( fpgaState >= NUM_OF_FPGA_STATES ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_IN_STATE, fpgaState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_IN_STATE, fpgaState ) } else { @@ -484,7 +484,7 @@ default: if ( fpgaState >= NUM_OF_FPGA_STATES ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_OUT_STATE, fpgaState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_INVALID_OUT_STATE, fpgaState ) } else { @@ -737,7 +737,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, bytes2Transmit ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, bytes2Transmit ) } } @@ -777,7 +777,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_WRITE_RSP_TOO_MUCH_DATA, bytes2Receive ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_WRITE_RSP_TOO_MUCH_DATA, bytes2Receive ) } } @@ -817,7 +817,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_READ_CMD_TOO_MUCH_DATA, bytes2Transmit ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_READ_CMD_TOO_MUCH_DATA, bytes2Transmit ) } } @@ -857,7 +857,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_READ_RSP_TOO_MUCH_DATA, bytes2Receive ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_READ_RSP_TOO_MUCH_DATA, bytes2Receive ) } } Index: firmware/App/Services/Interrupts.c =================================================================== diff -u -r439894cb0508e69af3ece09ae57a62feac09e3f2 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 439894cb0508e69af3ece09ae57a62feac09e3f2) +++ firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * @@ -24,13 +24,21 @@ #include "Interrupts.h" #include "FPGA.h" #include "SystemComm.h" +#include "Utilities.h" #ifdef DEBUG_ENABLED #include "SystemCommMessages.h" -#endif +#endif +/** + * @addtogroup Interrupts + * @{ + */ + // ********** private definitions ********** + +#define MAX_COMM_ERRORS 5 ///< Maximum number of a given comm error for a given time window. +#define COMM_ERROR_TIME_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< Time window for comm error counts. - // ********** private data ********** #ifdef DEBUG_ENABLED @@ -46,24 +54,49 @@ static U32 can1ParityCnt = 0; // ********** private function prototypes ********** + +/*********************************************************************//** + * @brief + * The initInterrupts function initializes the Interrupts module. + * @details + * Inputs : none + * Outputs : Interrupts module initialized. + * @return none + *************************************************************************/ +void initInterrupts( void ) +{ + // initialize various time windowed counts for monitoring CAN & UART errors and warnings + initTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PASSIVE, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); + initTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_OFF, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); + initTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PARITY, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); + initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_UART_FRAME_ERROR, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); + initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_UART_OVERRUN, MAX_COMM_ERRORS, COMM_ERROR_TIME_WINDOW_MS ); +} - -/************************************************************************* - * @brief phantomInterrupt +/*********************************************************************//** + * @brief * The phantomInterrupt function handles phantom interrupts. * @details * Inputs : none * Outputs : phantom interrupt handled. - * @param none * @return none *************************************************************************/ void phantomInterrupt(void) { // TODO - what to do with phantom interrupts? +#ifdef DEBUG_ENABLED + { + char debugStr[ 256 ]; + + sprintf( debugStr, "DG-phantom interrupt\n" ); + sendDebugData( (U08*)debugStr, strlen(debugStr) ); + sendDebugDataToUI( (U08*)debugStr ); + } +#endif } -/************************************************************************* - * @brief canMessageNotification +/*********************************************************************//** + * @brief * The canMessageNotification function handles CAN message notifications. * @details * Inputs : none @@ -80,8 +113,8 @@ } } -/************************************************************************* - * @brief canErrorNotification +/*********************************************************************//** + * @brief * The canErrorNotification function handles CAN error notifications. * @details * Inputs : none @@ -104,6 +137,10 @@ if ( notification & canLEVEL_PARITY_ERR ) { can1ParityCnt++; + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PARITY ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CAN_PARITY_ERROR ) + } #ifdef DEBUG_ENABLED sprintf( debugStr, "CAN parity error:%5d \n", can1ParityCnt ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); @@ -113,6 +150,10 @@ else if ( notification & canLEVEL_BUS_OFF ) { can1BusOffCnt++; + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_OFF ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CAN_OFF_ERROR ) + } #ifdef DEBUG_ENABLED sprintf( debugStr, "CAN bus off error:%5d \n", can1BusOffCnt ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); @@ -131,6 +172,10 @@ else if ( notification & canLEVEL_PASSIVE ) { can1PassiveCnt++; + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_CAN_PASSIVE ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_CAN_PASSIVE_WARNING ) + } #ifdef DEBUG_ENABLED sprintf( debugStr, "CAN passive warning:%5d \n", can1PassiveCnt ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); @@ -144,8 +189,8 @@ } } -/************************************************************************* - * @brief sciNotification +/*********************************************************************//** + * @brief * The sciNotification function handles UART communication error interrupts. \n * Frame and Over-run errors are handled. * @details @@ -168,6 +213,10 @@ { sci2FrameErrorCnt++; clearSCI2CommErrors(); + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_UART_FRAME_ERROR ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_UART_FRAME_ERROR ) + } // TODO - try to do something to recover (+ max retries = comm fault) #ifdef DEBUG_ENABLED sprintf( debugStr, "FPGA UART FR err:%5d \n", sci2FrameErrorCnt ); @@ -179,6 +228,10 @@ { sci2OverrunErrorCnt++; clearSCI2CommErrors(); + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_UART_OVERRUN ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_FPGA_UART_OVERRUN_ERROR ) + } // TODO - try to do something to recover (+ max retries = comm fault) #ifdef DEBUG_ENABLED sprintf( debugStr, "FPGA UART OR err:%5d \n", sci2OverrunErrorCnt ); @@ -212,8 +265,8 @@ #endif } -/************************************************************************* - * @brief dmaGroupANotification +/*********************************************************************//** + * @brief * The dmaGroupANotification function handles communication DMA interrupts. * @details * Inputs : none @@ -258,4 +311,5 @@ } } } - + +/**@}*/ Index: firmware/App/Services/Interrupts.h =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/Interrupts.h (.../Interrupts.h) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Services/Interrupts.h (.../Interrupts.h) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -20,8 +20,20 @@ #include "DGCommon.h" +/** + * @defgroup Interrupts Interrupts + * @brief Interrupts module handles various peripheral interrupts. + * + * @addtogroup Interrupts + * @{ + */ + // ********** public definitions ********** // ********** public function prototypes ********** + +void initInterrupts( void ); + +/**@}*/ #endif Index: firmware/App/Services/MsgQueues.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/MsgQueues.c (.../MsgQueues.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Services/MsgQueues.c (.../MsgQueues.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -86,12 +86,12 @@ } else // msg queue is full { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_ADD_QUEUE_FULL ) + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_ADD_QUEUE_FULL ) } } else // invalid message queue { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, queue ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, queue ) } return result; @@ -133,7 +133,7 @@ } else // invalid message queue { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_GET_INVALID_QUEUE, queue ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_GET_INVALID_QUEUE, queue ) } return result; @@ -162,7 +162,7 @@ } else // invalid message queue { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_IS_EMPTY_INVALID_QUEUE, queue ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_IS_EMPTY_INVALID_QUEUE, queue ) } return result; @@ -191,7 +191,7 @@ } else // invalid message queue { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, queue ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, queue ) } return result; Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -99,7 +99,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) } } @@ -129,7 +129,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) } } @@ -175,7 +175,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) } return result; @@ -234,13 +234,13 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, (U32)signalID ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, (U32)signalID ) break; } // end of switch } else { // invalid controller given - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) } return output; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -33,13 +33,13 @@ // ********** private definitions ********** #define MIN_RESERVOIR_VOLUME_ML 0 ///< Minimum reservoir volume in mL. -#define MAX_RESERVOIR_VOLUME_ML 2000 ///< Maximum reservoir volume in mL. +#define MAX_RESERVOIR_VOLUME_ML 1950 ///< Maximum reservoir volume in mL. #define DEFAULT_FILL_VOLUME_ML 1700 ///< Default fill volume for treatment in mL. #define DISINFECT_FILL_VOLUME_ML 2400 ///> Fill volume for disinfection in mL. #define MAX_FILL_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum fill volume in mL. #define DEFAULT_DRAIN_VOLUME_ML 100 ///> Default drain volume in mL. #define MAX_DRAIN_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum drain volume in mL. -#define MIN_DRAIN_VOLUME_ML 20 ///> Minimum drain volume in mL. +#define MIN_DRAIN_VOLUME_ML 0 ///> Minimum drain volume in mL. #define RESERVOIR_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the reservoir data is published on the CAN bus. Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * @@ -28,31 +28,38 @@ #include "Utilities.h" #include "SystemCommMessages.h" +/** + * @addtogroup SystemComm + * @{ + */ + // ********** private definitions ********** -#define NUM_OF_CAN_OUT_BUFFERS 5 // # of CAN buffers for transmit -#define NUM_OF_CAN_IN_BUFFERS 6 // # of CAN buffers for receiving +#define NUM_OF_CAN_OUT_BUFFERS 5 ///< # of CAN buffers for transmit +#define NUM_OF_CAN_IN_BUFFERS 6 ///< # of CAN buffers for receiving #ifndef DEBUG_ENABLED - #define NUM_OF_MSG_IN_BUFFERS 6 // # of Msg buffers for receiving + #define NUM_OF_MSG_IN_BUFFERS 6 ///< # of Msg buffers for receiving #else - #define NUM_OF_MSG_IN_BUFFERS 7 // # of Msg buffers for receiving - 1 is UART + #define NUM_OF_MSG_IN_BUFFERS 7 #define SCI1_RECEIVE_DMA_REQUEST 30 #define SCI1_TRANSMIT_DMA_REQUEST 31 #endif #define CAN_XMIT_PACKET_TIMEOUT_MS 200 ///< if transmitted CAN frame does not cause a transmit complete interrupt within this time, re-send or move on +#define MAX_XMIT_RETRIES 5 ///< maximum number of retries on no transmit complete interrupt timeout -#define HD_COMM_TIMEOUT_IN_MS 2000 +#define HD_COMM_TIMEOUT_IN_MS 2000 ///< HD has not sent any broadcast messages for this much time -#define MAX_COMM_CRC_FAILURES 5 -#define MAX_COMM_CRC_FAILURE_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) +#define MAX_COMM_CRC_FAILURES 5 ///< maximum number of CRC errors within window period before alarm +#define MAX_COMM_CRC_FAILURE_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< CRC error window -#define MSG_NOT_ACKED_TIMEOUT_MS ( MS_PER_SECOND * 1 ) -#define MSG_NOT_ACKED_MAX_RETRIES 3 -#define PENDING_ACK_LIST_SIZE 25 +#define MSG_NOT_ACKED_TIMEOUT_MS ( MS_PER_SECOND * 1 ) ///< maximum time for a Denali message that requires ACK to be ACK'd +#define MSG_NOT_ACKED_MAX_RETRIES 3 ///< maximum number of times a message that requires ACK that was not ACK'd can be re-sent before alarm +#define PENDING_ACK_LIST_SIZE 25 ///< maximum number of Delanli messages that can be pending ACK at any given time #pragma pack(push, 1) - + +/// Record for transmitted message that is pending acknowledgement from receiver. typedef struct { BOOL used; @@ -67,7 +74,8 @@ #pragma pack(pop) // ********** private data ********** - + +/// Array of out-going CAN buffers. const COMM_BUFFER_T CAN_OUT_BUFFERS[ NUM_OF_CAN_OUT_BUFFERS ] = { COMM_BUFFER_OUT_CAN_DG_ALARM, @@ -76,7 +84,8 @@ COMM_BUFFER_OUT_CAN_PC, COMM_BUFFER_OUT_CAN_DG_2_UI }; - + +/// Array of in-coming CAN buffers. const COMM_BUFFER_T MSG_IN_BUFFERS[ NUM_OF_MSG_IN_BUFFERS ] = { COMM_BUFFER_IN_CAN_HD_ALARM, @@ -90,38 +99,30 @@ #endif }; -static U08 lastCANPacketSent[ CAN_MESSAGE_PAYLOAD_SIZE ]; -static CAN_MESSAGE_BOX_T lastCANPacketSentChannel = (CAN_MESSAGE_BOX_T)0; -static U32 lastCANPacketSentTimeStamp = 0; +static U08 lastCANPacketSent[ CAN_MESSAGE_PAYLOAD_SIZE ]; ///< Keep last packet sent on CAN bus in case we need to re-send. +static CAN_MESSAGE_BOX_T lastCANPacketSentChannel = (CAN_MESSAGE_BOX_T)0; ///< Keep channel last packet was sent on CAN bus in case we need to re-send. +static U32 lastCANPacketSentTimeStamp = 0; ///< Keep time last packet sent on CAN bus so we can timeout on transmission attempt. -#ifdef DEBUG_ENABLED -static U08 pcXmitPacket[ 1024 ]; -static U08 pcRecvPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -#endif +static PENDING_ACK_RECORD_T pendingAckList[ PENDING_ACK_LIST_SIZE ]; ///< list of outgoing messages that are awaiting an ACK -static PENDING_ACK_RECORD_T pendingAckList[ PENDING_ACK_LIST_SIZE ]; // list of outgoing messages that are awaiting an ACK +static volatile BOOL dgIsOnlyCANNode = TRUE; ///< flag indicating whether DG is alone on CAN bus. +static U32 canXmitRetryCtr = 0; ///< counter for CAN transmit retries. +static volatile BOOL hdIsCommunicating = FALSE; ///< has HD sent a message since last check +static volatile U32 timeOfLastHDCheckIn = 0; ///< last time we received an HD broadcast -// DMA control records -static g_dmaCTRL pcDMAXmitControlRecord; // DMA transmit control record (UART-debug) -static g_dmaCTRL pcDMARecvControlRecord; // DMA receive control record (UART-debug) - -static volatile BOOL hdIsCommunicating = FALSE; // has HD sent a message since last check -static volatile U32 timeOfLastHDCheckIn = 0; // last time we received an HD broadcast - -static U32 badCRCTimeStamps[ MAX_COMM_CRC_FAILURES ]; // time of last five bad message CRCs (wrapping list) -static U32 badCRCListIdx = 0; // where next bad message CRC time stamp will go in list -static U32 badCRCListCount = 0; // # of bad CRCs in the list - +#ifdef DEBUG_ENABLED + // debug buffers + static U08 pcXmitPacket[ 1024 ]; + static U08 pcRecvPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + // DMA control records + static g_dmaCTRL pcDMAXmitControlRecord; + static g_dmaCTRL pcDMARecvControlRecord; +#endif + // ********** private function prototypes ********** -#ifdef DEBUG_ENABLED - static void initUARTAndDMA( void ); - static U32 transmitNextUARTPacket( void ); -#endif +static void clearCANXmitBuffers( void ); -static BOOL isCANBoxForXmit( CAN_MESSAGE_BOX_T srcCANBox ); -static BOOL isCANBoxForRecv( CAN_MESSAGE_BOX_T srcCANBox ); - static COMM_BUFFER_T findNextHighestPriorityCANPacketToTransmit( void ); static U32 transmitNextCANPacket( void ); @@ -137,13 +138,17 @@ static BOOL matchACKtoPendingACKList( S16 seqNo ); static void checkPendingACKList( void ); -/************************************************************************* - * @brief initSystemComm +#ifdef DEBUG_ENABLED + static void initUARTAndDMA( void ); + static U32 transmitNextUARTPacket( void ); +#endif + +/*********************************************************************//** + * @brief * The initSystemComm function initializes the SystemComm module. * @details * Inputs : none * Outputs : SystemComm module initialized. - * @param none * @return none *************************************************************************/ void initSystemComm( void ) @@ -155,41 +160,50 @@ initUARTAndDMA(); #endif - // initialize bad message CRC list - for ( i = 0; i < MAX_COMM_CRC_FAILURES; i++ ) - { - badCRCTimeStamps[ i ] = 0; - } - + // initialize bad message CRC time windowed count + initTimeWindowedCount( TIME_WINDOWED_COUNT_BAD_MSG_CRC, MAX_COMM_CRC_FAILURES, MAX_COMM_CRC_FAILURE_WINDOW_MS ); + // initialize pending ACK list for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) { pendingAckList[ i ].used = FALSE; } } -/************************************************************************* +/*********************************************************************//** * @brief * The isHDCommunicating function determines whether the HD is communicating \n * with the DG. * @details * Inputs : hdIsCommunicating * Outputs : none - * @param none * @return TRUE if HD has broadcast since last call, FALSE if not *************************************************************************/ BOOL isHDCommunicating( void ) { return hdIsCommunicating; +} + +/*********************************************************************//** + * @brief + * The isDGOnlyCANNode function determines whether the DG is the only node \n + * currently on the CAN bus. + * @details + * Inputs : dgIsOnlyCANNode + * Outputs : none + * @return TRUE if DG is only node on CAN bus, FALSE if not + *************************************************************************/ +BOOL isDGOnlyCANNode( void ) +{ + return dgIsOnlyCANNode; } -/************************************************************************* - * @brief execSystemCommRx +/*********************************************************************//** + * @brief * The execSystemCommRx function manages received data from other sub-systems. * @details * Inputs : none - * Outputs : none - * @param none + * Outputs : Incoming frames processed. * @return none *************************************************************************/ void execSystemCommRx( void ) @@ -207,30 +221,53 @@ checkPendingACKList(); } -/************************************************************************* - * @brief execSystemCommTx +/*********************************************************************//** + * @brief * The execSystemCommTx function manages data to be transmitted to other \n * sub-systems. * @details * Inputs : none - * Outputs : none - * @param none + * Outputs : Next outgoing frame transmitted. * @return none *************************************************************************/ void execSystemCommTx( void ) { // if CAN transmitter is idle, start transmitting any pending packets - if ( FALSE == isCAN1TransmitInProgress() ) + if ( ( FALSE == dgIsOnlyCANNode ) && ( FALSE == isCAN1TransmitInProgress() ) ) { transmitNextCANPacket(); } else { // generally, transmitter should not be busy at time of this function call - check timeout just in case so we don't get stuck waiting forever if ( TRUE == didTimeout( lastCANPacketSentTimeStamp, CAN_XMIT_PACKET_TIMEOUT_MS ) ) - { - // TODO - depending on why we timed out, we may need to reset CAN controller??? - // assume last packet was not successfully transmitted. TODO - Re-send last packet? Or should we move on? - canTransmit( canREG1, lastCANPacketSentChannel, lastCANPacketSent ); + { + // assume last packet was not successfully transmitted. Re-send last packet. + if ( ++canXmitRetryCtr <= MAX_XMIT_RETRIES ) + { + canTransmit( canREG1, lastCANPacketSentChannel, lastCANPacketSent ); +#ifdef DEBUG_ENABLED + { + char debugStr[100]; + sprintf( debugStr, "SystemComm-DG resend Last Frame.\n" ); + sendDebugDataToUI( (U08*)debugStr ); + } +#endif + } + // we must be only node on CAN bus - nobody is ACKing our transmitted frames + else + { + dgIsOnlyCANNode = TRUE; // set only CAN node flag + canXmitRetryCtr = MAX_XMIT_RETRIES; + signalCANXmitsCompleted(); // clear pending xmit flag + clearCANXmitBuffers(); // clear xmit buffers - nothing is going out right now +#ifdef DEBUG_ENABLED + { + char debugStr[100]; + sprintf( debugStr, "SystemComm-DG is only node.\n" ); + sendDebugDataToUI( (U08*)debugStr ); + } +#endif + } } } @@ -243,8 +280,8 @@ #endif } -/************************************************************************* - * @brief handleCANMsgInterrupt +/*********************************************************************//** + * @brief * The handleCANMsgInterrupt function handles a CAN message interrupt. \n * This may have occurred because a CAN packet transmission has completed \n * or because a CAN packet has been received. The appropriate handler is \n @@ -291,14 +328,13 @@ } } -/************************************************************************* - * @brief handleUARTMsgRecvPacketInterrupt +/*********************************************************************//** + * @brief * The handleUARTMsgRecvPacketInterrupt function handles a DMA UART receive \n * packet completed interrupt. * @details * Inputs : none * Outputs : none - * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED @@ -313,14 +349,13 @@ } #endif -/************************************************************************* - * @brief handleUARTMsgXmitPacketInterrupt +/*********************************************************************//** + * @brief * The handleUARTMsgXmitPacketInterrupt function handles a DMA UART transmit \n * packet completed interrupt. * @details * Inputs : none * Outputs : none - * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED @@ -335,14 +370,13 @@ } #endif -/************************************************************************* - * @brief initUARTAndDMA +/*********************************************************************//** + * @brief * The initUARTAndDMA function initializes the SCI1 peripheral and the DMA \n * to go with it for PC communication. * @details * Inputs : none * Outputs : SCI1 and DMA initialized - * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED @@ -401,8 +435,8 @@ } #endif -/************************************************************************* - * @brief isCANBoxForXmit +/*********************************************************************//** + * @brief * The isCANBoxForXmit function determines whether a given CAN message box \n * is configured for transmit. * @details @@ -411,7 +445,7 @@ * @param srcCANBox : which CAN message box to check * @return TRUE if the given CAN message box is configured for transmit, FALSE if not. *************************************************************************/ -static BOOL isCANBoxForXmit( CAN_MESSAGE_BOX_T srcCANBox ) +BOOL isCANBoxForXmit( CAN_MESSAGE_BOX_T srcCANBox ) { BOOL result = FALSE; U32 i; @@ -428,8 +462,8 @@ return result; } -/************************************************************************* - * @brief isCANBoxForRecv +/*********************************************************************//** + * @brief * The isCANBoxForRecv function determines whether a given CAN message box \n * is configured for receiving. * @details @@ -438,7 +472,7 @@ * @param srcCANBox : which CAN message box to check * @return TRUE if the given CAN message box is configured for receiving, FALSE if not. *************************************************************************/ -static BOOL isCANBoxForRecv( CAN_MESSAGE_BOX_T srcCANBox ) +BOOL isCANBoxForRecv( CAN_MESSAGE_BOX_T srcCANBox ) { BOOL result = FALSE; U32 i; @@ -453,6 +487,24 @@ } return result; +} + +/*********************************************************************//** + * @brief + * The clearCANXmitBuffers function clears all CAN transmit buffers. + * @details + * Inputs : CAN_OUT_BUFFERS[] + * Outputs : CAN transmit buffers cleared. + * @return none + *************************************************************************/ +static void clearCANXmitBuffers( void ) +{ + U32 i; + + for ( i = 0; i < NUM_OF_CAN_OUT_BUFFERS; i++ ) + { + clearBuffer( CAN_OUT_BUFFERS[ i ] ); + } } @@ -461,14 +513,13 @@ *************************************************************************/ -/************************************************************************* - * @brief findNextHighestPriorityCANPacketToTransmit +/*********************************************************************//** + * @brief * The findNextHighestPriorityCANPacketToTransmit function gets the next \n * 8 byte packet and initiates a CAN transmit on the appropriate CAN channel. \n * @details * Inputs : Output CAN Comm Buffer(s) * Outputs : none - * @param msg : none * @return buffer with highest priority CAN packet to transmit, \n * COMM_BUFFER_NOT_USED if not CAN packets pending transmit found *************************************************************************/ @@ -490,14 +541,13 @@ return result; } -/************************************************************************* - * @brief transmitNextCANPacket +/*********************************************************************//** + * @brief * The transmitNextCANPacket function gets the next 8 byte packet and initiates \n * a CAN transmit on the appropriate CAN channel. * @details * Inputs : Output CAN Comm Buffers * Outputs : CAN packet transmit initiated. - * @param msg : none * @return # of bytes transmitted *************************************************************************/ static U32 transmitNextCANPacket( void ) @@ -529,26 +579,25 @@ { signalCANXmitsCompleted(); // TODO - shouldn't get here, but let's see if we do - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_SOFTWARE_FAULT, (U32)mBox ) + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, (U32)mBox ) } } else { // TODO - shouldn't get here - just testing - set first data to new s/w fault enum later - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, (U32)buffer, (U32)dataSize ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, (U32)buffer, (U32)dataSize ) } } return result; } -/************************************************************************* - * @brief transmitNextUARTPacket +/*********************************************************************//** + * @brief * The transmitNextUARTPacket function sets up and initiates a DMA transmit \n * of the next packet pending transmit (if any) via UART. * @details * Inputs : Output UART Comm Buffer(s) * Outputs : UART DMA transmit initiated. - * @param msg : none * @return # of bytes transmitted *************************************************************************/ #ifdef DEBUG_ENABLED @@ -582,14 +631,13 @@ *************************************************************************/ -/************************************************************************* - * @brief processIncomingData +/*********************************************************************//** + * @brief * The processIncomingData function parses out messages from the Input \n * Comm Buffers and adds them to the Received Message Queue. * @details * Inputs : Input Comm Buffers * Outputs : Parsed message(s) added to Received Message Queue - * @param msg : none * @return none *************************************************************************/ static void processIncomingData( void ) @@ -619,6 +667,9 @@ U32 bytesPeeked = peekFromCommBuffer( MSG_IN_BUFFERS[ i ], data, MIN( numOfBytesInBuffer, sizeof( MESSAGE_WRAPPER_T ) + 1 ) ); S32 msgSize = parseMessageFromBuffer( data, bytesPeeked ); + dgIsOnlyCANNode = FALSE; // if we're getting a message, we can't be alone + canXmitRetryCtr = 0; + if ( msgSize > 0 ) // valid, complete message found? { MESSAGE_WRAPPER_T rcvMsg; @@ -643,7 +694,7 @@ // if message from HD broadcast channel, update HD comm status if ( COMM_BUFFER_IN_CAN_HD_BROADCAST == MSG_IN_BUFFERS[ i ] ) { - hdIsCommunicating = TRUE; + hdIsCommunicating = TRUE; timeOfLastHDCheckIn = getMSTimerCount(); } } @@ -664,13 +715,13 @@ } } -/************************************************************************* - * @brief consumeBufferPaddingBeforeSync +/*********************************************************************//** + * @brief * The consumeBufferPaddingBeforeSync function removes any bytes in a given \n * buffer that lie before a sync byte. * @details * Inputs : none - * Outputs : none + * Outputs : Any padding at front of comm buffer is consumed. * @param msg : buffer : the comm buffer to process * @return none *************************************************************************/ @@ -695,13 +746,13 @@ } } -/************************************************************************* - * @brief parseMessageFromBuffer +/*********************************************************************//** + * @brief * The parseMessageFromBuffer function looks for a complete message in a \n * given buffer. If a message is found, its size is returned. * @details * Inputs : none - * Outputs : none + * Outputs : If a complete message can be found in buffer contents, it is parsed out. * @param data : pointer to byte array to search for a message * @param len : # of bytes in the data to search * @return size of message if found, zero if no complete message found, \n @@ -747,14 +798,13 @@ return result; } -/************************************************************************* - * @brief processReceivedMessages +/*********************************************************************//** + * @brief * The processReceivedMessages function processes any messages in the \n * received message queues. * @details * Inputs : Received Message Queues * Outputs : Message(s) processed. - * @param msg : none * @return none *************************************************************************/ static void processReceivedMessages( void ) @@ -794,14 +844,13 @@ } } -/************************************************************************* - * @brief checkForCommTimeouts +/*********************************************************************//** + * @brief * The checkForCommTimeouts function checks for sub-system communication \n * timeout errors. * @details * Inputs : timeOfLastDGCheckIn, timeOfLastUICheckIn * Outputs : possibly a comm t/o alarm - * @param none * @return none *************************************************************************/ static void checkForCommTimeouts( void ) @@ -815,8 +864,8 @@ } } -/************************************************************************* - * @brief checkTooManyBadMsgCRCs +/*********************************************************************//** + * @brief * The checkTooManyBadMsgCRCs function checks for too many bad message CRCs \n * within a set period of time. Assumed function is being called when a new \n * bad CRC is detected so a new bad CRC will be added to the list. @@ -826,25 +875,22 @@ * @return none *************************************************************************/ static void checkTooManyBadMsgCRCs( void ) -{ - U32 listTimeInMS; - - // replace oldest bad CRC in list with this new one - badCRCTimeStamps[ badCRCListIdx ] = getMSTimerCount(); - // move list index to next position (may wrap) - badCRCListIdx = INC_WRAP( badCRCListIdx, 0, MAX_COMM_CRC_FAILURES - 1 ); - // update list count - badCRCListCount = INC_CAP( badCRCListCount, MAX_COMM_CRC_FAILURES ); - // check if too many bad CRCs in window of time - listTimeInMS = calcTimeSince( badCRCTimeStamps[ badCRCListIdx ] ); - if ( ( badCRCListCount >= MAX_COMM_CRC_FAILURES ) && ( listTimeInMS <= MAX_COMM_CRC_FAILURE_WINDOW_MS ) ) - { - activateAlarmNoData( ALARM_ID_COMM_TOO_MANY_BAD_CRCS ); +{ + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_BAD_MSG_CRC ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_COMM_TOO_MANY_BAD_CRCS, 2 ); // 2 for DG } +#ifdef DEBUG_ENABLED + { + char debugStr[100]; + sprintf( debugStr, "SystemComm-DG-Bad Msg CRC.\n" ); + sendDebugDataToUI( (U08*)debugStr ); + } +#endif } -/************************************************************************* - * @brief addMsgToPendingACKList +/*********************************************************************//** + * @brief * The addMsgToPendingACKList function adds a given message to the pending \n * ACK list. Messages in this list will require receipt of an ACK message \n * for this particular message within a limited time. @@ -889,8 +935,8 @@ return result; } -/************************************************************************* - * @brief matchACKtoPendingACKList +/*********************************************************************//** + * @brief * The matchACKtoPendingACKList function searches the pending ACK list to \n * see if the sequence # from a received ACK msg matches any. If found, \n * the list entry is removed. @@ -919,15 +965,14 @@ return result; } -/************************************************************************* - * @brief checkPendingACKList +/*********************************************************************//** + * @brief * The checkPendingACKList function searches the pending ACK list to \n * see if any have expired. Any such messages will be queued for retransmission \n * and if max retries reached a fault is triggered. * @details * Inputs : pendingAckList[] * Outputs : pendingAckList[] - * @param none * @return none *************************************************************************/ static void checkPendingACKList( void ) @@ -956,8 +1001,8 @@ } } -/************************************************************************* - * @brief processReceivedMessage +/*********************************************************************//** + * @brief * The processReceivedMessage function processes a given message. * @details * Inputs : none @@ -1103,4 +1148,5 @@ } } } - + +/**@}*/ Index: firmware/App/Services/SystemComm.h =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/SystemComm.h (.../SystemComm.h) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Services/SystemComm.h (.../SystemComm.h) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * @@ -22,23 +22,31 @@ #include "CommBuffers.h" #include "MsgQueues.h" +/** + * @defgroup SystemComm SystemComm + * @brief System communication module. Manages incoming and outgoing CAN frames. + * + * @addtogroup SystemComm + * @{ + */ + // ********** public definitions ********** -#define MESSAGE_SYNC_BYTE 0xA5 +#define MESSAGE_SYNC_BYTE 0xA5 ///< Denali message syncronization byte. -#define CAN_MESSAGE_PAYLOAD_SIZE 8 +#define CAN_MESSAGE_PAYLOAD_SIZE 8 ///< CAN frame payload size (in bytes). #ifdef DEBUG_ENABLED #define PC_MESSAGE_PACKET_SIZE 8 #endif -#define MSG_ID_ACK 0xFFFF -#define MSG_ACK_BIT 0x8000 -#define MAX_MSG_SEQ_NO 0x7FFF -#define MIN_MSG_SEQ_NO 0x0001 -#define MAX_ACK_MSG_SIZE ( sizeof( MESSAGE_WRAPPER_T ) + 1 + CAN_MESSAGE_PAYLOAD_SIZE ) // must hold full (wrapped) message + sync + any CAN padding +#define MSG_ID_ACK 0xFFFF ///< Denali message ID for acknowledging received messages (when required). +#define MSG_ACK_BIT 0x8000 ///< ACK bit in sequence number that indicates an ACK is required. +#define MAX_MSG_SEQ_NO 0x7FFF ///< Maximum sequence number for Denali message (then wraps to 1). +#define MIN_MSG_SEQ_NO 0x0001 ///< Minimum sequence number for Denali message. +#define MAX_ACK_MSG_SIZE ( sizeof( MESSAGE_WRAPPER_T ) + 1 + CAN_MESSAGE_PAYLOAD_SIZE ) ///< Maximum size (in bytes) of Denali message including full (wrapped) message + sync + any CAN padding) + +typedef COMM_BUFFER_T CAN_MESSAGE_BOX_T; ///< the CAN comm buffers align with the active CAN message boxes -typedef COMM_BUFFER_T CAN_MESSAGE_BOX_T; // the first 12 comm buffers align with the 12 active CAN message boxes - // ********** public function prototypes ********** void initSystemComm( void ); @@ -49,7 +57,12 @@ void handleUARTMsgRecvPacketInterrupt( void ); void handleUARTMsgXmitPacketInterrupt( void ); #endif -BOOL isHDCommunicating( void ); +BOOL isCANBoxForXmit( CAN_MESSAGE_BOX_T srcCANBox ); +BOOL isCANBoxForRecv( CAN_MESSAGE_BOX_T srcCANBox ); +BOOL isHDCommunicating( void ); +BOOL isDGOnlyCANNode( void ); BOOL addMsgToPendingACKList( MESSAGE_T *msg, COMM_BUFFER_T channel, U08 *msgData, U32 len ); + +/**@}*/ #endif Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 3f3729899d6811c763bc8e5ef9baf54a2d5c9cfe) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -208,7 +208,7 @@ if ( FALSE == addMsgToPendingACKList( &msg, buffer, data, msgSize ) ) { error = TRUE; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL ) + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL ) } } Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -ra7bf3ca23ea37a61000379facae628a31b3ecc59 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision a7bf3ca23ea37a61000379facae628a31b3ecc59) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -192,7 +192,7 @@ default: result = SELF_TEST_STATUS_FAILED; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, watchdogSelfTestState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, watchdogSelfTestState ) break; } Index: firmware/source/sys_main.c =================================================================== diff -u -r3cc737c39b4440e18abab95ef2f8b6aef13acba9 -r8f5feed92f41a476d5656038bcdfe884e17bd593 --- firmware/source/sys_main.c (.../sys_main.c) (revision 3cc737c39b4440e18abab95ef2f8b6aef13acba9) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) @@ -68,6 +68,7 @@ #include "FPGA.h" #include "Heaters.h" #include "InternalADC.h" +#include "Interrupts.h" #include "LoadCell.h" #include "MsgQueues.h" #include "OperationModes.h" @@ -164,6 +165,7 @@ initCPLD(); initAlarmMgmt(); initWatchdogMgmt(); + initInterrupts(); initFPGA(); initInternalADC(); initPressures();