ADC read 테스트 커맨드
This commit is contained in:
+113
@@ -566,6 +566,70 @@ static int perform_single_piezo_capture(uint8_t cycles,
|
||||
|
||||
/* msn? → 배터리 전압 측정 → rsn: + mV */
|
||||
|
||||
static int perform_adc_only_capture(uint16_t num_samples,
|
||||
uint16_t averaging,
|
||||
uint8_t channel)
|
||||
{
|
||||
if (channel >= PIEZO_NUM_CHANNELS)
|
||||
{
|
||||
return ECHO_STATUS_MUX;
|
||||
}
|
||||
|
||||
if ((num_samples == 0U) || (num_samples > ECHO_ADC_MAX_SAMPLES))
|
||||
{
|
||||
return ECHO_STATUS_CAPTURE;
|
||||
}
|
||||
|
||||
if (averaging == 0U)
|
||||
{
|
||||
averaging = 1U;
|
||||
}
|
||||
|
||||
int err = piezo_select_channel(channel);
|
||||
if (err)
|
||||
{
|
||||
return ECHO_STATUS_MUX;
|
||||
}
|
||||
|
||||
k_busy_wait(PIEZO_POST_SELECT_SETTLE_US);
|
||||
|
||||
err = echo_adc_wake();
|
||||
if (err)
|
||||
{
|
||||
return ECHO_STATUS_CAPTURE;
|
||||
}
|
||||
|
||||
memset(echo_accum, 0, sizeof(echo_accum));
|
||||
|
||||
for (uint16_t avg = 0; avg < averaging; avg++)
|
||||
{
|
||||
if (avg > 0U)
|
||||
{
|
||||
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
|
||||
}
|
||||
|
||||
unsigned int key = irq_lock();
|
||||
err = echo_adc_capture(echo_capture, num_samples);
|
||||
irq_unlock(key);
|
||||
if (err)
|
||||
{
|
||||
return ECHO_STATUS_CAPTURE;
|
||||
}
|
||||
|
||||
for (uint16_t i = 0; i < num_samples; i++)
|
||||
{
|
||||
echo_accum[i] += echo_capture[i];
|
||||
}
|
||||
}
|
||||
|
||||
for (uint16_t i = 0; i < num_samples; i++)
|
||||
{
|
||||
echo_capture[i] = (uint16_t)(echo_accum[i] / averaging);
|
||||
}
|
||||
|
||||
return ECHO_STATUS_OK;
|
||||
}
|
||||
|
||||
static int cmd_msn(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
@@ -819,6 +883,54 @@ static int cmd_mec(const uint8_t *data, uint8_t data_len)
|
||||
* - reb: 패킷 6개 전송
|
||||
* - raa: 상태값은 전체 작업 성공/실패 요약
|
||||
*/
|
||||
static int cmd_mad(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
const piezo_config_t *cfg = piezo_config_get();
|
||||
uint16_t num_samples = cfg->samples;
|
||||
uint16_t averaging = cfg->avg;
|
||||
uint16_t piezo_ch = 0;
|
||||
uint8_t session = g_echo_session++;
|
||||
|
||||
get_data_u16_be(data, data_len, 2, &num_samples);
|
||||
get_data_u16_be(data, data_len, 4, &averaging);
|
||||
get_data_u16_be(data, data_len, 5, &piezo_ch);
|
||||
|
||||
if (num_samples > ECHO_ADC_MAX_SAMPLES)
|
||||
{
|
||||
num_samples = ECHO_ADC_MAX_SAMPLES;
|
||||
}
|
||||
if (averaging == 0U)
|
||||
{
|
||||
averaging = 1U;
|
||||
}
|
||||
|
||||
processing = true;
|
||||
power_button_suspend(true);
|
||||
|
||||
int status = start_piezo_session();
|
||||
if (status == ECHO_STATUS_OK)
|
||||
{
|
||||
status = perform_adc_only_capture(num_samples, averaging, (uint8_t)(piezo_ch % PIEZO_NUM_CHANNELS));
|
||||
}
|
||||
|
||||
if (status == ECHO_STATUS_OK)
|
||||
{
|
||||
send_response_echo(session, (uint8_t)(piezo_ch % PIEZO_NUM_CHANNELS), echo_capture, num_samples);
|
||||
}
|
||||
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
send_response_u16("raa:", (uint16_t)status);
|
||||
DBG_PRINTF("[CMD] mad status=0x%04X ch=%u samples=%u avg=%u\r\n",
|
||||
status,
|
||||
(uint16_t)(piezo_ch % PIEZO_NUM_CHANNELS),
|
||||
num_samples,
|
||||
averaging);
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int cmd_maa(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
@@ -1181,6 +1293,7 @@ static const cmd_entry_t cmd_table[] =
|
||||
{ "mpb?", cmd_mpb },
|
||||
{ "mpc?", cmd_mpc },
|
||||
{ "mec?", cmd_mec },
|
||||
{ "mad?", cmd_mad },
|
||||
{ "maa?", cmd_maa },
|
||||
{ "mbb?", cmd_mbb },
|
||||
{ "mcf?", cmd_mcf },
|
||||
|
||||
Reference in New Issue
Block a user