Compare commits

...

2 Commits

Author SHA1 Message Date
jh.chun 7cccee7cf2 IMU FIFO 샘플 대기 함수 추가
- 샘플 부족 방지 안전장치
2026-07-15 15:45:08 +09:00
jh.chun 4ed23a103c 코드/주석 정리 2026-07-15 12:06:42 +09:00
7 changed files with 69 additions and 37 deletions
+7 -1
View File
@@ -139,7 +139,13 @@ int cmd_mtb(const uint8_t *data, uint8_t data_len)
{
if (fifo_started)
{
int imu_ret = imu_fifo_read_latest(tx_rim_samples, IMU_FIFO_RIM_TARGET_SAMPLES, &rim_count);
imu_ret = imu_fifo_wait_samples(IMU_FIFO_RIM_TARGET_SAMPLES, 500U);
if (imu_ret != 0)
{
DBG_PRINTF("[MTB] fifo wait ret=%d\r\n", imu_ret);
}
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);
+37
View File
@@ -615,6 +615,43 @@ int imu_fifo_start(void)
return 0;
}
int imu_fifo_wait_samples(uint16_t target_samples, uint32_t timeout_ms)
{
uint32_t waited_ms = 0U;
const uint32_t poll_ms = 10U;
if (target_samples == 0U)
{
return 0;
}
if (!fifo_active)
{
return -EALREADY;
}
while (waited_ms <= timeout_ms)
{
uint16_t record_count = 0U;
int ret = imu_fifo_read_count(&record_count);
if (ret)
{
return ret;
}
if (record_count >= target_samples)
{
return 0;
}
k_msleep(poll_ms);
waited_ms += poll_ms;
}
return -ETIMEDOUT;
}
int imu_fifo_read_latest(uint8_t *sample_bytes,
uint16_t max_samples,
uint16_t *out_count)
+7
View File
@@ -65,6 +65,13 @@ int imu_read_temperature_cdeg(int16_t *temp_cdeg);
*/
int imu_fifo_start(void);
/**
* @brief Wait until the running FIFO has at least target_samples records.
*
* @return 0 if the target is reached, -ETIMEDOUT on timeout, or a negative error.
*/
int imu_fifo_wait_samples(uint16_t target_samples, uint32_t timeout_ms);
/**
* @brief FIFO에서
*
+1
View File
@@ -217,6 +217,7 @@ led_state_t led_get_state(void)
return m_current_state;
}
/* DFU 진행 중 초록 LED ON 콜백 */
void led_ble_solid(void)
{
k_timer_stop(&m_led_timer);
+15 -32
View File
@@ -206,7 +206,7 @@ static void bond_reset_work_handler(struct k_work *work)
DBG_PRINTF("[BTN] BLE bond delete skipped (BT_SMP disabled)\r\n");
#endif
led_set_state(LED_STATE_BOND_DELETE); // 삭제 완료 확인 LED TEST
led_set_state(LED_STATE_BOND_DELETE); // 삭제 완료 확인 주황 LED ON
k_msleep(1500);
sys_reboot(SYS_REBOOT_COLD);
}
@@ -239,7 +239,7 @@ static void ble_rx_handler(const uint8_t *data, uint16_t len)
int err = k_work_submit_to_queue(&ble_cmd_work_q, &ble_cmd_work);
if (err < 0)
{
/* 예약 실패 시 pending 복구 */
// 예약 실패 시 pending 복구
key = k_spin_lock(&ble_cmd_lock);
ble_cmd_pending = false;
ble_cmd_len = 0U;
@@ -266,11 +266,7 @@ static void boot_context_detect(void)
#endif
// 소프트 리셋 계열 자동 복귀
resume_without_power_button =
(boot_reset_reason & (NRF_POWER_RESETREAS_SREQ_MASK |
NRF_POWER_RESETREAS_DOG_MASK |
NRF_POWER_RESETREAS_LOCKUP_MASK |
NRF_POWER_RESETREAS_RESETPIN_MASK)) != 0U;
resume_without_power_button = (boot_reset_reason & (NRF_POWER_RESETREAS_SREQ_MASK | NRF_POWER_RESETREAS_DOG_MASK | NRF_POWER_RESETREAS_LOCKUP_MASK | NRF_POWER_RESETREAS_RESETPIN_MASK)) != 0U;
if (boot_reset_reason != 0U)
{
@@ -289,11 +285,7 @@ static void power_hold_init(void)
#endif
// 리셋 복귀/DFU 확인 대기 시 즉시 래치
gpio_pin_configure_dt(&power_hold,
(resume_without_power_button ||
dfu_confirm_pending_boot ||
dfu_reset_resume_request) ? GPIO_OUTPUT_ACTIVE
: GPIO_OUTPUT_INACTIVE);
gpio_pin_configure_dt(&power_hold, (resume_without_power_button || dfu_confirm_pending_boot || dfu_reset_resume_request) ? GPIO_OUTPUT_ACTIVE : GPIO_OUTPUT_INACTIVE);
}
/* 전원 ON/OFF 제어 - P0.08 핀으로 물리적 전원 래치/해제 */
@@ -362,7 +354,7 @@ static void load_default_config(void)
// NVS 로드 전 기본값은 변경 가능 상태
m_passkey_changed = 0U;
/* 기본 상태값 */
// 기본 상태값
m_reset_status = 1;
bond_data_delete = true;
@@ -382,7 +374,7 @@ static void t_power_off_timeout_handler(struct k_timer *timer)
static void power_off_schedule(const char *reason, led_state_t led_state)
{
power_off_pending_reason = reason ? reason : "unknown";
DBG_ERR("[PWR] OFF scheduled reason = %s\r\n", power_off_pending_reason);
//DBG_ERR("[PWR] OFF scheduled reason = %s\r\n", power_off_pending_reason);
led_set_state(led_state);
k_timer_start(&m_power_off_delay_timer, K_MSEC(POWER_OFF_DELAY), K_NO_WAIT);
}
@@ -423,9 +415,6 @@ void power_button_suspend(bool suspend)
cnt_s = 0;
}
/* 전원 버튼 상태머신 (5ms 폴링) */
#define BOOT_THRESHOLD 200 // 5ms x 400 = 2초 -> 초기화 시간 고려 체감상 2초에 맞춤
static void main_s(struct k_timer *timer)
{
ARG_UNUSED(timer);
@@ -454,7 +443,7 @@ static void main_s(struct k_timer *timer)
if (cnt_s == BOOT_THRESHOLD) // 2초 도달: 래치 + 부팅 완료
{
device_on = true;
cnt_s = 0; // 카운터 리셋: 안 하면 다음 틱에서 ON→OFF 분기가 cnt_s >= 200 조건을 즉시 만족하여 전원 OFF됨
// cnt_s는 리셋하지 않음: 부팅 누름을 놓기 전(!boot_btn_released)까지 15초 본드 삭제 카운트를 연속 유지(놓는 순간 아래 분기에서 0으로 리셋)
power_control_handler(ON, "button-2s-latch");
led_set_state(LED_STATE_ADVERTISING);
k_work_submit(&adv_start_work);
@@ -466,9 +455,9 @@ static void main_s(struct k_timer *timer)
/* 전원 OFF 시퀀스 (ON → OFF) */
else
{
if (!boot_btn_released) // 부팅 시 눌렀던 버튼을 아직 안 놓음 → 대기
if (!boot_btn_released) // 부팅 때 누른 버튼을 아직 안 놓음
{
if (!button_pressed)
if (!button_pressed) // 놓음 → 이후부터 새 누름을 전원 OFF로 인식
{
boot_btn_released = true;
cnt_s = 0;
@@ -485,11 +474,11 @@ static void main_s(struct k_timer *timer)
}
}
}
else if (button_pressed) // 버튼 새로 누르고 있음
else if (button_pressed) // 켜진 뒤 새로 누름 → 2초 이상이면 자동 전원 OFF
{
cnt_s++;
if (cnt_s >= BOOT_THRESHOLD) // 2초 이상 → 전원 OFF
if (cnt_s >= BOOT_THRESHOLD)
{
battery_timer_stop();
k_work_submit(&adv_stop_work);
@@ -594,11 +583,11 @@ static enum mgmt_cb_return dfu_status_cb(uint32_t event, enum mgmt_cb_return pre
break;
case MGMT_EVT_OP_IMG_MGMT_DFU_STOPPED:
// 실패나 중단 시 일반 광고 LED로 복귀
k_work_cancel_delayable(&dfu_watchdog_work); // 중단/실패: 감시 종료
if (dfu_led_active)
{
dfu_led_active = false;
led_set_state(LED_STATE_ADVERTISING);
led_set_state(LED_STATE_ADVERTISING); // 실패나 중단 시 일반 광고 LED로 복귀
}
break;
@@ -609,13 +598,7 @@ static enum mgmt_cb_return dfu_status_cb(uint32_t event, enum mgmt_cb_return pre
return MGMT_CB_OK;
}
static enum mgmt_cb_return smp_cmd_status_cb(uint32_t event,
enum mgmt_cb_return prev_status,
int32_t *rc,
uint16_t *group,
bool *abort_more,
void *data,
size_t data_size)
static enum mgmt_cb_return smp_cmd_status_cb(uint32_t event, enum mgmt_cb_return prev_status, int32_t *rc, uint16_t *group, bool *abort_more, void *data, size_t data_size)
{
ARG_UNUSED(event);
ARG_UNUSED(prev_status);
@@ -766,7 +749,7 @@ int main(void)
DBG_CORE("\r\n========================================\r\n");
DBG_CORE(" TEST BUILD %s (Zephyr)\r\n", FIRMWARE_VERSION);
DBG_CORE(" BUILD TAG: TEST-003 - tx power dynamic control\r\n");
DBG_CORE(" BUILD TAG: %s\r\n", CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION);
DBG_CORE("========================================\r\n");
DBG_CORE("[INIT] HW Init\r\n");
+1 -3
View File
@@ -15,7 +15,7 @@
/*==============================================================================
* Firmware identification : Default values, can be overridden by NVS
*============================================================================*/
#define FIRMWARE_VERSION "TSTFW042"
#define FIRMWARE_VERSION "VBTFW0200"
#define HARDWARE_VERSION "VB0HW0000"
#define SERIAL_NUMBER "VBT260300ZZ"
#define DEFAULT_PASSKEY "123456"
@@ -33,7 +33,6 @@
/*==============================================================================
* Enumerations
*============================================================================*/
typedef enum
{
OFF = 0,
@@ -61,7 +60,6 @@ typedef enum
/*==============================================================================
* Function declarations
*============================================================================*/
void sleep_mode_enter(void);
void sleep_mode_enter_reason(const char *reason);
void device_power_off(void);