Index: NVDataMgmt.c =================================================================== diff -u -r4028a21bd9b05a212f4bb33db6631cd6012ff170 -r32d19410fc08e86e4503f6e8af5470170bb72cdf --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 4028a21bd9b05a212f4bb33db6631cd6012ff170) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 32d19410fc08e86e4503f6e8af5470170bb72cdf) @@ -62,6 +62,7 @@ #define BANK7_SECTOR3_END_ADDRESS 0xF020FFFF ///< Bank7 sector 3 end address. #define MAX_EEPROM_WRITE_BUFFER_BYTES 16U ///< Max allowed bytes for an EEPROM write (16 bytes). +#define MAX_RTC_RAM_OPS_BUFFER_BYTES 64U ///< Max target RTC RAM operations (read/write) bytes. #define MAX_JOB_DATA_SIZE_BYTES 32U ///< Max bytes per job (32 bytes). #define LOG_DATA_START_INDEX 0U ///< Log data start index. @@ -78,10 +79,11 @@ #define LOG_RECORD_START_ADDRESS 0x00000010 // 16 ///< Log record start address in RTC RAM (16). #define HD_TREATMENT_TIME_ADDRESS 0X00000030 // 48 ///< HD treatment time start address in RTC RAM (48). #define DG_CONSUMED_WATER_ADDRESS 0X00000040 // 64 ///< DG water consumption start address in RTC RAM (64). -#define SERVICE_DATE_START_ADDRESS 0X00000050 // 80 //TODO remove ///< Service date record start address in RTC RAM (80). +#define LAST_SERVICE_RECORD_START_ADDRESS 0X00000050 // 80 ///< Last service date record start address in RTC RAM (HD/DG) (80). #define LAST_DISINFECTION_DATE_ADDRESS 0x00000060 // 96 //TODO remove ///< Last disinfection date start address in RTC RAM (96). -#define DG_SCHEDULER_ADDRESS 0x00000070 // 112 ///< DG scheduler dates start address (112). +#define DG_SCHEDULER_RECORD_START_ADDRESS 0x00000070 // 112 ///< DG scheduler record start address in RTC RAM (112). + // Data addresses in EEPROM #define CALIBRATION_RECORD_START_ADDRESS ( BANK7_SECTOR0_START_ADDRESS + sizeof(MFG_RECORD_T) ) ///< Calibration record start address in EEPROM. @@ -97,24 +99,30 @@ #define CAL_DATA_MAX_MESSAGE_DFFIRENCE 1 ///< Calibration data receive message different from the previous message. #define CAL_DATA_FIRST_RECEIVING_MSG_NUM 1 ///< Calibration data first receiving message number. #define SYSTEM_DATA_NV_MEM_START_ADDRESS BANK7_SECTOR0_START_ADDRESS + 2048 ///< System record storage start address in NV memory. +#define DG_CAL_STRUCTS_SIZE ( sizeof(DG_PRES_SENSORS_CAL_RECORD_T) + sizeof(DG_FLOW_SENSORS_CAL_RECORD_T) + \ + sizeof(DG_LOAD_CELLS_CAL_RECORD_T) + sizeof(DG_TEMP_SENSORS_CAL_RECORD_T) + \ + sizeof(DG_COND_SENSORS_CAL_RECORD_T) + sizeof(U16) ) ///< DG calibration data structure size (without padding). +// Padding length calculation: (DG struct size % bytes to write(16) == 0 ? 0 : (DG struct size / bytes to write(16)) + 1) * bytes to write(16) +#define DG_PADDING_LENGTH ( ( DG_CAL_STRUCTS_SIZE % MAX_EEPROM_WRITE_BUFFER_BYTES == 0 ? \ + 0 : ((U32)(DG_CAL_STRUCTS_SIZE / MAX_EEPROM_WRITE_BUFFER_BYTES)) + 1 ) * \ + MAX_EEPROM_WRITE_BUFFER_BYTES ) ///< DG padding length that is calculated with the size of the cal structures. - /// 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 - NVDATAMGMT_SELF_TEST_STATE_READ_BOOTLOADER_FLAG, ///< Self test read bootloader - NVDATAMGMT_SELF_TEST_STATE_READ_LOG_RECORD, ///< Self test read log record - NVDATAMGMT_SELF_TEST_STATE_READ_TREATMENT_TIME, ///< Self test read treatment time - NVDATAMGMT_SELF_TEST_STATE_READ_WATER_CONSUMPTION, ///< Self test read water consumption - NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD, ///< Self test read manufacturing record - NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD, ///< Self test read calibration record - NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD, ///< Self test read service record - NVDATAMGMT_SELF_TEST_STATE_READ_LAST_DISINFECTION_DATE, ///< Self test read last disinfection date - 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 + NVDATAMGMT_SELF_TEST_STATE_START = 0, ///< Self test start. + NVDATAMGMT_SELF_TEST_STATE_ENABLE_EEPROM, ///< Self test enable EERPOM. + NVDATAMGMT_SELF_TEST_STATE_READ_BOOTLOADER_FLAG, ///< Self test read bootloader. + NVDATAMGMT_SELF_TEST_STATE_READ_LOG_RECORD, ///< Self test read log record. + NVDATAMGMT_SELF_TEST_STATE_READ_TREATMENT_TIME, ///< Self test read treatment time. + NVDATAMGMT_SELF_TEST_STATE_READ_WATER_CONSUMPTION, ///< Self test read water consumption. + NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORD, ///< Self test read manufacturing record. + NVDATAMGMT_SELF_TEST_STATE_READ_CAL_RECORD, ///< Self test read calibration record. + NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD, ///< Self test read service record. + NVDATAMGMT_SELF_TEST_STATE_READ_LAST_DISINFECTION_DATE, ///< Self test read last disinfection date. + 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. } NVDATAMGMT_SELF_TEST_STATE_T; /// NVDataMgmt Exec states enumeration. @@ -168,21 +176,27 @@ /// NVDataMgmt records' jobs states typedef enum NVDataMgmt_Records_Jobs { - NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD = 0, ///< NVDataMgmt process DG write calibration record. - NVDATAMGMT_WRITE_DG_SYSTEM_RECORD, ///< NVDataMgmt process DG write system record. - NVDATAMGMT_READ_DG_CALIBRATION_RECORD, ///< NVDataMgmt process DG read calibration record. - NVDATAMGMT_READ_DG_SYSTEM_RECORD, ///< NVDataMgmt Process DG read system record. - NVDATAMGMT_PROCESS_DG_SCHEDULER_RECORD, ///< NVDataMgmt process DG scheduler record. - NUM_OF_NVDATMGMT_RECORDS_JOBS ///< Number of NVDataMgmt records jobs. + NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD = 0, ///< NVDataMgmt process DG write calibration record. + NVDATAMGMT_WRITE_DG_SYSTEM_RECORD, ///< NVDataMgmt process DG write system record. + NVDATAMGMT_READ_DG_CALIBRATION_RECORD, ///< NVDataMgmt process DG read calibration record. + NVDATAMGMT_READ_DG_SYSTEM_RECORD, ///< NVDataMgmt process DG read system record. + NVDATAMGMT_PROCESS_DG_LAST_SERVICE_RECORD, ///< NVDATAMgmt process DG last service record. + NVDATAMGMT_PROCESS_DG_SCHEDULER_RECORD, ///< NVDataMgmt process DG scheduler record. + NVDATAMGMT_WRITE_HD_CALIBRATION_RECORD, ///< NVDataMgmt process HD write calibration record. + NVDATAMGMT_WRITE_HD_SYSTEM_RECORD, ///< NVDataMgmt process HD write system record. + NVDATAMGMT_READ_HD_CALIBRATION_RECORD, ///< NVDataMgmt process HD read calibration record. + NVDATAMGMT_READ_HD_SYSTEM_RECORD, ///< NVDataMgmt process HD read system record. + NVDATAMGMT_PROCESS_HD_SCHEDULER_RECORD, ///< NVDataMgmt process HD scheduler record. + NUM_OF_NVDATMGMT_RECORDS_JOBS ///< Number of NVDataMgmt records jobs. } RECORD_JOBS_STATE_T; /// NVDataMgmt write record validity check states typedef enum NVDataMgmt_Write_Record_Validity_Check { - NVDATAMGMT_RECORD_NOT_CHECKED = 0, ///< NVDataMgmt (written) record not checked. - NVDATAMGMT_RECORD_VALID, ///< NVDataMgmt record is valid. - NVDATAMGMT_RECORD_NOT_VALID, ///< NVDataMgmt record is not valid. - NUM_OF_NVDATAMGMT_RECORD_VALIDITY_CHECK ///< Number of NVDataMgmt validity check states. + NVDATAMGMT_RECORD_NOT_CHECKED = 0, ///< NVDataMgmt (written) record not checked. + NVDATAMGMT_RECORD_VALID, ///< NVDataMgmt record is valid. + NVDATAMGMT_RECORD_NOT_VALID, ///< NVDataMgmt record is not valid. + NUM_OF_NVDATAMGMT_RECORD_VALIDITY_CHECK ///< Number of NVDataMgmt validity check states. } RECORD_VALIDITY_CHECK_T; #pragma pack(push, 1) @@ -336,17 +350,28 @@ DG_TEMP_SENSORS_CAL_RECORD_T tempSensorsCalRecord; ///< DG temperature sensors. DG_COND_SENSORS_CAL_RECORD_T condSensorsCalRecord; ///< DG conductivity sensors. //DG_PUMPS_CAL_RECORD_T pumpsCalRecord; ///< DG pumps. - U08 padding[ 0x270 - ( sizeof(DG_PRES_SENSORS_CAL_RECORD_T) + sizeof(DG_FLOW_SENSORS_CAL_RECORD_T) + - sizeof(DG_LOAD_CELLS_CAL_RECORD_T) + sizeof(DG_TEMP_SENSORS_CAL_RECORD_T) + - sizeof(DG_COND_SENSORS_CAL_RECORD_T) + sizeof(U16) ) ]; ///< DG calibration record padding. - U16 crc; ///< CRC for the DG cal record structure. + U08 padding[ DG_PADDING_LENGTH - DG_CAL_STRUCTS_SIZE ]; ///< DG calibration record padding byte array. + U16 crc; ///< CRC for the DG calibration record structure. } DG_CALIBRATION_RECORD_T; +/// DG systems record structure typedef struct { - U16 crc; + char topLevelPN[ MAX_TOP_LEVEL_PN_CHARS ]; ///< DG top level part number. + char topLevelSN[ MAX_TOP_LEVEL_SN_CHARS ]; ///< DG top level serial number. + MFG_LOCATION_T mfgLocation; ///< DG manufacturing location. + U32 mfgDate; ///< DG manufacturing date. + U16 crc; ///< CRC for the DG system record structure. } DG_SYSTEM_RECORD_T; +/// DG last service record structure +typedef struct +{ + LAST_SERVICE_LOCATION_T lastServiceLoc; ///< DG last service location. + U32 lastServiceDate; ///< DG last service date. + U16 crc; ///< CRC for the DG last service record structure. +} DG_LAST_SERVICE_RECORD_T; + /// DG scheduler record structure typedef struct { @@ -356,11 +381,13 @@ // 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}, // NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD - {SYSTEM_DATA_NV_MEM_START_ADDRESS, sizeof(DG_SYSTEM_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES}, // NVDATAMGMT_WRITE_DG_SYSTEM_RECORD - {BANK7_SECTOR0_START_ADDRESS, sizeof(DG_CALIBRATION_RECORD_T), sizeof(DG_CALIBRATION_RECORD_T)}, // NVDATAMGMT_READ_DG_CALIBRATION_RECORD - {SYSTEM_DATA_NV_MEM_START_ADDRESS, sizeof(DG_SYSTEM_RECORD_T), sizeof(DG_SYSTEM_RECORD_T)}, // NVDATAMGMT_READ_DG_SYSTEM_RECORD - {DG_SCHEDULER_ADDRESS, sizeof(DG_SCHEDULER_RECORD_T), 11 /*TODO can we increase this to 16?*/}}; // NVDATAMGMT_PROCESS_DG_SCHEDULER_RECORD + {BANK7_SECTOR0_START_ADDRESS, sizeof(DG_CALIBRATION_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES}, // NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD + {SYSTEM_DATA_NV_MEM_START_ADDRESS, sizeof(DG_SYSTEM_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES}, // NVDATAMGMT_WRITE_DG_SYSTEM_RECORD + {BANK7_SECTOR0_START_ADDRESS, sizeof(DG_CALIBRATION_RECORD_T), sizeof(DG_CALIBRATION_RECORD_T)}, // NVDATAMGMT_READ_DG_CALIBRATION_RECORD + {SYSTEM_DATA_NV_MEM_START_ADDRESS, sizeof(DG_SYSTEM_RECORD_T), sizeof(DG_SYSTEM_RECORD_T)}, // NVDATAMGMT_READ_DG_SYSTEM_RECORD + {LAST_SERVICE_RECORD_START_ADDRESS, sizeof(DG_LAST_SERVICE_RECORD_T), MAX_RTC_RAM_OPS_BUFFER_BYTES}, // NVDATAMGMT_PROCESS_DG_LAST_SERVICE_RECORD + {DG_SCHEDULER_RECORD_START_ADDRESS, sizeof(DG_SCHEDULER_RECORD_T), MAX_RTC_RAM_OPS_BUFFER_BYTES} // NVDATAMGMT_PROCESS_DG_SCHEDULER_RECORD + }; // Calibration variables static PROCESS_RECORD_STATE_T NVDataMgmtExecProcessRecordState = NVDATAMGMT_PROCESS_RECORD_STATE_IDLE; ///< NVDataMgmt exec process record state. @@ -443,7 +470,7 @@ static BOOL isQueueEmpty ( void ); static BOOL isQueueFull ( void ); static U32 getAvailableQueueCount ( void ); -static BOOL enqueueBank7Sector0Records ( void ); +static BOOL enqueueBank7Sector0Records ( void ); // TODO remove // Helper functions static BOOL didCommandTimeout ( ALARM_ID_T alarm, U08* state ); @@ -453,6 +480,8 @@ 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 BOOL enqueueSector0Records( void ); /*********************************************************************//** * @brief @@ -789,23 +818,18 @@ U16 calcCRC = crc16 ( (U08*)&dgCalibrationRecord, sizeof(DG_CALIBRATION_RECORD_T) - sizeof(dgCalibrationRecord.crc) ); U16 recordCRC = dgCalibrationRecord.crc; - /*if ( calcCRC != recordCRC ) + if ( calcCRC != recordCRC ) { // CRC failed, request a read to read the data back from NV memory and update the structure enqueueRecordJob( NVDATAMGMT_READ, NVDATAMGMT_EEPROM, NVDATAMGMT_READ_DG_CALIBRATION_RECORD ); NVDataMgmtExecReceiveRecordState = NVDATAMGMT_RECEIVE_RECORD_IDLE; status = FALSE; } - else*/ + else { // CRC passed, enqueue an erase, a write of calibration data and a write of service record - enqueueRecordJob( NVDATAMGMT_ERASE_SECTOR, NVDATAMGMT_EEPROM, NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD ); - enqueueRecordJob( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD ); + BOOL scheduleStatus = enqueueSector0Records(); - // TODO remove for testing only - enqueueRecordJob( NVDATAMGMT_READ, NVDATAMGMT_EEPROM, NVDATAMGMT_READ_DG_CALIBRATION_RECORD ); - // TODO remove for testing only - // Done with receiving data, go back to idle NVDataMgmtExecReceiveRecordState = NVDATAMGMT_RECEIVE_RECORD_IDLE; } @@ -978,8 +1002,8 @@ if ( !isQueueFull() ) { - enqueue( NVDATAMGMT_WRITE, NVDATAMGMT_RTC, SERVICE_DATE_START_ADDRESS, - (U08*)&serviceRecord, 0, sizeof(SERVICE_RECORD_T) ); + //enqueue( NVDATAMGMT_WRITE, NVDATAMGMT_RTC, SERVICE_DATE_START_ADDRESS, + // (U08*)&serviceRecord, 0, sizeof(SERVICE_RECORD_T) ); status = TRUE; } @@ -1430,7 +1454,7 @@ if ( getRTCRAMState() == RTC_RAM_STATE_READY ) { currentTime = getMSTimerCount(); - readFromRAM( SERVICE_DATE_START_ADDRESS, sizeof(SERVICE_RECORD_T) ); + //readFromRAM( SERVICE_DATE_START_ADDRESS, sizeof(SERVICE_RECORD_T) ); state = NVDATAMGMT_SELF_TEST_STATE_READ_SERVICE_RECORD; } } @@ -2441,8 +2465,8 @@ /*********************************************************************//** * @brief - * The isRecordQueueEmpty checks whether the queue is empty and if it is empty, - * it will return a false. + * The isRecordQueueEmpty checks whether the queue is empty and if it is + * empty, it will return a false. * @details Inputs: recordQueueCount * @details Outputs: none * @return TRUE if queue is not empty @@ -2459,4 +2483,42 @@ return isEmpty; } +/*********************************************************************//** + * @brief + * The getAvailableRecordQueueCount returns the number of available record + * queues. + * @details Inputs: recordQueueCount + * @details Outputs: none + * @return available record queues + *************************************************************************/ +static U32 getAvailableRecordQueueCount( void ) +{ + return QUEUE_MAX_SIZE - recordQueueCount; +} + + +/*********************************************************************//** + * @brief + * The enqueueSector0Records checks whether there are enough jobs available + * to be able to enqueue to the records. + * @details Inputs: none + * @details Outputs: none + * @return TRUE if the job were successfully enqueued otherwise, FLASE + *************************************************************************/ +static BOOL enqueueSector0Records( void ) +{ + BOOL status = FALSE; + + if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_FOR_SECTOR_0 ) + { + enqueueRecordJob( NVDATAMGMT_ERASE_SECTOR, NVDATAMGMT_EEPROM, NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD ); + enqueueRecordJob( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, NVDATAMGMT_WRITE_DG_CALIBRATION_RECORD ); + // TODO schedule systems record + + status = TRUE; + } + + return status; +} + /**@}*/