Panowie, irda irdzie nie równa. Są transceivery specjalistczne i uniwersalne. Te specjalistyczne można porównać do słuchania radia przez wifi (bo np. nie da się ustawić niskiej częstotliwości nośnej).
Te uniwersalne są tak proste, że sposób sterowania nimi ogranicza się do "włącz/wyłącz diodę" (nie zawsze dosłownie). Taki sposób sterowania umożliwia osiągnięcie dowolnej fali nośnej i rodzaju modulacji, bo wszystko to zależy tylko od programu sterującego.
W Viście pojawił się natywny standard przesyłu danych RLC (Run Length Coded) razem z driverem klasy CIRClass. Standard ten określa w jaki sposób steruje się nadajnikiem IR: jest to tablica 32-bitowych liczb typu int, w której są czasy aktywności i nieaktywności nadajnika. Jeżeli liczba jest dodatnia, to dioda się włącza, a jeśli ujemna, to dioda się wyłącza. Minimalna jednostka czasu to jedna mikrosekunda.
Windows Driver Kit: Infrared Devices
Data Format
The CIRClass driver exchanges IR data with CIR Port drivers in a standard format. This format is referred to as Run Length Coded (RLC) format.
In run length coding, CIR data is encoded according to the duration of a high or low signal. These durations are recording the demodulated signal (the envelope) and not the modulated signal.
Each LONG (32 bits) of the IR represents a period of time that the signal is on or a period of time that the signal is off. If the LONG is positive, the signal is on. If the LONG is negative, the signal is off. The absolute value of the LONG is the duration of time that the signal is either high or low.
Therefore, if the IR stream is high for 500 microseconds, low for 200 microseconds, and high for 150 microseconds (typically represented as "500 -200 150"), the IR buffer contains the following:
0x01F4 (500 microseconds high)
0xFF38 (200 microseconds low)
0x0096 (150 microseconds high)
Wiedząc to i znając jakiś protokół transmisji IR, aby coś wysłać trzeba zaalokować tablicę IR_TRANSMIT_CHUNK (irclass_ioctl.h) i wpisać do niej czasy "impulsów". Impulsem może być rzeczywisty czas (nie)aktywności diody, lub czas (nie)aktywności fali nośnej, co można ustawić w strukturze IR_TRANSMIT_PARAMS.