329 lines
8.2 KiB
C
329 lines
8.2 KiB
C
|
|
#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();
|
|||
|
|
}
|
|||
|
|
|