<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>My Blog</title><link>http://www.oppedijk.com:80/Blog</link><item><title>API Management DTAP lessons learned</title><link>http://www.oppedijk.com:80/Blog/api-management-dtap-lessons-learned</link><description>&lt;p&gt;With API management we have seperate environments for Development, Test and Production.&lt;/p&gt;
&lt;p&gt;The best way to move an API from one environment to the other is through GIT at this moment.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.microsoft.com/nl-nl/azure/api-management/api-management-configuration-repository-git"&gt;https://docs.microsoft.com/nl-nl/azure/api-management/api-management-configuration-repository-git&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Visualize differences&lt;/h2&gt;
&lt;p&gt;After setting up the 3 GIT environments and cloning them locally&lt;/p&gt;
&lt;p&gt;We use a 3 way merge tool (&lt;a href="http://meldmerge.org"&gt;http://meldmerge.org&lt;/a&gt;) to display all 3 branches.&lt;/p&gt;
&lt;h2&gt;Best practices&lt;/h2&gt;
&lt;p&gt;Try to keep all files the same across all environments&lt;/p&gt;
&lt;p&gt;Use properties for all Server URL's, (you need to set this from a policy through the set-backend-service expression, because the API ServerURL cannot contain properties at this moment yet (feb 2017)&lt;/p&gt;
&lt;p&gt;Create a property "ENVIRONMENT" and use the "choose" policy expression to select parts of the policy you want to apply. This way all settings are always in GIT available. Future enhancement would be for instance use Azure Key Vault when it is supported by APIM. We use this for different ip-address restrictions on each environment.&lt;/p&gt;
&lt;p&gt;Keep all GUIDS the same across all environments. You can change all guids on demand, except the "Product" guid, where all subscriptions are tied to. We even updated the default "group" guids (administrator, developer, guest) to be the same across all environments.&lt;/p&gt;
&lt;p&gt;Properties can be exported through powershell.&lt;/p&gt;
&lt;p&gt;Don't create new items in Production manually&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description><pubDate>Sat, 04 Feb 2017 20:56:04 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/api-management-dtap-lessons-learned</guid></item><item><title>Troubleshoot IIS Client Certificate issues</title><link>http://www.oppedijk.com:80/Blog/troubleshoot-iis-client-certificate-issues</link><description>&lt;p&gt;IIS has the option to require client certificates, but setting this up requires all settings to be set correctly.&lt;/p&gt;
&lt;h2&gt;The question&lt;/h2&gt;
&lt;p&gt;The customer question was that during a security audit, the server returned no root certificates, and not a list of trusted certificates. Error: No client certificate CA names sent&lt;/p&gt;
&lt;p&gt;The command used: OpenSSL s_client -connect site.customer.com:443&lt;/p&gt;
&lt;p&gt;A certificate trust list needs to be enabled&lt;/p&gt;
&lt;h2&gt;Investigating&lt;/h2&gt;
&lt;p&gt;The behavior to send the trusted issuer list by default is off in Server 2012 and newer. The default value of the SendTrustedIssuerList registry key is now 0 (off by default), instead of 1.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://forums.iis.net/t/1223412.aspx?IIS+8+5+offers+all+client+certificates"&gt;http://forums.iis.net/t/1223412.aspx?IIS+8+5+offers+all+client+certificates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;HKLM\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\SendTrustedIssuerList = 1&lt;/p&gt;
&lt;p&gt;&lt;a href="https://technet.microsoft.com/en-au/library/dn786429.aspx"&gt;https://technet.microsoft.com/en-au/library/dn786429.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;THere is a lot of false info regarding this on the internet, about "client certificate mapping" and "clientauthtrustmode"&lt;/p&gt;
&lt;p&gt;NETSH HTTP SHOW SSLCERT&lt;/p&gt;
&lt;p&gt;Should display a "Ctl store name" when configured correctly.&lt;/p&gt;
&lt;h2&gt;The solution&lt;/h2&gt;
&lt;p&gt;Enable "Negotiate client certificates" this will sent the list directly upon connecting&lt;/p&gt;
&lt;h2&gt;The real solution&lt;/h2&gt;
&lt;p&gt;The security requirement should be changed as well, displaying a list of trusted root certificates will help attackers, by adverstising what a valid certificate is.&lt;/p&gt;
&lt;p&gt;A better security check would be that the security auditor test the connection with several valid certificates from different root CA's to validate that only the correct CA's are trusted.&lt;/p&gt;
&lt;p&gt;Only checking what a server advertises is not a good idea.&lt;/p&gt;</description><pubDate>Sun, 11 Sep 2016 12:45:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/troubleshoot-iis-client-certificate-issues</guid></item><item><title>Azure API management tips &amp; tricks</title><link>http://www.oppedijk.com:80/Blog/azure-api-management-tips-tricks</link><description>&lt;p&gt;Just some random notes on Azure API management:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parse JWT in Azure API management policy:&lt;/strong&gt;&lt;/p&gt;
&lt;p style="margin: 0in; color: #505050; font-family: Consolas; font-size: 9pt;"&gt;&lt;span style="background: #eeeeee;"&gt;@(context.Request.Headers.GetValueOrDefault("Authorization","").AsJwt()?.Subject)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;API management and mobile services&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://giventocode.com/azure-api-management-and-azure-mobile-services#.VmFYAHldGpo"&gt;http://giventocode.com/azure-api-management-and-azure-mobile-services#.VmFYAHldGpo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;?$filter={filter}&amp;amp;$inlinecount={inlinecount}&amp;amp;$orderby={orderby}&amp;amp;$select={select}&amp;amp;$skip={skip}&amp;amp;$top={top}&lt;/p&gt;</description><pubDate>Sun, 17 Apr 2016 19:20:27 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/azure-api-management-tips-tricks</guid></item><item><title>Raspberry Pi and the dynamixel controller</title><link>http://www.oppedijk.com:80/Blog/raspberry-pi-and-the-dynamixel-controller</link><description>&lt;p&gt;Take a look at my new article about the Dynamixel servo's and how to control them from a Raspberry Pi without a CM controller&lt;/p&gt;
&lt;p&gt;&lt;a href="/robotics/control-dynamixel-with-raspberrypi"&gt;control-dynamixel-with-raspberrypi&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sat, 27 Apr 2013 12:55:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/raspberry-pi-and-the-dynamixel-controller</guid></item><item><title>Control Dynamixel AX-12 with NETMF</title><link>http://www.oppedijk.com:80/Blog/control-dynamixel-ax-12-with-netmf</link><description>&lt;p&gt;How to control multiple Robotis Dynamixel AX-12 from a .NET Micro Framework environment.&lt;/p&gt;
&lt;p&gt;The first step is to wire everything up, we use port 0 and 1 for serial RX and TX, and digital port 2 for controlling the half duplex communication. For this we need an 74LS241, take a look at the setup:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://robottini.altervista.org/dynamixel-ax-12a-and-arduino-how-to-use-the-serial-port"&gt;http://robottini.altervista.org/dynamixel-ax-12a-and-arduino-how-to-use-the-serial-port&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;p&gt;&lt;a href="http://savageelectronics.blogspot.com/2011/01/arduino-y-dynamixel-ax-12.html"&gt;http://savageelectronics.blogspot.com/2011/01/arduino-y-dynamixel-ax-12.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We need a 74LS241 connected this way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pin 2 to Pin 3 (data out to AX-12)&lt;/li&gt;
&lt;li&gt;Pin 1 to&amp;nbsp; Pin 19 (connected to Digital 2 on NETMF)&lt;/li&gt;
&lt;li&gt;Pin 18 (connected to RX on NETMF)&lt;/li&gt;
&lt;li&gt;Pin 17 (connected to TX on NETMF&lt;/li&gt;
&lt;li&gt;Pin 10 to ground&lt;/li&gt;
&lt;li&gt;Pin 20 to Vcc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next step is controlling this from code, the TinyCLR wiki helps us a bit:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wiki.tinyclr.com/index.php?title=Dynamixel_AX12"&gt;http://wiki.tinyclr.com/index.php?title=Dynamixel_AX12&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is the code for initializing the serial port to 1.000.000 mbps:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;SerialPort&amp;nbsp;serial&amp;nbsp;=&amp;nbsp;new&amp;nbsp;SerialPort("COM1",&amp;nbsp;1000000,&amp;nbsp;Parity.None,&amp;nbsp;8,&amp;nbsp;StopBits.One);
serial.ReadTimeout&amp;nbsp;=&amp;nbsp;100;
serial.Open();

//fix&amp;nbsp;the&amp;nbsp;baud&amp;nbsp;on&amp;nbsp;COM1&amp;nbsp;to&amp;nbsp;non-standard&amp;nbsp;1000000
Register&amp;nbsp;U0FDR&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Register(0xE000C028);
U0FDR.Write((8&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;4)&amp;nbsp;|&amp;nbsp;1);//fix&amp;nbsp;the&amp;nbsp;fractional&amp;nbsp;divider&amp;nbsp;register

AX12_PacketHandler&amp;nbsp;AX12&amp;nbsp;=&amp;nbsp;new&amp;nbsp;AX12_PacketHandler(serial);
AX12.SetLimits(1, 205, 818);
AX12.move(1, 205);&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span id="more-50"&gt;&lt;/span&gt;Be sure to add references to:&lt;/p&gt;
&lt;p&gt;Microsoft.SPOT.Hardware.SerialPorts&lt;br /&gt;GHIElectronics.NETMF.Hardware (or other if you use another netmf board)&lt;br /&gt;FEZPanda_GHIElectronics.NETMF.FEZ (or FEZ II or other)&lt;/p&gt;
&lt;p&gt;And here is the library from TinyCLR, extended with some higher level functions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt;using&amp;nbsp;System;
using&amp;nbsp;System.IO.Ports;
using&amp;nbsp;Microsoft.SPOT;
using&amp;nbsp;GHIElectronics.NETMF.Hardware.LowLevel;
using&amp;nbsp;Microsoft.SPOT.Hardware;
using&amp;nbsp;GHIElectronics.NETMF.FEZ;

namespace&amp;nbsp;Dynamixel_AX12
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class&amp;nbsp;AX12_PacketHandler
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;SerialPort&amp;nbsp;_ser;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;byte[]&amp;nbsp;_packet&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[20];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;const&amp;nbsp;byte&amp;nbsp;BrodcastID&amp;nbsp;=&amp;nbsp;0xfe;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Register&amp;nbsp;PINSEL0&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Register(0xE002C000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OutputPort&amp;nbsp;Direction_High;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;enum&amp;nbsp;Instruction&amp;nbsp;:&amp;nbsp;byte
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_PING&amp;nbsp;=&amp;nbsp;0x01,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_READ_DATA&amp;nbsp;=&amp;nbsp;0x02,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_WRITE_DATA&amp;nbsp;=&amp;nbsp;0x03,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_REG_WRITE&amp;nbsp;=&amp;nbsp;0x04,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_ACTION&amp;nbsp;=&amp;nbsp;0x05,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_RESET&amp;nbsp;=&amp;nbsp;0x06,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_SYNC_WRITE&amp;nbsp;=&amp;nbsp;0x83,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;enum&amp;nbsp;Address&amp;nbsp;:&amp;nbsp;byte
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_ID&amp;nbsp;=&amp;nbsp;0x01,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_CW_LIMIT&amp;nbsp;=&amp;nbsp;0x06,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_CCW_LIMIT&amp;nbsp;=&amp;nbsp;0x08,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AX_LED&amp;nbsp;=&amp;nbsp;0x19,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;AX12_PacketHandler(SerialPort&amp;nbsp;ser)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&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;(ser.PortName&amp;nbsp;!=&amp;nbsp;"COM1")
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Exception("Only&amp;nbsp;COM1&amp;nbsp;is&amp;nbsp;supported&amp;nbsp;for&amp;nbsp;now");

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Direction_High&amp;nbsp;=&amp;nbsp;new&amp;nbsp;OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di2,&amp;nbsp;false);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_ser&amp;nbsp;=&amp;nbsp;ser;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;byte&amp;nbsp;CalcCRC()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;len&amp;nbsp;=&amp;nbsp;_packet[3]&amp;nbsp;+&amp;nbsp;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;byte&amp;nbsp;crc&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;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;2;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;len&amp;nbsp;+&amp;nbsp;1;&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;crc&amp;nbsp;+=&amp;nbsp;_packet[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;return&amp;nbsp;(byte)(0xFF&amp;nbsp;-&amp;nbsp;crc);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;Send(byte&amp;nbsp;ID,&amp;nbsp;Instruction&amp;nbsp;ins,&amp;nbsp;byte[]&amp;nbsp;param)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;length&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;if&amp;nbsp;(param&amp;nbsp;!=&amp;nbsp;null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;length&amp;nbsp;=&amp;nbsp;param.Length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_packet[0]&amp;nbsp;=&amp;nbsp;0xFF;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_packet[1]&amp;nbsp;=&amp;nbsp;0XFF;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_packet[2]&amp;nbsp;=&amp;nbsp;ID;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_packet[3]&amp;nbsp;=&amp;nbsp;(byte)(length&amp;nbsp;+&amp;nbsp;2);//len
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_packet[4]&amp;nbsp;=&amp;nbsp;(byte)ins;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;5;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;length&amp;nbsp;+&amp;nbsp;5;&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;_packet[i]&amp;nbsp;=&amp;nbsp;param[i&amp;nbsp;-&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;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_packet[length+5]&amp;nbsp;=&amp;nbsp;CalcCRC();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;enable&amp;nbsp;UART0&amp;nbsp;TX&amp;nbsp;pin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Direction_High.Write(true);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;send&amp;nbsp;data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_ser.Write(_packet,&amp;nbsp;0,&amp;nbsp;length+6);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//wait&amp;nbsp;till&amp;nbsp;all&amp;nbsp;is&amp;nbsp;sent
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(_ser.BytesToWrite&amp;nbsp;&amp;gt;&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;//discard&amp;nbsp;echo&amp;nbsp;on&amp;nbsp;RX
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_ser.DiscardInBuffer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;disconnect&amp;nbsp;UART&amp;nbsp;TX&amp;nbsp;pin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Direction_High.Write(false);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//the&amp;nbsp;response&amp;nbsp;is&amp;nbsp;now&amp;nbsp;coming&amp;nbsp;back&amp;nbsp;so&amp;nbsp;you&amp;nbsp;must&amp;nbsp;read&amp;nbsp;it
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;ReadResponse(out&amp;nbsp;byte&amp;nbsp;ID,&amp;nbsp;out&amp;nbsp;byte&amp;nbsp;len,&amp;nbsp;out&amp;nbsp;byte&amp;nbsp;error,&amp;nbsp;byte[]&amp;nbsp;parameters)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;temp&amp;nbsp;=&amp;nbsp;_ser.Read(_packet,&amp;nbsp;0,&amp;nbsp;_packet.Length);
&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;(temp&amp;nbsp;&amp;lt;&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;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ID&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;len&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;error&amp;nbsp;=&amp;nbsp;0xff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;//&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Exception("reading&amp;nbsp;too&amp;nbsp;soon?");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Debug.Print("OK");
&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;(_packet[0]&amp;nbsp;!=&amp;nbsp;0xff&amp;nbsp;||&amp;nbsp;_packet[1]&amp;nbsp;!=&amp;nbsp;0xff)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Exception("Unexpected&amp;nbsp;data");

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ID&amp;nbsp;=&amp;nbsp;_packet[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;len&amp;nbsp;=&amp;nbsp;(byte)(_packet[3]&amp;nbsp;-&amp;nbsp;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;error&amp;nbsp;=&amp;nbsp;_packet[4];&amp;nbsp;//&amp;nbsp;16&amp;nbsp;=&amp;nbsp;CRC&amp;nbsp;error
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;len;&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;parameters[i]&amp;nbsp;=&amp;nbsp;_packet[5&amp;nbsp;+&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;public&amp;nbsp;byte&amp;nbsp;move(byte&amp;nbsp;ID,&amp;nbsp;int&amp;nbsp;value)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte&amp;nbsp;len,&amp;nbsp;error;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;buf&amp;nbsp;=&amp;nbsp;{&amp;nbsp;0x1E,&amp;nbsp;(byte)value,&amp;nbsp;(byte)(value&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;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;Send(ID,&amp;nbsp;AX12_PacketHandler.Instruction.AX_WRITE_DATA,&amp;nbsp;buf);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Thread.Sleep(100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReadResponse(out&amp;nbsp;ID,&amp;nbsp;out&amp;nbsp;len,&amp;nbsp;out&amp;nbsp;error,&amp;nbsp;null);

&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;(error&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;Debug.Print("error:&amp;nbsp;"&amp;nbsp;+&amp;nbsp;error);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;error;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;byte&amp;nbsp;ping(byte&amp;nbsp;ID)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte&amp;nbsp;len,error;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Send(ID,&amp;nbsp;AX12_PacketHandler.Instruction.AX_PING,&amp;nbsp;null);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Thread.Sleep(100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReadResponse(out&amp;nbsp;ID,&amp;nbsp;out&amp;nbsp;len,&amp;nbsp;out&amp;nbsp;error,&amp;nbsp;null);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;error;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;byte&amp;nbsp;ReadLimits(byte&amp;nbsp;ID,&amp;nbsp;out&amp;nbsp;int&amp;nbsp;CW,&amp;nbsp;out&amp;nbsp;int&amp;nbsp;CCW)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte&amp;nbsp;len,&amp;nbsp;error;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;par&amp;nbsp;=&amp;nbsp;new&amp;nbsp;byte[20];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;buf&amp;nbsp;=&amp;nbsp;{&amp;nbsp;0x06,&amp;nbsp;0x04&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Send(ID,&amp;nbsp;AX12_PacketHandler.Instruction.AX_READ_DATA,&amp;nbsp;buf);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Thread.Sleep(100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReadResponse(out&amp;nbsp;ID,&amp;nbsp;out&amp;nbsp;len,&amp;nbsp;out&amp;nbsp;error,&amp;nbsp;par);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CW&amp;nbsp;=&amp;nbsp;par[0]&amp;nbsp;+&amp;nbsp;(par[1]&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;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;CCW&amp;nbsp;=&amp;nbsp;par[2]&amp;nbsp;+&amp;nbsp;(par[3]&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;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;return&amp;nbsp;error;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;511&amp;nbsp;is&amp;nbsp;halfway&amp;nbsp;(150&amp;nbsp;degrees)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;use&amp;nbsp;205,&amp;nbsp;818&amp;nbsp;as&amp;nbsp;limits&amp;nbsp;for&amp;nbsp;180&amp;nbsp;degrees&amp;nbsp;(150-90&amp;nbsp;to&amp;nbsp;150+90)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;byte&amp;nbsp;SetLimits(byte&amp;nbsp;ID,&amp;nbsp;&amp;nbsp;int&amp;nbsp;CW,&amp;nbsp;&amp;nbsp;int&amp;nbsp;CCW)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte&amp;nbsp;len,&amp;nbsp;error;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;buf&amp;nbsp;=&amp;nbsp;{&amp;nbsp;0x06,&amp;nbsp;(byte)CW,&amp;nbsp;(byte)(CW&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;8),&amp;nbsp;(byte)CCW,&amp;nbsp;(byte)(CCW&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;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;Send(ID,&amp;nbsp;AX12_PacketHandler.Instruction.AX_WRITE_DATA,&amp;nbsp;buf);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Thread.Sleep(100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReadResponse(out&amp;nbsp;ID,&amp;nbsp;out&amp;nbsp;len,&amp;nbsp;out&amp;nbsp;error,&amp;nbsp;null);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;error;
&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;/blockquote&gt;</description><pubDate>Sun, 01 Jan 2012 20:22:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/control-dynamixel-ax-12-with-netmf</guid></item><item><title>Create BSB files for your KAP sea charts</title><link>http://www.oppedijk.com:80/Blog/create-bsb-files-for-your-kap-sea-charts</link><description>&lt;p&gt;Some sea charts are just released as KAP files, without the accompanying BSB file. If you run into problems importing the KAP files, there is a way to generate the BSB files.&lt;/p&gt;
&lt;p&gt;For example, these New Zealand maps: &lt;a href="http://mce66.altervista.org/software.html#Free_Nautical_Raster_Maps"&gt;http://mce66.altervista.org/software.html#Free_Nautical_Raster_Maps&lt;/a&gt;&amp;nbsp;are without the BSB files. The KAP files are generated with the MapCal tools (&lt;a href="http://www.dacust.com/inlandwaters/mapcal/"&gt;http://www.dacust.com/inlandwaters/mapcal/&lt;/a&gt;) and the original New Zealand DIR file is also on the website.&lt;/p&gt;
&lt;p&gt;From the MapCal site, download the MC2BSBH tool and run it on the directory with the KAP files. A BSB file is generated for every KAP file.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MC2BSBH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; chartcal.DIR -e BSB&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Normally a BSB file can contain multiple references to KAP files (e.g. detail charts) but I still have to figure that out.&lt;/p&gt;</description><pubDate>Mon, 19 Dec 2011 20:25:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/create-bsb-files-for-your-kap-sea-charts</guid></item><item><title>Analysis of sailboat electronics</title><link>http://www.oppedijk.com:80/Blog/analysis-of-sailboat-electronics</link><description>&lt;p&gt;What would be the ideal high end sailboat instrument system&amp;nbsp;so&amp;nbsp;let&amp;rsquo;s have a look at the components we need (not yet thinking about how to integrate them all):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some displays on the mast (20/20, triton?)&lt;/li&gt;
&lt;li&gt;Speed/log/depth sensors (airmar?)&lt;/li&gt;
&lt;li&gt;Wind speed and direction sensor&lt;/li&gt;
&lt;li&gt;Compass&lt;/li&gt;
&lt;li&gt;Heel and Pitch sensor&lt;/li&gt;
&lt;li&gt;Central CPU&lt;/li&gt;
&lt;li&gt;Barometer and temperature&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what are our options, for the displays not much, these have to be waterproof and daylight readable. The 20/20s are nice, and maybe add some new Triton displays to replace some analogue displays.&lt;span id="more-9"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Airmar has lots of nice sensors for the speed and depth. Airmar DST800?&lt;/p&gt;
&lt;p&gt;For the windspeed, maybe the Airmar PB200, we still need a seperate compass for more accuracy.&lt;/p&gt;
&lt;p&gt;The last components are more expensive and more easily replaced by custom components. &amp;ldquo;Merlin&amp;rdquo; did a lot of work, check out his site at &lt;a href="http://sailboatinstruments.blogspot.com/"&gt;http://sailboatinstruments.blogspot.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tilt compensated compasses are available for around 20-40 euro, instead of the 500+ euros for a Airmar H2183. The same for heel, pitch and barometer sensors, 600 euros each. A CPU to calculate everything is around 100 euro, the only thing we need is the software to calculate this and add a waterproof case.&lt;/p&gt;
&lt;p&gt;In some future posts I&amp;rsquo;ll go into some more details for writing the software and the calculations which need to be done.&lt;/p&gt;</description><pubDate>Sat, 26 Nov 2011 20:25:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/analysis-of-sailboat-electronics</guid></item><item><title>B and G Wind bearings replacement</title><link>http://www.oppedijk.com:80/Blog/b-and-g-wind-bearings-replacement</link><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; The official B &amp;amp; G bearings for the wind angle and wind speed are quite expensive. Why not buy some 3rd party bearings for 10% of the original price.&lt;/p&gt;
&lt;p&gt;&lt;img width="450" height="297" src="http://blobs.oppedijk.com/media/Default/BandG/MHU/bearings.png" /&gt;&lt;a href="http://oppedijk.files.wordpress.com/2011/10/bearings.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Type: &lt;strong&gt;SFR2-5ZZ&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These should match the 213 and 496 Masthead units for Brookes and Gatehouse. &lt;br /&gt;B&amp;amp;G part numbers 213-10-004 and 213-10-038 (&lt;a href="mailto:bg@oppedijk.com"&gt;Contact &lt;/a&gt;me for more information, or just google the part number for a local shop).&lt;/p&gt;
&lt;p&gt;Replacement is quite easy, remove the MHU from the mast, and there is one screw (secured behind a sticker) to remove to seperate the top and bottom parts. just replace the bearings and your windspeed sensor should work fine for a few more years.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://oppedijk.files.wordpress.com/2011/10/213mhu.png"&gt;&lt;/a&gt;&lt;img width="195" height="222" src="http://blobs.oppedijk.com/media/Default/BandG/MHU/213mhu.png" /&gt;&lt;/p&gt;
&lt;p&gt;For the 213 MHU, take a look at the picture above, the screws to open the unit are marked by the red arrows.&lt;/p&gt;
&lt;p&gt;This is a &lt;a href="/Media/Default/BandG/MHU/213_MHU_Parts_breakdown.pdf"&gt;pdf&lt;/a&gt; with all the different parts and their numbers.&lt;/p&gt;
&lt;p&gt;For the 496 unit, check out the pictures below (Thanks to JanW).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img width="450" height="338" src="http://blobs.oppedijk.com/media/Default/BandG/MHU/mhu496_2.jpg" /&gt; &lt;img width="450" height="338" src="http://blobs.oppedijk.com/media/Default/BandG/MHU/mhu496.jpg" /&gt; &lt;a href="http://oppedijk.files.wordpress.com/2011/10/mhu496.jpg"&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sat, 26 Nov 2011 09:00:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/b-and-g-wind-bearings-replacement</guid></item><item><title>Generating OSM tiles with Python to Windows Azure Blob storage</title><link>http://www.oppedijk.com:80/Blog/generating-osm-tiles-with-python-to-windows-azure-blob-storage</link><description>&lt;p&gt;The concept is to generate the tiles for an &lt;a href="http://www.openstreetmap.org/"&gt;OpenStreetMap&lt;/a&gt;&amp;nbsp;or &lt;a href="http://openseamap.org/"&gt;OpenSeaMap&lt;/a&gt;&amp;nbsp;server published to Windows Azure. The advantage of Windows Azure Blob storage is that we can enable the CDN support (content delivery network) to send the tiles more&amp;nbsp;quickly to the visitor.&lt;/p&gt;
&lt;p&gt;Download &lt;a href="https://github.com/sriramk/winazurestorage"&gt;winazurestorage.py &lt;/a&gt;and modify it in&amp;nbsp;3 places&amp;nbsp;to hold your account keys and change the functions to use the real storage and not the development versions. Don&amp;rsquo;t change the CLOUD_BLOB_HOST value!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DEVSTORE_ACCOUNT=&amp;rdquo;youraccountname&amp;rdquo;&lt;br /&gt;DEVSTORE _SECRET_KEY=&amp;rdquo;yoursecretkey&amp;rdquo;&lt;br /&gt;Class BlobStorage, change the host to CLOUD_BLOB_HOST&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Test winazurestorage.py by calling test.py.&lt;/p&gt;
&lt;p&gt;Create a Windows Azure blob container (in this scenario named &amp;ldquo;testcontainer&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;edit &amp;ldquo;generate_tiles.py&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add the following at the top:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;from windowsazurestorage import *&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;find the function &amp;ldquo;def render_tiles&amp;rdquo; and at the last line after the im.save(tile_uri,&amp;rsquo;png256&amp;prime;) add:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;blobs = BlobStorage()&lt;br /&gt; name = str(z) + &amp;ldquo;/&amp;rdquo; + str(x) + &amp;ldquo;/&amp;rdquo; + str(y) + &amp;ldquo;.png&amp;rdquo;&lt;br /&gt;blobs.put_blob(&amp;ldquo;testcontainer&amp;rdquo;, name, im.tostring(&amp;lsquo;png256&amp;prime;), &amp;ldquo;image/png&amp;rdquo;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Run generate_tiles.py&amp;nbsp;and watch the tiles appear in your Azure Blob Storage&lt;/p&gt;</description><pubDate>Sun, 21 Aug 2011 08:00:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/generating-osm-tiles-with-python-to-windows-azure-blob-storage</guid></item><item><title>Domotica links</title><link>http://www.oppedijk.com:80/Blog/domotica-links</link><description>&lt;p&gt;Hierbij wat links voor het meten van je energie verbruik (gas, water, electriciteit) met behulp van bijvoorbeeld een arduino.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.enymate.nl/" target="_blank"&gt;http://www.enymate.nl/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.hekkers.net/domotica/HowToMonitorGasUsage.aspx" target="_blank"&gt;http://www.hekkers.net/domotica/HowToMonitorGasUsage.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bwired.nl/How_rfxcom.asp" target="_blank"&gt;http://bwired.nl/How_rfxcom.asp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.richard.parker.name/2009/02/09/reading-a-gas-meter-with-an-arduino-part-1/" target="_blank"&gt;http://blog.richard.parker.name/2009/02/09/reading-a-gas-meter-with-an-arduino-part-1/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.currentcost.com/" target="_blank"&gt;http://www.currentcost.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.efergy.com/" target="_blank"&gt;http://www.efergy.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://openenergymonitor.org/" target="_blank"&gt;http://openenergymonitor.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voor het gebruik van een CNY70 is deze link misschien handig, aangezien de CNY niet altijd even scherp &amp;ldquo;ziet&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.aaamc.nl/softio/cny/"&gt;http://www.aaamc.nl/softio/cny/&lt;/a&gt;&lt;/p&gt;</description><pubDate>Wed, 17 Aug 2011 08:00:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/domotica-links</guid></item><item><title>future posts</title><link>http://www.oppedijk.com:80/Blog/future-posts</link><description>&lt;p&gt;Here&amp;rsquo;s my todo list for writing articles about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Importing buoys for openseamap.org&lt;/li&gt;
&lt;li&gt;Importing lights for openseamap.org&lt;/li&gt;
&lt;li&gt;Sailboat instruments system breakdown&lt;/li&gt;
&lt;li&gt;Inexpensive Sailboat instrument system&lt;/li&gt;
&lt;li&gt;B&amp;amp;G analysis&lt;/li&gt;
&lt;li&gt;RepRap&lt;/li&gt;
&lt;li&gt;Arduino / FEZ Panda II&lt;/li&gt;
&lt;li&gt;and more&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 14 Jul 2011 08:00:00 GMT</pubDate><guid isPermaLink="true">http://www.oppedijk.com:80/Blog/future-posts</guid></item></channel></rss>