Преглед изворни кода

Merge pull request #294 from 446564/SH1106-display

Sh1106 display
ripplebiz пре 1 година
родитељ
комит
885cfe9667
3 измењених фајлова са 136 додато и 0 уклоњено
  1. 2 0
      examples/companion_radio/main.cpp
  2. 91 0
      src/helpers/ui/SH1106Display.cpp
  3. 43 0
      src/helpers/ui/SH1106Display.h

+ 2 - 0
examples/companion_radio/main.cpp

@@ -66,6 +66,8 @@
     #include <helpers/ui/ST7735Display.h>
   #elif ST7789
     #include <helpers/ui/ST7789Display.h>
+  #elif SH1106
+    #include <helpers/ui/SH1106Display.h>
   #elif defined(HAS_GxEPD)
     #include <helpers/ui/GxEPDDisplay.h>
   #else

+ 91 - 0
src/helpers/ui/SH1106Display.cpp

@@ -0,0 +1,91 @@
+#include "SH1106Display.h"
+#include <Adafruit_GrayOLED.h>
+#include "Adafruit_SH110X.h"
+
+bool SH1106Display::i2c_probe(TwoWire &wire, uint8_t addr)
+{
+  wire.beginTransmission(addr);
+  uint8_t error = wire.endTransmission();
+  return (error == 0);
+}
+
+bool SH1106Display::begin()
+{
+  return display.begin(DISPLAY_ADDRESS, true) && i2c_probe(Wire, DISPLAY_ADDRESS);
+}
+
+void SH1106Display::turnOn()
+{
+  display.oled_command(SH110X_DISPLAYON);
+  _isOn = true;
+}
+
+void SH1106Display::turnOff()
+{
+  display.oled_command(SH110X_DISPLAYOFF);
+  _isOn = false;
+}
+
+void SH1106Display::clear()
+{
+  display.clearDisplay();
+  display.display();
+}
+
+void SH1106Display::startFrame(Color bkg)
+{
+  display.clearDisplay(); // TODO: apply 'bkg'
+  _color = SH110X_WHITE;
+  display.setTextColor(_color);
+  display.setTextSize(1);
+  display.cp437(true); // Use full 256 char 'Code Page 437' font
+}
+
+void SH1106Display::setTextSize(int sz)
+{
+  display.setTextSize(sz);
+}
+
+void SH1106Display::setColor(Color c)
+{
+  _color = (c != 0) ? SH110X_WHITE : SH110X_BLACK;
+  display.setTextColor(_color);
+}
+
+void SH1106Display::setCursor(int x, int y)
+{
+  display.setCursor(x, y);
+}
+
+void SH1106Display::print(const char *str)
+{
+  display.print(str);
+}
+
+void SH1106Display::fillRect(int x, int y, int w, int h)
+{
+  display.fillRect(x, y, w, h, _color);
+}
+
+void SH1106Display::drawRect(int x, int y, int w, int h)
+{
+  display.drawRect(x, y, w, h, _color);
+}
+
+void SH1106Display::drawXbm(int x, int y, const uint8_t *bits, int w, int h)
+{
+  display.drawBitmap(x, y, bits, w, h, SH110X_WHITE);
+}
+
+uint16_t SH1106Display::getTextWidth(const char *str)
+{
+  int16_t x1, y1;
+  uint16_t w, h;
+  display.getTextBounds(str, 0, 0, &x1, &y1, &w, &h);
+  return w;
+}
+
+void SH1106Display::endFrame()
+{
+  display.display();
+}

+ 43 - 0
src/helpers/ui/SH1106Display.h

@@ -0,0 +1,43 @@
+#pragma once
+
+#include "DisplayDriver.h"
+#include <Wire.h>
+#include <Adafruit_GFX.h>
+#define SH110X_NO_SPLASH
+#include <Adafruit_SH110X.h>
+
+#ifndef PIN_OLED_RESET
+#define PIN_OLED_RESET -1
+#endif
+
+#ifndef DISPLAY_ADDRESS
+#define DISPLAY_ADDRESS 0x3C
+#endif
+
+class SH1106Display : public DisplayDriver
+{
+  Adafruit_SH1106G display;
+  bool _isOn;
+  uint8_t _color;
+
+  bool i2c_probe(TwoWire &wire, uint8_t addr);
+
+public:
+  SH1106Display() : DisplayDriver(128, 64), display(128, 64, &Wire, PIN_OLED_RESET) { _isOn = false; }
+  bool begin();
+
+  bool isOn() override { return _isOn; }
+  void turnOn() override;
+  void turnOff() override;
+  void clear() override;
+  void startFrame(Color bkg = DARK) override;
+  void setTextSize(int sz) override;
+  void setColor(Color c) override;
+  void setCursor(int x, int y) override;
+  void print(const char *str) override;
+  void fillRect(int x, int y, int w, int h) override;
+  void drawRect(int x, int y, int w, int h) override;
+  void drawXbm(int x, int y, const uint8_t *bits, int w, int h) override;
+  uint16_t getTextWidth(const char *str) override;
+  void endFrame() override;
+};