Imports System Imports System.Collections.Generic Imports System.ComponentModel Imports System.Data Imports System.Drawing Imports System.Text Imports System.IO.Ports Imports System.Windows.Forms Namespace SiWiComMSI #Region "Public Enumerations" Public Enum LogMsgType Incoming Outgoing Normal Warning [Error] End Enum Public Enum PacketType [Error] Normal End Enum #End Region Public Partial Class SiWiComDevTool_Main Inherits Form #Region "Local Variables" ' Various colors for logging info Private LogMsgTypeColor As Color() = {Color.Gray, Color.LightGray, Color.Goldenrod, Color.Orange, Color.Red} Const WM_NCLBUTTONDOWN As Integer = 161 Const WM_NCHITTEST As Integer = 132 Const HT_CAPTION As Integer = 2 Private pcProtocolInputBuffer As Byte() = New Byte(7) {} Private pcProtocolByteCount As Integer = 0 Private terminalCounter As Integer = 0 #End Region #Region "Constructor" Public Sub New() InitializeComponent() CheckForIllegalCrossThreadCalls = False End Sub #End Region #Region "Local Methods" Protected Overloads Overrides Sub WndProc(ByRef m As Message) MyBase.WndProc(m) If m.Msg = WM_NCHITTEST Then m.Result = DirectCast(HT_CAPTION, IntPtr) End If End Sub ''' Save the user's settings. Private Sub SaveSettings() Try ' If the port is open, close it. If comport.IsOpen Then comport.Close() End If Catch generatedExceptionName As Exception End Try End Sub ''' Populate the form's controls with default settings. Private Sub InitializeControlValues() lstComPort.Items.Clear() lstComPort.Height = 0 For Each s As String In SerialPort.GetPortNames() lstComPort.Items.Add(s) lstComPort.Height += 14 Next If lstComPort.Items.Count = 0 Then MessageBox.Show(Me, "No COM ports detected. " & Chr(10) & "You need at least one free COM port for this to work!!!", "No COM ports detected!", MessageBoxButtons.OK, MessageBoxIcon.[Error]) Me.Close() End If End Sub ''' Open serial port fom communication (9600bps). ''' COM port to open. Private Sub openComport(ByVal port As String) Try ' If the port is open, close it. If comport.IsOpen Then comport.Close() End If ' Set the port's settings comport.BaudRate = 9600 comport.DataBits = 8 comport.StopBits = DirectCast([Enum].Parse(GetType(StopBits), "1"), StopBits) comport.Parity = DirectCast([Enum].Parse(GetType(Parity), "None"), Parity) comport.PortName = port ' Open the port comport.Open() btnConnect.ImageIndex = 1 Catch generatedExceptionName As Exception btnConnect.ImageIndex = 0 MessageBox.Show(Me, "Error connecting to port! " & Chr(10) & "Please check that no other program are connected to the selected COM port.", "Error connecting to port!", MessageBoxButtons.OK, MessageBoxIcon.[Error]) End Try End Sub ''' Adds one byte to the input buffer and validate packet when buffer is full. Private Function pcProtocolGetData() As Byte() pcProtocolByteCount = 0 Return pcProtocolInputBuffer End Function ''' Adds one byte to the input buffer and validate packet when buffer is full. ''' data byte to be added ''' mode = MASTER or SLAVE ''' specific address for the slave device Private Function pcProtocolAddByteToBuffer(ByVal data As Byte) As Boolean Dim gotPacket As Boolean = False If pcProtocolByteCount = 0 Then If data = 10 Then pcProtocolInputBuffer(pcProtocolByteCount) = data pcProtocolByteCount += 1 End If ElseIf pcProtocolByteCount < pcProtocolInputBuffer.Length - 1 Then pcProtocolInputBuffer(pcProtocolByteCount) = data pcProtocolByteCount += 1 ElseIf pcProtocolByteCount = pcProtocolInputBuffer.Length - 1 Then pcProtocolInputBuffer(pcProtocolByteCount) = data If calculateChecksum(pcProtocolInputBuffer) = data Then gotPacket = True Else pcProtocolByteCount = 0 End If End If If gotPacket Then Return True Else Return False End If End Function ''' Calculate checksum for roboMSP packet. ''' The packet to calculate on. ''' Returns the checksum. Private Function calculateChecksum(ByVal data As Byte()) As Byte Dim checksum As Integer = 0 For i As Integer = 0 To (data.Length - 1) - 1 checksum += data(i) Next checksum = checksum And 255 Return CByte(checksum) End Function ''' Extract command discription from roboMSP packet. ''' The packet to extract from. ''' Returns the command discription. Private Function getCommand(ByVal stringToConvert As String) As String Select Case stringToConvert.Substring(3, 2) Case "11" Return "GET_DATA" Case "22" Return "DATA" Case "33" Return "DATA" Case "44" Return "UPDATE" Case "55" Return "UPDATE" Case "FE" Return "ACK" End Select Return "Error" End Function ''' Extract id from roboMSP packet. ''' The packet to extract from. ''' Returns id. Private Function getId(ByVal stringToConvert As String) As String Return stringToConvert.Substring(4, 2) End Function ''' Send the user's data currently entered in the 'send' box. Private Sub SendCommand(ByVal commandToSend As Byte, ByVal inputData As Byte()) Dim data As Byte() = {10, commandToSend, inputData(0), inputData(1), inputData(2), inputData(3), _ inputData(4), 85} data(data.Length - 1) = calculateChecksum(data) Try ' Send the binary data out the port comport.Write(data, 0, data.Length) ' Show the hex digits on in the terminal window Log(LogMsgType.Outgoing, ByteArrayToHexString(data), PacketType.Normal) ' Show the hex digits on in the terminal window 'Log(LogMsgType.Outgoing, ByteArrayToHexString(data), PacketType.Error); Catch generatedExceptionName As Exception End Try End Sub ''' Send ACK command to robot. ''' Id to robot. Private Sub SendACK() Dim data As Byte() = {10, 254, 85, 85, 85, 85, _ 85, 85} data(data.Length - 1) = calculateChecksum(data) Try comport.Write(data, 0, data.Length) ' Show the hex digits on in the terminal window Log(LogMsgType.Outgoing, ByteArrayToHexString(data), PacketType.Normal) ' Show the hex digits on in the terminal window 'Log(LogMsgType.Outgoing, ByteArrayToHexString(data), PacketType.Error); Catch generatedExceptionName As FormatException End Try End Sub ''' Log data to the terminal window. ''' The type of message to be written. ''' The string containing the message to be shown. Private Sub Log(ByVal msgtype As LogMsgType, ByVal msg As String, ByVal packetType As PacketType) If packetType = PacketType.[Error] Then rtfTerminal.SelectedText = String.Empty rtfTerminal.SelectionFont = New Font(rtfTerminal.SelectionFont, FontStyle.Regular) rtfTerminal.SelectionColor = LogMsgTypeColor(4) rtfTerminal.AppendText("Error" & Chr(10) & "") terminalCounter += 1 rtfTerminal.ScrollToCaret() ElseIf msgtype = LogMsgType.Incoming Then rtfTerminal.Invoke(New EventHandler(AddressOf ConvertedAnonymousMethod1)) ElseIf msgtype = LogMsgType.Outgoing Then rtfTerminal.Invoke(New EventHandler(AddressOf ConvertedAnonymousMethod2)) End If If terminalCounter = 300 Then rtfTerminal.Clear() terminalCounter = 0 End If End Sub ''' Convert a string of hex digits (ex: E4 CA B2) to a byte array. ''' The string containing the hex digits (with or without spaces). ''' Returns an array of bytes. Private Sub showDataOnPanel(ByVal data As Byte()) If (data(1) = 34) OrElse (data(1) = 51) Then Dim batTemp As Decimal = Convert.ToDecimal(CSng(data(4)) * 0.0146) Dim tempTemp As Decimal = Convert.ToDecimal(CSng(data(3)) / 9.8) Dim rssiTemp As Decimal = Convert.ToDecimal(CSng(CSByte(data(6))) / 2) lblAddr.Text = data(2).ToString() lblBat.Text = [Decimal].Round(batTemp, 1) + " V" lblRSSI.Text = [Decimal].Round(rssiTemp, 1) + " dB" lblTemp.Text = [Decimal].Round(tempTemp, 1) + " C" End If End Sub ''' Convert a string of hex digits (ex: E4 CA B2) to a byte array. ''' The string containing the hex digits (with or without spaces). ''' Returns an array of bytes. Private Function HexStringToByteArray(ByVal s As String) As Byte() s = s.Replace(" ", "") Dim buffer As Byte() = New Byte(s.Length / 2 - 1) {} For i As Integer = 0 To s.Length - 1 Step 2 buffer(i / 2) = CByte(Convert.ToByte(s.Substring(i, 2), 16)) Next Return buffer End Function ''' Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2) ''' The array of bytes to be translated into a string of hex digits. ''' Returns a well formatted string of hex digits with spacing. Private Function ByteArrayToHexString(ByVal data As Byte()) As String Dim sb As New StringBuilder(data.Length * 3) For Each b As Byte In data sb.Append(Convert.ToString(b, 16).PadLeft(2, "0"C).PadRight(3, " "C)) Next Return sb.ToString().ToUpper() End Function ''' Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2) ''' The array of bytes to be translated into a string of hex digits. ''' Returns a well formatted string of hex digits with spacing. Private Function ByteArrayToCharString(ByVal data As Byte()) As String Dim sb As New StringBuilder(data.Length) For Each b As Byte In data sb.Append(Convert.ToChar(b)) Next Return sb.ToString().ToUpper() End Function #End Region #Region "Event Handlers" Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) InitializeControlValues() End Sub #End Region Private Sub comport_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) ' Obtain the number of bytes waiting in the port's buffer Dim bytes As Integer = comport.BytesToRead Dim buffer As Byte() = New Byte(bytes - 1) {} ' Read the data from the port and store it in our buffer comport.Read(buffer, 0, bytes) For i As Integer = 0 To bytes - 1 'comport.DiscardInBuffer(); If pcProtocolAddByteToBuffer(buffer(i)) Then Dim completePacket As Byte() = pcProtocolGetData() showDataOnPanel(completePacket) ' Show the hex digits on in the terminal window Log(LogMsgType.Incoming, ByteArrayToHexString(completePacket), PacketType.Normal) End If Next End Sub Private Sub lstComPort_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) openComport(lstComPort.Text) lstComPort.Visible = False lblSelectPort.Visible = False End Sub Private Sub SiWiComMSI_Main_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) SaveSettings() End Sub Private Sub btnClose_MouseEnter(ByVal sender As Object, ByVal e As EventArgs) btnClose.ImageIndex = 1 End Sub Private Sub btnClose_MouseLeave(ByVal sender As Object, ByVal e As EventArgs) btnClose.ImageIndex = 0 End Sub Private Sub btnClose_Click(ByVal sender As Object, ByVal e As EventArgs) Me.Close() End Sub Private Sub btnConnect_Click_1(ByVal sender As Object, ByVal e As EventArgs) lstComPort.Visible = True lblSelectPort.Visible = True End Sub Private Sub lblLocalDeviceAddr_Click(ByVal sender As Object, ByVal e As EventArgs) listLocalDeviceAddr.Visible = True End Sub Private Sub lblLocalMasterAddr_Click(ByVal sender As Object, ByVal e As EventArgs) listLocalMasterAddr.Visible = True End Sub Private Sub lblRemoteOldDeviceAddr_Click(ByVal sender As Object, ByVal e As EventArgs) listRemoteOldDeviceAddr.Visible = True End Sub Private Sub lblRemoteNewDeviceAddr_Click(ByVal sender As Object, ByVal e As EventArgs) listRemoteNewDeviceAddr.Visible = True End Sub Private Sub lblRemoteMasterAddr_Click(ByVal sender As Object, ByVal e As EventArgs) listRemoteMasterAddr.Visible = True End Sub Private Sub listLocalDeviceAddr_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) listLocalDeviceAddr.Visible = False lblLocalDeviceAddr.Text = listLocalDeviceAddr.Text End Sub Private Sub listLocalMasterAddr_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) listLocalMasterAddr.Visible = False lblLocalMasterAddr.Text = listLocalMasterAddr.Text End Sub Private Sub listRemoteMasterAddr_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) listRemoteMasterAddr.Visible = False lblRemoteMasterAddr.Text = listRemoteMasterAddr.Text End Sub Private Sub listRemoteNewDeviceAddr_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) listRemoteNewDeviceAddr.Visible = False lblRemoteNewDeviceAddr.Text = listRemoteNewDeviceAddr.Text End Sub Private Sub listRemoteOldDeviceAddr_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) listRemoteOldDeviceAddr.Visible = False lblRemoteOldDeviceAddr.Text = listRemoteOldDeviceAddr.Text End Sub Private Sub btnSendLocal_Click(ByVal sender As Object, ByVal e As EventArgs) Dim tmpPacket As Byte() = {CByte(Convert.ToByte(lblLocalMasterAddr.Text)), CByte(Convert.ToByte(lblLocalDeviceAddr.Text)), CByte(Convert.ToByte(txtLocalWakeUpTime.Text)), 0, 85} SendCommand(68, tmpPacket) lblLocalMasterAddr.Text = "0" lblLocalDeviceAddr.Text = "0" txtLocalWakeUpTime.Text = "0" End Sub Private Sub btnSendRemote_Click(ByVal sender As Object, ByVal e As EventArgs) Dim tmpPacket As Byte() = {CByte(Convert.ToByte(lblRemoteOldDeviceAddr.Text)), CByte(Convert.ToByte(lblRemoteMasterAddr.Text)), CByte(Convert.ToByte(lblRemoteNewDeviceAddr.Text)), CByte(Convert.ToByte(txtRemoteWakeUpTime.Text)), 85} SendCommand(85, tmpPacket) lblRemoteOldDeviceAddr.Text = "0" lblRemoteMasterAddr.Text = "0" lblRemoteNewDeviceAddr.Text = "0" txtRemoteWakeUpTime.Text = "0" End Sub Private Sub btnIDLE_Click(ByVal sender As Object, ByVal e As EventArgs) Dim tmpPacket As Byte() = {0, 0, 0, 1, 85} SendCommand(68, tmpPacket) End Sub Private Sub btnMASTER_Click(ByVal sender As Object, ByVal e As EventArgs) Dim tmpPacket As Byte() = {0, 0, 0, 2, 85} SendCommand(68, tmpPacket) End Sub Private Sub btnSLAVE_Click(ByVal sender As Object, ByVal e As EventArgs) Dim tmpPacket As Byte() = {0, 0, 0, 3, 85} SendCommand(68, tmpPacket) End Sub Private Sub btnNOICEMAKER_Click(ByVal sender As Object, ByVal e As EventArgs) Dim tmpPacket As Byte() = {0, 0, 0, 4, 85} SendCommand(68, tmpPacket) End Sub Private Sub btnGetLocalData_Click(ByVal sender As Object, ByVal e As EventArgs) Dim tmpPacket As Byte() = {85, 85, 85, 85, 85} SendCommand(17, tmpPacket) End Sub Private Sub ConvertedAnonymousMethod1() rtfTerminal.SelectedText = String.Empty rtfTerminal.SelectionFont = New Font(rtfTerminal.SelectionFont, FontStyle.Regular) rtfTerminal.SelectionColor = LogMsgTypeColor(0) rtfTerminal.AppendText(System.DateTime.Now.ToString("[HH:mm:ss]") + " >> ") rtfTerminal.SelectionFont = New Font(rtfTerminal.SelectionFont, FontStyle.Bold) rtfTerminal.SelectionColor = LogMsgTypeColor(0) rtfTerminal.AppendText(DirectCast(+" ", msg)) rtfTerminal.SelectedText = String.Empty rtfTerminal.SelectionFont = New Font(rtfTerminal.SelectionFont, FontStyle.Regular) rtfTerminal.SelectionColor = LogMsgTypeColor(0) rtfTerminal.AppendText(CChar(34) + getCommand(msg) + CChar(34) + "" & Chr(10) & "") terminalCounter += 1 rtfTerminal.ScrollToCaret() End Sub Private Sub ConvertedAnonymousMethod2() rtfTerminal.SelectedText = String.Empty rtfTerminal.SelectionFont = New Font(rtfTerminal.SelectionFont, FontStyle.Regular) rtfTerminal.SelectionColor = LogMsgTypeColor(2) rtfTerminal.AppendText(System.DateTime.Now.ToString("[HH:mm:ss]") + " << ") rtfTerminal.SelectionFont = New Font(rtfTerminal.SelectionFont, FontStyle.Bold) rtfTerminal.SelectionColor = LogMsgTypeColor(2) rtfTerminal.AppendText(DirectCast(+" ", msg)) rtfTerminal.SelectedText = String.Empty rtfTerminal.SelectionFont = New Font(rtfTerminal.SelectionFont, FontStyle.Regular) rtfTerminal.SelectionColor = LogMsgTypeColor(2) rtfTerminal.AppendText(CChar(34) + getCommand(msg) + CChar(34) + "" & Chr(10) & "") terminalCounter += 1 rtfTerminal.ScrollToCaret() End Sub End Class End Namespace