[FL-1369, FL-1397, FL-1420] IRDA + SDcard (#513)

* Add saving to SD-Card (not ready yet)
* Add saving to SD-card (done)
* Select previous menu item
* Fix central button
* Fix current_button
* Refactoring
* Add notifications
* [FL-1417] Add IRDA CLI
  CLI commands:
  1) ir_rx
  Receives all IR-trafic, decodes and prints result to stdout
  2) ir_tx <protocol> <address> <command>
  Transmits IR-signal. Address and command are hex-formatted
* Fix BUG with random memory corruption at random time in random place in random universe in random unknown space and time forever amen
* Fix submenu set_selected_item
* Bring protocol order back
* Add TODO sdcard check
This commit is contained in:
Albert Kharisov
2021-06-09 16:04:49 +03:00
committed by GitHub
parent 498ffe8d2c
commit 6c74ea65c2
31 changed files with 846 additions and 178 deletions

View File

@@ -71,7 +71,7 @@ void elements_button_left(Canvas* canvas, const char* str) {
const uint8_t horizontal_offset = 3;
const uint8_t string_width = canvas_string_width(canvas, str);
const IconData* icon = assets_icons_get_data(I_ButtonLeft_4x7);
const uint8_t icon_offset = 6;
const uint8_t icon_offset = 3;
const uint8_t icon_width_with_offset = icon->width + icon_offset;
const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset;
@@ -97,7 +97,7 @@ void elements_button_right(Canvas* canvas, const char* str) {
const uint8_t horizontal_offset = 3;
const uint8_t string_width = canvas_string_width(canvas, str);
const IconData* icon = assets_icons_get_data(I_ButtonRight_4x7);
const uint8_t icon_offset = 6;
const uint8_t icon_offset = 3;
const uint8_t icon_width_with_offset = icon->width + icon_offset;
const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset;
@@ -122,10 +122,10 @@ void elements_button_right(Canvas* canvas, const char* str) {
void elements_button_center(Canvas* canvas, const char* str) {
const uint8_t button_height = 13;
const uint8_t vertical_offset = 3;
const uint8_t horizontal_offset = 3;
const uint8_t horizontal_offset = 1;
const uint8_t string_width = canvas_string_width(canvas, str);
const IconData* icon = assets_icons_get_data(I_ButtonCenter_7x7);
const uint8_t icon_offset = 6;
const uint8_t icon_offset = 3;
const uint8_t icon_width_with_offset = icon->width + icon_offset;
const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset;

View File

@@ -286,3 +286,21 @@ void button_menu_free(ButtonMenu* button_menu) {
view_free(button_menu->view);
free(button_menu);
}
void button_menu_set_selected_item(ButtonMenu* button_menu, uint32_t index) {
furi_assert(button_menu);
with_view_model(
button_menu->view, (ButtonMenuModel * model) {
uint8_t item_position = 0;
ButtonMenuItemArray_it_t it;
for(ButtonMenuItemArray_it(it, model->items); !ButtonMenuItemArray_end_p(it);
ButtonMenuItemArray_next(it), ++item_position) {
if(ButtonMenuItemArray_cref(it)->index == index) {
model->position = item_position;
break;
}
}
return true;
});
}

View File

@@ -68,6 +68,13 @@ void button_menu_free(ButtonMenu* button_menu);
*/
void button_menu_set_header(ButtonMenu* button_menu, const char* header);
/**
* @brief Set selected item
* @param button_menu - ButtonMenu instance
* @param index - index of ButtonMenu to be selected
*/
void button_menu_set_selected_item(ButtonMenu* button_menu, uint32_t index);
#ifdef __cplusplus
}
#endif

View File

@@ -36,12 +36,12 @@ static void submenu_view_draw_callback(Canvas* canvas, void* _model) {
const uint8_t item_width = 123;
canvas_clear(canvas);
canvas_set_font(canvas, FontPrimary);
uint8_t position = 0;
SubmenuItemArray_it_t it;
if(model->header) {
canvas_set_font(canvas, FontPrimary);
canvas_draw_str(canvas, 4, 11, model->header);
}
@@ -49,10 +49,10 @@ static void submenu_view_draw_callback(Canvas* canvas, void* _model) {
for(SubmenuItemArray_it(it, model->items); !SubmenuItemArray_end_p(it);
SubmenuItemArray_next(it)) {
uint8_t item_position = position - model->window_position;
uint8_t elements_on_screen = model->header ? 3 : 4;
uint8_t items_on_screen = model->header ? 3 : 4;
uint8_t y_offset = model->header ? 16 : 0;
if(item_position < elements_on_screen) {
if(item_position < items_on_screen) {
if(position == model->position) {
canvas_set_color(canvas, ColorBlack);
elements_slightly_rounded_box(
@@ -202,11 +202,15 @@ void submenu_set_selected_item(Submenu* submenu, uint32_t index) {
model->window_position -= 1;
}
if(SubmenuItemArray_size(model->items) <= 4) {
uint8_t items_on_screen = model->header ? 3 : 4;
if(SubmenuItemArray_size(model->items) <= items_on_screen) {
model->window_position = 0;
} else {
if(model->window_position >= (SubmenuItemArray_size(model->items) - 4)) {
model->window_position = (SubmenuItemArray_size(model->items) - 4);
if(model->window_position >=
(SubmenuItemArray_size(model->items) - items_on_screen)) {
model->window_position =
(SubmenuItemArray_size(model->items) - items_on_screen);
}
}
@@ -217,7 +221,7 @@ void submenu_set_selected_item(Submenu* submenu, uint32_t index) {
void submenu_process_up(Submenu* submenu) {
with_view_model(
submenu->view, (SubmenuModel * model) {
uint8_t elements_on_screen = model->header ? 3 : 4;
uint8_t items_on_screen = model->header ? 3 : 4;
if(model->position > 0) {
model->position--;
if(((model->position - model->window_position) < 1) &&
@@ -226,8 +230,8 @@ void submenu_process_up(Submenu* submenu) {
}
} else {
model->position = SubmenuItemArray_size(model->items) - 1;
if(model->position > (elements_on_screen - 1)) {
model->window_position = model->position - (elements_on_screen - 1);
if(model->position > (items_on_screen - 1)) {
model->window_position = model->position - (items_on_screen - 1);
}
}
return true;
@@ -237,12 +241,12 @@ void submenu_process_up(Submenu* submenu) {
void submenu_process_down(Submenu* submenu) {
with_view_model(
submenu->view, (SubmenuModel * model) {
uint8_t elements_on_screen = model->header ? 3 : 4;
uint8_t items_on_screen = model->header ? 3 : 4;
if(model->position < (SubmenuItemArray_size(model->items) - 1)) {
model->position++;
if((model->position - model->window_position) > (elements_on_screen - 2) &&
if((model->position - model->window_position) > (items_on_screen - 2) &&
model->window_position <
(SubmenuItemArray_size(model->items) - elements_on_screen)) {
(SubmenuItemArray_size(model->items) - items_on_screen)) {
model->window_position++;
}
} else {