2025-05-07 16:20:03 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2006-2024, RT-Thread Development Team
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*
|
|
|
|
|
* Change Logs:
|
|
|
|
|
* Date Author Notes
|
|
|
|
|
* 2024-03-04 RT-Thread first version
|
|
|
|
|
* 2024-07-04 LEI V0704
|
|
|
|
|
* 有人说:故事从这里开始
|
|
|
|
|
* 故事像是那遥远的村庄,你从那里走来
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <rtthread.h>
|
|
|
|
|
|
|
|
|
|
#define DBG_TAG "main"
|
|
|
|
|
#define DBG_LVL DBG_LOG
|
|
|
|
|
#include <rtdbg.h>
|
|
|
|
|
|
|
|
|
|
#include "app_user.h"
|
|
|
|
|
|
|
|
|
|
//临时变量
|
|
|
|
|
extern rtc_control_t rtc_ctl;
|
|
|
|
|
extern iot_device_set_message_t i_set_mess;
|
|
|
|
|
extern rt_mailbox_t iot_mb_ctl;
|
|
|
|
|
dev_power_t dev_power = {0};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 主控主函数
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
int main(void)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//RTT
|
|
|
|
|
rtt_init();
|
|
|
|
|
|
|
|
|
|
bsp_init_sleep();
|
|
|
|
|
|
|
|
|
|
//系统初始化
|
|
|
|
|
MX_GPIO_Init();
|
|
|
|
|
|
|
|
|
|
//上电开启
|
|
|
|
|
MX_DMA_Init();
|
|
|
|
|
MX_ADC_Init();
|
|
|
|
|
|
|
|
|
|
MX_USART1_UART_Init();
|
|
|
|
|
MX_USART5_UART_Init();
|
|
|
|
|
MX_USART4_UART_Init();
|
|
|
|
|
|
|
|
|
|
MX_RTC_Init();
|
|
|
|
|
|
|
|
|
|
#if USER_WDT_ON
|
|
|
|
|
MX_IWDG_Init();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
//打开LED
|
|
|
|
|
DEV_LED_ON;
|
|
|
|
|
|
|
|
|
|
//电源初始关闭
|
|
|
|
|
GPS_PWR_OFF;
|
|
|
|
|
NET_PWR_OFF;
|
|
|
|
|
ADC_POWER_OFF;
|
|
|
|
|
DEV_POWER_1_OFF;
|
|
|
|
|
DEV_POWER_2_OFF;
|
|
|
|
|
DEV_POWER_3_OFF;
|
|
|
|
|
|
|
|
|
|
rt_thread_mdelay(1000);
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
|
|
|
|
|
//存储区数据
|
|
|
|
|
mcu_eeprom_power();
|
|
|
|
|
|
|
|
|
|
//设备扫描
|
|
|
|
|
LOG_OUT("start_device_scan\r\n");
|
|
|
|
|
app_device_scan();
|
|
|
|
|
rt_thread_mdelay(1000);
|
|
|
|
|
|
|
|
|
|
//传感器控制开启
|
|
|
|
|
app_sensor_init();
|
|
|
|
|
rt_thread_mdelay(1000);
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
|
|
|
|
|
//NB上电
|
|
|
|
|
iot_ctl.i_run_ste = I_WORK;
|
|
|
|
|
bsp_iot_power_init();
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
bsp_iot_close();
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
|
|
|
|
|
//蓝牙id+设备id
|
|
|
|
|
ble_id_init();
|
|
|
|
|
rt_thread_mdelay(1000);
|
|
|
|
|
|
|
|
|
|
//开启蓝牙电源
|
|
|
|
|
LOG_OUT("ble_reset wait\r\n");
|
|
|
|
|
ble_ctl.b_init_flag = false;
|
|
|
|
|
bsp_uart5_irq_on();
|
|
|
|
|
|
|
|
|
|
for(uint8_t t=0; t<10; t++)
|
|
|
|
|
{
|
|
|
|
|
ble_ctl.b_run_ste = B_POWERON;
|
|
|
|
|
bsp_ble_reset();
|
|
|
|
|
rt_thread_mdelay(10000);
|
|
|
|
|
|
|
|
|
|
if(ble_ctl.b_init_flag == true)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
|
|
|
|
|
//开启GPS电源
|
2025-05-09 16:15:31 +08:00
|
|
|
|
// LOG_OUT("gps_reset wait\r\n");
|
2025-05-07 16:20:03 +08:00
|
|
|
|
gps_init_cmd();
|
|
|
|
|
rt_thread_mdelay(1000);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//设置距离传感器
|
2025-05-09 16:15:31 +08:00
|
|
|
|
// LOG_OUT("distance_reset wait\r\n");
|
2025-05-07 16:20:03 +08:00
|
|
|
|
bsp_distance_signal();
|
|
|
|
|
rt_thread_mdelay(1000);
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
|
|
|
|
|
//等待蓝牙就绪进入休眠
|
|
|
|
|
uart_send_u5((rt_uint8_t *)"AT+PWRM0\r\n",10);
|
|
|
|
|
rt_thread_mdelay(50);
|
|
|
|
|
uart_send_u5((rt_uint8_t *)"AT+PWRM0\r\n",10);
|
|
|
|
|
rt_thread_mdelay(500);
|
|
|
|
|
ble_ctl.b_run_ste = B_WORK;
|
|
|
|
|
|
|
|
|
|
//模式
|
|
|
|
|
dev_power.host_sleep_m = m_sleep;
|
|
|
|
|
dev_power.ble_sleep_m = m_sleep;
|
|
|
|
|
dev_power.wakeup_state = w_idle;
|
|
|
|
|
|
|
|
|
|
//默认配置
|
|
|
|
|
iot_device_default();
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
|
|
|
|
|
at24c512_init(NULL);
|
|
|
|
|
ota_ctl_thread_init();
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(uint8_t t=0; t<10; t++)
|
|
|
|
|
{
|
|
|
|
|
DEV_LED_TOG;
|
|
|
|
|
rt_thread_mdelay(200);
|
|
|
|
|
}
|
|
|
|
|
//LED关闭
|
|
|
|
|
DEV_LED_OFF;
|
|
|
|
|
|
|
|
|
|
//if(boot_read_version() == true)
|
|
|
|
|
{
|
|
|
|
|
//上电先上传一次,确定版本号
|
|
|
|
|
LOG_OUT("power work\r\n");
|
|
|
|
|
rtc_ctl.iot_up_count = rtc_ctl.iot_up_value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
LOG_OUT("ALL INIT OK\r\n");
|
|
|
|
|
rt_thread_mdelay(1000);
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
|
|
|
|
//主控
|
|
|
|
|
LOG_OUT("co %d<%d %d\r\n", rtc_ctl.collect_count, rtc_ctl.collect_value, i_set_mess.collect_period);
|
|
|
|
|
LOG_OUT("up %d<%d %d\r\n", rtc_ctl.iot_up_count, rtc_ctl.iot_up_value, i_set_mess.up_period);
|
|
|
|
|
LOG_OUT("sl %d+%d\r\n",dev_power.host_sleep_m, dev_power.ble_sleep_m);
|
|
|
|
|
//等待
|
|
|
|
|
//rt_thread_mdelay(2);
|
|
|
|
|
|
|
|
|
|
//触发采集
|
|
|
|
|
if(dev_power.wakeup_state > w_idle)
|
|
|
|
|
{
|
|
|
|
|
LOG_OUT("wakeup_state=%d\r\n", dev_power.wakeup_state);
|
|
|
|
|
if(dev_power.wakeup_state == w_lid && i_set_mess.activate == true)
|
|
|
|
|
{
|
|
|
|
|
dev_power.host_sleep_m = m_work;
|
|
|
|
|
rt_mb_send_wait(iot_mb_ctl, I_EVT_RTC, 1000);
|
|
|
|
|
}
|
|
|
|
|
dev_power.wakeup_state = w_idle;
|
|
|
|
|
//等待蓝牙数据
|
|
|
|
|
rt_thread_mdelay(5000);
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
}
|
|
|
|
|
//功耗模式
|
|
|
|
|
if( dev_power.host_sleep_m == m_sleep && dev_power.ble_sleep_m == m_sleep)
|
|
|
|
|
{
|
|
|
|
|
//重复关闭电源
|
|
|
|
|
GPS_PWR_OFF;
|
|
|
|
|
NET_PWR_OFF;
|
|
|
|
|
ADC_POWER_OFF;
|
|
|
|
|
DEV_POWER_1_OFF;
|
|
|
|
|
DEV_POWER_2_OFF;
|
|
|
|
|
DEV_POWER_3_OFF;
|
|
|
|
|
|
|
|
|
|
bsp_enter_sleep();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//打开
|
|
|
|
|
DEV_LED_ON;
|
|
|
|
|
rt_thread_mdelay(100);
|
|
|
|
|
//关闭
|
|
|
|
|
DEV_LED_OFF;
|
|
|
|
|
|
|
|
|
|
for(uint8_t t=0; t<4; t++)
|
|
|
|
|
{
|
|
|
|
|
app_iwdg_refresh();
|
2025-05-29 14:28:26 +08:00
|
|
|
|
rt_thread_mdelay(5000);
|
2025-05-07 16:20:03 +08:00
|
|
|
|
|
|
|
|
|
if( dev_power.host_sleep_m == m_sleep && dev_power.ble_sleep_m == m_sleep)
|
|
|
|
|
{
|
|
|
|
|
LOG_OUT("ready sleep\r\n");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app_iwdg_refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return RT_EOK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int object_name_maxlen(const char *type_name, struct rt_list_node *list)
|
|
|
|
|
{
|
|
|
|
|
struct rt_list_node *node;
|
|
|
|
|
struct rt_object *object = NULL;
|
|
|
|
|
int max_length = rt_strlen(type_name), length;
|
|
|
|
|
|
|
|
|
|
rt_enter_critical();
|
|
|
|
|
for (node = list->next; node != list; node = node->next)
|
|
|
|
|
{
|
|
|
|
|
object = rt_list_entry(node, struct rt_object, list);
|
|
|
|
|
|
|
|
|
|
length = rt_strlen(object->name);
|
|
|
|
|
if (length > max_length) max_length = length;
|
|
|
|
|
}
|
|
|
|
|
rt_exit_critical();
|
|
|
|
|
|
|
|
|
|
if (max_length > RT_NAME_MAX || max_length == 0) max_length = RT_NAME_MAX;
|
|
|
|
|
|
|
|
|
|
return max_length;
|
|
|
|
|
}
|
|
|
|
|
rt_inline void object_split(int len)
|
|
|
|
|
{
|
|
|
|
|
while (len--) LOG_OUT("-");
|
|
|
|
|
}
|
|
|
|
|
static long u_list_thread(struct rt_list_node *list)
|
|
|
|
|
{
|
|
|
|
|
int maxlen;
|
|
|
|
|
rt_uint8_t *ptr;
|
|
|
|
|
struct rt_thread *thread;
|
|
|
|
|
struct rt_list_node *node;
|
|
|
|
|
const char *item_title = "thread";
|
|
|
|
|
|
|
|
|
|
maxlen = object_name_maxlen(item_title, list);
|
|
|
|
|
|
|
|
|
|
LOG_OUT("%d %s \n", maxlen, item_title);
|
|
|
|
|
//object_split(maxlen);
|
|
|
|
|
LOG_OUT("--- --- --- --- ---\n");
|
|
|
|
|
for (node = list->next; node != list; node = node->next)
|
|
|
|
|
{
|
|
|
|
|
rt_uint8_t stat;
|
|
|
|
|
thread = rt_list_entry(node, struct rt_thread, list);
|
|
|
|
|
LOG_OUT("%d %d %8s %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
|
|
|
|
|
|
|
|
|
|
stat = (thread->stat & RT_THREAD_STAT_MASK);
|
|
|
|
|
if (stat == RT_THREAD_READY) LOG_OUT("ready ");
|
|
|
|
|
else if (stat == RT_THREAD_SUSPEND) LOG_OUT("suspend");
|
|
|
|
|
else if (stat == RT_THREAD_INIT) LOG_OUT("init ");
|
|
|
|
|
else if (stat == RT_THREAD_CLOSE) LOG_OUT("close ");
|
|
|
|
|
|
|
|
|
|
ptr = (rt_uint8_t *)thread->stack_addr;
|
|
|
|
|
while (*ptr == '#')ptr ++;
|
|
|
|
|
|
|
|
|
|
LOG_OUT(" %x %04x %d%% %x %d\n",
|
|
|
|
|
thread->stack_size + ((rt_uint32_t)thread->stack_addr - (rt_uint32_t)thread->sp),
|
|
|
|
|
thread->stack_size,
|
|
|
|
|
(thread->stack_size - ((rt_uint32_t) ptr - (rt_uint32_t) thread->stack_addr)) * 100
|
|
|
|
|
/ thread->stack_size,
|
|
|
|
|
thread->remaining_tick,
|
|
|
|
|
thread->error);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
long user_list_thread(void)
|
|
|
|
|
{
|
|
|
|
|
struct rt_object_information *info;
|
|
|
|
|
|
|
|
|
|
info = rt_object_get_information(RT_Object_Class_Thread);
|
|
|
|
|
return u_list_thread(&info->object_list);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void rtthread_info_logout(void)
|
|
|
|
|
{
|
|
|
|
|
rt_uint32_t total_num = 0;
|
|
|
|
|
rt_uint32_t used_num = 0;
|
|
|
|
|
rt_uint32_t max_used_num = 0;
|
|
|
|
|
|
|
|
|
|
rt_memory_info(&total_num, &used_num, &max_used_num);
|
|
|
|
|
LOG_OUT("total=%d ", total_num);
|
|
|
|
|
LOG_OUT("used=%d ", used_num);
|
|
|
|
|
LOG_OUT("max_used=%d\r\n", max_used_num);
|
|
|
|
|
//三个数<E4B8AA>?<3F>分别是总空间,当前占用空间,历史最大占用空<E794A8>?????????????????
|
|
|
|
|
user_list_thread();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 中断向量表映射
|
|
|
|
|
*/
|
|
|
|
|
void jump_app_init(void)
|
|
|
|
|
{
|
|
|
|
|
//APP地址:16*1024 = 16384 = 0X4000
|
|
|
|
|
#define RUN_APP_ADDRESS (0x4000)
|
|
|
|
|
|
|
|
|
|
SCB->VTOR = FLASH_BASE | RUN_APP_ADDRESS;
|
|
|
|
|
|
|
|
|
|
//开启中断
|
|
|
|
|
__enable_irq();
|
|
|
|
|
}
|