Lirc version:0.9.2
1、查看是否存在当前遥控器的模板
fin = fopen(filename, "r");
if (fin != NULL)
{
//read config file to remote
}
2、设置红外设备为接收模式(只有接收模式支持LIRC_MODE_MODE2或者LIRC_MODE_LIRCCODE的设备才可以学习红外码)。
LIRC_MODE_MODE2:设备驱动本身不支持解码功能,只能读取红外的脉冲数据流。
LIRC_MODE_LIRCCODE:设备驱动本身指定了某种类型的红外码特性
下面按照常见的LIRC_MODE_MODE2来分析。
3、调用get_lengths()获取红外遥控码的特性,也是最为关键的一步。
先介绍一下struct ir_remote结构体的部分成员:
gap:两个红外码之间的间隔
repeat_gap:重复码间隔
toggle_bit_mask:切换bit(用于变码,如rc6)
struct lengths结构体,struct lengths用于链表记录连续红外脉冲:
lengths.sum为相同脉宽长度总和
lengths.count为相同脉宽个数
lengths.max为最大脉宽
lengths.min为最小脉宽
lengths.upper_bounder和lower_bounder为是否为相同脉冲的上下边界
get_lengths()首先会找到红外码之间的间隔,即gap。找到gap之后开始采集红外码的特征,包括下面一些变量:
first_repeatp:第一个重复码pulse
first_repeats:第一个重复码space
first_trail:重复码结束脉宽
first_repeat_gap:重复码间隔
first_headerp:头码pulse
first_headers:头码space
first_space:数据段的第一个space
first_pulse:数据段的第一个pulse
在获取红外的数据特征之后,get_lengths()调用
void get_scheme(struct ir_remote *remote, int interactive)
函数来分析红外的协议,目前支持RC5,RC6,RAW_CODE,SPACE_ENC四种。
get_lengths()通过获取到上面的采样值计算出一下几个红外特征值:
- 获取红外码之间的间隔gap
- 获取红外码的起始标记header
- 获取重复码repeat,重复码间隔
- 获取结束码(opt)
- 获取数据长度(用pulse和space的值表示0和1)
若红外码为RC6码则需要通过
int get_toggle_bit_mask(struct ir_remote *remote)
函数获取toggle_bit_mask。到这里红外码特征获取已经结束。
4、开始记录按键码值和生成文件。