Index: firmware/.cproject =================================================================== diff -u -ra673b3fdaed36dc1e30bce51c8d90218cc96fccb -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/.cproject (.../.cproject) (revision a673b3fdaed36dc1e30bce51c8d90218cc96fccb) +++ firmware/.cproject (.../.cproject) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -49,6 +49,7 @@ Index: firmware/App/Controllers/Buttons.c =================================================================== diff -u -r0c2b4420fcab891fae916fff9122685e6c583eda -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision 0c2b4420fcab891fae916fff9122685e6c583eda) +++ firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -353,9 +353,7 @@ sendOffButtonMsgToUI( OFF_BUTTON_CMD_PROMPT_USER_TO_CONFIRM ); offRequestAwaitingUserConfirmation = TRUE; offRequestPendingTimer = 0; -#ifdef SIMULATE_UI userConfirmOffButton( OFF_BUTTON_RSP_USER_REQUESTS_POWER_OFF ); -#endif } } prevOffButtonState = getOffButtonState(); Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -ra04ab4724f0df3a7144f6a8e357abe8b2f41dfbf -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision a04ab4724f0df3a7144f6a8e357abe8b2f41dfbf) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -50,8 +50,8 @@ #define MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.12 ///< Controller will error if PWM duty cycle < 10%, so set min to 12%. #define DOP_CONTROL_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate outlet pump is controlled. -#define DOP_P_COEFFICIENT 0.003 ///< P term for dialysate outlet pump control. -#define DOP_I_COEFFICIENT 0.001 ///< I term for dialysate outlet pump control. +#define DOP_P_COEFFICIENT 0.0014 ///< P term for dialysate outlet pump control. +#define DOP_I_COEFFICIENT 0.0001 ///< I term for dialysate outlet pump control. #define DOP_MAX_CURR_WHEN_STOPPED_MA 150.0 ///< Motor controller current should not exceed this when pump should be stopped. #define DOP_MIN_CURR_WHEN_RUNNING_MA 150.0 ///< Motor controller current should always exceed this when pump should be running. Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r926afe9b1d9cc6931cbca48080e4a66385a20239 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 926afe9b1d9cc6931cbca48080e4a66385a20239) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -30,7 +30,7 @@ // ********** private definitions ********** /// Default publication interval for pressure and occlusion data. -#define PRES_OCCL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) // interval (ms/task time) at which the pressure/occlusion data is published on the CAN bus. +#define PRES_OCCL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the pressure/occlusion data is published on the CAN bus. /// Defined states for the pressure and occlusion monitor state machine. typedef enum PresOccl_States Index: firmware/App/Drivers/Comm.c =================================================================== diff -u -rf7e3018ec6ab762fe08efb42b21fb2ca970174b0 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Drivers/Comm.c (.../Comm.c) (revision f7e3018ec6ab762fe08efb42b21fb2ca970174b0) +++ firmware/App/Drivers/Comm.c (.../Comm.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -27,7 +27,9 @@ // ********** private data ********** static volatile BOOL canXmitsInProgress = FALSE; -static volatile BOOL uartXmitsInProgress = FALSE; +#ifdef DEBUG_ENABLED + static volatile BOOL uartXmitsInProgress = FALSE; +#endif /************************************************************************* * @brief signalCANXmitsInitiated @@ -69,10 +71,12 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void signalSCI1XmitsInitiated( void ) { uartXmitsInProgress = TRUE; } +#endif /************************************************************************* * @brief signalSCI1XmitsCompleted @@ -84,10 +88,12 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void signalSCI1XmitsCompleted( void ) { uartXmitsInProgress = FALSE; } +#endif /************************************************************************* * @brief setSCI1DMAReceiveInterrupt @@ -99,10 +105,12 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void setSCI1DMAReceiveInterrupt( void ) { sciREG->SETINT = SCI_DMA_RECEIVE_INT; } +#endif /************************************************************************* * @brief setSCI1DMATransmitInterrupt @@ -114,10 +122,12 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void setSCI1DMATransmitInterrupt( void ) { sciREG->SETINT = SCI_DMA_TRANSMIT_INT; } +#endif /************************************************************************* * @brief clearSCI1DMAReceiveInterrupt @@ -129,10 +139,12 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void clearSCI1DMAReceiveInterrupt( void ) { sciREG->CLEARINT = SCI_DMA_RECEIVE_INT; } +#endif /************************************************************************* * @brief clearSCI1DMATransmitInterrupt @@ -144,10 +156,12 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void clearSCI1DMATransmitInterrupt( void ) { sciREG->CLEARINT = SCI_DMA_TRANSMIT_INT; } +#endif /************************************************************************* * @brief setSCI2DMAReceiveInterrupt @@ -251,6 +265,7 @@ * @param none * @return TRUE if a transmit is in progress, FALSE if not *************************************************************************/ +#ifdef DEBUG_ENABLED BOOL isSCI1DMATransmitInProgress( void ) { BOOL transmitterBusy = ( ( sciREG->FLR & (U32)SCI_TX_INT ) == 0U ? TRUE : FALSE ); @@ -259,6 +274,7 @@ return ( ( TRUE == uartXmitsInProgress ) || ( transmitterBusy == TRUE ) || ( dmaTransmitterBusy == TRUE ) ? TRUE : FALSE ); } +#endif /************************************************************************* * @brief isSCI2DMATransmitInProgress Index: firmware/App/Drivers/Comm.h =================================================================== diff -u -r52863cba9685f31136ab3f4b4764a17ccf34fc05 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Drivers/Comm.h (.../Comm.h) (revision 52863cba9685f31136ab3f4b4764a17ccf34fc05) +++ firmware/App/Drivers/Comm.h (.../Comm.h) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -28,22 +28,22 @@ void signalCANXmitsInitiated( void ); void signalCANXmitsCompleted( void ); -void signalSCI1XmitsInitiated( void ); -void signalSCI1XmitsCompleted( void ); -void setSCI1DMAReceiveInterrupt( void ); -void setSCI1DMATransmitInterrupt( void ); -void clearSCI1DMAReceiveInterrupt( void ); -void clearSCI1DMATransmitInterrupt( void ); +#ifdef DEBUG_ENABLED + void signalSCI1XmitsInitiated( void ); + void signalSCI1XmitsCompleted( void ); + void setSCI1DMAReceiveInterrupt( void ); + void setSCI1DMATransmitInterrupt( void ); + void clearSCI1DMAReceiveInterrupt( void ); + void clearSCI1DMATransmitInterrupt( void ); + void clearSCI1CommErrors( void ); + BOOL isSCI1DMATransmitInProgress( void ); +#endif void setSCI2DMAReceiveInterrupt( void ); void setSCI2DMATransmitInterrupt( void ); void clearSCI2DMAReceiveInterrupt( void ); void clearSCI2DMATransmitInterrupt( void ); - -void clearSCI1CommErrors( void ); void clearSCI2CommErrors( void ); - -BOOL isSCI1DMATransmitInProgress( void ); BOOL isSCI2DMATransmitInProgress( void ); BOOL isCAN1TransmitInProgress( void ); Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -ra673b3fdaed36dc1e30bce51c8d90218cc96fccb -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision a673b3fdaed36dc1e30bce51c8d90218cc96fccb) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -20,6 +20,7 @@ #include "DialInFlow.h" #include "DialOutFlow.h" #include "OperationModes.h" +#include "TaskGeneral.h" #include "Timers.h" #include "ModeTreatment.h" @@ -30,6 +31,10 @@ // ********** private definitions ********** +#define MAX_UF_ACCURACY_ERROR_ML 250 ///< Maximum ultrafiltration accuracy error in mL over the entire treatment. +#define MAX_UF_ACCURACY_ERROR_ML_PER_HR 100 ///< Maximum ultrafiltration accuracy error in mL/hr. +#define UF_ACCURACY_CHECK_INTERVAL ((1 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND) / TASK_GENERAL_INTERVAL) ///< Ultrafiltration rate accuracy check interval count + /// Enumeration of dialysis sub-mode states. typedef enum Dialysis_States { @@ -67,6 +72,9 @@ static F32 maxUFVolumeML; ///< Currently set total ultrafiltration volume for treatment (from prescription). static F32 setUFRate; ///< Currently set ultrafiltration rate (from prescription). +static U32 uFAccuracyCheckTimerCtr; ///< Timer counter to determine when next to check ultrafiltration accuracy. +static F32 lastUFVolumeChecked; ///< Starting ultrafiltration volume for accuracy check. + // ********** private function prototypes ********** static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ); @@ -77,6 +85,7 @@ static UF_STATE_T handleUFRunningState( void ); static UF_STATE_T handleUFCompletedOrOffState( void ); +static void checkUFAccuracy( void ); static void updateUFVolumes( void ); /*********************************************************************//** @@ -106,6 +115,9 @@ setDialysateFlowRate = 0; maxUFVolumeML = 0.0; setUFRate = 0.0; + + uFAccuracyCheckTimerCtr = 0; + lastUFVolumeChecked = 0.0; } /*********************************************************************//** @@ -349,6 +361,12 @@ // calculate UF volumes and provide to dialysate outlet pump controller updateUFVolumes(); + // if we've reached target UF volume, UF is complete + if ( measUFVolume >= maxUFVolumeML ) + { + result = UF_COMPLETED_OR_OFF_STATE; + } + // TODO - test code - remove later if ( TRUE == isStopButtonPressed() ) { @@ -385,6 +403,41 @@ /*********************************************************************//** * @brief + * The checkUFAccuracy function checks ultrafiltration accuracy for the last \n + * minute and triggers an alarm if out of spec. + * @details + * Inputs : uFAccuracyCheckTimerCtr, lastUFVolumeChecked, measUFVolume + * Outputs : uFAccuracyCheckTimerCtr, lastUFVolumeChecked + * @return none + *************************************************************************/ +static void checkUFAccuracy( void ) +{ + // check UF accuracy at 1 hour intervals + if ( ++uFAccuracyCheckTimerCtr >= UF_ACCURACY_CHECK_INTERVAL ) + { + F32 uFMeasRatePerHr = measUFVolume - lastUFVolumeChecked; + F32 uFSetRatePerHr = ( setUFRate * (F32)MIN_PER_HOUR ); + F32 uFRateError = uFSetRatePerHr - uFMeasRatePerHr; + + // check UF accuracy + if ( uFRateError > (F32)MAX_UF_ACCURACY_ERROR_ML_PER_HR ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_UF_RATE_ACCURACY_ERROR, uFSetRatePerHr, uFMeasRatePerHr ); + } + // reset for next check + lastUFVolumeChecked = measUFVolume; + uFAccuracyCheckTimerCtr = 0; + } + + // check total UF volume error + if ( ( FABS( refUFVolume - measUFVolume ) ) >= (F32)MAX_UF_ACCURACY_ERROR_ML ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_UF_VOLUME_ACCURACY_ERROR, refUFVolume, measUFVolume ); + } +} + +/*********************************************************************//** + * @brief * The updateUFVolumes function updates the ultrafiltration volumes based on \n * set UF rate, latest UF elapsed time, and the latest load cell weight for the \n * currently used reservoir. Updated UF volumes are then sent to the dialysate \n Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r57ee0134869672b53ab5b7146b8988ede8f828d6 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -119,8 +119,8 @@ break; case POST_STATE_RTC: - //testStatus = execRTCSelfTest(); - postState = POST_STATE_STUCK_BUTTON; //handlePOSTStatus( testStatus ); + testStatus = execRTCSelfTest(); + postState = handlePOSTStatus( testStatus ); break; case POST_STATE_STUCK_BUTTON: Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -ra673b3fdaed36dc1e30bce51c8d90218cc96fccb -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a673b3fdaed36dc1e30bce51c8d90218cc96fccb) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -37,17 +37,21 @@ #define TREATMENT_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) // interval (ms/task time) at which the treatment time data is published on the CAN bus +/// Sub-mode states while in treatment mode typedef enum Treatment_States { - TREATMENT_START_STATE = 0, - TREATMENT_DIALYSIS_STATE, - TREATMENT_STOP_STATE, - TREATMENT_RINSEBACK_STATE, - TREATMENT_RB_RC_PAUSE_STATE, - TREATMENT_RECIRC_STATE, - TREATMENT_BYPASS_RECIRC_STATE, - TREATMENT_END_STATE, - NUM_OF_TREATMENT_STATES + TREATMENT_START_STATE = 0, ///< Start treatment, prime blood side with gradual ramp for 1 min. while dialyzer is bypassed. No dialysis or UF taking place. + TREATMENT_DIALYSIS_STATE, ///< Perform dialysis. Deliver Heparin as prescribed. Deliver UF as prescribed. Handle saline boluses as requested. + TREATMENT_STOP_STATE, ///< Treatment stopped. All pumps off. Dializer bypassed. + TREATMENT_RINSEBACK_STATE, ///< Perform rinseback with saline. Dialyzer bypassed. Dialysate recirculating. + TREATMENT_RINSEBACK_PAUSE_STATE, ///< Rinseback paused. Blood pump off. Dialyzer bypassed. Dialysate recirculating. + TREATMENT_RECIRC_SETUP_STATE, ///< Rinseback complete. Blood pump off. Blood lines closed. User to disconnect and shunt blood lines. + TREATMENT_RECIRC_STATE, ///< Recirculate saline and dialysate while patient disconnected. Blood lines open and shunted. Dialyzer is bypassed. + TREATMENT_RECIRC_PAUSE_STATE, ///< Recirculate paused. Blood pump off. Blood lines closed and shunted. Dialyzer is bypassed. + TREATMENT_RECIRC_STOP_STATE, ///< Recirculate stopped. Blood pump off. Blood lines open. Waiting for patient to unshunt and connect and resume treatment. + TREATMENT_DIALYSIS_END_STATE, ///< Dialysis has ended. Blood pump slowed. Dialyzer is bypassed. Dialysate is recirculated. User can rinseback. + TREATMENT_END_STATE, ///< Treatment has ended. All pumps off. Dialyzer is bypassed. Blood lines are closed. User to disconnect. + NUM_OF_TREATMENT_STATES ///< # of treatment states (sub-modes). } TREATMENT_STATE_T; // ********** private data ********** @@ -101,7 +105,7 @@ *************************************************************************/ void transitionToTreatmentMode( void ) { - // initialize mode each time we transition to it + // initialize treatment mode each time we transition to it initTreatmentMode(); // initialize treatment sub-modes each time we transition to treatment mode initDialysis(); @@ -158,18 +162,30 @@ // TODO - implement break; - case TREATMENT_RB_RC_PAUSE_STATE: + case TREATMENT_RINSEBACK_PAUSE_STATE: // TODO - implement break; + case TREATMENT_RECIRC_SETUP_STATE: + // TODO - implement + break; + case TREATMENT_RECIRC_STATE: // TODO - implement break; - case TREATMENT_BYPASS_RECIRC_STATE: + case TREATMENT_RECIRC_PAUSE_STATE: // TODO - implement break; + case TREATMENT_RECIRC_STOP_STATE: + // TODO - implement + break; + + case TREATMENT_DIALYSIS_END_STATE: + // TODO - implement + break; + case TREATMENT_END_STATE: // TODO - implement requestNewOperationMode( MODE_POST ); // TODO - test code - remove later @@ -256,8 +272,10 @@ treatmentTimeMS += msSinceLast; lastTreatmentTimeStamp = newTime; + // execute state machine for treatment dialysis sub-mode execDialysis(); + // TODO - test code - remove later if ( getOffButtonState() == BUTTON_STATE_PRESSED ) { if ( lastOffButtonState == BUTTON_STATE_RELEASED ) @@ -289,8 +307,10 @@ { TREATMENT_STATE_T result = TREATMENT_STOP_STATE; + // execute state machine for treatment stop sub-mode execTreatmentStop(); + // TODO - test code - remove later if ( getOffButtonState() == BUTTON_STATE_PRESSED ) { if ( lastOffButtonState == BUTTON_STATE_RELEASED ) Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r79f3a45ee472c053fd191e8196245729703ebab3 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 79f3a45ee472c053fd191e8196245729703ebab3) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -95,6 +95,8 @@ { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_ARTERIAL_PRESSURE_HIGH { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_VENOUS_PRESSURE_LOW { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_VENOUS_PRESSURE_HIGH + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_UF_RATE_ACCURACY_ERROR + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_UF_VOLUME_ACCURACY_ERROR }; /// A blank alarm data record for alarms that do not include alarm data when triggered. Index: firmware/App/Services/CommBuffers.h =================================================================== diff -u -r52863cba9685f31136ab3f4b4764a17ccf34fc05 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision 52863cba9685f31136ab3f4b4764a17ccf34fc05) +++ firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -36,8 +36,10 @@ COMM_BUFFER_IN_CAN_UI_BROADCAST, COMM_BUFFER_IN_CAN_PC, COMM_BUFFER_OUT_CAN_PC, +#ifdef DEBUG_ENABLED COMM_BUFFER_IN_UART_PC, COMM_BUFFER_OUT_UART_PC, +#endif NUM_OF_COMM_BUFFERS } COMM_BUFFER_T; Index: firmware/App/Services/Interrupts.c =================================================================== diff -u -rf7e3018ec6ab762fe08efb42b21fb2ca970174b0 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision f7e3018ec6ab762fe08efb42b21fb2ca970174b0) +++ firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -35,8 +35,10 @@ // ********** private data ********** -static U32 sci1FrameErrorCnt = 0; -static U32 sci1OverrunErrorCnt = 0; +#ifdef DEBUG_ENABLED + static U32 sci1FrameErrorCnt = 0; + static U32 sci1OverrunErrorCnt = 0; +#endif static U32 sci2FrameErrorCnt = 0; static U32 sci2OverrunErrorCnt = 0; @@ -161,60 +163,57 @@ // TODO - temporary debug code - remove later char debugStr[ 256 ]; #endif - if ( sci == sciREG ) + + if ( sci == scilinREG ) { if ( ( flags & SCI_FE_INT ) != 0 ) { - sci1FrameErrorCnt++; - clearSCI1CommErrors(); + sci2FrameErrorCnt++; + clearSCI2CommErrors(); // TODO - try to do something to recover (+ max retries = comm fault) #ifdef DEBUG_ENABLED // TODO - temporary debug code - remove later - sprintf( debugStr, "Debug UART frame error:%5d \n", sci1FrameErrorCnt ); + sprintf( debugStr, "FPGA UART frame error:%5d \n", sci2FrameErrorCnt ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); #endif } if ( ( flags & SCI_OE_INT ) != 0 ) { - sci1OverrunErrorCnt++; - clearSCI1CommErrors(); + sci2OverrunErrorCnt++; + clearSCI2CommErrors(); // TODO - try to do something to recover (+ max retries = comm fault) #ifdef DEBUG_ENABLED // TODO - temporary debug code - remove later - sprintf( debugStr, "Debug UART overrun error:%5d \n", sci1OverrunErrorCnt ); + sprintf( debugStr, "FPGA UART overrun error:%5d \n", sci2OverrunErrorCnt ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); #endif } } - else if ( sci == scilinREG ) +#ifdef DEBUG_ENABLED + if ( sci == sciREG ) { if ( ( flags & SCI_FE_INT ) != 0 ) { - sci2FrameErrorCnt++; - clearSCI2CommErrors(); + sci1FrameErrorCnt++; + clearSCI1CommErrors(); // TODO - try to do something to recover (+ max retries = comm fault) -#ifdef DEBUG_ENABLED + // TODO - temporary debug code - remove later - sprintf( debugStr, "FPGA UART frame error:%5d \n", sci2FrameErrorCnt ); + sprintf( debugStr, "Debug UART frame error:%5d \n", sci1FrameErrorCnt ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); -#endif } if ( ( flags & SCI_OE_INT ) != 0 ) { - sci2OverrunErrorCnt++; - clearSCI2CommErrors(); + sci1OverrunErrorCnt++; + clearSCI1CommErrors(); // TODO - try to do something to recover (+ max retries = comm fault) -#ifdef DEBUG_ENABLED + // TODO - temporary debug code - remove later - sprintf( debugStr, "FPGA UART overrun error:%5d \n", sci2OverrunErrorCnt ); + sprintf( debugStr, "Debug UART overrun error:%5d \n", sci1OverrunErrorCnt ); sendDebugData( (U08*)debugStr, strlen(debugStr) ); -#endif } } - else - { - // TODO - ignore? - should not be any other SCI peripherals - } +#endif } /************************************************************************* @@ -238,23 +237,25 @@ signalFPGAReceiptCompleted(); break; +#ifdef DEBUG_ENABLED case DMA_CH1: // PC receive channel clearSCI1DMAReceiveInterrupt(); // handle received packet from PC handleUARTMsgRecvPacketInterrupt(); break; - +#endif case DMA_CH2: // FPGA transmit channel clearSCI2DMATransmitInterrupt(); signalFPGATransmitCompleted(); break; +#ifdef DEBUG_ENABLED case DMA_CH3: // PC transmit channel clearSCI1DMATransmitInterrupt(); // send next pending packet to PC (if any) handleUARTMsgXmitPacketInterrupt(); break; - +#endif default: // TODO - ignore? break; Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -ra673b3fdaed36dc1e30bce51c8d90218cc96fccb -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision a673b3fdaed36dc1e30bce51c8d90218cc96fccb) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -37,7 +37,11 @@ #define NUM_OF_CAN_OUT_BUFFERS 5 // # of CAN buffers for transmit #define NUM_OF_CAN_IN_BUFFERS 7 // # of CAN buffers for receiving -#define NUM_OF_MSG_IN_BUFFERS 8 // # of Msg buffers for receiving - 1 is UART +#ifdef DEBUG_ENABLED + #define NUM_OF_MSG_IN_BUFFERS 8 // # of Msg buffers for receiving - 1 is UART +#else + #define NUM_OF_MSG_IN_BUFFERS 7 // # of Msg buffers for receiving +#endif #define SCI1_RECEIVE_DMA_REQUEST 30 #define SCI1_TRANSMIT_DMA_REQUEST 31 @@ -54,7 +58,7 @@ #define MSG_NOT_ACKED_MAX_RETRIES 3 #define PENDING_ACK_LIST_SIZE 25 -#pragma pack(push,1) +#pragma pack(push, 1) typedef struct { @@ -89,24 +93,31 @@ 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 ]; static CAN_MESSAGE_BOX_T lastCANPacketSentChannel = (CAN_MESSAGE_BOX_T)0; static U32 lastCANPacketSentTimeStamp = 0; -static U08 pcXmitPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -static U08 pcRecvPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; +#ifdef DEBUG_ENABLED + static U08 pcXmitPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + static U08 pcRecvPacket[ PC_MESSAGE_PACKET_SIZE ] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + // DMA control records + static g_dmaCTRL pcDMAXmitControlRecord; // DMA transmit control record (UART-debug) + static g_dmaCTRL pcDMARecvControlRecord; // DMA receive control record (UART-debug) + + //static U08 dbgRcvFromDialin[2048]; + //static U32 dbgRcvFromDialinIdx = 0; +#endif + #ifndef ACK_NOT_IMPLEMENTED static PENDING_ACK_RECORD_T pendingAckList[ PENDING_ACK_LIST_SIZE ]; // list of outgoing messages that are awaiting an ACK #endif -// DMA control records -static g_dmaCTRL pcDMAXmitControlRecord; // DMA transmit control record (UART-debug) -static g_dmaCTRL pcDMARecvControlRecord; // DMA receive control record (UART-debug) - static volatile BOOL dgIsCommunicating = FALSE; // has DG sent a message since last check static U32 timeOfLastDGCheckIn = 0; // last time DG checked in static volatile BOOL uiIsCommunicating = FALSE; // has UI sent a message since last check @@ -117,11 +128,6 @@ static U32 badCRCListIdx = 0; // where next bad message CRC time stamp will go in list static U32 badCRCListCount = 0; // # of bad CRCs in the list -//#ifdef DEBUG_ENABLED -//static U08 dbgRcvFromDialin[2048]; -//static U32 dbgRcvFromDialinIdx = 0; -//#endif - #ifdef CAN_TEST U08 dbgRcvdCANFrames[2048][8]; U32 dbgRcvdCANFrameTS[2048]; @@ -136,13 +142,16 @@ // ********** private function prototypes ********** -static void initUARTAndDMA( void ); +#ifdef DEBUG_ENABLED + static void initUARTAndDMA( void ); + static U32 transmitNextUARTPacket( void ); +#endif + static BOOL isCANBoxForXmit( CAN_MESSAGE_BOX_T srcCANBox ); static BOOL isCANBoxForRecv( CAN_MESSAGE_BOX_T srcCANBox ); static COMM_BUFFER_T findNextHighestPriorityCANPacketToTransmit( void ); static U32 transmitNextCANPacket( void ); -static U32 transmitNextUARTPacket( void ); static void processIncomingData( void ); static S32 parseMessageFromBuffer( U08 *data, U32 len ); @@ -171,8 +180,10 @@ { U32 i; +#ifdef DEBUG_ENABLED // initialize UART and DMA for PC communication initUARTAndDMA(); +#endif // initialize bad message CRC list for ( i = 0; i < MAX_COMM_CRC_FAILURES; i++ ) @@ -327,6 +338,7 @@ } } +#ifdef DEBUG_ENABLED // if UART transmitter is idle, start transmitting any pending packets if ( FALSE == isSCI1DMATransmitInProgress() ) { @@ -349,6 +361,7 @@ // } } #endif +#endif } /************************************************************************* @@ -430,6 +443,7 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void handleUARTMsgRecvPacketInterrupt( void ) { // buffer received packet @@ -439,6 +453,7 @@ dmaSetChEnable( DMA_CH1, DMA_HW ); setSCI1DMAReceiveInterrupt(); } +#endif /************************************************************************* * @brief handleUARTMsgXmitPacketInterrupt @@ -450,6 +465,7 @@ * @param none * @return none *************************************************************************/ +#ifdef DEBUG_ENABLED void handleUARTMsgXmitPacketInterrupt( void ) { U32 bytesXmitted = transmitNextUARTPacket(); @@ -459,6 +475,7 @@ signalSCI1XmitsCompleted(); } } +#endif /************************************************************************* * @brief initUARTAndDMA @@ -470,11 +487,13 @@ * @param none * @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 ); @@ -523,6 +542,7 @@ dmaSetChEnable( DMA_CH1, DMA_HW ); setSCI1DMAReceiveInterrupt(); } +#endif /************************************************************************* * @brief isCANBoxForXmit @@ -687,6 +707,7 @@ * @param msg : none * @return # of bytes transmitted *************************************************************************/ +#ifdef DEBUG_ENABLED static U32 transmitNextUARTPacket( void ) { U32 result = 0; @@ -710,8 +731,8 @@ return result; } +#endif - /************************************************************************* ********************** RECEIVE SUPPORT FUNCTIONS ************************* *************************************************************************/ Index: firmware/App/Services/SystemComm.h =================================================================== diff -u -r6c60d0d0300828750c76f2e397d4e7ccaa84bbb2 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/SystemComm.h (.../SystemComm.h) (revision 6c60d0d0300828750c76f2e397d4e7ccaa84bbb2) +++ firmware/App/Services/SystemComm.h (.../SystemComm.h) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -26,24 +26,28 @@ #define MESSAGE_SYNC_BYTE 0xA5 #define CAN_MESSAGE_PAYLOAD_SIZE 8 -#define PC_MESSAGE_PACKET_SIZE 8 +#ifdef DEBUG_ENABLED + #define PC_MESSAGE_PACKET_SIZE 8 +#endif #define MSG_ID_ACK 0xFFFF #define MSG_ACK_BIT 0x8000 #define MAX_MSG_SEQ_NO 0x7FFF #define MIN_MSG_SEQ_NO 0x0001 #define MAX_ACK_MSG_SIZE ( sizeof( MESSAGE_WRAPPER_T ) + 1 + CAN_MESSAGE_PAYLOAD_SIZE ) // must hold full (wrapped) message + sync + any CAN padding -typedef COMM_BUFFER_T CAN_MESSAGE_BOX_T; // the first 12 comm buffers align with the 12 active CAN message boxes +typedef COMM_BUFFER_T CAN_MESSAGE_BOX_T; // the CAN comm buffers align with the active CAN message boxes // ********** public function prototypes ********** void initSystemComm( void ); void execSystemCommRx( void ); void execSystemCommTx( void ); void handleCANMsgInterrupt( CAN_MESSAGE_BOX_T srcCANBox ); +#ifdef DEBUG_ENABLED void handleUARTMsgRecvPacketInterrupt( void ); void handleUARTMsgXmitPacketInterrupt( void ); +#endif void checkInFromDG( void ); void checkInFromUI( void ); BOOL isDGCommunicating( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r0c2b4420fcab891fae916fff9122685e6c583eda -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 0c2b4420fcab891fae916fff9122685e6c583eda) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -712,6 +712,7 @@ * @param len : # of bytes of debug data * @return TRUE if debug data was successfully queued for transmit, FALSE if not *************************************************************************/ +#ifdef DEBUG_ENABLED BOOL sendDebugData( U08 *dbgData, U32 len ) { BOOL result; @@ -721,6 +722,7 @@ return result; } +#endif /************************************************************************* * @brief isTestingActivated Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r0c2b4420fcab891fae916fff9122685e6c583eda -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 0c2b4420fcab891fae916fff9122685e6c583eda) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -143,8 +143,10 @@ // *********** public test support message functions ********** +#ifdef DEBUG_ENABLED // DEBUG OUTPUT BOOL sendDebugData( U08 *dbgData, U32 len ); +#endif // MSG_TESTER_LOG_IN void handleTesterLogInRequest( MESSAGE_T *message ); Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -rf7e3018ec6ab762fe08efb42b21fb2ca970174b0 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision f7e3018ec6ab762fe08efb42b21fb2ca970174b0) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -107,7 +107,11 @@ } // check to see if watchdog has expired +#ifdef BREADBOARD2_TARGET + if ( getCPLDWatchdogExpired() == PIN_SIGNAL_LOW ) +#else if ( getCPLDWatchdogExpired() == PIN_SIGNAL_HIGH ) +#endif { // ignore expired watchdog until after watchdog POST if ( WATCHDOG_SELF_TEST_STATE_COMPLETE == watchdogSelfTestState ) Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r48278ac6fa3738a97349ed7f3278773daf1d8004 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -57,7 +57,7 @@ execSystemCommRx(); // prevent most processing until UI has started communicating -#ifndef RM46_EVAL_BOARD_TARGET +#ifndef SIMULATE_UI if ( TRUE == uiCommunicated() ) #endif { Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r48278ac6fa3738a97349ed7f3278773daf1d8004 -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -37,7 +37,7 @@ void taskPriority( void ) { // prevent most processing until UI has started communicating -#ifndef RM46_EVAL_BOARD_TARGET +#ifndef SIMULATE_UI if ( TRUE == uiCommunicated() ) #endif { Index: firmware/HD.dil =================================================================== diff -u -r0c2b4420fcab891fae916fff9122685e6c583eda -r2e6c750c202b7361d79488ce383e34f380e75413 --- firmware/HD.dil (.../HD.dil) (revision 0c2b4420fcab891fae916fff9122685e6c583eda) +++ firmware/HD.dil (.../HD.dil) (revision 2e6c750c202b7361d79488ce383e34f380e75413) @@ -1,4 +1,4 @@ -# RM46L852PGE 02/11/20 08:33:36 +# RM46L852PGE 02/26/20 17:20:35 # ARCH=RM46L852PGE # @@ -7207,7 +7207,7 @@ DRIVER.PINMUX.VAR.DMA_IFT_COUNT_24.VALUE=0 DRIVER.PINMUX.VAR.DMA_IFT_COUNT_16.VALUE=0 DRIVER.PINMUX.VAR.DMA_INTLFSEN_12.VALUE=1 -DRIVER.PINMUX.VAR.MUX30_OPTION0.VALUE=1 +DRIVER.PINMUX.VAR.MUX30_OPTION0.VALUE=0 DRIVER.PINMUX.VAR.MUX22_OPTION0.VALUE=0 DRIVER.PINMUX.VAR.MUX14_OPTION0.VALUE=0 DRIVER.PINMUX.VAR.DMA_FIDXD_29.VALUE=0