Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -rccf1219089b835ab2f9d401c0be0d2000be9010a -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision ccf1219089b835ab2f9d401c0be0d2000be9010a) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -252,10 +252,11 @@ // Convert speed ADC to RPM currentDrainPumpRPM = CONVERSION_COEFF / getFPGADrainPumpSpeed(); + // TODO this is disabled until RPM is calculated propely. // The RPM is only checked in open loop state that the pump is run at a fixed RPM. // The persistent alarm waits for a couple of seconds before raising an alarm, this is supposed to cover // when the pump is turned on and it takes a while to ramp up to target RPM. - if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) + /*if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) { U32 targetRPM = getTargetDrainPumpRPM(); F32 threshold = OPEN_LOOP_RPM_OUT_OF_RANGE * targetRPM; @@ -278,7 +279,7 @@ { activateSafetyShutdown(); } - } + }*/ // Publish drain pump data on interval publishDrainPumpData(); Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r853d846a60d61d1c6f8987d9cdcfc2bc32913840 -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 853d846a60d61d1c6f8987d9cdcfc2bc32913840) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -68,61 +68,61 @@ /// Heaters self-test enums typedef enum heaters_self_test_states { - HEATERS_SELF_TEST_START = 0, ///< Heaters self-test start state - HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS, ///< Heaters self-test small primary and trimmer heaters state - HEATERS_SELF_TEST_MAIN_PRIMARY_HEATER, ///< Heaters self-test start main primary state - HEATERS_SELF_TEST_COMPLETE, ///< Heaters self-test complete state - NUM_OF_HEATERS_SELF_TEST_STATES ///< Number of heaters self-test states + HEATERS_SELF_TEST_START = 0, ///< Heaters self-test start state + HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS, ///< Heaters self-test small primary and trimmer heaters state + HEATERS_SELF_TEST_MAIN_PRIMARY_HEATER, ///< Heaters self-test start main primary state + HEATERS_SELF_TEST_COMPLETE, ///< Heaters self-test complete state + NUM_OF_HEATERS_SELF_TEST_STATES ///< Number of heaters self-test states } HEATERS_SELF_TEST_STATES_T ; /// Primary heaters exec states typedef enum primary_heaters_exec_states { - PRIMARY_HEATERS_EXEC_STATE_OFF = 0, ///< Primary heaters exec state off - PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET, ///< Primary heaters exec state control to target (PI controller state) - NUM_OF_PRIMARY_HEATERS_EXEC_STATES ///< Number of primary heaters exec states + PRIMARY_HEATERS_EXEC_STATE_OFF = 0, ///< Primary heaters exec state off + PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET, ///< Primary heaters exec state control to target (PI controller state) + NUM_OF_PRIMARY_HEATERS_EXEC_STATES ///< Number of primary heaters exec states } PRIMARY_HEATERS_EXEC_STATES_T; /// Trimmer heater exec states typedef enum trimmer_heater_exec_states { - TRIMMER_HEATER_EXEC_STATE_OFF = 0, ///< Trimmer heater exec state off - TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET, ///< Trimmer heater exec state control to target (PI controller state) - NUM_OF_TRIMMER_HEATER_EXEC_STATES ///< Number of trimmer heater exec states + TRIMMER_HEATER_EXEC_STATE_OFF = 0, ///< Trimmer heater exec state off + TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET, ///< Trimmer heater exec state control to target (PI controller state) + NUM_OF_TRIMMER_HEATER_EXEC_STATES ///< Number of trimmer heater exec states } TRIMMER_HEATER_EXEC_STATES_T; /// Name of the heaters states typedef enum name_of_heaters { - PRIMARY_HEATER = 0, ///< Primary heater - TRIMMER_HEATER, ///< Trimmer heater - NUM_OF_HEATERS ///< Number of heaters + PRIMARY_HEATER = 0, ///< Primary heater + TRIMMER_HEATER, ///< Trimmer heater + NUM_OF_HEATERS ///< Number of heaters } NAME_OF_HEATER_T; // ********** private data ********** -static SELF_TEST_STATUS_T heatersSelfTestResult; ///< Heaters self-test results. -static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; ///< Heaters self-test state. -static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; ///< Primary heaters exec state. -static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; ///< Trimmer heater exec state. +static SELF_TEST_STATUS_T heatersSelfTestResult; ///< Heaters self-test results. +static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; ///< Heaters self-test state. +static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; ///< Primary heaters exec state. +static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; ///< Trimmer heater exec state. -static F32 primaryHeaterTargetTemperature; ///< Primary heaters target temperature. -static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature. +static F32 primaryHeaterTargetTemperature; ///< Primary heaters target temperature. +static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature. -static F32 mainPrimaryHeaterDutyCycle; ///< Main primary heater duty cycle. -static F32 smallPrimaryHeaterDutyCycle; ///< Small primary heater duty cycle. -static F32 trimmerHeaterDutyCycle; ///< Trimmer heater duty cycle. -static U32 primaryHeaterTimerCounter; ///< Primary heater timer counter. -static U32 trimmerHeaterTimerCounter; ///< Trimmer heater timer counter. -static U32 dataPublicationTimerCounter; ///< Data publication timer counter. -static BOOL isPrimaryHeaterOn; ///< Flag to show if the primary heater is on. -static BOOL isTrimmerHeaterOn; ///< Flag to show if the trimmer heater is on. +static F32 mainPrimaryHeaterDutyCycle; ///< Main primary heater duty cycle. +static F32 smallPrimaryHeaterDutyCycle; ///< Small primary heater duty cycle. +static F32 trimmerHeaterDutyCycle; ///< Trimmer heater duty cycle. +static U32 primaryHeaterTimerCounter; ///< Primary heater timer counter. +static U32 trimmerHeaterTimerCounter; ///< Trimmer heater timer counter. +static U32 dataPublicationTimerCounter; ///< Data publication timer counter. +static BOOL isPrimaryHeaterOn; ///< Flag to show if the primary heater is on. +static BOOL isTrimmerHeaterOn; ///< Flag to show if the trimmer heater is on. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, - HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. -static U32 selfTestElapsedTime; ///< Self-test elapsed time variable. -static BOOL hasStartPrimaryHeaterRequested; ///< Start primary heater request flag. -static BOOL hasStartTrimmerHeaterRequested; ///< Start trimmer heater request flag. + HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. +static U32 selfTestElapsedTime; ///< Self-test elapsed time variable. +static BOOL hasStartPrimaryHeaterRequested; ///< Start primary heater request flag. +static BOOL hasStartTrimmerHeaterRequested; ///< Start trimmer heater request flag. // ********** private function prototypes ********** Index: firmware/App/DGCommon.h =================================================================== diff -u -r55425a4c5370a6fa1faad61dc24fcd76b854d3ed -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 55425a4c5370a6fa1faad61dc24fcd76b854d3ed) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -32,12 +32,13 @@ #ifndef _RELEASE_ #ifndef _VECTORCAST_ // TODO: Removed debug build flags when release build is ready -// #define RM46_EVAL_BOARD_TARGET 1 + #define BOARD_WITH_NO_HARDWARE 1 // #define SIMULATE_UI 1 // #define TASK_TIMING_OUTPUT_ENABLED 1 // re-purposes drain pump enable pin for task timing // #define DISABLE_HEATERS_AND_TEMPS 1 #define DISABLE_ACCELS 1 #define SKIP_POST 1 + //#define DISABLE_CAL_CHECK 1 // #define ENABLE_DIP_SWITCHES 1 // #define EMC_TEST_BUILD 1 #define ALARMS_DEBUG 1 Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -re49f9b472c6006753e73c2ac263516558874b850 -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision e49f9b472c6006753e73c2ac263516558874b850) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -16,7 +16,8 @@ ***************************************************************************/ #include "AlarmMgmt.h" -#include "OperationModes.h" +#include "OperationModes.h" +#include "PersistentAlarm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" @@ -32,12 +33,12 @@ // ********** private data ********** -static OVERRIDE_U32_T alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of current state of each alarm +static OVERRIDE_U32_T alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of current state of each alarm +static BOOL alarmConditionIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of flag indicates if an alarm condition is active // ********** private function prototypes ********** static void activateAlarm( ALARM_ID_T alarm ); -static BOOL getAlarmActive( U32 alarmID ); /*********************************************************************//** * @brief @@ -56,7 +57,9 @@ alarmIsActive[ a ].data = FALSE; alarmIsActive[ a ].ovData = FALSE; alarmIsActive[ a ].ovInitData = TRUE; - alarmIsActive[ a ].override = OVERRIDE_RESET; + alarmIsActive[ a ].override = OVERRIDE_RESET; + + alarmConditionIsActive[ a ] = FALSE; } } @@ -86,10 +89,11 @@ if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { // no need to do anything if alarm is already active - if ( FALSE == getAlarmActive( alarm ) ) + if ( FALSE == isAlarmActive( alarm ) ) { // activate alarm - alarmIsActive[ alarm ].data = TRUE; + alarmIsActive[ alarm ].data = TRUE; + alarmConditionIsActive[ alarm ] = TRUE; } } else @@ -112,7 +116,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, blankAlarmData, blankAlarmData ); + broadcastAlarmTriggered( alarm, blankAlarmData, blankAlarmData ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -145,7 +149,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, alarmData, blankAlarmData ); + broadcastAlarmTriggered( alarm, alarmData, blankAlarmData ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -179,7 +183,7 @@ // broadcast alarm and data if alarm not already active if ( FALSE == alarmIsActive[ alarm ].data ) { - broadcastAlarmTriggered( (U16)alarm, alarmData1, alarmData2 ); + broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); #ifdef DEBUG_ENABLED #ifdef ALARMS_DEBUG { @@ -234,67 +238,86 @@ } } +/*********************************************************************//** + * @brief + * The clearAlarmCondition function clears a given alarm's condition detected + * flag. Also an alarm message is broadcast to the rest of the system. + * @details Inputs: none + * @details Outputs: alarmConditionIsActive[] + * @param alarm ID of alarm to clear condition for + * @return none + *************************************************************************/ +void clearAlarmCondition( ALARM_ID_T alarm ) +{ + // verify given alarm + if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + { + // clear alarm and broadcast alarm clear if not already cleared + if ( TRUE == alarmConditionIsActive[ alarm ] ) + { + broadcastAlarmConditionCleared( alarm ); + alarmConditionIsActive[ alarm ] = FALSE; + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, alarm ) + } +} + /*********************************************************************//** * @brief * The isAlarmActive function determines whether a given alarm is currently active. * @details Inputs: alarmIsActive[] * @details Outputs: none - * @param alarmID ID of alarm to check + * @param alarm ID of alarm to check * @return TRUE if given alarm is active, FALSE if not - *************************************************************************/ + *************************************************************************/ BOOL isAlarmActive( ALARM_ID_T alarm ) { - BOOL result = getAlarmActive( alarm ); - - return result; -} - -/*********************************************************************//** - * @brief - * The getAlarmActive function gets the active state of a given alarm. - * @details Inputs: alarmIsActive[] - * @details Outputs: none - * @param alarmID ID of alarm to check - * @return TRUE if given alarm is active, FALSE if not - *************************************************************************/ -static BOOL getAlarmActive( U32 alarmID ) -{ BOOL result = TRUE; - if ( alarmID < NUM_OF_ALARM_IDS ) + if ( alarm < NUM_OF_ALARM_IDS ) { - if ( OVERRIDE_KEY == alarmIsActive[ alarmID ].override ) + if ( OVERRIDE_KEY == alarmIsActive[ alarm ].override ) { - result = (BOOL)alarmIsActive[ alarmID ].ovData; + result = (BOOL)alarmIsActive[ alarm ].ovData; } else { - result = (BOOL)alarmIsActive[ alarmID ].data; + result = (BOOL)alarmIsActive[ alarm ].data; } } else { activateAlarmNoData( ALARM_ID_DG_SOFTWARE_FAULT ); } - return result; + return result; } /*********************************************************************//** * @brief - * The clearAlarmCondition function clears a given alarm's condition detected - * flag. Also an alarm message is broadcast to the rest of the system. + * The checkPersistentAlarm function triggers/clears an alarm if an alarm condition + * has persisted/cleared over given time limit. * @details Inputs: none - * @details Outputs: none - * @param alarm ID of alarm to clear condition for - * @return none + * @details Outputs: checks whether an alarm is triggered or an alarm condition is cleared + * @param alarmID ID of alarm to check + * @param isErrorOccured Flag indicates alarm condition is active or not + * @param data alarm data + * @param limit alarm condition limit + * @return TRUE if given alarm is active, FALSE if not *************************************************************************/ -void clearAlarmCondition( ALARM_ID_T alarm ) +void checkPersistentAlarm( ALARM_ID_T alarm, BOOL const isErrorOccured, F32 const data, F32 const limit ) { - // Verify given alarm - if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + if ( TRUE == isPersistentAlarmTriggered( alarm, isErrorOccured ) ) { - clearAlarm( alarm ); + SET_ALARM_WITH_2_F32_DATA( alarm, data, limit ); } + + if ( TRUE == isPersistentAlarmConditionCleared( alarm, isErrorOccured ) ) + { + clearAlarmCondition( alarm ); + } } /************************************************************************* Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -rac55f23681cd3a29ec235265f73c67895e36ada9 -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision ac55f23681cd3a29ec235265f73c67895e36ada9) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -163,7 +163,8 @@ SW_FAULT_ID_DRAIN_PUMP_INVALID_DELTA_PRESSURE_SELECTED, SW_FAULT_ID_INVALID_TEMPERATURE_SENSOR_SELECTED, SW_FAULT_ID_DRAIN_PUMP_INVALID_RPM_SELECTED, - SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, + SW_FAULT_ID_INVALID_NVDATAMGMT_EXEC_CAL_STATE, + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, // 75 NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r787312bd901f9c4c9d9e91591ecadca9f22fbeb6 -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 787312bd901f9c4c9d9e91591ecadca9f22fbeb6) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -1011,6 +1011,10 @@ handleSwitchReservoirCmd( message ); break; + case MSG_ID_DG_CHANGE_VALVE_SETTING_CMD: + handleChangeValveSettingCmd( message ); + break; + case MSG_ID_DG_FILL_CMD: handleFillCmd( message ); break; @@ -1230,8 +1234,15 @@ case MSG_ID_DG_SET_SCHEDULED_RUNS_RECORD: handleSetDGScheduledRunsRecord( message ); + + case MSG_ID_DG_FLUID_LEAK_SEND_INTERVAL_OVERRIDE: + handleSetFluidLeakBroadcastIntervalOverrideRequest( message ); break; + case MSG_ID_DG_FLUID_LEAK_STATE_DETECTOR_OVERRIDE: + handleSetFluidLeakStateDetectorOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r787312bd901f9c4c9d9e91591ecadca9f22fbeb6 -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 787312bd901f9c4c9d9e91591ecadca9f22fbeb6) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -227,7 +227,7 @@ * @param almData2 2nd data associated with alarm * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastAlarmTriggered( U16 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ) +BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ) { BOOL result; MESSAGE_T msg; @@ -236,10 +236,10 @@ // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_ALARM_TRIGGERED; - msg.hdr.payloadLen = sizeof( U16 ) + sizeof( ALARM_DATA_T ) + sizeof( ALARM_DATA_T ); + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( ALARM_DATA_T ) + sizeof( ALARM_DATA_T ); - memcpy( payloadPtr, &alarm, sizeof( U16 ) ); - payloadPtr += sizeof( U16 ); + memcpy( payloadPtr, &alarm, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); memcpy( payloadPtr, &almData1, sizeof( ALARM_DATA_T ) ); payloadPtr += sizeof( ALARM_DATA_T ); memcpy( payloadPtr, &almData2, sizeof( ALARM_DATA_T ) ); @@ -259,7 +259,7 @@ * @param alarm ID of alarm cleared * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastAlarmCleared( U16 alarm ) +BOOL broadcastAlarmCleared( U32 alarm ) { BOOL result; MESSAGE_T msg; @@ -268,9 +268,9 @@ // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_ALARM_CLEARED; - msg.hdr.payloadLen = sizeof( U16 ); + msg.hdr.payloadLen = sizeof( U32 ); - memcpy( payloadPtr, &alarm, sizeof( U16 ) ); + memcpy( payloadPtr, &alarm, sizeof( U32 ) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_ALARM, ACK_REQUIRED ); @@ -280,6 +280,35 @@ /*********************************************************************//** * @brief + * The broadcastAlarmConditionCleared function constructs an alarm condition + * cleared msg to be broadcast and queues the msg for transmit on the + * appropriate CAN channel. + * @details Inputs: none + * @details Outputs: alarm condition cleared msg constructed and queued. + * @param alarm ID of alarm which alarm condition is cleared + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastAlarmConditionCleared( U32 alarm ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_ALARM_CONDITION_CLEARED; + msg.hdr.payloadLen = sizeof( U32 ); + + memcpy( payloadPtr, &alarm, sizeof( U32 ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_ALARM, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The broadcastAccelData function constructs an accelerometer data msg to * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none @@ -893,6 +922,35 @@ return result; } +/***********************************************************************//** + * @brief + * The broadcastFluidLeakState function constructs a DG fluid leak state msg to \n + * be broadcasted and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: fluid leak state msg constructed and queued + * @param state fluid leak state + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastFluidLeakState( FLUID_LEAK_STATES_T state ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + U32 leakState = (U32)state; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_FLUID_LEAK_STATE; + msg.hdr.payloadLen = sizeof( U32 ); + + memcpy( payloadPtr, &leakState, sizeof( U32 ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + /*********************************************************************//** * @brief * The sendDGSystemRecord function sends out the DG system record. @@ -1010,6 +1068,30 @@ return result; } +/*********************************************************************//** + * @brief + * The sendCommandResponseMsg function constructs a command response to HD + * and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: Command response msg constructed and queued. + * @param cmdResponsePtr pointer to command response data record + * @return none + *************************************************************************/ +void sendCommandResponseMsg( DG_CMD_RESPONSE_T *cmdResponsePtr ) +{ + MESSAGE_T msg; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_COMMAND_RESPONSE; + msg.hdr.payloadLen = sizeof( DG_CMD_RESPONSE_T ); + + memcpy( msg.payload, cmdResponsePtr, sizeof( DG_CMD_RESPONSE_T ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_2_HD, ACK_REQUIRED ); +} + // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** @@ -1029,20 +1111,46 @@ if ( message->hdr.payloadLen == sizeof( U32 ) ) { - RESERVOIR_ID_T reservoirID; + DG_RESERVOIR_ID_T reservoirID; U32 resID; result = TRUE; memcpy( &resID, message->payload, sizeof( U32 ) ); - reservoirID = (RESERVOIR_ID_T)resID; + reservoirID = (DG_RESERVOIR_ID_T)resID; setActiveReservoirCmd( reservoirID ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } + /*********************************************************************//** * @brief + * The handleChangeValveSettingCmd function handles a switch reservoirs command + * from the HD. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleChangeValveSettingCmd( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof( U32 ) ) + { + DG_VALVE_SETTING_ID_T valveSettingID; + + result = TRUE; + memcpy( &valveSettingID, message->payload, sizeof( U32 ) ); + changeValveSettingCmd( valveSettingID ); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); +} + +/*********************************************************************//** + * @brief * The handleFillCmd function handles a fill command from the HD. * @details Inputs: none * @details Outputs: message handled @@ -1135,20 +1243,13 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof( U32 ) ) + if ( message->hdr.payloadLen == sizeof( TRIMMER_HEATER_CMD_T ) ) { - BOOL startingHeater; + TRIMMER_HEATER_CMD_T heaterCmd; - memcpy( &startingHeater, message->payload, sizeof( U32 ) ); - - if ( TRUE == startingHeater ) - { - result = startTrimmerHeaterCmd(); - } - else - { - result = stopTrimmerHeaterCmd(); - } + result = TRUE; + memcpy( &heaterCmd, message->payload, sizeof( TRIMMER_HEATER_CMD_T ) ); + handleTrimmerHeaterCmd( &heaterCmd ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); @@ -2155,6 +2256,70 @@ /*********************************************************************//** * @brief + * The handleSetFluidLeakBroadcastIntervalOverrideRequest function handles a + * request to override the fluid leak state broadcast interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetFluidLeakBroadcastIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetFluidLeakStatePublishIntervalOverride( (U32)( payload.state.u32 ) ); + } + else + { + result = testResetFluidLeakStatePublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleSetFluidLeakStateDetectorOverrideRequest function handles a request to + * override the fluid leak detector state. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetFluidLeakStateDetectorOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetFluidLeakStateOverride( ( FLUID_LEAK_STATES_T)( payload.state.u32 ) ); + } + else + { + result = testResetFluidLeakStateOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleDGSoftwareResetRequest function handles a request to * perform a software reset on DG. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r787312bd901f9c4c9d9e91591ecadca9f22fbeb6 -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 787312bd901f9c4c9d9e91591ecadca9f22fbeb6) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -21,8 +21,10 @@ #include "DGCommon.h" #include "DrainPump.h" #include "Fans.h" +#include "FluidLeak.h" #include "MsgQueues.h" #include "NVDataMgmt.h" +#include "Reservoirs.h" #include "ROPump.h" #include "Thermistors.h" #include "UVReactors.h" @@ -43,11 +45,14 @@ BOOL sendACKMsg( MESSAGE_T *message ); // MSG_ID_ALARM_TRIGGERED -BOOL broadcastAlarmTriggered( U16 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); +BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); // MSG_ID_ALARM_CLEARED -BOOL broadcastAlarmCleared( U16 alarm ); +BOOL broadcastAlarmCleared( U32 alarm ); +// MSG_ID_ALARM_CONDITION_CLEARED +BOOL broadcastAlarmConditionCleared( U32 alarm ); + // MSG_ID_DG_ACCELEROMETER_DATA BOOL broadcastAccelData( F32 x, F32 y, F32 z, F32 xm, F32 ym, F32 zm, F32 xt, F32 yt, F32 zt ); @@ -93,6 +98,15 @@ // MSG_ID_DG_FANS_DATA BOOL broadcastFansData( FANS_DATA_T * fansData ); +// MSG_ID_DG_UV_REACTORS_DATA +BOOL broadcastUVReactorsData( UV_REACTORS_DATA_T *uvReactorsData ); + +// MSG_ID_DG_FLUID_LEAK_STATE +BOOL broadcastFluidLeakState( FLUID_LEAK_STATES_T state); + +// MSG_ID_DG_COMMAND_RESPONSE +void sendCommandResponseMsg( DG_CMD_RESPONSE_T *cmdResponsePtr ); + // MSG_ID_POWER_OFF_WARNING void handlePowerOffWarning( MESSAGE_T *message ); @@ -102,13 +116,16 @@ // MSG_ID_REQUEST_FW_VERSIONS void handleFWVersionCmd( MESSAGE_T *message ); -// MSG_ID_DG_SWITCH_RESERVOIR +// MSG_ID_DG_SWITCH_RESERVOIR_CMD void handleSwitchReservoirCmd( MESSAGE_T *message ); -// MSG_ID_DG_FILL +// MSG_ID_DG_CHANGE_VALVE_SETTING_CMD +void handleChangeValveSettingCmd( MESSAGE_T *message ); + +// MSG_ID_DG_FILL_CMD void handleFillCmd( MESSAGE_T *message ); -// MSG_ID_DG_DRAIN +// MSG_ID_DG_DRAIN_CMD void handleDrainCmd( MESSAGE_T *message ); // MSG_ID_STARTING_STOPPING_TREATMENT @@ -224,9 +241,15 @@ // MSG_ID_DG_START_STOP_INLET_UV_REACTOR void handleStartStopUVReactors( MESSAGE_T *message ); -//MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE +// MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE void handleTestUVReactorsDataPublishIntervalOverride( MESSAGE_T *message ); +// MSG_ID_DG_FLUID_LEAK_SEND_INTERVAL_OVERRIDE +void handleSetFluidLeakBroadcastIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HD_FLUID_LEAK_STATE_DETECTOR_OVERRIDE +void handleSetFluidLeakStateDetectorOverrideRequest( MESSAGE_T *message); + // MSG_ID_DG_SOFTWARE_RESET_REQUEST void handleDGSoftwareResetRequest( MESSAGE_T *message); Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -rccf1219089b835ab2f9d401c0be0d2000be9010a -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision ccf1219089b835ab2f9d401c0be0d2000be9010a) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -21,10 +21,12 @@ #include "ConcentratePumps.h" #include "DrainPump.h" #include "Fans.h" -#include "Heaters.h" +#include "Heaters.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "Reservoirs.h" -#include "ROPump.h" +#include "ROPump.h" +#include "RTC.h" #include "SystemComm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -71,8 +73,12 @@ checkInWithWatchdogMgmt( TASK_GENERAL ); // do this first to keep timing consistent with watchdog management // manage data received from other sub-systems - execSystemCommRx(); + execSystemCommRx(); + // Control and monitor RTC + execRTC(); + +#ifndef BOARD_WITH_NO_HARDWARE // monitor concentrate pumps execConcentratePumpMonitor(); @@ -95,7 +101,8 @@ execReservoirs(); // Manage UV reactors controller - execUVReactors(); + execUVReactos(); +#endif #ifndef DISABLE_HEATERS_AND_TEMPS // Primary heaters state machine @@ -105,7 +112,11 @@ execTrimmerHeater(); #endif // run operation mode state machine - execOperationModes(); + execOperationModes(); + + // Run non-volatile data management state machine that sends the data record + // to Dialin + execNVDataMgmtProcessRecord(); // manage data to be transmitted to other sub-systems execSystemCommTx(); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -ra00c45d75f2edf679c9a30d20b9d75beb46d0a48 -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision a00c45d75f2edf679c9a30d20b9d75beb46d0a48) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -26,7 +26,7 @@ #include "InternalADC.h" #include "LoadCell.h" #include "Pressures.h" -#include "ROPump.h" +#include "ROPump.h" #include "TaskPriority.h" #include "TemperatureSensors.h" #include "Valves.h" @@ -62,6 +62,8 @@ // Monitor internal ADC channels execInternalADC(); + +#ifndef BOARD_WITH_NO_HARDWARE // Monitor pressures execPressures(); @@ -93,9 +95,11 @@ // Heaters monitor execHeatersMonitor(); - + // Monitor fluid leak detector execFluidLeak(); + +#endif // Second pass for FPGA execFPGAOut(); Index: firmware/source/sys_main.c =================================================================== diff -u -r98eaa905f2487013d5e9af76bf064f872332c2fe -rbbd5ac2589c8093f681f2284367975ddd220b553 --- firmware/source/sys_main.c (.../sys_main.c) (revision 98eaa905f2487013d5e9af76bf064f872332c2fe) +++ firmware/source/sys_main.c (.../sys_main.c) (revision bbd5ac2589c8093f681f2284367975ddd220b553) @@ -76,6 +76,7 @@ #include "Interrupts.h" #include "LoadCell.h" #include "MsgQueues.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "Pressures.h" #include "Reservoirs.h" @@ -173,6 +174,7 @@ initInternalADC(); initPressures(); initLoadCell(); + initNVDataMgmt(); initValves(); initHeaters(); initTemperatureSensors();