#include "cdc_class.h" #include "usart.h" #include "mirror.h" static constexpr unsigned Timeout = 5000; // us /** Převodník USB_CDC - USART * Datový formát je pevný - 8 bit, 1 stop bit, bez parity. * Změnu po USB by šlo dost jednoduše dodělat, ale nepovažoval jsem to za nutné. * Baudová rychlost se dá po USB změnit na libovolnou hodnotu. * * Výhoda tohoto řešení je, že nad USARTem může běžet nějaký protokol * přímo v tomto čipu. Jinak je to asi nejlevnější řešení. * * @class Middle * Zkracuje obsluhu přerušení od USART1 čímž podstatně zlepší činnost * v plném duplexu. Je možné jí z řetězce vyhodit. Je to také ukázka * jak přidat funkci (třeba vlastní protokol) do řetězce. * */ class Middle : public BaseLayer { static constexpr unsigned max = 128; FIFO rx_ring; volatile unsigned index; char buffer [max]; public: explicit Middle () noexcept : BaseLayer(), rx_ring(), index(0u) {} /* Up() v původním řetězci volalo fakticky Down() v cdc_class. * Vzhledem k tomu, že len je zde 1 a USB musí vyvolat odeslání * paketu, zdržuje to a přerušení zde může být ignorováno. * Tohle ho významně zkrátí, ale zase musí být v hlavní smyčce * odeslání dat pomocí metody pass(). Ukázalo se, že je nutné * předávat data přes další frontu. Pak to funguje full duplex * na rychlosti 4 MBd bez ztráty znaků. * */ uint32_t Up(const char * data, const uint32_t len) override { for (unsigned n=0; n= 64)) { unsigned n; for (n=0u; n