mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2025-12-12 04:34:43 +04:00
Merge branch 'ofw_dev' into nfcrefactoring
This commit is contained in:
34
SConstruct
34
SConstruct
@@ -67,22 +67,22 @@ if GetOption("fullenv") or any(
|
|||||||
# Target for self-update package
|
# Target for self-update package
|
||||||
dist_basic_arguments = [
|
dist_basic_arguments = [
|
||||||
"--bundlever",
|
"--bundlever",
|
||||||
'"${UPDATE_VERSION_STRING}"',
|
"${UPDATE_VERSION_STRING}",
|
||||||
]
|
]
|
||||||
dist_radio_arguments = [
|
dist_radio_arguments = [
|
||||||
"--radio",
|
"--radio",
|
||||||
'"${ROOT_DIR.abspath}/${COPRO_STACK_BIN_DIR}/${COPRO_STACK_BIN}"',
|
"${ROOT_DIR.abspath}/${COPRO_STACK_BIN_DIR}/${COPRO_STACK_BIN}",
|
||||||
"--radiotype",
|
"--radiotype",
|
||||||
"${COPRO_STACK_TYPE}",
|
"${COPRO_STACK_TYPE}",
|
||||||
"${COPRO_DISCLAIMER}",
|
"${COPRO_DISCLAIMER}",
|
||||||
"--obdata",
|
"--obdata",
|
||||||
'"${ROOT_DIR.abspath}/${COPRO_OB_DATA}"',
|
"${ROOT_DIR.abspath}/${COPRO_OB_DATA}",
|
||||||
"--stackversion",
|
"--stackversion",
|
||||||
"${COPRO_CUBE_VERSION}",
|
"${COPRO_CUBE_VERSION}",
|
||||||
]
|
]
|
||||||
dist_resource_arguments = [
|
dist_resource_arguments = [
|
||||||
"-r",
|
"-r",
|
||||||
'"${ROOT_DIR.abspath}/assets/resources"',
|
firmware_env.subst("${RESOURCES_ROOT}"),
|
||||||
]
|
]
|
||||||
dist_splash_arguments = (
|
dist_splash_arguments = (
|
||||||
[
|
[
|
||||||
@@ -95,7 +95,7 @@ if GetOption("fullenv") or any(
|
|||||||
|
|
||||||
selfupdate_dist = distenv.DistCommand(
|
selfupdate_dist = distenv.DistCommand(
|
||||||
"updater_package",
|
"updater_package",
|
||||||
(distenv["DIST_DEPENDS"], firmware_env["FW_RESOURCES"]),
|
(distenv["DIST_DEPENDS"], firmware_env["FW_RESOURCES_MANIFEST"]),
|
||||||
DIST_EXTRA=[
|
DIST_EXTRA=[
|
||||||
*dist_basic_arguments,
|
*dist_basic_arguments,
|
||||||
*dist_radio_arguments,
|
*dist_radio_arguments,
|
||||||
@@ -128,7 +128,8 @@ if GetOption("fullenv") or any(
|
|||||||
|
|
||||||
# Installation over USB & CLI
|
# Installation over USB & CLI
|
||||||
usb_update_package = distenv.AddUsbFlashTarget(
|
usb_update_package = distenv.AddUsbFlashTarget(
|
||||||
"#build/usbinstall.flag", (firmware_env["FW_RESOURCES"], selfupdate_dist)
|
"#build/usbinstall.flag",
|
||||||
|
(firmware_env["FW_RESOURCES_MANIFEST"], selfupdate_dist),
|
||||||
)
|
)
|
||||||
distenv.Alias("flash_usb_full", usb_update_package)
|
distenv.Alias("flash_usb_full", usb_update_package)
|
||||||
|
|
||||||
@@ -166,16 +167,23 @@ Depends(
|
|||||||
list(app_artifact.validator for app_artifact in external_app_list),
|
list(app_artifact.validator for app_artifact in external_app_list),
|
||||||
)
|
)
|
||||||
Alias("fap_dist", fap_dist)
|
Alias("fap_dist", fap_dist)
|
||||||
# distenv.Default(fap_dist)
|
|
||||||
|
|
||||||
distenv.Depends(firmware_env["FW_RESOURCES"], external_apps_artifacts.resources_dist)
|
|
||||||
|
|
||||||
# Copy all faps to device
|
# Copy all faps to device
|
||||||
|
|
||||||
fap_deploy = distenv.PhonyTarget(
|
fap_deploy = distenv.PhonyTarget(
|
||||||
"fap_deploy",
|
"fap_deploy",
|
||||||
"${PYTHON3} ${FBT_SCRIPT_DIR}/storage.py -p ${FLIP_PORT} send ${SOURCE} /ext/apps",
|
[
|
||||||
source=Dir("#/assets/resources/apps"),
|
[
|
||||||
|
"${PYTHON3}",
|
||||||
|
"${FBT_SCRIPT_DIR}/storage.py",
|
||||||
|
"-p",
|
||||||
|
"${FLIP_PORT}",
|
||||||
|
"send",
|
||||||
|
"${SOURCE}",
|
||||||
|
"/ext/apps",
|
||||||
|
]
|
||||||
|
],
|
||||||
|
source=firmware_env.Dir(("${RESOURCES_ROOT}/apps")),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -314,9 +322,7 @@ distenv.PhonyTarget(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Start Flipper CLI via PySerial's miniterm
|
# Start Flipper CLI via PySerial's miniterm
|
||||||
distenv.PhonyTarget(
|
distenv.PhonyTarget("cli", "${PYTHON3} ${FBT_SCRIPT_DIR}/serial_cli.py -p ${FLIP_PORT}")
|
||||||
"cli", "${PYTHON3} ${FBT_SCRIPT_DIR}/serial_cli.py -p ${FLIP_PORT}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Update WiFi devboard firmware
|
# Update WiFi devboard firmware
|
||||||
distenv.PhonyTarget("devboard_flash", "${PYTHON3} ${FBT_SCRIPT_DIR}/wifi_board.py")
|
distenv.PhonyTarget("devboard_flash", "${PYTHON3} ${FBT_SCRIPT_DIR}/wifi_board.py")
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ static void direct_draw_run(DirectDraw* instance) {
|
|||||||
size_t counter = 0;
|
size_t counter = 0;
|
||||||
float fps = 0;
|
float fps = 0;
|
||||||
|
|
||||||
vTaskPrioritySet(furi_thread_get_current_id(), FuriThreadPriorityIdle);
|
furi_thread_set_current_priority(FuriThreadPriorityIdle);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
size_t elapsed = DWT->CYCCNT - start;
|
size_t elapsed = DWT->CYCCNT - start;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ App(
|
|||||||
cdefines=["APP_UNIT_TESTS"],
|
cdefines=["APP_UNIT_TESTS"],
|
||||||
requires=["system_settings"],
|
requires=["system_settings"],
|
||||||
provides=["delay_test"],
|
provides=["delay_test"],
|
||||||
|
resources="resources",
|
||||||
order=100,
|
order=100,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ void bt_test_alloc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void bt_test_free() {
|
void bt_test_free() {
|
||||||
furi_assert(bt_test);
|
furi_check(bt_test);
|
||||||
free(bt_test->nvm_ram_buff_ref);
|
free(bt_test->nvm_ram_buff_ref);
|
||||||
free(bt_test->nvm_ram_buff_dut);
|
free(bt_test->nvm_ram_buff_dut);
|
||||||
bt_keys_storage_free(bt_test->bt_keys_storage);
|
bt_keys_storage_free(bt_test->bt_keys_storage);
|
||||||
@@ -89,7 +89,7 @@ static void bt_test_keys_remove_test_file() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MU_TEST(bt_test_keys_storage_serial_profile) {
|
MU_TEST(bt_test_keys_storage_serial_profile) {
|
||||||
furi_assert(bt_test);
|
furi_check(bt_test);
|
||||||
|
|
||||||
bt_test_keys_remove_test_file();
|
bt_test_keys_remove_test_file();
|
||||||
bt_test_keys_storage_profile();
|
bt_test_keys_storage_profile();
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ static void infrared_test_alloc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void infrared_test_free() {
|
static void infrared_test_free() {
|
||||||
furi_assert(test);
|
furi_check(test);
|
||||||
infrared_free_decoder(test->decoder_handler);
|
infrared_free_decoder(test->decoder_handler);
|
||||||
infrared_free_encoder(test->encoder_handler);
|
infrared_free_encoder(test->encoder_handler);
|
||||||
flipper_format_free(test->ff);
|
flipper_format_free(test->ff);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ MU_TEST(manifest_iteration_test) {
|
|||||||
ResourceManifestReader* manifest_reader = resource_manifest_reader_alloc(storage);
|
ResourceManifestReader* manifest_reader = resource_manifest_reader_alloc(storage);
|
||||||
do {
|
do {
|
||||||
// Open manifest file
|
// Open manifest file
|
||||||
if(!resource_manifest_reader_open(manifest_reader, EXT_PATH("unit_tests/Manifest"))) {
|
if(!resource_manifest_reader_open(manifest_reader, EXT_PATH("unit_tests/Manifest_test"))) {
|
||||||
result = false;
|
result = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ static void nfc_test_alloc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void nfc_test_free() {
|
static void nfc_test_free() {
|
||||||
furi_assert(nfc_test);
|
furi_check(nfc_test);
|
||||||
|
|
||||||
furi_record_close(RECORD_STORAGE);
|
furi_record_close(RECORD_STORAGE);
|
||||||
free(nfc_test);
|
free(nfc_test);
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ Nfc* nfc_alloc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nfc_free(Nfc* instance) {
|
void nfc_free(Nfc* instance) {
|
||||||
furi_assert(instance);
|
furi_check(instance);
|
||||||
|
|
||||||
free(instance);
|
free(instance);
|
||||||
}
|
}
|
||||||
@@ -165,9 +165,9 @@ NfcError nfc_iso14443a_listener_set_col_res_data(
|
|||||||
uint8_t uid_len,
|
uint8_t uid_len,
|
||||||
uint8_t* atqa,
|
uint8_t* atqa,
|
||||||
uint8_t sak) {
|
uint8_t sak) {
|
||||||
furi_assert(instance);
|
furi_check(instance);
|
||||||
furi_assert(uid);
|
furi_check(uid);
|
||||||
furi_assert(atqa);
|
furi_check(atqa);
|
||||||
|
|
||||||
nfc_prepare_col_res_data(instance, uid, uid_len, atqa, sak);
|
nfc_prepare_col_res_data(instance, uid, uid_len, atqa, sak);
|
||||||
|
|
||||||
@@ -176,7 +176,7 @@ NfcError nfc_iso14443a_listener_set_col_res_data(
|
|||||||
|
|
||||||
static int32_t nfc_worker_poller(void* context) {
|
static int32_t nfc_worker_poller(void* context) {
|
||||||
Nfc* instance = context;
|
Nfc* instance = context;
|
||||||
furi_assert(instance->callback);
|
furi_check(instance->callback);
|
||||||
|
|
||||||
instance->state = NfcStateReady;
|
instance->state = NfcStateReady;
|
||||||
NfcCommand command = NfcCommandContinue;
|
NfcCommand command = NfcCommandContinue;
|
||||||
@@ -196,7 +196,7 @@ static int32_t nfc_worker_poller(void* context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void nfc_worker_listener_pass_col_res(Nfc* instance, uint8_t* rx_data, uint16_t rx_bits) {
|
static void nfc_worker_listener_pass_col_res(Nfc* instance, uint8_t* rx_data, uint16_t rx_bits) {
|
||||||
furi_assert(instance->col_res_status != Iso14443_3aColResStatusDone);
|
furi_check(instance->col_res_status != Iso14443_3aColResStatusDone);
|
||||||
BitBuffer* tx_buffer = bit_buffer_alloc(NFC_MAX_BUFFER_SIZE);
|
BitBuffer* tx_buffer = bit_buffer_alloc(NFC_MAX_BUFFER_SIZE);
|
||||||
|
|
||||||
bool processed = false;
|
bool processed = false;
|
||||||
@@ -255,7 +255,7 @@ static void nfc_worker_listener_pass_col_res(Nfc* instance, uint8_t* rx_data, ui
|
|||||||
|
|
||||||
static int32_t nfc_worker_listener(void* context) {
|
static int32_t nfc_worker_listener(void* context) {
|
||||||
Nfc* instance = context;
|
Nfc* instance = context;
|
||||||
furi_assert(instance->callback);
|
furi_check(instance->callback);
|
||||||
|
|
||||||
NfcMessage message = {};
|
NfcMessage message = {};
|
||||||
|
|
||||||
@@ -295,17 +295,17 @@ static int32_t nfc_worker_listener(void* context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nfc_start(Nfc* instance, NfcEventCallback callback, void* context) {
|
void nfc_start(Nfc* instance, NfcEventCallback callback, void* context) {
|
||||||
furi_assert(instance);
|
furi_check(instance);
|
||||||
furi_assert(instance->worker_thread == NULL);
|
furi_check(instance->worker_thread == NULL);
|
||||||
|
|
||||||
if(instance->mode == NfcModeListener) {
|
if(instance->mode == NfcModeListener) {
|
||||||
furi_assert(listener_queue == NULL);
|
furi_check(listener_queue == NULL);
|
||||||
// Check that poller didn't start
|
// Check that poller didn't start
|
||||||
furi_assert(poller_queue == NULL);
|
furi_check(poller_queue == NULL);
|
||||||
} else {
|
} else {
|
||||||
furi_assert(poller_queue == NULL);
|
furi_check(poller_queue == NULL);
|
||||||
// Check that poller is started after listener
|
// Check that poller is started after listener
|
||||||
furi_assert(listener_queue);
|
furi_check(listener_queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance->callback = callback;
|
instance->callback = callback;
|
||||||
@@ -334,8 +334,8 @@ void nfc_start(Nfc* instance, NfcEventCallback callback, void* context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nfc_stop(Nfc* instance) {
|
void nfc_stop(Nfc* instance) {
|
||||||
furi_assert(instance);
|
furi_check(instance);
|
||||||
furi_assert(instance->worker_thread);
|
furi_check(instance->worker_thread);
|
||||||
|
|
||||||
if(instance->mode == NfcModeListener) {
|
if(instance->mode == NfcModeListener) {
|
||||||
NfcMessage message = {.type = NfcMessageTypeAbort};
|
NfcMessage message = {.type = NfcMessageTypeAbort};
|
||||||
@@ -361,10 +361,10 @@ void nfc_stop(Nfc* instance) {
|
|||||||
// Called from worker thread
|
// Called from worker thread
|
||||||
|
|
||||||
NfcError nfc_listener_tx(Nfc* instance, const BitBuffer* tx_buffer) {
|
NfcError nfc_listener_tx(Nfc* instance, const BitBuffer* tx_buffer) {
|
||||||
furi_assert(instance);
|
furi_check(instance);
|
||||||
furi_assert(poller_queue);
|
furi_check(poller_queue);
|
||||||
furi_assert(listener_queue);
|
furi_check(listener_queue);
|
||||||
furi_assert(tx_buffer);
|
furi_check(tx_buffer);
|
||||||
|
|
||||||
NfcMessage message = {};
|
NfcMessage message = {};
|
||||||
message.type = NfcMessageTypeTx;
|
message.type = NfcMessageTypeTx;
|
||||||
@@ -382,11 +382,11 @@ NfcError nfc_iso14443a_listener_tx_custom_parity(Nfc* instance, const BitBuffer*
|
|||||||
|
|
||||||
NfcError
|
NfcError
|
||||||
nfc_poller_trx(Nfc* instance, const BitBuffer* tx_buffer, BitBuffer* rx_buffer, uint32_t fwt) {
|
nfc_poller_trx(Nfc* instance, const BitBuffer* tx_buffer, BitBuffer* rx_buffer, uint32_t fwt) {
|
||||||
furi_assert(instance);
|
furi_check(instance);
|
||||||
furi_assert(tx_buffer);
|
furi_check(tx_buffer);
|
||||||
furi_assert(rx_buffer);
|
furi_check(rx_buffer);
|
||||||
furi_assert(poller_queue);
|
furi_check(poller_queue);
|
||||||
furi_assert(listener_queue);
|
furi_check(listener_queue);
|
||||||
UNUSED(fwt);
|
UNUSED(fwt);
|
||||||
|
|
||||||
NfcError error = NfcErrorNone;
|
NfcError error = NfcErrorNone;
|
||||||
@@ -396,7 +396,7 @@ NfcError
|
|||||||
message.data.data_bits = bit_buffer_get_size(tx_buffer);
|
message.data.data_bits = bit_buffer_get_size(tx_buffer);
|
||||||
bit_buffer_write_bytes(tx_buffer, message.data.data, bit_buffer_get_size_bytes(tx_buffer));
|
bit_buffer_write_bytes(tx_buffer, message.data.data, bit_buffer_get_size_bytes(tx_buffer));
|
||||||
// Tx
|
// Tx
|
||||||
furi_assert(furi_message_queue_put(listener_queue, &message, FuriWaitForever) == FuriStatusOk);
|
furi_check(furi_message_queue_put(listener_queue, &message, FuriWaitForever) == FuriStatusOk);
|
||||||
// Rx
|
// Rx
|
||||||
FuriStatus status = furi_message_queue_get(poller_queue, &message, 50);
|
FuriStatus status = furi_message_queue_get(poller_queue, &message, 50);
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
#include <cli/cli.h>
|
#include <cli/cli.h>
|
||||||
#include <loader/loader.h>
|
#include <loader/loader.h>
|
||||||
#include <protobuf_version.h>
|
#include <protobuf_version.h>
|
||||||
|
|
||||||
|
#include <FreeRTOS.h>
|
||||||
#include <semphr.h>
|
#include <semphr.h>
|
||||||
|
|
||||||
LIST_DEF(MsgList, PB_Main, M_POD_OPLIST)
|
LIST_DEF(MsgList, PB_Main, M_POD_OPLIST)
|
||||||
@@ -36,7 +38,7 @@ typedef struct {
|
|||||||
FuriStreamBuffer* output_stream;
|
FuriStreamBuffer* output_stream;
|
||||||
SemaphoreHandle_t close_session_semaphore;
|
SemaphoreHandle_t close_session_semaphore;
|
||||||
SemaphoreHandle_t terminate_semaphore;
|
SemaphoreHandle_t terminate_semaphore;
|
||||||
TickType_t timeout;
|
uint32_t timeout;
|
||||||
} RpcSessionContext;
|
} RpcSessionContext;
|
||||||
|
|
||||||
static RpcSessionContext rpc_session[TEST_RPC_SESSIONS];
|
static RpcSessionContext rpc_session[TEST_RPC_SESSIONS];
|
||||||
@@ -544,7 +546,7 @@ static bool test_rpc_pb_stream_read(pb_istream_t* istream, pb_byte_t* buf, size_
|
|||||||
RpcSessionContext* session_context = istream->state;
|
RpcSessionContext* session_context = istream->state;
|
||||||
size_t bytes_received = 0;
|
size_t bytes_received = 0;
|
||||||
|
|
||||||
TickType_t now = xTaskGetTickCount();
|
uint32_t now = furi_get_tick();
|
||||||
int32_t time_left = session_context->timeout - now;
|
int32_t time_left = session_context->timeout - now;
|
||||||
time_left = MAX(time_left, 0);
|
time_left = MAX(time_left, 0);
|
||||||
bytes_received =
|
bytes_received =
|
||||||
@@ -688,7 +690,7 @@ static void test_rpc_decode_and_compare(MsgList_t expected_msg_list, uint8_t ses
|
|||||||
furi_check(!MsgList_empty_p(expected_msg_list));
|
furi_check(!MsgList_empty_p(expected_msg_list));
|
||||||
furi_check(session < TEST_RPC_SESSIONS);
|
furi_check(session < TEST_RPC_SESSIONS);
|
||||||
|
|
||||||
rpc_session[session].timeout = xTaskGetTickCount() + MAX_RECEIVE_OUTPUT_TIMEOUT;
|
rpc_session[session].timeout = furi_get_tick() + MAX_RECEIVE_OUTPUT_TIMEOUT;
|
||||||
pb_istream_t istream = {
|
pb_istream_t istream = {
|
||||||
.callback = test_rpc_pb_stream_read,
|
.callback = test_rpc_pb_stream_read,
|
||||||
.state = &rpc_session[session],
|
.state = &rpc_session[session],
|
||||||
@@ -712,7 +714,7 @@ static void test_rpc_decode_and_compare(MsgList_t expected_msg_list, uint8_t ses
|
|||||||
pb_release(&PB_Main_msg, &result);
|
pb_release(&PB_Main_msg, &result);
|
||||||
}
|
}
|
||||||
|
|
||||||
rpc_session[session].timeout = xTaskGetTickCount() + 50;
|
rpc_session[session].timeout = furi_get_tick() + 50;
|
||||||
if(pb_decode_ex(&istream, &PB_Main_msg, &result, PB_DECODE_DELIMITED)) {
|
if(pb_decode_ex(&istream, &PB_Main_msg, &result, PB_DECODE_DELIMITED)) {
|
||||||
mu_fail("decoded more than expected");
|
mu_fail("decoded more than expected");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ const UnitTest unit_tests[] = {
|
|||||||
void minunit_print_progress() {
|
void minunit_print_progress() {
|
||||||
static const char progress[] = {'\\', '|', '/', '-'};
|
static const char progress[] = {'\\', '|', '/', '-'};
|
||||||
static uint8_t progress_counter = 0;
|
static uint8_t progress_counter = 0;
|
||||||
static TickType_t last_tick = 0;
|
static uint32_t last_tick = 0;
|
||||||
TickType_t current_tick = xTaskGetTickCount();
|
uint32_t current_tick = furi_get_tick();
|
||||||
if(current_tick - last_tick > 20) {
|
if(current_tick - last_tick > 20) {
|
||||||
last_tick = current_tick;
|
last_tick = current_tick;
|
||||||
printf("[%c]\033[3D", progress[++progress_counter % COUNT_OF(progress)]);
|
printf("[%c]\033[3D", progress[++progress_counter % COUNT_OF(progress)]);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ App(
|
|||||||
entry_point="example_plugins_app",
|
entry_point="example_plugins_app",
|
||||||
stack_size=2 * 1024,
|
stack_size=2 * 1024,
|
||||||
fap_category="Examples",
|
fap_category="Examples",
|
||||||
|
sources=["*.c", "!plugin*.c"],
|
||||||
)
|
)
|
||||||
|
|
||||||
App(
|
App(
|
||||||
@@ -21,6 +22,7 @@ App(
|
|||||||
apptype=FlipperAppType.PLUGIN,
|
apptype=FlipperAppType.PLUGIN,
|
||||||
entry_point="example_plugin1_ep",
|
entry_point="example_plugin1_ep",
|
||||||
requires=["example_plugins", "example_plugins_multi"],
|
requires=["example_plugins", "example_plugins_multi"],
|
||||||
|
sources=["plugin1.c"],
|
||||||
)
|
)
|
||||||
|
|
||||||
App(
|
App(
|
||||||
@@ -28,4 +30,5 @@ App(
|
|||||||
apptype=FlipperAppType.PLUGIN,
|
apptype=FlipperAppType.PLUGIN,
|
||||||
entry_point="example_plugin2_ep",
|
entry_point="example_plugin2_ep",
|
||||||
requires=["example_plugins_multi"],
|
requires=["example_plugins_multi"],
|
||||||
|
sources=["plugin2.c"],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ App(
|
|||||||
entry_point="example_advanced_plugins_app",
|
entry_point="example_advanced_plugins_app",
|
||||||
stack_size=2 * 1024,
|
stack_size=2 * 1024,
|
||||||
fap_category="Examples",
|
fap_category="Examples",
|
||||||
|
sources=["*.c*", "!plugin*.c"],
|
||||||
)
|
)
|
||||||
|
|
||||||
App(
|
App(
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ App(
|
|||||||
stack_size=2 * 1024,
|
stack_size=2 * 1024,
|
||||||
icon="A_BadUsb_14",
|
icon="A_BadUsb_14",
|
||||||
order=70,
|
order=70,
|
||||||
|
resources="resources",
|
||||||
fap_libs=["assets"],
|
fap_libs=["assets"],
|
||||||
fap_icon="icon.png",
|
fap_icon="icon.png",
|
||||||
fap_category="USB",
|
fap_category="USB",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user