Sometimes I like to write code to simplify my life, particularly when I need to call the same routines over and over. Over the years, I have pieced a few code elements together to help make the NCD Component Library easier for me to use. Some of this code is old, some is new, some is tested heavily, and some of it is random ideas I have had over the years. A recent post on the forum prompted me to release the code, as I have been meaning to do this for a long time anyway. This code represents a new class for Visual Studio, and I frequently call many of the routines in this class. I would really like to point out two class items that have been added, as they greatly simplify communications to the I2C port on Fusion, BridgeX5, and other USART to I2C converters we manufacture (some of which are very small). The I2C code class works with all of them, so have fun and hopefully you find something of use. Please note a working implementation of this library is ALWAYS included with Base Station source code, which will soon be posted on GitHub.
Using this Library, the following function calls are now possible, making I2C communications much more like Python or Arduino controllers:
NCDLib.I2C.Write
NCDLib.I2C.Read
The above function will wrap up your RAW I2C Address and variables (as found in the datasheet of your I2C chip) and communicate to the I2C device via serial communications. I hope to add direct support for many common chips over the next few years, but for now, here is a sample of the commands working with a MCP3428:
NCDLib.I2C.Chip.MCP3428.Setup_Channel(NCDComponent1, 0, GetAddressInteger(ADDR_A.SelectedItem), 1, Resolution, Gain)
Complete source code for these functions are shown below. I would advise picking out what you need, as there are many functions below that are completely irrelevant and random (as they are used by Base Station).
Imports System.Reflection
Imports System.IO
Imports System.Windows.Forms
Imports NCD
Public Class NCDLib
Public Class Wireless
Public Class S3B_API
Public Class ZigBeeData
Public Addr As Array ' Address in data frame
Public Data As Array ' Data in data frame
Public Valid As Boolean ' if the data is valid
End Class
Public Shared Sub Send(ByRef _ncd As NCD.NCDComponent, ByVal Address As Array, ByVal TXData As Array)
'This function is used to format and send API data for S3B Modules, making communications with remote devices much easier
Dim API As New ArrayList
Dim DataLength As Integer
Dim MSB_Length As Byte
Dim LSB_Length As Byte
Dim CkSum As Integer
Dim Temporary As Integer
DataLength = TXData.Length + 14 'Calculate the Length of the Array
MSB_Length = DataLength >> 8
LSB_Length = DataLength And 255
Debug.Print(MSB_Length.ToString)
Debug.Print(LSB_Length.ToString)
API.Add(126) '0,Header 0x7e
API.Add(MSB_Length) '1,Length of Packet MSB
API.Add(LSB_Length) '2,Length of Packet LSB
API.Add(16) '3,Reserved
API.Add(0) '4,Reserved no response come back to make read eaiser
API.AddRange(Address)
API.Add(255) ' 0xfffe
API.Add(254) ' 0xfffe
API.Add(0) ' 15 set max hops, 0 for maxium
API.Add(0) ' 16, options 0, for disable ack
API.AddRange(TXData)
'Calculate Checksum
CkSum = 0
For Temporary = 3 To API.Count - 1
CkSum = CkSum + API(Temporary)
Next
CkSum = 255 - CkSum Mod 256
API.Add(CkSum)
Debug.Print(CkSum)
'Send API Frame to Device
'im d As Byte() = CType(API.ToArray(GetType(Byte)), Byte())
Dim d(API.Count - 1) As Byte
For i = 0 To API.Count - 1
d(i) = API(i)
Next
NCDLib.WriteBytes(_ncd, 0, d)
End Sub
Public Shared Function Receive(ByRef _ncd As NCD.NCDComponent) As ZigBeeData
Dim rec As New ZigBeeData
rec.Valid = False
'This function is used to receive and decode API data from S3B Modules, this function will return Address and Data to the caller
Dim r As Integer
r = _ncd.ReadByte()
If (r <> 126) Then
Return rec
End If
Dim msb, lsb As Integer
msb = _ncd.ReadByte
lsb = _ncd.ReadByte
If (msb = -1) Or (lsb = -1) Then
Return rec
End If
'read length
Dim nLen As Integer = msb * 256 + lsb
Dim frameType As Integer
frameType = _ncd.ReadByte
If (frameType <> &H90) Then
Return rec
End If
' read 8 bytes address
Dim addr As New ArrayList
For i = 1 To 8
Dim na As Integer
na = _ncd.ReadByte()
If (na <> -1) Then
addr.Add(na)
Else
Return rec
End If
Next
' read 0xfffe
Dim reserved As Integer
reserved = _ncd.ReadByte()
If (reserved = -1) Then
Return rec
End If
reserved = _ncd.ReadByte()
If (reserved = -1) Then
Return rec
End If
Dim options As Integer
' read options
options = _ncd.ReadByte()
If (options = -1) Then
Return rec
End If
Dim recData As New ArrayList
For i = 1 To nLen - 12
Dim rd As Integer = _ncd.ReadByte
If (rd <> -1) Then
recData.Add(rd)
Else
Return rec
End If
Next
Dim checksum As Integer = _ncd.ReadByte()
If (checksum = -1) Then
Return rec
End If
Dim addr1(8 - 1) As Byte
For i = 0 To 7
addr1(i) = addr(i)
Next
Dim data1(recData.Count - 1) As Byte
For i = 0 To recData.Count - 1
data1(i) = recData(i)
Next
rec.Addr = addr1
rec.Data = data1
rec.Valid = True
Return rec
End Function
End Class
End Class
Public Class Safe
Public Shared Function FusionFirmwareVersionCheck(ByVal RequiredFirmwareVersionLarge As Integer, ByVal RequiredFirmwareVersionSmall As Integer, ByVal CurrentFirmwareVersionLarge As Integer, ByVal CurrentFirmwareVersionSmall As Integer, DialogBox As Boolean)
'The purpose of this function is to check a require firmware version against a current firmware version
'If it's safe, this function returns True, otherwise, it returns false
'Default this Function to Fail, Make it PROVE True
FusionFirmwareVersionCheck = False
Dim RequiredWord As Integer = 0
Dim CurrentWord As Integer = 0
RequiredWord = (RequiredFirmwareVersionLarge * 256) + RequiredFirmwareVersionSmall
CurrentWord = (CurrentFirmwareVersionLarge * 256) + CurrentFirmwareVersionSmall
If CurrentWord >= RequiredWord Then
FusionFirmwareVersionCheck = True
Else
If DialogBox = True Then
MsgBox("Fusion Firmware Version 4." + Str(RequiredFirmwareVersionLarge) + "." + Str(RequiredFirmwareVersionSmall) + " or Later is Required to Set Counter Events, Please Contact NCD Support to Arrange for a Firmware Upgrade. Your Fusion Controller is Using Firmware Version 4." + Str(CurrentFirmwareVersionLarge) + "." + Str(CurrentFirmwareVersionSmall) + ".")
End If
End If
Return FusionFirmwareVersionCheck
End Function
Public Shared Function Limit_8BIT(ByVal Value As Integer)
If Value > 255 Then Value = 255
If Value < 0 Then Value = 0
Limit_8BIT = Value
End Function
Public Shared Function Limit_10BIT(ByVal Value As Integer)
If Value > 1023 Then Value = 1023
If Value < 0 Then Value = 0
Limit_10BIT = Value
End Function
Public Shared Function Limit_12BIT(ByVal Value As Integer)
If Value > 4095 Then Value = 4095
If Value < 0 Then Value = 0
Limit_12BIT = Value
End Function
Public Shared Function Limit_16BIT(ByVal Value As Integer)
If Value > 65535 Then Value = 65535
If Value < 0 Then Value = 0
Limit_16BIT = Value
End Function
Public Shared Function Limit_Value(ByVal Value As Integer, LowerLimit As Integer, UpperLimit As Integer)
If Value > UpperLimit Then Value = UpperLimit
If Value < LowerLimit Then Value = LowerLimit
Limit_Value = Value
End Function
End Class
Public Class Fusion
Public Const CON_BlockCount = 64
Public Const CON_AllConfiguration = 0
Public Const CON_DeviceConfiguration = 1
Public Const CON_ProxrRelayMap = 2
Public Const CON_Taralist = 3
Public Const CON_ReactorStandard = 4
Public Const CON_ReactorTLEE = 5
Public Const CON_RemoteAccess = 6
Public Const MAX_DATA_SIZE = &H8100 ' max size of data block is 16K
Public Shared Sub SaveTLEEBlock(ByRef _ncd As NCD.NCDComponent, _BlockID As Integer, F As Array)
Debug.Print("SaveTLEEBlock: " & _BlockID.ToString)
Dim ckSum As Integer = 0
'Filter F Array
For temp As Integer = 0 To 15
If F(temp) < 0 Then F(temp) = 0
If F(temp) > 255 Then F(temp) = 255
Next
'Compute Checksum
ckSum = 0
For temp = 0 To 15
ckSum = ckSum + F(temp)
Next temp
ckSum = (ckSum And 255)
NCDLib.WriteBytesAPI(_ncd, True, 0, 4, NCDLib.Math.GetLSB(_BlockID), NCDLib.Math.GetMSB(_BlockID), F(0), F(1), F(2), F(3), F(4), F(5), F(6), F(7), F(8), F(9), F(10), F(11), F(12), F(13), F(14), F(15), ckSum)
Debug.Print("END SaveTLEEBlock")
End Sub
Public Shared Function LoadTLEEBlock(ByRef _ncd As NCD.NCDComponent, _BlockID As Integer)
Debug.Print("LoadTLEEBlock: " & _BlockID.ToString)
Dim ckSum As Integer = 0
Dim F As Array
NCDLib.WriteBytesAPI(_ncd, True, 0, 3, NCDLib.Math.GetLSB(_BlockID), NCDLib.Math.GetMSB(_BlockID))
F = NCDLib.ReadBytesAPI(_ncd, True, 17)
If (Not (F Is Nothing)) Then
If (F.Length < 16) Then
Debug.Print(F.Length)
End If
For Temp As Integer = 0 To 15
ckSum = ckSum + F(Temp)
Next
ckSum = (ckSum And 255)
If ckSum = F(16) Then
Debug.Print("Block Loaded")
Return F
Else
Debug.Print("--------------> CKSUM ERROR: " & F(16) & " " & ckSum)
End If
End If
For Temp As Integer = 0 To 15
F(Temp) = 255 'Return FF to User for Code Handling
Next
Debug.Print("ERROR: LoadTLEEBlock")
Return F
End Function
End Class
Public Class ReactorV2
Public Shared Function Translate(Method As String, Dat As Integer, LongDescription As Boolean) 'As String
Try
' (Distance3.Value * 0.25) / 12) : CM3.Text = String.Format("{0:f1}", (Distance3.Value * 0.25) * 2.54)
'OK 8-Bit Analog Voltage
'OK 10-Bit Analog Voltage
'OK 12-Bit Analog Voltage
'OK 16-Bit Analog Voltage
'Distance in Inches
'Distance in Feet
'Distance in Centimeters
'Distance in Meters
'Temperature in Celsius
'Temperature in Fahrenheit
'Current in Amps/ma
Debug.Print("Translate")
Debug.Print(Method)
Debug.Print(Dat)
Select Case Method
Case "8-Bit Analog Voltage"
Dim Voltage As Integer = 5
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} V", (Voltage / 256) * Level)
Else
Result = String.Format("{0:f2} Volts. No Not Exceed +5VDC On ANY Analog Input.", (Voltage / 256) * Level)
End If
Return Result
Case "10-Bit Analog Voltage"
Dim Voltage As Integer = 5
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} V", (Voltage / 1024) * Level)
Else
Result = String.Format("{0:f2} Volts. No Not Exceed +5VDC On ANY Analog Input.", (Voltage / 1024) * Level)
End If
Return Result
Case "12-Bit Analog Voltage"
Dim Voltage As Integer = 5
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} V", (Voltage / 4096) * Level)
Else
Result = String.Format("{0:f2} Volts. No Not Exceed +5VDC On ANY Analog Input.", (Voltage / 4096) * Level)
End If
Return Result
Case "16-Bit Analog Voltage"
Dim Voltage As Integer = 5
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} V", (Voltage / 65536) * Level)
Else
Result = String.Format("{0:f2} Volts. No Not Exceed +5VDC On ANY Analog Input.", (Voltage / 65536) * Level)
End If
Return Result
Case "Distance in Inches"
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} In", (0.25 * Level))
Else
Result = String.Format("{0:f2} Inches", (0.25 * Level))
End If
Return Result
Case "Distance in Feet"
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} Ft", (0.25 * Level) / 12)
Else
Result = String.Format("{0:f2} Feet", (0.25 * Level) / 12)
End If
Return Result
Case "Distance in Centimeters"
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} cm", (0.25 * Level) * 2.54)
Else
Result = String.Format("{0:f2} Centimeters", (0.25 * Level) * 2.54)
End If
Return Result
Case "Distance in Meters"
Dim Level As Integer = Dat
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} M", ((0.25 * Level) * 2.54) / 10)
Else
Result = String.Format("{0:f2} Meters", ((0.25 * Level) * 2.54) / 10)
End If
Return Result
Case "Current in Amps/ma ACS712ELCTR-05B 185mv per Amp"
Dim Sensativity As Double = 0.185
'If Translator.SelectedItem = "ACS712ELCTR-05B 185mv per Amp" Then Sensativity = 0.185
'If Translator.SelectedItem = "ACS712ELCTR-20A 100mv per Amp" Then Sensativity = 0.1
'If Translator.SelectedItem = "ACS712ELCTR-30A 66mv per Amp" Then Sensativity = 0.066
Dim BitVolts As Double = 5 / 256 'BitVolts = 5 Volts Divided by 256 (8-Bit has 256 Posibilities)
Dim CalcCurrent As Double = (Dat * BitVolts) / Sensativity
Dim Result As String
If LongDescription = False Then
Result = String.Format("{0:f2} A", CalcCurrent)
Else
Result = String.Format("{0:f2} Amps. Amperage Values are Approximate.", CalcCurrent)
End If
Return Result
End Select
Catch
Debug.Print("Unable to Translate")
End Try
Return 0
End Function
Public Shared InterpreterListSize As Integer = 10
Public Shared Function InterpreterList()
Dim DropOptions(InterpreterListSize) As String
' B(13) = 0 8-Bit Analog Voltage
' B(13) = 1 10-Bit Analog Voltage
' B(13) = 2 12-Bit Analog Voltage
' B(13) = 3 16-Bit Analog Voltage
' B(13) = 4 Distance in Inches
' B(13) = 5 Distance in Feet
' B(13) = 6 Distance in Centimeters
' B(13) = 7 Distance in Meters
' B(13) = 8 Temperature in Celsius
' B(13) = 9 Temperature in Fahrenheit
' B(13) = 10 Current in Amps/ma ACS712ELCTR-05B 185mv per Amp
DropOptions(0) = "8-Bit Analog Voltage"
DropOptions(1) = "10-Bit Analog Voltage"
DropOptions(2) = "12-Bit Analog Voltage"
DropOptions(3) = "16-Bit Analog Voltage"
DropOptions(4) = "Distance in Inches"
DropOptions(5) = "Distance in Feet"
DropOptions(6) = "Distance in Centimeters"
DropOptions(7) = "Distance in Meters"
DropOptions(8) = "Temperature in Celsius"
DropOptions(9) = "Temperature in Fahrenheit"
DropOptions(10) = "Current in Amps/ma ACS712ELCTR-05B 185mv per Amp"
Return DropOptions
End Function
Public Class MasterEventList_4_0_0
'Versions BEFORE 4.0.3
Public Shared EventListSize_Base As Integer = 231 'Contains Events that do not require Parameters
Public Shared EventListSize_All As Integer = 240 'Contains All Events including those that require Parameters
'Versions 4.0.3 and AFTER!
'Public Shared EventListSize_Base As Integer = 245 'Contains Events that do not require Parameters
'Public Shared EventListSize_All As Integer = 245 'Contains All Events including those that require Parameters
''4.0.3 and Later Use these variables
'Public Shared EventListSize_MIN As Integer = 241
'Public Shared EventListSize_MAX As Integer = 245 '241-245 Do NOT Require Parameters
End Class
Public Class MasterEventList_4_0_3
'Versions BEFORE 4.0.3
'Public Shared EventListSize_Base As Integer = 231 'Contains Events that do not require Parameters
'Public Shared EventListSize_All As Integer = 240 'Contains All Events including those that require Parameters
'Versions 4.0.3 and AFTER!
Public Shared EventListSize_Base As Integer = 245 'Contains Events that do not require Parameters
Public Shared EventListSize_All As Integer = 245 'Contains All Events including those that require Parameters
''4.0.3 and Later Use these variables
'Public Shared EventListSize_MIN As Integer = 241
'Public Shared EventListSize_MAX As Integer = 245 '241-245 Do NOT Require Parameters
End Class
Public Class MasterEventList_4_0_5
'Versions BEFORE 4.0.3
'Public Shared EventListSize_Base As Integer = 231 'Contains Events that do not require Parameters
'Public Shared EventListSize_All As Integer = 240 'Contains All Events including those that require Parameters
'Versions 4.0.3 and AFTER!
Public Shared EventListSize_Base As Integer = 249 'Contains Events that do not require Parameters
Public Shared EventListSize_All As Integer = 249 'Contains All Events including those that require Parameters
''4.0.3 and Later Use these variables
'Public Shared EventListSize_MIN As Integer = 241
'Public Shared EventListSize_MAX As Integer = 245 '241-245 Do NOT Require Parameters
End Class
End Class
Public Class Math
Public Shared Function GetMSB(ByVal V As UInt16) As Byte
Dim Result As Byte = 0
Result = V >> 8
Return Result
End Function
Public Shared Function GetLSB(ByVal V As UInt16) As Byte
Dim Result As Byte = 0
Result = V And 255
Return Result
End Function
''' <summary>
''' Set bit of byte to specific value
''' </summary>
''' <param name="v">byte to set</param>
''' <param name="pos">position of bit, start from 0, </param>
''' <param name="bitValue">value of bit, 0 or 1</param>
''' <returns>byte with specific bit set</returns>
''' <remarks></remarks>
Public Shared Function SetBitEnum(ByVal v As Byte, ByVal pos As Byte, ByVal bitValue As enumBitValue) As Byte
If (pos > 7) Then
Throw New ArgumentOutOfRangeException("Position", pos, "Position should range from 0 to 7")
End If
Return SetBit(v, pos, CByte(bitValue))
End Function
Public Enum enumBitValue
[ON]
Off
End Enum
''' <summary>
''' Get specfic bit of byte
''' </summary>
''' <param name="v">value of byte</param>
''' <param name="pos">position of byte</param>
''' <returns>0 or 1</returns>
''' <remarks></remarks>
Public Shared Function GetBit(ByVal v As Byte, ByVal pos As Byte) As Byte
If (pos > 7) Then
Throw New ArgumentOutOfRangeException("Position", pos, "Position should range from 0 to 7")
End If
Dim result As Byte = v
' set the bit to sepecific value
' bitValue << pos ' calculate the value of bit in byte
' v1 And v2 do an and operation
Dim value As Byte = 1 << pos
result = CByte(v And value)
If (result > 0) Then
result = 1
End If
Return result
End Function
Public Shared Function GetBit16(ByVal v As UInt16, ByVal pos As Byte) As Byte
If (pos > 15) Then
Throw New ArgumentOutOfRangeException("Position", pos, "Position should range from 0 to 15")
End If
Dim result As UInt16 = v
' set the bit to sepecific value
' bitValue << pos ' calculate the value of bit in byte
' v1 And v2 do an and operation
Dim value As UInt16 = 1 << pos
result = CUInt(v And value)
If (result > 0) Then
result = 1
End If
Return result
End Function
''' <summary>
''' Set bit of byte to specific value
''' </summary>
''' <param name="v">byte to set</param>
''' <param name="pos">position of bit, start from 0, </param>
''' <param name="bitValue">value of bit, 0 or 1</param>
''' <returns>byte with specific bit set</returns>
''' <remarks></remarks>
Public Shared Function SetBit(ByRef v As Byte, ByVal pos As Byte, ByVal bitValue As Byte) As Byte
If (pos > 7) Then
Throw New ArgumentOutOfRangeException("Position", pos, "Position should range from 0 to 7")
End If
If (bitValue > 1) Then
Throw New ArgumentOutOfRangeException("Bit Value", bitValue, "Bit Value should range from 0 to 1")
End If
Dim result As Byte = v
' set the bit to sepecific value
' bitValue << pos ' calculate the value of bit in byte
' v1 And v2 do an and operation
Dim value As Byte = 1 << pos
result = CByte(v Or value)
result = CByte(result - value)
' we use CByte to conver the result to byte forcely
' calculate the value if a byte with that bit only set to the specfic value
'If Bit Value is 0, it is not modified, but if Bit Value is 1 then Bit is Turned On
value = bitValue << pos
result = CByte(result + value)
v = result
Return result
End Function
Public Shared Function SetBit16(ByRef v As UInt16, ByVal pos As Byte, ByVal bitValue As Byte) As UInt16
If (pos > 15) Then
Throw New ArgumentOutOfRangeException("Position", pos, "Position should range from 0 to 7")
End If
If (bitValue > 1) Then
Throw New ArgumentOutOfRangeException("Bit Value", bitValue, "Bit Value should range from 0 to 1")
End If
Dim result As UInt16 = v
' set the bit to sepecific value
' bitValue << pos ' calculate the value of bit in byte
' v1 And v2 do an and operation
Dim value As UInt16 = 1 << pos
result = CUInt(v Or value)
result = CUInt(result - value)
' we use CByte to conver the result to byte forcely
' calculate the value if a byte with that bit only set to the specfic value
'If Bit Value is 0, it is not modified, but if Bit Value is 1 then Bit is Turned On
' to convert bitValue to CUint is very IMPORTANT, otherwise it will works like byte only
value = CUInt(bitValue) << pos
result = CUInt(result + value)
v = result
Return result
End Function
Public Shared Function DecToBinaryString(ByVal V As Byte) As String
Dim str As String = String.Empty
Dim i As Integer = 0
For i = 0 To 7
If GetBit(V, i) = 0 Then
str = str + "0"
Else
str = str + "1"
End If
Next
Return str
End Function
Public Shared Function DecToBinaryStringStandard(ByVal V As Byte) As String
Dim str As String = String.Empty
Dim i As Integer = 0
For i = 7 To 0 Step -1
If GetBit(V, i) = 0 Then
str = str + "0"
Else
str = str + "1"
End If
Next
Return str
End Function
Public Shared Function BinaryStringToDec(ByVal V As String) As Byte
Return System.Convert.ToByte(V, 2)
End Function
Public Shared Function DecToHexString(ByVal V As Byte) As String
'Return String.Format("{0:X2}", V)
Return V.ToString("X2")
End Function
Public Shared Function HexStringToDec(ByVal V As String) As Byte
Return Byte.Parse(V, Globalization.NumberStyles.AllowHexSpecifier)
End Function
''' <summary>
''' Convert an byte to binary code decimal
''' </summary>
''' <param name="v"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ConvertToBCD(ByVal v As Byte) As Byte
Dim a As Byte = System.Math.Floor(v / 10)
Dim b As Byte = v Mod 10
Return a * 16 + b
End Function
''' <summary>
''' Convert an binary code decimal to decimal
''' </summary>
''' <param name="v"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ConvertFromBCD(ByVal v As Byte) As Byte
Dim a As Byte = System.Math.Floor(v / 16)
Dim b As Byte = v Mod 16
Return a * 10 + b
End Function
End Class
''' <summary>
''' File IO class handle all File's IO operation
''' </summary>
''' <remarks></remarks>
Public Class FileIO
Public Shared Function SaveDialog()
End Function
Public Shared Function LoadDialog()
End Function
Public Shared Function SaveQuiet()
End Function
Public Shared Function LoadQuiet()
End Function
Public Shared Function CheckFileExistance()
End Function
End Class
Public Class DeviceInitialization
Public Shared Function Discover_Baud_Rate(ByRef _ncd As NCDComponent) As Boolean
'_ncd.SerialPort.StopBits = Ports.StopBits.Two
Dim Result As Boolean = False
Dim test As Integer = 0
'_ncd.SerialPort.BaudRate = 115200
test = Test_2WAY_RAW(_ncd)
test = Test_2WAY_RAW(_ncd)
If test = 85 Or test = 86 Then
Result = True
Return Result
Exit Function
End If
_ncd.BaudRate = 57600
test = Test_2WAY_RAW(_ncd)
test = Test_2WAY_RAW(_ncd)
If test = 85 Or test = 86 Then
Result = True
Return Result
Exit Function
End If
_ncd.BaudRate = 9600
test = Test_2WAY_RAW(_ncd)
test = Test_2WAY_RAW(_ncd)
If test = 85 Or test = 86 Then
Result = True
Return Result
Exit Function
End If
End Function
Public Shared Function Test_Compatibility(ByRef _ncd As NCDComponent) As Boolean
'_ncd.SerialPort.StopBits = Ports.StopBits.Two
Dim Result As Boolean = False
Dim test As Integer = 0
'_ncd.SerialPort.DiscardInBuffer() 'Clear Serial Port
_ncd.Purge()
System.Threading.Thread.Sleep(10)
'_ncd.WriteByte(254)
'System.Threading.Thread.Sleep(1)
'_ncd.WriteByte(246)
NCDLib.WriteBytes(_ncd, 1, 254, 246)
_ncd.SetTcpWritePace(1)
_ncd.Flush()
System.Threading.Thread.Sleep(10)
'_ncd.WriteBytes(New Byte() {254, 246})
Dim IDA As Integer = _ncd.ReadByte()
Dim IDB As Integer = _ncd.ReadByte()
Dim IDC As Integer = _ncd.ReadByte()
Dim IDD As Integer = _ncd.ReadByte()
If IDA >= 64 And IDA <= 69 Then
Result = True
Else
'Result = True
MsgBox("This software is not designed to work with the controller you are using.")
End If
Return Result
Exit Function
'_ncd.SerialPort.BaudRate = 115200
'test = Test_2WAY_RAW(_ncd)
'test = Test_2WAY_RAW(_ncd)
'If test = 85 Or test = 86 Then
' Result = True
' Return Result
' Exit Function
'End If
'_ncd.SerialPort.BaudRate = 57600
'test = Test_2WAY_RAW(_ncd)
'test = Test_2WAY_RAW(_ncd)
'If test = 85 Or test = 86 Then
' Result = True
' Return Result
' Exit Function
'End If
'_ncd.SerialPort.BaudRate = 9600
'test = Test_2WAY_RAW(_ncd)
'test = Test_2WAY_RAW(_ncd)
'If test = 85 Or test = 86 Then
' Result = True
' Return Result
' Exit Function
'End If
End Function
Public Shared Function Test_2WAY_RAW(ByRef _ncd As NCDComponent) As Integer
'_ncd.SerialPort.ReadTimeout = 500
'_ncd.SerialPort.DiscardInBuffer()
_ncd.Purge()
NCDLib.WriteBytes(_ncd, 1, 254, 33)
_ncd.SetTcpWritePace(1)
_ncd.Flush()
Dim result As Integer = _ncd.ReadByte
Return result
End Function
Public Shared Function Test_For_Configuration_Mode(ByRef _ncd As NCDComponent) As Boolean
Dim result As Boolean = False
Dim retry As Integer = 0
If (Not _ncd.IsOpen) Then
Return False
End If
Restart:
'_ncd.SerialPort.ReadTimeout = 1000
'_ncd.SerialPort.DiscardInBuffer()
_ncd.Purge()
NCDLib.WriteBytes(_ncd, 1, 254, 33)
_ncd.SetTcpWritePace(1)
_ncd.Flush()
Dim result2 As Integer = _ncd.ReadByte
Debug.Print("Result of Communications " + result2.ToString)
If result2 <> 85 Then
If result2 <> 86 Then
retry = retry + 1
If retry < 4 Then
GoTo Restart
End If
End If
End If
If result2 = 85 Then
MsgBox("Cannot Save. Controller is in Runtime Mode and Must be Set to Program Mode. Move PGM/RUN Jumpter to PGM positon and Try Again.")
result = False
Return result
Else
If result2 = 86 Then
Debug.Print("Controller is ready for this program.")
result = True
Return result
Else
MsgBox("Unable to Communicate with Controller.")
result = False
Return result
End If
End If
End Function
Public Shared Function SerialPortDialog()
End Function
Public Shared Function ZigBee_S1Dialog()
End Function
Public Shared Function ZB_S2Dialog()
End Function
Public Shared Function XSC_Dialog()
End Function
Public Shared Function DM_Dialog()
End Function
End Class
Public Class EEPROMIO
Const Filter As String = "NCD EEPROM FILES(*.ncd)|*.ncd|All Files(*.*)|(*.*)"
Const DefaultFilename As String = "EEPROM.ncd"
Public EEPROM As Byte() = New Byte(255) {}
Public Function SaveDialog() As Boolean
Dim result As Boolean = False
Dim SaveFileDialog1 As SaveFileDialog = New SaveFileDialog
SaveFileDialog1.InitialDirectory = GetDefaultNCDFileFolder()
SaveFileDialog1.Filter = Filter
SaveFileDialog1.FileName = "EEPROM.NCD"
If (SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then
SaveFile(SaveFileDialog1.FileName, EEPROM)
result = True
Else
result = False
End If
Return result
End Function
Public Sub SaveFileQuite()
Dim file As String = GetDefaultNCDFilePath()
SaveFile(file, EEPROM)
End Sub
''' <summary>
''' Save file to specific path
''' </summary>
''' <param name="filename"></param>
''' <param name="data"></param>
''' <remarks></remarks>
Public Sub SaveFile(ByVal filename As String, ByVal data As Byte())
Try
Dim sw As BinaryWriter = New BinaryWriter(File.Open(filename, FileMode.Create))
Dim version As Integer = 1
Dim length As Integer = data.Length
Dim i As Integer = 0
sw.Write(version)
sw.Write(length)
sw.Write(data, 0, length)
Dim chksum As Integer = GetCheckSum(data)
sw.Write(chksum)
sw.Flush()
sw.Close()
DumpEEPROM()
Catch ex As Exception
Throw New Exception("Write ncd file failure")
End Try
End Sub
Public Sub LoadFileQuite()
Dim filename As String = GetDefaultNCDFilePath()
EEPROM = LoadFile(filename)
End Sub
''' <summary>
''' Load file from specific path
''' </summary>
''' <param name="filename"></param>
''' <returns>bytes read from file</returns>
''' <remarks></remarks>
''' <exception cref="Exception">Corrupt NCD File</exception>
Public Function LoadFile(ByVal filename As String) As Byte()
Dim data As Byte() = Nothing
Try
Dim sr As BinaryReader = New BinaryReader(File.Open(filename, FileMode.Open))
Dim version As Integer = sr.ReadInt32()
Dim length As Integer = sr.ReadInt32()
data = sr.ReadBytes(length)
Dim checksum As Integer = sr.ReadInt32()
If (checksum <> GetCheckSum(data)) Then
Throw New Exception("Corrupt NCD File")
End If
sr.Close()
Catch ex As Exception
Throw New Exception("Corrupt NCD File")
End Try
Return data
End Function
Public Function LoadDialog() As Boolean
Dim result As Boolean = False
Dim OpenFileDialog1 As OpenFileDialog = New OpenFileDialog
OpenFileDialog1.InitialDirectory = GetDefaultNCDFileFolder()
OpenFileDialog1.FileName = DefaultFilename
OpenFileDialog1.Filter = Filter
If (OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then
EEPROM = LoadFile(OpenFileDialog1.FileName)
result = True
Else
result = False
End If
Return result
End Function
Public Sub DumpEEPROM()
Debug.Print("begin dump")
Dim i As Integer = 0
For i = 0 To EEPROM.Length - 1
System.Diagnostics.Debug.Write(NCDLib.Math.DecToHexString(EEPROM(i)) + " ")
If (i Mod 16) = 0 Then
System.Diagnostics.Debug.WriteLine("")
End If
Next
Debug.Print("end dump")
End Sub
Private Function GetDefaultNCDFileFolder() As String
' get current executing assembly
Dim app As Assembly = Assembly.GetExecutingAssembly()
Dim locationPath As String = Path.GetDirectoryName(app.ManifestModule.FullyQualifiedName)
'Dim ncdFilePath As String = locationPath + "\EEPROM.ncd"
'Return ncdFilePath
Return locationPath
End Function
Private Function GetDefaultNCDFilePath()
Return GetDefaultNCDFileFolder() + "\" + DefaultFilename
End Function
''' <summary>
''' Get the checksum of array
''' </summary>
''' <param name="a"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function GetCheckSum(ByVal a As Byte()) As Integer
Dim i As Integer = 0
Dim checksum As Integer = 0
For i = 0 To a.Length - 1
checksum = checksum + a(i)
Next
Return checksum
End Function
''' <summary>
''' This function is used to store EEPROM Data to NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Function To_Chip(ByRef _ncd As NCD.NCDComponent, ByRef _block As Byte) As Boolean
Dim retry As Integer = 0
RetryIt:
Dim result As Boolean = False
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
If _block = 15 Then
Debug.Print("Block 15 Cannot be Stored by this Function...Quietyly Emulating Storage of this block...")
result = True
Return result
End If
'_ncd.SerialPort.DiscardInBuffer()
_ncd.Purge()
'If (_ncd.UsingComPort) Then
NCDLib.WriteBytes(_ncd, 2, 0, 2, _block)
_ncd.SetTcpWritePace(2)
_ncd.Flush()
DELA()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_ncd.WriteByte(EEPROM(DataByte + (_block * 16))) 'One Byte at a Time
DELA()
Checksum += EEPROM(DataByte + (_block * 16)) 'Include Each Byte in the Checkum Value
'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
Next DataByte
Checksum = Checksum And 255
_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
Dim ReturnValue As Integer = _ncd.ReadByte() 'Wait for the Controller to Respond with 85 Confirmation Byte
If ReturnValue = 85 Then 'If 85 is Returned from the controller
result = True 'This Function was successful and the Result is True
Else
retry = retry + 1
Debug.Print("retry " + retry.ToString)
If retry < 4 Then
GoTo RetryIt
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to store EEPROM Data to NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Function To_ChipFast(ByRef _ncd As NCD.NCDComponent, ByRef _block As Byte) As Boolean
Dim retry As Integer = 0
RetryIt:
Dim result As Boolean = False
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
If _block = 15 Then
Debug.Print("Block 15 Cannot be Stored by this Function...Quietyly Emulating Storage of this block...")
result = True
Return result
End If
_ncd.Purge()
'If (_ncd.UsingComPort) Then
_ncd.WriteBytes(0, 2, _block)
'_ncd.SetTcpWritePace(2)
_ncd.Flush()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_ncd.WriteByte(EEPROM(DataByte + (_block * 16))) 'One Byte at a Time
Checksum += EEPROM(DataByte + (_block * 16)) 'Include Each Byte in the Checkum Value
Next DataByte
Checksum = Checksum And 255
_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
'Else
'Dim Checksum As Integer = 0 'Define Checksum
'Dim tmp(0 To 19) As Byte
'tmp(0) = 0
'tmp(1) = 2
'tmp(2) = _block
'For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
' '_ncd.WriteByte(EEPROM(DataByte + (_block * 16))) 'One Byte at a Time
' tmp(DataByte + 3) = EEPROM(DataByte + (_block * 16))
' Checksum += EEPROM(DataByte + (_block * 16)) 'Include Each Byte in the Checkum Value
' 'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
'Next DataByte
'Checksum = Checksum And 255
'tmp(19) = Checksum
''_ncd.SetTcpWritePace(0)
''_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
'Threading.Thread.Sleep(1000)
'End If
Dim ReturnValue As Integer = _ncd.ReadByte() 'Wait for the Controller to Respond with 85 Confirmation Byte
If ReturnValue = 85 Then 'If 85 is Returned from the controller
result = True 'This Function was successful and the Result is True
Else
retry = retry + 1
Debug.Print("retry " + retry.ToString)
If retry < 4 Then
GoTo RetryIt
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to store EEPROM Data to NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Shared Function To_EEPROM_Chip(ByRef _ncd As NCD.NCDComponent, ByVal _blockId As Integer, ByVal blockData As Byte()) As Boolean
Dim retry As Integer = 0
RetryIt:
Dim result As Boolean = False
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
'_ncd.SerialPort.DiscardInBuffer()
'DELA()
'_ncd.WriteByte(0) 'Send Header Byte
'DELA()
'_ncd.WriteByte(4) 'Send Store Command
'DELA()
'_ncd.WriteByte(NCDLib.Math.GetLSB(_blockId)) 'Send Block
'DELA()
'_ncd.WriteByte(NCDLib.Math.GetMSB(_blockId)) 'Send Block
'_ncd.WriteBytes(New Byte() {0, 4, NCDLib.Math.GetLSB(_blockId), NCDLib.Math.GetMSB(_blockId)})
NCDLib.WriteBytes(_ncd, 2, 0, 4, NCDLib.Math.GetLSB(_blockId), NCDLib.Math.GetMSB(_blockId))
_ncd.SetTcpWritePace(2)
_ncd.Flush()
DELA()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_ncd.WriteByte(blockData(DataByte)) 'One Byte at a Time
DELA()
Checksum += blockData(DataByte) 'Include Each Byte in the Checkum Value
'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
Next DataByte
Checksum = Checksum And 255
_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
Dim ReturnValue As Integer = _ncd.ReadByte() 'Wait for the Controller to Respond with 85 Confirmation Byte
If ReturnValue = 85 Then 'If 85 is Returned from the controller
result = True 'This Function was successful and the Result is True
Else
retry = retry + 1
If retry < 4 Then
GoTo RetryIt
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to store EEPROM Data to NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Shared Function To_EEPROM_ChipFast(ByRef _ncd As NCD.NCDComponent, ByVal _blockId As Integer, ByVal blockData As Byte()) As Boolean
Dim retry As Integer = 0
RetryIt:
Dim result As Boolean = False
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
'_ncd.TRIIWriteBytes(0, 4, NCDLib.Math.GetLSB(_blockId), NCDLib.Math.GetMSB(_blockId))
'Dim Checksum As Integer = 0 'Define Checksum
'For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
' _ncd.TRIIWriteBytes(blockData(DataByte)) 'One Byte at a Time
' Checksum += blockData(DataByte) 'Include Each Byte in the Checkum Value
' 'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
'Next DataByte
'Checksum = Checksum And 255
'_ncd.TRIIWriteBytes(Checksum) 'Send the Checksum Value to the Controller
'_ncd.SetTcpWritePace(0)
'_ncd.Flush()
'Dim ReturnValue As Integer = _ncd.ReadByte() 'Wait for the Controller to Respond with 85 Confirmation Byte
'If ReturnValue = 85 Then 'If 85 is Returned from the controller
' result = True 'This Function was successful and the Result is True
'Else
' Debug.Print(ReturnValue.ToString)
' retry = retry + 1
' Debug.Print("retry save to eeprom " & retry)
' If retry < 4 Then
' GoTo RetryIt
' End If
'End If
Dim a As ArrayList = New ArrayList
a.Add(0)
a.Add(4)
a.Add(NCDLib.Math.GetLSB(_blockId))
a.Add(NCDLib.Math.GetMSB(_blockId))
'WriteBytesAPI(_ncd, True, 0, 4, NCDLib.Math.GetLSB(_blockId), NCDLib.Math.GetMSB(_blockId))
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
'WriteBytesAPI(_ncd, True, blockData(DataByte)) 'One Byte at a Time
a.Add(blockData(DataByte))
Checksum += blockData(DataByte) 'Include Each Byte in the Checkum Value
'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
Next DataByte
Checksum = Checksum And 255
'WriteBytesAPI(_ncd, True, Checksum) 'Send the Checksum Value to the Controller
a.Add(Checksum)
Dim aB(a.Count - 1) As Byte
For i As Integer = 0 To a.Count - 1
aB(i) = a(i)
Next
WriteBytesAPI(_ncd, True, aB)
_ncd.SetTcpWritePace(0)
_ncd.Flush()
Dim ReturnValue As Integer = ReadByteAPI(_ncd, True) 'Wait for the Controller to Respond with 85 Confirmation Byte
If ReturnValue = 85 Then 'If 85 is Returned from the controller
result = True 'This Function was successful and the Result is True
Else
Debug.Print(ReturnValue.ToString)
retry = retry + 1
Debug.Print("retry save to eeprom " & retry)
If retry < 4 Then
GoTo RetryIt
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to store EEPROM Data to NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Function To_Chip_PROTECTED(ByRef _ncd As NCD.NCDComponent, ByRef _block As Byte) As Boolean
Dim retry As Integer = 0
RetryIt:
Dim result As Boolean = False
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
If _block <> 15 Then
Debug.Print("This Function Only Works for Block 15")
result = False
Return result
End If
'_ncd.SerialPort.DiscardInBuffer()
'DELA()
'_ncd.WriteByte(0) 'Send Header Byte
'DELA()
'_ncd.WriteByte(2) 'Send Store Command
'DELA()
'_ncd.WriteByte(15) 'Send Block 15 ONLY
'DELA()
'_ncd.WriteBytes(New Byte() {0, 2, 15})
NCDLib.WriteBytes(_ncd, 2, 0, 2, 15)
_ncd.SetTcpWritePace(2)
_ncd.Flush()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_ncd.WriteByte(EEPROM(DataByte + (_block * 16))) 'One Byte at a Time
DELA()
Checksum += EEPROM(DataByte + (_block * 16)) 'Include Each Byte in the Checkum Value
'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
Next DataByte
Checksum = Checksum And 255
_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
Dim ReturnValue As Integer = _ncd.ReadByte() 'Wait for the Controller to Respond with 85 Confirmation Byte
If ReturnValue = 85 Then 'If 85 is Returned from the controller
result = True 'This Function was successful and the Result is True
Else
retry = retry + 1
If retry < 4 Then
GoTo RetryIt
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to store EEPROM Data to NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Function To_Chip_ProtectedFast(ByRef _ncd As NCD.NCDComponent, ByRef _block As Byte) As Boolean
Dim retry As Integer = 0
RetryIt:
Dim result As Boolean = False
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
If _block <> 15 Then
Debug.Print("This Function Only Works for Block 15")
result = False
Return result
End If
_ncd.WriteBytes(0, 2, 15)
_ncd.SetTcpWritePace(0)
_ncd.Flush()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_ncd.WriteByte(EEPROM(DataByte + (_block * 16))) 'One Byte at a Time
_ncd.Flush()
Checksum += EEPROM(DataByte + (_block * 16)) 'Include Each Byte in the Checkum Value
'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
Next DataByte
Checksum = Checksum And 255
_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
_ncd.Flush()
Dim ReturnValue As Integer = _ncd.ReadByte() 'Wait for the Controller to Respond with 85 Confirmation Byte
If ReturnValue = 85 Then 'If 85 is Returned from the controller
result = True 'This Function was successful and the Result is True
Else
retry = retry + 1
If retry < 4 Then
GoTo RetryIt
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to Get EEPROM Data from NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Function From_Chip(ByRef _ncd As NCD.NCDComponent, ByRef _block As Byte) As Boolean
Dim result As Boolean = False
Dim Retrys As Integer = 0
Retry:
Dim ErrorCode As Integer = 0
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
Try
'If (_ncd.UsingComPort) Then
' DELA()
' _ncd.WriteByte(0) 'Send Header Byte
' DELA()
' _ncd.WriteByte(1) 'Send Retrieve Command Byte
' DELA()
' _ncd.WriteByte(_block) 'Send Block
' DELA()
'Else
' _ncd.WriteBytes(New Byte() {0, 1, _block})
'End If
_ncd.SetTcpWritePace(2)
NCDLib.WriteBytes(_ncd, 2, 0, 1, _block)
_ncd.Flush()
Threading.Thread.Sleep(50)
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
EEPROM(DataByte + (_block * 16)) = _ncd.ReadByte() 'One Byte at a Time
'Debug.Print(EEPROM(DataByte + (_block * 16)).ToString)
Checksum += EEPROM(DataByte + (_block * 16)) 'Include Each Byte in the Checkum Value
Threading.Thread.Sleep(30)
Next DataByte
Checksum = Checksum And 255
Dim ReturnValue As Byte = _ncd.ReadByte() 'Wait for the Controller to Respond with Checksum Value
If ReturnValue = Checksum Then 'If Checksum Matches Returned Value from the controller
Debug.Print("CORRECT" + _block.ToString)
result = True 'This Function was successful and the Result is True
ErrorCode = 0
Else
Debug.Print("ERROR: CHECKSUM")
ErrorCode = 1
End If
Catch
Debug.Print("Communication Error.")
ErrorCode = 2
End Try
If ErrorCode <> 0 Then
Debug.Print("RETRY ERROR")
Retrys = Retrys + 1
If Retrys < 10 Then
GoTo Retry
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to Get EEPROM Data from NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Function From_ChipFast(ByRef _ncd As NCD.NCDComponent, ByRef _block As Byte) As Boolean
Dim result As Boolean = False
Dim Retrys As Integer = 0
Retry:
Dim ErrorCode As Integer = 0
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
Try
_ncd.SetTcpWritePace(2)
_ncd.WriteBytes(0, 1, _block)
_ncd.Flush()
'Threading.Thread.Sleep(50)
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
EEPROM(DataByte + (_block * 16)) = _ncd.ReadByte() 'One Byte at a Time
'Debug.Print(EEPROM(DataByte + (_block * 16)).ToString)
Checksum += EEPROM(DataByte + (_block * 16)) 'Include Each Byte in the Checkum Value
'Threading.Thread.Sleep(30)
Next DataByte
Checksum = Checksum And 255
Dim ReturnValue As Byte = _ncd.ReadByte() 'Wait for the Controller to Respond with Checksum Value
If ReturnValue = Checksum Then 'If Checksum Matches Returned Value from the controller
Debug.Print("CORRECT" + _block.ToString)
result = True 'This Function was successful and the Result is True
ErrorCode = 0
Else
Debug.Print("ERROR: CHECKSUM")
ErrorCode = 1
End If
Catch
Debug.Print("Communication Error.")
ErrorCode = 2
End Try
If ErrorCode <> 0 Then
Debug.Print("RETRY ERROR")
Retrys = Retrys + 1
If Retrys < 10 Then
GoTo Retry
End If
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' Read a block, return null if fail
''' </summary>
''' <param name="_ncd"></param>
''' <param name="_block"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ReadBlock(ByRef _ncd As NCD.NCDComponent, ByRef _block As Byte) As Byte()
Dim data(15) As Byte
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return Nothing 'Return Result to the Caller and Exit Function
End If
Try
'DELA()
'_ncd.WriteByte(0) 'Send Header Byte
'DELA()
'_ncd.WriteByte(1) 'Send Retrieve Command Byte
'DELA()
'_ncd.WriteByte(_block) 'Send Block
'_ncd.WriteBytes(New Byte() {0, 1, _block})
NCDLib.WriteBytes(_ncd, 2, 0, 1, _block)
_ncd.SetTcpWritePace(2)
_ncd.Flush()
_ncd.SetTcpWritePace(0)
DELA()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
data(DataByte) = _ncd.ReadByte() 'One Byte at a Time
'Debug.Print(EEPROM(DataByte + (_block * 16)).ToString)
Checksum += data(DataByte) 'Include Each Byte in the Checkum Value
Next DataByte
Checksum = Checksum And 255
Dim ReturnValue As Byte = _ncd.ReadByte() 'Wait for the Controller to Respond with Checksum Value
If ReturnValue = Checksum Then 'If Checksum Matches Returned Value from the controller
Debug.Print("CORRECT" + _block.ToString)
Else
Debug.Print("ERROR: CHECKSUM")
data = Nothing
End If
Catch
Debug.Print("Communication Error.")
data = Nothing
End Try
Return data
End Function
''' <summary>
''' Write a block to chip
''' </summary>
''' <param name="_ncd"></param>
''' <param name="_blockId"></param>
''' <param name="blockData"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function WriteBlock(ByRef _ncd As NCD.NCDComponent, ByVal _blockId As Integer, ByVal blockData As Byte()) As Boolean
Dim result As Boolean = False
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return result 'Return Result to the Caller and Exit Function
End If
'_ncd.SerialPort.DiscardInBuffer()
'DELA()
'_ncd.WriteByte(0) 'Send Header Byte
'DELA()
'_ncd.WriteByte(2) 'Send Store Command
'DELA()
'_ncd.WriteByte(_blockId) 'Send Block
'DELA()
_ncd.Purge()
'_ncd.WriteBytes(0, 2, _blockId)
NCDLib.WriteBytes(_ncd, 2, 0, 2, _blockId)
_ncd.SetTcpWritePace(2)
_ncd.Flush()
If (_ncd.UsingComPort) Then
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_ncd.WriteByte(blockData(DataByte)) 'One Byte at a Time
DELA()
Checksum += blockData(DataByte) 'Include Each Byte in the Checkum Value
'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
Next DataByte
Checksum = Checksum And 255
_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
Else
Dim Checksum As Integer = 0 'Define Checksum
_ncd.WriteBytes(blockData) 'One Byte at a Time
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
Checksum += blockData(DataByte) 'Include Each Byte in the Checkum Value
'Debug.Print("Storing 2:" + EEPROM(DataByte + (_block * 16)).ToString)
Next DataByte
Checksum = Checksum And 255
_ncd.WriteByte(Checksum) 'Send the Checksum Value to the Controller
End If
Dim ReturnValue As Integer = _ncd.ReadByte() 'Wait for the Controller to Respond with 85 Confirmation Byte
If ReturnValue = 85 Then 'If 85 is Returned from the controller
result = True 'This Function was successful and the Result is True
Else
result = False
End If
Return result 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to Get EEPROM Data from NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Shared Function From_EEPROM_Chip(ByRef _ncd As NCD.NCDComponent, ByVal _blockNo As UShort) As Byte()
Dim result As Boolean = False
Dim Retrys As Integer = 0
Dim _data(15) As Byte
Retry:
Dim ErrorCode As Integer = 0
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return Nothing 'Return Result to the Caller and Exit Function
End If
Try
'DELA()
'_ncd.WriteByte(0) 'Send Header Byte
'DELA()
'_ncd.WriteByte(3) 'Send Retrieve Command Byte
'DELA()
'_ncd.WriteByte(NCDLib.Math.GetLSB(_blockNo)) 'Send Block
'DELA()
'_ncd.WriteByte(NCDLib.Math.GetMSB(_blockNo)) 'Send Block
'DELA()
'_ncd.WriteBytes(New Byte() {0, 3, NCDLib.Math.GetLSB(_blockNo), NCDLib.Math.GetMSB(_blockNo)})
NCDLib.WriteBytes(_ncd, 2, 0, 3, NCDLib.Math.GetLSB(_blockNo), NCDLib.Math.GetMSB(_blockNo))
_ncd.SetTcpWritePace(2)
_ncd.Flush()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_data(DataByte) = _ncd.ReadByte() 'One Byte at a Time
'Debug.Print(EEPROM(DataByte + (_block * 16)).ToString)
Checksum += _data(DataByte) 'Include Each Byte in the Checkum Value
Next DataByte
Checksum = Checksum And 255
Dim ReturnValue As Byte = _ncd.ReadByte() 'Wait for the Controller to Respond with Checksum Value
If ReturnValue = Checksum Then 'If Checksum Matches Returned Value from the controller
Debug.Print("CORRECT")
result = True 'This Function was successful and the Result is True
ErrorCode = 0
Else
Debug.Print("ERROR: CHECKSUM")
_data = Nothing
ErrorCode = 1
End If
Catch
Debug.Print("Communication Error.")
ErrorCode = 2
End Try
If ErrorCode <> 0 Then
Debug.Print("RETRY ERROR")
Retrys = Retrys + 1
If Retrys < 10 Then
GoTo Retry
End If
End If
Return _data 'Return Result to Caller and Exit Function
End Function
''' <summary>
''' This function is used to Get EEPROM Data from NCD CPU
''' </summary>
''' <returns>Assume This Function Fails Unless Otherwise Notified by Result</returns>
''' <remarks></remarks>
Public Shared Function From_EEPROM_ChipFast(ByRef _ncd As NCD.NCDComponent, ByVal _blockNo As UShort) As Byte()
Dim result As Boolean = False
Dim Retrys As Integer = 0
Dim _data(15) As Byte
Retry:
Dim ErrorCode As Integer = 0
If Not _ncd.IsOpen Then 'Check to Make Sure Port is Open
Debug.Print("Port is not opened") 'Debug if Port is Closed
Return Nothing 'Return Result to the Caller and Exit Function
End If
Try
_ncd.WriteBytes(0, 3, NCDLib.Math.GetLSB(_blockNo), NCDLib.Math.GetMSB(_blockNo))
_ncd.SetTcpWritePace(2)
_ncd.Flush()
Dim Checksum As Integer = 0 'Define Checksum
For DataByte As Integer = 0 To 15 'Send EEPROM Data to Controller
_data(DataByte) = _ncd.ReadByte() 'One Byte at a Time
'Debug.Print(EEPROM(DataByte + (_block * 16)).ToString)
Checksum += _data(DataByte) 'Include Each Byte in the Checkum Value
Next DataByte
Checksum = Checksum And 255
Dim ReturnValue As Byte = _ncd.ReadByte() 'Wait for the Controller to Respond with Checksum Value
If ReturnValue = Checksum Then 'If Checksum Matches Returned Value from the controller
Debug.Print("CORRECT")
result = True 'This Function was successful and the Result is True
ErrorCode = 0
Else
Debug.Print("ERROR: CHECKSUM")
_data = Nothing
ErrorCode = 1
End If
Catch
Debug.Print("Communication Error.")
ErrorCode = 2
End Try
If ErrorCode <> 0 Then
Debug.Print("RETRY ERROR")
Retrys = Retrys + 1
If Retrys < 10 Then
GoTo Retry
End If
End If
Return _data 'Return Result to Caller and Exit Function
End Function
Public Shared Sub DELA()
System.Threading.Thread.Sleep(10)
End Sub
End Class
Shared Sub WriteBytes(ByRef ncdObj As NCD.NCDComponent, ByVal sleep As Integer, ByVal ParamArray data As Byte())
For i As Integer = 0 To data.Length - 1
ncdObj.WriteByte(data(i))
Threading.Thread.Sleep(sleep)
Next
'If (ncdObj.UsingComPort) Then
' For i As Integer = 0 To data.Length - 1
' ncdObj.WriteByte(data(i))
' Threading.Thread.Sleep(sleep)
' Next
'Else
' ncdObj.WriteBytes(data)
'End If
End Sub
''' <summary>
''' string format for sending and receiving string, 0 for decimal as default and 1 for hex
''' </summary>
''' <remarks></remarks>
Private Shared StringFormat As Integer = 0
''' <summary>
''' method to setup the showing format. 0 for deciaml, 1 for hex
''' </summary>
''' <param name="format"></param>
''' <remarks></remarks>
Public Shared Sub SetStringFormat(ByVal format As Integer)
StringFormat = format
End Sub
''' <summary>
''' static varible for last send data, in decimal string
''' </summary>
''' <remarks></remarks>
Private Shared LastSendString As String
''' <summary>
''' static varible for last received data, in decimal string
''' </summary>
''' <remarks></remarks>
Private Shared LastRecString As String
''' <summary>
''' return the last send command in decimal format
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetLastTransmitString() As String
Return LastSendString
End Function
''' <summary>
''' return the last received data in decimal format
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetLastReceivingString() As String
Return LastRecString
End Function
''' <summary>
''' return the string with space in current format
''' </summary>
''' <param name="num"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Shared Function GetShowString(ByVal num As Integer) As String
If StringFormat = 0 Then
Return num.ToString & " "
End If
Return String.Format("0x{0:X2} ", num)
End Function
Public Shared Function WriteBytesAPI(ByRef ncdObj As NCD.NCDComponent, ByVal UsingAPI As Boolean, ByVal ParamArray data() As Byte) As Boolean
LastSendString = ""
ncdObj.Purge()
If (UsingAPI) Then
ncdObj.SetTcpWritePace(0)
' write in api mode
Dim ApiPackage As ArrayList = New ArrayList
ApiPackage.Add(170) ' header
LastSendString = LastSendString & GetShowString(170)
ApiPackage.Add(data.Length) ' length
LastSendString = LastSendString & GetShowString(data.Length)
ApiPackage.AddRange(data) ' data
Dim checksum As Integer = 170 + data.Length
For i As Integer = 0 To data.Length - 1
checksum = checksum + data(i)
LastSendString = LastSendString & GetShowString(data(i))
Next
checksum = checksum Mod &H100
ApiPackage.Add(checksum) ' check sum
LastSendString = LastSendString & GetShowString(checksum)
Dim b(ApiPackage.Count - 1) As Byte
Debug.Print("API START")
For i = 0 To ApiPackage.Count - 1
b(i) = ApiPackage(i)
Debug.Print(b(i).ToString)
Next
Debug.Print("API STOP")
ncdObj.WriteBytes(b)
' Dim j = ncdObj.ReadByte()
'For Each it In ApiPackage
' ncdObj.WriteByte(it)
'Next
ncdObj.Flush()
Else
ncdObj.WriteBytes(data)
ncdObj.Flush()
For Each d As Integer In data
LastSendString = LastSendString & GetShowString(d)
Next
End If
'If (NCDComponent1.UsingComPort) Then
' For i As Integer = 0 To data.Length - 1
' NCDComponent1.WriteByte(data(i))
' ' Threading.Thread.Sleep(sleep)
' Next
'Else
' NCDComponent1.WriteBytes(data)
'End If
Return True
End Function
' return data back from module
Public Shared Function ReadBytesAPI(ByRef ncdObj As NCD.NCDComponent, ByVal UsingAPI As Boolean, ByVal bytesCount As Integer) As Byte()
'Debug.Print("START READ BYES")
LastRecString = ""
ncdObj.Sleep(200) ' to all load/save routing work, some times it can't get data back
Dim rdata As ArrayList = New ArrayList
If (UsingAPI) Then
Dim ack As Integer = ncdObj.ReadByte()
If (ack <> 170) Then
ncdObj.Purge()
Return Nothing
End If
LastRecString += GetShowString(170)
Dim length As Integer
length = ncdObj.ReadByte()
If (length <> bytesCount) Then
ncdObj.Purge()
Return Nothing
End If
LastRecString += GetShowString(length)
Dim checkSumC As Integer = 170 + length
For m As Integer = 0 To bytesCount - 1
Dim d As Integer = ncdObj.ReadByte()
If (d = -1) Then ' time out
Return Nothing
End If
rdata.Add(d)
checkSumC = checkSumC + d
LastRecString += GetShowString(d)
Next
Dim checksum As Integer
checksum = ncdObj.ReadByte
If (checksum = -1 Or (checksum <> (checkSumC Mod &H100))) Then
ncdObj.Purge()
Return Nothing
End If
LastRecString += GetShowString(checksum)
Else
For m As Integer = 0 To bytesCount - 1
Dim d As Integer = ncdObj.ReadByte()
If (d = -1) Then ' time out
Return Nothing
End If
rdata.Add(d)
LastRecString += GetShowString(d)
Next
End If
'Report Data to User
Dim dataRec() As Byte
ReDim dataRec(bytesCount - 1)
For i As Integer = 0 To bytesCount - 1
dataRec(i) = rdata(i)
Next
'Debug.Print("END READ BYES")
Return dataRec
End Function
Public Shared Function Read_Digi_900HP_APIFrame(ByRef ncdObj As NCD.NCDComponent)
LastRecString = ""
Dim rdata As ArrayList = New ArrayList
Dim length_MS As Integer
Dim length_LS As Integer
Dim length As Integer 'Setup a Length of Packet Integer
Dim BytesCount As Integer = 0 'XXX is the Unknown Number of Bytes
Dim D As Integer
'126 00 23 144 00 19 162 00 65 91 117 195 255 254 193 127 01 00 01 01 91 128 99 237 03 39 81
Dim ack As Integer = ncdObj.ReadByte() 'Look For a Header
If (ack <> 126) Then 'If an Invalid Head is Received Exit this Routine
ncdObj.Purge()
Return Nothing
End If
LastRecString += GetShowString(126) 'Add Data into the Last Received String
length_MS = ncdObj.ReadByte() 'Define the Length Value Based on the Packet
LastRecString += GetShowString(length_MS) 'Add Data into the Last Received String
length_LS = ncdObj.ReadByte() 'Define the Length Value Based on the Packet
LastRecString += GetShowString(length_LS) 'Add Data into the Last Received String
length = (length_MS * 256) + length_LS
Dim checkSumC As Integer = 0 '170 + length 'Setup a Checksum Value to Include the 170 Header and Length Values
' Dim d As Integer = ncdObj.ReadByte() 'Receive the Byte of Data from the User
rdata.Add(D) 'Add a NULL Byte into the D Array
For m As Integer = 1 To length 'Count Through Each Byte in the Length Value
Dim Rx As Integer = ncdObj.ReadByte() 'Receive the Byte of Data from the User
'Debug.Print(d.ToString + " m:" + m.ToString)
rdata.Add(Rx) 'Add the Received Byte to the rData Array
checkSumC = checkSumC + Rx 'Add the Received Data into the Checksum
LastRecString += GetShowString(Rx) 'Add Data into the Last Received String
Next
Dim checksum As Integer 'Setup a Checksum Value
checksum = ncdObj.ReadByte 'Read the Checksum from Device
If (checksum = -1) Then 'Or (checksum <> (checkSumC Mod &H100))) Then 'Compare Received Checksum with Computed Checksum, If INVALID
ncdObj.Purge() 'Exit this Function and Return NO Data
Return Nothing
End If
LastRecString += GetShowString(checksum) 'Add the Checksum Value into the Last Received String
ReturnData:
'Report Data to User
Dim dataRec() As Byte
ReDim dataRec(length)
'Debug.Print("Total Bytes Received:")
dataRec(0) = length
' Debug.Print(dataRec(0))
' Debug.Print("Data Bytes:")
For i As Integer = 1 To length
dataRec(i) = rdata(i)
'Debug.Print(dataRec(i))
Next
' Debug.Print("Error???")
' Debug.Print(dataRec(0))
Return dataRec
End Function
' return data back from module
Public Shared Function ReadUnknownNumberOfBytesAPI(ByRef ncdObj As NCD.NCDComponent, ByVal UsingAPI As Boolean) As Byte()
LastRecString = ""
Dim rdata As ArrayList = New ArrayList
Dim length As Integer 'Setup a Length of Packet Integer
Dim BytesCount As Integer = 0 'XXX is the Unknown Number of Bytes
Dim D As Integer
If (UsingAPI) Then 'Am I in API Mode????'YES
Dim ack As Integer = ncdObj.ReadByte() 'Look For a Header
If (ack <> 170) Then 'If an Invalid Head is Received Exit this Routine
ncdObj.Purge()
Return Nothing
End If
LastRecString += GetShowString(170) 'Add Data into the Last Received String
length = ncdObj.ReadByte() 'Define the Length Value Based on the Packet
LastRecString += GetShowString(length) 'Add Data into the Last Received String
Dim checkSumC As Integer = 170 + length 'Setup a Checksum Value to Include the 170 Header and Length Values
' Dim d As Integer = ncdObj.ReadByte() 'Receive the Byte of Data from the User
rdata.Add(D) 'Add a NULL Byte into the D Array
For m As Integer = 1 To length 'Count Through Each Byte in the Length Value
Dim Rx As Integer = ncdObj.ReadByte() 'Receive the Byte of Data from the User
'Debug.Print(d.ToString + " m:" + m.ToString)
rdata.Add(Rx) 'Add the Received Byte to the rData Array
checkSumC = checkSumC + Rx 'Add the Received Data into the Checksum
LastRecString += GetShowString(Rx) 'Add Data into the Last Received String
Next
Dim checksum As Integer 'Setup a Checksum Value
checksum = ncdObj.ReadByte 'Read the Checksum from Device
If (checksum = -1 Or (checksum <> (checkSumC Mod &H100))) Then 'Compare Received Checksum with Computed Checksum, If INVALID
ncdObj.Purge() 'Exit this Function and Return NO Data
Return Nothing
End If
LastRecString += GetShowString(checksum) 'Add the Checksum Value into the Last Received String
Else
For m As Integer = 0 To 255 'Read 256 Bytes MAX
Dim Rx As Integer = ncdObj.ReadByte()
If (Rx = -1) Then ' time out
BytesCount = m + 1
GoTo ReturnData
End If
rdata.Add(Rx)
LastRecString += GetShowString(Rx)
Next
End If
ReturnData:
'Report Data to User
Dim dataRec() As Byte
ReDim dataRec(length)
'Debug.Print("Total Bytes Received:")
dataRec(0) = length
' Debug.Print(dataRec(0))
' Debug.Print("Data Bytes:")
For i As Integer = 1 To length
dataRec(i) = rdata(i)
'Debug.Print(dataRec(i))
Next
' Debug.Print("Error???")
' Debug.Print(dataRec(0))
Return dataRec
End Function
' return data back from module, used for command only have one byte come back
Public Shared Function ReadByteAPI(ByRef ncdObj As NCD.NCDComponent, ByVal UsingAPI As Boolean) As Integer
Dim r As Integer = -1
Dim rData As Byte() = ReadBytesAPI(ncdObj, UsingAPI, 1)
If (rData Is Nothing) Then
Return -1
End If
r = rData(0)
Return r
End Function
Public Shared Function StoreExtendedEEPROMonCPU(ByRef ncdObj As NCD.NCDComponent, Start As Integer, ParamArray Bytes() As Byte)
Debug.Print("Writing Extended EEPROM DEBUG")
'Store Menu Selection
Dim MSB As Integer = (Start And 65280) / 256 '>> 8
Dim LSB As Integer = (Start And 255)
Dim DataBytes(Bytes.Length + 3) As Byte
DataBytes(0) = 254
DataBytes(1) = 56
DataBytes(2) = MSB
DataBytes(3) = LSB
' DataBytes(4) = Bytes.Length
Array.Copy(Bytes, 0, DataBytes, 4, Bytes.Length)
'NCDLib.WriteBytesAPI(NCDComponent1, True, 254, 56, MSB, LSB, Bytes, DataBytes)
NCDLib.WriteBytesAPI(ncdObj, True, DataBytes)
Dim rData2 As Byte() = NCDLib.ReadBytesAPI(ncdObj, True, 1)
'99fdgsdfasdfa
'afasdf()
If (Not (rData2 Is Nothing)) Then
Debug.Print(rData2.ToString)
StoreExtendedEEPROMonCPU = rData2
Else
MsgBox("Firmware Update Required for Fusion Controller: Unable to store extended data (NCDLib.StoreExtendedEEPROMonCPU")
End If
End Function
Public Shared Function ReadExtendedEEPROMonCPU(ByRef ncdObj As NCD.NCDComponent, Start As Integer, Length As Integer) As Byte()
Dim MSB As Integer = (Start And 65280) / 256 '>> 8
Dim LSB As Integer = (Start And 255)
' NCDLib.EEPROMIO.ReadBlock(NCDComponent1, 0)
'254 55 1 0 16
'Load Menu Settings from Controller
NCDLib.WriteBytesAPI(ncdObj, True, 254, 55, MSB, LSB, Length) 'Force Communications using API (Regardless of User Settings)
Dim rData As Byte() = NCDLib.ReadBytesAPI(ncdObj, True, Length) 'Force Communications using API (Regardless of User Settings)
' CMD_Data("Read 8-Bit 8-Channels at a Time:", "", False)
'If (Not (rData Is Nothing)) Then
Return rData
' End If
End Function
Public Class I2C
Shared I2CError As String = ""
Public Class Device
Public Shared Function RealWorldDisplay(Raw As Long, Type As String, Resolution As Integer, Gain As Integer) As String
Debug.Print(">>>>>>>>>>>>>>>>>>>>>TYPE:")
Debug.Print(Type)
Dim ResolutionMultiplier As Decimal
' Dim GainDivider As Decimal = 1
' If Gain = 0 Then GainDivider = 1 'x1 Gain
' If Gain = 1 Then GainDivider = 2 'x2 Gain
' If Gain = 2 Then GainDivider = 4 'x4 Gain
' If Gain = 3 Then GainDivider = 8 'x8 Gain
If Type = "4-20mA" Then
If Resolution = 0 Then ResolutionMultiplier = (0.0107) '12-Bit
If Resolution = 1 Then ResolutionMultiplier = (0.0027) '14-Bit
If Resolution = 2 Then ResolutionMultiplier = (0.00068) '16-Bit
Return (Raw * ResolutionMultiplier).ToString + " mA"
End If
If Type = "0-20mA" Then
If Resolution = 0 Then ResolutionMultiplier = (0.0107) '12-Bit
If Resolution = 1 Then ResolutionMultiplier = (0.0027) '14-Bit
If Resolution = 2 Then ResolutionMultiplier = (0.00068) '16-Bit
Return (Raw * ResolutionMultiplier).ToString + " mA"
End If
If Type = "0-40mA" Then
If Resolution = 0 Then ResolutionMultiplier = (0.0216) '12-Bit
If Resolution = 1 Then ResolutionMultiplier = (0.0054) '14-Bit
If Resolution = 2 Then ResolutionMultiplier = (0.00134) '16-Bit
Return (Raw * ResolutionMultiplier).ToString + " mA"
End If
If Type = "0-5V ADC" Then
If Resolution = 0 Then ResolutionMultiplier = (0.0049) '12-Bit
If Resolution = 1 Then ResolutionMultiplier = (0.00122) '14-Bit
If Resolution = 2 Then ResolutionMultiplier = (0.00031) '16-Bit
Return (Raw * ResolutionMultiplier).ToString + " V"
End If
If Type = "0-10V ADC" Then
If Resolution = 0 Then ResolutionMultiplier = (0.0098) '12-Bit
If Resolution = 1 Then ResolutionMultiplier = (0.00244) '14-Bit
If Resolution = 2 Then ResolutionMultiplier = (0.00061) '16-Bit
Return (Raw * ResolutionMultiplier).ToString + " V"
End If
If Type = "0-20V ADC" Then
End If
If Type = "0-24V ADC" Then
End If
Return ""
End Function
End Class
Public Class Chip
Public Class MCP3428
Public Shared Sub SetChannelResolutionGain(ByRef ncdObj As NCD.NCDComponent, Port As Integer, Address As Integer, Channel As Integer, Resolution As Integer, Gain As Integer)
If Channel > 3 Then GoTo InvalidSettings
If Resolution > 2 Then GoTo InvalidSettings
If Gain > 3 Then GoTo InvalidSettings
Dim CRG As Integer
Dim BitChannel As Integer
Dim BitConversion As Integer = 16 'Conversion Mode = Bit 4 = 1
Dim BitResolution As Integer
Dim BitGain As Integer
'Channel = 0 to 3 Bit 6-5
If Channel = 0 Then BitChannel = 0
If Channel = 1 Then BitChannel = 32
If Channel = 2 Then BitChannel = 64
If Channel = 3 Then BitChannel = 96
'Resolution = 0 to 2 Bit 3-2
If Resolution = 0 Then BitResolution = 0 '12-Bit Resolution
If Resolution = 1 Then BitResolution = 4 '14-Bit Resolution
If Resolution = 2 Then BitResolution = 8 '16-Bit Resolution
'Gain = 0 to 3 Bit 1-0
If Gain = 0 Then BitGain = 0 'x1 Gain
If Gain = 1 Then BitGain = 1 'x2 Gain
If Gain = 2 Then BitGain = 2 'x4 Gain
If Gain = 3 Then BitGain = 3 'x8 Gain
CRG = BitChannel + BitConversion + BitResolution + BitGain
'Debug.Print("-----------CRG----------- " + Channel.ToString)
'Debug.Print(NCDLib.Math.DecToBinaryStringStandard(CRG))
NCDLib.I2C.Write(ncdObj, Port, Address, CRG)
Exit Sub
InvalidSettings:
Debug.Print("---------------------------------------------------")
Debug.Print("ERROR: MCP3428 Invalid Parameters")
If Channel > 3 Then Debug.Print("ERROR: MCP3428 Invalid Channel")
If Resolution > 2 Then Debug.Print("ERROR: MCP3428 Invalid Resolution")
If Gain > 3 Then Debug.Print("ERROR: MCP3428 Invalid Gain")
Debug.Print("---------------------------------------------------")
End Sub
Public Shared Sub Setup_Channel(ByRef ncdObj As NCD.NCDComponent, Port As Integer, Address As Integer, Channel As Integer, Resolution As Integer, Gain As Integer)
NCDLib.I2C.Chip.MCP3428.SetChannelResolutionGain(ncdObj, Port, Address, Channel, Resolution, Gain)
End Sub
Public Shared Function Read_Channel(ByRef ncdObj As NCD.NCDComponent, Port As Integer, Address As Integer, Channel As Integer, Resolution As Integer, Gain As Integer)
'NCDLib.I2C.Chip.MCP3428.SetChannelResolutionGain(ncdObj, Port, Address, Channel, Resolution, Gain)
'Wait for I2C Chip to Finish ADC Conversion
If Resolution = 2 Then
ncdObj.Sleep(66) ' Delay 1/15th Second
End If
Dim result() As Byte = NCDLib.I2C.Read(ncdObj, Port, Address, 2)
If Not (result Is Nothing) Then
If (result.Length = 3) Then
Dim d As Long
'Debug.Print("---------Resolution---" + Resolution.ToString)
If Resolution = 0 Then
'Debug.Print("12-Bit Resolution")
d = (result(1) And &HF) * 256 + result(2) '(result(1) * 256 + result(2))
Else
' Debug.Print("High Resolution")
d = (result(1) * 256) + result(2) '(result(1) * 256 + result(2))
End If
Debug.Print(d.ToString)
Read_Channel = d
Return Read_Channel
End If
End If
Return -1
End Function
End Class
End Class
Public Shared Function Write(ByRef ncdObj As NCD.NCDComponent, I2C_Port As Integer, Address As Integer, ByVal ParamArray TXDAT As Byte()) As Byte()
' _ERROR.Visible = False
Dim PortSetting As Integer = I2C_Port + 50
Dim AddressSetting As Integer = Address * 2
Dim TransmitCount As Integer = TXDAT.Length
Dim ReceiveCount As Integer = 0 'RXBytes
Dim aI(TransmitCount + 4) As Byte
I2CError = ""
aI(0) = 188 'Byte 0
aI(1) = PortSetting 'Byte 1
aI(2) = TransmitCount + 1 'Byte 2
aI(3) = AddressSetting 'Byte 3
aI(TransmitCount + 4) = ReceiveCount 'Last Byte
For i1 As Integer = 0 To TransmitCount - 1
aI(i1 + 4) = TXDAT(i1) 'Int(txArray(i1).Text)
Next
NCDLib.WriteBytesAPI(ncdObj, True, aI)
'Debug.Print("Command:")
'For Each a In aI
' Debug.Print(a)
'Next
'Debug.Print("--------------END Command")
' _ERROR.Visible = False
Dim rData As Byte() = NCDLib.ReadUnknownNumberOfBytesAPI(ncdObj, True)
If (Not (rData Is Nothing)) Then
If rData(0) = 4 Then 'If we received 4 bytes of data
If rData(1) = 188 Then
If rData(4) = 67 Then
I2CError = ("I2C Write - Error Package:")
' _ERROR.Visible = True
If rData(2) = 90 Then
If rData(3) = (255 - 90) Then
I2CError = ("ERROR: I2C Device Did Not Acknowledge. Make Sure the Correct I2C Port and Address are Selected. Make Sure SDA and SCL lines are not reversed.")
End If
End If
If rData(2) = 91 Then
If rData(3) = (255 - 91) Then
I2CError = ("ERROR: Device took Tool Long to Respond.")
End If
End If
If rData(2) = 92 Then
If rData(3) = (255 - 92) Then
I2CError = ("ERROR: Count Not Set the Address of the Device.")
End If
End If
End If
End If
End If
Return rData
Else
I2CError = ("NO DATA RECEIVED")
End If
End Function
Public Shared Function Read(ByRef ncdObj As NCD.NCDComponent, I2C_Port As Integer, Address As Integer, RXBytes As Integer) As Byte()
'_ERROR.Visible = False
Dim PortSetting As Integer = I2C_Port + 50
Dim AddressSetting As Integer = (Address * 2) + 1
Dim TransmitCount As Integer = 0 'TXDAT.Length
Dim ReceiveCount As Integer = RXBytes
Dim aI(TransmitCount + 4) As Byte
I2CError = ""
aI(0) = 188 'Byte 0
aI(1) = PortSetting 'Byte 1
aI(2) = TransmitCount + 1 'Byte 2
aI(3) = AddressSetting 'Byte 3
aI(TransmitCount + 4) = ReceiveCount 'Last Byte
'For i1 As Integer = 0 To TransmitCount - 1
' aI(i1 + 4) = TXDAT(i1) 'Int(txArray(i1).Text)
' Next
NCDLib.WriteBytesAPI(ncdObj, True, aI)
'Debug.Print("Command:")
'For Each a In aI
' Debug.Print(a)
'Next
'Debug.Print("--------------END Command")
'------------------------------------------------------------------------------------------
'_ERROR.Visible = False
Dim rData As Byte() = NCDLib.ReadUnknownNumberOfBytesAPI(ncdObj, True)
If (Not (rData Is Nothing)) Then
If rData(0) = 4 Then 'If we received 4 bytes of data
If rData(1) = 188 Then
If rData(4) = 67 Then
I2CError = "I2C Read - Error Package:"
'_ERROR.Visible = True
If rData(2) = 90 Then
If rData(3) = (255 - 90) Then
I2CError = ("ERROR: I2C Device Did Not Acknowledge. Make Sure the Correct I2C Port and Address are Selected. Make Sure SDA and SCL lines are not reversed.")
End If
End If
If rData(2) = 91 Then
If rData(3) = (255 - 91) Then
I2CError = ("ERROR: Device took Tool Long to Respond.")
End If
End If
If rData(2) = 92 Then
If rData(3) = (255 - 92) Then
I2CError = ("ERROR: Count Not Set the Address of the Device.")
End If
End If
End If
End If
End If
Return rData
Else
I2CError = ("NO DATA RECEIVED")
End If
End Function
End Class
End Class