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