Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r52763239a17119a1ffab1fb53e8eedf992ae800c -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 52763239a17119a1ffab1fb53e8eedf992ae800c) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -64,8 +64,10 @@ #define FLOW_SAMPLES_TO_AVERAGE ( 250 / TASK_PRIORITY_INTERVAL ) ///< Averaging flow data over 250 ms intervals. #define FLOW_AVERAGE_MULTIPLIER ( 1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing. -#define RO_FLOW_ADC_TO_LPM_FACTOR 5555 ///< Conversion factor from pulse period (2us units) to flow rate (liters/min) for RO flow rate (divide this by pulse period). +#define RO_FLOW_ADC_TO_LPM_FACTOR 300 ///< Conversion factor from ADC counts to LPM (liters/min) for RO flow rate (multiply this by inverse of FPGA reading). +#define RO_FLOW_ADC_TO_LPM_FACTOR_TEMP_REMOVE 5555 //TODo remove + #define ROP_FLOW_TO_PWM_SLOPE 0.1 ///< Slope of flow to PWM line equation. #define ROP_FLOW_TO_PWM_INTERCEPT 0.0 ///< Intercept of flow to PWM line equation. @@ -345,7 +347,6 @@ // Read flow at the control set if ( ++flowFilterCounter >= FLOW_SAMPLES_TO_AVERAGE ) { - U32 sensor; F32 flow = RO_FLOW_ADC_TO_LPM_FACTOR / ( (F32)measuredFlowReadingsSum * FLOW_AVERAGE_MULTIPLIER ); // Convert flow sensor period to L/min // Apply calibration to flow sensor reading @@ -389,10 +390,10 @@ F32 pressureInlet = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); BOOL isPumpRunning = ( pressureInlet + MAX_PRESSURE_TARGET_TOLERANCE ) < actualPressure; - checkPersistentAlarm( ALARM_ID_RO_PUMP_OFF_FAULT, isPumpRunning, pressureInlet, ( pressureInlet + MAX_PRESSURE_TARGET_TOLERANCE ) ); + checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, isPumpRunning, pressureInlet, ( pressureInlet + MAX_PRESSURE_TARGET_TOLERANCE ) ); // Check if it has timed out - if ( TRUE == isAlarmActive( ALARM_ID_RO_PUMP_OFF_FAULT ) ) + if ( TRUE == isAlarmActive( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE ) ) { activateSafetyShutdown(); } @@ -742,6 +743,9 @@ roPumpPWMDutyCyclePct = roPumpOpenLoopTargetDutyCycle; roPumpDutyCyclePctSet = roPumpPWMDutyCyclePct; roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; + + // Set the new duty cycle of the pump + setROPumpControlSignalDutyCycle( roPumpOpenLoopTargetDutyCycle ); } /*********************************************************************//** @@ -1002,7 +1006,7 @@ { BOOL result = FALSE; - if ( TRUE == isTestingActivated() ) + //if ( TRUE == isTestingActivated() ) TODO uncomment { // Check if duty cycle is within range if ( value >= MIN_RO_PUMP_DUTY_CYCLE && value <= MAX_RO_PUMP_DUTY_CYCLE ) Index: firmware/App/DGCommon.h =================================================================== diff -u -r667b78a4ba1b948d4977b9b55234acf8d670f2d9 -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 667b78a4ba1b948d4977b9b55234acf8d670f2d9) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -25,7 +25,7 @@ #define DG_VERSION_MAJOR 0 #define DG_VERSION_MINOR 6 #define DG_VERSION_MICRO 0 -#define DG_VERSION_BUILD 14 +#define DG_VERSION_BUILD 71 // ********** build switches ********** @@ -34,7 +34,7 @@ // TODO: Removed debug build flags when release build is ready // #define BOARD_WITH_NO_HARDWARE 1 // #define TASK_TIMING_OUTPUT_ENABLED 1 // re-purposes drain pump enable pin for task timing -// #define DISABLE_HEATERS_AND_TEMPS 1 +// #define DISABLE_HEATERS_AND_TEMPS 1 // #define DISABLE_ACCELS 1 // #define SKIP_POST 1 #define SKIP_CAL_CHECK 1 @@ -48,16 +48,18 @@ #define IGNORE_RO_PUMP_MONITOR 1 #define DISABLE_RO_RATIO_CHECK 1 // #define DISABLE_COND_SENSOR_CHECK 1 -// #define DISABLE_WATER_QUALITY_CHECK 1 + #define DISABLE_WATER_QUALITY_CHECK 1 #define DISABLE_RTC_CONFIG 1 #define THD_USING_TRO_CONNECTOR 1 #define DISABLE_FLOW_CHECK_IN_FILL 1 #define IGNORE_CONC_PUMP_IN_HEAT_DISINFECT 1 -// #define NEW_FMD_FLOW_SENSOR 1 // Turn these flags on to disable dialysate mixing #define DISABLE_DIALYSATE_CHECK 1 #define DISABLE_MIXING 1 + //#define DISABLE_FLOW_CONTROL_TREATMENT 1 + #define DISABLE_TRIMMER_HEATER 1 + #define DIALYSATE_FLOW_METER_ENABLED 1 #include #include Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rb29639b235a979e1fa5b25cf246c6a42fb4397f0 -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision b29639b235a979e1fa5b25cf246c6a42fb4397f0) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -193,7 +193,6 @@ U16 fpgaDrainPumpSpeedMeasure; ///< Req 414. Drain pump speed measurement U16 fpgaDrainPumpCurrent; ///< Req 416. Drain pump electrical current measurement U16 fpgaDialysateFlowRate; ///< Req 418. Dialysate flow rate measurement - } DG_FPGA_SENSORS_T; typedef struct Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r2468e56fbecd26da713bc78535bd727f4b105fe1 -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 2468e56fbecd26da713bc78535bd727f4b105fe1) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-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 FPGA.h * -* @author (last) Quang Nguyen -* @date (last) 24-Aug-2020 +* @author (last) H. Nguyen +* @date (last) 21-Oct-2021 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -53,6 +53,7 @@ void getFPGAVersions( U08 *Id, U08 *Maj, U08 *Min, U08 *Lab ); U16 getFPGAValveStates( void ); U16 getFPGAROPumpFlowRate( void ); +U16 getFPGADialysateFlowRate( void ); U16 getFPGADrainPumpSpeed( void ); U32 getFPGALoadCellA1( void ); U32 getFPGALoadCellA2( void ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r909b961d8b51c01e1582ae0e63f8d540d99057a2 -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 909b961d8b51c01e1582ae0e63f8d540d99057a2) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -825,7 +825,7 @@ if ( TRUE == didTimeout( timeOfLastHDCheckIn, HD_COMM_TIMEOUT_IN_MS ) ) { hdIsCommunicating = FALSE; - activateAlarmNoData( ALARM_ID_HD_COMM_TIMEOUT ); + //activateAlarmNoData( ALARM_ID_HD_COMM_TIMEOUT ); } } @@ -950,7 +950,7 @@ U16 msgID; memcpy( &msgID, &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_CAN_MESSAGE_NOT_ACKED, (U32)msgID ); TODO uncomment this unit 2 raises this alarm no HD pendingAckList[ i ].used = FALSE; // take pending message off of list } } @@ -1125,23 +1125,23 @@ break; case MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE: - handleTestTemperatureSensorsOverrideRequest ( message ); + handleTestTemperatureSensorsOverrideRequest( message ); break; case MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE: - handleTestTemperatureSensorsDataPublishOverrideRequest ( message ); + handleTestTemperatureSensorsDataPublishOverrideRequest( message ); break; case MSG_ID_HEATERS_PUBLISH_INTERVAL_ORVERRIDE: - handleTestHeatersDataPublishOverrideRequest ( message ); + handleTestHeatersDataPublishOverrideRequest( message ); break; case MSG_ID_CONDUCTIVITY_OVERRIDE: - handleTestSetConductivityOverrideRequest ( message ); + handleTestSetConductivityOverrideRequest( message ); break; case MSG_ID_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE: - handleTestSetConductivityDataPublishIntervalOverrideRequest ( message ); + handleTestSetConductivityDataPublishIntervalOverrideRequest( message ); break; case MSG_ID_DG_ACCEL_OVERRIDE: @@ -1164,7 +1164,7 @@ handleTestMonitoredVoltageOverrideRequest( message ); break; - case MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE: + case MSG_ID_DRAIN_PUMP_TARGET_OUTLET_PRESSURE: handleSetDrainPumpDeltaPressureOverrideRequest( message ); break; @@ -1213,7 +1213,7 @@ break; case MSG_ID_DG_RO_FLOW_RATE_OVERRIDE: - handleTestMeasuredROFlowRateOverride( message ); + handleTestROMeasuredFlowOverrideRequest( message ); break; case MSG_ID_DG_SET_RO_PUMP_TARGET_FLOW: Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rc816a28448cd1c4d2c66a8d1ed8630e8bd4d2912 -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision c816a28448cd1c4d2c66a8d1ed8630e8bd4d2912) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -263,17 +263,25 @@ MESSAGE_T msg; U08 *payloadPtr = msg.payload; U32 e = (U32)event; + // Convert the two data types enums to U32. The enums are interpreted as a U08 by the compiler + U32 dataType1 = (U32)dat1.dataType; + U32 dataType2 = (U32)dat2.dataType; // Create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_DG_EVENT; - msg.hdr.payloadLen = sizeof( U32 ) + sizeof( EVENT_DATA_T ) * 2; + // The payload length is the event ID, 2 event datas and the events data types for each of the event data + msg.hdr.payloadLen = sizeof( U32 ) + 2 * sizeof( EVENT_DATAS_T ) + 2 * sizeof( U32 ); memcpy( payloadPtr, &e, sizeof( U32 ) ); payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &dat1, sizeof( EVENT_DATA_T ) ); - payloadPtr += sizeof( EVENT_DATA_T ); - memcpy( payloadPtr, &dat2, sizeof( EVENT_DATA_T ) ); + memcpy( payloadPtr, &dataType1, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &dat1.data, sizeof( EVENT_DATAS_T ) ); + payloadPtr += sizeof( EVENT_DATAS_T ); + memcpy( payloadPtr, &dataType2, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &dat2.data, sizeof( EVENT_DATAS_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_DG_2_UI, ACK_NOT_REQUIRED ); @@ -503,33 +511,6 @@ /*********************************************************************//** * @brief - * The broadcastHeatersData function sends out DG heaters data - * @details Inputs: none - * @details Outputs: heaters data msg constructed and queued - * @param heatersData which is the heaters data structure pointer - * @return TRUE if msg successfully queued for transmit, FALSE if not - *************************************************************************/ -BOOL broadcastHeatersData ( HEATERS_DATA_T *heatersData ) -{ - BOOL result; - MESSAGE_T msg; - U08 *payloadPtr = msg.payload; - - // create a message record - blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_DG_HEATERS_DATA; - msg.hdr.payloadLen = sizeof( HEATERS_DATA_T ); - - memcpy( payloadPtr, heatersData, sizeof( HEATERS_DATA_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_DG_BROADCAST, ACK_NOT_REQUIRED ); - - return result; -} - -/*********************************************************************//** - * @brief * The broadcastDrainPumpData function sends out the drain pump data. * @details Inputs: none * @details Outputs: Drain pump data msg constructed and queued @@ -887,8 +868,8 @@ result = TRUE; memcpy( &payload, message->payload, sizeof( TARGET_TEMPS_PAYLOAD_T ) ); - setPrimaryHeaterTargetTemperature( payload.targetPrimaryHeaterTemp ); - setTrimmerHeaterTargetTemperature( payload.targetTrimmerHeaterTemp ); + setHeaterTargetTemperature( DG_PRIMARY_HEATER, payload.targetPrimaryHeaterTemp ); + setHeaterTargetTemperature( DG_TRIMMER_HEATER, payload.targetTrimmerHeaterTemp ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } @@ -1776,11 +1757,11 @@ if ( TRUE == startingHeater ) { - result = startPrimaryHeater(); + result = startHeater( DG_PRIMARY_HEATER ); } else { - stopPrimaryHeater(); + stopHeater( DG_PRIMARY_HEATER ); result = TRUE; } } @@ -2564,7 +2545,7 @@ } else { - result = testResetSwitchesDataPublishIntervalOverrid(); + result = testResetSwitchesDataPublishIntervalOverride(); } } @@ -3173,38 +3154,6 @@ /*********************************************************************//** * @brief -* The handleTestROFlowRateOverride function handles a request to override -* the RO flow rate. -* @details Inputs: none -* @details Outputs: message handled -* @param message a pointer to the message to handle -* @return none -*******************************************************************/ -void handleTestMeasuredROFlowRateOverride( MESSAGE_T *message ) -{ - TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; - BOOL result = FALSE; - - // verify payload length - if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) - { - memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); - if ( FALSE == payload.reset ) - { - result = testSetMeasuredROFlowRateOverride( payload.state.f32 ); - } - else - { - result = testResetMeasuredROFlowRateOverride(); - } - } - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** -* @brief * The handleTestThermistorsValueOverride function handles a request to * override a thermistor's value. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r1c2f96bf994157b11c0c32ddaf96fc91a9a1da1d -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 1c2f96bf994157b11c0c32ddaf96fc91a9a1da1d) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -23,7 +23,6 @@ #include "DrainPump.h" #include "Fans.h" #include "FluidLeak.h" -#include "Heaters.h" #include "LoadCell.h" #include "MessageSupport.h" #include "ModeChemicalDisinfect.h" @@ -63,6 +62,9 @@ // MSG_ID_DG_EVENT BOOL sendEvent( DG_EVENT_ID_T event, EVENT_DATA_T dat1, EVENT_DATA_T dat2 ); +// Serialize message +U32 serializeMessage( MESSAGE_T msg, COMM_BUFFER_T buffer, BOOL ackReq ); + // MSG_ID_ALARM_TRIGGERED BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); @@ -96,18 +98,12 @@ // MSG_ID_DRAIN_PUMP_DATA BOOL broadcastDrainPumpData( DRAIN_PUMP_DATA_T *drainPumpData ); -// MSG_ID_DG_CONCENTRATE_PUMP_DATA -BOOL broadcastConcentratePumpData( void * concentratePumpDataPtr ); - // MSG_ID_DG_PRESSURES_DATA BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ); // MSG_ID_DG_RESERVOIR_DATA BOOL broadcastReservoirData( U32 resID, U32 fillToVol, U32 drainToVol ); -// MSG_ID_HEATERS_READINGS -BOOL broadcastHeatersData( HEATERS_DATA_T *heatersData ); - // MSG_ID_TEMPERATURE_SENSORS_READINGS BOOL broadcastTemperatureSensorsData( TEMPERATURE_SENSORS_DATA_T* tempSensorsData ); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r1c2f96bf994157b11c0c32ddaf96fc91a9a1da1d -r3555f182983cb3852f1e414017d11aeb537d3274 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 1c2f96bf994157b11c0c32ddaf96fc91a9a1da1d) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 3555f182983cb3852f1e414017d11aeb537d3274) @@ -72,10 +72,8 @@ // Monitor load cells execLoadCell(); -#ifndef DISABLE_HEATERS_AND_TEMPS // Temperature sensors read execTemperatureSensors(); -#endif // Conductivity sensors read execConductivitySensors();