unleashed-firmware/lib/ui/ui.h
coreglitch 5c81bb8abc
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
2020-09-09 19:12:09 +03:00

219 lines
4.5 KiB
C++

#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);