diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ea241b75..b46fdd419 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,6 @@ [-> Download qFlipper 1.2.1 (allows .tgz installation) (official link)](https://update.flipperzero.one/builds/qFlipper/1.2.1/) ## Please support development of the project -* Boosty: https://boosty.to/mmxdev * destream (100 EUR min): https://destream.net/live/MMX/donate * cloudtips (only RU payments accepted): https://pay.cloudtips.ru/p/7b3e9d65 * USDT(TRC20): `TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs` diff --git a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c index 25aa063f7..de84e3406 100644 --- a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c +++ b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c @@ -9,8 +9,8 @@ static bool bad_usb_file_select(BadUsbApp* bad_usb) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options( &browser_options, BAD_USB_APP_SCRIPT_EXTENSION, &I_badusb_10px); - browser_options.skip_assets = true; browser_options.base_path = BAD_USB_APP_BASE_FOLDER; + browser_options.skip_assets = true; // Input events and views are managed by file_browser bool res = dialog_file_browser_show( diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index 64acac0b3..68f2e0199 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -49,7 +49,7 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { rpc_system_app_set_error_code(subghz->rpc_ctx, SubGhzErrorTypeOnlyRX); rpc_system_app_set_error_text( subghz->rpc_ctx, - "Transmission on this frequency is restricted in your region"); + "Transmission on this frequency is restricted in your settings"); } rpc_system_app_confirm(subghz->rpc_ctx, RpcAppEventButtonPress, result); } else if(event.event == SubGhzCustomEventSceneRpcButtonRelease) { diff --git a/applications/main/unirfremix/unirfremix_app.c b/applications/main/unirfremix/unirfremix_app.c index cb1fd7871..4608863d4 100644 --- a/applications/main/unirfremix/unirfremix_app.c +++ b/applications/main/unirfremix/unirfremix_app.c @@ -828,6 +828,7 @@ int32_t unirfremix_app(void* p) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, UNIRFMAP_EXTENSION, &I_sub1_10px); + browser_options.base_path = UNIRFMAP_FOLDER; bool res = dialog_file_browser_show(dialogs, app->file_path, app->file_path, &browser_options); diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.c b/applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.c index 7bf7f5eaa..e2e8b76a2 100644 --- a/applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.c +++ b/applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.c @@ -28,6 +28,7 @@ bool flipfrid_load_custom_uids_from_file(FlipFridState* context) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, LFRFID_UIDS_EXTENSION, &I_125_10px); + browser_options.base_path = RFIDFUZZER_APP_PATH_FOLDER; browser_options.hide_ext = false; bool res = dialog_file_browser_show(context->dialogs, uid_path, uid_path, &browser_options); diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c b/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c index d41549d73..ce6a40b11 100644 --- a/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c +++ b/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c @@ -178,6 +178,7 @@ bool flipfrid_load_protocol_from_file(FlipFridState* context) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, LFRFID_APP_EXTENSION, &I_125_10px); + browser_options.base_path = LFRFID_APP_PATH_FOLDER; // Input events and views are managed by file_select bool res = dialog_file_browser_show( diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c b/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c index 8f1a422b3..07199ab46 100644 --- a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c +++ b/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c @@ -28,6 +28,7 @@ bool ibtnfuzzer_load_custom_uids_from_file(iBtnFuzzerState* context) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options( &browser_options, IBTNFUZZER_UIDS_EXTENSION, &I_ibutt_10px); + browser_options.base_path = IBTNFUZZER_APP_PATH_FOLDER; browser_options.hide_ext = false; bool res = dialog_file_browser_show(context->dialogs, uid_path, uid_path, &browser_options); diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c b/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c index 99e6db733..47d5122ab 100644 --- a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c +++ b/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c @@ -164,6 +164,7 @@ bool ibtnfuzzer_load_protocol_from_file(iBtnFuzzerState* context) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options( &browser_options, IBUTTON_FUZZER_APP_EXTENSION, &I_ibutt_10px); + browser_options.base_path = IBUTTON_FUZZER_APP_PATH_FOLDER; // Input events and views are managed by file_select bool res = dialog_file_browser_show( diff --git a/applications/plugins/wav_player/wav_player.c b/applications/plugins/wav_player/wav_player.c index f8fce4549..e77eac67f 100644 --- a/applications/plugins/wav_player/wav_player.c +++ b/applications/plugins/wav_player/wav_player.c @@ -28,6 +28,7 @@ static bool open_wav_stream(Stream* stream) { DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, ".wav", &I_music_10px); + browser_options.base_path = WAVPLAYER_FOLDER; browser_options.hide_ext = false; bool ret = dialog_file_browser_show(dialogs, path, path, &browser_options); diff --git a/applications/plugins/weather_station/images/Humid_8x13.png b/applications/plugins/weather_station/images/Humid_8x13.png new file mode 100644 index 000000000..6d8c71b00 Binary files /dev/null and b/applications/plugins/weather_station/images/Humid_8x13.png differ diff --git a/applications/plugins/weather_station/images/Timer_11x11.png b/applications/plugins/weather_station/images/Timer_11x11.png new file mode 100644 index 000000000..21ad47f4b Binary files /dev/null and b/applications/plugins/weather_station/images/Timer_11x11.png differ diff --git a/applications/plugins/weather_station/protocols/ws_generic.c b/applications/plugins/weather_station/protocols/ws_generic.c index 3a1c40726..cd5bf6557 100644 --- a/applications/plugins/weather_station/protocols/ws_generic.c +++ b/applications/plugins/weather_station/protocols/ws_generic.c @@ -105,8 +105,8 @@ bool ws_block_generic_serialize( uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt); temp_data = curr_ts; - if(!flipper_format_write_uint32(flipper_format, "Old", &temp_data, 1)) { - FURI_LOG_E(TAG, "Unable to add agedata"); + if(!flipper_format_write_uint32(flipper_format, "Ts", &temp_data, 1)) { + FURI_LOG_E(TAG, "Unable to add timestamp"); break; } @@ -179,11 +179,11 @@ bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipp } instance->humidity = (uint8_t)temp_data; - if(!flipper_format_read_uint32(flipper_format, "Old", (uint32_t*)&temp_data, 1)) { - FURI_LOG_E(TAG, "Missing agedata"); + if(!flipper_format_read_uint32(flipper_format, "Ts", (uint32_t*)&temp_data, 1)) { + FURI_LOG_E(TAG, "Missing timestamp"); break; } - instance->agedata = (uint32_t)temp_data; + instance->timestamp = (uint32_t)temp_data; if(!flipper_format_read_uint32(flipper_format, "Ch", (uint32_t*)&temp_data, 1)) { FURI_LOG_E(TAG, "Missing Channel"); diff --git a/applications/plugins/weather_station/protocols/ws_generic.h b/applications/plugins/weather_station/protocols/ws_generic.h index 7d0f198d5..657f8a1fc 100644 --- a/applications/plugins/weather_station/protocols/ws_generic.h +++ b/applications/plugins/weather_station/protocols/ws_generic.h @@ -29,7 +29,7 @@ struct WSBlockGeneric { uint8_t data_count_bit; uint8_t battery_low; uint8_t humidity; - uint32_t agedata; + uint32_t timestamp; uint8_t channel; uint8_t btn; float temp; diff --git a/applications/plugins/weather_station/views/weather_station_receiver.c b/applications/plugins/weather_station/views/weather_station_receiver.c index 7c002f96d..654fb5a3b 100644 --- a/applications/plugins/weather_station/views/weather_station_receiver.c +++ b/applications/plugins/weather_station/views/weather_station_receiver.c @@ -8,7 +8,7 @@ #include #define FRAME_HEIGHT 12 -#define MAX_LEN_PX 100 +#define MAX_LEN_PX 112 #define MENU_ITEMS 4u #define UNLOCK_CNT 3 @@ -189,7 +189,7 @@ void ws_view_receiver_draw(Canvas* canvas, WSReceiverModel* model) { canvas_set_color(canvas, ColorBlack); } canvas_draw_icon(canvas, 4, 2 + i * FRAME_HEIGHT, ReceiverItemIcons[item_menu->type]); - canvas_draw_str(canvas, 15, 9 + i * FRAME_HEIGHT, furi_string_get_cstr(str_buff)); + canvas_draw_str(canvas, 14, 9 + i * FRAME_HEIGHT, furi_string_get_cstr(str_buff)); furi_string_reset(str_buff); } if(scrollbar) { diff --git a/applications/plugins/weather_station/views/weather_station_receiver_info.c b/applications/plugins/weather_station/views/weather_station_receiver_info.c index 0098da65b..7775a3623 100644 --- a/applications/plugins/weather_station/views/weather_station_receiver_info.c +++ b/applications/plugins/weather_station/views/weather_station_receiver_info.c @@ -44,16 +44,16 @@ void ws_view_receiver_info_draw(Canvas* canvas, WSReceiverInfoModel* model) { "%s %db", furi_string_get_cstr(model->protocol_name), model->generic->data_count_bit); - canvas_draw_str(canvas, 5, 8, buffer); + canvas_draw_str(canvas, 0, 8, buffer); if(model->generic->channel != WS_NO_CHANNEL) { snprintf(buffer, sizeof(buffer), "Ch: %01d", model->generic->channel); - canvas_draw_str(canvas, 105, 8, buffer); + canvas_draw_str(canvas, 106, 8, buffer); } if(model->generic->id != WS_NO_ID) { snprintf(buffer, sizeof(buffer), "Sn: 0x%02lX", model->generic->id); - canvas_draw_str(canvas, 5, 20, buffer); + canvas_draw_str(canvas, 0, 20, buffer); } if(model->generic->btn != WS_NO_BTN) { @@ -64,45 +64,39 @@ void ws_view_receiver_info_draw(Canvas* canvas, WSReceiverInfoModel* model) { if(model->generic->battery_low != WS_NO_BATT) { snprintf( buffer, sizeof(buffer), "Batt: %s", (!model->generic->battery_low ? "ok" : "low")); - canvas_draw_str(canvas, 90, 20, buffer); + canvas_draw_str_aligned(canvas, 126, 17, AlignRight, AlignCenter, buffer); } snprintf(buffer, sizeof(buffer), "Data: 0x%llX", model->generic->data); - canvas_draw_str(canvas, 5, 32, buffer); + canvas_draw_str(canvas, 0, 32, buffer); - //DATA AGE - if((int)model->generic->agedata > 0) { + elements_bold_rounded_frame(canvas, 0, 38, 127, 25); + canvas_set_font(canvas, FontPrimary); + + if(model->generic->temp != WS_NO_TEMPERATURE) { + canvas_draw_icon(canvas, 6, 43, &I_Therm_7x16); + snprintf(buffer, sizeof(buffer), "%3.1f C", (double)model->generic->temp); + canvas_draw_str_aligned(canvas, 47, 47, AlignRight, AlignTop, buffer); + canvas_draw_circle(canvas, 38, 46, 1); + } + + if(model->generic->humidity != WS_NO_HUMIDITY) { + canvas_draw_icon(canvas, 53, 44, &I_Humid_8x13); + snprintf(buffer, sizeof(buffer), "%d%%", model->generic->humidity); + canvas_draw_str(canvas, 64, 55, buffer); + } + + if((int)model->generic->timestamp > 0) { FuriHalRtcDateTime curr_dt; furi_hal_rtc_get_datetime(&curr_dt); uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt); - int diffold = (int)curr_ts - (int)model->generic->agedata; + int ts_diff = (int)curr_ts - (int)model->generic->timestamp; - uint8_t tmp_x_frame = 101; - uint8_t tmp_y_frame = 23; + canvas_draw_icon(canvas, 91, 46, &I_Timer_11x11); - uint8_t tmp_x_text = 113; - uint8_t tmp_y_text = 29; - if(model->generic->data_count_bit >= 41) { - tmp_x_frame = 78; - tmp_y_frame = 0; - - tmp_x_text = 91; - tmp_y_text = 6; - - if(model->generic->btn == WS_NO_BTN) { - if(furi_string_size(model->protocol_name) > (size_t)10) { - tmp_x_frame = 61; - tmp_y_frame = 11; - - tmp_x_text = 74; - tmp_y_text = 17; - } - } - } - - if(diffold > 60) { - int tmp_sec = diffold; + if(ts_diff > 60) { + int tmp_sec = ts_diff; int cnt_min = 1; for(int i = 1; tmp_sec > 60; i++) { tmp_sec = tmp_sec - 60; @@ -110,55 +104,21 @@ void ws_view_receiver_info_draw(Canvas* canvas, WSReceiverInfoModel* model) { } if(curr_ts % 2 == 0) { - canvas_set_color(canvas, ColorBlack); - canvas_draw_rframe(canvas, tmp_x_frame, tmp_y_frame, 26, 11, 1); - canvas_set_color(canvas, ColorBlack); - canvas_draw_str_aligned( - canvas, tmp_x_text, tmp_y_text, AlignCenter, AlignCenter, "OLD"); + canvas_draw_str_aligned(canvas, 105, 51, AlignLeft, AlignCenter, "Old"); } else { if(cnt_min >= 59) { - canvas_set_color(canvas, ColorBlack); - canvas_draw_rframe(canvas, tmp_x_frame, tmp_y_frame, 26, 11, 1); - canvas_set_color(canvas, ColorBlack); - canvas_draw_str_aligned( - canvas, tmp_x_text, tmp_y_text, AlignCenter, AlignCenter, "OLD"); + canvas_draw_str_aligned(canvas, 105, 51, AlignLeft, AlignCenter, "Old"); } else { - canvas_set_color(canvas, ColorBlack); - canvas_draw_rframe(canvas, tmp_x_frame, tmp_y_frame, 26, 11, 1); - canvas_draw_box(canvas, tmp_x_frame, tmp_y_frame, 26, 11); - canvas_set_color(canvas, ColorWhite); snprintf(buffer, sizeof(buffer), "%dm", cnt_min); - canvas_draw_str_aligned( - canvas, tmp_x_text, tmp_y_text, AlignCenter, AlignCenter, buffer); + canvas_draw_str_aligned(canvas, 114, 51, AlignCenter, AlignCenter, buffer); } } } else { - canvas_set_color(canvas, ColorBlack); - canvas_draw_rframe(canvas, tmp_x_frame, tmp_y_frame, 26, 11, 1); - canvas_set_color(canvas, ColorBlack); - snprintf(buffer, sizeof(buffer), "%d", diffold); - canvas_draw_str_aligned( - canvas, tmp_x_text, tmp_y_text, AlignCenter, AlignCenter, buffer); + snprintf(buffer, sizeof(buffer), "%d", ts_diff); + canvas_draw_str_aligned(canvas, 112, 51, AlignCenter, AlignCenter, buffer); } } - //DATA AGE end - - elements_bold_rounded_frame(canvas, 2, 37, 123, 25); - canvas_set_font(canvas, FontPrimary); - - if(model->generic->temp != WS_NO_TEMPERATURE) { - canvas_draw_icon(canvas, 18, 42, &I_Therm_7x16); - snprintf(buffer, sizeof(buffer), "%3.1f C", (double)model->generic->temp); - canvas_draw_str_aligned(canvas, 63, 46, AlignRight, AlignTop, buffer); - canvas_draw_circle(canvas, 55, 45, 1); - } - - if(model->generic->humidity != WS_NO_HUMIDITY) { - canvas_draw_icon(canvas, 75, 42, &I_Humid_10x15); - snprintf(buffer, sizeof(buffer), "%d%%", model->generic->humidity); - canvas_draw_str(canvas, 91, 54, buffer); - } } bool ws_view_receiver_info_input(InputEvent* event, void* context) { diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir old mode 100755 new mode 100644 index 5b9f9cfdf..b97b85bb6 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -3662,38 +3662,3 @@ frequency: 38000 duty_cycle: 0.330000 data: 3505 1690 483 416 454 1258 483 416 454 416 454 417 428 442 428 442 428 441 455 416 454 416 454 416 454 417 452 419 450 1289 451 421 448 423 447 448 422 448 422 448 422 448 422 448 422 448 422 448 422 1319 422 448 422 448 422 448 422 448 423 448 422 448 423 448 422 448 422 1319 422 448 422 1319 422 448 422 1319 422 1319 422 448 422 448 423 1319 422 448 422 1319 422 448 422 1319 422 1320 421 449 421 1319 422 # -name: POWER -type: parsed -protocol: RC5 -address: 01 00 00 00 -command: 0C 00 00 00 -# -name: MUTE -type: parsed -protocol: RC5 -address: 01 00 00 00 -command: 0D 00 00 00 -# -name: VOL+ -type: parsed -protocol: RC5 -address: 01 00 00 00 -command: 10 00 00 00 -# -name: VOL- -type: parsed -protocol: RC5 -address: 01 00 00 00 -command: 11 00 00 00 -# -name: CH+ -type: parsed -protocol: RC5 -address: 01 00 00 00 -command: 20 00 00 00 -# -name: CH- -type: parsed -protocol: RC5 -address: 01 00 00 00 -command: 21 00 00 00 \ No newline at end of file