Constructor of HardwareUart or UsbUart, that provides serial communication through SerialUSB.
uart-usb
@/uart-usb
Constructor of HardwareUart or UsbUart, that provides serial communication through SerialUSB.
DONEpulse
Pulses when UART communication began
namespace xod {
namespace uart_usb {
class UsbUart : public Uart {
private:
    Serial_ _serial;
    uint8_t _rx;
    uint8_t _tx;
public:
    UsbUart(Serial_ serial, long baud = 9600)
        : Uart(baud) {
        _serial = serial;
    }
    void begin();
    void end();
    void flush();
    bool available() {
        return (bool)_serial.available();
    }
    bool writeByte(uint8_t byte) {
        return (bool)_serial.write(byte);
    }
    bool readByte(uint8_t* out) {
        int data = _serial.read();
        if (data == -1)
            return false;
        *out = data;
        return true;
    }
    uint8_t getRX() {
        return _rx;
    }
    uint8_t getTX() {
        return _tx;
    }
    Serial_* toUsbSerial() {
        return &_serial;
    }
};
void UsbUart::begin() {
    _started = true;
    _serial.begin(getBaudRate());
};
void UsbUart::end() {
    _started = false;
    _serial.end();
};
void UsbUart::flush() {
    _serial.flush();
}
} // namespace uart_usb
} // namespace xod
node {
    template <typename T>
    struct ChooseUartWrapper {
        using UartT = HardwareUart;
    };
    template <>
    struct ChooseUartWrapper<Serial_> {
        using UartT = uart_usb::UsbUart;
    };
    uint8_t mem[sizeof(ChooseUartWrapper<typeof SerialUSB>::UartT)];
    ChooseUartWrapper<typeof SerialUSB>::UartT* uart;
    void evaluate(Context ctx) {
        if (isSettingUp()) {
            uart = new (mem) ChooseUartWrapper<typeof SerialUSB>::UartT(SerialUSB, (uint32_t)getValue<input_BAUD>(ctx));
            emitValue<output_UART>(ctx, uart);
        }
        if (isInputDirty<input_INIT>(ctx)) {
            uart->begin();
            emitValue<output_DONE>(ctx, 1);
        }
    }
}