 5c81bb8abc
			
		
	
	
		5c81bb8abc
		
			
		
	
	
	
	
		
			
			* 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
		
			
				
	
	
		
			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);
 |