Index: firmware/App/Drivers/ConductivitySensors.c =================================================================== diff -u -rd47b9bcbd4796a8c51d9e87436422c5868292ac6 -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 --- firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision d47b9bcbd4796a8c51d9e87436422c5868292ac6) +++ firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) @@ -920,6 +920,23 @@ return result; } + +CONDUCTIVITY_COEFFICIENTS_T* getConductivityCalibrationData( void ) +{ + // TODO: Return static variable + CONDUCTIVITY_COEFFICIENTS_T record; + return (&record); +} + +void setConductivityCalibrationData( CONDUCTIVITY_COEFFICIENTS_T* record) +{ + U32 i; + + for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) + { + //TODO: Call FPGA update function + } +} /*********************************************************************//** * @brief * The getConductivityTemperatureValue function gets the temperature Index: firmware/App/Drivers/ConductivitySensors.h =================================================================== diff -u -rd47b9bcbd4796a8c51d9e87436422c5868292ac6 -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 --- firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision d47b9bcbd4796a8c51d9e87436422c5868292ac6) +++ firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) @@ -88,6 +88,8 @@ F32 delta; ///< Temperature offset, default = 0, range = [-300, 300] F32 reserved1; ///< Reserved cal slot. F32 reserved2; ///< Reserved cal slot. + U32 calibrationTime; ///< Calibration time. + U16 crc; ///< CRC } CONDUCTIVITY_COEFFICIENTS_T; typedef struct @@ -122,6 +124,9 @@ F32 getConductivityRawRTD( CONDUCTIVITY_SENSORS_T sensor ); F32 getUncompensatedConductivity( CONDUCTIVITY_SENSORS_T sensor ); +CONDUCTIVITY_COEFFICIENTS_T* getConductivityCalibrationData( void ); +void setConductivityCalibrationData( CONDUCTIVITY_COEFFICIENTS_T* record); + BOOL testConductivitySensorConductivityReadingsOverride( MESSAGE_T *message ); BOOL testConductivitySensorTemperatureReadingsOverride( MESSAGE_T *message ); BOOL testConductivitySensorConductivityReadCounterOverride( MESSAGE_T *message ); Index: firmware/App/Services/NVMessagingDD.c =================================================================== diff -u -rb50ce33669efe6dfcf5f8a211c78a6c2c309adf3 -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 --- firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision b50ce33669efe6dfcf5f8a211c78a6c2c309adf3) +++ firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) @@ -2,7 +2,6 @@ * * 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 NVMessagingDD.c @@ -13,6 +12,7 @@ ***************************************************************************/ #include // For ceilf function +#include "ConductivitySensors.h" #include "Messaging.h" #include "NVJobQ.h" #include "NVMessagingDD.h" @@ -45,14 +45,6 @@ NUM_OF_NVM_SEND_RECORD_STATES ///< Number of NVM process records state. } SEND_RECORD_STATE_T; -/// NVM receive records states -typedef enum NVM_Receive_Records_States -{ - NVM_RECEIVE_RECORD_STATE_IDLE = 0, ///< NVM receive record idle. - NVM_RECEIVE_RECORD_STATE_RECEIVE, ///< NVM receive record receive. - NUM_OF_NVM_RECEIVE_RECORD_STATES ///< Number of NVM receive record. -} RECEIVE_RECORD_STATE_T; - #pragma pack(push, 1) /// DD NVM Record Payload @@ -68,7 +60,7 @@ BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Rejection reason if not accepted. DD_SYSTEM_RECORD_T data; ///< Data to be sent -}DD_NVM_GET_SYSTEM_REC_PAYLOAD_T +}DD_NVM_GET_SYSTEM_REC_PAYLOAD_T; /// DD NVM Set System Record Response Payload typedef struct @@ -81,15 +73,15 @@ U32 topLevelSNRejectReason; ///< Reason to reject System record parameter topLevelSN[ MAX_TOP_LEVEL_SN_CHARS ] U32 mfgLocationRejectReason; ///< Reason to reject System record parameter mfgLocation U32 mfgDateRejectReason; ///< Reason to reject System record parameter mfgDate -}DD_NVM_SET_SYSTEM_REC_PAYLOAD_T +}DD_NVM_SET_SYSTEM_REC_PAYLOAD_T; /// DD NVM Get Service Record Response Payload typedef struct { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Rejection reason if not accepted. DD_SERVICE_RECORD_T data; ///< Data to be sent -}DD_NVM_GET_SERVICE_REC_PAYLOAD_T +}DD_NVM_GET_SERVICE_REC_PAYLOAD_T; /// DD NVM Set Service Record Response Payload typedef struct @@ -102,20 +94,20 @@ U32 lastServiceEpochDateRejectReason; ///< Reason to reject Service record parameter lastServiceEpochDate U32 serviceIntervalSecondsRejectReason; ///< Reason to reject Service record parameter serviceIntervalSeconds U32 lastResetTimeEpochRejectReason; ///< Reason to reject Service record parameter lastResetTimeEpoch -}DD_NVM_SET_SERVICE_REC_PAYLOAD_T +}DD_NVM_SET_SERVICE_REC_PAYLOAD_T; /// DD NVM Get Usage Info Record Response Payload typedef struct { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Rejection reason if not accepted. DD_USAGE_INFO_RECORD_T data; ///< Data to be sent -}DD_NVM_GET_USAGE_INFO_REC_PAYLOAD_T +}DD_NVM_GET_USAGE_INFO_REC_PAYLOAD_T; /// DD NVM Set Usage Info Record Response Payload typedef struct { - BOOL acceptedRejectReason; ///< Accepted/Rejected + BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request U32 roWaterGenTotalLRejectReason; ///< Reason to reject Usage Info record parameter roWaterGenTotalL U32 roWaterGenSinceLastServiceLRejectReason; ///< Reason to reject Usage Info record parameter roWaterGenSinceLastServiceL @@ -124,7 +116,7 @@ U32 lastHeatActiveCoolCompleteDateEpochRejectReason; ///< Reason to reject Usage Info record parameter lastHeatActiveCoolCompleteDateEpoch U32 lastFilterFlushCompleteDateEpochRejectReason; ///< Reason to reject Usage Info record parameter lastFilterFlushCompleteDateEpoch U32 lastResetTimeEpochRejectReason; ///< Reason to reject Usage Info record parameter lastResetTimeEpoch -}DD_NVM_SET_USAGE_INFO_REC_PAYLOAD_T +}DD_NVM_SET_USAGE_INFO_REC_PAYLOAD_T; /// Institutional data reject reason structure. typedef struct @@ -140,47 +132,47 @@ BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Rejection reason if not accepted. DD_INSTIT_BASIC_RECORD_T data; ///< Data to be sent -}DD_NVM_GET_INSTIT_BASIC_REC_PAYLOAD_T +}DD_NVM_GET_INSTIT_BASIC_REC_PAYLOAD_T; /// DD NVM Set Institutional Basic Record Response Payload typedef struct { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request - INSTIT_DATA_REJECT_REASON_T param[ NUM_OF_INSTIT_BASIC ] ///< Reject reasons for each param of basic institutional record. -}DD_NVM_SET_INSTIT_BASIC_REC_PAYLOAD_T + INSTIT_DATA_REJECT_REASON_T param[ NUM_OF_INSTIT_BASIC ]; ///< Reject reasons for each param of basic institutional record. +}DD_NVM_SET_INSTIT_BASIC_REC_PAYLOAD_T; /// DD NVM Get Institutional Advanced Record Response Payload typedef struct { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Rejection reason if not accepted. DD_INSTIT_ADVANCED_RECORD_T data; ///< Data to be sent -}DD_NVM_GET_INSTIT_ADVANCED_REC_PAYLOAD_T +}DD_NVM_GET_INSTIT_ADVANCED_REC_PAYLOAD_T; /// DD NVM Set Institutional Advanced Record Response Payload typedef struct { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request - INSTIT_DATA_REJECT_REASON_T param[ NUM_OF_INSTIT_ADVANCED ] ///< Reject reasons for each param of advanced institutional record. -}DD_NVM_SET_INSTIT_ADVANCED_REC_PAYLOAD_T + INSTIT_DATA_REJECT_REASON_T param[ NUM_OF_INSTIT_ADVANCED ]; ///< Reject reasons for each param of advanced institutional record. +}DD_NVM_SET_INSTIT_ADVANCED_REC_PAYLOAD_T; /// DD NVM Get Institutional Additional Record Response Payload typedef struct { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Rejection reason if not accepted. DD_INSTIT_ADDITIONAL_RECORD_T data; ///< Data to be sent -}DD_NVM_GET_INSTIT_ADDITIONAL_REC_PAYLOAD_T +}DD_NVM_GET_INSTIT_ADDITIONAL_REC_PAYLOAD_T; /// DD NVM Set Institutional Additional Record Response Payload typedef struct { BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request - INSTIT_DATA_REJECT_REASON_T param[ NUM_OF_INSTIT_ADDITIONAL ] ///< Reject reasons for each param of Additional institutional record. -}DD_NVM_SET_INSTIT_ADDITIONAL_REC_PAYLOAD_T + INSTIT_DATA_REJECT_REASON_T param[ NUM_OF_INSTIT_ADDITIONAL ]; ///< Reject reasons for each param of Additional institutional record. +}DD_NVM_SET_INSTIT_ADDITIONAL_REC_PAYLOAD_T; /// Linear reject reason calibration structure typedef struct @@ -327,7 +319,7 @@ BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Rejection reason if not accepted. U08 idx; ///< Index of conductivity sensor - DD_CONDUCTIVITY_SENSOR_T data; ///< Data to be sent + CONDUCTIVITY_COEFFICIENTS_T data; ///< Data to be sent } DD_NVM_GET_CONDUCTIVITY_SENSOR_CAL_REC_PAYLOAD_T; /// DD NVM Set Record Payload for Conductivity Sensor Calibration Data @@ -336,18 +328,18 @@ BOOL accepted; ///< Accepted/Rejected U32 rejectionReason; ///< Reason to reject the entire request U32 idxRejectReason; ///< Reason to reject conductivity sensor index - U32 coeff1RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff1 - U32 coeff2RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff2 - U32 coeff3RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff3 - U32 coeff4RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff4 - U32 coeff5RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff5 - U32 coeff6RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff6 - U32 coeff7RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff7 - U32 coeff8RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff8 - U32 coeff9RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff9 - U32 coeff10RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff10 - U32 coeff11RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff11 - U32 coeff12RejectReason; ///< Reason to reject conductivity sensor calibration record parameter coeff12 + U32 K_highRejectReason; ///< Reason to reject conductivity sensor calibration record parameter K_high + U32 alpha_higRejectReason; ///< Reason to reject conductivity sensor calibration record parameter alpha_high + U32 eta_highRejectReason; ///< Reason to reject conductivity sensor calibration record parameter eta_high + U32 zeta_highRejectReason; ///< Reason to reject conductivity sensor calibration record parameter zeta_high + U32 K_lowRejectReason; ///< Reason to reject conductivity sensor calibration record parameter K_low + U32 alpha_lowRejectReason; ///< Reason to reject conductivity sensor calibration record parameter alpha_low + U32 eta_lowRejectReason; ///< Reason to reject conductivity sensor calibration record parameter eta_low + U32 zeta_lowRejectReason; ///< Reason to reject conductivity sensor calibration record parameter zeta_low + U32 betaRejectReason; ///< Reason to reject conductivity sensor calibration record parameter beta + U32 deltaRejectReason; ///< Reason to reject conductivity sensor calibration record parameter delta + U32 reserved1RejectReason; ///< Reason to reject conductivity sensor calibration record parameter reserved1 + U32 reserved2RejectReason; ///< Reason to reject conductivity sensor calibration record parameter reserved2 U32 calibrationTimeRejectReason; ///< Reason to reject conductivity sensor calibration record parameter calibrationTime } DD_NVM_SET_CONDUCTIVITY_SENSOR_CAL_REC_PAYLOAD_T; @@ -356,20 +348,14 @@ // ********** private data ********** static SEND_RECORD_STATE_T nvMExecSendRecordState; ///< NVM exec process record state. -static RECEIVE_RECORD_STATE_T nvmExecreceiveRecordState; ///< NVM exec receive record state. static U32 newRecordStartTimer; ///< New record availability start timer. static BOOL isNewCalRecordAvailable; ///< Signal to indicate whether a new NVM data is available. static NV_DATA_T recordToPublish; ///< Record type which is being processed currently for sending static NV_DATA_T nvPublishRecordType; ///< Used to index over isPublishRecordRequested in the idle state -static NVM_RECORD_TYPE_T currentRxRecordType; ///< Record type which is being processed currently for receiving static U32 recordSendDataIntervalCounter; ///< Record data send to CAN bust interval counter. static U32 sendRetryCount; ///< Counter for number of retries to send a record -static U32 calRecordReceiveStartTime; ///< Time stamp the calibration record was received. -static U32 institRecordReceiveStartTime; ///< Time stamp the institutional record was received. -static DD_INSTIT_REC_TYPE sendInstitRec; ///< Current Institutional Record to be sent -static DD_CAL_REC_TYPE sendCalRec; ///< Current Calibration Record to be sent static U08 sendCalIdx; ///< Current Index of sensor calibration data to be sent -static BOOL isPublishRecordRequested[ NV_DATA_T ]; ///< Record state machine publish request flag. +static BOOL isPublishRecordRequested[ NUM_OF_NV_DD_DATA ]; ///< Record state machine publish request flag. // ********** private function prototypes ********** @@ -394,8 +380,8 @@ static SEND_RECORD_STATE_T handleSendBloodLeakSensorCalRecord( void ); static SEND_RECORD_STATE_T handleSendConductivitySensorCalRecord( void ); -static void updateSendRetryCount( BOOL sendStatus ); -static SEND_RECORD_STATE_T updateCalSendRetryCountAndIndex( BOOL sendStatus, U08 maxIdx) +static SEND_RECORD_STATE_T updateSendRetryCount( BOOL sendStatus ); +static SEND_RECORD_STATE_T updateCalSendRetryCountAndIndex( BOOL sendStatus, U08 maxIdx ); static void monitorNewCalSignal( void ); @@ -417,7 +403,6 @@ void initNVMessagingDD( void ) { nvMExecSendRecordState = NVM_SEND_RECORD_STATE_IDLE; - nvmExecreceiveRecordState = NVM_RECEIVE_RECORD_STATE_IDLE; newRecordStartTimer = 0; isNewCalRecordAvailable = FALSE; nvPublishRecordType = NV_DD_DATA_SYSTEM_RECORD; @@ -460,31 +445,29 @@ break; } - if( nvmExecreceiveRecordState == NVM_RECEIVE_RECORD_STATE_RECEIVE ) - { - if ( ( NVM_CALIBRATION_RECORD == currentRxRecordType ) && - ( TRUE == didTimeout( calRecordReceiveStartTime, RECORD_DATA_RECEIVE_TIMEOUT_MS ) ) ) - { - updateRecordCRC(NVM_CALIBRATION_RECORD); - enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); - startNewCalRecordAvailableTimer(); - setNewCalibrationRecordAvailable( TRUE ); - PROCESS_RECORD_SPECS_T recordSpec = getProcessRecord( NVM_CALIBRATION_RECORD ); - sendNVEvent( NVM_CALIBRATION_RECORD , 0, 0 ); - nvmExecreceiveRecordState = NVM_RECEIVE_RECORD_STATE_IDLE; - } +// if( nvmExecreceiveRecordState == NVM_RECEIVE_RECORD_STATE_RECEIVE ) +// { +// if ( ( NVM_CALIBRATION_RECORD == currentRxRecordType ) && +// ( TRUE == didTimeout( calRecordReceiveStartTime, RECORD_DATA_RECEIVE_TIMEOUT_MS ) ) ) +// { +// updateRecordCRC(NVM_CALIBRATION_RECORD); +// enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); +// startNewCalRecordAvailableTimer(); +// setNewCalibrationRecordAvailable( TRUE ); +// sendNVEvent( NVM_CALIBRATION_RECORD , 0, 0 ); +// nvmExecreceiveRecordState = NVM_RECEIVE_RECORD_STATE_IDLE; +// } +// +// if ( ( NVM_INSTITUTIONAL_RECORD == currentRxRecordType ) && +// ( TRUE == didTimeout( institRecordReceiveStartTime, RECORD_DATA_RECEIVE_TIMEOUT_MS ) ) ) +// { +// updateRecordCRC(NVM_INSTITUTIONAL_RECORD); +// enqueueEraseAndWriteSector( NVM_INSTITUTIONAL_RECORD ); +// sendNVEvent( NVM_INSTITUTIONAL_RECORD , 0, 0 ); +// nvmExecreceiveRecordState = NVM_RECEIVE_RECORD_STATE_IDLE; +// } +// } - if ( ( NVM_INSTITUTIONAL_RECORD == currentRxRecordType ) && - ( TRUE == didTimeout( institRecordReceiveStartTime, RECORD_DATA_RECEIVE_TIMEOUT_MS ) ) ) - { - updateRecordCRC(NVM_INSTITUTIONAL_RECORD); - enqueueEraseAndWriteSector( NVM_INSTITUTIONAL_RECORD ); - PROCESS_RECORD_SPECS_T recordSpec = getProcessRecord( NVM_INSTITUTIONAL_RECORD ); - sendNVEvent( NVM_INSTITUTIONAL_RECORD , 0, 0 ); - nvmExecreceiveRecordState = NVM_RECEIVE_RECORD_STATE_IDLE; - } - } - // Check the calibration signal monitorNewCalSignal(); } @@ -547,7 +530,7 @@ if ( TRUE == isPublishRecordRequested[ nvPublishRecordType ] ) { - recordToPublish = ( NVM_RECORD_TYPE_T )nvPublishRecordType; + recordToPublish = nvPublishRecordType; // Set the publish flag to FALSE isPublishRecordRequested[ recordToPublish ] = FALSE; @@ -559,10 +542,10 @@ state = NVM_SEND_RECORD_STATE_SEND; } - nvPublishRecordType = ( NVM_RECORD_TYPE_T )( nvPublishRecordType + 1 ); - if( nvPublishRecordType >= NUM_OF_NVM_RECORD_TYPES ) + nvPublishRecordType = ( NV_DATA_T )( nvPublishRecordType + 1 ); + if( nvPublishRecordType >= NUM_OF_NV_DD_DATA ) { - nvPublishRecordType = NVM_SYSTEM_RECORD; + nvPublishRecordType = NV_DD_DATA_SYSTEM_RECORD; } return state; @@ -587,72 +570,72 @@ // If it is time to send data if ( ++recordSendDataIntervalCounter >= RECORD_DATA_SEND_INTERVAL_COUNT ) { - switch(recordToPublish) + switch ( recordToPublish ) { - case NVM_REC_TYPE_SYSTEM: + case NV_DD_DATA_SYSTEM_RECORD: state = handleSendDDSystemRecord(); break; - case NVM_REC_TYPE_SERVICE: + case NV_DD_DATA_SERVICE_RECORD: state = handleSendDDServiceRecord(); break; - case NVM_REC_TYPE_USAGE_INFO: - state = handleSendDDUsageInfoRecord(); - break; - - case NVM_REC_TYPE_INSTIT_BASIC: - state = handleSendDDInstitBasicRecord(); - break; - - case NVM_REC_TYPE_INSTIT_ADVANCED: - state = handleSendDDInstitAdvancedRecord(); - break; - - case NVM_REC_TYPE_INSTIT_ADDITIONAL: - state = handleSendDDInstitAdditionalRecord(); - break; - - case NVM_REC_TYPE_CAL_PRESSURE_SENSORS: + case NV_DD_DATA_CAL_PRESSURE_SENOSRS: state = handleSendPressureSensorCalRecord(); break; - case NVM_REC_TYPE_CAL_TEMPERATURE_SENSORS: + case NV_DD_DATA_CAL_TEMPERATURE_SENSORS: state = handleSendTempSensorCalRecord(); break; - case NVM_REC_TYPE_CAL_CONC_PUMPS: + case NV_DD_DATA_CAL_CONCENTRATE_PUMPS_RECORD: state = handleSendConcPumpCalRecord(); break; - case NVM_REC_TYPE_CAL_D12_PUMP: + case NV_DD_DATA_CAL_D12_PUMP_RECORD: state = handleSendD12PumpCalRecord(); break; - case NVM_REC_TYPE_CAL_D48_PUMP: + case NV_DD_DATA_CAL_D48_PUMP_RECORD: state = handleSendD48PumpCalRecord(); break; - case NVM_REC_TYPE_CAL_ACID_CONCENTREATES: + case NV_DD_DATA_CAL_ACID_CONCENTREATES: state = handleSendAcidConcCalRecord(); break; - case NVM_REC_TYPE_CAL_BICARB_CONCENTRATES: + case NV_DD_DATA_CAL_BICARB_CONCENTRATES: state = handleSendBicarbConcCalRecord(); break; - case NVM_REC_TYPE_CAL_ACCEL_SENSOR: + case NV_DD_DATA_CAL_ACCELEROMETER_SENSOR: state = handleSendAccelSensorCalRecord(); break; - case NVM_REC_TYPE_CAL_BLOOD_LEAK_SENSOR: + case NV_DD_DATA_CAL_BLOOD_LEAK_SENSOR: state = handleSendBloodLeakSensorCalRecord(); break; - case NVM_REC_TYPE_CAL_CONDUCTIVITY_SENSORS: + case NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS: state = handleSendConductivitySensorCalRecord(); break; + case NV_DD_DATA_INSTIT_BASIC_RECORD: + state = handleSendDDInstitBasicRecord(); + break; + + case NV_DD_DATA_INSTIT_ADVANCED_RECORD: + state = handleSendDDInstitAdvancedRecord(); + break; + + case NV_DD_DATA_INSTIT_ADDITIONAL_RECORD: + state = handleSendDDInstitAdditionalRecord(); + break; + + case NV_DD_DATA_USAGE_INFO_RECORD: + state = handleSendDDUsageInfoRecord(); + break; + default: break; } @@ -754,7 +737,7 @@ DD_NVM_GET_USAGE_INFO_REC_PAYLOAD_T payload; // Get the record - if ( TRUE == getNVMRecord( NV_DD_DATA_USAGE_RECORD, + if ( TRUE == getNVMRecord( NV_DD_DATA_USAGE_INFO_RECORD, (U08*)&payload.data, sizeof( DD_USAGE_INFO_RECORD_T ), 0, @@ -766,7 +749,7 @@ // Send the record sendStatus = sendMessage( MSG_ID_DD_UI_NVM_GET_USAGE_INFO_RECORD_RESPONSE, COMM_BUFFER_OUT_CAN_DD_BROADCAST, - (U08*)&usageInfoRecord, + (U08*)&payload, sizeof( DD_NVM_GET_USAGE_INFO_REC_PAYLOAD_T ) ); } @@ -796,7 +779,7 @@ (U08*)&payload.data, sizeof( DD_INSTIT_BASIC_RECORD_T ), 0, - ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC ) ) + ALARM_ID_DD_NVM_INVALID_INSTIT_BASIC_RECORD_CRC ) ) { payload.accepted = TRUE; payload.rejectionReason = 0; @@ -834,7 +817,7 @@ (U08*)&payload.data, sizeof( DD_INSTIT_ADVANCED_RECORD_T ), 0, - ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC ) ) + ALARM_ID_DD_NVM_INVALID_INSTIT_ADVANCED_RECORD_CRC ) ) { payload.accepted = TRUE; payload.rejectionReason = 0; @@ -872,7 +855,7 @@ (U08*)&payload.data, sizeof( DD_INSTIT_ADDITIONAL_RECORD_T ), 0, - ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC ) ) + ALARM_ID_DD_NVM_INVALID_INSTIT_ADDITIONAL_RECORD_CRC ) ) { payload.accepted = TRUE; payload.rejectionReason = 0; @@ -925,7 +908,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_PRESSURE_SENSORS ); - return sendStatus; + return state; } /*********************************************************************//** @@ -964,7 +947,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_TEMPERATURE_SENSORS ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1003,7 +986,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_CONCENTRATE_PUMPS ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1040,7 +1023,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1077,7 +1060,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1116,7 +1099,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_ACID_TYPE ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1155,7 +1138,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_BICARB_TYPE ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1173,7 +1156,7 @@ DD_NVM_GET_ACCEL_SENSOR_CAL_REC_PAYLOAD_T payload; // Get the record - if ( TRUE == getNVMRecord( NV_DD_DATA_CAL_ACCEL_SENSOR, + if ( TRUE == getNVMRecord( NV_DD_DATA_CAL_ACCELEROMETER_SENSOR, (U08*)&payload.data, sizeof( DD_ACCEL_SENSOR_CAL_RECORD_T ), 0, @@ -1192,7 +1175,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1229,7 +1212,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, 0 ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1248,7 +1231,7 @@ DD_CONDUCTIVITY_SENSOR_CAL_RECORD_T record; // Get the record - if ( TRUE == getNVMRecord( NV_DD_DATA_CAL_CONDUCTIVITY_SENSOR, + if ( TRUE == getNVMRecord( NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS, (U08*)&record, sizeof( DD_CONDUCTIVITY_SENSOR_CAL_RECORD_T ), NUM_OF_CONDUCTIVITY_SENSORS, @@ -1268,7 +1251,7 @@ state = updateCalSendRetryCountAndIndex( sendStatus, NUM_OF_CONDUCTIVITY_SENSORS ); - return sendStatus; + return state; } /*********************************************************************//** @@ -1312,7 +1295,7 @@ sendRetryCount = 0; // Clear the publishing flags - recordToPublish = NUM_OF_NVM_REC_ITEMS; + recordToPublish = NUM_OF_NV_DD_DATA; // Move to Send Idle State state = NVM_SEND_RECORD_STATE_IDLE; @@ -1329,7 +1312,7 @@ sendRetryCount = 0; // Clear the publishing flags - recordToPublish = NUM_OF_NVM_REC_ITEMS; + recordToPublish = NUM_OF_NV_DD_DATA; // Move to Send Idle State state = NVM_SEND_RECORD_STATE_IDLE; @@ -1348,7 +1331,7 @@ * @@param maxIdx Maximum Index value of the current calibration item being sent * @return state next state of the state machine *************************************************************************/ -static SEND_RECORD_STATE_T updateCalSendRetryCountAndIndex( BOOL sendStatus, U08 maxIdx) +static SEND_RECORD_STATE_T updateCalSendRetryCountAndIndex( BOOL sendStatus, U08 maxIdx ) { SEND_RECORD_STATE_T state = NVM_SEND_RECORD_STATE_SEND; BOOL resetState = FALSE; @@ -1385,7 +1368,7 @@ sendRetryCount = 0; // Clear the publishing flags - recordToPublish = NUM_OF_NVM_REC_ITEMS; + recordToPublish = NUM_OF_NV_DD_DATA; // Move to Send Idle State state = NVM_SEND_RECORD_STATE_IDLE; @@ -1429,7 +1412,7 @@ { if ( message->hdr.payloadLen == expectedPayloadLen ) { - memcpy( record, message->payload, expectedPayloadLen ); + memcpy( &record, message->payload, expectedPayloadLen ); setNVMMRecord( NV_DD_DATA_SYSTEM_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_SYSTEM_RECORD ); sendNVEvent( NVM_SYSTEM_RECORD, 0, 0 ); @@ -1487,7 +1470,7 @@ { if ( message->hdr.payloadLen == expectedPayloadLen ) { - memcpy( record, message->payload, expectedPayloadLen ); + memcpy( &record, message->payload, expectedPayloadLen ); setNVMMRecord( NV_DD_DATA_SERVICE_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_SERVICE_RECORD ); sendNVEvent( NVM_SERVICE_RECORD, 0, 0 ); @@ -1542,7 +1525,7 @@ if ( message->hdr.payloadLen == expectedPayloadLen ) { - memcpy( record, message->payload, expectedPayloadLen ); + memcpy( &record, message->payload, expectedPayloadLen ); setNVMMRecord( NV_DD_DATA_USAGE_INFO_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_USAGE_INFO_RECORD ); sendNVEvent( NVM_USAGE_INFO_RECORD, 0, 0 ); @@ -1592,8 +1575,8 @@ if ( message->hdr.payloadLen == expectedPayloadLen ) { - memcpy( record, message->payload, expectedPayloadLen ); - record.crc = crc16 ( (U08*)&record, sizeof( DD_INSTIT_BASIC_RECORD_T ) - sizeof( U16 ) ); + memcpy( &record, message->payload, expectedPayloadLen ); + record.crc = crc16( (U08*)&record, sizeof( DD_INSTIT_BASIC_RECORD_T ) - sizeof( U16 ) ); setNVMMRecord( NV_DD_DATA_INSTIT_BASIC_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_INSTITUTIONAL_RECORD ); sendNVEvent( NVM_INSTITUTIONAL_RECORD, 0, 0 ); @@ -1643,8 +1626,8 @@ if ( message->hdr.payloadLen == expectedPayloadLen ) { - memcpy( record, message->payload, expectedPayloadLen ); - record.crc = crc16 ( (U08*)&record, sizeof( DD_INSTIT_ADVANCED_RECORD_T ) - sizeof( U16 ) ); + memcpy( &record, message->payload, expectedPayloadLen ); + record.crc = crc16( (U08*)&record, sizeof( DD_INSTIT_ADVANCED_RECORD_T ) - sizeof( U16 ) ); setNVMMRecord( NV_DD_DATA_INSTIT_ADVANCED_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_INSTITUTIONAL_RECORD ); sendNVEvent( NVM_INSTITUTIONAL_RECORD, 0, 0 ); @@ -1694,8 +1677,8 @@ if ( message->hdr.payloadLen == expectedPayloadLen ) { - memcpy( record, message->payload, expectedPayloadLen ); - record.crc = crc16 ( (U08*)&record, sizeof( DD_INSTIT_ADDITIONAL_RECORD_T ) - sizeof( U16 ) ); + memcpy( &record, message->payload, expectedPayloadLen ); + record.crc = crc16( (U08*)&record, sizeof( DD_INSTIT_ADDITIONAL_RECORD_T ) - sizeof( U16 ) ); setNVMMRecord( NV_DD_DATA_INSTIT_ADDITIONAL_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_INSTITUTIONAL_RECORD ); sendNVEvent( NVM_INSTITUTIONAL_RECORD, 0, 0 ); @@ -1757,7 +1740,7 @@ if( idx < NUM_OF_PRESSURE_SENSORS ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_PRESSURE_SENOSRS, (U08*)&record, idx ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -1829,7 +1812,7 @@ if( idx < NUM_OF_TEMPERATURE_SENSORS ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_TEMPERATURE_SENSORS, (U08*)&record, idx ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -1901,7 +1884,7 @@ if( idx < NUM_OF_CONCENTRATE_PUMPS ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_CONCENTRATE_PUMPS_RECORD, (U08*)&record, idx ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -1966,7 +1949,7 @@ if ( message->hdr.payloadLen == recordSize ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_D12_PUMP_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -2027,7 +2010,7 @@ if ( message->hdr.payloadLen == recordSize ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.d48DialysatePump.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_D48_PUMP_RECORD, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -2095,7 +2078,7 @@ if( idx < NUM_OF_ACID_TYPE ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_ACID_CONCENTREATES, (U08*)&record, idx ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -2167,7 +2150,7 @@ if( idx < NUM_OF_BICARB_TYPE ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_BICARB_CONCENTRATES, (U08*)&record, idx ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -2202,7 +2185,7 @@ if ( NVM_SEND_RECORD_STATE_IDLE == nvMExecSendRecordState ) { - isPublishRecordRequested[ NV_DD_DATA_CAL_ACCEL_SENSOR] = TRUE; + isPublishRecordRequested[ NV_DD_DATA_CAL_ACCELEROMETER_SENSOR] = TRUE; result = TRUE; } else @@ -2232,8 +2215,8 @@ if ( message->hdr.payloadLen == recordSize ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); - setNVMMRecord( NV_DD_DATA_CAL_ACCEL_SENSOR, (U08*)&record, 0 ); + record.crc = crc16( (U08*)&record, recordSize ); + setNVMMRecord( NV_DD_DATA_CAL_ACCELEROMETER_SENSOR, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); response.accepted = TRUE; @@ -2293,7 +2276,7 @@ if ( message->hdr.payloadLen == recordSize ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); + record.crc = crc16( (U08*)&record, recordSize ); setNVMMRecord( NV_DD_DATA_CAL_BLOOD_LEAK_SENSOR, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); @@ -2324,7 +2307,7 @@ if ( NVM_SEND_RECORD_STATE_IDLE == nvMExecSendRecordState ) { - isPublishRecordRequested[ NV_DD_DATA_CAL_CONDUCTIVITY_SENSOR] = TRUE; + isPublishRecordRequested[ NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS ] = TRUE; result = TRUE; } else @@ -2344,18 +2327,18 @@ { BOOL result = FALSE; U08* payloadPtr = message->payload; - U08 recordSize = sizeof( DD_CONDUCTIVITY_SENSOR_T ) - sizeof( U16 ); // Data - CRC + U08 recordSize = sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ); // Data - CRC DD_NVM_SET_CONDUCTIVITY_SENSOR_CAL_REC_PAYLOAD_T response = { 0 }; - DD_CONDUCTIVITY_SENSOR_T record; + CONDUCTIVITY_COEFFICIENTS_T record; // Calibration record can be updated only in service mode if ( DD_MODE_SERV == getCurrentOperationMode() ) { if ( message->hdr.payloadLen == recordSize ) { memcpy( &record, payloadPtr, recordSize ); - record.crc = crc16 ( (U08*)&record, recordSize ); - setNVMMRecord( NV_DD_DATA_CAL_CONDUCTIVITY_SENSOR, (U08*)&record, 0 ); + record.crc = crc16( (U08*)&record, recordSize ); + setNVMMRecord( NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS, (U08*)&record, 0 ); result = enqueueEraseAndWriteSector( NVM_CALIBRATION_RECORD ); sendNVEvent( NVM_CALIBRATION_RECORD, 0, 0 ); response.accepted = TRUE; Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -rb50ce33669efe6dfcf5f8a211c78a6c2c309adf3 -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision b50ce33669efe6dfcf5f8a211c78a6c2c309adf3) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) @@ -63,6 +63,7 @@ #define DEFAULT_UF_TEMP_TAU_C_PER_MIN -0.6F ///< Ultrafilter temperature time constant C/min. #define DEFAULT_UF_VOLUME_ML 700 ///< Ultrafilter volume in milliliters. #define DEFAULT_BLOOD_LEAK_SET_POINT 20 ///< Blood leak default set point. +#define DEFAULT_CONDUCTIVITY_COEFFICIENT 0.0F ///< Default Conductivity Coefficient Value #define MAX_NUM_OF_WRITE_TRIES 3U ///< Max number of write tries. @@ -110,6 +111,13 @@ { CRITICAL_DATA_TYPE_U32, { {.uInt=0}, {.uInt=1}, {.uInt=0} } }, ///< INSTIT_PARAM_DIALYSATE_POST_TREAT_DRAIN_OPTION { CRITICAL_DATA_TYPE_U32, { {.uInt=0}, {.uInt=2}, {.uInt=2} } }, ///< INSTIT_PARAM_BICARB_POST_TREAT_DRAIN_OPTION }; + +/// Institutional Additional parameter properties including data type, range limits and default values. +static const INSTIT_PARAMS_PROPERTIES_T INSTIT_ADDITIONAL_PROP[ NUM_OF_INSTIT_ADDITIONAL ] = +{ + // type min max default + { CRITICAL_DATA_TYPE_U32, { {.uInt=0}, {.uInt=0}, {.uInt=0} } }, ///< INSTIT_ADDITIONAL_PARAM +}; #pragma pack(push, 1) // ********** DD record structures ********** @@ -213,17 +221,23 @@ static BOOL isDDSystemRecordValid( void ); static BOOL isDDServiceRecordValid( void ); static BOOL isDDInstitutionalRecordValid( void ); -static BOOL isDDUsageRecordValid( void ); +static BOOL isDDInstitBasicRecordValid( void ); +static BOOL isDDInstitAdvancedRecordValid( void ); +static BOOL isDDInstitAdditionalRecordValid( void ); static BOOL isDDCalibrationRecordValid( void ); static BOOL isDDPumpD12RecordValid( DD_D12_DIALYSATE_PUMP_RECORD_T* record ); static BOOL isDDAcidConcentrateRecordValid( DD_ACID_CONCENTRATE_T* record ); static BOOL isDDBicarbConcentrateRecordValid( DD_BICARB_CONCENTRATE_T* record ); static BOOL isDDAccelerometerSensorRecordValid( DD_ACCEL_SENSOR_CAL_RECORD_T* record ); -static BOOL isDDBloodLeakSesnorValid( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ); +static BOOL isDDBloodLeakSensorValid( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ); +static BOOL isDDConductivitySensorValid( CONDUCTIVITY_COEFFICIENTS_T* record ); +static BOOL isDDUsageRecordValid( void ); static void initDDSystemRecord( void ); static void initDDServiceRecord( void ); -static void initDDInstitutionalRecord( void ); +static void initDDInstitBasicRecord( void ); +static void initDDInstitAdvancedRecord( void ); +static void initDDInstitAdditionalRecord( void ); static void initDDUsageRecord( void ); static void updateRecordPadding( NVM_RECORD_TYPE_T recType ); @@ -473,9 +487,9 @@ // Recalculate the CRC with the default values updateRecordCRC( NVM_SYSTEM_RECORD ); - status = FALSE; - activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_SYSTEM_RECORD_CRC ); + + status = FALSE; } else { @@ -518,10 +532,10 @@ // Recalculate the CRC with the default values updateRecordCRC( NVM_SERVICE_RECORD ); - status = FALSE; - // Service record failure activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_SERVICE_RECORD_CRC ); + + status = FALSE; } return status; @@ -540,60 +554,125 @@ *************************************************************************/ static BOOL isDDInstitutionalRecordValid( void ) { - BOOL status = TRUE; - U16 calcCRC = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord, sizeof( DD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); - U16 recordCRC = ddInstitutionalGroup.ddInstitutionalRecord.crc; + BOOL isRecordValid = TRUE; + U16 calcCRC = crc16( (U08*)&ddInstitutionalGroup.crc, + sizeof( DD_INSTITUTIONAL_GROUP_T ) - sizeof( U16 ) ); + U16 recordCRC = ddInstitutionalGroup.crc; - if ( calcCRC != recordCRC ) - { - // CRC did not pass so set all values to default - initDDInstitutionalRecord(); + isRecordValid = ( isRecordValid == FALSE ) ? FALSE : isDDInstitBasicRecordValid(); + isRecordValid = ( isRecordValid == FALSE ) ? FALSE : isDDInstitAdvancedRecordValid(); + isRecordValid = ( isRecordValid == FALSE ) ? FALSE : isDDInstitAdditionalRecordValid(); + // If the sub groups failed, they are all updated to their benign values + // so the main CRC of the institutional group is calculated again + if ( ( FALSE == isRecordValid ) || ( calcCRC != recordCRC ) ) + { // Initialize the padding updateRecordPadding( NVM_INSTITUTIONAL_RECORD ); // Recalculate the CRC with the default values updateRecordCRC( NVM_INSTITUTIONAL_RECORD ); - status = FALSE; - - // Institutional record failure is also considered as RTC RAM failure + // // Activate alarm for Institutional record failure activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC ); + + isRecordValid = FALSE; } + return isRecordValid; +} + +/*********************************************************************//** + * @brief + * The isDDInstitBasicRecordValid function checks the validity of the DD + * basic institutional record. It verifies CRC and updates the record + * with default values if invalid. + * @details \b Alarms: ALARM_ID_DD_NVM_INVALID_INSTIT_BASIC_RECORD_CRC if CRC + * check fails + * @details \b Inputs: ddInstitutionalGroup + * @details \b Outputs: ddInstitutionalGroup + * @return TRUE if the DD Basic Institutional record is valid otherwise FALSE + *************************************************************************/ +static BOOL isDDInstitBasicRecordValid( void ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.basicRecord, + sizeof( DD_INSTIT_BASIC_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddInstitutionalGroup.ddInstitutionalRecord.basicRecord.crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + initDDInstitBasicRecord(); + + // Activate alarm for basic Institutional record failure + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_INSTIT_BASIC_RECORD_CRC ); + + status = FALSE; + } + return status; } /*********************************************************************//** * @brief - * The isDDUsageRecordValid function checks the validity of the DD - * usage information record. It verifies CRC and updates the record + * The isDDInstitAdvancedRecordValid function checks the validity of the DD + * advanced institutional record. It verifies CRC and updates the record * with default values if invalid. - * @details \b Alarms: ALARM_ID_DD_NVM_INVALID_USAGE_RECORD_CRC if CRC + * @details \b Alarms: ALARM_ID_DD_NVM_INVALID_INSTIT_ADVANCED_RECORD_CRC if CRC * check fails - * @details \b Inputs: ddUsageInfoGroup - * @details \b Outputs: ddUsageInfoGroup - * @return TRUE if the DD usage record is valid otherwise FALSE + * @details \b Inputs: ddInstitutionalGroup + * @details \b Outputs: ddInstitutionalGroup + * @return TRUE if the DD Advanced Institutional record is valid otherwise FALSE *************************************************************************/ -static BOOL isDDUsageRecordValid( void ) +static BOOL isDDInstitAdvancedRecordValid( void ) { BOOL status = TRUE; - U16 calcCRC = crc16( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord, sizeof( DD_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); - U16 recordCRC = ddUsageInfoGroup.ddUsageInfoRecord.crc; + U16 calcCRC = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord, + sizeof( DD_INSTIT_ADVANCED_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.crc; if ( calcCRC != recordCRC ) { // CRC did not pass so set all values to default - initDDUsageRecord(); + initDDInstitAdvancedRecord(); - // Initialize the padding - updateRecordPadding( NVM_USAGE_INFO_RECORD ); + // Activate alarm for advanced Institutional record failure + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_INSTIT_ADVANCED_RECORD_CRC ); - // Recalculate the CRC with the default values - updateRecordCRC( NVM_USAGE_INFO_RECORD ); status = FALSE; + } - activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_USAGE_RECORD_CRC ); + return status; +} + +/*********************************************************************//** + * @brief + * The isDDInstitAdditionalRecordValid function checks the validity of the DD + * addtional institutional record. It verifies CRC and updates the record + * with default values if invalid. + * @details \b Alarms: ALARM_ID_DD_NVM_INVALID_INSTIT_ADDITIONAL_RECORD_CRC if CRC + * check fails + * @details \b Inputs: ddInstitutionalGroup + * @details \b Outputs: ddInstitutionalGroup + * @return TRUE if the DD Addtional Institutional record is valid otherwise FALSE + *************************************************************************/ +static BOOL isDDInstitAdditionalRecordValid( void ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord, + sizeof( DD_INSTIT_ADDITIONAL_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord.crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + initDDInstitAdditionalRecord(); + + // Activate alarm for additional Institutional record failure + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_INSTIT_ADDITIONAL_RECORD_CRC ); + + status = FALSE; } return status; @@ -637,23 +716,23 @@ // valid, the values should be set to benign values. This variable is used to decide // whether a write should be scheduled or not so it should not be overwritten with a TRUE // once a record set it to FALSE - isHardwareRecordValid = isPolynomialRecordValid( record ); + isHardwareRecordValid = isLinearRecordValid( record ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; } DD_TEMP_SENSORS_CAL_RECORD_T* temperature = &ddCalibrationGroup.ddCalibrationRecord.tempSensorsCalRecord; for ( i = 0; i < NUM_OF_TEMPERATURE_SENSORS; i++ ) { record = (LINEAR_CAL_PAYLOAD_T*)&temperature->tempSensors[ i ]; - isHardwareRecordValid = isPolynomialRecordValid( record ); + isHardwareRecordValid = isLinearRecordValid( record ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; } DD_CONC_PUMPS_CAL_RECORD_T* concPump = &ddCalibrationGroup.ddCalibrationRecord.concentratePumpsRecord; for ( i = 0; i < NUM_OF_CONCENTRATE_PUMPS; i++ ) { record = (LINEAR_CAL_PAYLOAD_T*)&concPump->concentratePumps[ i ]; - isHardwareRecordValid = isPolynomialRecordValid( record ); + isHardwareRecordValid = isLinearRecordValid( record ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; } @@ -663,7 +742,7 @@ DD_D48_DIALYSATE_PUMP_RECORD_T* d48Pump = &ddCalibrationGroup.ddCalibrationRecord.d48DialysatePumpRecord; record = (LINEAR_CAL_PAYLOAD_T*)&d48Pump->d48DialysatePump; - isHardwareRecordValid = isPolynomialRecordValid( record ); + isHardwareRecordValid = isLinearRecordValid( record ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; DD_ACID_CONCENTRATES_RECORD_T* acidConc = &ddCalibrationGroup.ddCalibrationRecord.acidConcentratesRecord; @@ -685,20 +764,33 @@ isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* bloodLeak = &ddCalibrationGroup.ddCalibrationRecord.bloodLeakSensorCalRecord; - isHardwareRecordValid = isDDBloodLeakSesnorValid( bloodLeak ); + isHardwareRecordValid = isDDBloodLeakSensorValid( bloodLeak ); isCalRecordValid = ( isCalRecordValid == FALSE ) ? FALSE : isHardwareRecordValid; +// CONDUCTIVITY_COEFFICIENTS_T *conductivity = getConductivityCalibrationData(); +// for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) +// { +// isHardwareRecordValid = isDDConductivitySensorValid( &conductivity->condSensors[ i ] ); +// +// if( FALSE == isHardwareRecordValid ) +// { +// setConductivityCalibrationData( &conductivity->condSensors[ i ] ); +// } +// +// activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_CALIBRATION_RECORD_CRC ); +// } + // If the sub groups failed, they are all updated to their benign values // so the main CRC of the calibration group is calculated again if ( ( FALSE == isCalRecordValid ) || ( recordCRC != ddCalibrationGroup.crc ) ) { - isCalRecordValid = FALSE; + isCalRecordValid = FALSE; // Initialize the padding - updateRecordPadding( NVM_USAGE_INFO_RECORD ); + updateRecordPadding( NVM_CALIBRATION_RECORD ); // Recalculate the CRC - ddCalibrationGroup.crc = crc16 ( (U08*)&ddCalibrationGroup, sizeof( DD_CALIBRATION_GROUP_T ) - sizeof( U16 ) ); + updateRecordCRC( NVM_CALIBRATION_RECORD ); activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_CALIBRATION_RECORD_CRC ); } @@ -830,15 +922,15 @@ /*********************************************************************//** * @brief - * The isDDBloodLeakSesnorValid function checks if the blood leak sensor + * The isDDBloodLeakSensorValid function checks if the blood leak sensor * calibration record is valid. It verifies CRC and updates the record * with default values if invalid. * @details \b Inputs: none * @details \b Outputs: none * @param record Pointer to blood leak sensor calibration record to check * @return TRUE if the record is valid otherwise FALSE *************************************************************************/ -static BOOL isDDBloodLeakSesnorValid( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ) +static BOOL isDDBloodLeakSensorValid( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ) { BOOL status = TRUE; U16 calcCRC = crc16 ( (U08*)record, sizeof( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T ) - sizeof( U16 ) ); @@ -859,6 +951,82 @@ /*********************************************************************//** * @brief + * The isDDConductivitySesnorValid function checks if the conductivity sensor + * calibration record is valid. It verifies CRC and updates the record + * with default values if invalid. + * @details \b Inputs: none + * @details \b Outputs: none + * @param record Pointer to conductivity sensor calibration record to check + * @return TRUE if the record is valid otherwise FALSE + *************************************************************************/ +static BOOL isDDConductivitySensorValid( CONDUCTIVITY_COEFFICIENTS_T* record ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16 ( (U08*)record, sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ) ); + U16 recordCRC = record->crc; + + if ( calcCRC != recordCRC ) + { + record->K_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->alpha_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->eta_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->zeta_high = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->K_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->alpha_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->eta_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->zeta_low = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->beta = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->delta = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->reserved1 = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->reserved2 = DEFAULT_CONDUCTIVITY_COEFFICIENT; + record->calibrationTime = RECORD_DEFAULT_TIME; + record->crc = crc16 ( (U08*)record, + sizeof( CONDUCTIVITY_COEFFICIENTS_T ) - sizeof( U16 ) ); + + // Set the to FALSE since the record is not valid + status = FALSE; + } + + return status; +} + +/*********************************************************************//** + * @brief + * The isDDUsageRecordValid function checks the validity of the DD + * usage information record. It verifies CRC and updates the record + * with default values if invalid. + * @details \b Alarms: ALARM_ID_DD_NVM_INVALID_USAGE_RECORD_CRC if CRC + * check fails + * @details \b Inputs: ddUsageInfoGroup + * @details \b Outputs: ddUsageInfoGroup + * @return TRUE if the DD usage record is valid otherwise FALSE + *************************************************************************/ +static BOOL isDDUsageRecordValid( void ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord, sizeof( DD_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddUsageInfoGroup.ddUsageInfoRecord.crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + initDDUsageRecord(); + + // Initialize the padding + updateRecordPadding( NVM_USAGE_INFO_RECORD ); + + // Recalculate the CRC with the default values + updateRecordCRC( NVM_USAGE_INFO_RECORD ); + status = FALSE; + + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_USAGE_RECORD_CRC ); + } + + return status; +} + +/*********************************************************************//** + * @brief * The initDDSystemRecord function initializes the DD system record * with default values. It resets configuration fields and fills * string fields with default characters. @@ -887,7 +1055,7 @@ *************************************************************************/ static void initDDServiceRecord( void ) { - ddServiceGroup.ddServiceRecord.isHDFOnlineFluid = FALSE; + ddServiceGroup.ddServiceRecord.isHDFOnlineFluidAvailable = FALSE; ddServiceGroup.ddServiceRecord.waterRecovery = 0; ddServiceGroup.ddServiceRecord.serviceLoc = 0; ddServiceGroup.ddServiceRecord.lastServiceEpochDate = 0; @@ -897,14 +1065,13 @@ /*********************************************************************//** * @brief - * The initDDInstitutionalRecord function initializes the DD - * institutional record with default values. It sets configuration - * limits, alarm thresholds, and treatment options to default values. + * The initDDInstitBasicRecord function initializes the DD basic + * institutional record with default values. * @details \b Inputs: none * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord * @return none *************************************************************************/ -static void initDDInstitutionalRecord( void ) +static void initDDInstitBasicRecord( void ) { U32 i; @@ -915,19 +1082,54 @@ ddInstitutionalGroup.ddInstitutionalRecord.basicRecord.param[ i ].def = INSTIT_BASIC_PROP[ i ].data.def; } + ddInstitutionalGroup.ddInstitutionalRecord.basicRecord.crc = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.basicRecord, + sizeof( DD_INSTIT_BASIC_RECORD_T ) - sizeof( U16 ) ); +} + +/*********************************************************************//** + * @brief + * The initDDInstitAdvancedRecord function initializes the DD advanced + * institutional record with default values. + * @details \b Inputs: none + * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord + * @return none + *************************************************************************/ +static void initDDInstitAdvancedRecord( void ) +{ + U32 i; + for ( i = FIRST_INSTIT_ADVANCED_PARAM; i < NUM_OF_INSTIT_ADVANCED; i++ ) { ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ i ].min = INSTIT_ADVANCED_PROP[ i ].data.min; ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ i ].max = INSTIT_ADVANCED_PROP[ i ].data.max; ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ i ].def = INSTIT_ADVANCED_PROP[ i ].data.def; } + ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.crc = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord, + sizeof( DD_INSTIT_ADVANCED_RECORD_T ) - sizeof( U16 ) ); +} + +/*********************************************************************//** + * @brief + * The initDDInstitAdditionalRecord function initializes the DD additional + * institutional record with default values. + * @details \b Inputs: none + * @details \b Outputs: ddInstitutionalGroup.ddInstitutionalRecord + * @return none + *************************************************************************/ +static void initDDInstitAdditionalRecord( void ) +{ + U32 i; + for ( i = FIRST_INSTIT_ADDITIONAL_PARAM; i < NUM_OF_INSTIT_ADDITIONAL; i++ ) { - ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ i ].min = INSTIT_ADVANCED_PROP[ i ].data.min; - ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ i ].max = INSTIT_ADVANCED_PROP[ i ].data.max; - ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord.param[ i ].def = INSTIT_ADVANCED_PROP[ i ].data.def; + ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord.param[ i ].min = INSTIT_ADDITIONAL_PROP[ i ].data.min; + ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord.param[ i ].max = INSTIT_ADDITIONAL_PROP[ i ].data.max; + ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord.param[ i ].def = INSTIT_ADDITIONAL_PROP[ i ].data.def; } + + ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord.crc = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.additionalRecord, + sizeof( DD_INSTIT_ADDITIONAL_RECORD_T ) - sizeof( U16 ) ); } /*********************************************************************//** @@ -1027,45 +1229,35 @@ switch ( recType ) { case NVM_SYSTEM_RECORD: - { ddSystemGroup.ddSystemRecord.crc = crc16 ( (U08*)&ddSystemGroup.ddSystemRecord, sizeof( DD_SYSTEM_RECORD_T ) - sizeof( U16 ) ); ddSystemGroup.crc = crc16 ( (U08*)&ddSystemGroup, sizeof( DD_SYSTEM_GROUP_T ) - sizeof( U16 ) ); - } - break; + break; + case NVM_SERVICE_RECORD: - { ddServiceGroup.ddServiceRecord.crc = crc16 ( (U08*)&ddServiceGroup.ddServiceRecord, sizeof( DD_SERVICE_RECORD_T ) - sizeof( U16 ) ); ddServiceGroup.crc = crc16 ( (U08*)&ddServiceGroup, sizeof( DD_SERVICE_GROUP_T ) - sizeof( U16 ) ); - } break; + case NVM_CALIBRATION_RECORD: - { ddCalibrationGroup.crc = crc16 ( (U08*)&ddCalibrationGroup, sizeof( DD_CALIBRATION_GROUP_T ) - sizeof( U16 ) ); - } - break; + break; case NVM_INSTITUTIONAL_RECORD: - { - ddInstitutionalGroup.ddInstitutionalRecord.crc = crc16 ( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord, - sizeof( DD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); - ddInstitutionalGroup.crc = crc16 ( (U08*)&ddInstitutionalGroup, - sizeof( DD_INSTITUTIONAL_GROUP_T ) - sizeof( U16 ) ); - } - break; + ddInstitutionalGroup.crc = crc16 ( (U08*)&ddInstitutionalGroup, + sizeof( DD_INSTITUTIONAL_GROUP_T ) - sizeof( U16 ) ); + break; case NVM_USAGE_INFO_RECORD: - { ddUsageInfoGroup.ddUsageInfoRecord.crc = crc16 ( (U08*)&ddUsageInfoGroup.ddUsageInfoRecord, sizeof( DD_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); ddUsageInfoGroup.crc = crc16 ( (U08*)&ddUsageInfoGroup, sizeof( DD_USAGE_INFO_RECORD_T ) - sizeof( U16 ) ); - } - break; + break; default: break; @@ -1181,7 +1373,7 @@ *************************************************************************/ U32 getMinRORejectionRatioInInstitRecordPCT( void ) { - return ddInstitutionalGroup.ddInstitutionalRecord.minRORejectionRatioPCT; +// return ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord[ INSTIT_PARAM_RO_REJECTION_RATIO_ALRAM ].min; } /*********************************************************************//** @@ -1197,7 +1389,7 @@ F32 getMinInletWaterConductivityLimitInstitRecordUSPCM( void ) { - return ddInstitutionalGroup.ddInstitutionalRecord.minInletWaterCondAlarmLimitUSPCM; +// return ddInstitutionalGroup.ddInstitutionalRecord.advancedRecord[ INSTIT_PARAM_INLET_WATER_COND_LOW_ALARM ].min; } /*********************************************************************//** @@ -1284,7 +1476,7 @@ isNVDataInvalid |= ( 0 == ddCalibrationGroup.ddCalibrationRecord.bicarbConcentratesRecord.bicarbConcentrate[ i ].calibrationTime ? TRUE : FALSE ); break; - case NV_DD_DATA_CAL_ACCEL_SENSOR: + case NV_DD_DATA_CAL_ACCELEROMETER_SENSOR: nvDataStartPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord; isNVDataInvalid = ( 0 == ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord.calibrationTime ? TRUE : FALSE ); break; @@ -1427,7 +1619,7 @@ recTypeGroup = NVM_CALIBRATION_RECORD; break; - case NV_DD_DATA_CAL_ACCEL_SENSOR: + case NV_DD_DATA_CAL_ACCELEROMETER_SENSOR: destPtr = (U08*)&ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord; dataSize = sizeof( ddCalibrationGroup.ddCalibrationRecord.accelerometerSensorCalRecord ); recTypeGroup = NVM_CALIBRATION_RECORD; @@ -1577,7 +1769,7 @@ break; case NVM_INSTITUTIONAL_RECORD: - ddInstitutionalGroup.ddInstitutionalRecord.crc = crc; + ddInstitutionalGroup.crc = crc; break; case NVM_USAGE_INFO_RECORD: Index: firmware/App/Services/NVRecordsDD.h =================================================================== diff -u -rb50ce33669efe6dfcf5f8a211c78a6c2c309adf3 -rac72b3fa86015b2c60c7687a4597dd4ae5c24dc8 --- firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision b50ce33669efe6dfcf5f8a211c78a6c2c309adf3) +++ firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision ac72b3fa86015b2c60c7687a4597dd4ae5c24dc8) @@ -17,6 +17,7 @@ #include "Common.h" #include "ConcentratePumps.h" +#include "ConductivitySensors.h" #include "DDDefs.h" #include "DialysatePumps.h" #include "FlowSensor.h" @@ -81,7 +82,7 @@ NV_DD_DATA_CAL_D48_PUMP_RECORD, ///< D48 dialysate pump calibration record. NV_DD_DATA_CAL_ACID_CONCENTREATES, ///< Acid concentrates calibration data. NV_DD_DATA_CAL_BICARB_CONCENTRATES, ///< Bicarb concentrates calibration data. - NV_DD_DATA_CAL_ACCEL_SENSOR, //< Accelerometers calibration data. + NV_DD_DATA_CAL_ACCELEROMETER_SENSOR, //< Accelerometer calibration data. NV_DD_DATA_CAL_BLOOD_LEAK_SENSOR, ///< Blood leak sensor calibration data. NV_DD_DATA_CAL_CONDUCTIVITY_SENSORS, ///< Conductivity sensor calibration data. NV_DD_DATA_INSTIT_BASIC_RECORD, ///< Basic institutional record. @@ -243,29 +244,10 @@ 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 + CONDUCTIVITY_COEFFICIENTS_T condSensors[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< DD Conductivity Sensors } DD_CONDUCTIVITY_SENSOR_CAL_RECORD_T; /// DD systems record structure