Add state tracking to bottom half
This commit is contained in:
parent
758b16aa0d
commit
579a7559c1
@ -1,5 +1,6 @@
|
|||||||
#include "bottom_half.h"
|
#include "bottom_half.h"
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
|
#include "state_tracking.h"
|
||||||
|
|
||||||
static const char *TAG = "bottom_half";
|
static const char *TAG = "bottom_half";
|
||||||
|
|
||||||
@ -75,9 +76,19 @@ static void receive_keypad(void) {
|
|||||||
|
|
||||||
uint16_t just_pressed = new_keypad_state & ~keypad_state;
|
uint16_t just_pressed = new_keypad_state & ~keypad_state;
|
||||||
keypad_pressed |= just_pressed;
|
keypad_pressed |= just_pressed;
|
||||||
|
if (is_state_tracking() && just_pressed) {
|
||||||
|
char buf[6];
|
||||||
|
sprintf(buf, "%d", just_pressed);
|
||||||
|
event_occured("KP_PRESS", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t just_released = ~new_keypad_state & keypad_state;
|
uint16_t just_released = ~new_keypad_state & keypad_state;
|
||||||
keypad_released |= just_released;
|
keypad_released |= just_released;
|
||||||
|
if (is_state_tracking() && just_released) {
|
||||||
|
char buf[6];
|
||||||
|
sprintf(buf, "%d", just_released);
|
||||||
|
event_occured("KP_RELEASE", buf);
|
||||||
|
}
|
||||||
|
|
||||||
keypad_state = new_keypad_state;
|
keypad_state = new_keypad_state;
|
||||||
}
|
}
|
||||||
@ -92,27 +103,57 @@ static void receive_button_switch(void) {
|
|||||||
// button
|
// button
|
||||||
uint8_t just_pressed = new_button_state & ~button_state;
|
uint8_t just_pressed = new_button_state & ~button_state;
|
||||||
button_pressed |= just_pressed;
|
button_pressed |= just_pressed;
|
||||||
|
if (is_state_tracking() && just_pressed) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_pressed);
|
||||||
|
event_occured("BTN_PRESS", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t just_released = ~new_button_state & button_state;
|
uint8_t just_released = ~new_button_state & button_state;
|
||||||
button_released |= just_released;
|
button_released |= just_released;
|
||||||
|
if (is_state_tracking() && just_released) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_released);
|
||||||
|
event_occured("BTN_RELEASE", buf);
|
||||||
|
}
|
||||||
|
|
||||||
button_state = new_button_state;
|
button_state = new_button_state;
|
||||||
|
|
||||||
// switch
|
// switch
|
||||||
uint8_t just_flipped_up = new_switch_state & ~switch_state;
|
uint8_t just_flipped_up = new_switch_state & ~switch_state;
|
||||||
switch_flipped_up |= just_flipped_up;
|
switch_flipped_up |= just_flipped_up;
|
||||||
|
if (is_state_tracking() && just_flipped_up) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_flipped_up);
|
||||||
|
event_occured("SW_UP", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t just_flipped_down = ~new_switch_state & switch_state;
|
uint8_t just_flipped_down = ~new_switch_state & switch_state;
|
||||||
switch_flipped_down |= just_flipped_down;
|
switch_flipped_down |= just_flipped_down;
|
||||||
|
if (is_state_tracking() && just_flipped_down) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", just_flipped_down);
|
||||||
|
event_occured("SW_DOWN", buf);
|
||||||
|
}
|
||||||
|
|
||||||
switch_state = new_switch_state;
|
switch_state = new_switch_state;
|
||||||
|
|
||||||
// switch touch
|
// switch touch
|
||||||
uint8_t touch_just_pressed = new_switch_touch_state & ~switch_touch_state;
|
uint8_t touch_just_pressed = new_switch_touch_state & ~switch_touch_state;
|
||||||
switch_touch_pressed |= touch_just_pressed;
|
switch_touch_pressed |= touch_just_pressed;
|
||||||
|
if (is_state_tracking() && touch_just_pressed) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", touch_just_pressed);
|
||||||
|
event_occured("SW_TOUCH", buf);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t touch_just_released = ~new_switch_touch_state & switch_touch_state;
|
uint8_t touch_just_released = ~new_switch_touch_state & switch_touch_state;
|
||||||
switch_touch_released |= touch_just_released;
|
switch_touch_released |= touch_just_released;
|
||||||
|
if (is_state_tracking() && touch_just_released) {
|
||||||
|
char buf[4];
|
||||||
|
sprintf(buf, "%d", touch_just_released);
|
||||||
|
event_occured("SW_UNTOUCH", buf);
|
||||||
|
}
|
||||||
|
|
||||||
switch_touch_state = new_switch_touch_state;
|
switch_touch_state = new_switch_touch_state;
|
||||||
}
|
}
|
||||||
@ -125,9 +166,15 @@ static void receive_touch(void) {
|
|||||||
|
|
||||||
bool just_pressed = new_touch_state & !touch_state;
|
bool just_pressed = new_touch_state & !touch_state;
|
||||||
touch_pressed |= just_pressed;
|
touch_pressed |= just_pressed;
|
||||||
|
if (is_state_tracking() && just_pressed) {
|
||||||
|
event_occured("FINGER_TOUCHED", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
bool just_released = (!new_touch_state) & touch_state;
|
bool just_released = (!new_touch_state) & touch_state;
|
||||||
touch_released |= just_released;
|
touch_released |= just_released;
|
||||||
|
if (is_state_tracking() && just_released) {
|
||||||
|
event_occured("FINGER_UNTOUCHED", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
touch_state = new_touch_state;
|
touch_state = new_touch_state;
|
||||||
}
|
}
|
||||||
@ -307,7 +354,6 @@ uint8_t get_switch_touch_state(){
|
|||||||
return switch_touch_state;
|
return switch_touch_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool get_touch_state(void) {
|
bool get_touch_state(void) {
|
||||||
return touch_state;
|
return touch_state;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,10 +13,29 @@ static std::vector<EventCB> event_cbs;
|
|||||||
static bool should_close_recording_stream;
|
static bool should_close_recording_stream;
|
||||||
static FILE* recording_stream;
|
static FILE* recording_stream;
|
||||||
static uint32_t recording_start_time;
|
static uint32_t recording_start_time;
|
||||||
|
TaskHandle_t flush_file_task_handle;
|
||||||
|
|
||||||
static bool should_close_playback_stream;
|
static bool should_close_playback_stream;
|
||||||
static FILE* playback_stream;
|
static FILE* playback_stream;
|
||||||
static state_t state = STATE_IDLE;
|
static volatile state_t state = STATE_IDLE;
|
||||||
|
|
||||||
|
|
||||||
|
/// @brief Periodically flushes and syncs (if neccesary) the output stream.
|
||||||
|
/// @param arg unused.
|
||||||
|
static void flush_file_task(void* arg) {
|
||||||
|
while (state == STATE_RECORDING && recording_stream != nullptr) {
|
||||||
|
fflush(recording_stream);
|
||||||
|
|
||||||
|
int fd = fileno(recording_stream);
|
||||||
|
if (fd != -1) {
|
||||||
|
fsync(fd);
|
||||||
|
}
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(5000));
|
||||||
|
}
|
||||||
|
|
||||||
|
flush_file_task_handle = NULL;
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void register_event_cb(const char* name, void (*replay_callback)(uint32_t, const char*)) {
|
void register_event_cb(const char* name, void (*replay_callback)(uint32_t, const char*)) {
|
||||||
EventCB event = {
|
EventCB event = {
|
||||||
@ -37,13 +56,6 @@ void event_occured(const char* name, const char* arg) {
|
|||||||
arg = (arg == nullptr) ? "" : arg;
|
arg = (arg == nullptr) ? "" : arg;
|
||||||
uint32_t ticks = xTaskGetTickCount() - recording_start_time;
|
uint32_t ticks = xTaskGetTickCount() - recording_start_time;
|
||||||
fprintf(recording_stream, "%ld,%s:%s\n", ticks, name, (arg == nullptr) ? "" : arg);
|
fprintf(recording_stream, "%ld,%s:%s\n", ticks, name, (arg == nullptr) ? "" : arg);
|
||||||
|
|
||||||
fflush(recording_stream);
|
|
||||||
|
|
||||||
int fd = fileno(recording_stream);
|
|
||||||
if (fd != -1) {
|
|
||||||
fsync(fd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool set_recording_source(FILE* stream, bool should_close) {
|
bool set_recording_source(FILE* stream, bool should_close) {
|
||||||
@ -68,6 +80,7 @@ bool start_recording() {
|
|||||||
|
|
||||||
state = STATE_RECORDING;
|
state = STATE_RECORDING;
|
||||||
recording_start_time = xTaskGetTickCount();
|
recording_start_time = xTaskGetTickCount();
|
||||||
|
xTaskCreate(flush_file_task, "flush_recording", 2048, NULL, 2, &flush_file_task_handle);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +93,11 @@ bool stop_recording() {
|
|||||||
fclose(recording_stream);
|
fclose(recording_stream);
|
||||||
recording_stream = nullptr;
|
recording_stream = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flush_file_task_handle != nullptr) {
|
||||||
|
vTaskDelete(flush_file_task_handle);
|
||||||
|
flush_file_task_handle = NULL;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user