From c8754813bd7e2dd07668b01d4f2e6cb81d79d2c1 Mon Sep 17 00:00:00 2001 From: Jochen Vothknecht <jochen3120@gmail.com> Date: Tue, 29 Mar 2022 08:35:35 +0200 Subject: [PATCH] =?UTF-8?q?Begin=20restructuring=20the=20whole=20thing?= =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLC-qthing/SiliconTorch/CyanBus.cpp | 121 ++++++++++++++-------------- CLC-qthing/SiliconTorch/CyanBus.hpp | 25 ++++-- 2 files changed, 81 insertions(+), 65 deletions(-) diff --git a/CLC-qthing/SiliconTorch/CyanBus.cpp b/CLC-qthing/SiliconTorch/CyanBus.cpp index ab17cef..24c4d71 100644 --- a/CLC-qthing/SiliconTorch/CyanBus.cpp +++ b/CLC-qthing/SiliconTorch/CyanBus.cpp @@ -9,6 +9,7 @@ #include "esp_log.h" #include "driver/gpio.h" #include "driver/uart.h" +#include "freertos/queue.h" // project specific #include "LambdaTask.hpp" @@ -31,92 +32,92 @@ namespace SiliconTorch { namespace CyanBus { - CyanBus::CyanBus(SiliconTorch::Impl::RS485 reader) : reader(reader) { + CyanBus::CyanBus(uint8_t tx, uint8_t rx, uint8_t de, uint8_t re, uint32_t baudRate, uint8_t uartChannel) : tx(tx), rx(rx), de(de), re(re), uartChannel(uartChannel) { - readerTaskHandle = new SiliconTorch::Util::LambdaTask([&](){ readerTask(); }); - } - - void CyanBus::readerTask() { - const uint8_t* header = (const uint8_t*)"fxCyan"; - - uint8_t* buffer = new uint8_t[CyanBusMTU]; - uint8_t* bufPTR = buffer; - - uint16_t packetLength = 0; + uint64_t bitMask = 0; - enum FSM { SearchHeader, ReadLenght, ReadBody, CheckCRC }; - FSM fsm = SearchHeader; + bitMask |= 1 << tx; + bitMask |= 1 << de; + bitMask |= 1 << re; - while (true) { + gpio_config_t gpio = { + .pin_bit_mask = bitMask, + .mode = GPIO_MODE_OUTPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_DISABLE, + .intr_type = GPIO_INTR_DISABLE, + }; - switch (fsm) { - case SearchHeader: { + // configure outputs + gpio_config(&gpio); + txrxEN(false); - reader.read(bufPTR, 1); + gpio.pin_bit_mask = 1 << rx; + gpio.mode = GPIO_MODE_INPUT; - if (bufPTR[0] == header[bufPTR - buffer]) { - // got the right char - bufPTR++; + // configure inputs + gpio_config(&gpio); - if (bufPTR - buffer >= sizeof(header)) { - fsm = ReadLenght; - } - } else { - // start over - bufPTR = buffer; - } - break; - } + uart_config_t uartConfig = { + .baud_rate = (int)baudRate, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, + .rx_flow_ctrl_thresh = 0, + .use_ref_tick = false, + // .source_clk = UART_SCLK_APB, + }; - case ReadLenght: { - reader.read(bufPTR, 2); + uart_port_t _ch = (uart_port_t)uartChannel; - packetLength = (bufPTR[0] << 8) | bufPTR[1]; - bufPTR += 2; + uart_driver_install(_ch, CyanBusMTU, 0, 0, &uartEvQ, 0); + uart_param_config(_ch, &uartConfig); + uart_set_pin(_ch, tx, rx, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); + uart_set_mode(_ch, UART_MODE_UART); + uart_set_rx_timeout(_ch, 0); // TODO: timeout…?? - ESP_LOGW(TAG, "Got a packet with length[ %d ] \\o/", packetLength); + // TOOD: receive only ATM! + txEN(false); + rxEN(true); - fsm = ReadBody; - break; - } + // readerTaskHandle = new SiliconTorch::Util::LambdaTask([&](){ readerTask(); }); - case ReadBody: { - - reader.read(bufPTR, packetLength + 4); // +4 = CRC + } - fsm = CheckCRC; + void CyanBus::readerTask() { + // const uint8_t* header = (const uint8_t*)"fxCyan"; + } - break; - } - case CheckCRC: { - // TODO: check the CRC! + void CyanBus::setBaudRate(uint32_t baudRate) { + uart_set_baudrate((uart_port_t)uartChannel, baudRate); + } - // If it matches: handle packet! - // But if it not matches? - // search whole packet for header? (how would we implement this???) - // or just discard? (leads to possible desynchronisation!!!) + uint32_t CyanBus::getBaudRate() { + uint32_t baudRate = 0; + uart_get_baudrate((uart_port_t)uartChannel, &baudRate); + return baudRate; + } - break; - } - } - } - delete buffer; + void CyanBus::txEN(bool state) { + gpio_set_level((gpio_num_t)de, state); } - void CyanBus::setBaudRate(uint32_t baudRate) { - ESP_LOGE(TAG, "Operation unsupported: setBaudRate(…)"); + void CyanBus::rxEN(bool state) { + gpio_set_level((gpio_num_t)re, state ^ 1); } - - uint32_t CyanBus::getBaudRate() { - ESP_LOGE(TAG, "Operation unsupported: getBaudRate()"); - return 1337; + + void CyanBus::txrxEN(bool state) { + txEN(state); + rxEN(state); } + } } diff --git a/CLC-qthing/SiliconTorch/CyanBus.hpp b/CLC-qthing/SiliconTorch/CyanBus.hpp index c6c6dae..e3f0a7e 100644 --- a/CLC-qthing/SiliconTorch/CyanBus.hpp +++ b/CLC-qthing/SiliconTorch/CyanBus.hpp @@ -5,8 +5,10 @@ #include <cinttypes> #include <functional> +// ESP32 specific +#include "freertos/queue.h" + // project specific -#include "RS485.hpp" #include "LambdaTask.hpp" @@ -16,16 +18,29 @@ namespace SiliconTorch { class CyanBus { public: - CyanBus(SiliconTorch::Impl::RS485 reader); + CyanBus(uint8_t tx, uint8_t rx, uint8_t de, uint8_t re, uint32_t baudRate = 115200, uint8_t uartChannel = 1); - // TODO: How do we wanna set baudRates when we only have a reader?! - // TODO: Elaborate on this topic! uint32_t getBaudRate(); void setBaudRate(uint32_t baudRate); private: - SiliconTorch::Impl::RS485 reader; + QueueHandle_t uartEvQ; + + uint8_t uartChannel; + uint8_t tx, rx, de, re; + + void txEN(bool state); + void rxEN(bool state); + void txrxEN(bool state); + + + // Receive only ATM! (make public after sound implementation…) + void write(std::string& data); + void write(const uint8_t* data, uint32_t length); + + + void readerTask(); -- GitLab