175 lines
5.5 KiB
C
175 lines
5.5 KiB
C
/*******************************************************************************
|
|
* @file main.c
|
|
* @brief VesiScan-Basic
|
|
******************************************************************************/
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/sys/printk.h>
|
|
#include <hal/nrf_power.h>
|
|
|
|
#include "main.h"
|
|
#include "debug_print.h"
|
|
#include "power_control.h"
|
|
#include "dfu_manager.h"
|
|
#include "led_control.h"
|
|
#include "ble_service.h"
|
|
#include "battery_adc.h"
|
|
#include "ble_cmd_queue.h"
|
|
#include "imu_i2c.h"
|
|
#include "piezo_measure.h"
|
|
|
|
LOG_MODULE_REGISTER(vesiscan, LOG_LEVEL_INF);
|
|
|
|
volatile bool ble_connection_st = false; // BLE 연결 상태
|
|
volatile bool processing = false; // 센서 데이터 처리 중 플래그
|
|
bool bond_data_delete = true; // 본딩 데이터 삭제 요청
|
|
uint32_t m_life_cycle = 0; // 디바이스 수명 카운터
|
|
uint8_t m_reset_status = 1; // 리셋 상태 코드
|
|
char SERIAL_NO[SERIAL_NO_BUF_SIZE]; // 시리얼 번호
|
|
char HW_NO[HW_NO_BUF_SIZE]; // 하드웨어 번호
|
|
char m_static_passkey[PASSKEY_BUF_SIZE]; // BLE 정적 패스키
|
|
uint8_t m_passkey_changed; // 패스키 변경은 출고 후 1회만 허용
|
|
|
|
static bool resume_without_power_button; // 리셋 후 버튼 없이 복귀
|
|
static bool dfu_confirm_pending_boot; // DFU test 이미지 확인 전 자동 복귀
|
|
static bool dfu_reset_resume_request; // DFU 완료 리셋 후 자동 복귀
|
|
static uint32_t boot_reset_reason; // RESETREAS 원본 값
|
|
/* 전원 유지 (POWER_HOLD) 제어 */
|
|
static void boot_context_detect(void)
|
|
{
|
|
// 부팅 원인 확인
|
|
boot_reset_reason = nrf_power_resetreas_get(NRF_POWER);
|
|
|
|
// DFU 완료 직후 리셋인지 확인
|
|
#if NRF_POWER_HAS_GPREGRET
|
|
dfu_reset_resume_request = (nrf_power_gpregret_get(NRF_POWER, DFU_RESUME_GPREGRET_REG) == DFU_RESUME_MAGIC);
|
|
if (dfu_reset_resume_request)
|
|
{
|
|
nrf_power_gpregret_set(NRF_POWER, DFU_RESUME_GPREGRET_REG, 0U);
|
|
}
|
|
#else
|
|
dfu_reset_resume_request = false;
|
|
#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;
|
|
|
|
if (boot_reset_reason != 0U)
|
|
{
|
|
// RESETREAS 플래그 정리
|
|
nrf_power_resetreas_clear(NRF_POWER, boot_reset_reason);
|
|
}
|
|
}
|
|
|
|
static void load_default_config(void)
|
|
{
|
|
// 기본 문자열 길이 제한
|
|
size_t serial_len = strlen(SERIAL_NUMBER);
|
|
size_t hw_len = strlen(HARDWARE_VERSION);
|
|
size_t passkey_len = strlen(DEFAULT_PASSKEY);
|
|
|
|
if (serial_len > SERIAL_NO_LENGTH)
|
|
{
|
|
serial_len = SERIAL_NO_LENGTH;
|
|
}
|
|
|
|
if (hw_len > HW_NO_LENGTH)
|
|
{
|
|
hw_len = HW_NO_LENGTH;
|
|
}
|
|
|
|
if (passkey_len > PASSKEY_LENGTH)
|
|
{
|
|
passkey_len = PASSKEY_LENGTH;
|
|
}
|
|
|
|
memset(SERIAL_NO, 0, sizeof(SERIAL_NO));
|
|
memcpy(SERIAL_NO, SERIAL_NUMBER, serial_len);
|
|
|
|
// 기본 HW Version 복사
|
|
memset(HW_NO, 0, sizeof(HW_NO));
|
|
memcpy(HW_NO, HARDWARE_VERSION, hw_len);
|
|
|
|
// 기본 BLE 패스키 복사
|
|
memset(m_static_passkey, 0, sizeof(m_static_passkey));
|
|
memcpy(m_static_passkey, DEFAULT_PASSKEY, passkey_len);
|
|
|
|
// NVS 로드 전 기본값은 변경 가능 상태
|
|
m_passkey_changed = 0U;
|
|
|
|
// 기본 상태값
|
|
m_reset_status = 1;
|
|
bond_data_delete = true;
|
|
|
|
DBG_CORE("[INIT] Default (S/N=%s)\r\n", SERIAL_NO);
|
|
}
|
|
|
|
/* 메인 함수 */
|
|
int main(void)
|
|
{
|
|
// 리셋/복귀 컨텍스트
|
|
boot_context_detect();
|
|
|
|
// 하드웨어 기본 초기화
|
|
#if defined(CONFIG_BOOTLOADER_MCUBOOT)
|
|
dfu_confirm_pending_boot = dfu_is_confirm_pending_boot();
|
|
#else
|
|
dfu_confirm_pending_boot = false;
|
|
#endif
|
|
power_control_latch_init(resume_without_power_button || dfu_confirm_pending_boot || dfu_reset_resume_request);
|
|
power_control_reset_state();
|
|
dfu_confirm_running_image();
|
|
|
|
DBG_CORE("\r\n========================================\r\n");
|
|
DBG_CORE(" TEST BUILD %s (Zephyr)\r\n", FIRMWARE_VERSION);
|
|
DBG_CORE(" BUILD TAG: %s\r\n", CONFIG_MCUBOOT_IMGTOOL_SIGN_VERSION);
|
|
DBG_CORE("========================================\r\n");
|
|
|
|
DBG_CORE("[INIT] HW Init\r\n");
|
|
// 기본 하드웨어/센서 초기화
|
|
power_control_init();
|
|
ble_cmd_queue_init();
|
|
dfu_manager_init();
|
|
dfu_log_mcuboot_state();
|
|
load_default_config();
|
|
led_init();
|
|
battery_adc_init();
|
|
battery_timer_init();
|
|
imu_init();
|
|
piezo_config_init();
|
|
DBG_CORE("[INIT] HW - gpio/timer/config/led/batt/imu/temp/piezo-cfg OK\r\n");
|
|
|
|
// BLE 스택 + NUS
|
|
DBG_CORE("[INIT] BLE Init\r\n");
|
|
if (ble_service_init(ble_cmd_queue_rx_handler) == 0)
|
|
{
|
|
DBG_CORE("[INIT] BLE - ble/nus OK\r\n");
|
|
// 소프트 리셋 후 서비스 복구
|
|
if (resume_without_power_button || dfu_confirm_pending_boot || dfu_reset_resume_request)
|
|
{
|
|
power_control_resume_after_reset(boot_reset_reason);
|
|
}
|
|
// BLE 준비까지 확인한 뒤 DFU test 이미지를 확정
|
|
dfu_confirm_running_image();
|
|
}
|
|
else
|
|
{
|
|
DBG_ERR("[INIT] BLE - ble/nus FAIL\r\n");
|
|
}
|
|
|
|
DBG_CORE("========================================\r\n");
|
|
DBG_CORE(" READY [%s]\r\n", SERIAL_NO);
|
|
DBG_CORE("========================================\r\n");
|
|
|
|
// 전원 버튼 상태머신 시작 (부팅 시 버튼이 눌려있는 상태)
|
|
power_control_start();
|
|
|
|
// 메인 루프 - idle
|
|
for (;;)
|
|
{
|
|
k_msleep(100);
|
|
}
|
|
|
|
return 0;
|
|
}
|