123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #pragma once
- #include "common.h"
- #include <USB.h>
- #include <HardwareSerial.h>
- #include <FreeRTOS.h>
- #include <freertos/stream_buffer.h>
- #include <atomic>
- void tty_init();
- void tty_ping();
- //
- // This is needed because there isn't a common serial device
- // class in Arduino, sigh...
- //
- struct tty_packet_hdr {
- uint8_t stx;
- uint8_t len;
- uint16_t resv;
- uint32_t offs;
- uint32_t crc;
- } __attribute__((packed));
- class TTY {
- public:
- TTY(Stream &port);
- ~TTY();
- void reset();
- int rxdata(void *buf, size_t len);
- static int rxdata(token_t me, void *buf, size_t len);
- // Global events
- static void init();
- static void ping();
- private:
- Stream *_port; // Android stream
- void _onrx();
- void _onerr();
- void _onbreak();
- void _onconnect();
- void _ondisconnect();
- void (*_flush)();
- public:
- inline void flush() { _flush(); }
- inline Stream & port() { return *_port; }
- inline operator Stream & () { return port(); }
- private:
- // Event handler dispatchers
- static void usb_task_handler(void *);
- static void usb_onevent(void *arg, esp_event_base_t event_base,
- int32_t event_id, void *event_data);
- static void uart_onrx();
- static void uart_onerr(hardwareSerial_error_t);
- enum rx_state {
- normal, // Normal console mode
- stxwait, // Waiting for header STX
- hdr, // Getting header
- data // Getting data packet
- };
- void _upload_begin();
- void _update_window(bool rst = false);
- int _decode_data(int);
- // Packet receive state machine
- struct {
- enum rx_state state;
- uint8_t b64_buf;
- uint8_t b64_bits;
- union {
- struct tty_packet_hdr hdr;
- uint8_t hdr_raw[sizeof(struct tty_packet_hdr)];
- };
- size_t rlen;
- uint32_t last_ack;
- } rx;
- StreamBufferHandle_t rx_sbuf;
- uint32_t tx_credits;
- volatile bool tx_credits_reset;
- volatile uint32_t last_rx;
- uint8_t rx_data[256];
- };
|