Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -rac264e13479986e5db728ce6ba3c08cb1a871266 -r59357d3831aa60f17ccdfbe0eef1a005935b9a58 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ac264e13479986e5db728ce6ba3c08cb1a871266) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 59357d3831aa60f17ccdfbe0eef1a005935b9a58) @@ -7,8 +7,8 @@ * * @file SystemComm.c * -* @author (last) Michael Garthwaite -* @date (last) 07-Feb-2023 +* @author (last) Dara Navaei +* @date (last) 20-May-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -49,8 +49,8 @@ #define MAX_COMM_CRC_FAILURES 5 ///< maximum number of CRC errors within window period before alarm #define MAX_COMM_CRC_FAILURE_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< CRC error window -#define MSG_NOT_ACKED_TIMEOUT_MS 150 ///< maximum time for a Denali message that requires ACK to be ACK'd -#define MSG_NOT_ACKED_MAX_RETRIES 8 ///< maximum number of times a message that requires ACK that was not ACK'd can be re-sent before alarm +#define MSG_NOT_ACKED_TIMEOUT_MS 250 ///< maximum time for a Denali message that requires ACK to be ACK'd +#define MSG_NOT_ACKED_MAX_RETRIES 10 ///< maximum number of times a message that requires ACK that was not ACK'd can be re-sent before alarm #define PENDING_ACK_LIST_SIZE 25 ///< maximum number of Delanli messages that can be pending ACK at any given time #define MAX_FPGA_CLOCK_SPEED_ERRORS 3 ///< maximum number of FPGA clock speed errors within window period before alarm @@ -196,6 +196,12 @@ // check ACK list for messages that need to be re-sent because they haven't been ACK'd checkPendingACKList(); + + if ( TRUE == hasDialinCheckInExpired() ) + { + // It has been a while since the user logged in but not activity has been received from Dialin so set the tester's status to log out + setTesterStatusToLoggedOut(); + } } /*********************************************************************//** @@ -770,27 +776,41 @@ U32 i; // find expired messages pending ACK - for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) - { // pending ACK expired? - if ( ( TRUE == pendingAckList[ i ].used ) && ( TRUE == didTimeout( pendingAckList[ i ].timeStamp, MSG_NOT_ACKED_TIMEOUT_MS ) ) ) - { // if retries left, reset and resend pending message. Do not retry when in POST since the UI might not still be responsive - if ( ( pendingAckList[ i ].retries > 0 ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) - { // re-queue message for transmit - pendingAckList[ i ].retries--; - pendingAckList[ i ].timeStamp = getMSTimerCount(); - addToCommBuffer( pendingAckList[ i ].channel, pendingAckList[ i ].msg, pendingAckList[ i ].msgSize ); - } - // if no retries left, alarm - else - { - U16 msgID; + if( TRUE == isHDCommunicating() ) + { + for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) + { // pending ACK expired? + if ( ( TRUE == pendingAckList[ i ].used ) && ( TRUE == didTimeout( pendingAckList[ i ].timeStamp, MSG_NOT_ACKED_TIMEOUT_MS ) ) ) + { // if retries left, reset and resend pending message. Do not retry when in POST since the UI might not still be responsive + if ( pendingAckList[ i ].retries > 0 ) + { + if ( getCurrentOperationMode() != DG_MODE_INIT ) + { // If not in post, limit the number of retries + pendingAckList[ i ].retries--; + } + // Resend message + pendingAckList[ i ].timeStamp = getMSTimerCount(); + addToCommBuffer( pendingAckList[ i ].channel, pendingAckList[ i ].msg, pendingAckList[ i ].msgSize ); + } + // if no retries left, alarm + else + { + U16 msgID; - memcpy( &msgID, &pendingAckList[ i ].msg[ sizeof( U08 ) + sizeof( U16 ) ], sizeof( U16 ) ); - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CAN_MESSAGE_NOT_ACKED, (U32)msgID ); - pendingAckList[ i ].used = FALSE; // take pending message off of list + memcpy( &msgID, &pendingAckList[ i ].msg[ sizeof( U08 ) + sizeof( U16 ) ], sizeof( U16 ) ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CAN_MESSAGE_NOT_ACKED, (U32)msgID ); + pendingAckList[ i ].used = FALSE; // take pending message off of list + } } } } + else + { // Clear pending ACK list + for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) + { + pendingAckList[ i ].used = FALSE; + } + } } /*********************************************************************//** @@ -816,60 +836,60 @@ handleAlarmClear( message ); break; - case MSG_ID_RTC_EPOCH: + case MSG_ID_RTC_EPOCH_DATA: handleRTCSyncFromHD( message ); break; case MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS: handleSetDialysateTemperatureCmd( message ); break; - case MSG_ID_REQUEST_FW_VERSIONS: + case MSG_ID_FW_VERSIONS_REQUEST: handleFWVersionCmd( message ); handleDGSerialNumberRequest(); break; - case MSG_ID_DG_SWITCH_RESERVOIR_CMD: + case MSG_ID_DG_SWITCH_RESERVOIR_CMD_REQUEST: handleSwitchReservoirCmd( message ); break; - case MSG_ID_DG_CHANGE_VALVE_SETTING_CMD: + case MSG_ID_DG_CHANGE_VALVE_SETTING_CMD_REQUEST: handleChangeValveSettingCmd( message ); break; - case MSG_ID_DG_FILL_CMD: + case MSG_ID_DG_FILL_CMD_REQUEST: handleFillCmd( message ); break; - case MSG_ID_DG_DRAIN_CMD: + case MSG_ID_DG_DRAIN_CMD_REQUEST: handleDrainCmd( message ); break; - case MSG_ID_HD_OP_MODE: + case MSG_ID_HD_OP_MODE_DATA: handleSetHDOperationMode( message ); break; - case MSG_ID_STARTING_STOPPING_TREATMENT_CMD: + case MSG_ID_STARTING_STOPPING_TREATMENT_CMD_REQUEST: handleStartStopTreatmentMsg( message ); break; - case MSG_ID_DG_SAMPLE_WATER_CMD: + case MSG_ID_DG_SAMPLE_WATER_CMD_REQUEST: handleSampleWaterCmd( message ); break; - case MSG_ID_HD_START_STOP_TRIMMER_HEATER_CMD: + case MSG_ID_HD_START_STOP_TRIMMER_HEATER_CMD_REQUEST: handleHDStartStopTrimmerHeaterCmd( message ); break; case MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD: handleDGStartStopTrimmerHeater( message ); break; - case MSG_ID_DG_START_STOP_FLUSH: + case MSG_ID_DG_START_STOP_FLUSH_CMD_REQUEST: handleStartStopDGFlush( message ); break; - case MSG_ID_DG_START_STOP_HEAT_DISINFECT: + case MSG_ID_DG_START_STOP_HEAT_DISINFECT_CMD_REQUEST: handleStartStopDGHeatDisinfect( message ); break; @@ -889,38 +909,42 @@ handleDGPOSTResultRequest( message ); break; - case MSG_ID_HD_REQUEST_DG_SERVICE_RECORD: + case MSG_ID_HD_DG_SERVICE_RECORD_REQUEST: handleDGServiceScheduleRequest( message ); break; - case MSG_ID_HD_REQUEST_DG_CONCENTRATE_MIXING_RATIOS: + case MSG_ID_HD_DG_CONCENTRATE_MIXING_RATIOS_REQUEST: handleDGSendConcentrateMixingRatios( message ); break; - case MSG_ID_HD_REQUEST_DG_USAGE_INFO: - handleHDRequestDGUsageInfo( message ); + case MSG_ID_HD_DG_SERVICE_MODE_REQUEST: + handleServiceModeRequest( message ); break; - case MSG_ID_HD_REQUEST_DG_SERVICE_MODE: - handleServiceModeRequest( message ); + case MSG_ID_HD_DG_USAGE_INFO_REQUEST: + handleHDRequestDGUsageInfo( message ); break; - case MSG_ID_DG_SET_SERVICE_TIME: + case MSG_ID_DG_SET_SERVICE_TIME_REQUEST: handleSetDGServiceTime( message ); break; case MSG_ID_DG_START_STOP_HEAT_DISINFECT_ACTIVE_COOL: handleStartStopDGHeatDisinfectActiveCool( message ); break; - case MSG_ID_REQUEST_CPLD_STATUS: - handleCpldStatusRequest( message ); + case MSG_ID_HD_DG_ALARMS_REQUEST: + handleResendAllAlarmsCommand( message ); break; - case MSG_ID_HD_REQUEST_DG_ALARMS: - handleResendAllAlarmsCommand( message ); + case MSG_ID_HD_SEND_CHEM_FLUSH_SAMPLE_PASS_FAIL_TO_DG: + handleReceiveChemFlushSampleResultsFromHD( message ); break; + case MSG_ID_UI_SET_DG_RO_MODE: + handleSetROOnlyMode( message ); + break; + // NOTE: This case must be last case MSG_ID_DG_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); @@ -1188,13 +1212,15 @@ handleTestUsedBicarbVolumeMLOverrideRequest( message ); break; +#ifndef _RELEASE_ case MSG_ID_DG_GET_SW_CONFIG_RECORD: handleGetDGSoftwareConfigRecord( message ); break; case MSG_ID_DG_SET_SW_CONFIG_RECORD: handleSetDGSoftwareConfigRecord( message ); break; +#endif case MSG_ID_DG_FANS_DUTY_CYCLE_OVERRIDE: handleSetFansDutyCycleOverrideRequest( message ); @@ -1282,6 +1308,38 @@ break; #endif + case MSG_ID_DG_SET_DIALYSATE_MIXING_RATIOS: + handleTestDGSetDialysateMixingRatios( message ); + break; + + case MSG_ID_DG_SET_TEST_CONFIGURATION: + handleTestDGSetTestConfig( message ); + break; + + case MSG_ID_DG_GET_TEST_CONFIGURATION: + handleTestDGGetTestConfig( message ); + break; + + case MSG_ID_DG_RESET_ALL_TEST_CONFIGURATIONS: + handleTestDGResetAllTestConfigs( message ); + break; + + case MSG_ID_DG_DIALIN_CHECK_IN: + handleTestDGDialinCheckIn( message ); + break; + + case MSG_ID_DG_GET_LOAD_CELLS_TARE_VALUES: + handleTestDGGetLoadCellsTareValues( message ); + break; + + case MSG_ID_DG_SET_LOAD_CELLS_TARE_VALUES: + handleTestDGSetLoadCellsTareValues( message ); + break; + + case MSG_ID_DG_SET_COND_SENSOR_CAL_TABLE: + handleTestDGSetConductivitySensorCalTable( message ); + break; + default: // TODO - unrecognized message ID received - ignore break;