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