/*********************************************************************************** * @fn appLoopbackTask * * @brief Checks if new bytes have arrived from the UART and echo them back. * * @param none * * @return none */ static void appLoopbackTask(void) { uint8 nBytes, n; nBytes = halUartGetNumRxBytes(); if( nBytes>0 ) { n= MIN(sizeof(pTxData),nBytes); halUartRead(pTxData,n); halUartWrite(pTxData,n); } }
/*********************************************************************************** * @fn appRfSenderTask * * @brief Checks if new bytes have arrived from the UART. If there * are enough bytes to fill a maximal sized packet, or if the UART * is idle, the bytes are transmitted on the air. * * @param none * * @return none */ static void appRfSenderTask(void) { uint8 nBytes; uint8 payloadLength; uint8 bytesToRead; nBytes = halUartGetNumRxBytes(); payloadLength= 0; bytesToRead= 0; if(nBytes >= APP_PAYLOAD_LENGTH || (appUartRxIdle && nBytes>0) ) { // Signal PC not to send on UART, while sending on air. halUartEnableRxFlow(FALSE); // Wait for PC to respond halMcuWaitUs(1000); bytesToRead = MIN(nBytes, APP_PAYLOAD_LENGTH); halUartRead(pTxData,bytesToRead); payloadLength+= bytesToRead; halLedToggle(3); if( (mrfiLinkSend(pTxData, payloadLength,N_RETRIES)) != MRFI_TX_RESULT_SUCCESS) { nTxErr++; appUpdateDisplay(); } // Signal RX flow on halUartEnableRxFlow(TRUE); // Restart idle timer halTimer32kRestart(); halTimer32kIntEnable(); // Reset idle fimer flag appUartRxIdle = FALSE; } }
void usbReceiveData (void) { uint8_t tempData[128] = { 0 }; size_t uartRxIndex = 0; bool txCalcCRC8 = false; bool txCalcCRC16 = false; uint8_t txLength = 0; static uint8_t uartRxBuffer[SIZE_OF_UART_RX_BUFFER] = { 0 }; uint8_t txTimes = 0; uint16_t nBytes = halUartGetNumRxBytes(); size_t i = 0; for( i=0; i<nBytes; i=i+48) { uint16_t readBytes; if (nBytes-i > 48) { readBytes = 48; } else { readBytes = nBytes-i; } halUartRead( &tempData[i], readBytes); usbUartProcess(); } for( i=0; i<nBytes; i++) { // Read Rx buffer uartRxBuffer[uartRxIndex] = tempData[i]; switch( uartRxIndex ) { case 0: { switch( uartRxBuffer[0] ) { case 0x01: uartRxIndex++; txCalcCRC8 = false; txCalcCRC16 = false; enableTimerInt(); break; case 0x81: uartRxIndex++; txCalcCRC8 = true; txCalcCRC16 = false; enableTimerInt(); break; case 0xC1: uartRxIndex++; txCalcCRC8 = false; txCalcCRC16 = true; enableTimerInt(); break; case 0x03: case 0x13: txFilterEnabled = true; P1_1 = 0; uartRxBuffer[0] = 0x03; halUartWrite(uartRxBuffer,1); break; case 0x00: uartRxBuffer[0] = _MMCOMMANDER_VERSION_ ; halUartWrite(uartRxBuffer,1); break; } break; } case 1: { txLength = uartRxBuffer[1]; uartRxIndex++; resetTimerCounter(); break; } case 2: { txTimes = uartRxBuffer[2]; uartRxIndex++; resetTimerCounter(); break; } default: { resetTimerCounter(); if (uartRxIndex == (txLength + 2)) { stopTimerInt(); if (txCalcCRC8 ) { uartRxBuffer[++uartRxIndex] = crc8(&uartRxBuffer[3], (size_t)(txLength)); txLength++; } if (txCalcCRC16 ) { uint16_t const tmpCRC16 = crc16 (&uartRxBuffer[3],(size_t)(txLength)); uartRxBuffer[++uartRxIndex] = (uint8_t)((tmpCRC16 >> 8) & 0x00FF); uartRxBuffer[++uartRxIndex] = (uint8_t)(tmpCRC16 & 0x00FF); txLength += 2; } if (txFilter(&uartRxBuffer[3],txLength) == 0) { sendMedtronicMessage(&uartRxBuffer[3],txLength,txTimes); halUartWrite( uartRxBuffer, 3 ); uartRxIndex=0; } else { uartRxBuffer[1]=0x00; uartRxBuffer[2]=0x00; halUartWrite( uartRxBuffer, 3 ); uartRxIndex=0; } } else { uartRxIndex++; } break; } }