#include "user_elect.h" #include "define.h" #include "stdarg.h" #include "user_config.h" tmosTaskID elect_task_id = INVALID_TASK_ID; static bool elect_start_stat = false; static elect_in_upload_func elect_in_upload = NULL; static uint16_t elect_task_process_event(uint8_t task_id, uint16_t events); static void prvUser_elect_left_work_stat(elect_work_type_e type); static void prvUser_elect_right_work_stat(elect_work_type_e type); static bool bUser_elect_get_left_level(void); static bool bUser_elect_get_right_level(void); static elect_work_s elect_work[ELECT_COUNT] = { { .idx = LEFT_IDX, .type = ELECT_WORK_NULL, .workTime = 0, .func = prvUser_elect_left_work_stat, .elect_in_stat = 2, .elect_in_finish = false, .elect_in_on_count = ELECT_IN_CHECK_COUNT, .elect_in_off_count = ELECT_IN_CHECK_COUNT, .elect_default_count = ELECT_IN_CHECK_COUNT, .get_level = bUser_elect_get_left_level, }, { .idx = RIGHT_IDX, .type = ELECT_WORK_NULL, .workTime = 0, .func = prvUser_elect_right_work_stat, .elect_in_stat = 2, .elect_in_finish = false, .elect_in_on_count = ELECT_IN_CHECK_COUNT, .elect_in_off_count = ELECT_IN_CHECK_COUNT, .elect_default_count = ELECT_IN_CHECK_COUNT, .get_level = bUser_elect_get_right_level, }, }; /******************************************************************************* * @函数名称 prvUser_elect_in_gpio_init * @函数说明 GPIO初始化 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_in_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure={0}; GPIO_InitStructure.GPIO_Pin = ELECT_LEFT_IN_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(ELECT_LEFT_IN_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ELECT_RIGHT_IN_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(ELECT_RIGHT_IN_GPIO, &GPIO_InitStructure); } /******************************************************************************* * @函数名称 prvUser_elect_gpio_init * @函数说明 GPIO初始化 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; ELECT_GPIO_RCC_ENABLE; GPIO_InitStructure.GPIO_Pin = ELECT_LEFT_OPEN_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ELECT_LEFT_OPEN_GPIO, &GPIO_InitStructure); ELECT_LEFT_OPEN_OFF; GPIO_InitStructure.GPIO_Pin = ELECT_RIGHT_OPEN_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ELECT_RIGHT_OPEN_GPIO, &GPIO_InitStructure); ELECT_RIGHT_OPEN_OFF; prvUser_elect_in_gpio_init(); } /******************************************************************************* * @函数名称 bUser_elect_get_left_level * @函数说明 获取左边电磁锁状态 * @输入参数 无 * @输出参数 无 * @返回参数 电磁锁开启状态 *******************************************************************************/ static bool bUser_elect_get_left_level(void) { if(0 == ELECT_LEFT_IN_IN) { return (user_config_param.npn_in_param.left_elect_level == 1)?true:false; } else{ return (user_config_param.npn_in_param.left_elect_level == 1)?false:true; } } /******************************************************************************* * @函数名称 bUser_elect_get_right_level * @函数说明 获取右边电磁锁状态 * @输入参数 无 * @输出参数 无 * @返回参数 电磁锁开启状态 *******************************************************************************/ static bool bUser_elect_get_right_level(void) { if(0 == ELECT_RIGHT_IN_IN) { return (user_config_param.npn_in_param.right_elect_level == 1)?true:false; } else{ return (user_config_param.npn_in_param.right_elect_level == 1)?false:true; } } /******************************************************************************* * @函数名称 prvUser_elect_left_work_stat * @函数说明 设置左边电磁锁状态 * @输入参数 type:工作状态 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_left_work_stat(elect_work_type_e type) { if(type == ELECT_WORK_START) { ELECT_LEFT_OPEN_ON; } else if(type == ELECT_WORK_END) { ELECT_LEFT_OPEN_OFF; } } /******************************************************************************* * @函数名称 prvUser_elect_right_work_stat * @函数说明 设置右边电磁锁状态 * @输入参数 type:工作状态 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_right_work_stat(elect_work_type_e type) { if(type == ELECT_WORK_START) { ELECT_RIGHT_OPEN_ON; } else if(type == ELECT_WORK_END) { ELECT_RIGHT_OPEN_OFF; } } /******************************************************************************* * @函数名称 vUser_elect_open * @函数说明 设置电磁锁 * @输入参数 idx:锁下标 * @输出参数 无 * @返回参数 无 *******************************************************************************/ void vUser_elect_open(uint8_t idx) { elect_work[idx].type = ELECT_WORK_START; elect_work[idx].workTime = 0; } /******************************************************************************* * @函数名称 prvUser_elect_work_pro * @函数说明 电磁锁执行 * @输入参数 elect:对象 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_work_pro(elect_work_s *elect) { if(elect->workTime == 0) { if(elect->type == ELECT_WORK_START) { elect->workTime = user_config_param.elect_param.elect_on_timne[elect->idx]; elect->func(ELECT_WORK_START); elect->type = ELECT_WORK_END; } else if(elect->type == ELECT_WORK_END) { elect->func(ELECT_WORK_END); elect->type = ELECT_WORK_NULL; } } else{ elect->workTime--; } } /******************************************************************************* * @函数名称 prvUser_elect_task * @函数说明 电磁锁任务 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_task(void) { for(int i = 0; i < ELECT_COUNT; i++) { prvUser_elect_work_pro(&elect_work[i]); } } /******************************************************************************* * @函数名称 prvUser_elect_in_check * @函数说明 电磁锁状态检测任务 * @输入参数 elect:电磁锁变量指针 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_in_check(elect_work_s *elect) { if(true == elect->get_level()) { elect->elect_in_off_count = elect->elect_default_count; if(elect->elect_in_on_count == 0) { if(elect->elect_in_finish == false) { elect->elect_in_finish = true; if(elect->elect_in_stat != 1) { elect->elect_in_stat = 1; // PRINT("No.%d switch is active!\n",npn->idx); if(elect_in_upload != NULL) { elect_in_upload(elect->idx, true); } } } } else{ elect->elect_in_finish = false; elect->elect_in_on_count--; } } else{ elect->elect_in_on_count = elect->elect_default_count; if(elect->elect_in_off_count == 0) { if(elect->elect_in_finish == false) { elect->elect_in_finish = true; if(elect->elect_in_stat != 0) { elect->elect_in_stat = 0; // PRINT("No.%d switch is deactive!\n",npn->idx); if(elect_in_upload != NULL) { elect_in_upload(elect->idx, false); } } } } else{ elect->elect_in_finish = false; elect->elect_in_off_count--; } } } /******************************************************************************* * @函数名称 prvUser_elect_in_pro * @函数说明 电磁锁状态检测任务 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void prvUser_elect_in_pro(void) { for(uint8_t i = 0; i < 2; i++) { prvUser_elect_in_check(&elect_work[i]); } } /******************************************************************************* * @函数名称 elect_task_process_event * @函数说明 task的event处理回调函数,需要在注册task时候,传进去 * @输入参数 task_id:任务ID events:事件 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static uint16_t elect_task_process_event(uint8_t task_id, uint16_t events) { //event 处理 if(events & (1 << ELECT_QUEUE_TIME)) { prvUser_elect_task(); return (events ^ (1 << ELECT_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志 } if(events & (1 << ELECT_QUEUE_IN_TIME)) { prvUser_elect_in_pro(); return (events ^ (1 << ELECT_QUEUE_IN_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志 } return 0; } /******************************************************************************* * @函数名称 elect_task_init * @函数说明 ELECT任务初始化 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ void vUser_elect_task_init(void) { elect_task_id = TMOS_ProcessEventRegister(elect_task_process_event); PRINT("elect_task_id=%d\n", elect_task_id); prvUser_elect_gpio_init(); } /******************************************************************************* * @函数名称 elect_task_start * @函数说明 ELECT任务开始 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ void vUser_elect_task_start(void) { bStatus_t stat = tmos_start_reload_task(elect_task_id, (1 << ELECT_QUEUE_TIME), MS1_TO_SYSTEM_TIME(ELECT_INTERVAL)); stat = tmos_start_reload_task(elect_task_id, (1 << ELECT_QUEUE_IN_TIME), MS1_TO_SYSTEM_TIME(ELECT_INTERVAL)); } /******************************************************************************* * @函数名称 vUser_elect_set_upload_stat_func * @函数说明 设置电磁锁状态回调函数 * @输入参数 func:函数指针 * @输出参数 无 * @返回参数 无 *******************************************************************************/ void vUser_elect_set_upload_stat_func(elect_in_upload_func func) { elect_in_upload = func; }