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