Index: Accel.c =================================================================== diff -u -rab745156d182ac1ee04a98aa2b2af0f30c8894e6 -rc1881f60c442c55ec04b54b8ee9000d2ac9dca8d --- Accel.c (.../Accel.c) (revision ab745156d182ac1ee04a98aa2b2af0f30c8894e6) +++ Accel.c (.../Accel.c) (revision c1881f60c442c55ec04b54b8ee9000d2ac9dca8d) @@ -555,18 +555,23 @@ *************************************************************************/ SELF_TEST_STATUS_T execAccelTest( void ) { - SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; + +#ifdef _HD_ + HD_ACCELEROMETER_SENSOR_CAL_RECORD_T cal = getHDAccelerometerSensorCalibrationRecord(); +#endif +#ifdef _DG_ + DG_ACCELEROMETER_SENSOR_CAL_RECORD_T cal = getDGAccelerometerSensorCalibrationRecord(); +#endif switch ( accelSelfTestState ) { - case ACCELEROMETER_SELF_TEST_STATE_START: - { - HD_ACCELEROMETER_SENSOR_CAL_RECORD_T cal = getHDAccelerometerSensorCalibrationRecord(); + case ACCELEROMETER_SELF_TEST_STATE_START: - accelCalOffsets[ ACCEL_AXIS_X ] = cal.accelXOffset; - accelCalOffsets[ ACCEL_AXIS_Y ] = cal.accelYOffset; - accelCalOffsets[ ACCEL_AXIS_Z ] = cal.accelZOffset; - accelSelfTestState = ACCELEROMETER_SELF_TEST_STATE_IN_PROGRESS; + accelCalOffsets[ ACCEL_AXIS_X ] = cal.accelXOffset; + accelCalOffsets[ ACCEL_AXIS_Y ] = cal.accelYOffset; + accelCalOffsets[ ACCEL_AXIS_Z ] = cal.accelZOffset; + accelSelfTestState = ACCELEROMETER_SELF_TEST_STATE_IN_PROGRESS; //else TODO what to do with this statement? { // shouldn't get here - should have failed NV-Data POST prior result = SELF_TEST_STATUS_FAILED; @@ -577,7 +582,6 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_ACCELEROMETER_SELF_TEST_FAILURE, 0 ) #endif } - } break; case ACCELEROMETER_SELF_TEST_STATE_IN_PROGRESS: Index: NVDataMgmt.c =================================================================== diff -u -rab745156d182ac1ee04a98aa2b2af0f30c8894e6 -rc1881f60c442c55ec04b54b8ee9000d2ac9dca8d --- NVDataMgmt.c (.../NVDataMgmt.c) (revision ab745156d182ac1ee04a98aa2b2af0f30c8894e6) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision c1881f60c442c55ec04b54b8ee9000d2ac9dca8d) @@ -79,13 +79,10 @@ #define SERVICE_RECORD_START_ADDRESS 0x00000030 // 48 ///< Service date record start address in RTC RAM (HD/DG) (48). #define DG_SCHEDULED_RUNS_START_ADDRESS (SERVICE_RECORD_START_ADDRESS + sizeof(DG_SERVICE_GROUP_T)) ///< DG scheduled runs start address in RTC RAM. -// Data addresses in EEPROM -#define CALIBRATION_RECORD_START_ADDRESS (BANK7_SECTOR0_START_ADDRESS + sizeof(MFG_RECORD_T)) //TODO remove ///< Calibration record start address in EEPROM. +#define COMMAND_TIME_OUT 500U ///< Timeout for an EEPROM or RTC command in ms. +/// EEPROM functions use the buffer length as the size of U32. So before send the length to any of FAPI functions, it should be divide by 4. +#define EEPROM_OPS_SIZE_OF_CONVERTER 4 -#define COMMAND_TIME_OUT 500U ///< Timeout for an EEPROM or RTC command in ms. - -#define ERASE_CALIBRATION_KEY 0xD2C3B4A5 ///< 32-bit key required for clearing calibration data. - // ********** Calibration data defines ********** #define NUM_OF_BYTES_PER_CAL_PAYLOAD 150U ///< Number of bytes per calibration payload. #define CAL_DATA_SEND_INTERVAL_COUNT ( MS_PER_SECOND / ( 5 * TASK_GENERAL_INTERVAL ) ) ///< Calibration data send time interval in counts. @@ -99,19 +96,23 @@ /// DG padding length macro that is calculated with the size of the provided structure. #define RECORD_PADDING_LENGTH(rcrd, buf) (RECORD_BYTE_SIZE(rcrd) % buf == 0 ? 0 : ((U32)(RECORD_BYTE_SIZE(rcrd) / buf) + 1)) * buf +#define RECORD_DEFAULT_TIME 0U ///< Record default time (calibration/set). +#define RECORD_DEFAULT_GAIN 1.0 ///< Record default gain. +#define RECORD_DEFAULT_OFFSET 0.0 ///< Record defautl offset. +#define RECORD_DEFAULT_CONST 0.0 ///< Record default constant. +#define RECORD_DEFAULT_RATIO 1.0 ///< Record default ratio. + /// NVDataMgmt self-test states enumeration. typedef enum NVDataMgmt_Self_Test_States { NVDATAMGMT_SELF_TEST_STATE_START = 0, ///< Self test start. - NVDATAMGMT_SELF_TEST_STATE_ENABLE_EEPROM, ///< Self test enable EERPOM. TODO remove - NVDATAMGMT_SELF_TEST_STATE_READ_BOOTLOADER_FLAG, ///< Self test read bootloader. TODO remove + NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD, ///< Self test read calibration record. + NVDATAMGMT_SELF_TEST_STATE_READ_SYS_RECORD, ///< Self test read system record. + NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD, ///< Self test read service record. + NVDATAMGMT_SELF_TEST_STATE_READ_SCHEDULED_RUNS_RECORD, ///< Self test read scheduled runs record (DG only). NVDATAMGMT_SELF_TEST_STATE_READ_LOG_RECORD, ///< Self test read log record. NVDATAMGMT_SELF_TEST_STATE_READ_TREATMENT_TIME, ///< Self test read treatment time. TODO combine with water consumption NVDATAMGMT_SELF_TEST_STATE_READ_WATER_CONSUMPTION, ///< Self test read water consumption. TODO combine with tx time - NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD, ///< Self test read manufacturing record. TODO modify - NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD, ///< Self test read calibration record. TODO modify - NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD, ///< Self test read service record. TODO modify - NVDATAMGMT_SELF_TEST_STATE_READ_LAST_DISINFECTION_DATE, ///< Self test read last disinfection date. TODO remove NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC, ///< Self test check CRC. NVDATAMGMT_SELF_TEST_STATE_COMPLETE, ///< Self test complete. NUM_OF_NVDATAMGMT_SELF_TEST_STATES ///< Total number of self-test states. @@ -260,22 +261,23 @@ /// DG calibration groups structure typedef struct { - DG_PRES_SENSORS_CAL_RECORD_T presSensorsCalRecord; ///< DG pressure sensors. - DG_FLOW_SENSORS_CAL_RECORD_T flowSensorsCalRecord; ///< DG flow sensors. - DG_LOAD_CELLS_CAL_RECORD_T loadCellsCalRecord; ///< DG load cells. - DG_TEMP_SENSORS_CAL_RECORD_T tempSensorsCalRecord; ///< DG temperature sensors. - DG_COND_SENSORS_CAL_RECORD_T condSensorsCalRecord; ///< DG conductivity sensors. - DG_CONC_PUMPS_CAL_RECORD_T concentratePumps; ///< DG concentrate pumps. - DG_DRAIN_PUMP_CAL_RECORD_T drainPump; ///< DG drain pump. - DG_RO_PUMP_CAL_RECORD_T roPump; ///< DG RO pump. - DG_DRAIN_LINE_VOLUME_T drainLineVolume; ///< DG drain line volume. - DG_PRE_RO_PURGE_VOLUME_T preROPurgeVolume; ///< DG RO purge volume. - DG_RESERVOIR_VOLUME_RECORD_T reservoirVolumes; ///< DG reservoir volumes. - DG_GENERIC_VOLUME_T genericVolume[ 4 ]; ///< DG generic volume (magic number because the value is unknown). - DG_ACID_CONCENTRATES_T acidConcentrates; ///< DG acid concentrates. - DG_BICARB_CONCENTRATES_T bicarbConcentrates; ///< DG bicarb concentrates. - DG_FILTERS_CAL_RECORD_T filters; ///< DG filters. - DG_FANS_CAL_RECORD_T fans; ///< DG fans. + DG_PRES_SENSORS_CAL_RECORD_T presSensorsCalRecord; ///< DG pressure sensors. + DG_FLOW_SENSORS_CAL_RECORD_T flowSensorsCalRecord; ///< DG flow sensors. + DG_LOAD_CELLS_CAL_RECORD_T loadCellsCalRecord; ///< DG load cells. + DG_TEMP_SENSORS_CAL_RECORD_T tempSensorsCalRecord; ///< DG temperature sensors. + DG_COND_SENSORS_CAL_RECORD_T condSensorsCalRecord; ///< DG conductivity sensors. + DG_CONC_PUMPS_CAL_RECORD_T concentratePumps; ///< DG concentrate pumps. + DG_DRAIN_PUMP_CAL_RECORD_T drainPump; ///< DG drain pump. + DG_RO_PUMP_CAL_RECORD_T roPump; ///< DG RO pump. + DG_DRAIN_LINE_VOLUME_T drainLineVolume; ///< DG drain line volume. + DG_PRE_RO_PURGE_VOLUME_T preROPurgeVolume; ///< DG RO purge volume. + DG_RESERVOIR_VOLUME_RECORD_T reservoirVolumes; ///< DG reservoir volumes. + DG_GENERIC_VOLUME_T genericVolume[ 4 ]; ///< DG generic volume (magic number because the value is unknown). + DG_ACID_CONCENTRATES_T acidConcentrates; ///< DG acid concentrates. + DG_BICARB_CONCENTRATES_T bicarbConcentrates; ///< DG bicarb concentrates. + DG_FILTERS_CAL_RECORD_T filters; ///< DG filters. + DG_FANS_CAL_RECORD_T fans; ///< DG fans. + DG_ACCELEROMETER_SENSOR_CAL_RECORD_T accelerometerCalRecord; ///< DG accelerometer sensor. } DG_CALIBRATION_GROUPS_T; /// DG calibration records structure @@ -364,13 +366,13 @@ static DG_CALIBRATION_RECORD_T dgCalibrationRecord; ///< DG calibration record structure (including padding and final CRC). static DG_SYSTEM_GROUP_T dgSystemGroup; ///< DG system group structure (including padding and final CRC). static DG_SERVICE_GROUP_T dgServiceGroup; ///< DG service group structure (including padding and final CRC). -static DG_SCHEDULED_RUNS_GROUP_T dgScheduledRunGroup; ///< DG scheduled run structure (including padding and final CRC). +static DG_SCHEDULED_RUNS_GROUP_T dgScheduledRunsGroup; ///< DG scheduled run structure (including padding and final CRC). // Process records specifications const PROCESS_RECORD_SPECS_T RECORDS_SPECS [ NUM_OF_NVDATMGMT_RECORDS_JOBS ] = { {BANK7_SECTOR0_START_ADDRESS, sizeof(DG_CALIBRATION_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(DG_CALIBRATION_RECORD_T), (U08*)&dgCalibrationRecord, (U08*)&(dgCalibrationRecord.crc)}, // NVDATAMGMT_CALIBRATION_RECORD {SYSTEM_DATA_NV_MEM_START_ADDRESS, sizeof(DG_SYSTEM_GROUP_T), MAX_EEPROM_WRITE_BUFFER_BYTES, sizeof(DG_SYSTEM_GROUP_T), (U08*)&dgSystemGroup, (U08*)&dgSystemGroup.crc}, // NVDATAMGMT_SYSTEM_RECORD {SERVICE_RECORD_START_ADDRESS, sizeof(DG_SERVICE_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&dgServiceGroup, (U08*)&dgServiceGroup.crc}, // NVDATAMGMT_PROCESS_LAST_SERVICE_RECORD - {DG_SCHEDULED_RUNS_START_ADDRESS, sizeof(DG_SCHEDULED_RUNS_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&dgScheduledRunGroup, (U08*)&dgScheduledRunGroup.crc} // NVDATAMGMT_SCHEDULER_RECORD + {DG_SCHEDULED_RUNS_START_ADDRESS, sizeof(DG_SCHEDULED_RUNS_GROUP_T), MAX_RTC_RAM_OPS_BUFFER_BYTES, MAX_RTC_RAM_OPS_BUFFER_BYTES, (U08*)&dgScheduledRunsGroup, (U08*)&dgScheduledRunsGroup.crc} // NVDATAMGMT_SCHEDULER_RECORD }; #endif #ifdef _HD_ @@ -422,25 +424,24 @@ /* * Order of POST: - * Start (check EEPROM is enabled - * Read Calibration - * Read Manufacturing - * Read Service + * Start (check EEPROM is enabled correctly) + * Read calibration + * Read manufacturing + * Read service + * Read scheduled runs for DG * Read Usage Info? (Water consumption, Treatment time) - * Check CRCs + * Check CRCs (Pass/Fail) */ // Private functions static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestEnableEEPROM ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadSystemRecord ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord ( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadScheduledRunsRecord( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadHDTreatmentTime ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadDGWaterConsumption ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord ( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLastDisinfectionDate ( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ); static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState ( void ); @@ -475,9 +476,16 @@ static void enqueueRecordJob( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, RECORD_JOBS_STATE_T job ); static void dequeueRecordJob( void ); static BOOL isRecordQueueEmpty( void ); -static U32 getAvailableRecordQueueCount( void ); +static U32 getAvailableRecordQueueCount( void ); static BOOL enqueueSector0Records( void ); +// Record check helper functions +static BOOL areRecordsValid( void ); +static BOOL isLinearRecordValid( LINEAR_CAL_PAYLOAD_T* record, BOOL isRecordNeeded ); +static BOOL isDGConcPumpRecordValid( DG_CONC_PUMPS_CAL_DATA_T* record, BOOL isRecordNeeded ); +static BOOL isSystemRecordValid( void ); +static BOOL isServiceRecordValid( void ); + /*********************************************************************//** * @brief * The initNVDataMgmt function initializes the module. @@ -602,14 +610,22 @@ nvDataMgmtSelfTestState = handleSelfTestStart(); break; - case NVDATAMGMT_SELF_TEST_STATE_ENABLE_EEPROM: - nvDataMgmtSelfTestState = handleSelfTestEnableEEPROM(); + case NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD: + nvDataMgmtSelfTestState = handleSelfTestReadCalibrationRecord(); break; - case NVDATAMGMT_SELF_TEST_STATE_READ_BOOTLOADER_FLAG: - nvDataMgmtSelfTestState = handleSelfTestReadBootloaderFlag(); + case NVDATAMGMT_SELF_TEST_STATE_READ_SYS_RECORD: + nvDataMgmtSelfTestState = handleSelfTestReadSystemRecord(); break; + case NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD: + nvDataMgmtSelfTestState = handleSelfTestReadServiceRecord(); + break; + + case NVDATAMGMT_SELF_TEST_STATE_READ_SCHEDULED_RUNS_RECORD: + nvDataMgmtSelfTestState = handleSelfTestReadScheduledRunsRecord(); + break; + case NVDATAMGMT_SELF_TEST_STATE_READ_LOG_RECORD: nvDataMgmtSelfTestState = handleSelfTestReadLogRecord(); break; @@ -622,23 +638,6 @@ nvDataMgmtSelfTestState = handleSelfTestReadDGWaterConsumption(); break; - case NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD: - - nvDataMgmtSelfTestState = handleSelfTestReadMfgRecord(); - break; - - case NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD: - nvDataMgmtSelfTestState = handleSelfTestReadCalibrationRecord(); - break; - - case NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD: - nvDataMgmtSelfTestState = handleSelfTestReadServiceRecord(); - break; - - case NVDATAMGMT_SELF_TEST_STATE_READ_LAST_DISINFECTION_DATE: - nvDataMgmtSelfTestState = handleSelfTestReadLastDisinfectionDate(); - break; - case NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC: nvDataMgmtSelfTestState = handleSelfTestCheckCRC(); break; @@ -1198,6 +1197,44 @@ /*********************************************************************//** * @brief + * The getDGROPumpRecord function returns the DG RO pump calibration record. + * @details Inputs: none + * @details Outputs: none + * @return DG RO pump calibration record + *************************************************************************/ +DG_RO_PUMP_CAL_RECORD_T getDGROPumpRecord( void ) +{ + return dgCalibrationRecord.dgCalibrationGroups.roPump; +} + +/*********************************************************************//** + * @brief + * The getDGConcetnratePumpsRecord function returns the DG concentrate + * pumps calibration record. + * @details Inputs: none + * @details Outputs: none + * @return DG concentrate pumps calibration record + *************************************************************************/ +DG_CONC_PUMPS_CAL_RECORD_T getDGConcetnratePumpsRecord( void ) +{ + return dgCalibrationRecord.dgCalibrationGroups.concentratePumps; +} + +/*********************************************************************//** + * @brief + * The getDGDrainPumpRecord function returns the DG drain pump calibration + * record. + * @details Inputs: none + * @details Outputs: none + * @return DG drain pump calibration record + *************************************************************************/ +DG_DRAIN_PUMP_CAL_RECORD_T getDGDrainPumpRecord( void ) +{ + return dgCalibrationRecord.dgCalibrationGroups.drainPump; +} + +/*********************************************************************//** + * @brief * The getDGDrainLineVolumeRecord function returns the DG drain volume * record. * @details Inputs: none @@ -1287,6 +1324,19 @@ /*********************************************************************//** * @brief + * The getDGAccelerometerSensorCalibrationRecord function returns the DG + * accelerometer sensor calibration record. + * @details Inputs: none + * @details Outputs: none + * @return DG accelerometer sensor calibration record + *************************************************************************/ +DG_ACCELEROMETER_SENSOR_CAL_RECORD_T getDGAccelerometerSensorCalibrationRecord( void ) +{ + return dgCalibrationRecord.dgCalibrationGroups.accelerometerCalRecord; +} + +/*********************************************************************//** + * @brief * The getDGSystemRecord function returns the DG systems record. * @details Inputs: none * @details Outputs: none @@ -1318,7 +1368,7 @@ *************************************************************************/ DG_SCHEDULED_RUN_RECORD_T getDGScheduledRunRecord( void ) { - return dgScheduledRunGroup.dgScheduledRun; + return dgScheduledRunsGroup.dgScheduledRun; } #endif @@ -1583,38 +1633,76 @@ *************************************************************************/ static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart ( void ) { - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_ENABLE_EEPROM; + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_START; - Fapi_enableEepromBankSectors( BANK7_SECTOR_0_31_ENABLE_BIT_MASK, - BANK7_SECTOR_32_63_ENABLE_BIT_MASK ); - // Get the time to check for timeout - currentTime = getMSTimerCount(); + if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady ) + { + PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_CALIBRATION_RECORD ]; + U32 startAddress = specs.startAddress; + U08* bufferAddress = specs.structAddressPtr; + U32 maxBufferLength = ( specs.maxReadBufferSize / EEPROM_OPS_SIZE_OF_CONVERTER ); + + Fapi_doMarginRead ( (U32*)startAddress, (U32*)bufferAddress, maxBufferLength, Fapi_NormalRead ); + currentTime = getMSTimerCount(); + state = NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD; + } + return state; } /*********************************************************************//** * @brief - * The handleSelfTestEnableEEPROM waits for EEPROM to return with ready from - * enabling the EEPROM command. + * The handleSelfTestReadCalibrationRecord reads the calibration record + * from EEPROM. * @details Inputs: currentTime * @details Outputs: currentTime * @return next state *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestEnableEEPROM ( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord ( void ) { - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_ENABLE_EEPROM; + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD; BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) { - // Enable was successful, Request a read for bootloader + PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_SYSTEM_RECORD ]; + U32 startAddress = specs.startAddress; + U08* bufferAddress = specs.structAddressPtr; + U32 maxBufferLength = ( specs.maxReadBufferSize / EEPROM_OPS_SIZE_OF_CONVERTER ); + + Fapi_doMarginRead ( (U32*)startAddress, (U32*)bufferAddress, maxBufferLength, Fapi_NormalRead ); + currentTime = getMSTimerCount(); + state = NVDATAMGMT_SELF_TEST_STATE_READ_SYS_RECORD; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleSelfTestReadSystemRecord reads the system record from EEPROM. + * @details Inputs: currentTime, calibrationRecord + * @details Outputs: currentTime + * @return next state + *************************************************************************/ +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadSystemRecord ( void ) +{ + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_SYS_RECORD; + BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + + if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) + { if ( getRTCRAMState() == RTC_RAM_STATE_READY ) { - //readFromRAM( BOOTLOADER_FLAG_ADDRESS, BOOTLOADER_FLAG_LENGTH_BYTES ); - // Get the time to check for timeout + PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_SERVICE_RECORD ]; + U32 startAddress = specs.startAddress; + U32 maxBufferLength = specs.maxReadBufferSize; + currentTime = getMSTimerCount(); - state = NVDATAMGMT_SELF_TEST_STATE_READ_BOOTLOADER_FLAG; + readFromRAM( startAddress, maxBufferLength ); + + state = NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD; } } @@ -1623,45 +1711,76 @@ /*********************************************************************//** * @brief - * The handleSelfTestReadBootloaderFlag reads the bootloader flag - * from RTC RAM. - * @details Inputs: currentTime, bootloaderFlag + * The handleSelfTestReadServiceRecord reads the service record from RTC + * RAM. + * @details Inputs: currentTime, serviceRecord * @details Outputs: currentTime * @return next state *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag ( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord ( void ) { - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_BOOTLOADER_FLAG; + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD; BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_RTC_RAM_OPS_ERROR, (U08*)&state ); - // If the read for bootloader is done, read it if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE || timeoutStatus == TRUE ) { - //getDataFromRAM( (U08*)&bootloaderFlag, BOOTLOADER_FLAG_LENGTH_BYTES ); -// If the device is HD, read treatment time, -// If the device is DG, read water consumption -#ifdef _HD_ + PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_SERVICE_RECORD ]; + U08* bufferAddress = specs.structAddressPtr; + U32 maxBufferLength = specs.maxReadBufferSize; + + getDataFromRAM( bufferAddress, maxBufferLength ); + +#ifdef _DG_ + if ( getRTCRAMState() == RTC_RAM_STATE_READY ) { - readFromRAM ( HD_TREATMENT_TIME_ADDRESS, sizeof(TREATMENT_TIME_RECORD_T) ); + PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_SCHEDULED_RUNS_RECORD ]; + U32 startAddress = specs.startAddress; + U32 maxBufferLength = specs.maxReadBufferSize; + currentTime = getMSTimerCount(); - state = NVDATAMGMT_SELF_TEST_STATE_READ_TREATMENT_TIME; + readFromRAM( startAddress, maxBufferLength ); + + state = NVDATAMGMT_SELF_TEST_STATE_READ_SCHEDULED_RUNS_RECORD; } -#else - if ( getRTCRAMState() == RTC_RAM_STATE_READY ) - { - readFromRAM ( DG_CONSUMED_WATER_ADDRESS, sizeof(WATER_CONSUMPTION_RECORD_T) ); - currentTime = getMSTimerCount(); - state = NVDATAMGMT_SELF_TEST_STATE_READ_WATER_CONSUMPTION; - } #endif +#ifdef _HD_ + state = NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC; +#endif } return state; } /*********************************************************************//** * @brief + * The handleSelfTestReadScheduledRunsRecord reads the scheduled runs + * from RTC RAM (only DG for now). + * @details Inputs: currentTime, serviceRecord + * @details Outputs: currentTime + * @return next state + *************************************************************************/ +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadScheduledRunsRecord( void ) +{ + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_SCHEDULED_RUNS_RECORD; + BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_RTC_RAM_OPS_ERROR, (U08*)&state ); + + if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE || timeoutStatus == TRUE ) + { + PROCESS_RECORD_SPECS_T specs = RECORDS_SPECS [ NVDATAMGMT_SCHEDULED_RUNS_RECORD ]; + U08* bufferAddress = specs.structAddressPtr; + U32 maxBufferLength = specs.maxReadBufferSize; + + getDataFromRAM( bufferAddress, maxBufferLength ); + + state = NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleSelfTestReadHDTreatmentTime reads the HD treatment time * from RTC RAM. * @details Inputs: currentTime, treatmentTimeRecord @@ -1740,217 +1859,211 @@ currentTime = getMSTimerCount(); // Get ready for reading the manufacturing record //Fapi_doMarginRead( (U32*)BANK7_SECTOR0_START_ADDRESS, addr, len, Fapi_NormalRead ); - state = NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD; + state = NVDATAMGMT_SELF_TEST_STATE_READ_SYS_RECORD; } return state; } /*********************************************************************//** * @brief - * The handleSelfTestReadMfgRecords reads the manufacturing record from - * EEPROM. - * @details Inputs: currentTime, calibrationRecord - * @details Outputs: currentTime + * The handleSelfTestCheckCRC calculates the CRC of the records and compares + * them to the CRC that was read. If they don't match, it will fail POST. + * @details Inputs: treatmentTimeRecord, waterConsumptionRecord, lastDisinfectionRecord, + * logRecord, mfgRecord, calibrationRecord, calibrationRecord, serviceRecord, + * NVDataMgmtSelfTestResult + * @details Outputs: nvDataMgmtSelfTestResult * @return next state *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord ( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ) { - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + U32 i; + LINEAR_CAL_PAYLOAD_T* record; + NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_COMPLETE; + BOOL isRecordValid = TRUE; - // Wait for the read from EEPROM to be successful - if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) + // Check the integrity of the records as a whole. Check the upper layer CRC + BOOL haveRecordsPassed = areRecordsValid(); + +#ifdef _DG_ + // Get the calibration record of the hardware (i.e. pressure sensor) + DG_PRES_SENSORS_CAL_RECORD_T* pressure = &dgCalibrationRecord.dgCalibrationGroups.presSensorsCalRecord; + // The ones that are an array, are looped through + for ( i = 0; i < NUM_OF_CAL_DATA_PRES_SENSORS; i++ ) { - currentTime = getMSTimerCount(); - // Send the read command for calibration record - //Fapi_doMarginRead ( (U32*)CALIBRATION_RECORD_START_ADDRESS, (U32*)&calibrationRecord, - //sizeof(CALIBRATION_RECORD_T) / sizeof(U32), Fapi_NormalRead ); - state = NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD; + // Get calibration payload and assign it to a pointer + record = (LINEAR_CAL_PAYLOAD_T*)&pressure->pressureSensors[ i ]; + // Check in the validity of the calibration data + isRecordValid = isLinearRecordValid( record, TRUE ); } - return state; -} + DG_FLOW_SENSORS_CAL_RECORD_T* flow = &dgCalibrationRecord.dgCalibrationGroups.flowSensorsCalRecord; + record = (LINEAR_CAL_PAYLOAD_T*)&flow->flowSensors[ CAL_DATA_RO_PUMP_FLOW_SENSOR ]; + isRecordValid = isLinearRecordValid( record, FALSE ); -/*********************************************************************//** - * @brief - * The handleSelfTestReadCalibrationRecord reads the calibration record - * from EEPROM. - * @details Inputs: currentTime - * @details Outputs: currentTime - * @return next state - *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadCalibrationRecord ( void ) -{ - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + DG_LOAD_CELLS_CAL_RECORD_T* load = &dgCalibrationRecord.dgCalibrationGroups.loadCellsCalRecord; + for ( i = 0; i < NUM_OF_CAL_DATA_LOAD_CELLS; i++ ) + { + record = (LINEAR_CAL_PAYLOAD_T*)&load->loadCells[ i ]; + isRecordValid = isLinearRecordValid( record, TRUE ); + } - // If the EEPROM read was successful, request a read from RAM to - // Read the service record - if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) + DG_TEMP_SENSORS_CAL_RECORD_T* temperature = &dgCalibrationRecord.dgCalibrationGroups.tempSensorsCalRecord; + for ( i = 0; i < NUM_OF_CAL_DATA_TEMP_SENSORS; i++ ) { - if ( getRTCRAMState() == RTC_RAM_STATE_READY ) - { - currentTime = getMSTimerCount(); - //readFromRAM( SERVICE_DATE_START_ADDRESS, sizeof(SERVICE_RECORD_T) ); - state = NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD; - } + record = (LINEAR_CAL_PAYLOAD_T*)&temperature->tempSensors[ i ]; + isRecordValid = isLinearRecordValid( record, FALSE ); } - return state; -} + DG_COND_SENSORS_CAL_RECORD_T* cond = &dgCalibrationRecord.dgCalibrationGroups.condSensorsCalRecord; + for ( i = 0; i < NUM_OF_CAL_DATA_COND_SENSORS; i++ ) + { + record = (LINEAR_CAL_PAYLOAD_T*)&cond->condSensors[ i ]; + isRecordValid = isLinearRecordValid( record, FALSE ); + } -/*********************************************************************//** - * @brief - * The handleSelfTestReadServiceRecord reads the service dates from RTC - * RAM. - * @details Inputs: currentTime, serviceRecord - * @details Outputs: currentTime - * @return next state - *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadServiceRecord ( void ) -{ - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_RTC_RAM_OPS_ERROR, (U08*)&state ); - - if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE || timeoutStatus == TRUE ) + DG_CONC_PUMPS_CAL_RECORD_T* concPump = &dgCalibrationRecord.dgCalibrationGroups.concentratePumps; + for ( i = 0; i < NUM_OF_CAL_DATA_DG_CONC_PUMPS; i++ ) { - //getDataFromRAM ( (U08*)&serviceRecord, sizeof(SERVICE_RECORD_T) ); - if ( getRTCRAMState() == RTC_RAM_STATE_READY ) - { - currentTime = getMSTimerCount(); - //readFromRAM( LAST_DISINFECTION_DATE_ADDRESS, sizeof(LAST_DISINFECTION_RECORD_T) ); - state = NVDATAMGMT_SELF_TEST_STATE_READ_LAST_DISINFECTION_DATE; - } + isRecordValid = isDGConcPumpRecordValid( &concPump->concentratePumps[ i ], FALSE ); } - return state; -} + DG_DRAIN_PUMP_CAL_RECORD_T* drainPump = &dgCalibrationRecord.dgCalibrationGroups.drainPump; + isRecordValid = isDGDrainPumpRecordValid( drainPump, FALSE ); -/*********************************************************************//** - * @brief - * The handleSelfTestReadLastDisinfectionDate reads the last disinfection date - * from RTC RAM. - * @details Inputs: lastDisinfectionRecord - * @details Outputs: none - * @return next state - *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLastDisinfectionDate ( void ) -{ - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_LAST_DISINFECTION_DATE; - BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_RTC_RAM_OPS_ERROR, (U08*)&state ); + DG_RO_PUMP_CAL_RECORD_T* roPump = &dgCalibrationRecord.dgCalibrationGroups.roPump; + isRecordValid = isDGROPumpRecordValid( roPump, FALSE ); - if ( getRTCRAMStatus() == RTC_RAM_STATUS_IDLE || timeoutStatus == TRUE ) + DG_DRAIN_LINE_VOLUME_T* drainLineVol = &dgCalibrationRecord.dgCalibrationGroups.drainLineVolume; + isRecordValid = isDGDrainLineVolRecordValid( drainLineVol, FALSE ); + + DG_RESERVOIR_VOLUME_RECORD_T* reservoirVol = &dgCalibrationRecord.dgCalibrationGroups.reservoirVolumes; + for ( i = 0; i < NUM_OF_CAL_DATA_RSRVRS; i++ ) { - //getDataFromRAM ( (U08*)&lastDisinfectionRecord, sizeof(LAST_DISINFECTION_RECORD_T) ); - state = NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC; + isRecordValid = isDGReservoirVolRecordValid( reservoirVol->reservoir[ i ], FALSE ); } - return state; - -} - -/*********************************************************************//** - * @brief - * The handleSelfTestCheckCRC calculates the CRC of the records and compares - * them to the CRC that was read. If they don't match, it will fail POST. - * @details Inputs: treatmentTimeRecord, waterConsumptionRecord, lastDisinfectionRecord, - * logRecord, mfgRecord, calibrationRecord, calibrationRecord, serviceRecord, - * NVDataMgmtSelfTestResult - * @details Outputs: NVDataMgmtSelfTestResult, alarm if any of the CRC checks failed - * @return next state - *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ) -{ - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_COMPLETE; - BOOL hasCRCPassed = TRUE; - U16 calcCRC; - U16 recordCRC; -#ifdef _HD_ - calcCRC = crc16 ( (U08*)&treatmentTimeRecord.treatmentTime, sizeof(U32) ); - recordCRC = treatmentTimeRecord.crc; -#ifndef LIMITED_NVDATA_CRC_CHECKS - if ( calcCRC != recordCRC ) + DG_GENERIC_VOLUME_T* genericVol = &dgCalibrationRecord.dgCalibrationGroups.genericVolume; + for ( i = 0; i < 4; i++ ) { - hasCRCPassed = FALSE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR, recordCRC, calcCRC ); + isRecordValid = isDGGenericVolRecordValid( genericVol[ i ], FALSE ); } -#endif -#else - calcCRC = crc16 ( (U08*)&waterConsumptionRecord.waterConsumption, sizeof(U32) ); - recordCRC = waterConsumptionRecord.crc; - if ( calcCRC != recordCRC ) + + DG_ACID_CONCENTRATES_T* acidConc = &dgCalibrationRecord.dgCalibrationGroups.acidConcentrates; + for ( i = 0; i < NUM_OF_CAL_DATA_ACID_CONCENTRATES; i++ ) { - hasCRCPassed = FALSE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR, recordCRC, calcCRC ); + isRecordValid = isDGAcidConcentrateRecordValid( acidConc[ i ], TRUE ); } - // Check the CRC for last disinfection date - //calcCRC = crc16 ( (U08*)&lastDisinfectionRecord.date.disinfectionDate, sizeof(DISINFECTION_DATE_T) ); - //recordCRC = lastDisinfectionRecord.crc; - if ( calcCRC != recordCRC ) + + DG_BICARB_CONCENTRATES_T* bicarbConc = &dgCalibrationRecord.dgCalibrationGroups.bicarbConcentrates; + for ( i = 0; i < NUM_OF_CAL_DATA_BICARB_CONCENTRATES; i++ ) { - hasCRCPassed = FALSE; - SET_ALARM_WITH_2_U32_DATA( AlARM_ID_NVDATA_DISINFECTION_DATE_CRC_ERROR, recordCRC, calcCRC ); + isRecordValid = isDGBicarbConcentrateRecordValid( bicarbConc, TRUE ); } + + DG_FILTER_CAL_RECORD_T* roFilter = &dgCalibrationRecord.dgCalibrationGroups.filters.roFilter; + isRecordValid = isDGFilterRecordValid( roFilter, FALSE ); + + DG_FILTER_CAL_RECORD_T* ultraFilter = &dgCalibrationRecord.dgCalibrationGroups.filters.ultraFilter; + isRecordValid = isDGFilterRecordValid( ultraFilter, FALSE ); + + DG_FILTER_CAL_RECORD_T* sedimentFilter = &dgCalibrationRecord.dgCalibrationGroups.filters.sedimentFilter; + isRecordValid = isDGFilterRecordValid( sedimentFilter, FALSE ); + + DG_FILTER_CAL_RECORD_T* carbonFilter = &dgCalibrationRecord.dgCalibrationGroups.filters.carbonFilter; + isRecordValid = isDGFilterRecordValid( carbonFilter, FALSE ); + + DG_FILTER_CAL_RECORD_T* carbonPolishFilter = &dgCalibrationRecord.dgCalibrationGroups.filters.carbonPolishFilter; + isRecordValid = isDGFilterRecordValid( carbonPolishFilter, FALSE ); + + DG_FANS_CAL_RECORD_T* fan1 = &dgCalibrationRecord.dgCalibrationGroups.fans.fan1; + isRecordValid = isDGFanRecordValid( fan1, FALSE ); + + DG_FANS_CAL_RECORD_T* fan2 = &dgCalibrationRecord.dgCalibrationGroups.fans.fan2; + isRecordValid = isDGFanRecordValid( fan2, FALSE ); + + DG_ACCELEROMETER_SENSOR_CAL_RECORD_T* accelerometer = &dgCalibrationRecord.dgCalibrationGroups.accelerometerCalRecord; + isRecordValid = isDGAccelerometerSensorRecordValid( accelerometer, FALSE ); #endif -#ifndef LIMITED_NVDATA_CRC_CHECKS - // Check log header record - calcCRC = crc16 ( (U08*)&logRecord.logHeader, sizeof(LOG_HEADER_T) ); - recordCRC = logRecord.crc; - if ( calcCRC != recordCRC ) + + + /*DG_DRAIN_LINE_VOLUME_T drainLineVolume; ///< DG drain line volume. + DG_PRE_RO_PURGE_VOLUME_T preROPurgeVolume; ///< DG RO purge volume. + DG_RESERVOIR_VOLUME_RECORD_T reservoirVolumes; ///< DG reservoir volumes. + DG_GENERIC_VOLUME_T genericVolume[ 4 ]; ///< DG generic volume (magic number because the value is unknown). + DG_ACID_CONCENTRATES_T acidConcentrates; ///< DG acid concentrates. + DG_BICARB_CONCENTRATES_T bicarbConcentrates; ///< DG bicarb concentrates. + DG_FILTERS_CAL_RECORD_T filters; ///< DG filters. + DG_FANS_CAL_RECORD_T fans; ///< DG fans. + DG_ACCELEROMETER_SENSOR_CAL_RECORD_T + + static BOOL isDGDrainPumpRecordValid( DG_DRAIN_PUMP_CAL_RECORD_T* record, BOOL isRecordNeeded ); + static BOOL isDGROPumpRecordValid( DG_RO_PUMP_CAL_RECORD_T* record, BOOL isRecordNeeded ) + static BOOL isDGDrainLineVolRecordValid( DG_DRAIN_LINE_VOLUME_T* record, BOOL isRecordNeeded ); + static BOOL isDGReservoirVolRecordValid( DG_RESERVOIR_VOLUME_RECORD_T* record, BOOL isRecordNeeded ); + static BOOL isDGGenericVolRecordValid( DG_GENERIC_VOLUME_T* record, BOOL isRecordNeeded ); + static BOOL isDGAcidConcentrateRecordValid( DG_ACID_CONCENTRATES_T* record, BOOL isRecordNeeded ); + static BOOL isDGBicarbConcentrateRecordValid( DG_BICARB_CONCENTRATES_T* record, BOOL isRecordNeeded ); + static BOOL isDGFilterRecordValid( DG_FILTERS_CAL_RECORD_T* record, BOOL isRecordNeeded ); + static BOOL isDGFanRecordValid( DG_FANS_CAL_RECORD_T* record, BOOL isRecordNeeded ); + static BOOL isDGAccelerometerSensorRecordValid( DG_ACCELEROMETER_SENSOR_CAL_RECORD_T* record, BOOL isRecordNeeded );*/ + + + // 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 == isRecordValid ) { - hasCRCPassed = FALSE; - // CRC for the log record has failed. The flag will be set to true - // The log header will be set to full by having the record count be at - // maximum number of counts (1536 in this case) and the read index be a 0 - // of the beginning of the log sectors - logRecord.logHeader.recordCount = MAX_NUM_OF_EVENTS_IN_SECTOR3; - logRecord.logHeader.nextReadIndex = 0; - logRecord.logHeader.nextReadIndex = 0; - logRecord.logHeader.isHdrCorrupted = TRUE; + enqueueSector0Records(); } - // Check CRC for manufacturing record - //calcCRC = crc16 ( (U08*)&mfgRecord.mfgData, sizeof(MFG_DATA_T) ); - //recordCRC = mfgRecord.crc; - if ( calcCRC != recordCRC ) + + // Check if the records' entire CRCs as well as the individual CRCs passed + if ( isRecordValid && haveRecordsPassed ) { - hasCRCPassed = FALSE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR, recordCRC, calcCRC ); + nvDataMgmtSelfTestResult = SELF_TEST_STATUS_PASSED; } -#endif - // Check CRC for calibration record - //calcCRC = crc16( (U08*)&calibrationRecord.calData, sizeof(CALIBRATION_DATA_T) ); - recordCRC = 0;//calibrationRecord.crc; - if ( calcCRC != recordCRC ) - { - hasCRCPassed = FALSE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR, recordCRC, calcCRC ); - } else { - //calRecordIsValid = TRUE; + nvDataMgmtSelfTestResult = SELF_TEST_STATUS_FAILED; } -#ifndef LIMITED_NVDATA_CRC_CHECKS - // Check CRC for service record - //calcCRC = crc16 ( (U08*)&serviceRecord.serviceData, sizeof(SERVICE_DATA_T) ); - //recordCRC = serviceRecord.crc; + + return state; +} + + + +static BOOL isDGConcPumpRecordValid( DG_CONC_PUMPS_CAL_DATA_T* record, BOOL isRecordNeeded ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16 ( (U08*)record, sizeof(DG_CONC_PUMPS_CAL_DATA_T) - sizeof(U16) ); + U16 recordCRC = record->crc; + if ( calcCRC != recordCRC ) { - hasCRCPassed = FALSE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR, recordCRC, calcCRC ); + // CRC did not pass so set all values to default + record->stepSpeed2FlowRatio = RECORD_DEFAULT_RATIO; + record->calibrationTime = RECORD_DEFAULT_TIME; + record->crc = crc16 ( (U08*)record, sizeof(DG_CONC_PUMPS_CAL_DATA_T) - sizeof(U16) ); + + // Alarm if the CRC did not pass + activateAlarmNoData( ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_CRC_INVALID ); + + // Set the to FALSE since the record is not valid + status = FALSE; } -#endif - // There should be no failed CRCs and no command should timeout for the self-test to pass - if ( hasCRCPassed && !hasCommandTimedout ) + + // Check if the record is needed. If it is needed, it should have a valid + // calibration time associated with it. + if ( TRUE == isRecordNeeded ) { - nvDataMgmtSelfTestResult = SELF_TEST_STATUS_PASSED; + // Check if the calibration time of the record is the default value + if ( record->calibrationTime == RECORD_DEFAULT_TIME ) + { + activateAlarmNoData( ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_TIME_INVALID ); + } } - else - { - nvDataMgmtSelfTestResult = SELF_TEST_STATUS_FAILED; - } - return state; + return status; } /*********************************************************************//** @@ -2769,6 +2882,97 @@ /*********************************************************************//** * @brief + * The areRecordsValid function checks whether the records are still valid + * by calculating the CRCs and comparing it to the strucutre's CRC. + * @details Inputs: none + * @details Outputs: none + * @return TRUE if the records' data is valid otherwise FALSE + *************************************************************************/ +static BOOL areRecordsValid( void ) +{ + U32 i; + U16 calcCRC; + U16 recordCRC; + PROCESS_RECORD_SPECS_T spec; + BOOL status = TRUE; + + for ( i = 0; i < NUM_OF_NVDATMGMT_RECORDS_JOBS; i++ ) + { + spec = RECORDS_SPECS [ i ]; + calcCRC = crc16 ( spec.structAddressPtr, spec.sizeofJob - sizeof(U16) ); + recordCRC = *(U16*)spec.structCRCPtr; + + // If the CRCs do not match, break out of loop since POST will be failed + // regardless of the rest of the results + if ( calcCRC != recordCRC ) + { + //SET_ALARM_WITH_1_U32_DATA( ALARM_ID_NVDATAMGMT_GROUP_RECORD_CRC_INVALID, i ); + status = FALSE; + } + } + + return status; +} + +/*********************************************************************//** + * @brief + * The isLinearRecordValid function check whether the records are still valid + * by calculating the CRCs and comparing it to the strucutre's CRC. + * @details Inputs: none + * @details Outputs: none + * @param record: pointer to a linear calibration payload. The actual calibration + * data to be checked + * @param isRecordNeeded: TRUE is the calibration record is need in the firmware + * right now otherwise, FALSE + * @return TRUE if the records' data is valid otherwise FALSE + *************************************************************************/ +static BOOL isLinearRecordValid( LINEAR_CAL_PAYLOAD_T* record, BOOL isRecordNeeded ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16 ( (U08*)record, sizeof(LINEAR_CAL_PAYLOAD_T) - sizeof(U16) ); + U16 recordCRC = record->crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + record->gain = RECORD_DEFAULT_GAIN; + record->offset = RECORD_DEFAULT_OFFSET; + record->calibrationTime = RECORD_DEFAULT_TIME; + // Recalculate the CRC with the default values + record->crc = crc16 ( (U08*)record, sizeof(LINEAR_CAL_PAYLOAD_T) - sizeof(U16) ); + + // Alarm if the CRC did not pass + activateAlarmNoData( ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_CRC_INVALID ); + + // Set the to FALSE since the record is not valid + status = FALSE; + } + + // Check if the record is needed. If it is needed, it should have a valid + // calibration time associated with it. + if ( TRUE == isRecordNeeded ) + { + // Check if the calibration time of the record is the default value + if ( record->calibrationTime == RECORD_DEFAULT_TIME ) + { + activateAlarmNoData( ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_TIME_INVALID ); + } + } + + return status; +} + +static BOOL isSystemRecordValid( void ) +{ + +} +static BOOL isServiceRecordValid( void ) +{ + +} + +/*********************************************************************//** + * @brief * The dequeue increments the front index counter and if it is equal to * rear index, it sets it to -1, meaning that the queue is empty. * @details Inputs: queueFrontIndex, queueCount Index: NVDataMgmt.h =================================================================== diff -u -rab745156d182ac1ee04a98aa2b2af0f30c8894e6 -rc1881f60c442c55ec04b54b8ee9000d2ac9dca8d --- NVDataMgmt.h (.../NVDataMgmt.h) (revision ab745156d182ac1ee04a98aa2b2af0f30c8894e6) +++ NVDataMgmt.h (.../NVDataMgmt.h) (revision c1881f60c442c55ec04b54b8ee9000d2ac9dca8d) @@ -104,23 +104,25 @@ BOOL setScheduledRunsRecord( U32 currentMessage, U32 totalMessages, U32 length, U08 *addressPtr ); #ifdef _DG_ -DG_PRES_SENSORS_CAL_RECORD_T getDGPressureSensorsCalibrationRecord( void ); -DG_FLOW_SENSORS_CAL_RECORD_T getDGFlowSensorsCalibrationRecord( void ); -DG_LOAD_CELLS_CAL_RECORD_T getDGLoadCellsCalibrationRecord( void ); -DG_TEMP_SENSORS_CAL_RECORD_T getDGTemperatureSensorsCalibrationRecord( void ); -DG_COND_SENSORS_CAL_RECORD_T getDGConducitivitySensorsCalibrationRecord( void ); -DG_DRAIN_LINE_VOLUME_T getDGDrainLineVolumeRecord( void ); -DG_PRE_RO_PURGE_VOLUME_T getDGPreROPurgeVolumeRecord( void ); -DG_RESERVOIR_VOLUME_RECORD_T getDGReservoirsVolumeRecord( void ); -DG_ACID_CONCENTRATES_T getDGAcidConcentratesRecord( void ); -DG_BICARB_CONCENTRATES_T getDGBicarbConcentratesRecord( void ); -DG_FILTERS_CAL_RECORD_T getDGFiltersRecord( void ); -DG_FANS_CAL_RECORD_T getDGFansRecord( void ); -DG_SYSTEM_RECORD_T getDGSystemRecord( void ); -DG_SERVICE_RECORD_T getDGServiceRecord( void ); -DG_SCHEDULED_RUN_RECORD_T getDGScheduledRunRecord( void ); -DG_RO_PUMP_CAL_RECORD_T getDGROPumpRecord( void ); -DG_DRAIN_PUMP_CAL_RECORD_T getDGDrainPumpRecord( void ); +DG_PRES_SENSORS_CAL_RECORD_T getDGPressureSensorsCalibrationRecord( void ); +DG_FLOW_SENSORS_CAL_RECORD_T getDGFlowSensorsCalibrationRecord( void ); +DG_LOAD_CELLS_CAL_RECORD_T getDGLoadCellsCalibrationRecord( void ); +DG_TEMP_SENSORS_CAL_RECORD_T getDGTemperatureSensorsCalibrationRecord( void ); +DG_COND_SENSORS_CAL_RECORD_T getDGConducitivitySensorsCalibrationRecord( void ); +DG_RO_PUMP_CAL_RECORD_T getDGROPumpRecord( void ); +DG_CONC_PUMPS_CAL_RECORD_T getDGConcetnratePumpsRecord( void ); +DG_DRAIN_PUMP_CAL_RECORD_T getDGDrainPumpRecord( void ); +DG_DRAIN_LINE_VOLUME_T getDGDrainLineVolumeRecord( void ); +DG_PRE_RO_PURGE_VOLUME_T getDGPreROPurgeVolumeRecord( void ); +DG_RESERVOIR_VOLUME_RECORD_T getDGReservoirsVolumeRecord( void ); +DG_ACID_CONCENTRATES_T getDGAcidConcentratesRecord( void ); +DG_BICARB_CONCENTRATES_T getDGBicarbConcentratesRecord( void ); +DG_FILTERS_CAL_RECORD_T getDGFiltersRecord( void ); +DG_FANS_CAL_RECORD_T getDGFansRecord( void ); +DG_ACCELEROMETER_SENSOR_CAL_RECORD_T getDGAccelerometerSensorCalibrationRecord( void ); +DG_SYSTEM_RECORD_T getDGSystemRecord( void ); +DG_SERVICE_RECORD_T getDGServiceRecord( void ); +DG_SCHEDULED_RUN_RECORD_T getDGScheduledRunRecord( void ); #endif #ifdef _HD_ HD_PUMPS_CAL_RECORD_T getHDPumpsCalibrationRecord( void ); Index: NVDataMgmtDGRecords.h =================================================================== diff -u -rd4aea540d447203cfd9aca91281d1dc9e9e9bc1d -rc1881f60c442c55ec04b54b8ee9000d2ac9dca8d --- NVDataMgmtDGRecords.h (.../NVDataMgmtDGRecords.h) (revision d4aea540d447203cfd9aca91281d1dc9e9e9bc1d) +++ NVDataMgmtDGRecords.h (.../NVDataMgmtDGRecords.h) (revision c1881f60c442c55ec04b54b8ee9000d2ac9dca8d) @@ -96,7 +96,7 @@ { CAL_DATA_CONC_PUMP_CP1 = 0, ///< Concentrate pump 1. CAL_DATA_CONC_PUMP_CP2, ///< Concentrate pump 2. - NUM_OF_CAL_DATA_DG_PUMPS ///< Number of DG pump. + NUM_OF_CAL_DATA_DG_CONC_PUMPS ///< Number of DG concentrate pumps. } CAL_DATA_DG_PUMPS_T; /// DG reservoirs enumeration. @@ -159,7 +159,7 @@ /// DG concentrate pumps calibration record typedef struct { - DG_CONC_PUMPS_CAL_DATA_T concentratePumps[ NUM_OF_CAL_DATA_DG_PUMPS ]; ///< DG concentrate pumps calibration data. + DG_CONC_PUMPS_CAL_DATA_T concentratePumps[ NUM_OF_CAL_DATA_DG_CONC_PUMPS ]; ///< DG concentrate pumps calibration data. } DG_CONC_PUMPS_CAL_RECORD_T; /// DG drain pump two-gain payload @@ -333,6 +333,16 @@ DG_FAN_CAL_RECORD_T fan2; ///< Fan 2. } DG_FANS_CAL_RECORD_T; +/// HD accelerometer sensor calibration record +typedef struct +{ + F32 accelXOffset; ///< DG accelerometer X axis offset. + F32 accelYOffset; ///< DG accelerometer Y axis offset. + F32 accelZOffset; ///< DG accelerometer Z axis offset. + U32 calibrationTime; ///< Calibration time. + U16 crc; ///< CRC for the DG accelerometer sensor. +} DG_ACCELEROMETER_SENSOR_CAL_RECORD_T; + /// DG systems record structure typedef struct {