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.
369 lines
13 KiB
369 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); |
|
} |
|
};
|
|
|