Files
VesiScan-Basic-firmware-test/project/ble_peripheral/ble_app_bladder_patch/power_control.c
jhchun a1ad2a4b5b fix: BLE TX 먹통 해결 및 메모리 안전성 개선
- binary_tx_handler를 dr_binary_tx_safe로 전체 교체 (APP_ERROR_CHECK 제거)
- data_tx_handler APP_ERROR_CHECK → DBG_PRINTF 교체
- memset/memcpy 하드코딩 크기를 define 상수로 교체 (버퍼 오버런 수정)
- SERIAL_NO_LENGTH, HW_NO_LENGTH, PASSKEY_LENGTH를 main.h로 통합
- 미사용 HW 드라이버/EEPROM 코드 삭제, TWI를 i2c_manager.c로 통합
- EEPROM → FDS 전환, 코드 리뷰 현황 문서 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:39:26 +09:00

154 lines
3.3 KiB
C

/*******************************************************************************
TEST medi50 Dec 23
//=========power_control.c====================
******************************************************************************/
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "main.h"
#include "power_control.h"
#include "nrf_delay.h"
#include "nrf_log.h"
#include "app_timer.h"
#include "debug_print.h"
#include "i2c_manager.h"
#define EEP_WP NRF_GPIO_PIN_MAP(0, 24)
APP_TIMER_DEF(m_power_timer_id);
// 2025-12-08 change to #define POWER_LOOP_INTERVAL 30 -> 20
#define POWER_LOOP_INTERVAL 20
static uint8_t p_order;
extern volatile bool processing;
bool lock_check = false;
void power_gpio_init(void)
{
nrf_gpio_cfg_output(EEP_WP);
}
void eeprom_control(on_off_cont_t eeprom_st)
{
if(eeprom_st == OFF) {
nrf_gpio_pin_clear(EEP_WP);
}else if(eeprom_st == ON){
nrf_gpio_pin_set(EEP_WP);
}
}
int device_sleep_mode(void){
int rc = 0;
eeprom_control(OFF);
nrf_delay_ms(2);
DBG_PRINTF("Device_Sleep_Mode OK!\r\n");
nrf_delay_ms(10);
processing = false;
return rc;
}
int device_activated(void){
int rc = 0;
p_order = 0;
lock_check =true;
power_timer_start();
eeprom_control(OFF);
return rc;
}
/**
* @brief Power-up sequence state machine
*
* Executes hardware initialization steps
* Called by app_timer at POWER_LOOP_INTERVAL (20ms)
*
* Sequence:
* 0: I2C init
* 1: (reserved)
* 2: Complete
*/
void power_loop(void *p_context)
{
UNUSED_PARAMETER(p_context);
power_timer_stop();
#if DEBUG_MINIMAL_BOOT
/* Minimal Boot: Skip sensor initialization */
DBG_PRINTF("[PWR] Minimal mode - skipping sensor init\r\n");
p_order = 2; // Jump to complete
#else
/* Full Boot: Execute power sequence */
switch (p_order) {
/* Step 0: I2C Initialize */
case 0:
sw_i2c_init_once();
nrf_delay_ms(10);
DBG_PRINTF("[PWR] Step %d: I2C Init\r\n", p_order);
break;
/* Step 1: Reserved */
case 1:
DBG_PRINTF("[PWR] Step %d: (reserved)\r\n", p_order);
break;
/* Step 2: Complete */
case 2:
DBG_PRINTF("[PWR] Step %d: Sequence Complete\r\n", p_order);
break;
default:
break;
}
#endif
/* Advance to next step or finish */
if (p_order < 2) {
p_order++;
power_timer_start();
} else {
DBG_PRINTF("[PWR] Device Activated OK!\r\n");
}
}
int device_reactivated(void){
int rc = 0;
sw_i2c_init_once();
nrf_delay_ms(10);
lock_check = true;
p_order = 0;
power_timer_start();
return rc;
}
void power_timer_start(void)
{
APP_ERROR_CHECK(app_timer_start(m_power_timer_id, APP_TIMER_TICKS(POWER_LOOP_INTERVAL), NULL));
}
void power_timer_stop(void)
{
APP_ERROR_CHECK(app_timer_stop(m_power_timer_id));
}
void power_timer_init(void) //active start
{
APP_ERROR_CHECK(app_timer_create(&m_power_timer_id, APP_TIMER_MODE_SINGLE_SHOT, power_loop));
// 2025-12-08 change to APP_TIMER_MODE_REPEATED mode
//APP_ERROR_CHECK(app_timer_create(&m_power_timer_id, APP_TIMER_MODE_REPEATED, power_loop));
}