mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-13 04:28:36 -07:00
Merge branch 'dev' of https://github.com/DarkFlippers/unleashed-firmware into xfw-dev
This commit is contained in:
@@ -6,6 +6,11 @@ static void comparator_trigger_callback(bool level, void* comp_ctx) {
|
|||||||
furi_hal_gpio_write(&gpio_ext_pa7, !level);
|
furi_hal_gpio_write(&gpio_ext_pa7, !level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lfrfid_debug_view_tune_callback(void* context) {
|
||||||
|
LfRfidDebug* app = context;
|
||||||
|
view_dispatcher_send_custom_event(app->view_dispatcher, 0xBA);
|
||||||
|
}
|
||||||
|
|
||||||
void lfrfid_debug_scene_tune_on_enter(void* context) {
|
void lfrfid_debug_scene_tune_on_enter(void* context) {
|
||||||
LfRfidDebug* app = context;
|
LfRfidDebug* app = context;
|
||||||
|
|
||||||
@@ -16,6 +21,8 @@ void lfrfid_debug_scene_tune_on_enter(void* context) {
|
|||||||
|
|
||||||
furi_hal_rfid_tim_read_start(125000, 0.5);
|
furi_hal_rfid_tim_read_start(125000, 0.5);
|
||||||
|
|
||||||
|
lfrfid_debug_view_tune_set_callback(app->tune_view, lfrfid_debug_view_tune_callback, app);
|
||||||
|
|
||||||
view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidDebugViewTune);
|
view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidDebugViewTune);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ typedef struct {
|
|||||||
uint32_t ARR;
|
uint32_t ARR;
|
||||||
uint32_t CCR;
|
uint32_t CCR;
|
||||||
int pos;
|
int pos;
|
||||||
|
void (*update_callback)(void* context);
|
||||||
|
void* update_context;
|
||||||
} LfRfidTuneViewModel;
|
} LfRfidTuneViewModel;
|
||||||
|
|
||||||
static void lfrfid_debug_view_tune_draw_callback(Canvas* canvas, void* _model) {
|
static void lfrfid_debug_view_tune_draw_callback(Canvas* canvas, void* _model) {
|
||||||
@@ -151,6 +153,18 @@ static bool lfrfid_debug_view_tune_input_callback(InputEvent* event, void* conte
|
|||||||
consumed = false;
|
consumed = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(event->key == InputKeyLeft || event->key == InputKeyRight) {
|
||||||
|
with_view_model(
|
||||||
|
tune_view->view,
|
||||||
|
LfRfidTuneViewModel * model,
|
||||||
|
{
|
||||||
|
if(model->update_callback) {
|
||||||
|
model->update_callback(model->update_context);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return consumed;
|
return consumed;
|
||||||
@@ -161,19 +175,7 @@ LfRfidTuneView* lfrfid_debug_view_tune_alloc() {
|
|||||||
tune_view->view = view_alloc();
|
tune_view->view = view_alloc();
|
||||||
view_set_context(tune_view->view, tune_view);
|
view_set_context(tune_view->view, tune_view);
|
||||||
view_allocate_model(tune_view->view, ViewModelTypeLocking, sizeof(LfRfidTuneViewModel));
|
view_allocate_model(tune_view->view, ViewModelTypeLocking, sizeof(LfRfidTuneViewModel));
|
||||||
|
lfrfid_debug_view_tune_clean(tune_view);
|
||||||
with_view_model(
|
|
||||||
tune_view->view,
|
|
||||||
LfRfidTuneViewModel * model,
|
|
||||||
{
|
|
||||||
model->dirty = true;
|
|
||||||
model->fine = false;
|
|
||||||
model->ARR = 511;
|
|
||||||
model->CCR = 255;
|
|
||||||
model->pos = 0;
|
|
||||||
},
|
|
||||||
true);
|
|
||||||
|
|
||||||
view_set_draw_callback(tune_view->view, lfrfid_debug_view_tune_draw_callback);
|
view_set_draw_callback(tune_view->view, lfrfid_debug_view_tune_draw_callback);
|
||||||
view_set_input_callback(tune_view->view, lfrfid_debug_view_tune_input_callback);
|
view_set_input_callback(tune_view->view, lfrfid_debug_view_tune_input_callback);
|
||||||
|
|
||||||
@@ -199,6 +201,8 @@ void lfrfid_debug_view_tune_clean(LfRfidTuneView* tune_view) {
|
|||||||
model->ARR = 511;
|
model->ARR = 511;
|
||||||
model->CCR = 255;
|
model->CCR = 255;
|
||||||
model->pos = 0;
|
model->pos = 0;
|
||||||
|
model->update_callback = NULL;
|
||||||
|
model->update_context = NULL;
|
||||||
},
|
},
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
@@ -232,3 +236,17 @@ uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view) {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lfrfid_debug_view_tune_set_callback(
|
||||||
|
LfRfidTuneView* tune_view,
|
||||||
|
void (*callback)(void* context),
|
||||||
|
void* context) {
|
||||||
|
with_view_model(
|
||||||
|
tune_view->view,
|
||||||
|
LfRfidTuneViewModel * model,
|
||||||
|
{
|
||||||
|
model->update_callback = callback;
|
||||||
|
model->update_context = context;
|
||||||
|
},
|
||||||
|
false);
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,3 +16,8 @@ bool lfrfid_debug_view_tune_is_dirty(LfRfidTuneView* tune_view);
|
|||||||
uint32_t lfrfid_debug_view_tune_get_arr(LfRfidTuneView* tune_view);
|
uint32_t lfrfid_debug_view_tune_get_arr(LfRfidTuneView* tune_view);
|
||||||
|
|
||||||
uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view);
|
uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view);
|
||||||
|
|
||||||
|
void lfrfid_debug_view_tune_set_callback(
|
||||||
|
LfRfidTuneView* tune_view,
|
||||||
|
void (*callback)(void* context),
|
||||||
|
void* context);
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=20,
|
order=20,
|
||||||
fap_icon="arkanoid_10px.png",
|
fap_icon="arkanoid_10px.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
|
fap_author="@xMasterX & @gotnull",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Arkanoid Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,4 +9,7 @@ App(
|
|||||||
fap_icon="blackjack_10px.png",
|
fap_icon="blackjack_10px.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
fap_icon_assets="assets",
|
fap_icon_assets="assets",
|
||||||
|
fap_author="@teeebor",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Blackjack Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,4 +11,7 @@ App(
|
|||||||
fap_icon="bomb.png",
|
fap_icon="bomb.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
fap_icon_assets="assets",
|
fap_icon_assets="assets",
|
||||||
|
fap_author="@leo-need-more-coffee & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Bomberduck(Bomberman) Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -12,4 +12,7 @@ App(
|
|||||||
stack_size=8 * 1024,
|
stack_size=8 * 1024,
|
||||||
order=20,
|
order=20,
|
||||||
fap_category="Tools",
|
fap_category="Tools",
|
||||||
|
fap_author="@litui & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="DTMF (Dual-Tone Multi-Frequency) dialer, Bluebox, and Redbox.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=20,
|
order=20,
|
||||||
fap_icon="wifi_10px.png",
|
fap_icon="wifi_10px.png",
|
||||||
fap_category="WiFi",
|
fap_category="WiFi",
|
||||||
|
fap_author="@SequoiaSan & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="DSTIKE Deauther module interface, based on ESP8266",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,4 +9,7 @@ App(
|
|||||||
fap_icon="flappy_10px.png",
|
fap_icon="flappy_10px.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
fap_icon_assets="assets",
|
fap_icon_assets="assets",
|
||||||
|
fap_author="@DroomOne & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Flappy Bird Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,4 +9,7 @@ App(
|
|||||||
fap_icon="i2ctools.png",
|
fap_icon="i2ctools.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
fap_icon_assets="images",
|
fap_icon_assets="images",
|
||||||
|
fap_author="@NaejEL",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Set of i2c tools",
|
||||||
)
|
)
|
||||||
|
|||||||
3
applications/external/game15/application.fam
vendored
3
applications/external/game15/application.fam
vendored
@@ -8,4 +8,7 @@ App(
|
|||||||
fap_icon="game15_10px.png",
|
fap_icon="game15_10px.png",
|
||||||
order=30,
|
order=30,
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
|
fap_author="@x27",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Logic Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,4 +11,7 @@ App(
|
|||||||
order=90,
|
order=90,
|
||||||
fap_icon="game_2048.png",
|
fap_icon="game_2048.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
|
fap_author="@eugene-kirzhanov",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="2048 Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=35,
|
order=35,
|
||||||
fap_icon="gps_10px.png",
|
fap_icon="gps_10px.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
|
fap_author="@ezod & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Works with GPS modules via UART, using NMEA protocol.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,4 +10,7 @@ App(
|
|||||||
order=20,
|
order=20,
|
||||||
fap_icon="dist_sensor10px.png",
|
fap_icon="dist_sensor10px.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
|
fap_author="@xMasterX (first implementation by @Sanqui)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="HC-SR(04) Distance sensor reader",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
fap_icon="box.png",
|
fap_icon="box.png",
|
||||||
fap_icon_assets="assets_images",
|
fap_icon_assets="assets_images",
|
||||||
|
fap_author="@xMasterX (original implementation by @wquinoa & @Vedmein)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Heap Defence game from hackathon (aka Stack Attack)",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -12,4 +12,7 @@ App(
|
|||||||
fap_icon="icons/hex_10px.png",
|
fap_icon="icons/hex_10px.png",
|
||||||
fap_category="Misc",
|
fap_category="Misc",
|
||||||
fap_icon_assets="icons",
|
fap_icon_assets="icons",
|
||||||
|
fap_author="@QtRoS",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App allows to view various files as HEX.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
stack_size=2 * 1024,
|
stack_size=2 * 1024,
|
||||||
fap_icon="ir_scope.png",
|
fap_icon="ir_scope.png",
|
||||||
fap_category="Tools",
|
fap_category="Tools",
|
||||||
|
fap_author="@kallanreed",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App allows to see incoming IR signals.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -20,4 +20,7 @@ App(
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
fap_icon_assets="icons",
|
fap_icon_assets="icons",
|
||||||
|
fap_author="@oleksiikutuzov",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Lightmeter app for photography based on BH1750 sensor",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,4 +10,7 @@ App(
|
|||||||
fap_category="Media",
|
fap_category="Media",
|
||||||
stack_size=2 * 1024,
|
stack_size=2 * 1024,
|
||||||
order=20,
|
order=20,
|
||||||
|
fap_author="@panki27 & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Metronome app",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
fap_icon="minesweeper_icon.png",
|
fap_icon="minesweeper_icon.png",
|
||||||
order=35,
|
order=35,
|
||||||
|
fap_author="@panki27 & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Minesweeper Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,4 +10,7 @@ App(
|
|||||||
order=20,
|
order=20,
|
||||||
fap_icon="morse_code_10px.png",
|
fap_icon="morse_code_10px.png",
|
||||||
fap_category="Misc",
|
fap_category="Misc",
|
||||||
|
fap_author="@wh00hw & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Simple Morse Code parser",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ App(
|
|||||||
order=60,
|
order=60,
|
||||||
fap_icon="mouse_10px.png",
|
fap_icon="mouse_10px.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
|
fap_author="@mothball187 & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App works with NRF24 Sniffer app to perform mousejack attacks",
|
||||||
fap_private_libs=[
|
fap_private_libs=[
|
||||||
Lib(
|
Lib(
|
||||||
name="nrf24",
|
name="nrf24",
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=160,
|
order=160,
|
||||||
fap_icon="converter_10px.png",
|
fap_icon="converter_10px.png",
|
||||||
fap_category="Misc",
|
fap_category="Misc",
|
||||||
|
fap_author="@theisolinearchip",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="A multi-unit converter written with an easy and expandable system for adding new units and conversion methods",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ App(
|
|||||||
order=60,
|
order=60,
|
||||||
fap_icon="nrfsniff_10px.png",
|
fap_icon="nrfsniff_10px.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
|
fap_author="@mothball187 & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App captures addresses to use with NRF24 Mouse Jacker app to perform mousejack attacks",
|
||||||
fap_private_libs=[
|
fap_private_libs=[
|
||||||
Lib(
|
Lib(
|
||||||
name="nrf24",
|
name="nrf24",
|
||||||
|
|||||||
@@ -9,4 +9,7 @@ App(
|
|||||||
fap_icon="pocsag_pager_10px.png",
|
fap_icon="pocsag_pager_10px.png",
|
||||||
fap_category="Sub-GHz",
|
fap_category="Sub-GHz",
|
||||||
fap_icon_assets="images",
|
fap_icon_assets="images",
|
||||||
|
fap_author="@xMasterX & @Shmuma",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App can capture POCSAG 1200 messages on CC1101 supported frequencies.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=50,
|
order=50,
|
||||||
fap_icon="appicon.png",
|
fap_icon="appicon.png",
|
||||||
fap_category="Sub-GHz",
|
fap_category="Sub-GHz",
|
||||||
|
fap_author="@antirez & (fixes by @xMasterX)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Digital signal detection, visualization, editing and reply tool",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=40,
|
order=40,
|
||||||
fap_icon="safe_10px.png",
|
fap_icon="safe_10px.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
|
fap_author="@H4ckd4ddy & @xMasterX (ported to latest firmware)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App exploiting vulnerability to open any Sentry Safe and Master Lock electronic safe without any pin code via UART pins.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,4 +9,7 @@ App(
|
|||||||
fap_icon="solitaire_10px.png",
|
fap_icon="solitaire_10px.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
fap_icon_assets="assets",
|
fap_icon_assets="assets",
|
||||||
|
fap_author="@teeebor",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Solitaire game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=12,
|
order=12,
|
||||||
fap_icon="spectrum_10px.png",
|
fap_icon="spectrum_10px.png",
|
||||||
fap_category="Sub-GHz",
|
fap_category="Sub-GHz",
|
||||||
|
fap_author="@xMasterX & @theY4Kman (original by @jolcese)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Shows received signals on spectrum, not actual analyzer, more like a demo app",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=14,
|
order=14,
|
||||||
fap_icon="playlist_10px.png",
|
fap_icon="playlist_10px.png",
|
||||||
fap_category="Sub-GHz",
|
fap_category="Sub-GHz",
|
||||||
|
fap_author="@darmiel",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App works with list of sub-ghz files from .txt file that contains paths to target files.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,4 +9,7 @@ App(
|
|||||||
fap_icon="icons/app.png",
|
fap_icon="icons/app.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
fap_icon_assets="icons",
|
fap_icon_assets="icons",
|
||||||
|
fap_author="@g3gg0 & (fixes by @xMasterX)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="ARM SWD (Single Wire Debug) Probe",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=240,
|
order=240,
|
||||||
fap_icon="tetris_10px.png",
|
fap_icon="tetris_10px.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
|
fap_author="@xMasterX & @jeffplang",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Tetris Game",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -12,4 +12,7 @@ App(
|
|||||||
fap_icon="icons/text_10px.png",
|
fap_icon="icons/text_10px.png",
|
||||||
fap_category="Misc",
|
fap_category="Misc",
|
||||||
fap_icon_assets="icons",
|
fap_icon_assets="icons",
|
||||||
|
fap_author="@kowalski7cc & @kyhwana",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Text viewer application",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=250,
|
order=250,
|
||||||
fap_icon="tictactoe_10px.png",
|
fap_icon="tictactoe_10px.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
|
fap_author="@xMasterX & @gotnull",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Tic Tac Toe game, for 2 players, play on one device",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=90,
|
order=90,
|
||||||
fap_icon="uart_terminal.png",
|
fap_icon="uart_terminal.png",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
|
fap_author="@cool4uma & (some fixes by @xMasterX)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="App to control various devices via UART interface.",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ App(
|
|||||||
stack_size=2 * 1024,
|
stack_size=2 * 1024,
|
||||||
order=100,
|
order=100,
|
||||||
fap_description="Universal temperature sensors reader",
|
fap_description="Universal temperature sensors reader",
|
||||||
fap_author="Quenon",
|
fap_author="@quen0n & (fixes by @xMasterX)",
|
||||||
fap_weburl="https://github.com/quen0n/Unitemp-Flipper-Zero-Plugin",
|
fap_weburl="https://github.com/quen0n/unitemp-flipperzero",
|
||||||
fap_category="GPIO",
|
fap_category="GPIO",
|
||||||
fap_icon="icon.png",
|
fap_icon="icon.png",
|
||||||
fap_icon_assets="assets",
|
fap_icon_assets="assets",
|
||||||
|
|||||||
@@ -7,4 +7,7 @@ App(
|
|||||||
order=46,
|
order=46,
|
||||||
fap_icon="wav_10px.png",
|
fap_icon="wav_10px.png",
|
||||||
fap_category="Media",
|
fap_category="Media",
|
||||||
|
fap_author="@DrZlo13 & (ported, fixed by @xMasterX), (improved by @LTVA1)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Audio player for WAV files, recommended to convert files to unsigned 8-bit PCM stereo, but it may work with others too",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=70,
|
order=70,
|
||||||
fap_icon="wifi_10px.png",
|
fap_icon="wifi_10px.png",
|
||||||
fap_category="WiFi",
|
fap_category="WiFi",
|
||||||
|
fap_author="@SequoiaSan & @xMasterX",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="WiFi scanner module interface, based on ESP8266",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -8,4 +8,7 @@ App(
|
|||||||
order=280,
|
order=280,
|
||||||
fap_icon="zombie_10px.png",
|
fap_icon="zombie_10px.png",
|
||||||
fap_category="Games",
|
fap_category="Games",
|
||||||
|
fap_author="@DevMilanIan & @xMasterX, (original By @Dooskington)",
|
||||||
|
fap_version="1.0",
|
||||||
|
fap_description="Defend your walls from the zombies",
|
||||||
)
|
)
|
||||||
|
|||||||
Binary file not shown.
@@ -618,3 +618,40 @@ type: raw
|
|||||||
frequency: 38000
|
frequency: 38000
|
||||||
duty_cycle: 0.330000
|
duty_cycle: 0.330000
|
||||||
data: 3165 1578 549 1037 549 1037 550 342 485 343 484 343 513 1034 551 340 487 340 487 1035 551 1035 550 340 486 1037 548 341 485 341 485 1041 545 1041 545 341 486 1042 544 1042 544 340 487 341 486 1042 544 341 486 340 488 1042 544 341 487 341 486 341 486 341 461 343 509 341 487 341 461 343 484 343 510 341 486 341 461 343 484 343 509 341 462 343 509 341 462 343 484 1068 518 343 510 341 461 1068 518 343 484 343 484 343 484 1068 518 343 484 343 484 343 484 343 484 342 485 343 485 1068 518 1068 518 1068 518 343 485 343 484 343 485 343 484 343 484 343 484 343 484 343 484 1068 518 1068 518 1068 518 343 484 343 484 343 485 343 484 343 484 343 484 343 484 343 484 343 484 342 485 343 485 343 484 343 484 343 484 343 484 343 484 343 484 343 485 343 484 343 484 343 484 343 484 343 484 343 485 343 484 343 484 343 484 343 484 343 484 1070 516 343 484 343 484 343 484 1071 515 343 484 1094 492 343 484 343 484 343 485 344 483 343 484 343 484
|
data: 3165 1578 549 1037 549 1037 550 342 485 343 484 343 513 1034 551 340 487 340 487 1035 551 1035 550 340 486 1037 548 341 485 341 485 1041 545 1041 545 341 486 1042 544 1042 544 340 487 341 486 1042 544 341 486 340 488 1042 544 341 487 341 486 341 486 341 461 343 509 341 487 341 461 343 484 343 510 341 486 341 461 343 484 343 509 341 462 343 509 341 462 343 484 1068 518 343 510 341 461 1068 518 343 484 343 484 343 484 1068 518 343 484 343 484 343 484 343 484 342 485 343 485 1068 518 1068 518 1068 518 343 485 343 484 343 485 343 484 343 484 343 484 343 484 343 484 1068 518 1068 518 1068 518 343 484 343 484 343 485 343 484 343 484 343 484 343 484 343 484 343 484 342 485 343 485 343 484 343 484 343 484 343 484 343 484 343 484 343 485 343 484 343 484 343 484 343 484 343 484 343 485 343 484 343 484 343 484 343 484 343 484 1070 516 343 484 343 484 343 484 1071 515 343 484 1094 492 343 484 343 484 343 485 344 483 343 484 343 484
|
||||||
|
#
|
||||||
|
# Model: Mitsubishi MSZ-AP25VGK
|
||||||
|
name: Off
|
||||||
|
type: raw
|
||||||
|
frequency: 38000
|
||||||
|
duty_cycle: 0.330000
|
||||||
|
data: 3531 1667 500 1225 499 1225 499 376 499 377 498 377 498 1224 500 377 498 377 498 1224 500 1225 499 377 527 1195 557 318 556 318 555 1167 530 1194 529 374 499 1224 499 1225 497 377 497 378 497 1228 496 379 496 380 495 1229 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 496 380 495 380 495 380 495 380 495 9028 3526 1672 495 1229 495 1229 495 380 495 380 495 380 495 1230 494 380 495 380 495 1229 495 1229 495 380 495 1229 495 380 495 380 495 1229 495 1229 495 380 495 1229 495 1229 495 380 495 380 495 1229 495 380 495 380 495 1229 495 380 495 381 494 381 494 380 495 380 495 380 495 380 495 381 494 380 495 381 494 381 494 381 494 381 494 381 494 380 495 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 1230 494 1230 494 381 494 381 494 381 494 381 494 381 494 381 494 1230 494 381 494 381 494 381 494 381 494 381 494 1230 494 1230 494 381 494 1230 494 1230 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 1230 494 381 494 1230 494 381 494 381 494 1230 494 381 494 1230 494 1230 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 381 494 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 1231 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 382 493 1231 493 382 493 1231 493 382 493 1231 493 382 493 383 492 382 493
|
||||||
|
#
|
||||||
|
name: Dh
|
||||||
|
type: raw
|
||||||
|
frequency: 38000
|
||||||
|
duty_cycle: 0.330000
|
||||||
|
data: 3561 1666 500 1195 529 1193 531 374 501 375 500 375 500 1196 529 374 501 375 500 1223 501 1223 501 375 529 1194 558 318 557 318 555 1168 530 1193 530 345 529 1194 529 1196 527 348 526 350 525 1200 524 352 522 353 522 1228 496 379 496 379 496 379 496 379 496 379 496 379 497 379 496 379 496 379 496 379 496 379 496 379 496 379 496 379 496 379 496 9028 3529 1670 496 1228 496 1228 496 379 496 379 496 379 496 1228 496 379 496 379 496 1228 496 1228 496 379 496 1228 496 379 496 379 496 1228 496 1228 496 379 496 1228 496 1228 496 379 496 379 496 1228 496 379 496 379 496 1228 496 379 496 379 496 379 496 379 496 379 496 379 496 379 496 379 496 379 496 379 496 379 496 380 495 379 496 379 496 379 496 379 496 380 495 379 496 380 495 379 496 1229 495 380 495 380 495 379 496 380 495 380 495 380 495 1229 495 380 495 380 495 380 495 380 495 380 495 380 495 1229 495 380 495 380 495 380 495 380 495 380 495 1229 495 380 495 380 495 1229 495 1229 495 380 495 380 495 380 495 380 495 380 496 380 495 380 495 380 495 1229 495 380 495 1229 495 380 495 380 495 1229 495 380 495 1229 495 1229 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 380 495 381 494 380 495 380 495 380 495 380 495 1230 494 380 495 381 494 381 494 380 495 380 495 380 495 380 495 381 494 381 495 380 495 381 494 381 495 380 495 381 494 381 495 380 495 381 494 381 494 381 494 381 494 381 494 381 494 381 494 1230 494 381 494 381 494 1230 494 381 494 1230 494 381 494 381 494
|
||||||
|
#
|
||||||
|
name: Cool_hi
|
||||||
|
type: raw
|
||||||
|
frequency: 38000
|
||||||
|
duty_cycle: 0.330000
|
||||||
|
data: 3534 1637 530 1192 533 1195 529 375 500 375 500 375 500 1195 530 375 501 375 500 1224 500 1224 501 376 528 1195 557 319 556 318 555 1168 530 1193 530 345 530 1194 529 1196 527 348 526 350 525 1201 523 353 522 378 497 1228 496 379 497 379 496 379 497 379 496 379 497 379 497 379 497 379 496 379 496 379 496 379 496 379 497 379 497 379 496 379 496 9030 3530 1671 496 1229 496 1229 495 379 496 379 496 379 497 1229 496 379 496 379 497 1229 496 1229 495 380 496 1229 495 379 497 379 496 1229 496 1229 495 379 497 1229 495 1228 497 379 496 380 496 1229 496 379 497 379 496 1229 496 379 496 380 496 380 495 380 496 379 496 380 496 380 495 380 496 380 496 380 496 379 496 380 496 380 495 380 496 380 495 380 496 380 495 380 496 380 495 380 495 1229 496 380 495 380 495 380 495 380 496 380 495 1229 496 1229 496 380 495 380 496 380 495 380 496 380 496 380 495 380 495 380 496 380 496 380 495 380 496 380 495 1229 495 1230 495 380 495 1229 496 1229 496 380 495 381 495 380 495 380 495 380 496 380 496 380 495 380 496 1229 496 380 495 1230 495 380 495 380 495 1230 495 380 495 1230 495 1230 495 380 495 380 496 380 495 380 495 380 495 380 496 380 496 380 495 380 496 380 495 380 495 380 496 380 495 381 495 380 495 380 495 380 495 381 495 380 495 381 495 380 495 381 494 381 495 381 495 380 495 1230 495 381 495 380 495 381 494 381 495 381 494 381 495 381 494 381 495 381 495 381 494 381 495 381 494 381 495 381 495 381 494 381 495 381 494 381 494 381 495 381 494 381 494 381 494 381 495 1230 495 381 495 1230 495 1230 495 381 494 1230 494 381 495 381 494
|
||||||
|
#
|
||||||
|
name: Cool_lo
|
||||||
|
type: raw
|
||||||
|
frequency: 38000
|
||||||
|
duty_cycle: 0.330000
|
||||||
|
data: 3534 1667 500 1224 501 1224 501 376 500 375 500 376 500 1224 501 376 500 376 499 1224 501 1225 500 376 500 1225 556 320 556 318 555 1167 530 1194 530 345 530 1195 529 1196 528 348 527 377 498 1227 498 378 497 379 496 1229 496 379 496 379 497 379 497 379 497 379 497 380 496 379 497 379 496 379 497 380 496 380 496 380 496 380 496 379 497 379 497 9033 3530 1672 496 1229 496 1229 496 380 496 380 496 380 496 1229 496 380 496 380 496 1229 496 1229 496 380 496 1229 496 380 496 380 496 1229 496 1229 496 380 496 1230 495 1229 496 380 495 380 496 1229 496 380 496 380 496 1229 496 380 496 380 496 380 496 380 496 380 496 380 496 380 496 380 496 380 496 380 496 380 496 380 496 380 495 380 496 380 496 380 496 380 496 380 496 380 496 380 496 1230 495 380 496 380 495 380 496 381 495 380 495 1230 495 1230 495 380 496 380 496 380 496 1230 495 1230 495 1230 495 380 496 380 496 380 496 380 496 380 496 381 495 1230 495 1230 495 381 495 1230 495 1230 495 380 495 381 495 381 495 381 495 381 495 381 495 380 496 381 495 1230 495 381 495 1230 495 381 495 380 496 1230 495 381 495 1230 495 1230 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 380 496 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 1231 494 381 495 381 495 381 495 381 495 381 495 381 494 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 381 495 382 494 382 494 1231 494 381 495 1231 494 1231 494 381 495 382 494
|
||||||
|
#
|
||||||
|
name: Heat_hi
|
||||||
|
type: raw
|
||||||
|
frequency: 38000
|
||||||
|
duty_cycle: 0.330000
|
||||||
|
data: 3539 1670 501 1226 502 1226 501 376 501 377 500 376 501 1226 501 376 499 378 500 1226 501 1226 501 377 528 1199 557 320 557 318 529 1197 531 1195 531 346 530 1196 530 1198 528 349 527 352 524 1229 498 379 498 379 498 1230 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 9045 3536 1674 496 1231 497 1231 497 380 497 380 497 380 497 1231 496 380 497 380 497 1231 497 1231 496 380 497 1231 496 380 497 380 497 1231 496 1231 497 380 497 1231 496 1231 496 380 497 380 497 1231 496 381 496 380 497 1231 497 381 496 380 497 380 497 380 497 380 497 381 496 381 496 381 496 380 497 380 497 381 496 381 496 381 496 381 496 380 497 381 496 381 496 381 496 381 496 380 497 1231 496 381 496 381 496 380 497 381 496 381 496 1232 495 381 496 381 496 381 496 381 496 1232 495 1232 495 1232 496 1232 495 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 1232 496 1232 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 1232 496 381 496 1232 495 381 496 1232 495 381 496 1232 495 1232 495 381 496 381 496 382 495 381 496 381 496 381 496 381 496 382 495 381 496 381 496 381 496 381 496 381 496 382 495 381 496 381 496 381 496 381 496 382 495 382 495 382 495 382 495 382 495 382 495 382 495 1232 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 1233 495 1233 494 1233 495 382 495 382 495 1233 495 1233 494 382 495
|
||||||
|
#
|
||||||
|
name: Heat_lo
|
||||||
|
type: raw
|
||||||
|
frequency: 38000
|
||||||
|
duty_cycle: 0.330000
|
||||||
|
data: 3539 1637 533 1225 502 1193 534 375 501 376 501 376 500 1226 501 376 501 376 500 1226 500 1227 501 376 529 1197 558 320 557 319 555 1169 531 1195 531 346 529 1196 530 1198 528 349 526 352 524 1229 497 379 497 379 497 1230 497 380 497 380 497 379 498 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 9042 3535 1674 496 1230 497 1230 497 380 497 380 497 380 497 1230 497 380 497 380 496 1230 497 1230 497 380 497 1230 497 380 497 380 497 1231 496 1230 497 380 497 1231 496 1231 496 380 496 380 497 1231 496 380 497 380 496 1231 496 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 497 380 496 380 497 380 497 380 497 380 497 380 496 381 496 380 497 380 497 380 497 381 496 1231 496 381 496 380 497 380 497 381 496 381 496 1231 496 381 496 381 496 380 497 381 495 1231 496 1231 496 1231 496 380 497 381 496 381 496 380 496 381 496 381 496 381 496 381 496 381 496 1231 496 1231 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 1231 496 381 496 381 496 1232 495 381 495 1232 495 381 496 1231 496 1231 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 496 381 495 381 496 381 496 381 496 381 496 1232 495 381 496 381 496 381 496 381 496 381 495 381 496 381 495 382 495 381 496 382 495 381 495 382 495 381 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 382 495 381 495 1232 495 1232 495 1232 495 1232 495 1232 495 382 495 382 495 382 495
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,31.0,,
|
Version,+,31.2,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
Header,+,applications/services/cli/cli_vcp.h,,
|
Header,+,applications/services/cli/cli_vcp.h,,
|
||||||
@@ -1061,6 +1061,7 @@ Function,+,furi_hal_power_sleep,void,
|
|||||||
Function,+,furi_hal_power_sleep_available,_Bool,
|
Function,+,furi_hal_power_sleep_available,_Bool,
|
||||||
Function,+,furi_hal_power_suppress_charge_enter,void,
|
Function,+,furi_hal_power_suppress_charge_enter,void,
|
||||||
Function,+,furi_hal_power_suppress_charge_exit,void,
|
Function,+,furi_hal_power_suppress_charge_exit,void,
|
||||||
|
Function,+,furi_hal_pwm_is_running,_Bool,FuriHalPwmOutputId
|
||||||
Function,+,furi_hal_pwm_set_params,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
Function,+,furi_hal_pwm_set_params,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
||||||
Function,+,furi_hal_pwm_start,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
Function,+,furi_hal_pwm_start,void,"FuriHalPwmOutputId, uint32_t, uint8_t"
|
||||||
Function,+,furi_hal_pwm_stop,void,FuriHalPwmOutputId
|
Function,+,furi_hal_pwm_stop,void,FuriHalPwmOutputId
|
||||||
|
|||||||
|
@@ -1,5 +1,5 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,31.0,,
|
Version,+,31.2,,
|
||||||
Header,+,applications/main/archive/helpers/favorite_timeout.h,,
|
Header,+,applications/main/archive/helpers/favorite_timeout.h,,
|
||||||
Header,+,applications/main/subghz/helpers/subghz_txrx.h,,
|
Header,+,applications/main/subghz/helpers/subghz_txrx.h,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
@@ -1292,6 +1292,8 @@ Function,+,furi_hal_mpu_protect_disable,void,FuriHalMpuRegion
|
|||||||
Function,+,furi_hal_mpu_protect_no_access,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
|
Function,+,furi_hal_mpu_protect_no_access,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
|
||||||
Function,+,furi_hal_mpu_protect_read_only,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
|
Function,+,furi_hal_mpu_protect_read_only,void,"FuriHalMpuRegion, uint32_t, FuriHalMPURegionSize"
|
||||||
Function,+,furi_hal_nfc_activate_nfca,_Bool,"uint32_t, uint32_t*"
|
Function,+,furi_hal_nfc_activate_nfca,_Bool,"uint32_t, uint32_t*"
|
||||||
|
Function,+,furi_hal_nfc_field_is_present,_Bool,
|
||||||
|
Function,+,furi_hal_nfc_field_detect_start,void,
|
||||||
Function,+,furi_hal_nfc_deinit,void,
|
Function,+,furi_hal_nfc_deinit,void,
|
||||||
Function,+,furi_hal_nfc_detect,_Bool,"FuriHalNfcDevData*, uint32_t"
|
Function,+,furi_hal_nfc_detect,_Bool,"FuriHalNfcDevData*, uint32_t"
|
||||||
Function,+,furi_hal_nfc_emulate_nfca,_Bool,"uint8_t*, uint8_t, uint8_t*, uint8_t, FuriHalNfcEmulateCallback, void*, uint32_t"
|
Function,+,furi_hal_nfc_emulate_nfca,_Bool,"uint8_t*, uint8_t, uint8_t*, uint8_t, FuriHalNfcEmulateCallback, void*, uint32_t"
|
||||||
@@ -1376,6 +1378,9 @@ Function,-,furi_hal_resources_init_early,void,
|
|||||||
Function,+,furi_hal_rfid_comp_set_callback,void,"FuriHalRfidCompCallback, void*"
|
Function,+,furi_hal_rfid_comp_set_callback,void,"FuriHalRfidCompCallback, void*"
|
||||||
Function,+,furi_hal_rfid_comp_start,void,
|
Function,+,furi_hal_rfid_comp_start,void,
|
||||||
Function,+,furi_hal_rfid_comp_stop,void,
|
Function,+,furi_hal_rfid_comp_stop,void,
|
||||||
|
Function,+,furi_hal_rfid_field_is_present,_Bool,uint32_t*
|
||||||
|
Function,+,furi_hal_rfid_field_detect_start,void,
|
||||||
|
Function,+,furi_hal_rfid_field_detect_stop,void,
|
||||||
Function,-,furi_hal_rfid_init,void,
|
Function,-,furi_hal_rfid_init,void,
|
||||||
Function,+,furi_hal_rfid_pin_pull_pulldown,void,
|
Function,+,furi_hal_rfid_pin_pull_pulldown,void,
|
||||||
Function,+,furi_hal_rfid_pin_pull_release,void,
|
Function,+,furi_hal_rfid_pin_pull_release,void,
|
||||||
|
|||||||
|
@@ -834,3 +834,17 @@ FuriHalNfcReturn furi_hal_nfc_ll_txrx_bits(
|
|||||||
void furi_hal_nfc_ll_poll() {
|
void furi_hal_nfc_ll_poll() {
|
||||||
rfalWorker();
|
rfalWorker();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void furi_hal_nfc_field_detect_start() {
|
||||||
|
st25r3916WriteRegister(
|
||||||
|
ST25R3916_REG_OP_CONTROL,
|
||||||
|
ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_en_fd_mask);
|
||||||
|
st25r3916WriteRegister(ST25R3916_REG_MODE, ST25R3916_REG_MODE_targ | ST25R3916_REG_MODE_om0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool furi_hal_nfc_field_is_present() {
|
||||||
|
return st25r3916CheckReg(
|
||||||
|
ST25R3916_REG_AUX_DISPLAY,
|
||||||
|
ST25R3916_REG_AUX_DISPLAY_efd_o,
|
||||||
|
ST25R3916_REG_AUX_DISPLAY_efd_o);
|
||||||
|
}
|
||||||
@@ -434,6 +434,10 @@ FuriHalNfcReturn furi_hal_nfc_ll_txrx_bits(
|
|||||||
|
|
||||||
void furi_hal_nfc_ll_poll();
|
void furi_hal_nfc_ll_poll();
|
||||||
|
|
||||||
|
void furi_hal_nfc_field_detect_start();
|
||||||
|
|
||||||
|
bool furi_hal_nfc_field_is_present();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -25,6 +25,19 @@
|
|||||||
#define RFID_CAPTURE_IND_CH LL_TIM_CHANNEL_CH3
|
#define RFID_CAPTURE_IND_CH LL_TIM_CHANNEL_CH3
|
||||||
#define RFID_CAPTURE_DIR_CH LL_TIM_CHANNEL_CH4
|
#define RFID_CAPTURE_DIR_CH LL_TIM_CHANNEL_CH4
|
||||||
|
|
||||||
|
// Field presence detection
|
||||||
|
#define FURI_HAL_RFID_FIELD_FREQUENCY_MIN 80000
|
||||||
|
#define FURI_HAL_RFID_FIELD_FREQUENCY_MAX 200000
|
||||||
|
|
||||||
|
#define FURI_HAL_RFID_FIELD_COUNTER_TIMER TIM2
|
||||||
|
#define FURI_HAL_RFID_FIELD_COUNTER_TIMER_BUS FuriHalBusTIM2
|
||||||
|
#define FURI_HAL_RFID_FIELD_COUNTER_TIMER_CHANNEL LL_TIM_CHANNEL_CH3
|
||||||
|
|
||||||
|
#define FURI_HAL_RFID_FIELD_TIMEOUT_TIMER TIM1
|
||||||
|
#define FURI_HAL_RFID_FIELD_TIMEOUT_TIMER_BUS FuriHalBusTIM1
|
||||||
|
|
||||||
|
#define FURI_HAL_RFID_FIELD_DMAMUX_DMA LL_DMAMUX_REQ_TIM1_UP
|
||||||
|
|
||||||
/* DMA Channels definition */
|
/* DMA Channels definition */
|
||||||
#define RFID_DMA DMA2
|
#define RFID_DMA DMA2
|
||||||
#define RFID_DMA_CH1_CHANNEL LL_DMA_CHANNEL_1
|
#define RFID_DMA_CH1_CHANNEL LL_DMA_CHANNEL_1
|
||||||
@@ -33,10 +46,16 @@
|
|||||||
#define RFID_DMA_CH1_DEF RFID_DMA, RFID_DMA_CH1_CHANNEL
|
#define RFID_DMA_CH1_DEF RFID_DMA, RFID_DMA_CH1_CHANNEL
|
||||||
#define RFID_DMA_CH2_DEF RFID_DMA, RFID_DMA_CH2_CHANNEL
|
#define RFID_DMA_CH2_DEF RFID_DMA, RFID_DMA_CH2_CHANNEL
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t counter;
|
||||||
|
uint32_t set_tim_counter_cnt;
|
||||||
|
} FuriHalRfidField;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
FuriHalRfidDMACallback dma_callback;
|
FuriHalRfidDMACallback dma_callback;
|
||||||
FuriHalRfidReadCaptureCallback read_capture_callback;
|
FuriHalRfidReadCaptureCallback read_capture_callback;
|
||||||
void* context;
|
void* context;
|
||||||
|
FuriHalRfidField field;
|
||||||
} FuriHalRfid;
|
} FuriHalRfid;
|
||||||
|
|
||||||
FuriHalRfid* furi_hal_rfid = NULL;
|
FuriHalRfid* furi_hal_rfid = NULL;
|
||||||
@@ -51,6 +70,8 @@ FuriHalRfid* furi_hal_rfid = NULL;
|
|||||||
void furi_hal_rfid_init() {
|
void furi_hal_rfid_init() {
|
||||||
furi_assert(furi_hal_rfid == NULL);
|
furi_assert(furi_hal_rfid == NULL);
|
||||||
furi_hal_rfid = malloc(sizeof(FuriHalRfid));
|
furi_hal_rfid = malloc(sizeof(FuriHalRfid));
|
||||||
|
furi_hal_rfid->field.counter = 0;
|
||||||
|
furi_hal_rfid->field.set_tim_counter_cnt = 0;
|
||||||
|
|
||||||
furi_hal_rfid_pins_reset();
|
furi_hal_rfid_pins_reset();
|
||||||
|
|
||||||
@@ -133,6 +154,23 @@ static void furi_hal_rfid_pins_read() {
|
|||||||
furi_hal_gpio_init(&gpio_rfid_data_in, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
|
furi_hal_gpio_init(&gpio_rfid_data_in, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void furi_hal_rfid_pins_field() {
|
||||||
|
// ibutton low
|
||||||
|
furi_hal_ibutton_pin_configure();
|
||||||
|
furi_hal_ibutton_pin_write(false);
|
||||||
|
|
||||||
|
// pull pin to timer out
|
||||||
|
furi_hal_gpio_init(&gpio_nfc_irq_rfid_pull, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
|
furi_hal_gpio_write(&gpio_nfc_irq_rfid_pull, false);
|
||||||
|
|
||||||
|
// pull rfid antenna from carrier side
|
||||||
|
furi_hal_gpio_init(&gpio_rfid_carrier_out, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
|
furi_hal_gpio_write(&gpio_rfid_carrier_out, false);
|
||||||
|
|
||||||
|
furi_hal_gpio_init_ex(
|
||||||
|
&gpio_rfid_carrier, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn2TIM2);
|
||||||
|
}
|
||||||
|
|
||||||
void furi_hal_rfid_pin_pull_release() {
|
void furi_hal_rfid_pin_pull_release() {
|
||||||
furi_hal_gpio_write(&gpio_nfc_irq_rfid_pull, true);
|
furi_hal_gpio_write(&gpio_nfc_irq_rfid_pull, true);
|
||||||
}
|
}
|
||||||
@@ -427,3 +465,124 @@ void COMP_IRQHandler() {
|
|||||||
furi_hal_rfid_comp_callback_context);
|
furi_hal_rfid_comp_callback_context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void furi_hal_rfid_field_tim_setup() {
|
||||||
|
// setup timer counter
|
||||||
|
furi_hal_bus_enable(FURI_HAL_RFID_FIELD_COUNTER_TIMER_BUS);
|
||||||
|
|
||||||
|
LL_TIM_SetPrescaler(FURI_HAL_RFID_FIELD_COUNTER_TIMER, 0);
|
||||||
|
LL_TIM_SetCounterMode(FURI_HAL_RFID_FIELD_COUNTER_TIMER, LL_TIM_COUNTERMODE_UP);
|
||||||
|
LL_TIM_SetAutoReload(FURI_HAL_RFID_FIELD_COUNTER_TIMER, 0xFFFFFFFF);
|
||||||
|
LL_TIM_DisableARRPreload(FURI_HAL_RFID_FIELD_COUNTER_TIMER);
|
||||||
|
LL_TIM_SetRepetitionCounter(FURI_HAL_RFID_FIELD_COUNTER_TIMER, 0);
|
||||||
|
|
||||||
|
LL_TIM_SetClockDivision(FURI_HAL_RFID_FIELD_COUNTER_TIMER, LL_TIM_CLOCKDIVISION_DIV1);
|
||||||
|
LL_TIM_SetClockSource(FURI_HAL_RFID_FIELD_COUNTER_TIMER, LL_TIM_CLOCKSOURCE_EXT_MODE2);
|
||||||
|
LL_TIM_ConfigETR(
|
||||||
|
FURI_HAL_RFID_FIELD_COUNTER_TIMER,
|
||||||
|
LL_TIM_ETR_POLARITY_INVERTED,
|
||||||
|
LL_TIM_ETR_PRESCALER_DIV1,
|
||||||
|
LL_TIM_ETR_FILTER_FDIV1);
|
||||||
|
|
||||||
|
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
|
||||||
|
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
|
||||||
|
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE;
|
||||||
|
TIM_OC_InitStruct.CompareValue = 1;
|
||||||
|
LL_TIM_OC_Init(
|
||||||
|
FURI_HAL_RFID_FIELD_COUNTER_TIMER,
|
||||||
|
FURI_HAL_RFID_FIELD_COUNTER_TIMER_CHANNEL,
|
||||||
|
&TIM_OC_InitStruct);
|
||||||
|
|
||||||
|
LL_TIM_GenerateEvent_UPDATE(FURI_HAL_RFID_FIELD_COUNTER_TIMER);
|
||||||
|
LL_TIM_OC_SetPolarity(
|
||||||
|
FURI_HAL_RFID_FIELD_COUNTER_TIMER,
|
||||||
|
FURI_HAL_RFID_FIELD_COUNTER_TIMER_CHANNEL,
|
||||||
|
LL_TIM_OCPOLARITY_HIGH);
|
||||||
|
LL_TIM_EnableDMAReq_UPDATE(FURI_HAL_RFID_FIELD_COUNTER_TIMER);
|
||||||
|
|
||||||
|
// setup timer timeouts dma
|
||||||
|
furi_hal_bus_enable(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER_BUS);
|
||||||
|
|
||||||
|
LL_TIM_SetPrescaler(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER, 64000 - 1);
|
||||||
|
LL_TIM_SetCounterMode(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER, LL_TIM_COUNTERMODE_UP);
|
||||||
|
LL_TIM_SetAutoReload(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER, 100 - 1); // 100 ms
|
||||||
|
LL_TIM_SetClockDivision(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER, LL_TIM_CLOCKDIVISION_DIV1);
|
||||||
|
LL_TIM_SetClockSource(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER, LL_TIM_CLOCKSOURCE_INTERNAL);
|
||||||
|
|
||||||
|
LL_TIM_DisableARRPreload(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER);
|
||||||
|
|
||||||
|
LL_TIM_EnableDMAReq_UPDATE(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER);
|
||||||
|
LL_TIM_GenerateEvent_UPDATE(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER);
|
||||||
|
}
|
||||||
|
|
||||||
|
void furi_hal_rfid_field_detect_start(void) {
|
||||||
|
// setup pins
|
||||||
|
furi_hal_rfid_pins_field();
|
||||||
|
|
||||||
|
// configure timer
|
||||||
|
furi_hal_rfid_field_tim_setup();
|
||||||
|
|
||||||
|
// configure DMA "TIM_COUNTER_CNT -> counter"
|
||||||
|
LL_DMA_SetMemoryAddress(RFID_DMA_CH1_DEF, (uint32_t) & (furi_hal_rfid->field.counter));
|
||||||
|
LL_DMA_SetPeriphAddress(
|
||||||
|
RFID_DMA_CH1_DEF, (uint32_t) & (FURI_HAL_RFID_FIELD_COUNTER_TIMER->CNT));
|
||||||
|
LL_DMA_ConfigTransfer(
|
||||||
|
RFID_DMA_CH1_DEF,
|
||||||
|
LL_DMA_DIRECTION_PERIPH_TO_MEMORY | LL_DMA_MODE_CIRCULAR | LL_DMA_PERIPH_NOINCREMENT |
|
||||||
|
LL_DMA_MEMORY_NOINCREMENT | LL_DMA_PDATAALIGN_WORD | LL_DMA_MDATAALIGN_WORD |
|
||||||
|
LL_DMA_PRIORITY_MEDIUM);
|
||||||
|
LL_DMA_SetDataLength(RFID_DMA_CH1_DEF, 1);
|
||||||
|
LL_DMA_SetPeriphRequest(RFID_DMA_CH1_DEF, FURI_HAL_RFID_FIELD_DMAMUX_DMA);
|
||||||
|
LL_DMA_EnableChannel(RFID_DMA_CH1_DEF);
|
||||||
|
|
||||||
|
// configure DMA "mem -> TIM_COUNTER_CNT"
|
||||||
|
LL_DMA_SetMemoryAddress(
|
||||||
|
RFID_DMA_CH2_DEF, (uint32_t) & (furi_hal_rfid->field.set_tim_counter_cnt));
|
||||||
|
LL_DMA_SetPeriphAddress(
|
||||||
|
RFID_DMA_CH2_DEF, (uint32_t) & (FURI_HAL_RFID_FIELD_COUNTER_TIMER->CNT));
|
||||||
|
LL_DMA_ConfigTransfer(
|
||||||
|
RFID_DMA_CH2_DEF,
|
||||||
|
LL_DMA_DIRECTION_MEMORY_TO_PERIPH | LL_DMA_MODE_CIRCULAR | LL_DMA_PERIPH_NOINCREMENT |
|
||||||
|
LL_DMA_MEMORY_NOINCREMENT | LL_DMA_PDATAALIGN_WORD | LL_DMA_MDATAALIGN_WORD |
|
||||||
|
LL_DMA_PRIORITY_LOW);
|
||||||
|
LL_DMA_SetDataLength(RFID_DMA_CH2_DEF, 1);
|
||||||
|
LL_DMA_SetPeriphRequest(RFID_DMA_CH2_DEF, FURI_HAL_RFID_FIELD_DMAMUX_DMA);
|
||||||
|
LL_DMA_EnableChannel(RFID_DMA_CH2_DEF);
|
||||||
|
|
||||||
|
// start tim counter
|
||||||
|
LL_TIM_EnableAllOutputs(FURI_HAL_RFID_FIELD_COUNTER_TIMER);
|
||||||
|
|
||||||
|
LL_TIM_SetCounter(FURI_HAL_RFID_FIELD_COUNTER_TIMER, 0);
|
||||||
|
LL_TIM_EnableCounter(FURI_HAL_RFID_FIELD_COUNTER_TIMER);
|
||||||
|
|
||||||
|
// start tim timeout
|
||||||
|
LL_TIM_SetCounter(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER, 0);
|
||||||
|
LL_TIM_EnableCounter(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER);
|
||||||
|
LL_TIM_EnableIT_UPDATE(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER);
|
||||||
|
}
|
||||||
|
|
||||||
|
void furi_hal_rfid_field_detect_stop(void) {
|
||||||
|
LL_TIM_DisableCounter(FURI_HAL_RFID_FIELD_COUNTER_TIMER);
|
||||||
|
LL_TIM_DisableAllOutputs(FURI_HAL_RFID_FIELD_COUNTER_TIMER);
|
||||||
|
|
||||||
|
LL_TIM_DisableCounter(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER);
|
||||||
|
|
||||||
|
FURI_CRITICAL_ENTER();
|
||||||
|
|
||||||
|
LL_DMA_DeInit(RFID_DMA_CH1_DEF);
|
||||||
|
LL_DMA_DeInit(RFID_DMA_CH2_DEF);
|
||||||
|
|
||||||
|
furi_hal_bus_disable(FURI_HAL_RFID_FIELD_COUNTER_TIMER_BUS);
|
||||||
|
furi_hal_bus_disable(FURI_HAL_RFID_FIELD_TIMEOUT_TIMER_BUS);
|
||||||
|
|
||||||
|
furi_hal_rfid_pins_reset();
|
||||||
|
|
||||||
|
FURI_CRITICAL_EXIT();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool furi_hal_rfid_field_is_present(uint32_t* frequency) {
|
||||||
|
*frequency = furi_hal_rfid->field.counter * 10;
|
||||||
|
return (
|
||||||
|
(*frequency >= FURI_HAL_RFID_FIELD_FREQUENCY_MIN) &&
|
||||||
|
(*frequency <= FURI_HAL_RFID_FIELD_FREQUENCY_MAX));
|
||||||
|
}
|
||||||
@@ -87,6 +87,20 @@ typedef void (*FuriHalRfidCompCallback)(bool level, void* context);
|
|||||||
/** Set comparator callback */
|
/** Set comparator callback */
|
||||||
void furi_hal_rfid_comp_set_callback(FuriHalRfidCompCallback callback, void* context);
|
void furi_hal_rfid_comp_set_callback(FuriHalRfidCompCallback callback, void* context);
|
||||||
|
|
||||||
|
/** Start/Enable Field Presence detect */
|
||||||
|
void furi_hal_rfid_field_detect_start();
|
||||||
|
|
||||||
|
/** Stop/Disable Field Presence detect */
|
||||||
|
void furi_hal_rfid_field_detect_stop();
|
||||||
|
|
||||||
|
/** Check Field Presence
|
||||||
|
*
|
||||||
|
* @param[out] frequency pointer to frequency value to be set if filed detected
|
||||||
|
*
|
||||||
|
* @return true if field is present, false if not
|
||||||
|
*/
|
||||||
|
bool furi_hal_rfid_field_is_present(uint32_t* frequency);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1089,7 +1089,7 @@ void nfc_worker_mf_classic_dict_attack(NfcWorker* nfc_worker) {
|
|||||||
mf_classic_get_sector_trailer_by_sector(data, i);
|
mf_classic_get_sector_trailer_by_sector(data, i);
|
||||||
|
|
||||||
uint8_t current_key[6];
|
uint8_t current_key[6];
|
||||||
memcpy(current_key, &key, 6);
|
nfc_util_num2bytes(key, 6, current_key);
|
||||||
|
|
||||||
if(mf_classic_is_key_found(data, i, MfClassicKeyA) &&
|
if(mf_classic_is_key_found(data, i, MfClassicKeyA) &&
|
||||||
memcmp(sec_trailer->key_a, current_key, 6) == 0) {
|
memcmp(sec_trailer->key_a, current_key, 6) == 0) {
|
||||||
@@ -1115,7 +1115,7 @@ void nfc_worker_mf_classic_dict_attack(NfcWorker* nfc_worker) {
|
|||||||
mf_classic_get_sector_trailer_by_sector(data, i);
|
mf_classic_get_sector_trailer_by_sector(data, i);
|
||||||
|
|
||||||
uint8_t current_key[6];
|
uint8_t current_key[6];
|
||||||
memcpy(current_key, &key, 6);
|
nfc_util_num2bytes(key, 6, current_key);
|
||||||
|
|
||||||
if(mf_classic_is_key_found(data, i, MfClassicKeyB) &&
|
if(mf_classic_is_key_found(data, i, MfClassicKeyB) &&
|
||||||
memcmp(sec_trailer->key_b, current_key, 6) == 0) {
|
memcmp(sec_trailer->key_b, current_key, 6) == 0) {
|
||||||
@@ -1134,7 +1134,7 @@ void nfc_worker_mf_classic_dict_attack(NfcWorker* nfc_worker) {
|
|||||||
}
|
}
|
||||||
if(nfc_worker->state != NfcWorkerStateMfClassicDictAttack) break;
|
if(nfc_worker->state != NfcWorkerStateMfClassicDictAttack) break;
|
||||||
}
|
}
|
||||||
memcpy(&prev_key, &key, sizeof(key));
|
prev_key = key;
|
||||||
}
|
}
|
||||||
if(nfc_worker->state != NfcWorkerStateMfClassicDictAttack) break;
|
if(nfc_worker->state != NfcWorkerStateMfClassicDictAttack) break;
|
||||||
mf_classic_read_sector(&tx_rx, data, i);
|
mf_classic_read_sector(&tx_rx, data, i);
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ ReturnCode slix2_read_nxp_sysinfo(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_da
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ret != ERR_NONE || received != 8) {
|
if(ret != ERR_NONE || received != 8) { //-V560
|
||||||
FURI_LOG_D(TAG, "Failed: %d, %d", ret, received);
|
FURI_LOG_D(TAG, "Failed: %d, %d", ret, received);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ ReturnCode slix2_read_signature(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ret != ERR_NONE || received != 33) {
|
if(ret != ERR_NONE || received != 33) { //-V560
|
||||||
FURI_LOG_D(TAG, "Failed: %d, %d", ret, received);
|
FURI_LOG_D(TAG, "Failed: %d, %d", ret, received);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -649,7 +649,7 @@ bool slix2_protocol_filter( // -V524
|
|||||||
ctr_new = (ctr_old & 0xFFFF0000) | ((ctr_old + 1) & 0xFFFF);
|
ctr_new = (ctr_old & 0xFFFF0000) | ((ctr_old + 1) & 0xFFFF);
|
||||||
|
|
||||||
/* protection flag set? */
|
/* protection flag set? */
|
||||||
if(ctr_old & 0x01000000) {
|
if(ctr_old & 0x01000000) { //-V1051
|
||||||
allowed = nfcv_data->sub_data.slix.flags &
|
allowed = nfcv_data->sub_data.slix.flags &
|
||||||
NfcVSlixDataFlagsValidKeyRead;
|
NfcVSlixDataFlagsValidKeyRead;
|
||||||
}
|
}
|
||||||
@@ -659,7 +659,10 @@ bool slix2_protocol_filter( // -V524
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(allowed) {
|
if(allowed) {
|
||||||
memcpy(&nfcv_data->data[nfcv_data->block_size * block_num], &ctr_new, 4);
|
memcpy( //-V1086
|
||||||
|
&nfcv_data->data[nfcv_data->block_size * block_num],
|
||||||
|
&ctr_new,
|
||||||
|
4);
|
||||||
} else {
|
} else {
|
||||||
/* incorrect read or write password */
|
/* incorrect read or write password */
|
||||||
ctx->response_buffer[0] = NFCV_RES_FLAG_ERROR;
|
ctx->response_buffer[0] = NFCV_RES_FLAG_ERROR;
|
||||||
|
|||||||
0
scripts/distfap.py
Normal file → Executable file
0
scripts/distfap.py
Normal file → Executable file
@@ -394,7 +394,7 @@ def generate_embed_app_metadata_actions(source, target, env, for_signature):
|
|||||||
"$APPMETAEMBED_COMSTR",
|
"$APPMETAEMBED_COMSTR",
|
||||||
),
|
),
|
||||||
Action(
|
Action(
|
||||||
"${FBT_SCRIPT_DIR}/fastfap.py ${TARGET} ${OBJCOPY}",
|
"${PYTHON3} ${FBT_SCRIPT_DIR}/fastfap.py ${TARGET} ${OBJCOPY}",
|
||||||
"$FASTFAP_COMSTR",
|
"$FASTFAP_COMSTR",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
0
scripts/fwsize.py
Normal file → Executable file
0
scripts/fwsize.py
Normal file → Executable file
0
scripts/get_env.py
Normal file → Executable file
0
scripts/get_env.py
Normal file → Executable file
0
scripts/runfap.py
Normal file → Executable file
0
scripts/runfap.py
Normal file → Executable file
0
scripts/sconsdist.py
Normal file → Executable file
0
scripts/sconsdist.py
Normal file → Executable file
0
scripts/selfupdate.py
Normal file → Executable file
0
scripts/selfupdate.py
Normal file → Executable file
0
scripts/slideshow.py
Normal file → Executable file
0
scripts/slideshow.py
Normal file → Executable file
@@ -8,6 +8,7 @@ import time
|
|||||||
def flp_serial_by_name(flp_name):
|
def flp_serial_by_name(flp_name):
|
||||||
if sys.platform == "darwin": # MacOS
|
if sys.platform == "darwin": # MacOS
|
||||||
flp_serial = "/dev/cu.usbmodemflip_" + flp_name + "1"
|
flp_serial = "/dev/cu.usbmodemflip_" + flp_name + "1"
|
||||||
|
logging.info(f"Darwin, looking for {flp_serial}")
|
||||||
elif sys.platform == "linux": # Linux
|
elif sys.platform == "linux": # Linux
|
||||||
flp_serial = (
|
flp_serial = (
|
||||||
"/dev/serial/by-id/usb-Flipper_Devices_Inc._Flipper_"
|
"/dev/serial/by-id/usb-Flipper_Devices_Inc._Flipper_"
|
||||||
@@ -16,10 +17,12 @@ def flp_serial_by_name(flp_name):
|
|||||||
+ flp_name
|
+ flp_name
|
||||||
+ "-if00"
|
+ "-if00"
|
||||||
)
|
)
|
||||||
|
logging.info(f"linux, looking for {flp_serial}")
|
||||||
|
|
||||||
if os.path.exists(flp_serial):
|
if os.path.exists(flp_serial):
|
||||||
return flp_serial
|
return flp_serial
|
||||||
else:
|
else:
|
||||||
|
logging.info(f"Couldn't find {logging.info} on this attempt.")
|
||||||
if os.path.exists(flp_name):
|
if os.path.exists(flp_name):
|
||||||
return flp_name
|
return flp_name
|
||||||
else:
|
else:
|
||||||
@@ -38,7 +41,7 @@ def main():
|
|||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
datefmt="%Y-%m-%d %H:%M:%S",
|
datefmt="%Y-%m-%d %H:%M:%S",
|
||||||
)
|
)
|
||||||
logging.info("Waiting for Flipper to be ready...")
|
logging.info(f"Waiting for Flipper {flipper_name} to be ready...")
|
||||||
|
|
||||||
while flipper == "" and elapsed < UPDATE_TIMEOUT:
|
while flipper == "" and elapsed < UPDATE_TIMEOUT:
|
||||||
elapsed += 1
|
elapsed += 1
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ def main():
|
|||||||
logging.error("Flipper not found!")
|
logging.error("Flipper not found!")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
with serial.Serial(flp_serial, timeout=1) as flipper:
|
with serial.Serial(flp_serial, timeout=10) as flipper:
|
||||||
logging.info(f"Found Flipper at {flp_serial}")
|
logging.info(f"Found Flipper at {flp_serial}")
|
||||||
flipper.baudrate = 230400
|
flipper.baudrate = 230400
|
||||||
flipper.flushOutput()
|
flipper.flushOutput()
|
||||||
flipper.flushInput()
|
flipper.flushInput()
|
||||||
|
|
||||||
flipper.timeout = 180
|
flipper.timeout = 300
|
||||||
|
|
||||||
flipper.read_until(b">: ").decode("utf-8")
|
flipper.read_until(b">: ").decode("utf-8")
|
||||||
flipper.write(b"unit_tests\r")
|
flipper.write(b"unit_tests\r")
|
||||||
|
|||||||
0
scripts/version.py
Normal file → Executable file
0
scripts/version.py
Normal file → Executable file
Reference in New Issue
Block a user