2026-08-10 21:18:36 +08:00
/* app_loop.c - FreeRTOS <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȷ<EFBFBD> װ
*
* <EFBFBD> <EFBFBD> <EFBFBD> ֣ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѭ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѯ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֶ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* net_task ( <EFBFBD> <EFBFBD> <EFBFBD> ȼ <EFBFBD> 3 , ջ 3 KB ) - <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״ ̬ <EFBFBD> <EFBFBD> NET_process <EFBFBD> <EFBFBD> 4 G / WiFi <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> շ <EFBFBD> <EFBFBD> <EFBFBD> OTA <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* app_task ( <EFBFBD> <EFBFBD> <EFBFBD> ȼ <EFBFBD> 2 , ջ 2 KB ) - ҵ <EFBFBD> ̵ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> / <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״ ̬ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ͷ ι <EFBFBD> ӡ <EFBFBD> ״ ̬ <EFBFBD> ϱ <EFBFBD> <EFBFBD> <EFBFBD> OTA ȷ <EFBFBD> <EFBFBD>
* sys_task ( <EFBFBD> <EFBFBD> <EFBFBD> ȼ <EFBFBD> 1 , ջ 1 KB ) - ϵ ͳ <EFBFBD> <EFBFBD> LED <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ӡ
* idle <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> - ι IWDG <EFBFBD> <EFBFBD> ֻ Ҫ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ź <EFBFBD> <EFBFBD> Ͳ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѭ <EFBFBD> <EFBFBD> ռ CPU ʱ idle <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ҫ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ <EFBFBD> <EFBFBD>
*
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ <EFBFBD> <EFBFBD> <EFBFBD> ⣺
* g_net_at_mutex - NET_publish_ * <EFBFBD> 볤 AT <EFBFBD> Ự <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> / <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ⣬ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʧ <EFBFBD> <EFBFBD> ֱ <EFBFBD> Ӷ <EFBFBD> <EFBFBD> <EFBFBD>
* s_storage_mutex - EEPROM ( <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> I2C ) / W25Q64 ( <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> SPI ) <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʻ <EFBFBD> <EFBFBD> ⣨ storage_lock <EFBFBD> <EFBFBD>
* log <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> - log . c <EFBFBD> ڲ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ⣬ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ־ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֯
*/
# include "app_loop.h"
# include "app_common.h"
# include "user_cmd.h"
# include "relay.h"
# include "network.h"
# include "led.h"
# include "adc.h"
# include "feed_scale.h"
# include "iic.h"
# include "24c02.h"
# include "uart.h"
# include "log_cn.h"
# include "ble_at.h"
2026-08-12 14:32:03 +08:00
# include "hlw8032.h"
2026-08-15 01:00:17 +08:00
# include "oled.h"
2026-08-10 21:18:36 +08:00
# include "reset_log.h"
# include "../W25Q64/w25q64.h"
# include "FreeRTOS.h"
# include "task.h"
# include "semphr.h"
/*==== <20> 洢<EFBFBD> <E6B4A2> <EFBFBD> <EFBFBD> <DFBB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> EEPROM/W25Q64 <20> <> <EFBFBD> <EFBFBD> һ <EFBFBD> ѵ ݹ<D1B5> <DDB9> <EFBFBD> <EFBFBD> <EFBFBD> ====*/
static SemaphoreHandle_t s_storage_mutex = NULL ;
void storage_lock_init ( void )
{
s_storage_mutex = xSemaphoreCreateRecursiveMutex ( ) ;
}
void storage_lock ( void )
{
if ( s_storage_mutex & & xTaskGetSchedulerState ( ) = = taskSCHEDULER_RUNNING ) {
xSemaphoreTakeRecursive ( s_storage_mutex , portMAX_DELAY ) ;
}
}
void storage_unlock ( void )
{
if ( s_storage_mutex & & xTaskGetSchedulerState ( ) = = taskSCHEDULER_RUNNING ) {
xSemaphoreGiveRecursive ( s_storage_mutex ) ;
}
}
/*==== ҵ<> <D2B5> ģ<EFBFBD> <C4A3> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> ã<EFBFBD> <C3A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> £<EFBFBD> ====*/
void app_init ( void )
{
log_info ( " " ) ;
log_info ( " * * * * * * * * * * * * * * * * * * " ) ;
2026-08-11 12:44:49 +08:00
log_info ( " * <20> 汾: %s (RTOS) * " , FIRMWARE_VERSION_STR ) ;
2026-08-10 21:18:36 +08:00
log_info ( " * * * * * * * By Helei * * * * " ) ;
/* EEPROM <20> е <EFBFBD> MQTT/<2F> 汾<EFBFBD> <E6B1BE> <EFBFBD> <EFBFBD> */
iicInit ( ) ;
eepromReadInfo ( ) ;
log_load_level ( ) ; /* <20> ָ<EFBFBD> <D6B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ־<EFBFBD> ȼ<EFBFBD> */
log_info ( " > <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> : %s:%d " , MqttInfoStr . ServerIP , MqttInfoStr . ServerPort ) ;
log_info ( " > <20> ͻ<EFBFBD> <CDBB> <EFBFBD> ID: %s " , MqttInfoStr . ClientID ) ;
log_info ( " > <20> û<EFBFBD> <C3BB> <EFBFBD> : %s " , MqttInfoStr . Username ) ;
log_info ( " > <20> 汾<EFBFBD> <E6B1BE> <EFBFBD> <EFBFBD> : %u " , MqttInfoStr . Ver ) ;
/* W25Q64 <20> ⲿ Flash<73> <68> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> OTA <20> ̼<EFBFBD> <CCBC> ݴ<EFBFBD> */
W25Q64_Init ( ) ;
/* <20> <> <EFBFBD> ɱ<EFBFBD> <C9B1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ¼<EFBFBD> <C2BC> ԭ<EFBFBD> <D4AD> +<2B> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ӡ<EFBFBD> <D3A1> <EFBFBD> <EFBFBD> 10 <20> <> */
reset_log_boot ( ) ;
/* <20> ̵<EFBFBD> <CCB5> <EFBFBD> GPIO<49> <4F> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> + <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 룩 */
relayInit ( ) ;
2026-08-15 07:36:39 +08:00
/* <20> <> Ʒ ģʽ <C4A3> <CABD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> ӣ<DEB3> EEPROM <20> <> <EFBFBD> У <EFBFBD> Ĭ<EFBFBD> ϸ<EFBFBD> <CFB8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ꣩ */
feed_scale_load_mode ( ) ;
2026-08-18 19:26:06 +08:00
gps_load_mode ( ) ; /* GPS <20> <> λ<EFBFBD> <CEBB> <EFBFBD> أ<EFBFBD> EEPROM 173<37> <33> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> GPS0/1 <20> л<EFBFBD> <D0BB> <EFBFBD> */
2026-08-15 07:36:39 +08:00
2026-08-10 21:18:36 +08:00
/* RS485 ι <> ϳ ӿ<CFB3> <D3BF> <EFBFBD> ģ<EFBFBD> <C4A3> */
feedScaleInit ( ) ;
/* LED<45> <44> LED2 <20> <> <EFBFBD> <EFBFBD> ͬʱ<CDAC> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> ⲿ<EFBFBD> <E2B2BF> <EFBFBD> Ź<EFBFBD> TPL5010 ι <> <CEB9> <EFBFBD> <EFBFBD> */
ledInit ( ) ;
/* ADC <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
adcInit ( ) ;
update_batter ( ) ;
2026-08-12 14:32:03 +08:00
/* HLW8032 <20> <> <EFBFBD> ܼ<EFBFBD> <DCBC> <EFBFBD> <EFBFBD> <EFBFBD> UART5 PD2<44> <32> ֻ<EFBFBD> ۼƵ<DBBC> <C6B5> <EFBFBD> <EFBFBD> <EFBFBD> */
hlw8032_init ( ) ;
2026-08-15 01:00:17 +08:00
/* OLED <20> <> Ļ<EFBFBD> <C4BB> 128x64 + GB2312 <20> ֿ<EFBFBD> IC<49> <43> */
oled_init ( ) ;
2026-08-15 07:43:26 +08:00
if ( g_feed_scale_on ) { oled_locate ( 1 , 1 ) ; oled_print ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˮ<EFBFBD> <EFBFBD> Ͷ<EFBFBD> ϻ<EFBFBD> " ) ; }
else { oled_locate ( 1 , 1 ) ; oled_print ( " <EFBFBD> ̵<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ն<EFBFBD> " ) ; }
2026-08-15 07:27:30 +08:00
oled_locate ( 2 , 2 ) ; oled_print ( " V " FIRMWARE_VERSION_STR " RTOS " ) ;
2026-08-15 01:00:17 +08:00
log_info ( " > OLED: <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
2026-08-10 21:18:36 +08:00
/* <20> <> <EFBFBD> <EFBFBD> ģ<EFBFBD> <C4A3> <EFBFBD> <EFBFBD> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> EEPROM <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴγ ɹ<CEB3> <C9B9> <EFBFBD> ʽ <EFBFBD> <CABD> <EFBFBD> ȣ <EFBFBD> 4G <20> <> WiFi<46> <69> */
NET_init ( ) ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ·<EFBFBD> <C2B7> <EFBFBD> ڽ<EFBFBD> <DABD> <EFBFBD> */
USART2_StartRx ( ) ; /* RS485 ι <> ϳ <EFBFBD> */
USART3_StartRx ( ) ; /* 4G MQTT <20> <> Ϣ<EFBFBD> <CFA2> DMA+IDLE */
USART1_StartRx ( ) ; /* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
/* <20> ϵ<EFBFBD> <CFB5> <EFBFBD> HLK-B40 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ MQTT ClientID<49> <44> <EFBFBD> <EFBFBD> ̨<EFBFBD> 豸<EFBFBD> <E8B1B8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
ble_at_init ( ) ;
ble_setup_name ( ) ;
}
/*==== net_task<73> <6B> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״̬<D7B4> <CCAC> <EFBFBD> <EFBFBD> 4G/WiFi <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> շ<EFBFBD> <D5B7> <EFBFBD> OTA<54> <41> ====*/
static void net_task ( void * arg )
{
( void ) arg ;
for ( ; ; ) {
NET_process ( ) ;
vTaskDelay ( 5 ) ;
}
}
/*==== app_task<73> <6B> ҵ<EFBFBD> <D2B5> <EFBFBD> <EFBFBD> <DFBC> <EFBFBD> <EFBFBD> ̵<EFBFBD> <CCB5> <EFBFBD> /<2F> <> /<2F> ϱ <EFBFBD> /OTA ȷ<> ϣ<EFBFBD> ====*/
static void app_task ( void * arg )
{
( void ) arg ;
/* <20> <> ѭ<EFBFBD> <D1AD> ״̬<D7B4> <CCAC> <EFBFBD> <EFBFBD> */
static uint8_t ota_confirmed = 0 ;
static uint8_t ota_simulate_fail = 0 ; /* =1<> <31> <EFBFBD> ԣ<EFBFBD> ģ<EFBFBD> <C4A3> OTA ȷ<> <C8B7> ʧ<EFBFBD> ܣ<EFBFBD> <DCA3> <EFBFBD> ֤<EFBFBD> <D6A4> <EFBFBD> ˣ<EFBFBD> */
static uint8_t ota_fail_logged = 0 ;
static uint32_t ota_confirm_tick = 0 ;
2026-08-16 19:14:20 +08:00
static uint8_t ota_report_pending = 0 ;
static uint32_t ota_report_tick = 0 ;
2026-08-10 21:18:36 +08:00
static uint32_t mqtt_ready_tick = 0 ;
static uint8_t mqtt_ready_recorded = 0 ;
static uint8_t mqtt_first_status_reported = 0 ;
for ( ; ; ) {
/* <20> <> ¼ MQTT <20> ״ξ<D7B4> <CEBE> <EFBFBD> ʱ<EFBFBD> <CAB1> */
if ( ! mqtt_ready_recorded & & g_net_mqtt_ready ) {
mqtt_ready_recorded = 1 ;
mqtt_ready_tick = HAL_GetTick ( ) ;
}
/* MQTT <20> ״ξ<D7B4> <CEBE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ȱ<EFBFBD> EEPROM <20> ָ<EFBFBD> <D6B8> ̵<EFBFBD> <CCB5> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ״̬<D7B4> <CCAC> <EFBFBD> ϵ<EFBFBD> <CFB5> <EFBFBD> <EFBFBD> 䣩<EFBFBD> <E4A3A9>
* <EFBFBD> <EFBFBD> <EFBFBD> ϱ <EFBFBD> һ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״ ̬ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ƽ ̨ ˢ <EFBFBD> <EFBFBD> Ϊ <EFBFBD> <EFBFBD> ʵ ״ ̬ */
if ( g_net_mqtt_ready & & ! mqtt_first_status_reported ) {
mqtt_first_status_reported = 1 ;
relayRestoreState ( ) ;
relayStatueUpdata ( ) ;
2026-08-18 22:50:28 +08:00
{ /* ÿ<> <C3BF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϱ <EFBFBD> һ <EFBFBD> δ<EFBFBD> <CEB4> <EFBFBD> <EFBFBD> 汾<EFBFBD> <E6B1BE> "1.5.0:15"<22> <> <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> 汾 + EEPROM <20> 汾<EFBFBD> <E6B1BE> <EFBFBD> ţ<EFBFBD> */
char verbuf [ 24 ] ;
snprintf ( verbuf , sizeof ( verbuf ) , " %s:%u " ,
FIRMWARE_VERSION_STR , ( unsigned ) MqttInfoStr . Ver ) ;
NET_publish_version ( verbuf ) ;
}
2026-08-10 21:18:36 +08:00
log_info ( " > Main: MQTT Ready <20> <> <EFBFBD> ״<EFBFBD> ״̬<D7B4> ϱ <EFBFBD> " ) ;
ota_confirm_tick = HAL_GetTick ( ) ;
}
2026-08-16 19:14:20 +08:00
/* <20> ״η<D7B4> <CEB7> <EFBFBD> <EFBFBD> ɹ<EFBFBD> <C9B9> <EFBFBD> <EFBFBD> ӳ<EFBFBD> 9s <20> <> OTA ȷ<> ϣ<EFBFBD> <CFA3> ܿ<EFBFBD> <DCBF> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϱ <EFBFBD> <CFB1> 籩<EFBFBD> <E7B1A9> pow/ICCID/״̬/<2F> <> <EFBFBD> ܣ<EFBFBD> */
2026-08-10 21:18:36 +08:00
if ( ! ota_confirmed & & g_net_mqtt_ready & & g_net_first_publish_ok & &
2026-08-16 19:14:20 +08:00
( HAL_GetTick ( ) - ota_confirm_tick ) > 9000 ) {
2026-08-10 21:18:36 +08:00
if ( ota_simulate_fail ) {
if ( ! ota_fail_logged ) {
ota_fail_logged = 1 ;
log_info ( " > OTA ȷ<> <C8B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģ<EFBFBD> <C4A3> ʧ<EFBFBD> ܣ<EFBFBD> <DCA3> <EFBFBD> <EFBFBD> ڻ<EFBFBD> <DABB> ˲<EFBFBD> <CBB2> ԣ<EFBFBD> " ) ;
}
/* <20> <> <EFBFBD> <EFBFBD> λ ota_confirmed<65> <64> <EFBFBD> <EFBFBD> 1 <20> <> <EFBFBD> ӽ<EFBFBD> <D3BD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ */
} else {
ota_confirmed = 1 ;
2026-08-16 19:14:20 +08:00
if ( NET_ota_confirm ( ) < 0 ) { /* <0 <20> <> <EFBFBD> <EFBFBD> δ<EFBFBD> ʹ 1=<3D> <EFBFBD> <DEB9> <EFBFBD> OTA <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
ota_report_pending = 1 ; /* ֪ͨδ<D6AA> ʹ 30s <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
ota_report_tick = HAL_GetTick ( ) ;
log_warn ( " > OTA ȷ<> <C8B7> ֪ͨδ<D6AA> ʹ <CDB4> Ժ<EFBFBD> <D4BA> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
} else {
log_info ( " > OTA <20> <> ȷ<EFBFBD> ϣ<EFBFBD> MQTT Ready + <20> ״η<D7B4> <CEB7> <EFBFBD> <EFBFBD> ɹ<EFBFBD> + <20> ӳ<EFBFBD> 9s<39> <73> " ) ;
}
}
}
/* OTA ȷ<> <C8B7> ֪ͨδ<D6AA> ʹ ÿ 30s <20> <> <EFBFBD> <EFBFBD> ֱ<EFBFBD> <D6B1> <EFBFBD> ɹ<EFBFBD> <C9B9> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȷ<EFBFBD> ϱ <EFBFBD> ־<EFBFBD> <D6BE> <EFBFBD> <EFBFBD> <EFBFBD> ̣<EFBFBD> <CCA3> <EFBFBD> <EFBFBD> <EFBFBD> ƽ ̨֪ͨ<CDA8> <D6AA> */
if ( ota_report_pending & & g_net_mqtt_ready & &
( HAL_GetTick ( ) - ota_report_tick ) > 30000 ) {
ota_report_tick = HAL_GetTick ( ) ;
if ( NET_ota_confirm ( ) > = 0 ) {
ota_report_pending = 0 ;
log_info ( " > OTA ȷ<> <C8B7> ֪ͨ<CDA8> <D6AA> <EFBFBD> Գɹ<D4B3> " ) ;
2026-08-10 21:18:36 +08:00
}
}
/* MQTT <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 1 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> δ<EFBFBD> ״<EFBFBD> MPUB<55> <42> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ */
if ( ! ota_confirmed & & mqtt_ready_recorded & &
( HAL_GetTick ( ) - mqtt_ready_tick ) > OTA_HEALTH_TIMEOUT_MS ) {
log_warn ( " > OTA <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ: MQTT Ready <20> <> 1 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> MPUB<55> <42> <EFBFBD> <EFBFBD> λ " ) ;
reset_log_mark ( RSN_OTA_HEALTH ) ;
W25Q64_OTA_IncTrial ( ) ; /* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> λ BL <20> <> <EFBFBD> ƴΣ<C6B4> <CEA3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> Դ<EFBFBD> */
HAL_Delay ( 100 ) ;
NVIC_SystemReset ( ) ;
}
/* <20> ̵<EFBFBD> <CCB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ӧ״̬<D7B4> <CCAC> */
relayCmdProcess ( ) ;
/* <20> ӳ<EFBFBD> ״̬<D7B4> ϱ <EFBFBD> */
if ( relay_report_pending & & ( HAL_GetTick ( ) - relay_report_tick ) > 100 ) {
relay_report_pending = 0 ;
relayStatueUpdata ( ) ;
}
/* ι <> ϳ <EFBFBD> <CFB3> <EFBFBD> ѯ<EFBFBD> <D1AF> Ͷι <CDB6> <CEB9> <EFBFBD> <EFBFBD> */
feedScaleProcess ( ) ;
vTaskDelay ( 10 ) ;
}
}
2026-08-15 06:40:38 +08:00
/*==== OLED <20> <> <EFBFBD> <EFBFBD> ˢ<EFBFBD> £<EFBFBD> 1s һ <> Σ<EFBFBD>
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѹ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> / <EFBFBD> <EFBFBD> <EFBFBD> ʵ <EFBFBD> <EFBFBD> <EFBFBD> / <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״ ̬ / <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> + <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ <EFBFBD> <EFBFBD>
* δ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> g_net_ui_phase <EFBFBD> <EFBFBD> ʾ 4 G / WiFi <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȣ <EFBFBD> WiFi <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ <EFBFBD> <EFBFBD>
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ÿ 10 s <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 0 / 2 / 4 px <EFBFBD> ֻ <EFBFBD> = = = = */
2026-08-15 07:27:30 +08:00
static void oled_home_refresh ( uint32_t up_ms ) ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Σ<D7B6> app_init <20> <> <EFBFBD> <EFBFBD> 4G <20> <> ʼ <EFBFBD> <CABC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
* sys_task <EFBFBD> <EFBFBD> û <EFBFBD> ܣ <EFBFBD> <EFBFBD> <EFBFBD> bg_delay ÿ 500 ms <EFBFBD> <EFBFBD> һ <EFBFBD> <EFBFBD> ˢ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ҳ */
void app_oled_presched_tick ( void )
{
static uint32_t last = 0 ;
if ( HAL_GetTick ( ) - last < 500 ) return ;
last = HAL_GetTick ( ) ;
oled_home_refresh ( 0 ) ;
}
2026-08-15 06:40:38 +08:00
static void oled_home_refresh ( uint32_t up_ms )
2026-08-15 01:00:17 +08:00
{
char buf [ 24 ] ;
2026-08-15 06:40:38 +08:00
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ÿ 10s <20> <> һ <EFBFBD> <D2BB> ˮƽ ƫ<C6BD> ƣ<EFBFBD> 0/2/4px<70> <78> */
uint8_t xoff = ( uint8_t ) ( ( HAL_GetTick ( ) / 10000u ) % 3u ) * 2u ;
if ( g_net_mqtt_ready ) {
/*---- <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ----*/
2026-08-15 06:55:15 +08:00
/* R0: <20> <> <EFBFBD> <EFBFBD> + <20> <> <EFBFBD> <EFBFBD> ʱ<EFBFBD> 䣨<EFBFBD> <E4A3A8> :ʱ:<3A> ֣<EFBFBD> */
uint32_t mins = up_ms / 60000u ;
const char * nt = ( NET_GetActiveBackend ( ) = = NET_BACKEND_WIFI ) ? " WiFi " : " 4G " ;
snprintf ( buf , sizeof ( buf ) , " %s %02u:%02u:%02u " , nt ,
( unsigned ) ( mins / 1440u ) ,
( unsigned ) ( ( mins % 1440u ) / 60u ) ,
( unsigned ) ( mins % 60u ) ) ;
oled_locate ( 0 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( buf ) ;
/* R1/R2: <20> <> <EFBFBD> ܲ<EFBFBD> <DCB2> <EFBFBD> */
2026-08-15 06:40:38 +08:00
if ( hlw8032_online ( ) ) {
snprintf ( buf , sizeof ( buf ) , " %.1fV %.2fA " ,
( double ) hlw8032_get_voltage_v ( ) , ( double ) hlw8032_get_current_a ( ) ) ;
2026-08-15 06:55:15 +08:00
oled_locate ( 1 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( buf ) ;
2026-08-15 06:40:38 +08:00
snprintf ( buf , sizeof ( buf ) , " %.1fW %.2fkWh " ,
( double ) hlw8032_get_power_w ( ) , ( double ) hlw8032_get_energy_kwh ( ) ) ;
2026-08-15 06:55:15 +08:00
oled_locate ( 2 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( buf ) ;
2026-08-15 06:40:38 +08:00
} else {
2026-08-15 06:55:15 +08:00
oled_locate ( 1 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> о Ƭ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
oled_locate ( 2 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " " ) ;
2026-08-15 06:40:38 +08:00
}
2026-08-15 01:00:17 +08:00
2026-08-15 06:55:15 +08:00
/* R3: <20> <> <EFBFBD> <EFBFBD> ״̬ */
2026-08-15 06:40:38 +08:00
snprintf ( buf , sizeof ( buf ) , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> :%s%s%s%s" ,
MqttInfoStr . Relay_State [ 1 ] ? " <EFBFBD> <EFBFBD> " : " <EFBFBD> <EFBFBD> " ,
MqttInfoStr . Relay_State [ 2 ] ? " <EFBFBD> <EFBFBD> " : " <EFBFBD> <EFBFBD> " ,
MqttInfoStr . Relay_State [ 3 ] ? " <EFBFBD> <EFBFBD> " : " <EFBFBD> <EFBFBD> " ,
MqttInfoStr . Relay_State [ 4 ] ? " <EFBFBD> <EFBFBD> " : " <EFBFBD> <EFBFBD> " ) ;
oled_locate ( 3 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( buf ) ;
2026-08-15 01:00:17 +08:00
} else {
2026-08-15 06:40:38 +08:00
/*---- δ<> <CEB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 棺<EFBFBD> <E6A3BA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ----*/
net_ui_phase_t ph = g_net_ui_phase ;
2026-08-15 06:55:15 +08:00
oled_locate ( 0 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
2026-08-15 06:40:38 +08:00
if ( ph = = NET_UI_WIFI_FIXED | | ph = = NET_UI_WIFI_SMART | |
NET_GetActiveBackend ( ) = = NET_BACKEND_WIFI ) {
if ( ph = = NET_UI_WIFI_FIXED ) {
oled_locate ( 1 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " WiFi<EFBFBD> ̶<EFBFBD> ģʽ " ) ;
oled_locate ( 2 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȵ<EFBFBD> " ) ;
} else if ( ph = = NET_UI_WIFI_SMART ) {
oled_locate ( 1 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
oled_locate ( 2 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> APP<EFBFBD> 㲥" ) ;
} else {
oled_locate ( 1 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " WiFiģʽ " ) ;
oled_locate ( 2 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ..." ) ;
}
snprintf ( buf , sizeof ( buf ) , " ʣ<EFBFBD> <EFBFBD> %ds " , g_net_ui_countdown ) ;
oled_locate ( 3 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( g_net_ui_countdown > 0 ? buf : " " ) ;
} else {
/* 4G <20> <> <EFBFBD> ȣ <EFBFBD> <C8A3> <EFBFBD> ʾ <EFBFBD> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɵĽ<C4BD> */
const char * step = " <EFBFBD> <EFBFBD> ʼ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ;
switch ( ph ) {
case NET_UI_4G_RESET : step = " ģ<EFBFBD> 鸴λ<EFBFBD> ɹ<EFBFBD> " ; break ;
case NET_UI_4G_AT : step = " ATָ<EFBFBD> <EFBFBD> <EFBFBD> ɹ<EFBFBD> " ; break ;
case NET_UI_4G_SIM : step = " SIM<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɹ<EFBFBD> " ; break ;
case NET_UI_4G_ATTACH : step = " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɹ<EFBFBD> " ; break ;
case NET_UI_4G_MQTT : step = " <EFBFBD> <EFBFBD> <EFBFBD> ӷ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ; break ;
case NET_UI_4G_NOSIM : step = " <EFBFBD> <EFBFBD> SIM<EFBFBD> <EFBFBD> !" ; break ;
default : break ;
}
oled_locate ( 1 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " <EFBFBD> <EFBFBD> <EFBFBD> ڵȴ<EFBFBD> 4G<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " ) ;
oled_locate ( 2 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( step ) ;
oled_locate ( 3 , 0 ) ; oled_xoff ( xoff ) ; oled_print_line ( " " ) ;
}
2026-08-15 01:00:17 +08:00
}
}
2026-08-15 07:58:55 +08:00
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϱ <EFBFBD> <CFB1> <EFBFBD> <EFBFBD> ԣ<EFBFBD> <D4A3> <EFBFBD> <EFBFBD> <EFBFBD> > 10W ʱÿ 30s <20> ϱ <EFBFBD> һ <EFBFBD> Σ<EFBFBD> <=10W <20> <> <EFBFBD> ״<EFBFBD> <D7B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB>
* <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> л <EFBFBD> <EFBFBD> <EFBFBD> ״ ̬ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĵ <EFBFBD> energy <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 赥 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ־ <EFBFBD> ̶ <EFBFBD> 10 s һ <EFBFBD> <EFBFBD> */
# define ENERGY_REPORT_INTERVAL_MS 30000u
# define ENERGY_REPORT_POWER_W 10.0f
2026-08-15 00:35:02 +08:00
2026-08-10 21:18:36 +08:00
/*==== sys_task<73> <6B> ϵͳ<CFB5> <CDB3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> LED/<2F> <> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> ====*/
static void sys_task ( void * arg )
{
( void ) arg ;
uint32_t batt_tick = HAL_GetTick ( ) ;
2026-08-18 08:29:53 +08:00
uint32_t batt_fast_tick = HAL_GetTick ( ) ;
2026-08-10 21:18:36 +08:00
uint32_t up_last = HAL_GetTick ( ) ;
uint32_t up_print = HAL_GetTick ( ) ;
2026-08-15 00:35:02 +08:00
uint32_t en_print = HAL_GetTick ( ) ;
2026-08-10 21:18:36 +08:00
uint64_t up_ms = 0 ;
for ( ; ; ) {
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
process_usart1_command ( ) ;
/* <20> <> <EFBFBD> <EFBFBD> ָʾ <D6B8> <CABE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ˸ <EFBFBD> <CBB8> <EFBFBD> <EFBFBD> <EFBFBD> ϳ <EFBFBD> <CFB3> <EFBFBD> <EFBFBD> <EFBFBD> led.c activeEvents <20> ݴ˿<DDB4> <CBBF> <EFBFBD> PA1<41> <31> */
g_net_led_connected = g_net_mqtt_ready ? 1 : 0 ;
/* LED <20> <> <EFBFBD> <EFBFBD> /<2F> <> <EFBFBD> <EFBFBD> ָʾ */
activeEvents ( ) ;
2026-08-18 08:29:53 +08:00
/* <20> ϵ<EFBFBD> <CFB5> <EFBFBD> <EFBFBD> <EFBFBD> 50ms <20> <> <EFBFBD> <EFBFBD> ѯ<EFBFBD> <D1AF> PA0 <20> <> <EFBFBD> <EFBFBD> Ҫ<EFBFBD> <D2AA> <EFBFBD> ڷ<EFBFBD> <DAB7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݺľ<DDBA> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> Ϣ<EFBFBD> <CFA2> */
if ( HAL_GetTick ( ) - batt_fast_tick > = 50 ) {
batt_fast_tick = HAL_GetTick ( ) ;
update_batter ( ) ;
}
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 1s <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
2026-08-10 21:18:36 +08:00
if ( HAL_GetTick ( ) - batt_tick > = 1000 ) {
batt_tick = HAL_GetTick ( ) ;
2026-08-12 14:32:03 +08:00
hlw8032_tick ( ) ; /* <20> ܹ<EFBFBD> Լ 0.1kWh дһ <D0B4> <D2BB> EEPROM */
2026-08-15 06:40:38 +08:00
oled_home_refresh ( up_ms ) ; /* OLED <20> <> <EFBFBD> <EFBFBD> 1s ˢ<> <CBA2> */
2026-08-10 21:18:36 +08:00
reset_log_tick ( ( uint32_t ) ( up_ms / 1000 ) ) ; /* <20> <> <EFBFBD> <EFBFBD> RAM <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȸ<EFBFBD> λ<EFBFBD> <CEBB> <EFBFBD> <EFBFBD> */
}
/* <20> <> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ÿ 60s <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> һ <EFBFBD> Σ<EFBFBD> <CEA3> <EFBFBD> /ʱ/<2F> ֣<EFBFBD> <D6A3> <EFBFBD>
* δ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> / <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> У <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ӡ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ <EFBFBD> <EFBFBD> ־ <EFBFBD> <EFBFBD>
* 64 λ <EFBFBD> ۼ ƣ <EFBFBD> HAL_GetTick Լ 49 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ҳ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ӱ <EFBFBD> <EFBFBD> */
{
uint32_t now = HAL_GetTick ( ) ;
up_ms + = ( uint32_t ) ( now - up_last ) ; /* 32λ<32> <CEBB> ֵ<EFBFBD> <D6B5> Ȼ<EFBFBD> <C8BB> <EFBFBD> ̻<EFBFBD> <CCBB> <EFBFBD> */
up_last = now ;
if ( now - up_print > = 60000 ) {
up_print = now ;
if ( g_net_mqtt_ready ) {
2026-08-14 23:50:50 +08:00
uint32_t mins = ( uint32_t ) ( up_ms / 60000 ) ;
2026-08-15 00:35:02 +08:00
log_info ( FMT_UPTIME ,
( unsigned ) ( mins / 1440 ) ,
( unsigned ) ( ( mins % 1440 ) / 60 ) ,
( unsigned ) ( mins % 60 ) ) ;
2026-08-10 21:18:36 +08:00
}
}
}
2026-08-15 07:58:55 +08:00
/* <20> <> <EFBFBD> ܣ<EFBFBD> <DCA3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ־<EFBFBD> ̶<EFBFBD> 10s һ <> <D2BB> <EFBFBD> <EFBFBD> <EFBFBD> ϱ <EFBFBD> <CFB1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʲ<EFBFBD> <CAB2> ԣ<EFBFBD> >10W ÿ 30s<30> <73> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ״Σ<D7B4> */
2026-08-15 00:35:02 +08:00
if ( g_net_mqtt_ready & & hlw8032_online ( ) & &
2026-08-15 07:58:55 +08:00
( HAL_GetTick ( ) - en_print ) > = 10000u ) {
2026-08-15 00:35:02 +08:00
en_print = HAL_GetTick ( ) ;
2026-08-15 07:58:55 +08:00
static uint8_t energy_first_reported = 0 ;
static uint32_t energy_report_tick = 0 ;
2026-08-15 00:35:02 +08:00
float kwh = hlw8032_get_energy_kwh ( ) ;
2026-08-15 07:58:55 +08:00
float pw = hlw8032_get_power_w ( ) ;
uint8_t report = 0 ;
if ( ! energy_first_reported ) {
report = 1 ;
energy_first_reported = 1 ;
} else if ( pw > ENERGY_REPORT_POWER_W & &
( HAL_GetTick ( ) - energy_report_tick ) > = ENERGY_REPORT_INTERVAL_MS ) {
report = 1 ;
}
if ( report ) {
energy_report_tick = HAL_GetTick ( ) ;
NET_publish_energy ( kwh ) ;
}
2026-08-15 00:35:02 +08:00
log_info ( FMT_ENERGY , ( double ) kwh ,
( double ) hlw8032_get_voltage_v ( ) ,
( double ) hlw8032_get_current_a ( ) ,
2026-08-15 07:58:55 +08:00
( double ) pw ) ;
2026-08-15 00:35:02 +08:00
}
2026-08-10 21:18:36 +08:00
vTaskDelay ( 20 ) ;
}
}
/*==== FreeRTOS <20> <> <EFBFBD> <EFBFBD> ====*/
/* idle <20> <> <EFBFBD> ӣ<EFBFBD> ι <EFBFBD> <CEB9> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ź<EFBFBD> <C5B9> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѭ<EFBFBD> <D1AD> ռ CPU ʱ idle <20> <> <EFBFBD> <EFBFBD> <20> <> IWDG <20> <> λ */
void vApplicationIdleHook ( void )
{
IWDG_Feed ( ) ;
}
void vApplicationMallocFailedHook ( void )
{
log_error ( " > RTOS: malloc ʧ<> ܣ<EFBFBD> <DCA3> Ѻľ<D1BA> <C4BE> <EFBFBD> " ) ;
taskDISABLE_INTERRUPTS ( ) ;
for ( ; ; ) { }
}
void vApplicationStackOverflowHook ( TaskHandle_t xTask , char * pcTaskName )
{
( void ) xTask ;
log_error ( " > RTOS: <20> <> <EFBFBD> <EFBFBD> %s ջ<> <D5BB> <EFBFBD> <EFBFBD> " , pcTaskName ) ;
taskDISABLE_INTERRUPTS ( ) ;
for ( ; ; ) { }
}
/*==== <20> <> <EFBFBD> <EFBFBD> <F1B4B4BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> main <20> <> <EFBFBD> ã<EFBFBD> <C3A3> <EFBFBD> <EFBFBD> ٷ<EFBFBD> <D9B7> أ<EFBFBD> ====*/
void app_rtos_start ( void )
{
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> */
log_lock_init ( ) ;
storage_lock_init ( ) ;
NET_LockInit ( ) ;
xTaskCreate ( net_task , " net " , 768 , NULL , 3 , NULL ) ; /* ջ 3KB<4B> <42> AT/OTA <20> д<EFBFBD> <D0B4> <EFBFBD> sprintf <20> <> <EFBFBD> <EFBFBD> */
xTaskCreate ( app_task , " app " , 512 , NULL , 2 , NULL ) ; /* ջ 2KB */
2026-08-15 00:30:08 +08:00
xTaskCreate ( sys_task , " sys " , 512 , NULL , 1 , NULL ) ; /* ջ 2KB<4B> <42> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ־һ <D6BE> <D2BB> 4 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʽ <EFBFBD> <CABD> <EFBFBD> ܳ<EFBFBD> ջ */
2026-08-10 21:18:36 +08:00
vTaskStartScheduler ( ) ;
/* <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ߵ <EFBFBD> <DFB5> <EFBFBD> <EFBFBD> <EFBFBD> Ѳ<EFBFBD> <D1B2> 㴴<EFBFBD> <E3B4B4> ʧ<EFBFBD> ܲŻᣩ */
log_error ( " > RTOS: <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʧ<EFBFBD> <CAA7> " ) ;
for ( ; ; ) { }
}