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:
@@ -0,0 +1,5 @@
|
||||
idf_component_register(
|
||||
SRCS "dialer.c"
|
||||
INCLUDE_DIRS "include"
|
||||
REQUIRES esp_timer
|
||||
)
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user