MW22-02A/APP/Device/device_Other/device_photoelectricswitch.c

176 lines
3.8 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 <includes.h>
#include "device_photoelectricswitch.h"
#include "ptz_header_file.h"
#include "ptz_type_select.h"
#include "ptz_struct.h"
static BSP_OS_SEM ptz_ps_read_mutex;
#ifdef PTZ_PHOTOELECTRIC_SWITCH
float ps_k = 0;
#endif
/// 初始化所有光电开关
///
/// 初始化所有光电开关
/// @param 无
/// @return 无
/// @par 修改日志
/// 杨鹏程于2017-09-14创建
/// LH修改于2022-05-31
void ps_init()
{
//配置引脚时钟
rcu_periph_clock_enable(RCU_GPIOB);
//设置引脚为输入模式:PB0-SW1PB1-SW2PB2-SW3
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_1);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
BSP_OS_SemCreate(&ptz_ps_read_mutex,1u,"ptz_ps_read_mutex");
}
/// 读取指定光电开关返回的电平
#define PS_NUM 20
#define PS_RATIO 0.9
char ps_read(char flag)
{
int i = 0;
int j = 0;
BSP_OS_SemWait(&ptz_ps_read_mutex, 0u);
char temp;
switch(flag)
{
case PS_VERT_SW1:
j = 0;
for(i = 0; i < PS_NUM; i++)//对垂直光电开关滤波
{
asm("nop");
temp = PS_VERT_SW1_READ;//光电开关1
j = j + temp;
}
ps_k = ((float)(PS_NUM - j))/ PS_NUM;//计算遮挡概率
if(ps_k > PS_RATIO)
{
temp = PS_LOW;
}
else
{
temp = PS_HIGH;
}
//temp = PS_VERT_SW1_READ;
BSP_OS_SemPost(&ptz_ps_read_mutex);
return temp;
break;
case PS_VERT_SW2:
j = 0;
for(i = 0; i < PS_NUM; i++)//对垂直光电开关滤波
{
asm("nop");
temp = PS_VERT_SW2_READ;//光电开关2
j = j + temp;
}
ps_k = ((float)(PS_NUM - j))/ PS_NUM;//计算遮挡概率
if(ps_k > PS_RATIO)
{
temp = PS_LOW;
}
else
{
temp = PS_HIGH;
}
//temp = PS_VERT_SW2_READ;
BSP_OS_SemPost(&ptz_ps_read_mutex);
return temp;
break;
case PS_HORI_SW3:
j = 0;
for(i = 0; i < PS_NUM; i++)//对水平光电开关滤波
{
asm("nop");
temp = PS_HORI_SW3_READ;//光电开关3
j = j + temp;
}
ps_k = ((float)(PS_NUM - j))/ PS_NUM;//计算遮挡概率
if(ps_k > PS_RATIO)
{
temp = PS_LOW;
}
else
{
temp = PS_HIGH;
}
//temp = PS_HORI_SW3_READ;
BSP_OS_SemPost(&ptz_ps_read_mutex);
return temp;
break;
}
BSP_OS_SemPost(&ptz_ps_read_mutex);
return -1;
}
static void ptz_ps_read_task()
{
while(1)
{
g_ptz.hori_ps_sw3_state = ps_read(PS_HORI_SW3);
g_ptz.vert_ps_sw1_state = ps_read(PS_VERT_SW1);
g_ptz.vert_ps_sw2_state = ps_read(PS_VERT_SW2);
OSTimeDlyHMSM(0u, 0u, 0u, 1u);
}
}
static OS_STK task_ps_read_stk[TASK_PS_STK_SIZE];
static void creat_task_ps_read(void)
{
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) ptz_ps_read_task,
(void *) 0,
(OS_STK *)&task_ps_read_stk[TASK_PS_STK_SIZE - 1],
(INT8U ) TASK_PS_PRIO,
(INT16U ) TASK_PS_PRIO,
(OS_STK *)&task_ps_read_stk[0],
(INT32U ) TASK_PS_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_PS_PRIO, "ptz_ps_read_task", &name_err);
#endif
}
void task_ps_read_init(void)
{
ps_init();
creat_task_ps_read();
}
void init_photoelectric_switch_module()
{
task_ps_read_init();
g_ptz.vert_ps_sw1_down_fall = 0;
g_ptz.vert_ps_sw1_up_rise = 0;
g_ptz.vert_ps_sw2_up_fall = 0;
g_ptz.vert_ps_sw2_down_rise = 0;
g_ptz.hori_ps_sw3_right_fall = 0;
g_ptz.hori_ps_sw3_right_rise = 0;
g_ptz.hori_ps_sw3_left_fall = 0;
g_ptz.hori_ps_sw3_left_rise = 0;
}