Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r046bc2b62cf942b7e846fa5bff698b94238edf24 -r0face6417892ea9de28d146bf88d44a9f30cf2a4 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 046bc2b62cf942b7e846fa5bff698b94238edf24) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 0face6417892ea9de28d146bf88d44a9f30cf2a4) @@ -153,6 +153,14 @@ SW_FAULT_ID_BICARB_CHAMBER_FILL_INVALID_EXEC_STATE = 122, SW_FAULT_ID_DRY_BICART_DRAIN_INVALID_EXEC_STATE = 123, SW_FAULT_ID_INVALID_RINSE_PUMP = 124, + SW_FAULT_ID_NVM_INVALID_EXEC_STATE = 125, + SW_FAULT_ID_NVM_INVALID_EXEC_SEND_STATE = 126, + SW_FAULT_ID_NVM_INVALID_SELF_TEST_STATE = 127, + SW_FAULT_ID_NVM_INVALID_USAGE_INFO_SELECTED = 128, + SW_FAULT_ID_NVM_WRITE_USAGE_INFO_FAILURE = 129, + SW_FAULT_ID_NVM_INVALID_RECORD_SELECTED = 130, + SW_FAULT_ID_NVM_OPS_TIMEOUT = 131, + SW_FAULT_ID_NVM_INVALID_OPS = 132, NUM_OF_SW_FAULT_IDS } DD_SW_FAULT_ID_T; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rb442c93bd71649c2e7473c7013d32c534334cdcb -r0face6417892ea9de28d146bf88d44a9f30cf2a4 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision b442c93bd71649c2e7473c7013d32c534334cdcb) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 0face6417892ea9de28d146bf88d44a9f30cf2a4) @@ -268,6 +268,11 @@ { MSG_ID_DD_BICART_DRAIN_REQUEST_OVERRIDE_REQUEST, &testDryBiCartDrainRequestOverride }, { MSG_ID_DD_BICART_CARTRIDGE_SELECT_OVERRIDE_REQUEST, &testDryBiCartTypeOverride }, { MSG_ID_DD_NVM_GET_RECORD, &testDDGetNVRecord }, + { MSG_ID_DD_NVM_SET_SYSTEM_RECORD, &testDDSetNVSystemRecord }, + { MSG_ID_DD_NVM_SET_SERVICE_RECORD, &testDDSetNVServiceRecord }, + { MSG_ID_DD_NVM_SET_CALIBRATION_RECORD, &testDDSetNVCalibrationRecord }, + { MSG_ID_DD_NVM_SET_INSTITUTIONAL_RECORD, &testDDSetNVInstitutionalRecord }, + { MSG_ID_DD_NVM_SET_USAGE_INFO_RECORD, &testDDSetNVUsageInfoRecord }, { MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRORejectionRatioDataPublishIntervalOverride }, { MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, &testRORejectionRatioFilteredOverride }, { MSG_ID_FP_SET_TEST_CONFIGURATION, &testSetTestConfiguration }, Index: firmware/App/Services/NVMgmtDD.c =================================================================== diff -u -rf525d2be1e7038cacbe2bb34b8db3505cf26a350 -r0face6417892ea9de28d146bf88d44a9f30cf2a4 --- firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision f525d2be1e7038cacbe2bb34b8db3505cf26a350) +++ firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision 0face6417892ea9de28d146bf88d44a9f30cf2a4) @@ -84,7 +84,7 @@ initNVDriver(); initNVMsgQ(); initNVRecordsDD(); - enqueuePOSTReadRecords(); + enqueueReadAllRecords(); } /*********************************************************************//** @@ -133,7 +133,7 @@ break; default: -// SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVDATAMGMT_EXEC_INVALID_STATE, nvDataMgmtExecState ); + 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; break; } @@ -201,6 +201,7 @@ break; default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_OPS, ( U32 )nvDataMgmtExecState ); break; } } @@ -411,7 +412,7 @@ if ( TRUE == didTimeout( currentTime, COMMAND_TIME_OUT ) ) { -// SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_MANAGEMENT_OPS_TIMEOUT, state ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_OPS_TIMEOUT, ( U32 )state ) status = TRUE; } Index: firmware/App/Services/NVMsgQ.c =================================================================== diff -u -rf525d2be1e7038cacbe2bb34b8db3505cf26a350 -r0face6417892ea9de28d146bf88d44a9f30cf2a4 --- firmware/App/Services/NVMsgQ.c (.../NVMsgQ.c) (revision f525d2be1e7038cacbe2bb34b8db3505cf26a350) +++ firmware/App/Services/NVMsgQ.c (.../NVMsgQ.c) (revision 0face6417892ea9de28d146bf88d44a9f30cf2a4) @@ -183,7 +183,7 @@ break; default: -// SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_NVDATAMGMT_EXEC_CAL_STATE, nvMExecSendRecordState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_EXEC_SEND_STATE, ( U32 )nvMExecSendRecordState ); nvMExecSendRecordState = NVM_SEND_RECORD_STATE_IDLE; break; } @@ -404,7 +404,7 @@ { BOOL status = FALSE; - if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_FOR_A_RECORD ) + 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 ) ) @@ -429,7 +429,7 @@ { BOOL status = FALSE; - if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_FOR_ALL_RECORDS ) + if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_TO_WRITE_ALL_RECORDS ) { RECORD_JOBS_STATE_T record; @@ -453,22 +453,30 @@ /*********************************************************************//** * @brief - * The enqueuePOSTReadRecords enqueues the NV records to be read during POST. + * The enqueueReadAllRecords enqueues the NV records to be read during POST. * @details Inputs: none * @details Outputs: recordsReadStatus * @return none *************************************************************************/ -void enqueuePOSTReadRecords( void ) +BOOL enqueueReadAllRecords( void ) { + BOOL status = FALSE; RECORD_JOBS_STATE_T record; - for ( record = NVDATAMGMT_SYSTEM_RECORD; record < NUM_OF_NVDATMGMT_RECORDS_JOBS; record++ ) + if ( getAvailableRecordQueueCount() >= MIN_JOBS_NEEDED_TO_READ_ALL_RECORDS ) { - enqueueRecordJob( NVDATAMGMT_READ, record ); + for ( record = NVDATAMGMT_SYSTEM_RECORD; record < NUM_OF_NVDATMGMT_RECORDS_JOBS; record++ ) + { + enqueueRecordJob( NVDATAMGMT_READ, record ); + } + + status = TRUE; } // Set the status to records were queued successfully recordsReadStatus = NVDATAMGMT_RECORDS_QUEUED; + + return status; } /*********************************************************************//** @@ -507,6 +515,59 @@ return result; } +BOOL testDDSetNVSystemRecord( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // System record can be updated only in service mode + if ( DD_MODE_SERV == getCurrentOperationMode() ) + { + result = receiveDDRecord ( message ); + } + + return result; +} + +BOOL testDDSetNVServiceRecord( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // Service record can be updated only in service mode + if ( DD_MODE_SERV == getCurrentOperationMode() ) + { + result = receiveDDRecord ( message ); + } + + return result; +} + +BOOL testDDSetNVCalibrationRecord( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // Calibration record can be updated only in service mode + if ( DD_MODE_SERV == getCurrentOperationMode() ) + { + result = receiveDDRecord ( message ); + } + + return result; +} + +BOOL testDDSetNVInstitutionalRecord( MESSAGE_T *message ) +{ + BOOL result = FALSE; + result = receiveDDRecord ( message ); + return result; +} + +BOOL testDDSetNVUsageInfoRecord( MESSAGE_T *message ) +{ + BOOL result = FALSE; + result = receiveDDRecord ( message ); + return result; +} + /*********************************************************************//** * @brief * The sendDDCalibrationRecord function sends out the DD calibration @@ -536,7 +597,6 @@ return result; } - static BOOL receiveDDRecord( MESSAGE_T *message ) { BOOL status = FALSE; @@ -549,16 +609,8 @@ MSG_ID_T msgID = (MSG_ID_T)message->hdr.msgID; RECORD_JOBS_STATE_T job = getNVMRecordJobState( msgID ); - BOOL isValidPayloadLen = ( message->hdr.payloadLen >= minPayloadLen); - - BOOL isServiceJob = ( ( job == NVDATAMGMT_SYSTEM_RECORD ) || - ( job == NVDATAMGMT_SERVICE_RECORD ) || - ( job == NVDATAMGMT_CALIBRATION_RECORD ) ); - - BOOL isServiceMode = ( DD_MODE_SERV == getCurrentOperationMode() ); - // To proceed, the payload length should be valid. And, if it is a service job, then DD mode should also be in service. - if ( ( TRUE == isValidPayloadLen ) && ( ( FALSE == isServiceJob ) || ( TRUE == isServiceMode ) ) ) + if ( message->hdr.payloadLen >= minPayloadLen ) { memcpy(¤tMessage, payloadPtr, sizeof(U32)); payloadPtr += sizeof(U32); @@ -590,7 +642,7 @@ * @param *addressPtr: address to the beginning of the calibration data from Dialin * @return TRUE if the request was successfully registered *************************************************************************/ -BOOL verifyAndSaveReceivedRecord( RECORD_JOBS_STATE_T job, U32 currentMessage, U32 totalMessages, U32 length, U08 *addressPtr ) +static BOOL verifyAndSaveReceivedRecord( RECORD_JOBS_STATE_T job, U32 currentMessage, U32 totalMessages, U32 length, U08 *addressPtr ) { BOOL status = TRUE; @@ -699,6 +751,7 @@ default: // Software Fault + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )msgID ) break; } @@ -733,6 +786,7 @@ default: // Software fault + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )job ) break; } Index: firmware/App/Services/NVMsgQ.h =================================================================== diff -u -rf525d2be1e7038cacbe2bb34b8db3505cf26a350 -r0face6417892ea9de28d146bf88d44a9f30cf2a4 --- firmware/App/Services/NVMsgQ.h (.../NVMsgQ.h) (revision f525d2be1e7038cacbe2bb34b8db3505cf26a350) +++ firmware/App/Services/NVMsgQ.h (.../NVMsgQ.h) (revision 0face6417892ea9de28d146bf88d44a9f30cf2a4) @@ -43,8 +43,10 @@ #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 MIN_JOBS_NEEDED_FOR_A_RECORD 4 ///< Min queue count needed to erase and write a sector -#define MIN_JOBS_NEEDED_FOR_ALL_RECORDS ( NUM_OF_NVDATMGMT_RECORDS_JOBS * 2 ) ///< Min queue count needed to erase and write all records +#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 /// NVDataMgmt records read status typedef enum NVDataMgmt_NV_Records_Read_Status @@ -69,9 +71,15 @@ U32 getAvailableRecordQueueCount( void ); BOOL enqueueEraseAndWriteSector( RECORD_JOBS_STATE_T job ); -void enqueuePOSTReadRecords( void ); +BOOL enqueuewriteAllRecords( void ); +BOOL enqueueReadAllRecords( void ); BOOL testDDGetNVRecord( MESSAGE_T *message ); +BOOL testDDSetNVSystemRecord( MESSAGE_T *message ); +BOOL testDDSetNVServiceRecord( MESSAGE_T *message ); +BOOL testDDSetNVCalibrationRecord( MESSAGE_T *message ); +BOOL testDDSetNVInstitutionalRecord( MESSAGE_T *message ); +BOOL testDDSetNVUsageInfoRecord( MESSAGE_T *message ); BOOL isNewCalibrationRecordAvailable( void ); void updateNewNVRecordAvailableFlag( BOOL value ); Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -rf525d2be1e7038cacbe2bb34b8db3505cf26a350 -r0face6417892ea9de28d146bf88d44a9f30cf2a4 --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision f525d2be1e7038cacbe2bb34b8db3505cf26a350) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 0face6417892ea9de28d146bf88d44a9f30cf2a4) @@ -247,7 +247,7 @@ break; default: -// SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVDATAMGMT_INVALID_SELF_TEST_STATE, nvDataMgmtSelfTestState ); + 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; break; @@ -433,13 +433,14 @@ ddSystemGroup.crc = crc16 ( (U08*)&ddSystemGroup, sizeof( DD_SYSTEM_GROUP_T ) - sizeof( U16 ) ); status = FALSE; -// activateAlarmNoData( ALARM_ID_DD_INVALID_SYSTEM_RECORD_CRC ); + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_SYSTEM_RECORD_CRC ); } else { + // Verify the serial number from the system record if ( RECORD_DEFAULT_CHARACTER == ddSystemGroup.ddSystemRecord.topLevelSN[ 0 ] ) { -// activateAlarmNoData( ALARM_ID_DD_INVALID_SERIAL_NUMBER ); + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_SERIAL_NUMBER ); } } @@ -470,8 +471,8 @@ ddServiceGroup.crc = crc16 ( (U08*)&ddServiceGroup, sizeof( DD_SERVICE_GROUP_T ) - sizeof( U16 ) ); status = FALSE; - // Service record failure is also considered as RTC RAM failure -// activateAlarmNoData( ALARM_ID_DD_INVALID_SERVICE_RECORD_CRC ); + // Service record failure + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_SERVICE_RECORD_CRC ); } return status; @@ -502,7 +503,7 @@ ddUsageInfoGroup.crc = crc16( (U08*)&ddUsageInfoGroup, sizeof( DD_USAGE_INFO_GROUP_T ) - sizeof( U16 ) ); status = FALSE; -// activateAlarmNoData( ALARM_ID_DD_INVALID_USAGE_RECORD_CRC ); + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_USAGE_RECORD_CRC ); } return status; @@ -661,7 +662,7 @@ isCalRecordValid = FALSE; ddCalibrationRecord.crc = crc16 ( (U08*)&ddCalibrationRecord, sizeof( DD_CALIBRATION_RECORD_T ) - sizeof( U16 ) ); -// activateAlarmNoData( ALARM_ID_DD_NVDATAMGMT_CAL_GROUP_RECORD_CRC_INVALID ); + activateAlarmNoData( ALARM_ID_DD_NVM_INVALID_CALIBRATION_RECORD_CRC ); } return isCalRecordValid; @@ -1037,6 +1038,7 @@ default: // TODO software fault + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )acidType ); break; } break; @@ -1061,6 +1063,7 @@ default: // TODO software fault + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )acidType ); break; } break; @@ -1072,6 +1075,7 @@ default: // Software fault + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )operation ); break; } @@ -1136,7 +1140,7 @@ break; default: -// SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_USAGE_INFO_SELECTED, disinfect ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_USAGE_INFO_SELECTED, ( U32 )disinfect ); break; } @@ -1150,7 +1154,7 @@ } else if ( ++usageWriteTries > MAX_NUM_OF_WRITE_TRIES ) { -// SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_WRITE_USAGE_INFO_TO_NV_FAILURE, disinfect ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_WRITE_USAGE_INFO_FAILURE, ( U32 )disinfect ); } return status; @@ -1169,7 +1173,7 @@ { BOOL status = FALSE; - if ( getAvailableRecordQueueCount() >= ( MIN_JOBS_NEEDED_FOR_ALL_RECORDS + 1 ) ) + if ( getAvailableRecordQueueCount() >= ( MIN_JOBS_NEEDED_TO_WRITE_ALL_RECORDS + 1 ) ) { // When the service record is changed, all the sector 0 must be re-written plus the stack's usage information must be updated. // Therefore, at least 4 queues are needed to be able to update all the records. The usage records are changed: @@ -1380,7 +1384,7 @@ break; default: -// SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_NV_RECORD_SELECTED, nvData ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_NVM_INVALID_RECORD_SELECTED, ( U32 )nvData ); break; } @@ -1448,6 +1452,7 @@ default: // Software fault + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, ( U32 )nvJob ); break; }