Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -46,7 +46,7 @@ #define HEATERS_DISINFECT_TRANSFER_DUTY_CYCLE 0.60F ///< Heaters disinfect transfer duty cycle. #define HEATERS_DISINFECT_TEMPERATURE_DRIFT_C 3.0F ///< Heaters disinfect temperature drift in C. #define HEATERS_ZERO_DELTA_TEMP_C 0.0F ///< Heaters zero delta temperature in C. -#define HEATERS_DUTY_CYCLE_CONVERSION_FACTOR 127.0F ///< Heaters duty cycle 0: OFF, 127: 100% duty cycle. +#define HEATERS_DUTY_CYCLE_CONVERSION_FACTOR 100.0F ///< Heaters duty cycle 0: OFF, 100: 100% duty cycle. #define PRIMARY_HEATER_P_COEFFICIENT 1.0F ///< P Term for primary heater control. #define PRIMARY_HEATER_I_COEFFICIENT 1.0F ///< I Term for primary heater control. Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -rbce6e6d1cfb6e8a0b186419416460ead3a44e5e1 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision bce6e6d1cfb6e8a0b186419416460ead3a44e5e1) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -448,7 +448,7 @@ /*********************************************************************//** * @brief - * The publishValvesStates function publishes DG valves states at the set interval. + * The publishValvesStates function publishes DD valves states at the set interval. * @details \b Inputs: valvesStatesPublicationTimerCounter * @details \b Outputs: valvesStatesPublicationTimerCounter * @details \b Messages: MSG_ID_DD_VALVES_STATES_DATA to publish FPGA read valve states. Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -rbce6e6d1cfb6e8a0b186419416460ead3a44e5e1 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision bce6e6d1cfb6e8a0b186419416460ead3a44e5e1) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -69,7 +69,7 @@ NUM_OF_VALVES ///< Number of valves } VALVES_T; -/// Enumeration of available valve state names per valve type (from SA and DG SRS documents). +/// Enumeration of available valve state names per valve type (from SA and DD SRS documents). typedef enum ValveStateNames { VALVE_STATE_OPEN = 0, ///< Open valve state, Index: firmware/App/DDCommon.h =================================================================== diff -u -rd741f651b63edc7695b2be2178c9e5c44aaed1f3 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/DDCommon.h (.../DDCommon.h) (revision d741f651b63edc7695b2be2178c9e5c44aaed1f3) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -49,32 +49,32 @@ #pragma pack(push,1) -/// Payload record structure for an HD versions message. +/// Payload record structure for an TD versions message. typedef struct { - U08 major; ///< HD version major revision. - U08 minor; ///< HD version minor revision. - U08 micro; ///< HD version micro revision. - U16 build; ///< HD build version. - U08 fpgaId; ///< HD FPGA ID. - U08 fpgaMajor; ///< HD FPGA major revision. - U08 fpgaMinor; ///< HD FPGA minor revision. - U08 fpgaLab; ///< HD FPGA lab revision. - U32 compatibilityRev; ///< HD compatibility revision. -} HD_VERSIONS_T; + U08 major; ///< TD version major revision. + U08 minor; ///< TD version minor revision. + U08 micro; ///< TD version micro revision. + U16 build; ///< TD build version. + U08 fpgaId; ///< TD FPGA ID. + U08 fpgaMajor; ///< TD FPGA major revision. + U08 fpgaMinor; ///< TD FPGA minor revision. + U08 fpgaLab; ///< TD FPGA lab revision. + U32 compatibilityRev; ///< TD compatibility revision. +} TD_VERSIONS_T; /// DD version struct. typedef struct { - U08 major; ///< DG version major revision. - U08 minor; ///< DG version major revision. - U08 micro; ///< DG version micro revision. - U16 build; ///< DG build version. - U08 fpgaId; ///< DG FPGA ID. - U08 fpgaMajor; ///< DG FPGA major revision. - U08 fpgaMinor; ///< DG FPGA minor revision. - U08 fpgaLab; ///< DG FPGA lab revision. - U32 compatibilityRev; ///< DG compatibility revision. + U08 major; ///< DD version major revision. + U08 minor; ///< DD version major revision. + U08 micro; ///< DD version micro revision. + U16 build; ///< DD build version. + U08 fpgaId; ///< DD FPGA ID. + U08 fpgaMajor; ///< DD FPGA major revision. + U08 fpgaMinor; ///< DD FPGA minor revision. + U08 fpgaLab; ///< DD FPGA lab revision. + U32 compatibilityRev; ///< DD compatibility revision. } DD_VERSIONS_T; /// Record defining the fields in a UI version request message. Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -re7fe0454b5b2d39009dc784dc8c156856df8bc86 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision e7fe0454b5b2d39009dc784dc8c156856df8bc86) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -26,9 +26,9 @@ // ********** private definitions ********** -#define MAX_ADC_CHANNELS 24 ///< DG internal ADC supports up to 24 channels. -#define SIZE_OF_ROLLING_AVG 16 ///< Number of DG internal ADC samples in rolling average calculations for each channel. -#define ROLLING_AVG_SHIFT_DIVIDER 4 ///< Rolling average shift divider for DG internal ADC readings. +#define MAX_ADC_CHANNELS 24 ///< DD internal ADC supports up to 24 channels. +#define SIZE_OF_ROLLING_AVG 16 ///< Number of DD internal ADC samples in rolling average calculations for each channel. +#define ROLLING_AVG_SHIFT_DIVIDER 4 ///< Rolling average shift divider for DD internal ADC readings. /// ADC channel number to ADC channel ID (enumeration) look-up table. const INT_ADC_CHANNEL_T adcChannelNum2ChannelId[ MAX_ADC_CHANNELS ] = Index: firmware/App/Modes/BalancingChamber.c =================================================================== diff -u -r6679a2cd813b21a8cb4c58b3eeb721e0eef9a10b -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Modes/BalancingChamber.c (.../BalancingChamber.c) (revision 6679a2cd813b21a8cb4c58b3eeb721e0eef9a10b) +++ firmware/App/Modes/BalancingChamber.c (.../BalancingChamber.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -340,7 +340,8 @@ } else { - //TODO : Alarm handling when pressure is not in range + //Alarm when pressure is not in range + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE1_FILL_START_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); } return state; @@ -408,7 +409,8 @@ { if ( TRUE != isPressureStalbilizedDuringFill ) { - // TODO : Alarm handling for switching time expired, but still pressure not in range, + // Alarm when switching time expired, but still pressure not in range, + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE1_FILL_END_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); } else { @@ -453,7 +455,8 @@ } else { - //TODO : Alarm handling when pressure is not in range + //Alarm when pressure is not in range + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE2_FILL_START_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); } return state; } @@ -494,7 +497,8 @@ { if ( TRUE != isPressureStalbilizedDuringFill ) { - // TODO : Alarm handling for switching time expired, but still pressure not in range, + // Alarm when switching time expired, but still pressure not in range, + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DD_BC_STATE2_FILL_END_PRESSURE_OUT_OF_RANGE, freshDialPressure, spentDialPressure ); } else { Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r18b882b6a3c8757fca583eb828506c5b485a5c01 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 18b882b6a3c8757fca583eb828506c5b485a5c01) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -40,7 +40,7 @@ #define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. #define SPENT_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. -#define HYD_CHAMBER_FLUID_TEMP_C_MIN 35.0F ///< Minimum hydraulics fluid temperature in deg celcius +#define HYD_CHAMBER_FLUID_TEMP_C_MIN 35.0F ///< Minimum hydraulics fluid temperature in deg celcius #define HYD_CHAMBER_PRES_CHECK_TIME_OUT ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when hydraulics chamber pressure check initiated #define SPENT_DIAL_PRES_CHECK_TIME_OUT ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when spent dialysate pressure check initiated #define HYD_CHAMBER_TARGET_NEG_PRESS_MIN_PSI (-11.7877F) ///< Hydraulics chamber minimum negative pressure(D9/PHo) in psi. @@ -417,6 +417,7 @@ else if ( TRUE == didTimeout( hydChamberPressureCheckStartTimeMS, HYD_CHAMBER_PRES_CHECK_TIME_OUT ) ) { // time out alarm and pause the dialysate generation? + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DD_GEND_HYD_CHAMBER_PRESS_OUT_OF_RANGE, hydPressure ); state = DD_GEND_DIALYSATE_DELIVERY_PAUSE; } @@ -447,6 +448,7 @@ else if ( TRUE == didTimeout( hydChamberPressureCheckStartTimeMS, HYD_CHAMBER_PRES_CHECK_TIME_OUT ) ) { // time out alarm and pause the dialysate generation? + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DD_GEND_FRESH_DIAL_PRESS_OUT_OF_RANGE, hydPressure ); state = DD_GEND_DIALYSATE_DELIVERY_PAUSE; } @@ -478,6 +480,7 @@ else if ( TRUE == didTimeout( spentDialPressureCheckStartTimeMS, SPENT_DIAL_PRES_CHECK_TIME_OUT ) ) { // time out alarm and pause the dialysate generation? + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DD_GEND_SPENT_DIAL_PRESS_OUT_OF_RANGE, spentdialPressure ); state = DD_GEND_DIALYSATE_DELIVERY_PAUSE; } Index: firmware/App/Monitors/Pressure.c =================================================================== diff -u -rc85d9f0a8023fabdf1cd557965958d225e2b9085 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision c85d9f0a8023fabdf1cd557965958d225e2b9085) +++ firmware/App/Monitors/Pressure.c (.../Pressure.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -341,12 +341,12 @@ *************************************************************************/ static void filterPressureSensorReadings( void ) { - U32 i; + PRESSURE_SENSORS_T i; - for ( i = (U32)PRESSURE_SENSOR_FIRST; i < (U32)NUM_OF_PRESSURE_SENSORS; i++ ) + for ( i = PRESSURE_SENSOR_FIRST; i < NUM_OF_PRESSURE_SENSORS; i++ ) { - F32 pressureinmmHG = getPressure( (PRESSURE_SENSORS_T)i ); - F32 pressure = getConvertedPressure( (PRESSURE_SENSORS_T)i, pressureinmmHG ); + F32 pressureinmmHG = getPressure( i ); + F32 pressure = getConvertedPressure( i, pressureinmmHG ); if ( filteredPressureReadings[i].pressureReadingsCount >= SIZE_OF_PRESSURE_ROLLING_AVG ) { @@ -370,11 +370,11 @@ *************************************************************************/ static void filterPressureSensorTemperatureReadings( void ) { - U32 i; + PRESSURE_SENSORS_T i; - for ( i = (U32)PRESSURE_SENSOR_FIRST; i < (U32)NUM_OF_PRESSURE_SENSORS; i++ ) + for ( i = PRESSURE_SENSOR_FIRST; i < NUM_OF_PRESSURE_SENSORS; i++ ) { - F32 pressureTemperature = getPressureSensorTemperature( (PRESSURE_SENSORS_T)i ); + F32 pressureTemperature = getPressureSensorTemperature( i ); if ( filteredPressureTempReadings[i].pressureTempReadingsCount >= SIZE_OF_PRESSURETEMP_ROLLING_AVG ) { Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r8652f0beb501b3f8c22f3c721eb845acd2fd5301 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 8652f0beb501b3f8c22f3c721eb845acd2fd5301) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -132,6 +132,7 @@ SW_FAULT_ID_INVALID_TD_OPERATING_MODE = 101, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE = 102, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE1 = 103, + SW_FAULT_ID_INVALID_RO_OPERATING_MODE = 104, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -rbce6e6d1cfb6e8a0b186419416460ead3a44e5e1 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision bce6e6d1cfb6e8a0b186419416460ead3a44e5e1) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -198,17 +198,17 @@ U08 fpgaValveUFStates; ///< Reg 364. Ultrafiltration Valves states U08 fpgaValveUFPWMStates; ///< Reg 365. Ultrafiltration Valves PWM states U08 fpgaCPACPBFault; ///< Reg 366. Concentrate pump fault register for CPA and CPB - U16 fpgaCPAHallSense; ///< Reg 367. Concentrate pump CPA hall sensor pulse width - U16 fpgaCPBHallSense; ///< Reg 369. Concentrate pump CPB hall sensor pulse width + U08 fpgaRTDCountErrorCycles; ///< Reg 367. Count of each incomplete seq of reads from RTD ADC. + U16 fpgaCPAHallSense; ///< Reg 368. Concentrate pump CPA hall sensor pulse width + U16 fpgaCPBHallSense; ///< Reg 370. Concentrate pump CPB hall sensor pulse width - F32 fpgaTax1Temp; ///< Reg 371. Inlet heat exchanger temperature - F32 fpgaTH2Temp; ///< Reg 375. Inlet heat exchanger temperature - F32 fpgaTH1Temp; ///< Reg 379. Hydraulics primary heater temperature - F32 fpgaTH3Temp; ///< Reg 383. Trimmer heater temperature - U08 fpgaRTDReadCnt; ///< Reg 387. Read count for all RTD sensors + F32 fpgaTax1Temp; ///< Reg 372. Inlet heat exchanger temperature + F32 fpgaTH2Temp; ///< Reg 376. Inlet heat exchanger temperature + F32 fpgaTH1Temp; ///< Reg 380. Hydraulics primary heater temperature + F32 fpgaTH3Temp; ///< Reg 384. Trimmer heater temperature + U08 fpgaRTDReadCnt; ///< Reg 388. Read count for all RTD sensors - U08 fpgaBaroReadCount; ///< Reg 388. Barometric sensor read count - U08 fpgaBaroErrorCount; ///< Reg 389. Barometric sensor error count + U08 fpgaBaroReadCount; ///< Reg 389. Barometric sensor read count U16 fpgaBaroManufacInfo; ///< Reg 390. Barometric sensor manufacturing information U16 fpgaBaroPROMCoeff1; ///< Reg 392. Barometric sensor PROM coefficient 1 U16 fpgaBaroPROMCoeff2; ///< Reg 394. Barometric sensor PROM coefficient 2 @@ -222,13 +222,14 @@ U16 fpgaDGPMeasuredSpeed; ///< Reg 414. Fresh dialysate pump measured speed U16 fpgaSDPMeasuredSpeed; ///< Reg 416. Spent dialysate pump measured speed - U08 fpgaDGPSDPPumpStatus; ///< Reg 418. Dialysate pumps Error status - U16 fpgaDGPCurrentFeedback; ///< Reg 419. Fresh dialysate pump current feedback - U16 fpgaSDPCurrentFeedback; ///< Reg 421. Spent dialysate pump current feedback - U08 fpgaDGPHallStatus; ///< Reg 423. Fresh dialysate pump hall sensor direction status - U08 fpgaSDPHallStatus; ///< Reg 424. Spent dialysate pump hall sensor direction status - U08 fpgaFloater1Status; ///< Reg 425. Floater 1 level sensor status - U08 fpgaFloater2Status; ///< Reg 426. Floater 2 level sensor status + U08 fpgaBaroErrorCount; ///< Reg 418. Barometric sensor Error count + U08 fpgaDGPSDPPumpStatus; ///< Reg 419. Dialysate pumps Error status + U16 fpgaDGPCurrentFeedback; ///< Reg 420. Fresh dialysate pump current feedback + U16 fpgaSDPCurrentFeedback; ///< Reg 422. Spent dialysate pump current feedback + U08 fpgaDGPHallStatus; ///< Reg 424. Fresh dialysate pump hall sensor direction status + U08 fpgaSDPHallStatus; ///< Reg 425. Spent dialysate pump hall sensor direction status + U08 fpgaFloater1Status; ///< Reg 426. Floater 1 level sensor status + U08 fpgaFloater2Status; ///< Reg 427. Floater 2 level sensor status } DD_FPGA_SENSORS_T; typedef struct @@ -281,7 +282,6 @@ U16 fpgaVWiPWMPeriod; ///< Reg 88. VWi PWM period U16 fpgaVWiPWMPullin; ///< Reg 90. VWi PWM pull in - U08 fpgaBCValveControl; ///< Reg 92. Balancing Chamber Valves Control Registers U08 fpgaBCValvePWMControl; ///< Reg 93. Balancing Chamber Valves PWM control U08 fpgaUFValveControl; ///< Reg 94. Ultra filtration Valves Control Registers @@ -310,6 +310,14 @@ U08 fpgaBloodLeakFIFOTx; ///< Reg 126. Blood leak sensor FIFO transmit control U08 fpgaPrimaryHeaterPWMControl; ///< Reg 127. Primary heater PWM control U08 fpgaTrimmerHeaterPWMControl; ///< Reg 128. Trimmer heater PWM control + U08 fpgaNotUsed; ///< Reg 129. Not used + + U16 fpgaVBCPWMLow; ///< Reg 130. VBC PWM low ( Balancing chamber valves) + U16 fpgaVBCPWMPeriod; ///< Reg 132. VBC PWM period + U16 fpgaVBCPWMPullin; ///< Reg 134. VBC PWM pull in + U16 fpgaVUFPWMLow; ///< Reg 136. VUF PWM low ( Ultra filteration valves ) + U16 fpgaVUFPWMPeriod; ///< Reg 138. VUF PWM period + U16 fpgaVUFPWMPullin; ///< Reg 140. VUF PWM pull in } FPGA_ACTUATORS_T; #pragma pack(pop) @@ -420,7 +428,8 @@ { if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CLOCK_SPEED_ERROR ) ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_FPGA_CLOCK_SPEED_CHECK_FAILURE, diffFPGATimerCount, diffTimerCount ); + //TODO : Enable alarm later + //SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_FPGA_CLOCK_SPEED_CHECK_FAILURE, diffFPGATimerCount, diffTimerCount ); } } } @@ -2358,6 +2367,19 @@ /*********************************************************************//** * @brief + * The getFPGARTDCountErrorCycles function gets the FPGA incomplete sequences + * of reads from RTD ADC. + * @details \b Inputs: fpgaSensorReadings + * @details \b Outputs: none + * @return count of in-complete sequences of reads from RTD ADC. + *************************************************************************/ +U08 getFPGARTDCountErrorCycles( void ) +{ + return fpgaSensorReadings.fpgaRTDCountErrorCycles; +} + +/*********************************************************************//** + * @brief * The getFPGABaroReadCount function gets the FPGA barometric sensor read count. * @details \b Inputs: fpgaSensorReadings * @details \b Outputs: none @@ -2377,7 +2399,7 @@ *************************************************************************/ U08 getFPGABaroErrorCount( void ) { - return fpgaSensorReadings.fpgaBaroErrorCount; + return fpgaSensorReadings.fpgaBaroErrorCount; } /*********************************************************************//** @@ -2525,7 +2547,8 @@ { if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_COMM_FAILURES ) ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_FPGA_COMM_TIMEOUT, MAX_FPGA_COMM_FAILURES, (U32)fpgaSensorReadings.fpgaIOErrorCntProcessor ) + //TODO : Enable alarm later + //SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_FPGA_COMM_TIMEOUT, MAX_FPGA_COMM_FAILURES, (U32)fpgaSensorReadings.fpgaIOErrorCntProcessor ) } } } @@ -2553,7 +2576,8 @@ { if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_COMM_FAILURES ) ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_FPGA_COMM_TIMEOUT, MAX_FPGA_COMM_FAILURES, (U32)fpgaSensorReadings.fpgaIOErrorCntProcessor ) + //TODO : Enable alarm later + //SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_FPGA_COMM_TIMEOUT, MAX_FPGA_COMM_FAILURES, (U32)fpgaSensorReadings.fpgaIOErrorCntProcessor ) status = TRUE; } } Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -rbce6e6d1cfb6e8a0b186419416460ead3a44e5e1 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision bce6e6d1cfb6e8a0b186419416460ead3a44e5e1) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -201,6 +201,7 @@ U32 getFPGAHydraulicsPrimaryHeaterTemp( void ); U32 getFPGATrimmerHeaterTemp( void ); U08 getFPGARTDReadCount( void ); +U08 getFPGARTDCountErrorCycles( void ); //Barometric sensor U08 getFPGABaroReadCount( void ); Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r6679a2cd813b21a8cb4c58b3eeb721e0eef9a10b -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 6679a2cd813b21a8cb4c58b3eeb721e0eef9a10b) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -131,6 +131,7 @@ MSG_ID_DD_HEATERS_START_STOP_OVERRIDE_REQUEST, MSG_ID_DD_VALVES_OPEN_CLOSE_STATE_OVERRIDE_REQUEST, MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, + MSD_ID_DD_RO_COMMUNICATION_STATUS_OVERRIDE_REQUEST, //50 }; /// Message handling function table @@ -174,7 +175,7 @@ &testHeaterDutyCycleOverride, &testLevelsDataPublishIntervalOverride, &testLevelStatusOverride, - &testTDCommunicationStatus, //40 + &testTDCommunicationStatusOverride, //40 &testDDOpModePublishIntervalOverride, &testSetOperationMode, &testDDstartGenDialysateOverride, @@ -184,6 +185,7 @@ &testHeaterStartStopOverride, &testValveOpenCloseStateOverride, &handleDialysateDeliveryRequestMsg, + &testROCommunicationStatusOverride, //50 }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLERS) / sizeof(MsgFuncPtr)) @@ -382,7 +384,8 @@ COMM_BUFFER_T respBuffer = tdResponseBuffers[ message->in_buffer ]; // if Dialin message, ensure Dialin is logged in before processing it - if ( ( message->hdr.msgID <= MSG_ID_FIRST_DD_TESTER_MESSAGE ) || + if ( ( message->hdr.msgID < MSG_ID_FIRST_TD_TESTER_MESSAGE ) || + ( MSG_ID_FIRST_DD_TESTER_MESSAGE == message->hdr.msgID ) || ( TRUE == isTestingActivated() ) ) { MsgFuncPtr msgFuncPtr; @@ -396,7 +399,7 @@ } } // ACK/NAK request - if ( message->hdr.msgID < MSG_ID_FIRST_DD_TESTER_MESSAGE ) + if ( message->hdr.msgID < MSG_ID_FIRST_TD_TESTER_MESSAGE ) { if ( respBuffer != COMM_BUFFER_NOT_USED ) { Index: firmware/App/Services/ROInterface.c =================================================================== diff -u --- firmware/App/Services/ROInterface.c (revision 0) +++ firmware/App/Services/ROInterface.c (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -0,0 +1,227 @@ +/************************************************************************** +* +* Copyright (c) 2024-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. +* +* @file ROInterface.c +* +* @author (last) Vinayakam Mani +* @date (last) 19-Nov-2024 +* +* @author (original) Vinayakam Mani +* @date (original) 19-Nov-2024 +* +***************************************************************************/ + +#include "Messaging.h" +#include "MessagePayloads.h" +#include "ModeInitPOST.h" +#include "ModeStandby.h" +#include "OperationModes.h" +#include "PersistentAlarm.h" +#include "ROInterface.h" +#include "SystemCommDD.h" +#include "TaskGeneral.h" +#include "Timers.h" + +/** + * @addtogroup ROInterface + * @{ + */ + +// ********** private definitions ********** + +#define RO_DATA_FRESHNESS_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< RO data freshness timeout (in ms). +#define MAX_RO_FLOW_RATE ( 700.0F ) ///< Max RO pump flow rate + +// ********** private data ********** + +static RO_OP_MODE_T roCurrentOpMode; ///< Current TD operation mode. +static U32 roSubMode; ///< Current state (sub-mode) of current TD operation mode. +static F32 roFlowRate; ///< RO flow rate + +static BOOL roOpModeDataFreshFlag = FALSE; ///< Flag to signal/process fresh RO op mode data + +// ********** private function prototypes ********** + +static void checkRODataFreshness( ALARM_ID_T alarmID, BOOL *roFreshDataFlag ); + +/*********************************************************************//** + * @brief + * The initROInterface function initializes the RO Interface unit. + * @details \b Inputs: none + * @details \b Outputs: RO Interface unit initialized. + * @return none + *************************************************************************/ +void initROInterface( void ) +{ + // Initialize unit variables + roCurrentOpMode = RO_MODE_INIT; + roSubMode = 0; + roFlowRate = MAX_RO_FLOW_RATE; +} + +/**********************************************************************//** + * @brief + * The checkRODataFreshness function checks the freshness of data coming from + * the RO sub-system. + * @details \b Alarm: Given alarm is triggered if RO is communicating but has + * not published new data for too long. + * @details \b Inputs: RO communicating flag + * @details \b Outputs: none + * @param alarm ID of alarm to check + * @param roFreshDataFlag Pointer to flag indicating whether new data has been + * received since last time this function has seen it. + * @return None + *************************************************************************/ +static void checkRODataFreshness( ALARM_ID_T alarmID, BOOL *roFreshDataFlag ) +{ + if ( TRUE == *roFreshDataFlag ) + { + *roFreshDataFlag = FALSE; + checkPersistentAlarm( alarmID, FALSE, 0.0, 0.0 ); + } + else + { // Alarm if not receiving RO fresh data message in timely manner + if ( TRUE == isROCommunicating() ) + { + checkPersistentAlarm( alarmID, TRUE, 0.0, 0.0 ); + } + else + { + checkPersistentAlarm( alarmID, FALSE, 0.0, 0.0 ); + } + } +} + +/*********************************************************************//** + * @brief + * The execROInterfaceMonitor function executes the RO Interface monitoring + * function. Ensures RO is sending fresh data in a timely manner. + * @details \b Inputs: none + * @details \b Outputs: none + * @return none + *************************************************************************/ +void execROInterfaceMonitor( void ) +{ + +} + +/*********************************************************************//** + * @brief + * The cmdROStartStop function sends a start/stop command to RO to deliver + * purified water and required flow rate. + * @details Inputs: none + * @details Outputs: start/stop command along with flow rate if applicable. + * @param startStop To start/stop the RO delivery. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL cmdROStartStop( BOOL startStop) +{ + RO_WATER_REQ_PAYLOAD_T roStartRequest; + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Populate RO start message + roStartRequest.start = startStop; + roStartRequest.roRate = getROFlowRate(); + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DD_RO_START_STOP_CMD_REQUEST; + msg.hdr.payloadLen = sizeof( RO_WATER_REQ_PAYLOAD_T ); + + memcpy( payloadPtr, &roStartRequest, sizeof( RO_WATER_REQ_PAYLOAD_T ) ); + + // 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_DD_2_RO, ACK_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief + * The setROFlowRate function sets the RO pump flow rate to deliver purified + * water. + * @details \b Inputs: none + * @details \b Outputs: roFlowRate + * @return none. + *************************************************************************/ +void setROFlowRate( F32 roFlow ) +{ + roFlowRate = roFlow; +} + +/*********************************************************************//** + * @brief + * The getROFlowRate function gets the RO flow rate. + * @details \b Inputs: Ro flow rate + * @details \b Outputs: none + * @return latest RO pump flow rate. + *************************************************************************/ +F32 getROFlowRate( void ) +{ + return roFlowRate; +} + +/*********************************************************************//** + * @brief + * The getROOpMode function gets the current latest reported RO operating mode. + * @details \b Inputs: roCurrentOpMode + * @details \b Outputs: none + * @return Latest reported RO operating mode. + *************************************************************************/ +RO_OP_MODE_T getROOpMode( void ) +{ + return roCurrentOpMode; +} + +/*********************************************************************//** + * @brief + * The getROSubMode function gets the latest reported RO operating sub-mode. + * @details \b Inputs: roSubMode + * @details \b Outputs: none + * @return Latest reported RO operating sub-mode. + *************************************************************************/ +U32 getROSubMode( void ) +{ + return roSubMode; +} + +/*********************************************************************//** + * @brief + * The setROOpMode function sets the latest RO operating mode reported by + * the RO (called by RO published message handler). + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if reported RO mode is invalid. + * @details \b Inputs: none + * @details \b Outputs: roCurrentOpMode, roSubMode, roOpModeDataFreshFlag + * @param opMode The operating mode reported by RO + * @param subMode The sub-mode of operating mode reported by RO + * @return none + *************************************************************************/ +void setROOpMode( U32 opMode, U32 subMode ) +{ + if ( opMode < NUM_OF_RO_MODES ) + { + // update RO op mode and sub-mode + roCurrentOpMode = (RO_OP_MODE_T)opMode; + roSubMode = subMode; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_RO_OPERATING_MODE, opMode ); + } + + roOpModeDataFreshFlag = TRUE; +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/**@}*/ Index: firmware/App/Services/ROInterface.h =================================================================== diff -u --- firmware/App/Services/ROInterface.h (revision 0) +++ firmware/App/Services/ROInterface.h (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -0,0 +1,53 @@ +/************************************************************************** +* +* Copyright (c) 2024-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. +* +* @file ROInterface.h +* +* @author (last) Vinayakam Mani +* @date (last) 19-Nov-2024 +* +* @author (original) Vinayakam Mani +* @date (original) 19-Nov-2024 +* +***************************************************************************/ + +#ifndef __RO_INTERFACE_H__ +#define __RO_INTERFACE_H__ + +#include "DDCommon.h" +#include "TDDefs.h" +#include "RODefs.h" + +/** + * @defgroup ROInterface ROInterface + * @brief RO interface & monitor unit. Interfaces with and monitors the + * RO (Prefilteration and purification or Reverse Osmosis) sub-system. + * + * @addtogroup ROInterface + * @{ + */ + +// ********** public definitions ********** + + + +// ********** public function prototypes ********** + +void initROInterface( void ); +void execROInterfaceMonitor( void ); + +BOOL cmdROStartStop( BOOL startStop); +void setROFlowRate( F32 roFlow ); +F32 getROFlowRate( void ); + +void setROOpMode( U32 opMode, U32 subMode ); +RO_OP_MODE_T getROOpMode( void ); +U32 getROSubMode( void ); + +/**@}*/ + +#endif Index: firmware/App/Services/SystemCommDD.c =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Services/SystemCommDD.c (.../SystemCommDD.c) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Services/SystemCommDD.c (.../SystemCommDD.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -36,13 +36,14 @@ // ********** private definitions ********** -#define TD_COMM_TIMEOUT_IN_MS 2000 ///< TD has not sent any broadcast messages for this much time +#define TD_COMM_TIMEOUT_IN_MS 2000 ///< TD has not sent any broadcast messages for this much time +#define RO_COMM_TIMEOUT_IN_MS 2000 ///< RO has not sent any broadcast messages for this much time -#define MAX_COMM_CRC_FAILURES 5 ///< maximum number of CRC errors within window period before alarm -#define MAX_COMM_CRC_FAILURE_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< CRC error window +#define MAX_COMM_CRC_FAILURES 5 ///< maximum number of CRC errors within window period before alarm +#define MAX_COMM_CRC_FAILURE_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< CRC error window -#define MAX_FPGA_CLOCK_SPEED_ERRORS 3 ///< maximum number of FPGA clock speed errors within window period before alarm -#define MAX_FPGA_CLOCK_SPEED_ERROR_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< FPGA clock speed error window +#define MAX_FPGA_CLOCK_SPEED_ERRORS 3 ///< maximum number of FPGA clock speed errors within window period before alarm +#define MAX_FPGA_CLOCK_SPEED_ERROR_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< FPGA clock speed error window // ********** private data ********** @@ -73,6 +74,8 @@ static volatile BOOL ddIsOnlyCANNode = TRUE; ///< flag indicating whether DG is alone on CAN bus. static OVERRIDE_U32_T tdCommunicationStatus = {0, 0, 0, 0}; ///< has TD sent a message since last check static volatile U32 timeOfLastTDCheckIn = 0; ///< last time we received an TD broadcast +static OVERRIDE_U32_T roCommunicationStatus = {0, 0, 0, 0}; ///< has RO sent a message since last check +static volatile U32 timeOfLastROCheckIn = 0; ///< last time we received an RO broadcast // ********** private function prototypes ********** @@ -97,9 +100,47 @@ /*********************************************************************//** * @brief + * The checkInFromTD function checks in the TD with the DD - indicating that + * the TD is communicating. + * @details \b Inputs: none + * @details \b Outputs: tdCommunicationStatus, timeOfLastTDCheckIn + * @return none + *************************************************************************/ +void checkInFromTD( void ) +{ + tdCommunicationStatus.data = TRUE; + timeOfLastTDCheckIn = getMSTimerCount(); + +// if ( TRUE == isAlarmActive( ALARM_ID_DD_TD_COMM_TIMEOUT ) ) +// { +// clearAlarmCondition( ALARM_ID_DD_TD_COMM_TIMEOUT ); +// } +} + +/*********************************************************************//** + * @brief + * The checkInFromRO function checks in the RO with the DD - indicating that + * the RO is communicating. + * @details \b Inputs: none + * @details \b Outputs: roCommunicationStatus, timeOfLastROCheckIn + * @return none + *************************************************************************/ +void checkInFromRO( void ) +{ + roCommunicationStatus.data = TRUE; + timeOfLastROCheckIn = getMSTimerCount(); + +// if ( TRUE == isAlarmActive( ALARM_ID_DD_RO_COMM_TIMEOUT ) ) +// { +// clearAlarmCondition( ALARM_ID_DD_RO_COMM_TIMEOUT ); +// } +} + +/*********************************************************************//** + * @brief * The isTDCommunicating function determines whether the TD is communicating * with the DD. - * @details \b Inputs: tdIsCommunicating + * @details \b Inputs: tdCommunicationStatus * @details \b Outputs: none * @return TRUE if TD has broadcast since last call, FALSE if not *************************************************************************/ @@ -110,6 +151,19 @@ /*********************************************************************//** * @brief + * The isROCommunicating function determines whether the RO is communicating + * with the DD. + * @details \b Inputs: roCommunicationStatus + * @details \b Outputs: none + * @return TRUE if RO has broadcast since last call, FALSE if not + *************************************************************************/ +BOOL isROCommunicating( void ) +{ + return getU32OverrideValue( &roCommunicationStatus ); +} + +/*********************************************************************//** + * @brief * The isOnlyCANNode function determines whether the DD is the only node * currently on the CAN bus. * @details \b Inputs: ddIsOnlyCANNode @@ -154,7 +208,7 @@ /*********************************************************************//** * @brief * The checkForCommTimeouts function checks for sub-system communication timeout errors. - * @details \b Inputs: timeOfLastDGCheckIn, timeOfLastUICheckIn + * @details \b Inputs: timeOfLastTDCheckIn, timeOfLastROCheckIn * @details \b Outputs: possibly a comm t/o alarm * @return none *************************************************************************/ @@ -166,9 +220,14 @@ setTDOperationMode( 0, 0 ); // If TD off or not connected, consider TD mode is fault. //stopHeater( DG_TRIMMER_HEATER ); // If TD off or not connected, ensure trimmer heater is off. } + + if ( TRUE == didTimeout( timeOfLastROCheckIn, RO_COMM_TIMEOUT_IN_MS ) ) + { + roCommunicationStatus.data = FALSE; + //setROOperationMode( 0, 0 ); // If RO off or not connected, consider RO mode is fault. + } } - /*********************************************************************//** * @brief * The getInBufferID function gets the buffer ID for a given buffer index. @@ -211,11 +270,10 @@ { if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_BAD_MSG_CRC ) ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_COMM_TOO_MANY_BAD_CRCS, 2 ); // 2 for DG + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_COMM_TOO_MANY_BAD_CRCS, 2 ); // 2 for DD } } - /*********************************************************************//** * @brief * The getOutBufferID function gets the buffer ID for a given buffer index. @@ -258,26 +316,44 @@ handleIncomingMessage( message ); } + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief - * The testTDCommunicationStatus function sets the override + * The testTDCommunicationStatusOverride function sets the override * of the TD communication status. * @details \b Inputs: none * @details \b Outputs: tdCommunicationStatus * @param message Override message from Dialin which includes the flag * value to override for the Td communication status. * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testTDCommunicationStatus( MESSAGE_T *message ) +BOOL testTDCommunicationStatusOverride( MESSAGE_T *message ) { BOOL result = u32Override( message, &tdCommunicationStatus, FALSE, TRUE ); return result; } +/*********************************************************************//** + * @brief + * The testROCommunicationStatusOverride function sets the override + * of the RO communication status. + * @details \b Inputs: none + * @details \b Outputs: roCommunicationStatus + * @param message Override message from Dialin which includes the flag + * value to override for the RO communication status. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testROCommunicationStatusOverride( MESSAGE_T *message ) +{ + BOOL result = u32Override( message, &roCommunicationStatus, FALSE, TRUE ); + + return result; +} + /**@}*/ Index: firmware/App/Services/SystemCommDD.h =================================================================== diff -u -r48ca7fd644c67920acc29a80b7af379d0a134d1a -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Services/SystemCommDD.h (.../SystemCommDD.h) (revision 48ca7fd644c67920acc29a80b7af379d0a134d1a) +++ firmware/App/Services/SystemCommDD.h (.../SystemCommDD.h) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -46,13 +46,17 @@ COMM_BUFFER_T getInBufferID( U32 idx ); COMM_BUFFER_T getOutBufferID( U32 idx ); BOOL isTDCommunicating( void ); +BOOL isROCommunicating( void ); +void checkInFromTD( void ); +void checkInFromRO( void ); BOOL isOnlyCANNode( void ); void setOnlyCANNode( BOOL only ); void clearCANXmitBuffers( void ); void checkForCommTimeouts( void ); void checkTooManyBadMsgCRCs( void ); -BOOL testTDCommunicationStatus( MESSAGE_T *message ); +BOOL testTDCommunicationStatusOverride( MESSAGE_T *message ); +BOOL testROCommunicationStatusOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -rc85d9f0a8023fabdf1cd557965958d225e2b9085 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision c85d9f0a8023fabdf1cd557965958d225e2b9085) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -69,29 +69,27 @@ // manage data received from other sub-systems execSystemCommRx(); + //TODO : Enable later Concentratepump and Heaters // monitor concentrate pumps - execConcentratePumpMonitor(); + //execConcentratePumpMonitor(); - // Monitor DG voltages + // Monitor DD voltages ///execVoltagesMonitor(); // run operation mode state machine execOperationModes(); - // Monitor thermistors state machine - //execThermistors(); - // manage dialysate pump execDialysatePumpController(); // manage concentrate pumps - execConcentratePumpController(); + //execConcentratePumpController(); // Manage switches monitor //execSwitches(); // Heaters controller - execHeatersControl(); + //execHeatersControl(); // Monitor RAM error status //execRAMMonitor(); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -rbce6e6d1cfb6e8a0b186419416460ead3a44e5e1 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision bce6e6d1cfb6e8a0b186419416460ead3a44e5e1) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -59,9 +59,10 @@ #ifndef BOARD_WITH_NO_HARDWARE // First pass for FPGA execFPGA( TRUE ); - + + //TODO : Enable later Temperature, Conductivity, Heaters, Internal ADC and FPGA clock speed // Monitor internal ADC channels - execInternalADC(); + //execInternalADC(); //Monitor Level sensor execLevels(); @@ -70,13 +71,13 @@ execPressureSensor(); // Monitor temperatures - execTemperatureSensors(); + //execTemperatureSensors(); // Verify the processor clock speed against the FPGA clock //execFPGAClockSpeedTest(); // Read/write Conductivity sensors - execConductivity(); + //execConductivity(); // Control valves execValves(); @@ -85,7 +86,7 @@ execDialysatePumpMonitor(); // Heaters monitor - execHeatersMonitor(); + //execHeatersMonitor(); // Dialysate generation monitor execGenDialysateMonitor(); Index: firmware/source/sys_main.c =================================================================== diff -u -ra14bc308c72272ce0275d263cf010c90d8a37355 -r9102c5da21a15bdaf4bb3bc38795ceb064e3c443 --- firmware/source/sys_main.c (.../sys_main.c) (revision a14bc308c72272ce0275d263cf010c90d8a37355) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 9102c5da21a15bdaf4bb3bc38795ceb064e3c443) @@ -73,9 +73,11 @@ #include "MsgQueues.h" #include "OperationModes.h" #include "Pressure.h" +#include "ROInterface.h" #include "SafetyShutdown.h" #include "SystemCommDD.h" #include "TaskBG.h" +#include "TDInterface.h" #include "Timers.h" #include "Temperature.h" #include "Utilities.h" @@ -175,6 +177,8 @@ initSystemComm(); initOperationModes(); initTestConfigs(); + initTDInterface(); + initROInterface(); } /*************************************************************************