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

176 lines
3.8 KiB
C
Raw Normal View History

2025-05-21 01:55:40 +00:00
#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
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><E7BFAA>
///
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><E7BFAA>
/// @param <20><>
/// @return <20><>
/// @par <20>޸<EFBFBD><DEB8><EFBFBD>־
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2017-09-14<31><34><EFBFBD><EFBFBD>
/// LH<4C>޸<EFBFBD><DEB8><EFBFBD>2022-05-31
void ps_init()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
rcu_periph_clock_enable(RCU_GPIOB);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ:PB0-SW1<57><31>PB1-SW2<57><32>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");
}
/// <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7>صĵ<D8B5>ƽ
#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++)//<2F>Դ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><E7BFAA><EFBFBD>˲<EFBFBD>
{
asm("nop");
temp = PS_VERT_SW1_READ;//<2F><><EFBFBD><EFBFBD><E7BFAA>1
j = j + temp;
}
ps_k = ((float)(PS_NUM - j))/ PS_NUM;//<2F><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
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++)//<2F>Դ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><E7BFAA><EFBFBD>˲<EFBFBD>
{
asm("nop");
temp = PS_VERT_SW2_READ;//<2F><><EFBFBD><EFBFBD><E7BFAA>2
j = j + temp;
}
ps_k = ((float)(PS_NUM - j))/ PS_NUM;//<2F><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
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++)//<2F><>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><E7BFAA><EFBFBD>˲<EFBFBD>
{
asm("nop");
temp = PS_HORI_SW3_READ;//<2F><><EFBFBD><EFBFBD><E7BFAA>3
j = j + temp;
}
ps_k = ((float)(PS_NUM - j))/ PS_NUM;//<2F><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
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;
}