diff --git a/src/parser.c b/src/parser.c index 3da0e90..5dc8c43 100644 --- a/src/parser.c +++ b/src/parser.c @@ -52,10 +52,11 @@ static uint16_t echo_capture[ECHO_ADC_MAX_SAMPLES]; static uint32_t echo_accum[ECHO_ADC_MAX_SAMPLES]; static uint8_t tx_u16_buf[8]; static uint8_t tx_imu_buf[18]; -static uint8_t tx_echo_buf[4 + 2 + (ECHO_ADC_MAX_SAMPLES * 2) + 2]; +static uint8_t tx_echo_buf[4 + 2 + 2 + (ECHO_ADC_MAX_SAMPLES * 2) + 2]; static uint8_t tx_bundle_buf[22]; static uint8_t tx_cfg_buf[16]; static uint8_t tx_ascii_buf[4 + HW_NO_LENGTH + 2]; +static uint8_t g_echo_session; static piezo_config_t g_piezo_config = { .freq = PIEZO_CFG_FREQ_DEFAULT, .cycles = PIEZO_CFG_CYCLES_DEFAULT, @@ -269,26 +270,28 @@ static int send_response_imu(const int16_t accel[3], const int16_t gyro[3]) return ble_data_send(buf, 18); } -static void send_response_echo(const uint16_t *samples, uint16_t num_samples) +static void send_response_echo(uint8_t session, uint8_t channel, const uint16_t *samples, uint16_t num_samples) { /* - * reb: 패킷은 최대 208바이트라서 스택 지역변수로 두면 + * reb: 패킷은 최대 210바이트라서 스택 지역변수로 두면 * mbb?처럼 반복 호출할 때 워커 스택을 꽤 먹는다. * 현재는 한 번에 하나의 명령만 처리하므로 정적 버퍼를 재사용한다. */ uint8_t *buf = tx_echo_buf; buf[0] = 'r'; buf[1] = 'e'; buf[2] = 'b'; buf[3] = ':'; - buf[4] = (uint8_t)(num_samples >> 8); - buf[5] = (uint8_t)(num_samples & 0xFF); + buf[4] = session; + buf[5] = channel; + buf[6] = (uint8_t)(num_samples >> 8); + buf[7] = (uint8_t)(num_samples & 0xFF); for (uint16_t i = 0; i < num_samples; i++) { - buf[6 + i * 2] = (uint8_t)(samples[i] >> 8); - buf[7 + i * 2] = (uint8_t)(samples[i] & 0xFF); + buf[8 + i * 2] = (uint8_t)(samples[i] >> 8); + buf[9 + i * 2] = (uint8_t)(samples[i] & 0xFF); } - uint16_t payload_len = 4 + 2 + (num_samples * 2); + uint16_t payload_len = 4 + 2 + 2 + (num_samples * 2); uint16_t crc = dr_crc16_compute(buf, payload_len); buf[payload_len] = (uint8_t)(crc & 0xFF); buf[payload_len + 1] = (uint8_t)(crc >> 8); @@ -727,6 +730,7 @@ static int cmd_mec(const uint8_t *data, uint8_t data_len) uint16_t cycles = cfg->cycles; uint16_t averaging = cfg->avg; uint16_t piezo_ch = 0; + uint8_t session = g_echo_session++; get_data_u16_be(data, data_len, 0, &freq_option); get_data_u16_be(data, data_len, 1, &delay_us); @@ -765,7 +769,7 @@ static int cmd_mec(const uint8_t *data, uint8_t data_len) if (status == ECHO_STATUS_OK) { - send_response_echo(echo_capture, num_samples); + send_response_echo(session, (uint8_t)(piezo_ch % PIEZO_NUM_CHANNELS), echo_capture, num_samples); } piezo_power_off(); @@ -788,6 +792,8 @@ static int cmd_maa(const uint8_t *data, uint8_t data_len) ARG_UNUSED(data); ARG_UNUSED(data_len); + uint8_t session = g_echo_session++; + processing = true; power_button_suspend(true); @@ -801,7 +807,7 @@ static int cmd_maa(const uint8_t *data, uint8_t data_len) { for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++) { - send_response_echo(piezo_channels[ch], piezo_config_get()->samples); + send_response_echo(session, ch, piezo_channels[ch], piezo_config_get()->samples); } } @@ -822,6 +828,8 @@ static int cmd_mbb(const uint8_t *data, uint8_t data_len) ARG_UNUSED(data); ARG_UNUSED(data_len); + uint8_t session = g_echo_session++; + int16_t accel[3]; int16_t gyro[3]; @@ -892,7 +900,7 @@ static int cmd_mbb(const uint8_t *data, uint8_t data_len) { /* reb: 채널별 raw echo 파형 */ DBG_PRINTF("[MBB] tx reb ch=%d\r\n", ch); - send_response_echo(piezo_channels[ch], piezo_config_get()->samples); + send_response_echo(session, ch, piezo_channels[ch], piezo_config_get()->samples); } }