mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-13 22:58:36 -07:00
Merge branch 'UNLEASHED' into 420
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
### New changes
|
### New changes
|
||||||
* Plugins: Added Temperature Sensor Plugin - HTU21D / SI7021 [(By Mywk)](https://github.com/Mywk/FlipperTemperatureSensor) - [How to Connect](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/applications/plugins/temperature_sensor/Readme.md)
|
* Allow UID emulation of EMV cards, allow saving EMV cards
|
||||||
|
* PR: SubGHz Remote (UniRFRemix) - Cleaned up error checking + Bug fix (by @ESurge | PR #124)
|
||||||
|
* Plugins -> PR: Snake: Allow snake to turn anywhere (by @TQMatvey | PR #125)
|
||||||
|
* OFW PR: Dap-link: fix C symbol (OFW PR 1905 by DrZlo13)
|
||||||
|
|
||||||
**Note: Version naming changed to be more clear what version is newer, now we using -> unlshd-123 where 123 is build number**
|
**Note: Version naming changed to be more clear what version is newer, now we using -> unlshd-123 where 123 is build number**
|
||||||
|
|
||||||
|
|||||||
@@ -288,8 +288,6 @@ int32_t nfc_app(void* p) {
|
|||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightEmulate);
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightEmulate);
|
||||||
} else if(nfc->dev->format == NfcDeviceSaveFormatMifareClassic) {
|
} else if(nfc->dev->format == NfcDeviceSaveFormatMifareClassic) {
|
||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate);
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate);
|
||||||
} else if(nfc->dev->format == NfcDeviceSaveFormatBankCard) {
|
|
||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo);
|
|
||||||
} else {
|
} else {
|
||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid);
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "../nfc_i.h"
|
#include "../nfc_i.h"
|
||||||
|
|
||||||
enum SubmenuIndex {
|
enum SubmenuIndex {
|
||||||
|
SubmenuIndexSave,
|
||||||
SubmenuIndexInfo,
|
SubmenuIndexInfo,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -14,6 +15,7 @@ void nfc_scene_emv_menu_on_enter(void* context) {
|
|||||||
Nfc* nfc = context;
|
Nfc* nfc = context;
|
||||||
Submenu* submenu = nfc->submenu;
|
Submenu* submenu = nfc->submenu;
|
||||||
|
|
||||||
|
submenu_add_item(submenu, "Save", SubmenuIndexSave, nfc_scene_emv_menu_submenu_callback, nfc);
|
||||||
submenu_add_item(submenu, "Info", SubmenuIndexInfo, nfc_scene_emv_menu_submenu_callback, nfc);
|
submenu_add_item(submenu, "Info", SubmenuIndexInfo, nfc_scene_emv_menu_submenu_callback, nfc);
|
||||||
submenu_set_selected_item(
|
submenu_set_selected_item(
|
||||||
nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneEmvMenu));
|
nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneEmvMenu));
|
||||||
@@ -26,7 +28,13 @@ bool nfc_scene_emv_menu_on_event(void* context, SceneManagerEvent event) {
|
|||||||
bool consumed = false;
|
bool consumed = false;
|
||||||
|
|
||||||
if(event.type == SceneManagerEventTypeCustom) {
|
if(event.type == SceneManagerEventTypeCustom) {
|
||||||
if(event.event == SubmenuIndexInfo) {
|
if(event.event == SubmenuIndexSave) {
|
||||||
|
nfc->dev->format = NfcDeviceSaveFormatBankCard;
|
||||||
|
// Clear device name
|
||||||
|
nfc_device_set_name(nfc->dev, "");
|
||||||
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
|
||||||
|
consumed = true;
|
||||||
|
} else if(event.event == SubmenuIndexInfo) {
|
||||||
scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo);
|
scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo);
|
||||||
consumed = true;
|
consumed = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ void nfc_scene_saved_menu_on_enter(void* context) {
|
|||||||
Submenu* submenu = nfc->submenu;
|
Submenu* submenu = nfc->submenu;
|
||||||
|
|
||||||
if(nfc->dev->format == NfcDeviceSaveFormatUid ||
|
if(nfc->dev->format == NfcDeviceSaveFormatUid ||
|
||||||
nfc->dev->format == NfcDeviceSaveFormatMifareDesfire) {
|
nfc->dev->format == NfcDeviceSaveFormatMifareDesfire ||
|
||||||
|
nfc->dev->format == NfcDeviceSaveFormatBankCard) {
|
||||||
submenu_add_item(
|
submenu_add_item(
|
||||||
submenu,
|
submenu,
|
||||||
"Emulate UID",
|
"Emulate UID",
|
||||||
|
|||||||
@@ -72,13 +72,13 @@ void dap_scene_help_on_enter(void* context) {
|
|||||||
if(config->uart_swap == DapUartTXRXNormal) {
|
if(config->uart_swap == DapUartTXRXNormal) {
|
||||||
furi_string_cat(
|
furi_string_cat(
|
||||||
string,
|
string,
|
||||||
" TX: 15 [С1]\r\n"
|
" TX: 15 [C1]\r\n"
|
||||||
" RX: 16 [С0]\r\n");
|
" RX: 16 [C0]\r\n");
|
||||||
} else {
|
} else {
|
||||||
furi_string_cat(
|
furi_string_cat(
|
||||||
string,
|
string,
|
||||||
" RX: 15 [С1]\r\n"
|
" RX: 15 [C1]\r\n"
|
||||||
" TX: 16 [С0]\r\n");
|
" TX: 16 [C0]\r\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ typedef enum {
|
|||||||
DirectionLeft,
|
DirectionLeft,
|
||||||
} Direction;
|
} Direction;
|
||||||
|
|
||||||
#define MAX_SNAKE_LEN 253
|
#define MAX_SNAKE_LEN 128*64/4
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Point points[MAX_SNAKE_LEN];
|
Point points[MAX_SNAKE_LEN];
|
||||||
@@ -273,10 +273,8 @@ static void
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool can_turn = (snake_state->points[0].x % 2 == 0) && (snake_state->points[0].y % 2 == 0);
|
|
||||||
if(can_turn) {
|
snake_state->currentMovement = snake_game_get_turn_snake(snake_state);
|
||||||
snake_state->currentMovement = snake_game_get_turn_snake(snake_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
Point next_step = snake_game_get_next_step(snake_state);
|
Point next_step = snake_game_get_next_step(snake_state);
|
||||||
|
|
||||||
@@ -414,26 +412,3 @@ int32_t snake_game_app(void* p) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Screen is 128x64 px
|
|
||||||
// (4 + 4) * 16 - 4 + 2 + 2border == 128
|
|
||||||
// (4 + 4) * 8 - 4 + 2 + 2border == 64
|
|
||||||
// Game field from point{x: 0, y: 0} to point{x: 30, y: 14}.
|
|
||||||
// The snake turns only in even cells - intersections.
|
|
||||||
// ┌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┐
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
|
||||||
// └╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
|
|
||||||
|
|||||||
@@ -639,7 +639,35 @@ bool nfc_device_load_mifare_df_data(FlipperFormat* file, NfcDevice* dev) {
|
|||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Leave for backward compatibility
|
static bool nfc_device_save_bank_card_data(FlipperFormat* file, NfcDevice* dev) {
|
||||||
|
bool saved = false;
|
||||||
|
EmvData* data = &dev->dev_data.emv_data;
|
||||||
|
uint32_t data_temp = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
// Write Bank card specific data
|
||||||
|
if(!flipper_format_write_comment_cstr(file, "Bank card specific data")) break;
|
||||||
|
if(!flipper_format_write_hex(file, "AID", data->aid, data->aid_len)) break;
|
||||||
|
if(!flipper_format_write_string_cstr(file, "Name", data->name)) break;
|
||||||
|
if(!flipper_format_write_hex(file, "Number", data->number, data->number_len)) break;
|
||||||
|
if(data->exp_mon) {
|
||||||
|
uint8_t exp_data[2] = {data->exp_mon, data->exp_year};
|
||||||
|
if(!flipper_format_write_hex(file, "Exp data", exp_data, sizeof(exp_data))) break;
|
||||||
|
}
|
||||||
|
if(data->country_code) {
|
||||||
|
data_temp = data->country_code;
|
||||||
|
if(!flipper_format_write_uint32(file, "Country code", &data_temp, 1)) break;
|
||||||
|
}
|
||||||
|
if(data->currency_code) {
|
||||||
|
data_temp = data->currency_code;
|
||||||
|
if(!flipper_format_write_uint32(file, "Currency code", &data_temp, 1)) break;
|
||||||
|
}
|
||||||
|
saved = true;
|
||||||
|
} while(false);
|
||||||
|
|
||||||
|
return saved;
|
||||||
|
}
|
||||||
|
|
||||||
bool nfc_device_load_bank_card_data(FlipperFormat* file, NfcDevice* dev) {
|
bool nfc_device_load_bank_card_data(FlipperFormat* file, NfcDevice* dev) {
|
||||||
bool parsed = false;
|
bool parsed = false;
|
||||||
EmvData* data = &dev->dev_data.emv_data;
|
EmvData* data = &dev->dev_data.emv_data;
|
||||||
@@ -1043,7 +1071,7 @@ static bool nfc_device_save_file(
|
|||||||
if(!flipper_format_write_header_cstr(file, nfc_file_header, nfc_file_version)) break;
|
if(!flipper_format_write_header_cstr(file, nfc_file_header, nfc_file_version)) break;
|
||||||
// Write nfc device type
|
// Write nfc device type
|
||||||
if(!flipper_format_write_comment_cstr(
|
if(!flipper_format_write_comment_cstr(
|
||||||
file, "Nfc device type can be UID, Mifare Ultralight, Mifare Classic"))
|
file, "Nfc device type can be UID, Mifare Ultralight, Mifare Classic, Bank card"))
|
||||||
break;
|
break;
|
||||||
nfc_device_prepare_format_string(dev, temp_str);
|
nfc_device_prepare_format_string(dev, temp_str);
|
||||||
if(!flipper_format_write_string(file, "Device type", temp_str)) break;
|
if(!flipper_format_write_string(file, "Device type", temp_str)) break;
|
||||||
@@ -1058,6 +1086,8 @@ static bool nfc_device_save_file(
|
|||||||
if(!nfc_device_save_mifare_ul_data(file, dev)) break;
|
if(!nfc_device_save_mifare_ul_data(file, dev)) break;
|
||||||
} else if(dev->format == NfcDeviceSaveFormatMifareDesfire) {
|
} else if(dev->format == NfcDeviceSaveFormatMifareDesfire) {
|
||||||
if(!nfc_device_save_mifare_df_data(file, dev)) break;
|
if(!nfc_device_save_mifare_df_data(file, dev)) break;
|
||||||
|
} else if(dev->format == NfcDeviceSaveFormatBankCard) {
|
||||||
|
if(!nfc_device_save_bank_card_data(file, dev)) break;
|
||||||
} else if(dev->format == NfcDeviceSaveFormatMifareClassic) {
|
} else if(dev->format == NfcDeviceSaveFormatMifareClassic) {
|
||||||
// Save data
|
// Save data
|
||||||
if(!nfc_device_save_mifare_classic_data(file, dev)) break;
|
if(!nfc_device_save_mifare_classic_data(file, dev)) break;
|
||||||
|
|||||||
Reference in New Issue
Block a user