Index: NVDataMgmt.c =================================================================== diff -u -r1e84982f9bd335d3fe5ecd1fc98ce4aab67ae133 -r54f132e07512bf9de8db4e16e028b11503787c83 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 1e84982f9bd335d3fe5ecd1fc98ce4aab67ae133) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 54f132e07512bf9de8db4e16e028b11503787c83) @@ -95,8 +95,10 @@ #define CAL_DATA_SEND_INTERVAL_COUNT ( MS_PER_SECOND / ( 5 * TASK_GENERAL_INTERVAL ) ) ///< Calibration data send time interval in counts. #define CAL_DATA_RECEIVE_TIMEOUT_MS ( 4 * MS_PER_SECOND ) ///< Calibration data receive all the data packets timeout in ms. #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 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. + /// NVDataMgmt self-test states enumeration. typedef enum NVDataMgmt_Self_Test_States { @@ -165,20 +167,24 @@ /// NVDataMgmt records' jobs states typedef enum NVDataMgmt_Records_Jobs { - NVDATAMGMT_PROCESS_CALIBRATION_RECORD = 0, ///< NVDataMgmt process calibration record (read/write). - NVDATAMGMT_PROCESS_MANUFACTURING_RECORD, - NVDATAMGMT_PROCESS_DG_SCHEDULER_RECORD, - NUM_OF_NVDATMGMT_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. } RECORD_JOBS_STATE_T; #pragma pack(push, 1) +/// Process records specifications structure typedef struct { - U32 startAddress; - U32 sizeofJob; - U08 maxBufferSize; + U32 startAddress; ///< Jobs spec start address. + U32 sizeofJob; ///< Jobs spec size of job. + U32 maxBufferSize; ///< Jobs max allowed processing buffer size. } PROCESS_RECORD_SPECS_T; +/// Process records job structure typedef struct { NVDATAMGMT_OPERATION_STATE_T memoryOperation; ///< Memory operation. @@ -319,20 +325,31 @@ 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 } DG_CALIBRATION_RECORD_T; +typedef struct +{ + U16 crc; +} DG_SYSTEM_RECORD_T; + /// DG scheduler record structure typedef struct { //TODO fill up } DG_SCHEDULER_RECORD_T; #pragma pack(pop) -// TODO change the +// 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_PROCESS_CALIBRATION_RECORD - {DG_SCHEDULER_ADDRESS, sizeof(DG_SCHEDULER_RECORD_T), 11 /*TODO can we increase this to 16?*/}}; //NVDATAMGMT_PROCESS_SCHEDULING_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 + {DG_SCHEDULER_ADDRESS, sizeof(DG_SCHEDULER_RECORD_T), 11 /*TODO can we increase this to 16?*/}}; // NVDATAMGMT_PROCESS_DG_SCHEDULER_RECORD // Calibration variables static PROCESS_RECORD_STATE_T NVDataMgmtExecProcessRecordState = NVDATAMGMT_PROCESS_RECORD_STATE_IDLE; ///< NVDataMgmt exec process record state. @@ -378,7 +395,6 @@ U08 calRecordSizeAssertion[ ( sizeof( CALIBRATION_DATA_T ) <= MAX_MSG_PAYLOAD_SIZE ? 1 : -1 ) ]; // 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 ); @@ -749,23 +765,28 @@ // and 0 everything out since we are done writing if ( currentMessage == totalMessages ) { - // Get the CRC of the structure without the last 16 bits which is the CRC itself - U16 calcCRC = crc16 ( (U08*)&dgCalibrationRecord, sizeof(DG_CALIBRATION_RECORD_T) - sizeof(U16) ); + // Get the CRC of the structure without the last 16 bits which is the CRC as well as the padding values + U16 calcCRC = crc16 ( (U08*)&dgCalibrationRecord, sizeof(DG_CALIBRATION_RECORD_T) - sizeof(dgCalibrationRecord.crc) ); U16 recordCRC = dgCalibrationRecord.crc; /*if ( calcCRC != recordCRC ) { - // TODO schedule a read - // CRC failed, request a read to read the data back from NV memory + // 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*/ { - // CRC passed, request an erase sector - enqueueRecordJob( NVDATAMGMT_ERASE_SECTOR, NVDATAMGMT_EEPROM, NVDATAMGMT_PROCESS_CALIBRATION_RECORD ); - enqueueRecordJob( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, NVDATAMGMT_PROCESS_CALIBRATION_RECORD ); + // 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 ); + // 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; } } @@ -1581,35 +1602,62 @@ { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_IDLE; + NVDATAMGMT_OPERATION_STATE_T ops; + NVDATAMGMT_LOCATION_STATE_T location; + U32 startAddress; + U08* bufferAddress; + U32 maxBufferLength; + BOOL isThereJob = FALSE; + // If the record processing queue is not empty, process the queues if ( !isRecordQueueEmpty() ) { dequeueRecordJob(); - NVDATAMGMT_OPERATION_STATE_T ops = recordCurrentJob.memoryOperation; - NVDATAMGMT_LOCATION_STATE_T location = recordCurrentJob.memoryLocation; - RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; - PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + // Set the record address offset to 0 since a job will just be started + recordAddressOffset = 0; + isThereJob = TRUE; + ops = recordCurrentJob.memoryOperation; + location = recordCurrentJob.memoryLocation; + currentTime = getMSTimerCount(); + startAddress = jobSpecs.startAddress + recordAddressOffset; + bufferAddress = (U08*)&dgCalibrationRecord + recordAddressOffset; + maxBufferLength = jobSpecs.maxBufferSize; + // Current start address was updated. Update the offset + recordAddressOffset += jobSpecs.maxBufferSize; + } + + // Check if a queue job is available + if ( isThereJob ) + { if ( ops == NVDATAMGMT_ERASE_SECTOR ) { - currentTime = getMSTimerCount(); - Fapi_issueAsyncCommandWithAddress ( Fapi_EraseSector, (U32*)jobSpecs.startAddress ); + Fapi_issueAsyncCommandWithAddress ( Fapi_EraseSector, (U32*)startAddress ); state = NVDATAMGMT_EXEC_STATE_ERASE_EEPROM; } else if ( ops == NVDATAMGMT_WRITE && location == NVDATAMGMT_EEPROM ) { - currentTime = getMSTimerCount(); - U32* memoryPtr = (U32*)jobSpecs.startAddress + recordAddressOffset; - U08* structPtr = (U08*)&dgCalibrationRecord + recordAddressOffset; + // TODO remove + //U32* memoryPtr = (U32*)jobSpecs.startAddress + recordAddressOffset; + //U08* structPtr = (U08*)&dgCalibrationRecord + recordAddressOffset; - Fapi_issueProgrammingCommand ( memoryPtr, structPtr, jobSpecs.maxBufferSize, 0x00, 0, Fapi_DataOnly ); - recordAddressOffset += jobSpecs.maxBufferSize; + Fapi_issueProgrammingCommand ( (U32*)startAddress, (U08*)bufferAddress, maxBufferLength, 0x00, 0, Fapi_DataOnly ); state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; } + else if ( ops == NVDATAMGMT_READ && location == NVDATAMGMT_EEPROM ) + { + U08 test[100]; + memcpy(test, &dgCalibrationRecord, 100); + Fapi_doMarginRead ( (U32*)startAddress, (U32*)bufferAddress, maxBufferLength, Fapi_NormalRead ); + BOOL test2 = FALSE; + } } + // Check if the queue is not empty and the calibration/service status is none // Processing calibration and service status have priority - if ( !isQueueEmpty() ) + /*if ( !isQueueEmpty() ) { dequeue(); NVDATAMGMT_OPERATION_STATE_T ops = currentJob.memoryOperation; @@ -1657,7 +1705,7 @@ state = NVDATAMGMT_EXEC_STATE_READ_FROM_RTC; } } - } + }*/ return state; } @@ -1677,21 +1725,28 @@ RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; - if ( jobSpecs.sizeofJob == recordAddressOffset ) + if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady )//|| timeoutStatus == TRUE ) { - if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) + if ( jobSpecs.sizeofJob == recordAddressOffset ) { state = NVDATAMGMT_EXEC_STATE_IDLE; } - } - else - { - currentTime = getMSTimerCount(); - U32* memoryPtr = (U32*)( jobSpecs.startAddress + recordAddressOffset ); - U08* structPtr = (U08*)&dgCalibrationRecord + recordAddressOffset; + /*else if ( timeoutStatus == TRUE ) + { + // TODO schedule another write + recordAddressOffset = 0; + state = NVDATAMGMT_EXEC_STATE_IDLE; + }*/ + else + { + currentTime = getMSTimerCount(); + U32 memoryPtr = jobSpecs.startAddress + recordAddressOffset; + U08* structPtr = (U08*)&dgCalibrationRecord; + structPtr += recordAddressOffset; - Fapi_issueProgrammingCommand ( memoryPtr, structPtr, jobSpecs.maxBufferSize, 0x00, 0, Fapi_DataOnly ); - recordAddressOffset += jobSpecs.maxBufferSize; + Fapi_issueProgrammingCommand ( (U32*)memoryPtr, structPtr, jobSpecs.maxBufferSize, 0x00, 0, Fapi_DataOnly ); + recordAddressOffset += jobSpecs.maxBufferSize; + } } return state;