Files
Andon/1.主程序源代码/User/main.c
2026-03-31 15:40:09 +08:00

329 lines
8.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "main.h"
#include "FreeRTOS.h"
#include "semphr.h"
#include "timers.h"
#include "task.h"
#include "shell.h"
#include "shell_port.h"
static TaskHandle_t AppTaskCreate_Handle = NULL; // 创建任务句柄
static TaskHandle_t Main_Task_Handle = NULL; // Main任务句柄
static TaskHandle_t Key_Task_Handle = NULL; // Key任务句柄
static TaskHandle_t Wdog_Task_Handle = NULL; // Wdog任务句柄
static TaskHandle_t Bat_Task_Handle = NULL; // 电池任务句柄
static TimerHandle_t xTimeHandle = NULL; //软件定时器句柄
static void AppTaskCreate(void); // 用于创建任务
static void Main_Task(void *pvParameters); // Main_Task任务实现
static void Key_Task(void *pvParameters); // KEY_Task任务实现
static void Wdog_Task(void *pvParameters); // Wdog发送任务实现
static void Bat_Task(void *pvParameters); // 电池检测任务实现
static void timeCallBackTask(void); // 定时锁机任务实现
uint8_t lora_sendbuf[255]; //Lora数据构造数组
void BSP_Init(void);
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
(const char *)"AppTaskCreate",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)1,
(TaskHandle_t *)&AppTaskCreate_Handle);
if (pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while (1)
;
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL(); //临界保护
/*创建线程*/
xReturn = xTaskCreate((TaskFunction_t)Main_Task,
(const char *)"Main_Task",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)2,
(TaskHandle_t *)&Main_Task_Handle);
if (pdPASS != xReturn)
printf("创建Main_Task任务失败!\r\n");
xReturn = xTaskCreate((TaskFunction_t)Key_Task,
(const char *)"Key_Task",
(uint16_t)64,
(void *)NULL,
(UBaseType_t)2,
(TaskHandle_t *)&Key_Task_Handle);
if (pdPASS != xReturn)
printf("创建Key_Task任务失败!\r\n");
xReturn = xTaskCreate((TaskFunction_t)Wdog_Task,
(const char *)"Wdog_Task",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)2, Wdog_Task_Handle);
if (pdPASS != xReturn)
printf("创建Wdog_Task任务失败!\r\n");
xReturn = xTaskCreate((TaskFunction_t)Bat_Task,
(const char *)"Bat_Task",
(uint16_t)64,
(void *)NULL,
(UBaseType_t)2, Bat_Task_Handle);
if (pdPASS != xReturn)
printf("创建Bat_Task任务失败!\r\n");
/*注册超时模块软件定时器*/
xTimeHandle = xTimerCreate(
(const char *)"time_lock", // 定时器名字
(TickType_t)1000, // 定时器的周期
pdTRUE, // 定时器周期执行
(void *)1, // 给定时器分配的唯一ID
(TimerCallbackFunction_t)timeCallBackTask // 定时器回调函数
);
if (xTimeHandle)
{
xTimerStart(xTimeHandle, 0); // 开启定时器
}
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
/*软件定时器回调*/
void timeCallBackTask(void)
{
if (rc_data()->Lock_state == UNLOCK)
{
rc_data()->Lock_time_tick++;
}
if (rc_data()->Lock_time_tick >= rc_data()->Kv_get.lock_time)
{
rc_data()->Asr_state = LOCK;
rc_data()->Lock_state = LOCK;
rc_data()->Lock_time_tick = 0;
ASR_Power_OFF;
LEDClass.Set(BLACK);
}
}
/*主线程函数*/
static void Main_Task(void *parameter)
{
while (1)
{
/*按键控制模式*/
if((rc_data()->Lock_state ==UNLOCK)&&(rc_data()->Asr_state == LOCK))
{
LEDClass.Set(BLACK);
ADC1Class.GetValue(0) > 170 ? LEDClass.Set(GREEN) : LEDClass.Set(YELLOW);
if(rc_data()->isLEDTog == ENABLE)
{
LEDClass.Set(BLACK);
MODClass.Loop(LEDClass.GREEN_Toggle,vTaskDelay,7,50);
rc_data()->isLEDTog = 0;
}
if(rc_data()->isSend == ENABLE )
{
rc_data()->isSend = DISABLE;
if ((rc_data()->Key_data[0] == 0 && rc_data()->Key_data[1] == 1) || (rc_data()->Key_data[0] != 0))
{
sprintf((char *)lora_sendbuf,
"AT+LRSEND=85,1,33,\"{\"E\":\"%d\",\"T\":\"%d\",\"R\":\"%d\",\"C\":\"%d\"}\"\r\n",
rc_data()->Key_data[0],rc_data()->Key_data[1],
//(rc_data()->Key_data[0] != 9 && rc_data()->Key_data[0] != 10) ? rc_data()->Key_data[0] : 0,
//(rc_data()->Key_data[0] != 9 && rc_data()->Key_data[0] != 10) ? rc_data()->Key_data[1] : 0,
rc_data()->Key_data[2],
rc_data()->Key_data[3]);
LEDClass.Set(BLACK);
USARTClass.USART_SendString1(USART3, lora_sendbuf, 54);
MODClass.Loop(LEDClass.GREEN_Toggle,vTaskDelay,4,400);
LEDClass.Set(BLACK);
rc_data()->Lock_state = LOCK;
}
else
{
LEDClass.Set(BLACK);
MODClass.Loop(LEDClass.RED_Toggle,vTaskDelay,4,400);
}
memset(rc_data()->Key_data,0x00,4);
}
}
/*语音控制模式*/
if((rc_data()->Lock_state==UNLOCK)&&rc_data()->Asr_state == UNLOCK)
{
LEDClass.Set(WHITE);
if (Asr_recbuff[0] == 0x55 && Asr_recbuff[1] == 0xAA)
{
rc_data()->Lock_time_tick =0;
switch (Asr_recbuff[2])
{
case 1 ... 12:
{
const LoraCommandParams *params = &cmd_params[Asr_recbuff[2] - 1];
sprintf((char *)lora_sendbuf,
"AT+LRSEND=85,1,33,\"{\"E\":\"%s\",\"T\":\"%s\",\"R\":\"%s\",\"C\":\"%s\"}\"\r\n",
params->e_val, params->t_val, params->r_val, params->c_val);
break;
}
default:
break;
}
USARTClass.USART_SendString1(USART3, lora_sendbuf, 54);
memset(Asr_recbuff, 0x00, 20);
LEDClass.Set(BLACK);
MODClass.Loop(LEDClass.GREEN_Toggle,vTaskDelay,4,400);
LEDClass.Set(BLACK);
rc_data()->Lock_state = LOCK;
rc_data()->Asr_state = LOCK;
vTaskDelay(2000);
ASR_Power_OFF;
}
}
if(rc_data()->Lock_state ==LOCK)
{
BATClass.Read_State();
}
vTaskDelay(20);
}
}
/*看门狗线程函数*/
static void Wdog_Task(void *parameter)
{
while (1)
{
IWDG_ReloadCounter();
vTaskDelay(30);
}
}
/*电池检测线程函数*/
static void Bat_Task(void *parameter)
{
while (1)
{
// printf("bat value:%d\r\n",ADC1Class.GetValue(0));
vTaskDelay(1000);
}
}
/*按键检测线程函数*/
static void Key_Task(void *parameter)
{
while (1)
{
flex_button_scan();
vTaskDelay(10);
}
}
/*用户密码提取kv函数*/
//static void read_password(void)
//{
// char *read_password;
// read_password = ef_get_env("ziit_password");
// assert_param(read_password);
// strcpy(shellPasswordDefaultUser, read_password);
// printf("The ziit password is %s \n\r", shellPasswordDefaultUser);
//}
/*锁定时间提取kv函数*/
static void read_lock_time(void)
{
char *keys;
keys = ef_get_env("key_s");
assert_param(keys); //检查参数合法性
rc_data()->Kv_get.lock_time = atol(keys); //str => int
printf("锁定时间:%d\r\n", rc_data()->Kv_get.lock_time);
}
/*
* 按键使能提取函数 - 使用16位变量存储10个按键状态
* 每个按键占用1位最低位(bit0)表示第1个按键bit9表示第10个按键
* 0表示失能1表示使能
*/
static void read_key_en_table(void)
{
char *key_en_table;
uint16_t key_en_bits = 0; // 16位存储按键状态
// 从环境变量获取键值
key_en_table = ef_get_env("key_en_table");
assert_param(key_en_table); // 检查参数合法性
// 将字符串转换为16位数值
key_en_bits = (uint16_t)strtoul(key_en_table, NULL, 0);
// 存储到数据结构中
rc_data()->Kv_get.key_en_table = key_en_bits;
}
/*BSP初始化函数*/
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
delay_init();
LEDClass.Init();
ASR_Power_Init();
USARTClass.USART1_Init(115200);
USARTClass.USART3_Init(9600);
USARTClass.USART2_Init(9600);
USARTClass.USART_SendString1(USART3, (uint8_t *)"start",5);
BATClass.Init();
ADC1Class.Init();
rc_data()->Lock_state = UNLOCK;
rc_data()->Asr_state = LOCK;
rc_data()->isSend = DISABLE;
rc_data()->isLEDTog = DISABLE;
ASR_Power_OFF;
delay_ms(700);
delay_ms(700);
BOARD_Power_Init();
LEDClass.Set(GREEN);
Power_button_init();
if (easyflash_init() == EF_NO_ERR)
{
// read_password();
read_lock_time();
read_key_en_table();
}
while (1)
{
if (Check_Power_buttun() == 0)
{
break;
}
}
WDOG_Init();
userShellInit();
user_button_init();
}