[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:
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
});
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user