static void uart_tx_task(void) { static MQ_t * pTx_buf = NULL; if(pTx_buf != NULL) { if(hal_uart_free(UART_PHY_PORT)) { mqFree(pTx_buf); pTx_buf = NULL; } } if(uart_tx_queue.Size != 0) { #ifdef LED_On LED_On(); #endif // LED_On if(hal_uart_free(UART_PHY_PORT)) { pTx_buf = mqDequeue(&uart_tx_queue); // Paranoid check if(pTx_buf != NULL) { hal_uart_send(UART_PHY_PORT, (pTx_buf->Length + 1), &pTx_buf->Length); } } } }
// Write data e_MQTTSN_RETURNS_t serWriteOD(subidx_t * pSubidx, uint8_t Len, uint8_t *pBuf) { uint8_t port = pSubidx->Base/10; assert(extSerV[port] != NULL); if(Len > 0) { if((extSerV[port]->pTxBuf == NULL) && hal_uart_free(port)) { MQ_t * pTxBuf = mqAlloc(sizeof(MQ_t)); if(pTxBuf == NULL) return MQTTSN_RET_REJ_CONG; memcpy(pTxBuf->raw, pBuf, Len); hal_uart_send(port, Len, pTxBuf->raw); extSerV[port]->pTxBuf = pTxBuf; } else return MQTTSN_RET_REJ_CONG; } return MQTTSN_RET_ACCEPTED; }
void serProc(void) { uint8_t port; for(port = 0; port < EXTSER_USED; port++) { if(extSerV[port] != NULL) { if(extSerV[port]->flags & EXTSER_FLAG_TXEN) { if((extSerV[port]->pTxBuf != NULL) && (hal_uart_free(port))) { mqFree(extSerV[port]->pTxBuf); extSerV[port]->pTxBuf = NULL; } } if(extSerV[port]->flags & EXTSER_FLAG_RXEN) { if(hal_uart_datardy(port)) { uint8_t tmphead = extSerV[port]->RxHead + 1; if(tmphead >= sizeof(MQ_t)) tmphead = 0; if(tmphead != extSerV[port]->RxTail) { extSerV[port]->pRxBuf[extSerV[port]->RxHead] = hal_uart_get(port); extSerV[port]->RxHead = tmphead; uint8_t size; if(tmphead > extSerV[port]->RxTail) size = tmphead - extSerV[port]->RxTail; else size = sizeof(MQ_t) - extSerV[port]->RxTail + tmphead; if(size < (sizeof(MQ_t)/2)) extSerV[port]->flags &= ~EXTSER_FLAG_RXRDY; else extSerV[port]->flags |= EXTSER_FLAG_RXRDY; } } } } } }
static void uart_tx_task(void) { static MQ_t * pTx_buf = NULL; if(hal_uart_free(UART_PHY_PORT)) { if(pTx_buf != NULL) { mqFree(pTx_buf); pTx_buf = NULL; } if(uart_tx_queue.Size != 0) { pTx_buf = mqDequeue(&uart_tx_queue); assert(pTx_buf != NULL); Activity(UART_PHY); hal_uart_send(UART_PHY_PORT, (pTx_buf->Length + 1), &pTx_buf->Length); } } }