Decouple apps to allow smaller builds. Loader deadlock fix and refactoring. (#929)
* Lib: always include rfal * Gui: remove screen_stream * Input: decouple from Cli * Loader: decouple from Cli * Desktop: ignore missing favorite app, decouple from Archive * Make: make Notification a Gui dependency * Make: embed debugging information into elfs * Loader: hide Plugins submenu when plugins ga arimasen * Applications: update on start hook usage * Loader: fix dead lock on menu rebuild with open rpc, new cli command. Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
parent
7cea359be8
commit
46a25c295c
@ -48,16 +48,16 @@ extern int32_t music_player_app(void* p);
|
|||||||
extern int32_t snake_game_app(void* p);
|
extern int32_t snake_game_app(void* p);
|
||||||
|
|
||||||
// On system start hooks declaration
|
// On system start hooks declaration
|
||||||
extern void bt_cli_init();
|
extern void bt_on_system_start();
|
||||||
extern void crypto_cli_init();
|
extern void crypto_on_system_start();
|
||||||
extern void ibutton_cli_init();
|
extern void ibutton_on_system_start();
|
||||||
extern void irda_cli_init();
|
extern void irda_on_system_start();
|
||||||
extern void lfrfid_cli_init();
|
extern void lfrfid_on_system_start();
|
||||||
extern void nfc_cli_init();
|
extern void nfc_on_system_start();
|
||||||
extern void storage_cli_init();
|
extern void storage_on_system_start();
|
||||||
extern void subghz_cli_init();
|
extern void subghz_on_system_start();
|
||||||
extern void power_cli_init();
|
extern void power_on_system_start();
|
||||||
extern void unit_tests_cli_init();
|
extern void unit_tests_on_system_start();
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
extern int32_t notification_settings_app(void* p);
|
extern int32_t notification_settings_app(void* p);
|
||||||
@ -166,44 +166,42 @@ const size_t FLIPPER_APPS_COUNT = sizeof(FLIPPER_APPS) / sizeof(FlipperApplicati
|
|||||||
|
|
||||||
// On system start hooks
|
// On system start hooks
|
||||||
const FlipperOnStartHook FLIPPER_ON_SYSTEM_START[] = {
|
const FlipperOnStartHook FLIPPER_ON_SYSTEM_START[] = {
|
||||||
#ifdef SRV_CLI
|
crypto_on_system_start,
|
||||||
crypto_cli_init,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef APP_IRDA
|
#ifdef APP_IRDA
|
||||||
irda_cli_init,
|
irda_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APP_NFC
|
#ifdef APP_NFC
|
||||||
nfc_cli_init,
|
nfc_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APP_SUBGHZ
|
#ifdef APP_SUBGHZ
|
||||||
subghz_cli_init,
|
subghz_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APP_LF_RFID
|
#ifdef APP_LF_RFID
|
||||||
lfrfid_cli_init,
|
lfrfid_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APP_IBUTTON
|
#ifdef APP_IBUTTON
|
||||||
ibutton_cli_init,
|
ibutton_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SRV_BT
|
#ifdef SRV_BT
|
||||||
bt_cli_init,
|
bt_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SRV_POWER
|
#ifdef SRV_POWER
|
||||||
power_cli_init,
|
power_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SRV_STORAGE
|
#ifdef SRV_STORAGE
|
||||||
storage_cli_init,
|
storage_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APP_UNIT_TESTS
|
#ifdef APP_UNIT_TESTS
|
||||||
unit_tests_cli_init,
|
unit_tests_on_system_start,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -298,6 +298,7 @@ SRV_GUI ?= 0
|
|||||||
ifeq ($(SRV_GUI), 1)
|
ifeq ($(SRV_GUI), 1)
|
||||||
CFLAGS += -DSRV_GUI
|
CFLAGS += -DSRV_GUI
|
||||||
SRV_INPUT = 1
|
SRV_INPUT = 1
|
||||||
|
SRV_NOTIFICATION = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
#include <furi-hal.h>
|
#include <furi-hal.h>
|
||||||
#include "bt_settings.h"
|
#include "bt_settings.h"
|
||||||
|
|
||||||
void bt_cli_init() {
|
void bt_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = furi_record_open("cli");
|
Cli* cli = furi_record_open("cli");
|
||||||
|
|
||||||
cli_add_command(cli, "bt_info", CliCommandFlagDefault, bt_cli_command_info, NULL);
|
cli_add_command(cli, "bt_info", CliCommandFlagDefault, bt_cli_command_info, NULL);
|
||||||
@ -13,6 +14,7 @@ void bt_cli_init() {
|
|||||||
cli_add_command(cli, "bt_rx_pt", CliCommandFlagDefault, bt_cli_command_packet_rx, NULL);
|
cli_add_command(cli, "bt_rx_pt", CliCommandFlagDefault, bt_cli_command_packet_rx, NULL);
|
||||||
|
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_cli_command_info(Cli* cli, string_t args, void* context) {
|
void bt_cli_command_info(Cli* cli, string_t args, void* context) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <cli/cli.h>
|
#include <cli/cli.h>
|
||||||
|
|
||||||
void bt_cli_init();
|
void bt_on_system_start();
|
||||||
|
|
||||||
void bt_cli_command_info(Cli* cli, string_t args, void* context);
|
void bt_cli_command_info(Cli* cli, string_t args, void* context);
|
||||||
|
|
||||||
|
@ -312,8 +312,10 @@ void crypto_cli(Cli* cli, string_t args, void* context) {
|
|||||||
string_clear(cmd);
|
string_clear(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void crypto_cli_init() {
|
void crypto_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = furi_record_open("cli");
|
Cli* cli = furi_record_open("cli");
|
||||||
cli_add_command(cli, "crypto", CliCommandFlagDefault, crypto_cli, NULL);
|
cli_add_command(cli, "crypto", CliCommandFlagDefault, crypto_cli, NULL);
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -83,13 +83,19 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DesktopMainEventOpenArchive:
|
case DesktopMainEventOpenArchive:
|
||||||
|
#ifdef APP_ARCHIVE
|
||||||
desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE);
|
desktop_switch_to_app(desktop, &FLIPPER_ARCHIVE);
|
||||||
|
#endif
|
||||||
consumed = true;
|
consumed = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DesktopMainEventOpenFavorite:
|
case DesktopMainEventOpenFavorite:
|
||||||
LOAD_DESKTOP_SETTINGS(&desktop->settings);
|
LOAD_DESKTOP_SETTINGS(&desktop->settings);
|
||||||
|
if(desktop->settings.favorite) {
|
||||||
desktop_switch_to_app(desktop, &FLIPPER_APPS[desktop->settings.favorite]);
|
desktop_switch_to_app(desktop, &FLIPPER_APPS[desktop->settings.favorite]);
|
||||||
|
} else {
|
||||||
|
FURI_LOG_E("DesktopSrv", "Can't find favorite application");
|
||||||
|
}
|
||||||
consumed = true;
|
consumed = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -254,43 +254,6 @@ void gui_unlock(Gui* gui) {
|
|||||||
furi_check(osMutexRelease(gui->mutex) == osOK);
|
furi_check(osMutexRelease(gui->mutex) == osOK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gui_cli_screen_stream_callback(uint8_t* data, size_t size, void* context) {
|
|
||||||
furi_assert(data);
|
|
||||||
furi_assert(size == 1024);
|
|
||||||
furi_assert(context);
|
|
||||||
|
|
||||||
Gui* gui = context;
|
|
||||||
const uint8_t magic[] = {0xF0, 0xE1, 0xD2, 0xC3};
|
|
||||||
cli_write(gui->cli, magic, sizeof(magic));
|
|
||||||
cli_write(gui->cli, data, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void gui_cli_screen_stream(Cli* cli, string_t args, void* context) {
|
|
||||||
furi_assert(context);
|
|
||||||
Gui* gui = context;
|
|
||||||
gui_set_framebuffer_callback(gui, gui_cli_screen_stream_callback, gui);
|
|
||||||
gui_redraw(gui);
|
|
||||||
|
|
||||||
// Wait for control events
|
|
||||||
while(true) {
|
|
||||||
char c = cli_getc(gui->cli);
|
|
||||||
if(c == CliSymbolAsciiEsc) {
|
|
||||||
c = cli_getc(gui->cli);
|
|
||||||
if(c == 'i') {
|
|
||||||
InputEvent input_event;
|
|
||||||
input_event.key = cli_getc(gui->cli);
|
|
||||||
input_event.type = cli_getc(gui->cli);
|
|
||||||
osMessageQueuePut(gui->input_queue, &input_event, 0, osWaitForever);
|
|
||||||
osThreadFlagsSet(gui->thread, GUI_THREAD_FLAG_INPUT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gui_set_framebuffer_callback(gui, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void gui_add_view_port(Gui* gui, ViewPort* view_port, GuiLayer layer) {
|
void gui_add_view_port(Gui* gui, ViewPort* view_port, GuiLayer layer) {
|
||||||
furi_assert(gui);
|
furi_assert(gui);
|
||||||
furi_assert(view_port);
|
furi_assert(view_port);
|
||||||
@ -401,6 +364,10 @@ void gui_set_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback, vo
|
|||||||
gui->canvas_callback = callback;
|
gui->canvas_callback = callback;
|
||||||
gui->canvas_callback_context = context;
|
gui->canvas_callback_context = context;
|
||||||
gui_unlock(gui);
|
gui_unlock(gui);
|
||||||
|
|
||||||
|
if(callback != NULL) {
|
||||||
|
gui_redraw(gui);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Gui* gui_alloc() {
|
Gui* gui_alloc() {
|
||||||
@ -421,10 +388,6 @@ Gui* gui_alloc() {
|
|||||||
gui->input_events = furi_record_open("input_events");
|
gui->input_events = furi_record_open("input_events");
|
||||||
furi_check(gui->input_events);
|
furi_check(gui->input_events);
|
||||||
furi_pubsub_subscribe(gui->input_events, gui_input_events_callback, gui);
|
furi_pubsub_subscribe(gui->input_events, gui_input_events_callback, gui);
|
||||||
// Cli
|
|
||||||
gui->cli = furi_record_open("cli");
|
|
||||||
cli_add_command(
|
|
||||||
gui->cli, "screen_stream", CliCommandFlagParallelSafe, gui_cli_screen_stream, gui);
|
|
||||||
|
|
||||||
return gui;
|
return gui;
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
#include <m-array.h>
|
#include <m-array.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <cli/cli.h>
|
|
||||||
#include "canvas.h"
|
#include "canvas.h"
|
||||||
#include "canvas_i.h"
|
#include "canvas_i.h"
|
||||||
#include "view_port.h"
|
#include "view_port.h"
|
||||||
@ -60,9 +59,6 @@ struct Gui {
|
|||||||
FuriPubSub* input_events;
|
FuriPubSub* input_events;
|
||||||
uint8_t ongoing_input;
|
uint8_t ongoing_input;
|
||||||
ViewPort* ongoing_input_view_port;
|
ViewPort* ongoing_input_view_port;
|
||||||
|
|
||||||
// Cli
|
|
||||||
Cli* cli;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ViewPort* gui_view_port_find_enabled(ViewPortArray_t array);
|
ViewPort* gui_view_port_find_enabled(ViewPortArray_t array);
|
||||||
@ -78,7 +74,3 @@ void gui_input_events_callback(const void* value, void* ctx);
|
|||||||
void gui_lock(Gui* gui);
|
void gui_lock(Gui* gui);
|
||||||
|
|
||||||
void gui_unlock(Gui* gui);
|
void gui_unlock(Gui* gui);
|
||||||
|
|
||||||
void gui_cli_screen_stream_callback(uint8_t* data, size_t size, void* context);
|
|
||||||
|
|
||||||
void gui_cli_screen_stream(Cli* cli, string_t args, void* context);
|
|
||||||
|
@ -13,11 +13,13 @@ void ibutton_cli(Cli* cli, string_t args, void* context);
|
|||||||
void onewire_cli(Cli* cli, string_t args, void* context);
|
void onewire_cli(Cli* cli, string_t args, void* context);
|
||||||
|
|
||||||
// app cli function
|
// app cli function
|
||||||
extern "C" void ibutton_cli_init() {
|
extern "C" void ibutton_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = static_cast<Cli*>(furi_record_open("cli"));
|
Cli* cli = static_cast<Cli*>(furi_record_open("cli"));
|
||||||
cli_add_command(cli, "ikey", CliCommandFlagDefault, ibutton_cli, cli);
|
cli_add_command(cli, "ikey", CliCommandFlagDefault, ibutton_cli, cli);
|
||||||
cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli, cli);
|
cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli, cli);
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ibutton_cli_print_usage() {
|
void ibutton_cli_print_usage() {
|
||||||
|
@ -40,6 +40,7 @@ void input_isr(void* _ctx) {
|
|||||||
osThreadFlagsSet(input->thread, INPUT_THREAD_FLAG_ISR);
|
osThreadFlagsSet(input->thread, INPUT_THREAD_FLAG_ISR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SRV_CLI
|
||||||
void input_cli_send(Cli* cli, string_t args, void* context) {
|
void input_cli_send(Cli* cli, string_t args, void* context) {
|
||||||
InputEvent event;
|
InputEvent event;
|
||||||
|
|
||||||
@ -122,6 +123,7 @@ static void input_cli_dump(Cli* cli, string_t args, void* context) {
|
|||||||
furi_pubsub_unsubscribe(input->event_pubsub, input_subscription);
|
furi_pubsub_unsubscribe(input->event_pubsub, input_subscription);
|
||||||
osMessageQueueDelete(input_queue);
|
osMessageQueueDelete(input_queue);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
const char* input_get_key_name(InputKey key) {
|
const char* input_get_key_name(InputKey key) {
|
||||||
for(size_t i = 0; i < input_pins_count; i++) {
|
for(size_t i = 0; i < input_pins_count; i++) {
|
||||||
@ -154,6 +156,7 @@ int32_t input_srv() {
|
|||||||
input->event_pubsub = furi_pubsub_alloc();
|
input->event_pubsub = furi_pubsub_alloc();
|
||||||
furi_record_create("input_events", input->event_pubsub);
|
furi_record_create("input_events", input->event_pubsub);
|
||||||
|
|
||||||
|
#ifdef SRV_CLI
|
||||||
input->cli = furi_record_open("cli");
|
input->cli = furi_record_open("cli");
|
||||||
if(input->cli) {
|
if(input->cli) {
|
||||||
cli_add_command(
|
cli_add_command(
|
||||||
@ -161,6 +164,7 @@ int32_t input_srv() {
|
|||||||
cli_add_command(
|
cli_add_command(
|
||||||
input->cli, "input_dump", CliCommandFlagParallelSafe, input_cli_dump, NULL);
|
input->cli, "input_dump", CliCommandFlagParallelSafe, input_cli_dump, NULL);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
input->pin_states = furi_alloc(input_pins_count * sizeof(InputPinState));
|
input->pin_states = furi_alloc(input_pins_count * sizeof(InputPinState));
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ static void signal_received_callback(void* context, IrdaWorkerSignal* received_s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void irda_cli_start_ir_rx(Cli* cli, string_t args, void* context) {
|
void irda_cli_start_ir_rx(Cli* cli, string_t args, void* context) {
|
||||||
if(furi_hal_irda_is_busy()) {
|
if(furi_hal_irda_is_busy()) {
|
||||||
printf("IRDA is busy. Exit.");
|
printf("IRDA is busy. Exit.");
|
||||||
return;
|
return;
|
||||||
@ -170,7 +170,7 @@ static bool parse_signal_raw(
|
|||||||
return (parsed == 2) && (*timings_cnt > 0);
|
return (parsed == 2) && (*timings_cnt > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void irda_cli_start_ir_tx(Cli* cli, string_t args, void* context) {
|
void irda_cli_start_ir_tx(Cli* cli, string_t args, void* context) {
|
||||||
if(furi_hal_irda_is_busy()) {
|
if(furi_hal_irda_is_busy()) {
|
||||||
printf("IRDA is busy. Exit.");
|
printf("IRDA is busy. Exit.");
|
||||||
return;
|
return;
|
||||||
@ -195,9 +195,11 @@ static void irda_cli_start_ir_tx(Cli* cli, string_t args, void* context) {
|
|||||||
free(timings);
|
free(timings);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void irda_cli_init() {
|
extern "C" void irda_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = (Cli*)furi_record_open("cli");
|
Cli* cli = (Cli*)furi_record_open("cli");
|
||||||
cli_add_command(cli, "ir_rx", CliCommandFlagDefault, irda_cli_start_ir_rx, NULL);
|
cli_add_command(cli, "ir_rx", CliCommandFlagDefault, irda_cli_start_ir_rx, NULL);
|
||||||
cli_add_command(cli, "ir_tx", CliCommandFlagDefault, irda_cli_start_ir_tx, NULL);
|
cli_add_command(cli, "ir_tx", CliCommandFlagDefault, irda_cli_start_ir_tx, NULL);
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -10,10 +10,12 @@
|
|||||||
void lfrfid_cli(Cli* cli, string_t args, void* context);
|
void lfrfid_cli(Cli* cli, string_t args, void* context);
|
||||||
|
|
||||||
// app cli function
|
// app cli function
|
||||||
extern "C" void lfrfid_cli_init() {
|
extern "C" void lfrfid_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = static_cast<Cli*>(furi_record_open("cli"));
|
Cli* cli = static_cast<Cli*>(furi_record_open("cli"));
|
||||||
cli_add_command(cli, "rfid", CliCommandFlagDefault, lfrfid_cli, NULL);
|
cli_add_command(cli, "rfid", CliCommandFlagDefault, lfrfid_cli, NULL);
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void lfrfid_cli_print_usage() {
|
void lfrfid_cli_print_usage() {
|
||||||
|
@ -23,7 +23,7 @@ static void loader_menu_callback(void* _ctx, uint32_t index) {
|
|||||||
furi_hal_power_insomnia_enter();
|
furi_hal_power_insomnia_enter();
|
||||||
loader_instance->current_app = flipper_app;
|
loader_instance->current_app = flipper_app;
|
||||||
|
|
||||||
FURI_LOG_I(TAG, "Starting furi application: %s", loader_instance->current_app->name);
|
FURI_LOG_I(TAG, "Starting: %s", loader_instance->current_app->name);
|
||||||
furi_thread_set_name(loader_instance->thread, flipper_app->name);
|
furi_thread_set_name(loader_instance->thread, flipper_app->name);
|
||||||
furi_thread_set_stack_size(loader_instance->thread, flipper_app->stack_size);
|
furi_thread_set_stack_size(loader_instance->thread, flipper_app->stack_size);
|
||||||
furi_thread_set_context(loader_instance->thread, NULL);
|
furi_thread_set_context(loader_instance->thread, NULL);
|
||||||
@ -36,25 +36,115 @@ static void loader_submenu_callback(void* context, uint32_t index) {
|
|||||||
view_dispatcher_switch_to_view(loader_instance->view_dispatcher, view_id);
|
view_dispatcher_switch_to_view(loader_instance->view_dispatcher, view_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loader_cli_callback(Cli* cli, string_t args, void* _ctx) {
|
static void loader_cli_print_usage() {
|
||||||
furi_assert(_ctx);
|
printf("Usage:\r\n");
|
||||||
const FlipperApplication* flipper_app = (FlipperApplication*)_ctx;
|
printf("loader <cmd> <args>\r\n");
|
||||||
furi_assert(flipper_app->app);
|
printf("Cmd list:\r\n");
|
||||||
furi_assert(flipper_app->name);
|
printf("\tlist\t - List available applications\r\n");
|
||||||
|
printf("\topen <Application Name:string>\t - Open application by name\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
if(furi_thread_get_state(loader_instance->thread) != FuriThreadStateStopped) {
|
const FlipperApplication* loader_find_application_by_name(string_t name) {
|
||||||
|
const FlipperApplication* application = NULL;
|
||||||
|
|
||||||
|
for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) {
|
||||||
|
if(string_cmp_str(name, FLIPPER_APPS[i].name) == 0) {
|
||||||
|
application = &FLIPPER_APPS[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(size_t i = 0; i < FLIPPER_PLUGINS_COUNT; i++) {
|
||||||
|
if(string_cmp_str(name, FLIPPER_APPS[i].name) == 0) {
|
||||||
|
application = &FLIPPER_APPS[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
||||||
|
for(size_t i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) {
|
||||||
|
if(string_cmp_str(name, FLIPPER_APPS[i].name) == 0) {
|
||||||
|
application = &FLIPPER_APPS[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return application;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loader_cli_open(Cli* cli, string_t args, Loader* instance) {
|
||||||
|
string_strim(args);
|
||||||
|
|
||||||
|
if(string_size(args) == 0) {
|
||||||
|
printf("No application provided\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FlipperApplication* application = loader_find_application_by_name(args);
|
||||||
|
if(!application) {
|
||||||
|
printf("%s doesn't exists\r\n", string_get_cstr(args));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(furi_thread_get_state(instance->thread) != FuriThreadStateStopped) {
|
||||||
printf("Can't start, furi application is running");
|
printf("Can't start, furi application is running");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
loader_instance->lock_semaphore++;
|
instance->lock_semaphore++;
|
||||||
furi_hal_power_insomnia_enter();
|
furi_hal_power_insomnia_enter();
|
||||||
loader_instance->current_app = flipper_app;
|
instance->current_app = application;
|
||||||
printf("Starting furi application %s", loader_instance->current_app->name);
|
printf("Starting: %s\r\n", instance->current_app->name);
|
||||||
furi_thread_set_name(loader_instance->thread, flipper_app->name);
|
furi_thread_set_name(instance->thread, application->name);
|
||||||
furi_thread_set_stack_size(loader_instance->thread, flipper_app->stack_size);
|
furi_thread_set_stack_size(instance->thread, application->stack_size);
|
||||||
furi_thread_set_callback(loader_instance->thread, flipper_app->app);
|
furi_thread_set_callback(instance->thread, application->app);
|
||||||
furi_thread_start(loader_instance->thread);
|
furi_thread_start(instance->thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loader_cli_list(Cli* cli, string_t args, Loader* instance) {
|
||||||
|
printf("Applications:\r\n");
|
||||||
|
for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) {
|
||||||
|
printf("\t%s\r\n", FLIPPER_APPS[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Plugins:\r\n");
|
||||||
|
for(size_t i = 0; i < FLIPPER_PLUGINS_COUNT; i++) {
|
||||||
|
printf("\t%s\r\n", FLIPPER_PLUGINS[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
||||||
|
printf("Debug:\r\n");
|
||||||
|
for(size_t i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) {
|
||||||
|
printf("\t%s\r\n", FLIPPER_DEBUG_APPS[i].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loader_cli(Cli* cli, string_t args, void* _ctx) {
|
||||||
|
furi_assert(_ctx);
|
||||||
|
Loader* instance = _ctx;
|
||||||
|
|
||||||
|
string_t cmd;
|
||||||
|
string_init(cmd);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if(!args_read_string_and_trim(args, cmd)) {
|
||||||
|
loader_cli_print_usage();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(string_cmp_str(cmd, "list") == 0) {
|
||||||
|
loader_cli_list(cli, args, instance);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(string_cmp_str(cmd, "open") == 0) {
|
||||||
|
loader_cli_open(cli, args, instance);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
loader_cli_print_usage();
|
||||||
|
} while(false);
|
||||||
|
|
||||||
|
string_clear(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
LoaderStatus loader_start(Loader* instance, const char* name, const char* args) {
|
LoaderStatus loader_start(Loader* instance, const char* name, const char* args) {
|
||||||
@ -187,7 +277,10 @@ static Loader* loader_alloc() {
|
|||||||
|
|
||||||
instance->mutex = osMutexNew(NULL);
|
instance->mutex = osMutexNew(NULL);
|
||||||
|
|
||||||
|
#ifdef SRV_CLI
|
||||||
instance->cli = furi_record_open("cli");
|
instance->cli = furi_record_open("cli");
|
||||||
|
cli_add_command(instance->cli, "loader", CliCommandFlagDefault, loader_cli, instance);
|
||||||
|
#endif
|
||||||
|
|
||||||
instance->loader_thread = osThreadGetId();
|
instance->loader_thread = osThreadGetId();
|
||||||
|
|
||||||
@ -235,7 +328,9 @@ static Loader* loader_alloc() {
|
|||||||
static void loader_free(Loader* instance) {
|
static void loader_free(Loader* instance) {
|
||||||
furi_assert(instance);
|
furi_assert(instance);
|
||||||
|
|
||||||
|
if(instance->cli) {
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
}
|
||||||
|
|
||||||
osMutexDelete(instance->mutex);
|
osMutexDelete(instance->mutex);
|
||||||
|
|
||||||
@ -259,23 +354,10 @@ static void loader_free(Loader* instance) {
|
|||||||
instance = NULL;
|
instance = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loader_add_cli_command(FlipperApplication* app) {
|
|
||||||
string_t cli_name;
|
|
||||||
string_init_printf(cli_name, "app_%s", app->name);
|
|
||||||
cli_add_command(
|
|
||||||
loader_instance->cli,
|
|
||||||
string_get_cstr(cli_name),
|
|
||||||
CliCommandFlagDefault,
|
|
||||||
loader_cli_callback,
|
|
||||||
app);
|
|
||||||
string_clear(cli_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void loader_build_menu() {
|
static void loader_build_menu() {
|
||||||
FURI_LOG_I(TAG, "Building main menu");
|
FURI_LOG_I(TAG, "Building main menu");
|
||||||
size_t i;
|
size_t i;
|
||||||
for(i = 0; i < FLIPPER_APPS_COUNT; i++) {
|
for(i = 0; i < FLIPPER_APPS_COUNT; i++) {
|
||||||
loader_add_cli_command((FlipperApplication*)&FLIPPER_APPS[i]);
|
|
||||||
menu_add_item(
|
menu_add_item(
|
||||||
loader_instance->primary_menu,
|
loader_instance->primary_menu,
|
||||||
FLIPPER_APPS[i].name,
|
FLIPPER_APPS[i].name,
|
||||||
@ -284,6 +366,7 @@ static void loader_build_menu() {
|
|||||||
loader_menu_callback,
|
loader_menu_callback,
|
||||||
(void*)&FLIPPER_APPS[i]);
|
(void*)&FLIPPER_APPS[i]);
|
||||||
}
|
}
|
||||||
|
if(FLIPPER_PLUGINS_COUNT != 0) {
|
||||||
menu_add_item(
|
menu_add_item(
|
||||||
loader_instance->primary_menu,
|
loader_instance->primary_menu,
|
||||||
"Plugins",
|
"Plugins",
|
||||||
@ -291,6 +374,7 @@ static void loader_build_menu() {
|
|||||||
i++,
|
i++,
|
||||||
loader_submenu_callback,
|
loader_submenu_callback,
|
||||||
(void*)LoaderMenuViewPlugins);
|
(void*)LoaderMenuViewPlugins);
|
||||||
|
}
|
||||||
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
||||||
menu_add_item(
|
menu_add_item(
|
||||||
loader_instance->primary_menu,
|
loader_instance->primary_menu,
|
||||||
@ -313,7 +397,6 @@ static void loader_build_submenu() {
|
|||||||
FURI_LOG_I(TAG, "Building plugins menu");
|
FURI_LOG_I(TAG, "Building plugins menu");
|
||||||
size_t i;
|
size_t i;
|
||||||
for(i = 0; i < FLIPPER_PLUGINS_COUNT; i++) {
|
for(i = 0; i < FLIPPER_PLUGINS_COUNT; i++) {
|
||||||
loader_add_cli_command((FlipperApplication*)&FLIPPER_PLUGINS[i]);
|
|
||||||
submenu_add_item(
|
submenu_add_item(
|
||||||
loader_instance->plugins_menu,
|
loader_instance->plugins_menu,
|
||||||
FLIPPER_PLUGINS[i].name,
|
FLIPPER_PLUGINS[i].name,
|
||||||
@ -324,7 +407,6 @@ static void loader_build_submenu() {
|
|||||||
|
|
||||||
FURI_LOG_I(TAG, "Building debug menu");
|
FURI_LOG_I(TAG, "Building debug menu");
|
||||||
for(i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) {
|
for(i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) {
|
||||||
loader_add_cli_command((FlipperApplication*)&FLIPPER_DEBUG_APPS[i]);
|
|
||||||
submenu_add_item(
|
submenu_add_item(
|
||||||
loader_instance->debug_menu,
|
loader_instance->debug_menu,
|
||||||
FLIPPER_DEBUG_APPS[i].name,
|
FLIPPER_DEBUG_APPS[i].name,
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <furi.h>
|
#include <furi.h>
|
||||||
#include <furi-hal.h>
|
#include <furi-hal.h>
|
||||||
#include <cli/cli.h>
|
#include <cli/cli.h>
|
||||||
|
#include <lib/toolbox/args.h>
|
||||||
|
|
||||||
#include <gui/view_dispatcher.h>
|
#include <gui/view_dispatcher.h>
|
||||||
|
|
||||||
|
@ -3,11 +3,13 @@
|
|||||||
#include <furi.h>
|
#include <furi.h>
|
||||||
#include <furi-hal.h>
|
#include <furi-hal.h>
|
||||||
|
|
||||||
void nfc_cli_init() {
|
void nfc_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = furi_record_open("cli");
|
Cli* cli = furi_record_open("cli");
|
||||||
cli_add_command(cli, "nfc_detect", CliCommandFlagDefault, nfc_cli_detect, NULL);
|
cli_add_command(cli, "nfc_detect", CliCommandFlagDefault, nfc_cli_detect, NULL);
|
||||||
cli_add_command(cli, "nfc_emulate", CliCommandFlagDefault, nfc_cli_emulate, NULL);
|
cli_add_command(cli, "nfc_emulate", CliCommandFlagDefault, nfc_cli_emulate, NULL);
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfc_cli_detect(Cli* cli, string_t args, void* context) {
|
void nfc_cli_detect(Cli* cli, string_t args, void* context) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <cli/cli.h>
|
#include <cli/cli.h>
|
||||||
|
|
||||||
void nfc_cli_init();
|
void nfc_on_system_start();
|
||||||
|
|
||||||
void nfc_cli_detect(Cli* cli, string_t args, void* context);
|
void nfc_cli_detect(Cli* cli, string_t args, void* context);
|
||||||
|
|
||||||
|
@ -42,7 +42,8 @@ void power_cli_ext(Cli* cli, string_t args, void* context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void power_cli_init() {
|
void power_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = furi_record_open("cli");
|
Cli* cli = furi_record_open("cli");
|
||||||
|
|
||||||
cli_add_command(cli, "poweroff", CliCommandFlagParallelSafe, power_cli_poweroff, NULL);
|
cli_add_command(cli, "poweroff", CliCommandFlagParallelSafe, power_cli_poweroff, NULL);
|
||||||
@ -53,4 +54,5 @@ void power_cli_init() {
|
|||||||
cli_add_command(cli, "power_ext", CliCommandFlagParallelSafe, power_cli_ext, NULL);
|
cli_add_command(cli, "power_ext", CliCommandFlagParallelSafe, power_cli_ext, NULL);
|
||||||
|
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void power_cli_init();
|
void power_on_system_start();
|
||||||
|
@ -432,7 +432,7 @@ static void storage_cli_md5(Cli* cli, string_t path) {
|
|||||||
furi_record_close("storage");
|
furi_record_close("storage");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void storage_cli(Cli* cli, string_t args, void* context) {
|
void storage_cli(Cli* cli, string_t args, void* context) {
|
||||||
string_t cmd;
|
string_t cmd;
|
||||||
string_t path;
|
string_t path;
|
||||||
string_init(cmd);
|
string_init(cmd);
|
||||||
@ -521,7 +521,7 @@ static void storage_cli(Cli* cli, string_t args, void* context) {
|
|||||||
string_clear(cmd);
|
string_clear(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void storage_cli_factory_reset(Cli* cli, string_t args, void* context) {
|
void storage_cli_factory_reset(Cli* cli, string_t args, void* context) {
|
||||||
printf("All data will be lost. Are you sure (y/n)?\r\n");
|
printf("All data will be lost. Are you sure (y/n)?\r\n");
|
||||||
char c = cli_getc(cli);
|
char c = cli_getc(cli);
|
||||||
if(c == 'y' || c == 'Y') {
|
if(c == 'y' || c == 'Y') {
|
||||||
@ -533,10 +533,12 @@ static void storage_cli_factory_reset(Cli* cli, string_t args, void* context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void storage_cli_init() {
|
void storage_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = furi_record_open("cli");
|
Cli* cli = furi_record_open("cli");
|
||||||
cli_add_command(cli, "storage", CliCommandFlagDefault, storage_cli, NULL);
|
cli_add_command(cli, "storage", CliCommandFlagDefault, storage_cli, NULL);
|
||||||
cli_add_command(
|
cli_add_command(
|
||||||
cli, "factory_reset", CliCommandFlagParallelSafe, storage_cli_factory_reset, NULL);
|
cli, "factory_reset", CliCommandFlagParallelSafe, storage_cli_factory_reset, NULL);
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#define SUBGHZ_FREQUENCY_RANGE_STR \
|
#define SUBGHZ_FREQUENCY_RANGE_STR \
|
||||||
"299999755...348000000 or 386999938...464000000 or 778999847...928000000"
|
"299999755...348000000 or 386999938...464000000 or 778999847...928000000"
|
||||||
|
|
||||||
static void subghz_cli_command_tx_carrier(Cli* cli, string_t args, void* context) {
|
void subghz_cli_command_tx_carrier(Cli* cli, string_t args, void* context) {
|
||||||
uint32_t frequency = 433920000;
|
uint32_t frequency = 433920000;
|
||||||
|
|
||||||
if(string_size(args)) {
|
if(string_size(args)) {
|
||||||
@ -60,7 +60,7 @@ static void subghz_cli_command_tx_carrier(Cli* cli, string_t args, void* context
|
|||||||
furi_hal_power_suppress_charge_exit();
|
furi_hal_power_suppress_charge_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subghz_cli_command_rx_carrier(Cli* cli, string_t args, void* context) {
|
void subghz_cli_command_rx_carrier(Cli* cli, string_t args, void* context) {
|
||||||
uint32_t frequency = 433920000;
|
uint32_t frequency = 433920000;
|
||||||
|
|
||||||
if(string_size(args)) {
|
if(string_size(args)) {
|
||||||
@ -100,7 +100,7 @@ static void subghz_cli_command_rx_carrier(Cli* cli, string_t args, void* context
|
|||||||
furi_hal_subghz_sleep();
|
furi_hal_subghz_sleep();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subghz_cli_command_tx(Cli* cli, string_t args, void* context) {
|
void subghz_cli_command_tx(Cli* cli, string_t args, void* context) {
|
||||||
uint32_t frequency = 433920000;
|
uint32_t frequency = 433920000;
|
||||||
uint32_t key = 0x0074BADE;
|
uint32_t key = 0x0074BADE;
|
||||||
uint32_t repeat = 10;
|
uint32_t repeat = 10;
|
||||||
@ -191,7 +191,7 @@ static void subghz_cli_command_rx_text_callback(string_t text, void* context) {
|
|||||||
printf("%s", string_get_cstr(text));
|
printf("%s", string_get_cstr(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subghz_cli_command_rx(Cli* cli, string_t args, void* context) {
|
void subghz_cli_command_rx(Cli* cli, string_t args, void* context) {
|
||||||
uint32_t frequency = 433920000;
|
uint32_t frequency = 433920000;
|
||||||
|
|
||||||
if(string_size(args)) {
|
if(string_size(args)) {
|
||||||
@ -530,7 +530,7 @@ static void subghz_cli_command_chat(Cli* cli, string_t args) {
|
|||||||
printf("\r\nExit chat\r\n");
|
printf("\r\nExit chat\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subghz_cli_command(Cli* cli, string_t args, void* context) {
|
void subghz_cli_command(Cli* cli, string_t args, void* context) {
|
||||||
string_t cmd;
|
string_t cmd;
|
||||||
string_init(cmd);
|
string_init(cmd);
|
||||||
|
|
||||||
@ -561,7 +561,8 @@ static void subghz_cli_command(Cli* cli, string_t args, void* context) {
|
|||||||
string_clear(cmd);
|
string_clear(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void subghz_cli_init() {
|
void subghz_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = furi_record_open("cli");
|
Cli* cli = furi_record_open("cli");
|
||||||
|
|
||||||
cli_add_command(
|
cli_add_command(
|
||||||
@ -573,4 +574,5 @@ void subghz_cli_init() {
|
|||||||
cli_add_command(cli, "subghz", CliCommandFlagDefault, subghz_cli_command, NULL);
|
cli_add_command(cli, "subghz", CliCommandFlagDefault, subghz_cli_command, NULL);
|
||||||
|
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
#include <cli/cli.h>
|
#include <cli/cli.h>
|
||||||
|
|
||||||
void subghz_cli_init();
|
void subghz_on_system_start();
|
||||||
|
@ -78,10 +78,12 @@ void unit_tests_cli(Cli* cli, string_t args, void* context) {
|
|||||||
furi_record_close("loader");
|
furi_record_close("loader");
|
||||||
}
|
}
|
||||||
|
|
||||||
void unit_tests_cli_init() {
|
void unit_tests_on_system_start() {
|
||||||
|
#ifdef SRV_CLI
|
||||||
Cli* cli = furi_record_open("cli");
|
Cli* cli = furi_record_open("cli");
|
||||||
|
|
||||||
// We need to launch apps from tests, so we cannot lock loader
|
// We need to launch apps from tests, so we cannot lock loader
|
||||||
cli_add_command(cli, "unit_tests", CliCommandFlagParallelSafe, unit_tests_cli, NULL);
|
cli_add_command(cli, "unit_tests", CliCommandFlagParallelSafe, unit_tests_cli, NULL);
|
||||||
furi_record_close("cli");
|
furi_record_close("cli");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,6 @@ CFLAGS += -I$(LITTLEFS_DIR) -DLFS_CONFIG=lfs_config.h
|
|||||||
C_SOURCES += $(LITTLEFS_DIR)/lfs.c
|
C_SOURCES += $(LITTLEFS_DIR)/lfs.c
|
||||||
C_SOURCES += $(LITTLEFS_DIR)/lfs_util.c
|
C_SOURCES += $(LITTLEFS_DIR)/lfs_util.c
|
||||||
|
|
||||||
ifeq ($(APP_NFC), 1)
|
|
||||||
ST25RFAL002_DIR = $(LIB_DIR)/ST25RFAL002
|
ST25RFAL002_DIR = $(LIB_DIR)/ST25RFAL002
|
||||||
CFLAGS += -I$(ST25RFAL002_DIR)
|
CFLAGS += -I$(ST25RFAL002_DIR)
|
||||||
CFLAGS += -I$(ST25RFAL002_DIR)/include
|
CFLAGS += -I$(ST25RFAL002_DIR)/include
|
||||||
@ -52,7 +51,6 @@ C_SOURCES += $(wildcard $(ST25RFAL002_DIR)/source/st25r3916/*.c)
|
|||||||
|
|
||||||
CFLAGS += -I$(LIB_DIR)/nfc_protocols
|
CFLAGS += -I$(LIB_DIR)/nfc_protocols
|
||||||
C_SOURCES += $(wildcard $(LIB_DIR)/nfc_protocols/*.c)
|
C_SOURCES += $(wildcard $(LIB_DIR)/nfc_protocols/*.c)
|
||||||
endif
|
|
||||||
|
|
||||||
# callback connector (C to CPP) library
|
# callback connector (C to CPP) library
|
||||||
CFLAGS += -I$(LIB_DIR)/callback-connector
|
CFLAGS += -I$(LIB_DIR)/callback-connector
|
||||||
|
@ -20,9 +20,9 @@ COMPACT ?= 0
|
|||||||
ifeq ($(DEBUG), 1)
|
ifeq ($(DEBUG), 1)
|
||||||
CFLAGS += -DFURI_DEBUG -DNDEBUG -Og -g
|
CFLAGS += -DFURI_DEBUG -DNDEBUG -Og -g
|
||||||
else ifeq ($(COMPACT), 1)
|
else ifeq ($(COMPACT), 1)
|
||||||
CFLAGS += -DFURI_NDEBUG -DNDEBUG -Os
|
CFLAGS += -DFURI_NDEBUG -DNDEBUG -Os -g
|
||||||
else
|
else
|
||||||
CFLAGS += -DFURI_NDEBUG -DNDEBUG -Og
|
CFLAGS += -DFURI_NDEBUG -DNDEBUG -Og -g
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += -fdata-sections -ffunction-sections -fno-math-errno -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)"
|
CFLAGS += -fdata-sections -ffunction-sections -fno-math-errno -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user