diff --git a/src/drivers/battery/battery_adc.c b/src/drivers/battery/battery_adc.c index 4feaee2..7896cbf 100644 --- a/src/drivers/battery/battery_adc.c +++ b/src/drivers/battery/battery_adc.c @@ -253,21 +253,34 @@ void battery_protection_set_alignment_mode(bool enabled) */ void battery_protection_record_continuous(int batt_mv, int16_t temp_cdeg) { + bool batt_valid = (batt_mv >= 0) && (batt_mv != 0xFFFF); + bool temp_valid = (temp_cdeg != INT16_MIN) && ((uint16_t)temp_cdeg != 0xFFFF); + // 정렬모드 중에는 continuous 보호 판정 제외 if (alignment_mode_active) { return; } + if (!batt_valid && !temp_valid) + { + return; + } + // 15초 후 일반 60초 주기 모니터 재개 continuous_monitor_active_until_ms = k_uptime_get() + CONTINUOUS_MONITOR_ACTIVE_MS; - // periodic 모니터 카운트 초기화 - periodic_low_battery_cnt = 0; - periodic_high_temperature_cnt = 0; + if (batt_valid) + { + periodic_low_battery_cnt = 0; + record_battery_value(batt_mv, &continuous_low_battery_cnt, BATTERY_CONTINUOUS_MONITOR_LIMIT_COUNT, "continuous"); + } - record_battery_value(batt_mv, &continuous_low_battery_cnt, BATTERY_CONTINUOUS_MONITOR_LIMIT_COUNT, "continuous"); - record_temperature_value(temp_cdeg, &continuous_high_temperature_cnt, BATTERY_CONTINUOUS_MONITOR_LIMIT_COUNT, "continuous"); + if (temp_valid) + { + periodic_high_temperature_cnt = 0; + record_temperature_value(temp_cdeg, &continuous_high_temperature_cnt, BATTERY_CONTINUOUS_MONITOR_LIMIT_COUNT, "continuous"); + } } /* k_work 핸들러: 스레드 컨텍스트에서 ADC 읽기 (adc_read는 블로킹이라 ISR 불가) */