// // Created by MightyPork on 2022/11/12. // #ifndef FRAMEBUFFER_H #define FRAMEBUFFER_H #include #include #include "framebuffer_config.h" #define FBSET 0xFF #define FBCLEAR 0x00 /// Width/height type typedef uint16_t fbsize_t; /// Position type (X/Y) typedef int16_t fbpos_t; /// Color type typedef uint8_t fbcolor_t; /// Bitmap struct typedef struct { const uint8_t *data; fbsize_t width; fbsize_t height; } fb_bitmap_t; #define FB_LEN ((FBH / 8) * FBW) /// Framebuffer backing array. /// /// The format is the native format for SSD1306: array of bytes representing pixels in 8 rows at once, LSB is the topmost row. /// /// a0 b0 ... til the display width /// a1 b1 /// a2 b2 /// ... ... /// a7 b7 /// /// and more bytes continue rows 8-15 and so on extern uint8_t fb[ FB_LEN ]; /// Fill the entire screen with a byte pattern. /// Use 0xFF or 0x00 for a solid fill. Other patterns may be used to create horizontal stripes. void fb_fill(uint8_t pattern); /// Invert the entire screen void fb_invert(); /// Clear the display (fill with 0x00) static inline void fb_clear(void) { fb_fill(0); } /// Fill screen with a repeating pattern /// /// \param pattern - bytes to repeat, PROGMEM /// \param pattern_len - len of the pattern void fb_fill_pattern(const uint8_t* pattern, uint8_t pattern_len, fbcolor_t color); /// Set a single pixel void fb_px(fbpos_t x, fbpos_t y, fbcolor_t color); /// Get pixel color uint8_t fb_getpx(fbpos_t x, fbpos_t y); /// Draw a horizontal line void fb_hline(fbpos_t x, fbpos_t y, fbpos_t w, fbcolor_t color); /// Draw a vertical line void fb_vline(fbpos_t x, fbpos_t y, fbpos_t h, fbcolor_t color); /// Draw a filled rect void fb_rect(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, fbcolor_t color); /// Draw a frame (unfilled rect) void fb_frame(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, fbpos_t thickness, fbcolor_t color); /// Draw a bitmap from progmem #if IS_AVR void fb_bitmap_ex_P(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, const uint8_t *map, fbcolor_t color); #else void fb_bitmap_ex(fbpos_t x, fbpos_t y, fbpos_t w, fbpos_t h, const uint8_t *map, fbcolor_t color); #endif /// Draw a bitmap using the bitmap struct #if IS_AVR static inline void fb_bitmap_P(fbpos_t x, fbpos_t y, const fb_bitmap_t *bitmap, fbcolor_t color) { fb_bitmap_ex_P(x, y, bitmap->width, bitmap->height, bitmap->data, color); } #else static inline void fb_bitmap(fbpos_t x, fbpos_t y, const fb_bitmap_t *bitmap, fbcolor_t color) { fb_bitmap_ex(x, y, bitmap->width, bitmap->height, bitmap->data, color); } #endif /// Draw a circle void fb_circle(fbpos_t x, fbpos_t y, fbpos_t r, uint8_t thickness, fbcolor_t color); /// Output the framebuffer array `fb` to the display device. /// /// The user must implement this extern void fb_blit(void); #endif //FRAMEBUFFER_H