Index: NVDataMgmt.c =================================================================== diff -u -r109772ec165e82056619afd77a89c064e1f17c00 -rd22ac2e16310e6ac50119305805af0aa9a5447d8 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 109772ec165e82056619afd77a89c064e1f17c00) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision d22ac2e16310e6ac50119305805af0aa9a5447d8) @@ -97,6 +97,7 @@ #define SYSTEM_RECORD_NV_MEM_START_ADDRESS (BANK7_SECTOR0_START_ADDRESS) ///< System record storage start address in NV memory. #define SERVICE_RECORD_NV_MEM_START_ADDRESS (BANK7_SECTOR0_START_ADDRESS + BITS_12_FULL_SCALE) ///< Service record storage start address in NV memory. #define CAL_RECORD_NV_MEM_START_ADDRESS (SERVICE_RECORD_NV_MEM_START_ADDRESS + BITS_12_FULL_SCALE) ///< Calibration record storage start address in NV memory. +#define INSTIT_RECORD_NV_MEM_START_ADDRESS (CAL_RECORD_NV_MEM_START_ADDRESS + BITS_12_FULL_SCALE) ///< Institutional record storage start address in NV memory. #define RECORD_BYTE_SIZE(r) (sizeof(r) + sizeof(U16)) ///< Record byte size macro. // Padding length calculation: (DG struct size % bytes to write(16) == 0 ? 0 : ((DG struct size / bytes to write(16)) + 1) * bytes to write(16)) - DG struct size. @@ -408,18 +409,26 @@ typedef struct { HD_SERVICE_RECORD_T hdServiceRecord; ///< HD service record. - U08 padding[ RECORD_PADDING_LENGTH(HD_SERVICE_RECORD_T, MAX_RTC_RAM_OPS_BUFFER_BYTES) ]; ///< HD service group padding. + U08 padding[ RECORD_PADDING_LENGTH(HD_SERVICE_RECORD_T, MAX_EEPROM_WRITE_BUFFER_BYTES) ]; ///< HD service group padding. U16 crc; ///< CRC for the HD service structure. } HD_SERVICE_GROUP_T; /// HD usage info record structure typedef struct { HD_USAGE_INFO_RECORD_T hdUsageInfo; ///< HD usage info record. - U08 padding[ RECORD_PADDING_LENGTH(HD_USAGE_INFO_RECORD_T, MAX_RTC_RAM_OPS_BUFFER_BYTES) ]; ///< HD scheduled run group padding. + U08 padding[ RECORD_PADDING_LENGTH(HD_USAGE_INFO_RECORD_T, MAX_RTC_RAM_OPS_BUFFER_BYTES) ]; ///< HD usage info group padding. U16 crc; ///< CRC for the HD usage info structure. } HD_USAGE_INFO_GROUP_T; +/// HD institutional record structure +typedef struct +{ + HD_INSTITUTIONAL_RECORD_T hdInstitutionalRecord; ///< HD institutional record. + U08 padding[ RECORD_PADDING_LENGTH(HD_INSTITUTIONAL_RECORD_T, MAX_RTC_RAM_OPS_BUFFER_BYTES) ]; ///< HD institutional group padding. + U16 crc; ///< CRC for the HD institutional structure. +} HD_INSTITUTIONAL_GROUP_T; + #ifndef _RELEASE_ /// HD software configurations group typedef struct @@ -470,18 +479,20 @@ static HD_SYSTEM_GROUP_T hdSystemGroup; ///< HD system group structure (including padding and final CRC). static HD_SERVICE_GROUP_T hdServiceGroup; ///< HD service group structure (including padding and final CRC). static HD_USAGE_INFO_GROUP_T hdUsageInfoGroup; ///< HD usage info group structure (including padding and final CRC). +static HD_INSTITUTIONAL_GROUP_T hdInstitutionalGroup; ///< HD institutional group structure (including padding and final CRC). #ifndef _RELEASE_ static HD_SW_CONFIG_GROUP_T hdSWConfigGroup; ///< HD Software configurations structure(including padding and final CRC). #endif // Process records specifications const PROCESS_RECORD_SPECS_T RECORDS_SPECS [ NUM_OF_NVDATMGMT_RECORDS_JOBS ] = { - // Start address Size of the job Max write bytes per job Max read bytes per job Record structure pointer Record CRC pointer Memory location Event calibration record update - {CAL_RECORD_NV_MEM_START_ADDRESS, sizeof(HD_CALIBRATION_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(HD_CALIBRATION_RECORD_T), (U08*)&hdCalibrationRecord, (U08*)&hdCalibrationRecord.crc, NVDATAMGMT_EEPROM, HD_EVENT_CAL_RECORD_UPDATE }, // NVDATAMGMT_CALIBRATION_RECORD - {SYSTEM_RECORD_NV_MEM_START_ADDRESS, sizeof(HD_SYSTEM_GROUP_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(HD_SYSTEM_GROUP_T), (U08*)&hdSystemGroup, (U08*)&hdSystemGroup.crc, NVDATAMGMT_EEPROM, HD_EVENT_SYSTEM_RECORD_UPDATE }, // NVDATAMGMT_SYSTEM_RECORD - {SERVICE_RECORD_NV_MEM_START_ADDRESS, sizeof(HD_SERVICE_GROUP_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(HD_SERVICE_GROUP_T), (U08*)&hdServiceGroup, (U08*)&hdServiceGroup.crc, NVDATAMGMT_EEPROM, HD_EVENT_SERVICE_UPDATE }, // NVDATAMGMT_PROCESS_LAST_SERVICE_RECORD - {HD_USAGE_INFO_START_ADDRESS, sizeof(HD_USAGE_INFO_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&hdUsageInfoGroup, (U08*)&hdUsageInfoGroup.crc, NVDATAMGMT_RTC, HD_EVENT_USAGE_INFO_UPDATE }, // NVDATAMGMT_USAGE_INFO + // Start address Size of the job Max write bytes per job Max read bytes per job Record structure pointer Record CRC pointer Memory location Event calibration record update + {CAL_RECORD_NV_MEM_START_ADDRESS, sizeof(HD_CALIBRATION_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(HD_CALIBRATION_RECORD_T), (U08*)&hdCalibrationRecord, (U08*)&hdCalibrationRecord.crc, NVDATAMGMT_EEPROM, HD_EVENT_CAL_RECORD_UPDATE }, // NVDATAMGMT_CALIBRATION_RECORD + {SYSTEM_RECORD_NV_MEM_START_ADDRESS, sizeof(HD_SYSTEM_GROUP_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(HD_SYSTEM_GROUP_T), (U08*)&hdSystemGroup, (U08*)&hdSystemGroup.crc, NVDATAMGMT_EEPROM, HD_EVENT_SYSTEM_RECORD_UPDATE }, // NVDATAMGMT_SYSTEM_RECORD + {SERVICE_RECORD_NV_MEM_START_ADDRESS, sizeof(HD_SERVICE_GROUP_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(HD_SERVICE_GROUP_T), (U08*)&hdServiceGroup, (U08*)&hdServiceGroup.crc, NVDATAMGMT_EEPROM, HD_EVENT_SERVICE_UPDATE }, // NVDATAMGMT_SERVICE_RECORD + {INSTIT_RECORD_NV_MEM_START_ADDRESS, sizeof(HD_INSTITUTIONAL_GROUP_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(HD_INSTITUTIONAL_GROUP_T), (U08*)&hdInstitutionalGroup, (U08*)&hdInstitutionalGroup.crc, NVDATAMGMT_EEPROM, HD_EVENT_INSTIT_RECORD_UPDATE }, // NVDATAMGMT_INTITUTIONAL_RECORD + {HD_USAGE_INFO_START_ADDRESS, sizeof(HD_USAGE_INFO_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&hdUsageInfoGroup, (U08*)&hdUsageInfoGroup.crc, NVDATAMGMT_RTC, HD_EVENT_USAGE_INFO_UPDATE }, // NVDATAMGMT_USAGE_INFO #ifndef _RELEASE_ - {SW_CONFIGS_START_ADDRESS, sizeof(HD_SW_CONFIG_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&hdSWConfigGroup, (U08*)&hdSWConfigGroup.crc, NVDATAMGMT_RTC, HD_EVENT_SW_CONFIG_UPDATE } // NVDATAMGMT_SW_CONFIG_RECORD + {SW_CONFIGS_START_ADDRESS, sizeof(HD_SW_CONFIG_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&hdSWConfigGroup, (U08*)&hdSWConfigGroup.crc, NVDATAMGMT_RTC, HD_EVENT_SW_CONFIG_UPDATE } // NVDATAMGMT_SW_CONFIG_RECORD #endif }; #endif @@ -603,6 +614,7 @@ static BOOL isHDServiceRecordValid( void ); static BOOL isHDUsageRecordValid( void ); static BOOL isHDCalibrationRecordValid( void ); +static BOOL isHDInstitutionalRecordValid( void ); static BOOL isHDValveRecordValid( HD_VALVE_CAL_PAYLOAD_T* record ); static BOOL isHDPumpRecordValid( HD_PUMP_CAL_PAYLOAD_T* record ); static BOOL isHDAccelerometerSensorValid( HD_ACCELEROMETER_SENSOR_CAL_RECORD_T* record ); @@ -1084,6 +1096,11 @@ nvDataLength = sizeof( hdUsageInfoGroup.hdUsageInfo ); break; + case GET_INSTITUTIONAL_RECORD: + nvDataStartPtr = (U08*)&hdInstitutionalGroup.hdInstitutionalRecord; + nvDataLength = sizeof( hdInstitutionalGroup.hdInstitutionalRecord ); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_NV_RECORD_SELECTED, nvData ) break; @@ -1751,6 +1768,7 @@ BOOL haveCalGroupsPassed = TRUE; BOOL hasSystemRecordPassed = TRUE; BOOL hasServiceRecordPassed = TRUE; + BOOL hasInstitutionalRecordPassed = TRUE; BOOL hasSWConfigRecordPassed = TRUE; BOOL hasUsageRecordPassed = TRUE; @@ -1767,24 +1785,26 @@ #endif #endif #ifdef _HD_ - haveCalGroupsPassed = isHDCalibrationRecordValid(); - hasSystemRecordPassed = isHDSystemRecordValid(); - hasServiceRecordPassed = isHDServiceRecordValid(); - hasUsageRecordPassed = isHDUsageRecordValid(); + haveCalGroupsPassed = isHDCalibrationRecordValid(); + hasSystemRecordPassed = isHDSystemRecordValid(); + hasServiceRecordPassed = isHDServiceRecordValid(); + hasInstitutionalRecordPassed = isHDInstitutionalRecordValid(); + hasUsageRecordPassed = isHDUsageRecordValid(); #ifndef _RELEASE_ - hasSWConfigRecordPassed = isSWConfigRecordValid(); + hasSWConfigRecordPassed = isSWConfigRecordValid(); #endif #endif // If any of the records did not pass, they should be filled // with benign values. After that, schedule a write to sector 0 // to re-write the records with the benign values - if ( ( FALSE == hasServiceRecordPassed ) || ( FALSE == haveCalGroupsPassed ) || ( FALSE == hasSystemRecordPassed ) ) + if ( ( FALSE == hasServiceRecordPassed ) || ( FALSE == haveCalGroupsPassed ) || ( FALSE == hasSystemRecordPassed ) || ( FALSE == hasInstitutionalRecordPassed ) ) { enqueueSector0Records(); SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_CALIBRATION_RECORD ].nvEvent, 0, 0 ) SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_SYSTEM_RECORD ].nvEvent, 0, 0 ) SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_SERVICE_RECORD ].nvEvent, 0, 0 ) + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_INTITUTIONAL_RECORD].nvEvent, 0, 0 ) } #ifndef _RELEASE_ @@ -3799,6 +3819,56 @@ /*********************************************************************//** * @brief + * The isHDInstitutionalRecordValid function checks the validity of the HD + * institutional record. + * @details Inputs: hdInstitutionalGroup.hdInstitutionalRecord + * @details Outputs: none + * @return TRUE if the HD institutional record is valid otherwise FALSE + *************************************************************************/ +static BOOL isHDInstitutionalRecordValid( void ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16( (U08*)&hdInstitutionalGroup.hdInstitutionalRecord, sizeof( HD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = hdInstitutionalGroup.hdInstitutionalRecord.crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + hdInstitutionalGroup.hdInstitutionalRecord.minBloodFlowMLPM = DEFAULT_MIN_BLOOD_FLOW_MLPM; + hdInstitutionalGroup.hdInstitutionalRecord.maxBloodFlowMLPM = DEFAULT_MAX_BLOOD_FLOW_MLPM; + hdInstitutionalGroup.hdInstitutionalRecord.minDialysateFlowMLPM = DEFAULT_MIN_DIALYSATE_FLOW_MLPM; + hdInstitutionalGroup.hdInstitutionalRecord.maxDialysateFlowMLPM = DEFAULT_MAX_DIALYSATE_FLOW_MLPM; + hdInstitutionalGroup.hdInstitutionalRecord.minTxDurationMin = DEFAULT_MIN_TX_DURATION_MIN; + hdInstitutionalGroup.hdInstitutionalRecord.maxTxDurationMin = DEFAULT_MAX_TX_DURATION_MIN; + hdInstitutionalGroup.hdInstitutionalRecord.heparinEnable = DEFAULT_HEPARIN_ENABLE; + hdInstitutionalGroup.hdInstitutionalRecord.minStopHeparinDispBeforeTxEnd = DEFAULT_MIN_STOP_HEP_DISP_BEFORE_TX_END; + hdInstitutionalGroup.hdInstitutionalRecord.maxStopHeparinDispBeforeTxEnd = DEFAULT_MAX_STOP_HEP_DISP_BEFORE_TX_END; + hdInstitutionalGroup.hdInstitutionalRecord.minSalineBolusVolumeML = DEFAULT_MIN_SALINE_BOLUS_VOLUME_ML; + hdInstitutionalGroup.hdInstitutionalRecord.maxSalineBolusVolumeML = DEFAULT_MAX_SALINE_BOLUS_VOLUME_ML; + hdInstitutionalGroup.hdInstitutionalRecord.minDialysateTempC = DEFAULT_MIN_DIALYSATE_TEMPERATURE_C; + hdInstitutionalGroup.hdInstitutionalRecord.maxDialysateTempC = DEFAULT_MAX_DIALYSATE_TEMPERATURE_C; + hdInstitutionalGroup.hdInstitutionalRecord.minArtPressLimitWindowMMHG = DEFAULT_MIN_ART_PRESS_LIMIT_WINDOW_MMHG; + hdInstitutionalGroup.hdInstitutionalRecord.maxArtPressLimitWindowMMHG = DEFAULT_MAX_ART_PRESS_LIMIT_WINDOW_MMHG; + hdInstitutionalGroup.hdInstitutionalRecord.minVenPressLimitWindowMMHG = DEFAULT_MIN_VEN_PRESS_LIMIT_WINDOW_MMHG; + hdInstitutionalGroup.hdInstitutionalRecord.maxVenPressLimitWindowMMHG = DEFAULT_MAX_VEN_PRESS_LIMIT_WINDOW_MMHG; + hdInstitutionalGroup.hdInstitutionalRecord.minVenAsymPressLimitMMHG = DEFAULT_MIN_VEN_ASYM_PRESS_LIMIT_WINDOW_MMHG; + hdInstitutionalGroup.hdInstitutionalRecord.maxVenAsymPressLimitMMHG = DEFAULT_MAX_VEN_ASYM_PRESS_LIMIT_WINDOW_MMHG; + hdInstitutionalGroup.hdInstitutionalRecord.minUFVolumeML = DEFAULT_MIN_UF_VOLUME_ML; + hdInstitutionalGroup.hdInstitutionalRecord.maxUFVolumeML = DEFAULT_MAX_UF_VOLUME_ML; + hdInstitutionalGroup.hdInstitutionalRecord.crc = crc16 ( (U08*)&hdInstitutionalGroup.hdInstitutionalRecord, + sizeof( HD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); + hdInstitutionalGroup.crc = crc16 ( (U08*)&hdInstitutionalGroup, sizeof( HD_INSTITUTIONAL_GROUP_T ) - sizeof( U16 ) ); + status = FALSE; + + // Institutional record failure is also considered as RTC RAM failure + activateAlarmNoData( ALARM_ID_HD_INVALID_INSTITUTIONAL_RECORD_CRC ); + } + + return status; +} + +/*********************************************************************//** + * @brief * The isHDPumpRecordValid function checks whether the calibration record * of HD pump(s) is valid or not. * @details Inputs: none Index: NVDataMgmt.h =================================================================== diff -u -r109772ec165e82056619afd77a89c064e1f17c00 -rd22ac2e16310e6ac50119305805af0aa9a5447d8 --- NVDataMgmt.h (.../NVDataMgmt.h) (revision 109772ec165e82056619afd77a89c064e1f17c00) +++ NVDataMgmt.h (.../NVDataMgmt.h) (revision d22ac2e16310e6ac50119305805af0aa9a5447d8) @@ -71,6 +71,7 @@ NVDATAMGMT_CALIBRATION_RECORD = 0, ///< NVDataMgmt process write calibration record. NVDATAMGMT_SYSTEM_RECORD, ///< NVDataMgmt process write system record. NVDATAMGMT_SERVICE_RECORD, ///< NVDataMgmt process service record. + NVDATAMGMT_INTITUTIONAL_RECORD, ///< NVDataMgmt process institutional record. #ifdef _DG_ NVDATAMGMT_SCHEDULED_RUNS_RECORD, ///< NVDataMgmt process scheduled runs record. NVDATAMGMT_HEATERS_INFO_RECORD, ///< NVDataMgmt process heaters info record. Index: NVDataMgmtHDRecords.h =================================================================== diff -u -red0b0d9fd80ba2e66bf6566ef47197812aec2b7a -rd22ac2e16310e6ac50119305805af0aa9a5447d8 --- NVDataMgmtHDRecords.h (.../NVDataMgmtHDRecords.h) (revision ed0b0d9fd80ba2e66bf6566ef47197812aec2b7a) +++ NVDataMgmtHDRecords.h (.../NVDataMgmtHDRecords.h) (revision d22ac2e16310e6ac50119305805af0aa9a5447d8) @@ -35,6 +35,29 @@ #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. +// Institutional record defaults +#define DEFAULT_MIN_BLOOD_FLOW_MLPM 100 +#define DEFAULT_MAX_BLOOD_FLOW_MLPM 500 +#define DEFAULT_MIN_DIALYSATE_FLOW_MLPM 100 +#define DEFAULT_MAX_DIALYSATE_FLOW_MLPM 600 +#define DEFAULT_MIN_TX_DURATION_MIN 60 +#define DEFAULT_MAX_TX_DURATION_MIN 480 +#define DEFAULT_HEPARIN_ENABLE 1 +#define DEFAULT_MIN_STOP_HEP_DISP_BEFORE_TX_END 0 +#define DEFAULT_MAX_STOP_HEP_DISP_BEFORE_TX_END 480 +#define DEFAULT_MIN_SALINE_BOLUS_VOLUME_ML 100 +#define DEFAULT_MAX_SALINE_BOLUS_VOLUME_ML 300 +#define DEFAULT_MIN_DIALYSATE_TEMPERATURE_C 35.0F +#define DEFAULT_MAX_DIALYSATE_TEMPERATURE_C 37.0F +#define DEFAULT_MIN_ART_PRESS_LIMIT_WINDOW_MMHG 120 +#define DEFAULT_MAX_ART_PRESS_LIMIT_WINDOW_MMHG 200 +#define DEFAULT_MIN_VEN_PRESS_LIMIT_WINDOW_MMHG 100 +#define DEFAULT_MAX_VEN_PRESS_LIMIT_WINDOW_MMHG 200 +#define DEFAULT_MIN_VEN_ASYM_PRESS_LIMIT_WINDOW_MMHG 20 +#define DEFAULT_MAX_VEN_ASYM_PRESS_LIMIT_WINDOW_MMHG 35 +#define DEFAULT_MIN_UF_VOLUME_ML 0 +#define DEFAULT_MAX_UF_VOLUME_ML 8 + #ifndef _RELEASE_ /// Software configuration enums typedef enum software_configurations @@ -101,6 +124,7 @@ GET_SYS_RECORD, ///< Get system record data. GET_SRV_RECORD, ///< Get service record data. GET_USAGE_RECORD, ///< Get usage record. + GET_INSTITUTIONAL_RECORD, ///< Get institutional record. NUM_OF_NV_HD_DATA ///< Number of non-volatile data. } NV_DATA_T; @@ -265,6 +289,34 @@ U16 crc; ///< CRC for the HD service record structure. } HD_SERVICE_RECORD_T; +/// HD institutional record structure +typedef struct +{ + U32 minBloodFlowMLPM; + U32 maxBloodFlowMLPM; + U32 minDialysateFlowMLPM; + U32 maxDialysateFlowMLPM; + U32 minTxDurationMin; + U32 maxTxDurationMin; + U32 heparinEnable; + U32 minStopHeparinDispBeforeTxEnd; + U32 maxStopHeparinDispBeforeTxEnd; + U32 minSalineBolusVolumeML; + U32 maxSalineBolusVolumeML; + F32 minDialysateTempC; + F32 maxDialysateTempC; + U32 minArtPressLimitWindowMMHG; + U32 maxArtPressLimitWindowMMHG; + U32 minVenPressLimitWindowMMHG; + U32 maxVenPressLimitWindowMMHG; + U32 minVenAsymPressLimitMMHG; + U32 maxVenAsymPressLimitMMHG; + U32 minUFVolumeML; + U32 maxUFVolumeML; + U32 calibrationTime; + U16 crc; +} HD_INSTITUTIONAL_RECORD_T; + /// HD usage info structure. typedef struct {