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