Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -rd5f2ac4d84453feb1b782f35f9d69432977a95f6 -rd3926e5817813a9588b77f6c382940176a5feedc --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision d5f2ac4d84453feb1b782f35f9d69432977a95f6) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision d3926e5817813a9588b77f6c382940176a5feedc) @@ -7,8 +7,8 @@ * * @file SystemComm.c * -* @author (last) Michael Garthwaite -* @date (last) 08-Aug-2022 +* @author (last) Dara Navaei +* @date (last) 21-Nov-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -25,6 +25,7 @@ #include "SystemComm.h" #include "Comm.h" #include "Interrupts.h" +#include "OperationModes.h" #include "Timers.h" #include "Utilities.h" #include "SystemCommMessages.h" @@ -52,6 +53,9 @@ #define MSG_NOT_ACKED_MAX_RETRIES 3 ///< 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 +#define MAX_FPGA_CLOCK_SPEED_ERROR_WINDOW_MS (10 * SEC_PER_MIN * MS_PER_SECOND) ///< FPGA clock speed error window + #pragma pack(push, 1) /// Record for transmitted message that is pending acknowledgement from receiver. @@ -136,6 +140,9 @@ // initialize bad message CRC time windowed count initTimeWindowedCount( TIME_WINDOWED_COUNT_BAD_MSG_CRC, MAX_COMM_CRC_FAILURES, MAX_COMM_CRC_FAILURE_WINDOW_MS ); + // initialize FPGA clock speed error time windowed count + initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CLOCK_SPEED_ERROR, MAX_FPGA_CLOCK_SPEED_ERRORS, MAX_FPGA_CLOCK_SPEED_ERROR_WINDOW_MS); + // initialize pending ACK list for ( i = 0; i < PENDING_ACK_LIST_SIZE; i++ ) { @@ -766,8 +773,8 @@ 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 - if ( pendingAckList[ i ].retries > 0 ) + { // 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(); @@ -779,9 +786,7 @@ U16 msgID; memcpy( &msgID, &pendingAckList[ i ].msg[ sizeof( U08 ) + sizeof( U16 ) ], sizeof( U16 ) ); -#ifndef DISABLE_ACK_ALARM SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CAN_MESSAGE_NOT_ACKED, (U32)msgID ); -#endif pendingAckList[ i ].used = FALSE; // take pending message off of list } } @@ -852,8 +857,12 @@ handleSampleWaterCmd( message ); break; + case MSG_ID_HD_START_STOP_TRIMMER_HEATER_CMD: + handleHDStartStopTrimmerHeaterCmd( message ); + break; + case MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD: - handleStartStopTrimmerHeaterCmd( message ); + handleDGStartStopTrimmerHeater( message ); break; case MSG_ID_DG_START_STOP_FLUSH: @@ -876,22 +885,30 @@ handleDGPOSTResultRequest( message ); break; - case MSG_ID_UI_REQUEST_SERVICE_INFO: + case MSG_ID_HD_REQUEST_DG_SERVICE_RECORD: handleDGServiceScheduleRequest( message ); break; case MSG_ID_HD_REQUEST_DG_CONCENTRATE_MIXING_RATIOS: handleDGSendConcentrateMixingRatios( message ); break; - case MSG_ID_DG_SCHEDULED_RUNS_INFO: - handleDGScheduledRunsRequest( message ); + case MSG_ID_HD_REQUEST_DG_USAGE_INFO: + handleHDRequestDGUsageInfo( message ); break; case MSG_ID_HD_REQUEST_DG_SERVICE_MODE: handleServiceModeRequest( message ); break; + case MSG_ID_REQUEST_CPLD_STATUS: + handleCpldStatusRequest( message ); + break; + + case MSG_ID_HD_REQUEST_DG_ALARMS: + handleResendAllAlarmsCommand( message ); + break; + // NOTE: This case must be last case MSG_ID_DG_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); @@ -903,8 +920,7 @@ } // handle any test messages if tester has logged in successfully - // NOTE: END_OF_MSG_IDS = 65536 which is out of the range of a U16 so it is subtracted by 1. This is unreachable in development testing - if ( ( msgID > MSG_ID_FIRST_DG_TESTER_MESSAGE ) && ( msgID <= END_OF_MSG_IDS - 1 ) && ( TRUE == isTestingActivated() ) ) + if ( ( msgID > MSG_ID_FIRST_DG_TESTER_MESSAGE ) && ( TRUE == isTestingActivated() ) ) { switch ( msgID ) { @@ -940,20 +956,16 @@ handleTestPressureDataBroadcastIntervalOverrideRequest( message ); break; - case MSG_ID_RO_MEASURED_FLOW_OVERRIDE: - handleTestROMeasuredFlowOverrideRequest( message ); + case MSG_ID_MEASURED_FLOW_SENSORS_OVERRIDE: + handleTestMeasuredFlowOverrideRequest( message ); break; - case MSG_ID_DIALYSATE_MEASURED_FLOW_OVERRIDE: - handleTestDialysateMeasuredFlowOverrideRequest( message ); - break; - case MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE: handleTestROPumpDataBroadcastIntervalOverrideRequest( message ); break; - case MSG_ID_DIALYSATE_FLOW_SEND_INTERVAL_OVERRIDE: - handleTestDialysateFlowDataBroadcastIntervalOverrideRequest( message ); + case MSG_ID_FLOW_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestFlowSensorsDataBroadcastIntervalOverrideRequest( message ); break; case MSG_ID_DRAIN_PUMP_SET_RPM: @@ -1064,8 +1076,8 @@ handleTestROPumpDutyCycleOverride( message ); break; - case MSG_ID_DG_RO_FLOW_RATE_OVERRIDE: - handleTestROMeasuredFlowOverrideRequest( message ); + case MSG_ID_DG_VALVES_SENSED_STATE_OVERRIDE: + handleTestDGValvesSensedStateOverrideRequest( message ); break; case MSG_ID_DG_SET_RO_PUMP_TARGET_FLOW: @@ -1112,14 +1124,6 @@ handleSetDGServiceRecord( message ); break; - case MSG_ID_DG_GET_SCHEDULED_RUNS_RECORD: - handleGetDGScheduledRunsRecord( message ); - break; - - case MSG_ID_DG_SET_SCHEDULED_RUNS_RECORD: - handleSetDGScheduledRunsRecord( message ); - break; - case MSG_ID_DG_FLUID_LEAK_SEND_INTERVAL_OVERRIDE: handleSetFluidLeakBroadcastIntervalOverrideRequest( message ); break; @@ -1188,6 +1192,10 @@ handleTestHDCommunicationStatusOverrideRequest( message ); break; + case MSG_ID_DG_SET_PRIMARY_AND_TRIMMER_HEATERS_TARGET_TEMP: + handleSetPrimaryAndTrimmerHeatersTargetTemperature( message ); + break; + case MSG_ID_DG_GET_USAGE_INFO_RECORD: handleGetDGUsageInfoRecord( message ); break; @@ -1196,10 +1204,6 @@ handleSetDGUsageInfoRecord( message ); break; - case MSG_ID_HD_REQUEST_DG_ALARMS: - handleResendAllAlarmsCommand( message ); - break; - case MSG_ID_DG_SET_OP_MODE_REQUEST: handleTestSetOpModeRequest( message ); break; @@ -1208,6 +1212,26 @@ handleTestTareReservoirRequest( message ); break; + case MSG_ID_DG_DRAIN_PUMP_CURRENT_OVERRIDE: + handleTestDGDrainPumpCurrentOverrideRequest( message ); + break; + + case MSG_ID_DG_DRAIN_PUMP_DIRECTION_OVERRIDE: + handleTestDGDrainPumpDirectionOverrideRequest( message ); + break; + + case MSG_ID_DG_RO_FEEDBACK_VOLTAGE_OVERRIDE: + handleTestDGROPumpFeedbackVoltageOverrideRequest( message ); + break; + + case MSG_ID_DG_DIALYSATE_FILL_INTEGRATED_VOLUME_OVERRIDE: + handleTestDGFillIntegratedVolumeOverrideRequest( message ); + break; + + case MSG_ID_FILL_MODE_DATA_PUBLISH_INTERVAL_OVERRIDE: + handleTestDGFillModeBroadcastOverrideRequest( message ); + break; + default: // TODO - unrecognized message ID received - ignore break;