Compare commits
2 Commits
69c4e20f34
...
7cccee7cf2
| Author | SHA1 | Date | |
|---|---|---|---|
| 7cccee7cf2 | |||
| 4ed23a103c |
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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에서 최신 샘플 읽기
|
||||
*
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
+1
-1
@@ -3,4 +3,4 @@
|
||||
|
||||
SB_CONFIG_BOOTLOADER_MCUBOOT=y
|
||||
SB_CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y
|
||||
SB_CONFIG_BOOT_SIGNATURE_KEY_FILE="${APPLICATION_CONFIG_DIR}/keys/mcuboot_private.pem"
|
||||
SB_CONFIG_BOOT_SIGNATURE_KEY_FILE="${APPLICATION_CONFIG_DIR}/keys/mcuboot_private.pem"
|
||||
|
||||
Reference in New Issue
Block a user