Merge branch 'UNLEASHED' into 420

This commit is contained in:
RogueMaster
2022-12-09 00:28:19 -05:00
16 changed files with 47 additions and 117 deletions

View File

@@ -16,7 +16,6 @@
[-> Download qFlipper 1.2.1 (allows .tgz installation) (official link)](https://update.flipperzero.one/builds/qFlipper/1.2.1/) [-> 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 ## Please support development of the project
* Boosty: https://boosty.to/mmxdev
* destream (100 EUR min): https://destream.net/live/MMX/donate * destream (100 EUR min): https://destream.net/live/MMX/donate
* cloudtips (only RU payments accepted): https://pay.cloudtips.ru/p/7b3e9d65 * cloudtips (only RU payments accepted): https://pay.cloudtips.ru/p/7b3e9d65
* USDT(TRC20): `TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs` * USDT(TRC20): `TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`

View File

@@ -9,8 +9,8 @@ static bool bad_usb_file_select(BadUsbApp* bad_usb) {
DialogsFileBrowserOptions browser_options; DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options( dialog_file_browser_set_basic_options(
&browser_options, BAD_USB_APP_SCRIPT_EXTENSION, &I_badusb_10px); &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.base_path = BAD_USB_APP_BASE_FOLDER;
browser_options.skip_assets = true;
// Input events and views are managed by file_browser // Input events and views are managed by file_browser
bool res = dialog_file_browser_show( bool res = dialog_file_browser_show(

View File

@@ -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_code(subghz->rpc_ctx, SubGhzErrorTypeOnlyRX);
rpc_system_app_set_error_text( rpc_system_app_set_error_text(
subghz->rpc_ctx, 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); rpc_system_app_confirm(subghz->rpc_ctx, RpcAppEventButtonPress, result);
} else if(event.event == SubGhzCustomEventSceneRpcButtonRelease) { } else if(event.event == SubGhzCustomEventSceneRpcButtonRelease) {

View File

@@ -828,6 +828,7 @@ int32_t unirfremix_app(void* p) {
DialogsFileBrowserOptions browser_options; DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options(&browser_options, UNIRFMAP_EXTENSION, &I_sub1_10px); 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); bool res = dialog_file_browser_show(dialogs, app->file_path, app->file_path, &browser_options);

View File

@@ -28,6 +28,7 @@ bool flipfrid_load_custom_uids_from_file(FlipFridState* context) {
DialogsFileBrowserOptions browser_options; DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options(&browser_options, LFRFID_UIDS_EXTENSION, &I_125_10px); 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; browser_options.hide_ext = false;
bool res = dialog_file_browser_show(context->dialogs, uid_path, uid_path, &browser_options); bool res = dialog_file_browser_show(context->dialogs, uid_path, uid_path, &browser_options);

View File

@@ -178,6 +178,7 @@ bool flipfrid_load_protocol_from_file(FlipFridState* context) {
DialogsFileBrowserOptions browser_options; DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options(&browser_options, LFRFID_APP_EXTENSION, &I_125_10px); 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 // Input events and views are managed by file_select
bool res = dialog_file_browser_show( bool res = dialog_file_browser_show(

View File

@@ -28,6 +28,7 @@ bool ibtnfuzzer_load_custom_uids_from_file(iBtnFuzzerState* context) {
DialogsFileBrowserOptions browser_options; DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options( dialog_file_browser_set_basic_options(
&browser_options, IBTNFUZZER_UIDS_EXTENSION, &I_ibutt_10px); &browser_options, IBTNFUZZER_UIDS_EXTENSION, &I_ibutt_10px);
browser_options.base_path = IBTNFUZZER_APP_PATH_FOLDER;
browser_options.hide_ext = false; browser_options.hide_ext = false;
bool res = dialog_file_browser_show(context->dialogs, uid_path, uid_path, &browser_options); bool res = dialog_file_browser_show(context->dialogs, uid_path, uid_path, &browser_options);

View File

@@ -164,6 +164,7 @@ bool ibtnfuzzer_load_protocol_from_file(iBtnFuzzerState* context) {
DialogsFileBrowserOptions browser_options; DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options( dialog_file_browser_set_basic_options(
&browser_options, IBUTTON_FUZZER_APP_EXTENSION, &I_ibutt_10px); &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 // Input events and views are managed by file_select
bool res = dialog_file_browser_show( bool res = dialog_file_browser_show(

View File

@@ -28,6 +28,7 @@ static bool open_wav_stream(Stream* stream) {
DialogsFileBrowserOptions browser_options; DialogsFileBrowserOptions browser_options;
dialog_file_browser_set_basic_options(&browser_options, ".wav", &I_music_10px); dialog_file_browser_set_basic_options(&browser_options, ".wav", &I_music_10px);
browser_options.base_path = WAVPLAYER_FOLDER;
browser_options.hide_ext = false; browser_options.hide_ext = false;
bool ret = dialog_file_browser_show(dialogs, path, path, &browser_options); bool ret = dialog_file_browser_show(dialogs, path, path, &browser_options);

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -105,8 +105,8 @@ bool ws_block_generic_serialize(
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt); uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
temp_data = curr_ts; temp_data = curr_ts;
if(!flipper_format_write_uint32(flipper_format, "Old", &temp_data, 1)) { if(!flipper_format_write_uint32(flipper_format, "Ts", &temp_data, 1)) {
FURI_LOG_E(TAG, "Unable to add agedata"); FURI_LOG_E(TAG, "Unable to add timestamp");
break; break;
} }
@@ -179,11 +179,11 @@ bool ws_block_generic_deserialize(WSBlockGeneric* instance, FlipperFormat* flipp
} }
instance->humidity = (uint8_t)temp_data; instance->humidity = (uint8_t)temp_data;
if(!flipper_format_read_uint32(flipper_format, "Old", (uint32_t*)&temp_data, 1)) { if(!flipper_format_read_uint32(flipper_format, "Ts", (uint32_t*)&temp_data, 1)) {
FURI_LOG_E(TAG, "Missing agedata"); FURI_LOG_E(TAG, "Missing timestamp");
break; 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)) { if(!flipper_format_read_uint32(flipper_format, "Ch", (uint32_t*)&temp_data, 1)) {
FURI_LOG_E(TAG, "Missing Channel"); FURI_LOG_E(TAG, "Missing Channel");

View File

@@ -29,7 +29,7 @@ struct WSBlockGeneric {
uint8_t data_count_bit; uint8_t data_count_bit;
uint8_t battery_low; uint8_t battery_low;
uint8_t humidity; uint8_t humidity;
uint32_t agedata; uint32_t timestamp;
uint8_t channel; uint8_t channel;
uint8_t btn; uint8_t btn;
float temp; float temp;

View File

@@ -8,7 +8,7 @@
#include <m-array.h> #include <m-array.h>
#define FRAME_HEIGHT 12 #define FRAME_HEIGHT 12
#define MAX_LEN_PX 100 #define MAX_LEN_PX 112
#define MENU_ITEMS 4u #define MENU_ITEMS 4u
#define UNLOCK_CNT 3 #define UNLOCK_CNT 3
@@ -189,7 +189,7 @@ void ws_view_receiver_draw(Canvas* canvas, WSReceiverModel* model) {
canvas_set_color(canvas, ColorBlack); canvas_set_color(canvas, ColorBlack);
} }
canvas_draw_icon(canvas, 4, 2 + i * FRAME_HEIGHT, ReceiverItemIcons[item_menu->type]); 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); furi_string_reset(str_buff);
} }
if(scrollbar) { if(scrollbar) {

View File

@@ -44,16 +44,16 @@ void ws_view_receiver_info_draw(Canvas* canvas, WSReceiverInfoModel* model) {
"%s %db", "%s %db",
furi_string_get_cstr(model->protocol_name), furi_string_get_cstr(model->protocol_name),
model->generic->data_count_bit); 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) { if(model->generic->channel != WS_NO_CHANNEL) {
snprintf(buffer, sizeof(buffer), "Ch: %01d", model->generic->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) { if(model->generic->id != WS_NO_ID) {
snprintf(buffer, sizeof(buffer), "Sn: 0x%02lX", model->generic->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) { 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) { if(model->generic->battery_low != WS_NO_BATT) {
snprintf( snprintf(
buffer, sizeof(buffer), "Batt: %s", (!model->generic->battery_low ? "ok" : "low")); 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); 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 elements_bold_rounded_frame(canvas, 0, 38, 127, 25);
if((int)model->generic->agedata > 0) { 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; FuriHalRtcDateTime curr_dt;
furi_hal_rtc_get_datetime(&curr_dt); furi_hal_rtc_get_datetime(&curr_dt);
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&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; canvas_draw_icon(canvas, 91, 46, &I_Timer_11x11);
uint8_t tmp_y_frame = 23;
uint8_t tmp_x_text = 113; if(ts_diff > 60) {
uint8_t tmp_y_text = 29; int tmp_sec = ts_diff;
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;
int cnt_min = 1; int cnt_min = 1;
for(int i = 1; tmp_sec > 60; i++) { for(int i = 1; tmp_sec > 60; i++) {
tmp_sec = tmp_sec - 60; tmp_sec = tmp_sec - 60;
@@ -110,55 +104,21 @@ void ws_view_receiver_info_draw(Canvas* canvas, WSReceiverInfoModel* model) {
} }
if(curr_ts % 2 == 0) { if(curr_ts % 2 == 0) {
canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned(canvas, 105, 51, AlignLeft, AlignCenter, "Old");
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");
} else { } else {
if(cnt_min >= 59) { if(cnt_min >= 59) {
canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned(canvas, 105, 51, AlignLeft, AlignCenter, "Old");
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");
} else { } 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); snprintf(buffer, sizeof(buffer), "%dm", cnt_min);
canvas_draw_str_aligned( canvas_draw_str_aligned(canvas, 114, 51, AlignCenter, AlignCenter, buffer);
canvas, tmp_x_text, tmp_y_text, AlignCenter, AlignCenter, buffer);
} }
} }
} else { } else {
canvas_set_color(canvas, ColorBlack); snprintf(buffer, sizeof(buffer), "%d", ts_diff);
canvas_draw_rframe(canvas, tmp_x_frame, tmp_y_frame, 26, 11, 1); canvas_draw_str_aligned(canvas, 112, 51, AlignCenter, AlignCenter, buffer);
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);
} }
} }
//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) { bool ws_view_receiver_info_input(InputEvent* event, void* context) {

35
assets/resources/infrared/assets/tv.ir Executable file → Normal file
View File

@@ -3662,38 +3662,3 @@ frequency: 38000
duty_cycle: 0.330000 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 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