219 lines
4.5 KiB
C
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);
|