Initial Commit
This commit is contained in:
+284
-253
@@ -17,8 +17,280 @@
|
||||
static uint8_t tx_rim_samples[IMU_FIFO_RIM_TARGET_SAMPLES * IMU_FIFO_SAMPLE_BYTES];
|
||||
|
||||
/*
|
||||
* 테스트용
|
||||
* mpa?: piezo 전원 ON
|
||||
* 주기 측정 명령
|
||||
* mbb?: piezo echo sweep + 배터리 + IMU + IMU 온도 측정
|
||||
* - 성공 시 rbb 1개, reb 6개, raa 상태값 전송
|
||||
* - processing=true 구간에서는 내부 모니터의 I2C 접근을 막는 기준으로 사용
|
||||
*
|
||||
* - 순서:
|
||||
* 1. battery / imu / temp 측정
|
||||
* 2. rbb: 1개 전송
|
||||
* 3. piezo / echo ADC 준비
|
||||
* 4. piezo 6채널 burst
|
||||
* 5. echo 샘플 채널별로 모으기
|
||||
* 6. reb: 6개 전송
|
||||
* 7. raa: 상태값 전송
|
||||
*/
|
||||
int cmd_mbb(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
uint8_t session = cmd_next_echo_session();
|
||||
|
||||
int16_t accel[3];
|
||||
int16_t gyro[3];
|
||||
|
||||
processing = true;
|
||||
power_button_suspend(true);
|
||||
DBG_PRINTF("[MBB] cmd start\r\n");
|
||||
|
||||
int batt_mv = -1;
|
||||
int16_t temp_cdeg = INT16_MIN;
|
||||
|
||||
/* Read battery first (idle measurement) so mbb? result matches msn? */
|
||||
DBG_PRINTF("[MBB] battery read (idle)\r\n");
|
||||
batt_mv = battery_read_mv();
|
||||
|
||||
int status = piezo_measure_start_session();
|
||||
|
||||
if (status == ECHO_STATUS_OK) // Piezo GPIO, power, ADC initialization/wake succeeded
|
||||
{
|
||||
DBG_PRINTF("[MBB] imu/temp read\r\n");
|
||||
imu_read_with_temperature(accel, gyro, &temp_cdeg);
|
||||
|
||||
battery_protection_record_continuous(batt_mv, temp_cdeg); // update protection counters for continuous monitoring
|
||||
|
||||
DBG_PRINTF("[MBB] response rbb: tx start\r\n");
|
||||
cmd_send_response_bundle((uint16_t)batt_mv, accel, gyro, temp_cdeg);
|
||||
|
||||
DBG_PRINTF("[MBB] piezo sweep start\r\n");
|
||||
status = piezo_measure_sweep();
|
||||
if (status == ECHO_STATUS_OK)
|
||||
{
|
||||
for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++)
|
||||
{
|
||||
DBG_PRINTF("[MBB] response reb: tx start ch=%d\r\n", ch);
|
||||
cmd_send_response_echo(session, ch, piezo_measure_channel_buffer(ch), piezo_config_get()->samples);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
DBG_PRINTF("[MBB] done\r\n");
|
||||
cmd_send_response_u16("raa:", (uint16_t)status); // 최종 상태 raa: 전송
|
||||
DBG_PRINTF("[CMD] mbb status=0x%04X\r\n", status);
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 정렬모드
|
||||
* mtb?: IMU FIFO + piezo echo sweep
|
||||
* - 순서:
|
||||
* 1. IMU FIFO start
|
||||
* 2. piezo 6채널 burst
|
||||
* 3. echo 샘플 채널별로 모으기
|
||||
* 4. reb: 패킷 6개 전송
|
||||
* 5. raa: 상태값 전송
|
||||
* 6. rim: IMU FIFO 15 샘플 전송
|
||||
*/
|
||||
int cmd_mtb(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
uint8_t session = cmd_next_echo_session();
|
||||
uint16_t rim_count = 0U;
|
||||
bool fifo_started = false;
|
||||
|
||||
processing = true;
|
||||
power_button_suspend(true);
|
||||
DBG_PRINTF("[MTB] cmd start\r\n");
|
||||
|
||||
int imu_ret = imu_fifo_start();
|
||||
if (imu_ret != 0)
|
||||
{
|
||||
DBG_PRINTF("[MTB] fifo start fail ret=%d\r\n", imu_ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
fifo_started = true;
|
||||
}
|
||||
|
||||
int status = piezo_measure_start_session();
|
||||
|
||||
if (status == ECHO_STATUS_OK) // Piezo GPIO, power, ADC initialization/wake succeeded
|
||||
{
|
||||
DBG_PRINTF("[MTB] piezo sweep start\r\n");
|
||||
status = piezo_measure_sweep();
|
||||
if (status == ECHO_STATUS_OK)
|
||||
{
|
||||
for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++)
|
||||
{
|
||||
DBG_PRINTF("[MTB] response reb: tx start ch=%d\r\n", ch);
|
||||
cmd_send_response_echo(session, ch, piezo_measure_channel_buffer(ch), piezo_config_get()->samples);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cmd_send_response_u16("raa:", (uint16_t)status); // 최종 상태 raa: 전송
|
||||
|
||||
if (status == ECHO_STATUS_OK)
|
||||
{
|
||||
if (fifo_started)
|
||||
{
|
||||
int imu_ret = imu_fifo_read_latest(tx_rim_samples, IMU_FIFO_RIM_TARGET_SAMPLES, &rim_count);
|
||||
if (imu_ret != 0)
|
||||
{
|
||||
DBG_PRINTF("[MTB] fifo read fail ret=%d\r\n", imu_ret);
|
||||
rim_count = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
cmd_send_response_rim(tx_rim_samples, rim_count); // IMU FIFO 샘플 rim: 전송
|
||||
}
|
||||
DBG_PRINTF("[CMD] mtb status=0x%04X\r\n", status);
|
||||
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
DBG_PRINTF("[CMD] mtb status=0x%04X rim=%u\r\n", status, rim_count);
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* mcf?: piezo measurement parameter read
|
||||
*/
|
||||
int cmd_mcf(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
const piezo_config_t *cfg = piezo_config_get();
|
||||
cmd_send_response_piezo_config("rcf:", cfg->freq, cfg->cycles, cfg->avg, cfg->delay_us, cfg->samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* mcs?: piezo measurement parameter write
|
||||
*/
|
||||
int cmd_mcs(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
piezo_config_t cfg;
|
||||
|
||||
if (data_len < 10U)
|
||||
{
|
||||
cmd_send_response_piezo_config("rcs:", 0xFFFF, 0U, 0U, 0U, 0U);
|
||||
return 1;
|
||||
}
|
||||
|
||||
cmd_get_data_u16_be(data, data_len, 0, &cfg.freq);
|
||||
cmd_get_data_u16_be(data, data_len, 1, &cfg.cycles);
|
||||
cmd_get_data_u16_be(data, data_len, 2, &cfg.avg);
|
||||
cmd_get_data_u16_be(data, data_len, 3, &cfg.delay_us);
|
||||
cmd_get_data_u16_be(data, data_len, 4, &cfg.samples);
|
||||
|
||||
if (!piezo_config_validate(&cfg))
|
||||
{
|
||||
cmd_send_response_piezo_config("rcs:", 0xFFFF, cfg.cycles, cfg.avg, cfg.delay_us, cfg.samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int err = piezo_config_set(&cfg);
|
||||
if (err)
|
||||
{
|
||||
cmd_send_response_piezo_config("rcs:", 0xFFFD, cfg.cycles, cfg.avg, cfg.delay_us, cfg.samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const piezo_config_t *saved_cfg = piezo_config_get();
|
||||
cmd_send_response_piezo_config("rcs:", saved_cfg->freq, saved_cfg->cycles, saved_cfg->avg, saved_cfg->delay_us, saved_cfg->samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// =============================== Test Command ===============================
|
||||
/* TEST
|
||||
* mim? : IMU FIFO 15 samples
|
||||
*/
|
||||
int cmd_mim(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
uint16_t rim_count = 0U;
|
||||
int imu_ret = imu_fifo_start();
|
||||
if (imu_ret != 0)
|
||||
{
|
||||
DBG_PRINTF("[MTB] fifo start fail ret=%d\r\n", imu_ret);
|
||||
cmd_send_response_rim(tx_rim_samples, 0U);
|
||||
return 1;
|
||||
}
|
||||
|
||||
k_msleep(320); // IMU FIFO is 50Hz, 15 samples need about 300ms
|
||||
|
||||
imu_ret = imu_fifo_read_latest(tx_rim_samples, IMU_FIFO_RIM_TARGET_SAMPLES, &rim_count);
|
||||
if (imu_ret != 0)
|
||||
{
|
||||
DBG_PRINTF("[MIM] fifo read fail ret=%d\r\n", imu_ret);
|
||||
rim_count = 0U;
|
||||
}
|
||||
|
||||
cmd_send_response_rim(tx_rim_samples, rim_count); // IMU FIFO 15 samples rim: 전송
|
||||
imu_fifo_stop();
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* TEST (이전 정렬모드)
|
||||
* maa?: piezo echo sweep
|
||||
* - 순서:
|
||||
* 1. piezo 6채널 burst
|
||||
* 2. echo 샘플 채널별로 모으기
|
||||
* 3. reb: 패킷 6개 전송
|
||||
* 4. raa: 상태값 전송
|
||||
*/
|
||||
int cmd_maa(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
uint8_t session = cmd_next_echo_session();
|
||||
|
||||
processing = true;
|
||||
power_button_suspend(true);
|
||||
|
||||
int status = piezo_measure_start_session();
|
||||
|
||||
if (status == ECHO_STATUS_OK) // Piezo GPIO, power, ADC initialization/wake succeeded
|
||||
{
|
||||
DBG_PRINTF("[MBB] piezo sweep start\r\n");
|
||||
status = piezo_measure_sweep();
|
||||
if (status == ECHO_STATUS_OK)
|
||||
{
|
||||
for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++)
|
||||
{
|
||||
DBG_PRINTF("[MBB] response reb: tx start ch=%d\r\n", ch);
|
||||
cmd_send_response_echo(session, ch, piezo_measure_channel_buffer(ch), piezo_config_get()->samples);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
cmd_send_response_u16("raa:", (uint16_t)status); // 최종 상태 raa: 전송
|
||||
DBG_PRINTF("[CMD] maa status=0x%04X\r\n", status);
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* TEST
|
||||
* mpa?: piezo power ON
|
||||
*/
|
||||
int cmd_mpa(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
@@ -42,8 +314,8 @@ int cmd_mpa(const uint8_t *data, uint8_t data_len)
|
||||
}
|
||||
|
||||
/*
|
||||
* 테스트용
|
||||
* mpb?: piezo 전원 OFF
|
||||
* TEST
|
||||
* mpb?: piezo power OFF
|
||||
*/
|
||||
int cmd_mpb(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
@@ -67,9 +339,8 @@ int cmd_mpb(const uint8_t *data, uint8_t data_len)
|
||||
}
|
||||
|
||||
/*
|
||||
* 테스트용
|
||||
* mpc?: burst만 한 번 발생시키는 테스트 명령
|
||||
* echo를 읽지 않고 초음파가 나가는지만 볼 때 사용
|
||||
* TEST
|
||||
* mpc?: burst only
|
||||
*/
|
||||
int cmd_mpc(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
@@ -109,10 +380,7 @@ int cmd_mpc(const uint8_t *data, uint8_t data_len)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 현재 Zephyr 포팅본은 2.1MHz SW burst 하나만 구현되어 있음
|
||||
* 레거시의 freq_option 값은 받아두되, 아직은 같은 burst 함수로 처리
|
||||
*/
|
||||
// 현재 2.1MHz 고정
|
||||
piezo_burst_sw((uint8_t)cycles);
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
@@ -122,8 +390,8 @@ int cmd_mpc(const uint8_t *data, uint8_t data_len)
|
||||
}
|
||||
|
||||
/*
|
||||
* 테스트용
|
||||
* mec?: 단일 채널 burst + echo capture
|
||||
* TEST
|
||||
* mec?: 1 channel burst + echo capture
|
||||
*/
|
||||
int cmd_mec(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
@@ -180,11 +448,8 @@ int cmd_mec(const uint8_t *data, uint8_t data_len)
|
||||
}
|
||||
|
||||
/*
|
||||
* 테스트용
|
||||
* mad?: 단일 채널 echo capture만 수행
|
||||
* - piezo burst는 하지 않고 echo ADC만 수행
|
||||
* - echo 샘플을 모은 뒤 reb: 패킷 1개 전송
|
||||
* - raa: 상태값은 전체 작업 성공/실패 요약
|
||||
* TEST
|
||||
* mad?: 1 channel echo capture only
|
||||
*/
|
||||
int cmd_mad(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
@@ -232,238 +497,4 @@ int cmd_mad(const uint8_t *data, uint8_t data_len)
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 테스트용(이전 정렬모드)
|
||||
* maa?: piezo echo sweep
|
||||
* - 순서:
|
||||
* 1. piezo 6채널 burst
|
||||
* 2. echo 샘플 채널별로 모으기
|
||||
* 3. reb: 패킷 6개 전송
|
||||
* 4. raa: 상태값은 전체 작업 성공/실패 요약
|
||||
*/
|
||||
int cmd_maa(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
uint8_t session = cmd_next_echo_session();
|
||||
|
||||
processing = true;
|
||||
power_button_suspend(true);
|
||||
|
||||
int status = piezo_measure_start_session();
|
||||
|
||||
if (status == ECHO_STATUS_OK) // Piezo GPIO, 전원, ADC 초기화/wake 성공
|
||||
{
|
||||
DBG_PRINTF("[MBB] piezo sweep start\r\n");
|
||||
status = piezo_measure_sweep();
|
||||
|
||||
for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++)
|
||||
{
|
||||
DBG_PRINTF("[MBB] response reb: tx start ch=%d\r\n", ch);
|
||||
cmd_send_response_echo(session, ch, piezo_measure_channel_buffer(ch), piezo_config_get()->samples);
|
||||
}
|
||||
}
|
||||
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
cmd_send_response_u16("raa:", (uint16_t)status); // 최종 상태값 raa: 전송
|
||||
DBG_PRINTF("[CMD] maa status=0x%04X\r\n", status);
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 전체 측정 명령
|
||||
* mbb?: piezo echo sweep + 배터리 + IMU + IMU 온도 측정
|
||||
* - 성공 시 rbb 1개, reb 6개, raa 상태값 전송
|
||||
* - processing=true 구간에서는 내부 모니터의 I2C 접근을 막는 기준으로 사용
|
||||
*
|
||||
* - 순서:
|
||||
* 1. battery / imu / temp 측정
|
||||
* 2. rbb: 1개 전송
|
||||
* 3. piezo / echo ADC 준비
|
||||
* 4. piezo 6채널 burst
|
||||
* 5. echo 샘플 채널별로 모으기
|
||||
* 6. reb: 6개 전송
|
||||
* 7. raa: 최종 상태 전송
|
||||
*/
|
||||
int cmd_mbb(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
uint8_t session = cmd_next_echo_session();
|
||||
|
||||
int16_t accel[3];
|
||||
int16_t gyro[3];
|
||||
|
||||
processing = true;
|
||||
power_button_suspend(true);
|
||||
DBG_PRINTF("[MBB] cmd start\r\n");
|
||||
|
||||
int status = piezo_measure_start_session();
|
||||
|
||||
int batt_mv = -1;
|
||||
int16_t temp_cdeg = INT16_MIN;
|
||||
|
||||
if (status == ECHO_STATUS_OK) // Piezo GPIO, 전원, ADC 초기화/wake 성공
|
||||
{
|
||||
DBG_PRINTF("[MBB] battery read\r\n");
|
||||
batt_mv = battery_read_mv();
|
||||
|
||||
DBG_PRINTF("[MBB] imu/temp read\r\n");
|
||||
imu_read_with_temperature(accel, gyro, &temp_cdeg);
|
||||
|
||||
DBG_PRINTF("[MBB] response rbb: tx start\r\n");
|
||||
cmd_send_response_bundle((uint16_t)batt_mv, accel, gyro, temp_cdeg);
|
||||
|
||||
DBG_PRINTF("[MBB] piezo sweep start\r\n");
|
||||
status = piezo_measure_sweep();
|
||||
|
||||
for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++)
|
||||
{
|
||||
DBG_PRINTF("[MBB] response reb: tx start ch=%d\r\n", ch);
|
||||
cmd_send_response_echo(session, ch, piezo_measure_channel_buffer(ch), piezo_config_get()->samples);
|
||||
}
|
||||
}
|
||||
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
DBG_PRINTF("[MBB] done\r\n");
|
||||
cmd_send_response_u16("raa:", (uint16_t)status); // 최종 상태값 raa: 전송
|
||||
DBG_PRINTF("[CMD] mbb status=0x%04X\r\n", status);
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 정렬모드
|
||||
* mtb?: IMU FIFO + piezo echo sweep
|
||||
* - 순서:
|
||||
* 1. IMU FIFO start
|
||||
* 2. piezo 6채널 burst
|
||||
* 3. echo 샘플 채널별로 모으기
|
||||
* 4. reb: 패킷 6개 전송
|
||||
* 5. raa: 상태값은 전체 작업 성공/실패 요약
|
||||
* - IMU FIFO 샘플은 rim: 패킷으로 전송
|
||||
*/
|
||||
int cmd_mtb(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
uint8_t session = cmd_next_echo_session();
|
||||
uint16_t rim_count = 0U;
|
||||
bool fifo_started = false;
|
||||
|
||||
processing = true;
|
||||
power_button_suspend(true);
|
||||
DBG_PRINTF("[MTB] cmd start\r\n");
|
||||
|
||||
int imu_ret = imu_fifo_start();
|
||||
if (imu_ret != 0)
|
||||
{
|
||||
DBG_PRINTF("[MTB] fifo start fail ret=%d\r\n", imu_ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
fifo_started = true;
|
||||
}
|
||||
|
||||
int status = piezo_measure_start_session();
|
||||
|
||||
if (status == ECHO_STATUS_OK) // Piezo GPIO, 전원, ADC 초기화/wake 성공
|
||||
{
|
||||
DBG_PRINTF("[MTB] piezo sweep start\r\n");
|
||||
status = piezo_measure_sweep();
|
||||
|
||||
for (uint8_t ch = 0; ch < PIEZO_NUM_CHANNELS; ch++)
|
||||
{
|
||||
DBG_PRINTF("[MTB] response reb: tx start ch=%d\r\n", ch);
|
||||
cmd_send_response_echo(session, ch, piezo_measure_channel_buffer(ch), piezo_config_get()->samples);
|
||||
}
|
||||
}
|
||||
|
||||
cmd_send_response_u16("raa:", (uint16_t)status); // 최종 상태값 raa: 전송
|
||||
|
||||
if (fifo_started)
|
||||
{
|
||||
int imu_ret = imu_fifo_read_latest(tx_rim_samples, IMU_FIFO_RIM_TARGET_SAMPLES, &rim_count);
|
||||
if (imu_ret != 0)
|
||||
{
|
||||
DBG_PRINTF("[MTB] fifo read fail ret=%d\r\n", imu_ret);
|
||||
rim_count = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
cmd_send_response_rim(tx_rim_samples, rim_count); // IMU FIFO 샘플 rim: 전송
|
||||
DBG_PRINTF("[CMD] mtb status=0x%04X\r\n", status);
|
||||
|
||||
piezo_power_off();
|
||||
power_button_suspend(false);
|
||||
DBG_PRINTF("[CMD] mtb status=0x%04X rim=%u\r\n", status, rim_count);
|
||||
|
||||
processing = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* mcf?: piezo 측정 파라미터 읽기
|
||||
* 응답 rcf: + 설정값 echo back
|
||||
*/
|
||||
int cmd_mcf(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
ARG_UNUSED(data);
|
||||
ARG_UNUSED(data_len);
|
||||
|
||||
const piezo_config_t *cfg = piezo_config_get();
|
||||
cmd_send_response_piezo_config("rcf:", cfg->freq, cfg->cycles, cfg->avg, cfg->delay_us, cfg->samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* mcs?: piezo 측정 파라미터 쓰기
|
||||
*/
|
||||
int cmd_mcs(const uint8_t *data, uint8_t data_len)
|
||||
{
|
||||
piezo_config_t cfg;
|
||||
|
||||
if (data_len < 10U)
|
||||
{
|
||||
cmd_send_response_piezo_config("rcs:", 0xFFFF, 0U, 0U, 0U, 0U);
|
||||
return 1;
|
||||
}
|
||||
|
||||
cmd_get_data_u16_be(data, data_len, 0, &cfg.freq);
|
||||
cmd_get_data_u16_be(data, data_len, 1, &cfg.cycles);
|
||||
cmd_get_data_u16_be(data, data_len, 2, &cfg.avg);
|
||||
cmd_get_data_u16_be(data, data_len, 3, &cfg.delay_us);
|
||||
cmd_get_data_u16_be(data, data_len, 4, &cfg.samples);
|
||||
|
||||
if (!piezo_config_validate(&cfg))
|
||||
{
|
||||
cmd_send_response_piezo_config("rcs:", 0xFFFF, cfg.cycles, cfg.avg, cfg.delay_us, cfg.samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int err = piezo_config_set(&cfg);
|
||||
if (err)
|
||||
{
|
||||
cmd_send_response_piezo_config("rcs:", 0xFFFD, cfg.cycles, cfg.avg, cfg.delay_us, cfg.samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const piezo_config_t *saved_cfg = piezo_config_get();
|
||||
cmd_send_response_piezo_config("rcs:", saved_cfg->freq, saved_cfg->cycles, saved_cfg->avg, saved_cfg->delay_us, saved_cfg->samples);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* mls? → LED 상태 변경 → rls: + state echo back
|
||||
* 파라미터: [state(2B LE)] — led_state_t enum 값
|
||||
* 0=OFF, 4=DETACH_WARNING, 5=ALIGN_SEARCHING, 6=ALIGN_COMPLETE, 7=ERROR
|
||||
* 에러 응답: 0xFFFF=파라미터 없음, 0xFFFE=범위 초과 */
|
||||
}
|
||||
Reference in New Issue
Block a user