Files
Andon/1.主程序源代码/User/main.c

329 lines
8.2 KiB
C
Raw Normal View History

2026-03-31 15:40:09 +08:00
#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);
}
/*
* 使 - 使1610
* 1(bit0)1bit9表示第10个按键
* 01使
*/
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();
}