Files

2805 lines
90 KiB
VB.net
Raw Permalink Normal View History

2025-12-11 10:59:57 +08:00
Imports System.IO
Imports System.Threading
Public Class FrmInfraredFunction
Implements IModuleForm
#Region "窗体"
''' <summary>
''' 窗体加载函数
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub FrmInfraredFunction_Load(sender As Object, e As EventArgs) Handles Me.Load
TabPage2.Parent = Nothing
TextBox2.Visible = False
TextBox3.Visible = False
Label2.Visible = False
Label1.Visible = False
'红外
InfraredAirFormInit()
InitSQLDataTable()
'TabPage2.Parent = TabControl3
#If IsAdmin = False Then
TabPage2.Parent = Nothing
#End If
End Sub
''' <summary>
''' 显示窗体接口
''' </summary>
''' <param name="parentControl"></param>
Public Fw_Ver As Integer
Public IsFVer As Boolean
Private Function AnalyInfraredProcessingData(databuff() As Byte) As Boolean
''红外
If databuff(0) = &H55 Then
If databuff(1) = &H55 Then
If databuff(2) = &HEE Then
Select Case databuff(5)
'Case &H1 '空调控制
' DealAirControlDatabuff(databuff)
'Case &H2 '电视控制
' DealTvControlDataBuff(databuff)
Case &HA3 '搜索版本
DealInfraredSearchDatabuff(databuff)
'Case &HA6 '下发前询问
' DealInfraredPrepareDatabuff(databuff)
'Case &HA7 '开始下发
' _isInfraredreply = True
' DealInfraredBurnDatabuff(databuff)
Case Else
Return False
End Select
End If
End If
End If
Return True
End Function
Private Function DealInfraredSearchDatabuff(databuff() As Byte) As Boolean
If IsFVer Then
Fw_Ver = databuff(8)
IsFVer = False
End If
Return True
End Function
Public Sub ShowForm(parentControl As Control) Implements IModuleForm.ShowForm
FormBorderStyle = FormBorderStyle.None
TopLevel = False
Dock = DockStyle.Fill
Parent = parentControl
Show()
End Sub
''' <summary>
''' 发送函数
''' </summary>
''' <param name="sendPacket"></param>
Public Sub SendData(sendPacket() As Byte)
If InvokeRequired Then
Invoke(New Action(Sub()
FrmRCU.SendData(sendPacket)
End Sub))
Else
FrmRCU.SendData(sendPacket)
End If
'FrmRCU.SendData(sendPacket) '方法1
End Sub
#End Region
#Region "红外功能配置"
#Region "红外全局变量"
''' <summary>
''' 空调开关
''' </summary>
Private _isAirSwitch As Boolean
''' <summary>
''' 是否空调下载
''' </summary>
Private _isDownload As Boolean
''' <summary>
''' 是否下载红外文件
''' </summary>
Private _isDownInfraredFile As Boolean
''' <summary>
''' 红外文件下载线程
''' </summary>
Private _upDownInfraredFileThread As Thread
''' <summary>
''' 红外电视下载线程
''' </summary>
Private _upDownInfraredTvThread As Thread
''' <summary>
''' 控件变化
''' </summary>
Private _change As Boolean
''' <summary>
''' 电视开关
''' </summary>
Private _isTvSwitch As Boolean
''' <summary>
''' 是否电视下载
''' </summary>
Private _isTvDownload As Boolean
''' <summary>
''' 回复超时
''' </summary>
Private ReadOnly _relayTimeout As Integer = 5000
#End Region
#Region "红外空调下发"
''' <summary>
''' 红外下发空调初始化窗体信息
''' </summary>
Private Sub InfraredAirFormInit()
LblDegreeValue.ForeColor = Color.Gold
LblDegree.ForeColor = Color.Gold
BtnAirSwitch.ForeColor = Color.Green
BtnAirSwitch.Text = ""
LblAirHigh.ForeColor = Color.DimGray
LblAirCentre.ForeColor = Color.DimGray
LblAirLow.ForeColor = Color.DimGray
'LblAuto.ForeColor = Color.DimGray
LblAuto.Visible = False
LblAirCold.ForeColor = Color.DimGray
LblAirHot.ForeColor = Color.DimGray
LblAirSupply.ForeColor = Color.DimGray
BtnAirAdd.ForeColor = Color.Gray
BtnAirMinus.ForeColor = Color.Gray
BtnAirVelocity.ForeColor = Color.Gray
BtnAirModel.ForeColor = Color.Gray
BtnAirAdd.Enabled = False
BtnAirMinus.Enabled = False
BtnAirVelocity.Enabled = False
BtnAirModel.Enabled = False
End Sub
''' <summary>
''' 空调软件搜索
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnInfraredSearch_Click(sender As Object, e As EventArgs) Handles BtnInfraredSearch.Click
_InfraredReceProcessing = True
Dim content As Byte = &H1
Dim addr As Byte = $"&H{Hex(NudAirAddress.Value)}"
Dim sendPacket As Byte() = FillInfraredSearchPacket(content, addr)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 空调固件搜索
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirFirmwareSearch_Click(sender As Object, e As EventArgs) Handles BtnAirFirmwareSearch.Click
_InfraredReceProcessing = True
Dim content As Byte = &H0
Dim addr As Byte = $"&H{Hex(NudAirAddress.Value)}"
Dim sendPacket As Byte() = FillInfraredSearchPacket(content, addr)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 导出
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAKeyToRead_Click(sender As Object, e As EventArgs) Handles BtnAKeyToRead.Click
_InfraredReceProcessing = True
Dim sendPacket As Byte()
Dim content As Byte = &H1
Dim addr As Byte = $"&H{Hex(NudAirAddress.Value)}"
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
If _isRead = False Then
_isRead = True
BtnAKeyToRead.Text = "停止导出"
BtnAirBurn.Text = "开始烧录"
For index = 1 To 19
If _isRead = True Then
sendPacket = FillAKeyToReadPacket(index, content, addr)
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
Console.WriteLine($"一键导出-第{index}数据:{ByteToString(sendPacket)}")
WaitInfraredForRelay()
'Todo:2、自主选择保存
AppendTipText($"导出第{index}包数据成功!" & vbCrLf, Color.Blue)
ChangePrgValue(index, 19, 1)
Else
PrgAirBurn.Value = 0
AppendTipText($"停止导出!" & vbCrLf, Color.Blue)
Exit For
End If
Next
Else
_isRead = False
BtnAKeyToRead.Text = "导出"
BtnAirBurn.Text = "开始烧录"
Exit Sub
End If
_isRead = False
BtnAKeyToRead.Text = "导出"
AppendTipText($"一键导出完成!" & vbCrLf, Color.Green)
PrgAirBurn.Value = 0
End Sub
''' <summary>
''' 空调导入dat配置文件信息
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirImport_Click(sender As Object, e As EventArgs) Handles BtnAirImport.Click
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
TBoAirImport.Text = OpenFileDialog1.FileName
CBoAirBrand.Text = Nothing
CBoAirType.Text = Nothing
CboVersion.Text = Nothing
End If
End Sub
''' <summary>
''' 烧录dat配置文件信息
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirBurn_Click(sender As Object, e As EventArgs) Handles BtnAirBurn.Click
'询问是否可以红外下发,成功,开始下发,失败,则停止下发————由收到状态控制
IsFVer = True
Fw_Ver = -1
BtnAirFirmwareSearch.PerformClick()
Dim task As Task = task.Run(Async Function()
' 非阻塞等待3秒
Await Task.Delay(3000)
BtnAirBuThread()
End Function)
End Sub
Public Sub BtnAirBuThread()
If InvokeRequired Then
Dim s As Action = AddressOf BtnAirBurnThread
Me.Invoke(s)
Else
BtnAirBurnThread()
End If
End Sub
Public Sub BtnAirBurnThread()
If IsFVer Then
IsFVer = False
MsgBox("询问版本失败!!烧录停止!")
Return
End If
Dim ofwver As Integer = -1
Integer.TryParse(Label6.Text, ofwver)
If Fw_Ver = -1 OrElse ofwver = -1 Then
MsgBox($"获取版本异常!!烧录停止!所需最低固件版本{ofwver},红外目前版本{Fw_Ver}")
Return
End If
If Not ComparativeVersion(ofwver, Fw_Ver) Then
If MsgBox($"强制烧录可能导致无法常工作{vbCrLf }最低固件版本{ofwver},红外目前版本{Fw_Ver}{vbCrLf }是否强制烧录?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
Else
Return
End If
End If
_InfraredReceProcessing = True '红外回复
If TBoAirImport.Text = Nothing Then '
MsgBox("文件为空,请选择要烧录的文件!")
Exit Sub
End If
_isDownload = True
Dim content As Byte = &H1
Dim addr As Byte = $"&H{Hex(NudAirAddress.Value)}"
Dim dataFile() As Byte = OpenAirDATFile()
If dataFile Is Nothing Then
MsgBox("文件错误,请重新选择文件!")
Exit Sub
End If
EnquiryToDownload(content, addr, dataFile)
AppendTipText($"询问RCU主机是否可以下发..." & vbCrLf, Color.Green)
BtnAirBurn.Text = $"停止烧录"
If ReplyToDownload() = True Then
DownloadTheData()
Else
BtnAirBurn.Text = $"开始烧录"
Exit Sub
End If
End Sub
''' <summary>
''' 发送询问指令
''' </summary>
Private Sub EnquiryToDownload(content As Byte, addr As Byte, dataFile() As Byte)
'询问是否可以红外下发
Dim sendPacket As Byte() = WhetherIssuedPacket(content, addr, dataFile)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
Console.WriteLine($"[{content}]询问下发数据:{ByteToString(sendPacket)}")
End Sub
''' <summary>
''' 等待回复可以下载
''' </summary>
''' <returns></returns>
Private Function ReplyToDownload() As Boolean
PauseWait(10)
AppendTipText($"等待回复..." & vbCrLf, Color.Green)
WaitInfraredForRelay()
AppendTipText($"RCU主机已回复正在处理..." & vbCrLf, Color.Green)
PauseWait(10)
If _isPrepare = False Then
AppendTipText($"当前RCU主机未准备好升级" & vbCrLf, Color.Green)
_isDownInfraredFile = False
Return False
End If
Return True
End Function
''' <summary>
''' 空调下载数据
''' </summary>
Private Sub DownloadTheData()
If _isPrepare = True Then
AppendTipText($"当前RCU主机已准备就绪" & vbCrLf, Color.Green)
'开始下发
PrgAirBurn.Value = 0
If _isDownInfraredFile = False Then
_upDownInfraredFileThread = New Thread(AddressOf DownRCUFileToInfrared)
_upDownInfraredFileThread.Start()
_isDownInfraredFile = True
BtnAirBurn.Text = $"停止烧录"
Else
If MsgBox("当前处于红外烧录状态,确定结束烧录?", MsgBoxStyle.YesNo, $"Tip") = MsgBoxResult.Yes Then
_upDownInfraredFileThread.Abort()
_isDownInfraredFile = False
_isPrepare = False
BtnAirBurn.Text = $"开始烧录"
PrgAirBurn.Value = 0
AppendTipText($"已终止下载,下载失败!" & vbCrLf, Color.Red)
End If
End If
End If
End Sub
''' <summary>
''' 进度条委托
''' </summary>
''' <param name="Value"></param>
Delegate Sub delegate_PrgAirBurn_Value(ByRef Value As Integer, switch As Integer)
''' <summary>
''' 进度条委托
''' </summary>
''' <param name="value"></param>
Private Sub ChangePrgAirBurnValue(ByRef value As Integer, switch As Integer)
If Me.InvokeRequired = True Then
Dim changeval As New delegate_PrgAirBurn_Value(AddressOf ChangePrgAirBurnValue)
Me.Invoke(changeval, New Object() {value, switch})
Else
PrgAirBurn.Value = value
Select Case switch
Case 0
BtnAirBurn.Text = "停止烧录"
Case 1
BtnAirBurn.Text = "开始烧录"
Case Else
Exit Sub
End Select
End If
End Sub
''' <summary>
''' 进度条委托
''' </summary>
''' <param name="Value"></param>
Delegate Sub delegate_PrgTvBurn_Value(ByRef Value As Integer, switch As Integer)
''' <summary>
''' 进度条委托
''' </summary>
''' <param name="value"></param>
Private Sub ChangePrgTVBurnValue(ByRef value As Integer, switch As Integer)
If Me.InvokeRequired = True Then
Dim changeval As New delegate_PrgTvBurn_Value(AddressOf ChangePrgTVBurnValue)
Me.Invoke(changeval, New Object() {value, switch})
Else
ProgressBar1.Value = value
Select Case switch
Case 0
BtnTVBurn.Text = "停止烧录"
Case 1
BtnTVBurn.Text = "开始烧录"
Case Else
Exit Sub
End Select
End If
End Sub
''' <summary>
''' CRC16校验
''' </summary>
''' <returns></returns>
Private Function FillPacketFileCRC(dataFile() As Byte)
Dim fillCRC As Byte()
fillCRC = GetCRC16CheckSum(dataFile, dataFile.Length)
Return fillCRC
End Function
''' <summary>
''' 红外协议组包头
''' </summary>
Private Function AirPackageHead() As Byte()
Dim packetHead(2) As Byte
packetHead(0) = &H55
packetHead(1) = &H55
packetHead(2) = &HEE
Return packetHead
End Function
''' <summary>
''' 填充红外开关包_控制按键通用
''' </summary>
''' <returns></returns>
Private Function FillInfraredSearchPacket(content As Byte, addr As Byte)
Dim dataPacket As New List(Of Byte)
dataPacket.AddRange(AirPackageHead())
dataPacket.AddRange(FillInfraredSearchData(content, addr))
Return dataPacket.ToArray
End Function
''' <summary>
''' 填充红外搜索数据
''' </summary>
''' <returns></returns>
Private Function FillInfraredSearchData(content As Byte, Addr As Byte) As Byte()
Dim packetLen As Byte
Dim packetType As Byte = &H4
Dim packetCmd As Byte = &HA3
Dim packetAddress As Byte = Addr
Dim packetRegister As Byte = content
Dim dataPacket As New List(Of Byte)
dataPacket.Add(packetType)
dataPacket.Add(packetCmd)
dataPacket.Add(packetAddress)
dataPacket.Add(packetRegister)
packetLen = $"&H{Hex(dataPacket.ToArray.Length + 3)}"
Dim data As New List(Of Byte)
data.Add(packetLen)
data.AddRange(dataPacket)
Dim packetcrc() As Byte = FillPacketFileCRC(data.ToArray)
data.AddRange(packetcrc)
Return data.ToArray
End Function
''' <summary>
''' 询问是否可以红外下发
''' </summary>
''' <returns></returns>
Private Function WhetherIssuedPacket(content As Byte, addr As Byte, dataFile() As Byte)
Dim dataPacket As New List(Of Byte)
dataPacket.AddRange(AirPackageHead())
dataPacket.AddRange(WhetherIssued(content, addr, dataFile))
Return dataPacket.ToArray
End Function
''' <summary>
''' 红外下发前询问
''' </summary>
''' <returns></returns>
Private Function WhetherIssued(content As Byte, addr As Byte, dataFile() As Byte) As Byte()
Dim packetLen As Byte
Dim packetType As Byte = &H4
Dim packetCmd As Byte = &HA6
Dim packetAddress As Byte = addr
Dim packetRegister As Byte = content
Dim packetOperation As Byte = &H1
Dim packetfileCrc() As Byte = FillPacketFileCRC(dataFile)
Dim packetCount As Byte = $"&H{Hex(GetBlocks(dataFile))}"
Dim dataPacket As New List(Of Byte)
dataPacket.Add(packetType)
dataPacket.Add(packetCmd)
dataPacket.Add(packetAddress)
dataPacket.Add(packetRegister)
dataPacket.Add(packetOperation)
dataPacket.AddRange(packetfileCrc)
dataPacket.Add(packetCount)
packetLen = $"&H{Hex(dataPacket.ToArray.Length + 3)}"
Dim data As New List(Of Byte)
data.Add(packetLen)
data.AddRange(dataPacket)
Dim packetcrc() As Byte = FillPacketFileCRC(data.ToArray)
data.AddRange(packetcrc)
'Console.WriteLine($"询问下发数据:{ByteToString(dataPacket.ToArray)}")
Return data.ToArray
End Function
''' <summary>
''' 读取选中文件_空调
''' </summary>
''' <returns>文件格式为(dat)</returns>
Private Function OpenAirDATFile() As Byte()
Dim filename As String = TBoAirImport.Text
If filename.IndexOf("空调") = -1 Then
Exit Function
End If
Dim dataFile() As Byte = ReadFileToBytes(filename)
Return dataFile
End Function
''' <summary>
''' 读取选中文件_电视
''' </summary>
''' <returns>文件格式为(dat)</returns>
Private Function OpenTvDATFile() As Byte()
Dim filename As String = TextBox1.Text
If filename.IndexOf("电视") = -1 Then
Exit Function
End If
Dim dataFile() As Byte = ReadFileToBytes(filename)
Return dataFile
End Function
''' <summary>
''' RCU红外下发数据
''' </summary>
Private Sub DownRCUFileToInfrared()
Dim dataFile() As Byte = OpenAirDATFile()
If dataFile Is Nothing Then
MsgBox("文件错误,请重新选择文件!")
Exit Sub
End If
'AppendTipText($"文件为:{ByteToString(dataFile)}" & vbCrLf, Color.Blue)
Dim blockCount As Integer = GetBlocks(dataFile)
Dim burnPackage() As Byte
ChangePrgAirBurnValue(1, 0)
Dim packageNumber As Integer
For packageNumber = 1 To blockCount
_isInfraredreply = False
burnPackage = FillBurnPackage(dataFile, packageNumber, blockCount)
AppendTipText($"开始发送第{packageNumber}包数据..." & vbCrLf, Color.Blue)
burnPackage = FillPacket(burnPackage) '组包
SendData(burnPackage)
Console.WriteLine($"第{packageNumber}包:{ByteToString(burnPackage)}")
ChangePrgValue(packageNumber, blockCount, 0)
WaitInfraredForRelay()
If _isInfraredreply = True Then '判断是回复
If packageNumber = blockCount Then
_isDownInfraredFile = False
AppendTipText($"空调烧录完成!" & vbCrLf, Color.Blue)
MsgBox($"空调烧录完成!")
ChangePrgAirBurnValue(0, 1)
_upDownInfraredFileThread.Abort()
Return
End If
Else
_resend += 1
If _resend <= 3 Then
AppendTipText($"开始重发次数:{_resend}次" & vbCrLf, Color.Blue)
packageNumber -= 1
Else
AppendTipText($"已超出最大重发次数!" & vbCrLf, Color.Red)
AppendTipText($"下载失败!" & vbCrLf, Color.Red)
ChangePrgAirBurnValue(0, 1)
_change = True
_resend = 0
_isPrepare = False
_isDownInfraredFile = False
_upDownInfraredFileThread.Abort()
Return
End If
End If
Next
End Sub
''' <summary>
''' 进度条变化
''' </summary>
Private Sub ChangePrgValue(packageNumber As Integer, blockCount As Integer, swith As Integer)
If packageNumber > blockCount * 0 AndAlso packageNumber < blockCount * 0.1 Then
ChangePrgAirBurnValue(5, swith)
ElseIf packageNumber > blockCount * 0.1 AndAlso packageNumber < blockCount * 0.2 Then
ChangePrgAirBurnValue(10, swith)
ElseIf packageNumber > blockCount * 0.2 AndAlso packageNumber < blockCount * 0.3 Then
ChangePrgAirBurnValue(20, swith)
ElseIf packageNumber > blockCount * 0.3 AndAlso packageNumber < blockCount * 0.4 Then
ChangePrgAirBurnValue(30, swith)
ElseIf packageNumber > blockCount * 0.4 AndAlso packageNumber < blockCount * 0.5 Then
ChangePrgAirBurnValue(40, swith)
ElseIf packageNumber > blockCount * 0.5 AndAlso packageNumber < blockCount * 0.6 Then
ChangePrgAirBurnValue(50, swith)
ElseIf packageNumber > blockCount * 0.6 AndAlso packageNumber < blockCount * 0.7 Then
ChangePrgAirBurnValue(60, swith)
ElseIf packageNumber > blockCount * 0.7 AndAlso packageNumber < blockCount * 0.8 Then
ChangePrgAirBurnValue(70, swith)
ElseIf packageNumber > blockCount * 0.8 AndAlso packageNumber < blockCount * 0.9 Then
ChangePrgAirBurnValue(80, swith)
ElseIf packageNumber > blockCount * 0.9 AndAlso packageNumber < blockCount Then
ChangePrgAirBurnValue(90, swith)
ElseIf packageNumber = blockCount Then
ChangePrgAirBurnValue(100, swith)
End If
'For index = packageNumber To blockCount * 100%
'Next
End Sub
''' <summary>
''' 进度条变化
''' </summary>
Private Sub ChangeTvPrgValue(packageNumber As Integer, blockCount As Integer, swith As Integer)
If packageNumber > blockCount * 0 AndAlso packageNumber < blockCount * 0.1 Then
ChangePrgTVBurnValue(10, swith)
ElseIf packageNumber > blockCount * 0.9 AndAlso packageNumber < blockCount Then
ChangePrgTVBurnValue(90, swith)
ElseIf packageNumber = blockCount Then
ChangePrgTVBurnValue(100, swith)
End If
End Sub
''' <summary>
''' 填充烧录包数据
''' </summary>
''' <param name="padData"></param>
''' <param name="blockIndex"></param>
''' <param name="blockCount"></param>
''' <returns></returns>
Private Function FillBurnPackage(padData() As Byte, blockIndex As Integer blockCount As Integer) As Byte()
Dim dataLen As Byte
Dim packetType As Byte = &H4
Dim packetCmd As Byte = &HA7
Dim packetAddress As Byte = $"&H{Hex(NudAirAddress.Value)}"
Dim packetRegister As Byte = &H1
Dim packetfileCrc() As Byte
Dim data As New List(Of Byte)
data.Add(packetType)
data.Add(packetCmd)
data.Add(packetAddress)
data.Add(packetRegister)
data.Add(blockIndex)
data.AddRange(FillBurnOnePackage(padData, blockIndex, blockCount))
dataLen = $"&H{Hex(data.ToArray.Length + 3)}"
Dim list As New List(Of Byte)
list.Add(dataLen)
list.AddRange(data)
packetfileCrc = FillPacketFileCRC(list.ToArray)
Dim dataList As New List(Of Byte)
dataList.AddRange(AirPackageHead)
dataList.AddRange(list)
dataList.AddRange(packetfileCrc)
Return dataList.ToArray
End Function
''' <summary>
''' 填充烧录单包数据
''' </summary>
''' <param name="padData"></param>
''' <param name="blockIndex"></param>
''' <param name="blockCount"></param>
''' <returns></returns>
Private Function FillBurnOnePackage(padData() As Byte, blockIndex As Integer blockCount As Integer) As Byte()
Dim blockPacket As New List(Of Byte)
If blockIndex = blockCount Then
For index = 128 * (blockIndex - 1) To padData.Length - 1
blockPacket.Add(padData(index))
Next
Else
For index = 128 * (blockIndex - 1) To 128 * blockIndex - 1
blockPacket.Add(padData(index))
Next
End If
Return blockPacket.ToArray
End Function
''' <summary>
''' 等待红外数据回复
''' </summary>
Private Sub WaitInfraredForRelay()
Dim tick As Integer
Dim startTick As Integer = My.Computer.Clock.TickCount
_isInfraredreply = False
While _isInfraredreply = False AndAlso tick <= _relayTimeout
Thread.Sleep(100)
tick = My.Computer.Clock.TickCount - startTick
Application.DoEvents()
End While
End Sub
''' <summary>
''' 空调开关按键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirSwitch_Click(sender As Object, e As EventArgs) Handles BtnAirSwitch.Click
_InfraredReceProcessing = True
If BtnAirSwitch.Text = "" Then
_isAirSwitch = False
AirControlState()
AirControl()
ElseIf BtnAirSwitch.Text = "" Then
_isAirSwitch = True
AirControl()
AirControlState()
End If
End Sub
''' <summary>
''' 空调开关控制状态
''' </summary>
Private Sub AirControlState()
If BtnAirSwitch.Text = "" Then
BtnAirSwitch.Text = ""
BtnAirSwitch.ForeColor = Color.Red
BtnAirAdd.Enabled = True
BtnAirMinus.Enabled = True
BtnAirVelocity.Enabled = True
BtnAirModel.Enabled = True
BtnAirAdd.ForeColor = Color.Green
BtnAirMinus.ForeColor = Color.Green
BtnAirVelocity.ForeColor = Color.Green
BtnAirModel.ForeColor = Color.Green
LblAirHigh.ForeColor = Color.Green
LblAirCentre.ForeColor = Color.Red
LblAirLow.ForeColor = Color.Red
' LblAuto.ForeColor = Color.Red
LblAirCold.ForeColor = Color.Green
LblAirHot.ForeColor = Color.Red
LblAirSupply.ForeColor = Color.Red
ElseIf BtnAirSwitch.Text = "" Then
BtnAirSwitch.Text = ""
BtnAirSwitch.ForeColor = Color.Green
BtnAirAdd.Enabled = False
BtnAirMinus.Enabled = False
BtnAirVelocity.Enabled = False
BtnAirModel.Enabled = False
LblAirHigh.ForeColor = Color.DimGray
LblAirCentre.ForeColor = Color.DimGray
LblAirLow.ForeColor = Color.DimGray
'LblAuto.ForeColor = Color.DimGray
LblAirCold.ForeColor = Color.DimGray
LblAirHot.ForeColor = Color.DimGray
LblAirSupply.ForeColor = Color.DimGray
End If
End Sub
''' <summary>
''' 空调温度值增加
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirAdd_Click(sender As Object, e As EventArgs) Handles BtnAirAdd.Click
If LblDegreeValue.Text >= "16" AndAlso LblDegreeValue.Text < "32" Then
LblDegreeValue.Text = CStr(CInt(LblDegreeValue.Text) + 1)
End If
AirControl()
End Sub
''' <summary>
''' 空调温度值减少
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirMinus_Click(sender As Object, e As EventArgs) Handles BtnAirMinus.Click
If LblDegreeValue.Text > "16" AndAlso LblDegreeValue.Text <= "32" Then
LblDegreeValue.Text = CStr(CInt(LblDegreeValue.Text) - 1)
End If
AirControl()
End Sub
''' <summary>
''' 空调风速按键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirVelocity_Click(sender As Object, e As EventArgs) Handles BtnAirVelocity.Click
If LblAirHigh.ForeColor = Color.Green Then
LblAirHigh.ForeColor = Color.Red
LblAirCentre.ForeColor = Color.Green
LblAirLow.ForeColor = Color.Red
'LblAuto.ForeColor = Color.Red
ElseIf LblAirCentre.ForeColor = Color.Green Then
LblAirHigh.ForeColor = Color.Red
LblAirCentre.ForeColor = Color.Red
LblAirLow.ForeColor = Color.Green
'LblAuto.ForeColor = Color.Red
ElseIf LblAirLow.ForeColor = Color.Green Then
LblAirHigh.ForeColor = Color.Red
LblAirCentre.ForeColor = Color.Red
'LblAirLow.ForeColor = Color.Red
LblAirHigh.ForeColor = Color.Green
'LblAuto.ForeColor = Color.Green
'ElseIf LblAuto.ForeColor = Color.Green Then
' LblAirHigh.ForeColor = Color.Green
' LblAirCentre.ForeColor = Color.Red
' LblAirLow.ForeColor = Color.Red
' LblAuto.ForeColor = Color.Red
End If
AirControl()
End Sub
''' <summary>
''' 空调模式按键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirModel_Click(sender As Object, e As EventArgs) Handles BtnAirModel.Click
If LblAirCold.ForeColor = Color.Green Then
LblAirCold.ForeColor = Color.Red
LblAirHot.ForeColor = Color.Green
LblAirSupply.ForeColor = Color.Red
ElseIf LblAirHot.ForeColor = Color.Green Then
LblAirCold.ForeColor = Color.Red
LblAirHot.ForeColor = Color.Red
LblAirSupply.ForeColor = Color.Green
ElseIf LblAirSupply.ForeColor = Color.Green Then
LblAirCold.ForeColor = Color.Green
LblAirHot.ForeColor = Color.Red
LblAirSupply.ForeColor = Color.Red
End If
AirControl()
End Sub
''' <summary>
''' 空调控制
''' </summary>
Private Sub AirControl()
_InfraredReceProcessing = True
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
Dim sendPacket() As Byte = FillAirControlPacket()
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 填充空调控制包
''' </summary>
''' <returns></returns>
Private Function FillAirControlPacket()
Dim packetHead() As Byte = AirPackageHead()
Dim packetData() As Byte = FillAirControlData()
Dim packetcrc() As Byte = FillPacketFileCRC(packetData.ToArray)
Dim dataPacket As New List(Of Byte)
dataPacket.AddRange(packetHead)
dataPacket.AddRange(packetData)
dataPacket.AddRange(packetcrc)
Return dataPacket.ToArray
End Function
''' <summary>
''' 填充空调控制数据
''' </summary>
''' <returns></returns>
Private Function FillAirControlData()
Dim dataLen As Byte
Dim packetType As Byte = &H4
Dim deviceType As Byte = &H1
Dim packetAddress As Byte = $"&H{Hex(NudAirAddress.Value)}"
Dim packetTemp As Byte = $"&H{Hex(LblDegreeValue.Text)}"
Dim switch As Byte = AirSwitch()
Dim airvel As Byte = AirVelocity()
Dim airMode As Byte = AirModel()
Dim data As New List(Of Byte)
data.Add(packetType)
data.Add(deviceType)
data.Add(packetAddress)
data.Add(packetTemp)
data.Add(switch)
data.Add(airvel)
data.Add(airMode)
dataLen = $"&H{Hex(data.ToArray.Length + 3)}"
Dim dataPacket As New List(Of Byte)
dataPacket.Add(dataLen)
dataPacket.AddRange(data)
Return dataPacket.ToArray
End Function
''' <summary>
''' 获取空调开关
''' </summary>
''' <returns></returns>
Private Function AirSwitch() As Byte
Dim switch As Byte
If _isAirSwitch = False Then
switch = &H1
Else
switch = &H0
End If
Return switch
End Function
''' <summary>
''' 获取空调风速
''' </summary>
''' <returns></returns>
Private Function AirVelocity() As Byte
Dim airVel As Byte
If LblAirHigh.ForeColor = Color.Green Then
airVel = &H3
ElseIf LblAirCentre.ForeColor = Color.Green Then
airVel = &H2
ElseIf LblAirLow.ForeColor = Color.Green Then
airVel = &H1
'ElseIf LblAuto.ForeColor = Color.Green Then
' airVel = &H0
End If
Return airVel
End Function
''' <summary>
''' 获取空调模式
''' </summary>
''' <returns></returns>
Private Function AirModel() As Byte
Dim airmode As Byte
If LblAirCold.ForeColor = Color.Green Then
airmode = &H0
ElseIf LblAirHot.ForeColor = Color.Green Then
airmode = &H1
ElseIf LblAirSupply.ForeColor = Color.Green Then
airmode = &H2
End If
Return airmode
End Function
''' <summary>
''' 组一键读取的包
''' </summary>
''' <returns></returns>
Private Function FillAKeyToReadPacket(index As Integer, content As Byte, addr As Byte) As Byte()
Dim packetHead() As Byte = AirPackageHead()
Dim packetData() As Byte = FillAKeyToReadData(index, content, addr)
Dim packetcrc() As Byte = FillPacketFileCRC(packetData.ToArray)
Dim dataPacket As New List(Of Byte)
dataPacket.AddRange(packetHead)
dataPacket.AddRange(packetData)
dataPacket.AddRange(packetcrc)
Return dataPacket.ToArray
End Function
''' <summary>
''' 组一键读取的数据包
''' </summary>
''' <param name="index"></param>
''' <param name="content"></param>
''' <returns></returns>
Private Function FillAKeyToReadData(index As Integer, content As Byte, addr As Byte) As Byte()
Dim dataLen As Byte
Dim packetType As Byte = &H4
Dim deviceType As Byte = &HA8
Dim packetAddress As Byte = addr
Dim packetTemp As Byte = content
Dim data As New List(Of Byte)
data.Add(packetType)
data.Add(deviceType)
data.Add(packetAddress)
data.Add(packetTemp)
data.Add($"&H{Hex(index)}")
dataLen = $"&H{Hex(data.ToArray.Length + 3)}"
Dim dataPacket As New List(Of Byte)
dataPacket.Add(dataLen)
dataPacket.AddRange(data)
Return dataPacket.ToArray
End Function
#End Region
#Region "红外电视下发"
''' <summary>
''' 电视静音
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVMute_Click(sender As Object, e As EventArgs) Handles BtnTVMute.Click
_InfraredReceProcessing = True
Dim content As Byte = &H1
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视开关
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVSwitch_Click(sender As Object, e As EventArgs) Handles BtnTVSwitch.Click
If _isTvSwitch = False Then
_isTvSwitch = True
BtnTVSwitch.ForeColor = Color.Red
BtnTVSwitch.Text = ""
Else
_isTvSwitch = False
BtnTVSwitch.ForeColor = Color.Green
BtnTVSwitch.Text = ""
End If
_InfraredReceProcessing = True
Dim content As Byte = &H2
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视音量加键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVVolumeAdd_Click(sender As Object, e As EventArgs) Handles BtnTVVolumeAdd.Click
_InfraredReceProcessing = True
Dim content As Byte = &H3
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视音量减键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVVolumeMinus_Click(sender As Object, e As EventArgs) Handles BtnTVVolumeMinus.Click
_InfraredReceProcessing = True
Dim content As Byte = &H4
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 频道加键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVChannelAdd_Click(sender As Object, e As EventArgs) Handles BtnTVChannelAdd.Click
_InfraredReceProcessing = True
Dim content As Byte = &H5
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 频道减键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVChannelMinus_Click(sender As Object, e As EventArgs) Handles BtnTVChannelMinus.Click
_InfraredReceProcessing = True
Dim content As Byte = &H6
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视上键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVGetOn_Click(sender As Object, e As EventArgs) Handles BtnTVGetOn.Click
_InfraredReceProcessing = True
Dim content As Byte = &H7
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视下键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVBelow_Click(sender As Object, e As EventArgs) Handles BtnTVBelow.Click
_InfraredReceProcessing = True
Dim content As Byte = &H8
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视左键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVLeft_Click(sender As Object, e As EventArgs) Handles BtnTVLeft.Click
_InfraredReceProcessing = True
Dim content As Byte = &H9
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视右键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVRight_Click(sender As Object, e As EventArgs) Handles BtnTVRight.Click
_InfraredReceProcessing = True
Dim content As Byte = &HA
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视OK键
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVOK_Click(sender As Object, e As EventArgs) Handles BtnTVOK.Click
_InfraredReceProcessing = True
Dim content As Byte = &HB
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视首页
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVHomePage_Click(sender As Object, e As EventArgs) Handles BtnTVHomePage.Click
_InfraredReceProcessing = True
Dim content As Byte = &HC
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视菜单
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVMenu_Click(sender As Object, e As EventArgs) Handles BtnTVMenu.Click
_InfraredReceProcessing = True
Dim content As Byte = &HD
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视信源
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVSource_Click(sender As Object, e As EventArgs) Handles BtnTVSource.Click
_InfraredReceProcessing = True
Dim content As Byte = &HE
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视返回
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVGetBack_Click(sender As Object, e As EventArgs) Handles BtnTVGetBack.Click
_InfraredReceProcessing = True
Dim content As Byte = &HF
Dim sendPacket As Byte() = FillTVCommPackage(content)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视一键读取
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVAKeyToRead_Click(sender As Object, e As EventArgs) Handles BtnTVAKeyToRead.Click
_InfraredReceProcessing = True
ProgressBar1.Value = 0
Dim sendPacket As Byte()
Dim content As Byte = &H2
Dim addr As Byte = $"&H{Hex(NudTVAddress.Value)}"
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
If _isRead = False Then
_isRead = True
BtnTVAKeyToRead.Text = "停止导出"
sendPacket = FillAKeyToReadPacket(1, content, addr)
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
Console.WriteLine($"一键导出-电视包数据:{ByteToString(sendPacket)}")
WaitInfraredForRelay()
AppendTipText($"导出电视包数据成功!" & vbCrLf, Color.Green)
ProgressBar1.Value = 100
Else
_isRead = False
BtnTVAKeyToRead.Text = "导出"
Exit Sub
End If
_isRead = False
BtnTVAKeyToRead.Text = "导出"
AppendTipText($"一键导出完成!" & vbCrLf, Color.Green)
End Sub
''' <summary>
''' 电视搜索
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVSearch_Click(sender As Object, e As EventArgs) Handles BtnTVSearch.Click
_InfraredReceProcessing = True
Dim content As Byte = &H2
Dim addr As Byte = $"&H{Hex(NudTVAddress.Value)}"
Dim sendPacket As Byte() = FillInfraredSearchPacket(content, addr)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视固件搜索
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVFirmwareSearch_Click(sender As Object, e As EventArgs) Handles BtnTVFirmwareSearch.Click
_InfraredReceProcessing = True
Dim content As Byte = &H0
Dim addr As Byte = $"&H{Hex(NudTVAddress.Value)}"
Dim sendPacket As Byte() = FillInfraredSearchPacket(content, addr)
_port485 = $"&H{Hex(FrmRCU.NudSerialAppPort.Value)}"
_timeouts = $"&H{Hex(FrmRCU.NudTimeOut3.Value)}"
sendPacket = FillPacket(sendPacket) '组包
SendData(sendPacket) '发送数据
End Sub
''' <summary>
''' 电视导入
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVImport_Click(sender As Object, e As EventArgs) Handles BtnTVImport.Click
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
TextBox1.Text = OpenFileDialog1.FileName
CBoTVBrand.Text = Nothing
CBoTVModel.Text = Nothing
CBoTVVersion.Text = Nothing
End If
End Sub
Private Function ComparativeVersion(newver As Integer, oldver As Integer) As Boolean
If (newver <= oldver) Then
Return True
End If
Return False
End Function
''' <summary>
''' 电视烧录
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTVBurn_Click(sender As Object, e As EventArgs) Handles BtnTVBurn.Click
IsFVer = True
Fw_Ver = -1
BtnTVFirmwareSearch.PerformClick()
Dim task As Task = Task.Run(Async Function()
' 非阻塞等待3秒
Await Task.Delay(3000)
TVBThread()
End Function)
End Sub
Public Sub TVBThread()
If InvokeRequired Then
Dim s As Action = AddressOf BtnTVBurnThread
Me.Invoke(s)
Else
BtnTVBurnThread()
End If
End Sub
Public Sub BtnTVBurnThread()
If IsFVer Then
IsFVer = False
MsgBox("询问版本失败!!烧录停止!")
Return
End If
Dim ofwver As Integer = -1
Integer.TryParse(Label5.Text, ofwver)
If Fw_Ver = -1 OrElse ofwver = -1 Then
MsgBox($"获取版本异常!!烧录停止!所需最低固件版本{ofwver},红外目前版本{Fw_Ver}")
Return
End If
If Not ComparativeVersion(ofwver, Fw_Ver) Then
If MsgBox($"强制烧录可能导致无法常工作{vbCrLf }最低固件版本{ofwver},红外目前版本{Fw_Ver}{vbCrLf }是否强制烧录?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
Else
Return
End If
End If
_InfraredReceProcessing = True
ProgressBar1.Value = 0
If TextBox1.Text = Nothing Then '
MsgBox("文件为空,请选择要烧录的文件!")
Exit Sub
End If
_isTvDownload = True
Dim content As Byte = &H2
Dim addr As Byte = $"&H{Hex(NudTVAddress.Value)}"
Dim dataFile() As Byte = OpenTvDATFile()
If dataFile Is Nothing Then
MsgBox("文件错误,请重新选择文件!")
Exit Sub
End If
EnquiryToDownload(content, addr, dataFile)
AppendTipText($"询问RCU主机是否可以下发电视..." & vbCrLf, Color.Green)
BtnTVBurn.Text = $"停止烧录"
If ReplyToDownload() = True Then
DownloadTheTvData()
Else
BtnTVBurn.Text = $"开始烧录"
Exit Sub
End If
End Sub
''' <summary>
''' 填充电视通讯包
''' </summary>
Private Function FillTVCommPackage(content As Byte)
Dim dataPacket As New List(Of Byte)
dataPacket.AddRange(AirPackageHead())
dataPacket.AddRange(FillTVDataPackage(content))
Return dataPacket.ToArray
End Function
''' <summary>
''' 填充电视数据包
''' </summary>
''' <param name="content"></param>
''' <returns></returns>
Private Function FillTVDataPackage(content As Byte)
Dim dataLen As Byte
Dim packetType As Byte = &H4
Dim deviceType As Byte = &H2
Dim packetAddress As Byte = $"&H{Hex(NudTVAddress.Value)}"
Dim packetTemp As Byte = content
Dim data As New List(Of Byte)
data.Add(packetType)
data.Add(deviceType)
data.Add(packetAddress)
data.Add(packetTemp)
dataLen = $"&H{Hex(data.ToArray.Length + 3)}"
Dim dataPacket As New List(Of Byte)
dataPacket.Add(dataLen)
dataPacket.AddRange(data)
Dim packetfileCrc() As Byte
packetfileCrc = FillPacketFileCRC(dataPacket.ToArray)
Dim dataList As New List(Of Byte)
dataList.AddRange(dataPacket)
dataList.AddRange(packetfileCrc)
Return dataList.ToArray
End Function
''' <summary>
''' 下载电视数据
''' </summary>
Private Sub DownloadTheTvData()
If _isPrepare = True Then
AppendTipText($"当前RCU主机已准备就绪" & vbCrLf, Color.Green)
'开始下发
ProgressBar1.Value = 0
If _isDownInfraredFile = False Then
_upDownInfraredTvThread = New Thread(AddressOf DownRCUTvFileToInfrared)
_upDownInfraredTvThread.Start()
_isDownInfraredFile = True
BtnTVBurn.Text = $"停止烧录"
Else
If MsgBox("当前处于红外烧录状态,确定结束烧录?", MsgBoxStyle.YesNo, $"Tip") = MsgBoxResult.Yes Then
_upDownInfraredTvThread.Abort()
_isDownInfraredFile = False
_isPrepare = False
BtnTVBurn.Text = $"开始烧录"
ProgressBar1.Value = 0
AppendTipText($"已终止下载,下载失败!" & vbCrLf, Color.Red)
End If
End If
End If
End Sub
''' <summary>
''' RCU红外下发电视数据
''' </summary>
Private Sub DownRCUTvFileToInfrared()
Dim dataFile() As Byte = OpenTvDATFile()
If dataFile Is Nothing Then
MsgBox("文件错误,请重新选择文件!")
Exit Sub
End If
Console.WriteLine($"电视文件为:{ByteToString(dataFile)}")
Dim blockCount As Integer = GetBlocks(dataFile)
Dim burnPackage() As Byte
ChangePrgTVBurnValue(5, 0)
Dim packageNumber As Integer
For packageNumber = 1 To blockCount
_isInfraredreply = False
burnPackage = FillTvBurnPackage(dataFile, packageNumber, blockCount)
AppendTipText($"开始发送第{packageNumber}包数据..." & vbCrLf, Color.Blue)
burnPackage = FillPacket(burnPackage) '组包
SendData(burnPackage) '发送数据
Console.WriteLine($"第{packageNumber}包:{ByteToString(burnPackage)}")
ChangeTvPrgValue(packageNumber, blockCount, 0)
WaitInfraredForRelay()
If _isInfraredreply = True Then '判断是回复
If packageNumber = blockCount Then
_isDownInfraredFile = False
ChangePrgTVBurnValue(100, 1)
AppendTipText($"电视烧录完成!" & vbCrLf, Color.Blue)
MsgBox($"电视烧录完成!")
_upDownInfraredTvThread.Abort()
Return
End If
Else
_resend += 1
If _resend <= 3 Then
AppendTipText($"开始重发次数:{_resend}次" & vbCrLf, Color.Blue)
packageNumber -= 1
Else
AppendTipText($"已超出最大重发次数!" & vbCrLf, Color.Red)
AppendTipText($"下载失败!" & vbCrLf, Color.Red)
ChangePrgTVBurnValue(0, 1)
_change = True
_resend = 0
_isPrepare = False
_isDownInfraredFile = False
Return
End If
End If
Next
End Sub
''' <summary>
''' 填充烧录包数据
''' </summary>
''' <param name="padData"></param>
''' <param name="blockIndex"></param>
''' <param name="blockCount"></param>
''' <returns></returns>
Private Function FillTvBurnPackage(padData() As Byte, blockIndex As Integer blockCount As Integer) As Byte()
Dim dataLen As Byte
Dim packetType As Byte = &H4
Dim packetCmd As Byte = &HA7
Dim packetAddress As Byte = $"&H{Hex(NudTVAddress.Value)}"
Dim packetRegister As Byte = &H2
Dim packetfileCrc() As Byte
Dim data As New List(Of Byte)
data.Add(packetType)
data.Add(packetCmd)
data.Add(packetAddress)
data.Add(packetRegister)
data.Add(blockIndex)
data.AddRange(FillBurnOnePackage(padData, blockIndex, blockCount))
dataLen = $"&H{Hex(data.ToArray.Length + 3)}"
Dim list As New List(Of Byte)
list.Add(dataLen)
list.AddRange(data)
packetfileCrc = FillPacketFileCRC(list.ToArray)
Dim dataList As New List(Of Byte)
dataList.AddRange(AirPackageHead)
dataList.AddRange(list)
dataList.AddRange(packetfileCrc)
Return dataList.ToArray
End Function
#End Region
#Region "录入读取---数据库"
''' <summary>
''' 密码窗体
''' </summary>
Private _frmPass As FrmPassword
''' <summary>
''' 下载文件路径
''' </summary>
Private _downFile As String = $"{Application.StartupPath}\DownFile"
''' <summary>
''' 初始化数据表信息——数据库RCU表
''' </summary>
Private Sub InitSQLDataTable()
GrdSqlData.DisplayRowNumber = True
GrdSqlData.ExtendLastCol = True
GrdSqlData.Cols = 9 '设置表格界限
GrdSqlData.Rows = 3
With GrdSqlData.Cell(0, 1)
.Text = "产品类型"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
With GrdSqlData.Cell(0, 2)
.Text = "产品厂商"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
With GrdSqlData.Cell(0, 3)
.Text = "产品型号"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
With GrdSqlData.Cell(0, 4)
.Text = "版本信息"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
With GrdSqlData.Cell(0, 5)
.Text = "创建时间"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
With GrdSqlData.Cell(0, 6)
.Text = "数据校验"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
With GrdSqlData.Cell(0, 7)
.Text = "备注"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
With GrdSqlData.Cell(0, 8)
.Text = "固件版本"
.BackColor = Color.LightGray
.ForeColor = Color.Blue
.Font = New Font("Arial", 8, FontStyle.Bold)
End With
End Sub
''' <summary>
''' 选择文件
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnSelectFile_Click(sender As Object, e As EventArgs) Handles BtnSelectFile.Click
GetFileInfo()
End Sub
''' <summary>
''' 获取选择文件信息
''' </summary>
Private Sub GetFileInfo()
TboPacketName.Text = Nothing
TboxType.Text = Nothing
TboxBrand.Text = Nothing
TboxModel.Text = Nothing
TboxVersion.Text = Nothing
Dim fileName As String = SelectFileHandling()
If fileName Is Nothing Then
MsgBox($"文件为空! 请重新选择文件")
Exit Sub
End If
Console.WriteLine($"选择文件名:{fileName}")
Dim result As New List(Of String)
Dim tmpString() As String = fileName.Split(New Char() {"_"c}, StringSplitOptions.RemoveEmptyEntries)
result.AddRange(tmpString)
Dim type As String = result(0)
Dim brand As String = result(1)
Dim model As String = result(2)
Dim temVer As String = result(3)
Dim results As New List(Of String)
Dim tmpVerString() As String = temVer.Split(New Char() {"."c}, StringSplitOptions.RemoveEmptyEntries)
results.AddRange(tmpVerString)
Dim version As String = results(0)
Console.WriteLine($"类型:{type} 厂商:{brand} 型号:{model} 版本:{version}")
TboxType.Text = type
TboxBrand.Text = brand
TboxModel.Text = model
TboxVersion.Text = version
End Sub
''' <summary>
''' 选择文件处理
''' </summary>
''' <returns></returns>
Private Function SelectFileHandling() As String
Dim fileName As String
Using fileDialog As New OpenFileDialog
If fileDialog.ShowDialog() <> DialogResult.OK Then Exit Function
fileName = fileDialog.SafeFileName
TboPacketName.Text = fileDialog.FileName
End Using
Return fileName
End Function
''' <summary>
''' 数据录入
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnEntry_Click(sender As Object, e As EventArgs) Handles BtnEntry.Click
If WriteProtect() = False Then
MsgBox($"录入信息不完整,请填写完整信息!")
Exit Sub
End If
ConnectingToDatabase()
RefreshDataTable()
End Sub
''' <summary>
''' 录入数据
''' </summary>
Private Sub ConnectingToDatabase()
Dim types As String = TboxType.Text
Dim brand As String = TboxBrand.Text
Dim model As String = TboxModel.Text
Dim version As String = TboxVersion.Text
Dim packet As String = $"{types}_{brand}_{model}_{version}.dat"
Dim filePaths As String = TboPacketName.Text
Dim fileData() As Byte = IO.File.ReadAllBytes(filePaths)
Dim md5 As String = GetFileMd5(filePaths)
Dim remark As String = TboRemark.Text
Dim FW_Ver As String = TextBox4.Text
Try
Dim connString As String = ConnSQLString()
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colName As String
Dim colNames As New List(Of String)
colName = "Type"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, types)
colName = "Brand"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, brand)
colName = "Model"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, model)
colName = "Version"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, version)
colName = "CreateDate"
colNames.Add(colName)
db.AddDbParameter(DbType.DateTime, colName, $"{Now:yyyy-MM-dd HH:mm:ss}")
colName = "PacketName"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, packet)
colName = "PacketData"
colNames.Add(colName)
db.AddDbParameter(DbType.Binary, colName, fileData)
colName = "PacketMD5"
colNames.Add(colName)
db.AddDbParameter(DbType.AnsiString, colName, md5)
colName = "Remark"
colNames.Add(colName)
db.AddDbParameter(DbType.String, colName, remark)
colName = "FW_Ver"
colNames.Add(colName)
db.AddDbParameter(DbType.String, colName, FW_Ver)
Dim nameCol As New List(Of String) From {"Type", "Brand", "Model", "Version"}
Dim cmdTxt As String = db.CmdHelper.DbSearch(dbName, nameCol, tableName, $"{FPrefix}Type{FPrefix} = '{types}' And {FPrefix}Brand{FPrefix} = '{brand}' And {FPrefix}Model{FPrefix} = '{model}' And {FPrefix}Version{FPrefix} = '{version}'")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdTxt)
Console.WriteLine($"查询语句:{dtTable.Rows.Count}")
If dtTable.Rows.Count > 0 Then
Dim hint As DialogResult = MessageBox.Show("文件已存在! 是否覆盖?", "提示" MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
If hint = DialogResult.OK Then
Dim cmddel As String = db.CmdHelper.DbDeleteRows(dbName, tableName, $"{FPrefix}Type{FPrefix} = '{types}' And {FPrefix}Brand{FPrefix} = '{brand}' And {FPrefix}Model{FPrefix} = '{model}' And {FPrefix}Version{FPrefix} = '{version}'")
db.ExecuteNonQuery(cmddel)
Console.WriteLine($"删除语句:{cmddel}")
Else
db.Close()
Exit Sub
End If
End If
'insert into dbName.tablename (1,2,3) value (@1,@2,@3)
Dim cmdText As String = db.CmdHelper.DbInsertParam(dbName, tableName, colNames)
Console.WriteLine($"录入 cmdText:{cmdText}")
db.ExecuteNonQuery(cmdText)
MsgBox($"录入成功")
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 录入保护
''' </summary>
''' <returns></returns>
Private Function WriteProtect() As Boolean
If String.IsNullOrWhiteSpace(TboPacketName.Text) Then Return False
If String.IsNullOrWhiteSpace(TboxType.Text) Then Return False
If String.IsNullOrWhiteSpace(TboxBrand.Text) Then Return False
If String.IsNullOrWhiteSpace(TboxVersion.Text) Then Return False
If String.IsNullOrWhiteSpace(TboxModel.Text) Then Return False
Return True
End Function
''' <summary>
''' 刷新数据表
''' </summary>
Private Sub RefreshDataTable()
InitSQLDataTable()
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Type", "Brand", "Model", "Version", "CreateDate", "PacketMD5", "Remark", "FW_Ver"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName)
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
For r = 0 To dtTable.Rows.Count - 1
GrdSqlData.AddItem("")
For c = 0 To dtTable.Columns.Count - 1
GrdSqlData.Cell(r + 1, c + 1).Text = dtTable(r)(c).ToString '注意表格界限
Next
Next
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 刷新列表
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnRefresh_Click(sender As Object, e As EventArgs) Handles BtnRefresh.Click
RefreshDataTable()
End Sub
''' <summary>
''' 刷新列表_菜单栏
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub 刷新列表ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 刷新列表ToolStripMenuItem.Click
RefreshDataTable()
End Sub
''' <summary>
''' 删除记录_菜单栏
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub 删除记录ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 删除记录ToolStripMenuItem.Click
DeleteRecord()
End Sub
''' <summary>
''' 删除记录
''' </summary>
Private Sub DeleteRecord()
Dim types As String = GrdSqlData.Cell(GrdSqlData.ActiveCell.Row, 1).Text
Dim brand As String = GrdSqlData.Cell(GrdSqlData.ActiveCell.Row, 2).Text
Dim model As String = GrdSqlData.Cell(GrdSqlData.ActiveCell.Row, 3).Text
Dim version As String = GrdSqlData.Cell(GrdSqlData.ActiveCell.Row, 4).Text
If GrdSqlData.ActiveCell.Row > 0 Then
Dim hint As DialogResult = MessageBox.Show($"要删除的文件信息如下{vbCrLf}{vbCrLf}类型:{types}{vbCr}品牌:{brand}{vbCr}型号:{model}{vbCr}版本:{version}{vbCrLf}{vbCrLf}是否继续删除?", "警告!!!" MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
If hint = DialogResult.OK Then
ExecuteDelete(types, brand, model, version)
End If
End If
End Sub
''' <summary>
''' 执行删除
''' </summary>
Private Sub ExecuteDelete(types As String, brand As String, model As String, version As String)
_frmPass = New FrmPassword
If _frmPass.ShowDialog = DialogResult.OK Then
Console.WriteLine("OK")
If _frmPass.IsDelete() = True Then
DelRecord(types, brand, model, version)
Console.WriteLine("删除完成")
GrdSqlData.Selection.DeleteByRow()
Else
MsgBox($"密码错误")
ExecuteDelete(types, brand, model, version)
End If
Else
Console.WriteLine("NO")
End If
End Sub
''' <summary>
''' 执行删除记录
''' </summary>
Private Sub DelRecord(types As String, brand As String, model As String, version As String)
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Try
Dim connString As String = ConnSQLString()
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Console.WriteLine($"开始删除...")
Dim cmddel As String = db.CmdHelper.DbDeleteRows(dbName, tableName, $"`Type` = '{types}' And `Brand` = '{brand}' And `Model` = '{model}' And `Version` = '{version}' ")
db.ExecuteNonQuery(cmddel)
Console.WriteLine($"删除语句:{cmddel}")
GrdSqlData.Selection.DeleteByRow()
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"Start Delete Record Error:{ex.Message}")
End Try
End Sub
#End Region
#Region "空调下载---数据库"
''' <summary>
''' 空调下载
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnAirDownload_Click(sender As Object, e As EventArgs) Handles BtnAirDownload.Click
If DoenloadProtect() = False Then
MsgBox($"请选择要下载的空调文件信息!")
Exit Sub
End If
StartDownload()
End Sub
''' <summary>
''' 下载保护
''' </summary>
''' <returns></returns>
Private Function DoenloadProtect() As Boolean
If CBoAirBrand.Text = "" Or CBoAirBrand.Text = " " Then
Return False
Exit Function
End If
If CBoAirType.Text = "" Or CBoAirBrand.Text = " " Then
Return False
Exit Function
End If
If CboVersion.Text = "" Or CBoAirBrand.Text = " " Then
Return False
Exit Function
End If
Return True
End Function
''' <summary>
''' 开始下载空调
''' </summary>
Private Sub StartDownload()
If Directory.Exists(_downFile) = False Then Directory.CreateDirectory(_downFile)
Dim brandtxt As String = CBoAirBrand.Text
Dim modeltxt As String = CBoAirType.Text
Dim versiontxt As String = CboVersion.Text
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Type", "Brand", "Model", "Version", "PacketName", "PacketData", "PacketMD5"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '空调' And {FPrefix}Brand{FPrefix} = '{brandtxt}' And {FPrefix}Model{FPrefix} = '{modeltxt}'And {FPrefix}Version{FPrefix} = '{versiontxt}'")
Console.WriteLine($"下载语句:{cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
'云端的MD5值
Dim packetName As String = dtTable(0)("PacketName")
Dim md5Cloud As String = dtTable(0)("PacketMD5")
Console.WriteLine($"包名:{dtTable(0)("PacketName")}")
Dim pData() As Byte = dtTable(0)("PacketData")
Console.WriteLine($"数据包数据:{System.Text.UTF8Encoding.UTF8.GetString(pData)}")
IO.File.WriteAllBytes($"{_downFile}\{packetName}", pData)
PauseWait(200)
'本地的MD5值
Dim md5load As String = GetFileMd5($"{_downFile}\{packetName}")
Console.WriteLine($"云端MD5值{md5Cloud}")
Console.WriteLine($"本地MD5值{md5load}")
If String.Compare(md5Cloud, md5load) = 0 Then
TBoAirImport.Text = $"{_downFile}\{packetName}"
MsgBox($"校验完成,文件无误,已导入成功!")
Else
MsgBox($"校验失败! 请重试")
End If
db.Close()
End Using
Catch ex As Exception
'Console.WriteLine($"Strat Download Error:{ex.Message}")
MsgBox($"校验失败! 请重试")
End Try
End Sub
''' <summary>
''' 选择厂商
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CBoAirBrand_DropDown(sender As Object, e As EventArgs) Handles CBoAirBrand.DropDown
CBoAirBrand.Items.Clear()
SelectBrand()
CBoAirType.Text = Nothing
CboVersion.Text = Nothing
End Sub
''' <summary>
''' 选择型号
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CBoAirType_DropDown(sender As Object, e As EventArgs) Handles CBoAirType.DropDown
CBoAirType.Items.Clear()
SelectModel()
CboVersion.Text = Nothing
End Sub
''' <summary>
''' 选择版本
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CboVersion_DropDown(sender As Object, e As EventArgs) Handles CboVersion.DropDown
CboVersion.Items.Clear()
SelectVersion()
End Sub
''' <summary>
''' 查询空调品牌
''' </summary>
Private Sub SelectBrand()
Dim addItems As New List(Of String)
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Brand"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '空调' Group by {FPrefix}Brand{FPrefix}")
Console.WriteLine($"TextXXX: {cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
For r = 0 To dtTable.Rows.Count - 1
addItems.Add(dtTable(r)(0))
Next
CBoAirBrand.Items.AddRange(addItems.ToArray)
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"厂商 Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 查询空调型号
''' </summary>
Private Sub SelectModel()
Dim brandtxt As String = CBoAirBrand.Text
Dim addItems As New List(Of String)
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Model"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '空调' And {FPrefix}Brand{FPrefix} = '{brandtxt}' Group by {FPrefix}Model{FPrefix}")
'Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName) '可添加条件
Console.WriteLine($"Model: {cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
For r = 0 To dtTable.Rows.Count - 1
addItems.Add(dtTable(r)(0))
Next
CBoAirType.Items.AddRange(addItems.ToArray)
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"型号 Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 查询空调版本
''' </summary>
Private Remark_Li As Dictionary(Of String, String)
Private FW_Ver_Li As Dictionary(Of String, String)
Private Sub SelectVersion()
Dim brandtxt As String = CBoAirBrand.Text
Dim modeltxt As String = CBoAirType.Text
Dim addItems As New List(Of String)
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Version", "Remark", "FW_Ver"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '空调' And {FPrefix}Brand{FPrefix} = '{brandtxt}' And {FPrefix}Model{FPrefix} = '{modeltxt}' ") 'CZH 查询语句去掉根据版本的分组 Group by {FPrefix}Version{FPrefix}
'Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName) '可添加条件
Console.WriteLine($"Version: {cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
Remark_Li = New Dictionary(Of String, String)
FW_Ver_Li = New Dictionary(Of String, String)
For r = 0 To dtTable.Rows.Count - 1
addItems.Add(dtTable(r)(0))
If Not Remark_Li.ContainsKey(dtTable(r)(0)) Then
Remark_Li.Add(dtTable(r)(0) dtTable(r)(1))
FW_Ver_Li.Add(dtTable(r)(0) dtTable(r)(2))
End If
Next
CboVersion.Items.AddRange(addItems.ToArray)
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"版本 Error:{ex.Message}")
End Try
End Sub
#End Region
#Region "电视下载---数据库"
''' <summary>
''' 电视下载
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub BtnTvDownload_Click(sender As Object, e As EventArgs) Handles BtnTvDownload.Click
If DoenloadTvProtect() = False Then
MsgBox($"请选择要下载的电视文件信息!")
Exit Sub
End If
StartTvDownload()
End Sub
''' <summary>
''' 选择电视品牌
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CBoTVBrand_DropDown(sender As Object, e As EventArgs) Handles CBoTVBrand.DropDown
CBoTVBrand.Items.Clear()
SelectTVBrand()
CBoTVModel.Text = Nothing
CBoTVVersion.Text = Nothing
End Sub
''' <summary>
''' 选择电视型号
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CBoTVModel_DropDown(sender As Object, e As EventArgs) Handles CBoTVModel.DropDown
CBoTVModel.Items.Clear()
SelectTVModel()
CBoTVVersion.Text = Nothing
End Sub
''' <summary>
''' 选择电视版本
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub CBoTVVersion_DropDown(sender As Object, e As EventArgs) Handles CBoTVVersion.DropDown
CBoTVVersion.Items.Clear()
SelectTvVersion()
End Sub
''' <summary>
''' 查询电视厂商
''' </summary>
Private Sub SelectTVBrand()
Dim addItems As New List(Of String)
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Brand"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '电视' Group by {FPrefix}Brand{FPrefix}")
Console.WriteLine($"查询厂商语句: {cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
For r = 0 To dtTable.Rows.Count - 1
addItems.Add(dtTable(r)(0))
Next
CBoTVBrand.Items.AddRange(addItems.ToArray)
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"电视厂商 Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 查询电视型号
''' </summary>
Private Sub SelectTVModel()
Dim brandtxt As String = CBoTVBrand.Text
Dim addItems As New List(Of String)
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Model"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '电视' And {FPrefix}Brand{FPrefix} = '{brandtxt}' Group by {FPrefix}Model{FPrefix}")
Console.WriteLine($"Model: {cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
For r = 0 To dtTable.Rows.Count - 1
addItems.Add(dtTable(r)(0))
Next
CBoTVModel.Items.AddRange(addItems.ToArray)
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"型号 Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 查询电视型号
''' </summary>
Private Sub SelectTvVersion()
Dim brandtxt As String = CBoTVBrand.Text
Dim modeltxt As String = CBoTVModel.Text
Dim addItems As New List(Of String)
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Version", "Remark", "FW_Ver"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '电视' And {FPrefix}Brand{FPrefix} = '{brandtxt}' And {FPrefix}Model{FPrefix} = '{modeltxt}' ") 'Group by {FPrefix}Version{FPrefix}
Console.WriteLine($"Version: {cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
FW_Ver_Li = New Dictionary(Of String, String)
Remark_Li = New Dictionary(Of String, String)
For r = 0 To dtTable.Rows.Count - 1
addItems.Add(dtTable(r)(0))
If Not Remark_Li.ContainsKey(dtTable(r)(0)) Then
Remark_Li.Add(dtTable(r)(0) dtTable(r)(1))
FW_Ver_Li.Add(dtTable(r)(0) dtTable(r)(2))
End If
Next
CBoTVVersion.Items.AddRange(addItems.ToArray)
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"版本 Error:{ex.Message}")
End Try
End Sub
''' <summary>
''' 下载电视保护
''' </summary>
''' <returns></returns>
Private Function DoenloadTvProtect() As Boolean
If CBoTVBrand.Text = "" Or CBoTVBrand.Text = " " Then
Return False
Exit Function
End If
If CBoTVModel.Text = "" Or CBoTVModel.Text = " " Then
Return False
Exit Function
End If
If CBoTVVersion.Text = "" Or CBoTVVersion.Text = " " Then
Return False
Exit Function
End If
Return True
End Function
''' <summary>
''' 开始下载电视文件
''' </summary>
Private Sub StartTvDownload()
If Directory.Exists(_downFile) = False Then Directory.CreateDirectory(_downFile)
Dim brandtxt As String = CBoTVBrand.Text
Dim modeltxt As String = CBoTVModel.Text
Dim versiontxt As String = CBoTVVersion.Text
Dim connString As String = ConnSQLString()
Try
Using db As New DbExecutor(RemoteDbType, connString)
db.Open()
Dim dbName As String = RemoteDbName
Dim tableName As String = "TBL_RCU_InfraredPacket"
Dim colNames As New List(Of String) From {"Type", "Brand", "Model", "Version", "PacketName", "PacketData", "PacketMD5"}
Dim cmdText As String = db.CmdHelper.DbSearch(dbName, colNames, tableName, $"{FPrefix}Type{FPrefix} = '电视' And {FPrefix}Brand{FPrefix} = '{brandtxt}' And {FPrefix}Model{FPrefix} = '{modeltxt}'And {FPrefix}Version{FPrefix} = '{versiontxt}'")
Console.WriteLine($"下载电视语句:{cmdText}")
Dim dtTable As DataTable = db.ExecuteDataTable(cmdText)
'云端的MD5值
Dim packetName As String = dtTable(0)("PacketName")
Dim md5Cloud As String = dtTable(0)("PacketMD5")
Console.WriteLine($"电视包名:{dtTable(0)("PacketName")}")
Dim pData() As Byte = dtTable(0)("PacketData")
Console.WriteLine($"电视包数据:{System.Text.UTF8Encoding.UTF8.GetString(pData)}")
IO.File.WriteAllBytes($"{_downFile}\{packetName}", pData)
PauseWait(200)
'本地的MD5值
Dim md5load As String = GetFileMd5($"{_downFile}\{packetName}")
Console.WriteLine($"云端MD5值{md5Cloud}")
Console.WriteLine($"本地MD5值{md5load}")
If String.Compare(md5Cloud, md5load) = 0 Then
TextBox1.Text = $"{_downFile}\{packetName}"
MsgBox($"校验完成,文件无误,已导入成功!")
Else
MsgBox($"校验失败! 请重试")
End If
db.Close()
End Using
Catch ex As Exception
Console.WriteLine($"Strat Download Error:{ex.Message}")
End Try
End Sub
#End Region
#End Region
#Region "添加记录"
''' <summary>
''' 添加记录
''' </summary>
''' <param name="recordString"></param>
''' <param name="col"></param>
Private Sub AppendTipText(recordString As String, col As Color)
' FrmRCU.AppendTipText(recordString, col)
If InvokeRequired Then
Invoke(New Action(Sub()
FrmRCU.AppendTipText(recordString, col)
End Sub))
Else
FrmRCU.AppendTipText(recordString, col)
End If
End Sub
Private Sub CboVersion_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CboVersion.SelectedIndexChanged
If Remark_Li.ContainsKey(CboVersion.Text) Then
TextBox2.Text = Remark_Li.Item(CboVersion.Text)
Label6.Text = FW_Ver_Li.Item(CboVersion.Text)
End If
End Sub
'CZH 20240313 增加電視備注顯示
Private Sub CBoTVVersion_TabIndexChanged(sender As Object, e As EventArgs) Handles CBoTVVersion.SelectedIndexChanged
If Remark_Li.ContainsKey(CBoTVVersion.Text) Then
TextBox3.Text = Remark_Li.Item(CBoTVVersion.Text)
Label5.Text = FW_Ver_Li.Item(CBoTVVersion.Text)
End If
End Sub
Private Sub TextBox4_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox4.KeyPress
' 允许输入数字、Backspace和退出键
If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) AndAlso e.KeyChar <> ChrW(8) Then
e.Handled = True
End If
End Sub
Public cntinde As Integer = 0
Private Sub Label89_Click(sender As Object, e As EventArgs) Handles Label89.Click
cntinde = cntinde + 1
If cntinde = 5 Then
TabPage2.Parent = TabControl3
cntinde = 0
TextBox2.Visible = True
TextBox3.Visible = True
Label2.Visible = True
Label1.Visible = True
Else
TabPage2.Parent = Nothing
TextBox2.Visible = False
TextBox3.Visible = False
Label2.Visible = False
Label1.Visible = False
End If
End Sub
#End Region
End Class