Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -rcd21cbb4e733bfdf52f83bdca7a905645022c572 -rbb0566d9d186ea1379fbba7233c6b7ebf95bc50c --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision cd21cbb4e733bfdf52f83bdca7a905645022c572) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision bb0566d9d186ea1379fbba7233c6b7ebf95bc50c) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "AirPump.h" #include "AirTrap.h" #include "AlarmMgmt.h" #include "FPGA.h" @@ -35,8 +36,8 @@ /// Interval (ms/task time) at which the air trap data is published on the CAN bus. #define AIR_TRAP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Persistence period for illegal level sensors fault. -static const U32 AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE = ( MS_PER_SECOND * 2 / TASK_PRIORITY_INTERVAL ); -static const U32 AIR_TRAP_UPPER_LEVEL_PERSISTENCE = ( MS_PER_SECOND * 2 / TASK_PRIORITY_INTERVAL ); +static const U32 AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE = ( MS_PER_SECOND * 2 / TASK_GENERAL_INTERVAL ); +static const U32 AIR_TRAP_UPPER_LEVEL_PERSISTENCE = ( MS_PER_SECOND * 2 / TASK_GENERAL_INTERVAL ); /// Volume (in mL) of venous portion of blood circuit line. TODO - get actual volume from Systems. #define VENOUS_LINE_VOLUME_ML ( 200.0F ) @@ -66,8 +67,9 @@ static U32 fillStartTime = 0; ///< Time stamp for start of air trap fill. +static U32 airPumpUpperlevelctr = 0; static U32 airTrapUpperLevelCtr = 0; ///< Timer count for upper level persistence. -static U32 airTrapIllegalLevelSensorsCtr = 0; ///< Timer counter for illegal level sensor fault. +static U32 airTrapIllegalLevelSensorsCtr = 0; ///< Timer counter for illegal level sensor fault. // ********** private function prototypes ********** @@ -89,6 +91,7 @@ resetAirTrap(); airTrapIllegalLevelSensorsCtr = DATA_PUBLISH_COUNTER_START_COUNT; + airPumpUpperlevelctr = 0; for ( i = 0; i < NUM_OF_AIR_TRAP_LEVEL_SENSORS; i++ ) { @@ -181,8 +184,9 @@ airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_LOWER ].data = (U32)( TRUE == lower ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_UPPER ].data = (U32)( TRUE == upper ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); - if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) && - MODE_TREA == getCurrentOperationMode() ) + if ( ( MODE_TREA == getCurrentOperationMode() ) && + ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) && + ( AIR_TRAP_VALVE_OPEN_STATE == airTrapControllerState ) ) { if ( ++airTrapUpperLevelCtr >= AIR_TRAP_UPPER_LEVEL_PERSISTENCE ) { @@ -341,9 +345,55 @@ pendingStopAirTrapController = FALSE; result = AIR_TRAP_MANUAL_CONTROL_STATE; } + //Turn on air pump if fluid reaches upper level. + else if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) + { +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) +#endif + { + if ( AIR_PUMP_STATE_OFF == getAirPumpState() ) + { + setAirPumpState( AIR_PUMP_STATE_ON ); + } + } + } + + else if ( ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) + { + +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) +#endif + { + + if ( AIR_PUMP_STATE_ON == getAirPumpState() ) + { + airPumpUpperlevelctr++; + // Turn air pump off once we detect air at upper level and exceed persistence + // But first, open the air valve. + if ( airPumpUpperlevelctr >= AIR_PUMP_UPPER_LEVEL_PERSISTENCE ) + { + setAirPumpState( AIR_PUMP_STATE_OFF ); + airPumpUpperlevelctr = 0; + } + } + } + } + // Transition to open valve state when air detected at lower level else if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) { +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) +#endif + { + if ( AIR_PUMP_STATE_ON == getAirPumpState() ) + { + setAirPumpState( AIR_PUMP_STATE_OFF ); + airPumpUpperlevelctr = 0; + } + } setValveAirTrap( STATE_OPEN ); fillStartTime = getMSTimerCount(); result = AIR_TRAP_VALVE_OPEN_STATE; @@ -370,13 +420,25 @@ pendingStopAirTrapController = FALSE; result = AIR_TRAP_MANUAL_CONTROL_STATE; } - // Transition to closed valve state when fluid detected at upper level + // Transition to closed valve state when fluid detected at lower level else if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) { setValveAirTrap( STATE_CLOSED ); result = AIR_TRAP_VALVE_CLOSED_STATE; } - + // Turn air pump off once we detect air at lower level. + else if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) + { +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) +#endif + { + if ( AIR_PUMP_STATE_ON == getAirPumpState() ) + { + setAirPumpState( AIR_PUMP_STATE_OFF ); + } + } + } return result; } Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rcd21cbb4e733bfdf52f83bdca7a905645022c572 -rbb0566d9d186ea1379fbba7233c6b7ebf95bc50c --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision cd21cbb4e733bfdf52f83bdca7a905645022c572) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision bb0566d9d186ea1379fbba7233c6b7ebf95bc50c) @@ -701,6 +701,12 @@ fillReservoirOneStartRequested = TRUE; transitionToNoCartSelfTests(); } +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) +#endif + { + signalActionToResumeFill(); + } } return state; Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rcd21cbb4e733bfdf52f83bdca7a905645022c572 -rbb0566d9d186ea1379fbba7233c6b7ebf95bc50c --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision cd21cbb4e733bfdf52f83bdca7a905645022c572) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision bb0566d9d186ea1379fbba7233c6b7ebf95bc50c) @@ -15,6 +15,7 @@ * ***************************************************************************/ +#include "AirPump.h" #include "AirTrap.h" #include "BloodFlow.h" #include "BloodLeak.h" @@ -45,8 +46,8 @@ #define DIAL_IN_PUMP_PRESSURE_SELF_TEST_FLOW 400 #define SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ( 1 * MS_PER_SECOND ) ///< Delay 1 second then check for syringe pump prime occlusion. -#define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 20 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. -#define DIAL_IN_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 20 * MS_PER_SECOND ) ///< Pressure self-test time to run dip in ms. +#define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 30 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. +#define VENOUS_PRESSURE_SELF_TEST_MAX_TEST_TIME ( 30 * MS_PER_SECOND ) ///< Pressure self-test time to run venous self test in ms. #define DECAY_PRESSURE_SELF_TEST_TIME ( 4 * MS_PER_SECOND ) ///< time to wait for pressure to decay in ms. #define STABILTY_PRESSURE_SELF_TEST_TIME ( 5 * MS_PER_SECOND ) ///< Time to wait for pressure to stabilize in ms. #define NORMALIZED_PRESSURE_SELF_TEST_TIME ( 20 * MS_PER_SECOND ) ///< Time to wait for pressure to normalize in ms. @@ -60,7 +61,7 @@ #define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG -200.0F ///< Arterial pressure low limit after running blood pump. #define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG 200.0F ///< Venous pressure high limit after running blood pump. -#define VENOUS_PRESSURE_SELF_TEST_FIRST_PASS_LIMIT_MMHG 200.0F ///< Venous pressure high limit after running dpi in first test. +#define VENOUS_PRESSURE_SELF_TEST_FIRST_PASS_LIMIT_MMHG 250.0F ///< Venous pressure high limit after running air pump in first test. #define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 20.0F ///< Difference in pressure readings after return to normal state tolerance (in mmHg). @@ -97,7 +98,7 @@ static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of the dry self-tests state machine. static U32 pressureSelfTestBloodPumpRunStartTime; ///< Pressure dry self-test blood pump runs start time. -static U32 pressureSelfTestDialInPumpRunStartTime; ///< Pressure dry self-test dip runs start time. +static U32 pressureSelfTestVenousTestStartTime; ///< Pressure dry self-test dip runs start time. static U32 pressureSelfTestNormalizedStartTime; ///< Normalized pressure dry self-test start time. static U32 pressureSelfTestDecayStartTime; ///< Decay pressure dry self-test start time. static U32 pressureSelfTestStabilityStartTime; ///< Stability pressure dry self-test start time. @@ -1010,7 +1011,7 @@ * The handleDrySelfTestPressureSensorsVenousSetupState function handles the setup * for the venous pressure sensor dry self-test. * @details Inputs: none - * @details Outputs: pressureSelfTestDialInPumpRunStartTime + * @details Outputs: pressureSelfTestVenousTestStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousSetupState( void ) @@ -1024,13 +1025,35 @@ } else { - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) + { +#endif + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); +#ifndef _RELEASE_ + } + else + { + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + } +#endif setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); setValvePosition( VBA, VALVE_POSITION_B_OPEN ); setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); setValveAirTrap( STATE_CLOSED ); - setDialInPumpTargetFlowRate( DIAL_IN_PUMP_PRESSURE_SELF_TEST_FLOW, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - pressureSelfTestDialInPumpRunStartTime = getMSTimerCount(); +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) + { +#endif + setAirPumpState( AIR_PUMP_STATE_ON ); +#ifndef _RELEASE_ + } + else + { + setDialInPumpTargetFlowRate( DIAL_IN_PUMP_PRESSURE_SELF_TEST_FLOW, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + } +#endif + pressureSelfTestVenousTestStartTime = getMSTimerCount(); } return state; @@ -1040,7 +1063,7 @@ * @brief * The handleDrySelfTestPressureSensorsVenousState function tests the readings of * the venous pressure sensor and verify they are in correct range. - * @details Inputs: pressureSelfTestDialInPumpRunStartTime + * @details Inputs: pressureSelfTestVenousTestStartTime * @details Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ @@ -1052,11 +1075,22 @@ // End the test when reaching target pressure or time out if ( VENOUS_PRESSURE_SELF_TEST_FIRST_PASS_LIMIT_MMHG <= venousPressure ) { - signalDialInPumpHardStop(); +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) + { +#endif + setAirPumpState( AIR_PUMP_STATE_OFF ); +#ifndef _RELEASE_ + } + else + { + signalDialInPumpHardStop(); + } +#endif state = DRY_SELF_TESTS_PRESSURE_SENSORS_ARTERIAL_SETUP_STATE; } - if ( TRUE == didTimeout( pressureSelfTestDialInPumpRunStartTime, DIAL_IN_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) + if ( TRUE == didTimeout( pressureSelfTestVenousTestStartTime, VENOUS_PRESSURE_SELF_TEST_MAX_TEST_TIME ) ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, venousPressure, VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG ); } Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r2db157fa0b39912cdf03e39c5ff3090c300ff32c -rbb0566d9d186ea1379fbba7233c6b7ebf95bc50c --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 2db157fa0b39912cdf03e39c5ff3090c300ff32c) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision bb0566d9d186ea1379fbba7233c6b7ebf95bc50c) @@ -7,8 +7,8 @@ * * @file AlarmMgmtSWFaults.h * -* @author (last) Darren Cox -* @date (last) 03-Nov-2022 +* @author (last) Dara Navaei +* @date (last) 14-Dec-2022 * * @author (original) Quang Nguyen * @date (original) 20-May-2021 @@ -178,6 +178,8 @@ SW_FAULT_ID_HD_SYRINGE_NOT_PRELOADED, SW_FAULT_ID_HD_AIR_PUMP_INVALID_STATE, SW_FAULT_ID_HD_AIR_PUMP_INVALID_MOTOR_STATE_SELECTED, + SW_FAULT_ID_NVDATA_MANAGEMENT_OPS_TIMEOUT, + SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 -rbb0566d9d186ea1379fbba7233c6b7ebf95bc50c --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision bb0566d9d186ea1379fbba7233c6b7ebf95bc50c) @@ -8,7 +8,7 @@ * @file SystemComm.c * * @author (last) Dara Navaei -* @date (last) 11-Nov-2022 +* @date (last) 14-Dec-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -900,7 +900,7 @@ U16 msgID; memcpy( &msgID, (U08*)&pendingAckList[ i ].msg[ sizeof( U08 ) + sizeof( U16) ], sizeof( U16 ) ); - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CAN_MESSAGE_NOT_ACKED, (U32)msgID ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_CAN_MESSAGE_NOT_ACKED, (U32)msgID ); pendingAckList[ i ].used = FALSE; // Take pending message off of list } } @@ -1163,6 +1163,10 @@ handleUIConfirmationResponse( message ); break; + case MSG_ID_HD_SET_SERVICE_TIME: + handleSetHDServiceTime( message ); + break; + // NOTE: this always must be the last case case MSG_ID_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); @@ -1688,6 +1692,10 @@ handleTestDialOutSetPWM( message ); break; + case MSG_ID_HD_NV_RECORD_CRC_OVERRIDE: + handleTestHDNVRecordCRCOverride( message ); + break; + case MSG_ID_HD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE: handleAirPumpIntervalOverrideRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 -rbb0566d9d186ea1379fbba7233c6b7ebf95bc50c --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision bb0566d9d186ea1379fbba7233c6b7ebf95bc50c) @@ -8,7 +8,7 @@ * @file SystemCommMessages.c * * @author (last) Dara Navaei -* @date (last) 11-Nov-2022 +* @date (last) 21-Dec-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -2355,7 +2355,7 @@ TEMPERATURE_SENSORS_DATA_T payload; memcpy( &payload, message->payload, sizeof( TEMPERATURE_SENSORS_DATA_T ) ); - setDialysateTemperatureReadings( payload.inletDialysate, payload.outletRedundant ); + setDialysateTemperatureReadings( payload.inletDialysate, payload.outletRedundant, payload.heatDisinfect ); } } @@ -3224,7 +3224,7 @@ payloadPtr += sizeof( U32 ); memcpy( payloadPtr, &service.serviceIntervalSeconds, sizeof( U32 ) ); payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &dgData.dgServiceRecord.lastServiceDateEpoch, sizeof( U32 ) ); + memcpy( payloadPtr, &dgData.dgServiceRecord.lastServiceEpochDate, sizeof( U32 ) ); payloadPtr += sizeof( U32 ); memcpy( payloadPtr, &dgData.dgServiceRecord.serviceIntervalSeconds, sizeof( U32 ) ); } @@ -7111,6 +7111,45 @@ } /*********************************************************************//** + * @brief + * The sendHDUsageRecord function sends out the HD service record. + * @details Inputs: none + * @details Outputs: HD system record msg constructed and queued + * @param payloadCurrNum: current payload number + * @param payloadTotalNum: total number of payloads + * @param length: buffer length to be written + * @param srvcRcrdAddress: start address of the usage record + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL sendHDUsageRecord( U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* sysRcrdAddress ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_SEND_USAGE_INFO_RECORD; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ) + sizeof( U32 ) + length; + + memcpy( payloadPtr, &payloadCurrNum, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + + memcpy( payloadPtr, &payloadTotalNum, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + + memcpy( payloadPtr, &length, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + + memcpy( payloadPtr, sysRcrdAddress, length ); + + // 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_PC, ACK_NOT_REQUIRED ); + + return result; +} + +/*********************************************************************//** * @brief * The handleUIServiceModeRequest function handles a request to enter service * mode. @@ -7130,10 +7169,9 @@ { if ( ( MODE_STAN == currentMode ) || ( MODE_FAUL == currentMode ) ) { - requestNewOperationMode( MODE_SERV ); - if ( (DG_MODE_STAN == currentDGMode) || (DG_MODE_FAUL == currentDGMode) ) + if ( ( DG_MODE_STAN == currentDGMode ) || ( DG_MODE_FAUL == currentDGMode ) ) { status = TRUE; cmdSetDGToServiceMode(); @@ -7272,11 +7310,11 @@ *************************************************************************/ void handleDGServiceScheduleData( MESSAGE_T *message ) { - if ( message->hdr.payloadLen == sizeof( HD_VERSION_DG_SERVICE_RECORD_T ) ) + if ( message->hdr.payloadLen == sizeof( DG_SERVICE_RECORD_T ) ) { - HD_VERSION_DG_SERVICE_RECORD_T payload; + DG_SERVICE_RECORD_T payload; - memcpy( &payload, message->payload, sizeof( HD_VERSION_DG_SERVICE_RECORD_T ) ); + memcpy( &payload, message->payload, sizeof( DG_SERVICE_RECORD_T ) ); setHDVersionDGServiceRecord( &payload ); } } @@ -7292,16 +7330,37 @@ *************************************************************************/ void handleDGUsageInfoData( MESSAGE_T *message ) { - if ( message->hdr.payloadLen == sizeof( HD_VERSION_DG_USAGE_INFO_T ) ) + if ( message->hdr.payloadLen == sizeof( DG_USAGE_INFO_RECORD_T ) ) { - HD_VERSION_DG_USAGE_INFO_T payload; + DG_USAGE_INFO_RECORD_T payload; - memcpy( &payload, message->payload, sizeof( HD_VERSION_DG_USAGE_INFO_T ) ); + memcpy( &payload, message->payload, sizeof( DG_USAGE_INFO_RECORD_T ) ); setHDVersionDGUsageInfo( &payload ); } } /*********************************************************************//** + * @brief + * The handleSetHDServiceTime function sets the HD service time once the + * command is received from UI + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return none + *************************************************************************/ +void handleSetHDServiceTime( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( 0 == message->hdr.payloadLen ) + { + result = setServiceTime(); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_HD_2_UI, result ); +} + +/*********************************************************************//** * @brief * The handleGetHDUsageInfoRecord function handles a request to get the HD * usage information record. @@ -7615,6 +7674,31 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +/*********************************************************************//** +* @brief +* The handleTestHDNVRecordCRCOverride function handles a request to override +* the selected NV record's CRC. +* @details Inputs: none +* @details Outputs: message handled +* @param message a pointer to the message to handle +* @return none +*************************************************************************/ +void handleTestHDNVRecordCRCOverride( 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 ) ); + result = testSetNVRecordCRCOverride( payload.index, (U16)payload.state.u32 ); + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + void handleAirPumpIntervalOverrideRequest( MESSAGE_T *message ) { TEST_OVERRIDE_PAYLOAD_T payload; Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 -rbb0566d9d186ea1379fbba7233c6b7ebf95bc50c --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision bb0566d9d186ea1379fbba7233c6b7ebf95bc50c) @@ -8,7 +8,7 @@ * @file SystemCommMessages.h * * @author (last) Dara Navaei -* @date (last) 11-Nov-2022 +* @date (last) 14-Dec-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -432,6 +432,9 @@ // MSG_ID_HD_SET_SW_CONFIG_RECORD void handleSetHDSoftwareConfigRecord( MESSAGE_T *message ); +// MSG_ID_HD_SEND_USAGE_INFO_RECORD +BOOL sendHDUsageRecord( U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* sysRcrdAddress ); + // MSG_ID_HD_SEND_ALARMS_COMMAND void handleResendAllAlarmsCommand( MESSAGE_T* message ); @@ -456,6 +459,9 @@ // MSG_ID_DG_USAGE_DATA void handleDGUsageInfoData( MESSAGE_T *message ); +// MSG_ID_HD_SET_SERVICE_TIME +void handleSetHDServiceTime( MESSAGE_T *message ); + // *********** public test support message functions ********** // MSG_TESTER_LOG_IN @@ -846,6 +852,9 @@ // MSG_ID_HD_DIAL_OUT_SET_PWM void handleTestDialOutSetPWM( MESSAGE_T* message ); +// MSG_ID_HD_NV_RECORD_CRC_OVERRIDE +void handleTestHDNVRecordCRCOverride( MESSAGE_T *message ); + // MSG_ID_HD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE void handleAirPumpIntervalOverrideRequest( MESSAGE_T* message );