__interrupt void USCI_A3_ISR(void) { switch(__even_in_range(UCA3IV,4)) { case 0:break; // Vector 0 - no interrupt case 2:break; // Vector 2 - RXIFG case 4: // Vector 4 - TXIFG if ( TxCount == 0 ) { UCA3IFG = 0; TxBusy = 0; /* start the countdown to disable SMCLK */ DisableSmClkCounter = 0; EnableRtcPrescaleInterruptUser(RTC_TIMER_USER_DEBUG_UART); } else { /* send a character */ UCA3TXBUF = TxBuffer[ReadIndex]; IncrementReadIndex(); TxCount--; } break; default: break; } }
static void WriteTxBuffer(tString * const pBuf) { unsigned char i = 0; unsigned int LocalCount = TxCount; /* if there isn't enough room in the buffer then characters are lost */ while ( pBuf[i] != 0 && LocalCount < TX_BUFFER_SIZE ) { TxBuffer[WriteIndex] = pBuf[i++]; IncrementWriteIndex(); LocalCount++; } /* keep a sticky bit for lost characters */ if ( pBuf[i] != 0 ) { gAppStats.DebugUartOverflow = 1; } /* * update the count (which can be decremented in the ISR * and start sending characters if the UART is currently idle */ if ( i > 0 ) { portENTER_CRITICAL(); TxCount += i; #if 0 if ( TxCount > TX_BUFFER_SIZE ) { while(1); } #endif if ( TxBusy == 0 ) { EnableSmClkUser(BT_DEBUG_UART_USER); UCA3TXBUF = TxBuffer[ReadIndex]; IncrementReadIndex(); TxBusy = 1; TxCount--; } portEXIT_CRITICAL(); } }
/***************************************************************************** Function: void EventDequeue(t_event *p_event); Summary: Removes an event from the event queue. Description: Called by Universal Driver when it is going to report an event to the application via a callback function. Parameters: p_event -- pointer to where event data is written Returns: Pointer to event object Remarks: None *****************************************************************************/ void EventDequeue(t_event *p_event) { t_event *p_eventInQueue; // event queue should never be empty if (isEventQEmpty()) { // ToDo: callback here? for(;;); } // point to next event in event queue p_eventInQueue = &g_eventQueue.event[g_eventQueue.readIndex]; // copy event info into callers structure p_event->eventType = p_eventInQueue->eventType; p_event->eventData = p_eventInQueue->eventData; IncrementReadIndex(); }