add u8g2 and ui libs (#91)
* add u8g2 and ui libs * add display driver and usage example * not init display in test mode * change todo text * fix removed code * Target f2 (#107) * add ioc for flipperzero f2 * add generated f1 files to f2 * regenerate cubemx * invert initial state of led * blink backligh * shutdown backlight on idle
This commit is contained in:
218
lib/ui/ui.h
Normal file
218
lib/ui/ui.h
Normal file
@@ -0,0 +1,218 @@
|
||||
#pragma once
|
||||
|
||||
extern "C" {
|
||||
#include "main.h"
|
||||
#include "cmsis_os.h"
|
||||
#include "u8g2_support.h"
|
||||
#include "u8g2/u8g2.h"
|
||||
}
|
||||
|
||||
#include "events.h"
|
||||
|
||||
typedef struct {
|
||||
void* item;
|
||||
const char* name;
|
||||
} MenuItem;
|
||||
|
||||
#include "vendor.h"
|
||||
|
||||
typedef enum {
|
||||
LayoutActionUp,
|
||||
LayoutActionDown,
|
||||
LayoutActionLeft,
|
||||
LayoutActionRight,
|
||||
LayoutActionOk,
|
||||
LayoutActionBack,
|
||||
LayoutActionTimeout,
|
||||
LayoutActionUsbConnect,
|
||||
LayoutActionUsbDisconnect,
|
||||
LayoutActionEndOfCycle
|
||||
} LayoutAction;
|
||||
|
||||
typedef struct {
|
||||
FlipperComponent* item;
|
||||
LayoutAction action;
|
||||
} ActionItem;
|
||||
|
||||
void draw_text(const char* text, u8g2_t* u8g2, ScreenArea area);
|
||||
void draw_bitmap(const char* bitmap, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
class LayoutComponent: FlipperComponent {
|
||||
public:
|
||||
LayoutComponent(void (*draw_fn)(const char* text, u8g2_t* u8g2, ScreenArea area), ActionItem* actions, size_t actions_size, uint32_t timeout, const char* data) {
|
||||
this->data = data;
|
||||
this->actions = actions;
|
||||
this->actions_size = actions_size;
|
||||
this->timeout = timeout;
|
||||
this->draw_fn = draw_fn;
|
||||
|
||||
this->dirty = true;
|
||||
|
||||
this->wait_time = 0;
|
||||
}
|
||||
|
||||
virtual void handle(Event* event, struct _Store* store, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
private:
|
||||
const char* data;
|
||||
ActionItem* actions;
|
||||
size_t actions_size;
|
||||
uint32_t timeout;
|
||||
|
||||
void (*draw_fn)(const char* text, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
uint32_t wait_time;
|
||||
|
||||
bool dirty;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint32_t on_time;
|
||||
Color on_color;
|
||||
uint32_t off_time;
|
||||
Color off_color;
|
||||
} BlinkerComponentConfig;
|
||||
|
||||
class BlinkerComponent: FlipperComponent {
|
||||
public:
|
||||
BlinkerComponent(
|
||||
void (*draw_fn)(const char* text, u8g2_t* u8g2, ScreenArea area),
|
||||
BlinkerComponentConfig config,
|
||||
const char* data
|
||||
) {
|
||||
this->data = data;
|
||||
this->draw_fn = draw_fn;
|
||||
this->config = config;
|
||||
|
||||
this->dirty = true;
|
||||
|
||||
this->wait_time = 0;
|
||||
this->is_on = true;
|
||||
this->active = false;
|
||||
this->prev = NULL;
|
||||
}
|
||||
|
||||
virtual void handle(Event* event, struct _Store* store, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
private:
|
||||
const char* data;
|
||||
BlinkerComponentConfig config;
|
||||
|
||||
void (*draw_fn)(const char* text, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
uint32_t wait_time;
|
||||
|
||||
bool is_on;
|
||||
bool active;
|
||||
|
||||
bool dirty;
|
||||
FlipperComponent* prev;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint32_t on_time;
|
||||
Color on_color;
|
||||
uint32_t off_time;
|
||||
Color off_color;
|
||||
} BlinkerComponentOnBtnConfig;
|
||||
|
||||
class BlinkerComponentOnBtn: FlipperComponent {
|
||||
public:
|
||||
BlinkerComponentOnBtn(
|
||||
void (*draw_fn)(const char* text, u8g2_t* u8g2, ScreenArea area),
|
||||
BlinkerComponentOnBtnConfig config,
|
||||
const char* data
|
||||
) {
|
||||
this->data = data;
|
||||
this->draw_fn = draw_fn;
|
||||
this->config = config;
|
||||
|
||||
this->dirty = true;
|
||||
|
||||
this->wait_time = 0;
|
||||
this->is_on = true;
|
||||
this->active = false;
|
||||
this->prev = NULL;
|
||||
}
|
||||
|
||||
virtual void handle(Event* event, struct _Store* store, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
private:
|
||||
const char* data;
|
||||
BlinkerComponentOnBtnConfig config;
|
||||
|
||||
void (*draw_fn)(const char* text, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
uint32_t wait_time;
|
||||
|
||||
bool is_on;
|
||||
bool active;
|
||||
|
||||
bool dirty;
|
||||
FlipperComponent* prev;
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef enum {
|
||||
MenuEventUp,
|
||||
MenuEventDown
|
||||
} MenuEvent;
|
||||
|
||||
class MenuCtx {
|
||||
public:
|
||||
size_t size;
|
||||
size_t current;
|
||||
uint8_t cursor;
|
||||
MenuItem* list;
|
||||
|
||||
void handle(MenuEvent event);
|
||||
void reset();
|
||||
};
|
||||
|
||||
void draw_menu(MenuCtx* ctx, u8g2_t* u8g2, ScreenArea area);
|
||||
|
||||
class MenuComponent: FlipperComponent {
|
||||
public:
|
||||
MenuComponent(MenuItem* list, size_t size, const char* name) {
|
||||
this->ctx.size = size;
|
||||
this->ctx.current = 0;
|
||||
this->ctx.cursor = 0;
|
||||
|
||||
this->ctx.list = list;
|
||||
|
||||
this->name = name;
|
||||
this->prev = NULL;
|
||||
|
||||
this->dirty = true;
|
||||
}
|
||||
|
||||
|
||||
const char* name;
|
||||
FlipperComponent* prev;
|
||||
MenuCtx ctx;
|
||||
|
||||
|
||||
bool dirty;
|
||||
|
||||
virtual void handle(Event* event, struct _Store* store, u8g2_t* u8g2, ScreenArea area);
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint8_t x;
|
||||
uint8_t y;
|
||||
} Point;
|
||||
|
||||
typedef struct {
|
||||
uint8_t width;
|
||||
uint8_t height;
|
||||
uint8_t margin_left;
|
||||
uint8_t margin_top;
|
||||
uint8_t padding_left;
|
||||
uint8_t padding_top;
|
||||
uint8_t background;
|
||||
uint8_t color;
|
||||
uint8_t* font;
|
||||
} Block;
|
||||
|
||||
Point draw_block(u8g2_t* u8g2, const char* text, Block layout, uint8_t x, uint8_t y);
|
Reference in New Issue
Block a user