Piezo 측정 파라미터 FDS 저장/측정 경로 범위 검증 통일

- frequency: 1.7M(3) / 1.8M(0) / 1.9M(9) / 2.0M(2) / 2.1M(1) / 2.2M(4)
  * 그 외의 값이 들어올 경우 1로 저장(기본 fallback 2.1MHz)
- cycles: 최소 3 ~ 최대 7
  * 3 미만의 값이 들어올 경우 3, 7 초과의 값이 들어올 경우 7 저장
- avgeraging: 최소 1 ~ 최대 10
  * 1 미만의 값이 들어올 경우 1, 10 초과의 값이 들어올 경우 10 저장
- dealy_us: 최소 0 ~ 최대 50
  * 0 미만의 값이 들어올 경우 0, 50 초과의 값이 들어올 경우 50 저장
- num samples: 최소 80 ~ 최대 119
  * 80 미만의 값이 들어올 경우 80, 119 초과의 값이 들어올 경우 119 저장
This commit is contained in:
2026-05-06 15:01:41 +09:00
parent bc528307c0
commit 8d9cb6e307
3 changed files with 188 additions and 59 deletions
@@ -17,6 +17,88 @@
#include "dr_piezo.h"
#include "dr_adc121s051.h"
/*------------------------------------------------------------------------------
* Internal clamp helpers for persisted piezo configuration
*----------------------------------------------------------------------------*/
static uint8_t clamp_piezo_freq_option(uint16_t raw_freq)
{
/* Keep the existing option-code protocol:
* 0=1.8MHz, 1=2.1MHz, 2=2.0MHz, 3=1.7MHz, 4=2.2MHz, 9=1.9MHz
* Unknown values fall back to 2.1MHz (code 1).
*/
switch (raw_freq)
{
case 3: /* 1.7MHz */
return 3;
case 0: /* 1.8MHz */
return 0;
case 9: /* 1.9MHz */
return 9;
case 2: /* 2.0MHz */
return 2;
case 1: /* 2.1MHz */
return 1;
case 4: /* 2.2MHz */
return 4;
default:
return 1; /* unknown code -> default to 2.1MHz */
}
}
static uint8_t clamp_piezo_cycles(uint16_t cycles)
{
if (cycles < 3)
{
return 3;
}
if (cycles > 7)
{
return 7;
}
return (uint8_t)cycles;
}
static uint16_t clamp_piezo_averaging(uint16_t averaging)
{
if (averaging < 1)
{
return 1;
}
if (averaging > 10)
{
return 10;
}
return averaging;
}
static uint16_t clamp_piezo_delay_us(uint16_t delay_us)
{
if (delay_us > 50)
{
return 50;
}
return delay_us;
}
static uint16_t clamp_piezo_num_samples(uint16_t num_samples)
{
if (num_samples < 80)
{
return 80;
}
if (num_samples > 119)
{
return 119;
}
return num_samples;
}
/*==============================================================================
* mpa? -> rpa: Enable piezo TX/RX circuit
*
@@ -303,6 +385,13 @@ int Cmd_mcf(const ParsedCmd *cmd)
*
* Request: [TAG 4B "mcs?"] [freq 2B] [cycles 2B] [avg 2B] [delay_us 2B] [num_samples 2B] [CRC 2B]
* Response: [TAG 4B "rcs:"] [stored 5 values] [CRC 2B]
* Notes:
* - Stored values are clamped before saving
* - freq : 1.8/1.9/2.0/2.1/2.2 MHz only
* - cycles : 3..7
* - avg : 1..10
* - delay_us : 0..50
* - samples : 80..119
* Error: rcs: + 0xFFFF (insufficient data)
*============================================================================*/
int Cmd_mcs(const ParsedCmd *cmd)
@@ -324,11 +413,11 @@ int Cmd_mcs(const ParsedCmd *cmd)
dr_get_u16(cmd, 3, &delay_us);
dr_get_u16(cmd, 4, &num_samples);
m_config.piezo_freq_option = (uint8_t)freq;
m_config.piezo_cycles = (uint8_t)cycles;
m_config.piezo_averaging = averaging;
m_config.piezo_delay_us = delay_us;
m_config.piezo_num_samples = num_samples;
m_config.piezo_freq_option = clamp_piezo_freq_option(freq);
m_config.piezo_cycles = clamp_piezo_cycles(cycles);
m_config.piezo_averaging = clamp_piezo_averaging(averaging);
m_config.piezo_delay_us = clamp_piezo_delay_us(delay_us);
m_config.piezo_num_samples = clamp_piezo_num_samples(num_samples);
config_save();
uint8_t *buf = ble_bin_buffer;