/************************************************************************** * * 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" #include "Utilities.h" /** * @defgroup NVRecordsDD NVRecordsDD * @brief * This module handles Non-Volatile data management including record * validation, self-test execution, and update of system, service, * usage, institutional, and calibration records. It ensures data * integrity using CRC checks and updates invalid records with * default values. * * @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). /// NVM self-test states enumeration. typedef enum NVM_Self_Test_States { NVM_SELF_TEST_STATE_READ_RECORDS = 0, ///< Self test read records. NVM_SELF_TEST_STATE_CHECK_CRC, ///< Self test check CRC. NVM_SELF_TEST_STATE_COMPLETE, ///< Self test complete. NUM_OF_NVM_SELF_TEST_STATES ///< Total number of self-test states. } NVM_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_D12_PUMP_RECORD, ///< Get D12 dialysate pump calibration record. GET_CAL_D48_PUMP_RECORD, ///< Get D48 dialysate pump calibration 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_BLOOD_LEAK_SENSOR, ///< Get blood leak sensor calibration data. GET_CAL_CONDUCTIVITY_SENSOR, ///< Get blood leak sensor calibration data. GET_SYSTEM_RECORD, ///< Get system record. GET_SERVICE_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 available NV data to get typedef enum DD_nv_rec_items { NVM_REC_TYPE_SYSTEM = 0, ///< NVM system record. NVM_REC_TYPE_SERVICE, ///< NVM service record. NVM_REC_TYPE_USAGE_INFO, ///< NVM usage record. NVM_REC_TYPE_INSTIT_BASIC, ///< NVM basic institutional record. NVM_REC_TYPE_INSTIT_ADVANCED, ///< NVM advanced institutional record. NVM_REC_TYPE_INSTIT_ADDITIONAL, ///< NVM additional institutional record. NVM_REC_TYPE_CAL_PRESSURE_SENSORS, ///< NVM pressure sensors calibration data. NVM_REC_TYPE_CAL_TEMPERATURE_SENSORS, ///< NVM temperature sensors calibration data. NVM_REC_TYPE_CAL_CONC_PUMPS, ///< NVM concentrate pumps calibration record. NVM_REC_TYPE_CAL_D12_PUMP, ///< NVM D12 dialysate pump calibration record. NVM_REC_TYPE_CAL_D48_PUMP, ///< NVM D48 dialysate pump calibration record. NVM_REC_TYPE_CAL_ACID_CONCENTREATES, ///< NVM acid concentrates calibration data. NVM_REC_TYPE_CAL_BICARB_CONCENTRATES, ///< NVM bicarb concentrates calibration data. NVM_REC_TYPE_CAL_ACCEL_SENSOR, ///< NVM accelerometers calibration data. NVM_REC_TYPE_CAL_BLOOD_LEAK_SENSOR, ///< NVM blood leak sensor calibration data. NVM_REC_TYPE_CAL_CONDUCTIVITY_SENSORS, ///< NVM blood leak sensor calibration data. NUM_OF_NVM_REC_ITEMS ///< Number of non-volatile data record type } NVM_RECORD_ITEMS_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 Institutional basic items typedef enum DD_instit_basic_items { INSTIT_PARAM_DIALYSATE_FLOW = 0, ///< Dialysate Flow Rate FIRST_INSTIT_BASIC_PARAM = INSTIT_PARAM_DIALYSATE_FLOW, ///< First Institutional basic parameter INSTIT_PARAM_DIALYSATE_TEMPERATURE, ///< Dialysate Temperature INSTIT_PARAM_ACID_CONCENTRATE, ///< Acid Concentrate INSTIT_PARAM_DRY_BICARB_CART_SIZE, ///< Bicarbonate Cartridge Size INSTIT_PARAM_SODIUM, ///< Sodium INSTIT_PARAM_BICARBONATE, ///< Bicarbonate NUM_OF_INSTIT_BASIC = INSTIT_PARAM_BICARBONATE, ///< Total number of Institutional basic parameters }DD_INSTIT_BASIC_ITEMS_T; /// DD Institutional advanced items typedef enum DD_instit_advanced_items { INSTIT_PARAM_RO_REJECTION_RATIO_ALRAM, ///< RO Rejection Ratio Alarm Threshold FIRST_INSTIT_ADVANCED_PARAM = INSTIT_PARAM_RO_REJECTION_RATIO_ALRAM, ///< First Institutional advanced parameter INSTIT_PARAM_DISINFECTION_FREQUENCY, ///< Disinfection Frequency INSTIT_PARAM_DISINFECTION_CYCLE_TIME, ///< Disinfection Parameters, Cycle Time INSTIT_PARAM_INLET_WATER_COND_LOW_ALARM, ///< Inlet Water Conductivity Low Alarm Threshold (RO Featured) INSTIT_PARAM_INLET_WATER_COND_HIGH_ALARM, ///< Inlet Water Conductivity High Alarm Threshold (RO Defeatured) INSTIT_PARAM_ACID_CONCENTRATE_JUG_SIZE, ///< Acid Concentrate Jug Size INSTIT_PARAM_LOW_ACID_ALARM, ///< Low Acid Alarm Threshold INSTIT_PARAM_LOW_BICARB_ALARM, ///< Low Bicarb Alarm Threshold INSTIT_PARAM_DIALYSATE_POST_TREAT_DRAIN_OPTION, ///< Dialysate Post Treatment Drain Option  INSTIT_PARAM_BICARB_POST_TREAT_DRAIN_OPTION, ///< Dry Bicarbonate Post Treatment Option  NUM_OF_INSTIT_ADVANCED = INSTIT_PARAM_BICARB_POST_TREAT_DRAIN_OPTION, ///< Total number of Institutional advanced parameters } DD_INSTIT_ADVANCED_ITEMS_T; /// DD Institutional additional items typedef enum DD_instit_additional_items {  NUM_OF_INSTIT_ADDITIONAL, } DD_INSTIT_ADDITIONAL_ITEMS_T; #pragma pack(push, 1) /// Linear calibration structure typedef struct { F32 gain; ///< Gain. F32 offset; ///< Offset. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the linear calibration payload. } LINEAR_CAL_PAYLOAD_T; /// Pressure sensors calibration record typedef struct { LINEAR_CAL_PAYLOAD_T pressureSensors[ NUM_OF_PRESSURE_SENSORS ]; ///< Pressure sensors to calibrate. } DD_PRES_SENSORS_CAL_RECORD_T; /// Temperature sensors calibration record typedef struct { LINEAR_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 { LINEAR_CAL_PAYLOAD_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< DD concentrate pumps calibration data. } DD_CONC_PUMPS_CAL_RECORD_T; /// DD D12 dialysate pump calibration record typedef struct { F32 targetPumpSpeed; ///< Target Pump Speed U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the polynomial calibration payload. } DD_D12_DIALYSATE_PUMP_RECORD_T; /// DD dialysate pumps calibration record typedef struct { LINEAR_CAL_PAYLOAD_T d48DialysatePump; ///< DD dialysate pump d48 calibration data. } DD_D48_DIALYSATE_PUMP_RECORD_T; /// DD acid concentrate structure 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 structure 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 calibration record typedef struct { DD_ACID_CONCENTRATE_T acidConcentrate[ NUM_OF_ACID_TYPE ]; ///< DD acid concentrates. } DD_ACID_CONCENTRATES_RECORD_T; /// DD bicarb concentrates calibration record typedef struct { DD_BICARB_CONCENTRATE_T bicarbConcentrate[ NUM_OF_BICARB_TYPE ]; ///< DD bicarb concentrates. } DD_BICARB_CONCENTRATES_RECORD_T; /// DD 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 blood leak sensor calibration record typedef struct { U16 setPoint; ///< Blood leak sensor set point. U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the DD blood leak calibration payload. } DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T; /// DD conductivity sensor calibration structure typedef struct { F32 coeff1; ///< Coefficient 1 F32 coeff2; ///< Coefficient 2 F32 coeff3; ///< Coefficient 3 F32 coeff4; ///< Coefficient 4 F32 coeff5; ///< Coefficient 5 F32 coeff6; ///< Coefficient 6 F32 coeff7; ///< Coefficient 7 F32 coeff8; ///< Coefficient 8 F32 coeff9; ///< Coefficient 9 F32 coeff10; ///< Coefficient 10 F32 coeff11; ///< Coefficient 11 F32 coeff12; ///< Coefficient 12 U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the DD conductivity calibration payload. } DD_CONDUCTIVITY_SENSOR_T; /// DD conductivity sensor calibration record. typedef struct { DD_CONDUCTIVITY_SENSOR_T condSensors[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< DD Conductivity Sensors } DD_CONDUCTIVITY_SENSOR_CAL_RECORD_T; /// DD systems record structure typedef struct { BOOL isROFeatured; ///< True : RO featured. False : RO de-featured. BOOL isROFeaturedBoostPump; ///< 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 isHDFOnlineFluidAvailable; ///< True : HDF Online Fluid feature is available, False if not. U32 waterRecovery; ///< 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; /// Institutional data structure. typedef struct { CRITICAL_DATAS_T min; ///< Minimum value for valid data CRITICAL_DATAS_T max; ///< Maximum value for valid data CRITICAL_DATAS_T def; ///< Default value } INSTIT_DATA_T; /// Record for range and default of institutional settings. typedef struct { CRITICAL_DATA_TYPES_T dataType; ///< Data type for the institutional parameter INSTIT_DATA_T data; ///< Institutional data } INSTIT_PARAMS_PROPERTIES_T; /// DD institutional basic record structure typedef struct { INSTIT_DATA_T param[ NUM_OF_INSTIT_BASIC ]; ///< DD basic institutional record U16 crc; ///< CRC of the institutional record. } DD_INSTIT_BASIC_RECORD_T; /// DD institutional advanced record structure typedef struct { INSTIT_DATA_T param[ NUM_OF_INSTIT_ADVANCED ]; ///< DD advanced institutional record U16 crc; ///< CRC of the institutional record. } DD_INSTIT_ADVANCED_RECORD_T; /// DD institutional additional record structure typedef struct { INSTIT_DATA_T param[ NUM_OF_INSTIT_ADDITIONAL ]; ///< DD additional institutional record U16 crc; ///< CRC of the institutional record. } DD_INSTIT_ADDITIONAL_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 execNVMRecordsSelfTest( void ); PROCESS_RECORD_SPECS_T getProcessRecord( NVM_RECORD_TYPE_T job ); void benignLinearCalRecord( LINEAR_CAL_PAYLOAD_T* record ); BOOL setLastDisinfectDate( DD_USAGE_INFO_ITEMS_T disinfect, U32 epochTime ); BOOL setServiceTime( void ); U32 getMinRORejectionRatioInInstitRecordPCT( void ); F32 getMinInletWaterConductivityLimitInstitRecordUSPCM( void ); DD_SYSTEM_RECORD_T getSystemRecord( void ); void setSystemRecord( DD_SYSTEM_RECORD_T record ); DD_SERVICE_RECORD_T getServiceRecord( void ); void setServiceRecord( DD_SERVICE_RECORD_T record ); LINEAR_CAL_PAYLOAD_T getPressureSensorCalRecord( U08 snsrIdx ); void setPressureSensorCalRecord( U08 snsrIdx, LINEAR_CAL_PAYLOAD_T record ); LINEAR_CAL_PAYLOAD_T getTemperatureSensorCalRecord( U08 snsrIdx ); void setTemperatureSensorCalRecord( U08 snsrIdx, LINEAR_CAL_PAYLOAD_T record ); LINEAR_CAL_PAYLOAD_T getConcPumpCalRecord( U08 pumpIdx ); void setConcPumpCalRecord( U08 snsrIdx, LINEAR_CAL_PAYLOAD_T record ); DD_D12_DIALYSATE_PUMP_RECORD_T getD12PumpCalRecord( void ); void setD12PumpCalRecord( DD_D12_DIALYSATE_PUMP_RECORD_T record ); DD_D48_DIALYSATE_PUMP_RECORD_T getD48PumpCalRecord( void ); void setD48PumpCalRecord( DD_D48_DIALYSATE_PUMP_RECORD_T record ); DD_ACID_CONCENTRATE_T getAcidConcentrateCalRecord( U08 acidIdx ); void setAcidConcentrateCalRecord( U08 acidIdx, DD_ACID_CONCENTRATE_T record ); DD_BICARB_CONCENTRATE_T getBicarbConcentrateCalRecord( U08 bicarbIdx ); void setBicarbConcentrateCalRecord( U08 bicarbIdx, DD_BICARB_CONCENTRATE_T record ); DD_ACCEL_SENSOR_CAL_RECORD_T getAccelSensorCalRecord( void ); void setAccelSensorCalRecord( DD_ACCEL_SENSOR_CAL_RECORD_T record ); DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T getBloodLeakSensorCalRecord( void ); void setBloodLeakSensorCalRecord( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T record ); DD_CONDUCTIVITY_SENSOR_T getConductivitySensorCalRecord( U08 snsrIdx ); void setConductivitySensorCalRecord( U08 snsrIdx, DD_CONDUCTIVITY_SENSOR_T record ); DD_INSTIT_BASIC_RECORD_T getInstitBasicRecord( void ); void setInstitBasicRecord( DD_INSTIT_BASIC_RECORD_T record ); DD_INSTIT_ADVANCED_RECORD_T getInstitAdvancedRecord( void ); void setInstitAdvancedRecord( DD_INSTIT_ADVANCED_RECORD_T record ); DD_INSTIT_ADDITIONAL_RECORD_T getInstitAdditionalRecord( void ); void setInstitAdditionalRecord( DD_INSTIT_ADDITIONAL_RECORD_T record ); DD_USAGE_INFO_RECORD_T getUsageInfoRecord( void ); void setUsageInfoRecord( DD_USAGE_INFO_RECORD_T record ); BOOL getNVMRecord( NV_DATA_T nvData, U08* bufferAddress, U32 bufferLength, U08 numOfSnsrs2Check, ALARM_ID_T nvAlarm ); BOOL setNVMRecord( NVM_RECORD_TYPE_T recType, U08* bufferAddress ); BOOL setNVMCalReco rd(DD_CAL_REC_TYPE calRecType, U08* bufferAddress, U08 idx); BOOL getNVMInstitRecord( DD_INSTIT_REC_TYPE institRecType, U08 *valuePtr ); BOOL setNVMInstitRecord(DD_INSTIT_REC_TYPE institRecType, U08 *valuePtr); DD_INSTIT_BASIC_RECORD_T getNVMInstitBasicRecord( void ); void setNVMInstitBasicRecord( DD_INSTIT_BASIC_RECORD_T record ); DD_INSTIT_ADVANCED_RECORD_T getNVMInstitAdvancedRecord( void ); void setNVMInstitAdvancedRecord( DD_INSTIT_ADVANCED_RECORD_T record ); void sendNVEvent( NVM_RECORD_TYPE_T recType, U32 d1, U32 d2 ); void updateRecordCRC( NVM_RECORD_TYPE_T recType ); void updateNVSelfTestResult( SELF_TEST_STATUS_T result ); void updateNVSelfTestState( NVM_SELF_TEST_STATE_T state ); void updateSelfTestReadRecordsFlag ( BOOL value ); BOOL updateNVRecordCRC( U32 job, U16 crc ); /**@}*/ #endif /* _NV_RECORDS_DD_H_ */