Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -646,7 +646,7 @@ // Park concentrate pump too if requested #ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONCENTRATE_PUMPS_PARK ) != SW_CONFIG_ENABLE_VALUE ) + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONCENTRATE_PUMPS_PARK ) ) { if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) { Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -24,6 +24,7 @@ #include "ModeFill.h" #include "OperationModes.h" #include "PersistentAlarm.h" +#include "Reservoirs.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TaskPriority.h" @@ -317,18 +318,19 @@ /*********************************************************************//** * @brief * The checkInletWaterConductivity function checks inlet water conductivity value - * and triggers an alarm when conductivity value is not within the specified - * values. + * and triggers an alarm when conductivity value is out of allowed range. * @details Inputs: CPi sensor conductivity - * @details Outputs: Trigger warning alarm if conductivity is in the warning - * range. Trigger alarm if conductivity is below minimum conductivity. + * @details Outputs: Trigger alarms when conductivity is out of allowed range * @return none *************************************************************************/ void checkInletWaterConductivity( void ) { F32 conductivity = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); + HD_MODE_SUB_MODE_T opMode; + getHDOperationMode( &opMode ); - if ( VALVE_STATE_OPEN == getValveStateName( VPI ) ) + + if ( VALVE_STATE_OPEN == getValveStateName( VPI ) && ( opMode.hdMode <= MODE_TREA ) ) { #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WATER_QUALITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -191,6 +191,7 @@ if( heater < NUM_OF_DG_HEATERS ) { +#ifndef DISABLE_HEATERS_AND_TEMPS // Assume the target temperature has not changed heatersStatus[ heater ].hasTargetTempChanged = FALSE; @@ -201,6 +202,7 @@ heatersStatus[ heater ].hasTargetTempChanged = TRUE; result = TRUE; } +#endif } else { @@ -246,6 +248,7 @@ { BOOL status = FALSE; + if( heater < NUM_OF_DG_HEATERS ) { if ( HEATER_EXEC_STATE_OFF == heatersStatus[ heater ].state ) Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -101,7 +101,7 @@ * @details Outputs: LoadCell module initialized. * @return none *************************************************************************/ - void initLoadCell( void ) +void initLoadCell( void ) { U32 i; U32 j; Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -22,7 +22,7 @@ /** * @defgroup ROPump ROPump - * @brief RO Pump monitor and controller module. Controls and monitors the RO pump. + * @brief RO Pump monitor and controller module. Controls and monitors the RO pump and the flow meter. * The flow meter is manufactured by SwissFlow, PN: 82015311. * The diaphragm (RO) pump is manufactured by Aquatec, PN: 5889-2MM1-V724DY. * Index: firmware/App/DGCommon.h =================================================================== diff -u -r6a685a5acefb3fed988bbfab0128b3eedbcac36e -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 6a685a5acefb3fed988bbfab0128b3eedbcac36e) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -25,7 +25,7 @@ #define DG_VERSION_MAJOR 0 #define DG_VERSION_MINOR 9 #define DG_VERSION_MICRO 0 -#define DG_VERSION_BUILD 193 +#define DG_VERSION_BUILD 482 // ********** build switches ********** Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -137,6 +137,8 @@ setCurrentSubState( NO_SUB_STATE ); + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_INACTIVE_RESERVOIR_TEMP_REMOVE, (U32)inactiveReservoir, 0 ) // TODO remove + if ( DG_RESERVOIR_1 == inactiveReservoir ) { setValveStateDelayed( VRD1, VALVE_STATE_OPEN, DELAY_RES_DRAIN_VALVE_MS ); @@ -270,7 +272,19 @@ DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); U32 targetVolumeML = getTargetDrainVolumeML(); BOOL drainStatus = FALSE; + BOOL checkLowVolumeAlarms = TRUE; + HD_MODE_SUB_MODE_T mode; + getHDOperationMode( &mode ); + + // Ignore low volume alarms if not in treatment + if ( ( ( MODE_TREA == mode.hdMode) && ( TREATMENT_END_STATE == mode.hdSubMode) ) || + ( MODE_POST == mode.hdMode ) ) + { + // do not check low volume alarms + checkLowVolumeAlarms = FALSE; + } + if ( 0 == targetVolumeML ) { drainStatus = hasTargetDrainToZeroBeenReached( inactiveReservoir, DRAIN_WEIGHT_UNCHANGE_TIMEOUT_MS ); @@ -295,6 +309,8 @@ acidBottleVolML = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidFullBottleVolumeML; bicarbBottleVolML = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbStartVolumeML; + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_INACTIVE_RESERVOIR_TEMP_REMOVE, (U32)inactiveReservoir, 0 ) // TODO remove + if ( DG_RESERVOIR_1 == inactiveReservoir ) { setValveState( VRD1, VALVE_STATE_CLOSED ); @@ -319,8 +335,13 @@ { resetChemicalUsedVolumeML( ACID ); setThisFirstFillFlag( TRUE ); // indicates bottles need prime - activateAlarmNoData( ALARM_ID_DG_ACID_BOTTLE_LOW_VOLUME ); - activateAlarmNoData ( ALARM_ID_DG_CREATING_DIALYSATE_PLEASE_WAIT ); + + // Alarm only valid in pre-treatment or treatment modes + if ( TRUE == checkLowVolumeAlarms ) + { + activateAlarmNoData( ALARM_ID_DG_ACID_BOTTLE_LOW_VOLUME ); + activateAlarmNoData ( ALARM_ID_DG_CREATING_DIALYSATE_PLEASE_WAIT ); + } } if ( ( ( bicarbBottleVolML - getChemicalUsedVolumeML( BICARB ) ) <= CONCENTRATE_BOTTLE_BICARB_LOW_VOLUME_ML ) && // SRSDG 837 @@ -329,8 +350,13 @@ { resetChemicalUsedVolumeML( BICARB ); setThisFirstFillFlag( TRUE ); - activateAlarmNoData( ALARM_ID_DG_BICARB_BOTTLE_LOW_VOLUME ); - activateAlarmNoData ( ALARM_ID_DG_CREATING_DIALYSATE_PLEASE_WAIT ); + + // Alarm only valid in pre-treatment or treatment modes + if ( TRUE == checkLowVolumeAlarms ) + { + activateAlarmNoData( ALARM_ID_DG_BICARB_BOTTLE_LOW_VOLUME ); + activateAlarmNoData ( ALARM_ID_DG_CREATING_DIALYSATE_PLEASE_WAIT ); + } } } @@ -366,6 +392,8 @@ if ( ++drainEmptyTareTimerCtr > DRAIN_EMPTY_TARE_WAIT ) { + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_INACTIVE_RESERVOIR_TEMP_REMOVE, (U32)inactiveReservoir, 0 ) // TODO remove + drainEmptyTareTimerCtr = 0; tareLoadCellsAtEmpty( inactiveReservoir ); Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -325,15 +325,15 @@ { DG_POST_STATE_T result = postState; - if ( ( SELF_TEST_STATUS_PASSED == testStatus ) || ( SELF_TEST_STATUS_FAILED == testStatus ) ) + if ( ( testStatus == SELF_TEST_STATUS_PASSED ) || ( testStatus == SELF_TEST_STATUS_FAILED ) ) { - BOOL passed = ( SELF_TEST_STATUS_PASSED == testStatus ? TRUE : FALSE ); + BOOL passed = ( testStatus == SELF_TEST_STATUS_PASSED ? TRUE : FALSE ); // Broadcast passed POST result sendPOSTTestResult( (DG_POST_STATE_T)((int)postState), passed ); // Move on to next POST test result = (DG_POST_STATE_T)((int)postState + 1); - if ( SELF_TEST_STATUS_FAILED == testStatus ) + if ( testStatus == SELF_TEST_STATUS_FAILED ) { tempPOSTPassed = FALSE; } Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -r79b494c344417ba6865db01ad5f456e439bec1b2 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 79b494c344417ba6865db01ad5f456e439bec1b2) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -1,6 +1,6 @@ /************************************************************************** * -* Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -85,8 +85,8 @@ SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, // 55 SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, - SW_FAULT_ID_SEMAPHORE_IN_USE_TIMEOUT, SW_FAULT_ID_SERVICE_MODE_INVALID_EXEC_STATE, + SW_FAULT_ID_SEMAPHORE_IN_USE_TIMEOUT, SW_FAULT_ID_UV_REACTORS_INVALID_EXEC_STATE, SW_FAULT_ID_UV_REACTORS_INVALID_SELF_TEST_STATE, // 60 SW_FAULT_ID_THERMISTORS_INVALID_EXEC_STATE, Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r6330949b9dd72e81c3a8405617f27df98acfc3e6 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 6330949b9dd72e81c3a8405617f27df98acfc3e6) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -1201,11 +1201,11 @@ break; case MSG_ID_FILTER_FLUSH_TIME_PERIOD_OVERRIDE: - handleFilterFlushTimePeriodOverride( message ); + handleFilterFlushTimePeriodOverride(message); break; - case MSG_ID_DG_FANS_RPM_OVERRIDE: - handleFansRPMOverride( message ); + case MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION: + handleTestBlockMessagesRequest( message ); break; case MSG_ID_DG_STOP_RTC_CLOCK: @@ -1216,10 +1216,6 @@ handleSetDrainPumpMeasuredRPMOverrideRequest( message ); break; - case MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION: - handleTestBlockMessagesRequest( message ); - break; - case MSG_ID_DG_SUPER_CLEAR_ALARMS_CMD: handleTestSuperClearAlarmsRequest( message ); break; @@ -1232,6 +1228,10 @@ handleTestFansRPMAlarmStartTimeOffsetRequest( message ); break; + case MSG_ID_DG_FANS_RPM_OVERRIDE: + handleFansRPMOverride( message ); + break; + case MSG_ID_DG_USED_ACID_VOLUME_ML_OVERRIDE: handleTestUsedAcidVolumeMLOverrideRequest( message ); break; @@ -1278,14 +1278,14 @@ handleTestTareReservoirRequest( message ); break; - case MSG_ID_DG_DRAIN_PUMP_CURRENT_OVERRIDE: - handleTestDrainPumpMeasuredCurrentOverride( message ); - break; - case MSG_ID_DG_GEN_IDLE_PUBLISH_INTERVAL_OVERRIDE: handleTestGenIdlePublishIntervalOverride( message ); break; + case MSG_ID_DG_DRAIN_PUMP_CURRENT_OVERRIDE: + handleSetDrainPumpMeasuredRPMOverrideRequest( message ); + break; + case MSG_ID_DG_DRAIN_PUMP_DIRECTION_OVERRIDE: handleTestDGDrainPumpDirectionOverrideRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r6330949b9dd72e81c3a8405617f27df98acfc3e6 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 6330949b9dd72e81c3a8405617f27df98acfc3e6) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -94,97 +94,97 @@ static volatile U16 nextSeqNo = 1; ///< Next sequence number. /// List of message IDs that are requested not to be transmitted. static BLOCKED_MSGS_DATA_T blockedMessagesForXmit = { 0, 0, 0, 0, 0, 0, 0, 0 }; - -// ********** private function prototypes ********** - -static BOOL sendTestAckResponseMsg( MSG_ID_T msgID, BOOL ack ); + +// ********** private function prototypes ********** + +static BOOL sendTestAckResponseMsg( MSG_ID_T msgID, BOOL ack ); static BOOL sendAckResponseMsg( MSG_ID_T msgID, COMM_BUFFER_T buffer, BOOL ack ); -static BOOL sendUIResponseMsg( MSG_ID_T msgID, BOOL accepted, U32 reason ); - -/*********************************************************************//** - * @brief - * The serializeMessage function serializes a given message into a given - * array of bytes. A sequence # is added to the message here and the ACK - * bit of the sequence # is set if ACK is required per parameter. A sync byte - * is inserted at the beginning of the message and an 8-bit CRC is appended to - * the end of the message. The message is queued for transmission in the given buffer. - * @details Inputs: none - * @details Outputs: given data array populated with serialized message data and queued for transmit. - * @param msg message to serialize - * @param buffer outgoing buffer that message should be queued in - * @param ackReq is an acknowledgement from receiver required? - * @return size (in bytes) of serialized message populated in given data array. - *************************************************************************/ -U32 serializeMessage( MESSAGE_T msg, COMM_BUFFER_T buffer, BOOL ackReq ) -{ - BOOL result = FALSE; - BOOL error = FALSE; - U32 msgSize = 0; - U32 sizeMod, sizePad; - U32 i; - U08 crc; - U08 data[ MAX_ACK_MSG_SIZE ]; // byte array to populate with message data - - // prefix data with message sync byte - data[ msgSize++ ] = MESSAGE_SYNC_BYTE; - - // set sequence # and ACK bit (unless this is an ACK to a received message) - if ( msg.hdr.msgID != MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK ) - { - // thread protect next sequence # access & increment - _disable_IRQ(); - msg.hdr.seqNo = nextSeqNo; - nextSeqNo = INC_WRAP( nextSeqNo, MIN_MSG_SEQ_NO, MAX_MSG_SEQ_NO ); - _enable_IRQ(); - if ( TRUE == ackReq ) - { - msg.hdr.seqNo *= -1; - } - } - - // calculate message CRC - crc = crc8( (U08*)(&msg), sizeof( MESSAGE_HEADER_T ) + msg.hdr.payloadLen ); - - // serialize message header data - memcpy( &data[ msgSize ], &( msg.hdr ), sizeof( MESSAGE_HEADER_T ) ); - msgSize += sizeof( MESSAGE_HEADER_T ); - - // serialize message payload (only used bytes per payloadLen field) - memcpy( &data[ msgSize ], &( msg.payload ), msg.hdr.payloadLen ); - msgSize += msg.hdr.payloadLen; - - // add 8-bit CRC - data[ msgSize++ ] = crc; - - // pad with zero bytes to get length a multiple of CAN_MESSAGE_PAYLOAD_SIZE (8) - sizeMod = msgSize % CAN_MESSAGE_PAYLOAD_SIZE; - sizePad = ( sizeMod == 0 ? 0 : CAN_MESSAGE_PAYLOAD_SIZE - sizeMod ); - for ( i = 0; i < sizePad; i++ ) - { - data[ msgSize++ ] = 0; - } - - // if ACK required, add to pending ACK list - if ( TRUE == ackReq ) - { - if ( FALSE == addMsgToPendingACKList( &msg, buffer, data, msgSize ) ) - { - error = TRUE; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL ) - } - } - - if ( FALSE == error ) - { - // add serialized message data to appropriate out-going comm buffer - result = addToCommBuffer( buffer, data, msgSize ); - } - - return result; -} +static BOOL sendUIResponseMsg( MSG_ID_T msgID, BOOL accepted, U32 reason ); /*********************************************************************//** * @brief + * The serializeMessage function serializes a given message into a given + * array of bytes. A sequence # is added to the message here and the ACK + * bit of the sequence # is set if ACK is required per parameter. A sync byte + * is inserted at the beginning of the message and an 8-bit CRC is appended to + * the end of the message. The message is queued for transmission in the given buffer. + * @details Inputs: none + * @details Outputs: given data array populated with serialized message data and queued for transmit. + * @param msg message to serialize + * @param buffer outgoing buffer that message should be queued in + * @param ackReq is an acknowledgement from receiver required? + * @return size (in bytes) of serialized message populated in given data array. + *************************************************************************/ +U32 serializeMessage( MESSAGE_T msg, COMM_BUFFER_T buffer, BOOL ackReq ) +{ + BOOL result = FALSE; + BOOL error = FALSE; + U32 msgSize = 0; + U32 sizeMod, sizePad; + U32 i; + U08 crc; + U08 data[ MAX_ACK_MSG_SIZE ]; // byte array to populate with message data + + // prefix data with message sync byte + data[ msgSize++ ] = MESSAGE_SYNC_BYTE; + + // set sequence # and ACK bit (unless this is an ACK to a received message) + if ( msg.hdr.msgID != MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK ) + { + // thread protect next sequence # access & increment + _disable_IRQ(); + msg.hdr.seqNo = nextSeqNo; + nextSeqNo = INC_WRAP( nextSeqNo, MIN_MSG_SEQ_NO, MAX_MSG_SEQ_NO ); + _enable_IRQ(); + if ( TRUE == ackReq ) + { + msg.hdr.seqNo *= -1; + } + } + + // calculate message CRC + crc = crc8( (U08*)(&msg), sizeof( MESSAGE_HEADER_T ) + msg.hdr.payloadLen ); + + // serialize message header data + memcpy( &data[ msgSize ], &( msg.hdr ), sizeof( MESSAGE_HEADER_T ) ); + msgSize += sizeof( MESSAGE_HEADER_T ); + + // serialize message payload (only used bytes per payloadLen field) + memcpy( &data[ msgSize ], &( msg.payload ), msg.hdr.payloadLen ); + msgSize += msg.hdr.payloadLen; + + // add 8-bit CRC + data[ msgSize++ ] = crc; + + // pad with zero bytes to get length a multiple of CAN_MESSAGE_PAYLOAD_SIZE (8) + sizeMod = msgSize % CAN_MESSAGE_PAYLOAD_SIZE; + sizePad = ( sizeMod == 0 ? 0 : CAN_MESSAGE_PAYLOAD_SIZE - sizeMod ); + for ( i = 0; i < sizePad; i++ ) + { + data[ msgSize++ ] = 0; + } + + // if ACK required, add to pending ACK list + if ( TRUE == ackReq ) + { + if ( FALSE == addMsgToPendingACKList( &msg, buffer, data, msgSize ) ) + { + error = TRUE; + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL ) + } + } + + if ( FALSE == error ) + { + // add serialized message data to appropriate out-going comm buffer + result = addToCommBuffer( buffer, data, msgSize ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The sendACKMsg function constructs and queues for transmit an ACK message * for a given received message. * @details Inputs: none @@ -416,7 +416,6 @@ return result; } - // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** @@ -450,21 +449,17 @@ *************************************************************************/ void handleRTCSyncFromHD( MESSAGE_T *message ) { - // TODO - remove the code below until the issue for the synchronization - // of the DG RTC to the HD RTC is resolved. -/* - // Only sync RTC to HD date/time when ... if ( TRUE == syncDG2HDDateTime() ) { if ( sizeof( RTC_DATA_T ) == message->hdr.payloadLen ) { RTC_DATA_T epoch; memcpy( &epoch, message->payload, sizeof( RTC_DATA_T ) ); + isEpochValid ( epoch.epochTime ); setRTCEpoch( epoch.epochTime ); } } -*/ } /*********************************************************************//** @@ -3640,37 +3635,6 @@ } /*********************************************************************//** - * @brief - * The handleFansRPMOverride function handles a request to override a fans RPM value. - * @details Inputs: none - * @details Outputs: message handled - * @param message a pointer to the message to handle - * @return none - *************************************************************************/ -void handleFansRPMOverride( 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 = testSetFanRPMOverride( payload.index, payload.state.f32 ); - } - else - { - result = testResetFanRPMOverride( payload.index ); - } - } - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** * @brief * The handleStopDGRTCClock function handles a request to stop the RTC clock. * @details Inputs: none @@ -3809,10 +3773,41 @@ /*********************************************************************//** * @brief - * The handleTestFansRPMAlarmStartTimeOffsetRequest function handles a - * request to set the fans RPM alarm start time offset. + * The handleFansRPMOverride function handles a request to override a fans RPM value. * @details Inputs: none * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleFansRPMOverride( 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 = testSetFanRPMOverride( payload.index, payload.state.f32 ); + } + else + { + result = testResetFanRPMOverride( payload.index ); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestFansRPMAlarmStartTimeOverrideRequest function handles a + * request to override the fan RPM alarm start time. + * @details Inputs: none + * @details Outputs: message handled * @param message : a pointer to the message to handle * @return none *************************************************************************/ @@ -3835,7 +3830,6 @@ } /*********************************************************************//** - * @brief * The handleTestUsedAcidVolumeMLOverrideRequest function handles a * request to override the acid volume. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 -r6aeb55fc06ec5d67c24596986a22d909bfc91943 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 6aeb55fc06ec5d67c24596986a22d909bfc91943) @@ -170,6 +170,12 @@ // MSG_ID_DG_RESPONSE_SERVICE_MODE_REQUEST BOOL sendServiceModeResponse( BOOL accepted, U32 rejCode ); +// MSG_ID_HD_OP_MODE +BOOL handleSetHDOperationMode( MESSAGE_T *message ); + +// MSG_ID_HD_REQUEST_DG_USAGE_INFO +void handleHDRequestDGUsageInfo( MESSAGE_T * message ); + // MSG_ID_DG_SET_SERVICE_TIME void handleSetDGServiceTime( MESSAGE_T *message ); @@ -393,6 +399,12 @@ // MSG_ID_DG_DRAIN_PUMP_MEASURED_RPM_OVERRIDE void handleSetDrainPumpMeasuredRPMOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DG_ALARM_INFO_SEND_INTERVAL_OVERRIDE +void handleTestAlarmInfoSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_SUPER_CLEAR_ALARMS_CMD +void handleTestSuperClearAlarmsRequest( MESSAGE_T *message ); + // MSG_ID_DG_SET_FANS_RPM_ALARM_START_TIME_OFFSET void handleTestFansRPMAlarmStartTimeOffsetRequest( MESSAGE_T *message ); @@ -413,21 +425,27 @@ void handleSetDGSoftwareConfigRecord( MESSAGE_T *message ); #endif +// MSG_ID_HD_REQUEST_DG_ALARMS +void handleResendAllAlarmsCommand( MESSAGE_T *message ); + // MSG_ID_DG_HD_COMMUNICATION_STATUS void handleTestHDCommunicationStatusOverrideRequest( MESSAGE_T *message ); // MSG_ID_DG_SET_PRIMARY_AND_TRIMMER_HEATERS_TARGET_TEMP void handleSetPrimaryAndTrimmerHeatersTargetTemperature( MESSAGE_T *message ); +// MSG_ID_DG_USED_ACID_VOLUME_ML_OVERRIDE +void handleTestUsedAcidVolumeMLOverrideRequest(MESSAGE_T *message); + +// MSG_ID_DG_USED_BICARB_VOLUME_ML_OVERRIDE +void handleTestUsedBicarbVolumeMLOverrideRequest(MESSAGE_T *message); + // MSG_ID_DG_GET_USAGE_INFO_RECORD void handleGetDGUsageInfoRecord( MESSAGE_T *message ); // MSG_ID_DG_SET_USAGE_INFO_RECORD void handleSetDGUsageInfoRecord( MESSAGE_T *message ); -// MSG_ID_HD_REQUEST_DG_ALARMS -void handleResendAllAlarmsCommand( MESSAGE_T *message ); - // MSG_ID_DG_SET_OP_MODE_REQUEST void handleTestSetOpModeRequest( MESSAGE_T *message );