每次都重新推算一遍,年纪大了还是记录一下吧(硬件版的TV-B-Gone的压缩编码跳过此段往下看)

N900上有个TVB-Gone的程序,但是程序的红外编码往往都是对应的国外的电视,好多国产电视都不支持,
有时候需要遥控空调或者投影之类的,只能自己录入了,大概看了一下,编码比较简单(比硬件那个简单多了,毕竟不需要考虑程序空间的问题)
(上次录过一次,这次又重搞一遍,还是记录一下,以备后用。)

第一步当然得知道红外编码,做了个简单的红外线分析器,网上有开源的,


没有串口,我用了个转USB的小东西,


对应可以输出红外线具体时间的文件,就靠这个文件里面的时间长度来录入编码,如下为截取Channel 2的一段:
------------------------------------------------------------------------
CH 2
:
:212
1
8942
4470
551
1656
548
1658
547
537
550
535
549
535
550
535
549
1656
550
1656
549
1656
550
1656
549
1656
550
1656
549
535
550
535
549
537
548
1656
549
537
550
535
549
535
550
535
549
537
548
537
549
535
548
537
549
535
550
535
551
535
548
537
549
535
550
535
549
535
550
537
549
535
550
535
549
535
550
535
551
535
550
1656
549
535
550
535
549
535
550
537
547
537
548
537
549
535
550
535
549
1656
550
535
551
535
548
537
549
535
550
535
549
535
550
535
549
537
548
1658
549
535
550
535
549
535
550
535
549
537
548
537
549
535
550
535
549
535
550
537
549
535
550
535
549
535
550
535
549
537
548
537
549
535
550
535
549
535
550
537
549
535
550
535
549
535
550
535
549
537
548
537
549
535
550
535
549
535
550
537
547
537
548
537
549
1656
548
537
549
1656
550
535
549
535
550
535
549
537
550
535
549
1656
550
1656
549
1656
550
535
549
1656
550
1656
549
535
550
535
577
:
------------------------------------------------------------------------

从8942开始,上面不用管,每个数字代表时长,两个数字一组,一组一组地看,数字接近的都合并为同一组,构造的结构为
[载波频率, "载波序列", [(时间组1), (时间组2), (时间组3) ... ]]

载波频率需要示波器查看,或者网上查,或者使用红外线常用的38400,载波序列中每一个数字代表一个时间组的序号,从零开始,
以上面我们截获的数据为例,简化一下,可以用四组时间组表示,分别为 (8950, 4450), (550, 1650), (550, 535), (525, 560)

序列

时间组

0

8950, 4450

1

550, 1650

2

550, 535

3

525, 560


该段截获红外代码就变成如下结构的编码

38400, "0112222111111222122222222222222222222212222222212222222212222222222222222222222222222222212122222111211222",                                         
        [(
8950, 4450), (550, 1650), (550, 535), (525, 560)]]

(此处未用到序列3的时间组,那是给另一段红外编码使用的,可删除)

修改N900的/usr/lib/hildon-desktop/tvbgone.py文件,如下:
。。。
import os, fcntl, struct, time, math
import gobject, cairo, gtk, gconf
import hildon, hildondesktop, osso

GCONFPATH 
= "/apps/Maemo/budig.de/TVBGone"

