[FL-1475] iButton emulate shortcat (#535)

* ibutton: run emulation when launched with argument
* app-loader: set NULL context when starting application from menu
* ibutton: change p to argc
* ibutton: fix load key data from file
* ibutton: fix memory leak
This commit is contained in:
gornekich 2021-06-24 14:32:33 +03:00 committed by GitHub
parent 5b8f147882
commit 8cc0a9a998
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 106 additions and 71 deletions

View File

@ -28,6 +28,7 @@ static void app_loader_menu_callback(void* _ctx) {
FURI_LOG_I(APP_LOADER_TAG, "Starting furi application: %s", state.current_app->name);
furi_thread_set_name(state.thread, flipper_app->name);
furi_thread_set_stack_size(state.thread, flipper_app->stack_size);
furi_thread_set_context(state.thread, NULL);
furi_thread_set_callback(state.thread, flipper_app->app);
furi_thread_start(state.thread);
}

86
applications/ibutton/ibutton-app.cpp Normal file → Executable file
View File

@ -6,11 +6,15 @@
const char* iButtonApp::app_folder = "ibutton";
const char* iButtonApp::app_extension = ".ibtn";
void iButtonApp::run(void) {
void iButtonApp::run(void* args) {
iButtonEvent event;
bool consumed;
bool exit = false;
if(args && load_key((const char*)args)) {
current_scene = Scene::SceneEmulate;
}
scenes[current_scene]->on_enter(this);
while(!exit) {
@ -44,6 +48,7 @@ iButtonApp::~iButtonApp() {
delete it->second;
scenes.erase(it);
}
delete key_worker;
api_hal_power_insomnia_exit();
}
@ -308,34 +313,12 @@ bool iButtonApp::save_key(const char* key_name) {
return result;
}
bool iButtonApp::load_key() {
bool result = false;
// Input events and views are managed by file_select
bool res = get_sd_ex_api()->file_select(
get_sd_ex_api()->context,
app_folder,
app_extension,
get_file_name(),
get_file_name_size(),
get_key()->get_name());
if(res) {
string_t key_str;
bool iButtonApp::load_key_data(string_t key_path) {
File key_file;
uint16_t read_count;
// Get key file path
string_init_set_str(key_str, app_folder);
string_cat_str(key_str, "/");
string_cat_str(key_str, get_file_name());
string_cat_str(key_str, app_extension);
// Open key file
get_fs_api()->file.open(
&key_file, string_get_cstr(key_str), FSAM_READ, FSOM_OPEN_EXISTING);
string_clear(key_str);
get_fs_api()->file.open(&key_file, string_get_cstr(key_path), FSAM_READ, FSOM_OPEN_EXISTING);
if(key_file.error_id != FSE_OK) {
show_file_error_message("Cannot open\nkey file");
get_fs_api()->file.close(&key_file);
@ -393,11 +376,60 @@ bool iButtonApp::load_key() {
get_fs_api()->file.close(&key_file);
get_key()->set_name(get_file_name());
get_key()->set_type(key_type);
get_key()->set_data(key_data, IBUTTON_KEY_DATA_SIZE);
result = true;
return true;
}
bool iButtonApp::load_key(const char* key_name) {
bool result = false;
string_t key_path;
string_init_set_str(key_path, key_name);
if(!string_start_with_str_p(key_path, app_folder) ||
!string_end_with_str_p(key_path, app_extension)) {
string_clear(key_path);
return false;
}
result = load_key_data(key_path);
if(result) {
uint8_t folder_end = strlen(app_folder) + 1;
uint8_t extension_start = string_size(key_path) - strlen(app_extension);
string_mid(key_path, folder_end, extension_start - folder_end);
get_key()->set_name(string_get_cstr(key_path));
}
string_clear(key_path);
return result;
}
bool iButtonApp::load_key() {
bool result = false;
// Input events and views are managed by file_select
bool res = get_sd_ex_api()->file_select(
get_sd_ex_api()->context,
app_folder,
app_extension,
get_file_name(),
get_file_name_size(),
get_key()->get_name());
if(res) {
string_t key_str;
// Get key file path
string_init_set_str(key_str, app_folder);
string_cat_str(key_str, "/");
string_cat_str(key_str, get_file_name());
string_cat_str(key_str, app_extension);
result = load_key_data(key_str);
if(result) {
get_key()->set_name(get_file_name());
}
string_clear(key_str);
}
get_sd_ex_api()->check_error(get_sd_ex_api()->context);

View File

@ -39,7 +39,7 @@
class iButtonApp {
public:
void run(void);
void run(void* args);
iButtonApp();
~iButtonApp();
@ -100,6 +100,7 @@ public:
bool save_key(const char* key_name);
bool load_key();
bool load_key(const char* key_name);
bool delete_key();
private:
@ -146,4 +147,5 @@ private:
static const char* app_extension;
void show_file_error_message(const char* error_text);
bool load_key_data(string_t key_path);
};

View File

@ -3,7 +3,7 @@
// app enter function
extern "C" int32_t app_ibutton(void* p) {
iButtonApp* app = new iButtonApp();
app->run();
app->run(p);
delete app;
return 255;