<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.linuxmce.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mstovenour</id>
	<title>LinuxMCE - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.linuxmce.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mstovenour"/>
	<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php/Special:Contributions/Mstovenour"/>
	<updated>2026-07-21T20:49:34Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=GSD_-_Ruby_codes&amp;diff=4649</id>
		<title>GSD - Ruby codes</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=GSD_-_Ruby_codes&amp;diff=4649"/>
		<updated>2007-08-11T15:16:57Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
== GSD ==&lt;br /&gt;
Generic Serial Device is a module that offers basic functionality for accessing devices via the serial port (mostlly through the RS232 interface). The project sources are located in pluto/src/Generic_Serial_Devices.&lt;br /&gt;
&lt;br /&gt;
== Command implementation in Ruby ==&lt;br /&gt;
For Generic Serial Devices the architecture allows implementing the commands directly from the LinuxMCE Admin Web Page, using Advanced/Device Templates. After picking the device template, select ruby codes and add the command groups that you want to implement (should be supported by the devices for witch you want to create the template)&lt;br /&gt;
&lt;br /&gt;
The framework offers an Ruby &#039;&#039;Command&#039;&#039; object that actually behaves as a container for data also found in the C++ class Command from DCE. In order to create an instance of the ruby command use:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     cmd = Command.new( &amp;lt;device from&amp;gt;, &amp;lt;device to&amp;gt;, &amp;lt;priority&amp;gt;, &amp;lt;type&amp;gt;, &amp;lt;id&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a hash map associated with the command object that allows setting values for the command parameters:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     cmd.params_[&amp;lt;parameter id&amp;gt;] = &amp;lt;string value for command parameter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And for sending the command you should use the SendCommand function:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     SendCommand(cmd)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Directly implementing each command this way may prove inconvenient. You can use the Private Method dummy command for writing helper functions. Besides from the params_ member, the ruby Command object has members for all the parameters from the constructor. Still, the wrapper offers only simple access to what a command really is in the DCE Framework, but, of course, it can be extended to allow more by adding members to the RubyCommandWrapper C++ class. All that&#039;s implemented here gets translated to Ruby.&lt;br /&gt;
&lt;br /&gt;
The actual forwarding to the DCE framework is done in the Generic_Serial_Device project, in classes implementing RubyDCEConnector (ex: RubyIOManager). These are used at their turn from the RubySerialWrapper, witch offers the actual context where the Ruby code runs (Ruby twin classes are generated for each device at runtime). The SendCommand used above is a method of the RubySerialWrapper class.&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Orbiter_with_OpenGL_enabled&amp;diff=4648</id>
		<title>Orbiter with OpenGL enabled</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Orbiter_with_OpenGL_enabled&amp;diff=4648"/>
		<updated>2007-08-11T15:00:11Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
OpenGL drawing work in a separate thread which may mean that will not mix with actual Orbiter as architecture and will draw only when effects are pending, else it stays in idle mode.&lt;br /&gt;
Also OpenGL painting is not  frame based: to understand easy what means that you may think that OpenGL &amp;quot;screen shots&amp;quot; on one moment the stage of the animation and display on screen. If it gets many &amp;quot;frames&amp;quot; the look will be animated.&lt;br /&gt;
If your computer&#039;s hardware is capable to made a fluid animation, everything will look nice, else the animation skip the frames to complete in setted time.&lt;br /&gt;
If you get lower performance you may reduce the resolution of your screen or bpp (bits/pixel = bit color depth of image). Too you must assure that your accelerated drivers are enable.&lt;br /&gt;
&lt;br /&gt;
That implementation splits the OpenGL drawing by Effect part.&lt;br /&gt;
    - the high level class for drawing of 2D components is named Widget, and is covered by DrawingWidgetsEngine.&lt;br /&gt;
    - effects are covered by class GL2DEffectFactory&lt;br /&gt;
&lt;br /&gt;
The DrawingWidgetsEngine::Paint() and DrawingWidgetsEngine::Flip() are usually not called by an effect/opengl programer.&lt;br /&gt;
&lt;br /&gt;
First of them iterates all widgets and draw them if they have the visible flag set true.&lt;br /&gt;
Flip method will made the complete update to the screen.&lt;br /&gt;
&lt;br /&gt;
The decision of separation of the Paint (3D render) and flipping is cause some implementations may add different OpenGL code, for instance it may mix with one texture, etc.&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Photo_Screen_Saver&amp;diff=4647</id>
		<title>Photo Screen Saver</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Photo_Screen_Saver&amp;diff=4647"/>
		<updated>2007-08-11T14:59:41Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
Photo Screen Saver is an OpenGL application that will slide different images which are taken from www.flickr.com site.&lt;br /&gt;
They are downloaded by the script /usr/pluto/bin/flickr.pl&lt;br /&gt;
The params of that script are: minwidth, minheight, and which number of previous days should be searched.&lt;br /&gt;
&lt;br /&gt;
The all files are downloaded by at the folder /home/flickr/[year]/[mount]/[day]&lt;br /&gt;
&lt;br /&gt;
After the script saves some files the PhotoScreenSaver (PSS) is started.&lt;br /&gt;
&lt;br /&gt;
PSS is a child device of Orbiter which means that will get different parameters from the admin page and will be started/stopped by Orbiter itself.&lt;br /&gt;
&lt;br /&gt;
What is the normal flow of PSS?&lt;br /&gt;
&lt;br /&gt;
[[1. Initialization]]&lt;br /&gt;
&lt;br /&gt;
[[2. Animation thread]]&lt;br /&gt;
&lt;br /&gt;
[[3. Finalization]]&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=OpenGL_Introduction&amp;diff=4646</id>
		<title>OpenGL Introduction</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=OpenGL_Introduction&amp;diff=4646"/>
		<updated>2007-08-11T14:58:43Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot;&amp;gt; &amp;lt;tr&amp;gt;&amp;lt;td bgcolor=&amp;quot;#FFCFCF&amp;quot;&amp;gt;This page was written by Pluto and imported with their permission when LinuxMCE branched off in February, 2007.  In general any information should apply to LinuxMCE.  However, this page should be edited to reflect changes to LinuxMCE and remove old references to Pluto.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;OpenGL is one API (Application Programming Interface) originally written by SGI that enable using your graphic hardware.&lt;br /&gt;
The specifications are defined at the address www.opengl.org&lt;br /&gt;
The actual implementation match the OpenGL version 1.1 (means that is compatible with most mainstream boards that offer hardware acceleration), but future implementations may not match that compatibility.&lt;br /&gt;
&lt;br /&gt;
OpenGL architecture is in that way:&lt;br /&gt;
&lt;br /&gt;
- OpenGL context is attached with an window (may be any widget) and the programmer then call drawing commands. When they are valid and ready to be drawn they became effective. OpenGL works too as a state machine, which means that at one moment exist only one function and one way to draw. To change it, you must change the current function, OpenGL flags, etc.&lt;br /&gt;
&lt;br /&gt;
- drawing operations are mathematically based, which means that you may translate, rotate, scale using predefined functions. For doing that exist functions as: glTranslate, glRotate, etc. To recover the scale and positions to be defaults, you may call glLoadIdentity()&lt;br /&gt;
&lt;br /&gt;
- OpenGL have more drawing perspectives, but for now the perspective used is orthogonal one (means that even the distance of the object increase, the object will not became smaller)&lt;br /&gt;
&lt;br /&gt;
- OpenGL drawing commands are between glBegin and glEnd, and glBegin gets one parameter that say which mode will be drawn. For instance the mode GL_TRIANGLES will draw one triangle only after three points will be displayed, but GL_TRIANGLESTRIP, the first triangle will be drawn after three points. but the every next point with last two points in the definition of the last drawn triangle will made one new triangle&lt;br /&gt;
&lt;br /&gt;
- current OpenGL implementation use double-buffer and that may mean that until a SwapBuffer command, no result will be shown&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=STEngine&amp;diff=4645</id>
		<title>STEngine</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=STEngine&amp;diff=4645"/>
		<updated>2007-08-11T14:57:14Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot;&amp;gt; &amp;lt;tr&amp;gt;&amp;lt;td bgcolor=&amp;quot;#FFCFCF&amp;quot;&amp;gt;This page was written by Pluto and imported with their permission when LinuxMCE branched off in February, 2007.  In general any information should apply to LinuxMCE.  However, this page should be edited to reflect changes to LinuxMCE and remove old references to Pluto.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;STEngine - Simple Type Engine&lt;br /&gt;
