0fe70389dd7ac47e957a0574cdc989948d4dfcc9
[pierogi] / doc / documentation.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4 <title>
5 Pierogi UIRC
6 </title>
7 </head>
8 <body>
9
10 <h1>Pierogi Documentation</h1>
11
12 <p>
13 The Pierogi universal infrared remote controller is a single self-contained
14 app capable of sending IR commands to a wide variety of devices.
15 At the moment, it is oriented towards television, VCR, DVD, and Blu-ray
16 devices, but a few other types of device have had their command sets entered.
17 </p>
18
19 <p>
20 In this app, each family of related infrared commands is collected into a
21 "keyset".  As manufacturers commonly reuse a given set of commands rather
22 than re-invent the wheel each time they come out with a new product, many
23 devices can share the same keyset.
24 </p>
25
26 <p>
27 Pierogi also follows the classic concept of a universal remote, by having
28 a common set of buttons that are reused for each device.  So, for example,
29 the "power" button has the same name and is located in the same position,
30 no matter what keyset is currently in use -- even if that keyset has a
31 different name for "power", or has no "power" command at all.  (Check out
32 the <a href="http://en.wikipedia.org/wiki/Universal_remote">Universal
33 Remote wiki</a> for a description of universal remote controls, which
34 includes a special mention of the N900!)
35 </p>
36
37 <p>
38 So in short, to use Pierogi, you first select an appropriate keyset, then
39 press the appropriate buttons to control the target device.  More detail on
40 the features of Pierogi is provided below.
41 </p>
42
43 <h2>Using Pierogi</h2>
44
45 <p>
46 The current Pierogi design is built around a tabbed window, each tab containing
47 a group of related buttons.  Depending on the keyset that has been selected,
48 some of these buttons will be active, others inactive.  Active buttons are ones
49 which have been associated with a command in the current keyset.  Pressing an
50 active button will begin repeating the associated command; letting up on the
51 button will stop the command.
52 </p>
53
54 <p>
55 Keysets can be chosen using the "Select Keyset" option in the drop-down menu.
56 If you have a particular keyset you use often, it can be stored in the
57 "favorites" tab for quick access.
58 </p>
59
60 <h3>Main Window</h3>
61
62 <h4>Main Tab</h4>
63
64 <p>The Main tab contains just the power, volume, mute, and channel buttons.
65 It is intended to be a quick way to get to the most important, commonly used
66 controls.  The name of the current keyset is also provided in this tab.</p>
67
68 <h4>Utility Tab</h4>
69
70 <p>The Utility tab contains a selection of commonly useful controls, such as
71 "Sleep", "Input", "Closed Captions / Subtitles", and the color buttons.
72 This tab is intended to be a quick way to reach the most frequently used
73 buttons; as such, the selection may be updated in future versions of Pierogi.
74 </p>
75
76 <h4>Keypad Tab</h4>
77
78 <p>This tab provides a numeric keypad and a handful of associated commands,
79 intended mainly for use with televisions.  The "Prev Channel" button should
80 take you to the previously selected channel, if any.  The "Dash" button
81 should allow you to specify a digital subchannel, as in "16-4".  The "+100"
82 button is used for television sets which normally expect only two digits
83 per channel; using this button allows you to enter a third digit.  The "-/--
84 Double Digit" button is used on very old televisions that normally expect
85 channels to be represented by just a single digit; pressing this should
86 allow you to enter a second digit.</p>
87
88 <h4>Menu Tab</h4>
89
90 <p>This tab contains buttons used to enter and exit a menu, navigate within
91 a menu, and select menu entries.  The "Menu" button is meant to enter the
92 main system menu of a given device; "Guide" is a content-related menu available
93 on many modern devices; and "Disc Menu" is used to access the menu interface
94 provided with DVD and Blu-Ray media.</p>
95
96 <h4>Media Tab</h4>
97
98 <p>Many of the most important playback commands are represented on this tab.
99 "Play", "Pause", and "Stop" are the most common ones, along with "Reverse"
100 (often called rewind) and "Fast Forward".  A variety of other less common
101 navigation controls are included, along with the "Eject" command.</p>
102
103 <h4>Favorite Tab</h4>
104
105 <p>As there are numerous keysets available in Pierogi, a "Favorite" tab has
106 been implemented.  To add a favorite keyset to the tab, first select that
107 keyset from the "Select Keyset" window.  Then, navigate to the Favorite tab
108 and press "Add Current Keyset".</p>
109
110 <p>Once you have added some keysets to the favorites list, you can tell
111 Pierogi to use one by simply selecting that keyset from the list.</p>
112
113 <p>A keyset can be removed from the list by selecting it and pressing
114 "Remove Selected Keyset".</p>
115
116 <h3>Select Keyset Window</h3>
117
118 <p>The Select Keyset window presents a list of all the keysets currently
119 available in Pierogi.  As this list is fairly long, buttons have been added
120 at the top of the window that allows you to choose the make and/or type of
121 device you are trying to control; all keysets not associated with the chosen
122 make or type will be hidden.  To use a keyset, simply select it from the list,
123 and then close the window (by pressing the return arrow at the top right of
124 the screen).</p>
125
126 <h3>Secondary Buttons Window</h3>
127
128 <h4>TV Tab</h4>
129
130 <p>This page contains several more TV-oriented buttons, including controls for
131 picture-in-picture, teletext, and some graphics and audio controls.  The
132 content of this page is subject to change.</p>
133
134 <h4>Media2 Tab</h4>
135
136 <p>This is another page of media buttons, containing a mix of commands useful
137 for DVD players, VCRs, audio devices, and possibly other devices.  The content
138 of this page may change in the future.</p>
139
140 <h4>Input Tab</h4>
141
142 <p>
143 Many devices have multiple sources for their data, whether it be television
144 signals piped in over the air or through a cable, or audio from a variety of
145 stereo components.  It is unlikely that Pierogi will ever be able to list all
146 of the various possible input buttons, but this tab contains a few of them.
147 </p>
148
149 <h4>Adjust Tab</h4>
150
151 <p>
152 A handful of the various audio and video adjustment buttons are placed on
153 this tab.  Actual volume controls will likely remain on the main window,
154 however.
155 </p>
156
157 <h2>Design Rationale</h2>
158
159 <p>Here I collect my thoughts on the how and why of creating Pierogi.</p>
160
161 <h3>Hasn't this been done before?</h3>
162
163 <p>Yes, remote control software has already been written for the N900.  In
164 particular, the
165 <a href="http://irreco.garage.maemo.org/">Irreco / QtIrreco</a> project
166 creates beautiful virtual remote controls.  I've also used the
167 <a href="http://thp.io/2010/raemote/">Raemote</a> widget to control my Apple
168 computers.  But these programs have their shortcomings; in particular, they
169 are not universal.  Each simulated remote control in QtIrreco is a completely
170 separate animal.  I would like to have a standard set of buttons that I can
171 use on all sorts of different hardware.</p>
172
173 <h3>What's up with LIRC?</h3>
174
175 <p>Just as QtIrreco and Raemote do, I want to leverage the work of the 
176 <a href="http://www.lirc.org/">Linux Infrared Remote Control</a> project.
177 The LIRC project is by far the most influential open-source effort working
178 with consumer IR.  And the N900 comes with a device driver made
179 specifically for their server!  But, you see, I have a problem.  I
180 don't want to do things the way LIRC wants to do things.</p>
181
182 <p>The N900 is different from other Linux systems using IR -- rather than
183 being the machine at which you point a remote control, this machine <i>is</i>
184 the remote control.  This is not what LIRC was designed for; the heart of the
185 LIRC project is a server that will sit and wait for messages to arrive from
186 the IR system.  Although it can also broadcast IR data back out (when using
187 hardware that supports 2-way IR communication), that is not its primary
188 purpose.</p>
189
190 <p>I believe there are three disadvantages to using the LIRC server as it
191 currently exists.  First, there isn't much point to running a daemon on
192 the N900 to manage the IR device; no messages are ever going to come in from
193 the output-only hardware on the N900, so why sit and listen for them?</p>
194
195 <p>The second problem is somewhat larger.  LIRC uses configuration files to
196 describe the command set for each remote control.  And there are a lot of them.
197 A whole lot.  We're talking thousands of files here, and each file can describe
198 many remote controls.  This is not a problem for Raemote or Irreco, as they
199 only need to deal with one config file at a time.  But if you're aiming to
200 manage the whole lot of them, you need to find a way to deal with the
201 multitudes.</p>
202
203 <p>The third problem is more subtle, but really tough to crack.  You see, the
204 whole point of LIRC is to take the commands it receives from the IR port and
205 translate them into something recognizable.  As such, each config file provides
206 a mapping from numeric commands to human-readable strings.  This is a
207 serious problem, if your interest is in finding similar commands in
208 different config files!  Take, for example, the "power"
209 button found on most remote controls.  In some config files, the string for
210 this is "power".  Others have "Power", or "POWER".  You can also find "pwr",
211 "PWR", "ON/OFF", "ON-OFF", "ONOFF", "POWER_ON_OFF", "KEY_POWER", "Operate",
212 "Standby", and who knows what else.  And, you've gotta be careful not to get
213 confused by strings like "SUBTITLE_ON/OFF" or "TV_ON_TIMER".  How is an app to
214 know which key to map all these strings to?</p>
215
216 <h3>So how is Pierogi different?</h3>
217
218 <p>
219 Pierogi attempts to answer these problems.  First, it talks directly to the
220 /dev/lirc0 device, no server middleman needed.  Yes, you can use Pierogi
221 without the LIRC daemon running; in fact, there's no need to ever install it.
222 Second, Pierogi is built
223 around the concept of the "keyset"; all IR codes that can share the same
224 protocol without interfering with one another are combined into a single
225 family of related commands.  In short, this reduces the quantity of data
226 available from LIRC config files to something much more manageable.</p>
227  
228 <p>The third problem mentioned above is a bit harder to solve; I'm currently
229 mapping each LIRC string to a corresponding Pierogi key by hand.  Naturally,
230 this process will be fraught with errors; I intend to keep updating Pierogi
231 as these errors are found and fixed.
232 </p>
233
234 <h2>Internal Design Notes</h2>
235
236 <p>If you're interested in the ugly details of the code, read on!</p>
237
238 <h3>What's up with the name of this app?</h3>
239
240 <p>Lately I've been naming my projects after tasty foods.  In particular,
241 I've been working my way through the pasta-oriented dishes.  (My previous
242 project, "Linguine", has gotten bogged down, so I moved on to this one...)</p>
243
244 <h3>Why use Qt?</h3>
245
246 <p>I'm a C++ kind of guy, it just makes sense to me to use a C++ kind of
247 interface.  The Qt classes have everything you need to set up a decent UI,
248 and Qt Creator makes coding up a project for the N900 relatively
249 painless.  Check it out for yourself at
250 <a href="http://qt.nokia.com/">the Qt webpage</a>.
251 </p>
252
253 <h3>The simplest device ever!</h3>
254
255 <p>If you ever wanted to learn how to work with device drivers on Linux, the
256 N900's infrared port is the device you want to start with.  It's not 
257 much more than a flashlight: You turn it on.  You turn it off.  You turn it on
258 again.  You turn it off again.  You really can't get much simpler than that.
259 Interaction with the "/dev/lirc0" device involves no more than handing
260 it an array of integers: the first integer being an amount of time to keep the
261 light lit (in microseconds), the second being an amount of time to leave it
262 switched off, the third on, the fourth off, and so on.</p>
263
264 <p>Well, ok, so it involves just a little bit more than that.  You don't want
265 to leave the light stuck in the "on" state when you are finished, so the driver
266 demands that the last item in every array be an "on" amount -- after finishing
267 that timer, the IR will stay off until the next command arrives.
268 </p>
269
270 <p>
271 Also, in an attempt to weed out any confusing signals from natural IR sources
272 in the environment, consumer IR devices are "pulsed" at a particular
273 frequency.  So you're really turning a strobelight on and off, not just a
274 flashlight.  When the receiver sees that the light is coming from a strobelight
275 pulsing at the desired frequency, it can be assured that that signal came from
276 an actual remote control.  The N900's device driver allows you to set the
277 frequency anywhere between 20000 Hz and 500000 Hz.  38000 Hz seems to the most
278 popular frequency used by modern remote controls, at least from what you find
279 in LIRC config files.  Also, you can set how long each pulse needs to be held,
280 in terms of a percentage: 25% means turning the light on for just one quarter
281 of the pulse, 33% means leaving it on for one third, etc.  This is called the
282 "duty cycle", and can be anywhere between 0 and 100 percent.  LIRC's default
283 duty cycle is 50 percent.
284 </p>
285
286 <p>And that's about it.  I've been using a 
287 <a href="http://svn.jacekowski.org/host_mode/trunk/drivers/input/lirc/lirc_rx51.c">web page</a>
288 that lists the source code for the IR device driver.  I'm not sure if there's
289 a better location out there for N900 source code, but this seems accurate
290 so far.</p>
291
292 <h3>You did <i>what</i> to the LIRC daemon?</h3>
293
294 <p>
295 Well, ok, yeah, I've cannibalized the transmission code out of the LIRC
296 server and dumped it into my app.  Sort of.  I can't really keep my hands off
297 of code once I've seen it, so I've rewritten it in C++, reorganizing it in
298 an object-oriented manner along the way.</p>
299
300 <p>
301 As I have progressed in adding support for additional IR protocols, I'm
302 beginning to see why the authors of the LIRC made the attempt to compress
303 every possible IR protocol into a straightforward count of individual IR
304 pulses.  The total number of IR protocols in use is amazing, and many of them
305 (through oversight or due to the longevity of their use) are mind-numbingly
306 complicated to deal with.  Still, I believe that separating the major protocols
307 into their own code paths results in code that is easier to understand and
308 maintain; I'm slowly moving away from the LIRC's system to my own as time
309 goes on.
310 </p>
311
312 <p>
313 In any case, I owe the LIRC authors a deep debt of gratitude for their
314 efforts.  If you are one such author, thank you.  As Pierogi is more-or-less
315 derived directly from their work, it is also licensed under the same terms,
316 the GNU General Public License (GPL) version 2 or later.
317 </p>
318
319 <h2>Attribution</h2>
320
321 <p>I've fallen in love with the Gentleface Mono Icon Set.  Of the creative
322 commons icon sets available, theirs stands head and shoulders above the rest.
323 Find their work at <a href="http://www.gentleface.com">www.gentleface.com</a>.
324
325 <h2>References</h2>
326
327 <p>A set of links to some resources I've used while writing the code.</p>
328
329 <ul>
330 <li>The center of the Linux infrared world, the
331 <a href="http://www.lirc.org/">Linux Infrared Remote Control</a> project.
332
333 <li>A <a href="http://en.wikipedia.org/wiki/Consumer_IR">Wiki page</a> with
334 general info on consumer IR
335
336 <li>A <a href="http://www.sbprojects.com/knowledge/ir/index.php">good introduction</a>
337 to the theory and practice behind consumer IR devices
338
339 <li>A <a href="http://en.wikipedia.org/wiki/RC-5">Wiki for the RC-5 protocol</a>
340
341 <li>Some <a href="http://www.sbprojects.com/knowledge/ir/nec.php">Info on the NEC protocol</a>
342
343 <li>Some <a href="http://www2.renesas.com/faq/en/mi_com/f_com_remo.html">More info on the NEC protocol</a>
344
345 <li>An introduction to the <a href="http://www.sbprojects.com/knowledge/ir/sirc.php">Sony SIRC protocol</a>
346
347 <li>An excellent collection of <a href="http://www.hifi-remote.com/sony/">Sony command codes</a>
348
349 <li>An in-depth investigation of the <a href="http://www.adrian-kingston.com/IRFormatPioneer.htm">Pioneer IR Protocol</a>
350
351 <li>Link to (what appears to be) source code for the N900's
352 <a href="http://svn.jacekowski.org/host_mode/trunk/drivers/input/lirc/lirc_rx51.c">/dev/lirc0 device driver</a>.
353
354 <ul>
355
356 </body>
357 </html>