From c6f05fa802904ad21e723c0e3487e2019f7eff74 Mon Sep 17 00:00:00 2001 From: jhchun Date: Fri, 12 Jun 2026 15:28:59 +0900 Subject: [PATCH] =?UTF-8?q?ADC=20read=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BB=A4=EB=A7=A8=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/src/parser.c b/src/parser.c index 58f2d7d..cd3597e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -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 },