<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" media="screen" href="/styles/xslt/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:c9="http://channel9.msdn.com">
<channel>
	<title>Channel 9 - Entries tagged with Project Detroit</title>
    <atom:link rel="self" type="application/rss+xml" href="http://channel9.msdn.com/Tags/project+detroit/RSS"></atom:link>
    <itunes:summary></itunes:summary>
    <itunes:author>Microsoft</itunes:author>
    <itunes:subtitle></itunes:subtitle>
    <image>
      <url>http://mschnlnine.vo.llnwd.net/d1/Dev/App_Themes/C9/images/feedimage.png</url>
      <title>Channel 9 - Entries tagged with Project Detroit</title>
      <link>http://channel9.msdn.com/Tags/project+detroit</link>
    </image>
    <itunes:image href=""></itunes:image>
    <itunes:category text="Technology"></itunes:category>
    <description>Channel 9 keeps you up to date with the latest news and behind the scenes info from Microsoft that developers love to keep up with. From LINQ to SilverLight – Watch videos and hear about all the cool technologies coming and the people behind them.</description>
    <link>http://channel9.msdn.com/Tags/project+detroit</link>
    <language>en</language>
    <pubDate>Fri, 24 May 2013 20:59:02 GMT</pubDate>
    <lastBuildDate>Fri, 24 May 2013 20:59:02 GMT</lastBuildDate>
    <generator>Rev9</generator>
    <c9:totalResults>5</c9:totalResults>
    <c9:pageCount>1</c9:pageCount>
    <c9:pageSize>25</c9:pageSize>
  <item>
      <title>Project Detroit: Lighting System</title>
      <description><![CDATA[<p>In this article, we give a detailed look into the external lighting system of Project Detroit, the Microsoft-West Coast Custom Mustang creation. If you're not already familiar with this project, you can find more <a href="http://channel9.msdn.com/Blogs/Vector/The-400-horsepower-device">information here</a>.</p><h2>Overview</h2><p>The external lighting system for Project Detroit is run on a web server on a Netduino Plus, which uses the .NET Micro Framework (NETMF). To get an accelerated start, we leveraged code from the CodePlex project <a href="http://netduinohelpers.codeplex.com/">Netduino Helpers</a> to control the <a href="http://www.adafruit.com/products/306">AdaFruit LPD8806 LED</a> strip, and the <a href="http://forums.netduino.com/index.php?/topic/575-updated-web-server/">web server base code from the Netduino forums</a>. They have been tweaked slightly for our project.</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/netduino%5B8%5D.jpg"><img title="netduino" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/netduino_thumb%5B3%5D.jpg" alt="netduino" width="500" height="375" border="0"></a></p><h2>Controllers, Routes, RESTful oh my!</h2><p>We wanted the NETMF web server to have the exact same routes as the full-blown REST service layer in Detroit. With compiler conditionals, this allowed the same code to use the same routes on both the full .NET stack and NETMF. Since we couldn't use the ASP.NET MVC framework here, we had to make something close to it.</p><h2>Controllers</h2><p>Controllers implement an interface with a method named <strong>ExecuteAction</strong>. When <strong>GetController</strong> is called, we return the correct controller but cast as the interface <strong>IController</strong>. This lets us figure out what controller should be executing the request and continue to work generically in the context of the request connection thread. If new functionality is needed, we create a new controller that inherits from IController&nbsp;and update GetController:</p><p><pre class="brush: csharp">
private static void RequestReceived(Request request)
{
    // url comes in as /foo/bar/12345?style=255
    //
     // /CONTROLLER/ACTION/
    //
    // LIGHTING SAMPLE URL: /0/1/?r=255&amp;g=255&amp;b=255&amp;zone=EnumAsInt
    // /0/... 0 = NetduinoControllerType.Lighting
    var validResponse = false;
    try
    {
        Logger.WriteLine(&quot;Start: &quot; &#43; request.Url &#43; &quot; at &quot; &#43; DateTime.Now);
        var urlInParts = request.Url.TrimStart(UriPathSeparator).Split(new[] {'?'}, 2);
        string[] uriSubParts = null;
        string[] queryStringSubParts = null;
        if (urlInParts.Length &gt; 0)
            uriSubParts = urlInParts[0].Split(UriPathSeparator);
                
        if (urlInParts.Length &gt; 1)
            queryStringSubParts = urlInParts[1].Split(QueryStringSeparator);
        if (uriSubParts != null &amp;&amp; uriSubParts.Length &gt; 1)
        {
            var targetController = GetController(uriSubParts[0]);
            if (targetController != null)
            {
                var action = (uriSubParts.Length &gt;= 2) ? uriSubParts[1] : string.Empty;
                var result = targetController.ExecuteAction(action, queryStringSubParts);
                validResponse = true;
                request.SendResponse(result.ToString());
                Logger.WriteLine(&quot;Result: &quot; &#43; result &#43; &quot; from &quot; &#43; request.Url &#43; &quot; at &quot; &#43; DateTime.Now);
            }
        }
        if (!validResponse)
        {
            SendIndexHtml(request);
        }
    }
    catch(Exception ex0)
    {
        Logger.WriteLine(ex0.ToString());
    }
}
</pre></p><h2>Routes, strings and enums on NETMF</h2><p>NETMF can't parse an enum from a string, which is something that can be done in the full .NET Framework. But what does this actually mean? It means the routes for the NETMF web server are a bit unreadable. Here is the same route but with the parsing issue exposed:</p><p><strong>Detroit's REST service route with ASP.NET MVC:</strong><br>http://…/Lighting/Solid/?zone=all&amp;r=255&amp;g=0&amp;b=0<br><br><strong>Detroit's NETMF route:<br></strong>http://…/0/3/?zone=0&amp;r=255&amp;g=0&amp;b=0</p><p>This issue made direct device debugging a bit harder.</p><h2>Parsing the Action and query string</h2><p>Parsing the route is broken into two parts. The first is determines what controller to target. For Project Detroit, that meant the lighting system or the rear glass system. Once we know the controller, we still need to parse the query string and action into something more useful:</p><p><pre class="brush: csharp">
#if NETMF
private static readonly char[] QueryStringParamSeparator = new[] { '=' };
public static LightingData ParseQueryStringValues(string action, params string[] queryStringParameters)
#else
public static LightingData ParseQueryStringValues(string action, Dictionary&lt;string, object&gt; queryStringParameters)
#endif
{
    var data = new LightingData {LightingZone = LightingZoneType.All, LightingAction = ParseLightingActionType(action)};
#if NETMF
    if (queryStringParameters != null)
    {
        foreach (var queryString in queryStringParameters)
        {
            var valueKey = queryString.Split(QueryStringParamSeparator);
            if (valueKey.Length != 2)
                continue;
            var key = valueKey[0];
            var value = valueKey[1];
#else
        foreach(var key in queryStringParameters.Keys)
        {
            var value = queryStringParameters[key].ToString();
#endif
            switch (key.ToLower())
            {
                case ZoneHuman:
                case ZoneComputer:
                    data.LightingZone = ParseLightingZoneType(value);
                    break;
                // more stuff
            }
        }
#if NETMF
    }
#endif
    // more stuff
            
    return data;
}
</pre></p><h2>Turning on the lights</h2><p>Individually addressable LED strips allow us to tell each individual LED what color to be. To adjust the colors of the LED lights, we loop through all the LEDs, set their color value, and then call <strong>LedRefresh()</strong> on our LED strip. There's no need to set all of them, only the ones being updated:</p><p><pre class="brush: csharp">
private static void SolidAnimationWorker()
{
    var leds = GetLedsToIlluminate();
    var dataCopy = _data;
    for (var i = 0; i &lt; leds.Length; i&#43;&#43;)
        SetLed(leds[i], dataCopy.Red, dataCopy.Green, dataCopy.Blue);
    LedRefresh();
}
</pre></p><h2>Zones / Animation Threads</h2><p>A solid color is boring, but we can use procedural animations to add some flair. The current code&nbsp;supports the following animations:</p><ul><li>Solid - A single solid color. </li><li>Fill - Goes from black to the desired color. The color stays lit. Much like filling a glass of liquid. <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif?v=c9' alt='Smiley' /> </li><li>Random - LEDs are set to a random value. </li><li>Pulse - A glowing effect from bright to black. </li><li>Snake - A one way lighting effect with a fading tail that moves left to right. </li><li>Sweep - This effect was inspired by KITT and a Cylon robot and is similar to a snake pattern. The effect can also handle being split in two while maintaining a continual line for items such as the grill or the wheels. </li><li>Police - Each side flashes a red and blue light. </li></ul><p>Since we know the LED strip is a single strand, we can be clever with offsets and create groupings. By having a dedicated animation thread in each zone, we can have the grill of the car in Police Mode while the bottom fades to red and the vents fill to blue at different refresh rates.</p><p>To run an animation, we need to first kill the old animation thread, spin up a new thread, mark LEDs in the &quot;All LED&quot; zone as do not touch, and execute the new pattern. Without a way to mark the LEDs as &quot;bad&quot; in the &quot;All&quot; zone, the two animation threads would compete for setting the color and result in a flickering effect. Other zones don't have to worry about this since there is zero overlap of LEDs:&nbsp;</p><p><pre class="brush: csharp">
public bool ExecuteAction(string action, params string[] queryStringParameters)
{
    var data = LightingDataHelper.ParseQueryStringValues(action, queryStringParameters);
            
    SignalToEndAnimationThread(data.LightingZone);
    int counter = 0;
    while (counter&#43;&#43; &lt; 5 &amp;&amp; IsThreadAlive(data.LightingZone))
        Thread.Sleep(10);
    if (IsThreadAlive(data.LightingZone))
        AbortAnimationThread(data.LightingZone);
    // moving data bucket into public so new threads can leverage it
    _data = data;
    if (_data.LightingAction == LightingActionType.Police || _data.LightingAction == LightingActionType.Sweep)
    {
        _data.LightingZone = LightingZoneType.Grill;
        if (IsThreadAlive(_data.LightingZone))
            AbortAnimationThread(_data.LightingZone);
    }
    // cleaning up just incase
    if (data.LightingZone != LightingZoneType.All)
    {
        for (var i = 0; i &lt; _zoneAllAnimation.Length; i&#43;&#43;)
        {
            var leds = GetLedsToIlluminate();
            for (var z = 0; z &lt; leds.Length; z&#43;&#43;)
            {
                // flagging item as bad in animation lib
                if (_zoneAllAnimation[i] == leds[z])
                    _zoneAllAnimation[i] = -1;
            }
        }
    }
    switch (_data.LightingAction)
    {
        case LightingActionType.Solid:
            Debug.Print(&quot;Solid&quot;);
            ExecuteThread(SolidAnimationWorker);
            break;
        // more patterns
    }
    return true;
}
</pre></p><p>We can now do something more interesting, like Police Mode:</p><p><pre class="brush: csharp">
private static void PoliceModeAnimationWorker()
{
    var leds = GetLedsToIlluminate();
    var dataCopy = _data;
    var length = leds.Length;
    var half = length / 2;
    var index = 0;
    while (IsThreadSignaledToBeAlive(dataCopy.LightingZone))
    {
        int redIntensity = (index == 0) ? 255 : 0;
        int blueIntensity = (index == 0) ? 0 : 255;
        for (var i = 0; i &lt; half; i&#43;&#43;)
            SetLed(leds[i], redIntensity, 0, 0);
        for (var i = half; i &lt; length; i&#43;&#43;)
            SetLed(leds[i], 0, 0, blueIntensity);
        LedRefresh();
        index&#43;&#43;;
        index %= 2;
        Thread.Sleep(100);
    }
}
</pre></p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/WP_000197%5B5%5D.jpg"><img title="WP_000197" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/WP_000197_thumb%5B2%5D.jpg" alt="WP_000197" width="500" height="375" border="0"></a></p><h2>Improvements</h2><p>Hindsight is 20/20. Nothing is ever perfect and there are of course items we'd love to change. At the start, the goal was to make this fairly generic and not Project Detroit &quot;aware.&quot; As you can see by looking at the source, that wasn't accomplished due to time constraints.</p><p>We would use a different LED system for two reasons: data transfer speed and power. The longer the LED strip is, the longer it takes to address an item further down the line. Project Detroit, having 15 meters of lighting in it, was impacted by this issue. It works well, just not as well as we hoped. The voltage requirements of the LEDs are another consideration. They are 5V, while a car uses 12V. Had we used 12V LEDs, our wiring would have been far simpler and wouldn't have required multiple transformers to get the required amperage needed at the correct voltage.</p><h2>Conclusion</h2><p>We think the lighting solution, coupled with the time and material constraints, worked out pretty well.&nbsp; Project Detroit was a ton of fun to build out and working with West Coast Customs was the chance of a lifetime.</p><p><img src="http://files.channel9.msdn.com/thumbnail/09615539-1a33-49f7-b438-ca1b9543d712.jpg" alt="" width="500" height="284"></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/project+detroit/RSS&WT.dl=0&WT.entryid=Entry:RSSView:f6bef172711342dbbca9a046016a6843">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-Lighting-System</comments>
      <itunes:summary>In this article, we give a detailed look into the external lighting system of Project Detroit, the Microsoft-West Coast Custom Mustang creation. If you&#39;re not already familiar with this project, you can find more information here. OverviewThe external lighting system for Project Detroit is run on a web server on a Netduino Plus, which uses the .NET Micro Framework (NETMF). To get an accelerated start, we leveraged code from the CodePlex project Netduino Helpers to control the AdaFruit LPD8806 LED strip, and the web server base code from the Netduino forums. They have been tweaked slightly for our project.  Controllers, Routes, RESTful oh my!We wanted the NETMF web server to have the exact same routes as the full-blown REST service layer in Detroit. With compiler conditionals, this allowed the same code to use the same routes on both the full .NET stack and NETMF. Since we couldn&#39;t use the ASP.NET MVC framework here, we had to make something close to it. ControllersControllers implement an interface with a method named ExecuteAction. When GetController is called, we return the correct controller but cast as the interface IController. This lets us figure out what controller should be executing the request and continue to work generically in the context of the request connection thread. If new functionality is needed, we create a new controller that inherits from IController&amp;nbsp;and update GetController: 
private static void RequestReceived(Request request)
{
    // url comes in as /foo/bar/12345?style=255
    //
     // /CONTROLLER/ACTION/
    //
    // LIGHTING SAMPLE URL: /0/1/?r=255&amp;amp;g=255&amp;amp;b=255&amp;amp;zone=EnumAsInt
    // /0/... 0 = NetduinoControllerType.Lighting
    var validResponse = false;
    try
    {
        Logger.WriteLine(&amp;quot;Start: &amp;quot; &amp;#43; request.Url &amp;#43; &amp;quot; at &amp;quot; &amp;#43; DateTime.Now);
        var urlInParts = request.Url.TrimStart(UriPathSeparator).Split(new[] {&#39;?&#39;}, 2);
        string[] uriSubParts = null;
       </itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-Lighting-System</link>
      <pubDate>Mon, 21 May 2012 16:00:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/articles/Project-Detroit-Lighting-System</guid>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/09c00fc4-d404-424d-8120-278d433390bd.jpg" height="75" width="100"></media:thumbnail>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/6bff8dd9-2c4a-4fc0-9e5a-c03e80a68796.jpg" height="165" width="220"></media:thumbnail>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/f7c84b3a-67a1-4580-aa9a-0554038a63bf.jpg" height="288" width="512"></media:thumbnail>      
      <dc:creator>Brian Peek, Clint Rutkas, Dan Fernandez</dc:creator>
      <itunes:author>Brian Peek, Clint Rutkas, Dan Fernandez</itunes:author>
      <slash:comments>4</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-Lighting-System/RSS</wfw:commentRss>
      <category>NETMF</category>
      <category>Project Detroit</category>
    </item>
  <item>
      <title>Project Detroit: An Overview</title>
      <description><![CDATA[<p>In this article, we will give an overview of the technical side of Project Detroit, the Microsoft-West Coast Custom Mustang creation. If you're not already familiar with this project, you can find more <a href="http://channel9.msdn.com/Blogs/Vector/The-400-horsepower-device">information here</a>.&nbsp;</p><h2>Key Design Decisions</h2><p>It’s important to keep in mind that this car was built for a TV show with a set schedule. As a result, there are a number of unique design decisions that came into play.</p><p><img src="http://files.channel9.msdn.com/thumbnail/09615539-1a33-49f7-b438-ca1b9543d712.jpg" alt=""></p><p><strong>Schedule<br><br></strong>Working backwards, the reveal for the car was set for Monday November 28, 2011 at the Microsoft Store in Bellevue, Washington. We started the project in early August, which gave us approximately 12 weeks for research, development, vehicle assembly, and testing. This was by far the #1 design decision as any ideas or features for the car had to be implemented by the reveal date.</p><p><strong>Off the Shelf Parts<br><br></strong>Another key design decision was to, where possible, use off-the-shelf hardware and software in order to allow&nbsp; interested developers to build and reuse some of the subsystems for their own car (at least the ones that don’t require welding). For example, instead of buying pricey custom sized displays for the instrument cluster or passenger display, we used stock <a href="http://www.microsoftstore.com/store/msstore/pd/Samsung-Series-7-Slate/productID.241554200/vip.true">Samsung Series 7 Slate</a> PCs and had West Coast Customs do the hard work of building a custom dash to hold the PC.</p><p>&nbsp;</p><h2>Hardware and Networking</h2><p>The car is packed with a variety of computers and networking hardware.</p><ul><li><strong>Instrument Cluster Slate</strong> – This slate is on the driver's side and manages the instrument cluster application and the On-Board Diagnostic (OBD) connection to read telemetry data from the car. </li><li><strong>Passenger Slate – </strong>This slate, which is built into the passenger's side, runs a custom Windows 8 application (see Passenger slate below). <br><img title="USA_" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/Built-In_Touch_screen_Displays_Web_thumb%5B1%5D.jpg" alt="USA_" width="324" height="212" border="0"> </li><li><strong>Laptop 1 – </strong>This laptop runs the REST service to control different parts of the car, the Kinect socket service for the front Kinect, and the user message service to display messages on the rear glass while driving. </li><li><strong>Laptop 2 </strong>– This laptop runs the Heads Up Display (HUD) service, the Kinect socket service for the back Kinect, the OBD-II database, and Azure services. </li><li><strong>Windows Phone – </strong>A Nokia Lumia 800 connects via WiFi and a custom Windows Phone 7 application (See Windows Phone application below). </li><li><strong>Xbox 360 – </strong>The Xbox 360 displays on either the passenger HUD or the rear glass display. </li><li><strong>Networking</strong> – A <a href="http://www.netgear.com/home/products/wirelessrouters/high-performance/wndr3700.aspx">NETGEAR N600/WNDR3700</a> wireless router provides wired and wireless access for everything in the car, which is used in conjunction with a Verizon USB network card plugged into a <a href="http://www.cradlepoint.com/products/small-business-home-office-routers/mbr900-cellular-router">Cradle Point MBR900</a> to provide an always-on 3G/4G LTE internet connection. The slates, laptops, and Xbox 360 are connected via CAT5e cable, while the Windows Phone 7 connects via WiFi. </li></ul><p><strong>Note: </strong>One of the limitations of the Kinect SDK is that if you have multiple Kinects plugged into one PC, only one of those Kinects can do skeletal tracking at a time (color/depth data works just fine). Because of this, we decided to have a dedicated laptop plugged into the front Kinect and another laptop plugged into the back Kinect in order to allow front and back skeletal tracking at the same time. If we'd not used simultaneous skeletal tracking, we could have combined all of the systems onto a single laptop.</p><h2>Architecture</h2><p>Here is a quick overview of the application architecture.</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/detroitArch%5B7%5D-1.png"><img title="detroitArch" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/detroitArch_thumb%5B4%5D.png" alt="detroitArch" width="500" height="319" border="0"></a></p><h2>&nbsp;</h2><h2>REST Service Layer</h2><p>The REST Service Layer allowed different systems talk to one another. More importantly, it allowed different services to control hardware they normally wouldn't be able to access.</p><ol><li><strong>Thin client approach<br></strong>The solution we chose was to have all the services that control different parts of the car reside on the laptops and have client applications like the Windows Phone application send REST commands to execute an action so the service layer would execute the request. <br><br></li><li><strong>REST-enable hardware</strong> <br>Controlling hardware should be invisible to the consuming clients. For example, hardware that requires USB communication would be impossible to control with a Windows Phone. The service layer allowed us to control hardware in a way that was invisible to the end user. <br><br></li><li><strong>Helper Libraries</strong><br>To simplify communication with the service layer, we built a set of helper classes to abstract out repetitive tasks like JSON serialization/deserialization, URI building, etc. For example, to get the list of car horn “ringtones”, the client application can call <strong>HornClient.List()</strong> to get back a list of available ringtone filenames. To set the car horn, the client calls <strong>HornClient.Set(filename)</strong>, and to play the car horn, it then calls <strong>HornClient.Play(filename)</strong>. The Helper libraries were built to work on Windows 7, Windows 8, and Windows Phone 7. </li></ol><h2>OBD-II</h2><p>We have already released an <a href="http://channel9.msdn.com/coding4fun/articles/Project-Detroit-How-to-Read-Your-Cars-Engine-Data-with-OBD-II">article</a> and <a href="http://obd.codeplex.com/">library</a> on the OBD-II portion of the car.&nbsp; In short, OBD-II stands for On-Board Diagnostics. Hooking into this port allows one to query for different types of data from the car, which we use to get the current speed, RPMs, fuel level, etc. for display in the Instrument Cluster and other locations. OBD can do far more than this, but it's all we needed for our project. Please see the linked articles for further details on the OBD-II library itself.</p><p>For the car, because only one application can open and communicate with a serial port at one time, we created a WCF service that polls the OBD-II data from the car and GPS data from a <a href="http://www.microsoftstore.com/store/msstore/en_US/pd/productID.216603800">Microsoft Streets &amp; Trips GPS locator</a>, and returns it to any application that queries the service.</p><p>For the OBD library, we used a manual connection to poll different values at different intervals. For values critical to driving the car—like RPM, speed, etc.—we polled for the values as quickly as the car could return them. With other values that weren’t critical to driving the car—like the fuel level, engine coolant temperature, etc.—we polled at a 1-2 second interval. For GPS, we subscribed to the <strong>LocationChanged</strong> event, which would fire when the GPS values changed.</p><p>Rather than creating a new serial port connection for every WCF request for OBD data, we created a singleton service that is instantiated when the service first runs. Accordingly, there is only one object in the WCF service that represents the last OBD and GPS data returned, which is obtained by the continual reading of the latest OBD data using the OBD library as described above. This means that calls to the WCF service <strong>ReadMeasurement</strong> method didn’t actually compute anything, but instead serialized the last saved data and returned it via the WCF service.</p><p>Since WCF supports multiple protocols, we implemented HTTP and TCP and ensured that any WCF service options we chose worked on Windows Phone, which, for example, can only use basic HTTP bindings.</p><p>To enable the ability to change the programming model later and to simplify the polling of the service, we built a helper library for Windows and Windows Phone that abstracts all the WCF calls.</p><p>The code below creates a new <strong>ObdService</strong> class and signs up for an event when the measurement has changed. The <strong>Start</strong> method does a couple of things: it lets you set the interval that you want to poll the <strong>ObdService</strong>, in this case every second (while the instrument cluster needs fast polling, the database logger can poll once a second). It also determines what IP address the service is hosted at (localhost), the protocol (HTTP or TCP), and whether to send “demo mode” data. Since one of the main ways the car is showcased is when it’s stopped on display, “demo mode” sends fake data, instead of always returning 0's for MPH, RPM, etc., so people can see what the instrument cluster would look like in action.</p><p><pre class="brush: csharp">
_service = new ObdService();
_service.ObdMeasurementChanged &#43;= service_ObdMeasurementChanged;
_service.Start(new TimeSpan(0, 0, 0, 0, 1000), localhost, Protocol.Http, false);

void service_ObdMeasurementChanged(object sender, ObdMeasurementChangedEventArgs e)
{
  Debug.Writeline(&quot;MPH=” &#43; e.Measurement.MilesPerHour);
}
</pre></p><h2>OBD-II Database &amp; Azure Services</h2><p>To record and capture the car telemetry data like MPH, RPM, engine load, and throttle (accelerator) position, as well as location data (latitude, longitude, altitude, and course), we used a SQL Server Express database with a simple, flat Entity Framework model, shown below. The primary key, the <strong>ObdMeasurementID</strong> is a GUID that is returned via the <strong>ObdService</strong>.&nbsp; Just like above, the database logger subscribes to the <strong>ObdMeasurementChanged</strong> event and receives a new reading at the time interval set in the <strong>Start()</strong> method.</p><p><img title="image" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image%5B7%5D-3.png" alt="image" width="319" height="522" border="0"></p><p>The Windows Azure data model uses Azure Table Services instead of SQL Server. The data mapping is essentially the same since both have a flat schema.</p><p>For Azure Table Storage, in addition to the schema above, you also need a partition key and a row key. For the partition key, we used a custom <strong>TripID</strong> (GUID) to represent a Trip. When the car is turned on/off a new TripID is created. That way we could group all measurements for that particular trip and do calculations based on that trip, like the average miles per gallon, distance traveled, fastest speed, etc. For the row key, we used a <strong>DateTimeOffset </strong>and a custom extension method, <strong>ToEndOfDays</strong>() that provides a unique numerical string (since Azure's row key is a string type) that subtracts the time from the <strong>DateTime.</strong><strong>Max</strong> value. The result is that the earlier a <strong>DateTime</strong> value, the larger the number.</p><p>Example:</p><p>Time=5/11/2012 9:14:09 AM, EndOfDays=2520655479509478223 //larger <br>Time=5/11/2012 9:14:11 AM, EndOfDays=2520655479482804811 //smaller</p><p>Since they are ordered in reverse order, with the most recent date/time being the first row, we can write an efficient query to pull just the first row to get the current latitude/longitude without needing to scan the entire table for the last measurment.</p><pre><br><pre class="brush: csharp">
public override string RowKey
{
    get
    {
        return new DateTimeOffset(TimeStamp).ToEndOfDays();
    }
    set
    {
        //do nothing
    }
}

public static class DateTimeExtensions
{
  public static string ToEndOfDays(this DateTimeOffset source)
  {  
    TimeSpan timeUntilTheEnd = DateTimeOffset.MaxValue.Subtract(source);
    return timeUntilTheEnd.Ticks.ToString();
  }

  public static DateTimeOffset FromEndOfDays(this String daysToEnd)
  {
    TimeSpan timeFromTheEnd = newTimeSpan(Int64.Parse(daysToEnd));
    DateTimeOffset source = DateTimeOffset.MaxValue.Date.Subtract(timeFromTheEnd);
    return source;
  }
}
</pre><br><br></pre><p>To upload data to Azure, we used a timer-based background uploader that would check to see if there was an internet connection, and then filter and upload all of the local SQL Express rows that had not been submitted to Azure using the <strong>Submitted </strong>boolean database field. On the Azure side, we used an ASP.NET MVC controller to submit data. The controller deserializes the data into a <strong>List&lt;MeasurementForTransfer&gt; </strong>type, it adds the data to a blob, and adds the blob to a queue as shown below.</p><p>A worker role (or many) will then read items off the queue and the new OBD measurement rows are placed into Azure Table Storage.</p><pre><br><pre class="brush: csharp">
public ActionResult PostData()
{
    try
    {
        StreamReader incomingData = new StreamReader(HttpContext.Request.InputStream);

        string data = incomingData.ReadToEnd();
        JavaScriptSerializer oSerializer =
            new JavaScriptSerializer();

        List&lt;MeasurementForTransfer&gt; measurements;
        measurements = oSerializer.Deserialize(data, typeof(List&lt;MeasurementForTransfer&gt;)) as List&lt;MeasurementForTransfer&gt;;

        if (measurements != null)
        {
            CloudBlob blob = _blob.UploadStringToIncoming(data);
            _queue.PushMessageToPostQueue(blob.Uri.ToString());
            return new HttpStatusCodeResult(200);
        }
        ...
    }
}
</pre><br><br></pre><h2>Instrument Cluster</h2><p>Much of this is also covered in our previously released OBD-II library where the instrument cluster application is included as a sample. This is a WPF application that runs on a Windows 7 slate. It contains three different skins designed by <a href="www.352media.com">352 Media</a>—a 2012 Mustang dashboard, a 1967 Mustang dashboard, and a Metro-style dashboard—each of which can be &quot;swiped&quot; through. This application queries the OBD-II WCF service described above as quickly as it can to retrieve speed, RPM, fuel level, and other data for display to the driver. The gauges are updated in real-time just as a real dashboard instrument cluster would behave.</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/obd1%5B2%5D.png"><img title="obd1" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/obd1_thumb.png" alt="obd1" width="244" height="139" border="0"></a><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/obd2%5B2%5D.png"><img title="obd2" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/obd2_thumb.png" alt="obd2" width="244" height="139" border="0"></a><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/obd3%5B2%5D.png"><img title="obd3" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/obd3_thumb.png" alt="obd3" width="244" height="139" border="0"></a></p><h2>HUD</h2><p>The HUD (or Heads Up Display) application runs on one of the two Windows 7 computers in the car. This is a full-screen application that is output via a projector to a series of mirrors and a projection screen. This is then reflected onto the front glass of the windshield of the car. To install these, we altered the physical car's body and created brackets to mount mirrors and the projectors. In the picture on the left, you can see the dashboard's structural member pivoted outward. You can see the 12&quot; section we removed and added in the base plate to allow light to be reflected through to the windshield. <a href="http://twitter.com/wjsteele">Bill Steele </a>helped design and implement the physical HUD aspect into the car.</p><p><iFrame src="http://channel9.msdn.com/posts/Project-Detroit-Hud/player?w=512&amp;h=288" frameborder="0" scrolling="no" width="512px" height="288px"></iFrame></p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/alterationFrame%5B2%5D.jpg"><img title="alterationFrame" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/alterationFrame_thumb.jpg" alt="alterationFrame" width="240" height="180" border="0"></a>&nbsp;<a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/mirrors%5B2%5D.jpg"><img title="mirrors" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/mirrors_thumb.jpg" alt="mirrors" width="240" height="180" border="0"></a></p><p>The HUD application has several different modes.&nbsp; The mode is selected from the Windows Phone application.</p><ul><li><strong>POI / Mapping</strong> – This uses <a href="http://msdn.microsoft.com/en-us/library/dd877180.aspx">Bing Maps services</a>. The phone or Windows 8 passenger application can choose one of a select group of categories (Eat, Entertain, Shop, Gas). Once selected, the REST service layer is contacted and the current choice is persisted. The HUD is constantly polling the service to know what the current category is, and when it changes, the HUD switches to an overhead map display with the closest locations of that category displayed, along with your always updated current GPS position and direction. The list of closest items in the category is requested every few seconds from the Bing Maps API and the map is updated appropriately. <br><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image%5B10%5D-1.png"><img title="image" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image_thumb%5B6%5D-3.png" alt="image" width="324" height="204" border="0"></a> </li><li><strong>Car telemetry</strong> - In the car telemetry mode, the OBD data from the WCF service described above is queried and displayed on the screen.&nbsp; This can be though of as an overall car &quot;status&quot; display with the speed, RPMs, real-time MPG, time, and weather information. </li><li><strong>Weather</strong> – We use the <a href="http://www.worldweatheronline.com/">World Weather Online</a> API to get weather data for display on the HUD. This API allows queries for weather based on a latitude and longitude, which we have at all times. A quick call to the service gives us the current temperature and a general weather forecast, which we display as an icon next to the temperature in the lower-left portion of the screen. <strong><br><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image%5B5%5D-4.png"><img title="image" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image_thumb%5B3%5D-5.png" alt="image" width="324" height="204" border="0"></a></strong> </li><li><strong>Kinect</strong> – Using our <a href="http://kinectservice.codeplex.com/">Kinect Service</a>, with the standard WPF client code, we can display the rear camera on the HUD to help the driver when backing up. See the Kinect Service project for more information on how this works and to use the service in an application of your own. </li></ul><h2>&nbsp;</h2><h2>Windows Phone Application</h2><p>One of the main ways to control the vehicle is through the Windows Phone application.&nbsp; <br><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a%5B4%5D.png"><img title="a" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a_thumb%5B2%5D.png" alt="a" width="196" height="324" border="0"></a></p><p>The first pivot of the app allows the user to lock, unlock, start the car, and set off the alarm.&nbsp; This is done through the <a href="http://www.viper.com">Viper</a> product from <a href="http://www.directed.com">Directed Electronics</a>.</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a%5B8%5D.png"><img title="a" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a_thumb%5B4%5D.png" alt="a" width="196" height="324" border="0"></a></p><p>The second pivot contains the remaining ways that a user can interact with the car.</p><ul><li><strong>Kinect</strong> – This uses the Kinect service much in the way the HUD does. It can display both the front and rear cameras as well as allow the user to listen to an audio clip and send it up to the car while applying a voice changing effect.<br><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a%5B13%5D.png"><img title="a" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a_thumb%5B7%5D.png" alt="a" width="196" height="324" border="0"></a> </li><li><strong>Voice Effect</strong> – When the Talk button is pressed, the user can record their voice via the microphone. When released, the audio data is packaged in a simple WAV file and uploaded to the REST service. The user can select from several voice effects, such as Chipmunk and Deep. On the service side, that WAV file is modified with the selected effect and then played through the PA system. The code in this section of the app is very similar to the <a href="http://skypefx.codeplex.com/">Coding4Fun Skype Voice Changer</a>. We use <a href="http://naudio.codeplex.com/">NAudio</a> and several pre-made effects to process the WAV file for play. </li><li><strong>Lighting</strong> – This controls the external lighting for the car. The user can select a zone, an animation, and a color to apply. Once selected, this is communicated through the REST service to the lighting controller.<strong><br><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a%5B17%5D.png"><img title="a" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/a_thumb%5B9%5D.png" alt="a" width="404" height="244" border="0"></a></strong> </li><li><strong>Messaging</strong> – This presents a list of known pictures and videos for the user. The selection is sent to the car through the REST service and displayed on the projector that is pointed at the rear window, allowing following drivers to see the image, video, or message.&nbsp; </li><li><strong>Point Of Interest</strong> – As described earlier, this is the way the user can turn on the Point of Interest map on the HUD.&nbsp; Selecting one of the four items sends the selection to the REST service where it is persisted. The polling HUD will know when the selection is changed and display the map interface as shown above. </li><li><strong>Telemetry</strong> – This is a replica of the instrument cluster that runs on the Windows 7 slate. OBD data is queried via the WCF service, just like the slate, and displayed on the gauges, just like the slate.<br>&nbsp;<a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image%5B13%5D-1.png"><img title="image" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image_thumb%5B7%5D-2.png" alt="image" width="404" height="199" border="0"></a> </li><li><strong>Projection Screen</strong> – This will raise and lower the projection screen on the rear of the car. </li><li><strong>Horn</strong> – This displays a list of known horn sound effects that live on the REST service layer. Selecting any of the items will send a command through the REST to play that sound file on the external sound system of the car. This selected audio file would play when the horn was pressed in the car. </li><li><strong>Settings</strong> – Internal settings for setting up hardware and software for the car. </li></ul><h2>Passenger Application</h2><p>The passenger interface runs on a Samsung Series 7 slate running the Windows 8 Consumer Preview. This interface has a subset of the functionality provided by the Windows Phone application, but communicates through the same REST service. From this interface, the passenger can set the car horn sound effect, view the front and back Kinect cameras, select a Point of Interest category to be displayed on the HUD, and select the image, video or message that will be displayed on the rear window.</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image%5B14%5D-2.png"><img title="image" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/image_thumb%5B8%5D-5.png" alt="image" width="324" height="204" border="0"></a></p><h2>External Car Lighting</h2><p>The external lighting system was controlled by a web server running on a <a href="http://netduino.com/netduinoplus/specs.htm">Netduino Plus</a> using a <a title="http://www.sparkfun.com/products/7914" href="http://www.sparkfun.com/products/7914">Sparkfun protoshield board</a> to simplify wiring, and allow for another shield to be used. The actual lights were <a href="http://www.adafruit.com/products/306">Digital Addressable RGB LED w/ PWM</a>. We'll also have a more in-depth article on this system on Coding4Fun shortly.</p><p>The car is broken down into different zones—grill, wheels, vents, etc. It also has a bunch of pre-defined procedural animation patterns that have a few adjustable parameters that allow for things like a snake effect, a sensor sweep, or even a police pattern. Each zone has its own thread which provides the ability to have multiple animation patterns going at the same time. When a command is received, the color, pattern, zone, and other data is then processed.</p><p>Here is a basic animation loop pattern.</p><p><pre class="brush: csharp">
private static void RandomAnimationWorker()
{
    var leds = GetLedsToIlluminate();
    var dataCopy = _data;
    var r = new Random();

    while (IsThreadSignaledToBeAlive(dataCopy.LightingZone))
    {
        for (var i = 0; i &lt; leds.Length; i&#43;&#43;)
            SetLed(leds[i], r.Next(255), r.Next(255), r.Next(255));

        LedRefresh();
        Thread.Sleep(dataCopy.TickDuration);
    }
}
</pre></p><h2>Rear Projection Window</h2><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/rearGlass%5B4%5D.jpg"><img title="rearGlass" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/rearGlass_thumb%5B2%5D.jpg" alt="rearGlass" width="480" height="360" border="0"></a></p><p>The rear projection system consists of <a href="http://www.trossenrobotics.com/store/p/5183-4-Inch-Stroke-110-LB-Linear-Actuator-with-Feedback.aspx">two 4” linear actuators</a>, <a href="http://www.trossenrobotics.com/store/p/5189-Dual-Linear-Actuator-Controller.aspx">a linear actual controller</a>, the NETMF web server from above, a <a href="http://www.seeedstudio.com/depot/relay-shield-p-693.html?cPath=132_134">Seeed Studio Relay Shield</a>, the back glass of a 1967 Ford Mustang, some <a href="http://www.ssidisplays.com/rear-projection-film/intrigue">rear projection film</a>, <a href="http://www.amazon.com/Casio-Green-Projector-Lumens-XJ-A250/sim/B004I36R6Q/2">a low profile yet insanely bright projector that accepts serial port commands</a>, and a standard USB to serial adapter.</p><p>The REST service layer toggles the input of the projector based on the selected state.&nbsp; This would allow us to go from the HDMI output of an Xbox 360 to the VGA output of the laptop.&nbsp; While doing this, the REST layer sends a command to the NETMF web server to either raise or lower the actuators.</p><p>Here is the code for the NETMF to control the raising and lowering the glass:</p><p><pre class="brush: csharp">
public static class Relay
{
    // code for for Electronic Brick Relay Shield
    static readonly OutputPort RaisePort = new OutputPort(Pins.GPIO_PIN_D5, false);
    static readonly OutputPort LowerPort = new OutputPort(Pins.GPIO_PIN_D4, false);

    const int OpenCloseDelay = 1000;

    public static bool Raise()
    {
        return ExecuteRelay(RaisePort);
    }

    public static bool Lower()
    {
        return ExecuteRelay(LowerPort);
    }

    private static bool ExecuteRelay(OutputPort port)
    {
        port.Write(true);
        Thread.Sleep(OpenCloseDelay);
        port.Write(false);

        return true;
    }
}
</pre></p><h2>Messaging System</h2><p>This is a WPF application that leveraged the file system on the computer to communicate between the REST service layer and itself.&nbsp; Visually, it shows the message/image/video in the rear view mirror but it actually does two other tasks, it operates our car horn system and plays the recorded audio output from the phone.</p><ul><li><strong>Displaying Messages</strong><br>To display images, we poll the REST service every second for an update.&nbsp; Depending on the return type, we either display a TextBlock element or a MediaElement.<br><br></li><li><strong>Detecting and Playing Car Horn</strong><br>When someone presses the horn in the car, it is detected by a Phidget 8/8/8 wired into a Digital Input. In-between the car horn and the Phidget, there is a relay as well. This isolates the voltage coming from the horn and solves a grounding issue. We then feed back two wires from that relay and put one into the ground and the other into one of the digital inputs. In the application, we listen to the <strong>InputChange</strong> event on the Phidget and play / stop the audio based on the state.<br><br></li><li><strong>Detecting new recorded audio from the phone and car horn changes</strong><br>When someone talks into the phone or selects a new car horn, the REST service layer places that audio file into a predetermined directory. The Messaging service then uses a <strong>FileSystemWatcher</strong> to detect when this file is added. The difference between the car horn detection and recorded audio is the recorded audio will play once it is done writing to the file system. </li></ul><h2>External PA System</h2><p>To interact with people, we installed an external audio PA or Public Address system. This system is hooked into the laptop that is connected to the car horn, and can play audio data from the phone. Having a PA system that is as simple as an audio jack that plugs into a PC enabled us to have different ringtones for the car horn and to talk through the car using Windows Phone.</p><h2>Conclusion</h2><p>After months of planning and building, the Project Detroit car was shown to the world on an episode of Inside West Coast Customs. Though it was a ton of work, the end product is something we are all proud of. We hope that this project inspires other developers to think outside the box and realize what can be done with some off-the-shelf hardware, software, and passion.</p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/splash%5B5%5D.jpg"><img title="splash" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/splash_thumb%5B3%5D.jpg" alt="splash" width="480" height="350" border="0"></a></p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/project+detroit/RSS&WT.dl=0&WT.entryid=Entry:RSSView:1a2766655d5e40eb9dbea030013669f1">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-An-Overview</comments>
      <itunes:summary>In this article, we will give an overview of the technical side of Project Detroit, the Microsoft-West Coast Custom Mustang creation. If you&#39;re not already familiar with this project, you can find more information here.&amp;nbsp; Key Design DecisionsIt’s important to keep in mind that this car was built for a TV show with a set schedule. As a result, there are a number of unique design decisions that came into play.  ScheduleWorking backwards, the reveal for the car was set for Monday November 28, 2011 at the Microsoft Store in Bellevue, Washington. We started the project in early August, which gave us approximately 12 weeks for research, development, vehicle assembly, and testing. This was by far the #1 design decision as any ideas or features for the car had to be implemented by the reveal date. Off the Shelf PartsAnother key design decision was to, where possible, use off-the-shelf hardware and software in order to allow&amp;nbsp; interested developers to build and reuse some of the subsystems for their own car (at least the ones that don’t require welding). For example, instead of buying pricey custom sized displays for the instrument cluster or passenger display, we used stock Samsung Series 7 Slate PCs and had West Coast Customs do the hard work of building a custom dash to hold the PC. &amp;nbsp; Hardware and NetworkingThe car is packed with a variety of computers and networking hardware. Instrument Cluster Slate – This slate is on the driver&#39;s side and manages the instrument cluster application and the On-Board Diagnostic (OBD) connection to read telemetry data from the car. Passenger Slate – This slate, which is built into the passenger&#39;s side, runs a custom Windows 8 application (see Passenger slate below).  Laptop 1 – This laptop runs the REST service to control different parts of the car, the Kinect socket service for the front Kinect, and the user message service to display messages on the rear glass while driving. Laptop 2 – This laptop runs the Heads Up Display (</itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-An-Overview</link>
      <pubDate>Mon, 14 May 2012 16:00:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/articles/Project-Detroit-An-Overview</guid>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/9c7747e3-41c9-419a-a59f-3a5b6c011ff4.jpg" height="57" width="100"></media:thumbnail>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/9ac4b4d9-a9d6-42d9-888e-12638265be2c.jpg" height="125" width="220"></media:thumbnail>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/285e8cb8-688c-4867-9523-40d0e1f3d9d2.jpg" height="291" width="512"></media:thumbnail>      
      <dc:creator>Brian Peek, Clint Rutkas, Dan Fernandez</dc:creator>
      <itunes:author>Brian Peek, Clint Rutkas, Dan Fernandez</itunes:author>
      <slash:comments>11</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-An-Overview/RSS</wfw:commentRss>
      <category>Project Detroit</category>
    </item>
  <item>
      <title>Project Detroit: How to Read Your Car’s Engine Data with OBD-II</title>
      <description><![CDATA[<p>In this article we will look at the OBD-II sub-system and instrument cluster application of the Project Detroit Mustang we built with West Coast Customs.&nbsp; If you're not familiar with this project, you can find out more about it <a href="http://channel9.msdn.com/coding4fun/detroit">here</a> and <a href="http://channel9.msdn.com/Blogs/Vector/The-400-horsepower-device">here</a>.</p><h2>OBD-II</h2><p>OBD stands for On-Board Diagnostics.&nbsp; In the world of cars, this can be thought of as the computer which has a variety of data points which can be queried, such as speed, fuel level, and even trouble codes that relate to the check engine light.&nbsp; If you've ever taken your car in for service, your service center has hooked up the car to a computer via the OBD port to get the status of the car and what may not be working properly.</p><h2>Getting Started</h2><p>To use the OBD library with your vehicle, first you need an OBD to USB or serial cable.&nbsp; These can be found in numerous places, but we recommend <a href="http://www.scantool.net/scan-tools/pc-based/obdlink-sx.html">this cable from ScanTool.net</a>, which was used with the <a href="http://channel9.msdn.com/coding4fun/detroit">Project Detroit</a> car and our software.&nbsp; Here's how to get connected:</p><ol><li>With the car off, plug the OBD end into your vehicle.&nbsp; The port is in a different location in every vehicle, but it's guaranteed to be somewhere near the driver's location. <a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/IMG_05456.jpg"><img title="IMG_0545" border="0" alt="IMG_0545" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/IMG_0545_thumb3.jpg" width="444" height="219"></a> </li><li>Plug the USB/serial end of the cable into your computer and note which COM port the cable is connected to. </li><li>Update the <strong>app.config</strong> file of the <strong>InstrumentCluster</strong> project with that COM port. </li><li>Start the car. </li><li>Run the <strong>InstrumentCluster</strong> application, and data should start flowing. </li></ol><h2>Calling the OBD library programmatically</h2><ul><li>Create an instance of the <strong>ObdDevice</strong> class </li><li>Call the <strong>Connect</strong> method with the appropriate COM port, baud rate, and, if known, OBD protocol </li><li>From here, the library works in two ways: automatic polling or manual polling <ul><li><strong>Automatic</strong> – Pass <strong>true</strong> to the <strong>Connect</strong> method. This will poll the OBD as quickly as it can requesting RPM, MPH, MPG, Fuel Level and Engine Coolant Temperature. Note that not all vehicles will support all of these. In this mode, hook the <strong>ObdChanged</strong> event to receive an <strong>ObdState</strong> packet with the new data. </li><li><strong>Manual</strong> – Pass <strong>false</strong> to the <strong>Connect</strong> method. Then, create your own thread and call the <strong>ObdDevice</strong>'s Get methods to retrieve the data you want as quickly as you want it.&nbsp; This is the way we used the library in Project Detroit.&nbsp; We polled manually, collecting the speed, RPM, and other critical data as quickly as possible, while only reading things like fuel level every few seconds. </li></ul></li></ul><p><br>OBD is a polled system, so data can only be returned as quickly as the time it takes to request it and return it. In short, only retrieve what you need when you need it.</p><p><pre class="brush: csharp">
ObdDevice obd;

obd = new ObdDevice();
obd.ObdChanged &#43;= _obd_ObdChanged;

// com port, baud rate, protocol (if known), automatic polling
obd.Connect(&quot;COM1&quot;, 115200, ObdDevice.UnknownProtocol, true);

...

void obd_ObdChanged(object sender, ObdChangedEventArgs e)
{
    e.ObdState.ToString();
}
</pre></p><h2>Customizing the Instrument Cluster</h2><p>The Instrument Cluster application is a WPF application that has 3 different skins which can be viewed by swiping left or right in the application, either with a finger, or the mouse.&nbsp; This is a simplified version of the actual application we used in the Project Detroit car, modified to talk straight to the OBD port instead of our intermediate WCF service.&nbsp; Please note that this isn't a robust, drop-in replacement application for a car dashboard, but only a sample of how the OBD library can be used.</p><p>Internally, the application uses the OBD library and hooks the <strong>ObdChanged</strong> event.&nbsp; The <strong>ObdChanged</strong> event returns a minimal amount of important data.&nbsp; When the event fires, the the <strong>SetInstrumentClusterValues</strong> method is run, which sets the OBD values to each gauge in whichever skin is currently visible.</p><p><pre class="brush: csharp">
private void SetInstrumentClusterValues(ObdState measurement)
{
    foreach (var item in _skins)
    {
        if(!item.IsVisible)
            continue;
        item.IsMalfunctionVisible = measurement.MilLightOn;
        item.IsLowFuelVisible = item.Fuel &lt; 10;
        item.MPG = measurement.MilesPerGallon;
        item.MPH = measurement.MilesPerHour;
        item.RPM = measurement.Rpm;
        item.Fuel = measurement.FuelLevel;
        item.Temperature = measurement.EngineCoolantTemperature;
    }
}
</pre></p><p><a href="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/Download3.png"><img title="Download" border="0" alt="Download" src="http://files.channel9.msdn.com/wlwimages/1932b237046e4743a4e79e6800c0220f/Download_thumb1.png" width="644" height="364"></a></p><h2>More Information</h2><ul><li><a href="http://channel9.msdn.com/coding4fun/detroit">Project Detroit</a> </li><li><a href="http://en.wikipedia.org/wiki/OBD-II#OBD-II">More information on OBD-II</a> </li><li><a href="http://elmelectronics.com/DSheets/ELM327DS.pdf">ELM323/327 Datasheet</a> </li><li><a href="http://www.scantool.net/scan-tools/pc-based/obdlink-sx.html">OBD-II to USB cable</a> </li></ul><h2>Known Issues / Limitations</h2><ul><li>This is known to work with cables that uses the ELM323/327 chipset. The specific cable that was used to develop this library is available from <a href="http://www.scantool.net/scan-tools/pc-based/obdlink-sx.html">ScanTool.net</a>, however other ELM323/327 OBD-II to USB cables should work. </li><li>There are a variety of different <a href="http://en.wikipedia.org/wiki/On-board_diagnostics#OBD-II_Signal_Protocols">OBD-II signal protocols</a>. This library only supports a few of them. If your car's OBD protocol is not supported, please feel free to add it and send us the changes to integrate back into the library! </li><li>If the vehicle has multiple ECUs, the ECU with the most PIDs is used. The other ECUs are ignored. </li><li>Not every standard PID is supported. </li><li>No custom manufacturer/model-specific PIDs are supported. </li></ul> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/project+detroit/RSS&WT.dl=0&WT.entryid=Entry:RSSView:f307abe7cf074cacb336a02e012fba25">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-How-to-Read-Your-Cars-Engine-Data-with-OBD-II</comments>
      <itunes:summary>In this article we will look at the OBD-II sub-system and instrument cluster application of the Project Detroit Mustang we built with West Coast Customs.&amp;nbsp; If you&#39;re not familiar with this project, you can find out more about it here and here. OBD-IIOBD stands for On-Board Diagnostics.&amp;nbsp; In the world of cars, this can be thought of as the computer which has a variety of data points which can be queried, such as speed, fuel level, and even trouble codes that relate to the check engine light.&amp;nbsp; If you&#39;ve ever taken your car in for service, your service center has hooked up the car to a computer via the OBD port to get the status of the car and what may not be working properly. Getting StartedTo use the OBD library with your vehicle, first you need an OBD to USB or serial cable.&amp;nbsp; These can be found in numerous places, but we recommend this cable from ScanTool.net, which was used with the Project Detroit car and our software.&amp;nbsp; Here&#39;s how to get connected: With the car off, plug the OBD end into your vehicle.&amp;nbsp; The port is in a different location in every vehicle, but it&#39;s guaranteed to be somewhere near the driver&#39;s location.  Plug the USB/serial end of the cable into your computer and note which COM port the cable is connected to. Update the app.config file of the InstrumentCluster project with that COM port. Start the car. Run the InstrumentCluster application, and data should start flowing. Calling the OBD library programmaticallyCreate an instance of the ObdDevice class Call the Connect method with the appropriate COM port, baud rate, and, if known, OBD protocol From here, the library works in two ways: automatic polling or manual polling Automatic – Pass true to the Connect method. This will poll the OBD as quickly as it can requesting RPM, MPH, MPG, Fuel Level and Engine Coolant Temperature. Note that not all vehicles will support all of these. In this mode, hook the ObdChanged event to receive an ObdState packet with the new data. Manual</itunes:summary>
      <link>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-How-to-Read-Your-Cars-Engine-Data-with-OBD-II</link>
      <pubDate>Mon, 09 Apr 2012 19:24:20 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/articles/Project-Detroit-How-to-Read-Your-Cars-Engine-Data-with-OBD-II</guid>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/22cf6572-42c8-47ed-a95b-1b8b2bbe200a.png" height="56" width="100"></media:thumbnail>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/2a2ec08a-7d5d-458d-b1f6-fa8fb2ebce1d.png" height="124" width="220"></media:thumbnail>      
      <dc:creator>Brian Peek, Dan Fernandez</dc:creator>
      <itunes:author>Brian Peek, Dan Fernandez</itunes:author>
      <slash:comments>19</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/articles/Project-Detroit-How-to-Read-Your-Cars-Engine-Data-with-OBD-II/RSS</wfw:commentRss>
      <category>Coding4Fun</category>
      <category>Hardware</category>
      <category>Project Detroit</category>
    </item>
  <item>
      <title>The 400 horsepower device</title>
      <description><![CDATA[<div class="ch9 intro"><p>When web development reached critical mass in the early-mid 2000's, there was a lot of discussion about what it all meant for native development and apps that are optimized for devices, but developers' penchant for exploiting what devices can do has persisted through all of that, and it keeps getting more interesting with every passing year: devices are smarter, faster, and more packed with features than ever before.&nbsp;Gone are the days when developers had to wait patiently for hardware to catch up to software.&nbsp;Now it's the other way around, and it's great for developers, who just can't seem to get enough of cameras, accelerometers, location sensors, touch screens, gesture inputs, voice inputs, and a bevy of other previously-unheard-of coolness.&nbsp;&nbsp; Even Steve Jobs got an education in this undercurrent as Apple brought the iPhone to market ... if you've read Walter Issacson's <a href="http://www.amazon.com/Steve-Jobs-Walter-Isaacson/dp/1451648537">book</a>, you know the story: Jobs was of course maniacal about user experience, and was adamantly opposed to the idea of third-party developers messing things up with native apps.&nbsp;Subsequently, the iPhone comes to market with a lot of fanfare about Safari and web mobility, but once developers understood what the device could do, it began a mini-standoff that resulted in a November 2007 capitulation <a href="http://www.macrumors.com/2007/10/17/steve-jobs-announces-3rd-party-sdk-for-iphone-for-february-2008/">blog post</a>, promising developers an SDK for iPhone and iPod Touch.&nbsp;The rest, of course, is history.</p><p>Since then, we've seen the term &quot;device&quot; take on all sorts of different meanings ... most people think of it as a smartphone, or a PC, or a tablet, or a game console to name a few form factors, not to mention the embedded world of ATMs, traffic lights, and sensor networks. &nbsp;But anything with a microprocessor can run software, and as things get smaller and more modular, the sky's the limit in terms of developer creativity and imagination, which brings us to today's post. Jeff Sandquist and the Channel 9 team have been busy with a project that we've talked about since September, and for lots of folks, it will reshape how you think about what a device is, where it goes, how it gets integrated into things you use today, and (in this case) how amazing it can be when it's done right <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif?v=c9' alt='Smiley' />.</p><p>Thanks – Tim&nbsp;</p></div><p><a href="http://channel9.msdn.com/coding4fun/detroit"><img src="http://files.channel9.msdn.com/thumbnail/c0643d11-85be-4d0b-ba6f-71d12fdce740.jpg" alt="See the Project Detroit Infographic"></a></p><p>Those of you who attended or watched <a href="http://www.microsoft.com/presspass/events/build/videogallerytwo_5.aspx">BUILD</a> last September may recall a project that Dan, Clint and I have been working on with the guys at <a href="http://westcoastcustoms.com/">West Coast Customs</a>. Against the odds, and perhaps against our better judgment in terms of sleeping hours, we set out to see what was possible when you combine some of the world's most innovative technology, the latest in cloud connectivity and raw American auto muscle. What would it look like if you could take Windows, Windows Phone, Windows Azure, Xbox, Kinect, Bing - you name it - and put it all together into one iconic car? &nbsp;Well, we're excited to announce that the experiment is complete and &quot;Project Detroit&quot; will be unveiled to the world this Sunday, March 25 at 9:00 p.m. PT/ET on <a href="http://channel9.msdn.com/coding4fun/blog/Coding-4-Fun-On-Inside-West-Coast-Customs">Discovery's Velocity Network</a>.</p><p>To say that this has been a labor of love is an understatement. To do this right we knew that we needed to work with the best and the only option was West Coast Customs. Along with Ryan Friedlinghaus and his crew, we started with a 2012 Mustang, retrofitted it with Dynacorn's 1967 Mustang fastback replica body.&nbsp;From there, we piled on Microsoft's latest technologies, many of which have never been used in automotive applications. We created heads-up displays with augmented reality in the windshield. We put a Kinect on the front and a Kinect in the rear for skeletal tracking and live streaming video feeds. We added swipe-able touchscreen dashboard displays and then we tied it all together with Windows Azure in the cloud and Windows Phone applications to control it all. And that's just the beginning.</p><p><a href="http://files.channel9.msdn.com/thumbnail/09615539-1a33-49f7-b438-ca1b9543d712.jpg" rel="lightbox"><img src="http://files.channel9.msdn.com/thumbnail/a14e5a72-0074-4045-a30f-ea3b52be1e2b.jpg" alt=""></a><br>(<a href="http://files.channel9.msdn.com/thumbnail/b3fe584e-924d-4fa6-b692-d57eb8eaf65e.jpg">want a really big version of this picture?</a> It makes a great desktop&nbsp;background <img src='http://ecn.channel9.msdn.com/o9/content/images/emoticons/emotion-1.gif?v=c9' alt='Smiley' /> )</p><p>To really understand how it all came together, you have to watch the <a href="http://velocity.discovery.com/videos/inside-west-coast-customs/">episode</a>, but to give you just a taste, here are some of the things you can expect to see:&nbsp;</p><ul><li><strong>Windows Phone Integration: </strong>Although the Mustang's design makes the car easy to spot, you can keep tabs on the car's location even when it is out of sight. Locate, unlock, and start the car all from the <a href="http://www.viper.com/SmartStart/">Viper SmartStart</a>&nbsp;app for Windows Phone.<br><a href="http://files.channel9.msdn.com/thumbnail/614ce93d-ad75-4fe3-8c49-7422a67cfbfa.jpg" rel="lightbox"><img src="http://files.channel9.msdn.com/thumbnail/bf75e905-9514-492e-ab9b-4289993a94be.jpg" alt=""></a> </li><li><strong>Built-in WIFI: </strong>To help ensure the Mustang is always online and connected to the cloud, the vehicle has a built-in 4G wireless network that supports multiple devices. </li><li><strong>Digital Instrument Cluster: </strong>Swipe the touch-screen instrument cluster and toggle between different dashboard skins including a 1967 Mustang, a 2012 Mustang and a Windows 8 Metro design style version.<br><a href="http://files.channel9.msdn.com/thumbnail/8d3f56c5-0920-408a-854b-c1d533b1d773.jpg" rel="lightbox"><img src="http://files.channel9.msdn.com/thumbnail/d7030c1e-8cf3-410c-866b-a724e06b994a.jpg" alt=""></a> </li><li><strong>Heads Up Display: </strong>Similar to what's found in fighter jets, the windshield contains a driver side and passenger side heads-up display (HUD) highlighting telemetry and Bing Maps information directly on the windshield. View nearby restaurants, shopping centers and gas stations all without taking an eye off the road. &nbsp;A passenger can play Xbox on his/her side of the windshield without distracting the driver. </li><li><strong>Ford SYNC</strong>: Up-to-the-minute traffic information, hands-free communication and even voice control applications are part of the standard Ford SYNC system that is available in Project Detroit. </li><li><strong>Entertainment System: </strong>The entertainment system comes with an Xbox 360 and a Kinect. When parked, the rear windshield can actuate up to serve as a projector screen for playing movies or video games from behind the car. </li><li><strong>External Audio System</strong>: The audio system acts as a public address system so you can speak into your phone and have the audio played through the car's external speakers. Using this system, the car also has customizable car horn &quot;ringtones&quot; that enable you to change what sound plays when the horn is honked. </li><li><strong>Kinect Integration: </strong>Front and rear Kinect cameras provide a live video feed of surrounding pedestrians and objects. You can even watch and listen to the live audio and video stream from the Kinects remotely using a Windows Phone and send a message (see below) to the external audio system like &quot;Hey skateboarders: stay away from my car.&quot; <p><a href="http://files.channel9.msdn.com/thumbnail/a68f24f0-ad9f-46a4-90fc-17806dd8e730.jpg" rel="lightbox"><img src="http://files.channel9.msdn.com/thumbnail/ff0a4f74-3f5d-4827-a036-b0f7c2828446.jpg" alt=""></a></p></li><li><strong>Cloud Powered: </strong>Using the built-in wireless network, the Mustang is able to communicate with cloud services including Bing Maps, Viper's Smart Start system as well as store real-time telemetry data such as speed, location, RPM and fuel level in Windows Azure. </li><li><strong>Customizable Rear Windshield: </strong>While driving, the rear windshield can serve as a customizable display system that can play video, show images and display custom messages, like &quot;Stop tailgating me please&quot; or something more, umm, colorful. </li></ul><p>As a community of developers you might be saying, &quot;that's great, but what does this mean for me?&quot; We started this project because we knew it would be a challenging and fun way to show what all of these technologies can do in an environment like a car. So now we not only have an incredible Mustang &quot;device&quot; to showcase what we have done, <strong>we will be making source code for the major components of the project available on CodePlex in the coming weeks.</strong></p><p>We want you to think BIG about the types of scenarios you can create. Think bigger&nbsp;– beyond the devices we hold in our hands, those that sit on our desks and the things that mount to our walls. We are so incredibly proud of this car, but we're even more proud of what it represents – ingenuity, creativity and some great demonstrations of Microsoft technologies in cool applied scenarios. Make sure you tune in Sunday, but in the meantime check out some photos and let us know what you think. &nbsp;As you know, Channel 9 is all about community and Project Detroit is only as successful as you make it.&nbsp; Get excited, download the code and create your own device powered by hardware and software.</p><p>– Jeff</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/project+detroit/RSS&WT.dl=0&WT.entryid=Entry:RSSView:6c79202727364f34b2c0a01b00492959">]]></description>
      <comments>http://channel9.msdn.com/Blogs/Vector/The-400-horsepower-device</comments>
      <itunes:summary>When web development reached critical mass in the early-mid 2000&#39;s, there was a lot of discussion about what it all meant for native development and apps that are optimized for devices, but developers&#39; penchant for exploiting what devices can do has persisted through all of that, and it keeps getting more interesting with every passing year: devices are smarter, faster, and more packed with features than ever before.&amp;nbsp;Gone are the days when developers had to wait patiently for hardware to catch up to software.&amp;nbsp;Now it&#39;s the other way around, and it&#39;s great for developers, who just can&#39;t seem to get enough of cameras, accelerometers, location sensors, touch screens, gesture inputs, voice inputs, and a bevy of other previously-unheard-of coolness.&amp;nbsp;&amp;nbsp; Even Steve Jobs got an education in this undercurrent as Apple brought the iPhone to market ... if you&#39;ve read Walter Issacson&#39;s book, you know the story: Jobs was of course maniacal about user experience, and was adamantly opposed to the idea of third-party developers messing things up with native apps.&amp;nbsp;Subsequently, the iPhone comes to market with a lot of fanfare about Safari and web mobility, but once developers understood what the device could do, it began a mini-standoff that resulted in a November 2007 capitulation blog post, promising developers an SDK for iPhone and iPod Touch.&amp;nbsp;The rest, of course, is history. Since then, we&#39;ve seen the term &amp;quot;device&amp;quot; take on all sorts of different meanings ... most people think of it as a smartphone, or a PC, or a tablet, or a game console to name a few form factors, not to mention the embedded world of ATMs, traffic lights, and sensor networks. &amp;nbsp;But anything with a microprocessor can run software, and as things get smaller and more modular, the sky&#39;s the limit in terms of developer creativity and imagination, which brings us to today&#39;s post. Jeff Sandquist and the Channel 9 team have been busy with a project that we&#39;ve talked about since</itunes:summary>
      <link>http://channel9.msdn.com/Blogs/Vector/The-400-horsepower-device</link>
      <pubDate>Wed, 21 Mar 2012 20:59:00 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/Blogs/Vector/The-400-horsepower-device</guid>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/a4e785bb-60b7-484b-b86a-30b433ec437b.png" height="56" width="100"></media:thumbnail>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/1909d162-9927-4af0-af75-2252b192c3d8.png" height="124" width="220"></media:thumbnail>
      <media:thumbnail url="http://files.channel9.msdn.com/thumbnail/0e2f849e-4cb1-45e9-a55a-c3f836adbd47.jpg" height="288" width="512"></media:thumbnail>      
      <dc:creator>Jeff Sandquist, Tim O&#39;Brien</dc:creator>
      <itunes:author>Jeff Sandquist, Tim O&#39;Brien</itunes:author>
      <slash:comments>36</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/Blogs/Vector/The-400-horsepower-device/RSS</wfw:commentRss>
      <category>Coding4Fun</category>
      <category>_techmeme</category>
      <category>Project Detroit</category>
    </item>
  <item>
      <title>Channel9/Coding4Fun On Discovery’s Inside West Coast Customs!</title>
      <description><![CDATA[<p>Earlier this year at Build, <a href="http://channel9.msdn.com/Blogs/BUILD-Conference-Highlights/A-caris-a-Device-Too">we announced</a> a partnership between the <a href="http://channel9.msdn.com/coding4fun">Channel 9/Coding4Fun</a> team and Ryan Friedlinghaus, world famous and award winning automotive designer based in Corona, California and star of the Discovery Channel's Velocity network reality TV series, <a href="http://blogs.discovery.com/velocity/2011/09/tv-shows-on-velocity.html">Inside West Coast Customs</a>.&nbsp;</p><p>Operating under the codename Project Detroit, we set out to reconstruct a 1967 Ford Mustang Fastback to be outfitted with the latest in Microsoft technology. Here is a preview of the show.&nbsp;</p><p>Tune in and set your DVRs for Sunday, March 25<sup>th</sup> at&nbsp;6pm Pacific (9pm Eastern)&nbsp;on Discovery's <a href="http://velocity.discovery.com/videos/">Velocity</a> network, followed by a worldwide debut on <a href="http://www.yourdiscovery.com/">Discovery World</a>.&nbsp; (Check your local listings for times and dates).</p><p>We can't wait for you to see it!</p><p>Brian, Clint, Dan and Jeff</p> <img src="http://m.webtrends.com/dcs1wotjh10000w0irc493s0e_6x1g/njs.gif?dcssip=channel9.msdn.com&dcsuri=http://channel9.msdn.com/Tags/project+detroit/RSS&WT.dl=0&WT.entryid=Entry:RSSView:d0d735a4e48b477abde9a0120127ac85">]]></description>
      <comments>http://channel9.msdn.com/coding4fun/blog/Coding-4-Fun-On-Inside-West-Coast-Customs</comments>
      <itunes:summary>Earlier this year at Build, we announced a partnership between the Channel 9/Coding4Fun team and Ryan Friedlinghaus, world famous and award winning automotive designer based in Corona, California and star of the Discovery Channel&#39;s Velocity network reality TV series, Inside West Coast Customs.&amp;nbsp; Operating under the codename Project Detroit, we set out to reconstruct a 1967 Ford Mustang Fastback to be outfitted with the latest in Microsoft technology. Here is a preview of the show.&amp;nbsp; Tune in and set your DVRs for Sunday, March 25th at&amp;nbsp;6pm Pacific (9pm Eastern)&amp;nbsp;on Discovery&#39;s Velocity network, followed by a worldwide debut on Discovery World.&amp;nbsp; (Check your local listings for times and dates). We can&#39;t wait for you to see it! Brian, Clint, Dan and Jeff </itunes:summary>
      <itunes:duration>30</itunes:duration>
      <link>http://channel9.msdn.com/coding4fun/blog/Coding-4-Fun-On-Inside-West-Coast-Customs</link>
      <pubDate>Mon, 12 Mar 2012 18:21:57 GMT</pubDate>
      <guid isPermaLink="false">http://channel9.msdn.com/coding4fun/blog/Coding-4-Fun-On-Inside-West-Coast-Customs</guid>
      <media:thumbnail url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser_100.jpg" height="56" width="100"></media:thumbnail>
      <media:thumbnail url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser_220.jpg" height="123" width="220"></media:thumbnail>
      <media:thumbnail url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser_512.jpg" height="288" width="512"></media:thumbnail>
      <media:group>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser.mp3" expression="full" duration="30" fileSize="488591" type="audio/mp3" medium="audio"></media:content>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser.mp4" expression="full" duration="30" fileSize="2571973" type="video/mp4" medium="video"></media:content>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser.webm" expression="full" duration="30" fileSize="1237910" type="video/webm" medium="video"></media:content>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser.wma" expression="full" duration="30" fileSize="257367" type="audio/x-ms-wma" medium="audio"></media:content>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser.wmv" expression="full" duration="30" fileSize="6677666" type="video/x-ms-wmv" medium="video"></media:content>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser_high.mp4" expression="full" duration="30" fileSize="5641303" type="video/mp4" medium="video"></media:content>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser_mid.mp4" expression="full" duration="30" fileSize="3927256" type="video/mp4" medium="video"></media:content>
        <media:content url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser_Source.wmv" expression="full" duration="30" fileSize="14897452" type="video/x-ms-wmv" medium="video"></media:content>
        <media:content url="http://smooth.ch9.ms/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser.ism/manifest" expression="full" duration="30" fileSize="5976" type="video/x-ms-wmv" medium="video"></media:content>
      </media:group>      
      <enclosure url="http://ak.channel9.msdn.com/ch9/db86/538f101c-73bc-4d82-a2f8-03d57236db86/Teaser.wmv" length="6677666" type="video/x-ms-wmv"></enclosure>
      <dc:creator>Brian Peek, Clint Rutkas, Dan Fernandez, Jeff Sandquist</dc:creator>
      <itunes:author>Brian Peek, Clint Rutkas, Dan Fernandez, Jeff Sandquist</itunes:author>
      <slash:comments>13</slash:comments>
      <wfw:commentRss>http://channel9.msdn.com/coding4fun/blog/Coding-4-Fun-On-Inside-West-Coast-Customs/RSS</wfw:commentRss>
      <category>Coding4Fun</category>
      <category>_techmeme</category>
      <category>Project Detroit</category>
    </item>    
</channel>
</rss>