123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #include "FreeRTOS.h"
- #include "task.h"
- #include "semphr.h"
- #include "queue.h"
- #include <stdint.h>
- #include "tinystdio.h"
- #include "usart.h"
- #ifdef RS485_USART
- #undef DBG
- #define DBG if(0)
- #define RS485_BUFSIZE 256
- static uint8_t buf[RS485_BUFSIZE];
- static void rs485_thread(void *arg)
- {
- (void)arg;
- while (1) {
- /* Get packet */
- uint16_t n = 0;
- xQueueReceive(rs485RxQ, &buf[n++], portMAX_DELAY);
- while (xQueueReceive(rs485RxQ, &buf[n], 10) == pdTRUE && n < RS485_BUFSIZE) {
- n++;
- }
- /* Echo inverted packet */
- uint16_t i = 0;
- while (i < n) {
- uint8_t byte = ~buf[i++];
- if (xQueueSend(rs485TxQ, &byte, 1000) == pdTRUE) {
- rs485_enable_tx();
- } else {
- DBG printf("[echo] rx data lost\r\n");
- return;
- }
- }
- }
- }
- void rs485echo_init(void)
- {
- xTaskCreate(rs485_thread, ( char * ) "rs485_thr", configMINIMAL_STACK_SIZE,
- NULL, tskIDLE_PRIORITY, NULL);
- }
- #endif
|