You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

370 lines
13 KiB

#pragma once
#include "Print.h"
#include "u8g2.h"
#include "u8g2_esp32_hal.h"
class U8G2 : public Print {
protected:
u8g2_t u8g2;
u8x8_char_cb cpp_next_cb; /* the cpp interface has its own decoding function
for the Arduino print command */
public:
u8g2_uint_t tx, ty;
U8G2(void) {
cpp_next_cb = u8x8_ascii_next;
home();
}
u8x8_t *getU8x8(void) { return u8g2_GetU8x8(&u8g2); }
u8g2_t *getU8g2(void) { return &u8g2; }
uint32_t getBusClock(void) { return u8g2_GetU8x8(&u8g2)->bus_clock; }
void setBusClock(uint32_t clock_speed) {
u8g2_GetU8x8(&u8g2)->bus_clock = clock_speed;
}
void setI2CAddress(uint8_t adr) { u8g2_SetI2CAddress(&u8g2, adr); }
void enableUTF8Print(void) { cpp_next_cb = u8x8_utf8_next; }
void disableUTF8Print(void) { cpp_next_cb = u8x8_ascii_next; }
/* u8x8 interface */
uint8_t getCols(void) { return u8x8_GetCols(u8g2_GetU8x8(&u8g2)); }
uint8_t getRows(void) { return u8x8_GetRows(u8g2_GetU8x8(&u8g2)); }
void drawTile(uint8_t x, uint8_t y, uint8_t cnt, uint8_t *tile_ptr) {
u8x8_DrawTile(u8g2_GetU8x8(&u8g2), x, y, cnt, tile_ptr);
}
#ifdef U8X8_WITH_USER_PTR
void *getUserPtr() { return u8g2_GetUserPtr(&u8g2); }
void setUserPtr(void *p) { u8g2_SetUserPtr(&u8g2, p); }
#endif
#ifdef U8X8_USE_PINS
/* set the menu pins before calling begin() or initDisplay() */
void setMenuSelectPin(uint8_t val) { u8g2_SetMenuSelectPin(&u8g2, val); }
void setMenuPrevPin(uint8_t val) { u8g2_SetMenuPrevPin(&u8g2, val); }
void setMenuNextPin(uint8_t val) { u8g2_SetMenuNextPin(&u8g2, val); }
void setMenuUpPin(uint8_t val) { u8g2_SetMenuUpPin(&u8g2, val); }
void setMenuDownPin(uint8_t val) { u8g2_SetMenuDownPin(&u8g2, val); }
void setMenuHomePin(uint8_t val) { u8g2_SetMenuHomePin(&u8g2, val); }
#endif
/* return 0 for no event or U8X8_MSG_GPIO_MENU_SELECT, */
/* U8X8_MSG_GPIO_MENU_NEXT, U8X8_MSG_GPIO_MENU_PREV, */
/* U8X8_MSG_GPIO_MENU_HOME */
uint8_t getMenuEvent(void) { return u8x8_GetMenuEvent(u8g2_GetU8x8(&u8g2)); }
void initDisplay(void) { u8g2_InitDisplay(&u8g2); }
void clearDisplay(void) { u8g2_ClearDisplay(&u8g2); }
void setPowerSave(uint8_t is_enable) { u8g2_SetPowerSave(&u8g2, is_enable); }
void setFlipMode(uint8_t mode) { u8g2_SetFlipMode(&u8g2, mode); }
void setContrast(uint8_t value) { u8g2_SetContrast(&u8g2, value); }
void setDisplayRotation(const u8g2_cb_t *u8g2_cb) {
u8g2_SetDisplayRotation(&u8g2, u8g2_cb);
}
bool begin(void) {
/* note: call to u8x8_utf8_init is not required here, this is done in the
* setup procedures before */
initDisplay();
clearDisplay();
setPowerSave(0);
return 1;
}
void beginSimple(void) {
/* does not clear the display and does not wake up the display */
/* user is responsible for calling clearDisplay() and setPowerSave(0) */
initDisplay();
}
#ifdef U8X8_USE_PINS
/* use U8X8_PIN_NONE if a pin is not required */
bool begin(uint8_t menu_select_pin, uint8_t menu_next_pin,
uint8_t menu_prev_pin, uint8_t menu_up_pin = U8X8_PIN_NONE,
uint8_t menu_down_pin = U8X8_PIN_NONE,
uint8_t menu_home_pin = U8X8_PIN_NONE) {
setMenuSelectPin(menu_select_pin);
setMenuNextPin(menu_next_pin);
setMenuPrevPin(menu_prev_pin);
setMenuUpPin(menu_up_pin);
setMenuDownPin(menu_down_pin);
setMenuHomePin(menu_home_pin);
return begin();
}
#endif
/* u8g2 */
#ifdef U8G2_WITH_CLIP_WINDOW_SUPPORT
void setMaxClipWindow(void) { u8g2_SetMaxClipWindow(&u8g2); }
void setClipWindow(u8g2_uint_t clip_x0, u8g2_uint_t clip_y0,
u8g2_uint_t clip_x1, u8g2_uint_t clip_y1) {
u8g2_SetClipWindow(&u8g2, clip_x0, clip_y0, clip_x1, clip_y1);
}
#endif /* U8G2_WITH_CLIP_WINDOW_SUPPORT */
u8g2_uint_t getDisplayHeight(void) { return u8g2_GetDisplayHeight(&u8g2); }
u8g2_uint_t getDisplayWidth(void) { return u8g2_GetDisplayWidth(&u8g2); }
/* u8g2_buffer.c */
void sendBuffer(void) { u8g2_SendBuffer(&u8g2); }
void clearBuffer(void) { u8g2_ClearBuffer(&u8g2); }
void firstPage(void) { u8g2_FirstPage(&u8g2); }
uint8_t nextPage(void) { return u8g2_NextPage(&u8g2); }
uint8_t *getBufferPtr(void) { return u8g2_GetBufferPtr(&u8g2); }
uint8_t getBufferTileHeight(void) { return u8g2_GetBufferTileHeight(&u8g2); }
uint8_t getBufferTileWidth(void) { return u8g2_GetBufferTileWidth(&u8g2); }
uint8_t getPageCurrTileRow(void) {
return u8g2_GetBufferCurrTileRow(&u8g2);
} // obsolete
void setPageCurrTileRow(uint8_t row) {
u8g2_SetBufferCurrTileRow(&u8g2, row);
} // obsolete
uint8_t getBufferCurrTileRow(void) {
return u8g2_GetBufferCurrTileRow(&u8g2);
}
void setBufferCurrTileRow(uint8_t row) {
u8g2_SetBufferCurrTileRow(&u8g2, row);
}
// this should be renamed to setBufferAutoClear
void setAutoPageClear(uint8_t mode) { u8g2_SetAutoPageClear(&u8g2, mode); }
/* u8g2_hvline.c */
void setDrawColor(uint8_t color_index) {
u8g2_SetDrawColor(&u8g2, color_index);
}
uint8_t getDrawColor(void) { return u8g2_GetDrawColor(&u8g2); }
void drawPixel(u8g2_uint_t x, u8g2_uint_t y) { u8g2_DrawPixel(&u8g2, x, y); }
void drawHLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w) {
u8g2_DrawHLine(&u8g2, x, y, w);
}
void drawVLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t h) {
u8g2_DrawVLine(&u8g2, x, y, h);
}
void drawHVLine(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir) {
u8g2_DrawHVLine(&u8g2, x, y, len, dir);
}
/* u8g2_box.c */
void drawFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h) {
u8g2_DrawFrame(&u8g2, x, y, w, h);
}
void drawRFrame(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h,
u8g2_uint_t r) {
u8g2_DrawRFrame(&u8g2, x, y, w, h, r);
}
void drawBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h) {
u8g2_DrawBox(&u8g2, x, y, w, h);
}
void drawRBox(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h,
u8g2_uint_t r) {
u8g2_DrawRBox(&u8g2, x, y, w, h, r);
}
/* u8g2_circle.c */
void drawCircle(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad,
uint8_t opt = U8G2_DRAW_ALL) {
u8g2_DrawCircle(&u8g2, x0, y0, rad, opt);
}
void drawDisc(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rad,
uint8_t opt = U8G2_DRAW_ALL) {
u8g2_DrawDisc(&u8g2, x0, y0, rad, opt);
}
void drawEllipse(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx,
u8g2_uint_t ry, uint8_t opt = U8G2_DRAW_ALL) {
u8g2_DrawEllipse(&u8g2, x0, y0, rx, ry, opt);
}
void drawFilledEllipse(u8g2_uint_t x0, u8g2_uint_t y0, u8g2_uint_t rx,
u8g2_uint_t ry, uint8_t opt = U8G2_DRAW_ALL) {
u8g2_DrawFilledEllipse(&u8g2, x0, y0, rx, ry, opt);
}
/* u8g2_line.c */
void drawLine(u8g2_uint_t x1, u8g2_uint_t y1, u8g2_uint_t x2,
u8g2_uint_t y2) {
u8g2_DrawLine(&u8g2, x1, y1, x2, y2);
}
/* u8g2_bitmap.c */
void setBitmapMode(uint8_t is_transparent) {
u8g2_SetBitmapMode(&u8g2, is_transparent);
}
void drawBitmap(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t cnt, u8g2_uint_t h,
const uint8_t *bitmap) {
u8g2_DrawBitmap(&u8g2, x, y, cnt, h, bitmap);
}
void drawXBM(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h,
const uint8_t *bitmap) {
u8g2_DrawXBM(&u8g2, x, y, w, h, bitmap);
}
void drawXBMP(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h,
const uint8_t *bitmap) {
u8g2_DrawXBMP(&u8g2, x, y, w, h, bitmap);
}
/* u8g2_polygon.c */
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2,
int16_t y2) {
u8g2_DrawTriangle(&u8g2, x0, y0, x1, y1, x2, y2);
}
/* u8log_u8g2.c */
void drawLog(u8g2_uint_t x, u8g2_uint_t y, class U8G2LOG &u8g2log);
/* u8g2_font.c */
void setFont(const uint8_t *font) { u8g2_SetFont(&u8g2, font); }
void setFontMode(uint8_t is_transparent) {
u8g2_SetFontMode(&u8g2, is_transparent);
}
void setFontDirection(uint8_t dir) { u8g2_SetFontDirection(&u8g2, dir); }
int8_t getAscent(void) { return u8g2_GetAscent(&u8g2); }
int8_t getDescent(void) { return u8g2_GetDescent(&u8g2); }
void setFontPosBaseline(void) { u8g2_SetFontPosBaseline(&u8g2); }
void setFontPosBottom(void) { u8g2_SetFontPosBottom(&u8g2); }
void setFontPosTop(void) { u8g2_SetFontPosTop(&u8g2); }
void setFontPosCenter(void) { u8g2_SetFontPosCenter(&u8g2); }
void setFontRefHeightText(void) { u8g2_SetFontRefHeightText(&u8g2); }
void setFontRefHeightExtendedText(void) {
u8g2_SetFontRefHeightExtendedText(&u8g2);
}
void setFontRefHeightAll(void) { u8g2_SetFontRefHeightAll(&u8g2); }
/*
uint8_t u8g2_IsGlyph(u8g2_t *u8g2, uint16_t requested_encoding);
int8_t u8g2_GetGlyphWidth(u8g2_t *u8g2, uint16_t requested_encoding);
u8g2_uint_t u8g2_GetStrWidth(u8g2_t *u8g2, const char *s);
u8g2_uint_t u8g2_GetUTF8Width(u8g2_t *u8g2, const char *str);
*/
u8g2_uint_t drawGlyph(u8g2_uint_t x, u8g2_uint_t y, uint16_t encoding) {
return u8g2_DrawGlyph(&u8g2, x, y, encoding);
}
u8g2_uint_t drawStr(u8g2_uint_t x, u8g2_uint_t y, const char *s) {
return u8g2_DrawStr(&u8g2, x, y, s);
}
u8g2_uint_t drawUTF8(u8g2_uint_t x, u8g2_uint_t y, const char *s) {
return u8g2_DrawUTF8(&u8g2, x, y, s);
}
u8g2_uint_t drawExtUTF8(u8g2_uint_t x, u8g2_uint_t y, uint8_t to_left,
const uint16_t *kerning_table, const char *s) {
return u8g2_DrawExtUTF8(&u8g2, x, y, to_left, kerning_table, s);
}
u8g2_uint_t getStrWidth(const char *s) { return u8g2_GetStrWidth(&u8g2, s); }
u8g2_uint_t getUTF8Width(const char *s) {
return u8g2_GetUTF8Width(&u8g2, s);
}
// not required any more, enable UTF8 for print
// void printUTF8(const char *s) { tx += u8g2_DrawUTF8(&u8g2, tx, ty, s); }
/* virtual function for print base class */
size_t write(uint8_t v) {
uint16_t e = cpp_next_cb(&(u8g2.u8x8), v);
if (e < 0x0fffe) tx += u8g2_DrawGlyph(&u8g2, tx, ty, e);
return 1;
}
size_t write(const uint8_t *buffer, size_t size) {
size_t cnt = 0;
while (size > 0) {
cnt += write(*buffer++);
size--;
}
return cnt;
}
/* user interface */
/*
uint8_t u8g2_UserInterfaceSelectionList(u8g2_t *u8g2, const char *title,
uint8_t start_pos, const char *sl); uint8_t u8g2_UserInterfaceMessage(u8g2_t
*u8g2, const char *title1, const char *title2, const char *title3, const char
*buttons); uint8_t u8g2_UserInterfaceInputValue(u8g2_t *u8g2, const char
*title, const char *pre, uint8_t *value, uint8_t lo, uint8_t hi, uint8_t
digits, const char *post);
*/
uint8_t userInterfaceSelectionList(const char *title, uint8_t start_pos,
const char *sl) {
return u8g2_UserInterfaceSelectionList(&u8g2, title, start_pos, sl);
}
uint8_t userInterfaceMessage(const char *title1, const char *title2,
const char *title3, const char *buttons) {
return u8g2_UserInterfaceMessage(&u8g2, title1, title2, title3, buttons);
}
uint8_t userInterfaceInputValue(const char *title, const char *pre,
uint8_t *value, uint8_t lo, uint8_t hi,
uint8_t digits, const char *post) {
return u8g2_UserInterfaceInputValue(&u8g2, title, pre, value, lo, hi,
digits, post);
}
/* LiquidCrystal compatible functions */
void home(void) {
tx = 0;
ty = 0;
u8x8_utf8_init(u8g2_GetU8x8(&u8g2));
}
void clear(void) {
home();
clearDisplay();
clearBuffer();
}
void noDisplay(void) { u8g2_SetPowerSave(&u8g2, 1); }
void display(void) { u8g2_SetPowerSave(&u8g2, 0); }
void setCursor(u8g2_uint_t x, u8g2_uint_t y) {
tx = x;
ty = y;
}
/* u8glib compatible functions */
void sleepOn(void) { u8g2_SetPowerSave(&u8g2, 1); }
void sleepOff(void) { u8g2_SetPowerSave(&u8g2, 0); }
void setColorIndex(uint8_t color_index) {
u8g2_SetDrawColor(&u8g2, color_index);
}
uint8_t getColorIndex(void) { return u8g2_GetDrawColor(&u8g2); }
int8_t getFontAscent(void) { return u8g2_GetAscent(&u8g2); }
int8_t getFontDescent(void) { return u8g2_GetDescent(&u8g2); }
int8_t getMaxCharHeight(void) { return u8g2_GetMaxCharHeight(&u8g2); }
int8_t getMaxCharWidth(void) { return u8g2_GetMaxCharWidth(&u8g2); }
u8g2_uint_t getHeight() { return u8g2_GetDisplayHeight(&u8g2); }
u8g2_uint_t getWidth() { return u8g2_GetDisplayWidth(&u8g2); }
};
void u8x8_SetPin_HW_I2C(u8x8_t *u8x8, uint8_t reset, uint8_t clock,
uint8_t data) {
u8x8_SetPin(u8x8, U8X8_PIN_RESET, reset);
u8x8_SetPin(u8x8, U8X8_PIN_I2C_CLOCK, clock);
u8x8_SetPin(u8x8, U8X8_PIN_I2C_DATA, data);
}
class U8G2_SSD1306_128X64_NONAME_F_HW_I2C : public U8G2 {
public:
U8G2_SSD1306_128X64_NONAME_F_HW_I2C(const u8g2_cb_t *rotation,
uint8_t reset = U8X8_PIN_NONE,
uint8_t clock = U8X8_PIN_NONE,
uint8_t data = U8X8_PIN_NONE)
: U8G2() {
u8g2_Setup_ssd1306_i2c_128x64_noname_f(
&u8g2, rotation, u8g2_esp32_i2c_byte_cb, u8g2_esp32_gpio_and_delay_cb);
u8x8_SetPin_HW_I2C(getU8x8(), reset, clock, data);
}
};