diff options
author | Vadim Kaushan <admin@disasm.info> | 2020-10-26 12:26:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-26 12:26:15 +0300 |
commit | bb68fca20b98eff37ed32001735d0a58c6a427d0 (patch) | |
tree | 3158471f0a6601cb65f1f9f51270ab8d93d5bf48 /applications/input | |
parent | 69d97afea8bbe2c2d6cc8f86399566a70c65c0ed (diff) |
Implement ValueManager and ValueComposer (#183)
* Fix ValueManager implementation
* Implement ValueComposer
* Add constructor for ValueManager
* Add value-expanders.h to flipper_v2.h set
* Move COPY_COMPOSE body into a .c file
* Add test for ValueManager
* Add destructors for ValueMutex, ValueManager and ValueComposer
* Use destructors in tests
* Move composition logic into perform_compose()
* Add docs for perform_compose()
* Add test for ValueComposer
* Replace atomic_bool with bool as g++ compiler doesn't support C11 atomics
* Add Event type
* Add semaphore support to the local target
* Add test for Event
* Update input records and relevant examples
* Rename Event to AppEvent in the cc1101-workaround example
* Rename Event to AppEvent in the irda example
* Use Event in ValueComposer to wait for update request
* Add perform_compose_internal() function
* fix Event/AppEvent
Co-authored-by: aanper <mail@s3f.ru>
Diffstat (limited to 'applications/input')
-rw-r--r-- | applications/input/input.c | 49 |
1 files changed, 20 insertions, 29 deletions
diff --git a/applications/input/input.c b/applications/input/input.c index eec75eb1..612abcbc 100644 --- a/applications/input/input.c +++ b/applications/input/input.c @@ -1,46 +1,44 @@ #include <input/input.h> #include <input_priv.h> #include <stdio.h> -#include <flipper.h> +#include <flipper_v2.h> #ifdef APP_NFC void st25r3916Isr(void); #endif static volatile bool initialized = false; -static SemaphoreHandle_t event; +static ValueManager input_state_record; +static PubSub input_events_record; +static Event event; static InputState input_state = { false, }; void input_task(void* p) { uint32_t state_bits = 0; - StaticSemaphore_t event_semaphore; uint8_t debounce_counters[INPUT_COUNT]; - event = xSemaphoreCreateCountingStatic(1, 0, &event_semaphore); - - if(!furi_create_deprecated("input_state", (void*)&input_state, sizeof(input_state))) { - printf("[input_task] cannot create the input_state record\n"); + if(!init_managed(&input_state_record, &input_state, sizeof(input_state))) { + printf("[input_task] cannot initialize ValueManager for input_state\n"); furiac_exit(NULL); } - - FuriRecordSubscriber* input_state_record = - furi_open_deprecated("input_state", false, false, NULL, NULL, NULL); - if(input_state_record == NULL) { - printf("[input_task] cannot open the input_state record\n"); + if(!init_pubsub(&input_events_record)) { + printf("[input_task] cannot initialize PubSub for input_events\n"); + furiac_exit(NULL); + } + if(!init_event(&event)) { + printf("[input_task] cannot initialize Event\n"); furiac_exit(NULL); } - if(!furi_create_deprecated("input_events", NULL, 0)) { - printf("[input_task] cannot create the input_events record\n"); + if(!furi_create("input_state", &input_state_record)) { + printf("[input_task] cannot create the input_state record\n"); furiac_exit(NULL); } - FuriRecordSubscriber* input_events_record = - furi_open_deprecated("input_events", false, false, NULL, NULL, NULL); - if(input_events_record == NULL) { - printf("[input_task] cannot open the input_events record\n"); + if(!furi_create("input_events", &input_events_record)) { + printf("[input_task] cannot create the input_events record\n"); furiac_exit(NULL); } @@ -82,7 +80,7 @@ void input_task(void* p) { if(changed_bits != 0) { // printf("[input] %02x -> %02x\n", state_bits, new_state_bits); InputState new_state = _BITS2STATE(new_state_bits); - furi_write(input_state_record, &new_state, sizeof(new_state)); + write_managed(&input_state_record, &new_state, sizeof(new_state), osWaitForever); state_bits = new_state_bits; @@ -90,13 +88,13 @@ void input_task(void* p) { if((changed_bits & (1 << i)) != 0) { bool state = (new_state_bits & (1 << i)) != 0; InputEvent event = {i, state}; - furi_write(input_events_record, &event, sizeof(event)); + notify_pubsub(&input_events_record, &event); } } } // Sleep: wait for event - xSemaphoreTake(event, portMAX_DELAY); + wait_event(&event); } else { osDelay(1); } @@ -113,12 +111,5 @@ void HAL_GPIO_EXTI_Callback(uint16_t pin) { if(!initialized) return; - BaseType_t task_woken = pdFALSE; - - // Ignore the result, as we do not care about repeated event during event processing. - xSemaphoreGiveFromISR(event, &task_woken); - - if(task_woken) { - portYIELD_FROM_ISR(task_woken); - } + signal_event(&event); } |