diff --git a/applications/services/input/input.c b/applications/services/input/input.c index 6cbafb795..4ba77cc34 100644 --- a/applications/services/input/input.c +++ b/applications/services/input/input.c @@ -6,6 +6,7 @@ #include #include #include +#include #define INPUT_DEBOUNCE_TICKS_HALF (INPUT_DEBOUNCE_TICKS / 2) #define INPUT_PRESS_TICKS 150 @@ -79,9 +80,23 @@ const char* input_get_type_name(InputType type) { } } +// allocate memory for input_settings structure +static InputSettings* input_settings_alloc (void) { + InputSettings* input_settings = malloc(sizeof(InputSettings)); + return input_settings; +} + +//free memory from input_settings structure +void input_settings_free (InputSettings* input_settings) { + free (input_settings); +} + int32_t input_srv(void* p) { UNUSED(p); + //define object input_settings and take memory for him + InputSettings* input_settings = input_settings_alloc(); + const FuriThreadId thread_id = furi_thread_get_current_id(); FuriPubSub* event_pubsub = furi_pubsub_alloc(); uint32_t counter = 1; @@ -149,6 +164,11 @@ int32_t input_srv(void* p) { // Send Press/Release event event.type = pin_states[i].state ? InputTypePress : InputTypeRelease; furi_pubsub_publish(event_pubsub, &event); + if (input_settings->vibro_touch_level) { + furi_hal_vibro_on(true); + furi_delay_tick (30); + furi_hal_vibro_on(false); + }; } } @@ -165,5 +185,7 @@ int32_t input_srv(void* p) { } } + // if we come here and ready exit from service (whats going on ??!!) then best practice is free memory + input_settings_free(input_settings); return 0; } diff --git a/applications/services/input/input.h b/applications/services/input/input.h index 5233b4a01..3d8d6c9ec 100644 --- a/applications/services/input/input.h +++ b/applications/services/input/input.h @@ -6,6 +6,7 @@ #pragma once #include +#include "input_settings.h" #ifdef __cplusplus extern "C" { @@ -40,6 +41,13 @@ typedef struct { InputType type; } InputEvent; +//for next step input structure globalization; +//typedef struct Input { + //InputSettings* settings; + //InputType* type; + //InputEvent* event; +//} Input; + /** Get human readable input key name * @param key - InputKey * @return string diff --git a/applications/services/input/input_settings.c b/applications/services/input/input_settings.c new file mode 100644 index 000000000..fc738c004 --- /dev/null +++ b/applications/services/input/input_settings.c @@ -0,0 +1,77 @@ +#include "input_settings.h" +#include "input_settings_filename.h" + +#include +#include + +#define TAG "InputSettings" + +#define INPUT_SETTINGS_VER_0 (0) // OLD version number +#define INPUT_SETTINGS_VER (1) // NEW actual version nnumber + +#define INPUT_SETTINGS_PATH INT_PATH(INPUT_SETTINGS_FILE_NAME) +#define INPUT_SETTINGS_MAGIC (0x19) + +typedef struct { + //inital set - empty +} InputSettingsV0; + +void input_settings_load(InputSettings* settings) { + furi_assert(settings); + + bool success = false; + + do { + uint8_t version; + if(!saved_struct_get_metadata(INPUT_SETTINGS_PATH, NULL, &version, NULL)) break; + + if(version == INPUT_SETTINGS_VER) { // if config actual version - load it directly + success = saved_struct_load( + INPUT_SETTINGS_PATH, + settings, + sizeof(InputSettings), + INPUT_SETTINGS_MAGIC, + INPUT_SETTINGS_VER); + + } else if( + version == + INPUT_SETTINGS_VER_0) { // if config previous version - load it and manual set new settings to inital value + InputSettingsV0* settings_v0 = malloc(sizeof(InputSettingsV0)); + + success = saved_struct_load( + INPUT_SETTINGS_PATH, + settings_v0, + sizeof(InputSettingsV0), + INPUT_SETTINGS_MAGIC, + INPUT_SETTINGS_VER_0); + + if(success) { + settings->vibro_touch_level = 0; + } + + free(settings_v0); + } + + } while(false); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load file, using defaults"); + memset(settings, 0, sizeof(InputSettings)); + input_settings_save(settings); + } +} + +void input_settings_save(const InputSettings* settings) { + furi_assert(settings); + + const bool success = saved_struct_save( + INPUT_SETTINGS_PATH, + settings, + sizeof(InputSettings), + INPUT_SETTINGS_MAGIC, + INPUT_SETTINGS_VER); + + if(!success) { + FURI_LOG_E(TAG, "Failed to save file"); + } +} diff --git a/applications/services/input/input_settings.h b/applications/services/input/input_settings.h new file mode 100644 index 000000000..376e8e226 --- /dev/null +++ b/applications/services/input/input_settings.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +typedef struct { + uint8_t vibro_touch_level; +} InputSettings; + +#ifdef __cplusplus +extern "C" { +#endif + +void input_settings_load(InputSettings* settings); +void input_settings_save(const InputSettings* settings); + +#ifdef __cplusplus +} +#endif diff --git a/applications/services/input/input_settings_filename.h b/applications/services/input/input_settings_filename.h new file mode 100644 index 000000000..025ed6ad5 --- /dev/null +++ b/applications/services/input/input_settings_filename.h @@ -0,0 +1,3 @@ +#pragma once + +#define INPUT_SETTINGS_FILE_NAME ".input.settings" diff --git a/applications/services/power/power_service/power_settings.h b/applications/services/power/power_service/power_settings.h index 65d8e079e..b1cc71001 100644 --- a/applications/services/power/power_service/power_settings.h +++ b/applications/services/power/power_service/power_settings.h @@ -9,8 +9,10 @@ typedef struct { #ifdef __cplusplus extern "C" { #endif + void power_settings_load(PowerSettings* settings); void power_settings_save(const PowerSettings* settings); + #ifdef __cplusplus } #endif diff --git a/applications/settings/input_settings/application.fam b/applications/settings/input_settings/application.fam new file mode 100644 index 000000000..f137c2512 --- /dev/null +++ b/applications/settings/input_settings/application.fam @@ -0,0 +1,9 @@ +App( + appid="input_settings", + name="Input", + apptype=FlipperAppType,SETTINGS, + entry_point="input_settings_app", + requires=["gui"], + stack_size= 1 * 1024, + order=100, +) diff --git a/applications/settings/input_settings/input_settings_app.c b/applications/settings/input_settings/input_settings_app.c new file mode 100644 index 000000000..943bbc02f --- /dev/null +++ b/applications/settings/input_settings/input_settings_app.c @@ -0,0 +1,67 @@ +#include +#include "input_settings_app.h" + +#define VIBRO_TOUCH_LEVEL_COUNT 10 +// vibro touch human readable levels +const char* const vibro_touch_level_text[VIBRO_TOUCH_LEVEL_COUNT] = { + "OFF", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", +}; +// vibro touch levels tick valies delay +const uint32_t vibro_touch_level_value[VIBRO_TOUCH_LEVEL_COUNT] = + {0,13,16,19,21,24,27,30,33,36}; + +input_settings_start_vibro_touch_level_changed (){ + +} + +InputSettingsApp* input_settings_alloc (void) { + InputSettingsApp* app = malloc(sizeof(InputSettingsApp)); + + app->gui = furi_record_open (RECORD_GUI); + app->view_dispatcher = view_dispatcher_alloc (); + + VariableItem* item; + app->var_item_list = variable_item_list_alloc(); + + item = variable_item_list_add( + variable_item_list, + "Vibro touch level", + VIBRO_TOUCH_LEVEL_COUNT, + input_settings_start_vibro_touch_level_changed, + app); + + value_index = value_index_uint32( + app->settings.vibro_touch_level, vibro_touch_level_value, VIBRO_TOUCH_LEVEL_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, vibro_touch_level_text[value_index]); + + +return app; +} + + +// Enter point +int32_t input_settings_app (void* p) { + UNUSED (p); + + //take memory + InputSettingsApp* app = input_settings_alloc (); + + //start view_dispatcher + view_dispatcher_run(app->view_dispatcher); + + //free memory + Input_settings_free (app); + + //exit with 0 code + return 0; +}; \ No newline at end of file diff --git a/applications/settings/input_settings/input_settings_app.h b/applications/settings/input_settings/input_settings_app.h new file mode 100644 index 000000000..7ba29b511 --- /dev/null +++ b/applications/settings/input_settings/input_settings_app.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include "input/input_settings.h" + +// app stucture +typedef struct { +InputSettings* settings; +Input* input; +Gui* gui; +ViewDispatcher* view_dispatcher; +VariableItemList* variable_item_list; +} InputSettingsApp; + +// list of menu views for view dispatcher +typedef enum { + InputSettingsViewVariableItemList, +} InputSettingsView; \ No newline at end of file diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index b649f1f99..420d7e678 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,79.3,, +Version,+,79.4,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -2112,6 +2112,8 @@ Function,+,infrared_worker_tx_stop,void,InfraredWorker* Function,-,initstate,char*,"unsigned, char*, size_t" Function,+,input_get_key_name,const char*,InputKey Function,+,input_get_type_name,const char*,InputType +Function,+,input_settings_load,void,InputSettings* +Function,+,input_settings_save,void,const InputSettings* Function,-,iprintf,int,"const char*, ..." Function,-,isalnum,int,int Function,-,isalnum_l,int,"int, locale_t"