#pragma once #include #include #include namespace roro { // Where the firmware's console output goes: the USB serial port, and in a Debug Build also a ring // buffer the Debug Console sends over Wi-Fi (with what came before the connection, so boot messages // aren't lost). Use `console` instead of Serial for anything a human should be able to read remotely. class Console : public Print { public: size_t write(uint8_t c) override { return write(&c, 1); } size_t write(const uint8_t* data, size_t len) override; using Print::write; #ifdef RORO_DEBUG static constexpr size_t kRingBytes = 4096; // Also copies ESP-IDF's own log lines into the ring (they still reach the serial port). void captureEspLogs(); // Copies bytes written since `pos` into `out`, and advances `pos`. A reader that fell more than // the ring behind gets the oldest bytes still there, and `skipped` says how many it missed. size_t readSince(uint32_t& pos, uint8_t* out, size_t max, uint32_t& skipped); // The position of the oldest byte still in the ring: a new reader starts there. uint32_t oldest() const; // The ring only, for output that already reaches the serial port another way. void toRing(const uint8_t* data, size_t len); private: uint8_t ring_[kRingBytes]; uint32_t head_ = 0; // total bytes ever written; the ring holds the last kRingBytes of them #endif }; extern Console console; } // namespace roro