<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Gadgeteer</title><link>http://blogs.msdn.com/b/net_gadgeteer/</link><description>Build all manner of electronic gadgets quickly and easily with .NET Gadgeteer</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>Upcoming Events: Seattle Mini Maker Faire and MADExpo</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/29/upcoming-events-seattle-mini-maker-faire-and-madexpo.aspx</link><pubDate>Wed, 30 May 2012 03:04:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10311643</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10311643</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/29/upcoming-events-seattle-mini-maker-faire-and-madexpo.aspx#comments</comments><description>&lt;p&gt;There are two chances to play with Gadgeteer hands-on in the next month, one on each coast of the US.&amp;#160; &lt;/p&gt;  &lt;p&gt;This weekend, June 2-3, Gadgeteer will be at the &lt;a href="http://www.makerfaireseattle.com/" target="_blank"&gt;Seattle Mini Maker Faire&lt;/a&gt;.&amp;#160; This is a hometown event for the Redmond-based portion of the Gadgeteer team, so we’ll bring as much cool stuff as we can fit in our cars.&amp;#160; It’s at Seattle Center from 10AM to 5 PM each day.&amp;#160; Makers and artists from all over the region will be there showing their creations.&amp;#160; Plus, with talks like “Unwise Microwave Oven Experiments” and “The Tesla Gun”, how can you not go?&lt;/p&gt;  &lt;p&gt;At the end of June the Mid Atlantic Developer Expo (&lt;a href="http://madexpo.us/" target="_blank"&gt;MADExpo&lt;/a&gt;) will feature sessions and demos on Gadgeteer, the .NET Micro Framework, Kinect and robotics (in addition to software development on a variety of platforms).&amp;#160; There are plenty of hands-on activities for hardware tinkerers at all levels of experience, and a parallel MADKidz mini-conference for kids.&amp;#160; Don’t miss Andrew Duthie’s talk “&lt;a href="http://madexpo.us/Sessions/364"&gt;From Coder to Maker: One software geek's journey to hardware hackery&lt;/a&gt;” – it’s very possible that he’ll pull out his Kinect-controlled model helicopter.&amp;#160; MADExpo runs from June 27-29 in Hampton Beach, VA.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10311643" width="1" height="1"&gt;</description></item><item><title>3D-Print a Custom Gadget: Open-Source 3D Models of .NET Gadgeteer Hardware</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/25/3d-print-a-custom-device-with-open-source-3d-models-of-net-gadgeteer-hardware.aspx</link><pubDate>Fri, 25 May 2012 17:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10310515</guid><dc:creator>nicvillar</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10310515</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/25/3d-print-a-custom-device-with-open-source-3d-models-of-net-gadgeteer-hardware.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7245.model_2D00_render_2D00_spread.png"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7245.model_2D00_render_2D00_spread.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today we are contributing a large number of 3D models of .NET Gadgeteer-compatible hardware modules to the &lt;a href="http://gadgeteer.codeplex.com"&gt;Gadgeteer Codeplex project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The files make it easy to design custom enclosures for Gadgeteer devices &amp;ndash; we call these &lt;i&gt;shells&lt;/i&gt;. You can import these files into the 3D design tool of your choice (such as &lt;a href="http://www.123dapp.com/"&gt;123D&lt;/a&gt;, &lt;a href="http://www.solidworks.com/"&gt;SolidWorks&lt;/a&gt;, &lt;a href="http://usa.autodesk.com/autodesk-inventor/"&gt;Inventor&lt;/a&gt; or &lt;a href="http://www.alibre.com/"&gt;Alibre&lt;/a&gt;) and use the models as reference in your shell design. This saves you the trouble of having to measure each module individually, and improves the likelihood that everything will fit nicely inside your shell once it is actually manufactured.&lt;/p&gt;
&lt;p&gt;Once you have designed a shell you can 3D-print it. If you don&amp;rsquo;t have direct access to a 3D printer, you can upload it to one of several online 3D printing services (such as &lt;a href="http://www.ponoko.com/"&gt;Ponoko&lt;/a&gt;, &lt;a href="http://www.shapeways.com/"&gt;Shapeways&lt;/a&gt; or &lt;a title="http://i.materialise.com/" href="http://i.materialise.com/"&gt;iMaterialise&lt;/a&gt;). Today we are contributing models of many of the currently available Gadgeteer modules. Not every&amp;nbsp; module is included - new modules are being released faster than we can model them! Over the coming months we will continue to add new models, and will be publishing some guidelines for others to contribute their own. We are also planning to release some ready-to-print shell designs. Below is a preview of the first one &amp;ndash; a design for a Gadgeteer plant-moisture sensor.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6180.Moisture-Sensor-Collage.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6180.Moisture-Sensor-Collage.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can find the models in STEP format under the &lt;em&gt;\3D Models\MSR Contributed\&lt;/em&gt; directory of the Gadgeteer Codeplex repository, licensed under the &lt;a href="http://creativecommons.org/licenses/by/3.0/us/"&gt;Creative Commons Attribution 3.0 license&lt;/a&gt;. Please bear in mind that although every effort has been made to make these models accurate, manufacturing tolerances and human error may mean that there may be discrepancies between the model and the actual hardware. If you do discover any issues with any of the models, please let us know by posting a bug report in the Gadgeteer Codeplex site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10310515" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/3D+Printing/">3D Printing</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/3D+Models/">3D Models</category></item><item><title>.NET Gadgeteer at Maker Faire Bay Area</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/14/net-gadgeteer-at-maker-faire-bay-area.aspx</link><pubDate>Tue, 15 May 2012 01:39:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10305148</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10305148</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/14/net-gadgeteer-at-maker-faire-bay-area.aspx#comments</comments><description>&lt;p&gt;The Gadgeteer team is packing up everything we can fit in our suitcases to show at &lt;a href="http://makerfaire.com/bayarea/2012/" target="_blank"&gt;Maker Faire Bay Area&lt;/a&gt; this weekend.&amp;#160; We’ve got all the latest modules and a lot of inspirational new projects to show.&amp;#160; If you’re in the area, stop by and say hi!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10305148" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/maker+faire/">maker faire</category></item><item><title>Assembly of the Light Sensor Robot</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/04/assembly-of-the-light-sensor-robot.aspx</link><pubDate>Fri, 04 May 2012 16:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10301051</guid><dc:creator>Mike Dodaro</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10301051</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/04/assembly-of-the-light-sensor-robot.aspx#comments</comments><description>&lt;p&gt;The idea of this project is to build a simple robot&amp;nbsp;that&amp;nbsp;demonstrates control of&amp;nbsp;motors using sensors.&amp;nbsp;It is a light seeking robot that moves towards the brightest side.&amp;nbsp;When the&amp;nbsp;brightness&amp;nbsp;on each side is the same,&amp;nbsp;the robot&amp;nbsp;moves forward.&amp;nbsp; It can be&amp;nbsp;steered with a flashlight.&amp;nbsp; See the previous posts for&lt;a href="http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/03/light-sensors-control-net-gadgeteer-robot.aspx" target="_blank"&gt; parts and tools&lt;/a&gt; and for &lt;a href="http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/03/video-of-the-light-sensor-robot.aspx" target="_blank"&gt;video of the working robot&lt;/a&gt;.&amp;nbsp; Eduardo Velloso designed the robot, and I followed his tracks to build mine.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/1777.WP_5F00_000358.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/1777.WP_5F00_000358.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Assembly instructions&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(1) Assemble the Gearbox&lt;/strong&gt;&lt;br /&gt;The instruction booklet that comes with the &lt;strong&gt;Tamiya&lt;/strong&gt; gear box provides 4 different configurations for the gearbox. The first one, &lt;strong&gt;A&lt;/strong&gt;, is the simplest, but it&amp;nbsp;doesn't have enough torque to turn the wheels. So, use the fourth assembly, &lt;strong&gt;D&lt;/strong&gt;.&amp;nbsp;&amp;nbsp;This is the most complex configuration, and it&amp;nbsp;uses all gears.&lt;/p&gt;
&lt;p&gt;Before installing the motors, solder four wires on the connectors.&amp;nbsp; The polarity has to be the same on both connections to the motor driver so the wheels will turn the same direction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(2) Mount the Gearbox on the base&lt;/strong&gt;&lt;br /&gt;In order to mount the gearbox on the base, we need to notch a bit on the sides of the plate using a side cutter. I mounted it on the third row from the top, using screws.&amp;nbsp; In the first&amp;nbsp;photo, below,&amp;nbsp;the notch is right by my thumb.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2063.WP_5F00_000334.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2063.WP_5F00_000334.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8105.WP_5F00_000332.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8105.WP_5F00_000332.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) Mount the wheels&lt;/strong&gt;&lt;br /&gt;For the small wheels, mount an eight-hole angle bracket on each side of the bottom of the plate. Use round shafts, not hexagonal.&amp;nbsp;&amp;nbsp;For the large idler wheels on the top side use a single shaft&amp;nbsp;mount. Mount the drive sprockets on the gearbox shafts, the small wheels on the bottom, and the large idler wheels on the top. Then, mount the tracks on the wheels. I was able to get the right length tracks using parts from the &lt;strong&gt;Tamiya&lt;/strong&gt; kit.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8666.WP_5F00_000336.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8666.WP_5F00_000336.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/1526.WP_5F00_000343.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/1526.WP_5F00_000343.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(4) Mount the battery holder&lt;/strong&gt;&lt;br /&gt;There are various ways to mount the battery holder.&amp;nbsp; You want to be able to remove it easily&amp;nbsp;so you can&amp;nbsp;disconnect the power to the motor driver and&amp;nbsp;so you can&amp;nbsp;change batteries.&amp;nbsp; Eduardo attached it to the plate using velcro strips and installed a shaft mount in each side to stabilize it. He also attached another velcro strip on the top of the battery holder to attach it to the top plate. I used two pieces of plastic as supports&amp;nbsp;(this was scrap plastic to&amp;nbsp;which the wheels were attached&amp;nbsp;in the Tamiya&amp;nbsp;packaging).&amp;nbsp; The vertical orange plastic supports are visible in the following photo.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7532.WP_5F00_000361.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7532.WP_5F00_000361.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(5) Mount the board on the plate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mount the hardware on a second Tamiya plate, in the following order: power module, Hydra main board, motor driver, sensors, as shown in the following photo.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2262.WP_5F00_000357.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2262.WP_5F00_000357.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I used rivets to hold the sensors horizontally. Eduardo used shaft mounts to hold them vertically.&amp;nbsp;You can&amp;nbsp;shine&amp;nbsp;a light from above on&amp;nbsp;the sensors either way.&amp;nbsp; In order to be able to adjust the angle of the sensors, mount the sensors or&amp;nbsp;shaft mounts using one push rivet; this will&amp;nbsp;attach the module or mount to the plate and allow it to rotate.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&amp;nbsp;Eduardo's vertically mounted&amp;nbsp;sensors are shown in the following photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7624.IMG_5F00_20120403_5F00_141104.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7624.IMG_5F00_20120403_5F00_141104.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;My horizontally mounted sensors are shown in the following photo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/0207.WP_5F00_000357.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/0207.WP_5F00_000357.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(6) Connect the modules and mainboard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Use&amp;nbsp;the ribbon cables, according to the Visual Studio Designer.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/5417.Designer-Modules.png"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/5417.Designer-Modules.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(7) Program the main board&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The project code can be downloaded from: &lt;a href="http://integral-data.com/robotsourcehydra.zip"&gt;http://integral-data.com/robotsourcehydra.zip&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(8) Mount the battery&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Eduardo used a velcro strip to the bottom of the plate where the hardware is mounted and also a velcro strip on the bottom of this plate to attach the battery holder and two more shaft mounts to help stabilize it.&amp;nbsp; There are batteries to drive the motors and a lithium battery to power the .NET Gadgeteer mainboard.&amp;nbsp; My&amp;nbsp;lithium&amp;nbsp;battery was a little thicker, so I set it on top of the gear box, sandwiched it between the two plates, and tied the plates with the connectors that come coiled around USB cables and other things.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;Eduardos battery connections:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8468.IMG_5F00_20120403_5F00_141544.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8468.IMG_5F00_20120403_5F00_141544.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;My battery connections:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6428.WP_5F00_000360.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6428.WP_5F00_000360.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/0361.WP_5F00_000358.jpg"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTES:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- The Hydra board is wider than the plate, so it sticks out a bit (we only attached one side to the plate).&lt;br /&gt;- Eduardo tried using two AA batteries to feed the motors, but the H-Bridge IC on this board needs at least 4.0V to start moving the motors. So, we used 4 batteries and set the motor&amp;nbsp; maximum speed at 53% (around 3V). At this setting, the robot moves a bit slowly. It shouldn't be a problem to increase this voltage a bit.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10301051" width="1" height="1"&gt;</description></item><item><title>Video of the Light Sensor Robot</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/03/video-of-the-light-sensor-robot.aspx</link><pubDate>Fri, 04 May 2012 02:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10300750</guid><dc:creator>Mike Dodaro</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10300750</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/03/video-of-the-light-sensor-robot.aspx#comments</comments><description>&lt;p&gt;This video is five minutes of the robot steered by a flashlight, not the Indy Five Hundred, but kind of cool.&lt;/p&gt;
&lt;p&gt;&lt;iframe height="315" src="http://www.youtube.com/embed/v5Sl1fkH1_A" frameborder="0" width="420" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10300750" width="1" height="1"&gt;</description></item><item><title>Light Sensors control .NET Gadgeteer Robot</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/03/light-sensors-control-net-gadgeteer-robot.aspx</link><pubDate>Thu, 03 May 2012 21:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10300601</guid><dc:creator>Mike Dodaro</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10300601</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/05/03/light-sensors-control-net-gadgeteer-robot.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Eduardo Velloso&lt;/strong&gt; built the prototype for this &lt;strong&gt;.NET Gadgeteer robot&lt;/strong&gt; that is controlled by two &lt;a href="http://www.ghielectronics.com/catalog/product/336" target="_blank"&gt;light sensor&lt;/a&gt; modules and a &lt;a href="http://www.ghielectronics.com/catalog/product/315" target="_blank"&gt;motor controller&lt;/a&gt;.&amp;nbsp;The&amp;nbsp;modules are available from &lt;a href="http://www.ghielectronics.com/" target="_blank"&gt;GHI Electronics&lt;/a&gt;. The design uses two motors that separately drive the wheels and tracks of the robot. The code monitors the difference between the light on the sensors and adjusts the speed of the motors accordingly.&amp;nbsp; You can steer the robot with a flashlight.&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color: #000000;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/3718.WP_5F00_000346.jpg"&gt;&lt;span style="background-color: #000000;"&gt;&lt;img style="margin-right: auto; margin-left: auto; display: block;" border="1" alt="Light Sensor Robot" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/3718.WP_5F00_000346.jpg" horizontalalign="center" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;This is the first installment of the assembly instructions.&amp;nbsp;I'll be updating this blog with more information and video as soon as&amp;nbsp;the glue dries on&amp;nbsp;the velcro patches that hold this thing together.&amp;nbsp;The code (see below)&amp;nbsp;and motors are working.&amp;nbsp; If you want to order parts, the following list includes everything I can think of that you'll need.&lt;/p&gt;
&lt;p&gt;You can get the .NET Gadgeteer components from &lt;a href="http://www.ghielectronics.com/" target="_blank"&gt;GHI Electronics.&lt;/a&gt;&amp;nbsp;The mechanical parts, including the track and wheel set, the motors, and gearbox,&amp;nbsp;can be purchased from &lt;a href="http://www.tamiya.com/"&gt;Tamiya&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Parts and Tools&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;- 1 FEZ Hydra mainboard: &lt;a href="http://www.ghielectronics.com/catalog/product/328"&gt;http://www.ghielectronics.com/catalog/product/328&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- USB Client SP module: &lt;a href="http://www.ghielectronics.com/catalog/product/330"&gt;http://www.ghielectronics.com/catalog/product/330&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- 1 GHI motor controller:&lt;a href="http://www.ghielectronics.com/catalog/product/315"&gt;http://www.ghielectronics.com/catalog/product/315&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- 2 GHI Light Sensor modules:&lt;a href="http://www.ghielectronics.com/catalog/product/336"&gt;http://www.ghielectronics.com/catalog/product/336&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- - 3.7 volt Kensington Battery Pack and Charger, or&amp;nbsp;Duracell Powerhouse USB Charger with Lithium ion battery; the important thing is that the battery&amp;nbsp;includes universal cable with USB and&lt;strong&gt;&lt;em&gt; mini USB&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- 4 AA Batteries&lt;/p&gt;
&lt;p&gt;- 1 4-battery holder and connector&lt;/p&gt;
&lt;p&gt;- 1 Tamiya 70157 Universal plate set (2 pcs): &lt;a href="http://www.tamiyausa.com/product/item.php?product-id=70157"&gt;http://www.tamiyausa.com/product/item.php?product-id=70157&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- 1 Tamiya 70168 Double Gearbox set: &lt;a href="http://www.tamiyausa.com/product/item.php?product-id=70168"&gt;http://www.tamiyausa.com/product/item.php?product-id=70168&lt;/a&gt;&amp;nbsp; &lt;strong&gt;Use Assembly Type D&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 1 Tamiya 70100 Track and wheel set: &lt;a href="http://www.tamiyausa.com/product/item.php?product-id=70100"&gt;http://www.tamiyausa.com/product/item.php?product-id=70100&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- 1 side cutter&lt;/p&gt;
&lt;p&gt;- 1 screwdriver&lt;/p&gt;
&lt;p&gt;- 3 velcro strips&lt;/p&gt;
&lt;p&gt;- Wires and ribbon cables&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here is a picture of the gears assembly.&amp;nbsp; Two motors are included with the kit. They&amp;nbsp;drive the wheels and tracks independently.&lt;/strong&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/3872.WP_5F00_000349.jpg"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/3872.WP_5F00_000349.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;strong&gt;The following&amp;nbsp;pictures show the robot in various stages of assembly.&lt;/strong&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7635.WP_5F00_000332.jpg"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7635.WP_5F00_000332.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/3755.WP_5F00_000334.jpg"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/3755.WP_5F00_000334.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6114.WP_5F00_000339.jpg"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6114.WP_5F00_000339.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp; &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7870.WP_5F00_000344.jpg"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7870.WP_5F00_000344.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Application Code&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;The .NET Gadgeteer application code is very simple. The Designer view and code are shown in the following sections.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8484.Designer-Modules.png"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8484.Designer-Modules.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8284.Device-Code.png"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8284.Device-Code.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10300601" width="1" height="1"&gt;</description></item><item><title>.NET Gadgeteer in Pisa, Italy; Saturday, May 12, 2012 </title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/25/net-gadgeteer-in-pisa-italy-saturday-may-12-2012.aspx</link><pubDate>Wed, 25 Apr 2012 15:05:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10297640</guid><dc:creator>Mike Dodaro</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10297640</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/25/net-gadgeteer-in-pisa-italy-saturday-may-12-2012.aspx#comments</comments><description>&lt;p&gt;A day dedicated to .NET Gadgeteer,&amp;nbsp;the hardware and software platform for designing and developing applications for embedded devices.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;The introduction of .NET Gadgeteer has greatly simplified the design of applications for embedded devices based on the .NET Micro Framework.&amp;nbsp; During the various sessions of this conference, we will illustrate&amp;nbsp;the main characteristics and objectives of .NET Gadgeteer. We will show how to&amp;nbsp;design a system, putting various hardware modules together, and show&amp;nbsp;how to easily program them, and run them on a real device. We will devote most of the day to design and development of&amp;nbsp;a complete embedded system that uses sensors, motors, and input/output peripheral devices.&amp;nbsp; After the initial assembly, we'll get to see it move independently!&lt;/p&gt;
&lt;p&gt;Saturday, May 12, 2012&lt;br /&gt;You can see the full agenda here:&lt;br /&gt;&lt;a href="http://www.dotnettoscana.org/net-micro-framework-presenta-gadgeteer.aspx"&gt;http://www.dotnettoscana.org/net-micro-framework-presenta-gadgeteer.aspx&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10297640" width="1" height="1"&gt;</description></item><item><title>Love Electronics Announces Argon R1 Mainboard for .NET Gadgeteer</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/23/love-electronics-announces-argon-r1-mainboard-for-net-gadgeteer.aspx</link><pubDate>Mon, 23 Apr 2012 22:25:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10296887</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10296887</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/23/love-electronics-announces-argon-r1-mainboard-for-net-gadgeteer.aspx#comments</comments><description>&lt;blockquote&gt;   &lt;p&gt;&lt;a href="https://www.loveelectronics.co.uk/" target="_blank"&gt;Love Electronics&lt;/a&gt; has announced a new Gadgeteer mainboard – the &lt;a href="https://www.loveelectronics.co.uk/Blog/22/argon-r1-new-gadgeteer-mainboard" target="_blank"&gt;Argon R1&lt;/a&gt;, which is available for preorder for £59.99.&amp;#160; The Argon R1 has some pretty impressive technical specs, including a huge amount of memory – 32MB DRAM and 128MB Flash.&amp;#160; That may seem small compared to your laptop or desktop computer, but it’s a huge amount for an embedded device and will enable the Argon R1 to store lots of photos, images and audio files.&lt;/p&gt;    &lt;p&gt;The Argon R1 supports a wide variety of Gadgeteer sockets, including the basics – GPIOs, serial, PWM, SPI and analog I/O – and some advanced features, too – LCD + touch, SD Card and CAN.&amp;#160; Also, the Argon R1 brings a new interface to the Gadgeteer world – I2S, which is used for high quality audio connections.&lt;/p&gt;    &lt;p&gt;Welcome to the Gadgeteer family, Love Electronics!&amp;#160; We’re excited to see what else you have in store.&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10296887" width="1" height="1"&gt;</description></item><item><title>.NET Gadgeteer sparks school students’ creativity in the UK Schools pilot</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/23/net-gadgeteer-sparks-school-students-creativity-in-the-uk-schools-pilot.aspx</link><pubDate>Mon, 23 Apr 2012 15:08:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10296566</guid><dc:creator>Steven Johnston</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10296566</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/23/net-gadgeteer-sparks-school-students-creativity-in-the-uk-schools-pilot.aspx#comments</comments><description>&lt;p&gt;.NET Gadgeteer has great potential in schools due to the fact that it can be used to teach students computer programming, simple electronics and also some computer-aided design. It’s also very motivating for young people to be able to build their own gadgets. A digital camera can be built in about half an hour!&lt;/p&gt;  &lt;p&gt;The first .NET Gadgeteer pilot in UK Schools took place from October 2011 to January 2012. There were eight schools involved in Cambridgeshire, Essex and Bedfordshire. The pilot was launched via a Teachers’ workshop in October, held at Microsoft Research, Cambridge. The teachers spent the afternoon building gadgets using .NET Gadgeteer and had the opportunity to talk to the Cambridge team about the programming skills they would need and how to use this with their students.&lt;/p&gt;  &lt;p&gt;The teachers then introduced .NET Gadgeteer to their schools in the form of after-school or lunchtime clubs. Each club was visited and the educational social networking tool Edmodo was used to share experiences. Lesson plans were developed for eight sessions to enable students to build a digital camera, a stop watch and a game. The students were then invited to develop a gadget of their choice to present at a final “show-and-tell” event at the end of January.&lt;/p&gt;  &lt;p&gt;The students attending the club mostly ranged from 11 to 15 years old, with one school choosing to use .NET Gadgeteer with an older group of 17 year-olds. The students worked in groups of three to one kit - .NET Gadgeteer is great for facilitating collaborative working!&lt;/p&gt;  &lt;p&gt;At the final show-and-tell event, students presented and demonstrated the gadgets that they had built during the pilot project. A competition was held and the winning school was presented with a prize.&lt;/p&gt;  &lt;p&gt;(Full article and prize winning projects: &lt;a title="http://www.netmf.com/gadgeteer/ukSchoolsPilot" href="http://www.netmf.com/gadgeteer/ukSchoolsPilot"&gt;http://www.netmf.com/gadgeteer/ukSchoolsPilot&lt;/a&gt; )&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10296566" width="1" height="1"&gt;</description></item><item><title>Accelerometer in .NET Gadgeteer Posture Sensor/Regulator</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/18/accelerometer-in-net-gadgeteer-posture-sensor-regulator.aspx</link><pubDate>Wed, 18 Apr 2012 23:15:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10295143</guid><dc:creator>Mike Dodaro</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10295143</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/18/accelerometer-in-net-gadgeteer-posture-sensor-regulator.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="3"&gt;It can be difficult to maintain awareness of posture during many hours at the computer.&amp;nbsp; &lt;b&gt;MSDN Channel 9&lt;/b&gt; last week featured&amp;nbsp;a &lt;b&gt;.NET Gadgeteer&lt;/b&gt; device, the &lt;/span&gt;&lt;a href="http://channel9.msdn.com/coding4fun/blog/Mom-always-said-Sit-up-straight-Well-heres-a-hardware-project-to-help-with-that"&gt;&lt;span style="color: #0000ff; font-family: Calibri; font-size: small;" face="Calibri" size="3" color="#0000ff"&gt;Accelerometer Posture Sensor/Regulator&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;, that could prevent&amp;nbsp;the malady that afflicts numerous technology workers.&amp;nbsp; This device alerts the wearer when posture is not upright in a position conducive to a healthy neck and spine.&amp;nbsp; There are two versions of the device, one that flashes a LED when the user slumps, and another that turns on a buzzer that will either maintain good posture or make the wearer deaf.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10295143" width="1" height="1"&gt;</description></item><item><title>Coming Soon: .NETMF 4.2 Support + Visual Basic</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/11/coming-soon-netmf-4-2-support-visual-basic.aspx</link><pubDate>Wed, 11 Apr 2012 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10291307</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10291307</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/11/coming-soon-netmf-4-2-support-visual-basic.aspx#comments</comments><description>&lt;p&gt;Gadgeteer support for .NET Micro Framework 4.2 is on the way, which means you'll soon be able to run Gadgeteer on .NETMF 4.2-compatible mainboards like GHI's &lt;a href="http://www.ghielectronics.com/catalog/product/349" target="_blank"&gt;Fez Cerberus&lt;/a&gt;.&amp;nbsp; This update also enables Gadgeteer apps to be written using Visual Basic (Visual Studio or Visual Basic 2010 Express).&lt;/p&gt;
&lt;p&gt;A beta version of GadgeteerCore is now available on &lt;a title="http://gadgeteer.codeplex.com" href="http://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/Codeplex" target="_blank"&gt;Codeplex&lt;/a&gt;&amp;nbsp;for people who want an early peek.&amp;nbsp; Most Gadgeteer modules and mainboards still&amp;nbsp;target NETMF 4.1 so most users won't&amp;nbsp;see anything changed&amp;nbsp;- your existing projects will continue to work as they currently do and you can still create new .NETMF 4.1 compatible projects.&amp;nbsp; If you have a Cerberus and you're feeling adventurous, though, you can try creating a Gadgeteer NETMF 4.2 project.&amp;nbsp; One warning:&amp;nbsp;mainboards and modules won't show up in the designer for NETMF 4.2 apps until their drivers are updated, so you'll need to add references to module assemblies and instantiate them in code.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If you're building Gadgeteer-compatible hardware, you'll need to update your mainboard or module driver to provide NETMF 4.2-compatible assemblies.&amp;nbsp; The changes are minor and are detailed in updated versions of the &lt;a href="http://gadgeteer.codeplex.com/releases/view/72208" target="_blank"&gt;Mainboard and Module Builder's Guides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you take the plunge, please check the 2.42.600 Release Notes for changes and known issues - and please let us know if you run into any problems by logging them in the &lt;a href="http://gadgeteer.codeplex.com/workitem/list/basic" target="_blank"&gt;Issue Tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;** Quick Update:&amp;nbsp; Visual Basic 2010 Express support didn't make it into this beta, but it will be included in the next one.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10291307" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/netmf4-2/">netmf4.2</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/visual+basic/">visual basic</category></item><item><title>Twelve New Modules From GHI</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/06/twelve-new-modules-from-ghi.aspx</link><pubDate>Fri, 06 Apr 2012 20:09:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10291533</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10291533</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/06/twelve-new-modules-from-ghi.aspx#comments</comments><description>&lt;p&gt;GHI announced 12 new modules today which open up a lot of new projects for .NET Gadgeteers.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/356"&gt;VideoOut&lt;/a&gt;&lt;/b&gt;:&amp;#160; VGA and RCA video output&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/365"&gt;OBD II&lt;/a&gt;:&lt;/b&gt;&amp;#160; Interface with car computers&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/358"&gt;HD44780 Display&lt;/a&gt;&lt;/b&gt;:&amp;#160; 16x2 and 20x4 character displays&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/361"&gt;MaxO&lt;/a&gt;&lt;/b&gt;:&amp;#160; chainable output extender for “S” type sockets.&amp;#160; 1 module extends a single socket to expose 32 GPIOs.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/363"&gt;IO60P16&lt;/a&gt;&lt;/b&gt;:&amp;#160; Another I/O extender.&amp;#160; This one turns one “X” type socket into 60 GPIOs with interrupt capability.&amp;#160; 16 of them can be controlled using PWM (handy for servo motors and 80’s style video game music)&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/370"&gt;RED LED Matrix&lt;/a&gt;&lt;/b&gt;:&amp;#160; 8x8 array of red LEDs which can be individually controlled.&amp;#160; DaisyLinkable, so you can chain several of these together.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/364"&gt;Load Module&lt;/a&gt;&lt;/b&gt;:&amp;#160; Seven switches designed to control high current loads, up to 3A and 30V.&amp;#160; Can be used to turn on/off relays, motors, etc.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/360"&gt;IR Receiver with remote&lt;/a&gt;&lt;/b&gt;:&amp;#160; Detects infrared signals coming from a remote control (remote included, and will work with many TV remotes too)&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/359"&gt;MicroSD Card&lt;/a&gt;&lt;/b&gt;:&amp;#160; A much smaller version of the SD Card module designed for MicroSD cards&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/357"&gt;Passive Infrared Motion Detector&lt;/a&gt;&lt;/b&gt;:&amp;#160; Detects motion over a wide field of view&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/366"&gt;RFID Reader&lt;/a&gt;&lt;/b&gt;:&amp;#160; Read RFID tags&lt;/p&gt;    &lt;p&gt;&lt;b&gt;&lt;a href="http://www.ghielectronics.com/catalog/product/355"&gt;RS232 Module&lt;/a&gt;&lt;/b&gt;:&amp;#160; Converts any “U” or “K” socket to an RS232 serial port&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here’s a nice group shot of a few of them:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.tinyclr.com/images/uploads/63976_large.jpg" width="613" height="338" /&gt;&lt;/p&gt;  &lt;p&gt;Some are available immediately at &lt;a href="http://www.ghielectronics.com/catalog/category/265/"&gt;http://www.ghielectronics.com/catalog/category/265/&lt;/a&gt;.&amp;#160; A few will ship late April or mid-May.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10291533" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/modules/">modules</category></item><item><title>Beta Driver for GHI Electronics Bluetooth Module</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/04/beta-driver-for-bluetooth-module-from-seeed-studio.aspx</link><pubDate>Tue, 03 Apr 2012 23:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10290560</guid><dc:creator>Mike Dodaro</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10290560</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/04/beta-driver-for-bluetooth-module-from-seeed-studio.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Eduardo Velloso&lt;/strong&gt; has implemented a beta driver for the &lt;strong&gt;Bluetooth module&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;.&amp;nbsp; The driver makes the &lt;strong&gt;Bluetooth&lt;/strong&gt; module discoverable from &lt;strong&gt;Windows Devices &amp;amp; Printers&lt;/strong&gt; and other &lt;strong&gt;Bluetooth&lt;/strong&gt; devices.&amp;nbsp; The source code can be found at&amp;nbsp;&lt;a href="https://gadgeteerbluetooth.codeplex.com/" target="_blank"&gt;https://gadgeteerbluetooth.codeplex.com/&lt;/a&gt; .&amp;nbsp; The solution includes the driver implementation code and a test project using &lt;strong&gt;.NET Gadgeteer&lt;/strong&gt;.&amp;nbsp; For more information, see &lt;a href="http://eduardovelloso.com/" target="_blank"&gt;Eduardo Velloso&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Eduardo has also created a test scenario that demonstrates communication between two &lt;strong&gt;Bluetooth&lt;/strong&gt; devices built on &lt;strong&gt;.NET Gadgeteer&lt;/strong&gt;.&amp;nbsp; For details, see &lt;a href="http://eduardovelloso.com/2012/04/03/bluetooth-communication-with-net-gadgeteer/"&gt;http://eduardovelloso.com/2012/04/03/bluetooth-communication-with-net-gadgeteer/&lt;/a&gt; .&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10290560" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/Bluetooth/">Bluetooth</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/wireless+data/">wireless data</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/-NET+Gadgeteer/">.NET Gadgeteer</category></item><item><title>Preorder Available for "Getting Started With .NET Gadgeteer" </title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/03/preorder-available-for-quot-getting-started-with-net-gadgeteer-quot.aspx</link><pubDate>Tue, 03 Apr 2012 19:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10290506</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10290506</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/04/03/preorder-available-for-quot-getting-started-with-net-gadgeteer-quot.aspx#comments</comments><description>&lt;p&gt;The very first book on .NET Gadgeteer, Simon Monk's "Getting Started With .NET Gadgeteer" is available for pre-order from O'Reilly Press and other booksellers.&amp;nbsp;In addition to introducing core Gadgeteer concepts, it contains several project walkthroughs:&amp;nbsp;a camera backup device, a game, a Web picture messenger and more.&lt;/p&gt;
&lt;p&gt;See more at the book's Web site:&amp;nbsp; &lt;a href="http://www.gadgeteerbook.com/home"&gt;http://www.gadgeteerbook.com/home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10290506" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/book/">book</category></item><item><title>.NET Gadgeteer for stratospheric instrument platforms</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/03/12/net-gadgeteer-for-stratospheric-instrument-platforms.aspx</link><pubDate>Mon, 12 Mar 2012 17:51:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10281495</guid><dc:creator>Steven Johnston</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10281495</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/03/12/net-gadgeteer-for-stratospheric-instrument-platforms.aspx#comments</comments><description>&lt;p&gt;The Ingenia is a publication from the &lt;a href="http://www.raeng.org.uk/"&gt;Royal Academy of Engineering&lt;/a&gt; and the &lt;a href="http://www.ingenia.org.uk/ingenia/contents.aspx?Issue=50"&gt;50th issue&lt;/a&gt; is running an article on the &lt;a href="http://www.southampton.ac.uk/~astra/"&gt;ASTRA&lt;/a&gt; project which uses .NET Gadgeteer! [&lt;a href="http://www.ingenia.org.uk/ingenia/issues/issue50/Sobester.pdf"&gt;PDF&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt;&lt;img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="http://www.soton.ac.uk/~astra/astraimages/atom_m.jpg" width="238" height="259" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;(Image: ASTRA homepage, University of Southampton,&amp;#160; &lt;a title="http://www.southampton.ac.uk/~astra/diary.html" href="http://www.southampton.ac.uk/~astra/diary.html"&gt;http://www.southampton.ac.uk/~astra/diary.html&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;The ASTRA project aims to demonstrate a capability to put sensors into the Stratosphere and then retrieve the payloads at the end of the mission. Along with flying commodity hardware such as a Windows Phone 7, the project focuses on rapid prototyping, for both the casing and the electronics. The current version (ready to fly and awaiting favourable weather) uses .NET Gadgeteer as a data logger and sensor platform in a 3d printed casing. (The latest version is only a 10cm cube)&lt;/p&gt;  &lt;p&gt;Links&lt;/p&gt;  &lt;p&gt;ASTRA project : &lt;a title="http://www.southampton.ac.uk/~astra/" href="http://www.southampton.ac.uk/~astra/"&gt;http://www.southampton.ac.uk/~astra/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;50th Ingenia article : &lt;a title="http://www.ingenia.org.uk/ingenia/contents.aspx?Issue=50" href="http://www.ingenia.org.uk/ingenia/contents.aspx?Issue=50"&gt;http://www.ingenia.org.uk/ingenia/contents.aspx?Issue=50&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;PDF link : &lt;a title="http://www.ingenia.org.uk/ingenia/issues/issue50/Sobester.pdf" href="http://www.ingenia.org.uk/ingenia/issues/issue50/Sobester.pdf"&gt;http://www.ingenia.org.uk/ingenia/issues/issue50/Sobester.pdf&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10281495" width="1" height="1"&gt;</description></item><item><title>.NET Gadgeteer will be at SIGCSE</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/02/28/net-gadgeteer-will-be-at-sigcse.aspx</link><pubDate>Tue, 28 Feb 2012 14:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10275184</guid><dc:creator>Steven Johnston</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10275184</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/02/28/net-gadgeteer-will-be-at-sigcse.aspx#comments</comments><description>&lt;p&gt;This week we will be taking .NET Gadgeteer to the &lt;strong&gt;ACM Special Interest Group on Computer Science Education (&lt;a href="http://www.sigcse.org/sigcse2012/"&gt;SIGCSE&lt;/a&gt;)&lt;/strong&gt; which &lt;em&gt;“provides a forum for educators to discuss issues related to the development, implementation, and/or evaluation of computing programs, curricula, and courses, as well as syllabi, laboratories, and other elements of teaching and pedagogy&lt;/em&gt;.”&lt;/p&gt;  &lt;p&gt;We are part of the Microsoft booth and will be showing a few prebuild .NET Gadgeteer demos, but more importantly this is a great opportunity to meet some of the .NET Gadgateer team, so if you will be attending SIGCSE please drop by the stand and have a chat. We are interested to hear how you think .NET Gadgeteer can be used as well as how you think we can improve in the future. &lt;/p&gt;  &lt;p&gt;We are at booth 309 check the timetable for other demos:&amp;#160; &lt;a title="http://research.microsoft.com/en-us/events/sigcse2012/" href="http://research.microsoft.com/en-us/events/sigcse2012/"&gt;http://research.microsoft.com/en-us/events/sigcse2012/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Links&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;SIGCSE:&amp;#160; &lt;a title="http://www.sigcse.org/sigcse2012/" href="http://www.sigcse.org/sigcse2012/"&gt;http://www.sigcse.org/sigcse2012/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10275184" width="1" height="1"&gt;</description></item><item><title>Internet of Things Day at SICS</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/02/28/internet-of-things-day-at-sics.aspx</link><pubDate>Tue, 28 Feb 2012 10:35:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10273829</guid><dc:creator>Steven Johnston</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10273829</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/02/28/internet-of-things-day-at-sics.aspx#comments</comments><description>&lt;p&gt;We were lucky enough to be invited to present .NET Gadgeteer at the Internet of Things (IoT) day in Stockholm held at the Swedish Institute of Computer Science (SICS) earlier this month. The event was focused around networking the ‘things’ that surround us; basically making everything internet addressable. (How exciting!)&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.sics.se/files/IoT-Day12-440.jpg" width="302" height="201" /&gt;&lt;/p&gt;  &lt;p&gt;(Image: &lt;a title="http://www.sics.se/Internet_of_Things_Day" href="http://www.sics.se/Internet_of_Things_Day"&gt;http://www.sics.se/Internet_of_Things_Day&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;IoT involves interface/interaction design, networking, big data management and of course embedded systems. Since .NET Gadgeteer is a great platform for rapidly designing and building prototypes, we believe it is ideal for developing many of the next IoT concepts. Along with a presentation (&lt;a href="http://www.sics.se/Internet_of_Things_Day"&gt;slides&lt;/a&gt;) we took along a large box of modules for people to have a play with and ran a quick demo showing the Visual Studio designer in action. &lt;/p&gt;  &lt;p&gt;Thank you for the overwhelming response, and flurry of questions, and sorry to those that did not have time to ask questions. For those interested in more module information (the most common question) check the product showcase to see the hardware made by all manufacturers. (.NET Gadgeteer is an open-source toolkit, many manufacturers are participating) &lt;a href="http://www.netmf.com/gadgeteer/showcase.aspx?showcaseid=1"&gt;http://www.netmf.com/gadgeteer/showcase.aspx?showcaseid=1&lt;/a&gt;. Also remember that .NET Gadgeteer is designed to be truly extensible, have a look at the &lt;a href="http://gadgeteer.codeplex.com/releases"&gt;.NET Gadgeteer Module Builder's Guide version&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Links:&lt;/p&gt;  &lt;p&gt;Internet of Things Day at SICS (&lt;a name="OLE_LINK2"&gt;&lt;/a&gt;&lt;a name="OLE_LINK1"&gt;&lt;/a&gt;&lt;a href="http://www.sics.se/Internet_of_Things_Day"&gt;http://www.sics.se/Internet_of_Things_Day&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Twitter account: &lt;a href="http://twitter.com/#!/SIoTCentre"&gt;@siotcentre&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10273829" width="1" height="1"&gt;</description></item><item><title>Taking Gadgeteer to school</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/02/23/taking-gadgeteer-to-school.aspx</link><pubDate>Thu, 23 Feb 2012 20:10:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10271701</guid><dc:creator>Colin Miller</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10271701</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/02/23/taking-gadgeteer-to-school.aspx#comments</comments><description>&lt;p&gt;There is a great volunteer program where Microsoft engineers are paired with teachers in the local high schools to increase the availability of engineering curriculum for the students.&amp;#160; Basically the teacher provides the teaching skills and the Microsoft employee provides the technical skills.&amp;#160; When I heard about this, I thought it was a good place to introduce the Gadgeteer platform.&amp;#160; It may be just me but I find building things that do stuff more engaging than writing ‘Hello, World’ on the screen of a computer.&amp;#160; So I went to the folks who run the volunteer program and gave them my Gadgeteer pitch. The response was predictable - “If you think this is a great way to teach programming, are you willing to try it yourself?”.&amp;#160; And so I did.&lt;/p&gt;  &lt;p&gt;Last fall I started teaching one class a day at the high school near my house on the way in to work&amp;#160; – Intro to Computer Science.&amp;#160; The class is one semester long and I have recently finished the first semester and started in on the second.&amp;#160; This seems like a good time to share my experiences in using Gadgeteer to teach programming in C# to novices.&amp;#160; &lt;/p&gt;  &lt;p&gt;I thought that C# and Visual Studio and Gadgeteer all up is a pretty big first step so I decided to start with a 4 week module using &lt;a title="Scratch" href="http://scratch.mit.edu/" rel="Scratch" target="_blank"&gt;Scratch&lt;/a&gt; from MIT&amp;#160; - a visual programming language – to introduce the basics of programming like variables and loops and conditional logic.&amp;#160; Once we completed that, I introduced the Gadgeteer environment. We started with simple projects like controlling an LED with a potentiometer that reintroduced the programming elements that they learned in Scratch with C# syntax.&amp;#160; The process culminated in the final project – a fully functional digital camera.&amp;#160; Drawing inspiration from the fact that last year was the 100th anniversary of the brownie box camera, we laser cut them some camera boxes that looked like this picture.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/8463.WP_5F00_000211_5F00_70D6AAF8.jpg"&gt;&lt;img style="display: inline;" title="WP_000211" border="0" alt="WP_000211" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/3276.WP_5F00_000211_5F00_thumb_5F00_576EA7BE.jpg" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;Here are some pictures of the students building out their cameras&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/6013.WP_5F00_000262_5F00_694B3B8B.jpg"&gt;&lt;img style="display: inline;" title="WP_000262" border="0" alt="WP_000262" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/6835.WP_5F00_000262_5F00_thumb_5F00_101951CC.jpg" width="264" height="199" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/8562.WP_5F00_000266_5F00_08FA1554.jpg"&gt;&lt;img style="display: inline;" title="WP_000266" border="0" alt="WP_000266" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/0243.WP_5F00_000266_5F00_thumb_5F00_2FC82B94.jpg" width="195" height="259" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/1541.WP_5F00_000268_5F00_28A8EF1C.jpg"&gt;&lt;img style="display: inline;" title="WP_000268" border="0" alt="WP_000268" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/5736.WP_5F00_000268_5F00_thumb_5F00_6872D5A1.jpg" width="260" height="196" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The functionality in the final products included using the touch screen for the user input, bringing up menus for saving pictures, saving them off to the SD card and managing those files. Here is a picture showing some of one student’s code.&amp;#160; Not bad for a first programming class.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/1538.WP_5F00_000270_5F00_76451B9C.jpg"&gt;&lt;img style="margin-right: auto; margin-left: auto; float: none; display: block;" title="WP_000270" border="0" alt="WP_000270" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44-metablogapi/3276.WP_5F00_000270_5F00_thumb_5F00_360F0222.jpg" width="418" height="315" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This semester, we are looking at augmenting this with a weather station/irrigation system. Next year we are hoping to have a robotics section.&amp;#160; &lt;/p&gt;  &lt;p&gt;Here are some comments from the students at the end of the first semester:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“I thought overall this semester was a success.&amp;#160; It got really confusing sometimes but once you got it, it was awesome.”&lt;/p&gt;    &lt;p&gt;“Overall it was a great learning experience for me and has helped me to want to get into the computer field more.”&lt;/p&gt;    &lt;p&gt;“I would much rather this class be a year long instead of a semester.”&lt;/p&gt;  &lt;/blockquote&gt;  &lt;p&gt;Here are some thoughts of my own.&amp;#160; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Gadgeteer is engaging to those with even a modest interest in making things work.&amp;#160; It was great to see the pride the students took in getting their cameras home to show them off.&amp;#160; &lt;/p&gt;    &lt;p&gt;Gadgeteer’s higher level libraries and especially the wizard allow you to jump start the students into being productive immediately on simple tasks.&lt;/p&gt;    &lt;p&gt;However, once you get beyond fairly simple tasks, you are now learning C# and using Visual Studio.&amp;#160; There is no alternative to learning C# semantics and Visual Studio rudiments which can be daunting for novices.&amp;#160; It pays to generate small projects that each introduce a single new element such as branching statements of various types, events and methods, etc.&amp;#160; &lt;/p&gt;    &lt;p&gt;I agree with the last student comment that to really start to master programming in C# will take more than a semester.&amp;#160; That leads you into a discussion of what the right objective for an introductory class is.&amp;#160; By making it a semester, it allows you to bring in more kids who are not necessarily bound for a CS degree in college but for whom the exposure to how things are made and to ‘computational thinking’ is beneficial in other realms.&amp;#160; Here is an interesting article on the value of computational thinking for non-programmers - &lt;a title="http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf" href="http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf"&gt;http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf&lt;/a&gt;.&amp;#160; So, the benefits of Gadgeteer are not just that it makes it easier to get programmers started making interesting things – it also allows a broader set to students to be exposed to a computational approach to problem solving.&lt;/p&gt;  &lt;/blockquote&gt;  &lt;p&gt;The good news is that Gadgeteer is spreading.&amp;#160; I am working with teachers in other school districts on incorporation the technology in their classrooms.&amp;#160; It is making the class more exciting for some of the teachers as well as the students.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="margin: 0px; padding: 0px; float: none; display: inline;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:db6f6e01-5a88-4051-ab02-9902a07ce039" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/.NET+Gadgeteer" rel="tag"&gt;.NET Gadgeteer&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Education" rel="tag"&gt;Education&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10271701" width="1" height="1"&gt;</description></item><item><title>How to Build a Flipbook Maker: Part 3</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/01/03/how-to-build-a-flipbook-maker-part-3.aspx</link><pubDate>Wed, 04 Jan 2012 03:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10252910</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10252910</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2012/01/03/how-to-build-a-flipbook-maker-part-3.aspx#comments</comments><description>&lt;p&gt;Happy New Year!&amp;nbsp; The Gadgeteer team is back from the holidays and&amp;nbsp;we'll conclude the Flipbook Maker series this week.&amp;nbsp; In &lt;a href="http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/18/how-to-build-a-flipbook-maker-part-1.aspx"&gt;Part 1&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/21/how-to-build-a-flipbook-maker-part-2.aspx"&gt;Part 2&lt;/a&gt;&amp;nbsp;we assembled the hardware and built the basic software architecture.&amp;nbsp; This post covers using WPF to create a menuing system for the touchscreen display.&amp;nbsp; This will provide the remaining user controls - saving the movie to the SD card, deleting a frame, etc.&amp;nbsp; It will also provide visual cues like frame number and playback status.&lt;/p&gt;
&lt;h1&gt;Adding&amp;nbsp;Resource Images and Fonts to the Project&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;We'll create the onscreen buttons and UI controls from GIFs, so the first step is to those images to the FlipbookMaker Resources directory.&amp;nbsp; &lt;span style="text-decoration: line-through;"&gt;They're available in a .zip file attached to this post - with a couple of font files that the Flipbook Maker uses, too.&amp;nbsp; Unzip this FlipbookMakerResources.zip and put the files in your project's Resources directory&lt;/span&gt;.&amp;nbsp; Update:&amp;nbsp; The entire project is now attached to this post, including the solution, source code and resources.&amp;nbsp; You can&amp;nbsp;use that project and skip this section if you want.&amp;nbsp; This part is a useful reference for how to add resources to your future Gadgeteer projects, though.&lt;/p&gt;
&lt;p&gt;Now, let's register the image and font resources with the Visual Studio project.&amp;nbsp; From the Solution Explorer, open Resources.resx.&amp;nbsp; You'll see something like this with the two default Gadgeteer fonts already registered:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7002.addresources1.PNG"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7002.addresources1.PNG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click the "Add Resouces" button, choose "Add Existing Files". Navigate to the spot where you unzipped the FlipbookMaker image and font resources.&amp;nbsp; Make sure the file filter type is "*.*" so that you can add both the font and image files.&amp;nbsp; Then click "Open".&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2451.addresources2.PNG"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2451.addresources2.PNG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Setting Up the Display&lt;/h1&gt;
&lt;p&gt;Let's declare some variables to store the current playback icon, the text of the current frame number, and the WPF &lt;a href="http://msdn.microsoft.com/en-us/library/ee425309.aspx"&gt;Canvas&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ee437166.aspx"&gt;Window&lt;/a&gt; on which these objects will be rendered.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: #2b91af;"&gt; Image&lt;/span&gt;&amp;nbsp;icon;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Text&lt;/span&gt;&amp;nbsp;frameNumber;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;&amp;nbsp;canvas;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Window&lt;/span&gt;&amp;nbsp;mainWindow;&lt;/pre&gt;
&lt;p&gt;We'll also create an ArrayList of images by instantiating some of the project image resources.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;	&lt;span style="color: #2b91af;"&gt;ArrayList&lt;/span&gt;&amp;nbsp;buttons&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ArrayList&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;deleteThisButton&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetBitmap(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapResources&lt;/span&gt;.DeleteThisButton));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;deleteAllButton&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetBitmap(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapResources&lt;/span&gt;.DeleteAllButton));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;saveButton&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetBitmap(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapResources&lt;/span&gt;.SaveButton));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;cancelButton&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetBitmap(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapResources&lt;/span&gt;.CancelButton));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;buttonsVisible&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;And finally, a setup method which adds the buttons to window.&amp;nbsp; All of the buttons will default to being hidden, but they're ready to be shown when the user touches the screen.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; void&lt;/span&gt;&amp;nbsp;SetupDisplay()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mainWindow&amp;nbsp;=&amp;nbsp;display.WPFWindow;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetBitmap(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapResources&lt;/span&gt;.StartScreen));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frames.Add(cameraImage.Bitmap);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;icon&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetBitmap(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapResources&lt;/span&gt;.CALIBRATE));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frameNumber&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Text&lt;/span&gt;(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetFont(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;FontResources&lt;/span&gt;.SegoeUI_20),&amp;nbsp;&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frameNumber.ForeColor&amp;nbsp;=&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Color&lt;/span&gt;.FromRGB(0,&amp;nbsp;200,&amp;nbsp;0);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Children.Add(cameraImage);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Children.Add(icon);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Children.Add(frameNumber);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Width&amp;nbsp;=&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;)display.Width;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Height&amp;nbsp;=&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;)display.Height;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetLeft(cameraImage,&amp;nbsp;0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(cameraImage,&amp;nbsp;0);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetRight(frameNumber,&amp;nbsp;5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(frameNumber,&amp;nbsp;0);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetLeft(icon,&amp;nbsp;5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(icon,&amp;nbsp;10);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Add&amp;nbsp;and&amp;nbsp;position&amp;nbsp;menu&amp;nbsp;buttons&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Children.Add(deleteAllButton);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Children.Add(deleteThisButton);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Children.Add(cancelButton);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.Children.Add(saveButton);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetLeft(deleteAllButton,&amp;nbsp;40);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(deleteAllButton,&amp;nbsp;5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetLeft(deleteThisButton,&amp;nbsp;180);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(deleteThisButton,&amp;nbsp;5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetLeft(saveButton,&amp;nbsp;40);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(saveButton,&amp;nbsp;125);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetLeft(cancelButton,&amp;nbsp;180);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Canvas&lt;/span&gt;.SetTop(cancelButton,&amp;nbsp;125);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttons.Add(deleteThisButton);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttons.Add(deleteAllButton);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttons.Add(saveButton);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttons.Add(cancelButton);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;button&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;buttons)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.Visibility&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Visibility&lt;/span&gt;.Hidden;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonsVisible&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mainWindow.Child&amp;nbsp;=&amp;nbsp;canvas;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;A Note on Implementing Lightweight Touch Buttons in Gadgeteer&lt;/h1&gt;
&lt;p&gt;If you've worked with&amp;nbsp;WPF&amp;nbsp;or Silverlight on other systems, you're probably wondering&amp;nbsp;why&amp;nbsp;the FlipbookMaker hasn't declared any&amp;nbsp;"traditional" controls yet.&amp;nbsp; It turns out that any UIElement&amp;nbsp;subclass, including Image,&amp;nbsp;can register for touch events.&amp;nbsp;&amp;nbsp;None of&amp;nbsp;the onscreen UI needs to do anything more complicated than register touches (other program functions are controlled by&amp;nbsp;the potentiometer and hardware button).&amp;nbsp; So, this turns out to be a very straightorward way to implement a touch button.&lt;/p&gt;
&lt;p&gt;When the user taps the screen to show the menu, we'll make each button visible and register a touchDown event handler for it.&amp;nbsp; When the user dismisses the menu, we'll just hide the buttons and remove the event handlers.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; void&lt;/span&gt;&amp;nbsp;ShowButtons()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;button&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;buttons)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.Visibility&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Visibility&lt;/span&gt;.Visible;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deleteAllButton.TouchDown&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(deleteAllButton_TouchDown);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deleteThisButton.TouchDown&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(deleteThisButton_TouchDown);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saveButton.TouchDown&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(saveButton_TouchDown);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cancelButton.TouchDown&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(cancelButton_TouchDown);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mainWindow.Invalidate();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonsVisible&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;HideButtons()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;button&amp;nbsp;&lt;span style="color: blue;"&gt;in&lt;/span&gt;&amp;nbsp;buttons)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.Visibility&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Visibility&lt;/span&gt;.Hidden;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deleteAllButton.TouchDown&amp;nbsp;-=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(deleteAllButton_TouchDown);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deleteThisButton.TouchDown&amp;nbsp;-=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(deleteThisButton_TouchDown);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saveButton.TouchDown&amp;nbsp;-=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(saveButton_TouchDown);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cancelButton.TouchDown&amp;nbsp;-=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventHandler&lt;/span&gt;(cancelButton_TouchDown);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mainWindow.Invalidate();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buttonsVisible&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;&lt;br /&gt;The Touch Event Handlers&lt;/h1&gt;
&lt;p&gt;Here are the handlers for each touch event.&amp;nbsp; First is the event handler for the main window - when the user touches the screen, the menu buttons are shown.&amp;nbsp; Then, the event handlers for each button are activated, too.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;mainWindow_TouchDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventArgs&lt;/span&gt;&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;cancelButton.Visibility&amp;nbsp;==&amp;nbsp;Microsoft.SPOT.Presentation.&lt;span style="color: #2b91af;"&gt;Visibility&lt;/span&gt;.Hidden)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ShowButtons();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;cancelButton_TouchDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventArgs&lt;/span&gt;&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HideButtons();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;saveButton_TouchDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventArgs&lt;/span&gt;&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SaveFiles();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HideButtons();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;deleteThisButton_TouchDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventArgs&lt;/span&gt;&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentFrame&amp;nbsp;!=&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frames.RemoveAt(currentFrame);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Bitmap&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;)frames[currentFrame];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frameNumber.TextContent&amp;nbsp;=&amp;nbsp;currentFrame&amp;nbsp;==&amp;nbsp;0&amp;nbsp;?&amp;nbsp;&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;&amp;nbsp;:&amp;nbsp;currentFrame.ToString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.GC(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HideButtons();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;deleteAllButton_TouchDown(&lt;span style="color: blue;"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;Microsoft.SPOT.Input.&lt;span style="color: #2b91af;"&gt;TouchEventArgs&lt;/span&gt;&amp;nbsp;e)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frames&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ArrayList&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Bitmap&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.GetBitmap(&lt;span style="color: #2b91af;"&gt;Resources&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapResources&lt;/span&gt;.StartScreen);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frames.Add(cameraImage.Bitmap);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frameNumber.TextContent&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.GC(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HideButtons();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;One last thing:&amp;nbsp; Add a call to SetupDisplay to your ProgramStarted method.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;	&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;method&amp;nbsp;is&amp;nbsp;run&amp;nbsp;when&amp;nbsp;the&amp;nbsp;mainboard&amp;nbsp;is&amp;nbsp;powered&amp;nbsp;up&amp;nbsp;or&amp;nbsp;reset.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProgramStarted()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;event&amp;nbsp;handlers&amp;nbsp;for&amp;nbsp;modules&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.ButtonPressed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonEventHandler&lt;/span&gt;(button_ButtonPressed);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.BitmapStreamed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Camera&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapStreamedEventHandler&lt;/span&gt;(camera_BitmapStreamed);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sdCard.SDCardMounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardMountedEventHandler&lt;/span&gt;(sdCard_SDCardMounted);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sdCard.SDCardUnmounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardUnmountedEventHandler&lt;/span&gt;(sdCard_SDCardUnmounted);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;SetupDisplay(); &lt;/strong&gt; 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;event&amp;nbsp;handlers&amp;nbsp;for&amp;nbsp;timers,&amp;nbsp;and&amp;nbsp;start&amp;nbsp;timers&amp;nbsp;running&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(playbackTimer_Tick);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Start();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Gadgeteer.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(potentiometerCheckTimer_Tick);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Start();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Use&amp;nbsp;Debug.Print&amp;nbsp;to&amp;nbsp;show&amp;nbsp;messages&amp;nbsp;in&amp;nbsp;Visual&amp;nbsp;Studio's&amp;nbsp;"Output"&amp;nbsp;window&amp;nbsp;during&amp;nbsp;debugging.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.Print(&lt;span style="color: #a31515;"&gt;"Program&amp;nbsp;Started"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;The Home Stretch:&amp;nbsp; Saving the Movie&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;The last bit of software to implement is the SaveFiles() method.&amp;nbsp; First, adding a using directive for System.IO:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; using&lt;/span&gt;&amp;nbsp;System.IO;
&lt;/pre&gt;
&lt;p&gt;Then add the body for the SaveFiles() method, which creates a new directory for each&amp;nbsp; movie that is saved.&amp;nbsp; Only the raw bitmaps are written - converting this to an actual movie format is pretty easy to do using .NET on the desktop.&amp;nbsp; I'll add a sample of that to a later entry if there's interest.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; void&lt;/span&gt;&amp;nbsp;SaveFiles()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;dirNumber&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;baseDir&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"MyMovie"&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(SDCard&amp;nbsp;!=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Directory&lt;/span&gt;.SetCurrentDirectory(SDCard.RootDirectory);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;while&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Directory&lt;/span&gt;.Exists(baseDir&amp;nbsp;+&amp;nbsp;dirNumber))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dirNumber++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Directory&lt;/span&gt;.CreateDirectory(baseDir&amp;nbsp;+&amp;nbsp;dirNumber);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;frames.Count;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SDCard.WriteFile(baseDir&amp;nbsp;+&amp;nbsp;dirNumber.ToString()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"\\"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;"frame"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;i&amp;nbsp;+&amp;nbsp;&lt;span style="color: #a31515;"&gt;".bmp"&lt;/span&gt;,&amp;nbsp;((&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;)frames[0]).GetBitmap());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;&amp;nbsp;Phew!&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;That was a fair bit of code.&amp;nbsp; At this point you can build your FlipbookMaker and use it to start making movies.&amp;nbsp; In the next (and final) entry, we'll talk about some ways to build a neat enclosure for your FlipbookMaker.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10252910" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-25-29-10/FlipbookMaker.zip" length="46112" type="application/zip" /><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/project/">project</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/FlipbookMaker/">FlipbookMaker</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/walkthrough/">walkthrough</category></item><item><title>How to Build a Flipbook Maker:  Part 2</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/21/how-to-build-a-flipbook-maker-part-2.aspx</link><pubDate>Wed, 21 Dec 2011 17:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10249800</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10249800</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/21/how-to-build-a-flipbook-maker-part-2.aspx#comments</comments><description>&lt;p&gt;In &lt;a href="http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/18/how-to-build-a-flipbook-maker-part-1.aspx" target="_blank"&gt;Part 1&lt;/a&gt;, we assembled the hardware and created the event handlers for the Flipbook Maker.&amp;nbsp; Now let's flesh out the software foundation and create a state machine to manage the Flipbook Maker's behavior.&lt;/p&gt;
&lt;h1&gt;Storing Images&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;First, the Flipbook Maker needs a place to store the images captured by the camera. The .NET Micro Framework's &lt;a href="http://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/&lt;a href=&amp;quot;http:/msdn.microsoft.com/en-us/library/ee425013.aspx&amp;quot; target=&amp;quot;_blank&amp;quot;&gt;ArrayLis&lt;/a&gt;t" target="_blank"&gt;ArrayList&lt;/a&gt; class is great for this - it behaves like an array but it's dynamically resizable so it doesn't take up more memory than it needs at any given time.&amp;nbsp; We'll set an upper limit of 60 images, though, to prevent running out of memory.&lt;/p&gt;
&lt;p&gt;To use ArrayList, first add System.Collections to your program's using list.&amp;nbsp;&lt;/p&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections;
&lt;/pre&gt;
&lt;p&gt;Then create an ArrayList object and supporting objects&amp;nbsp;inside the Program Class:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;cameraImage;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;pictureTakingInProgress&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;p&gt;We'll also&amp;nbsp;create two TimeSpans representing&amp;nbsp;slow and fast playback speeds.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: #2b91af;"&gt; TimeSpan&lt;/span&gt;&amp;nbsp;PLAYBACK_SPEED_NORMAL&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;1000);
    &lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;&amp;nbsp;PLAYBACK_SPEED_FAST&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;300);&lt;/pre&gt;
&lt;p&gt;These timespans are specified in milliseconds,&amp;nbsp;so&amp;nbsp;the slower one equates to one frame per second and the faster one to 3.33 frames per second.&lt;/p&gt;
&lt;p&gt;Finally, one last declaration inside the Program class:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;    GT.&lt;span style="color: #2b91af;"&gt;StorageDevice&lt;/span&gt;&amp;nbsp;SDCard;
&lt;/pre&gt;
&lt;p&gt;This keeps a&amp;nbsp;reference handy to the object that manages&amp;nbsp;reads/writes to the SD card.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The event handlers for SD card mount/unmount simply need to update this reference:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; void&lt;/span&gt;&amp;nbsp;sd_SDCardMounted(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;StorageDevice&lt;/span&gt;&amp;nbsp;SDCard)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.SDCard&amp;nbsp;=&amp;nbsp;SDCard;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;sd_SDCardUnmounted(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;&amp;nbsp;sender)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.SDCard&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;Flipbook Maker Playback States&lt;/h1&gt;
&lt;p&gt;The Flipbook Maker&amp;nbsp;is built as a state machine where&amp;nbsp;the device&amp;nbsp;does different things in different&amp;nbsp;states.&amp;nbsp;&amp;nbsp;The relevant states are:&lt;/p&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; enum&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;&amp;nbsp;{&amp;nbsp;Forward,&amp;nbsp;ForwardFast,&amp;nbsp;Backward,&amp;nbsp;BackwardFast,&amp;nbsp;Stopped,&amp;nbsp;Recording,&amp;nbsp;Initializing&amp;nbsp;};
 &lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Initializing;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;These are pretty self-descriptive:&amp;nbsp; the Flipbook Maker starts in initialization mode.&amp;nbsp; After initialization, Stopped is the default playback state:&amp;nbsp;this shows the current frame (or nothing if there are no frames yet).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The active playback states let you watch your movie in forward or reverse mode, and at the slow and fast playback intervals that we defined above.&lt;/p&gt;
&lt;p&gt;Finally, the Recording mode helps you pose your shots.&amp;nbsp; While you hold the Button down, the camera will stream a live feed to the display.&amp;nbsp; This is Recording mode.&amp;nbsp; When you release the button, the last image becomes the newest frame in the movie.&amp;nbsp; The Flipbook Maker the returns to Stopped mode.&lt;/p&gt;
&lt;h1&gt;Implementing the Playback Timer&lt;/h1&gt;
&lt;p&gt;After the Flipbook Maker boots, two timers start running.&amp;nbsp; Here's the implementation for the playback timer.&amp;nbsp; It first checks whether there are frames to display and that the camera is ready (the camera takes a few second to start up and it also needs a second or two to process each picture it takes).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Then, if the current playback mode is Forward or ForwardFast, it increments the index to the current frame.&amp;nbsp; If the playback mode is Backward or BackwardFast, it decrements the current frame index.&amp;nbsp; In each case, it checks whether the index should wrap to the start or end of the picture array.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;    &lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;playbackTimer_Tick(GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(frames.Count&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!camera.CameraReady)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped&amp;nbsp;||&amp;nbsp;currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Recording)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Forward&amp;nbsp;||&amp;nbsp;currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.ForwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentFrame&amp;nbsp;&amp;gt;&amp;nbsp;frames.Count&amp;nbsp;-&amp;nbsp;1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Backward&amp;nbsp;||&amp;nbsp;currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.BackwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentFrame&amp;nbsp;&amp;lt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame&amp;nbsp;=&amp;nbsp;frames.Count&amp;nbsp;-&amp;nbsp;1&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Bitmap&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;)frames[currentFrame];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;Taking Pictures&lt;/h1&gt;
&lt;p&gt;The Button is used for capturing pictures.&amp;nbsp; Holding the button down causes live video to stream from the camera to the display.&amp;nbsp; Releasing the button (or simply pressing it without holding it down) causes the camera to take a picture and add it to the ArrayList.&lt;/p&gt;
&lt;p&gt;The ButtonPressed event handler checks that the camera is ready to take pictures and that there is room in memory to store more frames.&amp;nbsp; Then it stops the playback and potentiometer timers - this prevents any confusing playback state changes between the end of the ButtonPressed method and the camera's BitmapStreamed callback.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; void&lt;/span&gt;&amp;nbsp;button_ButtonPressed(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonState&lt;/span&gt;&amp;nbsp;state)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!camera.CameraReady)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(frames.Count&amp;nbsp;&amp;lt;=&amp;nbsp;MAXIMUM_FRAMES)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Stop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potentiometerCheckTimer.IsRunning)&amp;nbsp;potentiometerCheckTimer.Stop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Recording;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Bitmap&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;((&lt;span style="color: blue;"&gt;int&lt;/span&gt;)display.Width,&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;)display.Height);&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Give&amp;nbsp;the&amp;nbsp;camera&amp;nbsp;and&amp;nbsp;screen&amp;nbsp;a&amp;nbsp;new&amp;nbsp;bitmap&amp;nbsp;to&amp;nbsp;stream&amp;nbsp;to.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StartStreamingBitmaps(cameraImage.Bitmap);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Now the camera is streaming bitmaps.&amp;nbsp; Each time an image is sent to the mainboard, it's sent to the display if the user is holding the button down.&amp;nbsp; When the button is released, the image is inserted into the array of frames.&amp;nbsp; Then the potentiometer checker is restarted.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; void&lt;/span&gt;&amp;nbsp;camera_BitmapStreamed(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Camera&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;&amp;nbsp;bitmap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Initializing)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numBitmapsThrown++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(numBitmapsThrown&amp;nbsp;==&amp;nbsp;BITMAPS_TO_THROW)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StopStreamingBitmaps();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Invalidate();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(button.IsPressed)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;&amp;nbsp;&lt;span style="color: green;"&gt;//carry&amp;nbsp;on&amp;nbsp;streaming&amp;nbsp;pictures&amp;nbsp;to&amp;nbsp;the&amp;nbsp;screen&amp;nbsp;while&amp;nbsp;the&amp;nbsp;button&amp;nbsp;is&amp;nbsp;pressed&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frames.Insert(currentFrame,&amp;nbsp;cameraImage.Bitmap);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StopStreamingBitmaps();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;See that bit which executes if the Flipbook Maker is initializing?&amp;nbsp; The Camera module takes a few frame to callibrate its white balance.&amp;nbsp; The Flipbook Maker throws away the first few bitmaps because they tend to look washed out.&amp;nbsp; Here's a bit of support code which goes into the Program class:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: green;"&gt; //&amp;nbsp;Camera&amp;nbsp;will&amp;nbsp;calibrate&amp;nbsp;its&amp;nbsp;brightness&amp;nbsp;by&amp;nbsp;taking&amp;nbsp;some&amp;nbsp;pictures,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;which&amp;nbsp;we&amp;nbsp;throw&amp;nbsp;away.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;&amp;nbsp;throwawayBitmap&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;(320,&amp;nbsp;240);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;numBitmapsThrown&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;BITMAPS_TO_THROW&amp;nbsp;=&amp;nbsp;5;&lt;/pre&gt;
&lt;h1&gt;Implementing the Potentiometer Timer&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;The last thing we'll cover today is the implementation of the Potentiometer timer, which allows the user to play back the movies they've created.&amp;nbsp; If the potentiometer is near the middle, nothing is played back (currentMode ==&amp;nbsp;PlaybackMode.Stopped).&amp;nbsp;&amp;nbsp;When the potentiometer is turned right or left, playback starts forward or backward respectively. The amount which the potentiometer is turned determines the playback speed - far to the right is PlaybackMode.ForwardFast, and far to the left is PlaybackMode.BackwardFast.&lt;/p&gt;
&lt;p&gt;This event handler reads the Poteniometer's position relative to center.&amp;nbsp; A value of 0.0 is as far left as the Potentiometer goes, and a value of 1.0 is as far right as it goes.&amp;nbsp; 0.5 is exact center.&lt;/p&gt;
&lt;p&gt;If the FlipbookMaker is initializing, the throwaway bitmaps are taken (and thrown away).&amp;nbsp; If the camera is currently taking a picture, no playback events happen.&amp;nbsp; The rest of the handler maps various Potentiometer readings to PlaybackModes, and the PlaybackTimer is set accordingly.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt; void&lt;/span&gt;&amp;nbsp;potentiometerCheckTimer_Tick(Gadgeteer.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;potValue&amp;nbsp;=&amp;nbsp;potentiometer.ReadPotentiometerPercentage();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Initializing)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(camera.CameraReady)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StartStreamingBitmaps(throwawayBitmap);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(pictureTakingInProgress)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.40&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Backward)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Backward;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_NORMAL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.BackwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.BackwardFast;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_FAST;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.60&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Forward)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Forward;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_NORMAL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.85)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.ForwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.ForwardFast;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_FAST;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.55&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.45)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Stop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;The Flipbook Maker to So Far and What's Next&lt;/h1&gt;
&lt;p&gt;In Part 3, we'll implement the WPF-based UI for the touchscreen menu.&amp;nbsp; In the process, we'll also enable the Flipbook Maker to save images to disk, delete frames which didn't turn out quite right, or clear the entire movie and start over.&lt;/p&gt;
&lt;p&gt;For convenience, here's the entire program to date:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Threading;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Presentation;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Presentation.Controls;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Presentation.Media;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Touch;
 
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Gadgeteer.Networking;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;GT&amp;nbsp;=&amp;nbsp;Gadgeteer;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;GTM&amp;nbsp;=&amp;nbsp;Gadgeteer.Modules;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Gadgeteer.Modules.GHIElectronics;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;FlipbookMaker
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;StorageDevice&lt;/span&gt;&amp;nbsp;SDCard;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;enum&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;&amp;nbsp;{&amp;nbsp;Forward,&amp;nbsp;ForwardFast,&amp;nbsp;Backward,&amp;nbsp;BackwardFast,&amp;nbsp;Stopped,&amp;nbsp;Recording,&amp;nbsp;Initializing&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Initializing;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ArrayList&lt;/span&gt;&amp;nbsp;frames&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;ArrayList&lt;/span&gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;currentFrame&amp;nbsp;=&amp;nbsp;0;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;MAXIMUM_FRAMES&amp;nbsp;=&amp;nbsp;60;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;&amp;nbsp;PLAYBACK_SPEED_NORMAL&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;1000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;&amp;nbsp;PLAYBACK_SPEED_FAST&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;300);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;playbackTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;200));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;potentiometerCheckTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;100));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Camera&amp;nbsp;will&amp;nbsp;calibrate&amp;nbsp;its&amp;nbsp;brightness&amp;nbsp;by&amp;nbsp;taking&amp;nbsp;some&amp;nbsp;pictures,&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;which&amp;nbsp;we&amp;nbsp;throw&amp;nbsp;away.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;&amp;nbsp;throwawayBitmap&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;(320,&amp;nbsp;240);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;numBitmapsThrown&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;int&lt;/span&gt;&amp;nbsp;BITMAPS_TO_THROW&amp;nbsp;=&amp;nbsp;5;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Image&lt;/span&gt;&amp;nbsp;cameraImage;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;bool&lt;/span&gt;&amp;nbsp;pictureTakingInProgress&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;;
 
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;method&amp;nbsp;is&amp;nbsp;run&amp;nbsp;when&amp;nbsp;the&amp;nbsp;mainboard&amp;nbsp;is&amp;nbsp;powered&amp;nbsp;up&amp;nbsp;or&amp;nbsp;reset.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProgramStarted()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;event&amp;nbsp;handlers&amp;nbsp;for&amp;nbsp;modules&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.ButtonPressed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonEventHandler&lt;/span&gt;(button_ButtonPressed);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.BitmapStreamed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Camera&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapStreamedEventHandler&lt;/span&gt;(camera_BitmapStreamed);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sdCard.SDCardMounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardMountedEventHandler&lt;/span&gt;(sdCard_SDCardMounted);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sdCard.SDCardUnmounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardUnmountedEventHandler&lt;/span&gt;(sdCard_SDCardUnmounted);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;event&amp;nbsp;handlers&amp;nbsp;for&amp;nbsp;timers,&amp;nbsp;and&amp;nbsp;start&amp;nbsp;timers&amp;nbsp;running&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(playbackTimer_Tick);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Start();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Gadgeteer.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(potentiometerCheckTimer_Tick);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Start();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Use&amp;nbsp;Debug.Print&amp;nbsp;to&amp;nbsp;show&amp;nbsp;messages&amp;nbsp;in&amp;nbsp;Visual&amp;nbsp;Studio's&amp;nbsp;"Output"&amp;nbsp;window&amp;nbsp;during&amp;nbsp;debugging.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.Print(&lt;span style="color: #a31515;"&gt;"Program&amp;nbsp;Started"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;sdCard_SDCardMounted(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;StorageDevice&lt;/span&gt;&amp;nbsp;SDCard)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.SDCard&amp;nbsp;=&amp;nbsp;SDCard;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;sdCard_SDCardUnmounted(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;&amp;nbsp;sender)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;this&lt;/span&gt;.SDCard&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;button_ButtonPressed(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonState&lt;/span&gt;&amp;nbsp;state)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!camera.CameraReady)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(frames.Count&amp;nbsp;&amp;lt;=&amp;nbsp;MAXIMUM_FRAMES)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Stop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potentiometerCheckTimer.IsRunning)&amp;nbsp;potentiometerCheckTimer.Stop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Recording;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Bitmap&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;((&lt;span style="color: blue;"&gt;int&lt;/span&gt;)display.Width,&amp;nbsp;(&lt;span style="color: blue;"&gt;int&lt;/span&gt;)display.Height);&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Give&amp;nbsp;the&amp;nbsp;camera&amp;nbsp;and&amp;nbsp;screen&amp;nbsp;a&amp;nbsp;new&amp;nbsp;bitmap&amp;nbsp;to&amp;nbsp;stream&amp;nbsp;to.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StartStreamingBitmaps(cameraImage.Bitmap);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;playbackTimer_Tick(GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(frames.Count&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!camera.CameraReady)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped&amp;nbsp;||&amp;nbsp;currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Recording)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Forward&amp;nbsp;||&amp;nbsp;currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.ForwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentFrame&amp;nbsp;&amp;gt;&amp;nbsp;frames.Count&amp;nbsp;-&amp;nbsp;1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Backward&amp;nbsp;||&amp;nbsp;currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.BackwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentFrame&amp;nbsp;&amp;lt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentFrame&amp;nbsp;=&amp;nbsp;frames.Count&amp;nbsp;-&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Bitmap&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;)frames[currentFrame];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;potentiometerCheckTimer_Tick(Gadgeteer.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;double&lt;/span&gt;&amp;nbsp;potValue&amp;nbsp;=&amp;nbsp;potentiometer.ReadPotentiometerPercentage();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Initializing)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(camera.CameraReady)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StartStreamingBitmaps(throwawayBitmap);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(pictureTakingInProgress)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.40&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Backward)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Backward;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_NORMAL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.BackwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.BackwardFast;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_FAST;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.60&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Forward)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Forward;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_NORMAL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.85)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.ForwardFast)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.ForwardFast;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Interval&amp;nbsp;=&amp;nbsp;PLAYBACK_SPEED_FAST;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(!playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(potValue&amp;nbsp;&amp;lt;&amp;nbsp;0.55&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;potValue&amp;nbsp;&amp;gt;&amp;nbsp;0.45)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(playbackTimer.IsRunning)&amp;nbsp;playbackTimer.Stop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;camera_BitmapStreamed(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Camera&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;&amp;nbsp;bitmap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(currentMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Initializing)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numBitmapsThrown++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(numBitmapsThrown&amp;nbsp;==&amp;nbsp;BITMAPS_TO_THROW)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PlaybackMode&lt;/span&gt;.Stopped;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StopStreamingBitmaps();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cameraImage.Invalidate();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(button.IsPressed)&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;;&amp;nbsp;&lt;span style="color: green;"&gt;//carry&amp;nbsp;on&amp;nbsp;streaming&amp;nbsp;pictures&amp;nbsp;to&amp;nbsp;the&amp;nbsp;screen&amp;nbsp;while&amp;nbsp;the&amp;nbsp;button&amp;nbsp;is&amp;nbsp;pressed&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frames.Insert(currentFrame,&amp;nbsp;cameraImage.Bitmap);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.StopStreamingBitmaps();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Start();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10249800" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/project/">project</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/FlipbookMaker/">FlipbookMaker</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/walthrough/">walthrough</category></item><item><title>Looking for API reference docs for the core Gadgeteer libraries?</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/20/looking-for-api-reference-docs-for-the-core-gadgeteer-libraries.aspx</link><pubDate>Tue, 20 Dec 2011 20:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10249452</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10249452</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/20/looking-for-api-reference-docs-for-the-core-gadgeteer-libraries.aspx#comments</comments><description>&lt;p&gt;Look no further.&amp;nbsp; The Gadgeteer core library documentation is posted on the Gadgeteer community site at &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/index.html"&gt;http://www.netmf.com/gadgeteer/docs/gadgeteercore/index.html.&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This covers the namespaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/3c8c1397-65ee-7f8b-aff1-f199416a48dc.htm" target="_parent"&gt;Gadgeteer&lt;/a&gt;&lt;/strong&gt; - including the &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/d878ff77-f064-b644-10d0-d69acca402b9.htm" target="_blank"&gt;Color&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/53046832-b7d2-3e11-a001-632b70fc103b.htm" target="_blank"&gt;Mainboard&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/b75da3b2-ff46-e371-7f9e-90155834e584.htm" target="_blank"&gt;Picture&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/e61bdade-6a03-4c21-f396-db8caf780382.htm" target="_blank"&gt;Program&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/7764d71f-b0aa-97b3-fd75-4edb013c0dc1.htm" target="_blank"&gt;Socket&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/fc8eb3df-28c1-d5dd-18ad-f3bb8f970875.htm" target="_blank"&gt;StorageDevice&lt;/a&gt; and &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/5ef09189-d61a-388c-ce72-de29da60260b.htm" target="_blank"&gt;Timer&lt;/a&gt; classes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/7e50cd99-bb77-8a38-666a-98e1007d7f22.htm" target="_blank"&gt;Gadgeteer.Interfaces&lt;/a&gt;&lt;/strong&gt; - including &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/42848af9-1785-a78d-68ce-c453e3e2c310.htm" target="_blank"&gt;AnalogInput&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/c4af5414-80a8-2489-0119-b6afaf8807eb.htm" target="_blank"&gt;AnalogOutput&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/feb06b4b-189a-404e-8a60-7b9c1a96e508.htm" target="_blank"&gt;DigitalInput&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/7ec20aac-0ffd-bc29-e492-b9e4a9a1ffc3.htm" target="_blank"&gt;DigitalIO&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/7ec20aac-0ffd-bc29-e492-b9e4a9a1ffc3.htm" target="_blank"&gt;DigitalOutput&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/19b45a56-ed7f-90f6-058f-32e14a7f0e80.htm" target="_blank"&gt;I2CBus&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/73a39866-fd0a-f52f-2d85-81a96362d804.htm" target="_blank"&gt;InterruptInput&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/ed4fb5c2-2bab-ab1b-b00f-9c769ec920a5.htm" target="_blank"&gt;PWMOutput&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/bfaea0e0-fbeb-e4b1-d961-9aacd9dd759f.htm" target="_blank"&gt;Serial&lt;/a&gt; and &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/481c06a5-b705-01fe-4ddc-eba5b8177be1.htm" target="_blank"&gt;SPI&lt;/a&gt; classes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/da1d576e-1dca-7f36-78c6-553e6024c95f.htm" target="_blank"&gt;Gadgeteer.Modules&lt;/a&gt;&lt;/strong&gt; - including &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/60b35c8e-1c9f-fefa-db44-8b9c6ce26184.htm" target="_blank"&gt;Module&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/5d2bce53-5288-32e7-cab6-b97b9ded5c0b.htm" target="_blank"&gt;DaisyLinkModule&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/efbd3431-5d1f-39fd-89c3-c21c8eadda62.htm" target="_blank"&gt;DisplayModule&lt;/a&gt;, &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/72e218c4-29c4-ce8a-28f8-69dfc39dc817.htm" target="_blank"&gt;DisplayModule.SimpleGraphicsInterface&lt;/a&gt;, and &lt;a href="http://www.netmf.com/gadgeteer/docs/gadgeteercore/html/46541a86-6326-65c4-eb10-07ea89b91d16.htm" target="_blank"&gt;NetworkModule&lt;/a&gt; classes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/Gadgeteer.Networking" target="_blank"&gt;Gadgeteer.Networking&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check it out, and if you have any questions, let us know&amp;nbsp;in the &lt;a href="http://www.netmf.com/gadgeteer/forum/" target="_blank"&gt;Gadgeteer forums&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10249452" width="1" height="1"&gt;</description></item><item><title>Why not while(true)?</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/19/why-not-while-true.aspx</link><pubDate>Mon, 19 Dec 2011 20:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10249013</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10249013</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/19/why-not-while-true.aspx#comments</comments><description>&lt;p&gt;Many programs have a basic structure of:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;while&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;true&lt;/span&gt;)
{
    &lt;span style="color: green;"&gt;//&amp;nbsp;Program&amp;nbsp;goes&amp;nbsp;here&lt;/span&gt;
}&lt;/pre&gt;
&lt;p&gt;This approach is logical if your program is responsible for monitoring user input, device I/O, threads, etc.&amp;nbsp; However, it's not an optimal approach for most Gadgeteer programs.&amp;nbsp; The rest of this post will explore the Gadgeteer event dispatcher, execution model, and best practices for utilizing their benefits.&lt;/p&gt;
&lt;h1&gt;How Gadgeteer Programs Run&lt;/h1&gt;
&lt;p&gt;When you write a Gadgeteer program, the code you want to run first should go into the&amp;nbsp;ProgramStarted method.&amp;nbsp; The system calls this method after the hardware is booted and the event dispatcher is running.&amp;nbsp; ProgramStarted is a good place to create event handlers, set initial state in modules, and show a welcome screen if you're using a display.&lt;/p&gt;
&lt;p&gt;However, you don't want to run an infinite loop in ProgramStarted.&amp;nbsp; Why not?&amp;nbsp; Because none of your event handlers will get called until after ProgramStarted exits.&amp;nbsp; That includes any timers you've created.&lt;/p&gt;
&lt;p&gt;This happens because modules send events to a queue which is processed by the same thread that executes ProgramStarted.&amp;nbsp;If ProgramStarted never exits, the dispatcher never starts.&lt;/p&gt;
&lt;h1&gt;The .NET Micro Framework Dispatcher&lt;/h1&gt;
&lt;p&gt;Gadgeteer uses an event dispatcher to funnel events from modules and timers&amp;nbsp;to your program.&amp;nbsp; Many modules do processing on their own threads, but they send events to a dispatcher on the main program thread.&amp;nbsp; That dispatcher routes events to the appropriate event handlers in your code.&lt;/p&gt;
&lt;p&gt;That means you don't need to worry about multi-threading (and its pitfalls like race conditions) unless you choose to create multiple threads yourself.&amp;nbsp; Any multithreading done by modules and timers is strictly behind the scenes.&lt;/p&gt;
&lt;p&gt;The dispatcher makes it easy to work with devices that work asynchronously, too.&amp;nbsp; For example, many camera modules take a while (in microprocessor clock cycle terms) to capture a picture, encode it into a useful format and send the data to the main processor.&amp;nbsp; Networking events happen sporadically, and your application shouldn't spend time polling the network if it's not active.&amp;nbsp; Same with&amp;nbsp;user input components - you want to know when the user presses or releases a button, but you don't want to spend processor resources on it otherwise.&lt;/p&gt;
&lt;p&gt;The tricky thing is that the dispatcher runs on the same thread as your program code, so you have to give it time to run.&amp;nbsp; Any method which contains an infinite loop (or which takes a very long time to complete) will prevent the dispatcher from notifying your program about important events.&lt;/p&gt;
&lt;h1&gt;Care and Feeding of the&amp;nbsp;Dispatcher&lt;/h1&gt;
&lt;p&gt;There are two design patterns which work very well for Gadgeteer programs.&lt;/p&gt;
&lt;p&gt;1)&amp;nbsp; Register event handlers whenever possible. Don't block on user or device input, as this will prevent other parts of your project from functioning.&lt;/p&gt;
&lt;p&gt;2)&amp;nbsp; Create a Gadgeteer.Timer and listen for its Tick event.&amp;nbsp; Any operation which you want to do at regular intervals is a good candidate for a timer.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here's an example of a program which controls a Button module that has an onboard LED.&amp;nbsp; The LED is set to blink on and off at a 1 second interval, and the program prints debug text when the user presses the button.&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;ledBlinkTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(1000);
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProgramStarted()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.ButtonPressed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonEventHandler&lt;/span&gt;(button_ButtonPressed);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ledBlinkTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(ledBlinkTimer_Tick);&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;            ledBlinkTimer.Start();
&lt;/pre&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ledBlinkTimer_Tick(GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(button.IsLedOn&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.TurnLEDOff();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.TurnLEDOn();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;button_ButtonPressed(&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonState&lt;/span&gt;&amp;nbsp;state)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.Print(&lt;span style="color: #a31515;"&gt;"Button&amp;nbsp;Pressed"&lt;/span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;This program will not block the dispatcher from running, and it won't spend a lot of processor cycles listening for button events.&lt;/p&gt;
&lt;p&gt;The corresponding anti-pattern for Gadgeteer looks like this:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;ledBlinkTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(1000);
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Don't&amp;nbsp;do&amp;nbsp;this&amp;nbsp;with&amp;nbsp;Gadgeteer.&amp;nbsp;&amp;nbsp;It&amp;nbsp;won't&amp;nbsp;work!&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProgramStarted()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ledBlinkTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(ledBlinkTimer_Tick);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ledBlinkTimer.Start();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;while&amp;nbsp;loop&amp;nbsp;prevents&amp;nbsp;the&amp;nbsp;timer&amp;nbsp;event&amp;nbsp;from&amp;nbsp;firing&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;while&lt;/span&gt;&amp;nbsp;(&lt;span style="color: blue;"&gt;true&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(button.IsPressed&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.Print(&lt;span style="color: #a31515;"&gt;"Button&amp;nbsp;pressed"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;event&amp;nbsp;handler&amp;nbsp;is&amp;nbsp;never&amp;nbsp;called&amp;nbsp;because&amp;nbsp;the&amp;nbsp;program&amp;nbsp;thread&amp;nbsp;is&amp;nbsp;blocked!&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ledBlinkTimer_Tick(GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;if&lt;/span&gt;&amp;nbsp;(button.IsLedOn&amp;nbsp;==&amp;nbsp;&lt;span style="color: blue;"&gt;true&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.TurnLEDOff();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;else&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.TurnLEDOn();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;This pattern is quite common, especially for embedded devices.&amp;nbsp; It's not wrong, but it doesn't work with the Gadgeteer dispatcher, which is essentially a &lt;span style="font-family: arial,helvetica,sans-serif;"&gt;while(true)&lt;/span&gt; loop itself!&lt;/p&gt;
&lt;h1&gt;Questions?&lt;/h1&gt;
&lt;p&gt;The Microsoft Research team who created Gadgeteer hangs out on the&amp;nbsp;Gadgeteer &lt;a href="http://www.netmf.com/gadgeteer/forum/" target="_blank"&gt;forums&lt;/a&gt;.&amp;nbsp; We're also on Twitter (&lt;a href="http://twitter.com/netgadgeteer" target="_blank"&gt;@netgadgeteer&lt;/a&gt;)&amp;nbsp;and &lt;a href="http://www.facebook.com/netgadgeteer" target="_blank"&gt;Facebook &lt;/a&gt;if you want to find us.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10249013" width="1" height="1"&gt;</description></item><item><title>How to Build a Flipbook Maker: Part 1</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/18/how-to-build-a-flipbook-maker-part-1.aspx</link><pubDate>Sun, 18 Dec 2011 21:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10248989</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10248989</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/18/how-to-build-a-flipbook-maker-part-1.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Build your own stop-motion animation tool using .NET Gadgeteer!&amp;nbsp; The Flipbook Maker combines Gadgeteer's intuitive hardware and software construction with a useful enclosure to create a project that will appeal to your inner cartoonist.&lt;/p&gt;
&lt;p&gt;The end result looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/5226.FlipbookMaker.jpg"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/5226.FlipbookMaker.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Read more about this project in the Gadgeteer &lt;a href="http://www.netmf.com/showcase.aspx?ShowcaseID=2&amp;amp;id=121" target="_blank"&gt;Featured Projects&lt;/a&gt; library - including a video of it in action!&lt;/p&gt;
&lt;h1&gt;What You'll Need&lt;/h1&gt;
&lt;p&gt;This walkthrough uses modules from GHI Electronics' Fez Spider Starter Kit.&amp;nbsp; Other mainboards and modules can be substituted - just check that your modules will work with the sockets on your mainboard.&amp;nbsp; You can quickly determine whether a module will work with a mainboard by matching the module's socket type letter with the socket type letters on each mainboard socket.&lt;/p&gt;
&lt;p&gt;Hardware Modules Used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mainboard&lt;/li&gt;
&lt;li&gt;Camera Module&lt;/li&gt;
&lt;li&gt;Potentiometer Module&lt;/li&gt;
&lt;li&gt;Button Module&lt;/li&gt;
&lt;li&gt;SD Card Module (plus an SD card - check your module to determine its card size and capacity requirements)&lt;/li&gt;
&lt;li&gt;USBClient power module&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You'll also need a Gadgeteer development environment.&amp;nbsp; Check out this &lt;a href="http://www.netmf.com/gadgeteer/get-started.aspx" target="_blank"&gt;guide&lt;/a&gt; which describes how to set that up.&lt;/p&gt;
&lt;p&gt;Finally, if you want to assemble your Flipbook Maker as pictured here, you'll need to create an enclosure for it.&amp;nbsp; We'll talk about fabrication options in a later post - including stuff you can do yourself and services you can use to have the case constructed for you.&lt;/p&gt;
&lt;h1&gt;Step 1:&amp;nbsp; Connect the&amp;nbsp;Modules&lt;/h1&gt;
&lt;p&gt;First, create a new Gadgeteer project in Visual C# Express.&amp;nbsp; From the File Menu, select New Project, then click the Gadgeteer category under Visual C#.&amp;nbsp; Choose ".NET Gadgeteer Application" and give it the name "Flipbook Maker".&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8358.FlipbookMakerCreateProject.PNG"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8358.FlipbookMakerCreateProject.PNG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next, add the Gadgeteer modules to the project by dragging the appropriate modules from the Toolbox to the design surface. Connect the modules together using the below picture as a guide, or just right-click in the designer and choose "Connect All Modules".&amp;nbsp; The result should look something like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6661.FlipbookMakerDesigner.PNG"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/6661.FlipbookMakerDesigner.PNG" /&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/8078.FlipbookMakerDesigner.PNG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finally, connect your physical Gadgeteer modules together as shown in the designer.&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Step 2:&amp;nbsp;&amp;nbsp;Starting the Software&lt;/h1&gt;
&lt;p&gt;Next, we'll create the basic structure for the software.&amp;nbsp; Open&amp;nbsp;the auto-generated Program.cs and read through the comment in ProgramStarted - it describes how to access the modules that were created in the designer, how to quickly create event handlers, and how to create timers.&amp;nbsp; We'll&amp;nbsp;do all three of&amp;nbsp;those tasks here.&lt;/p&gt;
&lt;p&gt;The Gadgeteer programming model is largely event-driven: each module exposes events that represent important states or user actions such as a button being pressed.&amp;nbsp; Your program can choose to listen to those events by registering event handlers.&lt;/p&gt;
&lt;p&gt;The FlipbookMaker needs to listen to these events:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Button presses&lt;/li&gt;
&lt;li&gt;SD card insertion and removal&lt;/li&gt;
&lt;li&gt;Camera sending a picture to the mainboard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, the FlipbookMaker needs a couple of timers.&amp;nbsp; Each timer fires an event at a specified interval, which allows your program to do things on a regular basis.&amp;nbsp; We'll create timers for two purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Animation playback&lt;/li&gt;
&lt;li&gt;Reading the potentiometer.&amp;nbsp; The Potentiometer module does not fire events when it is turned, so the program must check it regularly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's the code to register the event handlers.&amp;nbsp; This goes in ProgramStarted() so that the event handlers are created when the program launches.&lt;/p&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;button.ButtonPressed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonEventHandler&lt;/span&gt;(button_ButtonPressed);
camera.BitmapStreamed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Camera&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapStreamedEventHandler&lt;/span&gt;(camera_BitmapStreamed);&lt;/pre&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;sdCard.SDCardMounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardMountedEventHandler&lt;/span&gt;(sdCard_SDCardMounted);
sdCard.SDCardUnmounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardUnmountedEventHandler&lt;/span&gt;(sd_SDCardUnmounted);&lt;/pre&gt;
&lt;p&gt;This process will also&amp;nbsp;create empty methods named button_ButtonPressed, camera_BitmapStreamed, sdCard_SDCardMounted, and sdCard_sdCardUnmounted.&amp;nbsp; These are the methods that will be called when the corresponding event happens.&amp;nbsp; The next post in this series will&amp;nbsp;discuss how to implement these&amp;nbsp;methods.&lt;/p&gt;
&lt;p&gt;Next,&amp;nbsp;declare and instantiate two&amp;nbsp;timers.&amp;nbsp; These should go inside the Program class but not inside&amp;nbsp;the ProgramStarted() method&amp;nbsp;- they need to be accessible to the entire program.&lt;/p&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;playbackTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;200));
GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;potentiometerCheckTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;100));&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;Finally, create the timer tick event handlers inside ProgramStarted() and start them running.&lt;/p&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;playbackTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(playbackTimer_Tick);
playbackTimer.Start();
 
potentiometerCheckTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Gadgeteer.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(potentiometerCheckTimer_Tick);
potentiometerCheckTimer.Start();&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Here's the entire Program.cs listing so far:&lt;/p&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;System.Threading;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Presentation;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Presentation.Controls;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Presentation.Media;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.SPOT.Touch;
 
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Gadgeteer.Networking;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;GT&amp;nbsp;=&amp;nbsp;Gadgeteer;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;GTM&amp;nbsp;=&amp;nbsp;Gadgeteer.Modules;
&lt;span style="color: blue;"&gt;using&lt;/span&gt;&amp;nbsp;Gadgeteer.Modules.GHIElectronics;
 
&lt;span style="color: blue;"&gt;namespace&lt;/span&gt;&amp;nbsp;FlipbookMaker
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;playbackTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;200));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;potentiometerCheckTimer&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeSpan&lt;/span&gt;(0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;100));
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;method&amp;nbsp;is&amp;nbsp;run&amp;nbsp;when&amp;nbsp;the&amp;nbsp;mainboard&amp;nbsp;is&amp;nbsp;powered&amp;nbsp;up&amp;nbsp;or&amp;nbsp;reset.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProgramStarted()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;/*******************************************************************************************&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Modules&amp;nbsp;added&amp;nbsp;in&amp;nbsp;the&amp;nbsp;Program.gadgeteer&amp;nbsp;designer&amp;nbsp;view&amp;nbsp;are&amp;nbsp;used&amp;nbsp;by&amp;nbsp;typing&amp;nbsp;&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;their&amp;nbsp;name&amp;nbsp;followed&amp;nbsp;by&amp;nbsp;a&amp;nbsp;period,&amp;nbsp;e.g.&amp;nbsp;&amp;nbsp;button.&amp;nbsp;&amp;nbsp;or&amp;nbsp;&amp;nbsp;camera.&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Many&amp;nbsp;modules&amp;nbsp;generate&amp;nbsp;useful&amp;nbsp;events.&amp;nbsp;Type&amp;nbsp;+=&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;&amp;nbsp;to&amp;nbsp;add&amp;nbsp;a&amp;nbsp;handler&amp;nbsp;to&amp;nbsp;an&amp;nbsp;event,&amp;nbsp;e.g.:&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.ButtonPressed&amp;nbsp;+=&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;do&amp;nbsp;something&amp;nbsp;periodically,&amp;nbsp;use&amp;nbsp;a&amp;nbsp;GT.Timer&amp;nbsp;and&amp;nbsp;handle&amp;nbsp;its&amp;nbsp;Tick&amp;nbsp;event,&amp;nbsp;e.g.:&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GT.Timer&amp;nbsp;timer&amp;nbsp;=&amp;nbsp;new&amp;nbsp;GT.Timer(1000);&amp;nbsp;//&amp;nbsp;every&amp;nbsp;second&amp;nbsp;(1000ms)&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timer.Tick&amp;nbsp;+=&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timer.Start();&lt;/span&gt;
&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*******************************************************************************************/&lt;/span&gt;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;event&amp;nbsp;handlers&amp;nbsp;for&amp;nbsp;modules&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.ButtonPressed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonEventHandler&lt;/span&gt;(button_ButtonPressed);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;camera.BitmapStreamed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Camera&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;BitmapStreamedEventHandler&lt;/span&gt;(camera_BitmapStreamed);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sdCard.SDCardMounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardMountedEventHandler&lt;/span&gt;(sdCard_SDCardMounted);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sdCard.SDCardUnmounted&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;SDCardUnmountedEventHandler&lt;/span&gt;(sdCard_SDCardUnmounted);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;up&amp;nbsp;event&amp;nbsp;handlers&amp;nbsp;for&amp;nbsp;timers,&amp;nbsp;and&amp;nbsp;start&amp;nbsp;timers&amp;nbsp;running&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(playbackTimer_Tick);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;playbackTimer.Start();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Tick&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;Gadgeteer.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;TickEventHandler&lt;/span&gt;(potentiometerCheckTimer_Tick);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;potentiometerCheckTimer.Start();
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Use&amp;nbsp;Debug.Print&amp;nbsp;to&amp;nbsp;show&amp;nbsp;messages&amp;nbsp;in&amp;nbsp;Visual&amp;nbsp;Studio's&amp;nbsp;"Output"&amp;nbsp;window&amp;nbsp;during&amp;nbsp;debugging.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.Print(&lt;span style="color: #a31515;"&gt;"Program&amp;nbsp;Started"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;sdCard_SDCardMounted(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;GT.&lt;span style="color: #2b91af;"&gt;StorageDevice&lt;/span&gt;&amp;nbsp;SDCard)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;sdCard_SDCardUnmounted(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;SDCard&lt;/span&gt;&amp;nbsp;sender)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;potentiometerCheckTimer_Tick(Gadgeteer.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;button_ButtonPressed(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonState&lt;/span&gt;&amp;nbsp;state)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;camera_BitmapStreamed(GTM.GHIElectronics.&lt;span style="color: #2b91af;"&gt;Camera&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Bitmap&lt;/span&gt;&amp;nbsp;bitmap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;playbackTimer_Tick(GT.&lt;span style="color: #2b91af;"&gt;Timer&lt;/span&gt;&amp;nbsp;timer)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;pre style="background: white; color: black; padding-left: 30px; font-family: Consolas;"&gt;}&lt;/pre&gt;
&lt;h1&gt;What's Next?&lt;/h1&gt;
&lt;p&gt;In Part 2, we'll design the behavior for the FlipbookMaker in various states: taking pictures, playing back movies, editing and saving to disk.&amp;nbsp; Part 3 will cover creating a touchscreen menu system using Gadgeteer.&amp;nbsp; Finally, in Part 4 we'll add the finishing touches to the program and discuss some ways to create FlipbookMaker enclosures.&lt;/p&gt;
&lt;p&gt;Can't wait?&amp;nbsp; Check out the Gadgeteer &lt;a href="http://www.netmf.com/gadgeteer/forum/" target="_blank"&gt;forums&lt;/a&gt; to see what others are building.&amp;nbsp; And follow us on Twitter (&lt;a href="http://twitter.com/netgadgeteer" target="_blank"&gt;@netgadgeteer&lt;/a&gt;) - we post about cool projects there, too.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10248989" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/project/">project</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/FlipbookMaker/">FlipbookMaker</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/walthrough/">walthrough</category></item><item><title>Thursday Featured Module: Buttons</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/08/thursday-featured-module-buttons.aspx</link><pubDate>Fri, 09 Dec 2011 02:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10245839</guid><dc:creator>Kerry Hammil</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10245839</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/12/08/thursday-featured-module-buttons.aspx#comments</comments><description>&lt;p&gt;This is the first in a new series of posts: Thursday Featured Modules.&amp;nbsp; Each week we'll post about an interesting Gadgeteer module, including how to use it and where to find it.&lt;/p&gt;
&lt;h1&gt;The Mighty Button&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;Today we'll cover one of the most fundamental modules in many devices you already use today: the button.&amp;nbsp; It's universally understood by users and easy to program.&amp;nbsp; There are currently two button modules available for Gadgeteer, one from &lt;a href="http://www.netmf.com/showcase.aspx?ShowcaseID=1&amp;amp;id=114"&gt;GHI Electronics&lt;/a&gt; and one from &lt;a href="http://www.netmf.com/showcase.aspx?ShowcaseID=1&amp;amp;id=155"&gt;Sytech&lt;/a&gt;.&amp;nbsp; Each offers a little something extra: an LED you can use as a status indicator or to visually register button presses.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gadgeteerguy.com/Portals/0/Images/SytechImages/button02.JPG"&gt;&lt;img style="max-width: 550px;" border="0" alt="" src="http://gadgeteerguy.com/Portals/0/Images/SytechImages/button02.JPG" /&gt;&amp;nbsp;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.ghielectronics.com/images/catalog/274-0_small.jpg"&gt;&lt;img style="max-width: 425px;" border="0" alt="" src="http://www.ghielectronics.com/images/catalog/274-0_small.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;How to&amp;nbsp;Add a Button to Your Gadgeteer Project&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;Adding a button to your Gadgeteer project is really easy.&amp;nbsp; In Visual Studio or Visual C# Express, create a new Gadgeteer project.&amp;nbsp; (This walkthrough assumes you have the necessary Gadgeteer software installed on your computer.&amp;nbsp; If you still need to do that, &lt;a href="http://www.netmf.com/gadgeteer/get-started.aspx"&gt;go here first&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Drag a button from the toolbox onto the design surface and connect it to a compatible socket.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2626.buttondesigner.PNG"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/2626.buttondesigner.PNG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now, go to Program.cs and use Intellisense to see what the Button module can do.&amp;nbsp; The API is quite similar for the GHI and Sytech buttons, so this walkthrough works well for both.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/4201.buttonintellisense.png"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/4201.buttonintellisense.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;Detecting Button Presses&lt;/h1&gt;
&lt;p&gt;The Button exposes two events:&amp;nbsp; ButtonPressed and ButtonReleased.&amp;nbsp; By listening to both, your gadget can do something when the button is pressed and again when the user releases it.&amp;nbsp; Here's a quick code snippet that shows how to toggle the Button's LED each time the button is pressed:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;method&amp;nbsp;is&amp;nbsp;run&amp;nbsp;when&amp;nbsp;the&amp;nbsp;mainboard&amp;nbsp;is&amp;nbsp;powered&amp;nbsp;up&amp;nbsp;or&amp;nbsp;reset.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProgramStarted()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.ButtonPressed&amp;nbsp;+=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonEventHandler&lt;/span&gt;(button_ButtonPressed);
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Use&amp;nbsp;Debug.Print&amp;nbsp;to&amp;nbsp;show&amp;nbsp;messages&amp;nbsp;in&amp;nbsp;Visual&amp;nbsp;Studio's&amp;nbsp;"Output"&amp;nbsp;window&amp;nbsp;during&amp;nbsp;debugging.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.Print(&lt;span style="color: #a31515;"&gt;"Program&amp;nbsp;Started"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;button_ButtonPressed(&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;ButtonState&lt;/span&gt;&amp;nbsp;state)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Toggle&amp;nbsp;the&amp;nbsp;LED&amp;nbsp;when&amp;nbsp;the&amp;nbsp;button&amp;nbsp;is&amp;nbsp;pressed.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.ToggleLED();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;h1&gt;Using Button.LEDMode Property&lt;/h1&gt;
&lt;p&gt;You can use the Button's LEDMode property to make the LED automatically respond to button presses.&amp;nbsp; You can set the LED to respond in several ways:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7026.buttonledmodes.png"&gt;&lt;img border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-46-44/7026.buttonledmodes.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This snippet shows how to make the LED's button light up while the button is held down:&lt;/p&gt;
&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Program&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;This&amp;nbsp;method&amp;nbsp;is&amp;nbsp;run&amp;nbsp;when&amp;nbsp;the&amp;nbsp;mainboard&amp;nbsp;is&amp;nbsp;powered&amp;nbsp;up&amp;nbsp;or&amp;nbsp;reset.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;void&lt;/span&gt;&amp;nbsp;ProgramStarted()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;button.LEDMode&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Button&lt;/span&gt;.&lt;span style="color: #2b91af;"&gt;LEDModes&lt;/span&gt;.OnWhilePressed;
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Use&amp;nbsp;Debug.Print&amp;nbsp;to&amp;nbsp;show&amp;nbsp;messages&amp;nbsp;in&amp;nbsp;Visual&amp;nbsp;Studio's&amp;nbsp;"Output"&amp;nbsp;window&amp;nbsp;during&amp;nbsp;debugging.&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Debug&lt;/span&gt;.Print(&lt;span style="color: #a31515;"&gt;"Program&amp;nbsp;Started"&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;
&lt;p&gt;That's it!&amp;nbsp; Click away :)&lt;/p&gt;
&lt;h1&gt;Questions?&lt;/h1&gt;
&lt;p&gt;Ask them in the Gadgeteer &lt;a href="http://www.netmf.com/gadgeteer/forum/"&gt;forums&lt;/a&gt;!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Want up to date information on Gadgeteer-compatible button modules?&amp;nbsp; Search the Gadgeteer Product Showcase for &lt;a href="http://www.netmf.com/gadgeteer/showcase.aspx?showcaseid=1&amp;amp;&amp;amp;SearchText=button"&gt;buttons&lt;/a&gt; to see individual modules and kit options.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10245839" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/button/">button</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/ThursdayFeaturedModule/">ThursdayFeaturedModule</category></item><item><title>How to use Gadgeteer Interfaces directly from your application</title><link>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/11/10/net-gadgeteer-interfaces.aspx</link><pubDate>Thu, 10 Nov 2011 23:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10235980</guid><dc:creator>nicvillar</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/net_gadgeteer/rsscomments.aspx?WeblogPostID=10235980</wfw:commentRss><comments>http://blogs.msdn.com/b/net_gadgeteer/archive/2011/11/10/net-gadgeteer-interfaces.aspx#comments</comments><description>&lt;p&gt;One of the benefits of the .NET Gadgeteer design is that it provides&amp;nbsp;ready-to-use hardware modules.&amp;nbsp;Module designers can build&amp;nbsp;libraries&amp;nbsp;in such a way&amp;nbsp;that they take care of the&amp;nbsp;lower-level communication protocols and electrical signals that need to take place between the mainboard and the modules. Users of those modules can simply connect the hardware together, and use the high-level programming interfaces provided by the libraries.&lt;/p&gt;
&lt;p&gt;At the same time, .NET Gadgeteer is just as much about extensibility as it is about ease of use. To this end, the Gadgeteer.Interfaces namespace provides direct access to the most commonly used communication and electrical input/output capabilities of the mainboard. Interfaces are not usually accessed directly from a Gadgeteer application, and are more regularly used inside module libraries as a way to control or communicate with the module hardware. For example, a module library might internally use a DigitalInput interface to monitor the state of a button, a DigitalOutput to control an LED, or an I2CBus to read the value of a sensor.&lt;/p&gt;
&lt;p&gt;The interfaces currently supported are: AnalogInput, AnalogOutput, DigitalInput, DigitalIO, DigitalOutput, I2CBus, InterruptInput, PWMOutput, Serial and SPI.&lt;/p&gt;
&lt;p&gt;Interfaces are closely related to the concept of &lt;a href="http://gadgeteer.codeplex.com/wikipage?title=.NET%20Gadgeteer%20Socket%20Types"&gt;socket types&lt;/a&gt;, in that different socket types support different interfaces. For example, &lt;a href="http://gadgeteer.codeplex.com/wikipage?title=Socket%20Type%20I"&gt;socket type I&lt;/a&gt; specifies the electrical pinout for the I2CBus interface (SDA and SCL, on pins 8 and 9). However, there is not a one-to-one mapping between socket types and interfaces. For instance, the same &lt;a href="http://gadgeteer.codeplex.com/wikipage?title=Socket%20Type%20I"&gt;socket type I&lt;/a&gt; definition specifies that in any mainboard socket labelled with an I, both pins 3 and 6 are GPIOs. These pins can be controlled by using any of the DigitalInput, DigitalOutput or DigitalIO interfaces. In addition, pin 3 is marked as being interrupt-capable, and these capabilities can be accessed by using the InterrruptInput interface.&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Using Gadgeteer.Interfaces from an Application&lt;/h2&gt;
&lt;div&gt;&lt;br /&gt;As mentioned, interfaces are most often used from within module libraries.&amp;nbsp;I highly recommend reading this &lt;a href="http://10rem.net/blog/2011/10/30/building-a-net-gadgeteer-compatible-hardware-and-software-module-der-blinkenled"&gt;blog post, written by Pete Brown&lt;/a&gt; about the process of creating a new hardware module, and writing the accompanying software library for it.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;There are also cases when it is useful to be able to use the interfaces directly from the application code. For example, you might want to quickly test a new sensor without the overhead of creating a new module library. Here's how you do that:&lt;br /&gt;&lt;br /&gt;As a first step, it is good practice to add the following line of code to the using-statement block, at the top of the application code file:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="padding-left: 30px;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;using &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;GTI = Gadgeteer.Interfaces;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;This is optional, but it allows GTI to be used as a shortcut to the Gadgeteer.Interfaces namespace throughout the code, in the same way that GT is used as a shortcut for Gadgeteer, and GTM for Gadgeteer.Modules.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;In order to initialize any interface, it is necessary to specify the mainboard socket through which the interface will be used. It is possible to get a reference to any of the mainboard sockets by using a statement like this:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="padding-left: 30px;"&gt;&lt;span style="font-family: consolas;"&gt;GT.&lt;span style="color: #2b91af;"&gt;&lt;span style="color: #2b91af;"&gt;&lt;span style="color: #2b91af;"&gt;Socket&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; socket = GT.&lt;span style="color: #2b91af;"&gt;&lt;span style="color: #2b91af;"&gt;&lt;span style="color: #2b91af;"&gt;Socket&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.GetSocket(4, &lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;In this case, the GetSocket method returns a reference to the mainboard socket number 4. The second parameter specifies that an exception will be thrown if the socket number is invalid (i.e.. if the mainboard didn't actually have a socket number 4). The third and fourth parameters can be null, since they are only applicable when the interface is being used from within a module library.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The following code snippet is an example of a I2CBus interface being defined, initialized within ProgramStarted(), and then used from a method called Test():&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;partial&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;Program&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote style="padding-left: 30px;"&gt;
&lt;p&gt;&lt;span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;GTI.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;I2CBus&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; i2c;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; ProgramStarted()&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style="padding-left: 30px;"&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;GT.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;Socket&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; socket = GT.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;Socket&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;.GetSocket(4, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;);&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;i2c = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; GTI.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;I2CBus&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;(socket, 0x11, 50, &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;);&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;Test();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style="padding-left: 30px;"&gt;
&lt;p&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; Test()&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;byte&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;[] buffer = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;&lt;span style="color: #0000ff; font-family: consolas;"&gt;byte&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;[]{0x01, 0x02, 0x03};&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;i2c.Write(buffer, 100);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10235980" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/programming/">programming</category><category domain="http://blogs.msdn.com/b/net_gadgeteer/archive/tags/interfaces/">interfaces</category></item></channel></rss>
