feat(tel): dialer accumulateur + test host

- components/dialer/{dialer.c,include/dialer.h,CMakeLists.txt}
- garde DIALER_HOST_TEST : stub esp_timer + ESP_LOGI no-op
- test host : 6/6 assertions OK (RED sans garde, GREEN avec)
- main/CMakeLists.txt : REQUIRES += dialer
- idf.py build : 1343/1343 OK
This commit is contained in:
clement
2026-06-19 10:43:30 +02:00
parent c5eabc44c5
commit a89fa2b746
5 changed files with 132 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
idf_component_register(
SRCS "dialer.c"
INCLUDE_DIRS "include"
REQUIRES esp_timer
)
+82
View File
@@ -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 <stdint.h>
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 <string.h>
#include <stdint.h>
#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;
}
+9
View File
@@ -0,0 +1,9 @@
#pragma once
#include <stdbool.h>
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);
+35
View File
@@ -0,0 +1,35 @@
#include "dialer.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
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;
}
+1 -1
View File
@@ -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
)