<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chris Holmes Online</title>
	<atom:link href="http://www.chrisholmesonline.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.chrisholmesonline.com</link>
	<description>Adventures in .NET, Agile Development, parenting, music, football, movies, and more...</description>
	<lastBuildDate>Fri, 23 Jul 2010 14:19:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>WPF: Async Calls</title>
		<link>http://www.chrisholmesonline.com/2010/07/23/wpf-async-calls/</link>
		<comments>http://www.chrisholmesonline.com/2010/07/23/wpf-async-calls/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 14:19:51 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Work Related]]></category>

		<guid isPermaLink="false">http://www.chrisholmesonline.com/?p=515</guid>
		<description><![CDATA[While working on a project at my new job I ran across a problem where I needed to update a WPF UI (databound collection) from an async call. There are tons of examples on the internet of how to do this, but few of them seem tailored for the MVVM model where your ViewModel doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>While working on a project at my new job I ran across a problem where I needed to update a WPF UI (databound collection) from an async call. There are tons of examples on the internet of how to do this, but few of them seem tailored for the MVVM model where your ViewModel doesn&#8217;t have knowledge of the view (and thus doesn&#8217;t have access to the view&#8217;s Dispatcher). For scalar types this isn&#8217;t a problem as they are marshaled to the UI thread in WPF, but for collections bound to controls, this becomes asynchronous updating is an issue. </p>
<p>Fortunately, <strong>Jeremy Likness</strong> came up with an elegant solution. Instead of regurgitating what he did, I&#8217;ll just point you to his blog post. While is post is about Silverlight, this is also applicable to WPF. </p>
<p>I thought his solution was simple &#038; elegant (and best of all, it works!)</p>
<p><a href="http://www.wintellect.com/CS/blogs/jlikness/archive/2009/12/16/dispatching-in-silverlight.aspx">Dispatching In Silverlight</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisholmesonline.com/2010/07/23/wpf-async-calls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Job</title>
		<link>http://www.chrisholmesonline.com/2010/06/28/new-job/</link>
		<comments>http://www.chrisholmesonline.com/2010/06/28/new-job/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 16:05:13 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Work Related]]></category>

		<guid isPermaLink="false">http://www.chrisholmesonline.com/?p=513</guid>
		<description><![CDATA[I figure it&#8217;s time to make the announcement here since I keep getting job offers from around the country. 
I&#8217;ve accepted a job in Johnson City, TN. I am officially off the market. 
I think it&#8217;s going to be a very cool place to work. Fast paced, challenging, with good people to work with. I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>I figure it&#8217;s time to make the announcement here since I keep getting job offers from around the country. </p>
<p>I&#8217;ve accepted a job in <strong>Johnson City, TN</strong>. I am officially off the market. </p>
<p>I think it&#8217;s going to be a very cool place to work. Fast paced, challenging, with good people to work with. I&#8217;m excited. And really, what more can you ask for? </p>
<p>My thanks to the various companies who reached out to me the past month and a half. Some of you had some very nice offers with some really intriguing job opportunities. Sadly, most of them were not in the Tri-Cities area of TN where I needed to move to <img src='http://www.chrisholmesonline.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>But who knows what the future holds? I am selling a house I bought four months ago because I thought I was going to be here in Idaho for another 2-5 years. I am not clairvoyant; situations change. We&#8217;ll see what happens.</p>
<p>In the meantime, very much looking forward to moving to VA/TN and seeing how this all plays out. Time to begin again!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisholmesonline.com/2010/06/28/new-job/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adams Complexity Threshold</title>
		<link>http://www.chrisholmesonline.com/2010/06/09/adams-complexity-threshold/</link>
		<comments>http://www.chrisholmesonline.com/2010/06/09/adams-complexity-threshold/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 16:43:09 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Work Related]]></category>

		<guid isPermaLink="false">http://www.chrisholmesonline.com/?p=509</guid>
		<description><![CDATA[Adams Complexity Threshold

&#8230;complexity is what guarantees mistakes will happen and won&#8217;t be caught.

The same is true for software. 
]]></description>
			<content:encoded><![CDATA[<p><a href="http://dilbert.com/blog/entry/adams_complexity_threshold/?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed%3A+typepad%2FihdT+%28The+Dilbert+Blog%29&#038;utm_content=Bloglines">Adams Complexity Threshold</a></p>
<blockquote><p>
&#8230;complexity is what guarantees mistakes will happen and won&#8217;t be caught.
</p></blockquote>
<p>The same is true for software. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisholmesonline.com/2010/06/09/adams-complexity-threshold/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Surprising Truth About What Motivates Us</title>
		<link>http://www.chrisholmesonline.com/2010/06/02/the-surprising-truth-about-what-motivates-us/</link>
		<comments>http://www.chrisholmesonline.com/2010/06/02/the-surprising-truth-about-what-motivates-us/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 18:18:27 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Work Related]]></category>

		<guid isPermaLink="false">http://www.chrisholmesonline.com/?p=506</guid>
		<description><![CDATA[This is so cool&#8230; 

]]></description>
			<content:encoded><![CDATA[<p>This is so cool&#8230; </p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/u6XAPnuFjJc&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/u6XAPnuFjJc&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisholmesonline.com/2010/06/02/the-surprising-truth-about-what-motivates-us/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IPTV #3: IR Command Path For DISH Receivers</title>
		<link>http://www.chrisholmesonline.com/2010/06/02/iptv-3-ir-command-path-for-dish-receivers/</link>
		<comments>http://www.chrisholmesonline.com/2010/06/02/iptv-3-ir-command-path-for-dish-receivers/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 16:42:02 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Work Related]]></category>

		<guid isPermaLink="false">http://www.chrisholmesonline.com/?p=476</guid>
		<description><![CDATA[This is the third post in a series of posts about the IPTV project. 
In the previous post I talked about the Video Signal Path. In this post I&#8217;m going to talk about how we control the DISH Network Satellite receivers remotely without the aid of hand held remote controls. We&#8217;ll look at the IR [...]]]></description>
			<content:encoded><![CDATA[<p>This is the third post in a series of posts about the <a href="http://www.chrisholmesonline.com/2010/04/22/iptv/">IPTV project</a>. </p>
<p>In the previous post I talked about the <a href="http://www.chrisholmesonline.com/2010/05/13/iptv-2-video-signal-path/">Video Signal Path</a>. In this post I&#8217;m going to talk about how we control the DISH Network Satellite receivers remotely <em>without </em>the aid of hand held remote controls. We&#8217;ll look at the <strong>IR Command Path</strong> for the DISH Network Satellite Receivers and the role that the <strong>Global Cache CG-100 Network Adapters</strong> play in allowing us to control devices.  </p>
<p><img src="http://www.chrisholmesonline.com/images/IPTV_IR_CommandPath.jpg" class="picture"></p>
<p>As stated in the <a href="http://www.chrisholmesonline.com/2010/05/13/iptv-2-video-signal-path/">previous post</a>, the DISH Network receivers are stored in a climate controlled server room under lock-and-key. This is great for the receivers, not so great for the jailers trying to change a channel. </p>
<p>Fortunately, this is where the <a href="http://www.globalcache.com/products/gc-100/">Global Cache GC-100 Network Adapters</a> come to the rescue. </p>
<p><strong>Global Cache GC-100 Network Adapter</strong></p>
<p>The GC-100 is a really cool device. What it allows you to do is send <strong>ASCII text commands</strong> to it over a network. It then interprets those ASCII commands, transforming them into IR commands that can be understood by the device you&#8217;re trying to control. </p>
<p>For this process to work, the GC-100 has to be located next to the device you want to control as it utilizes short, wired IR Emitters. Basically, you string a wired IR Emitter from the GC-100 to the IR input of your device (in this case, the front of the DISH receiver where the IR receptor is located). The IR Emitters have a sticky substance on their face that allows you to fasten the emitter to the front of the IR input on the DISH receiver. However, in reality, we found this sticky substance to be pretty pathetic, so we fastened the emitters to the receivers using black electrician tape. </p>
<p>The GC-100 is then hooked up to the network via CAT-5/CAT-6 and given a network address. </p>
<p><strong>Sending Commands To The GC-100</strong></p>
<p>Having the GC-100 IR emitters hooked up to the DISH receivers and also having it plugged into the network is only half the equation. The next thing you need to be able to do is actually send ASCII commands to it. These ASCII commands are actually text representations of IR signals. But how do we know what commands to send? What do they look like? How do we create them?</p>
<p><strong>Programming The GC-100</strong></p>
<p>Fortunately, the folks at Global Cache created a little tool that makes this whole process much easier. It&#8217;s called an <a href="http://www.globalcache.com/products/other/">IR-Learner</a>. </p>
<p><img src="http://www.chrisholmesonline.com/images/IPTV_IR_Learner.jpg" class="picture"></p>
<p>What the IR-Learner does is allow you to point a remote control at it and capture the ASCII representation of the command. So, for instance, you can take the DISH Network remote control, press the &#8220;Power&#8221; button, and the IR-Learner will capture the ASCII representation of that &#8220;Power&#8221; command. From that point you just need to save that text somewhere. In our application, we choose to save this in a database. </p>
<p><img src="http://www.chrisholmesonline.com/images/IPTV_IR_Command.jpg" class="picture"></p>
<p><strong>Operating The Virtual Remote</strong></p>
<p>So now we have the GC-100 hooked up to the DISH Network receiver, and we have the ASCII commands saved in the database. How do we actually control the DISH Receiver? Remember, the DISH Network receiver is housed in a climate-controlled environment. The jailers do not have direct access to the DISH receivers. What happens when they want to change a channel on the receiver? </p>
<p>We start at the <strong>client application</strong>, with a view that shows us a virtual DISH Network Remote Control: </p>
<p><img src="http://www.chrisholmesonline.com/images/IPTV_ControlDishReceiver.jpg" class="picture"></p>
<p><strong>The Client</strong></p>
<p>The user can click a button on this <strong>virtual remote control</strong>. The client then sends a request to the server application via <a href="http://www.chrisholmesonline.com/2009/03/05/winforms-wcf-duplex-services/">WCF Duplex Channel</a>. The request basically consists of an ID for the internally stored ASCII command that is located in our database. </p>
<p><strong>The Server</strong></p>
<p>When the request reaches the server application, it fetches the ASCII text from the db cache (we&#8217;re using NHibernate and an internal cache in the service to save round trips to the db). The server application then formulates the appropriate command to send out over TCP/IP to the GC-100 Network Adapter. You need to specify the IP Address of the GC-100 that you want to talk to, as well as a &#8220;module&#8221; on the GC-100 that you want to send the command over (a module in the GC-100 corresponds directly to a physical device you are controlling, in this case a specific DISH receiver). For instance, the GC-100-18 has multiple modules so it can control multiple &#8220;devices&#8221;. We used one GC-100-18 to control four DISH receivers. By specifying the module we specify which of the DISH receivers we want the IR signal to go to. </p>
<p><strong>Conclusion</strong></p>
<p>There are a lot of pieces involved in this part of the puzzle, but the result is a simple interface in the client application that non-technical people can understand and utilize. Almost everyone nowadays has a DISH or DirectTV remote control at home. Jailers can easily make sense of the client interface, press a button on the remote control and thus control the DISH receivers remotely, from the comfort of their command and control stations. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.chrisholmesonline.com/2010/06/02/iptv-3-ir-command-path-for-dish-receivers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
