Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r84bb8663dae71170e1743a2bed37b0aa47465b47 -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 84bb8663dae71170e1743a2bed37b0aa47465b47) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -427,7 +427,7 @@ * @brief * The getUltrafiltrationVolumeCollected function gets the current ultrafiltration * volume collected so far for current treatment. - * @details Inputs: measUFVolume, measUFVolumeFromPriorReservoirs + * @details Inputs: measUFVolume * @details Outputs: none * @return measUFVolume *************************************************************************/ @@ -440,7 +440,7 @@ * @brief * The getUltrafiltrationReferenceVolume function gets the current ultrafiltration * reference volume. - * @details Inputs: measUFVolume, measUFVolumeFromPriorReservoirs + * @details Inputs: refUFVolume * @details Outputs: none * @return refUFVolume *************************************************************************/ @@ -451,6 +451,19 @@ /*********************************************************************//** * @brief + * The getTotalSalineBolusVolumeDelivered function gets the current total + * saline volume delivered. + * @details Inputs: totalSalineVolumeDelivered + * @details Outputs: none + * @return totalSalineVolumeDelivered + *************************************************************************/ +F32 getTotalSalineBolusVolumeDelivered( void ) +{ + return totalSalineVolumeDelivered; +} + +/*********************************************************************//** + * @brief * The pauseUF function pauses ultrafiltration. * @details Inputs: currentDialysisState, currentUFState * @details Outputs: currentUFState, outlet pump set point Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -rbb80dbac26147ab08413efa91007f7ffed43c38f -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision bb80dbac26147ab08413efa91007f7ffed43c38f) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -66,6 +66,7 @@ SALINE_BOLUS_STATE_T getSalineBolusState( void ); F32 getUltrafiltrationVolumeCollected( void ); F32 getUltrafiltrationReferenceVolume( void ); +F32 getTotalSalineBolusVolumeDelivered( void ); BOOL pauseUF( void ); BOOL resumeUF( void ); Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -re63c54262fd4ccd8ffd9ef9bb49e66458893528f -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision e63c54262fd4ccd8ffd9ef9bb49e66458893528f) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -203,19 +203,6 @@ /*********************************************************************//** * @brief - * The setTreatmentDateTime sets treatment date and time to treatment log. - * @details Inputs: treatmentLogData - * @details Outputs: Sent treatment log data to UI - * @param dateTime date and time to save to treatment log - * @return none - *************************************************************************/ -void setTreatmentDateTime( U32 dateTime ) -{ - treatmentLogData.treatmentDateAndTime = dateTime; -} - -/*********************************************************************//** - * @brief * The signalUserConfirmPatientDisconnection signals post-treatment mode * user has confirmed patient disconnection. * @details Inputs: none @@ -423,16 +410,16 @@ // treatmentLogData.avgDialysateTemperature_degC; treatmentLogData.targetUFVolume_L = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); - treatmentLogData.actualUFVolume_L = getTotalMeasuredUFVolumeInMl(); + treatmentLogData.actualUFVolume_L = getUltrafiltrationVolumeCollected(); treatmentLogData.targetUFRate_mL_min = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ) * ML_PER_LITER / treatmentLogData.treatmentDuration_min; - treatmentLogData.actualUFRate_mL_min = getTotalMeasuredUFVolumeInMl() / treatmentLogData.actualTreatmentDur_min; -// treatmentLogData.salineBolusVolume_mL; + treatmentLogData.actualUFRate_mL_min = getUltrafiltrationVolumeCollected() / treatmentLogData.actualTreatmentDur_min; + treatmentLogData.salineBolusVolume_mL = getTotalSalineBolusVolumeDelivered(); // treatmentLogData.heparinType; treatmentLogData.heparinBolusVolume_mL = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); treatmentLogData.heparinDispenseRate_mL_hr = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); treatmentLogData.heparinPreStop_min = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); -// treatmentLogData.heparinDeliveredVolume_mL; + treatmentLogData.heparinDeliveredVolume_mL = getSyringePumpVolumeDelivered(); // treatmentLogData.endTreatmentEarlyAlarm; // treatmentLogData.deviceID; Index: firmware/App/Modes/ModePostTreat.h =================================================================== diff -u -re63c54262fd4ccd8ffd9ef9bb49e66458893528f -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision e63c54262fd4ccd8ffd9ef9bb49e66458893528f) +++ firmware/App/Modes/ModePostTreat.h (.../ModePostTreat.h) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -83,7 +83,6 @@ U32 execPostTreatmentMode( void ); // Execute the post-treatment mode state machine (call from OperationModes) void handleTreatmentLogDataRequest( void ); -void setTreatmentDateTime( U32 dateTime ); void signalUserConfirmPatientDisconnection( void ); void signalUserConfirmDisposableRemoval( void ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -re63c54262fd4ccd8ffd9ef9bb49e66458893528f -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision e63c54262fd4ccd8ffd9ef9bb49e66458893528f) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -60,9 +60,9 @@ /// Interval (ms/task time) at which updated, valid treatment setting ranges are published on the CAN bus. static const U32 TREATMENT_SETTINGS_RANGES_PUB_INTERVAL = ( ( 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); /// Interval (ms/task time) at which the treatment periodic data is published on the CAN bus. -static const U32 TREATMENT_PERIODIC_DATA_PUB_INTERVAL = ( ( 30 * SEC_PER_MIN * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ); +static const U32 TREATMENT_PERIODIC_DATA_PUB_INTERVAL = ( 30 * SEC_PER_MIN * MS_PER_SECOND ); /// Interval (ms/task time) at which the treatment periodic data is logged. -static const U32 TREATMENT_PERIODIC_DATA_LOG_INTERVAL = ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ); +static const U32 TREATMENT_PERIODIC_DATA_LOG_INTERVAL = ( MS_PER_SECOND ); #define CALC_ELAPSED_TREAT_TIME_IN_SECS() ( treatmentTimeMS / MS_PER_SECOND ) ///< Macro to calculate the elapsed treatment time in seconds. /// Macro to calculate the elapsed treatment time in minutes. @@ -89,7 +89,6 @@ static U32 treatmentTimeBroadcastTimerCtr; ///< Treatment time data broadcast timer counter used to schedule when to transmit data. static U32 treatmentStateBroadcastTimerCtr; ///< Treatment state data broadcast timer counter used to schedule when to transmit data. static U32 treatmentParamsRangesBroadcastTimerCtr; ///< Treatment parameter ranges broadcast timer counter used to schedule when to transmit updated ranges. -static U32 treatmentPeriodDataBroadcastTimerCtr; ///< Treatment 30 minutes periodic data broadcast timer counter used to schedule when to transmit data. static BOOL resumeTreatmentAlarmResponseRequest; ///< Flag indicates user has requested treatment resume. static BOOL initiateRinsebackAlarmResponseRequest; ///< Flag indicates user has requested rinseback. @@ -105,11 +104,13 @@ static F32 pendingUFRateChange; ///< An ultrafiltration rate change (mL/min) is pending user confirmation. static U32 pendingTreatmentTimeChange; ///< A treatment time change (min) is pending user confirmation. -static F32 bloodFlowRateTotal; ///< Blood flow rate total, used to calculate blood flow rate average over 30 minutes. -static F32 dialysateFlowRateTotal; ///< Dialysate flow rate total, used to calculate dialysate flow rate average over 30 minutes. -static F32 ultraFiltrationRateTotal; ///< UF rate total, used to calculate UF rate average over 30 minutes. -static F32 arterialPressureTotal; ///< Arterial pressure total, used to calculate arterial pressure average over 30 minutes. -static F32 venousPressureTotal; ///< Venous pressure total, used to calculate venous pressure average over 30 minutes. +static U32 lastTreatmentPeriodicDataPublishTimeStamp; ///< Last treatment 30 minutes periodic data publish time stamp. +static U32 lastTreatmentPeriodicDataCollectTimeStamp; ///< Last treatment periodic data collect time stamp. +static F32 lastUltraFiltrationVolume_mL; ///< Last 30 minutes ultra filtration volume in mL. +static F32 bloodFlowRateTotal_mL_min; ///< Blood flow rate total, used to calculate blood flow rate average over 30 minutes. +static F32 dialysateFlowRateTotal_mL_min; ///< Dialysate flow rate total, used to calculate dialysate flow rate average over 30 minutes. +static F32 arterialPressureTotal_mmHg; ///< Arterial pressure total, used to calculate arterial pressure average over 30 minutes. +static F32 venousPressureTotal_mmHg; ///< Venous pressure total, used to calculate venous pressure average over 30 minutes. // ********** private function prototypes ********** @@ -145,7 +146,6 @@ treatmentTimeBroadcastTimerCtr = TREATMENT_TIME_DATA_PUB_INTERVAL; // So we send time data immediately when we begin treatment mode treatmentStateBroadcastTimerCtr = TREATMENT_STATE_DATA_PUB_INTERVAL; // So we send state data immediately when we begin treatment mode treatmentParamsRangesBroadcastTimerCtr = TREATMENT_SETTINGS_RANGES_PUB_INTERVAL; // So we send ranges immediately when we begin treatment mode - treatmentPeriodDataBroadcastTimerCtr = 0; presTreatmentTimeSecs = 0; presBloodFlowRate = 0; @@ -161,11 +161,13 @@ pendingUFRateChange = 0.0; pendingTreatmentTimeChange = 0; - bloodFlowRateTotal = 0.0; - dialysateFlowRateTotal = 0.0; - ultraFiltrationRateTotal = 0.0; - arterialPressureTotal = 0.0; - venousPressureTotal = 0.0; + lastTreatmentPeriodicDataPublishTimeStamp = 0; + lastTreatmentPeriodicDataCollectTimeStamp = 0; + lastUltraFiltrationVolume_mL = 0.0; + bloodFlowRateTotal_mL_min = 0.0; + dialysateFlowRateTotal_mL_min = 0.0; + arterialPressureTotal_mmHg = 0.0; + venousPressureTotal_mmHg = 0.0; } /*********************************************************************//** @@ -217,8 +219,6 @@ initRinseback(); initTreatmentRecirc(); initTreatmentEnd(); - - setTreatmentDateTime( getRTCTimestamp() ); } /*********************************************************************//** @@ -1267,34 +1267,35 @@ *************************************************************************/ static void broadcastTreatmentPeriodicData( void ) { - if ( ( treatmentPeriodDataBroadcastTimerCtr % TREATMENT_PERIODIC_DATA_LOG_INTERVAL ) == 0 ) + U32 const timeElapsedSinceLastCollect_ms = calcTimeBetween( lastTreatmentPeriodicDataCollectTimeStamp, treatmentTimeMS ); + + if ( timeElapsedSinceLastCollect_ms >= TREATMENT_PERIODIC_DATA_LOG_INTERVAL ) { - bloodFlowRateTotal += getMeasuredBloodFlowRate(); - dialysateFlowRateTotal += getMeasuredDialInFlowRate(); - ultraFiltrationRateTotal += getTotalMeasuredUFVolumeInMl() / getActualTreatmentTimeMins(); - arterialPressureTotal += getMeasuredArterialPressure(); - venousPressureTotal += getMeasuredVenousPressure(); + lastTreatmentPeriodicDataCollectTimeStamp = treatmentTimeMS; + bloodFlowRateTotal_mL_min += getMeasuredBloodFlowRate(); + dialysateFlowRateTotal_mL_min += getMeasuredDialInFlowRate(); + arterialPressureTotal_mmHg += getMeasuredArterialPressure(); + venousPressureTotal_mmHg += getMeasuredVenousPressure(); } - if ( ++treatmentPeriodDataBroadcastTimerCtr >= TREATMENT_PERIODIC_DATA_PUB_INTERVAL ) + if ( calcTimeBetween( lastTreatmentPeriodicDataPublishTimeStamp, treatmentTimeMS ) >= TREATMENT_PERIODIC_DATA_PUB_INTERVAL ) { - U32 const numberOfDataPoint = TREATMENT_PERIODIC_DATA_PUB_INTERVAL / TREATMENT_PERIODIC_DATA_LOG_INTERVAL; TREATMENT_LOG_DATA_PERIODIC_T periodTreatmentData; + U32 const numberOfDataPoint = TREATMENT_PERIODIC_DATA_PUB_INTERVAL / TREATMENT_PERIODIC_DATA_LOG_INTERVAL; - periodTreatmentData.timestamp = getRTCTimestamp(); - periodTreatmentData.avgBloodFlowRate += bloodFlowRateTotal / numberOfDataPoint; - periodTreatmentData.avgDialysateFlowRate += dialysateFlowRateTotal / numberOfDataPoint; - periodTreatmentData.avgUFRate += ultraFiltrationRateTotal / numberOfDataPoint; - periodTreatmentData.avgArterialPressure += arterialPressureTotal / numberOfDataPoint; - periodTreatmentData.avgVenousPressure += venousPressureTotal / numberOfDataPoint; + periodTreatmentData.avgUFRate = ( getUltrafiltrationVolumeCollected() - lastUltraFiltrationVolume_mL ) / ( numberOfDataPoint / SEC_PER_MIN ); + periodTreatmentData.avgBloodFlowRate = bloodFlowRateTotal_mL_min / numberOfDataPoint; + periodTreatmentData.avgDialysateFlowRate = dialysateFlowRateTotal_mL_min / numberOfDataPoint; + periodTreatmentData.avgArterialPressure = arterialPressureTotal_mmHg / numberOfDataPoint; + periodTreatmentData.avgVenousPressure = venousPressureTotal_mmHg / numberOfDataPoint; - treatmentPeriodDataBroadcastTimerCtr = 0; - bloodFlowRateTotal = 0.0; - dialysateFlowRateTotal = 0.0; - ultraFiltrationRateTotal = 0.0; - arterialPressureTotal = 0.0; - venousPressureTotal = 0.0; - sendTreatmentPeriodDataToUI( &periodTreatmentData ); + lastTreatmentPeriodicDataPublishTimeStamp = treatmentTimeMS; + lastUltraFiltrationVolume_mL = getUltrafiltrationVolumeCollected(); + bloodFlowRateTotal_mL_min = 0.0; + dialysateFlowRateTotal_mL_min = 0.0; + arterialPressureTotal_mmHg = 0.0; + venousPressureTotal_mmHg = 0.0; + sendTreatmentPeriodicDataToUI( &periodTreatmentData ); } } Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -r84bb8663dae71170e1743a2bed37b0aa47465b47 -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 84bb8663dae71170e1743a2bed37b0aa47465b47) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -84,7 +84,6 @@ /// Payload record structure for the treatment log 30 minutes periodic data. typedef struct { - U32 timestamp; F32 avgBloodFlowRate; F32 avgDialysateFlowRate; F32 avgUFRate; Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r161dc3734f29dcd986683008a01c30114279698b -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 161dc3734f29dcd986683008a01c30114279698b) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -32,7 +32,8 @@ // ********** public definitions ********** -#include "AlarmDefs.h" +#include "AlarmDefs.h" +#include "AlarmMgmtSWFaults.h" /// Interval (in ms) at which alarm lamp and audio control will be executed. #define ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS 250 @@ -129,138 +130,6 @@ } ALARM_COMP_STATUS_PAYLOAD_T; #pragma pack(pop) -/// Listing of specific software faults for logging purposes. -typedef enum -{ - SW_FAULT_ID_NONE = 0, - SW_FAULT_ID_ALARM_LAMP_INVALID_PATTERN_REQUESTED, - SW_FAULT_ID_ALARM_LAMP_INVALID_SELF_TEST_STATE, - SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH, - SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_STATE, - SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_DIRECTION, // 5 - SW_FAULT_ID_BUTTONS_INVALID_SELF_TEST_STATE, - SW_FAULT_ID_BUTTONS_STOP_BUTTON_NOT_CONSUMED, - SW_FAULT_ID_INT_ADC_DATA_OVERRUN, - SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, - SW_FAULT_ID_MODE_INIT_POST_INVALID_POST_STATE, // 10 - SW_FAULT_ID_OP_MODES_ILLEGAL_MODE_TRANSITION_REQUESTED, - SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, - SW_FAULT_ID_OP_MODES_INVALID_MODE_REQUESTED, - SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, - SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, // 15 - SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, - SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, - SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, - SW_FAULT_ID_COMM_BUFFERS_ADD_INVALID_BUFFER, - SW_FAULT_ID_COMM_BUFFERS_GET_INVALID_BUFFER, // 20 - SW_FAULT_ID_COMM_BUFFERS_PEEK_INVALID_BUFFER, - SW_FAULT_ID_COMM_BUFFERS_COUNT_INVALID_BUFFER, - SW_FAULT_ID_FPGA_INVALID_IN_STATE, - SW_FAULT_ID_FPGA_INVALID_OUT_STATE, - SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, // 25 - SW_FAULT_ID_FPGA_WRITE_RSP_TOO_MUCH_DATA, - SW_FAULT_ID_FPGA_READ_CMD_TOO_MUCH_DATA, - SW_FAULT_ID_FPGA_READ_RSP_TOO_MUCH_DATA, - SW_FAULT_ID_MSG_QUEUES_ADD_QUEUE_FULL, - SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, // 30 - SW_FAULT_ID_MSG_QUEUES_GET_INVALID_QUEUE, - SW_FAULT_ID_MSG_QUEUES_IS_EMPTY_INVALID_QUEUE, - SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, - SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, - SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, // 35 - SW_FAULT_ID_DIAL_IN_FLOW_INVALID_DIAL_IN_PUMP_DIRECTION, - SW_FAULT_ID_DIAL_IN_FLOW_INVALID_DIAL_IN_PUMP_STATE, - SW_FAULT_ID_DIAL_IN_FLOW_SET_TOO_HIGH, - SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, - SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, // 40 - SW_FAULT_ID_DIAL_OUT_FLOW_SET_TOO_HIGH, - SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, - SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, - SW_FAULT_ID_RTC_EXEC_INVALID_STATE, - SW_FAULT_ID_RTC_SELF_TEST_INVALID_STATE, // 45 - SW_FAULT_ID_RTC_TRANSACTION_SERVICE_INVALID_STATE, - SW_FAULT_ID_PRES_OCCL_INVALID_STATE, - SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_SIGNAL_ACTION, - SW_FAULT_ID_ALARM_MGMT_INVALID_USER_ACTION, - SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL, // 50 - SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, - SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, - SW_FAULT_ID_MODE_TREATMENT_INVALID_ALARM_ACTION, - SW_FAULT_ID_MODE_PRE_TREATMENT_RESERVOIR_MGMT_INVALID_STATE, - SW_FAULT_ID_DIALYSIS_INVALID_STATE, // 55 - SW_FAULT_ID_DIALYSIS_INVALID_UF_STATE, - SW_FAULT_ID_NVDATAMGMT_INVALID_SELF_TEST_STATE, - SW_FAULT_ID_NVDATAMGMT_EXEC_INVALID_STATE, - SW_FAULT_ID_MODE_TREATMENT_INVALID_STATE, - SW_FAULT_ID_INTERRUPTS_INVALID_EDGE_DETECTED, // 60 - SW_FAULT_ID_INVALID_DG_PRESSURE_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, // 65 - SW_FAULT_ID_FPGA_UART_OVERRUN_ERROR, - SW_FAULT_ID_UTIL_TIME_WINDOWED_COUNT_ERROR, - SW_FAULT_ID_ACCEL_INVALID_STATE, - SW_FAULT_ID_ACCEL_GET_INVALID_AXIS, - SW_FAULT_ID_ACCEL_GET_MAX_INVALID_AXIS, // 70 - SW_FAULT_ID_ACCEL_INVALID_SELF_TEST_STATE, - SW_FAULT_ID_UTIL_INVALID_WIN_COUNT, - SW_FAULT_ID_UTIL_INVALID_WIN_MAX_COUNT, - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_STATE, - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_PARAM, // 75 - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_U32_PARAM, - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_S32_PARAM, - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_F32_PARAM, - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_U32_PARAM, - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_S32_PARAM, // 80 - SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_F32_PARAM, - SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, - SW_FAULT_ID_HD_VALVES_INVALID_SELF_TEST_STATE, - SW_FAULT_ID_HD_VALVES_INVALID_EXEC_STATE, - SW_FAULT_ID_HD_VALVES_INVALID_VALVE_SELECTED, // 85 - SW_FAULT_ID_HD_VALVES_INVALID_AIR_TRAP_REQUEST, - SW_FAULT_ID_HD_VALVES_INVALID_CONTROL_MODE_SELECTED, - SW_FAULT_ID_HD_VAVLES_INVALID_POSITION_SELECTED, - SW_FAULT_ID_AIR_TRAP_INVALID_STATE, - SW_FAULT_ID_AIR_TRAP_INVALID_LEVEL_SENSOR, // 90 - SW_FAULT_ID_DIALYSIS_INVALID_SALINE_BOLUS_STATE, - SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, - SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, - SW_FAULT_ID_SYSTEM_COMM_INVALID_FRAME_SIZE, - SW_FAULT_ID_SYSTEM_CMMM_CAN_TRANSMIT_REJECTED, // 95 - SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE, - SW_FAULT_ID_RINSEBACK_INVALID_STATE, - SW_FAULT_ID_TREATMENT_END_INVALID_STATE, - SW_FAULT_ID_TREATMENT_RECIRC_INVALID_STATE, - SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, // 100 - SW_FAULT_ID_MODE_PRIME_INVALID_ALARM_ACTION, - SW_FAULT_ID_INVALID_NVDATAMGMT_EXEC_CAL_STATE, - SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, - SW_FAULT_ID_HD_INVALID_DRY_SELF_TEST_STATE, - SW_FAULT_ID_HD_INVALID_WET_SELF_TEST_STATE, // 105 - SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_RECIRC_STATE, - SW_FAULT_ID_HD_INVALID_COMMAND_RESPONSE_ID, - SW_FAULT_ID_HD_INVALID_RESERVOIR_ID, - SW_FAULT_ID_HD_INVALID_VALVE_SETTING_ID, - SW_FAULT_ID_HD_INVALID_BLOOD_LEAK_STATE, // 110 - SW_FAULT_ID_HD_SYRINGE_INVALID_BOLUS_CMD, - SW_FAULT_ID_HD_SYRINGE_INVALID_CONT_CMD, - SW_FAULT_ID_HD_SYRINGE_INVALID_VREF, - SW_FAULT_ID_HD_SYRINGE_INVALID_STATE, - SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE, // 115 - SW_FAULT_ID_POST_TREATMENT_RESERVOIR_MGMT_INVALID_STATE, - SW_FAULT_ID_INVALID_DG_OPERATING_MODE, - SW_FAULT_ID_INVALID_LOAD_CELL_ID, - SW_FAULT_ID_MODE_STANDBY_INVALID_STATE, - SW_FAULT_ID_MODE_SAMPLE_WATER_INVALID_STATE, // 120 - SW_FAULT_ID_INVALID_ALARM_USER_ACTION, - SW_FAULT_ID_INVALID_RTI_NOTIFICATION, - SW_FAULT_ID_INVALID_CAN_MESSAGE_BOX, - SW_FAULT_ID_INVALID_CONSUMABLE_SELF_TEST_STATE, - SW_FAULT_ID_INVALID_CRC_ALGO, // 125 - NUM_OF_SW_FAULT_IDS -} SW_FAULT_ID_T; - // ********** public function prototypes ********** void initAlarmMgmt( void ); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u --- firmware/App/Services/AlarmMgmtSWFaults.h (revision 0) +++ firmware/App/Services/AlarmMgmtSWFaults.h (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -0,0 +1,162 @@ +/************************************************************************** +* +* Copyright (c) 2021 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. +* +* @file AlarmMgmt.h +* +* @author (last) Quang Nguyen +* @date (last) 19-May-2021 +* +* @author (original) Quang Nguyen +* @date (original) 19-May-2021 +* +***************************************************************************/ + +#ifndef __ALARM_MGMT_SW_FAULTS_H__ +#define __ALARM_MGMT_SW_FAULTS_H__ + +/** + * @addtogroup AlarmManagement + * @{ + */ + +// ********** public definitions ********** + +/// Listing of specific software faults for logging purposes. +typedef enum +{ + SW_FAULT_ID_NONE = 0, + SW_FAULT_ID_ALARM_LAMP_INVALID_PATTERN_REQUESTED, + SW_FAULT_ID_ALARM_LAMP_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH, + SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_STATE, + SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_DIRECTION, // 5 + SW_FAULT_ID_BUTTONS_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_BUTTONS_STOP_BUTTON_NOT_CONSUMED, + SW_FAULT_ID_INT_ADC_DATA_OVERRUN, + SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, + SW_FAULT_ID_MODE_INIT_POST_INVALID_POST_STATE, // 10 + SW_FAULT_ID_OP_MODES_ILLEGAL_MODE_TRANSITION_REQUESTED, + SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, + SW_FAULT_ID_OP_MODES_INVALID_MODE_REQUESTED, + SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, // 15 + SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, + SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, + SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, + SW_FAULT_ID_COMM_BUFFERS_ADD_INVALID_BUFFER, + SW_FAULT_ID_COMM_BUFFERS_GET_INVALID_BUFFER, // 20 + SW_FAULT_ID_COMM_BUFFERS_PEEK_INVALID_BUFFER, + SW_FAULT_ID_COMM_BUFFERS_COUNT_INVALID_BUFFER, + SW_FAULT_ID_FPGA_INVALID_IN_STATE, + SW_FAULT_ID_FPGA_INVALID_OUT_STATE, + SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, // 25 + SW_FAULT_ID_FPGA_WRITE_RSP_TOO_MUCH_DATA, + SW_FAULT_ID_FPGA_READ_CMD_TOO_MUCH_DATA, + SW_FAULT_ID_FPGA_READ_RSP_TOO_MUCH_DATA, + SW_FAULT_ID_MSG_QUEUES_ADD_QUEUE_FULL, + SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, // 30 + SW_FAULT_ID_MSG_QUEUES_GET_INVALID_QUEUE, + SW_FAULT_ID_MSG_QUEUES_IS_EMPTY_INVALID_QUEUE, + SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, + SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, // 35 + SW_FAULT_ID_DIAL_IN_FLOW_INVALID_DIAL_IN_PUMP_DIRECTION, + SW_FAULT_ID_DIAL_IN_FLOW_INVALID_DIAL_IN_PUMP_STATE, + SW_FAULT_ID_DIAL_IN_FLOW_SET_TOO_HIGH, + SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, + SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, // 40 + SW_FAULT_ID_DIAL_OUT_FLOW_SET_TOO_HIGH, + SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, + SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, + SW_FAULT_ID_RTC_EXEC_INVALID_STATE, + SW_FAULT_ID_RTC_SELF_TEST_INVALID_STATE, // 45 + SW_FAULT_ID_RTC_TRANSACTION_SERVICE_INVALID_STATE, + SW_FAULT_ID_PRES_OCCL_INVALID_STATE, + SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_SIGNAL_ACTION, + SW_FAULT_ID_ALARM_MGMT_INVALID_USER_ACTION, + SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL, // 50 + SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, + SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, + SW_FAULT_ID_MODE_TREATMENT_INVALID_ALARM_ACTION, + SW_FAULT_ID_MODE_PRE_TREATMENT_RESERVOIR_MGMT_INVALID_STATE, + SW_FAULT_ID_DIALYSIS_INVALID_STATE, // 55 + SW_FAULT_ID_DIALYSIS_INVALID_UF_STATE, + SW_FAULT_ID_NVDATAMGMT_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_NVDATAMGMT_EXEC_INVALID_STATE, + SW_FAULT_ID_MODE_TREATMENT_INVALID_STATE, + SW_FAULT_ID_INTERRUPTS_INVALID_EDGE_DETECTED, // 60 + SW_FAULT_ID_INVALID_DG_PRESSURE_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, // 65 + SW_FAULT_ID_FPGA_UART_OVERRUN_ERROR, + SW_FAULT_ID_UTIL_TIME_WINDOWED_COUNT_ERROR, + SW_FAULT_ID_ACCEL_INVALID_STATE, + SW_FAULT_ID_ACCEL_GET_INVALID_AXIS, + SW_FAULT_ID_ACCEL_GET_MAX_INVALID_AXIS, // 70 + SW_FAULT_ID_ACCEL_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_UTIL_INVALID_WIN_COUNT, + SW_FAULT_ID_UTIL_INVALID_WIN_MAX_COUNT, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_STATE, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_PARAM, // 75 + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_U32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_S32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_F32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_U32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_S32_PARAM, // 80 + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_F32_PARAM, + SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, + SW_FAULT_ID_HD_VALVES_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_HD_VALVES_INVALID_EXEC_STATE, + SW_FAULT_ID_HD_VALVES_INVALID_VALVE_SELECTED, // 85 + SW_FAULT_ID_HD_VALVES_INVALID_AIR_TRAP_REQUEST, + SW_FAULT_ID_HD_VALVES_INVALID_CONTROL_MODE_SELECTED, + SW_FAULT_ID_HD_VAVLES_INVALID_POSITION_SELECTED, + SW_FAULT_ID_AIR_TRAP_INVALID_STATE, + SW_FAULT_ID_AIR_TRAP_INVALID_LEVEL_SENSOR, // 90 + SW_FAULT_ID_DIALYSIS_INVALID_SALINE_BOLUS_STATE, + SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, + SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, + SW_FAULT_ID_SYSTEM_COMM_INVALID_FRAME_SIZE, + SW_FAULT_ID_SYSTEM_CMMM_CAN_TRANSMIT_REJECTED, // 95 + SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE, + SW_FAULT_ID_RINSEBACK_INVALID_STATE, + SW_FAULT_ID_TREATMENT_END_INVALID_STATE, + SW_FAULT_ID_TREATMENT_RECIRC_INVALID_STATE, + SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, // 100 + SW_FAULT_ID_MODE_PRIME_INVALID_ALARM_ACTION, + SW_FAULT_ID_INVALID_NVDATAMGMT_EXEC_CAL_STATE, + SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, + SW_FAULT_ID_HD_INVALID_DRY_SELF_TEST_STATE, + SW_FAULT_ID_HD_INVALID_WET_SELF_TEST_STATE, // 105 + SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_RECIRC_STATE, + SW_FAULT_ID_HD_INVALID_COMMAND_RESPONSE_ID, + SW_FAULT_ID_HD_INVALID_RESERVOIR_ID, + SW_FAULT_ID_HD_INVALID_VALVE_SETTING_ID, + SW_FAULT_ID_HD_INVALID_BLOOD_LEAK_STATE, // 110 + SW_FAULT_ID_HD_SYRINGE_INVALID_BOLUS_CMD, + SW_FAULT_ID_HD_SYRINGE_INVALID_CONT_CMD, + SW_FAULT_ID_HD_SYRINGE_INVALID_VREF, + SW_FAULT_ID_HD_SYRINGE_INVALID_STATE, + SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE, // 115 + SW_FAULT_ID_POST_TREATMENT_RESERVOIR_MGMT_INVALID_STATE, + SW_FAULT_ID_INVALID_DG_OPERATING_MODE, + SW_FAULT_ID_INVALID_LOAD_CELL_ID, + SW_FAULT_ID_MODE_STANDBY_INVALID_STATE, + SW_FAULT_ID_MODE_SAMPLE_WATER_INVALID_STATE, // 120 + SW_FAULT_ID_INVALID_ALARM_USER_ACTION, + SW_FAULT_ID_INVALID_RTI_NOTIFICATION, + SW_FAULT_ID_INVALID_CAN_MESSAGE_BOX, + SW_FAULT_ID_INVALID_CONSUMABLE_SELF_TEST_STATE, + SW_FAULT_ID_INVALID_CRC_ALGO, // 125 + NUM_OF_SW_FAULT_IDS +} SW_FAULT_ID_T; + +/**@}*/ + +#endif Index: firmware/App/Services/Integrity.c =================================================================== diff -u -r84bb8663dae71170e1743a2bed37b0aa47465b47 -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Services/Integrity.c (.../Integrity.c) (revision 84bb8663dae71170e1743a2bed37b0aa47465b47) +++ firmware/App/Services/Integrity.c (.../Integrity.c) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -27,12 +27,18 @@ // ********** private definitions ********** -#define CRC_TABLE_STARTING_ADDR 0x20 ///< The starting address of CRC table for firmware image. +#define CRC_TABLE_STARTING_ADDR 0x20 ///< The starting address of CRC table for firmware image. +#define MAX_CRC_CALC_DATA_SIZE 0x8000 ///< The maximum size of data for each CRC calculation. // ********** private data ********** + +static U32 currentRecord; ///< Current CRC table record to check. +static U32 currentProcessedSize; ///< Current data size processed for CRC calculation. +static U32 crcCalculated; ///< The calculated CRC value. +static SELF_TEST_STATUS_T integrityTestStatus; ///< Current firmware integrity test status. + +static U32 calculateCrc( U32 const crcValue, U08 * dataPtr, U32 size, U32 crcAlgoId ); -static BOOL checkCrc( CRC_RECORD const * const recPtr ); - /*********************************************************************//** * @brief * The initIntegrity function initializes the Integrity module. @@ -42,65 +48,86 @@ *************************************************************************/ void initIntegrity( void ) { + currentRecord = 0; + currentProcessedSize = 0; + crcCalculated = 0; + integrityTestStatus = SELF_TEST_STATUS_IN_PROGRESS; } /*********************************************************************//** * @brief * The execIntegrityTest function executes the integrity check for firmware image. * @details Inputs: firmware image CRC table * @details Outputs: none - * @return Firmware image integrity self-test status + * @return firmware image integrity self-test status *************************************************************************/ SELF_TEST_STATUS_T execIntegrityTest( void ) { CRC_TABLE const * const crcTablePtr = (CRC_TABLE *)CRC_TABLE_STARTING_ADDR; + CRC_RECORD const * const currentRecordPtr = &crcTablePtr->recs[ currentRecord ]; BOOL integrityStatus = TRUE; - SELF_TEST_STATUS_T result; - U32 i; + U32 remainingSize = 0; - for ( i = 0; i < crcTablePtr->num_recs; ++i ) + if ( currentRecord < crcTablePtr->num_recs ) { - integrityStatus &= checkCrc( &crcTablePtr->recs[i] ); + remainingSize = currentRecordPtr->size - currentProcessedSize; + + if ( remainingSize > MAX_CRC_CALC_DATA_SIZE ) + { + crcCalculated = calculateCrc( crcCalculated, (U08 *)( currentRecordPtr->addr + currentProcessedSize ), MAX_CRC_CALC_DATA_SIZE, currentRecordPtr->crc_alg_ID ); + currentProcessedSize += MAX_CRC_CALC_DATA_SIZE; + } + else + { + crcCalculated = calculateCrc( crcCalculated, (U08 *)( currentRecordPtr->addr + currentProcessedSize ), remainingSize, currentRecordPtr->crc_alg_ID ); + integrityStatus &= ( ( (U32)currentRecordPtr->crc_value == crcCalculated ) ? TRUE : FALSE ); + crcCalculated = 0; + currentProcessedSize = 0; + currentRecord++; + } } - if ( TRUE == integrityStatus ) + if ( TRUE != integrityStatus ) { - result = SELF_TEST_STATUS_PASSED; + integrityTestStatus = SELF_TEST_STATUS_FAILED; + activateAlarmNoData( ALARM_ID_HD_INTEGRITY_POST_TEST_FAILED ); } - else + else if ( currentRecord == crcTablePtr->num_recs ) { - result = SELF_TEST_STATUS_FAILED; - activateAlarmNoData( ALARM_ID_HD_INTEGRITY_POST_TEST_FAILED ); + integrityTestStatus = SELF_TEST_STATUS_PASSED; } - return result; + return integrityTestStatus; } /*********************************************************************//** * @brief - * The checkCrc function computes the CRC on given memory section and CRC - * algorithm. Then it compares with calculated CRC created by linker. + * The calculateCrc function computes the CRC on the given memory section + * and CRC algorithm. * @details Inputs: none * @details Outputs: none - * @param recPtr CRC record data pointer - * @return TRUE if two CRCs are matched, otherwise FALSE + * @param crcValue crc initial value + * @param dataPtr pointer to data record for CRC calculation + * @param size data size to calculate crc + * @param crcAlgoId CRC algorithm id number + * @return calculated CRC value *************************************************************************/ -static BOOL checkCrc( CRC_RECORD const * const recPtr ) +static U32 calculateCrc( U32 const crcValue, U08 * dataPtr, U32 size, U32 crcAlgoId ) { - U32 crcCalculated = 0; + U32 crcCalc = 0; - switch ( recPtr->crc_alg_ID ) + switch ( crcAlgoId ) { case CRC32_C: - crcCalculated = crc32( (U08 *)recPtr->addr, recPtr->size ); + crcCalc = crc32( crcValue, dataPtr, size ); break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CRC_ALGO, recPtr->crc_alg_ID ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_CRC_ALGO, crcAlgoId ) break; } - return ( (U32)recPtr->crc_value == crcCalculated ) ? TRUE : FALSE; + return crcCalc; } /**@}*/ Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r84bb8663dae71170e1743a2bed37b0aa47465b47 -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 84bb8663dae71170e1743a2bed37b0aa47465b47) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -542,21 +542,21 @@ /*********************************************************************//** * @brief - * The sendTreatmentPeriodDataToUI function constructs a treatment period + * The sendTreatmentPeriodicDataToUI function constructs a treatment periodic * data message to the UI and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none * @details Outputs: Treatment parameter ranges msg constructed and queued. * @param periodDataPtr treatment log period data record pointer * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL sendTreatmentPeriodDataToUI( TREATMENT_LOG_DATA_PERIODIC_T * periodDataPtr ) +BOOL sendTreatmentPeriodicDataToUI( TREATMENT_LOG_DATA_PERIODIC_T * periodDataPtr ) { MESSAGE_T msg; U08 *payloadPtr = msg.payload; // Create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_HD_TREATMENT_LOG_PERIOD_DATA; + msg.hdr.msgID = MSG_ID_HD_TREATMENT_LOG_PERIODIC_DATA; msg.hdr.payloadLen = sizeof( TREATMENT_LOG_DATA_PERIODIC_T ); memcpy( payloadPtr, periodDataPtr, sizeof( TREATMENT_LOG_DATA_PERIODIC_T ) ); Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r84bb8663dae71170e1743a2bed37b0aa47465b47 -r40e0116bbada6d1780bfa832a9c4684ba9fcfcc8 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 84bb8663dae71170e1743a2bed37b0aa47465b47) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 40e0116bbada6d1780bfa832a9c4684ba9fcfcc8) @@ -149,8 +149,8 @@ // MSG_ID_TREATMENT_PARAM_CHANGE_RANGES BOOL sendTreatmentParamsRangesToUI( U32 minTime, U32 maxTime, F32 minUFVol, F32 maxUFVol, U32 minDialRate, U32 maxDialRate ); -// MSG_ID_HD_TREATMENT_LOG_PERIOD_DATA -BOOL sendTreatmentPeriodDataToUI( TREATMENT_LOG_DATA_PERIODIC_T * periodDataPtr ); +// MSG_ID_HD_TREATMENT_LOG_PERIODIC_DATA +BOOL sendTreatmentPeriodicDataToUI( TREATMENT_LOG_DATA_PERIODIC_T * periodDataPtr ); // MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST void handleChangeBloodDialysateRateChangeRequest( MESSAGE_T *message );