/************************************************************************** * * Copyright (c) 2026-2027 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 NVRecordsDD.h * * @author (original) Arpita Srivastava * @date (original) 31-Mar-2026 * ***************************************************************************/ #ifndef _NV_RECORDS_DD_H_ #define _NV_RECORDS_DD_H_ #include "Common.h" #include "ConcentratePumps.h" #include "DDDefs.h" #include "DialysatePumps.h" #include "FlowSensor.h" #include "FluidPump.h" #include "NVDriver.h" #include "PressureSensor.h" #include "RinsePump.h" #include "TemperatureSensors.h" /** * @defgroup NVRecordsDD NVRecordsDD * @brief * * @addtogroup NVRecordsDD * @{ */ // ********** public definitions ********** #define MAX_TOP_LEVEL_PN_CHARS 10U ///< Max number of characters for top level part number. #define MAX_TOP_LEVEL_SN_CHARS 20U ///< Max number of characters for top level serial number. #define PRES_SENSORS_RESERVED_SPACE_COUNT 5 ///< Pressure sensors reserved space count. #define FLOW_SENSROS_RESERVED_SPACE_COUNT 2 ///< Flow sensors reserved space count. #define TEMP_SENSORS_RESERVED_SPACE_COUNT 2 ///< Temperature sensors reserved space count. #define GENERIC_VOL_RESERVED_SPACE_COUNT 4 ///< Generic volumes reserved space count. #define MAX_EEPROM_WRITE_BUFFER_BYTES 16U ///< Max allowed bytes for an EEPROM write (16 bytes). /// NVDataMgmt self-test states enumeration. typedef enum NVDataMgmt_Self_Test_States { NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS = 0, ///< Self test read records. NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC, ///< Self test check CRC. NVDATAMGMT_SELF_TEST_STATE_COMPLETE, ///< Self test complete. NUM_OF_NVDATAMGMT_SELF_TEST_STATES ///< Total number of self-test states. } NVDATAMGMT_SELF_TEST_STATE_T; /// Process records specifications structure typedef struct { U32 recordFlashAddress; ///< Jobs spec start address. U32 sizeofRecord; ///< Jobs spec size of job. U08* structAddressPtr; ///< Jobs structure address pointer. U08* structCRCPtr; ///< Jobs structure CRC pointer. DD_EVENT_ID_T nvEvent; ///< Jobs non-volatile DD event (i.e calibration, system). } PROCESS_RECORD_SPECS_T; /// DD available NV data to get typedef enum DD_nv_commands { GET_CAL_PRESSURE_SENOSRS = 0, ///< Get pressure sensors calibration data. GET_CAL_TEMP_SENSORS, ///< Get temperature sensors calibration data. GET_CAL_CONCENTRATE_PUMPS_RECORD, ///< Get concentrate pumps calibration record. GET_CAL_DIALYSATE_PUMPS_RECORD, GET_CAL_ACID_CONCENTREATES, ///< Get acid concentrates calibration data. GET_CAL_BICARB_CONCENTRATES, ///< Get bicarb concentrates calibration data. GET_CAL_ACCEL_SENSORS, ///< Get accelerometers calibration data. GET_CAL_FILL_CONDUCTIVITIES_RECORD, ///< Get fill conductivities record. GET_CAL_BLOOD_LEAK_SENSOR, GET_SYS_RECORD, ///< Get system record. GET_SRV_RECORD, ///< Get service record. GET_INSTITUTIONAL_RECORD, ///< Get institutional record. GET_USAGE_RECORD, ///< Get usage record. NUM_OF_NV_DD_DATA ///< Number of non-volatile data. } NV_DATA_T; /// DD acid concentrate enumeration. typedef enum DD_acid_concentrate { CAL_DATA_ACID_CONCENTRATE_1 = 0, ///< Acid concentrate 1. CAL_DATA_ACID_CONCENTRATE_2, ///< Acid concentrate 2. CAL_DATA_ACID_CONCENTRATE_3, ///< Acid concentrate 3. CAL_DATA_ACID_CONCENTRATE_4, ///< Acid concentrate 4. CAL_DATA_ACID_CONCENTRATE_5, ///< Acid concentrate 5. NUM_OF_CAL_DATA_ACID_CONCENTRATES ///< Number of acid concentrates. } CAL_DATA_DD_ACID_CONCENTRATES_T; /// DD bicarb concentrate enumeration. typedef enum DD_bicarb_concentrate { CAL_DATA_BICARB_CONCENTRATE_1 = 0, ///< Bicarb concentrate 1. CAL_DATA_BICARB_CONCENTRATE_2, ///< Bicarb concentrate 2. CAL_DATA_BICARB_CONCENTRATE_3, ///< Bicarb concentrate 3. CAL_DATA_BICARB_CONCENTRATE_4, ///< Bicarb concentrate 4. CAL_DATA_BICARB_CONCENTRATE_5, ///< Bicarb concentrate 5. NUM_OF_CAL_DATA_BICARB_CONCENTRATES ///< Number of bicarb concentrates. } CAL_DATA_DD_BICARB_CONCENTRATES_T; /// DD scheduled runs enumeration. typedef enum DD_scheduled_runs { RUN_FLUSH = 0, ///< Flush run. RUN_HEAT_DISINFECT, ///< Heat disinfect run. NUM_OF_DD_SCHEDULED_RUNS ///< Number of DD scheduled runs. } SCHEDULED_DD_RUNS_T; /// DD usage info items typedef enum DD_usage_items { USAGE_INFO_RO_GEN_WATER = 0, ///< Usage info RO generated water. USAGE_INFO_BASIC_FLUSH, ///< Usage info basic flush. USAGE_INFO_HEAT_DIS, ///< Usage info heat disinfect complete. USAGE_INFO_FILTER_FLUSH, ///< Usage info filter flush complete. USAGE_INFO_HEAT_DIS_ACTIVE_COOL, ///< Usage info heat disinfect active cool complete. NUM_OF_USAGE_INFO_ITEMS ///< Number of usage info items. } DD_USAGE_INFO_ITEMS_T; /// DD fill conductivity tests typedef enum DD_conductivity_ops { FILL_COND_NORMAL_OP = 0, ///< Fill conductivity normal operation. FILL_COND_ACID_TEST, ///< Fill conductivity acid test. FILL_COND_BICARB_TEST, ///< Fill conductivity bicarb test. NUM_OF_FILL_COND_TEST ///< Number of fill conductivity test. } DD_FILL_COND_OPS_T; #pragma pack(push, 1) /// Polynomial calibration structure typedef struct { F32 fourthOrderCoeff; ///< Fourth order coefficient. F32 thirdOrderCoeff; ///< Third order coefficient. F32 secondOrderCoeff; ///< Second order coefficient. F32 gain; ///< Gain. F32 offset; ///< Offset. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the polynomial calibration payload. } POLYNOMIAL_CAL_PAYLOAD_T; /// Pressure sensors calibration structure typedef struct { POLYNOMIAL_CAL_PAYLOAD_T pressureSensors[ NUM_OF_PRESSURE_SENSORS ]; ///< Pressure sensors to calibrate. } DD_PRES_SENSORS_CAL_RECORD_T; /// Temperature sensors calibration structure typedef struct { POLYNOMIAL_CAL_PAYLOAD_T tempSensors[ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors to calibrate. } DD_TEMP_SENSORS_CAL_RECORD_T; /// DD concentrate pumps calibration record typedef struct { POLYNOMIAL_CAL_PAYLOAD_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< DD concentrate pumps calibration data. } DD_CONC_PUMPS_CAL_RECORD_T; /// DD dialysate pump calibration structure typedef struct { float targetPumpSpeed[ NUM_OF_DIALYSATE_PUMPS ]; ///< Target Pump Speed U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the polynomial calibration payload. } DD_DIALYSATE_PUMP_DATA_T; /// DD dialysate pumps calibration record typedef struct { DD_DIALYSATE_PUMP_DATA_T dialysatePump[ NUM_OF_DIALYSATE_PUMPS ]; ///< DD dialysate pumps calibration data. } DD_DIALYSATE_PUMPS_CAL_RECORD_T; /// DD acid concentrate typedef struct { F32 acidConcMixRatio; ///< Acid concentrate mix ratio. F32 acidFullBottleVolumeML; ///< Acid full bottle volume in milliliters. F32 acidConductivityUSPerCM; ///< Acid conductivity in uS/cm. F32 acidBottleTemperature; ///< Acid bottle temperature in C. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC. } DD_ACID_CONCENTRATE_T; /// DD bicarb concentrate typedef struct { F32 bicarbConcMixRatio; ///< Bicarb concentrate mix ratio. F32 bicarbStartVolumeML; ///< Bicarb start volume. F32 bicarbConductivityUSPerCM; ///< Bicarb conductivity in uS/cm. F32 bicarbBottleTemperature; ///< Bicarb bottle temperature in C. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC. } DD_BICARB_CONCENTRATE_T; /// DD acid concentrates typedef struct { DD_ACID_CONCENTRATE_T acidConcentrate[ NUM_OF_CAL_DATA_ACID_CONCENTRATES ]; ///< DD acid concentrates. } DD_ACID_CONCENTRATES_RECORD_T; /// DD bicarb concentrates typedef struct { DD_BICARB_CONCENTRATE_T bicarbConcentrate[ NUM_OF_CAL_DATA_BICARB_CONCENTRATES ]; ///< DD bicarb concentrates. } DD_BICARB_CONCENTRATES_RECORD_T; /// HD accelerometer sensor calibration record typedef struct { F32 accelXOffset; ///< DD accelerometer X axis offset. F32 accelYOffset; ///< DD accelerometer Y axis offset. F32 accelZOffset; ///< DD accelerometer Z axis offset. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the DD accelerometer sensor. } DD_ACCEL_SENSOR_CAL_RECORD_T; /// DD acid and bicarb fill conductivity values typedef struct { F32 acidConduSPerCM; ///< Acid conductivity uS/cm. F32 bicarbConduSPerCM; ///< Bicarb conductivity uS/cm. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the acid/bicarb fill conductivity values. } DD_ACID_BICARB_FILL_COND_VALUES_T; /// DD acid and bicarb fill conductivity record typedef struct { DD_ACID_BICARB_FILL_COND_VALUES_T fillCondValues[ NUM_OF_ACID_TYPE ][ NUM_OF_FILL_COND_TEST ]; ///< Acid and bicarb fill conductivity values. } DD_CONCENTRATES_COND_CAL_RECORD_T; /// DD blood leak calibration structure typedef struct { U16 setPoint; ///< Blood leak sensor set point. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the HD blood leak calibration payload. } DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T; /// DD systems record structure typedef struct { BOOL isROFeatured; ///< True : RO featured. False : RO de-featured. BOOL isR0FeaturedBoostPump; ///< True : RO featured with boost pump. False : RO featured without the boost pump. char topLevelPN[ MAX_TOP_LEVEL_PN_CHARS ]; ///< DD top level part number. char topLevelSN[ MAX_TOP_LEVEL_SN_CHARS ]; ///< DD top level serial number. U08 mfgLocation; ///< DD manufacturing location. U32 mfgDate; ///< DD manufacturing date. U16 crc; ///< CRC for the DD system record structure. } DD_SYSTEM_RECORD_T; /// DD service record structure typedef struct { BOOL isHDFOnlineFluid; ///< True : HDF Online Fluid feature is available, False if not. U32 waterRecovey; ///< Low : 0, Medium : 1, High : 2. U08 serviceLoc; ///< DD service location. U32 lastServiceEpochDate; ///< DD last service date in epoch. U32 serviceIntervalSeconds; ///< DD service interval in seconds. U32 lastResetTimeEpoch; ///< Last time the record was reset in epoch. U16 crc; ///< CRC for the DD service record structure. } DD_SERVICE_RECORD_T; /// DD institutional record structure typedef struct { U32 minDialysateFlowMLPM; ///< Min dialysate flow in mL/min. U32 maxDialysateFlowMLPM; ///< Max dialysate flow in mL/min. F32 minDialysateTempC; ///< Min dialysate temperature in C. F32 maxDialysateTempC; ///< Max dialysate temperature in C. F32 acidConcentrate; ///< acid concentrate F32 bicarbCartridgeSizeG; ///< bicarbonate cartridge size in grams. F32 minSodiumMEQL; ///< Min sodium in mEq/L F32 maxSodiumMEQL; ///< Max sodium in mEq/L F32 minBicarbonateMEQL; ///< Min bicarbonate in mEq/L F32 maxBicarbonateMEQL; ///< Max bicarbonate in mEq/L U32 minRORejectionRatioPCT; ///< Min RO rejection ratio in percent. U32 disinfectionFrequency; ///< Disinfection days between cycles. F32 disinfectionCycleTime; ///< Disinfection Cycle Time F32 minInletWaterCondAlarmLimitUSPCM; ///< Min inlet water conductivity alarm limit in uS/cm. F32 maxInletWaterCondAlarmLimitUSPCM; ///< Max inlet water conductivity alarm limit in uS/cm. F32 acidConcentrateJugSizeL; ///< acid concentrate jug size in Liters F32 minAcidAlarmLimitPCT; ///< Min acid alarm limit in percent. F32 minBicarbAlarmLimitPCT; ///< Min bicarbonate alarm limit in percent. U32 postTreatDrainOption; ///< Dialysate Post Treatment Drain OptionĀ  U32 postTreatDryBicarbOption; ///< Dry Bicarbonate Post Treatment OptionĀ  U32 calibrationTime; ///< Calibration time in epoch. U16 crc; ///< CRC of the institutional record. } DD_INSTITUTIONAL_RECORD_T; /// DD usage info structure. typedef struct { F32 roWaterGenTotalL; ///< Total RO water generated in liters. (Cannot be reset) F32 roWaterGenSinceLastServiceL; ///< RO water generated since last treatment in liters. U32 lastBasicFlushCompleteDateEpoch; ///< Last basic flush complete date in epoch. U32 lastHeatDisCompleteDateEpoch; ///< Last heat disinfect complete date in epoch. U32 lastHeatActiveCoolCompleteDateEpoch; ///< Last heat disinfect active cool complete date in epoch. U32 lastFilterFlushCompleteDateEpoch; ///< Last filter flush complete date in epoch. U32 lastResetTimeEpoch; ///< Last time the record was reset in epoch. U16 crc; ///< CRC for the DD usage info structure. } DD_USAGE_INFO_RECORD_T; #pragma pack(pop) // ********** public function prototypes ********** void initNVRecordsDD( void ); SELF_TEST_STATUS_T execNVDataMgmtSelfTest ( void ); PROCESS_RECORD_SPECS_T getProcessRecord( RECORD_JOBS_STATE_T job ); PROCESS_RECORD_SPECS_T getTemporaryRxRecord( RECORD_JOBS_STATE_T job ); void benignPolynomialCalRecord( POLYNOMIAL_CAL_PAYLOAD_T* record ); BOOL setLastDisinfectDate( DD_USAGE_INFO_ITEMS_T disinfect, U32 epochTime ); BOOL setServiceTime( void ); BOOL getNVRecord2Driver( NV_DATA_T nvData, U08* bufferAddress, U32 bufferLength, U08 numOfSnsrs2Check, ALARM_ID_T nvAlarm ); void updateNVSelfTestResult( SELF_TEST_STATUS_T result ); void updateNVSelfTestState( NVDATAMGMT_SELF_TEST_STATE_T state ); void updateSelfTestReadRecordsFlag ( BOOL value ); BOOL testSetNVRecordCRCOverride( U32 job, U16 crc ); /**@}*/ #endif /* _NV_RECORDS_DD_H_ */