diff --git a/components/dialer/CMakeLists.txt b/components/dialer/CMakeLists.txt new file mode 100644 index 0000000..13e3259 --- /dev/null +++ b/components/dialer/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register( + SRCS "dialer.c" + INCLUDE_DIRS "include" + REQUIRES esp_timer +) diff --git a/components/dialer/dialer.c b/components/dialer/dialer.c new file mode 100644 index 0000000..78cae95 --- /dev/null +++ b/components/dialer/dialer.c @@ -0,0 +1,82 @@ +/* + * dialer.c — Digit accumulator for the PLIP telephone state machine. + * + * Digits are pushed from two sources: + * 1. HTTP /debug/dial?number=NNNN (net.c handler) + * 2. Rotary pulse detection (phone.c, CONFIG_PLIP_DIAL_PULSE) + * + * Thread-safety: all state is protected by atomic operations on s_last_us + * and simple writes to s_len / s_num (called from a single phone task or + * HTTP task at a time — no concurrent push expected). + */ + +#include "dialer.h" + +#ifdef DIALER_HOST_TEST +#include +static int64_t g_fake_us = 0; +static int64_t esp_timer_get_time(void) { return g_fake_us; } +void dialer_test_set_time_us(int64_t us); /* déclaré pour le test */ +void dialer_test_set_time_us(int64_t us) { g_fake_us = us; } +#define ESP_LOGI(tag, ...) ((void)0) +#else +#include "esp_timer.h" +#include "esp_log.h" +#endif + +#include +#include + +#define TAG "dialer" + +#define MAX_DIGITS 12 + +static char s_num[MAX_DIGITS + 1]; +static int s_len; +static int64_t s_last_us; /* esp_timer_get_time() at last push */ + +void dialer_init(void) +{ + memset(s_num, 0, sizeof(s_num)); + s_len = 0; + s_last_us = 0; + ESP_LOGI(TAG, "dialer init"); +} + +void dialer_push_digit(int d) +{ + if (d < 0 || d > 9) return; + if (s_len >= MAX_DIGITS) return; /* silently discard overflow */ + + s_num[s_len++] = (char)('0' + d); + s_num[s_len] = '\0'; + s_last_us = esp_timer_get_time(); + + ESP_LOGI(TAG, "digit %d -> number so far: \"%s\"", d, s_num); +} + +void dialer_reset(void) +{ + memset(s_num, 0, sizeof(s_num)); + s_len = 0; + s_last_us = 0; + ESP_LOGI(TAG, "dialer reset"); +} + +const char *dialer_current(void) +{ + return s_num; +} + +bool dialer_idle(void) +{ + return s_len == 0; +} + +int dialer_ms_since_last(void) +{ + if (s_last_us == 0) return 0; + int64_t elapsed_us = esp_timer_get_time() - s_last_us; + int ms = (int)(elapsed_us / 1000); + return (ms < 0) ? 0 : ms; +} diff --git a/components/dialer/include/dialer.h b/components/dialer/include/dialer.h new file mode 100644 index 0000000..6483095 --- /dev/null +++ b/components/dialer/include/dialer.h @@ -0,0 +1,9 @@ +#pragma once +#include + +void dialer_init(void); +void dialer_push_digit(int d); +void dialer_reset(void); +const char *dialer_current(void); +bool dialer_idle(void); +int dialer_ms_since_last(void); diff --git a/components/dialer/test_dialer.c b/components/dialer/test_dialer.c new file mode 100644 index 0000000..887bc99 --- /dev/null +++ b/components/dialer/test_dialer.c @@ -0,0 +1,35 @@ +#include "dialer.h" +#include +#include +#include + +void dialer_test_set_time_us(int64_t us); /* fourni par dialer.c sous DIALER_HOST_TEST */ + +int main(void) +{ + dialer_init(); + assert(dialer_idle()); /* vide au départ */ + + dialer_test_set_time_us(1000000); /* t = 1 s */ + dialer_push_digit(0); + dialer_push_digit(1); + dialer_push_digit(4); + assert(!dialer_idle()); + assert(strcmp(dialer_current(), "014") == 0); + + /* ms depuis le dernier chiffre */ + dialer_test_set_time_us(1000000 + 1500000); /* +1.5 s */ + assert(dialer_ms_since_last() == 1500); + + /* chiffres hors plage ignorés */ + dialer_push_digit(-1); + dialer_push_digit(10); + assert(strcmp(dialer_current(), "014") == 0); + + dialer_reset(); + assert(dialer_idle()); + assert(strcmp(dialer_current(), "") == 0); + + printf("dialer: 6/6 assertions OK\n"); + return 0; +} diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 78a59ce..b5c8f3b 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,5 +1,5 @@ idf_component_register( SRCS "app_main.c" INCLUDE_DIRS "." - REQUIRES nvs_flash config_store hal_es8388 hal_i2s audio_router slic_ks0835 + REQUIRES nvs_flash config_store hal_es8388 hal_i2s audio_router slic_ks0835 dialer )