&lt;br /&gt;
STEngine is a simple framework that operates with high level objects to not mess with OpenGL code. &lt;br /&gt;
&lt;br /&gt;
Prerequisites before entering and modifying the code&lt;br /&gt;
&lt;br /&gt;
- [http://gpwiki.org/index.php/3D:Matrix_Math multiply matrix theory]&lt;br /&gt;
&lt;br /&gt;
- texture mapping with a [http://www.gamedev.net/reference/articles/article947.asp  simple] and a [http://www.flipcode.com/articles/article_advgltextures.shtml complex] tutorial&lt;br /&gt;
&lt;br /&gt;
The STEngine covers the next parts:&lt;br /&gt;
&lt;br /&gt;
- geometry containers&lt;br /&gt;
&lt;br /&gt;
- texture management&lt;br /&gt;
&lt;br /&gt;
- font management&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Sql2cpp&amp;diff=4644</id>
		<title>Sql2cpp</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Sql2cpp&amp;diff=4644"/>
		<updated>2007-08-11T14:54:19Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot;&amp;gt; &amp;lt;tr&amp;gt;&amp;lt;td bgcolor=&amp;quot;#FFCFCF&amp;quot;&amp;gt;This page was written by Pluto and imported with their permission when LinuxMCE branched off in February, 2007.  In general any information should apply to LinuxMCE.  However, this page should be edited to reflect changes to LinuxMCE and remove old references to Pluto.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;&amp;lt;h1&amp;gt;How does it work?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;sql2cpp creates a C++ library that makes it very easy to work with a relational database. Just run sql2cpp passing in the login information for a database. This will create a stand-alone library with a &amp;quot;Database&amp;quot; class that has members for each of the tables. Each table has a &amp;quot;Table&amp;quot; class that has members to get row(s), and each table has a &amp;quot;Row&amp;quot; class with members for each of the fields. sql2cpp creates member functions that make it very easy to traverse foreign key relationships.  You can traverse multiple tables across several relationships on one command line, and with one line get pointers to all other rows referencing it.  This often reduces 20 or so lines of code down to 2 or 3 and makes the code much more readable.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Examples:&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You have a simple database called &amp;quot;Accounting&amp;quot;.  It contains tables &amp;quot;Sale&amp;quot;, &amp;quot;Product&amp;quot; and &amp;quot;Manufacturer&amp;quot;.  The respective Primary keys are &amp;quot;PK_Sale&amp;quot;, &amp;quot;PK_Product&amp;quot;, and &amp;quot;PK_Manufacturer&amp;quot;.  Sale has a foreign key to Product (FK_Product), indicating the product that was sold.  Product has a foreign key to Manufacturer (FK_Manufacturer) indicating who made the Product.  sql2cpp will create classes Database_Accounting, Table_Sale, Row_Sale, Table_Product, Row_Product, Table_Manufacturer, Row_Manufacturer.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If you want to get the row for sale #82 (ie where the primary key is 82), just do:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;h4&amp;gt;Database_Accounting myAccounting;&amp;lt;br&amp;gt;&lt;br /&gt;
Row_Sale *pSale = myAccounting.Table_Sale.get().GetRow(82);&amp;lt;/h4&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Then if you want to know the name of the Manufacturer who made the product sold, you can traverse the relationships across all 3 tables with 1 line:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;h4&amp;gt;string Name = pSale-&amp;gt;FK_Product_getrow()-&amp;gt;FK_Manufacturer_getrow()-&amp;gt;Name_get();&amp;lt;/h4&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If you want to want to get a list of all products made by manufacturer #94, just create a vector of Row_Product, and call this function:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;h4&amp;gt;vector&amp;lt;Row_Product *&amp;gt; vectProducts;&amp;lt;br&amp;gt;&lt;br /&gt;
myAccounting.Manufacturer_get().GetRow(94).Product_FK_Manufacturer_getrows(&amp;amp;vectProducts);&amp;lt;/h4&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;That will fill the vector with all the rows in Product that reference this manufacturer by the field FK_Manufacturer.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;You want to add a new manufacturer:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;h4&amp;gt;Row_Manufacturer *pRow_Manufacturer = myAccounting.Table_Manufacturer.AddRow();&amp;lt;br&amp;gt;&lt;br /&gt;
pRow_Manufacturer-&amp;gt;Name_set(&amp;quot;Acme Tools&amp;quot;); // Set the other fields too&amp;lt;br&amp;gt;&lt;br /&gt;
myAccounting.Table_Manufacturer.Commit(); // Commits any new, modified or deleted rows&amp;lt;br&amp;gt;&lt;br /&gt;
int New_Auto_Increment_PrimaryKey = pRow_Manufacturer-&amp;gt;PK_Manufacturer_get(); // It was set during the Commit&amp;lt;br&amp;gt;&lt;br /&gt;
pRow_Manufacturer-&amp;gt;Delete(); // Delete the record after all&amp;lt;/h4&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Give it a try&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;To try it out, just run sql2cpp with login information for your database.  It will create a complete project including a gcc-compatible Makefile and a Microsoft Visual Studio .NET project.  If you want it to handle traversing foreign keys you will need to follow our naming convention, described in the Programmer&#039;s Guide, so sql2cpp can figure out what are foreign keys and what tables they refer to.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=SqlCVS&amp;diff=4643</id>
		<title>SqlCVS</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=SqlCVS&amp;diff=4643"/>
		<updated>2007-08-11T14:52:42Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Sample Uses&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;A chain of retail stores wants all the stores to share a common customer database, but not all the stores have high-speed internet connections to the main server.  Each gets a local copy of the database and synchronizes nightly with the main server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;*or*&amp;lt;/b&amp;gt; At the end of the year a company wants to let the accountants work on year-end adjustments off-site or off-line.  The accountants can do audits, make changes, roll-back changes that don&#039;t seem right and work with the database without touching the main database.  Only when they are finished they merge in their changes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;*or*&amp;lt;/b&amp;gt; For faster performance and less strain on the master server employees work on local copies of the database and merge changes nightly.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;*or*&amp;lt;/b&amp;gt; Even if you don&#039;t care about synchronizing or working off-line you still want good history tracking and the ability to roll-back erroneous changes.  You could enable full logging in MySQL, but that doesn&#039;t let you roll-back one user&#039;s transactions on June 10, or remove everything that one user did, or checkout a copy of your database as of May 15 at 11:45.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Why did LinuxMCE develop it?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;We built it for our LinuxMCE smart home system because our product is very database dependent.  Everything is stored in a database--the documentation, the infrared codes, the programmer&#039;s class definitions, even the graphics user interface.  We have a fully automated sqlCVS repository that automatically gives every user a working copy of the database and synchronizes shared tables, like infrared codes, with every other user.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;How does it work?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The User&#039;s Manual has more details, but in a nutshell, you put the &#039;master&#039; database on a server which only sqlCVS has access to, and run sqlCVS listen on the server which opens a port for incoming connections.  Any clients then do a sqlCVS import (like a checkout) to get a local working copy.  The clients do a sqlCVS update to merge their changes back into the master database, and pull changes from other users.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If there are conflicts because multiple people checked in records with the same auto-increment primary key, sqlCVS handles re-assigning the new number, and propagates the changes to all the foreign key&#039;s that reference it.  If you change a row that someone else has changed, you are shown the difference and given the option of using your version or the other person&#039;s.  sqlCVS keeps a full, permanent history of every modification and features atomic commits, so the database is &amp;quot;versioned&amp;quot; after each checkin.  It tracks permissions and table + record level ownership.  So, if user A makes changes to a row or table that belongs to user B, when he does a checkin, user A&#039;s changes are isolated and he is given a batch number and user B&#039;s user ID.  User B can review the changes user A made, and then approve the batch, causing those changes to be merged into the master database.  sqlCVS also supports forking, and remerging branches.  At LinuxMCE we use this when we want to change versions, and to allow different people to work with the &#039;development&#039;, &#039;testing&#039;, and &#039;release&#039; versions.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;What changes do I have to make to my application?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;sqlCVS is completely transparent.  The software that uses the database does not need to be aware of sqlCVS.  The only database consideration is that the field names must follow a logical naming convention so sqlCVS can determine what are foreign keys.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Message_Interceptors&amp;diff=4642</id>
		<title>Message Interceptors</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Message_Interceptors&amp;diff=4642"/>
		<updated>2007-08-11T14:49:51Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;This allows your device to tell DCERouter that it wants to get copies of all messages that meet a certain criteria.  For example, a device may want to work with the lights and get copies of all messages going to a light, or another may want a copy of all events from the disk drive.  When you register a message interceptor with DCERouter you specify 6 numeric parameters which limit the messages you will receive.  For each you can specify 0, which means match all, or a non-zero integer which means only match messages which match that criteria.  If you register a message interceptor with all 0&#039;s, you will get all messages.  Be sure to provide restrictions so you only get the messages you really need.  DCERouter processes lots of messages, so if you register a message interceptor that is too vague, you could get flooded.  For example, the media players typically broadcast a message every second with an updated time code.  If you register a message interceptor to grab all messages from a media device, you would get time-code messages every second.  Note that parameters act as &#039;AND&#039; not &#039;OR&#039;.  If you register for DeviceCategory=&amp;quot;Media Player&amp;quot; and MessageID=&amp;quot;Play Media&amp;quot; you will get messages that are both going to Media Players AND have an ID of Play Media.  If you wanted to get messages that go either to Media Players OR have an ID of Play Media, then register 2 separate interceptors.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;From (PK_Device): If specified you will only get messages from this particular device ID.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;To (PK_Device): If specified you will only get messages to this particular device ID.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Template (PK_DeviceTemplate): If specified you will only get messages to devices of this particular DeviceTemplate.  Note that if the message type is an Event, that is coming from a device rather than going to it, the Router will look at the template of the From device.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Category (PK_DeviceCategory): If specified you will only get messages to devices of this particular DeviceCategory.  Note that if the message type is an Event, that is coming from a device rather than going to it, the Router will look at the category of the From device.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;MessageType: The type of message, as defined in the source file DCE/Message.h.  The 2 most common message types are 1 and 2 (MESSAGETYPE_COMMAND=1, MESSAGETYPE_EVENT=2). But you can also receive message of type 7 (MESSAGETYPE_SYSCOMMAND=7) if DCERouter is reloaded. In this case MessageID is 1 and it means &#039;Reload&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;MessageID: The ID of the message, as defined in the source file DCE/Message.h.  The ID depends on the message type.  Event ID&#039;s are defined in the table &#039;Event&#039; in pluto_main.  Command ID&#039;s are defined in the table &#039;Command&#039;.  In LinuxMCE Admin you can choose &#039;Advanced&#039;, &#039;DCE&#039; to see the command and event ID&#039;s.  If you specify an ID, you should also specify a type.  A command ID of 19 is &amp;quot;Set House Mode&amp;quot; whereas an event ID of 19 is &amp;quot;Watching Media&amp;quot;.  So if you only specify the ID of 19, and leave MessageType as 0, your interceptor will get both &amp;quot;Set House Mode&amp;quot; commands and &amp;quot;Watching Media&amp;quot; events.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;To register a message interceptor, call the RegisterMsgInterceptor member function, with the Command_Impl class that all plugins and devices are derived from:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;RegisterMsgInterceptor( ( MessageInterceptorFn )( &amp;amp;Media_Plugin::MediaInserted ), 0, 0, 0, 0, MESSAGETYPE_EVENT, EVENT_Media_Inserted_CONST );&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This means the member function Media_Plugin::MediaInserted, which must match the definition of MessageInterceptorFn, will be called whenever a device fires a &amp;quot;Media Inserted&amp;quot; Event.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;If you are not using the DCE C++ library, you can send a message to DCERouter manually to register the message interceptor, and then you will get intercepted messages encapsulated within another message.  To register a message interceptor this way, send a message to DCERouter, which is always device ID -1000 (#define DEVICEID_DCEROUTER -1000) with a MessageType of 8 (MESSAGETYPE_REGISTER_INTERCEPTOR=8).  The parameters for the message are the 6 interceptor parameters: enum { PARM_FROM=1, PARM_TO, PARM_TEMPLATE, PARM_CATEGORY, PARM_MESSAGE_TYPE, PARM_MESSAGE_ID };&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Here is the same interceptor sent by hand, not using the framework:&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Message *pMessage = new Message(m_dwPK_Device,DEVICEID_DCEROUTER,PRIORITY_NORMAL,&amp;lt;br&amp;gt;&lt;br /&gt;
	MESSAGETYPE_REGISTER_INTERCEPTOR,2,&amp;lt;br&amp;gt;&lt;br /&gt;
	PARM_MESSAGE_TYPE,MESSAGETYPE_EVENT,&amp;lt;br&amp;gt;&lt;br /&gt;
	PARM_MESSAGE_ID,EVENT_Media_Inserted_CONST);&amp;lt;br&amp;gt;&lt;br /&gt;
QueueMessageToRouter(pMessage);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;In this case you will receive all intercepted messages embedded within a message of type: MESSAGETYPE_MESSAGE_INTERCEPTED.  The actual intercepted message will be the single embedded message in m_vectExtraMessages.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=DCE_Libraries&amp;diff=4641</id>
		<title>DCE Libraries</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=DCE_Libraries&amp;diff=4641"/>
		<updated>2007-08-11T14:43:53Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Corrected link to LinuxMCE_main database page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Introduction&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If you want to dive right in to the &amp;quot;make your own DCE Device in 5 minutes&amp;quot; tutorial, [[Make a DCE Device in 5 minutes]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;DCE (Data, Commands, Events) is a lightweight network protocol allowing any device to access its configuration (ie data) from a central database, send + receive commands, and fire + respond to events.  The intended use is in a smart home solution.  The goal is to allow the homeowner to plug anything into his network (motion detector, intercom, telephone, media station, camera, etc.) and immediately start using it without any complicated setup.  Also, we want all the devices to be interchangeable, and controllable with the same remote using the same UI.  This aspect requires that developers of new devices implement, at a minimum, a standard set of commands pre-determined for that type of device.  For example, if there exists a standard &amp;quot;Swimming Pool&amp;quot; remote control with buttons for temperature up &amp;amp; down, which fires temp_up and temp_down commands, then any new swimming pool control devices must implement the same commands for the homeowner to be able to control that device using his existing remote control.  Therefore, the entire database of all devices is publicly available so a developer of a new device can share the same commands.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This makes a huge difference in terms of usability.  Consider how popular new multi-media keyboards have become for Windows, and how convenient it is for a user to be able to press the &amp;quot;pause&amp;quot; button on his keyboard and know that whatever media player he is using--no matter who made it--will pause.  This finally made universal remote controls for PC&#039;s possible, and made the PC practical as a home media player.  This is only possible because Microsoft established a standard scancode/message for &amp;quot;pause&amp;quot; and all the media player manufacturers implemented it.  Prior to this standardization, every media player had its own proprietary way of receiving a pause command.  DCE intends to expand this standardized interoperability to all types of commands for every device in a smart home.  But instead of one company dictating the standards as with the multi-media keyboard example, DCE is an open source project.  The standardization becomes a cooperative effort amongst all the device developers.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Compatible Software &amp;amp; Hardware Platforms&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The DCE protocol itself can be implemented with any device that supports standard networking.  LinuxMCE provides a DCE library written in Ansi C++ that implements the protocol on any socket-compatible operating system, and has been tested on Linux and Windows.  Porting to other languages should not be a big task.  Because the messaging is socket-based, any device, regardless of operating system or language, can be used with any other device.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Plug &amp;amp; Play Support&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The LinuxMCE platform includes a utility that monitors requests for IP addresses from the DHCP server.  When a new device is detected with an unrecognized Mac Address, it looks up the Mac Address in a master database to see what type of device it is and if it corresponds to a DCE Device.  If so, the device is automatically added to the system, the software is added, a configure script is executed, and the user is notified.  When you make a DCE Device, you are able to specify all these options, including ranges of Mac Addresses for your devices and what default data parameters they should use.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;How do DCE Devices talk to each other?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;In each installation there is also 1 DCE Router, through which all messages are routed.  An &amp;quot;installation&amp;quot; is a group of devices treated as a unit, and normally corresponds to a physical residence.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The DCE Router is itself quite simple.  It just opens a port for incoming connections.  When a device connects, the device sends its unique ID, or MacAddress.  The DCE Router does a lookup in a database, and returns that device&#039;s data (configuration).  DCERouter also sends back a list of all the other devices in the installation with basic information including the commands they know how to implement.  The DCE Device then opens a minimum of 2 socket connections to the router.  One is for incoming messages (usually commands) from the router, another for outgoing messages (usually events) to it.  The DCE Library, which implements the protocol for DCE Devices and the DCE Router, will also open a 3rd socket connection so that it has 2 outgoing sockets: 1 dedicated for sending events and the other for sending other types of messages, like requests and commands to other devices.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;All messages go through the router--devices do not communicate directly to each other.  The message will contain information such as the destination device, the type of message, the message id, and any number of optional parameters.  The router does nothing with the message but forward it to the destination device, or devices if the message is being sent to more than one.  The DCE library, from which DCE Devices and the DCE Router are derived, knows how to receive incoming messages of the type command, and route them to a message handler in the DCE Device.  This works in conjunction with the [[DCE Generator]] utility.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;DCE Generator builds a complete Linux/Windows DCE Device for you&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The definition of the device, including its data, commands and events is stored in a central database, described [[LinuxMCE_main_database]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Next Steps&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This section of the documentation explains the specifics of DCE.  You can also learn how to configure DCE Device definitions, called templates, [[LinuxMCE Admin Website]] using the LinuxMCE Admin web site.  Under Developers/Source Code docs you will find documentation for the DCE library code.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Make a DCE Device in 5 minutes]] will show you how to make a DCE Device in 5 minutes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Download the source code for the C++ DCE library using the http://LinuxMCE.com/support/index.php?package=0&amp;amp;section=mainDownload, or check it out from our [[Building from source]].&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Pluto_main_database&amp;diff=4640</id>
		<title>Pluto main database</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Pluto_main_database&amp;diff=4640"/>
		<updated>2007-08-11T14:41:45Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Virtually everything about LinuxMCE is stored in this database.  The DCE definitions, the documentation, the list of software and the requirements to use it, the boot scripts, even the graphical user interface on the Orbiters is here.  Most of the software modules in LinuxMCE will need this database to run.  The [[LinuxMCE Admin Website]] web site is the primary front-end for the database.  Use it to configure everything in your LinuxMCE system, browse your local copy of the documentation, and just about everything else.  The one exception is the graphical user interface on the Orbiters.  It would not be practical to build a GUI in a web, so there is a separate program, Designer, which is used to edit the GUI.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The database contains a collection of sqlCVS repositories, with tables grouped by function.  All LinuxMCE systems have the same database, with the same data, except for the tables in the &amp;quot;local&amp;quot; repository.  These include the Devices, Installation and Users, and their related tables.  This information is only in your local copy.  LinuxMCE&#039;s central database only keeps track of the ID&#039;s that have been used so that we can ensure that every device, installation and user is globally unique, allowing you to join houses, and do other things that require unique ID&#039;s.  The LinuxMCE Admin web site will request a unique ID from www.linuxmce.com when you add a Device, User or Installation.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=DCERouter&amp;diff=4639</id>
		<title>DCERouter</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=DCERouter&amp;diff=4639"/>
		<updated>2007-08-11T14:39:14Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;DCERouter has no options or user interface, so there is no documentation for users--only technical documentation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;DCERouter is the central piece of software that all [[LinuxMCE DCE Devices]] for documentation on the DCE socket-based messaging protocol.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Normally DCE Devices run separately from the router.  Since they communicate over a socket, they can be on the same computer, or another computer with an internet connection.  A DCE Device can also be run in the DCE Router&#039;s memory space.  These devices are called plug-ins.  However, they are really identical to the other DCE Devices.  In fact, all DCE Devices come with 2 projects/Makefiles--1 to run as a normal, external DCE Device, and 1 to run as a plug-in.  Of course, running as a plug-in is much more dangerous since it is in the same memory space and can therefore crash the whole router, and bring the whole LinuxMCE system down.  Therefore it is encourages to run devices as plug-ins only when necessary because the device needs to be able to intercept messages that may not be directed to it.  Since all the plug-ins run in the same memory space, they have access to the actual class pointers for the other plug-ins, and can therefore efficiently share data and call each other&#039;s functions.  To make your DCE Device a plug-in, just check the &amp;quot;Is Plug-in&amp;quot; box when defining the device in the &amp;quot;Device Template&amp;quot; section of the configuration web site.  Then compile it using the DLL-version of the project under Windows, or the so (for shared object) switch on the Makefile under Linux.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=DCE_Devices&amp;diff=4638</id>
		<title>DCE Devices</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=DCE_Devices&amp;diff=4638"/>
		<updated>2007-08-11T14:38:38Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
A DCE Device is any device that can connect to a [[DCE Router]] to get its Data (ie configuration settings), receive commands, and fire events.  Nearly everything in LinuxMCE is a DCE Device, including telephones, lights, DVD players, TV&#039;s, etc.  Many devices, like a TV, may not implement DCE directly, but rather they are children of another device that does, such as the infrared transmitting gc100.  In that case, the parent, which does implement DCE, is responsible for controlling the children.  Alarm panels are another example.  There is usually a DCE Device that implements DCE for the panel itself, but the children (motion sensors, smoke detectors, etc.) are just controlled by the panel.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This section includes documentation for the DCE Devices.  For an explanation of the DCE protocol and accompanying libraries, see the [[LinuxMCE Libraries DCE]].&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=DCE_Generator&amp;diff=4637</id>
		<title>DCE Generator</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=DCE_Generator&amp;diff=4637"/>
		<updated>2007-08-11T14:37:14Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;To create a new [[LinuxMCE DCE Devices]] to start receive commands immediately.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;DCEGen creates a Command class that has stubs for all the commands you need to implement.  The default implementation just echoes to the screen that the command was received and lists the parameters.  The Command class will also have member variables for the device&#039;s data, and methods to call to fire events.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If you later change the device, adding commands, changing event parameters, removing data, etc., just re-run DCEGen.  It will fix your project file with these changes.  If you already began implementing the commands and changing the class that is not a problem.  DCEGen will simply merge the changes in, creating new methods for new commands, and changing the declarations and definitions for commands that have changed.  It will also re-write the &#039;Events&#039; and &#039;Data&#039; section each time since there is nothing for you to implement there.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=GSD_to_drive_a_Weeder_I/O_WTDIO-M&amp;diff=4636</id>
		<title>GSD to drive a Weeder I/O WTDIO-M</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=GSD_to_drive_a_Weeder_I/O_WTDIO-M&amp;diff=4636"/>
		<updated>2007-08-11T14:35:30Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
== General notes ==&lt;br /&gt;
&lt;br /&gt;
Weeder boards are very nice and inexpensive pieces of hardware that fit well enough to many situations related to home automation.&lt;br /&gt;
&lt;br /&gt;
The model I&#039;m referring to is WTDIO-M, that is a 14 channel digital I/O board that connects to pc via RS232 and is also stackable to a max of 32 modules (that means 448 I/O channels, quite enough ...).&lt;br /&gt;
Further details can be found here -&amp;gt; http://www.weedtech.com/wtdio-m.html&lt;br /&gt;
&lt;br /&gt;
Usually they require some extra hardware (you cannot drive directly any relays, so some transistor are needed in between) but it&#039;s something that does not require a rocket scientist to be done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to talk to the board ==&lt;br /&gt;
&lt;br /&gt;
The board has its own communication protocol, that allow you to write/read a specific channel of a specific module by sending the appropriate string to the serial port and by reading back the answer.&lt;br /&gt;
The protocol takes care also of collision on the common media (serial line) so you don&#039;t have to bother with anything else.&lt;br /&gt;
&lt;br /&gt;
The command string usually is something like this: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ModuleAddress-Command-ChannelAddress-OptionalParameters&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So from a LinuxMCE point of view it is a matter of defining a GSD device with some child devices attached (each child device corresponding to a board channel we want to control), and to define in the parent device some logic (Ruby code) to handle the commands that suit our needs.&lt;br /&gt;
It is not necessary to handle Ruby code in each and every child device, as LinuxMCE allows to pass the command received from a child device to its parent, that is in charge to process it.&lt;br /&gt;
&lt;br /&gt;
== A (very) simple example ==&lt;br /&gt;
&lt;br /&gt;
In this example I will explain how to use this board to switch on/off some channel (corresponding to some lights/simple appliances).&lt;br /&gt;
&lt;br /&gt;
First of all let&#039;s create a GSD device in LinuxMCE Admin to your core/hybrid or to the MD where the board is physically connected. Say that we name it &amp;quot;Weeder Board&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s configure it with proper parameters:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;COM Port BaudRate:&#039;&#039; B9600 (write it like this, &amp;quot;B9600&amp;quot;, I lost days entering simply &amp;quot;9600&amp;quot; and having it not working ...)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;COM Port on PC:&#039;&#039; /dev/ttyS1 (or whatever applies to your box)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;COM Port ParityBit/Stop:&#039;&#039; N81 (that stands for No parity, 8 bits, 1 stop bit, as said before enter it exactly like this if you want it working)&lt;br /&gt;
&lt;br /&gt;
Then we can add some child devices. Go to LinuxMCE Admin - Advanced-&amp;gt;Configuration-&amp;gt;Devices, select the newly added GSD device (Weeder Board) and add some new child devices, naming them according to your needs.&lt;br /&gt;
On each child device record don&#039;t forget to fill in the field &#039;&#039;#12 Port/Channel Number(string)&#039;&#039;.&lt;br /&gt;
This field allows to establish the correspondence between child device and board channel. It will be more clear in the following.&lt;br /&gt;
&lt;br /&gt;
Then we are ready to add some Ruby code to manage our channels. To do it we can press the button &amp;quot;Ruby Source Code&amp;quot; that we can find in LinuxMCE Admin - Wizard-&amp;gt;Devices -&amp;gt;Generic Serial Devices&lt;br /&gt;
&lt;br /&gt;
Following you&#039;ll find the ruby code I use form my own board. It&#039;s very simple and rude, but it&#039;s working.&lt;br /&gt;
&lt;br /&gt;
Basically it processes all command issued to child devices (that in my case are related to channels of the board, i.e. lights/appliance).&lt;br /&gt;
If command (cmd.id) equals to 192 (means &amp;quot;ON&amp;quot;) then it checks from wich child it is coming from (device_.childdevices_[cmd.devidto_].devdata_[12]), and according to this it decides which is the proper command string to send to GSD (Weeder Board, in this example).&lt;br /&gt;
&lt;br /&gt;
Say that I press &amp;quot;ON&amp;quot; button on Orbiter (button that actually is a light scenario that corresponds to channel 1 of my Weeder Board).&lt;br /&gt;
The proper command string to send is:&lt;br /&gt;
&lt;br /&gt;
  AHA&lt;br /&gt;
&lt;br /&gt;
that stands for &#039;&#039;&#039;A&#039;&#039;&#039; module, &#039;&#039;&#039;H&#039;&#039;&#039;igh level, &#039;&#039;&#039;A&#039;&#039;&#039; channel. Don&#039;t forget to add a &amp;quot;\r&amp;quot; to properly close the string.&lt;br /&gt;
In case I press &amp;quot;ON&amp;quot; for channel 3, the string is&lt;br /&gt;
  &lt;br /&gt;
  AHC&lt;br /&gt;
&lt;br /&gt;
The same story applies when pressing &amp;quot;OFF&amp;quot;, that corresponds to a cmd.id = 193&lt;br /&gt;
&lt;br /&gt;
The question now is: how can I tell that a specific child device corresponds to a specific board channel?&lt;br /&gt;
&lt;br /&gt;
As I mentioned above, this is done by the value entered in the field &#039;&#039;#12 Port/Channel Number(string)&#039;&#039; of each child device record, that is accessed in Ruby by reading the variable &#039;&#039;device_.childdevices_[cmd.devidto_].devdata_[12]&#039;&#039;. With this value (treated as a string) you can decide what to send to what channel of your Weeder Board or in general to your Generic Serial Devices that can drive multiple channels/device.&lt;br /&gt;
&lt;br /&gt;
This is the code that I entered in the &#039;&#039;Process Receive Command For Child&#039;&#039; section of the Ruby code interface (LinuxMCE Admin - Wizard-&amp;gt;Devices -&amp;gt;Generic Serial Devices-&amp;gt;Ruby Source Code)&lt;br /&gt;
&lt;br /&gt;
  if cmd.id_ == 192 #192 is ON &lt;br /&gt;
    id=device_.childdevices_[cmd.devidto_].devdata_[12] #get child device number&lt;br /&gt;
    if id==&amp;quot;1&amp;quot;&lt;br /&gt;
     conn_.Send(&amp;quot;AHA\r&amp;quot;)#send string to set High the A channel of A board&lt;br /&gt;
    end &lt;br /&gt;
    if id==&amp;quot;2&amp;quot;&lt;br /&gt;
     conn_.Send(&amp;quot;AHB\r&amp;quot;)#send string to set High the B channel of A board&lt;br /&gt;
    end &lt;br /&gt;
    if id==&amp;quot;3&amp;quot;&lt;br /&gt;
     conn_.Send(&amp;quot;AHC\r&amp;quot;)#send string to set High the C channel of A board&lt;br /&gt;
    end &lt;br /&gt;
  end&lt;br /&gt;
  if cmd.id_ == 193 #193 is OFF&lt;br /&gt;
    id=device_.childdevices_[cmd.devidto_].devdata_[12]&lt;br /&gt;
    if id==&amp;quot;1&amp;quot;&lt;br /&gt;
     conn_.Send(&amp;quot;ALA\r&amp;quot;)#send string to set Low the A channel of A board&lt;br /&gt;
    end&lt;br /&gt;
    if id==&amp;quot;2&amp;quot;&lt;br /&gt;
     conn_.Send(&amp;quot;ALB\r&amp;quot;)#send string to set Low the B channel of A board&lt;br /&gt;
    end&lt;br /&gt;
    if id==&amp;quot;3&amp;quot;&lt;br /&gt;
     conn_.Send(&amp;quot;ALC\r&amp;quot;)#send string to set Low the C channel of A board&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
You can monitor the messages to GSD by looking at the corresponding log file in LinuxMCE, o by using the  &amp;quot;Follow Log&amp;quot; option in the LinuxMCE Admin - Advanced-&amp;gt;Configuration-&amp;gt;Devices-&amp;gt;Weeder Board (or whatever name you gave to your device).&lt;br /&gt;
&lt;br /&gt;
To have some feedback from your serial device, you may add two simple lines in the &#039;&#039;Process Incoming Data&#039;&#039; section:&lt;br /&gt;
&lt;br /&gt;
  buffer = conn_.Recv(100,500);&lt;br /&gt;
  print buffer;&lt;br /&gt;
&lt;br /&gt;
This basically receives the output from the serial device and prints it into the log.&lt;br /&gt;
&lt;br /&gt;
There are many other section in the Ruby code interface that may be interesting to use (or use better than I do), i.e &#039;&#039;Process IDLE&#039;&#039; and &#039;&#039;Process Incoming Data&#039;&#039;.&lt;br /&gt;
The first should deal with some polling to perform when no commands are issued, the second should be used to give some decent feedback from serial device to the rest of LinuxMCE system.&lt;br /&gt;
It is a matter of parsing the received strings and interact with proper LinuxMCE variables or talking directly to DCE router.&lt;br /&gt;
&lt;br /&gt;
No clear idea of the possible use of the remaining section, but I&#039;m sure that someone will add interesting notes to help us to find it out.&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Make_a_DCE_Device_in_5_minutes&amp;diff=4635</id>
		<title>Make a DCE Device in 5 minutes</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Make_a_DCE_Device_in_5_minutes&amp;diff=4635"/>
		<updated>2007-08-11T14:32:41Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;There are 2 ways to add a new device.  1) For most external devices that are controlled by  RS232, USB or Ethernet, you can use GSD (Generic Serial Device).  There is a &#039;fill-in-the-blanks&#039; web form for you to specify the protocol--no programming is required.  GSD also includes an embedded Ruby-language processor, so you can do almost anything and even complex, sophisticated devices can be created easily.  Whatever protocol and Ruby commands you input are automatically sent back to our master database and shared with all other LinuxMCE users, so everyone can use the device (you can turn this option off).  Nearly all external devices, like home automation components, use GSD.  2) We also have a generator that will build you a cross-platform C++ project.  LinuxMCE&#039;s sophisticated, internal devices like Bluetooth communication, software media players, etc. are all written in C/C++.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Either way, the first step is to define the data, commands and events for your device.  Go to the [[LinuxMCE Admin Website]] that was installed on your computer when you installed LinuxMCE.  Login, and choose &amp;quot;Advanced&amp;quot;, &amp;quot;Device Templates&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;First see if you can find an existing device that has a similar function to the one you want to create.  Choose an existing manufacturer and/or category to see some the devices in the &amp;quot;Models&amp;quot; list.  Click edit to view the device&#039;s data, command and events.  Note that the command are put into &#039;groups&#039;, so you will need to click on the command group to see the commands that device implements.  Now figure out what data, commands and events your device will use.  You can also click on &amp;quot;Advanced&amp;quot;, &amp;quot;DCE&amp;quot;, and view a list of all the commands in the system and which devices implement them.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The data parameters is not really important.  It can be anything your device will need to run.  If the device is going to control some equipment via RS232, you&#039;ll want a parameter to indicate the COM port, for example.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Next, figure out what command your device will want to implement.  Here it&#039;s more important to try to use the same commands in the same way as other, similar devices.  This will mean that the remote controls (Orbiters) for those devices will work for yours too.  Also, other developers may expect your device to implement a logical command.  For example, someone may develop a doorbell device, which allows the user to pause all his media when someone is at the door so he will hear the  bell.  The doorbell device may, therefore, send a &amp;quot;Pause&amp;quot; command destined to every device in the house of the category &amp;quot;Media Player&amp;quot;, expecting that any media player should know what that means.  From the Device Template list page there is also a link to manage commands which lets you see all the existing commands, what parameters they take, what devices implement them, and how, so that you can be sure your device is capable of behaving in a similar manner.  Of course, you can add as much custom functionality as you want, but it&#039;s recommended that your device implements at least the basics in a consistent manner.  On/Off, skip forward, skip back, etc.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lastly, decide on what events your device should fire.  Again, try to use the same events in the same way as similar devices.  The user may have created an event handler, for example, that turns on a siren when the &amp;quot;Security Breach&amp;quot; event is detected.  If you are making a device for an alarm panel and see that the other panels fire the &amp;quot;Security Breach&amp;quot; event, then if yours fires the same event the user will be swap his current panel for yours and know that all his event handlers will still work.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Once you decided on the data, command and events, you&#039;ve done the hard part.  Now just go back to the [[List Page]] page, choose the manufacturer, or add one, and choose a category.  Once those are chosen, the &#039;add new&#039; box is available under the Models list.  Type in a descriptive name for your device, and click &#039;add&#039;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You are now on the [[Edit Page]] page.  Check that the device implements DCE.  You can leave alone the remotes, controlled via, package and a/v sections for now.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Add your device&#039;s data parameters.  You can use an existing parameter if it&#039;s applicable, or add one.  The name is really just a description.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You will see here all the Command Groups that other devices in this category already implement.  Click &#039;Edit Commands&#039; to see what commands are in that group.  If there is a group that is appropriate for your device, just enable it to add those commands to your device.  You can also create one more new groups.  All commands in all groups you select will be implemented by your device.  Then add the commands to your device, explaining how your device implements them.  You can also add new commands.  When adding the parameters for your commands, you can make the parameters &amp;quot;out&amp;quot; parameters.  This means when another device sends you the command, you will get a pointer to this parameter--rather than the parameter itself.  You just assign the value you want to return, and the other device that sent you the command will see it.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Lastly, add the events, and click save.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Now, decide how you want to implement your device.  Choose one of the following: [[GSD]].&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Programmer%27s_Guide&amp;diff=4634</id>
		<title>Programmer&#039;s Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Programmer%27s_Guide&amp;diff=4634"/>
		<updated>2007-08-11T14:31:09Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
==Introduction to the LinuxMCE Architecure==&lt;br /&gt;
Our distribution includes hundreds of scripts and utilities that LinuxMCE has written to fully automate everything so that a PC with LinuxMCE becomes a &#039;turn it on and press play&#039; appliance, rather than a traditional software application.  However if you strip away all this stuff, the guts of LinuxMCE is software written in cross-platform c++.  In fact nearly all LinuxMCE&#039;s code runs on Windows too.&lt;br /&gt;
&lt;br /&gt;
This guide explains the architecture of the main C++ code.  Documentation for all the scripts and utilities that make up the distribution is [http://plutohome.com/support/doxygen/ here].&lt;br /&gt;
&lt;br /&gt;
LinuxMCE uses an extremely modular architecture.  The heart of LinuxMCE, the &#039;main application&#039; DCERouter is nothing but a general-purpose message router.  It has absolutely no code relating to any of LinuxMCE&#039;s functionality--it just relays messages between devices.  The functionality of LinuxMCE is, therefore, entirely in separate modules (ie Devices) which all run independently and communicate with each other by passing messages through DCERouter over sockets.  There can be hundreds of these devices in a smart home, that do all sorts of things.  As shown in the diagram below, many of LinuxMCE&#039;s devices are actually &#039;wrappers&#039; we have written for existing open source projects that allow them to work together seamlessly in a LinuxMCE system.  For example, we wrote a wrapper for Asterisk that sends event messages to DCERouter whenever a phone call comes in, and receives command messages when it is time to place a call.  How the wrapper communicates with the open source project depends on that project.  Our Asterisk wrapper, for example, communicates with Asterisk over a socket.  It is really a translator converting messages from its socket connection with DCERouter into messages from its socket connection with Asterisk.  The wrapper for the Xine media player links in Xine&#039;s own library and calls Xine functions directly.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;include/images/quickstart/swmodules.jpg&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since there are literally thousands of home automation components and pieces of a/v equipment that require controlling with RS232, USB and Ethernet we developed a special system for these devices using GSD.  It&#039;s fast and often doesn&#039;t require any real programming skills.  It can be used to support lighting control systems, climate and pool systems, external devices like i/r emitters, cameras, etc.  If that&#039;s your interest skip this whole page and [[What if you don&#039;t have a driver for my home automation device]]  Otherwise if you&#039;re a &amp;quot;real&amp;quot; programmer interested in adding new software modules or adding wrappers for existing software, then continue with this section.&lt;br /&gt;
&lt;br /&gt;
==Programmer&#039;s Guide Sections==&lt;br /&gt;
&lt;br /&gt;
*[[Why should I use the LinuxMCE platform for my project?]]&lt;br /&gt;
**[[Overview of the software modules]]&lt;br /&gt;
**[[A new concept in collaborative development]]&lt;br /&gt;
**[[Adding support for home automation devices]]&lt;br /&gt;
*[[STEngine]]&lt;br /&gt;
**[[OpenGL implementation]]&lt;br /&gt;
**[[Photo Screen Saver]]&lt;br /&gt;
*[[ZWave implementation]]&lt;br /&gt;
*[[AVWizard specifications]]&lt;br /&gt;
*[[Orbiter]]&lt;br /&gt;
*[[wxWidgets]]&lt;br /&gt;
*[[Window manager]]&lt;br /&gt;
*[[Window controller]]&lt;br /&gt;
*[[X11 locking]]&lt;br /&gt;
*[[X11 pointer shapes]]&lt;br /&gt;
*[[LinuxMCE Plugins]]&lt;br /&gt;
*[[I want my software to run on LinuxMCE but it isn&#039;t open source]]&lt;br /&gt;
*[[Will you host, compile and support the LinuxMCE plug-ins for my]]&lt;br /&gt;
*[[GSD - Ruby codes]]&lt;br /&gt;
** [[Apex Destiny 6100]] (alarm panel)&lt;br /&gt;
*[[Automated_Builder]]&lt;br /&gt;
&lt;br /&gt;
==Is LinuxMCE a stand-alone software product, or a development platform?==&lt;br /&gt;
&lt;br /&gt;
LinuxMCE is sold commercially as a complete turnkey appliance.  To the end user it appears to be 1 single application with 1 common user interface.  From a developer&#039;s standpoint, however, LinuxMCE is actually a platform for developing smart home modules that all work together.  Much of the top-level functionality is provided by a variety of open source projects.  LinuxMCE adds it&#039;s own home automation engine, UI front-end, configuration web site, and the heart of it all, [[LinuxMCE Libraries DCE]], which allows this collection of devices and software projects to work together as a seamless whole.&lt;br /&gt;
&lt;br /&gt;
In many cases, a LinuxMCE DCE device is just a thin wrapper for another open source project.  The wrapper&#039;s job is to launch the open source project with the right parameters, forward incoming commands to it, and fire DCE events in response to triggers within it.  We added DCE wrappers for the projects Asterisk (pbx telephone switch), Linphone (SIP software telephone) and Motion (surveillance video capture).  In most cases, no modifications to the open source project were needed since the project already contained a mechanism for feeding it commands.&lt;br /&gt;
&lt;br /&gt;
The software is completely modular and we offer a wealth of development tools, like code generators, design tools, a rapid development module for adding new devices (GSD), our own messenging platform and a ton of general-purpose libraries.  Our GSD+sqlCVS is an entirely [[A new concept in collaborative development]] for quickly adding support for communicating with external equipment.  If you&#039;re a developer, you can add to LinuxMCE, or even remove our modules and use LinuxMCE as a platform to do something else entirely.&lt;br /&gt;
&lt;br /&gt;
==LinuxMCE allows projects to work together==&lt;br /&gt;
&lt;br /&gt;
By allowing these various projects to work together seamlessly, many new features and benefits are now possible.  For example, if there&#039;s a security breach in your house, the lights and TV&#039;s in the house come on automatically using our home automation DCE device interfaces, and the security pn pad appears on all the Windows webpads and PDA&#039;s.  After 30 seconds a menacing video plays for the burglar using Xine, while the surveillance cameras monitored by Motion feed a live video to your mobile phone over GPRS.  Hit &#039;Talk&#039; on the phone and Xine suspends, passing control to Linphone which makes a call using Asterisk to your mobile phone with the audio piped through the stereo so you can shout at the intruder and let him know you&#039;re watching him from a remote location and calling.  To the end-user, it works seamlessly, like 1 cohesive whole, but in reality, what LinuxMCE did is enable a bunch of existing applications to work together.&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=DCE_Libraries&amp;diff=4633</id>
		<title>DCE Libraries</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=DCE_Libraries&amp;diff=4633"/>
		<updated>2007-08-11T14:30:11Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Added to Category: Programmer&amp;#039;s Guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category: Programmer&#039;s Guide]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Introduction&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If you want to dive right in to the &amp;quot;make your own DCE Device in 5 minutes&amp;quot; tutorial, [[Make a DCE Device in 5 minutes]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;DCE (Data, Commands, Events) is a lightweight network protocol allowing any device to access its configuration (ie data) from a central database, send + receive commands, and fire + respond to events.  The intended use is in a smart home solution.  The goal is to allow the homeowner to plug anything into his network (motion detector, intercom, telephone, media station, camera, etc.) and immediately start using it without any complicated setup.  Also, we want all the devices to be interchangeable, and controllable with the same remote using the same UI.  This aspect requires that developers of new devices implement, at a minimum, a standard set of commands pre-determined for that type of device.  For example, if there exists a standard &amp;quot;Swimming Pool&amp;quot; remote control with buttons for temperature up &amp;amp; down, which fires temp_up and temp_down commands, then any new swimming pool control devices must implement the same commands for the homeowner to be able to control that device using his existing remote control.  Therefore, the entire database of all devices is publicly available so a developer of a new device can share the same commands.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This makes a huge difference in terms of usability.  Consider how popular new multi-media keyboards have become for Windows, and how convenient it is for a user to be able to press the &amp;quot;pause&amp;quot; button on his keyboard and know that whatever media player he is using--no matter who made it--will pause.  This finally made universal remote controls for PC&#039;s possible, and made the PC practical as a home media player.  This is only possible because Microsoft established a standard scancode/message for &amp;quot;pause&amp;quot; and all the media player manufacturers implemented it.  Prior to this standardization, every media player had its own proprietary way of receiving a pause command.  DCE intends to expand this standardized interoperability to all types of commands for every device in a smart home.  But instead of one company dictating the standards as with the multi-media keyboard example, DCE is an open source project.  The standardization becomes a cooperative effort amongst all the device developers.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Compatible Software &amp;amp; Hardware Platforms&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The DCE protocol itself can be implemented with any device that supports standard networking.  LinuxMCE provides a DCE library written in Ansi C++ that implements the protocol on any socket-compatible operating system, and has been tested on Linux and Windows.  Porting to other languages should not be a big task.  Because the messaging is socket-based, any device, regardless of operating system or language, can be used with any other device.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Plug &amp;amp; Play Support&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The LinuxMCE platform includes a utility that monitors requests for IP addresses from the DHCP server.  When a new device is detected with an unrecognized Mac Address, it looks up the Mac Address in a master database to see what type of device it is and if it corresponds to a DCE Device.  If so, the device is automatically added to the system, the software is added, a configure script is executed, and the user is notified.  When you make a DCE Device, you are able to specify all these options, including ranges of Mac Addresses for your devices and what default data parameters they should use.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;How do DCE Devices talk to each other?&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;In each installation there is also 1 DCE Router, through which all messages are routed.  An &amp;quot;installation&amp;quot; is a group of devices treated as a unit, and normally corresponds to a physical residence.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The DCE Router is itself quite simple.  It just opens a port for incoming connections.  When a device connects, the device sends its unique ID, or MacAddress.  The DCE Router does a lookup in a database, and returns that device&#039;s data (configuration).  DCERouter also sends back a list of all the other devices in the installation with basic information including the commands they know how to implement.  The DCE Device then opens a minimum of 2 socket connections to the router.  One is for incoming messages (usually commands) from the router, another for outgoing messages (usually events) to it.  The DCE Library, which implements the protocol for DCE Devices and the DCE Router, will also open a 3rd socket connection so that it has 2 outgoing sockets: 1 dedicated for sending events and the other for sending other types of messages, like requests and commands to other devices.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;All messages go through the router--devices do not communicate directly to each other.  The message will contain information such as the destination device, the type of message, the message id, and any number of optional parameters.  The router does nothing with the message but forward it to the destination device, or devices if the message is being sent to more than one.  The DCE library, from which DCE Devices and the DCE Router are derived, knows how to receive incoming messages of the type command, and route them to a message handler in the DCE Device.  This works in conjunction with the [[DCE Generator]] utility.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;DCE Generator builds a complete Linux/Windows DCE Device for you&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The definition of the device, including its data, commands and events is stored in a central database, described [[pluto_main database]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Next Steps&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This section of the documentation explains the specifics of DCE.  You can also learn how to configure DCE Device definitions, called templates, [[LinuxMCE Admin Website]] using the LinuxMCE Admin web site.  Under Developers/Source Code docs you will find documentation for the DCE library code.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[Make a DCE Device in 5 minutes]] will show you how to make a DCE Device in 5 minutes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Download the source code for the C++ DCE library using the http://LinuxMCE.com/support/index.php?package=0&amp;amp;section=mainDownload, or check it out from our [[Building from source]].&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Upcoming_Features&amp;diff=4614</id>
		<title>Upcoming Features</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Upcoming_Features&amp;diff=4614"/>
		<updated>2007-08-09T23:31:28Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: Fixed typo in URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Visit the [http://linuxmce.org/smf/index.php?board=350.0 Upcoming features forum] to discuss new features, changes or ideas.  If you are willing to offer some cash or other compensation to a developer to get something done right away, visit the [http://linuxmce.org/smf/index.php?board=349.0 Help Wanted forum].&lt;br /&gt;
&lt;br /&gt;
When a developer has decided to implement some new feature or change, please edit this wiki to add a brief summary including a link to the original forum topic for this new idea, so other users can post to that topic to discuss this, and where you will post updated progress info.  Visit the [http://linuxmce.org/wiki/index.php/Contacts Contacts Page] to find developers who can commit your work to the main LinuxMCE branch, or to request svn write access.&lt;br /&gt;
&lt;br /&gt;
This page lists the features which developers we are working to implement in the next release.  There is also a forum dedicated to discussing features here .  Please post to this page only those features which have been decided to be included.&lt;br /&gt;
&lt;br /&gt;
Read about the long-term goals and strategy here: [[History|History of LinuxMCE, why I started this project, and the goals]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== Google Summer of Code Ideas: ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;internet radio&#039;&#039;&#039; &lt;br /&gt;
Integrate internet radio into the existing media menu option so radio stations can be browsed the same way local media can.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;internet tv / videos.google / youtube&#039;&#039;&#039;&lt;br /&gt;
Integrate these online video sources into the existing media menu option so this video can be browsed the same way local media can.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gsd events&#039;&#039;&#039;&lt;br /&gt;
The embedded Ruby interpretor presently only handles controlling devices; ie processing commands.  The same code could be adapted in reverse to respond to events.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Standardized to be included in Ubuntu&#039;&#039;&#039;&lt;br /&gt;
LinuxMCE still has a lot of non-standard scripts that Pluto wrote for use in commercial, black-box systems, which need to be rewritten in a more standard manner so that LinuxMCE plays nicely by Ubuntu&#039;s rules and be accepted into Ubuntu&#039;s main repository and included in their build.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Download audio podcast/video podcast&#039;&#039;&#039;&lt;br /&gt;
A way with the GUI to subscribe to podcasts, and have them automatically downloaded and aggregated with the media in the home. Including playcount so a list of not listened to podcasts can be created.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Capture video from firewire camera&#039;&#039;&#039;&lt;br /&gt;
The current plug and play detection engine already recognizes firewire digital camcorders.  There should be a very rudimentary, simple &#039;capture&#039; option that appears on screen to do basic video capture and save it to the managed media.  Users can use a video editor like Kino for real editing; this is just for quick capture.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Better organize and manage photos&#039;&#039;&#039;&lt;br /&gt;
The current UI could use some optimization to make it work better for managing photos.&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=Main_Page&amp;diff=4157</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=Main_Page&amp;diff=4157"/>
		<updated>2007-07-14T15:35:14Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What is LinuxMCE?==&lt;br /&gt;
[http://LinuxMCE.com LinuxMCE] is the only solution seamlessly combining:&lt;br /&gt;
# media &amp;amp; entertainment with a server for music, movies and tv shows, plus a PVR and DVD Player,&lt;br /&gt;
# a home automation system to control everything in the home with touch-screen tablet and Bluetooth mobile phone controllers,&lt;br /&gt;
# a phone system with video conferencing,&lt;br /&gt;
# a security system that feeds you live video on your mobile phone when something happens, and lets you speak to visitors through your stereos, and&lt;br /&gt;
# a home PC solution.&lt;br /&gt;
&lt;br /&gt;
A typical LinuxMCE system consists of a &#039;&#039;&#039;Core&#039;&#039;&#039;: one PC acting as a dedicated server and interface with all the sub-components. The Core includes our own plug-and-play back-end so it listens for and auto configures all sorts of devices like network audio players (such as Squeeze Box), IP phones and cameras. The Core automatically exposes a network boot for any other PC&#039;s or thin clients you want to use as &#039;&#039;&#039;Media Directors&#039;&#039;&#039;, which you hook up to your TV/Stereo&#039;s to use as set top boxes, complete with a media player, PVR, video conferencing, intercom, and a GUI to control everything in the home. All Media Directors work together seamlessly as a total whole-house solution. &lt;br /&gt;
&lt;br /&gt;
In addition to the usual infrared remote controls, LinuxMCE includes remote control software that runs on Symbian Bluetooth mobile phones as well as Linux, Windows and Windows CE devices like webpads and pda&#039;s. They all feature cover art, interactive maps and floor plans, and let you control any device in the house. The UI is skinnable and multi-language. The mobile phone has a &amp;quot;follow-me&amp;quot; feature so your media and other settings follow you from room to room. It switches from Bluetooth to cellular gprs/wap when you leave the house you&#039;re always in control.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==News==&lt;br /&gt;
==Features==&lt;br /&gt;
&lt;br /&gt;
LinuxMCE is an all-in-one solution for your home that seamlessly combines media &amp;amp; entertainment, home automation, security, telecommunications and computing.  Browse the [[Features|features page]], along with [[What can I do with LinuxMCE?]] to see the possibilities available from LinuxMCE.&lt;br /&gt;
&lt;br /&gt;
==Screenshots==&lt;br /&gt;
[[Image:MainMenu2.jpg|left|thumb|UI2 Main Menu]]&lt;br /&gt;
[[Image:FileBrowserUI1.jpg|left|thumb|UI1 Media Files Browser]]&lt;br /&gt;
[[Image:DialNumberUI1.jpg|none|thumb|UI1 Phone Dial Pad]]&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
To get Linux MCE, please download and install Linux MCE installer from the main page of website. After this, please start the &amp;quot;Linux MCE Installer&amp;quot; application - it will download and install required packages.&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
This section has moved to [[Getting Started]].&lt;br /&gt;
&lt;br /&gt;
==Support==&lt;br /&gt;
&lt;br /&gt;
===User&#039;s Manual===&lt;br /&gt;
&lt;br /&gt;
This section has moved to [[User&#039;s Manual]].&lt;br /&gt;
&lt;br /&gt;
===Mailing List===&lt;br /&gt;
&lt;br /&gt;
Support beyond that contained in this wiki can be found via the official LinuxMCE [http://forum.linuxmce.com/index.php forums] and through the available [http://LinuxMCE.com/support/index.php?section=mail mailing lists].&lt;br /&gt;
&lt;br /&gt;
===Configuring LinuxMCE===&lt;br /&gt;
&lt;br /&gt;
[[LinuxMCE Admin Website|Configuring LinuxMCE]]&lt;br /&gt;
&lt;br /&gt;
[[Users_Page | Users&#039; Documentation]]&lt;br /&gt;
&lt;br /&gt;
===FAQ===&lt;br /&gt;
*[[What hardware I will need]]&lt;br /&gt;
*[[Development status for all modules]]&lt;br /&gt;
*[[What does an appliance solution like LinuxMCE cost?]]&lt;br /&gt;
*[[Is LinuxMCE an appliance or software solution?]]&lt;br /&gt;
*[[Do I need LinuxMCE?  Can I use the projects by themselves?]]&lt;br /&gt;
*[[How do I login to a Linux console?]]&lt;br /&gt;
*[[How are media files organized?]]&lt;br /&gt;
*[[I can&#039;t access my media files over the network]]&lt;br /&gt;
*[[Reset the password for the LinuxMCE Admin site]]&lt;br /&gt;
*[[What if you don&#039;t have a driver for my home automation device]]&lt;br /&gt;
*[[What scenarios are created automatically?]]&lt;br /&gt;
*[[I&#039;m a Linux user already.  Should I use LinuxMCE&#039;s distribution]]&lt;br /&gt;
*[[Encrypted DVD&#039;s|Why doesn&#039;t LinuxMCE support encrypted DVD&#039;s?]]&lt;br /&gt;
&lt;br /&gt;
===Troubleshooting===&lt;br /&gt;
* [[svn default properties]]&lt;br /&gt;
* [[Adding new computing apps]]&lt;br /&gt;
* [[Installing on a new platform]]&lt;br /&gt;
* [[Windows|Installer for Windows]]&lt;br /&gt;
* [[Installer Problems]]&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
&lt;br /&gt;
===Author&#039;s Information===&lt;br /&gt;
&lt;br /&gt;
Information regarding author information can be found on the LinuxMCE [http://wiki.linuxmce.com/index.php/Contacts contacts] page.&lt;br /&gt;
&lt;br /&gt;
===Programmer&#039;s Guide===&lt;br /&gt;
&lt;br /&gt;
There is a great deal of documentation on the LinuxMCE platform available in the [[Programmer&#039;s Guide]].  This guide provides an overview of the LinuxMCE architecture, &lt;br /&gt;
&lt;br /&gt;
===Software Used by LinuxMCE===&lt;br /&gt;
&lt;br /&gt;
LinuxMCE is often called a platform for developing smart home modules constructed by a variety of open source projects.  The integration of these open source projects, such as [http://xinehq.de Xine], [http://www.mythtv.org Mythtv], and [http://www.asterisk.org Asterisk], can be found in the LinuxMCE Software Documentation.&lt;br /&gt;
&lt;br /&gt;
[[Documentation by Device Templates]]&lt;br /&gt;
&lt;br /&gt;
[http://wiki.linuxmce.com/index.php/Doxygen doxygen diagrams]&lt;br /&gt;
&lt;br /&gt;
LinuxMCE is an open source project and uses open source software.  More information regarding LinuxMCE&#039;s relationship to open source can be found on the [[Open Source Info|open source information]] page, the [http://LinuxMCE.com/support/index.php?section=license&amp;amp;package=0 license information] page, what to do if you&#039;re an [http://LinuxMCE.com/index.php?section=developer open source developer], and LinuxMCE&#039;s [http://LinuxMCE.com/index.php?section=letter open source strategy].&lt;br /&gt;
&lt;br /&gt;
===Report Bugs===&lt;br /&gt;
&lt;br /&gt;
Bugs may be [http://www.linuxmce.com/mantis/ reported] via the bug tracking system, [http://www.mantisbugtracker.com/ Mantis].&lt;br /&gt;
&lt;br /&gt;
===Source===&lt;br /&gt;
&lt;br /&gt;
LinuxMCE is a pretty big project. Not counting [[GSD]] devices, LinuxMCE&#039;s own code is already well over a million lines in hundreds of modules, with over 1,000 pages of online documentation, and in addition LinuxMCE also incorporates lots of other big open source projects like Asterisk, Xine, MythTV, Firefox, VideoLan, SlimServer, etc., all of which have special LinuxMCE &#039;wrappers&#039; to allow them to work together seamlessly as a total home solution. For the brave of heart, you can also download [http://LinuxMCE.com/support/index.php?section=mainDownload&amp;amp;package=0 modules by hand], and see all the dependencies and compatibility for each module.&lt;br /&gt;
&lt;br /&gt;
You can browse the [http://linuxmce.svn.sourceforge.net/viewvc/linuxmce/trunk/ web based repository viewer].  Or you can you do an anonymous svn checkout as follows:&lt;br /&gt;
&lt;br /&gt;
svn co &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;linuxmce.svn.sourceforge.net/svnroot/linuxmce/trunk/&#039;&#039;modulename&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can checkout all the software with if you use http://linuxmce.svn.sourceforge.net/viewvc/linuxmce/trunk/ as the repository location for the module name, or go to the [http://linuxmce.svn.sourceforge.net/viewvc/linuxmce/trunk/ repository viewer] to find the name of the SVN directory for the module you are interested in.&lt;br /&gt;
&lt;br /&gt;
Here are short instructions if you want compile your module with svn sources : [[Building_From_Source]].&lt;br /&gt;
&lt;br /&gt;
=== Versions ===&lt;br /&gt;
&lt;br /&gt;
The current version of Linux MCE is &#039;&#039;&#039;1.0&#039;&#039;&#039;, as of March 15, 2007.&lt;br /&gt;
&lt;br /&gt;
== Short Howto on Wiki ==&lt;br /&gt;
&lt;br /&gt;
This section has been moved to [[Short Howto on Wiki]].&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=What_hardware_I_will_need&amp;diff=4156</id>
		<title>What hardware I will need</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=What_hardware_I_will_need&amp;diff=4156"/>
		<updated>2007-07-14T15:26:13Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hardware requirements =&lt;br /&gt;
== Minimum == Standard Definition (SD) DVD and audio (MP3, OGG, etc) player.&lt;br /&gt;
* The simple answer is a machine that can install and boot [http://www.ubuntu.com Ubuntu] (presently Edgy Eft 6.10).&lt;br /&gt;
&lt;br /&gt;
== Standard == Standard Definition DVR + Audio/Video player&lt;br /&gt;
From the [http://www.mythtv.org/docs/mythtv-HOWTO-3.html MythTV Hardware Requirements] page.&lt;br /&gt;
=== CPU ===&lt;br /&gt;
* A PIII/733MHz system can encode one video stream using the MPEG-4 codec using 480x480 capture resolution. This does not allow for live TV watching, but does allow for encoding video and then watching it later.&lt;br /&gt;
* A developer states that his AMD1800+ system can almost encode two MPEG-4 video streams and watch one program simultaneously.&lt;br /&gt;
* A PIII/800MHz system with 512MB RAM can encode one video stream using the RTjpeg codec with 480x480 capture resolution and play it back simultaneously, thereby allowing live TV watching.&lt;br /&gt;
* A dual Celeron/450MHz is able to view a 480x480 MPEG-4/3300kbps file created on a different system with 30% CPU usage.&lt;br /&gt;
* A P4 2.4GHz machine can encode two 3300Kbps 480x480 MPEG-4 files and simultaneously serve content to a remote frontend.&lt;br /&gt;
* A video capture card supported by Linux.&lt;br /&gt;
&lt;br /&gt;
=== Firewire (Optional) ===&lt;br /&gt;
&lt;br /&gt;
You may use the Firewire output of the Motorola DCT6200 or the SA3250. If your provider uses 5C encryption on a particular channel, you won&#039;t be able to get any content.&lt;br /&gt;
DBoxII or other devices running Neutrino&lt;br /&gt;
&lt;br /&gt;
You may use the Ethernet port of an DBoxII or a similar device to capture MPEG2. Your set top box has to be running the Neutrino GUI.&lt;br /&gt;
USB Capture Devices.&lt;br /&gt;
&lt;br /&gt;
The Plextor ConvertX PVR devices are supported through Linux drivers available from http://www.plextor.com/english/support/LinuxSDK.htm. MythTV uses the Plextor to capture hardware encoded MPEG-4, so the host CPU requirements are low.&lt;br /&gt;
&lt;br /&gt;
Hauppauge WinTV-PVR-USB2 (driver available at http://www.isely.net/pvrusb2/) emulates a PVR-x50 card.&lt;br /&gt;
IP Recorder (RTSP, RTS, UDP)&lt;br /&gt;
&lt;br /&gt;
MPEG-2, MPEG-4 and H.264 internet TS stream recording is supported using the IPTV recorder in MythTV. This recorder expects the channels to be supplied as a m3u playlist. If your DSL/Fiber provider supplies television service, but does not provide a m3u playlist for the channels, you can construct one for your own use. You do not need to download it from the same server as the streams themselves, and can also read it from a file if this is more convenient.&lt;br /&gt;
&lt;br /&gt;
=== Sound card ===&lt;br /&gt;
&lt;br /&gt;
The system needs a sound card or an on-board equivalent on the motherboard to play back and in most cases, to record sound. Any sound card that can be operated by the ALSA (Advanced Linux Sound Architecture) kernel modules will work with MythTV. However, some cards and drivers will provide better quality or compatibility than others. In particular, many audio devices included on motherboards can be problematic.&lt;br /&gt;
&lt;br /&gt;
The usual practice for capturing the audio associated with the video is to run a cable from an audio output on the video capture card to the Line input on a sound card. However, some video capture cards provide on-board audio capabilities that work with the kernel btaudio module instead, thereby eliminating the need for a cable. This is useful if you will be using multiple capture cards in a single chassis, since each capture card will not need its own sound card. Note that a separate sound card is still required for playback when using btaudio, and that often the audio recorded in this way will be mono only. See the btaudio section for more information.&lt;br /&gt;
&lt;br /&gt;
== Forum Discussions ==&lt;br /&gt;
* [http://forum.linuxmce.com/index.php?topic=1711.0 Building a New Rig]&lt;br /&gt;
* [http://forum.linuxmce.com/index.php?topic=1353.msg8341#msg8341 For those wanting to roll your own box ...]&lt;br /&gt;
&lt;br /&gt;
[[ Category : Hardware ]]&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=What_hardware_I_will_need&amp;diff=4155</id>
		<title>What hardware I will need</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=What_hardware_I_will_need&amp;diff=4155"/>
		<updated>2007-07-14T15:02:29Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hardware requirements =&lt;br /&gt;
== Minimum == Standard Definition (SD) DVD and audio (MP3, OGG, etc) player.&lt;br /&gt;
* The simple answer is a machine that can install and boot [http://www.ubuntu.com Ubuntu] (presently Edgy Eft 6.10).&lt;br /&gt;
&lt;br /&gt;
== Standard == Standard Definition DVR + Audio/Video player&lt;br /&gt;
From the [http://www.mythtv.org/docs/mythtv-HOWTO-3.html MythTV Hardware Requirements] page.&lt;br /&gt;
=== CPU ===&lt;br /&gt;
* A PIII/733MHz system can encode one video stream using the MPEG-4 codec using 480x480 capture resolution. This does not allow for live TV watching, but does allow for encoding video and then watching it later.&lt;br /&gt;
* A developer states that his AMD1800+ system can almost encode two MPEG-4 video streams and watch one program simultaneously.&lt;br /&gt;
* A PIII/800MHz system with 512MB RAM can encode one video stream using the RTjpeg codec with 480x480 capture resolution and play it back simultaneously, thereby allowing live TV watching.&lt;br /&gt;
* A dual Celeron/450MHz is able to view a 480x480 MPEG-4/3300kbps file created on a different system with 30% CPU usage.&lt;br /&gt;
* A P4 2.4GHz machine can encode two 3300Kbps 480x480 MPEG-4 files and simultaneously serve content to a remote frontend.&lt;br /&gt;
* A video capture card supported by Linux.&lt;br /&gt;
&lt;br /&gt;
=== Firewire (Optional) ===&lt;br /&gt;
&lt;br /&gt;
You may use the Firewire output of the Motorola DCT6200 or the SA3250. If your provider uses 5C encryption on a particular channel, you won&#039;t be able to get any content.&lt;br /&gt;
DBoxII or other devices running Neutrino&lt;br /&gt;
&lt;br /&gt;
You may use the Ethernet port of an DBoxII or a similar device to capture MPEG2. Your set top box has to be running the Neutrino GUI.&lt;br /&gt;
USB Capture Devices.&lt;br /&gt;
&lt;br /&gt;
The Plextor ConvertX PVR devices are supported through Linux drivers available from http://www.plextor.com/english/support/LinuxSDK.htm. MythTV uses the Plextor to capture hardware encoded MPEG-4, so the host CPU requirements are low.&lt;br /&gt;
&lt;br /&gt;
Hauppauge WinTV-PVR-USB2 (driver available at http://www.isely.net/pvrusb2/) emulates a PVR-x50 card.&lt;br /&gt;
IP Recorder (RTSP, RTS, UDP)&lt;br /&gt;
&lt;br /&gt;
MPEG-2, MPEG-4 and H.264 internet TS stream recording is supported using the IPTV recorder in MythTV. This recorder expects the channels to be supplied as a m3u playlist. If your DSL/Fiber provider supplies television service, but does not provide a m3u playlist for the channels, you can construct one for your own use. You do not need to download it from the same server as the streams themselves, and can also read it from a file if this is more convenient.&lt;br /&gt;
&lt;br /&gt;
=== Sound card ===&lt;br /&gt;
&lt;br /&gt;
The system needs a sound card or an on-board equivalent on the motherboard to play back and in most cases, to record sound. Any sound card that can be operated by the ALSA (Advanced Linux Sound Architecture) kernel modules will work with MythTV. However, some cards and drivers will provide better quality or compatibility than others. In particular, many audio devices included on motherboards can be problematic.&lt;br /&gt;
&lt;br /&gt;
The usual practice for capturing the audio associated with the video is to run a cable from an audio output on the video capture card to the Line input on a sound card. However, some video capture cards provide on-board audio capabilities that work with the kernel btaudio module instead, thereby eliminating the need for a cable. This is useful if you will be using multiple capture cards in a single chassis, since each capture card will not need its own sound card. Note that a separate sound card is still required for playback when using btaudio, and that often the audio recorded in this way will be mono only. See the btaudio section for more information.&lt;br /&gt;
&lt;br /&gt;
== Forum Discussions ==&lt;br /&gt;
[http://forum.linuxmce.com/index.php?topic=1711.0 Building a New Rig]&lt;br /&gt;
&lt;br /&gt;
[[ Category : Hardware ]]&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
	<entry>
		<id>http://wiki.linuxmce.org/index.php?title=What_hardware_I_will_need&amp;diff=4154</id>
		<title>What hardware I will need</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxmce.org/index.php?title=What_hardware_I_will_need&amp;diff=4154"/>
		<updated>2007-07-14T15:01:40Z</updated>

		<summary type="html">&lt;p&gt;Mstovenour: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hardware requirements =&lt;br /&gt;
== Minimum == Standard Definition (SD) DVD and audio (MP3, OGG, etc) player.&lt;br /&gt;
* The simple answer is a machine that can install and boot [http://www.ubuntu.com Ubuntu] (presently Edgy Eft 6.10).&lt;br /&gt;
&lt;br /&gt;
== Standard == Standard Definition DVR + Audio/Video player&lt;br /&gt;
From the [http://www.mythtv.org/docs/mythtv-HOWTO-3.html MythTV Hardware Requirements] page.&lt;br /&gt;
=== CPU ===&lt;br /&gt;
* A PIII/733MHz system can encode one video stream using the MPEG-4 codec using 480x480 capture resolution. This does not allow for live TV watching, but does allow for encoding video and then watching it later.&lt;br /&gt;
* A developer states that his AMD1800+ system can almost encode two MPEG-4 video streams and watch one program simultaneously.&lt;br /&gt;
* A PIII/800MHz system with 512MB RAM can encode one video stream using the RTjpeg codec with 480x480 capture resolution and play it back simultaneously, thereby allowing live TV watching.&lt;br /&gt;
* A dual Celeron/450MHz is able to view a 480x480 MPEG-4/3300kbps file created on a different system with 30% CPU usage.&lt;br /&gt;
* A P4 2.4GHz machine can encode two 3300Kbps 480x480 MPEG-4 files and simultaneously serve content to a remote frontend.&lt;br /&gt;
* A video capture card supported by Linux.&lt;br /&gt;
&lt;br /&gt;
=== Firewire (Optional) ===&lt;br /&gt;
&lt;br /&gt;
You may use the Firewire output of the Motorola DCT6200 or the SA3250. If your provider uses 5C encryption on a particular channel, you won&#039;t be able to get any content.&lt;br /&gt;
DBoxII or other devices running Neutrino&lt;br /&gt;
&lt;br /&gt;
You may use the Ethernet port of an DBoxII or a similar device to capture MPEG2. Your set top box has to be running the Neutrino GUI.&lt;br /&gt;
USB Capture Devices.&lt;br /&gt;
&lt;br /&gt;
The Plextor ConvertX PVR devices are supported through Linux drivers available from http://www.plextor.com/english/support/LinuxSDK.htm. MythTV uses the Plextor to capture hardware encoded MPEG-4, so the host CPU requirements are low.&lt;br /&gt;
&lt;br /&gt;
Hauppauge WinTV-PVR-USB2 (driver available at http://www.isely.net/pvrusb2/) emulates a PVR-x50 card.&lt;br /&gt;
IP Recorder (RTSP, RTS, UDP)&lt;br /&gt;
&lt;br /&gt;
MPEG-2, MPEG-4 and H.264 internet TS stream recording is supported using the IPTV recorder in MythTV. This recorder expects the channels to be supplied as a m3u playlist. If your DSL/Fiber provider supplies television service, but does not provide a m3u playlist for the channels, you can construct one for your own use. You do not need to download it from the same server as the streams themselves, and can also read it from a file if this is more convenient.&lt;br /&gt;
&lt;br /&gt;
=== Sound card ===&lt;br /&gt;
&lt;br /&gt;
The system needs a sound card or an on-board equivalent on the motherboard to play back and in most cases, to record sound. Any sound card that can be operated by the ALSA (Advanced Linux Sound Architecture) kernel modules will work with MythTV. However, some cards and drivers will provide better quality or compatibility than others. In particular, many audio devices included on motherboards can be problematic.&lt;br /&gt;
&lt;br /&gt;
The usual practice for capturing the audio associated with the video is to run a cable from an audio output on the video capture card to the Line input on a sound card. However, some video capture cards provide on-board audio capabilities that work with the kernel btaudio module instead, thereby eliminating the need for a cable. This is useful if you will be using multiple capture cards in a single chassis, since each capture card will not need its own sound card. Note that a separate sound card is still required for playback when using btaudio, and that often the audio recorded in this way will be mono only. See the btaudio section for more information.&lt;br /&gt;
&lt;br /&gt;
=== Forum Discussions ===&lt;br /&gt;
[http://forum.linuxmce.com/index.php?topic=1711.0 Building a New Rig]&lt;br /&gt;
&lt;br /&gt;
[[ Category : Hardware ]]&lt;/div&gt;</summary>
		<author><name>Mstovenour</name></author>
	</entry>
</feed>