[FL-878] Gui: screen streaming (#337)

* GUI: canvas streaming
* Fix right status bar icon alignment
This commit is contained in:
あく
2021-02-13 14:40:20 +03:00
committed by GitHub
parent b835d7a451
commit 23f66c2cdd
9 changed files with 134 additions and 21 deletions

View File

@@ -59,7 +59,7 @@ void gui_redraw_status_bar(Gui* gui) {
uint8_t width;
ViewPort* view_port;
// Right side
x = 128;
x = GUI_DISPLAY_WIDTH + 2;
ViewPortArray_it(it, gui->layers[GuiLayerStatusBarRight]);
while(!ViewPortArray_end_p(it) && x_used < GUI_STATUS_BAR_WIDTH) {
// Render view_port;
@@ -127,6 +127,12 @@ void gui_redraw(Gui* gui) {
}
canvas_commit(gui->canvas);
if(gui->canvas_callback) {
gui->canvas_callback(
canvas_get_buffer(gui->canvas),
canvas_get_buffer_size(gui->canvas),
gui->canvas_callback_context);
}
gui_unlock(gui);
}
@@ -159,6 +165,27 @@ void gui_unlock(Gui* gui) {
furi_check(osMutexRelease(gui->mutex) == osOK);
}
void gui_cli_screen_stream_callback(uint8_t* data, size_t size, void* context) {
furi_assert(data);
furi_assert(size == 1024);
furi_assert(context);
Gui* gui = context;
uint8_t magic[] = {0xF0, 0xE1, 0xD2, 0xC3};
cli_write(gui->cli, magic, sizeof(magic));
cli_write(gui->cli, data, size);
}
void gui_cli_screen_stream(string_t args, void* context) {
furi_assert(context);
Gui* gui = context;
gui_set_framebuffer_callback_context(gui, gui);
gui_set_framebuffer_callback(gui, gui_cli_screen_stream_callback);
cli_getc(gui->cli);
gui_set_framebuffer_callback(gui, NULL);
gui_set_framebuffer_callback_context(gui, NULL);
}
void gui_add_view_port(Gui* gui, ViewPort* view_port, GuiLayer layer) {
furi_assert(gui);
furi_assert(view_port);
@@ -256,6 +283,16 @@ void gui_send_view_port_back(Gui* gui, ViewPort* view_port) {
gui_unlock(gui);
}
void gui_set_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback) {
furi_assert(gui);
gui->canvas_callback = callback;
}
void gui_set_framebuffer_callback_context(Gui* gui, void* context) {
furi_assert(gui);
gui->canvas_callback_context = context;
}
Gui* gui_alloc() {
Gui* gui = furi_alloc(sizeof(Gui));
// Thread ID
@@ -276,6 +313,9 @@ Gui* gui_alloc() {
gui->input_events = furi_record_open("input_events");
furi_check(gui->input_events);
subscribe_pubsub(gui->input_events, gui_input_events_callback, gui);
// Cli
gui->cli = furi_record_open("cli");
cli_add_command(gui->cli, "screen_stream", gui_cli_screen_stream, gui);
return gui;
}