mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-09 05:49:09 -07:00
Merge branch 'fz-dev' into dev
This commit is contained in:
@@ -18,6 +18,7 @@ const CanvasFontParameters canvas_font_params[FontTotalNumber] = {
|
||||
|
||||
Canvas* canvas_init() {
|
||||
Canvas* canvas = malloc(sizeof(Canvas));
|
||||
canvas->compress_icon = compress_icon_alloc();
|
||||
|
||||
// Setup u8g2
|
||||
u8g2_Setup_st756x_flipper(&canvas->fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32);
|
||||
@@ -36,6 +37,7 @@ Canvas* canvas_init() {
|
||||
|
||||
void canvas_free(Canvas* canvas) {
|
||||
furi_assert(canvas);
|
||||
compress_icon_free(canvas->compress_icon);
|
||||
free(canvas);
|
||||
}
|
||||
|
||||
@@ -221,7 +223,7 @@ void canvas_draw_bitmap(
|
||||
x += canvas->offset_x;
|
||||
y += canvas->offset_y;
|
||||
uint8_t* bitmap_data = NULL;
|
||||
furi_hal_compress_icon_decode(compressed_bitmap_data, &bitmap_data);
|
||||
compress_icon_decode(canvas->compress_icon, compressed_bitmap_data, &bitmap_data);
|
||||
u8g2_DrawXBM(&canvas->fb, x, y, width, height, bitmap_data);
|
||||
}
|
||||
|
||||
@@ -236,7 +238,8 @@ void canvas_draw_icon_animation(
|
||||
x += canvas->offset_x;
|
||||
y += canvas->offset_y;
|
||||
uint8_t* icon_data = NULL;
|
||||
furi_hal_compress_icon_decode(icon_animation_get_data(icon_animation), &icon_data);
|
||||
compress_icon_decode(
|
||||
canvas->compress_icon, icon_animation_get_data(icon_animation), &icon_data);
|
||||
u8g2_DrawXBM(
|
||||
&canvas->fb,
|
||||
x,
|
||||
@@ -253,7 +256,7 @@ void canvas_draw_icon(Canvas* canvas, uint8_t x, uint8_t y, const Icon* icon) {
|
||||
x += canvas->offset_x;
|
||||
y += canvas->offset_y;
|
||||
uint8_t* icon_data = NULL;
|
||||
furi_hal_compress_icon_decode(icon_get_data(icon), &icon_data);
|
||||
compress_icon_decode(canvas->compress_icon, icon_get_data(icon), &icon_data);
|
||||
u8g2_DrawXBM(&canvas->fb, x, y, icon_get_width(icon), icon_get_height(icon), icon_data);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "canvas.h"
|
||||
#include <u8g2.h>
|
||||
#include <toolbox/compress.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -21,6 +22,7 @@ struct Canvas {
|
||||
uint8_t offset_y;
|
||||
uint8_t width;
|
||||
uint8_t height;
|
||||
CompressIcon* compress_icon;
|
||||
};
|
||||
|
||||
/** Allocate memory and initialize canvas
|
||||
|
||||
@@ -250,6 +250,7 @@ static void gui_redraw(Gui* gui) {
|
||||
p->callback(
|
||||
canvas_get_buffer(gui->canvas),
|
||||
canvas_get_buffer_size(gui->canvas),
|
||||
canvas_get_orientation(gui->canvas),
|
||||
p->context);
|
||||
}
|
||||
} while(false);
|
||||
|
||||
@@ -27,7 +27,11 @@ typedef enum {
|
||||
} GuiLayer;
|
||||
|
||||
/** Gui Canvas Commit Callback */
|
||||
typedef void (*GuiCanvasCommitCallback)(uint8_t* data, size_t size, void* context);
|
||||
typedef void (*GuiCanvasCommitCallback)(
|
||||
uint8_t* data,
|
||||
size_t size,
|
||||
CanvasOrientation orientation,
|
||||
void* context);
|
||||
|
||||
#define RECORD_GUI "gui"
|
||||
|
||||
|
||||
@@ -33,8 +33,18 @@ typedef struct {
|
||||
uint32_t input_counter;
|
||||
} RpcGuiSystem;
|
||||
|
||||
static void
|
||||
rpc_system_gui_screen_stream_frame_callback(uint8_t* data, size_t size, void* context) {
|
||||
static const PB_Gui_ScreenOrientation rpc_system_gui_screen_orientation_map[] = {
|
||||
[CanvasOrientationHorizontal] = PB_Gui_ScreenOrientation_HORIZONTAL,
|
||||
[CanvasOrientationHorizontalFlip] = PB_Gui_ScreenOrientation_HORIZONTAL_FLIP,
|
||||
[CanvasOrientationVertical] = PB_Gui_ScreenOrientation_VERTICAL,
|
||||
[CanvasOrientationVerticalFlip] = PB_Gui_ScreenOrientation_VERTICAL_FLIP,
|
||||
};
|
||||
|
||||
static void rpc_system_gui_screen_stream_frame_callback(
|
||||
uint8_t* data,
|
||||
size_t size,
|
||||
CanvasOrientation orientation,
|
||||
void* context) {
|
||||
furi_assert(data);
|
||||
furi_assert(context);
|
||||
|
||||
@@ -44,6 +54,8 @@ static void
|
||||
furi_assert(size == rpc_gui->transmit_frame->content.gui_screen_frame.data->size);
|
||||
|
||||
memcpy(buffer, data, size);
|
||||
rpc_gui->transmit_frame->content.gui_screen_frame.orientation =
|
||||
rpc_system_gui_screen_orientation_map[orientation];
|
||||
|
||||
furi_thread_flags_set(furi_thread_get_id(rpc_gui->transmit_thread), RpcGuiWorkerFlagTransmit);
|
||||
}
|
||||
@@ -53,12 +65,22 @@ static int32_t rpc_system_gui_screen_stream_frame_transmit_thread(void* context)
|
||||
|
||||
RpcGuiSystem* rpc_gui = (RpcGuiSystem*)context;
|
||||
|
||||
uint32_t transmit_time = 0;
|
||||
while(true) {
|
||||
uint32_t flags =
|
||||
furi_thread_flags_wait(RpcGuiWorkerFlagAny, FuriFlagWaitAny, FuriWaitForever);
|
||||
|
||||
if(flags & RpcGuiWorkerFlagTransmit) {
|
||||
transmit_time = furi_get_tick();
|
||||
rpc_send(rpc_gui->session, rpc_gui->transmit_frame);
|
||||
transmit_time = furi_get_tick() - transmit_time;
|
||||
|
||||
// Guaranteed bandwidth reserve
|
||||
uint32_t extra_delay = transmit_time / 20;
|
||||
if(extra_delay > 500) extra_delay = 500;
|
||||
if(extra_delay) furi_delay_tick(extra_delay);
|
||||
}
|
||||
|
||||
if(flags & RpcGuiWorkerFlagExit) {
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user