Compare commits

..

5 Commits

Author SHA1 Message Date
jh.chun 41137a1c72 빌드 시 FW Version 포함 release hex 자동 복사 추가
- 일반 빌드 시 build/merged.hex를 release/VesiScan-Basic_<FIRMWARE_VERSION>.hex 형식으로 자동 복사하도록 추가
- 생산용 HEX 파일을 펌웨어 버전별로 관리할 수 있게 함
2026-07-28 16:13:21 +09:00
jh.chun 79b5e2b7ce Piezo 채널 0 측정 전 warmup delay(3ms) 상수화 2026-07-24 15:16:58 +09:00
jh.chun 4ecec2f0f2 채널0 측정 시작 전 dummy burst + ADC capture 5회에서 1회로 변경(다음주 최종 수정 필요)
- 채널 0 흔들림 개선을 위함
- 현재 평균 5회 이상 신호 양호
2026-07-24 11:24:38 +09:00
jh.chun abb8d6078a 전원 버튼 ON/OFF 임계 카운트 분리
- 버튼 감지 타이밍이 초기화 등으로 런타임과 달라서 체감상 3초로 맞추기 위해 분리
2026-07-21 15:51:25 +09:00
jh.chun b6d79ad16a Kconfig 정리 2026-07-21 15:06:39 +09:00
4 changed files with 58 additions and 19 deletions
+1 -6
View File
@@ -125,7 +125,7 @@ CONFIG_BOOTLOADER_MCUBOOT=y
# Enable zcbor library used by mcumgr/SMP/DFU CBOR payloads.
CONFIG_ZCBOR=y
# Version string used by MCUboot imgtool signing and versioned DFU zip naming.
CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION="0.0.2+26"
CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION="0.0.0+0"
# Internal flash
# Enable internal flash driver.
@@ -182,8 +182,3 @@ CONFIG_MCUMGR_GRP_OS=y
CONFIG_IMG_MANAGER=y
# Write uploaded image data to flash as a stream.
CONFIG_STREAM_FLASH=y
# Netcore HCI IPC
# nRF52840 build does not use network core HCI IPC.
#CONFIG_SB_CONFIG_NETCORE_HCI_IPC=y
#SB_CONFIG_NETCORE_HCI_IPC=y
+18 -4
View File
@@ -39,7 +39,10 @@
#define PIEZO_AVG_INTER_BURST_GAP_US 650
/* real capture 전에 같은 채널에서 버스트+ADC capture를 버리는 횟수(dummy) */
#define PIEZO_DUMMY_CAPTURE_COUNT 5
#define PIEZO_DUMMY_CAPTURE_COUNT 1
/* 채널 0 시작 전 안정을 위한 추가 딜레이 */
#define PIEZO_CH0_WARMUP_TO_REAL_SETTLE_US 3000
/* 6채널 sweep 결과 (각 채널의 평균 완료 후 최종만 저장) */
static uint16_t piezo_channels[PIEZO_NUM_CHANNELS][PIEZO_MEASURE_MAX_SAMPLES];
@@ -230,7 +233,8 @@ int piezo_measure_sweep(void)
if (ch == 0U) // 채널 0 시작 전에만 dummy burst + ADC capture 수행
{
// Dummy burst - ADC caputre는 수행하지 않음
// Dummy burst + ADC caputre
/*
for (uint8_t dummy = 0; dummy < PIEZO_DUMMY_CAPTURE_COUNT; dummy++)
{
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
@@ -251,10 +255,20 @@ int piezo_measure_sweep(void)
DBG_PRINTF("[ECHO] dummy capture fail ch=%d dummy=%d err=%d\r\n", ch, dummy, err);
return ECHO_STATUS_CAPTURE;
}
}*/
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US);
piezo_burst_sw_freq(freq, cycles);
k_busy_wait(capture_delay_us);
err = echo_adc_capture(echo_capture, samples);
if (err)
{
//DBG_PRINTF("[ECHO] dummy capture fail ch=%d dummy=%d err=%d\r\n", ch, dummy, err);
return ECHO_STATUS_CAPTURE;
}
// 마지막 dummy capture와 첫 real capture 사이에도 같은 회복 시간
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US + 3000);
// 마지막 dummy capture와 첫 real capture 사이에도 같은 회복 시간 + 추가 안정화
k_busy_wait(PIEZO_AVG_INTER_BURST_GAP_US + PIEZO_CH0_WARMUP_TO_REAL_SETTLE_US);
}
// 여기부터 실제 평균에 들어갈 capture
+8 -7
View File
@@ -17,11 +17,12 @@
#include "ble_service.h"
#include "battery_adc.h"
#define POWER_HOLD_NODE DT_NODELABEL(pwr_hold) // 전원 래치
#define POWER_BTN_NODE DT_NODELABEL(button_check) // 전원 버튼
#define POWER_LOOP_INTERVAL 20 // 전원 시퀀스 타이머 간격(ms)
#define BOOT_THRESHOLD 350 // power button hold threshold
#define BOND_RESET_THRESHOLD (15000 / POWER_ON_DELAY) // 15s long press bond reset
#define POWER_HOLD_NODE DT_NODELABEL(pwr_hold) // 전원 래치
#define POWER_BTN_NODE DT_NODELABEL(button_check) // 전원 버튼
#define POWER_LOOP_INTERVAL 20 // 전원 시퀀스 타이머 간격(ms)
#define POWER_ON_THRESHOLD 350 // power button hold threshold(off -> on)
#define POWER_OFF_THRESHOLD 500 // power button hold threshold(on -> off)
#define BOND_RESET_THRESHOLD (15000 / POWER_ON_DELAY) // 15s long press bond reset
static const struct gpio_dt_spec power_hold = GPIO_DT_SPEC_GET(POWER_HOLD_NODE, gpios); // 전원 유지 출력
static const struct gpio_dt_spec power_btn = GPIO_DT_SPEC_GET(POWER_BTN_NODE, gpios); // 전원 버튼 입력
@@ -211,7 +212,7 @@ static void main_s(struct k_timer *timer)
{
cnt_s++;
if (cnt_s == BOOT_THRESHOLD) // 임계 시간 도달 시 전원 ON 확정
if (cnt_s == POWER_ON_THRESHOLD) // 임계 시간 도달 시 전원 ON 확정
{
device_on = true;
power_control_handler(ON, "button-2s-latch");
@@ -248,7 +249,7 @@ static void main_s(struct k_timer *timer)
{
cnt_s++;
if (cnt_s >= BOOT_THRESHOLD)
if (cnt_s >= POWER_OFF_THRESHOLD)
{
battery_timer_stop();
k_work_submit(&adv_stop_work);
+29
View File
@@ -75,3 +75,32 @@ if(EXISTS "${APP_PRJ_CONF}")
)
endif()
endif()
# Production HEX file name based on src/main.h FIRMWARE_VERSION.
set(APP_MAIN_H "${APP_DIR}/src/main.h")
if(EXISTS "${APP_MAIN_H}")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${APP_MAIN_H}")
file(READ "${APP_MAIN_H}" APP_MAIN_H_TEXT)
if(APP_MAIN_H_TEXT MATCHES "#define[ \t]+FIRMWARE_VERSION[ \t]+\"([^\"]+)\"")
set(FW_HEX_VERSION "${CMAKE_MATCH_1}")
string(REGEX REPLACE "[^A-Za-z0-9_.+-]" "_" FW_HEX_VERSION "${FW_HEX_VERSION}")
set(FW_HEX_SOURCE "${CMAKE_BINARY_DIR}/merged.hex")
set(FW_HEX_RELEASE_DIR "${APP_DIR}/release")
set(FW_HEX_VERSIONED "${FW_HEX_RELEASE_DIR}/VesiScan-Basic_${FW_HEX_VERSION}.hex")
add_custom_command(
OUTPUT "${FW_HEX_VERSIONED}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${FW_HEX_RELEASE_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FW_HEX_SOURCE}" "${FW_HEX_VERSIONED}"
DEPENDS "${FW_HEX_SOURCE}"
COMMENT "Generating firmware-versioned HEX ${FW_HEX_VERSIONED}"
VERBATIM
)
add_custom_target(firmware_versioned_hex ALL
DEPENDS "${FW_HEX_VERSIONED}"
)
endif()
endif()