#define _start_us_min 160
#define _start_us_max 240
#define _num0_us_min 18
#define _num0_us_max 28
#define _num1_us_min 4
#define _num1_us_max 12
void soft_count_433m(void);
void soft_decode_433m(void);
static rt_err_t time2out_cb(rt_device_t dev, rt_size_t size)
{
soft_count_433m();
}
int hw_433M_init(void)
{
rt_err_t ret = RT_EOK;
rt_hwtimerval_t timeout_s;
rt_device_t hw_dev = RT_NULL;
rt_hwtimer_mode_t mode;
hw_dev = rt_device_find(HWTIMER_433M_NAME);
if(hw_dev == RT_NULL)
{
rt_kprintf("find %s failed\t\n", HWTIMER_433M_NAME);
return RT_ERROR;
}
ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR);
if (ret != RT_EOK)
{
rt_kprintf("open %s device failed!\n", HWTIMER_433M_NAME);
return ret;
}
rt_device_set_rx_indicate(hw_dev, time2out_cb);
mode = HWTIMER_MODE_PERIOD;
ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
if (ret != RT_EOK)
{
rt_kprintf("set mode failed! ret is :%d\n", ret);
return ret;
}
timeout_s.sec = 0;
timeout_s.usec = 50;
if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
{
rt_kprintf("set timeout value failed\n");
return RT_ERROR;
}
rt_thread_mdelay(3500);
return RT_EOK;
}
uint16_t Low;
uint32_t RF_Data_END;
void soft_count_433m()
{
static uint8_t Jump_flag;
if(rt_pin_read(DATA_433M) == 0)
{
Low++;
if(Jump_flag)
Jump_flag=0;
}
else if(rt_pin_read(DATA_433M) == 1)
{
if(!Jump_flag)
{
Jump_flag=1;
soft_decode_433m();
Low=0;
}
}
}
void soft_decode_433m()
{
static uint32_t RF_data,RF_data_temp;
static uint8_t CNT_Num, start_flag, RF_Value_Cnt, release_key;
static uint16_t crc_out;
if(start_flag==0)
{
if(( Low > _start_us_min ) && ( Low < _start_us_max ))
{
start_flag = 1;
CNT_Num = 0;
RF_data = 0;
}
else
{
RF_Value_Cnt=0;
release_key++;
if(release_key > 200)
release_key = 200;
}
}
else if((start_flag==1) && (CNT_Num<24))
{
if(( Low > _num0_us_min ) && ( Low < _num0_us_max ))
{
RF_data = RF_data<<1;
CNT_Num++;
}
else if(( Low > _num1_us_min ) && ( Low < _num1_us_max ))
{
RF_data = RF_data<<1;
RF_data|=1;
CNT_Num++;
}
else
{
start_flag=0;
CNT_Num=0;
}
}
if(CNT_Num==24)
{
release_key=0;
RF_Value_Cnt++;
if(RF_Value_Cnt > 200)
RF_Value_Cnt = 200;
if(RF_Value_Cnt == 1)
RF_data_temp = RF_data;
else if((RF_Value_Cnt == 2) && (RF_data_temp == RF_data))
{
RF_Data_END = RF_data;
rt_kprintf("433 receive data is %04x\r\n", RF_Data_END);
}
RF_data = 0;
CNT_Num=0;
start_flag=0;
}
}