Initial Demo OS

This commit is contained in:
dark98
2026-09-03 00:46:04 +01:00
commit 1491821e96
45 changed files with 2908 additions and 0 deletions
+104
View File
@@ -0,0 +1,104 @@
#ifndef OS_FONT_3X5_H
#define OS_FONT_3X5_H
#include <stdint.h>
static const uint8_t font_3x5[][3] = {
{0x00, 0x00, 0x00}, // ' ' (32)
{0x00, 0x17, 0x00}, // '!'
{0x03, 0x00, 0x03}, // '"'
{0x1F, 0x0A, 0x1F}, // '#'
{0x12, 0x1F, 0x09}, // '$'
{0x19, 0x04, 0x13}, // '%'
{0x1A, 0x15, 0x0A}, // '&'
{0x00, 0x03, 0x00}, // '''
{0x00, 0x0E, 0x11}, // '('
{0x11, 0x0E, 0x00}, // ')'
{0x0A, 0x04, 0x0A}, // '*'
{0x04, 0x0E, 0x04}, // '+'
{0x10, 0x08, 0x00}, // ','
{0x04, 0x04, 0x04}, // '-'
{0x10, 0x00, 0x00}, // '.'
{0x10, 0x08, 0x06}, // '/'
{0x1F, 0x11, 0x1F}, // '0'
{0x12, 0x1F, 0x10}, // '1'
{0x1D, 0x15, 0x17}, // '2'
{0x15, 0x15, 0x1F}, // '3'
{0x07, 0x04, 0x1F}, // '4'
{0x17, 0x15, 0x1D}, // '5'
{0x1F, 0x15, 0x1D}, // '6'
{0x01, 0x01, 0x1F}, // '7'
{0x1F, 0x15, 0x1F}, // '8'
{0x17, 0x15, 0x1F}, // '9'
{0x00, 0x0A, 0x00}, // ':'
{0x10, 0x0A, 0x00}, // ';'
{0x04, 0x0A, 0x11}, // '<'
{0x0A, 0x0A, 0x0A}, // '='
{0x11, 0x0A, 0x04}, // '>'
{0x01, 0x15, 0x02}, // '?'
{0x0E, 0x15, 0x16}, // '@'
{0x1E, 0x05, 0x1E}, // 'A'
{0x1F, 0x15, 0x0A}, // 'B'
{0x0E, 0x11, 0x11}, // 'C'
{0x1F, 0x11, 0x0E}, // 'D'
{0x1F, 0x15, 0x11}, // 'E'
{0x1F, 0x05, 0x01}, // 'F'
{0x0E, 0x11, 0x1D}, // 'G'
{0x1F, 0x04, 0x1F}, // 'H'
{0x11, 0x1F, 0x11}, // 'I'
{0x08, 0x10, 0x0F}, // 'J'
{0x1F, 0x04, 0x1B}, // 'K'
{0x1F, 0x10, 0x10}, // 'L'
{0x1F, 0x02, 0x1F}, // 'M'
{0x1F, 0x02, 0x1F}, // 'N'
{0x0E, 0x11, 0x0E}, // 'O'
{0x1F, 0x05, 0x02}, // 'P'
{0x0E, 0x11, 0x1E}, // 'Q'
{0x1F, 0x05, 0x1A}, // 'R'
{0x12, 0x15, 0x09}, // 'S'
{0x01, 0x1F, 0x01}, // 'T'
{0x0F, 0x10, 0x0F}, // 'U'
{0x07, 0x18, 0x07}, // 'V'
{0x1F, 0x08, 0x1F}, // 'W'
{0x1B, 0x04, 0x1B}, // 'X'
{0x03, 0x1C, 0x03}, // 'Y'
{0x19, 0x15, 0x13}, // 'Z'
{0x00, 0x1F, 0x11}, // '['
{0x03, 0x04, 0x18}, // '\'
{0x11, 0x1F, 0x00}, // ']'
{0x02, 0x01, 0x02}, // '^'
{0x10, 0x10, 0x10}, // '_'
{0x00, 0x01, 0x02}, // '`'
{0x0C, 0x14, 0x1C}, // 'a'
{0x1F, 0x14, 0x08}, // 'b'
{0x0C, 0x14, 0x14}, // 'c'
{0x08, 0x14, 0x1F}, // 'd'
{0x0C, 0x16, 0x14}, // 'e'
{0x04, 0x1F, 0x05}, // 'f'
{0x18, 0x14, 0x1E}, // 'g'
{0x1F, 0x04, 0x18}, // 'h'
{0x00, 0x17, 0x00}, // 'i'
{0x10, 0x17, 0x00}, // 'j'
{0x1F, 0x08, 0x14}, // 'k'
{0x00, 0x1F, 0x00}, // 'l'
{0x1C, 0x08, 0x1C}, // 'm'
{0x1C, 0x04, 0x18}, // 'n'
{0x0C, 0x12, 0x0C}, // 'o'
{0x1C, 0x0A, 0x04}, // 'p'
{0x04, 0x0A, 0x1C}, // 'q'
{0x1C, 0x04, 0x08}, // 'r'
{0x12, 0x16, 0x0C}, // 's'
{0x04, 0x1E, 0x04}, // 't'
{0x0E, 0x10, 0x0E}, // 'u'
{0x06, 0x18, 0x06}, // 'v'
{0x1E, 0x08, 0x1E}, // 'w'
{0x12, 0x0C, 0x12}, // 'x'
{0x16, 0x10, 0x0E}, // 'y'
{0x12, 0x16, 0x1A}, // 'z'
{0x04, 0x1B, 0x11}, // '{'
{0x00, 0x1F, 0x00}, // '|'
{0x11, 0x1B, 0x04}, // '}'
{0x08, 0x04, 0x08} // '~'
};
#endif // OS_FONT_3X5_H
+104
View File
@@ -0,0 +1,104 @@
#ifndef OS_FONT_5X7_H
#define OS_FONT_5X7_H
#include <stdint.h>
static const uint8_t font_5x7[][5] = {
{0x00, 0x00, 0x00, 0x00, 0x00}, // ' ' (32)
{0x00, 0x00, 0x5F, 0x00, 0x00}, // '!'
{0x00, 0x07, 0x00, 0x07, 0x00}, // '"'
{0x14, 0x7F, 0x14, 0x7F, 0x14}, // '#'
{0x24, 0x2A, 0x7F, 0x2A, 0x12}, // '$'
{0x23, 0x13, 0x08, 0x64, 0x62}, // '%'
{0x36, 0x49, 0x55, 0x22, 0x50}, // '&'
{0x00, 0x05, 0x03, 0x00, 0x00}, // '''
{0x00, 0x1C, 0x22, 0x41, 0x00}, // '('
{0x00, 0x41, 0x22, 0x1C, 0x00}, // ')'
{0x14, 0x08, 0x3E, 0x08, 0x14}, // '*'
{0x08, 0x08, 0x3E, 0x08, 0x08}, // '+'
{0x00, 0x50, 0x30, 0x00, 0x00}, // ','
{0x08, 0x08, 0x08, 0x08, 0x08}, // '-'
{0x00, 0x60, 0x60, 0x00, 0x00}, // '.'
{0x20, 0x10, 0x08, 0x04, 0x02}, // '/'
{0x3E, 0x51, 0x49, 0x45, 0x3E}, // '0'
{0x00, 0x42, 0x7F, 0x40, 0x00}, // '1'
{0x42, 0x61, 0x51, 0x49, 0x46}, // '2'
{0x21, 0x41, 0x45, 0x4B, 0x31}, // '3'
{0x18, 0x14, 0x12, 0x7F, 0x10}, // '4'
{0x27, 0x45, 0x45, 0x45, 0x39}, // '5'
{0x3C, 0x4A, 0x49, 0x49, 0x30}, // '6'
{0x01, 0x71, 0x09, 0x05, 0x03}, // '7'
{0x36, 0x49, 0x49, 0x49, 0x36}, // '8'
{0x06, 0x49, 0x49, 0x29, 0x1E}, // '9'
{0x00, 0x36, 0x36, 0x00, 0x00}, // ':'
{0x00, 0x56, 0x36, 0x00, 0x00}, // ';'
{0x08, 0x14, 0x22, 0x41, 0x00}, // '<'
{0x14, 0x14, 0x14, 0x14, 0x14}, // '='
{0x00, 0x41, 0x22, 0x14, 0x08}, // '>'
{0x02, 0x01, 0x51, 0x09, 0x06}, // '?'
{0x32, 0x49, 0x79, 0x41, 0x3E}, // '@'
{0x7E, 0x11, 0x11, 0x11, 0x7E}, // 'A'
{0x7F, 0x49, 0x49, 0x49, 0x36}, // 'B'
{0x3E, 0x41, 0x41, 0x41, 0x22}, // 'C'
{0x7F, 0x41, 0x41, 0x22, 0x1C}, // 'D'
{0x7F, 0x49, 0x49, 0x49, 0x41}, // 'E'
{0x7F, 0x09, 0x09, 0x09, 0x01}, // 'F'
{0x3E, 0x41, 0x49, 0x49, 0x7A}, // 'G'
{0x7F, 0x08, 0x08, 0x08, 0x7F}, // 'H'
{0x00, 0x41, 0x7F, 0x41, 0x00}, // 'I'
{0x20, 0x40, 0x41, 0x3F, 0x01}, // 'J'
{0x7F, 0x08, 0x14, 0x22, 0x41}, // 'K'
{0x7F, 0x40, 0x40, 0x40, 0x40}, // 'L'
{0x7F, 0x02, 0x0C, 0x02, 0x7F}, // 'M'
{0x7F, 0x04, 0x08, 0x10, 0x7F}, // 'N'
{0x3E, 0x41, 0x41, 0x41, 0x3E}, // 'O'
{0x7F, 0x09, 0x09, 0x09, 0x06}, // 'P'
{0x3E, 0x41, 0x51, 0x21, 0x5E}, // 'Q'
{0x7F, 0x09, 0x19, 0x29, 0x46}, // 'R'
{0x46, 0x49, 0x49, 0x49, 0x31}, // 'S'
{0x01, 0x01, 0x7F, 0x01, 0x01}, // 'T'
{0x3F, 0x40, 0x40, 0x40, 0x3F}, // 'U'
{0x1F, 0x20, 0x40, 0x20, 0x1F}, // 'V'
{0x3F, 0x40, 0x38, 0x40, 0x3F}, // 'W'
{0x63, 0x14, 0x08, 0x14, 0x63}, // 'X'
{0x07, 0x08, 0x70, 0x08, 0x07}, // 'Y'
{0x61, 0x51, 0x49, 0x45, 0x43}, // 'Z'
{0x00, 0x7F, 0x41, 0x41, 0x00}, // '['
{0x02, 0x04, 0x08, 0x10, 0x20}, // '\'
{0x00, 0x41, 0x41, 0x7F, 0x00}, // ']'
{0x04, 0x02, 0x01, 0x02, 0x04}, // '^'
{0x40, 0x40, 0x40, 0x40, 0x40}, // '_'
{0x00, 0x01, 0x02, 0x04, 0x00}, // '`'
{0x20, 0x54, 0x54, 0x54, 0x78}, // 'a'
{0x7F, 0x48, 0x44, 0x44, 0x38}, // 'b'
{0x38, 0x44, 0x44, 0x44, 0x20}, // 'c'
{0x38, 0x44, 0x44, 0x48, 0x7F}, // 'd'
{0x38, 0x54, 0x54, 0x54, 0x18}, // 'e'
{0x08, 0x7E, 0x09, 0x01, 0x02}, // 'f'
{0x0C, 0x52, 0x52, 0x52, 0x3E}, // 'g'
{0x7F, 0x08, 0x04, 0x04, 0x78}, // 'h'
{0x00, 0x44, 0x7D, 0x40, 0x00}, // 'i'
{0x20, 0x40, 0x44, 0x3D, 0x00}, // 'j'
{0x7F, 0x10, 0x28, 0x44, 0x00}, // 'k'
{0x00, 0x41, 0x7F, 0x40, 0x00}, // 'l'
{0x7C, 0x04, 0x18, 0x04, 0x78}, // 'm'
{0x7C, 0x08, 0x04, 0x04, 0x78}, // 'n'
{0x38, 0x44, 0x44, 0x44, 0x38}, // 'o'
{0x7C, 0x14, 0x14, 0x14, 0x08}, // 'p'
{0x08, 0x14, 0x14, 0x18, 0x7C}, // 'q'
{0x7C, 0x08, 0x04, 0x04, 0x08}, // 'r'
{0x48, 0x54, 0x54, 0x54, 0x20}, // 's'
{0x04, 0x3F, 0x44, 0x40, 0x20}, // 't'
{0x3C, 0x40, 0x40, 0x20, 0x7C}, // 'u'
{0x1C, 0x20, 0x40, 0x20, 0x1C}, // 'v'
{0x3C, 0x40, 0x30, 0x40, 0x3C}, // 'w'
{0x44, 0x28, 0x10, 0x28, 0x44}, // 'x'
{0x0C, 0x50, 0x50, 0x50, 0x3C}, // 'y'
{0x44, 0x64, 0x54, 0x4C, 0x44}, // 'z'
{0x00, 0x08, 0x36, 0x41, 0x00}, // '{'
{0x00, 0x00, 0x7F, 0x00, 0x00}, // '|'
{0x00, 0x41, 0x36, 0x08, 0x00}, // '}'
{0x08, 0x08, 0x2A, 0x1C, 0x08} // '~'
};
#endif // OS_FONT_5X7_H
+48
View File
@@ -0,0 +1,48 @@
#ifndef OS_GFX_H
#define OS_GFX_H
#include <stdint.h>
#include <stdbool.h>
#include "os_oled.h"
#include "os_status.h"
#ifdef __cplusplus
extern "C" {
#endif
#define STATUS_BAR_HEIGHT 8
#define ACTION_BAR_HEIGHT 7
#define VIEWPORT_Y_TOP 8
#define VIEWPORT_HEIGHT 32
#define VIEWPORT_FULL_HEIGHT 40
esp_err_t sys_gfx_init(void);
void sys_gfx_clear(void);
void sys_gfx_clear_viewport(void);
esp_err_t sys_gfx_flush(void);
void sys_gfx_draw_pixel(int16_t x, int16_t y, uint8_t color);
void sys_gfx_draw_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint8_t color);
void sys_gfx_draw_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t color);
void sys_gfx_fill_rect(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t color);
void sys_gfx_draw_bitmap(int16_t x, int16_t y, int16_t w, int16_t h, const uint8_t *bitmap, uint8_t color);
void sys_gfx_draw_char_5x7(int16_t x, int16_t y, char c, uint8_t color);
void sys_gfx_draw_str_5x7(int16_t x, int16_t y, const char *str, uint8_t color);
void sys_gfx_draw_char_3x5(int16_t x, int16_t y, char c, uint8_t color);
void sys_gfx_draw_str_3x5(int16_t x, int16_t y, const char *str, uint8_t color);
void sys_gfx_draw_status_bar(const sys_status_t *status);
void sys_gfx_draw_action_bar(const char *left_hint, const char *right_hint);
void sys_gfx_draw_menu(int16_t y_start, const char *items[], size_t count, size_t selected_idx);
void sys_gfx_draw_progress_bar(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t pct);
void sys_gfx_draw_sparkline(int16_t x, int16_t y, int16_t w, int16_t h, const uint8_t *data, size_t count, uint8_t max_val);
void sys_gfx_show_toast(const char *msg, uint32_t duration_ms);
void sys_gfx_render_toast_if_active(void);
#ifdef __cplusplus
}
#endif
#endif // OS_GFX_H
+46
View File
@@ -0,0 +1,46 @@
#ifndef OS_OLED_H
#define OS_OLED_H
#include <stdint.h>
#include <stdbool.h>
#include "driver/gpio.h"
#include "driver/i2c_master.h"
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
#define OLED_I2C_PORT 0 /* i2c_port_num_t */
#define OLED_I2C_ADDR 0x3C
#define OLED_PIN_SDA GPIO_NUM_5
#define OLED_PIN_SCL GPIO_NUM_6
#define OLED_I2C_FREQ_HZ 400000
#define OLED_WIDTH 72
#define OLED_HEIGHT 40
#define OLED_PAGES 5
#define OLED_BUFFER_SIZE (OLED_WIDTH * OLED_PAGES)
#ifndef OLED_COLUMN_OFFSET
#define OLED_COLUMN_OFFSET 28
#endif
#define COLOR_BLACK 0
#define COLOR_WHITE 1
#define COLOR_INVERT 2
esp_err_t oled_driver_init(gpio_num_t sda, gpio_num_t scl, uint8_t col_offset);
uint8_t *oled_driver_get_buffer(void);
void oled_driver_clear(void);
void oled_driver_fill(void);
esp_err_t oled_driver_flush(void);
esp_err_t oled_driver_set_contrast(uint8_t contrast);
esp_err_t oled_driver_set_invert(bool invert);
void oled_driver_draw_pixel(int16_t x, int16_t y, uint8_t color);
#ifdef __cplusplus
}
#endif
#endif // OS_OLED_H