# Collection of shutdown codes for various TV models.
TVBGoneCodes = {
   
"Europe" : [
     
# 公司空调遥控关(开的编码不一样)
      [ 38400, "0112222111111222122222222222222222222212222222212222222212222222222222222222222222222222212122222111211222",                                         
        [(
8950, 4450), (550, 1650), (550, 535), (525, 560)]],                                                                                                        
      
# 公司投影遥控开/关
      [ 38400, "012121222212121301212122221212130121212222121213",
        [(
2400, 580), (1200, 580), (600, 580), (600, 20860)]], 

      
# code EU 0
      [ 35714, "510040000000000031026100400000000000310",
        [(
430, 470), (430, 910), (430, 83240), (880, 470), (1330, 1330), (2640, 900), (2640, 910)]],
      
# code EU 1
      [ 30303, "011111111143261111115326111111",
        [(
470, 2650), (510, 540), (510, 1080), (510, 2630), (510, 20530), (510, 116470), (1000, 1090)]],
      
# code EU 2
      [ 33333, "0122111222123112211122212",
        [(
430, 2060), (460, 2040), (460, 4560), (460, 34880)]],
。。。
此处我是在Europe中增加了我的代码,别忘了使用的时候选择Europe代码,最后保存重启N900即可(不知道怎么不重启能生效,有知道的望告知)。

-----------------------------------------------------------美艳动人的分割线-----------------------------------------------------------------

硬件版的TV-B-Gone由于单片机容量有限,v1.2相比v1.1采用了压缩算法,可以存储更多的红外编码,压缩算法如下:
同样以刚才截获的代码为例,
------------------------------------------------------------------------
CH 2
:
:212
1
8942
4470
551
1656
548
1658
547
537
550
535
549
535
550
535
549
1656
550
1656
549
1656
550
1656
549
1656
550
1656
549
535
550
535
549
537
548
1656
549
537
550
535
549
535
550
535
549
537
548
537
549
535
548
537
549
535
550
535
551
535
548
537
549
535
550
535
549
535
550
537
549
535
550
535
549
535
550
535
551
535
550
1656
549
535
550
535
549
535
550
537
547
537
548
537
549
535
550
535
549
1656
550
535
551
535
548
537
549
535
550
535
549
535
550
535
549
537
548
1658
549
535
550
535
549
535
550
535
549
537
548
537
549
535
550
535
549
535
550
537
549
535
550
535
549
535
550
535
549
537
548
537
549
535
550
535
549
535
550
537
549
535
550
535
549
535
550
535
549
537
548
537
549
535
550
535
549
535
550
537
547
537
548
537
549
1656
548
537
549
1656
550
535
549
535
550
535
549
537
550
535
549
1656
550
1656
549
1656
550
535
549
1656
550
1656
549
535
550
535
577
:
------------------------------------------------------------------------
同样简化一下

序列

时间组

0

8950, 4450

1

550, 1650

2

550, 535

3

525, 560


完整的红外编码序列为

序列

二进制

0

00

1

01

1

01

2

10

2

10

2

10

2

10

1

01

1

01

1

01

1

01

1

01

1

01

2

10

2

10

2

10

1

01

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

1

01

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

1

01

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

1

01

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

2

10

1

01

2

10

1

01

2

10

2

10

2

10

2

10

2

10

1

01

1

01

1

01

2

10

1

01

1

01

2

10

2

10

2

10

 

二进制整理一下

 

00010110101010010101010101101010011010101010101010101010101010101010101010100110101010101010100110101010101010100110101010101010101010101010101010101010101010101010101010101010100110011010101010010101100101101010

 


八位八位分割,缺少补零

二进制合并

十六进制

00010110

0x16

10101001

0xA9

01010101

0x55

01101010

0x6A

01101010

0x6A

10101010

0xAA

10101010

0xAA

10101010

0xAA

10101010

0xAA

10100110

0xA6

10101010

0xAA

10101001

0xA9

10101010

0xAA

10101010

0xAA

01101010

0x6A

10101010

0xAA

10101010

0xAA

10101010

0xAA

10101010

0xAA

10101010

0xAA

10101010

0xAA

10101010

0xAA

10011001

0x99

10101010

0xAA

10010101

0x95

10010110

0x96

10100000

0x90

 

原来106对,使用106个数字表示,占106字节,

现在变成27个16进制字符,占27个字节,大大减少了容量。


最终的代码:

。。。
const uint16_t code_na000Times[] PROGMEM = {
    
89504450,
    
5501650,
    
550535,
    
525560,
};
const struct IrCode code_na000Code PROGMEM = {
        freq_to_timerval(
38400),
        
106,             //  106组时间序列
        2,              //  不同的组一共四组,因此使用2bit就可以表示,这个解码需要用到
        code_na000Times,
        {
        
0x16,
        
0xA9,
        
0x55,
        
0x6A,
        
0x6A,
        
0xAA,
        
0xAA,
        
0xAA,
        
0xAA,
        
0xA6,
        
0xAA,
        
0xA9,
        
0xAA,
        
0xAA,
        
0x6A,
        
0xAA,
        
0xAA,
        
0xAA,
        
0xAA,
        
0xAA,
        
0xAA,
        
0xAA,
        
0x99,
        
0xAA,
        
0x95,
        
0x96,
        
0x90,
        }
};
。。。


例子没举好,竟然搞了个106对的红外编码,累死我了,大家凑合看,有错漏的地方或者其它问题欢迎留言(同样这里没有用到第三组时间组)。