<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4571328919493768358</id><updated>2024-11-05T21:52:44.390-05:00</updated><category term="&quot;Google Visualization API&quot;"/><category term="&quot;Google Visualization API&quot; SharePoint MOSS WSS Reporting Reports &quot;Annotated Time Line&quot; SQL"/><category term="JSON"/><category term="Microsoft SQL"/><category term="Wire Protocol"/><title type='text'>Carsten Dressler</title><subtitle type='html'>Programming and beyond</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-688646564066114401</id><published>2013-07-14T09:27:00.003-04:00</published><updated>2013-07-14T09:27:44.267-04:00</updated><title type='text'>DIY Drone - Quadcopter</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Over the past few months I&#39;ve been building a Quadcopter. &amp;nbsp;Here are a couple pictures of it:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn4k9Eu7dXksC24gnoFbSIC1_0FVUFFKiWwJglOPp7yDzTz_qjrNOAdz4ha-v71APMXrHuGWhkRl4sKP3JafFM3LE7COcJh7CMI4NQu6xRDuMWezzBFipNUEDf0dPnyv1sg-b_IFxg1oQ7/s1600/2013-07-12+17.18.40.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn4k9Eu7dXksC24gnoFbSIC1_0FVUFFKiWwJglOPp7yDzTz_qjrNOAdz4ha-v71APMXrHuGWhkRl4sKP3JafFM3LE7COcJh7CMI4NQu6xRDuMWezzBFipNUEDf0dPnyv1sg-b_IFxg1oQ7/s320/2013-07-12+17.18.40.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibiYLBmZvbBX1qbq8NrwjuAxuBhc1jWqeDoA9fi8jAJpqnpixZw7JbUVpGYcmPFjimqtxXaMToc17NVqjMuiFoauI8UpfjH0UKZEmlBevNY8BEdASzDm9SfeILk8zuRUlvah1-0n-HYhz6/s1600/2013-07-12+17.18.52.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibiYLBmZvbBX1qbq8NrwjuAxuBhc1jWqeDoA9fi8jAJpqnpixZw7JbUVpGYcmPFjimqtxXaMToc17NVqjMuiFoauI8UpfjH0UKZEmlBevNY8BEdASzDm9SfeILk8zuRUlvah1-0n-HYhz6/s320/2013-07-12+17.18.52.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Originally I didn&#39;t want to spend a lot of money so I just bought the basic parts that I needed to get going. &amp;nbsp;Of course once I started I always wanted to make it better and better. So over time I replaced a lot of the parts to get to the final product (what see you above).&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
I&#39;ve had quite a few requests from my YouTube channel on what parts I used and what I recommend. &amp;nbsp;So I decided that I should blog about it (since I haven&#39;t blogged in over 2 years). I will only go into the details of what the final product is. &amp;nbsp;I will not cover all the parts that I started off with.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Current Parts:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ebay.com/itm/DJI-FLAME-WHEEL-F450-BASIC-KIT-/360628530754?pt=Radio_Control_Parts_Accessories&amp;amp;hash=item53f722ae42&quot;&gt;DJI F450 Frame&lt;/a&gt;&amp;nbsp;44$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hobbyking.com/hobbyking/store/__16229__ntm_prop_drive_series_28_30a_750kv_140w.html&quot;&gt;NTM Prop Drive Series 28-30A 750kv / 140w Motors&lt;/a&gt;&amp;nbsp;15$ x4 = 60$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hobbyking.com/hobbyking/store/__16719__ntm_prop_drive_28_series_accessory_pack.html&quot;&gt;NTM Prop Drive 28 Series Accessory Pack&lt;/a&gt; 2$ x4 = 8$&lt;/li&gt;
&lt;li&gt;9 Inch X 4.7 Propellars 4$ x 2= 8&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hobbyking.com/hobbyking/store/__2164__turnigy_plush_30amp_speed_controller.html&quot;&gt;Turnigy Plush 30 amp Speed Controller (ESC)&lt;/a&gt;&amp;nbsp;12$ x4 = 48$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hobbyking.com/hobbyking/store/__10298__turnigy_3000mah_3s_40c_lipo_pack.html&quot;&gt;Turnigy 3000 mAh 3S 40C LiPo Battery&lt;/a&gt; 25$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://witespyquad.gostorego.com/accessories/max-b6-balance-charger.html&quot;&gt;MAX B6 Balance Charger&lt;/a&gt; 30$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hobbyking.com/hobbyking/store/__7223__hobby_king_battery_monitor_3s.html&quot;&gt;Hobby King Battery Monitor&lt;/a&gt; 4$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://witespyquad.gostorego.com/flight-controllers/multiwii-pro-2-0-flight-controller.html&quot;&gt;MultiWii Pro 2.0 with GPS/Bluetooth + Cables -&amp;nbsp;Flight Controller&lt;/a&gt; 87$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B004M13XH0/ref=oh_details_o05_s00_i00?ie=UTF8&amp;amp;psc=1&quot;&gt;DX6i DSMX 6 Channel Radio&amp;nbsp;+ Receiver&amp;nbsp;&lt;/a&gt;&amp;nbsp;180$&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
This totals out to be around 494$. &amp;nbsp;NOTE that the NTM Motors didn&#39;t fit 100% onto the frame. &amp;nbsp;I only used 2 screws to mount them instead of 4. &amp;nbsp;If I had to do it again, I&#39;d suggest the following:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ebay.com/itm/DJI-FLAME-WHEEL-F450-ARF-KIT-INCLUDES-MOTORS-ESC-PROPELLERS-/130882504206?pt=US_Radio_Control_Control_Line&amp;amp;hash=item1e7934860e&quot;&gt;DJI F450 KIT (Includes Motors, ESC,&amp;nbsp;+ Propellars)&lt;/a&gt;&amp;nbsp;- 190$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hobbyking.com/hobbyking/store/__10298__turnigy_3000mah_3s_40c_lipo_pack.html&quot;&gt;Turnigy 3000 mAh 3S 40C LiPo Battery&lt;/a&gt;&amp;nbsp;25$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://witespyquad.gostorego.com/accessories/max-b6-balance-charger.html&quot;&gt;MAX B6 Balance Charger&lt;/a&gt;&amp;nbsp;30$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hobbyking.com/hobbyking/store/__7223__hobby_king_battery_monitor_3s.html&quot;&gt;Hobby King Battery Monitor&lt;/a&gt;&amp;nbsp;4$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://witespyquad.gostorego.com/flight-controllers/multiwii-pro-2-0-flight-controller.html&quot;&gt;MultiWii Pro 2.0 with GPS/Bluetooth&amp;nbsp;+ Cables -&amp;nbsp;Flight Controller&lt;/a&gt;&amp;nbsp;87$&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B004M13XH0/ref=oh_details_o05_s00_i00?ie=UTF8&amp;amp;psc=1&quot;&gt;DX6i DSMX 6 Channel Radio&amp;nbsp;+ Receiver&amp;nbsp;&lt;/a&gt;&amp;nbsp;180$&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
This totals out to be around 516$ but then everything will fit. &amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Keep in mind that with this you will have to solder and put it all together yourself. &amp;nbsp;For me this is the fun part. &amp;nbsp;Putting it all together and making the software work. &amp;nbsp;I&#39;m not sure exactly how much time I spent on it, but it was quite a bit because I kept improving my setup. &amp;nbsp;If you don&#39;t want to build this all yourself you can always purchase pre-built Quadcopters or get the &lt;a href=&quot;http://www.dronefly.com/ProductDetails.asp?ProductCode=DJI-PHANTOM&quot;&gt;DJI Phantom&amp;nbsp;&lt;/a&gt;for 680$.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Also, if you dont want the GPS features, then you can reduce the cost of the flight controller to about 40$ and you can get a 4-channel remote.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Next I want to cover the features that the MultWii Flight Controller offers.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Features:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Acro / Gyro Mode - Allows you to &lt;a href=&quot;http://www.youtube.com/watch?v=JgjSQQiVAL4&quot;&gt;flip &lt;/a&gt;the Quadcopter (I haven&#39;t tried this)&lt;/li&gt;
&lt;li&gt;Stable / Level / Acc/ Angle - Basically holds the pitch/roll based on the absolute angel of the input stick.&lt;/li&gt;
&lt;li&gt;HeadFree - Fixes the control direction to the heading it had on arming. &amp;nbsp;So you can change the yaw direction and it will still move forwards if you pitch forwards. &amp;nbsp;You can see me &lt;a href=&quot;http://www.youtube.com/watch?v=0fxuEVJ1QBs&quot;&gt;demonstrate it here&lt;/a&gt;&amp;nbsp;at around 2:05.&lt;/li&gt;
&lt;li&gt;Altitude Hold - Holds Altitude&lt;/li&gt;
&lt;li&gt;GPS Position Hold - Holds Position based on GPS&amp;nbsp;&lt;a href=&quot;http://www.youtube.com/watch?v=0fxuEVJ1QBs&quot;&gt;(watch this for demo)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;GPS Return to Home (RTH) - Returns the copter to the position it was armed&amp;nbsp;&lt;a href=&quot;http://www.youtube.com/watch?v=0fxuEVJ1QBs&quot;&gt;(watch this for demo)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Bluetooth Telemetry&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Thats basically all for this post. &amp;nbsp;If there is interest, please post in the comments and I&#39;ll make another post on what it takes to configure it all.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/688646564066114401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/688646564066114401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/688646564066114401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/688646564066114401'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2013/07/diy-drone-quadcopter.html' title='DIY Drone - Quadcopter'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn4k9Eu7dXksC24gnoFbSIC1_0FVUFFKiWwJglOPp7yDzTz_qjrNOAdz4ha-v71APMXrHuGWhkRl4sKP3JafFM3LE7COcJh7CMI4NQu6xRDuMWezzBFipNUEDf0dPnyv1sg-b_IFxg1oQ7/s72-c/2013-07-12+17.18.40.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-2506308182288176526</id><published>2010-12-15T19:02:00.011-05:00</published><updated>2010-12-15T21:57:09.532-05:00</updated><title type='text'>Arduino Tivo Remote Extender</title><content type='html'>&lt;div&gt;About a year ago I needed the ability to control my Tivo S3 from another room.  Originally I purchased some cheap IR Extender from Radio Shack and tried it.  After toying around with it I knew that a off-shelf product was going to be useless.&lt;/div&gt;&lt;br /&gt;So I developed my own solution:&lt;br /&gt;&lt;br /&gt;After doing some reading I knew the Tivo S3/HD (newer ones probably as well) have a telnet server running on the Tivo that allows 3rd party apps to control the Tivo.&lt;br /&gt;&lt;br /&gt;To test this, all you need to do is open a Telnet client, connect to your Tivo&#39;s IP using port 31339 and then you could start sending out commands to the Tivo like the following:&lt;br /&gt;&lt;br /&gt;IRCODE TIVO&lt;br /&gt;IRCODE LIVETV&lt;br /&gt;IRCODE UP&lt;br /&gt;&lt;br /&gt;With this in mind, I knew there was the ability to control the Tivo using an ethernet device.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Previously I had played around with &lt;a href=&quot;http://www.arduino.cc/&quot;&gt;Arduino &lt;/a&gt;.  This is a microcontroller which you can program to control your I/O&#39;s on the device.  This device also supports an &lt;a href=&quot;http://www.arduino.cc/en/Main/ArduinoEthernetShield&quot;&gt;Ethernet Sheild&lt;/a&gt; which would allow me to communicate with the Tivo&#39;s Telnet server.  Next I needed a IR receiver for this to work, after Googling I found &lt;a href=&quot;http://www.sparkfun.com/products/8554&quot;&gt;this &lt;/a&gt;receiver on &lt;a href=&quot;http://www.sparkfun.com/&quot;&gt;SparkFun&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the hardware:&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8MAljbB7GfPBAAMvKCyavnFPuJLMYJ9EWnKh-wSn2CHz9vT4nDkRK2WX0Jb0XH1RKbKoq9WqCoqLCjyzs4ydccq13D4Ldnpp5mfBsLimuwcDtA2IQ3jL56wqqPaOKE3wbbw30Quz6aFv-/s320/IMG_20101215_212131.jpg&quot; style=&quot;cursor:pointer; cursor:hand;width: 320px; height: 240px;&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5551108502078277698&quot; /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now comes the fun part: the software:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;#include &lt;spi.h&gt;&lt;/spi.h&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;#include &lt;client.h&gt;&lt;/client.h&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;#include &lt;ethernet.h&gt;&lt;/ethernet.h&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;#include &lt;server.h&gt;&lt;/server.h&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;#include &lt;udp.h&gt;&lt;/udp.h&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;#include &lt;irremote.h&gt;&lt;/irremote.h&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;byte mac[] = { &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;byte ip[] = { &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  192, 168, 0, 213 };  // Device IP&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;byte server[] = { &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  192, 168, 0, 134 }; // Tivo&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Client client(server, 31339);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;int RECV_PIN = 3;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;IRrecv irrecv(RECV_PIN);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;decode_results results;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;decode_results resultslast;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;unsigned long firetime;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;void setup()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  irrecv.enableIRIn(); // Start the receiver&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  Ethernet.begin(mac, ip);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  Serial.begin(9600);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  pinMode(6, OUTPUT);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  pinMode(5, OUTPUT);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;void sndcmd(char data[]) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  resultslast = results;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  if (millis() - firetime &gt;= 150) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    if (client.connect()) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      client.println(data);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    else&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      client.stop();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      delay(50);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      if (client.connect()) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;        client.println(data);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    } &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    firetime = millis();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;void loop() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  analogWrite(5, 15);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  if (irrecv.decode(&amp;amp;results)) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    Serial.println(results.value, HEX);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    // Serial.println(&quot;-----&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    if (results.value == 0xFFFFFFFF) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      results = resultslast;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    switch (results.value) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CD00F:    //Tivo Button (cheapo remote)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE TIVO&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C500F:    //Tivo Button (nice remote)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE TIVO&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C8807:    //LiveTV Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE LIVETV&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CC807:    //Info Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE DISPLAY&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C6C03:    //Guide Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE GUIDE&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C2807:    //Select Up Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE UP&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C6807:    //Select Down Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE DOWN&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CE807:    //Select Left Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE LEFT&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CA807:    //Select Right Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE RIGHT&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C9807:    //Select Button&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE SELECT&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C1807:    //Thumbs Down&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE THUMBSDOWN&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C5807:    //Thumbs Up&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE THUMBSUP&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C7807:    //Channel Up&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE CHANNELUP&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CF807:    //Channel Down&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE CHANNELDOWN&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C040B:    //Record&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE RECORD&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C840B:    //Play&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE PLAY&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CC40B:    //Pause&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE PAUSE&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CA40B:    //Slow&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE SLOW&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C440B:    //Reverse&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE REVERSE&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C240B:    //Forward&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE FORWARD&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CE40B:    //Advance&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE ADVANCE&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C640B:    //Replay&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE REPLAY&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C140B:    //Num 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM1&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C940B:    //Num 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM2&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C540B:    //Num 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM3&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CD40B:    //Num 4&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM4&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C340B:    //Num 5&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM5&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CB40B:    //Num 6&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM6&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C740B:    //Num 7&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM7&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CF40B:    //Num 8&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM8&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C0C03:    //Num 9&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM9&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C8C03:    //Num 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE NUM0&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10CCC03:    //Enter&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE ENTER&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    case 0xA10C4C03:    //Clear&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      sndcmd(&quot;IRCODE CLEAR&quot;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    default:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      resultslast = results;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;      break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;    irrecv.resume(); // Receive the next value    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;  }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I used this &lt;a href=&quot;http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html&quot;&gt;IR library&lt;/a&gt; I found on the net from Ken Shirriff.  Basically it has the ability to capture the keys pressed from the Tivo Remote and returns a integer (&lt;span class=&quot;Apple-style-span&quot;&gt;ex.  0xA10C4C03).  Each button fires a different integer.  With this I mapped out each command, then connect to the Tivo and pass the proper Telnet command.  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Below you can find a YouTube video of the device in action:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=zLdy3oDSd_U&quot;&gt;http://www.youtube.com/watch?v=zLdy3oDSd_U&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/2506308182288176526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/2506308182288176526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/2506308182288176526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/2506308182288176526'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/12/arduino-tivo-remote-extender.html' title='Arduino Tivo Remote Extender'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8MAljbB7GfPBAAMvKCyavnFPuJLMYJ9EWnKh-wSn2CHz9vT4nDkRK2WX0Jb0XH1RKbKoq9WqCoqLCjyzs4ydccq13D4Ldnpp5mfBsLimuwcDtA2IQ3jL56wqqPaOKE3wbbw30Quz6aFv-/s72-c/IMG_20101215_212131.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-5973292620079776143</id><published>2010-12-13T22:56:00.002-05:00</published><updated>2010-12-13T23:00:04.401-05:00</updated><title type='text'>New Web Site</title><content type='html'>Just got done moving the web site from GoDaddy over to Blogger.  The performance of the new site should be significantly better.&lt;br /&gt;&lt;br /&gt;I&#39;ll be adding more content soon.</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/5973292620079776143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/5973292620079776143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/5973292620079776143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/5973292620079776143'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/12/new-web-site.html' title='New Web Site'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-5048905364753963652</id><published>2010-05-02T19:51:00.005-04:00</published><updated>2010-05-02T21:13:07.874-04:00</updated><title type='text'>Wireless Ipod Touch Sync Prototype 2</title><content type='html'>This is a continuation of my &lt;a href=&quot;http://dresslerc.blogspot.com/2010/04/wireless-ipod-touch-sync-prototype.html&quot;&gt;previous blog post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Throughout last week I&#39;ve been working on creating an application that allows you to manage your iPod&#39;s content.  In the video below you can see that I am syncing my iPod through the wireless using this .NET application from a Windows 7 machine.&lt;br /&gt;&lt;br /&gt;This application is still in its very early stage.  The user interface (UI) is only a rough draft and will probably change tons before I release this.&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/Y11pPkqRbO0&amp;hl=en_US&amp;fs=1&amp;&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/Y11pPkqRbO0&amp;hl=en_US&amp;fs=1&amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/5048905364753963652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/5048905364753963652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/5048905364753963652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/5048905364753963652'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/05/wireless-ipod-touch-sync-prototype-2.html' title='Wireless Ipod Touch Sync Prototype 2'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-3327181742290539249</id><published>2010-04-25T14:31:00.000-04:00</published><updated>2010-04-25T14:32:05.583-04:00</updated><title type='text'>Wireless Ipod Touch Sync Prototype</title><content type='html'>Recently I got a new car (2010 Audi S4) which has full iPod integration. So on the Radio you can basically see everything that you can see on the iPod (Tracks/Artist/Albums/Playlist/etc). &lt;br /&gt;&lt;br /&gt;What I want is the possibility to leave the iPod Touch in the car forever, then if I want to put new music on it, I can sync it though my wireless network at home. The iPod doesnt support this &quot;wireless sync&quot; out of the box; so I attempted to make my own application that can do this. &lt;br /&gt;&lt;br /&gt;This is the prototype. I have a 1st gen iPod touch 16gb running OS 2.2.1 which is jailbroken and running vsftpd and openssh. Using the FTP server, I can transfer songs to the iPod, then also read/write the iTunesDB file (contains all the tracklist/albums/etc). Then using OpenSSH I can connect to the iPod and tell it to reload the iTunesDB file (ReSpring the ipod) when needed.&lt;br /&gt;&lt;br /&gt;In this video I only read the itunesdb, change one of the Titles, then I manually upload the itunesdb file using FileZilla, and then I manually trigger the &quot;ReSpring&quot;. Then you can see the updated title on Audi&#39;s MMI (The Radio).&lt;br /&gt;&lt;br /&gt;Again, this is only a proof of concept. The intention is to have a simple to use Windows program that does all the dirty work for you.&lt;br /&gt;&lt;br /&gt;This will only work on iPod touches running OS 2.x and must be jailbroken. Yes it is possible to downgrade an iPod touch running 3.x to 2.x (at least for the 1st gen iPod). I&#39;ve done it :). I do not plan on supporting album art/video upload/etc. This is only so I can leave my ipod in the car and sync music to it.&lt;br /&gt;&lt;br /&gt;Source Code will be made public once the project is done.&lt;br /&gt;&lt;br /&gt;&lt;object style=&quot;background-image:url(http://i1.ytimg.com/vi/TuQjDG_kDXg/hqdefault.jpg)&quot;  width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/TuQjDG_kDXg&amp;amp;hl=en_US&amp;amp;fs=1&quot;&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/TuQjDG_kDXg&amp;amp;hl=en_US&amp;amp;fs=1&quot; width=&quot;425&quot; height=&quot;344&quot; allowScriptAccess=&quot;never&quot; allowFullScreen=&quot;true&quot; wmode=&quot;transparent&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/3327181742290539249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/3327181742290539249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/3327181742290539249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/3327181742290539249'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/04/wireless-ipod-touch-sync-prototype.html' title='Wireless Ipod Touch Sync Prototype'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-4278707247030497888</id><published>2010-02-11T19:07:00.004-05:00</published><updated>2010-05-02T21:16:33.836-04:00</updated><title type='text'>Real Example of Google Visualization/Charts with SharePoint</title><content type='html'>&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/w4woLzJ6rL0&amp;hl=en_US&amp;fs=1&amp;hd=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/w4woLzJ6rL0&amp;hl=en_US&amp;fs=1&amp;hd=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here is a real example of using SharePoint (WSS or MOSS) with Google Visualizations/Charts. The data your looking at is pool temperature that I&#39;ve been collecting from a small PLC. The gauges show actual temp (real-time; updates every 2 secs), while the Annotated Timeline shows the history of the time. &lt;br /&gt;&lt;br /&gt;The data for the Annotated Timeline is coming from a local MS SQL Express Server which collects the data every 5 minutes.  The gauges are real-time connecting directly to the Beckhoff TwinCAT (PLC software) to grab the temp.</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/4278707247030497888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/4278707247030497888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/4278707247030497888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/4278707247030497888'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/02/real-example-of-google.html' title='Real Example of Google Visualization/Charts with SharePoint'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-7199120959188498862</id><published>2010-01-20T21:02:00.000-05:00</published><updated>2010-01-20T21:27:14.071-05:00</updated><title type='text'>Google Visualization - Wire Protocol Data Provider System (DTS - Source and Installation Instructions)</title><content type='html'>In my &lt;a href=&quot;http://dresslerc.blogspot.com/2010/01/sharepoint-google-visualization-api.html&quot;&gt;previous post&lt;/a&gt; I talked about how to use Google Visualization API with SharePoint to create a new dashboard/reporting platform.  Then I talked about a system to pulls any data and makes it available to the Google Visualization API using the Wire Protocol &lt;a href=&quot;http://dresslerc.blogspot.com/2010/01/in-my-previous-post-i-explained-how-to.html&quot;&gt;in this post&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This system I call &quot;DTS&quot; for Data Transformation System.  As I wrote in the previous post, this system is nothing more than an ASP.NET page that loads DLL&#39;s (based on the DSNAME parameter in the URL).  Then the DLL is responsible for providing a data-table with the content the user requested.  The ASP.NET page will then convert the data-table into JSON which the Google Visualization API can use.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Currently I only have 1 plugin (DLL) provided which allows you to connect to a Microsoft SQL Server.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The zip file provided below contains instructions on how to install this system on Windows 2008 using SQL Express 2008.  You will also find ALL the source included.  Remember this is only a proof of concept and there is probably a great deal of work that can be done to make this system better.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://www.mediafire.com/file/y5mmywnkyjy/Deploy%201.20.2010.zip&quot;&gt;Link to Source/Installation Files/Compile Program&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next week I will explain how to setup and configure new DLL&#39;s to allow you to connect to other data sources. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comments/Thoughts are welcome!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Carsten&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/7199120959188498862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/7199120959188498862' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/7199120959188498862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/7199120959188498862'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/01/dts-source-codeinstallation.html' title='Google Visualization - Wire Protocol Data Provider System (DTS - Source and Installation Instructions)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-1318797202215375921</id><published>2010-01-12T19:49:00.003-05:00</published><updated>2010-05-02T21:21:22.385-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="&quot;Google Visualization API&quot;"/><category scheme="http://www.blogger.com/atom/ns#" term="JSON"/><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Wire Protocol"/><title type='text'>Connecting Google Visualization API to any Data Source</title><content type='html'>In my &lt;a href=&quot;http://dresslerc.blogspot.com/2010/01/sharepoint-google-visualization-api.html&quot;&gt;previous post&lt;/a&gt; I explained how to use the Google Visualization API with SharePoint to create a reporting dashboard/portal.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a .NET Developer I tend to use Microsoft SQL Server a lot to store and manage my data.  After reading through the Google Visualization documentation I realized there was no way to connect to a MS SQL Server out-of-the-box.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then I discovered that I could implement my own data source using the &quot;&lt;a href=&quot;http://code.google.com/apis/visualization/documentation/dev/implementing_data_source.html&quot;&gt;Wire Protocol v0.6&lt;/a&gt;&quot;.  After reading the document it turns out that the Google Visualizations API can connect to a web server; pass commands, and then take the results and load them into the Visualization API.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, I can send the following request to a web server:&lt;/div&gt;&lt;div&gt;http://servername/example.aspx?parametername=value&amp;amp;parametername2=value2&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then based on the input values (parametername/parametername2), the server can make a decision on what data to display and then output the data as the API requires.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using ASP.NET I wrote a proof-of-concept program for testing purposes.  This proof-of-concept program simply connected to a SQL server, loaded the data, converted it to JSON, and returned it to the requester (Visualization API).  There we had it, the Google API rendered the charts with no problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I wanted to ensure that I can load data from any data source.  For example, most of my data is stored in a Microsoft SQL Server, but I also have some data that I need from other systems such as PLC&#39;s, ERP Systems, SharePoint Lists, Text Files, Web Services, etc.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To accomplish this I had to figure out a way to specify which data source the user was expecting data from, then allow the user to pass parameters to this system so it can get the proper dataset.  To do this in the URL request, I required the user to pass a parameter called DSNAME (data source name).  This DSNAME would tell the system which DLL to load and execute to get the proper data back.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For this system to be able to understand the DLL&#39;s I created a very simple &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms173156.aspx&quot;&gt;Interface&lt;/a&gt;.  This interface contains 1 method called &quot;Execute&quot; that will accept a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/xfhwa508.aspx&quot;&gt;Dictionary&lt;/a&gt; Object as a parameter and returned 1 &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx&quot;&gt;DataTable&lt;/a&gt;.  The Dictionary object will contain all the parameters that were passed by the requestor&#39;s URL parameters (see above&#39;s http URL).  Once the DLL executes, it would have to return a DataTable.  From this point the system would then convert the DataTable to &lt;a href=&quot;http://www.json.org/&quot;&gt;JSON&lt;/a&gt; then return that back to the requestor of the URL.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take the following URL as an example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://64.244.60.200:88/DTS/Default.aspx?dsname=MSSQL&amp;amp;Query=SELECT%20*%20FROM%20ViewTest&amp;amp;tqx=version:0.6;reqId:6&quot;&gt;http://64.244.60.200:88/DTS/Default.aspx?dsname=MSSQL&amp;amp;Query=SELECT%20*%20FROM%20ViewTest&amp;amp;tqx=version:0.6;reqId:6&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The DSNAME parameter tells the system that it wants to load the DLL associated with &quot;MSSQL&quot; (this is configured in a Database - will go into more details later).  Then the QUERY parameter is sent which contains the actual query statement to be executed.  From this point the system knows which DLL to execute and the DLL knows what data to read from where (based on the parameters we passed).  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I know you might wonder where the connection string is to the DB.  Since you don&#39;t want to pass sensitive data in the URL, I made this system be capable of loading default parameters (configured in a db) based on the DSNAME.  For example &quot;MSSQL&quot; knows to automatically load a default Connection String.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now to test all this follow the steps mentioned in m&lt;span&gt;&lt;span&gt;y previous post; but add the following HTML code to the Content Form Web Part (sorry cant paste HTML code in here):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://64.244.60.200:88/html.txt&quot;&gt;http://64.244.60.200:88/html.txt&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This sample HTML code basically loads Google&#39;s Annotated Time Line (my favorite), then connects to my data source (that we specified above), loads the MSSQL DLL, passes the Query parameter, then the system returns the JSON code which the Google API&#39;s can use to render the charts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is a quick showing what I mean.&lt;/div&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/AOsQ5ncqdH0&amp;hl=en_US&amp;fs=1&amp;hd=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/AOsQ5ncqdH0&amp;hl=en_US&amp;fs=1&amp;hd=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I intend to release the source code to all the code behind this as I am sure there are many great enhancements that can be made to it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More to follow...&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;color: rgb(0, 0, 0);   border-collapse: collapse; font-family:arial, sans-serif;font-size:13px;&quot;&gt;&lt;blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;   style=&quot;  border-collapse: collapse; font-family:arial, sans-serif;font-size:13px;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/1318797202215375921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/1318797202215375921' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/1318797202215375921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/1318797202215375921'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/01/in-my-previous-post-i-explained-how-to.html' title='Connecting Google Visualization API to any Data Source'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4571328919493768358.post-1115746194390723106</id><published>2010-01-11T20:19:00.002-05:00</published><updated>2010-05-02T21:14:25.626-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="&quot;Google Visualization API&quot; SharePoint MOSS WSS Reporting Reports &quot;Annotated Time Line&quot; SQL"/><title type='text'>SharePoint + Google Visualization API = Presentation Dashboard</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSUA4-pec5ifJtz40ujUcDIzDdNLB-Ea41Yd6LK7tt1Ovi0E-ERYnqKphI7399yy_EYBU6kGmD46IWj1TGlfY46GWH_ntbxUoU-UgbI1R9_CyCDOUBMO33MUBDziEyhnU2gpSR4pet_Ppr/s1600-h/AnnotatedTimelineWSS.png&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 200px; height: 156px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSUA4-pec5ifJtz40ujUcDIzDdNLB-Ea41Yd6LK7tt1Ovi0E-ERYnqKphI7399yy_EYBU6kGmD46IWj1TGlfY46GWH_ntbxUoU-UgbI1R9_CyCDOUBMO33MUBDziEyhnU2gpSR4pet_Ppr/s200/AnnotatedTimelineWSS.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5426020901342093042&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;I&#39;ve been looking at using Google Visualization API + SharePoint (WSS\MOSS) to create a presentation dashboard that can be an alternative to MS Reporting Services.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After digging around I found it relativity easy to embed Google Charts/etc into SharePoint using the &quot;Form Web Part&quot;.  Simply add one to the site, then modify it using the Source Editor and copy and paste the HTML code for the Google Visualization API.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You might be wondering how to generate the HTML code so that we can use the Google Visualization API.  Google simplified this by creating the Google Code Playground (&lt;a href=&quot;http://code.google.com/apis/ajax/playground/&quot;&gt;http://code.google.com/apis/ajax/playground/&lt;/a&gt;)  Here you can see demos from all the charts they provide.  Be sure to enable the HTML view, then copy and paste the HTML code into the Form Web Part and you&#39;ll see the Google Visualization API load.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is a step by step instructions on how I did it:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Hit Site Actions | Create&lt;/li&gt;&lt;li&gt;Then on the left side, you want to create a &quot;Web Part Page&quot;&lt;/li&gt;&lt;li&gt;Give the Web Part Page a name (I call it &quot;Test 1&quot;).  Now select a Layout, for this example I use the &quot;Full Page, Vertical&quot; layout, but anything will work.  Assign to a Document Library and hit Create.&lt;/li&gt;&lt;li&gt;Now we should automatically see the Test 1 page open in Edit Mode.  Click the &quot;Add a Web Part&quot;.  Now a new window should pop up; select the &quot;Form Web Part&quot;.&lt;/li&gt;&lt;li&gt;Once added, hit the &quot;Edit&quot; button on the web part we just added and hit &quot;Modify Shared Web Part&quot;, then hit &quot;Source Editor&quot;.&lt;/li&gt;&lt;li&gt;Now a new Source Editor Window should appear.  Copy and Paste the HTML code that you generated at the Google Playground and paste it in.  Then hit save.&lt;/li&gt;&lt;li&gt;Now you should be back on the new site you created and the Google chart that you used should have loaded.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Here is a YouTube video I posted explaining the steps above:&lt;/div&gt;&lt;object width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/jVY7-BB6MgE&amp;hl=en_US&amp;fs=1&amp;hd=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/jVY7-BB6MgE&amp;hl=en_US&amp;fs=1&amp;hd=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For those that dont know.  Windows SharePoint Services (WSS) can be downloaded and used for Free.  WSS runs a Micrsoft SQL Server for its data storage.  WSS works fine on MS SQL 2008 Express (also free).  This is what I am running for the demonstration video.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next post I will explain a system I wrote that will expose data from any source (MS SQL, Txt File, SharePoint List, etc) and convert it into a format that the Google Visualization API can use.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comments are welcome!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Carsten&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dresslerc.blogspot.com/feeds/1115746194390723106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/4571328919493768358/1115746194390723106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/1115746194390723106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4571328919493768358/posts/default/1115746194390723106'/><link rel='alternate' type='text/html' href='http://dresslerc.blogspot.com/2010/01/sharepoint-google-visualization-api.html' title='SharePoint + Google Visualization API = Presentation Dashboard'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07161937027978778567</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSUA4-pec5ifJtz40ujUcDIzDdNLB-Ea41Yd6LK7tt1Ovi0E-ERYnqKphI7399yy_EYBU6kGmD46IWj1TGlfY46GWH_ntbxUoU-UgbI1R9_CyCDOUBMO33MUBDziEyhnU2gpSR4pet_Ppr/s72-c/AnnotatedTimelineWSS.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>