Index: firmware/App/Common.h =================================================================== diff -u -r8e53754325653805a454de6d82c0c8ca90e068a0 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Common.h (.../Common.h) (revision 8e53754325653805a454de6d82c0c8ca90e068a0) +++ firmware/App/Common.h (.../Common.h) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -99,6 +99,7 @@ #define GET_MSW_OF_LONG(l) ((U16)(((l) >> SHIFT_16_BITS_FOR_WORD_SHIFT) & MASK_OFF_MSW)) #define MAKE_WORD_OF_BYTES(h,l) ((((U16)(h) << SHIFT_8_BITS_FOR_BYTE_SHIFT) & MASK_OFF_LSB) | ((U16)(l) & MASK_OFF_MSB)) #define MAKE_LONG_OF_WORDS(h,l) ((((U32)(h) << SHIFT_16_BITS_FOR_WORD_SHIFT) & MASK_OFF_LSW) | ((U32)(l) & MASK_OFF_MSW)) +#define GET_TOGGLE(v,l,h) ((v) == (l) ? (h) : (l)) #define SET_ALARM_WITH_1_U32_DATA(a,d1) { \ ALARM_DATA_T dat1; \ Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r8e53754325653805a454de6d82c0c8ca90e068a0 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 8e53754325653805a454de6d82c0c8ca90e068a0) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -22,6 +22,7 @@ #include "Common.h" #include "FPGA.h" #include "InternalADC.h" +#include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TaskPriority.h" @@ -49,7 +50,7 @@ #define BP_MAX_CURR_WHEN_STOPPED_MA 150.0 // motor controller current should not exceed this when pump should be stopped #define BP_MIN_CURR_WHEN_RUNNING_MA 150.0 // motor controller current should always exceed this when pump should be running #define BP_MAX_CURR_WHEN_RUNNING_MA 1000.0 // motor controller current should not exceed this when pump should be running -#define BP_MAX_CURR_ERROR_DURATION_MS 500 // motor controller current errors persisting beyond this duration will trigger an alarm +#define BP_MAX_CURR_ERROR_DURATION_MS 2000 // motor controller current errors persisting beyond this duration will trigger an alarm #define BP_SPEED_ADC_TO_RPM_FACTOR 1.375 // conversion factor from ADC counts to RPM for blood pump motor #define BP_CURRENT_ADC_TO_MA_FACTOR 2.65 // conversion factor from ADC counts to mA for blood pump motor @@ -250,48 +251,54 @@ flowReadingsIdx = INC_WRAP( flowReadingsIdx, 0, SIZE_OF_ROLLING_AVG-1 ); measuredBloodFlowRate.data = flowReadingsTotal / (F32)SIZE_OF_ROLLING_AVG; - if ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) + // don't start enforcing checks until out of init/POST mode + if ( getCurrentOperationMode() != MODE_INIT ) { - // check set direction vs. direction from sign of motor controller speed - bpMCDir = ( getMeasuredBloodPumpSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); - if ( bloodPumpDirectionSet != bpMCDir ) + if ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, (U32)bloodPumpDirectionSet, (U32)bpMCDir ) + // check set direction vs. direction from sign of motor controller speed + bpMCDir = ( getMeasuredBloodPumpSpeed() >= 0.0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); + if ( bloodPumpDirectionSet != bpMCDir ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, (U32)bloodPumpDirectionSet, (U32)bpMCDir ) + } } - } - // check motor controller current thresholds as appropriate - if ( BLOOD_PUMP_OFF_STATE == bloodPumpState ) - { - if ( getMeasuredBloodPumpCurrent() > BP_MAX_CURR_WHEN_STOPPED_MA ) + // check motor controller current thresholds as appropriate + if ( BLOOD_PUMP_OFF_STATE == bloodPumpState ) { - bpCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; - if ( bpCurrErrorDurationCtr > BP_MAX_CURR_ERROR_DURATION_MS ) + F32 bpCurr = fabs(getMeasuredBloodPumpCurrent()); + + if ( bpCurr > BP_MAX_CURR_WHEN_STOPPED_MA ) { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, getMeasuredBloodPumpCurrent() ); + bpCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; + if ( bpCurrErrorDurationCtr > BP_MAX_CURR_ERROR_DURATION_MS ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, getMeasuredBloodPumpCurrent() ); + } } + else + { + bpCurrErrorDurationCtr = 0; + } } - else + else // pump s/b running { - bpCurrErrorDurationCtr = 0; - } - } - else // pump s/b running - { - F32 bpCurr = getMeasuredBloodPumpCurrent(); + F32 bpCurr = fabs(getMeasuredBloodPumpCurrent()); - if ( ( bpCurr < BP_MIN_CURR_WHEN_RUNNING_MA ) || ( bpCurr > BP_MAX_CURR_WHEN_RUNNING_MA ) ) - { - bpCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; - if ( bpCurrErrorDurationCtr > BP_MAX_CURR_ERROR_DURATION_MS ) + if ( ( bpCurr < BP_MIN_CURR_WHEN_RUNNING_MA ) || ( bpCurr > BP_MAX_CURR_WHEN_RUNNING_MA ) ) { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, getMeasuredBloodPumpCurrent() ); + bpCurrErrorDurationCtr += TASK_PRIORITY_INTERVAL; + if ( bpCurrErrorDurationCtr > BP_MAX_CURR_ERROR_DURATION_MS ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, getMeasuredBloodPumpCurrent() ); + } } + else + { + bpCurrErrorDurationCtr = 0; + } } - else - { - bpCurrErrorDurationCtr = 0; - } } // publish blood flow data on interval @@ -302,6 +309,7 @@ F32 measSpd = getMeasuredBloodPumpSpeed(); F32 measCurr = getMeasuredBloodPumpCurrent(); #ifdef DEBUG_ENABLED + // TODO - temporary debug code - remove later S32 pwm = (S32)(100.0*bloodPumpPWMDutyCyclePctSet); char debugFlowStr[256]; Index: firmware/App/Controllers/Buttons.c =================================================================== diff -u -rbe83f01a4d54cbd0d92b68cb95a15dcbb06a9a51 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision be83f01a4d54cbd0d92b68cb95a15dcbb06a9a51) +++ firmware/App/Controllers/Buttons.c (.../Buttons.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -43,7 +43,7 @@ #define OFF_REQUEST_PULSE_INTVL 50 // ms #define STOP_BUTTON_PENDING_TIMEOUT 500 // ms #define STUCK_BUTTON_TIMEOUT 1000 // ms -#define OFF_REQUEST_EXPIRATION_TIME (1000*60) // ms (1 minute) +#define OFF_REQUEST_EXPIRATION_TIME (1000 * 60) // ms (1 minute) #define USER_CONFIRMED 1 #define USER_REJECTED 0 @@ -236,6 +236,8 @@ // is an off request pending user confirmation? if ( TRUE == offRequestAwaitingUserConfirmation ) { + // reset off request pending flag regardless of user response + offRequestAwaitingUserConfirmation = FALSE; // did user confirm? if ( USER_CONFIRMED == response ) { @@ -246,10 +248,6 @@ offRequestPulseTimer = 0; } } - else // user did not confirm - { - offRequestAwaitingUserConfirmation = FALSE; - } } } Index: firmware/App/Drivers/CPLD.c =================================================================== diff -u -rbe83f01a4d54cbd0d92b68cb95a15dcbb06a9a51 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision be83f01a4d54cbd0d92b68cb95a15dcbb06a9a51) +++ firmware/App/Drivers/CPLD.c (.../CPLD.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -229,7 +229,8 @@ PIN_SIGNAL_STATE_T level = GET_OFF(); #ifdef RM46_EVAL_BOARD_TARGET - level = (level == PIN_SIGNAL_LOW ? PIN_SIGNAL_HIGH : PIN_SIGNAL_LOW); + // temporary test code for eval board - buttons have opposite polarity + level = GET_TOGGLE( level, PIN_SIGNAL_LOW, PIN_SIGNAL_LOW ); #endif return level; @@ -250,7 +251,8 @@ PIN_SIGNAL_STATE_T level = GET_STOP(); #ifdef RM46_EVAL_BOARD_TARGET - level = (level == PIN_SIGNAL_LOW ? PIN_SIGNAL_HIGH : PIN_SIGNAL_LOW); + // temporary test code for eval board - buttons have opposite polarity + level = GET_TOGGLE( level, PIN_SIGNAL_LOW, PIN_SIGNAL_LOW ); #endif return level; Index: firmware/App/Drivers/Comm.c =================================================================== diff -u -r90f6438e80dbe0a32472a076a0d1bc54db65d15a -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Drivers/Comm.c (.../Comm.c) (revision 90f6438e80dbe0a32472a076a0d1bc54db65d15a) +++ firmware/App/Drivers/Comm.c (.../Comm.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -24,7 +24,72 @@ #define DMA_CH_STATUS_BIT(ch) ((U32)1U << (ch)) +// ********** private data ********** + +static canXmitsInProgress = FALSE; +static uartXmitsInProgress = FALSE; + /************************************************************************* + * @brief signalCANXmitsInitiated + * The signalCANXmitsInitiated function sets the CAN transmits in \n + * progress flag. + * @details + * Inputs : none + * Outputs : canXmitsInProgress + * @param none + * @return none + *************************************************************************/ +void signalCANXmitsInitiated( void ) +{ + canXmitsInProgress = TRUE; +} + +/************************************************************************* + * @brief signalCANXmitsCompleted + * The signalCANXmitsCompleted function resets the CAN transmits in \n + * progress flag. + * @details + * Inputs : none + * Outputs : canXmitsInProgress + * @param none + * @return none + *************************************************************************/ +void signalCANXmitsCompleted( void ) +{ + canXmitsInProgress = FALSE; +} + +/************************************************************************* + * @brief signalSCI1XmitsInitiated + * The signalSCI1XmitsInitiated function sets the SCI1 transmits in \n + * progress flag. + * @details + * Inputs : none + * Outputs : uartXmitsInProgress + * @param none + * @return none + *************************************************************************/ +void signalSCI1XmitsInitiated( void ) +{ + uartXmitsInProgress = TRUE; +} + +/************************************************************************* + * @brief signalSCI1XmitsCompleted + * The signalSCI1XmitsCompleted function resets the SCI1 transmits in \n + * progress flag. + * @details + * Inputs : none + * Outputs : uartXmitsInProgress + * @param none + * @return none + *************************************************************************/ +void signalSCI1XmitsCompleted( void ) +{ + uartXmitsInProgress = FALSE; +} + +/************************************************************************* * @brief setSCI1DMAReceiveInterrupt * The setSCI1DMAReceiveInterrupt function enables DMA receive interrupts \n * for the SCI1 peripheral. @@ -160,7 +225,7 @@ BOOL dmaTransmitterBusy = ( ( dmaREG->PEND & DMA_CH_STATUS_BIT(DMA_CH3) ) != 0U ? TRUE : FALSE ); - return ( ( transmitterBusy == TRUE ) || ( dmaTransmitterBusy == TRUE ) ? TRUE : FALSE ); + return ( ( TRUE == uartXmitsInProgress ) || ( transmitterBusy == TRUE ) || ( dmaTransmitterBusy == TRUE ) ? TRUE : FALSE ); } /************************************************************************* @@ -193,7 +258,7 @@ *************************************************************************/ BOOL isCAN1TransmitInProgress( void ) { - BOOL result = ( ( canREG1->TXRQx[0] != 0 ) || ( canREG1->TXRQx[1] != 0 ) ? TRUE : FALSE ); + BOOL result = ( ( TRUE == canXmitsInProgress ) || ( canREG1->TXRQx[0] != 0 ) || ( canREG1->TXRQx[1] != 0 ) ? TRUE : FALSE ); return result; } Index: firmware/App/Drivers/Comm.h =================================================================== diff -u -reff7b1575f008f81b29ef906f6346fac6012d3ab -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Drivers/Comm.h (.../Comm.h) (revision eff7b1575f008f81b29ef906f6346fac6012d3ab) +++ firmware/App/Drivers/Comm.h (.../Comm.h) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -26,6 +26,11 @@ // ********** public function prototypes ********** +void signalCANXmitsInitiated( void ); +void signalCANXmitsCompleted( void ); +void signalSCI1XmitsInitiated( void ); +void signalSCI1XmitsCompleted( void ); + void setSCI1DMAReceiveInterrupt( void ); void setSCI1DMATransmitInterrupt( void ); void clearSCI1DMAReceiveInterrupt( void ); Index: firmware/App/Modes/ModePrescription.c =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Modes/ModePrescription.c (.../ModePrescription.c) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Modes/ModePrescription.c (.../ModePrescription.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -58,6 +58,7 @@ requestAlarmLampPattern( LAMP_PATTERN_OFF ); setBloodPumpTargetFlowRate( 500, MOTOR_DIR_FORWARD ); #ifdef RM46_EVAL_BOARD_TARGET + // TODO - temporary test code for eval board start = getMSTimerCount(); #endif } @@ -80,6 +81,7 @@ requestNewOperationMode( MODE_OPAR ); } #ifdef RM46_EVAL_BOARD_TARGET + // TODO - temporary test code for eval board - move to next mode after 10 sec if ( TRUE == didTimeout( start, 10000U ) ) { requestNewOperationMode( MODE_OPAR ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -57,6 +57,7 @@ requestAlarmLampPattern( LAMP_PATTERN_MED_ALARM ); setBloodPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE ); #ifdef RM46_EVAL_BOARD_TARGET + // TODO - temporary test code for eval board start = getMSTimerCount(); #endif } @@ -79,6 +80,7 @@ requestNewOperationMode( MODE_POST ); } #ifdef RM46_EVAL_BOARD_TARGET + // TODO - temporary test code for eval board - move to next mode after 10 sec if ( TRUE == didTimeout( start, 10000U ) ) { requestNewOperationMode( MODE_POST ); Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r3417fd56afc9b21fb4c2d86c75dd33ac31fbd9f1 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 3417fd56afc9b21fb4c2d86c75dd33ac31fbd9f1) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -45,9 +45,17 @@ #pragma pack(pop) const ALARM_T alarmTable[NUM_OF_ALARM_IDS] = -{ - { ALARM_PRIORITY_NONE, 0, ALARM_ID_NO_ALARM, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_NO_ALARM - { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE } // ALARM_ID_SOFTWARE_FAULT +{ // Priority Esc Escalate To Fault Stops NoClr NoRes NoRin NoEnd NoNew Bypass + { ALARM_PRIORITY_NONE, 0, ALARM_ID_NO_ALARM, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_NO_ALARM + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_SOFTWARE_FAULT + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_STUCK_BUTTON_TEST_FAILED + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_FPGA_POST_TEST_FAILED + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_WATCHDOG_POST_TEST_FAILED + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_UI_COMM_POST_FAILED + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE } // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK }; const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_U32, 0 }; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rbe83f01a4d54cbd0d92b68cb95a15dcbb06a9a51 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision be83f01a4d54cbd0d92b68cb95a15dcbb06a9a51) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -540,7 +540,7 @@ fpgaWriteCmdBuffer[1] = 0x03; // start at FPGA address 8 fpgaWriteCmdBuffer[2] = 0x00; fpgaWriteCmdBuffer[3] = sizeof(FPGA_ACTUATORS_T); - fpgaActuatorSetPoints.bloodValveSetState = 0x03; // TODO - remove + //fpgaActuatorSetPoints.bloodValveSetState = 0x03; // TODO - remove memcpy( &(fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN]), &fpgaActuatorSetPoints, sizeof(FPGA_ACTUATORS_T) ); crc = crc16( fpgaWriteCmdBuffer, FPGA_WRITE_CMD_HDR_LEN+sizeof(FPGA_ACTUATORS_T) ); fpgaWriteCmdBuffer[FPGA_WRITE_CMD_HDR_LEN+sizeof(FPGA_ACTUATORS_T)] = GET_MSB_OF_WORD( crc ); Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -68,12 +68,12 @@ 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; +static g_dmaCTRL pcDMAXmitControlRecord; // DMA transmit control record (UART-debug) +static g_dmaCTRL pcDMARecvControlRecord; // DMA receive control record (UART-debug) -static BOOL dgIsCommunicating = FALSE; -static BOOL uiIsCommunicating = FALSE; -static BOOL uiDidCommunicate = FALSE; +static BOOL dgIsCommunicating = FALSE; // has DG sent a message since last check +static BOOL uiIsCommunicating = FALSE; // has UI sent a message since last check +static BOOL uiDidCommunicate = FALSE; // has UI every sent a message // ********** private function prototypes ********** @@ -82,8 +82,8 @@ static BOOL isCANBoxForRecv( CAN_MESSAGE_BOX_T srcCANBox ); static COMM_BUFFER_T findNextHighestPriorityCANPacketToTransmit( void ); -static void transmitNextCANPacket( void ); -static void transmitNextUARTPacket( void ); +static U32 transmitNextCANPacket( void ); +static U32 transmitNextUARTPacket( void ); static void processIncomingData( void ); static U32 parseMessageFromBuffer( U08 *data, U32 len ); @@ -222,13 +222,23 @@ // if CAN transmitter is idle, start transmitting any pending packets if ( FALSE == isCAN1TransmitInProgress() ) { - transmitNextCANPacket(); + U32 bytesXmitted = transmitNextCANPacket(); + + if ( bytesXmitted > 0 ) + { + signalCANXmitsInitiated(); + } } // if UART transmitter is idle, start transmitting any pending packets if ( FALSE == isSCI1DMATransmitInProgress() ) { - transmitNextUARTPacket(); + U32 bytesXmitted = transmitNextUARTPacket(); + + if ( bytesXmitted > 0 ) + { + signalSCI1XmitsInitiated(); + } } } @@ -249,7 +259,12 @@ // message interrupt is for a transmit message box? if ( TRUE == isCANBoxForXmit( srcCANBox ) ) { - transmitNextCANPacket(); + U32 bytesXmitted = transmitNextCANPacket(); + + if ( 0 == bytesXmitted ) + { + signalCANXmitsCompleted(); + } } else if ( TRUE == isCANBoxForRecv( srcCANBox ) ) { @@ -302,7 +317,12 @@ *************************************************************************/ void handleUARTMsgXmitPacketInterrupt( void ) { - transmitNextUARTPacket(); + U32 bytesXmitted = transmitNextUARTPacket(); + + if ( 0 == bytesXmitted ) + { + signalSCI1XmitsCompleted(); + } } /************************************************************************* @@ -466,10 +486,11 @@ * Inputs : Output CAN Comm Buffers * Outputs : CAN packet transmit initiated. * @param msg : none - * @return none + * @return # of bytes transmitted *************************************************************************/ -static void transmitNextCANPacket( void ) +static U32 transmitNextCANPacket( void ) { + U32 result = 0; COMM_BUFFER_T buffer = findNextHighestPriorityCANPacketToTransmit(); // if a buffer is found with a packet to transmit, get packet from buffer and transmit it @@ -483,8 +504,11 @@ if ( dataSize == CAN_MESSAGE_PAYLOAD_SIZE ) { canTransmit( canREG1, mBox, data ); + result = CAN_MESSAGE_PAYLOAD_SIZE; } } + + return result; } /************************************************************************* @@ -495,10 +519,11 @@ * Inputs : Output UART Comm Buffer(s) * Outputs : UART DMA transmit initiated. * @param msg : none - * @return none + * @return # of bytes transmitted *************************************************************************/ -static void transmitNextUARTPacket( void ) +static U32 transmitNextUARTPacket( void ) { + U32 result = 0; U32 dataPend = numberOfBytesInCommBuffer( COMM_BUFFER_OUT_UART_PC ); U32 dataSize; @@ -512,8 +537,11 @@ dmaSetCtrlPacket( DMA_CH3, pcDMAXmitControlRecord ); dmaSetChEnable( DMA_CH3, DMA_HW ); setSCI1DMATransmitInterrupt(); + result = PC_MESSAGE_PACKET_SIZE; } } + + return result; } Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r070554b23739bf16ea2bf9528ebabda1ce0ffeb3 -rd9cc76524777a12ba77b58ce95416dddfb032997 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 070554b23739bf16ea2bf9528ebabda1ce0ffeb3) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) @@ -53,6 +53,7 @@ // 2nd pass for FPGA execFPGAOut(); + } else {