176 lines
3.8 KiB
C
176 lines
3.8 KiB
C
#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-SW1,PB1-SW2,PB2-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;
|
||
}
|
||
|