Index: firmware/App/Services/NVMessagingDD.c =================================================================== diff -u -rbe1ff666dbd2ff03342c22c8e50b21d0f9b988a9 -r1ce98afa73e6c88addb3a01643c791c15e7a147c --- firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision be1ff666dbd2ff03342c22c8e50b21d0f9b988a9) +++ firmware/App/Services/NVMessagingDD.c (.../NVMessagingDD.c) (revision 1ce98afa73e6c88addb3a01643c791c15e7a147c) @@ -178,8 +178,8 @@ isPublishRecordRequested[ NVM_INSTITUTIONAL_RECORD ] = FALSE; isPublishRecordRequested[ NVM_USAGE_INFO_RECORD ] = FALSE; recordSendDataIntervalCounter = 0; - sendInstitRec = DD_INSTIT_MIN_DIALYSATE_FLOW_MLPM; - sendCalRec = DD_CAL_RECORD_PRESSURE_SENSOR; + sendInstitRec = DD_INSTIT_FIRST_PARAM; + sendCalRec = DD_CAL_FIRST_RECORD; } /*********************************************************************//** @@ -325,6 +325,7 @@ * The handleExecSendRecordSendState function handles the send state of * the exec send record state machine. It sends record data in chunks * based on timing and message count. + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT if invalid record type * @details \b Inputs: recordPublishTotalMsgs, * recordPublishMsgCount, recordSendDataIntervalCounter, * recordToPublish @@ -339,7 +340,7 @@ // If it is time to send data if ( ++recordSendDataIntervalCounter >= RECORD_DATA_SEND_INTERVAL_COUNT ) { - switch(recordToPublish) + switch( recordToPublish ) { case NVM_SYSTEM_RECORD: state = handleSendDDSystemRecord(); @@ -362,6 +363,9 @@ break; default: + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )recordToPublish ); + recordToPublish = NVM_SYSTEM_RECORD; + state = NVM_SEND_RECORD_STATE_IDLE; break; } Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -rbe1ff666dbd2ff03342c22c8e50b21d0f9b988a9 -r1ce98afa73e6c88addb3a01643c791c15e7a147c --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision be1ff666dbd2ff03342c22c8e50b21d0f9b988a9) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 1ce98afa73e6c88addb3a01643c791c15e7a147c) @@ -152,7 +152,6 @@ U16 crc; ///< CRC for the DG service structure. } DD_SERVICE_GROUP_T; - /// DD institutional record structure typedef struct { @@ -241,7 +240,7 @@ 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 void initDDSystemRecord( void ); static void initDDServiceRecord( void ); @@ -480,7 +479,6 @@ * @details \b Outputs: ddSystemGroup.ddSystemRecord, ddSystemGroup.crc * @return TRUE if the DD system record is valid otherwise FALSE *************************************************************************/ - static BOOL isDDSystemRecordValid( void ) { BOOL status = TRUE; @@ -710,7 +708,7 @@ 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; // If the sub groups failed, they are all updated to their benign values @@ -855,15 +853,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 ) ); @@ -917,7 +915,9 @@ ddServiceGroup.ddServiceRecord.serviceLoc = 0; ddServiceGroup.ddServiceRecord.lastServiceEpochDate = 0; ddServiceGroup.ddServiceRecord.serviceIntervalSeconds = 0; -// ddServiceGroup.ddServiceRecord.lastResetTimeEpoch = getRTCTimestamp(); + + // TODO: Update lastResetTimeEpoch to current timestamp published by UI. + ddServiceGroup.ddServiceRecord.lastResetTimeEpoch = RECORD_DEFAULT_TIME; } /*********************************************************************//** @@ -953,7 +953,9 @@ ddInstitutionalGroup.ddInstitutionalRecord.minBicarbAlarmLimitPCT = DEFAULT_MIN_BICARB_ALARM_US_P_CM; ddInstitutionalGroup.ddInstitutionalRecord.postTreatDrainOption = DEFAULT_POST_TREATMENT_DRAIN_OPTION; ddInstitutionalGroup.ddInstitutionalRecord.postTreatDryBicarbOption = DEFAULT_POST_TREATMENT_DRY_BICARB_OPTION; -// ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime = getRTCTimestamp(); + + // TODO: Update lastUpdatedTime to current timestamp published by UI. + ddInstitutionalGroup.ddInstitutionalRecord.lastUpdatedTime = RECORD_DEFAULT_TIME; } /*********************************************************************//** @@ -995,47 +997,39 @@ switch ( recType ) { case NVM_SYSTEM_RECORD: + for ( i = 0; i < SYSTEM_RECORD_PADDING_LENGTH; i++ ) { - for ( i = 0; i < SYSTEM_RECORD_PADDING_LENGTH; i++ ) - { - ddSystemGroup.padding[ i ] = 0; - } + ddSystemGroup.padding[ i ] = 0; } break; + case NVM_SERVICE_RECORD: - { for ( i = 0; i < SERVICE_RECORD_PADDING_LENGTH; i++ ) { ddServiceGroup.padding[ i ] = 0; } - } break; + case NVM_CALIBRATION_RECORD: - { for ( i = 0; i < CALIBRATION_RECORD_PADDING_LENGTH; i++ ) { ddCalibrationGroup.padding[ i ] = 0; } - } - break; + break; case NVM_INSTITUTIONAL_RECORD: - { for ( i = 0; i < INSTITUTIONAL_RECORD_PADDING_LENGTH; i++ ) { ddInstitutionalGroup.padding[ i ] = 0; } - } - break; + break; case NVM_USAGE_INFO_RECORD: - { for ( i = 0; i < USAGE_INFO_RECORD_PADDING_LENGTH; i++ ) { ddUsageInfoGroup.padding[ i ] = 0; } - } - break; + break; default: break; @@ -1063,45 +1057,37 @@ 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 ) ); - } + 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; + 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; + 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; @@ -1810,8 +1796,8 @@ dataSize = sizeof(U32); break; - case DD_INSTIT_CALIBRATION_TIME: - srcPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime; + case DD_INSTIT_LAST_UPDATED_TIME: + srcPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.lastUpdatedTime; dataSize = sizeof(U32); break; @@ -1963,8 +1949,8 @@ dataSize = sizeof(U32); break; - case DD_INSTIT_CALIBRATION_TIME: - destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime; + case DD_INSTIT_LAST_UPDATED_TIME: + destPtr = (U08*)&ddInstitutionalGroup.ddInstitutionalRecord.lastUpdatedTime; dataSize = sizeof(U32); break; Index: firmware/App/Services/NVRecordsDD.h =================================================================== diff -u -rbe1ff666dbd2ff03342c22c8e50b21d0f9b988a9 -r1ce98afa73e6c88addb3a01643c791c15e7a147c --- firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision be1ff666dbd2ff03342c22c8e50b21d0f9b988a9) +++ firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision 1ce98afa73e6c88addb3a01643c791c15e7a147c) @@ -73,6 +73,7 @@ typedef enum DD_Cal_Records_Type { DD_CAL_RECORD_PRESSURE_SENSOR = 0, ///< Index for pressure sensors calibration data. + DD_CAL_FIRST_RECORD = DD_CAL_RECORD_PRESSURE_SENSOR, ///< First component of the calibration data. DD_CAL_RECORD_TEMPERATURE_SENSOR, ///< Index for temperature sensors calibration data. DD_CAL_RECORD_CONCENTRATE_PUMP, ///< Index for concentrate pumps calibration record. DD_CAL_RECORD_D12_PUMP, ///< Index for D12 dialysate pump calibration record. @@ -88,6 +89,7 @@ typedef enum DD_Instit_Records_Type { DD_INSTIT_MIN_DIALYSATE_FLOW_MLPM = 0, ///< Index for Min dialysate flow in mL/min. + DD_INSTIT_FIRST_PARAM = DD_INSTIT_MIN_DIALYSATE_FLOW_MLPM, ///< First Parameter of the Institutional record. DD_INSTIT_MAX_DIALYSATE_FLOW_MLPM, ///< Index for Max dialysate flow in mL/min. DD_INSTIT_MIN_DIALYSATE_TEMP_C, ///< Index for Min dialysate temperature in C. DD_INSTIT_MAX_DIALYSATE_TEMP_C, ///< Index for Max dialysate temperature in C. @@ -109,7 +111,7 @@ DD_INSTIT_MIN_BICARB_ALARM_LIMIT_PCT, ///< Index for Min bicarbonate alarm limit in percent. DD_INSTIT_POST_TREAT_DRAIN_OPTION, ///< Index for Dialysate Post Treatment Drain Option  DD_INSTIT_POST_TREAT_DRY_BICARB_OPTION, ///< Index for Dry Bicarbonate Post Treatment Option  - DD_INSTIT_CALIBRATION_TIME, ///< Index for Calibration time in epoch. + DD_INSTIT_LAST_UPDATED_TIME, ///< Index for last updated time in epoch. DD_INSTIT_CRC, ///< Index for CRC of the institutional record. NUM_OF_DD_INSTIT_RECORD_TYPE ///< Total number of components in institutional record }DD_INSTIT_REC_TYPE; @@ -298,7 +300,7 @@ 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. + U32 lastUpdatedTime; ///< Last time when institutional setting was updated in epoch. U16 crc; ///< CRC of the institutional record. } DD_INSTITUTIONAL_RECORD_T;