Update UL apps
@@ -6,6 +6,5 @@ App(
|
||||
"music_player",
|
||||
"music_beeper",
|
||||
"snake_game",
|
||||
"bt_hid",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="BlackJack",
|
||||
appid="Blackjack",
|
||||
name="BlackJack",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="blackjack_app",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "util.h"
|
||||
#include "ui.h"
|
||||
|
||||
#include "BlackJack_icons.h"
|
||||
#include "Blackjack_icons.h"
|
||||
|
||||
#define DEALER_MAX 17
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
App(
|
||||
appid="DAP_Link",
|
||||
name="DAP Link",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
appid="dap_link",
|
||||
name="[GPIO] DAP Link",
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
entry_point="dap_link_app",
|
||||
requires=[
|
||||
"gui",
|
||||
@@ -10,7 +10,7 @@ App(
|
||||
stack_size=4 * 1024,
|
||||
order=20,
|
||||
fap_icon="dap_link.png",
|
||||
fap_category="Tools",
|
||||
fap_category="GPIO",
|
||||
fap_private_libs=[
|
||||
Lib(
|
||||
name="free-dap",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "gui/dap_gui.h"
|
||||
#include "usb/dap_v2_usb.h"
|
||||
#include <dialogs/dialogs.h>
|
||||
#include "DAP_Link_icons.h"
|
||||
#include "dap_link_icons.h"
|
||||
|
||||
/***************************************************************************/
|
||||
/****************************** DAP COMMON *********************************/
|
||||
@@ -524,4 +524,4 @@ int32_t dap_link_app(void* p) {
|
||||
dap_app_free(app);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "dap_main_view.h"
|
||||
#include "DAP_Link_icons.h"
|
||||
#include "dap_link_icons.h"
|
||||
#include <gui/elements.h>
|
||||
|
||||
// extern const Icon I_ArrowDownEmpty_12x18;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||

|
||||

|
||||
|
||||
[Original Link](https://github.com/litui/dtmf_dolphin)
|
||||
|
||||
## DTMF Dolphin
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="DTMF_Dolphin",
|
||||
appid="dtmf_dolphin",
|
||||
name="DTMF Dolphin",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="dtmf_dolphin_app",
|
||||
|
||||
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1,7 +1,6 @@
|
||||
#include "flipfrid_scene_load_custom_uids.h"
|
||||
#include "flipfrid_scene_run_attack.h"
|
||||
#include "flipfrid_scene_entrypoint.h"
|
||||
#include "RFID_Fuzzer_icons.h"
|
||||
|
||||
#define LFRFID_UIDS_EXTENSION ".txt"
|
||||
#define RFIDFUZZER_APP_PATH_FOLDER "/ext/rfidfuzzer"
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "flipfrid_scene_load_file.h"
|
||||
#include "flipfrid_scene_entrypoint.h"
|
||||
#include "RFID_Fuzzer_icons.h"
|
||||
|
||||
#define LFRFID_APP_EXTENSION ".rfid"
|
||||
#define LFRFID_APP_PATH_FOLDER "/ext/lfrfid"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# flipperzero-i2ctools
|
||||
|
||||
[Original link](https://github.com/NaejEL/flipperzero-i2ctools)
|
||||
Set of i2c tools for Flipper Zero
|
||||
|
||||

|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="I2C_Tools",
|
||||
appid="i2cTools",
|
||||
name="[GPIO] i2c Tools",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="i2ctools_app",
|
||||
@@ -10,4 +10,4 @@ App(
|
||||
fap_icon="i2ctools.png",
|
||||
fap_category="GPIO",
|
||||
fap_icon_assets="images",
|
||||
)
|
||||
)
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include <gui/gui.h>
|
||||
#include <I2C_Tools_icons.h>
|
||||
#include <i2cTools_icons.h>
|
||||
#define APP_NAME "I2C Tools"
|
||||
|
||||
#define SCAN_MENU_TEXT "Scan"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include <gui/gui.h>
|
||||
#include <I2C_Tools_icons.h>
|
||||
#include <i2cTools_icons.h>
|
||||
#include "../i2cscanner.h"
|
||||
|
||||
#define SCAN_TEXT "SCAN"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include <gui/gui.h>
|
||||
#include <I2C_Tools_icons.h>
|
||||
#include <i2cTools_icons.h>
|
||||
#include "../i2csender.h"
|
||||
|
||||
#define SEND_TEXT "SEND"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include <gui/gui.h>
|
||||
#include <I2C_Tools_icons.h>
|
||||
#include <i2cTools_icons.h>
|
||||
#include "../i2csniffer.h"
|
||||
|
||||
#define SNIFF_TEXT "SNIFF"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="Game15",
|
||||
appid="game15",
|
||||
name="Game 15",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="game15_app",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# PLUGIN BY eugene-kirzhanov
|
||||
App(
|
||||
appid="2048_improved",
|
||||
appid="game_2048",
|
||||
name="2048",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="game_2048_app",
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
# GPS for Flipper Zero
|
||||
|
||||
A simple Flipper Zero application for NMEA 0183 serial GPS modules, such as the
|
||||
|
||||
[Original link](https://github.com/ezod/flipperzero-gps)
|
||||
|
||||
[Adafruit Ultimate GPS Breakout].
|
||||
|
||||
[Original link](https://github.com/ezod/flipperzero-gps)
|
||||
|
||||

|
||||
|
||||
Heavy lifting (NMEA parsing) provided by [minmea], which is included in this
|
||||
@@ -35,4 +32,3 @@ baud rate, may be useful for other GPS modules.
|
||||
[Adafruit Ultimate GPS Breakout]: https://www.adafruit.com/product/746
|
||||
[minmea]: https://github.com/kosma/minmea
|
||||
[flipperzero-firmware]: https://github.com/flipperdevices/flipperzero-firmware
|
||||
[qFlipper]: https://flipperzero.one/update
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="NMEA_GPS",
|
||||
appid="gps_nmea",
|
||||
name="[NMEA] GPS",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="gps_app",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="HC_SR04_Dist_Sensor",
|
||||
appid="hc_sr04",
|
||||
name="[HC-SR] Dist. Sensor",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="hc_sr04_app",
|
||||
@@ -11,4 +11,4 @@ App(
|
||||
order=20,
|
||||
fap_icon="dist_sensor10px.png",
|
||||
fap_category="GPIO",
|
||||
)
|
||||
)
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="Heap_Defence",
|
||||
appid="heap_defence",
|
||||
name="Heap Defence",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="heap_defence_app",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "hede_assets.h"
|
||||
#include "Heap_Defence_icons.h"
|
||||
#include "heap_defence_icons.h"
|
||||
|
||||
#include <furi.h>
|
||||
#include <gui/gui.h>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="USB_Remote",
|
||||
appid="hid_usb",
|
||||
name="USB Remote",
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
entry_point="hid_usb_app",
|
||||
@@ -12,7 +12,7 @@ App(
|
||||
|
||||
|
||||
App(
|
||||
appid="Bluetooth_Remote",
|
||||
appid="hid_ble",
|
||||
name="Bluetooth Remote",
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
entry_point="hid_ble_app",
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
# iButton Fuzzer
|
||||
Plugin for Flipper Zero
|
||||
|
||||
Made for [Unleashed](https://github.com/DarkFlippers/unleashed-firmware) firmware, but will work on original firmware too
|
||||
|
||||
Supported protocols:
|
||||
- DS1990
|
||||
- Metakom
|
||||
- Cyfral
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="IBtn_Fuzzer",
|
||||
appid="iBtn_Fuzzer",
|
||||
name="iButton Fuzzer",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="ibtnfuzzer_start",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <toolbox/stream/file_stream.h>
|
||||
#include <toolbox/stream/buffered_file_stream.h>
|
||||
|
||||
#include <IBtn_Fuzzer_icons.h>
|
||||
#include <iBtn_Fuzzer_icons.h>
|
||||
|
||||
#include <lib/one_wire/ibutton/ibutton_worker.h>
|
||||
#include <lib/one_wire/ibutton/ibutton_key.h>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="BH1750_Lightmeter",
|
||||
appid="lightmeter",
|
||||
name="[BH1750] Lightmeter",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="lightmeter_app",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <gui/view.h>
|
||||
#include "BH1750_Lightmeter_icons.h"
|
||||
#include "lightmeter_icons.h"
|
||||
#include "../../lightmeter_config.h"
|
||||
|
||||
typedef struct MainView MainView;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# Minesweeper
|
||||
|
||||
[Original Link](https://github.com/panki27/minesweeper)
|
||||
|
||||
This is a Minesweeper implementation for the Flipper Zero device.
|
||||
|
||||

|
||||
|
||||
@@ -218,6 +218,10 @@ static bool game_lost(Minesweeper* minesweeper_state) {
|
||||
|
||||
dialog_message_set_icon(message, NULL, 0, 10);
|
||||
|
||||
// Set cursor to initial position
|
||||
minesweeper_state->cursor_x = 0;
|
||||
minesweeper_state->cursor_y = 0;
|
||||
|
||||
NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION);
|
||||
notification_message(notifications, &sequence_set_vibro_on);
|
||||
furi_record_close(RECORD_NOTIFICATION);
|
||||
@@ -474,7 +478,7 @@ int32_t minesweeper_app(void* p) {
|
||||
// Exit the plugin
|
||||
processing = false;
|
||||
break;
|
||||
case InputKeyMAX:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if(event.input.type == InputTypeLong) {
|
||||
@@ -493,7 +497,7 @@ int32_t minesweeper_app(void* p) {
|
||||
case InputKeyBack:
|
||||
processing = false;
|
||||
break;
|
||||
case InputKeyMAX:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="Morse_Code",
|
||||
appid="morse_code",
|
||||
name="Morse Code",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="morse_code_app",
|
||||
|
||||
|
Before Width: | Height: | Size: 576 B After Width: | Height: | Size: 576 B |
@@ -10,8 +10,7 @@
|
||||
#include <furi_hal_resources.h>
|
||||
#include <nrf24.h>
|
||||
#include "mousejacker_ducky.h"
|
||||
#include <dolphin/dolphin.h>
|
||||
#include "NRF24_Mouse_Jacker_icons.h"
|
||||
#include <NRF24_Mouse_Jacker_icons.h>
|
||||
|
||||
#define TAG "mousejacker"
|
||||
#define LOGITECH_MAX_CHANNEL 85
|
||||
@@ -112,7 +111,7 @@ static bool open_ducky_script(Stream* stream, PluginState* plugin_state) {
|
||||
|
||||
DialogsFileBrowserOptions browser_options;
|
||||
dialog_file_browser_set_basic_options(
|
||||
&browser_options, MOUSEJACKER_APP_PATH_EXTENSION, &I_badkb_10px);
|
||||
&browser_options, MOUSEJACKER_APP_PATH_EXTENSION, &I_badusb_10px);
|
||||
browser_options.hide_ext = false;
|
||||
|
||||
bool ret = dialog_file_browser_show(dialogs, path, path, &browser_options);
|
||||
@@ -184,7 +183,6 @@ static bool process_ducky_file(
|
||||
mj_process_ducky_script(
|
||||
nrf24_HANDLE, addr, addr_size, rate, (char*)file_buf, plugin_state);
|
||||
FURI_LOG_D(TAG, "finished execution");
|
||||
// DOLPHIN_DEED(getRandomDeed());
|
||||
loaded = true;
|
||||
} else {
|
||||
FURI_LOG_D(TAG, "load failed. file size: %d", file_size);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
App(
|
||||
appid="Music_Player",
|
||||
name="Music Player",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
entry_point="music_player_app",
|
||||
cdefines=["APP_MUSIC_PLAYER"],
|
||||
requires=[
|
||||
|
||||
@@ -258,7 +258,7 @@ MusicPlayer* music_player_alloc() {
|
||||
MusicPlayer* instance = malloc(sizeof(MusicPlayer));
|
||||
|
||||
instance->model = malloc(sizeof(MusicPlayerModel));
|
||||
instance->model->volume = 4;
|
||||
instance->model->volume = 3;
|
||||
|
||||
instance->model_mutex = furi_mutex_alloc(FuriMutexTypeNormal);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="NFC_Magic",
|
||||
appid="nfc_magic",
|
||||
name="NFC Magic",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
targets=["f7"],
|
||||
|
||||
@@ -136,9 +136,9 @@ void nfc_magic_free(NfcMagic* nfc_magic) {
|
||||
free(nfc_magic);
|
||||
}
|
||||
|
||||
static const NotificationSequence nfc_magic_sequence_blink_start_blue = {
|
||||
static const NotificationSequence nfc_magic_sequence_blink_start_cyan = {
|
||||
&message_blink_start_10,
|
||||
&message_blink_set_color_blue,
|
||||
&message_blink_set_color_cyan,
|
||||
&message_do_not_reset,
|
||||
NULL,
|
||||
};
|
||||
@@ -149,7 +149,7 @@ static const NotificationSequence nfc_magic_sequence_blink_stop = {
|
||||
};
|
||||
|
||||
void nfc_magic_blink_start(NfcMagic* nfc_magic) {
|
||||
notification_message(nfc_magic->notifications, &nfc_magic_sequence_blink_start_blue);
|
||||
notification_message(nfc_magic->notifications, &nfc_magic_sequence_blink_start_cyan);
|
||||
}
|
||||
|
||||
void nfc_magic_blink_stop(NfcMagic* nfc_magic) {
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include <lib/toolbox/path.h>
|
||||
|
||||
#include <lib/nfc/nfc_device.h>
|
||||
#include "NFC_Magic_icons.h"
|
||||
#include "nfc_magic_icons.h"
|
||||
|
||||
#define NFC_APP_FOLDER ANY_PATH("nfc")
|
||||
|
||||
|
||||
@@ -40,16 +40,24 @@ bool nfc_magic_scene_start_on_event(void* context, SceneManagerEvent event) {
|
||||
|
||||
if(event.type == SceneManagerEventTypeCustom) {
|
||||
if(event.event == SubmenuIndexCheck) {
|
||||
scene_manager_set_scene_state(
|
||||
nfc_magic->scene_manager, NfcMagicSceneStart, SubmenuIndexCheck);
|
||||
scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneCheck);
|
||||
consumed = true;
|
||||
} else if(event.event == SubmenuIndexWriteGen1A) {
|
||||
// Explicitly save state in each branch so that the
|
||||
// correct option is reselected if the user cancels
|
||||
// loading a file.
|
||||
scene_manager_set_scene_state(
|
||||
nfc_magic->scene_manager, NfcMagicSceneStart, SubmenuIndexWriteGen1A);
|
||||
scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneFileSelect);
|
||||
consumed = true;
|
||||
} else if(event.event == SubmenuIndexWipe) {
|
||||
scene_manager_set_scene_state(
|
||||
nfc_magic->scene_manager, NfcMagicSceneStart, SubmenuIndexWipe);
|
||||
scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneWipe);
|
||||
consumed = true;
|
||||
}
|
||||
scene_manager_set_scene_state(nfc_magic->scene_manager, NfcMagicSceneStart, event.event);
|
||||
}
|
||||
|
||||
return consumed;
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
# flipperzero-nrf24
|
||||
|
||||
An [NRF24](https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf) driver for the [Flipper Zero](https://flipperzero.one/) device. The NRF24 is a popular line of 2.4GHz radio transceivers from Nordic Semiconductors. This library is not currently complete, but functional.
|
||||
|
||||
## Warning
|
||||
This repo contains two Flipper Zero apps that utilize the NRF24 driver to sniff for NRF24 addresses and perform mousejack attacks. These apps are for **educational purposes** only. Please use this code responsibly and only use these apps on your own equipment.
|
||||
|
||||
## Acknowledgments
|
||||
The NRF24 sniffing technique was discovered and shared by Travis Goodspeed in [his blog](http://travisgoodspeed.blogspot.com/2011/02/promiscuity-is-nrf24l01s-duty.html).
|
||||
|
||||
The mousejack vulnerabilities were discovered and reported by Marc Newlin, see [the blog](https://www.bastille.net/research/vulnerabilities/mousejack/technical-details) for technical details.
|
||||
|
||||
Much of the driver code was inspired by [RadioHead's Arduino library](https://www.airspayce.com/mikem/arduino/RadioHead/classRH__NRF24.html).
|
||||
Much of the mousejack code was inspired by the [Jackit project](https://github.com/insecurityofthings/jackit).
|
||||
#
|
||||
## PinOut from from NoComp/Frog
|
||||
<img src="https://media.discordapp.net/attachments/937479784726949900/994495234618687509/unknown.png?width=567&height=634">
|
||||
|
||||
# Mousejack / NRF24 pinout by UberGuidoZ
|
||||
2/A7 on FZ goes to MOSI/6 on nrf24l01<br>
|
||||
3/A6 on FZ goes to MISO/7 on nrf24l01<br>
|
||||
4/A4 on FZ goes to CSN/4 on nrf24l01<br>
|
||||
5/B3 on FZ goes to SCK/5 on nrf24l01<br>
|
||||
6/B2 on FZ goes to CE/3 on nrf24l01<br>
|
||||
8/GND on FZ goes to GND/1 on nrf24l01<br>
|
||||
9/3V3 on FZ goes to VCC/2 on nrf24l01<br>
|
||||
IRQ/8 is left disconnected on nrf24l01
|
||||

|
||||
If the nRF module is acting a bit flakey, try adding a capacitor to the vcc/gnd lines! I've not tried the Plus model so it may have a bigger need for a cap. Otherwise, I haven't had any major issues. Anything from a 3.3 uF to 10 uF should do. (Watch your positive/negative placement! Negative to ground.) I learned if you wanna get fancy, include a 0.1 uF cap in parallel. The 3.3 uF to 10 uF will respond to slow freq changes while the 0.1 uF will respond to the high freq switching spikes that the larger one cannot. That said, a single 10 uF will likely suffice for the Mousejack attack. ¯\\\_(ツ)_/¯
|
||||

|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <input/input.h>
|
||||
#include <notification/notification_messages.h>
|
||||
#include <stdlib.h>
|
||||
#include <dolphin/dolphin.h>
|
||||
|
||||
#include <nrf24.h>
|
||||
#include <toolbox/stream/file_stream.h>
|
||||
|
||||
@@ -290,7 +290,6 @@ static void wrap_up(Storage* storage, NotificationApp* notification) {
|
||||
hexlify(addr, 5, top_address);
|
||||
found_count++;
|
||||
save_addr_to_file(storage, addr, 5, notification);
|
||||
// DOLPHIN_DEED(getRandomDeed());
|
||||
if(confirmed_idx < MAX_CONFIRMED) memcpy(confirmed[confirmed_idx++], addr, 5);
|
||||
break;
|
||||
}
|
||||
@@ -404,9 +403,6 @@ int32_t nrfsniff_app(void* p) {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// FURI_LOG_D(TAG, "osMessageQueue: event timeout");
|
||||
// event timeout
|
||||
}
|
||||
|
||||
if(sniffing_state) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="subghz_playlist",
|
||||
appid="SubGHz_Playlist",
|
||||
name="Sub-GHz Playlist",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="playlist_app",
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 299 B After Width: | Height: | Size: 299 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="POCSAG_Pager",
|
||||
appid="pocsag_pager",
|
||||
name="POCSAG Pager",
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
entry_point="pocsag_pager_app",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "pocsag_pager_receiver.h"
|
||||
#include "../pocsag_pager_app_i.h"
|
||||
#include <POCSAG_Pager_icons.h>
|
||||
#include <pocsag_pager_icons.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <input/input.h>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "pocsag_pager_receiver.h"
|
||||
#include "../pocsag_pager_app_i.h"
|
||||
#include "POCSAG_Pager_icons.h"
|
||||
#include "pocsag_pager_icons.h"
|
||||
#include "../protocols/pcsg_generic.h"
|
||||
#include <input/input.h>
|
||||
#include <gui/elements.h>
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
# flipperzero-sentry-safe-plugin
|
||||
|
||||
Flipper zero exploiting vulnerability to open any Sentry Safe and Master Lock electronic safe without any pin code.
|
||||
|
||||
[Vulnerability described here](https://github.com/H4ckd4ddy/bypass-sentry-safe)
|
||||
|
||||
### Installation
|
||||
|
||||
- Download [last release fap file](https://github.com/H4ckd4ddy/flipperzero-sentry-safe-plugin/releases/latest)
|
||||
- Copy fap file to the apps folder of your flipper SD card
|
||||
|
||||
### Usage
|
||||
|
||||
- Start "Sentry Safe" plugin
|
||||
- Place wires as described on the plugin screen
|
||||
- Press enter
|
||||
- Open safe
|
||||
|
||||
### Build
|
||||
|
||||
- Recursively clone your base firmware (official or not)
|
||||
- Clone this repository in `applications_user`
|
||||
- Build with `./fbt fap_dist APPSRC=applications_user/flipperzero-sentry-safe-plugin`
|
||||
- Retreive builed fap in dist subfolders
|
||||
|
||||
(More info about build tool [here](https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/fbt.md))
|
||||
@@ -1,7 +1,7 @@
|
||||
App(
|
||||
appid="Signal_Generator",
|
||||
name="[GPIO] Signal Generator",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
entry_point="signal_gen_app",
|
||||
cdefines=["APP_SIGNAL_GEN"],
|
||||
requires=["gui"],
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
App(
|
||||
appid="Snake",
|
||||
name="Snake Game",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
entry_point="snake_game_app",
|
||||
cdefines=["APP_SNAKE_GAME"],
|
||||
requires=[
|
||||
"gui",
|
||||
"notification",
|
||||
"storage",
|
||||
],
|
||||
stack_size=2 * 1024,
|
||||
requires=["gui"],
|
||||
stack_size=1 * 1024,
|
||||
order=210,
|
||||
fap_icon="snake_10px.png",
|
||||
fap_category="Games",
|
||||
|
||||
@@ -1,181 +0,0 @@
|
||||
#include "snake_file_handler.h"
|
||||
|
||||
#include <furi.h>
|
||||
#include <flipper_format/flipper_format.h>
|
||||
|
||||
static void snake_game_close_file(FlipperFormat* file) {
|
||||
if(file == NULL) {
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
return;
|
||||
}
|
||||
flipper_format_file_close(file);
|
||||
flipper_format_free(file);
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
}
|
||||
|
||||
static FlipperFormat* snake_game_open_file() {
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
FlipperFormat* file = flipper_format_file_alloc(storage);
|
||||
|
||||
if(storage_common_stat(storage, SNAKE_GAME_FILE_PATH, NULL) == FSE_OK) {
|
||||
if(!flipper_format_file_open_existing(file, SNAKE_GAME_FILE_PATH)) {
|
||||
snake_game_close_file(file);
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
if(storage_common_stat(storage, APPS_DATA, NULL) == FSE_NOT_EXIST) {
|
||||
if(!storage_simply_mkdir(storage, APPS_DATA)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if(storage_common_stat(storage, SNAKE_GAME_FILE_DIR_PATH, NULL) == FSE_NOT_EXIST) {
|
||||
if(!storage_simply_mkdir(storage, SNAKE_GAME_FILE_DIR_PATH)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if(!flipper_format_file_open_new(file, SNAKE_GAME_FILE_PATH)) {
|
||||
snake_game_close_file(file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
flipper_format_write_header_cstr(
|
||||
file, SNAKE_GAME_FILE_HEADER, SNAKE_GAME_FILE_ACTUAL_VERSION);
|
||||
flipper_format_rewind(file);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
void snake_game_save_score_to_file(int16_t highscore) {
|
||||
FlipperFormat* file = snake_game_open_file();
|
||||
if(file != NULL) {
|
||||
uint32_t temp = highscore;
|
||||
if(!flipper_format_insert_or_update_uint32(file, SNAKE_GAME_CONFIG_HIGHSCORE, &temp, 1)) {
|
||||
snake_game_close_file(file);
|
||||
return;
|
||||
}
|
||||
snake_game_close_file(file);
|
||||
}
|
||||
}
|
||||
|
||||
void snake_game_save_game_to_file(SnakeState* const snake_state) {
|
||||
FlipperFormat* file = snake_game_open_file();
|
||||
|
||||
if(file != NULL) {
|
||||
uint32_t temp = snake_state->len;
|
||||
if(!flipper_format_insert_or_update_uint32(file, SNAKE_GAME_CONFIG_KEY_LEN, &temp, 1)) {
|
||||
snake_game_close_file(file);
|
||||
return;
|
||||
}
|
||||
|
||||
uint16_t array_size = snake_state->len * 2;
|
||||
uint32_t temp_array[array_size];
|
||||
for(int16_t i = 0, a = 0; a < array_size && i < snake_state->len; i++) {
|
||||
temp_array[a++] = snake_state->points[i].x;
|
||||
temp_array[a++] = snake_state->points[i].y;
|
||||
}
|
||||
if(!flipper_format_insert_or_update_uint32(
|
||||
file, SNAKE_GAME_CONFIG_KEY_POINTS, temp_array, array_size)) {
|
||||
snake_game_close_file(file);
|
||||
return;
|
||||
}
|
||||
|
||||
temp = snake_state->currentMovement;
|
||||
if(!flipper_format_insert_or_update_uint32(
|
||||
file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT, &temp, 1)) {
|
||||
snake_game_close_file(file);
|
||||
return;
|
||||
}
|
||||
|
||||
temp = snake_state->nextMovement;
|
||||
if(!flipper_format_insert_or_update_uint32(
|
||||
file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT, &temp, 1)) {
|
||||
snake_game_close_file(file);
|
||||
return;
|
||||
}
|
||||
|
||||
array_size = 2;
|
||||
uint32_t temp_point_array[array_size];
|
||||
temp_point_array[0] = snake_state->fruit.x;
|
||||
temp_point_array[1] = snake_state->fruit.y;
|
||||
if(!flipper_format_insert_or_update_uint32(
|
||||
file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS, temp_point_array, array_size)) {
|
||||
snake_game_close_file(file);
|
||||
return;
|
||||
}
|
||||
|
||||
snake_game_close_file(file);
|
||||
}
|
||||
}
|
||||
|
||||
bool snake_game_init_game_from_file(SnakeState* const snake_state) {
|
||||
FlipperFormat* file = snake_game_open_file();
|
||||
|
||||
if(file != NULL) {
|
||||
FuriString* file_type = furi_string_alloc();
|
||||
uint32_t version = 1;
|
||||
if(!flipper_format_read_header(file, file_type, &version)) {
|
||||
furi_string_free(file_type);
|
||||
snake_game_close_file(file);
|
||||
return false;
|
||||
}
|
||||
furi_string_free(file_type);
|
||||
|
||||
uint32_t temp;
|
||||
snake_state->highscore =
|
||||
(flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_HIGHSCORE, &temp, 1)) ? temp : 0;
|
||||
flipper_format_rewind(file);
|
||||
|
||||
if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_LEN, &temp, 1)) {
|
||||
snake_game_close_file(file);
|
||||
return false;
|
||||
}
|
||||
snake_state->len = temp;
|
||||
flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_LEN);
|
||||
|
||||
uint16_t array_size = snake_state->len * 2;
|
||||
uint32_t temp_array[array_size];
|
||||
if(!flipper_format_read_uint32(
|
||||
file, SNAKE_GAME_CONFIG_KEY_POINTS, temp_array, array_size)) {
|
||||
snake_game_close_file(file);
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int16_t i = 0, a = 0; a < array_size && i < snake_state->len; i++) {
|
||||
snake_state->points[i].x = temp_array[a++];
|
||||
snake_state->points[i].y = temp_array[a++];
|
||||
}
|
||||
flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_POINTS);
|
||||
|
||||
if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT, &temp, 1)) {
|
||||
snake_game_close_file(file);
|
||||
return false;
|
||||
}
|
||||
snake_state->currentMovement = temp;
|
||||
flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT);
|
||||
|
||||
if(!flipper_format_read_uint32(file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT, &temp, 1)) {
|
||||
snake_game_close_file(file);
|
||||
return false;
|
||||
}
|
||||
snake_state->nextMovement = temp;
|
||||
flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT);
|
||||
|
||||
array_size = 2;
|
||||
uint32_t temp_point_array[array_size];
|
||||
if(!flipper_format_read_uint32(
|
||||
file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS, temp_point_array, array_size)) {
|
||||
snake_game_close_file(file);
|
||||
return false;
|
||||
}
|
||||
snake_state->fruit.x = temp_point_array[0];
|
||||
snake_state->fruit.y = temp_point_array[1];
|
||||
flipper_format_delete_key(file, SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS);
|
||||
|
||||
snake_game_close_file(file);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "snake_types.h"
|
||||
#include <furi.h>
|
||||
#include <flipper_format/flipper_format.h>
|
||||
|
||||
#define APPS_DATA EXT_PATH("apps_data")
|
||||
#define SNAKE_GAME_FILE_DIR_PATH APPS_DATA "/snake_game"
|
||||
#define SNAKE_GAME_FILE_PATH SNAKE_GAME_FILE_DIR_PATH "/.snake"
|
||||
|
||||
#define SNAKE_GAME_FILE_HEADER "Flipper Snake plugin run file"
|
||||
#define SNAKE_GAME_FILE_ACTUAL_VERSION 1
|
||||
|
||||
#define SNAKE_GAME_CONFIG_KEY_POINTS "SnakePoints"
|
||||
#define SNAKE_GAME_CONFIG_KEY_LEN "SnakeLen"
|
||||
#define SNAKE_GAME_CONFIG_KEY_CURRENT_MOVEMENT "CurrentMovement"
|
||||
#define SNAKE_GAME_CONFIG_KEY_NEXT_MOVEMENT "NextMovement"
|
||||
#define SNAKE_GAME_CONFIG_KEY_FRUIT_POINTS "FruitPoints"
|
||||
#define SNAKE_GAME_CONFIG_HIGHSCORE "Highscore"
|
||||
|
||||
void snake_game_save_score_to_file(int16_t highscore);
|
||||
|
||||
void snake_game_save_game_to_file(SnakeState* const snake_state);
|
||||
|
||||
bool snake_game_init_game_from_file(SnakeState* const snake_state);
|
||||
@@ -1,51 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <furi.h>
|
||||
|
||||
typedef struct {
|
||||
// +-----x
|
||||
// |
|
||||
// |
|
||||
// y
|
||||
uint8_t x;
|
||||
uint8_t y;
|
||||
} Point;
|
||||
|
||||
typedef enum {
|
||||
GameStateLife,
|
||||
|
||||
// https://melmagazine.com/en-us/story/snake-nokia-6110-oral-history-taneli-armanto
|
||||
// Armanto: While testing the early versions of the game, I noticed it was hard
|
||||
// to control the snake upon getting close to and edge but not crashing — especially
|
||||
// in the highest speed levels. I wanted the highest level to be as fast as I could
|
||||
// possibly make the device "run," but on the other hand, I wanted to be friendly
|
||||
// and help the player manage that level. Otherwise it might not be fun to play. So
|
||||
// I implemented a little delay. A few milliseconds of extra time right before
|
||||
// the player crashes, during which she can still change the directions. And if
|
||||
// she does, the game continues.
|
||||
GameStateLastChance,
|
||||
|
||||
GameStateGameOver,
|
||||
} GameState;
|
||||
|
||||
// Note: do not change without purpose. Current values are used in smart
|
||||
// orthogonality calculation in `snake_game_get_turn_snake`.
|
||||
typedef enum {
|
||||
DirectionUp,
|
||||
DirectionRight,
|
||||
DirectionDown,
|
||||
DirectionLeft,
|
||||
} Direction;
|
||||
|
||||
#define MAX_SNAKE_LEN 253
|
||||
|
||||
typedef struct {
|
||||
Point points[MAX_SNAKE_LEN];
|
||||
uint16_t len;
|
||||
bool isNewHighscore;
|
||||
int16_t highscore;
|
||||
Direction currentMovement;
|
||||
Direction nextMovement; // if backward of currentMovement, ignore
|
||||
Point fruit;
|
||||
GameState state;
|
||||
} SnakeState;
|
||||
@@ -40,7 +40,7 @@ typedef enum {
|
||||
DirectionLeft,
|
||||
} Direction;
|
||||
|
||||
#define MAX_SNAKE_LEN 253
|
||||
#define MAX_SNAKE_LEN 128 * 64 / 4
|
||||
|
||||
typedef struct {
|
||||
Point points[MAX_SNAKE_LEN];
|
||||
@@ -266,10 +266,7 @@ static void
|
||||
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);
|
||||
|
||||
@@ -326,6 +323,7 @@ int32_t snake_game_app(void* p) {
|
||||
|
||||
if(!snake_state->mutex) {
|
||||
FURI_LOG_E("SnakeGame", "cannot create mutex\r\n");
|
||||
furi_message_queue_free(event_queue);
|
||||
free(snake_state);
|
||||
return 255;
|
||||
}
|
||||
@@ -406,26 +404,3 @@ int32_t snake_game_app(void* p) {
|
||||
|
||||
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.
|
||||
// ┌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┐
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// ╎ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ╎
|
||||
// └╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
|
||||
|
||||
@@ -74,8 +74,8 @@ bool spi_mem_tools_read_chip_info(SPIMemChip* chip) {
|
||||
|
||||
bool spi_mem_tools_check_chip_info(SPIMemChip* chip) {
|
||||
SPIMemChip new_chip_info;
|
||||
spi_mem_tools_read_chip_info(&new_chip_info);
|
||||
do {
|
||||
if(!spi_mem_tools_read_chip_info(&new_chip_info)) break;
|
||||
if(chip->vendor_id != new_chip_info.vendor_id) break;
|
||||
if(chip->type_id != new_chip_info.type_id) break;
|
||||
if(chip->capacity_id != new_chip_info.capacity_id) break;
|
||||
|
||||
@@ -4,9 +4,8 @@
|
||||
#define SPI_MEM_VERSION_APP "0.1.0"
|
||||
#define SPI_MEM_DEVELOPER "DrunkBatya"
|
||||
#define SPI_MEM_GITHUB "https://github.com/flipperdevices/flipperzero-firmware"
|
||||
#define SPI_MEM_NAME "\e#\e! SPI Mem Manager \e!\n" // NOSONAR
|
||||
#define SPI_MEM_BLANK_INV \
|
||||
"\e#\e! \e!\n" // NOSONAR
|
||||
#define SPI_MEM_NAME "\e#\e! SPI Mem Manager \e!\n"
|
||||
#define SPI_MEM_BLANK_INV "\e#\e! \e!\n"
|
||||
|
||||
void spi_mem_scene_about_on_enter(void* context) {
|
||||
SPIMemApp* app = context;
|
||||
@@ -16,11 +15,11 @@ void spi_mem_scene_about_on_enter(void* context) {
|
||||
app->widget, 0, 0, 128, 14, AlignCenter, AlignBottom, SPI_MEM_BLANK_INV, false);
|
||||
widget_add_text_box_element(
|
||||
app->widget, 0, 2, 128, 14, AlignCenter, AlignBottom, SPI_MEM_NAME, false);
|
||||
furi_string_printf(tmp_string, "\e#%s\n", "Information"); // NOSONAR
|
||||
furi_string_printf(tmp_string, "\e#%s\n", "Information");
|
||||
furi_string_cat_printf(tmp_string, "Version: %s\n", SPI_MEM_VERSION_APP);
|
||||
furi_string_cat_printf(tmp_string, "Developed by: %s\n", SPI_MEM_DEVELOPER);
|
||||
furi_string_cat_printf(tmp_string, "Github: %s\n\n", SPI_MEM_GITHUB);
|
||||
furi_string_cat_printf(tmp_string, "\e#%s\n", "Description"); // NOSONAR
|
||||
furi_string_cat_printf(tmp_string, "\e#%s\n", "Description");
|
||||
furi_string_cat_printf(
|
||||
tmp_string,
|
||||
"SPI memory dumper\n"
|
||||
|
||||
@@ -16,7 +16,7 @@ void spi_mem_scene_delete_confirm_on_enter(void* context) {
|
||||
FuriString* file_name = furi_string_alloc();
|
||||
FuriString* message = furi_string_alloc();
|
||||
path_extract_filename(app->file_path, file_name, true);
|
||||
furi_string_printf(message, "\e#Delete %s?\e#", furi_string_get_cstr(file_name)); // NOSONAR
|
||||
furi_string_printf(message, "\e#Delete %s?\e#", furi_string_get_cstr(file_name));
|
||||
widget_add_text_box_element(
|
||||
app->widget, 0, 0, 128, 27, AlignCenter, AlignCenter, furi_string_get_cstr(message), true);
|
||||
widget_add_button_element(
|
||||
|
||||
@@ -1,191 +0,0 @@
|
||||
---
|
||||
Language: Cpp
|
||||
AccessModifierOffset: -4
|
||||
AlignAfterOpenBracket: AlwaysBreak
|
||||
AlignArrayOfStructures: None
|
||||
AlignConsecutiveMacros: None
|
||||
AlignConsecutiveAssignments: None
|
||||
AlignConsecutiveBitFields: None
|
||||
AlignConsecutiveDeclarations: None
|
||||
AlignEscapedNewlines: Left
|
||||
AlignOperands: Align
|
||||
AlignTrailingComments: false
|
||||
AllowAllArgumentsOnNextLine: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortEnumsOnASingleLine: true
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: None
|
||||
AllowShortLambdasOnASingleLine: All
|
||||
AllowShortIfStatementsOnASingleLine: WithoutElse
|
||||
AllowShortLoopsOnASingleLine: true
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: Yes
|
||||
AttributeMacros:
|
||||
- __capability
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
BraceWrapping:
|
||||
AfterCaseLabel: false
|
||||
AfterClass: false
|
||||
AfterControlStatement: Never
|
||||
AfterEnum: false
|
||||
AfterFunction: false
|
||||
AfterNamespace: false
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
AfterExternBlock: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
BeforeLambdaBody: false
|
||||
BeforeWhile: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: true
|
||||
SplitEmptyRecord: true
|
||||
SplitEmptyNamespace: true
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeConceptDeclarations: true
|
||||
BreakBeforeBraces: Attach
|
||||
BreakBeforeInheritanceComma: false
|
||||
BreakInheritanceList: BeforeColon
|
||||
BreakBeforeTernaryOperators: false
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
BreakConstructorInitializers: BeforeComma
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakStringLiterals: false
|
||||
ColumnLimit: 99
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
QualifierAlignment: Leave
|
||||
CompactNamespaces: false
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DeriveLineEnding: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
EmptyLineAfterAccessModifier: Never
|
||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
PackConstructorInitializers: BinPack
|
||||
BasedOnStyle: ''
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
AllowAllConstructorInitializersOnNextLine: true
|
||||
FixNamespaceComments: false
|
||||
ForEachMacros:
|
||||
- foreach
|
||||
- Q_FOREACH
|
||||
- BOOST_FOREACH
|
||||
IfMacros:
|
||||
- KJ_IF_MAYBE
|
||||
IncludeBlocks: Preserve
|
||||
IncludeCategories:
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||
Priority: 3
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
IncludeIsMainRegex: '(Test)?$'
|
||||
IncludeIsMainSourceRegex: ''
|
||||
IndentAccessModifiers: false
|
||||
IndentCaseLabels: false
|
||||
IndentCaseBlocks: false
|
||||
IndentGotoLabels: true
|
||||
IndentPPDirectives: None
|
||||
IndentExternBlock: AfterExternBlock
|
||||
IndentRequires: false
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: true
|
||||
InsertTrailingCommas: None
|
||||
JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
LambdaBodyIndentation: Signature
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
ObjCBinPackProtocolList: Auto
|
||||
ObjCBlockIndentWidth: 4
|
||||
ObjCBreakBeforeNestedBlockParam: true
|
||||
ObjCSpaceAfterProperty: true
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PenaltyBreakAssignment: 10
|
||||
PenaltyBreakBeforeFirstCallParameter: 30
|
||||
PenaltyBreakComment: 10
|
||||
PenaltyBreakFirstLessLess: 0
|
||||
PenaltyBreakOpenParenthesis: 0
|
||||
PenaltyBreakString: 10
|
||||
PenaltyBreakTemplateDeclaration: 10
|
||||
PenaltyExcessCharacter: 100
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PenaltyIndentedWhitespace: 0
|
||||
PointerAlignment: Left
|
||||
PPIndentWidth: -1
|
||||
ReferenceAlignment: Pointer
|
||||
ReflowComments: false
|
||||
RemoveBracesLLVM: false
|
||||
SeparateDefinitionBlocks: Leave
|
||||
ShortNamespaceLines: 1
|
||||
SortIncludes: Never
|
||||
SortJavaStaticImport: Before
|
||||
SortUsingDeclarations: false
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterLogicalNot: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeCaseColon: false
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
SpaceBeforeCtorInitializerColon: true
|
||||
SpaceBeforeInheritanceColon: true
|
||||
SpaceBeforeParens: Never
|
||||
SpaceBeforeParensOptions:
|
||||
AfterControlStatements: false
|
||||
AfterForeachMacros: false
|
||||
AfterFunctionDefinitionName: false
|
||||
AfterFunctionDeclarationName: false
|
||||
AfterIfMacros: false
|
||||
AfterOverloadedOperator: false
|
||||
BeforeNonEmptyParentheses: false
|
||||
SpaceAroundPointerQualifiers: Default
|
||||
SpaceBeforeRangeBasedForLoopColon: true
|
||||
SpaceInEmptyBlock: false
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: Never
|
||||
SpacesInConditionalStatement: false
|
||||
SpacesInContainerLiterals: false
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInLineCommentPrefix:
|
||||
Minimum: 1
|
||||
Maximum: -1
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
SpaceBeforeSquareBrackets: false
|
||||
BitFieldColonSpacing: Both
|
||||
Standard: c++03
|
||||
StatementAttributeLikeMacros:
|
||||
- Q_EMIT
|
||||
StatementMacros:
|
||||
- Q_UNUSED
|
||||
- QT_REQUIRE_VERSION
|
||||
TabWidth: 4
|
||||
UseCRLF: false
|
||||
UseTab: Never
|
||||
WhitespaceSensitiveMacros:
|
||||
- STRINGIZE
|
||||
- PP_STRINGIZE
|
||||
- BOOST_PP_STRINGIZE
|
||||
- NS_SWIFT_NAME
|
||||
- CF_SWIFT_NAME
|
||||
...
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Etienne Sellan
|
||||
Copyright (c) 2022 Alexander Kopachov
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="Authenticator",
|
||||
appid="totp",
|
||||
name="Authenticator",
|
||||
apptype=FlipperAppType.EXTERNAL,
|
||||
entry_point="totp_app",
|
||||
|
||||
@@ -132,7 +132,7 @@ static TotpConfigFileOpenResult totp_open_config_file(Storage* storage, FlipperF
|
||||
flipper_format_write_comment_cstr(fff_data_file, " ");
|
||||
flipper_format_write_comment_cstr(
|
||||
fff_data_file,
|
||||
"How to notify user when new token is generated or badkb mode is activated (possible values: 0 - do not notify, 1 - sound, 2 - vibro, 3 sound and vibro)");
|
||||
"How to notify user when new token is generated or badusb mode is activated (possible values: 0 - do not notify, 1 - sound, 2 - vibro, 3 sound and vibro)");
|
||||
flipper_format_write_uint32(
|
||||
fff_data_file, TOTP_CONFIG_KEY_NOTIFICATION_METHOD, &tmp_uint32, 1);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "totp_app_settings.h"
|
||||
#include <math.h>
|
||||
#include <Authenticator_icons.h>
|
||||
#include <totp_icons.h>
|
||||
#include "../../ui_controls.h"
|
||||
#include "../../common_dialogs.h"
|
||||
#include "../../scene_director.h"
|
||||
@@ -247,4 +247,4 @@ void totp_scene_app_settings_deactivate(PluginState* plugin_state) {
|
||||
|
||||
void totp_scene_app_settings_free(const PluginState* plugin_state) {
|
||||
UNUSED(plugin_state);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "totp_scene_authenticate.h"
|
||||
#include <dialogs/dialogs.h>
|
||||
#include <Authenticator_icons.h>
|
||||
#include <totp_icons.h>
|
||||
#include "../../../types/common.h"
|
||||
#include "../../constants.h"
|
||||
#include "../../../services/config/config.h"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <gui/gui.h>
|
||||
#include <notification/notification.h>
|
||||
#include <notification/notification_messages.h>
|
||||
#include <Authenticator_icons.h>
|
||||
#include <totp_icons.h>
|
||||
#include "totp_scene_generate_token.h"
|
||||
#include "../../../types/token_info.h"
|
||||
#include "../../../types/common.h"
|
||||
@@ -24,7 +24,7 @@ typedef struct {
|
||||
uint32_t last_token_gen_time;
|
||||
TotpTypeCodeWorkerContext* type_code_worker_context;
|
||||
NotificationMessage const** notification_sequence_new_token;
|
||||
NotificationMessage const** notification_sequence_badkb;
|
||||
NotificationMessage const** notification_sequence_badusb;
|
||||
} SceneState;
|
||||
|
||||
static const NotificationSequence*
|
||||
@@ -69,8 +69,8 @@ static const NotificationSequence*
|
||||
}
|
||||
|
||||
static const NotificationSequence*
|
||||
get_notification_sequence_badkb(const PluginState* plugin_state, SceneState* scene_state) {
|
||||
if(scene_state->notification_sequence_badkb == NULL) {
|
||||
get_notification_sequence_badusb(const PluginState* plugin_state, SceneState* scene_state) {
|
||||
if(scene_state->notification_sequence_badusb == NULL) {
|
||||
uint8_t i = 0;
|
||||
uint8_t length = 3;
|
||||
if(plugin_state->notification_method & NotificationMethodVibro) {
|
||||
@@ -81,36 +81,36 @@ static const NotificationSequence*
|
||||
length += 6;
|
||||
}
|
||||
|
||||
scene_state->notification_sequence_badkb = malloc(sizeof(void*) * length);
|
||||
furi_check(scene_state->notification_sequence_badkb != NULL);
|
||||
scene_state->notification_sequence_badusb = malloc(sizeof(void*) * length);
|
||||
furi_check(scene_state->notification_sequence_badusb != NULL);
|
||||
|
||||
scene_state->notification_sequence_badkb[i++] = &message_blue_255;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_blue_255;
|
||||
if(plugin_state->notification_method & NotificationMethodVibro) {
|
||||
scene_state->notification_sequence_badkb[i++] = &message_vibro_on;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_vibro_on;
|
||||
}
|
||||
|
||||
if(plugin_state->notification_method & NotificationMethodSound) {
|
||||
scene_state->notification_sequence_badkb[i++] = &message_note_d5; //-V525
|
||||
scene_state->notification_sequence_badkb[i++] = &message_delay_50;
|
||||
scene_state->notification_sequence_badkb[i++] = &message_note_e4;
|
||||
scene_state->notification_sequence_badkb[i++] = &message_delay_50;
|
||||
scene_state->notification_sequence_badkb[i++] = &message_note_f3;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_note_d5; //-V525
|
||||
scene_state->notification_sequence_badusb[i++] = &message_delay_50;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_note_e4;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_delay_50;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_note_f3;
|
||||
}
|
||||
|
||||
scene_state->notification_sequence_badkb[i++] = &message_delay_50;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_delay_50;
|
||||
|
||||
if(plugin_state->notification_method & NotificationMethodVibro) {
|
||||
scene_state->notification_sequence_badkb[i++] = &message_vibro_off;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_vibro_off;
|
||||
}
|
||||
|
||||
if(plugin_state->notification_method & NotificationMethodSound) {
|
||||
scene_state->notification_sequence_badkb[i++] = &message_sound_off;
|
||||
scene_state->notification_sequence_badusb[i++] = &message_sound_off;
|
||||
}
|
||||
|
||||
scene_state->notification_sequence_badkb[i++] = NULL;
|
||||
scene_state->notification_sequence_badusb[i++] = NULL;
|
||||
}
|
||||
|
||||
return (NotificationSequence*)scene_state->notification_sequence_badkb;
|
||||
return (NotificationSequence*)scene_state->notification_sequence_badusb;
|
||||
}
|
||||
|
||||
static void int_token_to_str(uint32_t i_token_code, char* str, TokenDigitsCount len) {
|
||||
@@ -340,7 +340,7 @@ bool totp_scene_generate_token_handle_event(
|
||||
scene_state->type_code_worker_context, TotpTypeCodeWorkerEventType);
|
||||
notification_message(
|
||||
plugin_state->notification_app,
|
||||
get_notification_sequence_badkb(plugin_state, scene_state));
|
||||
get_notification_sequence_badusb(plugin_state, scene_state));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -399,8 +399,8 @@ void totp_scene_generate_token_deactivate(PluginState* plugin_state) {
|
||||
free(scene_state->notification_sequence_new_token);
|
||||
}
|
||||
|
||||
if(scene_state->notification_sequence_badkb != NULL) {
|
||||
free(scene_state->notification_sequence_badkb);
|
||||
if(scene_state->notification_sequence_badusb != NULL) {
|
||||
free(scene_state->notification_sequence_badusb);
|
||||
}
|
||||
|
||||
free(scene_state);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "ui_controls.h"
|
||||
#include <Authenticator_icons.h>
|
||||
#include <totp_icons.h>
|
||||
#include "constants.h"
|
||||
|
||||
#define TEXT_BOX_HEIGHT 13
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App(
|
||||
appid="Weather_Station",
|
||||
appid="weather_station",
|
||||
name="Weather Station",
|
||||
apptype=FlipperAppType.PLUGIN,
|
||||
targets=["f7"],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "weather_station_receiver.h"
|
||||
#include "../weather_station_app_i.h"
|
||||
#include <Weather_Station_icons.h>
|
||||
#include <weather_station_icons.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <input/input.h>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "weather_station_receiver.h"
|
||||
#include "../weather_station_app_i.h"
|
||||
#include "Weather_Station_icons.h"
|
||||
#include "weather_station_icons.h"
|
||||
#include "../protocols/ws_generic.h"
|
||||
#include <input/input.h>
|
||||
#include <gui/elements.h>
|
||||
|
||||
@@ -92,6 +92,9 @@ void wifi_marauder_app_free(WifiMarauderApp* app) {
|
||||
|
||||
int32_t wifi_marauder_app(void* p) {
|
||||
UNUSED(p);
|
||||
furi_hal_power_enable_otg();
|
||||
furi_delay_ms(300);
|
||||
|
||||
WifiMarauderApp* wifi_marauder_app = wifi_marauder_app_alloc();
|
||||
|
||||
wifi_marauder_app->uart = wifi_marauder_uart_init(wifi_marauder_app);
|
||||
@@ -100,5 +103,7 @@ int32_t wifi_marauder_app(void* p) {
|
||||
|
||||
wifi_marauder_app_free(wifi_marauder_app);
|
||||
|
||||
furi_hal_power_disable_otg();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||