mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-25 06:13:14 +03:00
[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:
parent
5b8f147882
commit
8cc0a9a998
@ -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
86
applications/ibutton/ibutton-app.cpp
Normal file → Executable 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);
|
||||
|
@ -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);
|
||||
};
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user