Skip to content

File Serial.h

File List > api > Serial > Serial.h

Go to the documentation of this file.

/* Copyright (c) Kuba Szczodrzyński 2022-06-23. */

#pragma once

#if !LT_ARD_HAS_SERIAL
#error "Serial library not implemented for this chip family"
#endif

#include <Arduino.h>

typedef struct SerialData SerialData;
typedef RingBufferN<LT_SERIAL_BUFFER_SIZE> SerialRingBuffer;

class SerialClass : public HardwareSerial {
  private:
    uint32_t port; 
    pin_size_t rx; 
    pin_size_t tx; 

  private:
    SerialData *data{nullptr};        
    SerialRingBuffer *rxBuf{nullptr}; 
    uint32_t baudrate{0};             
    uint16_t config{0};               

    bool validatePins(pin_size_t rx, pin_size_t tx);

  private: /* family core */
    void beginPrivate(unsigned long baudrate, uint16_t config);
    void endPrivate();

  public: /* family core */
    void configure(unsigned long baudrate, uint16_t config);
    void flush();
    size_t write(uint8_t c);

  public: /* common core */
    SerialClass(uint32_t port, pin_size_t rx = PIN_INVALID, pin_size_t tx = PIN_INVALID) : port(port), rx(rx), tx(tx) {}

    void begin(unsigned long baudrate, uint16_t config, pin_size_t rx, pin_size_t tx);
    bool setPins(pin_size_t rx, pin_size_t tx);
    void end();
    int available();
    int peek();
    int read();

    inline void begin(unsigned long baudrate, uint16_t config) {
        begin(baudrate, config, PIN_INVALID, PIN_INVALID);
    }

    inline void begin(unsigned long baudrate) {
        begin(baudrate, SERIAL_8N1);
    }

    inline void configure(unsigned long baudrate) {
        configure(baudrate, SERIAL_8N1);
    }

    operator bool() {
        return !!this->rxBuf;
    }

  public:
#if LT_AUTO_DOWNLOAD_REBOOT
    static void adrParse(uint8_t c);
#endif

    using Print::write;
};

#if LT_HW_UART0
extern SerialClass Serial0;
#endif
#if LT_HW_UART1
extern SerialClass Serial1;
#endif
#if LT_HW_UART2
extern SerialClass Serial2;
#endif

#define SerialN(x) Serial##x
#define SerialM(x) SerialN(x)
#define Serial     SerialM(LT_UART_DEFAULT_SERIAL)