Index: firmware/App/Drivers/NVDriver.h =================================================================== diff -u -r63c3a65e681810f037718377c6ed5a28c897d0ca -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Drivers/NVDriver.h (.../NVDriver.h) (revision 63c3a65e681810f037718377c6ed5a28c897d0ca) +++ firmware/App/Drivers/NVDriver.h (.../NVDriver.h) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -40,32 +40,32 @@ #define BANK7_SECTOR3_START_ADDRESS 0xF020C000 ///< Bank7 sector 3 start address. #define BANK7_SECTOR3_END_ADDRESS 0xF020FFFF ///< Bank7 sector 3 end address. -/// NVDataMgmt memory operation modes enumeration. -typedef enum NVDataMgmt_Operation +/// Non Volatile Memory operation modes enumeration. +typedef enum NVM_Operation { - NVDATAMGMT_NONE = 0, ///< Default mode to prevent any accidental ops. - NVDATAMGMT_WRITE, ///< Operation mode write. - NVDATAMGMT_READ, ///< Operation mode read. - NVDATAMGMT_ERASE_SECTOR, ///< Operation mode erase a sector (EEPROM). - NUM_OF_NVDATAMGMT_OPS_STATES ///< Total number of operation states. -} NVDATAMGMT_OPERATION_STATE_T; + NVM_NONE = 0, ///< Default mode to prevent any accidental ops. + NVM_OPERATION_WRITE, ///< Operation mode write. + NVM_OPERATION_READ, ///< Operation mode read. + NVM_OPERATION_ERASE, ///< Operation mode erase a sector (EEPROM). + NUM_OF_NVM_OPERATIONS ///< Total number of operation states. +} NVM_OPERATION_T; -/// NVDataMgmt records' jobs states -typedef enum NVDataMgmt_Records_Jobs +/// NVM record type enumeration +typedef enum NVM_Record_Type { - NVDATAMGMT_SYSTEM_RECORD = 0, ///< NVDataMgmt process system record. - NVDATAMGMT_SERVICE_RECORD, ///< NVDataMgmt process service record. - NVDATAMGMT_CALIBRATION_RECORD, ///< NVDataMgmt process calibration record. - NVDATAMGMT_INSTITUTIONAL_RECORD, ///< NVDataMgmt process institutional record. - NVDATAMGMT_USAGE_INFO_RECORD, ///< NVDataMgmt process usage info record. - NUM_OF_NVDATMGMT_RECORDS_JOBS ///< Number of NVDataMgmt records jobs. -} RECORD_JOBS_STATE_T; + NVM_SYSTEM_RECORD = 0, ///< NVM process system record. + NVM_SERVICE_RECORD, ///< NVM process service record. + NVM_CALIBRATION_RECORD, ///< NVM process calibration record. + NVM_INSTITUTIONAL_RECORD, ///< NVM process institutional record. + NVM_USAGE_INFO_RECORD, ///< NVM process usage info record. + NUM_OF_NVM_RECORD_TYPES ///< Number of NVM records jobs. +} NVM_RECORD_TYPE_T; /// Process records job structure typedef struct { - NVDATAMGMT_OPERATION_STATE_T memoryOperation; ///< Memory operation. - RECORD_JOBS_STATE_T recordJob; ///< Record job (i.e sector 0). + NVM_OPERATION_T memoryOperation; ///< Memory operation. + NVM_RECORD_TYPE_T recordJob; ///< Record job (i.e sector 0). } PROCESS_RECORD_JOB_T; // ********** public function prototypes ********** Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -133,7 +133,7 @@ break; case DD_POST_STATE_NVDATAMGMT: - //testStatus = execNVDataMgmtSelfTest(); + //testStatus = execNVMSelfTest(); postState = handlePOSTStatus( testStatus ); break; Index: firmware/App/Services/NVMgmtDD.c =================================================================== diff -u -r0face6417892ea9de28d146bf88d44a9f30cf2a4 -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision 0face6417892ea9de28d146bf88d44a9f30cf2a4) +++ firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -27,58 +27,58 @@ // ********** private definitions ********** -#define COMMAND_TIME_OUT (1 * MS_PER_SECOND) ///< 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 divided by 4. #define EEPROM_OPS_SIZE_OF_CONVERTER 4 +#define COMMAND_TIME_OUT (1 * MS_PER_SECOND) ///< Timeout for an EEPROM or RTC command in ms. -/// NVDataMgmt Exec states enumeration. -typedef enum NVDataMgmt_Exec_State +/// NVM Exec states enumeration. +typedef enum NVM_Exec_State { - NVDATAMGMT_EXEC_STATE_IDLE = 0, ///< Exec state Idle. - NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM, ///< Exec state write to EEPROM. - NVDATAMGMT_EXEC_STATE_VERIFY_EEPROM_WRITE, ///< Exec state verify EEPROM write. - NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM, ///< Exec state read from EEPROM. - NVDATAMGMT_EXEC_STATE_ERASE_EEPROM, ///< Exec state erase EEPROM. - NUM_OF_NVDATAMGMT_EXEC_STATES ///< Total number of exec states. -} NVDATAMGMT_EXEC_STATE_T; + NVM_EXEC_STATE_IDLE = 0, ///< Exec state Idle. + NVM_EXEC_STATE_WRITE_TO_EEPROM, ///< Exec state write to EEPROM. + NVM_EXEC_STATE_VERIFY_EEPROM_WRITE, ///< Exec state verify EEPROM write. + NVM_EXEC_STATE_READ_FROM_EEPROM, ///< Exec state read from EEPROM. + NVM_EXEC_STATE_ERASE_EEPROM, ///< Exec state erase EEPROM. + NUM_OF_NVM_EXEC_STATES ///< Total number of exec states. +} NVM_EXEC_STATE_T; -/// NVDataMgmt write record validity check states -typedef enum NVDataMgmt_Write_Record_Validity_Check +/// NVM write record validity check states +typedef enum NVM_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. -} RECORD_VALIDITY_CHECK_T; + NVM_RECORD_NOT_CHECKED = 0, ///< NVM (written) record not checked. + NVM_RECORD_VALID, ///< NVM record is valid. + NVM_RECORD_NOT_VALID, ///< NVM record is not valid. + NUM_OF_NVM_RECORD_VALIDITY_CHECK ///< Number of NVM validity check states. +} NVM_RECORD_VALIDITY_CHECK_T; // ********** private data ********** -static NVDATAMGMT_EXEC_STATE_T nvDataMgmtExecState; ///< NVDataMgmt exec state variable. -static volatile BOOL powerOffIsImminent; ///< Power off warning has been signaled. Non-volatile memory operations should be completed ASAP and then ceased. -static RECORD_VALIDITY_CHECK_T writtenRecordStatus; ///< Record data write validity check. -static U08 writtenRecordCheckBuffer[ MAX_EEPROM_WRITE_BUFFER_BYTES ]; ///< Written record validity check buffer. -static U32 currentTime; ///< Current time. -static U32 recordAddressOffset; ///< Record address offset. +static NVM_EXEC_STATE_T nvmExecState; ///< NVM exec state variable. +static volatile BOOL powerOffIsImminent; ///< Power off warning has been signaled. Non-volatile memory operations should be completed ASAP and then ceased. +static NVM_RECORD_VALIDITY_CHECK_T writtenRecordStatus; ///< Record data write validity check. +static U32 currentTime; ///< Current time. +static U32 recordAddressOffset; ///< Record address offset. +static U08 writtenRecordCheckBuffer[ MAX_EEPROM_WRITE_BUFFER_BYTES ]; ///< Written record validity check buffer. // ********** private function prototypes ********** // Exec functions -static NVDATAMGMT_EXEC_STATE_T handleExecIdleState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecEraseState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecWriteToEEPROMState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecReadFromEEPROMState( void ); -static NVDATAMGMT_EXEC_STATE_T handleExecVerifyEEPROMWriteState( void ); +static NVM_EXEC_STATE_T handleExecIdleState( void ); +static NVM_EXEC_STATE_T handleExecEraseState( void ); +static NVM_EXEC_STATE_T handleExecWriteToEEPROMState( void ); +static NVM_EXEC_STATE_T handleExecReadFromEEPROMState( void ); +static NVM_EXEC_STATE_T handleExecVerifyEEPROMWriteState( void ); // Helper functions -static BOOL didCommandTimeout( NVDATAMGMT_EXEC_STATE_T state ); +static BOOL didCommandTimeout( NVM_EXEC_STATE_T state ); void initNVMgmtDD( void ) { - nvDataMgmtExecState = NVDATAMGMT_EXEC_STATE_IDLE; + nvmExecState = NVM_EXEC_STATE_IDLE; powerOffIsImminent = FALSE; currentTime = 0; - writtenRecordStatus = NVDATAMGMT_RECORD_NOT_CHECKED; + writtenRecordStatus = NVM_RECORD_NOT_CHECKED; recordAddressOffset = 0; initNVDriver(); @@ -103,38 +103,38 @@ /*********************************************************************//** * @brief - * The execNVDataMgmt runs the NVDataMgmt main tasks. - * @details Inputs: nvDataMgmtExecState - * @details Outputs: nvDataMgmtExecState + * The execNVM runs the NVM main tasks. + * @details Inputs: nvmExecState + * @details Outputs: nvmExecState * @return none *************************************************************************/ -void execNVDataMgmt( void ) +void execNVM( void ) { - switch ( nvDataMgmtExecState ) + switch ( nvmExecState ) { - case NVDATAMGMT_EXEC_STATE_IDLE: - nvDataMgmtExecState = handleExecIdleState(); + case NVM_EXEC_STATE_IDLE: + nvmExecState = handleExecIdleState(); break; - case NVDATAMGMT_EXEC_STATE_ERASE_EEPROM: - nvDataMgmtExecState = handleExecEraseState(); + case NVM_EXEC_STATE_ERASE_EEPROM: + nvmExecState = handleExecEraseState(); break; - case NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM: - nvDataMgmtExecState = handleExecWriteToEEPROMState(); + case NVM_EXEC_STATE_WRITE_TO_EEPROM: + nvmExecState = handleExecWriteToEEPROMState(); break; - case NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM: - nvDataMgmtExecState = handleExecReadFromEEPROMState(); + case NVM_EXEC_STATE_READ_FROM_EEPROM: + nvmExecState = handleExecReadFromEEPROMState(); break; - case NVDATAMGMT_EXEC_STATE_VERIFY_EEPROM_WRITE: - nvDataMgmtExecState = handleExecVerifyEEPROMWriteState(); + case NVM_EXEC_STATE_VERIFY_EEPROM_WRITE: + nvmExecState = handleExecVerifyEEPROMWriteState(); break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_EXEC_STATE, ( U32 )nvDataMgmtExecState ); - nvDataMgmtExecState = NVDATAMGMT_EXEC_STATE_IDLE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_EXEC_STATE, ( U32 )nvmExecState ); + nvmExecState = NVM_EXEC_STATE_IDLE; break; } } @@ -147,15 +147,15 @@ * @details Outputs: none * @return next state *************************************************************************/ -static NVDATAMGMT_EXEC_STATE_T handleExecIdleState ( void ) +static NVM_EXEC_STATE_T handleExecIdleState ( void ) { - NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_IDLE; + NVM_EXEC_STATE_T state = NVM_EXEC_STATE_IDLE; BOOL areQueuesNotEmpty = FALSE; - NVDATAMGMT_OPERATION_STATE_T ops; + NVM_OPERATION_T ops; U32 recordFlashAddress; U08* bufferAddress; PROCESS_RECORD_JOB_T recordCurrentJob; - RECORD_JOBS_STATE_T job; + NVM_RECORD_TYPE_T job; PROCESS_RECORD_SPECS_T jobSpecs; // If power off command has been issued, do not process any new jobs @@ -183,31 +183,31 @@ { switch ( ops ) { - case NVDATAMGMT_ERASE_SECTOR: + case NVM_OPERATION_ERASE: eraseSector( (U32*)recordFlashAddress ); - state = NVDATAMGMT_EXEC_STATE_ERASE_EEPROM; + state = NVM_EXEC_STATE_ERASE_EEPROM; break; - case NVDATAMGMT_WRITE: + case NVM_OPERATION_WRITE: writeSector( (U32*)recordFlashAddress, (U08*)bufferAddress, MAX_EEPROM_WRITE_BUFFER_BYTES ); currentTime = getMSTimerCount(); - state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; + state = NVM_EXEC_STATE_WRITE_TO_EEPROM; break; - case NVDATAMGMT_READ: + case NVM_OPERATION_READ: readSector( (U32*)recordFlashAddress, (U32*)bufferAddress, ( jobSpecs.sizeofRecord / EEPROM_OPS_SIZE_OF_CONVERTER ) ); currentTime = getMSTimerCount(); - state = NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM; + state = NVM_EXEC_STATE_READ_FROM_EEPROM; break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_OPS, ( U32 )nvDataMgmtExecState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_OPS, ( U32 )nvmExecState ); break; } } // Update Self Test Read Records Flag - if ( ( TRUE == isRecordQueueEmpty() ) && ( state == NVDATAMGMT_EXEC_STATE_IDLE ) ) + if ( ( TRUE == isRecordQueueEmpty() ) && ( state == NVM_EXEC_STATE_IDLE ) ) { updateSelfTestReadRecordsFlag( TRUE ); } @@ -227,14 +227,14 @@ * @details Outputs: none * @return next state *************************************************************************/ -static NVDATAMGMT_EXEC_STATE_T handleExecEraseState ( void ) +static NVM_EXEC_STATE_T handleExecEraseState ( void ) { - NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_ERASE_EEPROM; + NVM_EXEC_STATE_T state = NVM_EXEC_STATE_ERASE_EEPROM; BOOL timeoutStatus = didCommandTimeout( state ); if ( TRUE == isFlashReady() || timeoutStatus == TRUE ) { - state = NVDATAMGMT_EXEC_STATE_IDLE; + state = NVM_EXEC_STATE_IDLE; } return state; @@ -250,19 +250,19 @@ * writtenRecordStatus * @return next state of the state machine *************************************************************************/ -static NVDATAMGMT_EXEC_STATE_T handleExecWriteToEEPROMState ( void ) +static NVM_EXEC_STATE_T handleExecWriteToEEPROMState ( void ) { - NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; + NVM_EXEC_STATE_T state = NVM_EXEC_STATE_WRITE_TO_EEPROM; BOOL timeoutStatus = didCommandTimeout( state ); PROCESS_RECORD_JOB_T recordCurrentJob = getCurrentProcessRecordJob(); - RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + NVM_RECORD_TYPE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = getProcessRecord ( job ); // Check if the fapi has finished if ( TRUE == isFlashReady() ) { // Check the integrity of data (the 16 bytes that were written to EEPROM should be read and be checked for each byte) - if ( writtenRecordStatus == NVDATAMGMT_RECORD_NOT_CHECKED ) + if ( writtenRecordStatus == NVM_RECORD_NOT_CHECKED ) { currentTime = getMSTimerCount(); U32 recordFlashAddress = jobSpecs.recordFlashAddress + recordAddressOffset; @@ -274,14 +274,14 @@ // Issue a FAPI read command but only the bytes that were written, so use maxBufferLength readSector( (U32*)recordFlashAddress, (U32*)writtenRecordCheckBuffer, maxBufferLength ); - state = NVDATAMGMT_EXEC_STATE_VERIFY_EEPROM_WRITE; + state = NVM_EXEC_STATE_VERIFY_EEPROM_WRITE; } - else if ( writtenRecordStatus == NVDATAMGMT_RECORD_VALID ) + else if ( writtenRecordStatus == NVM_RECORD_VALID ) { // If the data is valid, and if it is at the end of the write, change to idle if ( jobSpecs.sizeofRecord == recordAddressOffset ) { - state = NVDATAMGMT_EXEC_STATE_IDLE; + state = NVM_EXEC_STATE_IDLE; } else { @@ -291,7 +291,7 @@ U32 memoryPtr = jobSpecs.recordFlashAddress + recordAddressOffset; U08* structPtr = jobSpecs.structAddressPtr + recordAddressOffset; - writtenRecordStatus = NVDATAMGMT_RECORD_NOT_CHECKED; + writtenRecordStatus = NVM_RECORD_NOT_CHECKED; // Issue the write command writeSector( (U32*)memoryPtr, structPtr, MAX_EEPROM_WRITE_BUFFER_BYTES ); @@ -302,7 +302,7 @@ else if ( timeoutStatus == TRUE ) { recordAddressOffset = 0; - state = NVDATAMGMT_EXEC_STATE_IDLE; + state = NVM_EXEC_STATE_IDLE; } return state; @@ -316,14 +316,14 @@ * @details Outputs: None * @return next state *************************************************************************/ -static NVDATAMGMT_EXEC_STATE_T handleExecReadFromEEPROMState ( void ) +static NVM_EXEC_STATE_T handleExecReadFromEEPROMState ( void ) { - NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM; + NVM_EXEC_STATE_T state = NVM_EXEC_STATE_READ_FROM_EEPROM; BOOL timeoutStatus = didCommandTimeout( state ); if ( ( TRUE == isFlashReady() ) || ( TRUE == timeoutStatus ) ) { - state = NVDATAMGMT_EXEC_STATE_IDLE; + state = NVM_EXEC_STATE_IDLE; } return state; @@ -339,12 +339,12 @@ * writtenRecordStatus * @return next state of the state machine *************************************************************************/ -static NVDATAMGMT_EXEC_STATE_T handleExecVerifyEEPROMWriteState ( void ) +static NVM_EXEC_STATE_T handleExecVerifyEEPROMWriteState ( void ) { - NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_VERIFY_EEPROM_WRITE; + NVM_EXEC_STATE_T state = NVM_EXEC_STATE_VERIFY_EEPROM_WRITE; BOOL timeoutStatus = didCommandTimeout( state ); PROCESS_RECORD_JOB_T recordCurrentJob = getCurrentProcessRecordJob(); - RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + NVM_RECORD_TYPE_T job = recordCurrentJob.recordJob; PROCESS_RECORD_SPECS_T jobSpecs = getProcessRecord ( job ); // Check if the flash is ready @@ -361,9 +361,9 @@ if ( writtenRecordCheckBuffer[ i ] != *bufferPtr ) { // Data is not valid. Schedule an erase and write of the record - writtenRecordStatus = NVDATAMGMT_RECORD_NOT_VALID; + writtenRecordStatus = NVM_RECORD_NOT_VALID; enqueueEraseAndWriteSector( job ); - state = NVDATAMGMT_EXEC_STATE_IDLE; + state = NVM_EXEC_STATE_IDLE; // Exit the loop since there is no point to check the rest of data break; } @@ -372,9 +372,9 @@ // Everything is good increment the pointer to check the next byte. bufferPtr++; // Record data is valid so far - writtenRecordStatus = NVDATAMGMT_RECORD_VALID; + writtenRecordStatus = NVM_RECORD_VALID; // Go back write to EEPROM state to continue writing the record data - state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; + state = NVM_EXEC_STATE_WRITE_TO_EEPROM; } } } @@ -384,16 +384,16 @@ /*********************************************************************//** * @brief - * The resetNVDataMgmtPOSTState function resets the NV data management POST + * The resetNVMPOSTState function resets the NV data management POST * state and enqueues all the NV records to be read again from the NV memory. * @details Inputs: none * @details Outputs: nvDataMgmtSelfTestState, nvDataMgmtSelfTestResult * @return none *************************************************************************/ -void resetNVDataMgmtPOSTState( void ) +void resetNVMPOSTState( void ) { updateNVSelfTestResult( SELF_TEST_STATUS_IN_PROGRESS ); - updateNVSelfTestState( NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS ); + updateNVSelfTestState( NVM_SELF_TEST_STATE_READ_RECORDS ); } /*********************************************************************//** @@ -406,7 +406,7 @@ * @param state the state that the command timed out * @return TRUE if a command timed out *************************************************************************/ -static BOOL didCommandTimeout ( NVDATAMGMT_EXEC_STATE_T state ) +static BOOL didCommandTimeout ( NVM_EXEC_STATE_T state ) { BOOL status = FALSE; Index: firmware/App/Services/NVMgmtDD.h =================================================================== diff -u -r43e60a63eae841e599ff9106f43177a8f63d22be -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Services/NVMgmtDD.h (.../NVMgmtDD.h) (revision 43e60a63eae841e599ff9106f43177a8f63d22be) +++ firmware/App/Services/NVMgmtDD.h (.../NVMgmtDD.h) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -30,8 +30,8 @@ void initNVMgmtDD( void ); void signalPowerOffWarning( void ); -void execNVDataMgmt( void ); -void resetNVDataMgmtPOSTState( void ); +void execNVM( void ); +void resetNVMPOSTState( void ); /**@}*/ Index: firmware/App/Services/NVMsgQ.c =================================================================== diff -u -r63c3a65e681810f037718377c6ed5a28c897d0ca -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Services/NVMsgQ.c (.../NVMsgQ.c) (revision 63c3a65e681810f037718377c6ed5a28c897d0ca) +++ firmware/App/Services/NVMsgQ.c (.../NVMsgQ.c) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -30,102 +30,94 @@ // ********** private definitions ********** -#define QUEUE_MAX_SIZE 20U ///< Max queue size. -#define QUEUE_START_INDEX 0U ///< Queue start index. -#define MAX_JOB_DATA_SIZE_BYTES 32U ///< Max bytes per job (32 bytes). -#define NUM_OF_BYTES_PER_RECORD_PAYLOAD ( MAX_MSG_PAYLOAD_SIZE - ( sizeof( U32 ) * 3 ) ) ///< Number of bytes per calibration payload. -#define RECORD_DATA_SEND_INTERVAL_COUNT (MS_PER_SECOND / (5 * TASK_GENERAL_INTERVAL)) ///< Calibration data send time interval in counts. -#define RECORD_DATA_RECEIVE_TIMEOUT_MS (4 * MS_PER_SECOND) ///< Record data receive all the data packets timeout in ms. -#define RECORD_DATA_MAX_MESSAGE_DFFIRENCE 1 ///< Calibration data receive message different from the previous message. -#define RECORD_DATA_FIRST_RECEIVING_MSG_NUM 1 ///< Calibration data first receiving message number. - // Once a new calibration data is available the driver, sets a signal for the defined time. Once the time is out, it turns the signal off. -#define NEW_CAL_AVAILABLE_SIGNAL_TIMEOUT_MS (1 * MS_PER_SECOND) ///< New calibration available signal timeout in milliseconds. +#define NEW_CAL_AVAILABLE_SIGNAL_TIMEOUT_MS (1 * MS_PER_SECOND) ///< New calibration available signal timeout in milliseconds.#define QUEUE_MAX_SIZE 20U ///< Max queue size. +#define QUEUE_MAX_SIZE 20U ///< Max queue size. +#define QUEUE_START_INDEX 0U ///< Queue start index. +#define MAX_JOB_DATA_SIZE_BYTES 32U ///< Max bytes per job (32 bytes). +#define NUM_OF_BYTES_PER_RECORD_PAYLOAD ( MAX_MSG_PAYLOAD_SIZE - ( sizeof( U32 ) * 3 ) ) ///< Number of bytes per calibration payload. +#define RECORD_DATA_SEND_INTERVAL_COUNT (MS_PER_SECOND / (5 * TASK_GENERAL_INTERVAL)) ///< Calibration data send time interval in counts. +#define RECORD_DATA_RECEIVE_TIMEOUT_MS (4 * MS_PER_SECOND) ///< Record data receive all the data packets timeout in ms. +#define RECORD_DATA_MAX_MESSAGE_DFFIRENCE 1 ///< Calibration data receive message different from the previous message. +#define RECORD_DATA_FIRST_RECEIVING_MSG_NUM 1 ///< Calibration data first receiving message number. -/// NVDataMgmt send records states -typedef enum NVDataMgmt_Send_Records_States +/// NVM send records states +typedef enum NVM_Send_Records_States { - NVM_SEND_RECORD_STATE_IDLE = 0, ///< NVDataMgmt process record idle state. - NVM_SEND_RECORD_STATE_SEND, ///< NVDataMgmt process record send record state. - NUM_OF_NVM_SEND_RECORD_STATES ///< Number of NVDataMgmt process records state. + NVM_SEND_RECORD_STATE_IDLE = 0, ///< NVM process record idle state. + NVM_SEND_RECORD_STATE_SEND, ///< NVM process record send record state. + NUM_OF_NVM_SEND_RECORD_STATES ///< Number of NVM process records state. } SEND_RECORD_STATE_T; -/// NVDataMgmt receive records states -typedef enum NVDataMgmt_Receive_Records_States +/// NVM receive records states +typedef enum NVM_Receive_Records_States { - NVM_RECEIVE_RECORD_STATE_IDLE = 0, ///< NVDataMgmt receive record idle. - NVM_RECEIVE_RECORD_STATE_RECEIVE, ///< NVDataMgmt receive record receive. - NUM_OF_NVM_RECEIVE_RECORD_STATES ///< Number of NVDataMgmt receive record. + NVM_RECEIVE_RECORD_STATE_IDLE = 0, ///< NVM receive record idle. + NVM_RECEIVE_RECORD_STATE_RECEIVE, ///< NVM receive record receive. + NUM_OF_NVM_RECEIVE_RECORD_STATES ///< Number of NVM receive record. } RECEIVE_RECORD_STATE_T; /// Memory operations structure. typedef struct { - NVDATAMGMT_OPERATION_STATE_T memoryOperation; ///< Memory operation. - U32 recordFlashAddress; ///< Operation start address. - U08 buffer[ MAX_JOB_DATA_SIZE_BYTES ]; ///< Buffer. - U32 length; ///< Length of a buffer. + NVM_OPERATION_T memoryOperation; ///< Memory operation. + U32 recordFlashAddress; ///< Operation start address. + U08 buffer[ MAX_JOB_DATA_SIZE_BYTES ]; ///< Buffer. + U32 length; ///< Length of a buffer. } MEMORY_OPS_T; -typedef struct -{ - U32 payloadCurrNum; - U32 payloadTotalNum; - U32 length; - U08 data[NUM_OF_BYTES_PER_RECORD_PAYLOAD]; -} DD_NVM_RECORD_PAYLOAD_T; - /// DD institutional values structure. typedef struct { - U32 minRORejectionRatioPCT; ///< Min RO rejection ratio in percent. - F32 minInletWaterCondAlarmLimitUSPCM; ///< Min inlet water conductivity alarm limit in uS/cm. + U32 minRORejectionRatioPCT; ///< Min RO rejection ratio in percent. + F32 minInletWaterCondAlarmLimitUSPCM; ///< Min inlet water conductivity alarm limit in uS/cm. } DD_INSTITUTIONAL_VALUES_T; -/// Process records job structure +/// DD NVM Record Payload typedef struct { - RECORD_JOBS_STATE_T job; - U32 currentMessage; - U32 totalMessages; - U32 payloadLength; - U08 payload[NUM_OF_BYTES_PER_RECORD_PAYLOAD]; -} RECEIVE_RECORD_JOB_T; + U32 payloadCurrNum; ///< Current Chunk number out of total number number of chunks + U32 payloadTotalNum; ///< Total number of chunks in which data is broken be sent + U32 length; ///< Length of data in the current chunk + U08 data[NUM_OF_BYTES_PER_RECORD_PAYLOAD]; ///< Data to be sent +} DD_NVM_SEND_RECORD_PAYLOAD_T; // ********** private data ********** -static PROCESS_RECORD_JOB_T recordJobQueue[ QUEUE_MAX_SIZE ]; ///< Record queue jobs. -static U08 recordQueueRearIndex; ///< Record queue rear index. -static U08 recordQueueFrontIndex; ///< Record queue front index. -static U08 recordQueueCount; ///< Record queue count. -static PROCESS_RECORD_JOB_T recordCurrentJob; ///< Record queue current job. -static NVDATAMGMT_RECORDS_READ_STATUS_T recordsReadStatus; ///< NVDataMgmt records read status. -static BOOL isNewNVRecordAvailable; ///< Signal to indicate whether a new NVM data is available. -static RECORD_JOBS_STATE_T recordToPublish; ///< Record to publish (i.e. calibration, system) -static RECORD_JOBS_STATE_T nvPublishRecordType; -static SEND_RECORD_STATE_T nvMExecSendRecordState; ///< NVDataMgmt exec process record state. -static RECEIVE_RECORD_STATE_T nvmExecReceiveRecordState; ///< NVDataMgmt exec receive record state. -static RECORD_JOBS_STATE_T currentRxRecordType; -static BOOL isPublishRecordRequested[ NUM_OF_NVDATMGMT_RECORDS_JOBS ]; ///< Record state machine publish request flag. -static U32 recordPublishMsgCount; ///< Record data publish message counter. -static U32 recordPublishTotalMsgs; ///< Record data total number of messages to be sent. -static U32 recordSendDataIntervalCounter; ///< Record data send to CAN bust interval counter. -static U32 previousRecordMessageNum; ///< Record previous message number. -static U32 recordUpdateAddress; ///< DD record update address for all the write operations. -static U32 recordReceiveStartTime; ///< Time stamp the calibration/service was received. -static U32 newRecordStartTimer; ///< New record availability start timer. +static PROCESS_RECORD_JOB_T recordJobQueue[ QUEUE_MAX_SIZE ]; ///< Record queue jobs. +static U08 recordQueueRearIndex; ///< Record queue rear index. +static U08 recordQueueFrontIndex; ///< Record queue front index. +static U08 recordQueueCount; ///< Record queue count. +static PROCESS_RECORD_JOB_T recordCurrentJob; ///< Record queue current job. +static NVM_RECORDS_READ_STATUS_T recordsReadStatus; ///< NVM records read status. +static BOOL isNewNVRecordAvailable; ///< Signal to indicate whether a new NVM data is available. +static NVM_RECORD_TYPE_T recordToPublish; ///< Record to publish (i.e. calibration, system) +static NVM_RECORD_TYPE_T nvPublishRecordType; +static SEND_RECORD_STATE_T nvMExecSendRecordState; ///< NVM exec process record state. +static RECEIVE_RECORD_STATE_T nvmExecReceiveRecordState; ///< NVM exec receive record state. +static NVM_RECORD_TYPE_T currentRxRecordType; +static BOOL isPublishRecordRequested[ NUM_OF_NVM_RECORD_TYPES ]; ///< Record state machine publish request flag. +static U32 recordPublishMsgCount; ///< Record data publish message counter. +static U32 recordPublishTotalMsgs; ///< Record data total number of messages to be sent. +static U32 recordSendDataIntervalCounter; ///< Record data send to CAN bust interval counter. +static U32 previousRecordMessageNum; ///< Record previous message number. +static U32 recordUpdateAddress; ///< DD record update address for all the write operations. +static U32 recordReceiveStartTime; ///< Time stamp the calibration/service was received. +static U32 newRecordStartTimer; ///< New record availability start timer. // ********** private function prototypes ********** // Process record functions static SEND_RECORD_STATE_T handleExecSendRecordIdleState( void ); static SEND_RECORD_STATE_T handleExecSendRecordSendState( void ); -static BOOL sendDDRecord( MSG_ID_T msgId, U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* calRcrdAddress ); +static BOOL sendDDRecord( MSG_ID_T msgId, U32 payloadCurrNum, U32 payloadTotalNum, + U32 length, U08* calRcrdAddress ); static BOOL receiveDDRecord( MESSAGE_T *message ); -static BOOL verifyAndSaveReceivedRecord( RECORD_JOBS_STATE_T job, U32 currentMessage, U32 totalMessages, U32 length, U08 *addressPtr ); -static RECORD_JOBS_STATE_T getNVMRecordJobState( MSG_ID_T msgID ); -static MSG_ID_T getNVMRecordResponseMsgId (RECORD_JOBS_STATE_T job ); +static BOOL verifyAndSaveReceivedRecord( NVM_RECORD_TYPE_T job, U32 currentMessage, + U32 totalMessages, U32 length, U08 *addressPtr ); +static NVM_RECORD_TYPE_T getNVMRecordJobState( MSG_ID_T msgID ); +static MSG_ID_T getNVMRecordResponseMsgId (NVM_RECORD_TYPE_T job ); static void monitorNewCalSignal( void ); void initNVMsgQ ( void ) @@ -135,17 +127,17 @@ recordQueueFrontIndex = QUEUE_START_INDEX; recordQueueCount = 0; - recordsReadStatus = NVDATAMGMT_RECORDS_NOT_STARTED; + recordsReadStatus = NVM_RECORDS_NOT_STARTED; isNewNVRecordAvailable = FALSE; nvMExecSendRecordState = NVM_SEND_RECORD_STATE_IDLE; nvmExecReceiveRecordState = NVM_RECEIVE_RECORD_STATE_IDLE; - nvPublishRecordType = NVDATAMGMT_SYSTEM_RECORD; - isPublishRecordRequested[ NVDATAMGMT_SYSTEM_RECORD ] = FALSE; - isPublishRecordRequested[ NVDATAMGMT_SERVICE_RECORD ] = FALSE; - isPublishRecordRequested[ NVDATAMGMT_CALIBRATION_RECORD ] = FALSE; - isPublishRecordRequested[ NVDATAMGMT_INSTITUTIONAL_RECORD ] = FALSE; - isPublishRecordRequested[ NVDATAMGMT_USAGE_INFO_RECORD ] = FALSE; + nvPublishRecordType = NVM_SYSTEM_RECORD; + isPublishRecordRequested[ NVM_SYSTEM_RECORD ] = FALSE; + isPublishRecordRequested[ NVM_SERVICE_RECORD ] = FALSE; + isPublishRecordRequested[ NVM_CALIBRATION_RECORD ] = FALSE; + isPublishRecordRequested[ NVM_INSTITUTIONAL_RECORD ] = FALSE; + isPublishRecordRequested[ NVM_USAGE_INFO_RECORD ] = FALSE; newRecordStartTimer = 0; @@ -158,15 +150,15 @@ /*********************************************************************//** * @brief - * The execNVMSendRecord runs the NVDataMgmt send records related + * The execNVMSendRecord runs the NVM send records related * to tasks. * @details Inputs: nvMExecSendRecordState, * nvmExecReceiveRecordState, recordReceiveStartTime * @details Outputs: nvMExecSendRecordState, * nvmExecReceiveRecordState * @return none *************************************************************************/ -void execNVDataMgmtProcessRecord( void ) +void execNVMProcessRecord( void ) { switch ( nvMExecSendRecordState ) { @@ -194,7 +186,7 @@ if ( TRUE == didTimeout( recordReceiveStartTime, RECORD_DATA_RECEIVE_TIMEOUT_MS ) ) { // Exec receive state machine timed out. Schedule a read to update the structure - enqueueRecordJob( NVDATAMGMT_READ, currentRxRecordType ); + enqueueRecordJob( NVM_OPERATION_READ, currentRxRecordType ); nvmExecReceiveRecordState = NVM_RECEIVE_RECORD_STATE_IDLE; } } @@ -219,7 +211,7 @@ if ( TRUE == isPublishRecordRequested[ nvPublishRecordType ] ) { - recordToPublish = ( RECORD_JOBS_STATE_T )nvPublishRecordType; + recordToPublish = ( NVM_RECORD_TYPE_T )nvPublishRecordType; // Set the publish flag to FALSE isPublishRecordRequested[ recordToPublish ] = FALSE; @@ -239,10 +231,10 @@ state = NVM_SEND_RECORD_STATE_SEND; } - nvPublishRecordType = ( RECORD_JOBS_STATE_T )( nvPublishRecordType + 1 ); - if(nvPublishRecordType >= NUM_OF_NVDATMGMT_RECORDS_JOBS) + nvPublishRecordType = ( NVM_RECORD_TYPE_T )( nvPublishRecordType + 1 ); + if(nvPublishRecordType >= NUM_OF_NVM_RECORD_TYPES) { - nvPublishRecordType = NVDATAMGMT_SYSTEM_RECORD; + nvPublishRecordType = NVM_SYSTEM_RECORD; } return state; @@ -311,7 +303,7 @@ * @param job: type of job (i.e write calibration data) * @return none *************************************************************************/ -void enqueueRecordJob( NVDATAMGMT_OPERATION_STATE_T ops, RECORD_JOBS_STATE_T job ) +void enqueueRecordJob( NVM_OPERATION_T ops, NVM_RECORD_TYPE_T job ) { PROCESS_RECORD_JOB_T currentJob; @@ -396,23 +388,23 @@ return QUEUE_MAX_SIZE - recordQueueCount; } -BOOL enqueueEraseAndWriteSector( RECORD_JOBS_STATE_T job ) +BOOL enqueueEraseAndWriteSector( NVM_RECORD_TYPE_T job ) { BOOL status = FALSE; if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_TO_WRITE_A_RECORD ) { // Service and Calibration record are stored in the same sector. - if( ( job == NVDATAMGMT_SERVICE_RECORD ) || ( job == NVDATAMGMT_CALIBRATION_RECORD ) ) + if( ( job == NVM_SERVICE_RECORD ) || ( job == NVM_CALIBRATION_RECORD ) ) { - enqueueRecordJob( NVDATAMGMT_ERASE_SECTOR, NVDATAMGMT_SERVICE_RECORD ); - enqueueRecordJob( NVDATAMGMT_WRITE, NVDATAMGMT_SERVICE_RECORD ); - enqueueRecordJob( NVDATAMGMT_WRITE, NVDATAMGMT_CALIBRATION_RECORD ); + enqueueRecordJob( NVM_OPERATION_ERASE, NVM_SERVICE_RECORD ); + enqueueRecordJob( NVM_OPERATION_WRITE, NVM_SERVICE_RECORD ); + enqueueRecordJob( NVM_OPERATION_WRITE, NVM_CALIBRATION_RECORD ); } else { - enqueueRecordJob( NVDATAMGMT_ERASE_SECTOR, job ); - enqueueRecordJob( NVDATAMGMT_WRITE, job ); + enqueueRecordJob( NVM_OPERATION_ERASE, job ); + enqueueRecordJob( NVM_OPERATION_WRITE, job ); } status = TRUE; @@ -427,18 +419,18 @@ if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_TO_WRITE_ALL_RECORDS ) { - RECORD_JOBS_STATE_T record; + NVM_RECORD_TYPE_T record; // Erase all the sectors - for ( record = NVDATAMGMT_SYSTEM_RECORD; record < NUM_OF_NVDATMGMT_RECORDS_JOBS; record++ ) + for ( record = NVM_SYSTEM_RECORD; record < NUM_OF_NVM_RECORD_TYPES; record++ ) { - enqueueRecordJob( NVDATAMGMT_ERASE_SECTOR, record ); + enqueueRecordJob( NVM_OPERATION_ERASE, record ); } // Write all the records - for ( record = NVDATAMGMT_SYSTEM_RECORD; record < NUM_OF_NVDATMGMT_RECORDS_JOBS; record++ ) + for ( record = NVM_SYSTEM_RECORD; record < NUM_OF_NVM_RECORD_TYPES; record++ ) { - enqueueRecordJob( NVDATAMGMT_WRITE, record ); + enqueueRecordJob( NVM_OPERATION_WRITE, record ); } status = TRUE; @@ -457,20 +449,20 @@ BOOL enqueueReadAllRecords( void ) { BOOL status = FALSE; - RECORD_JOBS_STATE_T record; + NVM_RECORD_TYPE_T record; if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_TO_READ_ALL_RECORDS ) { - for ( record = NVDATAMGMT_SYSTEM_RECORD; record < NUM_OF_NVDATMGMT_RECORDS_JOBS; record++ ) + for ( record = NVM_SYSTEM_RECORD; record < NUM_OF_NVM_RECORD_TYPES; record++ ) { - enqueueRecordJob( NVDATAMGMT_READ, record ); + enqueueRecordJob( NVM_OPERATION_READ, record ); } status = TRUE; } // Set the status to records were queued successfully - recordsReadStatus = NVDATAMGMT_RECORDS_QUEUED; + recordsReadStatus = NVM_RECORDS_QUEUED; return status; } @@ -482,7 +474,7 @@ * @details Outputs: none * @return recordsReadStatus *************************************************************************/ -NVDATAMGMT_RECORDS_READ_STATUS_T getNVRecordsReadStatus( void ) +NVM_RECORDS_READ_STATUS_T getNVRecordsReadStatus( void ) { return recordsReadStatus; } @@ -502,11 +494,12 @@ * @param recordAddress: start address of the calibration record * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -static BOOL sendDDRecord( MSG_ID_T msgId, U32 payloadCurrNum, U32 payloadTotalNum, U32 length, U08* recordAddress ) +static BOOL sendDDRecord( MSG_ID_T msgId, U32 payloadCurrNum, U32 payloadTotalNum, + U32 length, U08* recordAddress ) { BOOL result = FALSE; U08 payloadLen = 0; - DD_NVM_RECORD_PAYLOAD_T payload; + DD_NVM_SEND_RECORD_PAYLOAD_T payload; payloadLen = sizeof( U32 ) + sizeof( U32 ) + sizeof( U32 ) + length; payload.payloadCurrNum = payloadCurrNum; @@ -528,7 +521,7 @@ U08* payloadPtr = message->payload; U08 minPayloadLen = ( sizeof(currentMessage) + sizeof(totalMessages) + sizeof(payloadLength) ); MSG_ID_T msgID = (MSG_ID_T)message->hdr.msgID; - RECORD_JOBS_STATE_T job = getNVMRecordJobState( msgID ); + NVM_RECORD_TYPE_T job = getNVMRecordJobState( msgID ); // To proceed, the payload length should be valid. And, if it is a service job, then DD mode should also be in service. if ( message->hdr.payloadLen >= minPayloadLen ) @@ -563,7 +556,8 @@ * @param *addressPtr: address to the beginning of the calibration data from Dialin * @return TRUE if the request was successfully registered *************************************************************************/ -static BOOL verifyAndSaveReceivedRecord( RECORD_JOBS_STATE_T job, U32 currentMessage, U32 totalMessages, U32 length, U08 *addressPtr ) +static BOOL verifyAndSaveReceivedRecord( NVM_RECORD_TYPE_T job, U32 currentMessage, + U32 totalMessages, U32 length, U08 *addressPtr ) { BOOL status = TRUE; @@ -606,8 +600,10 @@ // Check if calculated CRC matches the Stored CRC if ( ( calcCRC == recordCRC ) ) { + _disable_IRQ(); // Copy the valid temporary record into the main record spec memcpy(recordSpec.structAddressPtr, tempRxSpec.structAddressPtr, tempRxSpec.sizeofRecord); + _enable_IRQ(); // Enqueue an erase and write of the nvm record status = enqueueEraseAndWriteSector( job ); @@ -644,30 +640,30 @@ return status; } -static RECORD_JOBS_STATE_T getNVMRecordJobState( MSG_ID_T msgID ) +static NVM_RECORD_TYPE_T getNVMRecordJobState( MSG_ID_T msgID ) { - RECORD_JOBS_STATE_T job; + NVM_RECORD_TYPE_T job; switch( msgID ) { case MSG_ID_DD_NVM_SET_CALIBRATION_RECORD: - job = NVDATAMGMT_CALIBRATION_RECORD; + job = NVM_CALIBRATION_RECORD; break; case MSG_ID_DD_NVM_SET_SYSTEM_RECORD: - job = NVDATAMGMT_SYSTEM_RECORD; + job = NVM_SYSTEM_RECORD; break; case MSG_ID_DD_NVM_SET_SERVICE_RECORD: - job = NVDATAMGMT_SERVICE_RECORD; + job = NVM_SERVICE_RECORD; break; case MSG_ID_DD_NVM_SET_INSTITUTIONAL_RECORD: - job = NVDATAMGMT_INSTITUTIONAL_RECORD; + job = NVM_INSTITUTIONAL_RECORD; break; case MSG_ID_DD_NVM_SET_USAGE_INFO_RECORD: - job = NVDATAMGMT_USAGE_INFO_RECORD; + job = NVM_USAGE_INFO_RECORD; break; default: @@ -679,29 +675,29 @@ return job; } -static MSG_ID_T getNVMRecordResponseMsgId( RECORD_JOBS_STATE_T job ) +static MSG_ID_T getNVMRecordResponseMsgId( NVM_RECORD_TYPE_T job ) { MSG_ID_T msgID; switch( job ) { - case NVDATAMGMT_CALIBRATION_RECORD: + case NVM_CALIBRATION_RECORD: msgID = MSG_ID_DD_NVM_SEND_CALIBRATION_RECORD; break; - case NVDATAMGMT_SYSTEM_RECORD: + case NVM_SYSTEM_RECORD: msgID = MSG_ID_DD_NVM_SEND_SYSTEM_RECORD; break; - case NVDATAMGMT_SERVICE_RECORD: + case NVM_SERVICE_RECORD: msgID = MSG_ID_DD_NVM_SEND_SERVICE_RECORD; break; - case NVDATAMGMT_INSTITUTIONAL_RECORD: + case NVM_INSTITUTIONAL_RECORD: msgID = MSG_ID_DD_NVM_SEND_INSTITUTIONAL_RECORD; break; - case NVDATAMGMT_USAGE_INFO_RECORD: + case NVM_USAGE_INFO_RECORD: msgID = MSG_ID_DD_NVM_SEND_USAGE_INFO_RECORD; break; @@ -749,7 +745,7 @@ isNewNVRecordAvailable = value; } -void updateRecordReadStatus( NVDATAMGMT_RECORDS_READ_STATUS_T status ) +void updateRecordReadStatus( NVM_RECORDS_READ_STATUS_T status ) { recordsReadStatus = status; } @@ -774,15 +770,15 @@ BOOL testDDGetNVRecord( MESSAGE_T *message ) { BOOL result = FALSE; - RECORD_JOBS_STATE_T job; + NVM_RECORD_TYPE_T job; // verify payload length if ( 1 == message->hdr.payloadLen ) { - job = ( RECORD_JOBS_STATE_T )message->payload[ 0 ]; + job = ( NVM_RECORD_TYPE_T )message->payload[ 0 ]; // job = getNVMRecordJobState( msgID ); - if ( ( job < NUM_OF_NVDATMGMT_RECORDS_JOBS ) && + if ( ( job < NUM_OF_NVM_RECORD_TYPES ) && ( NVM_SEND_RECORD_STATE_IDLE == nvMExecSendRecordState ) ) { isPublishRecordRequested[ job ] = TRUE; Index: firmware/App/Services/NVMsgQ.h =================================================================== diff -u -r63c3a65e681810f037718377c6ed5a28c897d0ca -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Services/NVMsgQ.h (.../NVMsgQ.h) (revision 63c3a65e681810f037718377c6ed5a28c897d0ca) +++ firmware/App/Services/NVMsgQ.h (.../NVMsgQ.h) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -29,52 +29,52 @@ // ********** public definitions ********** -#define NV_RECORD_SLOT_SIZE 4096 // 4K +#define NV_RECORD_SLOT_SIZE 4096 ///< Size of each NV record slot (4KB) -#define SYSTEM_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) -#define SERVICE_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) -#define CAL_RECORD_OFFSET (1U * NV_RECORD_SLOT_SIZE) -#define INSTIT_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) -#define USAGE_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) +#define SYSTEM_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) ///< Offset of system record within sector +#define SERVICE_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) ///< Offset of service record within sector +#define CAL_RECORD_OFFSET (1U * NV_RECORD_SLOT_SIZE) ///< Offset of calibration record within sector +#define INSTIT_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) ///< Offset of institutional record within sector +#define USAGE_RECORD_OFFSET (0U * NV_RECORD_SLOT_SIZE) ///< Offset of usage record within sector -#define SYSTEM_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR0_START_ADDRESS + SYSTEM_RECORD_OFFSET ) -#define SERVICE_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR1_START_ADDRESS + SERVICE_RECORD_OFFSET ) -#define CAL_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR1_START_ADDRESS + CAL_RECORD_OFFSET ) -#define INSTIT_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR2_START_ADDRESS + INSTIT_RECORD_OFFSET ) -#define USAGE_INFO_START_ADDRESS ( BANK7_SECTOR3_START_ADDRESS + USAGE_RECORD_OFFSET ) ///< DD usage info start address in RTC RAM (48). +#define SYSTEM_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR0_START_ADDRESS + SYSTEM_RECORD_OFFSET ) ///< Start address of system record in NV memory +#define SERVICE_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR1_START_ADDRESS + SERVICE_RECORD_OFFSET ) ///< Start address of service record in NV memory +#define CAL_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR1_START_ADDRESS + CAL_RECORD_OFFSET ) ///< Start address of calibration record in NV memory +#define INSTIT_RECORD_NV_MEM_START_ADDRESS ( BANK7_SECTOR2_START_ADDRESS + INSTIT_RECORD_OFFSET ) ///< Start address of institutional record in NV memory +#define USAGE_INFO_START_ADDRESS ( BANK7_SECTOR3_START_ADDRESS + USAGE_RECORD_OFFSET ) ///< Start address of usage info record in NV memory -#define MAX_NUM_OF_RECORD_IN_A_SECTOR 2 -#define MIN_JOBS_NEEDED_TO_WRITE_A_RECORD ( MAX_NUM_OF_RECORD_IN_A_SECTOR * 2 ) ///< Min queue count needed to erase and write a sector -#define MIN_JOBS_NEEDED_TO_WRITE_ALL_RECORDS ( NUM_OF_NVDATMGMT_RECORDS_JOBS * 2 ) ///< Min queue count needed to erase and write all records -#define MIN_JOBS_NEEDED_TO_READ_ALL_RECORDS ( NUM_OF_NVDATMGMT_RECORDS_JOBS ) ///< Min queue count needed to erase and write all records +#define MAX_NUM_OF_RECORD_IN_A_SECTOR 2 ///< Maximum number of records stored in one sector +#define MIN_JOBS_NEEDED_TO_WRITE_A_RECORD ( MAX_NUM_OF_RECORD_IN_A_SECTOR * 2 ) ///< Minimum queue jobs to erase and write one record +#define MIN_JOBS_NEEDED_TO_WRITE_ALL_RECORDS ( NUM_OF_NVM_RECORD_TYPES * 2 ) ///< Minimum queue jobs to erase and write all records +#define MIN_JOBS_NEEDED_TO_READ_ALL_RECORDS ( NUM_OF_NVM_RECORD_TYPES ) ///< Minimum queue jobs to read all records -/// NVDataMgmt records read status -typedef enum NVDataMgmt_NV_Records_Read_Status +/// NVM records read status +typedef enum NVM_NV_Records_Read_Status { - NVDATAMGMT_RECORDS_NOT_STARTED = 0, ///< NVDataMgmt records not started. - NVDATAMGMT_RECORDS_QUEUED, ///< NVDataMgmt records queued. - NVDATAMGMT_RECORDS_READ, ///< NVDataMgmt records read. - NVDATAMGMT_RECORDS_CRC_CHECKED, ///< NVDataMgmt records CRC checked. - NUM_OF_NVDATAMGMT_READ_RECORDS_STATES, ///< Number of NVDataMgmt read records states. -} NVDATAMGMT_RECORDS_READ_STATUS_T; + NVM_RECORDS_NOT_STARTED = 0, ///< NVM records not started. + NVM_RECORDS_QUEUED, ///< NVM records queued. + NVM_RECORDS_READ, ///< NVM records read. + NVM_RECORDS_CRC_CHECKED, ///< NVM records CRC checked. + NUM_OF_NVM_READ_RECORDS_STATES, ///< Number of NVM read records states. +} NVM_RECORDS_READ_STATUS_T; // ********** public function prototypes ********** void initNVMsgQ ( void ); -void execNVDataMgmtProcessRecord( void ); +void execNVMProcessRecord( void ); // Record operations queue functions -void enqueueRecordJob( NVDATAMGMT_OPERATION_STATE_T ops, RECORD_JOBS_STATE_T job ); +void enqueueRecordJob( NVM_OPERATION_T ops, NVM_RECORD_TYPE_T job ); void dequeueRecordJob( void ); BOOL isRecordQueueEmpty( void ); BOOL isRecordQueueFull( void ); U32 getAvailableRecordQueueCount( void ); -BOOL enqueueEraseAndWriteSector( RECORD_JOBS_STATE_T job ); +BOOL enqueueEraseAndWriteSector( NVM_RECORD_TYPE_T job ); BOOL enqueuewriteAllRecords( void ); BOOL enqueueReadAllRecords( void ); BOOL isNewCalibrationRecordAvailable( void ); void updateNewNVRecordAvailableFlag( BOOL value ); -void updateRecordReadStatus( NVDATAMGMT_RECORDS_READ_STATUS_T status ); +void updateRecordReadStatus( NVM_RECORDS_READ_STATUS_T status ); void updateRecordStartTimer( U32 value ); PROCESS_RECORD_JOB_T getCurrentProcessRecordJob ( void ); Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -r63c3a65e681810f037718377c6ed5a28c897d0ca -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 63c3a65e681810f037718377c6ed5a28c897d0ca) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -27,59 +27,54 @@ // ********** private definitions ********** -#define RECORD_DEFAULT_TIME 0U ///< Record default time (calibration/set). -#define RECORD_FOURTH_ORDER_COEFF 0.0F ///< Record fourth order coefficient. -#define RECORD_THIRD_ORDER_COEFF 0.0F ///< Record third order coefficient. -#define RECORD_SECOND_ORDER_COEFF 0.0F ///< Record second order coefficient. -#define RECORD_DEFAULT_GAIN 1.0F ///< Record default gain. -#define RECORD_DEFAULT_OFFSET 0.0F ///< Record default offset. -#define RECORD_DEFAULT_CONST 0.0F ///< Record default constant. -#define RECORD_DEFAULT_RATIO 1.0F ///< Record default ratio. -#define RECORD_DEFAULT_SERVICE_INTERVAL_S 15768000U ///< Record default service interval in seconds (6 months). -#define RECORD_DEFAULT_CHARACTER ' ' ///< Record default character. +#define RECORD_DEFAULT_TIME 0U ///< Record default time (calibration/set). +#define RECORD_FOURTH_ORDER_COEFF 0.0F ///< Record fourth order coefficient. +#define RECORD_THIRD_ORDER_COEFF 0.0F ///< Record third order coefficient. +#define RECORD_SECOND_ORDER_COEFF 0.0F ///< Record second order coefficient. +#define RECORD_DEFAULT_GAIN 1.0F ///< Record default gain. +#define RECORD_DEFAULT_OFFSET 0.0F ///< Record default offset. +#define RECORD_DEFAULT_CONST 0.0F ///< Record default constant. +#define RECORD_DEFAULT_RATIO 1.0F ///< Record default ratio. +#define RECORD_DEFAULT_SERVICE_INTERVAL_S 15768000U ///< Record default service interval in seconds (6 months). +#define RECORD_DEFAULT_CHARACTER ' ' ///< Record default character. // DD specific defines -#define DEFAULT_FLUSH_LINES_VOLUME_L 0.01F ///< Water volume to flush when starting re-circulate mode in liters. -#define DEFAULT_BICARB_CONC_MIXING_RATIO ( 4.06812F / FRACTION_TO_PERCENT_FACTOR ) ///< Ratio between RO water and bicarbonate concentrate mixing ratio. -#define DEFAULT_BICARB_BOTTLE_VOL_ML 3780.0F ///< Record default bicarb bottle volume in milliliters. -#define DEFAULT_BICARB_COND_US_PER_CM 13734.88F ///< Record default acid conductivity in uS/cm. -#define DEFAULT_BICARB_BOTTLE_TEMP_C 23.5F ///< Record default acid bottle temperature in C. -#define DEFAULT_ACID_CONC_MIXING_RATIO ( 2.35618F / FRACTION_TO_PERCENT_FACTOR ) ///< Ratio between RO water and acid concentrate mixing ratio. -#define DEFAULT_ACID_BOTTLE_VOL_ML 3430.0F ///< Record default acid bottle volume in milliliters. -#define DEFAULT_ACID_COND_US_PER_CM 11645.05F ///< Record default acid conductivity in uS/cm. -#define DEFAULT_ACID_BOTTLE_TEMP_C 23.5F ///< Record default acid bottle temperature in C. -#define DEFAULT_UF_TEMP_TAU_C_PER_MIN -0.6F ///< Ultrafilter temperature time constant C/min. -#define DEFAULT_UF_VOLUME_ML 700 ///< Ultrafilter volume in milliliters. -#define DEFAULT_BLOOD_LEAK_SET_POINT 20 ///< Blood leak default set point. +#define DEFAULT_D12_PUMP_TARGET_SPEED 0 ///< Default D12 dailysate pump target speed. +#define DEFAULT_BICARB_CONC_MIXING_RATIO ( 4.06812F / FRACTION_TO_PERCENT_FACTOR ) ///< Ratio between RO water and bicarbonate concentrate mixing ratio. +#define DEFAULT_BICARB_BOTTLE_VOL_ML 3780.0F ///< Record default bicarb bottle volume in milliliters. +#define DEFAULT_BICARB_COND_US_PER_CM 13734.88F ///< Record default acid conductivity in uS/cm. +#define DEFAULT_BICARB_BOTTLE_TEMP_C 23.5F ///< Record default acid bottle temperature in C. +#define DEFAULT_ACID_CONC_MIXING_RATIO ( 2.35618F / FRACTION_TO_PERCENT_FACTOR ) ///< Ratio between RO water and acid concentrate mixing ratio. +#define DEFAULT_ACID_BOTTLE_VOL_ML 3430.0F ///< Record default acid bottle volume in milliliters. +#define DEFAULT_ACID_COND_US_PER_CM 11645.05F ///< Record default acid conductivity in uS/cm. +#define DEFAULT_ACID_BOTTLE_TEMP_C 23.5F ///< Record default acid bottle temperature in C. +#define DEFAULT_UF_TEMP_TAU_C_PER_MIN -0.6F ///< Ultrafilter temperature time constant C/min. +#define DEFAULT_UF_VOLUME_ML 700 ///< Ultrafilter volume in milliliters. +#define DEFAULT_BLOOD_LEAK_SET_POINT 20 ///< Blood leak default set point. -#define DEFAULT_FILL_1251_1_ACID_SNSR_US_PER_CM 0.0F ///< Fill acid 1251_1 acid sensor conductivity uS/cm. -#define DEFAULT_FILL_1251_1_BIC_SNSR_US_PER_CM 13616.23F ///< Fill acid 1251_1 bicarb sensor conductivity uS/cm. -#define DEFAULT_FILL_2251_0_ACID_SNSR_US_PER_CM 0.0F ///< Fill acid 2251_0 acid sensor conductivity uS/cm. -#define DEFAULT_FILL_2251_0_BIC_SNSR_US_PER_CM 13734.88F ///< Fill acid 2251_0 bicarb sensor conductivity uS/cm. -#define DEFAULT_FILL_3251_9_ACID_SNSR_US_PER_CM 0.0F ///< Fill acid 3251_9 acid sensor conductivity uS/cm. -#define DEFAULT_FILL_3251_9_BIC_SNSR_US_PER_CM 13854.49F ///< Fill acid 3251_9 bicarb sensor conductivity uS/cm. +#define DEFAULT_NUM_OF_DISINFECTION_FREQUENCY 3 ///< Number of Days between each disinfection cycle +#define DEFAULT_NUM_OF_DISINFECTION_CYCLE_TIME 30 ///< Time period of which disinfection is done +#define DEFAULT_MAX_RO_REJECTION_RATIO_PCT 90 ///< Max RO rejection ratio in percent. +#define DEFAULT_MIN_INLET_WATER_COND_ALARM_US_P_CM 200.0F ///< Min inlet water conductivity alarm limit in uS/cm. +#define DEFAULT_MAX_INLET_WATER_COND_ALARM_US_P_CM 50.0F ///< Max inlet water conductivity alarm limit in uS/cm. +#define DEFAULT_ACID_CONCENTRATE_JUG_SIZE 3.43F ///< Acid Concentrate jug size in litres +#define DEFAULT_MIN_ACID_ALARM_US_P_CM 0 ///< Min acid alarm limit in percent. +#define DEFAULT_MIN_BICARB_ALARM_US_P_CM 0 ///< Min bicarb alarm limit in percent. +#define DEFAULT_POST_TREATMENT_DRAIN_OPTION 0 ///< Default Post Treatment Drain Option +#define DEFAULT_POST_TREATMENT_DRY_BICARB_OPTION 0 ///< Default Post Treatment Dry Bicarb Option -#define DEFAULT_ACID_TEST_1251_1_US_PER_CM 13768.28F ///< Acid test acid 1251_1 acid conductivity uS/cm. -#define DEFAULT_ACID_TEST_2251_0_US_PER_CM 13919.05F ///< Acid test acid 2251_0 acid conductivity uS/cm. -#define DEFAULT_ACID_TEST_3251_9_US_PER_CM 14071.04F ///< Acid acid 3251_9 acid conductivity uS/cm. +#define MAX_NUM_OF_WRITE_TRIES 3U ///< Max number of write tries. -#define DEFAULT_BIC_TEST_ACID_SNSR_US_PER_CM 0.0F ///< Bicarb test acid sensor conductivity uS/cm. -#define DEFAULT_BIC_TEST_BIC_SNSR_US_PER_CM 3890.0F ///< Bicarb test bicarb sensor conductivity uS/cm. +#define RECORD_BYTE_SIZE(r) (sizeof(r) + sizeof(U16)) ///< Record byte size macro. -#define DEFAULT_MAX_RO_REJECTION_RATIO_PCT 90 ///< Max RO rejection ratio in percent. -#define DEFAULT_MIN_INLET_WATER_COND_ALARM_US_P_CM 200.0F ///< Min inlet water conductivity alarm limit in uS/cm. - -#define MAX_NUM_OF_WRITE_TRIES 3U ///< Max number of write tries. - -#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. // NOTE: assuming the macro is calculating the padding length for a non-volatile memory. For NV, 16 bytes is used and buffer and for the RTC RAM 64 bytes is used. // If the size of the structure + a 2-byte crc mod 16 is 0, then the size of the padding is 0 // Otherwise, the (((structure size + crc) / 16) + 1) * 16. In the calculations, a + 1 is added since the division has a decimal so + 1 is used // to round up. The result is then multiplied by 16 bytes to get the number of bytes needed and is subtracted from the size of the structure and CRC. -#define RECORD_PADDING_LENGTH(rcrd, buf) (RECORD_BYTE_SIZE(rcrd) % buf == 0 ? 0 : \ - ((((RECORD_BYTE_SIZE(rcrd) / buf) + 1)) * buf) \ - - RECORD_BYTE_SIZE(rcrd)) ///< DG padding length macro. +#define RECORD_PADDING_LENGTH(rcrd, buf) (RECORD_BYTE_SIZE(rcrd) % buf == 0 ? 0 : \ + ((((RECORD_BYTE_SIZE(rcrd) / buf) + 1)) * buf) \ + - RECORD_BYTE_SIZE(rcrd)) ///< DD padding length macro. #pragma pack(push, 1) @@ -91,11 +86,11 @@ DD_PRES_SENSORS_CAL_RECORD_T presSensorsCalRecord; ///< DD pressure sensors calibration record DD_TEMP_SENSORS_CAL_RECORD_T tempSensorsCalRecord; ///< DD temperature sensors calibration record DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsRecord; ///< DD concentrate pumps calibration record - DD_DIALYSATE_PUMPS_CAL_RECORD_T dialysatePumpsRecord; ///< DD dialysate pumps calibration record + DD_D12_DIALYSATE_PUMP_RECORD_T d12DialysatePumpRecord; ///< DD dialysate pump d12 calibration data. + DD_D48_DIALYSATE_PUMP_RECORD_T d48DialysatePumpRecord; ///< DD dialysate pumps calibration record DD_ACID_CONCENTRATES_RECORD_T acidConcentratesRecord; ///< DD acid concentrates calibration record DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentratesRecord; ///< DD bicarb concentrates calibration record DD_ACCEL_SENSOR_CAL_RECORD_T accelerometerSensorCalRecord; ///< DD accelerometer sensor. - DD_CONCENTRATES_COND_CAL_RECORD_T concentratesCondCalRecord; ///< DD fill acid/bicarb target conductivities calibration record. DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T bloodLeakSensorCalRecord; ///< DD blood leak detector calibration record } DD_CALIBRATION_GROUPS_T; @@ -152,13 +147,13 @@ static DD_USAGE_INFO_GROUP_T ddTempRxUsageGrp; ///< DD usage info structure (including padding and final CRC). // Temporary Process records specifications used only for receiving -static PROCESS_RECORD_SPECS_T tempRxRecords[ NUM_OF_NVDATMGMT_RECORDS_JOBS ] = { +static PROCESS_RECORD_SPECS_T tempRxRecords[ NUM_OF_NVM_RECORD_TYPES ] = { // Start address Size of the job Record structure pointer Record CRC pointer Event calibration record update - {SYSTEM_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SYSTEM_GROUP_T), (U08*)&ddTempRxSystemGrp, (U08*)&ddTempRxSystemGrp.crc, DD_EVENT_SYSTEM_RECORD_UPDATE }, // NVDATAMGMT_SYSTEM_RECORD - {SERVICE_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SERVICE_GROUP_T), (U08*)&ddTempRxServiceGrp, (U08*)&ddTempRxServiceGrp.crc, DD_EVENT_SERVICE_UPDATE }, // NVDATAMGMT_SERVICE_RECORD - {CAL_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_CALIBRATION_RECORD_T), (U08*)&ddTempRxCalRecord, (U08*)&ddTempRxCalRecord.crc, DD_EVENT_CAL_RECORD_UPDATE }, // NVDATAMGMT_CALIBRATION_RECORD - {INSTIT_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_INSTITUTIONAL_GROUP_T), (U08*)&ddTempRxInstitGrp, (U08*)&ddTempRxInstitGrp.crc, DD_EVENT_INSTIT_RECORD_UPDATE }, // NVDATAMGMT_INSTITUTIONAL_RECORD - {USAGE_INFO_START_ADDRESS, sizeof(DD_USAGE_INFO_GROUP_T), (U08*)&ddTempRxUsageGrp, (U08*)&ddTempRxUsageGrp.crc, DD_EVENT_USAGE_INFO_UPDATE }, // NVDATAMGMT_USAGE_INFO_RECORD + {SYSTEM_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SYSTEM_GROUP_T), (U08*)&ddTempRxSystemGrp, (U08*)&ddTempRxSystemGrp.crc, DD_EVENT_SYSTEM_RECORD_UPDATE }, // NVM_SYSTEM_RECORD + {SERVICE_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SERVICE_GROUP_T), (U08*)&ddTempRxServiceGrp, (U08*)&ddTempRxServiceGrp.crc, DD_EVENT_SERVICE_UPDATE }, // NVM_SERVICE_RECORD + {CAL_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_CALIBRATION_RECORD_T), (U08*)&ddTempRxCalRecord, (U08*)&ddTempRxCalRecord.crc, DD_EVENT_CAL_RECORD_UPDATE }, // NVM_CALIBRATION_RECORD + {INSTIT_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_INSTITUTIONAL_GROUP_T), (U08*)&ddTempRxInstitGrp, (U08*)&ddTempRxInstitGrp.crc, DD_EVENT_INSTIT_RECORD_UPDATE }, // NVM_INSTITUTIONAL_RECORD + {USAGE_INFO_START_ADDRESS, sizeof(DD_USAGE_INFO_GROUP_T), (U08*)&ddTempRxUsageGrp, (U08*)&ddTempRxUsageGrp.crc, DD_EVENT_USAGE_INFO_UPDATE }, // NVM_USAGE_INFO_RECORD }; // Main NVM Record variables @@ -169,36 +164,37 @@ static DD_USAGE_INFO_GROUP_T ddUsageInfoGroup; ///< DD usage info structure (including padding and final CRC). // Main Process records specifications -const PROCESS_RECORD_SPECS_T RECORDS_SPECS[ NUM_OF_NVDATMGMT_RECORDS_JOBS ] = { +const PROCESS_RECORD_SPECS_T RECORDS_SPECS[ NUM_OF_NVM_RECORD_TYPES ] = { // Start address Size of the job Record structure pointer Record CRC pointer Event calibration record update - {SYSTEM_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SYSTEM_GROUP_T), (U08*)&ddSystemGroup, (U08*)&ddSystemGroup.crc, DD_EVENT_SYSTEM_RECORD_UPDATE }, // NVDATAMGMT_SYSTEM_RECORD - {SERVICE_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SERVICE_GROUP_T), (U08*)&ddServiceGroup, (U08*)&ddServiceGroup.crc, DD_EVENT_SERVICE_UPDATE }, // NVDATAMGMT_SERVICE_RECORD - {CAL_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_CALIBRATION_RECORD_T), (U08*)&ddCalibrationRecord, (U08*)&ddCalibrationRecord.crc, DD_EVENT_CAL_RECORD_UPDATE }, // NVDATAMGMT_CALIBRATION_RECORD - {INSTIT_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_INSTITUTIONAL_GROUP_T), (U08*)&ddInstitutionalGroup, (U08*)&ddInstitutionalGroup.crc, DD_EVENT_INSTIT_RECORD_UPDATE }, // NVDATAMGMT_INSTITUTIONAL_RECORD - {USAGE_INFO_START_ADDRESS, sizeof(DD_USAGE_INFO_GROUP_T), (U08*)&ddUsageInfoGroup, (U08*)&ddUsageInfoGroup.crc, DD_EVENT_USAGE_INFO_UPDATE }, // NVDATAMGMT_USAGE_INFO_RECORD + {SYSTEM_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SYSTEM_GROUP_T), (U08*)&ddSystemGroup, (U08*)&ddSystemGroup.crc, DD_EVENT_SYSTEM_RECORD_UPDATE }, // NVM_SYSTEM_RECORD + {SERVICE_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_SERVICE_GROUP_T), (U08*)&ddServiceGroup, (U08*)&ddServiceGroup.crc, DD_EVENT_SERVICE_UPDATE }, // NVM_SERVICE_RECORD + {CAL_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_CALIBRATION_RECORD_T), (U08*)&ddCalibrationRecord, (U08*)&ddCalibrationRecord.crc, DD_EVENT_CAL_RECORD_UPDATE }, // NVM_CALIBRATION_RECORD + {INSTIT_RECORD_NV_MEM_START_ADDRESS, sizeof(DD_INSTITUTIONAL_GROUP_T), (U08*)&ddInstitutionalGroup, (U08*)&ddInstitutionalGroup.crc, DD_EVENT_INSTIT_RECORD_UPDATE }, // NVM_INSTITUTIONAL_RECORD + {USAGE_INFO_START_ADDRESS, sizeof(DD_USAGE_INFO_GROUP_T), (U08*)&ddUsageInfoGroup, (U08*)&ddUsageInfoGroup.crc, DD_EVENT_USAGE_INFO_UPDATE }, // NVM_USAGE_INFO_RECORD }; -static NVDATAMGMT_SELF_TEST_STATE_T nvDataMgmtSelfTestState; ///< NVDataMgmt self-test state variable. -static SELF_TEST_STATUS_T nvDataMgmtSelfTestResult; ///< NVDataMgmt self-test result. +static NVM_SELF_TEST_STATE_T nvmSelfTestState; ///< NVM self-test state variable. +static SELF_TEST_STATUS_T nvmSelfTestResult; ///< NVM self-test result. static U32 usageWriteTries; ///< Usage write tries. static BOOL isSelfTestReadRecordsDone; ///< Set to true when all the records are read // ********** private function prototypes ********** // Self test functions -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadRecords( void ); -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); +static NVM_SELF_TEST_STATE_T handleSelfTestReadRecords( void ); +static NVM_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); // Record check helper functions static BOOL isPolynomialRecordValid( POLYNOMIAL_CAL_PAYLOAD_T* record ); static BOOL isDDSystemRecordValid( void ); static BOOL isDDServiceRecordValid( void ); +static BOOL isDDInstitutionalRecordValid( void ); static BOOL isDDUsageRecordValid( void ); static BOOL isDDCalibrationRecordValid( void ); +static BOOL isDDPumpD12RecordValid( DD_D12_DIALYSATE_PUMP_RECORD_T* record ); static BOOL isDDAcidConcentrateRecordValid( DD_ACID_CONCENTRATE_T* record ); static BOOL isDDBicarbConcentrateRecordValid( DD_BICARB_CONCENTRATE_T* record ); static BOOL isDDAccelerometerSensorRecordValid( DD_ACCEL_SENSOR_CAL_RECORD_T* record ); -static BOOL isDDFillConductiviesRecordValid( DD_ACID_BICARB_FILL_COND_VALUES_T* record, DD_ACID_TYPES_T acidType, DD_FILL_COND_OPS_T operation ); static BOOL isDDBloodLeakSesnorValid( DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* record ); /*********************************************************************//** @@ -207,55 +203,55 @@ * state and resets related control variables. It sets the self-test * process to start reading records. * @details \b Inputs: none - * @details \b Outputs: nvDataMgmtSelfTestState, - * nvDataMgmtSelfTestResult, usageWriteTries + * @details \b Outputs: nvmSelfTestState, + * nvmSelfTestResult, usageWriteTries * @return none *************************************************************************/ void initNVRecordsDD( void ) { // Initialize the parameters - nvDataMgmtSelfTestState = NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS; - nvDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + nvmSelfTestState = NVM_SELF_TEST_STATE_READ_RECORDS; + nvmSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; usageWriteTries = 0; } /*********************************************************************//** * @brief - * The execNVDataMgmtSelfTest function runs the NV data management + * The execNVMSelfTest function runs the NV data management * self-test state machine. It processes states and updates the result * based on self-test execution. * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT - * @details \b Inputs: nvDataMgmtSelfTestState, - * nvDataMgmtSelfTestResult - * @details \b Outputs: nvDataMgmtSelfTestState, - * nvDataMgmtSelfTestResult - * @return nvDataMgmtSelfTestResult the result of self-test + * @details \b Inputs: nvmSelfTestState, + * nvmSelfTestResult + * @details \b Outputs: nvmSelfTestState, + * nvmSelfTestResult + * @return nvmSelfTestResult the result of self-test *************************************************************************/ -SELF_TEST_STATUS_T execNVDataMgmtSelfTest ( void ) +SELF_TEST_STATUS_T execNVMSelfTest ( void ) { - switch ( nvDataMgmtSelfTestState ) + switch ( nvmSelfTestState ) { - case NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS: - nvDataMgmtSelfTestState = handleSelfTestReadRecords(); + case NVM_SELF_TEST_STATE_READ_RECORDS: + nvmSelfTestState = handleSelfTestReadRecords(); break; - case NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC: - nvDataMgmtSelfTestState = handleSelfTestCheckCRC(); + case NVM_SELF_TEST_STATE_CHECK_CRC: + nvmSelfTestState = handleSelfTestCheckCRC(); break; - case NVDATAMGMT_SELF_TEST_STATE_COMPLETE: + case NVM_SELF_TEST_STATE_COMPLETE: // Done with POST. Do nothing break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_SELF_TEST_STATE, ( U32 )nvDataMgmtSelfTestState ); - nvDataMgmtSelfTestState = NVDATAMGMT_SELF_TEST_STATE_COMPLETE; - nvDataMgmtSelfTestResult = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_SELF_TEST_STATE, ( U32 )nvmSelfTestState ); + nvmSelfTestState = NVM_SELF_TEST_STATE_COMPLETE; + nvmSelfTestResult = SELF_TEST_STATUS_FAILED; break; } - return nvDataMgmtSelfTestResult; + return nvmSelfTestResult; } /*********************************************************************//** @@ -268,7 +264,7 @@ * @return RECORDS_SPECS[job] corresponding process record specification *************************************************************************/ -PROCESS_RECORD_SPECS_T getProcessRecord( RECORD_JOBS_STATE_T job ) +PROCESS_RECORD_SPECS_T getProcessRecord( NVM_RECORD_TYPE_T job ) { return RECORDS_SPECS[ job ]; } @@ -282,7 +278,7 @@ * @param job Record job identifier used to select the temporary RX record * @return tempRxRecords[job] corresponding temporary RX record *************************************************************************/ -PROCESS_RECORD_SPECS_T getTemporaryRxRecord( RECORD_JOBS_STATE_T job ) +PROCESS_RECORD_SPECS_T getTemporaryRxRecord( NVM_RECORD_TYPE_T job ) { return tempRxRecords[ job ]; } @@ -295,17 +291,17 @@ * @details \b Outputs: none * @return state next self-test state *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadRecords( void ) +static NVM_SELF_TEST_STATE_T handleSelfTestReadRecords( void ) { - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS; + NVM_SELF_TEST_STATE_T state = NVM_SELF_TEST_STATE_READ_RECORDS; // Check if the queues are empty and the exec state machine is in Idle meaning // all the records have been read and the state machine // is back at Idle so even the last job in the queue has been processed if ( TRUE == isSelfTestReadRecordsDone ) { - updateRecordReadStatus( NVDATAMGMT_RECORDS_READ ); - state = NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC; + updateRecordReadStatus( NVM_RECORDS_READ ); + state = NVM_SELF_TEST_STATE_CHECK_CRC; } return state; @@ -317,19 +313,19 @@ * compares them with stored CRC values. If they don't match, it will fail POST. * It updates the self-test result * and schedules rewrite for invalid records. - * @details \b Inputs: nvDataMgmtSelfTestResult - * @details \b Outputs: nvDataMgmtSelfTestResult + * @details \b Inputs: nvmSelfTestResult + * @details \b Outputs: nvmSelfTestResult * @return state next self-test state *************************************************************************/ -static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ) +static NVM_SELF_TEST_STATE_T handleSelfTestCheckCRC ( void ) { - NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_COMPLETE; + NVM_SELF_TEST_STATE_T state = NVM_SELF_TEST_STATE_COMPLETE; BOOL hasSystemRecordPassed = TRUE; BOOL hasServiceRecordPassed = TRUE; BOOL haveCalGroupsPassed = TRUE; BOOL hasUsageRecordPassed = TRUE; - updateRecordReadStatus( NVDATAMGMT_RECORDS_CRC_CHECKED ); + updateRecordReadStatus( NVM_RECORDS_CRC_CHECKED ); // Check all the calibration groups haveCalGroupsPassed = isDDCalibrationRecordValid(); @@ -344,24 +340,24 @@ hasSystemRecordPassed = isDDSystemRecordValid(); if ( FALSE == hasSystemRecordPassed ) { - enqueueEraseAndWriteSector ( NVDATAMGMT_SYSTEM_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_SYSTEM_RECORD ].nvEvent, 0, 0 ); + enqueueEraseAndWriteSector ( NVM_SYSTEM_RECORD ); + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_SYSTEM_RECORD ].nvEvent, 0, 0 ); } // Validate service and calibration records hasServiceRecordPassed = isDDServiceRecordValid(); haveCalGroupsPassed = isDDCalibrationRecordValid(); if ( ( FALSE == hasServiceRecordPassed ) || ( FALSE == haveCalGroupsPassed ) ) { - enqueueEraseAndWriteSector ( NVDATAMGMT_SERVICE_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_SERVICE_RECORD ].nvEvent, 0, 0 ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_CALIBRATION_RECORD ].nvEvent, 0, 0 ); + enqueueEraseAndWriteSector ( NVM_SERVICE_RECORD ); + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_SERVICE_RECORD ].nvEvent, 0, 0 ); + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_CALIBRATION_RECORD ].nvEvent, 0, 0 ); } // Validate usage info record if ( FALSE == hasUsageRecordPassed ) { - enqueueEraseAndWriteSector ( NVDATAMGMT_USAGE_INFO_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); + enqueueEraseAndWriteSector ( NVM_USAGE_INFO_RECORD ); + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); } // Check if the records' entire CRCs as well as the individual CRCs passed @@ -370,11 +366,11 @@ { updateRecordStartTimer( getMSTimerCount() ); updateNewNVRecordAvailableFlag( TRUE ); - nvDataMgmtSelfTestResult = SELF_TEST_STATUS_PASSED; + nvmSelfTestResult = SELF_TEST_STATUS_PASSED; } else { - nvDataMgmtSelfTestResult = SELF_TEST_STATUS_FAILED; + nvmSelfTestResult = SELF_TEST_STATUS_FAILED; } return state; @@ -510,6 +506,63 @@ /*********************************************************************//** * @brief + * The isDDInstitutionalRecordValid function checks the validity of the DD + * institutional record. It verifies CRC and updates the record + * with default values if invalid. + * @details \b Alarms: ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC if CRC + * check fails + * @details \b Inputs: ddInstitutionalGroup + * @details \b Outputs: ddInstitutionalGroup + * @return TRUE if the DD Institutional record is valid otherwise FALSE + *************************************************************************/ +static BOOL isDDInstitutionalRecordValid( void ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord, sizeof( DD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = ddInstitutionalGroup.ddInstitutionalRecord.crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default +// ddInstitutionalGroup.ddInstitutionalRecord.minDialysateFlowMLPM = getU32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_FLOW, TRUE ); +// ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateFlowMLPM = getU32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_FLOW, FALSE ); +// ddInstitutionalGroup.ddInstitutionalRecord.minDialysateTempC = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_TEMPERATURE, TRUE ); +// ddInstitutionalGroup.ddInstitutionalRecord.maxDialysateTempC = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_TEMPERATURE, FALSE ); +// ddInstitutionalGroup.ddInstitutionalRecord.acidConcentrate = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_ACID_CONCENTRATE, FALSE ); + +// ddInstitutionalGroup.ddInstitutionalRecord.bicarbCartridgeSizeG = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_TEMPERATURE, FALSE ); +// ddInstitutionalGroup.ddInstitutionalRecord.minSodiumMEQL = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_TEMPERATURE, FALSE ); +// ddInstitutionalGroup.ddInstitutionalRecord.maxSodiumMEQL = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_TEMPERATURE, FALSE ); +// ddInstitutionalGroup.ddInstitutionalRecord.minBicarbonateMEQL = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_TEMPERATURE, FALSE ); +// ddInstitutionalGroup.ddInstitutionalRecord.maxBicarbonateMEQL = getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_DIALYSATE_TEMPERATURE, FALSE ); + + ddInstitutionalGroup.ddInstitutionalRecord.minRORejectionRatioPCT = DEFAULT_MAX_RO_REJECTION_RATIO_PCT; + ddInstitutionalGroup.ddInstitutionalRecord.disinfectionFrequency = DEFAULT_NUM_OF_DISINFECTION_FREQUENCY; + ddInstitutionalGroup.ddInstitutionalRecord.disinfectionCycleTime = DEFAULT_NUM_OF_DISINFECTION_CYCLE_TIME; + ddInstitutionalGroup.ddInstitutionalRecord.minInletWaterCondAlarmLimitUSPCM = DEFAULT_MIN_INLET_WATER_COND_ALARM_US_P_CM; + ddInstitutionalGroup.ddInstitutionalRecord.maxInletWaterCondAlarmLimitUSPCM = DEFAULT_MAX_INLET_WATER_COND_ALARM_US_P_CM; + ddInstitutionalGroup.ddInstitutionalRecord.acidConcentrateJugSizeL = DEFAULT_ACID_CONCENTRATE_JUG_SIZE; + ddInstitutionalGroup.ddInstitutionalRecord.minAcidAlarmLimitPCT = DEFAULT_MIN_ACID_ALARM_US_P_CM; + ddInstitutionalGroup.ddInstitutionalRecord.minBicarbAlarmLimitPCT = DEFAULT_MIN_BICARB_ALARM_US_P_CM; + ddInstitutionalGroup.ddInstitutionalRecord.postTreatDrainOption = DEFAULT_POST_TREATMENT_DRAIN_OPTION; + ddInstitutionalGroup.ddInstitutionalRecord.postTreatDryBicarbOption = DEFAULT_POST_TREATMENT_DRY_BICARB_OPTION; + + +// ddInstitutionalGroup.ddInstitutionalRecord.calibrationTime = getRTCTimestamp(); + ddInstitutionalGroup.ddInstitutionalRecord.crc = crc16 ( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord, + sizeof( DD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); + ddInstitutionalGroup.crc = crc16 ( (U08*)&ddInstitutionalGroup, sizeof( DD_INSTITUTIONAL_GROUP_T ) - sizeof( U16 ) ); + status = FALSE; + + // Institutional record failure is also considered as RTC RAM failure + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_INSTITUTIONAL_RECORD_CRC ); + } + + return status; +} + +/*********************************************************************//** + * @brief * The isDDUsageRecordValid function checks the validity of the DD * usage information record. It verifies CRC and updates the record * with default values if invalid. @@ -599,14 +652,15 @@ isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; } - DD_DIALYSATE_PUMPS_CAL_RECORD_T* dialPump = &ddCalibrationRecord.ddCalibrationGroups.dialysatePumpsRecord; - for ( i = 0; i < NUM_OF_DIALYSATE_PUMPS; i++ ) - { - record = &dialPump->dialysatePump[ i ]; - isHardwareRecordValid = isPolynomialRecordValid( record ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - } + DD_D12_DIALYSATE_PUMP_RECORD_T* d12Pump = &ddCalibrationRecord.ddCalibrationGroups.d12DialysatePumpRecord; + isHardwareRecordValid = isDDPumpD12RecordValid( &d12Pump ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DD_D48_DIALYSATE_PUMP_RECORD_T* d48Pump = &ddCalibrationRecord.ddCalibrationGroups.d48DialysatePumpRecord; + record = &d48Pump->d48DialysatePump; + isHardwareRecordValid = isPolynomialRecordValid( record ); + isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; + DD_ACID_CONCENTRATES_RECORD_T* acidConc = &ddCalibrationRecord.ddCalibrationGroups.acidConcentratesRecord; for ( i = 0; i < NUM_OF_CAL_DATA_ACID_CONCENTRATES; i++ ) { @@ -625,17 +679,6 @@ isHardwareRecordValid = isDDAccelerometerSensorRecordValid( accelerometer ); isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - DD_FILL_COND_OPS_T j; - DD_CONCENTRATES_COND_CAL_RECORD_T* acidBicarbTempRecord = &ddCalibrationRecord.ddCalibrationGroups.concentratesCondCalRecord; - for ( i = 0; i < NUM_OF_ACID_TYPE; i++ ) - { - for ( j = FILL_COND_NORMAL_OP; j < NUM_OF_FILL_COND_TEST; j++ ) - { - isHardwareRecordValid = isDDFillConductiviesRecordValid( &acidBicarbTempRecord->fillCondValues[ i ][ j ], (DD_ACID_TYPES_T)i, (DD_FILL_COND_OPS_T)j ); - isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; - } - } - DD_BLOOD_LEAK_SENSOR_CAL_RECORD_T* bloodLeak = &ddCalibrationRecord.ddCalibrationGroups.bloodLeakSensorCalRecord; isHardwareRecordValid = isDDBloodLeakSesnorValid( bloodLeak ); isCalRecordValid = isCalRecordValid == FALSE ? FALSE : isHardwareRecordValid; @@ -655,6 +698,34 @@ /*********************************************************************//** * @brief + * The isDDPumpD12RecordValid function checks if the D12 Dialysate Pump + * record is valid. It verifies CRC and updates + * the record with default values if invalid. + * @details \b Inputs: none + * @details \b Outputs: none + * @param record Pointer to DD D12 Dialysate record to check + * @return TRUE if the record is valid otherwise FALSE + *************************************************************************/ +static BOOL isDDPumpD12RecordValid( DD_D12_DIALYSATE_PUMP_RECORD_T* record ) +{ + BOOL status = TRUE; + U16 calcCRC = crc16 ( (U08*)record, sizeof( DD_D12_DIALYSATE_PUMP_RECORD_T ) - sizeof( U16 ) ); + U16 recordCRC = record->crc; + + if ( calcCRC != recordCRC ) + { + // CRC did not pass so set all values to default + record->targetPumpSpeed = DEFAULT_D12_PUMP_TARGET_SPEED; + record->calibrationTime = RECORD_DEFAULT_TIME; + record->crc = crc16 ( (U08*)record, sizeof( DD_D12_DIALYSATE_PUMP_RECORD_T ) - sizeof( U16 ) ); + status = FALSE; + } + + return status; +} + +/*********************************************************************//** + * @brief * The isDDAcidConcentrateRecordValid function checks if the acid * concentrate calibration record is valid. It verifies CRC and updates * the record with default values if invalid. @@ -749,108 +820,6 @@ /*********************************************************************//** * @brief - * The isDDFillConductiviesRecordValid function checks if the fill - * conductivity record is valid. It verifies CRC and updates the record - * with default values based on operation and acid type if invalid. - * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT if invalid acidType or - * operation is detected - * @details \b Inputs: none - * @details \b Outputs: none - * @param record Pointer to fill conductivity record to check - * @param acidType Type of acid for which values are checked - * @param operation Type of fill operation being checked - * @return TRUE if the record is valid otherwise FALSE - *************************************************************************/ -static BOOL isDDFillConductiviesRecordValid( DD_ACID_BICARB_FILL_COND_VALUES_T* record, - DD_ACID_TYPES_T acidType, DD_FILL_COND_OPS_T operation ) -{ - BOOL status = TRUE; - U16 calcCRC = crc16 ( (U08*)record, sizeof(DD_ACID_BICARB_FILL_COND_VALUES_T) - sizeof(U16) ); - U16 recordCRC = record->crc; - - if ( calcCRC != recordCRC ) - { - F32 acidSensorCond = 0.0F; - F32 bicarbSensorCond = 0.0F; - - switch ( operation ) - { - case FILL_COND_NORMAL_OP: - switch ( acidType ) - { - case ACID_08_1251_1: - acidSensorCond = DEFAULT_FILL_1251_1_ACID_SNSR_US_PER_CM; - bicarbSensorCond = DEFAULT_FILL_1251_1_BIC_SNSR_US_PER_CM; - break; - - case ACID_08_2251_0: - acidSensorCond = DEFAULT_FILL_2251_0_ACID_SNSR_US_PER_CM; - bicarbSensorCond = DEFAULT_FILL_2251_0_BIC_SNSR_US_PER_CM; - break; - - case ACID_08_3251_9: - acidSensorCond = DEFAULT_FILL_3251_9_ACID_SNSR_US_PER_CM; - bicarbSensorCond = DEFAULT_FILL_3251_9_BIC_SNSR_US_PER_CM; - break; - - default: - // TODO software fault - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )acidType ); - break; - } - break; - - case FILL_COND_ACID_TEST: - switch ( acidType ) - { - case ACID_08_1251_1: - acidSensorCond = DEFAULT_ACID_TEST_1251_1_US_PER_CM; - bicarbSensorCond = DEFAULT_ACID_TEST_1251_1_US_PER_CM; - break; - - case ACID_08_2251_0: - acidSensorCond = DEFAULT_ACID_TEST_2251_0_US_PER_CM; - bicarbSensorCond = DEFAULT_ACID_TEST_2251_0_US_PER_CM; - break; - - case ACID_08_3251_9: - acidSensorCond = DEFAULT_ACID_TEST_3251_9_US_PER_CM; - bicarbSensorCond = DEFAULT_ACID_TEST_3251_9_US_PER_CM; - break; - - default: - // TODO software fault - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )acidType ); - break; - } - break; - - case FILL_COND_BICARB_TEST: - acidSensorCond = DEFAULT_BIC_TEST_ACID_SNSR_US_PER_CM; - bicarbSensorCond = DEFAULT_BIC_TEST_BIC_SNSR_US_PER_CM; - break; - - default: - // Software fault - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )operation ); - break; - } - - // CRC did not pass so set all values to default - record->acidConduSPerCM = acidSensorCond; - record->bicarbConduSPerCM = bicarbSensorCond; - record->calibrationTime = RECORD_DEFAULT_TIME; - record->crc = crc16 ( (U08*)record, sizeof(DD_ACID_BICARB_FILL_COND_VALUES_T) - sizeof(U16) ); - - // Set the to FALSE since the record is not valid - status = FALSE; - } - - return status; -} - -/*********************************************************************//** - * @brief * The isDDBloodLeakSesnorValid function checks if the blood leak sensor * calibration record is valid. It verifies CRC and updates the record * with default values if invalid. @@ -924,8 +893,8 @@ usageWriteTries = 0; status = TRUE; - enqueueEraseAndWriteSector( NVDATAMGMT_USAGE_INFO_RECORD ); - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); + enqueueEraseAndWriteSector( NVM_USAGE_INFO_RECORD ); + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); } else if ( ++usageWriteTries > MAX_NUM_OF_WRITE_TRIES ) { @@ -965,11 +934,11 @@ ddUsageInfoGroup.crc = crc16( (U08*)&ddUsageInfoGroup, sizeof( DD_USAGE_INFO_GROUP_T ) - sizeof( U16 ) ); // Service record has been touched so the entire sector 0 of the EEPROM must be rewritten - enqueueEraseAndWriteSector( NVDATAMGMT_SERVICE_RECORD ); - enqueueEraseAndWriteSector( NVDATAMGMT_USAGE_INFO_RECORD ); + enqueueEraseAndWriteSector( NVM_SERVICE_RECORD ); + enqueueEraseAndWriteSector( NVM_USAGE_INFO_RECORD ); // Both the usage and service records have been updated - SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVDATAMGMT_USAGE_INFO_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[ NVM_USAGE_INFO_RECORD ].nvEvent, 0, 0 ); + SEND_EVENT_WITH_2_U32_DATA( RECORDS_SPECS[ NVM_SERVICE_RECORD ].nvEvent, 0, 0 ); status = TRUE; } @@ -1054,6 +1023,18 @@ isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.concentratePumpsRecord.concentratePumps[ i ].calibrationTime ? TRUE : FALSE ); break; + case GET_CAL_D12_PUMP_RECORD: + nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.d12DialysatePumpRecord; + nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.d12DialysatePumpRecord ); + isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.d12DialysatePumpRecord.calibrationTime ? TRUE : FALSE ); + break; + + case GET_CAL_D48_PUMP_RECORD: + nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.d48DialysatePumpRecord; + nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.d48DialysatePumpRecord ); + isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.d48DialysatePumpRecord.d48DialysatePump.calibrationTime ? TRUE : FALSE ); + break; + case GET_CAL_ACID_CONCENTREATES: nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.acidConcentratesRecord; nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.acidConcentratesRecord ); @@ -1073,35 +1054,18 @@ isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.accelerometerSensorCalRecord.calibrationTime ? TRUE : FALSE ); break; - case GET_CAL_FILL_CONDUCTIVITIES_RECORD: - { - DD_FILL_COND_OPS_T fillOps; - - nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.concentratesCondCalRecord.fillCondValues; - nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.concentratesCondCalRecord.fillCondValues ); - - for ( i = 0; i < numOfSnsrs2Check; i++ ) - { - for ( fillOps = FILL_COND_NORMAL_OP; fillOps < NUM_OF_FILL_COND_TEST; fillOps++ ) - { - isNVDataInvalid |= ( 0 == ddCalibrationRecord.ddCalibrationGroups.concentratesCondCalRecord.fillCondValues[ i ][ fillOps ].calibrationTime ? TRUE : FALSE ); - } - } - } - break; - case GET_CAL_BLOOD_LEAK_SENSOR: nvDataStartPtr = (U08*)&ddCalibrationRecord.ddCalibrationGroups.bloodLeakSensorCalRecord; nvDataLength = sizeof( ddCalibrationRecord.ddCalibrationGroups.bloodLeakSensorCalRecord ); isNVDataInvalid = ( 0 == ddCalibrationRecord.ddCalibrationGroups.bloodLeakSensorCalRecord.calibrationTime ? TRUE : FALSE ); break; - case GET_SYS_RECORD: + case GET_SYSTEM_RECORD: nvDataStartPtr = (U08*)&ddSystemGroup.ddSystemRecord; nvDataLength = sizeof( ddSystemGroup.ddSystemRecord ); break; - case GET_SRV_RECORD: + case GET_SERVICE_RECORD: nvDataStartPtr = (U08*)&ddServiceGroup.ddServiceRecord; nvDataLength = sizeof( ddServiceGroup.ddServiceRecord ); break; @@ -1152,27 +1116,27 @@ * The updateNVSelfTestResult function updates the NV data management * self-test result with the provided value. * @details \b Inputs: none - * @details \b Outputs: nvDataMgmtSelfTestResult + * @details \b Outputs: nvmSelfTestResult * @param result Self-test result to be updated * @return none *************************************************************************/ void updateNVSelfTestResult( SELF_TEST_STATUS_T result ) { - nvDataMgmtSelfTestResult = result; + nvmSelfTestResult = result; } /*********************************************************************//** * @brief * The updateNVSelfTestState function updates the NV data management * self-test state with the provided value. * @details \b Inputs: none - * @details \b Outputs: nvDataMgmtSelfTestState + * @details \b Outputs: nvmSelfTestState * @param state Self-test state to be updated * @return none *************************************************************************/ -void updateNVSelfTestState( NVDATAMGMT_SELF_TEST_STATE_T state ) +void updateNVSelfTestState( NVM_SELF_TEST_STATE_T state ) { - nvDataMgmtSelfTestState = state; + nvmSelfTestState = state; } /*********************************************************************//** @@ -1211,27 +1175,27 @@ BOOL testSetNVRecordCRCOverride( U32 job, U16 crc ) { BOOL status = FALSE; - RECORD_JOBS_STATE_T nvJob = (RECORD_JOBS_STATE_T)job; + NVM_RECORD_TYPE_T nvJob = (NVM_RECORD_TYPE_T)job; switch( nvJob ) { - case NVDATAMGMT_CALIBRATION_RECORD: + case NVM_CALIBRATION_RECORD: ddCalibrationRecord.crc = crc; break; - case NVDATAMGMT_SYSTEM_RECORD: + case NVM_SYSTEM_RECORD: ddSystemGroup.ddSystemRecord.crc = crc; break; - case NVDATAMGMT_SERVICE_RECORD: + case NVM_SERVICE_RECORD: ddServiceGroup.ddServiceRecord.crc = crc; break; - case NVDATAMGMT_INSTITUTIONAL_RECORD: + case NVM_INSTITUTIONAL_RECORD: ddInstitutionalGroup.ddInstitutionalRecord.crc = crc; break; - case NVDATAMGMT_USAGE_INFO_RECORD: + case NVM_USAGE_INFO_RECORD: ddUsageInfoGroup.ddUsageInfo.crc = crc; break; Index: firmware/App/Services/NVRecordsDD.h =================================================================== diff -u -r63c3a65e681810f037718377c6ed5a28c897d0ca -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision 63c3a65e681810f037718377c6ed5a28c897d0ca) +++ firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -49,14 +49,14 @@ #define GENERIC_VOL_RESERVED_SPACE_COUNT 4 ///< Generic volumes reserved space count. #define MAX_EEPROM_WRITE_BUFFER_BYTES 16U ///< Max allowed bytes for an EEPROM write (16 bytes). -/// NVDataMgmt self-test states enumeration. -typedef enum NVDataMgmt_Self_Test_States +/// NVM self-test states enumeration. +typedef enum NVM_Self_Test_States { - NVDATAMGMT_SELF_TEST_STATE_READ_RECORDS = 0, ///< Self test read records. - 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; + NVM_SELF_TEST_STATE_READ_RECORDS = 0, ///< Self test read records. + NVM_SELF_TEST_STATE_CHECK_CRC, ///< Self test check CRC. + NVM_SELF_TEST_STATE_COMPLETE, ///< Self test complete. + NUM_OF_NVM_SELF_TEST_STATES ///< Total number of self-test states. +} NVM_SELF_TEST_STATE_T; /// Process records specifications structure typedef struct @@ -74,14 +74,15 @@ GET_CAL_PRESSURE_SENOSRS = 0, ///< Get pressure sensors calibration data. GET_CAL_TEMP_SENSORS, ///< Get temperature sensors calibration data. GET_CAL_CONCENTRATE_PUMPS_RECORD, ///< Get concentrate pumps calibration record. - GET_CAL_DIALYSATE_PUMPS_RECORD, + GET_CAL_D12_PUMP_RECORD, ///< Get D12 dialysate pump calibration record. + GET_CAL_D48_PUMP_RECORD, ///< Get D48 dialysate pump calibration record. + GET_CAL_DIALYSATE_PUMPS_RECORD, ///< Get dialysate pumps calibration record. GET_CAL_ACID_CONCENTREATES, ///< Get acid concentrates calibration data. GET_CAL_BICARB_CONCENTRATES, ///< Get bicarb concentrates calibration data. GET_CAL_ACCEL_SENSORS, ///< Get accelerometers calibration data. - GET_CAL_FILL_CONDUCTIVITIES_RECORD, ///< Get fill conductivities record. GET_CAL_BLOOD_LEAK_SENSOR, - GET_SYS_RECORD, ///< Get system record. - GET_SRV_RECORD, ///< Get service record. + GET_SYSTEM_RECORD, ///< Get system record. + GET_SERVICE_RECORD, ///< Get service record. GET_INSTITUTIONAL_RECORD, ///< Get institutional record. GET_USAGE_RECORD, ///< Get usage record. NUM_OF_NV_DD_DATA ///< Number of non-volatile data. @@ -128,15 +129,6 @@ NUM_OF_USAGE_INFO_ITEMS ///< Number of usage info items. } DD_USAGE_INFO_ITEMS_T; -/// DD fill conductivity tests -typedef enum DD_conductivity_ops -{ - FILL_COND_NORMAL_OP = 0, ///< Fill conductivity normal operation. - FILL_COND_ACID_TEST, ///< Fill conductivity acid test. - FILL_COND_BICARB_TEST, ///< Fill conductivity bicarb test. - NUM_OF_FILL_COND_TEST ///< Number of fill conductivity test. -} DD_FILL_COND_OPS_T; - #pragma pack(push, 1) /// Polynomial calibration structure typedef struct @@ -168,19 +160,19 @@ POLYNOMIAL_CAL_PAYLOAD_T concentratePumps[ NUM_OF_CONCENTRATE_PUMPS ]; ///< DD concentrate pumps calibration data. } DD_CONC_PUMPS_CAL_RECORD_T; -/// DD dialysate pump calibration structure +/// DD D12 dialysate pump calibration structure typedef struct { - float targetPumpSpeed[ NUM_OF_DIALYSATE_PUMPS ]; ///< Target Pump Speed + F32 targetPumpSpeed; ///< Target Pump Speed U32 calibrationTime; ///< Calibration time. U16 crc; ///< CRC for the polynomial calibration payload. -} DD_DIALYSATE_PUMP_DATA_T; +} DD_D12_DIALYSATE_PUMP_RECORD_T; /// DD dialysate pumps calibration record typedef struct { - DD_DIALYSATE_PUMP_DATA_T dialysatePump[ NUM_OF_DIALYSATE_PUMPS ]; ///< DD dialysate pumps calibration data. -} DD_DIALYSATE_PUMPS_CAL_RECORD_T; + POLYNOMIAL_CAL_PAYLOAD_T d48DialysatePump; ///< DD dialysate pump d48 calibration data. +} DD_D48_DIALYSATE_PUMP_RECORD_T; /// DD acid concentrate typedef struct @@ -226,21 +218,6 @@ U16 crc; ///< CRC for the DD accelerometer sensor. } DD_ACCEL_SENSOR_CAL_RECORD_T; -/// DD acid and bicarb fill conductivity values -typedef struct -{ - F32 acidConduSPerCM; ///< Acid conductivity uS/cm. - F32 bicarbConduSPerCM; ///< Bicarb conductivity uS/cm. - U32 calibrationTime; ///< Calibration time. - U16 crc; ///< CRC for the acid/bicarb fill conductivity values. -} DD_ACID_BICARB_FILL_COND_VALUES_T; - -/// DD acid and bicarb fill conductivity record -typedef struct -{ - DD_ACID_BICARB_FILL_COND_VALUES_T fillCondValues[ NUM_OF_ACID_TYPE ][ NUM_OF_FILL_COND_TEST ]; ///< Acid and bicarb fill conductivity values. -} DD_CONCENTRATES_COND_CAL_RECORD_T; - /// DD blood leak calibration structure typedef struct { @@ -318,16 +295,16 @@ // ********** public function prototypes ********** void initNVRecordsDD( void ); -SELF_TEST_STATUS_T execNVDataMgmtSelfTest ( void ); -PROCESS_RECORD_SPECS_T getProcessRecord( RECORD_JOBS_STATE_T job ); -PROCESS_RECORD_SPECS_T getTemporaryRxRecord( RECORD_JOBS_STATE_T job ); +SELF_TEST_STATUS_T execNVMSelfTest ( void ); +PROCESS_RECORD_SPECS_T getProcessRecord( NVM_RECORD_TYPE_T job ); +PROCESS_RECORD_SPECS_T getTemporaryRxRecord( NVM_RECORD_TYPE_T job ); void benignPolynomialCalRecord( POLYNOMIAL_CAL_PAYLOAD_T* record ); BOOL setLastDisinfectDate( DD_USAGE_INFO_ITEMS_T disinfect, U32 epochTime ); BOOL setServiceTime( void ); BOOL getNVRecord2Driver( NV_DATA_T nvData, U08* bufferAddress, U32 bufferLength, U08 numOfSnsrs2Check, ALARM_ID_T nvAlarm ); void updateNVSelfTestResult( SELF_TEST_STATUS_T result ); -void updateNVSelfTestState( NVDATAMGMT_SELF_TEST_STATE_T state ); +void updateNVSelfTestState( NVM_SELF_TEST_STATE_T state ); void updateSelfTestReadRecordsFlag ( BOOL value ); BOOL testSetNVRecordCRCOverride( U32 job, U16 crc ); /**@}*/ Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -rd210786d6c7d75bb0b4d9e18efc40a01d85123fe -re17e1dc97bf8878056f1f7e4aa861c2448db52bc --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision d210786d6c7d75bb0b4d9e18efc40a01d85123fe) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision e17e1dc97bf8878056f1f7e4aa861c2448db52bc) @@ -123,7 +123,7 @@ // Run non-volatile data management state machine that sends the data record // to Dialin - //execNVDataMgmtProcessRecord(); + //execNVMProcessRecord(); // Run alarm management execAlarmMgmt();