每次都重新推算一遍,年紀大了還是記錄一下吧(硬件版的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對的紅外編碼,累死我了,大家湊合看,有錯漏的地方或者其它問題歡迎留言(同樣這里沒有用到第三組時間組)。