Index: NVDataMgmt.c =================================================================== diff -u -r091b7a5c623590a204a790d6e899110ca91ebb26 -rdd517da58c2ed6006d3b827876929fe2b99b7c37 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 091b7a5c623590a204a790d6e899110ca91ebb26) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision dd517da58c2ed6006d3b827876929fe2b99b7c37) @@ -67,6 +67,7 @@ #define MAX_HW_SERIAL_NUMBER_CHARACTERS 5U #define MAX_MFG_DATE_CHARACTERS 10U #define MAX_CRC_LENGTH_BYTES 2U +#define MAX_EEPROM_WRITE_BUFFER_BYTES 16U #define IDLE_TIME 20 // ms @@ -110,29 +111,6 @@ NUM_OF_NVDATAMGMT_LOC_STATES } NVDATAMGMT_LOCATION_STATE_T; -// Private functions - -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); - -static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecIdleState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecWriteState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecEraseState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecReadState( void ); - -// Queue functions -static void enqueue( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, - U32 startAddress, U08* data, U32 length ); -static void dequeue( void ); -static BOOL isQueueEmpty ( void ); -static U08 getQueueSize( void ); - -// Private variables - #pragma pack(push,1) struct MEMORY_OPS_T { @@ -162,11 +140,47 @@ MFG_DATA_T mfgData; U16 crc; } MFG_RECORD_T; + +typedef struct +{ + U32 epochTime; + U32 eventCode; + U32 subCode; + F32 data1; + F32 data2; + F32 data3; + F32 data4; + F32 data5; +} LOG_DATA_T; #pragma pack(pop) +// Private functions + +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord( void ); +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); + +static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecIdleState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecWriteState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecEraseState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecReadState( void ); + +// Queue functions +static void enqueue( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, + U32 startAddress, LOG_DATA_T* data, U32 length ); +static void dequeue( void ); +static BOOL isQueueEmpty ( void ); +static U08 getQueueSize( void ); + +// Private variables + struct MEMORY_OPS_T jobQueue [ QUEUE_MAX_SIZE ]; static U08 readBuffer [ MEMORY_OPS_BUFFER_LENGTH ]; static LOG_RECORD_T logRecord; +static LOG_DATA_T logData; static MFG_RECORD_T mfgRecord; static S16 queueRearIndex = QUEUE_EMPTY_INDEX; static S16 queueFrontIndex = QUEUE_EMPTY_INDEX; @@ -179,8 +193,9 @@ static U32 waitTimer = 0; // REMOVE THIS CODE -static U08 tempBufferForTest[5] = {'0', '8', 0x15, 'r', 'k'}; -static U32 tempBufferLogTest[8] = {1582583436, NVDATAMGMT_MODE_CHANGE, 14587, 'c', 0x38}; +static U08 tempBufferForTest[5] = {'5', 'Y', 'I', 'D', 'P'}; +static U08 readBufferForTest [ 8 ]; + // REMOVE THIS CODE /************************************************************************* @@ -480,12 +495,18 @@ NVDataMgmtSelfTestResult == SELF_TEST_STATUS_PASSED ) { // TODO: REMOVE THIS CODE - enqueue(NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, BANK7_SECTOR1_START_ADDRESS, - tempBufferForTest, sizeof(tempBufferForTest)); - enqueue(NVDATAMGMT_READ, NVDATAMGMT_EEPROM, BANK7_SECTOR1_START_ADDRESS, - readBuffer, 16); + logData.epochTime = 1582583436; + logData.eventCode = NVDATAMGMT_MODE_CHANGE; + logData.subCode = 14587; + logData.data1 = 2.4; + logData.data2 = 13; + logData.data3 = 37.8; + logData.data4 = 125; + logData.data5 = 45.9; + enqueue(NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, BANK7_SECTOR1_START_ADDRESS, &logData, sizeof(LOG_DATA_T)); + //enqueue(NVDATAMGMT_READ, NVDATAMGMT_EEPROM, BANK7_SECTOR1_START_ADDRESS, 0, 8); + //enqueue(NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, BANK7_SECTOR1_START_ADDRESS+20, &logData, sizeof(LOG_DATA_T)); // TODO: REMOVE THIS CODE - state = NVDATAMGMT_EXEC_STATE_IDLE; } else if ( NVDataMgmtSelfTestState == NVDATAMGMT_SELF_TEST_STATE_COMPLETE ) @@ -584,8 +605,11 @@ } static void enqueue( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, - U32 startAddress, U08* data, U32 length ) + U32 startAddress, LOG_DATA_T* data, U32 length ) { + U32 quotient = 0; + U32 modulus = 0; + U08 i; // If the start address is at the beginning of any of the sectors and the ops is write to // EEPROM, first erase the sector if ( ( startAddress == BANK7_SECTOR0_START_ADDRESS || startAddress == BANK7_SECTOR1_START_ADDRESS || @@ -596,15 +620,43 @@ jobQueue [ queueRearIndex ].memoryOperation = NVDATAMGMT_ERASE; jobQueue [ queueRearIndex ].memoryLocation = NVDATAMGMT_EEPROM; jobQueue [ queueRearIndex ].startAddress = (U32*)startAddress; - memcpy ( jobQueue[ queueRearIndex + 1 ].buffer, 0, MEMORY_OPS_BUFFER_LENGTH ); - jobQueue[ queueRearIndex + 1 ].length = MEMORY_OPS_BUFFER_LENGTH; + memcpy ( jobQueue[ queueRearIndex ].buffer, 0, MEMORY_OPS_BUFFER_LENGTH ); + jobQueue[ queueRearIndex ].length = MEMORY_OPS_BUFFER_LENGTH; } - queueRearIndex++; - jobQueue [ queueRearIndex ].memoryOperation = ops; - jobQueue [ queueRearIndex ].memoryLocation = location; - jobQueue [ queueRearIndex ].startAddress = (U32*)startAddress; - memcpy ( jobQueue [ queueRearIndex ].buffer, data, length ); - jobQueue [ queueRearIndex ].length = length; + if ( length > MAX_EEPROM_WRITE_BUFFER_BYTES && ops == NVDATAMGMT_WRITE ) + { + quotient = length / MAX_EEPROM_WRITE_BUFFER_BYTES; + modulus = length % MAX_EEPROM_WRITE_BUFFER_BYTES; + for ( i = 0; i < quotient; i++ ) + { + queueRearIndex++; + jobQueue [ queueRearIndex ].memoryOperation = ops; + jobQueue [ queueRearIndex ].memoryLocation = location; + jobQueue [ queueRearIndex ].startAddress = (U32*)(startAddress + ( i * MAX_EEPROM_WRITE_BUFFER_BYTES )); + jobQueue [ queueRearIndex ].length = MAX_EEPROM_WRITE_BUFFER_BYTES; + memcpy ( jobQueue [ queueRearIndex ].buffer, &(data) + ( i * MAX_EEPROM_WRITE_BUFFER_BYTES ), MAX_EEPROM_WRITE_BUFFER_BYTES ); + //&data[i * MAX_EEPROM_WRITE_BUFFER_BYTES ], MAX_EEPROM_WRITE_BUFFER_BYTES + + } + if ( modulus != 0 ) + { + queueRearIndex++; + jobQueue [ queueRearIndex ].memoryOperation = ops; + jobQueue [ queueRearIndex ].memoryLocation = location; + jobQueue [ queueRearIndex ].startAddress = (U32*)(startAddress + ( quotient * MAX_EEPROM_WRITE_BUFFER_BYTES )); + jobQueue [ queueRearIndex ].length = modulus; + memcpy ( jobQueue [ queueRearIndex ].buffer, &data[quotient * MAX_EEPROM_WRITE_BUFFER_BYTES], modulus ); + } + } + else + { + queueRearIndex++; + jobQueue [ queueRearIndex ].memoryOperation = ops; + jobQueue [ queueRearIndex ].memoryLocation = location; + jobQueue [ queueRearIndex ].startAddress = (U32*)startAddress; + jobQueue [ queueRearIndex ].length = length; + memcpy ( jobQueue [ queueRearIndex ].buffer, &data, length ); + } if ( queueFrontIndex == QUEUE_EMPTY_INDEX ) { queueFrontIndex++; @@ -613,7 +665,10 @@ static void dequeue( void ) { - queueFrontIndex++; + if ( queueFrontIndex < queueRearIndex ) + { + queueFrontIndex++; + } } static BOOL isQueueEmpty ( void ) {