Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r844f98879b7425c207b58562e623ab960adbc357 -r002e261b37e29e110396e258a25eca4f9f97738f --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 844f98879b7425c207b58562e623ab960adbc357) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 002e261b37e29e110396e258a25eca4f9f97738f) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * -* @file SystemComm.c +* @file SystemComm.c * -* @author (last) Sean Nash -* @date (last) 14-Oct-2020 +* @author (last) Dara Navaei +* @date (last) 04-Jan-2022 * -* @author (original) Dara Navaei -* @date (original) 05-Nov-2019 +* @author (original) Dara Navaei +* @date (original) 05-Nov-2019 * ***************************************************************************/ @@ -21,12 +21,15 @@ #include "sci.h" #include "sys_dma.h" -#include "SystemComm.h" #include "Comm.h" #include "Interrupts.h" +#include "OperationModes.h" +#include "SystemComm.h" +#include "SystemCommMessages.h" +#include "Interrupts.h" +#include "OperationModes.h" #include "Timers.h" #include "Utilities.h" -#include "SystemCommMessages.h" /** * @addtogroup SystemComm @@ -37,15 +40,8 @@ #define NUM_OF_CAN_OUT_BUFFERS 5 ///< Number of CAN buffers for transmit #define NUM_OF_CAN_IN_BUFFERS 7 ///< Number of CAN buffers for receiving -#ifndef DEBUG_ENABLED - #define NUM_OF_MSG_IN_BUFFERS 7 ///< Number of Msg buffers for receiving -#else - #define NUM_OF_MSG_IN_BUFFERS 8 - #define SCI1_RECEIVE_DMA_REQUEST 30 - #define SCI1_TRANSMIT_DMA_REQUEST 31 -#endif +#define NUM_OF_MSG_IN_BUFFERS 7 ///< Number of Msg buffers for receiving - #define CAN_XMIT_PACKET_TIMEOUT_MS 200 ///< If transmitted CAN frame does not cause a transmit complete interrupt within this time, re-send or move on #define MAX_XMIT_RETRIES 5 ///< Maximum number of retries on no transmit complete interrupt timeout @@ -56,12 +52,14 @@ #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_TIMEOUT_MS_INIT 5000 ///< Maximum time for a Denali message that requires ACK to be ACK'd on the INIT state for the first (UI version request) message of the POST #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 PENDING_ACK_LIST_SIZE 25 ///< Maximum number of Denali messages that can be pending ACK at any given time #pragma pack(push, 1) -/// Record for transmitted message that is pending acknowledgement from receiver. +/// Record for transmitted message that is pending acknowledgment from receiver. typedef struct { BOOL used; @@ -97,9 +95,6 @@ COMM_BUFFER_IN_CAN_UI_2_HD, COMM_BUFFER_IN_CAN_UI_BROADCAST, COMM_BUFFER_IN_CAN_PC, -#ifdef DEBUG_ENABLED - COMM_BUFFER_IN_UART_PC -#endif }; static U08 lastCANPacketSent[ CAN_MESSAGE_PAYLOAD_SIZE ]; ///< Keep last packet sent on CAN bus in case we need to re-send. @@ -120,16 +115,6 @@ static U32 badCANCount; // Test code in support of EMC testing #endif -#ifdef DEBUG_ENABLED - // Debug buffers - static U08 pcXmitPacket[ 1024 ]; - static U08 pcRecvPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - - // DMA control records - static g_dmaCTRL pcDMAXmitControlRecord; - static g_dmaCTRL pcDMARecvControlRecord; -#endif - // ********** private function prototypes ********** static void clearCANXmitBuffers( void ); @@ -149,11 +134,6 @@ static BOOL matchACKtoPendingACKList( S16 seqNo ); static void checkPendingACKList( void ); -#ifdef DEBUG_ENABLED - static void initUARTAndDMA( void ); - static U32 transmitNextUARTPacket( void ); -#endif - /*********************************************************************//** * @brief * The initSystemComm function initializes the SystemComm module. @@ -165,11 +145,6 @@ { U32 i; -#ifdef DEBUG_ENABLED - // Initialize UART and DMA for PC communication - initUARTAndDMA(); -#endif - // Initialize bad message CRC time windowed count initTimeWindowedCount( TIME_WINDOWED_COUNT_BAD_MSG_CRC, MAX_COMM_CRC_FAILURES, MAX_COMM_CRC_FAILURE_WINDOW_MS ); @@ -195,7 +170,7 @@ if ( TRUE == isAlarmActive( ALARM_ID_DG_COMM_TIMEOUT ) ) { - clearAlarm( ALARM_ID_DG_COMM_TIMEOUT ); + clearAlarmCondition( ALARM_ID_DG_COMM_TIMEOUT ); } } @@ -339,14 +314,6 @@ } } } - -#ifdef DEBUG_ENABLED - // If UART transmitter is idle, start transmitting any pending packets - if ( FALSE == isSCI1DMATransmitInProgress() ) - { - transmitNextUARTPacket(); - } -#endif } /*********************************************************************//** @@ -399,113 +366,8 @@ } } -/*********************************************************************//*** - * @brief - * The handleUARTMsgRecvPacketInterrupt function handles a DMA UART receive - * packet completed interrupt. - * @details Inputs: none - * @details Outputs: UART received packet interrupt handled. - * @return none - *************************************************************************/ -#ifdef DEBUG_ENABLED -void handleUARTMsgRecvPacketInterrupt( void ) -{ - // Buffer received packet - addToCommBuffer( COMM_BUFFER_IN_UART_PC, pcRecvPacket, PC_MESSAGE_PACKET_SIZE ); - // Prepare to receive next packet - dmaSetCtrlPacket( DMA_CH1, pcDMARecvControlRecord ); - dmaSetChEnable( DMA_CH1, DMA_HW ); - setSCI1DMAReceiveInterrupt(); -} -#endif - /*********************************************************************//** * @brief - * The handleUARTMsgXmitPacketInterrupt function handles a DMA UART transmit - * packet completed interrupt. - * @details Inputs: none - * @details Outputs: UART transmit packet interrupt handled. - * @return none - *************************************************************************/ -#ifdef DEBUG_ENABLED -void handleUARTMsgXmitPacketInterrupt( void ) -{ - U32 bytesXmitted = transmitNextUARTPacket(); - - if ( 0 == bytesXmitted ) - { - signalSCI1XmitsCompleted(); - } -} -#endif - -/*********************************************************************//** - * @brief - * The initUARTAndDMA function initializes the SCI1 peripheral and the DMA - * to go with it for PC communication. - * @details Inputs: none - * @details Outputs: SCI1 and DMA initialized - * @return none - *************************************************************************/ -#ifdef DEBUG_ENABLED -static void initUARTAndDMA( void ) -{ - // Enable DMA block transfer complete interrupts - dmaEnableInterrupt( DMA_CH1, BTC ); - dmaEnableInterrupt( DMA_CH3, BTC ); - - // Assign DMA channels to h/w DMA requests - dmaReqAssign( DMA_CH1, SCI1_RECEIVE_DMA_REQUEST ); - dmaReqAssign( DMA_CH3, SCI1_TRANSMIT_DMA_REQUEST ); - // Set DMA channel priorities - dmaSetPriority( DMA_CH1, HIGHPRIORITY ); - dmaSetPriority( DMA_CH3, LOWPRIORITY ); - - // Initialize PC DMA Transmit Control Record - pcDMAXmitControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) - pcDMAXmitControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI2 xmit register - pcDMAXmitControlRecord.SADD = (U32)pcXmitPacket; // Source - pcDMAXmitControlRecord.CHCTRL = 0; // No chaining - pcDMAXmitControlRecord.ELCNT = 1; // Frame is 1 element - pcDMAXmitControlRecord.FRCNT = PC_MESSAGE_PACKET_SIZE; // Block is 8 frames - pcDMAXmitControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte - pcDMAXmitControlRecord.WRSIZE = ACCESS_8_BIT; // - pcDMAXmitControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer - pcDMAXmitControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed - pcDMAXmitControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment - pcDMAXmitControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off - pcDMAXmitControlRecord.ELSOFFSET = 0; // Not used - pcDMAXmitControlRecord.ELDOFFSET = 0; // Not used - pcDMAXmitControlRecord.FRSOFFSET = 0; // Not used - pcDMAXmitControlRecord.FRDOFFSET = 0; // Not used - - // Initialize PC DMA Receipt Control Record - pcDMARecvControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) - pcDMARecvControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI2 recv register - pcDMARecvControlRecord.DADD = (U32)pcRecvPacket; // Transfer destination address - pcDMARecvControlRecord.CHCTRL = 0; // No chaining - pcDMARecvControlRecord.ELCNT = 1; // Frame is 1 element - pcDMARecvControlRecord.FRCNT = PC_MESSAGE_PACKET_SIZE; // Block is 8 frames - pcDMARecvControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte - pcDMARecvControlRecord.WRSIZE = ACCESS_8_BIT; // - pcDMARecvControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer - pcDMARecvControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed - pcDMARecvControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment - pcDMARecvControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off - pcDMARecvControlRecord.ELDOFFSET = 0; // Not used - pcDMARecvControlRecord.ELSOFFSET = 0; // Not used - pcDMARecvControlRecord.FRDOFFSET = 0; // Not used - pcDMARecvControlRecord.FRSOFFSET = 0; // Not used - - // Initiate PC packet receiving readiness via DMA - dmaSetCtrlPacket( DMA_CH1, pcDMARecvControlRecord ); - dmaSetChEnable( DMA_CH1, DMA_HW ); - setSCI1DMAReceiveInterrupt(); -} -#endif - -/*********************************************************************//** - * @brief * The isCANBoxForXmit function determines whether a given CAN message box * is configured for transmit. * @details Inputs: CAN_OUT_BUFFERS[] @@ -654,39 +516,7 @@ return result; } -/*********************************************************************//** - * @brief - * The transmitNextUARTPacket function sets up and initiates a DMA transmit - * of the next packet pending transmit (if any) via UART. - * @details Inputs: Output UART Comm Buffer(s) - * @details Outputs: UART DMA transmit initiated. - * @return number of bytes transmitted - *************************************************************************/ -#ifdef DEBUG_ENABLED -static U32 transmitNextUARTPacket( void ) -{ - U32 result = 0; - U32 dataPend = numberOfBytesInCommBuffer( COMM_BUFFER_OUT_UART_PC ); - if ( dataPend > 0 ) - { - result = getFromCommBuffer( COMM_BUFFER_OUT_UART_PC, pcXmitPacket, dataPend ); - - // If there is data to transmit, transmit it - if ( result > 0 ) - { - signalSCI1XmitsInitiated(); - pcDMAXmitControlRecord.FRCNT = result; // Set DMA transfer size - dmaSetCtrlPacket( DMA_CH3, pcDMAXmitControlRecord ); - dmaSetChEnable( DMA_CH3, DMA_HW ); - setSCI1DMATransmitInterrupt(); - } - } - - return result; -} -#endif - /************************************************************************* ********************** RECEIVE SUPPORT FUNCTIONS ************************* *************************************************************************/ @@ -922,8 +752,10 @@ if ( TRUE == uiDidCommunicate ) { if ( TRUE == didTimeout( timeOfLastUICheckIn, UI_COMM_TIMEOUT_IN_MS ) ) - { - activateAlarmNoData( ALARM_ID_UI_COMM_TIMEOUT ); + { +#ifndef DISABLE_UI_COMM_TO_ALARM + activateAlarmNoData( ALARM_ID_UI_COMM_TIMEOUT ); +#endif } if ( TRUE == didTimeout( timeOfLastDGCheckIn, DG_COMM_TIMEOUT_IN_MS ) ) @@ -1045,7 +877,13 @@ // 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 ) ) ) + U32 timeoutPeriod = MSG_NOT_ACKED_TIMEOUT_MS; // set the timeout as default + + if ( MODE_INIT == getCurrentOperationMode() ) + { // change it to longer timeout if the HD is in INIT state + timeoutPeriod = MSG_NOT_ACKED_TIMEOUT_MS_INIT; + } + if ( ( TRUE == pendingAckList[ i ].used ) && ( TRUE == didTimeout( pendingAckList[ i ].timeStamp, timeoutPeriod ) ) ) { // If retries left, reset and resend pending message if ( pendingAckList[ i ].retries > 0 ) { // Re-queue message for transmit @@ -1146,23 +984,15 @@ handleDGTemperatureData( message ); break; - case MSG_ID_RO_PUMP_DATA: - handleROPumpData( message ); + case MSG_ID_DG_DIALYSATE_FLOW_METER_DATA: + handleDialysateFlowData( message ); break; - case MSG_ID_DG_PRESSURES_DATA: - handleDGPressuresData( message ); - break; - - case MSG_ID_DRAIN_PUMP_DATA: - handleDrainPumpData( message ); - break; - case MSG_ID_DG_OP_MODE: handleDGOpMode( message ); break; - case MSG_ID_DG_RESERVOIR_DATA: + case MSG_ID_DG_RESERVOIRS_DATA: handleDGReservoirData( message ); break; @@ -1306,6 +1136,14 @@ handleHDUsageInfoRequest( message ); break; + case MSG_ID_HD_STOP_RTC_CLOCK: + handleStopHDRTCClock( message ); + break; + + case MSG_ID_DG_CONCENTRATE_MIXING_RATIOS_DATA: + handleDGMixingRatios( message ); + break; + // NOTE: this always must be the last case case MSG_ID_TESTER_LOGIN_REQUEST: handleTesterLogInRequest( message ); @@ -1417,14 +1255,6 @@ handleTestBloodPumpOcclusionOverrideRequest( message ); break; - case MSG_ID_OCCLUSION_DIAL_IN_PUMP_OVERRIDE: - handleTestDialysateInletPumpOcclusionOverrideRequest( message ); - break; - - case MSG_ID_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE: - handleTestDialysateOutletPumpOcclusionOverrideRequest( message ); - break; - case MSG_ID_PRES_OCCL_SEND_INTERVAL_OVERRIDE: handleTestPresOcclBroadcastIntervalOverrideRequest( message ); break; @@ -1523,12 +1353,12 @@ handleHDSoftwareResetRequest( message ); break; - case MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE: - handleTestBloodFlowSignalStrengthOverrideRequest( message ); + case MSG_ID_BLOOD_ROTOR_COUNT_OVERRIDE: + handleHDBloodPumpRotorCountOverrideRequest( message ); break; - case MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE: - handleTestDialInFlowSignalStrengthOverrideRequest( message ); + case MSG_ID_SET_ARTERIAL_PRESSURE_OFFSET: + handleHDSetArterialPressureOffsetRequest( message ); break; case MSG_ID_BLOOD_PUMP_HOME_CMD: @@ -1599,18 +1429,10 @@ handleBatteryRemainingPercentOverrideRequest( message ); break; - case MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE: - handleBloodPrimeSafetyVolumeOverrideRequest( message ); - break; - case MSG_ID_HD_RINSEBACK_VOLUME_OVERRIDE: handleRinsebackVolumeOverrideRequest( message ); break; - case MSG_ID_HD_RINSEBACK_SAFETY_VOLUME_OVERRIDE: - handleRinsebackSafetyVolumeOverrideRequest( message ); - break; - case MSG_ID_HD_SYRINGE_PUMP_SEND_INTERVAL_OVERRIDE: handleTestSyringePumpDataBroadcastIntervalOverrideRequest( message ); break; @@ -1779,6 +1601,21 @@ handleTestPostTreatmentModeSendIntervalOverrideRequest( message ); break; + case MSG_ID_HD_BLOCK_MESSAGE_TRANSMISSION: + handleTestBlockMessagesRequest( message ); + break; + + case MSG_ID_HD_SYRINGE_PUMP_FORCE_SENSOR_DAC_CALIBRATE: + handleTestSyringePumpForceSensorCalibrateRequest( message ); + break; + + case MSG_ID_HD_FAN_RPM_ALARM_START_TIME_OFFSET_OVERRIDE: + handleTestFansRPMAlarmStartTimeOffsetOverrideRequest( message ); + + case MSG_ID_HD_SYRINGE_PUMP_HEPRIN_BOLUS_TARGET_RATE_OVERRIDE: + handleTestSyringePumpHeprinBolusTargetRateOverrideRequest( message ); + break; + default: // Unrecognized message ID received - ignore break;