/* display.h * Generated from display.cpp — public declarations for the OLED helper */ #ifndef DISPLAY_H #define DISPLAY_H #include #include // Display API is provided via the C++ `DisplayManager` singleton below. #ifdef __cplusplus // Expose the C++ DisplayManager so callers can use the class API directly. // // Note: The implementation constructs the `SSD1306` display object in-place // using static storage (no heap allocation). Construct a `DisplayManager` in // `main()` and pass it by reference to functions that need to update the // display. This avoids global singletons and makes ownership explicit. // // Example: // int main() { // stdio_init_all(); // DisplayManager display; // // pass the display I2C address (common values: 0x3C or 0x3D) // display.init(0x3C); // while (true) { // wait_for_usb_connection(); // run_echo_session(display); // } // } // // void run_echo_session(DisplayManager &display) { // display.refresh("> ", nullptr); // // ... // } // // Forward-declare the SSD1306 type to avoid pulling the full display header into // every translation unit that includes `display.h`. namespace pico_ssd1306 { class SSD1306; } class DisplayManager { public: // Initialize the hardware and display. DisplayManager(); ~DisplayManager(); // Initialize the hardware and display. Pass the SSD1306 I2C address (default 0x3C). void init(uint8_t i2c_addr = 0x3C); // Refresh the display content. Either pointer may be nullptr. void refresh(const char *current_input, const char *last_echo); // Update stored last-echo text used when `last_echo` is not provided to `refresh()`. void set_last_echo(const char *text); // Non-copyable DisplayManager(const DisplayManager &) = delete; DisplayManager &operator=(const DisplayManager &) = delete; // Implementation details kept small in the header: pointer to the concrete SSD1306 // type (defined in `pico-ssd1306/ssd1306.h`). pico_ssd1306::SSD1306 *display_; char last_echo_[64]; static const size_t LAST_ECHO_VISIBLE_CHARS = 10; }; #endif #endif // DISPLAY_H