Files
Desktop_BLVStudio_EN/BLV_Studio/Test/GridTest/TableInteraction.vb
2025-12-11 14:22:51 +08:00

7036 lines
335 KiB
VB.net
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Imports System.ComponentModel
Imports System.IO
Imports System.Net
Imports BLV_Studio.EnumExtend
Imports BLV_Studio.GridModel.DeviceEventModel
Imports FlexCell
Imports Newtonsoft.Json
Public Class TableInteraction
#Region "全局变量"
Public _isVisible_Attributes As Boolean = True
Public _isVisible_Port As Boolean = True
Public _isVisible_Action As Boolean = True
Public _isVisible_Scenes As Boolean = True
Public _isVisible_Conditions As Boolean = True
''' <summary>
''' RCU设备名
''' </summary>
Public _RcuModelName As String = ""
Public Property AliasEncoding As Text.Encoding
''' <summary>刷新锁计数</summary>
Private _autoRedraw As Integer
''' <summary>进度条 控件</summary>
Public _tsp As ToolStripProgressBar
''' <summary>表格控件</summary>
Public _grd As FlexCell.Grid
''' <summary>条件文件名</summary>
Public ConditionFileName As String
''' <summary>
''' 设备对象基类信息
''' </summary>
''' <returns></returns>
Public Property BasicClasses As DeviceObjectClasses
''' <summary>基类文件名</summary>
Public BasicClassFilename As String
''' <summary>
''' 条件
''' </summary>
''' <returns></returns>
Public Property Condictions As ConfigActionConcitons
Public ConfigInfo As ConfigInfoStuct
''' <summary>
''' 主机名
''' </summary>
''' <returns></returns>
Property hostname As String
''' <summary>
''' 设备键值对 设备名-设备信息集合 主机=主机名 外设=外设名+播马地址
''' </summary>
Public Dic_Devicemodel As Dictionary(Of String DeviceModel
''' <summary>
''' 设备动作信息 设备名-动作信息集合
''' </summary>
Public Dic_ActionConfiguration As List(Of TableRowTag)
Private _Tip As String = "" ''' $"{ Chr(TableColSwitchKeyDate.TurnOn)} 表示开{vbLf }{ Chr(TableColSwitchKeyDate.TurnDrown)} 表示关{vbLf }数字 表示亮度百分比{vbCrLf }" '"表示先关后开{vbLf }{ Chr(TableColSwitchKeyDate.OnTodrowm)} 表示先开后关{vbLf }{ Chr(TableColSwitchKeyDate.TurnOn)} 表示只开不关{vbLf }{ Chr(TableColSwitchKeyDate.TurnDrown)} 表示只关不开{vbLf }数字 表示亮度百分比{vbCrLf }"
''' <summary>
''' 场景号 累加
''' </summary>
Private _SceneID As Integer = 1
''' <summary>文件是否有修改,如果有修改,则在关闭时提示保存</summary>
Public _isCellChanged As Boolean = True
Public _actionIndex As UShort
''' <summary>
''' 列的开始加载位置
''' </summary>
Private _ColumnStartLoad As Integer = TableColNumber.Max
'' <summary>
'' 服务集合!
'' </summary>
Private _ServerAction As Dictionary(Of String Integer)
''' <summary>
''' 服务插入行起始位
''' </summary>
Private _ServerInsertRows As Integer
Public ColumnAnothername As Dictionary(Of String String)
#End Region
#Region "枚举"
''' <summary>
''' 固定行
''' </summary>
Enum TableRowNumber
''' <summary>
''' 设备名
''' </summary>
DeviceName = 1
''' <summary>
''' 功能名
''' </summary>
FunctionName
FunctionAnotherName
''' <summary>
''' 功能下属节点ID
''' </summary>
FunctionChildNodeID
''' <summary>
''' 功能下属节点别名
''' </summary>
FunctionChildNodeAnother
''' <summary>
''' 条件列名
''' </summary>
ConditionalColumnName
Max
End Enum
''' <summary>
''' 固定列
''' </summary>
Enum TableColNumber
''' <summary>
''' 行号
''' </summary>
RowID = 0
<Description("Address provision")>
DeviceName
<Description("enable")>
choose
<Description("Scene number")>
SceneID
<Description("Key value")>
KeyVal
<Description("Key name")>
KeyName
'<Description("设备类型")>
'DeviceType
<Description("Scene attribute")>
SceneAttribute
<Description("Service attribute")>
ServerAttribute
InsertColumn
Max
End Enum
''' <summary>
''' 列数据的数据类型
''' </summary>
Enum TableColDateType
''' <summary>
''' 表列-音乐数据
''' </summary>
Music
''' <summary>
''' 表列-开关数据
''' </summary>
SwitchKey
''' <summary>
''' 表列-服务添加
''' </summary>
ServiceCondition
End Enum
''' <summary>
'''
''' </summary>
Enum TableColSwitchKeyDate
''' <summary>
''' 按键开
''' </summary>
TurnOn = -24116
''' <summary>
''' 按键关
''' </summary>
TurnDrown = -23592
''' <summary>
''' 表示先开后关
''' </summary>
'OnTodrowm = -24080
''' <summary>
''' 代表先关后开
''' </summary>
'drowmToOn = -24075
End Enum
Enum tabRange
devname
fr
lr
fc
lc
End Enum
#End Region
#Region "类 Body"
Public Sub New(ByRef tsp As ToolStripProgressBar)
CopyActionData = New Dictionary(Of Integer, String
_actionIndex = 1
_tsp = tsp
Dic_Devicemodel = New Dictionary(Of String, DeviceModel)
Dic_ActionConfiguration = New List(Of TableRowTag)
_ServerAction = New Dictionary(Of String, Integer)
ColumnAnothername = New Dictionary(Of String, String)
AliasEncoding = Text.Encoding.GetEncoding("GBK")
End Sub
#End Region
#Region "表格设置"
''' <summary>
''
''' </summary>
''' <returns></returns>
Public Property Grid As Grid
Get
Return _grd
End Get
Set(value As Grid)
_grd = value
grdRemoveHandler()
grdAddHandler()
End Set
End Property
Public Sub grdRemoveHandler()
RemoveHandler _grd.OwnerDrawCell, AddressOf Grid_OwnerDrawCell
RemoveHandler _grd.Click, AddressOf Grid_Click
RemoveHandler _grd.DoubleClick, AddressOf Grid_DoubleClick
RemoveHandler _grd.ComboDropDown, AddressOf Grid_ComboDropDown
'RemoveHandler _grd.ComboClick, AddressOf Grid_ComboClick
RemoveHandler _grd.CellChange, AddressOf Grid_CellChange
'RemoveHandler _grd.SelChange, AddressOf Grid_SelChange
'RemoveHandler _grd.KeyDown, AddressOf Grid_KeyDown
'RemoveHandler _grd.KeyUp, AddressOf Grid_KeyUp
'RemoveHandler _grd.MouseMove, AddressOf Grid_MouseMove
'RemoveHandler _grd.MouseWheel, AddressOf Grid_MouseWheel
'RemoveHandler _grd.LeaveCell, AddressOf Grid_LeaveCell
'RemoveHandler _grd.MouseDown, AddressOf Grid_MouseDown
'RemoveHandler _grd.MouseUp, AddressOf Grid_MouseUp
End Sub
Public Sub grdAddHandler()
'AddHandler _grd.MouseWheel, AddressOf Grid_MouseWheel
'AddHandler _grd.MouseMove, AddressOf Grid_MouseMove
'AddHandler _grd.KeyUp, AddressOf Grid_KeyUp
'AddHandler _grd.KeyDown, AddressOf Grid_KeyDown
'AddHandler _grd.SelChange, AddressOf Grid_SelChange
AddHandler _grd.CellChange, AddressOf Grid_CellChange
AddHandler _grd.ComboDropDown, AddressOf Grid_ComboDropDown
'AddHandler _grd.ComboClick, AddressOf Grid_ComboClick
AddHandler _grd.Click, AddressOf Grid_Click
AddHandler _grd.DoubleClick, AddressOf Grid_DoubleClick
AddHandler _grd.OwnerDrawCell, AddressOf Grid_OwnerDrawCell
'AddHandler _grd.LeaveCell, AddressOf Grid_LeaveCell
'AddHandler _grd.MouseDown, AddressOf Grid_MouseDown
'AddHandler _grd.MouseUp, AddressOf Grid_MouseUp
End Sub
Private Sub Grid_OwnerDrawCell(Sender As Object, e As Grid.OwnerDrawCellEventArgs)
'Console.WriteLine($"Grid_OwnerDrawCell_{e.Row}_{ e.Col}_{_grd.Cell(e.Row, e.Col).Text }")
If e.Row < TableRowNumber.Max OrElse e.Col < TableColNumber.InsertColumn Then
'Dim bColor As New SolidBrush(_grd.Cell(e.Row, e.Col).ForeColor)
'With _grd.Cell(e.Row, e.Col)
' Dim stringFormat = New StringFormat()
' stringFormat.Alignment = StringAlignment.Center
' Dim ft = New Font(_grd.DefaultFont.Name, .FontSize)
' Console.WriteLine($"Grid_OwnerDrawCell__【{ .Text}】color【{ .ForeColor}】 Left【{e.Bounds.Left}】 top【{e.Bounds.Top}】Height【{e.Bounds.Height}】Width【{e.Bounds.Width}】 ppp:【{e.Graphics.MeasureString(.Text, .Font).Height}】")
' Dim rect As RectangleF = New RectangleF(e.Bounds.Left, e.Bounds.Top + (e.Bounds.Height - e.Graphics.MeasureString(.Text, .Font).Height) / 2 + 2, e.Bounds.Width, e.Bounds.Height)
' e.Graphics.DrawString(.Text, ft, bColor, rect, stringFormat)
'End With
Return
End If
If Dic_ActionConfiguration.Count <= (e.Row - TableRowNumber.Max) Then
Return
End If
'获取显示内容
'Dim nodename As String = _grd.Cell(TableRowNumber.FunctionName, e.Col).Text
Dim celltext As String = _grd.Cell(e.Row, e.Col).Text.Trim
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(e.Row - TableRowNumber.Max)
Dim Isflig As Boolean = False
'画树线
Dim pen As New System.Drawing.Pen(Color.CornflowerBlue, 1)
If Not String.IsNullOrEmpty(_grd.Cell(e.Row, e.Col).Text) Then
Console.WriteLine(_grd.Cell(e.Row, e.Col).Text)
End If
Try
pen.DashStyle = Drawing2D.DashStyle.Solid
'判断内容
If rowtag.G_DicRow.ContainsKey(e.Col) Then
Dim cdrstr As String = rowtag.G_DicRow.Item(e.Col)
Dim g_devname As New CtabRange(_grd, TableRowNumber.FunctionName, e.Col)
Dim ctstr As String = EstimateFilag(cdrstr, g_devname.devname)
Dim nbuf() As String = cdrstr.Split(vbLf)
If Not String.IsNullOrEmpty(celltext) AndAlso celltext.Equals(ctstr) AndAlso Not (cdrstr.Substring(0, 1).Equals("0") AndAlso nbuf.Length = 1) Then
'+/-
For i = 0 To 8
e.Graphics.DrawLine(Pens.Green, e.Bounds.Left, e.Bounds.Top + i, e.Bounds.Left + i, e.Bounds.Top)
Next
End If
End If
'文字
Dim bColor As New SolidBrush(_grd.Cell(e.Row, e.Col).ForeColor)
With _grd.Cell(e.Row, e.Col)
Dim stringFormat = New StringFormat()
stringFormat.Alignment = StringAlignment.Center
Dim ft = New Font(_grd.DefaultFont.Name, 8.2)
' Console.WriteLine($"Grid_OwnerDrawCell__【{ .Text}】color【{ .ForeColor}】 Left【{e.Bounds.Left}】 top【{e.Bounds.Top}】Height【{e.Bounds.Height}】Width【{e.Bounds.Width}】 ppp:【{e.Graphics.MeasureString(.Text, .Font).Height}】")
Dim rect As RectangleF = New RectangleF(e.Bounds.Left, e.Bounds.Top + (e.Bounds.Height - e.Graphics.MeasureString(.Text, .Font).Height) / 2 + 2, e.Bounds.Width, e.Bounds.Height)
e.Graphics.DrawString(.Text, ft, bColor, rect, stringFormat)
End With
Catch ex As Exception
End Try
e.Handled = True
End Sub
Public Function EstimateFilag(cellstr As String, nodename As String) As String
If String.IsNullOrEmpty(cellstr) OrElse String.IsNullOrEmpty(nodename) Then Return String.Empty
Dim tbuf() As String = cellstr.Split(vbLf)
Dim cbuf() As String = tbuf(0).Split(",")
If cbuf.Length < 2 Then Return String.Empty
Dim buf() As String = cbuf(cbuf.Length - 1).Split("*")
Dim result As String = String.Empty
Select Case nodename
Case "RKEY"
result = cellstr
Case "CLED_FRESHAIR"
result = cellstr
Case "CLEDFLOORHEAT"
result = cellstr
Case "485FloorHeat" "485FreshAir"
If buf.Length > 3 Then
cbuf = buf(3).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
End If
'Case
'result = $"{buf(3)}"
Case "485MUSIC"
result = cellstr
'Case
' result = $"{buf(3)}"
Case "INFRARED_FORWARD"
If buf.Length = 3 Then
cbuf = buf(2).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
ElseIf buf.Length > 3 Then
cbuf = buf(2).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
cbuf = buf(3).Split(" ")
'result = $"{cbuf(cbuf.Length - 1)}"
result = $"{result}:{cbuf(cbuf.Length - 1)}"
End If
Case "RELAY", "PB_RELAY_DEVICE"
If buf.Length > 2 Then
cbuf = buf(2).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
If result.Equals("") Then
result = Chr(TableColSwitchKeyDate.TurnOn).ToString()
ElseIf result.Equals("") Then
result = Chr(TableColSwitchKeyDate.TurnDrown).ToString()
End If
End If
'If buf.Length > 2 Then
' cbuf = buf(2).Split(" ")
' result = $"{cbuf(cbuf.Length - 1)}"
' If result.Equals("80") Then
' result = Chr(TableColSwitchKeyDate.TurnOn).ToString()
' ElseIf result.Equals("0") Then
' result = Chr(TableColSwitchKeyDate.TurnDrown).ToString()
' End If
'End If
Case "PB_LINE_CONTROL", "PB_STRIP_DEVICE", "PB_LED_DEVICE"
result = cellstr
'If buf.Length > 3 AndAlso ((tbuf(0).Contains("PB灯带亮度控制")) OrElse (tbuf(0).Contains("控制灯光"))) Then
' cbuf = buf(3).Split(" ")
' result = $"{cbuf(cbuf.Length - 1)}"
' If result.Equals("80") Then
' result = Chr(TableColSwitchKeyDate.TurnOn).ToString()
' ElseIf result.Equals("0") Then
' result = Chr(TableColSwitchKeyDate.TurnDrown).ToString()
' End If
'End If
Case "Dimming"
result = cellstr
If buf.Length > 2 AndAlso cellstr.Contains("Control lighting") Then
cbuf = buf(3).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
If result.Equals("80") Then
result = Chr(TableColSwitchKeyDate.TurnOn).ToString()
ElseIf result.Equals("0") Then
result = Chr(TableColSwitchKeyDate.TurnDrown).ToString()
End If
End If
Case "DO", "LIGHT" "DRY_CURTAIN", "RS485_Curtain", "CURTAIN"
If buf.Length > 2 Then
cbuf = buf(2).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
End If
Case "RS485_Curtain"
result = cellstr
If buf.Length = 3 Then
cbuf = buf(2).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
End If
Case "MUSIC"
result = cellstr
Case "DRY_NoCard"
result = cellstr
Case "HOPO_Curtain"
result = cellstr
Case "Dev_ColorTemp"
result = cellstr
Case "BLEMUSIC"
result = cellstr
Case "Carbon_Device", "Scene_Restore"
result = cellstr
'Case
' result = $"{buf(2)}"
'Case
' result = $"{buf(2)}"
Case "Temp"
If buf.Length > 5 Then
'cbuf = buf(3).Split(" ")
'result = $"{cbuf(cbuf.Length - 1)}"
cbuf = buf(4).Split(" ")
result = $"{cbuf(cbuf.Length - 1)}"
cbuf = buf(5).Split(" ")
result = $"{result}{cbuf(cbuf.Length - 1)}"
End If
Case Else
End Select
Return result
End Function
Public Sub LoadTheHostTable(model As DeviceModel)
'新主机项目 清空设备列表
Dic_Devicemodel.Clear()
Dic_ActionConfiguration.Clear()
_ServerAction.Clear()
ColumnAnothername.Clear()
'记录主机名称
hostname = model.Name
_ServerInsertRows = 0
_SceneID = 1
_ColumnStartLoad = TableColNumber.Max - 1
'加载表头
initGrid1()
'加载设备
'将主机存入设备列表
Dic_Devicemodel.Add(model.Name, model)
'ShowRelay(model)
ShowRelay_Test(model)
SpecifySetting(model.Name, "")
End Sub
''' <summary>
''' 表头初始化
''' </summary>
Public Sub initGrid1()
LockGridAutoRedraw()
If Not IsNothing(oldColDisplayDic) Then
oldColDisplayDic.Clear()
End If
_grd.NewFile()
_grd.DefaultRowHeight = 21
_grd.DrawMode = DrawModeEnum.OwnerDraw
_grd.Cols = TableColNumber.Max
_grd.Rows = TableRowNumber.DeviceName
_grd.Column(0).Visible = False
_grd.Row(0).Visible = False
_grd.DefaultFont = New Font(_grd.DefaultFont.Name, 8)
'_grd.BackColorFixed = Color.LightPink
'_grd.BackColorFixedSel = Color.LightCoral
For i As Integer = TableRowNumber.DeviceName To TableRowNumber.Max - 1
_grd.AddItem("")
Next
_grd.Row(TableRowNumber.FunctionChildNodeAnother).Height = 70
With _grd.Range(TableRowNumber.DeviceName, TableColNumber.SceneID, TableRowNumber.FunctionChildNodeID, TableColNumber.SceneAttribute)
.Merge()
.Alignment = AlignmentEnum.CenterCenter
End With
_grd.Cell(TableRowNumber.DeviceName, TableColNumber.InsertColumn - 1).Text = "主机时间偏移"
_grd.Cell(TableRowNumber.DeviceName, TableColNumber.InsertColumn - 1).Locked = True
'With _grd.Range(TableRowNumber.FunctionChildNodeID, TableColNumber.InsertColumn - 1, TableRowNumber.FunctionChildNodeID, TableColNumber.InsertColumn - 1)
' .Merge()
' .Alignment = AlignmentEnum.CenterCenter
'End With
With _grd.Cell(TableRowNumber.FunctionAnotherName, TableColNumber.InsertColumn - 1)
.Text = "0"
.CellType = CellTypeEnum.ComboBox
.Alignment = AlignmentEnum.CenterCenter
' .Locked = True
End With
With _grd.Range(TableRowNumber.DeviceName, TableColNumber.DeviceName, TableRowNumber.FunctionChildNodeID, TableColNumber.choose)
.Merge()
.Alignment = AlignmentEnum.CenterCenter
.WrapText = True
End With
With _grd.Range(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName, TableRowNumber.FunctionChildNodeAnother, TableColNumber.InsertColumn - 1)
.Merge()
.Alignment = AlignmentEnum.CenterCenter
.Locked = True
End With
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).WrapText = True
'_grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text = "test"
With _grd.Cell(TableRowNumber.DeviceName, TableColNumber.DeviceName)
.Text = "There is a card to take power"
.Locked = True
.WrapText = True
End With
With _grd.Cell(TableRowNumber.DeviceName, TableColNumber.SceneID)
.Text = _Tip
.Locked = True
.WrapText = True
End With
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.DeviceName).Text = EnumExtender.GetEnumDescription(TableColNumber.DeviceName)
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.KeyVal).Text = EnumExtender.GetEnumDescription(TableColNumber.KeyVal)
_grd.Column(TableColNumber.KeyVal).Width = 30
_grd.Column(TableColNumber.KeyVal).Locked = True
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.KeyName).Text = EnumExtender.GetEnumDescription(TableColNumber.KeyName)
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.choose).Text = EnumExtender.GetEnumDescription(TableColNumber.choose)
_grd.Column(TableColNumber.choose).Width = 30
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.SceneID).Text = EnumExtender.GetEnumDescription(TableColNumber.SceneID)
_grd.Column(TableColNumber.SceneID).Width = 40
_grd.Column(TableColNumber.SceneID).Locked = True
_grd.Column(TableColNumber.InsertColumn).Width = 0
_grd.Column(TableColNumber.choose).Width = 0
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.ServerAttribute).Text = EnumExtender.GetEnumDescription(TableColNumber.ServerAttribute)
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.SceneAttribute).Text = EnumExtender.GetEnumDescription(TableColNumber.SceneAttribute)
_grd.Range(TableRowNumber.ConditionalColumnName, TableColNumber.DeviceName, TableRowNumber.ConditionalColumnName, TableColNumber.ServerAttribute).Locked = True
_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.SceneAttribute).Text = EnumExtender.GetEnumDescription(TableColNumber.SceneAttribute)
'_grd.Cell(TableRowNumber.ConditionalColumnName, TableColNumber.DeviceType).Text = EnumExtender.GetEnumDescription(TableColNumber.DeviceType)
_grd.Row(TableRowNumber.FunctionChildNodeID).Locked = True
_grd.Row(TableRowNumber.FunctionName).Visible = False
_grd.FrozenRows = TableRowNumber.Max - 1
_grd.FrozenCols = TableColNumber.Max - 2
'_grd.Column(TableColNumber.InsertColumn).AutoFit()
UnLockGridAutoRedraw()
End Sub
Public Sub AddToTableDevMode(filepath As String)
Dim from1 As New AddPeripherals
from1.Dirpath = filepath
from1.g_grd = _grd
from1.g_Devicemodel = Dic_Devicemodel
from1.g_DevRELAYrow = GetDevLoopName("RELAY", "PB_RELAY_DEVICE")
from1.g_Devinfraredrow = GetDevLoopName("INFRARED_FORWARD")
from1.g_Devintemp = GetDevLoopName("Temp")
from1.g_DevDimming = GetDevLoopName("Dimming")
from1.g_Devin485fraredrow = GetDevLoopName("RS485_Curtain")
from1.g_DevinCURTAINdrow = GetDevLoopName("CURTAIN")
from1.g_Devservice = GetHOSTSERVICENumber()
from1.g_DevScenenumber = GetSceneNumbeAr()
from1.g_ColumnAnothername = ColumnAnothername
If from1.ShowDialog() <> DialogResult.OK Then Return
If IsNothingfrom1.Resultmodel Then
MsgBox("Failed to add peripheral devices. Procedure")
Return
End If
ShowRelay(from1.Resultmodel, from1.ResulDic)
Grid_Click(Nothing, Nothing)
For Each index In from1.Resultmodel.Nodes
If index.Interface.Equals("DI") AndAlso (index.DEV_TYPE_DATA.Equals("10") OrElse index.DEV_TYPE_DATA.Equals("24")) Then
SpecifySetting(from1.Resultmodel.Name, "")
End If
Next
End Sub
Public Shared Function CURTAIN_check(grd As FlexCell.Grid col As Integer) As List(Of Integer
If IsNothing(grd) OrElse grd.Cols - 1 <= col Then Return Nothing
Dim li As New List(Of Integer)
For i = TableRowNumber.Max To grd.Rows - 1
'Console.WriteLine($"{grd.Cell(i, col).Text.Trim}___{grd.Column(col).Locked}")
If (Not String.IsNullOrEmpty(grd.Cell(i, col).Text.Trim)) OrElse grd.Column(col).Locked Then
li.Add(i)
End If
Next
Return li
End Function
Public Function GetSceneNumbeAr() As Dictionary(Of String Integer
Dim resulrdic As New Dictionary(Of String Integer
For i = TableRowNumber.Max To _grd.Rows - 1
Dim g_devname = New CtabRange(_grd, i, TableColNumber.DeviceName)
If g_devname.devname.Equals("HOSTSERVICE") Then
Continue For
End If
If _grd.Cell(i, TableColNumber.SceneID).Text.Equals("Voice") AndAlso String.IsNullOrEmpty(_grd.Cell(i, TableColNumber.SceneAttribute).Text) Then
Continue For
End If
Dim ss As String = $"{_grd.Cell(i, TableColNumber.SceneID).Text}*({_grd.Cell(i, TableColNumber.KeyName).Text})"
resulrdic.Add($"{_grd.Cell(i, TableColNumber.SceneID).Text}*({_grd.Cell(i, TableColNumber.KeyName).Text})", i)
Next
Return resulrdic
End Function
Public Function GetHOSTSERVICENumber() As Dictionary(Of String Integer
Dim resulrdic As New Dictionary(Of String Integer
For i = TableRowNumber.Max To _grd.Rows - 1
Dim g_devname = New CtabRange(_grd, i, TableColNumber.DeviceName)
If g_devname.devname.Equals("HOSTSERVICE") Then
Dim dkey As String = $"{hostname}*HOSTSERVICE*{_grd.Cell(i, TableColNumber.KeyVal).Text }*({_grd.Cell(i, TableColNumber.KeyName).Text})"
If resulrdic.ContainsKey(dkey) Then
Continue For
End If
resulrdic.Add(dkey, i)
Else
Continue For
End If
Next
Return resulrdic
End Function
Public Function GetDevLoopName(LoopName As String, Optional LoopName1 As String = Nothing) As Dictionary(Of String Integer
Dim resulrdic As New Dictionary(Of String Integer
'resulrdic.Add("", 0)
For i = TableColNumber.InsertColumn To _grd.Cols - 1
Dim g_devname = New CtabRange(_grd, TableRowNumber.FunctionName, i)
If g_devname.devname.Equals(LoopName) Then
Dim devname = New CtabRange(_grd, TableRowNumber.DeviceName, i)
Dim gdevname = New CtabRange(_grd, TableRowNumber.FunctionName, i)
Dim devnamestr As String = devname.devname
For ci = g_devname.fc To g_devname.lc
resulrdic.Add($"{devnamestr}*{_grd.Cell(TableRowNumber.FunctionChildNodeID, ci).Text }*{gdevname.devname }", ci)
Next
End If
If LoopName1 <> Nothing AndAlso g_devname.devname.Equals(LoopName1) Then
Dim devname = New CtabRange(_grd, TableRowNumber.DeviceName, i)
Dim gdevname = New CtabRange(_grd, TableRowNumber.FunctionName, i)
Dim devnamestr As String = devname.devname
For ci = g_devname.fc To g_devname.lc
resulrdic.Add($"{devnamestr}*{_grd.Cell(TableRowNumber.FunctionChildNodeID, ci).Text }*{gdevname.devname }", ci)
Next
End If
i = g_devname.lc
Next
Return resulrdic
End Function
Public Sub ShowRelay_Test(moduStr As DeviceModel, Optional OPTdic As Dictionary(Of String, String) = Nothing)
LockGridAutoRedraw()
'_grd.Cols = TableColNumber.Max
Dim demoindex As Integer = _ColumnStartLoad
Dim Interace_DI As New List(Of DeviceChildNodeClass)
Dim Interace_DO As New List(Of DeviceChildNodeClass)
' If moduStr.Nodes.Count = 1 AndAlso moduStr.Nodes(0).Nodes.Count = 0 Then
If moduStr.Nodes.Count = 1 AndAlso (moduStr.Nodes(0).Nodes.Count = 0 OrElse moduStr.Nodes(0).DEV_TYPE_DATA.Equals("48") OrElse moduStr.Nodes(0).DEV_TYPE_DATA.Equals("46")) Then
Dim ctext As String = _grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text
If String.IsNullOrEmpty(ctext) Then
ctext = moduStr.Name
Else
ctext = ctext & "," & moduStr.Name
End If
'ctext = ctext.Substring(0, ctext.Length - 1)
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text = ctext
UnLockGridAutoRedraw()
Return
End If
For Each ModuleFre In moduStr.Nodes
Select Case ModuleFre.Interface
Case "DO"
If String.IsNullOrEmpty(ModuleFre.DEV_TYPE_DATA) OrElse ModuleFre.DEV_TYPE_DATA = 4 Then Continue For
If ModuleFre.DEV_TYPE_DATA = 21 AndAlso ModuleFre.PROTOCOL_VER = 1 Then
Interace_DO.Insert0, ModuleFre
Else
Interace_DO.AddModuleFre
End If
Case "DI"
Interace_DI.AddModuleFre
End Select
Next
For Each indesx In Interace_DO
If indesx.DEV_TYPE_DATA = 3 Then
AddColumnConfig(indesx, demoindex, _ColumnStartLoad, moduStr, OPTdic)
Else
AddColumnConfig(indesx, demoindex, _ColumnStartLoad, moduStr)
End If
Next
_ColumnStartLoad = demoindex
ShowSwitch2(moduStr.Name, Interace_DI, OPTdic)
ChangeTheServiceLineNumber()
UnLockGridAutoRedraw()
End Sub
Public Sub ShowRelay(moduStr As DeviceModel, Optional OPTdic As Dictionary(Of String, String) = Nothing)
LockGridAutoRedraw()
'_grd.Cols = TableColNumber.Max
Dim demoindex As Integer = _ColumnStartLoad
Dim g_Dimming As DeviceChildNodeClass
Dim g_RELAY As DeviceChildNodeClass
Dim g_DO As DeviceChildNodeClass
Dim g_MUSIC As DeviceChildNodeClass
Dim g_Lock As DeviceChildNodeClass
Dim g_RS485_Curtain As DeviceChildNodeClass
Dim g_485MUSIC As DeviceChildNodeClass
Dim g_CURTAIN As DeviceChildNodeClass
Dim g_INFRARED_FORWARD As DeviceChildNodeClass
Dim g_Temp As DeviceChildNodeClass
Dim g_485FreshAir As DeviceChildNodeClass
Dim g_485FloorHeat As DeviceChildNodeClass
Dim g_PBnode As DeviceChildNodeClass
Dim Dev_ColorTemp As DeviceChildNodeClass
Dim All_DO As New List(Of DeviceChildNodeClass)
Dim Interace_DI As New List(Of DeviceChildNodeClass)
g_PBnode = Nothing
g_Dimming = Nothing
g_RELAY = Nothing
g_DO = Nothing
g_MUSIC = Nothing
g_Lock = Nothing
g_RS485_Curtain = Nothing
g_485MUSIC = Nothing
g_CURTAIN = Nothing
g_INFRARED_FORWARD = Nothing
g_Temp = Nothing
g_485FreshAir = Nothing
g_485FloorHeat = Nothing
Dev_ColorTemp = Nothing
If moduStr.Nodes.Count = 1 AndAlso (moduStr.Nodes(0).Nodes.Count = 0 OrElse moduStr.Nodes(0).DEV_TYPE_DATA.Equals("48") OrElse moduStr.Nodes(0).DEV_TYPE_DATA.Equals("46")) Then
Dim ctext As String = _grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text
If String.IsNullOrEmpty(ctext) Then
ctext = moduStr.Name
Else
ctext = ctext & "," & moduStr.Name
End If
'ctext = ctext.Substring(0, ctext.Length - 1)
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text = ctext
UnLockGridAutoRedraw()
Return
End If
For Each ModuleFre In moduStr.Nodes
If ModuleFre.Name.Equals("Dimming") Then
g_Dimming = ModuleFre
ElseIf ModuleFre.Name.Equals("RELAY") Then
g_RELAY = ModuleFre
ElseIf ModuleFre.Name.Equals("Dev_ColorTemp") Then
Dev_ColorTemp = ModuleFre
ElseIf ModuleFre.Name.Equals("DO") Then
g_DO = ModuleFre
ElseIf ModuleFre.Name.Equals("RKEY") AndAlso ModuleFre.Interface.Equals("DO") Then
g_Lock = ModuleFre
ElseIf ModuleFre.Name.Equals("DRY_NoCard") Then
g_DO = ModuleFre
ElseIf ModuleFre.Name.Equals("MUSIC") AndAlso ModuleFre.PROTOCOL_VER.Equals("1") Then
g_MUSIC = ModuleFre
ElseIf ModuleFre.Name.Equals("Lock") Then
g_Lock = ModuleFre
ElseIf ModuleFre.Name.Equals("485MUSIC") Then
g_485MUSIC = ModuleFre
ElseIf ModuleFre.Name.Equals("RS485_Curtain") Then
g_RS485_Curtain = ModuleFre
ElseIf ModuleFre.Name.Equals("CURTAIN") Then
g_CURTAIN = ModuleFre
ElseIf ModuleFre.Name.Equals("INFRARED_FORWARD") Then
g_INFRARED_FORWARD = ModuleFre
ElseIf ModuleFre.Name.Equals("Temp") Then
g_Temp = ModuleFre
ElseIf ModuleFre.Name.Equals("485FreshAir") Then
g_485FreshAir = ModuleFre
ElseIf ModuleFre.Name.Equals("CLED_FRESHAIR") Then
g_485FreshAir = ModuleFre
ElseIf ModuleFre.Name.Equals("CLEDFLOORHEAT") Then
g_485FloorHeat = ModuleFre
ElseIf ModuleFre.Name.Equals("485FloorHeat") Then
g_485FloorHeat = ModuleFre
ElseIf ModuleFre.Name.Equals("PB_LED") OrElse ModuleFre.Name.Equals("PB_RELAY_DEVICE") OrElse ModuleFre.Name.Equals("PB_STRIP_DEVICE") Then
g_PBnode = ModuleFre
ElseIf ModuleFre.Interface.Equals("DO") AndAlso Not ModuleFre.Name.Equals("Virtual_Card") Then
All_DO.AddModuleFre
ElseIf ModuleFre.Interface.Equals("DI") Then
Interace_DI.AddModuleFre
End If
Next
AddColumnConfig(g_MUSIC, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_DO, demoindex, _ColumnStartLoad, moduStr, OPTdic)
AddColumnConfig(g_Dimming, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_RELAY, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_Lock, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_PBnode, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_RS485_Curtain, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_485MUSIC, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_CURTAIN, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_INFRARED_FORWARD, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_Temp, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_485FloorHeat, demoindex, _ColumnStartLoad, moduStr)
AddColumnConfig(g_485FreshAir, demoindex, _ColumnStartLoad, moduStr)
For Each donode In All_DO
AddColumnConfig(donode, demoindex, _ColumnStartLoad, moduStr)
Next
If Not IsNothingDev_ColorTemp Then
AddColumnConfig(Dev_ColorTemp, demoindex, _ColumnStartLoad, moduStr Nothing, CIntmoduStr.Desc.DevDescription))
End If
_ColumnStartLoad = demoindex
ShowSwitch2(moduStr.Name, Interace_DI, OPTdic)
ChangeTheServiceLineNumber()
UnLockGridAutoRedraw()
End Sub
Public Shared Function GetAnotherName(str As String) As String
Dim result As String = String.Empty
If String.IsNullOrEmpty(str) Then
result = "Unknown"
Else
Select Case str
Case "CLED_FRESHAIR"
result = "CLED Fresh air"
Case "CLEDFLOORHEAT"
result = "CLED Underfloor heating"
Case "485FloorHeat"
result = "Underfloor heating"
Case "485FreshAir"
result = "Fresh air"
Case "485MUSIC"
result = "485 music"
Case "CURTAIN"
result = "Dry contact curtain"
Case "INFRARED_FORWARD"
result = "Infrared"
Case "RS485_Curtain"
result = "485 Curtain"
Case "RELAY"
result = "RELAY"
Case "MUSIC"
result = "music"
Case "Dimming"
result = "Dimming"
Case "DO"
result = "DO"
Case "Temp"
result = "Temp"
Case "PB_LINE_CONTROL"
result = "PB_LINE_CONTROL"
Case "PB_STRIP_DEVICE"
result = "PB_STRIP_DEVICE"
Case "PB_RELAY_DEVICE"
result = "PLC_RELAY"
Case "Dev_ColorTemp"
result = "Color temperature control"
Case "BLEMUSIC"
result = "BLE MUSIC"
Case "Carbon_Device"
result = "Carbon Device"
Case "DRY_NoCard"
result = "Non-stuck power off"
Case "RKEY"
result = "RKEY"
Case "Scene_Restore"
result = "Scene Restore"
Case Else
result = $"{str}"
End Select
End If
Return result
End Function
''' <summary>
''' 加载设备头输出信息
''' </summary>
''' <param name="ModuleFre"></param>
''' <param name="demoindex"></param>
''' <param name="Startid"></param>
''' <param name="moduStr"></param>
Public Sub AddColumnConfig(ModuleFre As DeviceChildNodeClass ByRef demoindex As Integer Startid As Integer moduStr As DeviceModel, ByRef Optional OPTdic As Dictionary(Of String, String) = Nothing, Optional len As Integer = 0)
'添加继电器列
If IsNothing(ModuleFre) OrElse ModuleFre.Nodes.Count = 0 Then Return
If len = 0 Then
len = ModuleFre.Nodes.Count
End If
'Console.WriteLine($"AddColumnConfig::::{demoindex}:{ _grd.Column(demoindex).Visible}")
_grd.InsertCol(demoindex, len)
_grd.Column(demoindex).Visible = True
'_grd.Column(demoindex).Width = 300
_grd.Range(0, demoindex, _grd.Rows - 1, demoindex).BackColor = Color.White
_grd.Range(0, demoindex, _grd.Rows - 1, demoindex).ForeColor = Color.Black
'_grd.Cols = demoindex + ModuleFre.Nodes.Count
_grd.Cell(TableRowNumber.FunctionName, demoindex).Text = ModuleFre.Name
_grd.Cell(TableRowNumber.FunctionAnotherName, demoindex).Text = GetAnotherName(ModuleFre.Name)
_grd.Range(TableRowNumber.FunctionName, demoindex, TableRowNumber.FunctionName, demoindex + len - 1).Locked = False
'For ti = demoindex To demoindex + len - 1
' Console.WriteLine($"C:{ti} V:{_grd.Column(ti).Locked }")
'Next
Console.WriteLine($"R:{TableRowNumber.FunctionName} V:{_grd.Row(TableRowNumber.FunctionName).Locked }")
_grd.Range(TableRowNumber.FunctionName, demoindex, TableRowNumber.FunctionName, demoindex + len - 1).Merge()
_grd.Range(TableRowNumber.FunctionName, demoindex, TableRowNumber.FunctionName, demoindex + len - 1).Locked = True
_grd.Range(TableRowNumber.FunctionAnotherName, demoindex, TableRowNumber.FunctionAnotherName, demoindex + len - 1).Locked = False
_grd.Range(TableRowNumber.FunctionAnotherName, demoindex, TableRowNumber.FunctionAnotherName, demoindex + len - 1).Merge()
_grd.Range(TableRowNumber.FunctionAnotherName, demoindex, TableRowNumber.FunctionAnotherName, demoindex + len - 1).Locked = True
_grd.Range(TableRowNumber.DeviceName, Startid, TableRowNumber.DeviceName, demoindex + len - 1).Locked = False
_grd.Range(TableRowNumber.DeviceName, Startid, TableRowNumber.DeviceName, demoindex + len - 1).Merge()
_grd.Range(TableRowNumber.DeviceName, Startid, TableRowNumber.DeviceName, demoindex + len - 1).Locked = True
_grd.Cell(TableRowNumber.DeviceName, Startid).Text = moduStr.Name
_grd.Range(TableRowNumber.DeviceName, Startid, TableRowNumber.FunctionChildNodeAnother, Startid + len - 1).Alignment = AlignmentEnum.CenterCenter
For i As Integer = 0 To len - 1
Dim incol As Integer = demoindex + i
_grd.Cell(TableRowNumber.FunctionChildNodeID, incol).Text = (i + 1).ToString
'Console.WriteLine($"{ModuleFre.Name}_R:{TableRowNumber.FunctionChildNodeID.ToString }_C:{Startid + i}_{(i + 1).ToString}")
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, incol).Text = ModuleFre.Nodes(i).DefaultAliasName
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, incol).WrapText = True
_grd.Column(incol).Width = 30
' Console.WriteLine($"AddColumnConfig::::{incol}:{_grd.Column(incol).Visible}:{_grd.Column(incol).Width}")
_grd.Column(incol).Visible = True
'_grd.Cell(TableRowNumber.FunctionChildNodeAnother, incol).Orientation = TextOrientationEnum.Vertical
With _grd.Range(TableRowNumber.FunctionChildNodeAnother, incol, TableRowNumber.ConditionalColumnName, incol)
.Locked = False
.Merge()
' .Locked = True
End With
'If i = 0 Then
' _grd.Cell(TableRowNumber.FunctionName, demoindex).Text = ModuleFre.Nodes(i).BaseClasses.Classes(0).Name
'End If
If IsNothingOPTdic OrElse OPTdic.Count = 0 Then Continue For
If _grd.Cell(TableRowNumber.FunctionChildNodeAnother, incol).Text.Equals("visible") Then Continue For
If i = len - 1 AndAlso (Not ModuleFre.Nodes(i).Name.Equals("RKEY")) Then
_grd.Column(incol).Visible = False
End If
For j = 0 To OPTdic.Count - 1
If OPTdic.Values(j).Equals(ModuleFre.Nodes(i).LoopAddr) Then
OPTdic.Item(OPTdic.Keys(j)) = (incol).ToString
' _grd.Column(incol).Width = 0
End If
Next
Next
demoindex = demoindex + len
End Sub
''' <summary>
''' 加载设备输入信息
''' </summary>
''' <param name="moduStr"></param>
Public Sub ShowSwitch(moduStrName As String, nterace_DI As List(Of DeviceChildNodeClass), Optional OPTdic As Dictionary(Of String, String) = Nothing)
Dim rowid As Integer
Dim startrow As Integer = _grd.Rows
Dim ModuleFre As DeviceChildNodeClass
Dim SceneAttri As String = "1,1,0"
For j As Integer = 0 To nterace_DI.Count - 1
ModuleFre = nterace_DI.Item(j)
rowid = _grd.Rows
' If ModuleFre.Name.Equals("DI") Then
'获取主机服务插入行起始位置
If moduStrName.Equalshostname Then
_ServerInsertRows = ModuleFre.Nodes.Count
End If
'添加继电器行
For i As Integer = 0 To ModuleFre.Nodes.Count - 1
_grd.AddItem("")
If j = 0 Then
_grd.Cell(rowid, TableColNumber.DeviceName).Text = moduStrName
_grd.Cell(rowid, TableColNumber.DeviceName).WrapText = True
End If
Dim gTableRowTag As New TableRowTag()
gTableRowTag.G_DevNodeName = ModuleFre.Name
gTableRowTag.G_DevNodeIndex = i + 1
gTableRowTag.G_DevModeName = moduStrName
gTableRowTag.G_DicRow.Add(TableColNumber.choose, "1")
gTableRowTag.G_DicRow.Add(TableColNumber.SceneAttribute, SceneAttri)
gTableRowTag.G_DicRow.Add(TableColNumber.SceneID, _SceneID)
gTableRowTag.G_DicRow.Add(TableColNumber.KeyVal, (i + 1).ToString)
gTableRowTag.G_DicRow.Add(TableColNumber.KeyName, ModuleFre.Nodes(i).Name)
If moduStrName.Equals(hostname) Then
gTableRowTag.Set_G_Attributes("DRY", BasicClasses)
SceneAttri = "1,1,1152921504606846976"
Else
gTableRowTag.Set_G_Attributes("KEY", BasicClasses)
SceneAttri = "1,2,1224996690830819360"
End If
Dic_ActionConfiguration.Add(gTableRowTag)
If Not (IsNothing(OPTdic) OrElse OPTdic.Count = 0) Then
If OPTdic.ContainsKey(ModuleFre.Nodes(i).LoopAddr) Then
Dim bgc As Integer = -1
If Integer.TryParse(OPTdic.Item(ModuleFre.Nodes(i).LoopAddr), bgc) Then
gTableRowTag.G_DicRow.Add(bgc, "Corresponding scenario")
_grd.Cell(rowid + i, bgc).Text = Chr("Corresponding scenario")
End If
End If
End If
_grd.Cell(rowid + i, TableColNumber.SceneID).Text = _SceneID.ToString
_grd.Cell(rowid + i, TableColNumber.KeyVal).Text = (i + 1).ToString
_grd.Cell(rowid + i, TableColNumber.KeyName).Text = ModuleFre.Nodes(i).Name
_grd.Cell(rowid + i, TableColNumber.choose).Text = "1"
_grd.Cell(rowid + i, TableColNumber.SceneAttribute).Text = SceneAttri
_SceneID = _SceneID + 1
_grd.Cell(rowid + i, TableColNumber.ServerAttribute).WrapText = True
Next
'End If
Next
If nterace_DI.Count > 0 Then
_grd.Range(startrow, TableColNumber.DeviceName, _grd.Rows - 1, TableColNumber.DeviceName).Merge()
_grd.Range(startrow, TableColNumber.DeviceName, _grd.Rows - 1, TableColNumber.DeviceName).Locked = True
End If
_grd.Range(TableRowNumber.Max - 1, TableColNumber.RowID _grd.Rows - 1, _grd.Cols - 1).Alignment = AlignmentEnum.CenterCenter
_grd.Range(TableRowNumber.Max, TableColNumber.SceneAttribute, _grd.Rows - 1, _grd.Cols - 1).CellType = CellTypeEnum.ComboBox
_grd.Range(TableRowNumber.Max, TableColNumber.choose, _grd.Rows - 1, TableColNumber.choose).CellType = CellTypeEnum.CheckBox
End Sub
''' <summary>
''' 加载设备输入信息
''' </summary>
''' <param name="moduStr"></param>
Public Sub ShowSwitch2(moduStrName As String, nterace_DI As List(Of DeviceChildNodeClass), Optional OPTdic As Dictionary(Of String, String) = Nothing)
'当前行
Dim rowid As Integer
'起始添加行
Dim startrow As Integer = _grd.Rows
Dim ModuleFre As DeviceChildNodeClass
Dim Mergerow Mergecol As Integer
Dim SceneAttri As String = "1,1,0"
For j As Integer = 0 To nterace_DI.Count - 1
ModuleFre = nterace_DI.Item(j)
'获取服务组起始行号
Dim srowid As CtabRange = GetRowDevNametabRange("HOSTSERVICE", TableColNumber.DeviceName)
'默认从最后一行添加
If IsNothing(srowid) Then
startrow = _grd.Rows
Else
startrow = srowid.fr
End If
rowid = startrow
' If ModuleFre.Name.Equals("DI") Then
'获取主机服务插入行起始位置
'If moduStrName.Equalshostname Then
' _ServerInsertRows = ModuleFre.Nodes.Count
'End If
'添加继电器行
For i As Integer = 0 To ModuleFre.Nodes.Count - 1
'记录添加行行号
rowid = startrow + i
'行节点初始数据
Dim gTableRowTag As New TableRowTag()
If moduStrName.Equals(hostname) Then
gTableRowTag.Set_G_Attributes("DRY", BasicClasses)
ModuleFre.Nodes(i).DefaultClass = "DRY"
SceneAttri = "1,1,1152921504606846976"
Else
' If String.IsNullOrEmpty(ModuleFre.Nodes(i).DefaultClass) Then
If ModuleFre.Nodes(i).DefaultClass.Equals("KEY") Then
gTableRowTag.Set_G_Attributes("KEY", BasicClasses)
SceneAttri = "1,2,1224996690830819360"
If ModuleFre.PROTOCOL_VER.Equals("003") Then
SceneAttri = "1,2,1152921504606846976"
End If
ElseIf ModuleFre.Nodes(i).DefaultClass.Equals("CARD") Then
gTableRowTag.Set_G_Attributes(ModuleFre.Nodes(i).DefaultClass, BasicClasses)
SceneAttri = "1365,1,1152921504606846976"
ElseIf ModuleFre.Nodes(i).DefaultClass.Equals("SLIDER") Then
gTableRowTag.Set_G_Attributes(ModuleFre.Nodes(i).DefaultClass, BasicClasses)
SceneAttri = "2,1,1152921504606847008"
ElseIf ModuleFre.Nodes(i).DefaultClass.Equals("RKEY") Then
gTableRowTag.Set_G_Attributes(ModuleFre.Nodes(i).DefaultClass, BasicClasses)
SceneAttri = "4,12,1152921504606847008"
Else
gTableRowTag.Set_G_Attributes(ModuleFre.Nodes(i).DefaultClass, BasicClasses)
SceneAttri = "1,1,1152921504606846976"
End If
End If
gTableRowTag.G_DevNodeName = ModuleFre.Name
gTableRowTag.G_DevNodeIndex = ModuleFre.Nodes(i).LoopAddr ' i + 1
gTableRowTag.G_DevModeName = moduStrName
gTableRowTag.G_DicRow.Add(TableColNumber.choose, "1")
gTableRowTag.G_DicRow.Add(TableColNumber.SceneAttribute, SceneAttri)
gTableRowTag.G_DicRow.Add(TableColNumber.SceneID, _SceneID)
gTableRowTag.G_DicRow.Add(TableColNumber.KeyVal, ModuleFre.Nodes(i).LoopAddr)
gTableRowTag.G_DicRow.Add(TableColNumber.KeyName, ModuleFre.Nodes(i).DefaultAliasName)
'添加行Or插入行 ---如果已经添加服务则要用插入方式
If rowid >= _grd.Rows Then
_grd.AddItem("")
'_grd.Row(rowid).Locked = False
Dic_ActionConfiguration.Add(gTableRowTag)
Else
Dim growlock As Boolean = _grd.Row(rowid).Locked
_grd.Row(rowid).Locked = False
_grd.InsertRow(rowid, 1)
_grd.Row(rowid).Locked = growlock
' _grd.Row(rowid).Locked = False
Dic_ActionConfiguration.Insert(rowid - TableRowNumber.Max, gTableRowTag)
End If
'设置设备名
If j = 0 AndAlso i = 0 Then
_grd.Cell(rowid, TableColNumber.DeviceName).Text = moduStrName
_grd.Cell(rowid, TableColNumber.DeviceName).WrapText = True
Mergerow = rowid
End If
'设置 DI对应反馈灯
If Not (IsNothing(OPTdic) OrElse OPTdic.Count = 0) Then
If OPTdic.ContainsKey(ModuleFre.Nodes(i).LoopAddr) Then
Dim bgc As Integer = -1
If Integer.TryParse(OPTdic.Item(ModuleFre.Nodes(i).LoopAddr), bgc) Then
gTableRowTag.G_DicRow.Add(bgc, "Corresponding scenario")
_grd.Cell(rowid, bgc).Text = "Corresponding scenario"
_grd.Column(bgc).Visible = False
_grd.Column(bgc).Locked = True
End If
End If
End If
'设置表格
_grd.Cell(rowid, TableColNumber.SceneID).Text = _SceneID.ToString
_grd.Cell(rowid, TableColNumber.KeyVal).Text = ModuleFre.Nodes(i).LoopAddr '(i + 1).ToString
_grd.Cell(rowid, TableColNumber.KeyName).Text = ModuleFre.Nodes(i).DefaultAliasName
_grd.Cell(rowid, TableColNumber.choose).Text = "1"
_grd.Cell(rowid, TableColNumber.SceneAttribute).Text = SceneAttri
_SceneID = _SceneID + 1
_grd.Cell(rowid, TableColNumber.ServerAttribute).WrapText = True
If ModuleFre.Name.Equals("Voice") Then
_grd.Row(rowid).Locked = True
_grd.Cell(rowid, TableColNumber.SceneAttribute).Text = ""
gTableRowTag.G_DicRow.Item(TableColNumber.SceneAttribute) = ""
End If
Next
Next
'Dim rowlock = _grd.Row(24).Locked
'rowlock = _grd.Row(26).Locked
If nterace_DI.Count > 0 Then
Try
_grd.Range(Mergerow, TableColNumber.DeviceName, rowid, TableColNumber.DeviceName).Locked = False
_grd.Range(Mergerow, TableColNumber.DeviceName, rowid, TableColNumber.DeviceName).Merge()
_grd.Range(Mergerow, TableColNumber.DeviceName, rowid, TableColNumber.DeviceName).Locked = True
Catch ex As Exception
End Try
End If
'rowlock = _grd.Row(24).Locked
'rowlock = _grd.Row(26).Locked
_grd.Range(TableRowNumber.Max - 1, TableColNumber.RowID _grd.Rows - 1, _grd.Cols - 1).Alignment = AlignmentEnum.CenterCenter
_grd.Range(TableRowNumber.Max, TableColNumber.SceneAttribute, _grd.Rows - 1, _grd.Cols - 1).CellType = CellTypeEnum.ComboBox
_grd.Range(TableRowNumber.Max, TableColNumber.choose, _grd.Rows - 1, TableColNumber.choose).CellType = CellTypeEnum.CheckBox
End Sub
Public Function GetgrdRange(r As Integer, c As Integer selectstr As tabRange) As String
Dim result As String = String.Empty
With _grd.Range(r, c, r, c)
Select Case selectstr
Case tabRange.devname
result = _grd.Cell(.FirstRow, .FirstCol).Text
Case tabRange.fc
result = .FirstCol
Case tabRange.lc
result = .LastCol
Case tabRange.fr
result = .FirstRow
Case tabRange.lr
result = .LastRow
End Select
Return result
End With
End Function
Private Function GetRowDevNametabRange(devname As String, colint As Integer, Optional startcrow As Integer = TableRowNumber.Max) As CtabRange
Dim result As CtabRange = Nothing
Dim g_devname As CtabRange
For i = startcrow To _grd.Rows - 1
g_devname = New CtabRange(_grd, i, colint)
If devname.Equals(g_devname.devname) Then
result = g_devname
Exit For
End If
i = g_devname.lr
Next
Return result
End Function
Private Function GetCoLDevNametabRange(devname As String, colint As Integer, Optional startcol As Integer = TableColNumber.InsertColumn) As CtabRange
Dim result As CtabRange = Nothing
Dim g_devname As CtabRange
For i = startcol To _grd.Cols - 1
g_devname = New CtabRange(_grd, colint, i)
If devname.Equals(g_devname.devname) Then
result = g_devname
Exit For
End If
i = g_devname.lc
Next
Return result
End Function
''' <summary>
''' 模型关联的表格控件
''' </summary>
''' <returns></returns>
Protected Friend Sub LockGridAutoRedraw()
If _grd Is Nothing Then Return
If _autoRedraw = 0 Then
_grd.AutoRedraw = False
End If
_autoRedraw += 1
End Sub
Protected Friend Sub UnLockGridAutoRedraw()
If _grd Is Nothing Then Return
_autoRedraw -= 1
If _autoRedraw = 0 Then
_grd.AutoRedraw = True
_grd.Refresh()
Else
_autoRedraw = 0
End If
End Sub
#End Region
#Region "表格事件"
Public Cell_x, Cell_y As Integer
Private Sub Grid_Click(Sender As Object, e As EventArgs)
'Console.WriteLine($"Grid_Click{_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text }")
Dim C_x, C_y As Integer
C_x = _grd.ActiveCell.Row
C_y = _grd.ActiveCell.Col
' Console.WriteLine($"C_x:{C_x} Cell_x:{Cell_x} C_y:{C_y} Cell_y:{Cell_y} ")
If C_x < TableRowNumber.Max Then Return
If C_y = 5 Then '新加
If Cell_x = C_x AndAlso Cell_y = C_y Then Return '防止 重复点击
End If
'Console.WriteLine(_grd.Column(Cell_y).Locked)
If Cell_x >= _grd.Rows OrElse Cell_y >= _grd.Cols Then
Cell_x = 0
Cell_y = 0
End If
_grd.Range(Cell_x, 0, Cell_x, _grd.Cols - 1).BackColor = Color.White
_grd.Range(0, Cell_y, _grd.Rows - 1, Cell_y).BackColor = Color.White
If C_x < TableRowNumber.Max OrElse C_y < TableColNumber.SceneID Then Return
_grd.Range(C_x, 2, C_x, _grd.Cols - 1).BackColor = Color.LightBlue
If Not (C_y < TableColNumber.InsertColumn) Then
_grd.Range(TableRowNumber.FunctionChildNodeID, C_y, _grd.Rows - 1, C_y).BackColor = Color.LightBlue
End If
CheckGridData()
_grd.Cell(C_x, C_y).BackColor = Color.LightPink
Cell_x = C_x
Cell_y = C_y
'Console.WriteLine(_grd.Cell(Cell_x, Cell_y).Locked)
End Sub
Public Function CheckGridData() As Boolean
Dim result As Boolean = True
For r = 7 To _grd.Rows - 1
For c = 6 To _grd.Cols - 1
If _grd.Cell(r, c).ForeColor = Color.DarkRed Then
_grd.Cell(r, c).BackColor = Color.OrangeRed
Console.WriteLine($" r:{r} c:{c} colname {_grd.Cell(TableRowNumber.FunctionChildNodeAnother, c).Text} text{_grd.Cell(r, c).Text}")
result = False
End If
Next
Next
Return result
End Function
Private Sub Grid_DoubleClick(Sender As Object, e As EventArgs)
'Console.WriteLine($"Grid_DoubleClick{_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text }")
If _grd.ActiveCell.Row = TableRowNumber.DeviceName AndAlso _grd.ActiveCell.Col = TableColNumber.DeviceName Then
Dim fromshow As New PowerSupply
fromshow.G_ActionConfiguration = Dic_ActionConfiguration
fromshow.ParseDeviceList(Dic_Devicemodel, _grd)
If fromshow.ShowDialog() <> DialogResult.OK Then Return
ElseIf _grd.ActiveCell.Row > TableRowNumber.Max - 1 AndAlso _grd.ActiveCell.Col = TableColNumber.DeviceName Then
'取到设备名
Dim devname As String = GetgrdRange(_grd.ActiveCell.Row, TableColNumber.DeviceName, tabRange.devname)
ModifyingDeviceInformationGroup(devname)
ElseIf _grd.ActiveCell.Row = TableRowNumber.DeviceName AndAlso _grd.ActiveCell.Col > TableColNumber.InsertColumn Then
'取到设备名
Dim devname As String = GetgrdRange(_grd.ActiveCell.Row, _grd.ActiveCell.Col, tabRange.devname)
ModifyingDeviceInformationGroup(devname)
ElseIf _grd.ActiveCell.Row = TableRowNumber.FunctionChildNodeAnother AndAlso _grd.ActiveCell.Col = TableColNumber.DeviceName Then
Dim from1 As New DeviceListFrom
Dim steinput As String = _grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text.Trim
from1.SetDevnameTotable(steinput Dic_Devicemodel)
If from1.ShowDialog() <> DialogResult.OK Then Return
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text = from1.G_result
ElseIf _grd.ActiveCell.Row >= TableRowNumber.Max AndAlso _grd.ActiveCell.Col = TableColNumber.SceneAttribute Then
If String.IsNullOrEmpty(_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text) Then Return
Dim fromshow As New ExecutionCondition
fromshow.DicDevicemodel = Dic_Devicemodel
fromshow.G_grid = _grd
fromshow.G_ActionConfiguration = Dic_ActionConfiguration
fromshow.g_BasicClasses = BasicClasses
fromshow.G_Row = _grd.ActiveCell.Row
fromshow.G_celltag = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Tag)
If IsNothing(fromshow.G_celltag) Then
fromshow.G_celltag = New Dictionary(Of String, String)
End If
fromshow.G_ConfigActionConcitons = Condictions
fromshow.G_input = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.SceneAttribute).Text
fromshow.G_ModeDevType = Dic_ActionConfiguration.Item(_grd.ActiveCell.Row - TableRowNumber.Max).G_KeyType.ToArray
If fromshow.ShowDialog() <> DialogResult.OK Then Return
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Tag = JsonConvert.SerializeObject(fromshow.G_celltag)
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text = fromshow.G_Result
End If
End Sub
Public Sub ModifyingDeviceInformationGroup(devname As String)
'判断设备是否是外设
If String.IsNullOrEmpty(devname) OrElse String.IsNullOrEmpty(hostname) Then
Return
End If
If devname.Equals(hostname) Then
MsgBox("主机不可修改设备属性!!")
Return
End If
If devname.Equals("HOSTSERVICE") Then
MsgBox("服务不可修改设备属性!!")
Return
End If
Dim cdicv As New Dictionary(Of Integer, String '列号+DO地址
Dim rdicv As New Dictionary(Of Integer, String '行号+DI地址
Dim rvdicv As New Dictionary(Of String, String 'DO地址+DI地址
Dim startrow, startcol As Integer
'获取外设DO的所在列号集合
Dim tabledev As CtabRange = GetCoLDevNametabRange(devname, TableRowNumber.DeviceName)
If Not IsNothingtabledev Then
startcol = tabledev.fc
tabledev = GetCoLDevNametabRange("DO", TableRowNumber.FunctionName, tabledev.fc)
End If
If Not IsNothingtabledev Then
For i = tabledev.fc To tabledev.lc
cdicv.Add(i _grd.Cell(TableRowNumber.FunctionChildNodeID, i).Text)
Next
End If
'行号集合
Dim devmodw As DeviceModel = Dic_Devicemodel.Item(devname)
tabledev = GetRowDevNametabRange(devname, TableColNumber.DeviceName)
'不一定在行有设备名
If Not IsNothing(tabledev) Then
startrow = tabledev.fr
For Each index In devmodw.Nodes
If index.Name.Equals("DI") Then
For Each node In index.Nodes
For i = tabledev.fr To tabledev.lr
Console.WriteLine($"{_grd.Cell(i TableColNumber.KeyName).Text}_{node.Name}")
If _grd.Cell(i TableColNumber.KeyVal).Text.Equals(node.LoopAddr) Then
If rdicv.ContainsKey(i) Then
Continue For
Else
rdicv.Add(i, _grd.Cell(i, TableColNumber.KeyVal).Text)
End If
End If
Next
Next
Exit For
End If
Next
'匹配 DI_DO 键值对
For Each index In rdicv
For Each node In cdicv
If _grd.Cell(index.Key node.Key).Text.Trim.Equals("Corresponding scenario") Then
'_grd.Cell(index.Key node.Key).Text = ""
If rvdicv.ContainsKey(index.Value) Then
Exit For
Else
rvdicv.Add(index.Value, node.Value)
Exit For
End If
End If
Next
If Not rvdicv.ContainsKey(index.Value) Then
rvdicv.Add(index.Value, "")
End If
Next
End If
'设置到弹窗显示
Dim from1 As New AddPeripherals
from1.g_Devicemodel = Dic_Devicemodel
from1.g_grd = _grd
from1.g_Devintemp = GetDevLoopName("Temp")
from1.g_DevRELAYrow = GetDevLoopName("RELAY", "PB_RELAY_DEVICE")
from1.g_Devinfraredrow = GetDevLoopName("INFRARED_FORWARD")
from1.g_DevDimming = GetDevLoopName("Dimming")
from1.g_Devin485fraredrow = GetDevLoopName("RS485_Curtain")
from1.g_DevinCURTAINdrow = GetDevLoopName("CURTAIN")
from1.g_Devservice = GetHOSTSERVICENumber()
from1.g_DevScenenumber = GetSceneNumbeAr()
from1.g_ColumnAnothername = ColumnAnothername
from1.EditFeedbackLamp(rvdicv, devmodw)
If from1.ShowDialog() <> DialogResult.OK Then Return
'根据弹窗设置重新设置界面置
_grd.Cell(TableRowNumber.DeviceName startcol).Text = devmodw.Name
If startrow > 0 Then
For ri = tabledev.fr To tabledev.lr
Dic_ActionConfiguration(ri - TableRowNumber.Max).G_DevModeName = devmodw.Name
Next
_grd.Cell(startrow TableColNumber.DeviceName).Text = devmodw.Name
End If
If IsNothing(from1.ResulDic) OrElse from1.ResulDic.Count = 0 Then Return
Dim colstr As String
LockGridAutoRedraw()
For Each rindex In rdicv
If from1.ResulDic.ContainsKey(rindex.Value) Then
colstr = from1.ResulDic.Item(rindex.Value)
'_grd.Cell(rindex.Key TableColNumber.KeyName).Text =devmodw.
For Each cnode In cdicv
If _grd.Cell(rindex.Key cnode.Key).Text.Trim.Equals("Corresponding scenario") Then
_grd.Cell(rindex.Key cnode.Key).Text = ""
_grd.Column(cnode.Key).Visible = True
_grd.Column(cnode.Key).Locked = False
End If
If cnode.Value.Equals(colstr) Then
_grd.Cell(rindex.Key cnode.Key).Text = "Corresponding scenario"
_grd.Column(cnode.Key).Visible = False
_grd.Column(cnode.Key).Locked = True
End If
Next
End If
Next
UnLockGridAutoRedraw()
End Sub
Private Function DetermineDeviceType(Resultmodel As DeviceModel) As Integer
Dim result As Integer = 0
For Each ModuleFre In Resultmodel.Nodes
Select Case ModuleFre.Name
Case "Temp"
Return 1
Case "CURTAIN"
Return 2
Case "485FreshAir", "CLED_FRESHAIR"
Return 4
Case "485FloorHeat", "CLEDFLOORHEAT"
Return 4
Case "语音"
Return 3
End Select
Next
Return result
End Function
Public Sub UnlockColumn(Resultmodel As DeviceModel, Optional mbool As Boolean = True)
Select Case DetermineDeviceType(Resultmodel)
Case 0
Return
Case 1
Case 2
Case 3
Case 4
Case Else
Return
End Select
End Sub
Private Sub Grid_CellChange(Sender As Object, e As FlexCell.Grid.CellChangeEventArgs)
'Console.WriteLine($"Grid_CellChange_{_grd.Cell(e.Row, e.Col).Text }")
Dim errindex As Integer = 0
Try
Select Case e.Row
'Case ComboDropDownON.HostDev
' For Each HostDevFN In IO.Directory.GetFiles(HostDevFNP)
' Grid1.ComboBox(0).Items.Add(HostDevFN.Substring(HostDevFNP.Length, HostDevFN.Length - HostDevFNP.Length - 4))
' Next
Case TableRowNumber.FunctionAnotherName
If TableColNumber.ServerAttribute = e.Col Then
Dim dtime As Integer = 0
Try
dtime = CInt(_grd.Cell(TableRowNumber.FunctionAnotherName, TableColNumber.InsertColumn - 1).Text)
If dtime < -24 OrElse dtime > 24 Then
dtime = 0
End If
Catch ex As Exception
dtime = 0
End Try
_grd.Cell(TableRowNumber.FunctionAnotherName, TableColNumber.InsertColumn - 1).Text = dtime
_grd.Cell(TableRowNumber.FunctionAnotherName, TableColNumber.InsertColumn - 1).CellType = CellTypeEnum.ComboBox
_grd.Cell(TableRowNumber.FunctionAnotherName, TableColNumber.InsertColumn - 1).Locked = False
End If
Case >= TableRowNumber.Max
errindex = 1
Console.WriteLine()
If e.Col = TableColNumber.SceneAttribute Then
errindex = 3
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(e.Row - TableRowNumber.Max)
If ExecutionCondition.CheckDataIsOk(_grd.Cell(e.Row, e.Col).Text, Condictions, Dic_ActionConfiguration.Item(e.Row - TableRowNumber.Max).G_KeyType.ToArray, rowtag, Dic_ActionConfiguration, _grd) Then
_grd.Cell(e.Row, e.Col).BackColor = Color.White
AddTableToTableRowTag(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
_grd.Cell(e.Row, e.Col).ForeColor = Color.Black
Else
_grd.Cell(e.Row, e.Col).BackColor = Color.OrangeRed
_grd.Cell(e.Row, e.Col).ForeColor = Color.DarkRed
AddTableToTableRowTag(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
End If
ElseIf e.Col = TableColNumber.ServerAttribute Then
errindex = 4
Dim hostNode As DeviceChildNodeClass = Nothing
For Each Anode In Dic_Devicemodel.Item(hostname).Nodes
If Anode.Name.Equals"HOSTSERVICE" Then
hostNode = Anode
Exit For
End If
Next
If ServiceAttribute.CheckDataIsOk(_grd.Cell(e.Row, e.Col).Text, hostNode) Then
_grd.Cell(e.Row, e.Col).BackColor = Color.White
_grd.Cell(e.Row, e.Col).ForeColor = Color.Black
Dim serverstr As String = AddTableToTableRowTagX(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
If String.IsNullOrEmpty(_grd.Cell(e.Row, e.Col).Text) Then
Dim wbuff() As String = serverstr.Trim.Split(vbLf)
For Each index In wbuff
grdRemoveServerRow(index)
Next
Return
End If
Dim vbuff() As String = _grd.Cell(e.Row, e.Col).Text.Split(vbLf)
For Each index In vbuff
Dim vbuf() As String = index.Split(",")
grdInsertServerRow(hostname, "HOSTSERVICE" CIntvbuf(0)), "SERVICE", vbuf1, hostNode)
Next
Else
_grd.Cell(e.Row, e.Col).BackColor = Color.OrangeRed
_grd.Cell(e.Row, e.Col).ForeColor = Color.DarkRed
AddTableToTableRowTagX(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
End If
ElseIf e.Col = TableColNumber.KeyName Then
AddTableToTableRowTagtow(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
'ElseIf _grd.Cell(TableRowNumber.FunctionName, e.Col).Text.Equals"MUSIC" Then
' errindex = 2
' 'If MusicArrangement.CheckDataIsOk(_grd.Cell(e.Row, e.Col).Text, BasicClasses) Then
' ' _grd.Cell(e.Row, e.Col).BackColor = Color.White
' ' AddTableToTableRowTagtow(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
' 'Else
' ' _grd.Cell(e.Row, e.Col).BackColor = Color.OrangeRed
' 'End If
' Dim g_devname As New CtabRange(_grd, TableRowNumber.FunctionName, e.Col)
' If ActionParameter.CheckDataIsOk(g_devname.devname.ToUpper, _grd.Cell(e.Row, e.Col).Text, BasicClasses) Then
' _grd.Cell(e.Row, e.Col).BackColor = Color.White
' AddTableToTableRowTagtow(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
' Else
' _grd.Cell(e.Row, e.Col).BackColor = Color.OrangeRed
' End If
ElseIf e.Col = TableColNumber.choose Then
AddTableToTableRowTagtow(e.Row, e.Col, _grd.Cell(e.Row, e.Col).Text)
ElseIf e.Col > TableColNumber.ServerAttribute Then
errindex = 5
Dim g_devname As New CtabRange(_grd, TableRowNumber.FunctionName, e.Col)
Dim highpric As String = _grd.Cell(e.Row, e.Col).Text
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(e.Row - TableRowNumber.Max)
If g_devname.devname.Equals("DO") Then
g_devname.devname = g_devname.devname.Replace("DO", "LIGHT")
ElseIf g_devname.devname.Equals("CURTAIN") Then
g_devname.devname = g_devname.devname.Replace("CURTAIN", "DRY_CURTAIN")
End If
If highpric.Equals("advanced") Then
Dim fromshow As New ActionParameter
fromshow.g_DevNodename = rowtag.G_DevNodeName
fromshow.KeyName = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.KeyName).Text
fromshow.g_ExecutionMode = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.SceneAttribute).Text
Dim celltex As String = String.Empty
Dim celltxt As String = String.Empty
If rowtag.G_DicRow.ContainsKey(e.Col.ToString) Then
celltex = rowtag.G_DicRow.Item(e.Col.ToString)
Else
celltex = ""
End If
fromshow.GetEquipmentParameter(g_devname.devname.ToUpper, celltex, BasicClasses)
If fromshow.ShowDialog() <> DialogResult.OK Then
If celltex.Contains("*") Then
highpric = EstimateFilag(celltex, g_devname.devname)
Else
highpric = celltex
End If
CheckGridCellChangeIsOk(g_devname, celltex, e)
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text = highpric
Return
End If
highpric = EstimateFilag(fromshow.G_Result, g_devname.devname)
CheckGridCellChangeIsOk(g_devname, fromshow.G_Result, e)
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text = highpric
Return
Else
End If
'Dim highpric As String = _grd.Cell(e.Row, e.Col).Text.Trim
If rowtag.G_DicRow.ContainsKey(e.Col) Then
Dim celltxt As String = rowtag.G_DicRow.Item(e.Col)
celltxt = EstimateFilag(celltxt, g_devname.devname)
If Not String.IsNullOrEmpty(highpric) AndAlso highpric.Equals(celltxt) Then
highpric = rowtag.G_DicRow.Item(e.Col)
End If
End If
CheckGridCellChangeIsOk(g_devname, highpric, e)
End If
Case = TableRowNumber.FunctionChildNodeAnother
If e.Col > TableColNumber.ServerAttribute Then
Dim gdevname = New CtabRange(_grd, TableRowNumber.DeviceName, e.Col)
Dim gTdevname = New CtabRange(_grd, TableRowNumber.FunctionName, e.Col)
Dim val As String = $"{gdevname.devname }*{_grd.Cell(TableRowNumber.FunctionChildNodeID, e.Col).Text }*{gTdevname.devname }"
Dim key As String = $"{gdevname.devname}_{ _grd.Cell(TableRowNumber.FunctionChildNodeAnother, e.Col).Text}"
'Dim key As String = $"{_grd.Cell(TableRowNumber.FunctionChildNodeAnother, e.Col).Text}"
If String.IsNullOrEmpty(key) Then Return
If ColumnAnothername.ContainsKey(key) Then
MsgBox($"{key}:该别名已存在!请重新命名!")
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, e.Col).Text = ""
Console.WriteLine($"{ e.Col}{_grd.Cell(TableRowNumber.FunctionChildNodeAnother, e.Col).Text}")
Return
Else
For Each strval In ColumnAnothername
If strval.Value.Equals(val) Then
ColumnAnothername.Remove(strval.Key)
Exit For
End If
Next
ColumnAnothername.Add(key, val)
End If
End If
End Select
Catch ex As Exception
MsgBox($"{errindex}_{ex.Message}")
End Try
End Sub
Public Sub CheckGridCellChangeIsOk(g_devname As CtabRange highpric As String, e As FlexCell.Grid.CellChangeEventArgs)
If g_devname.devname.ToUpper.Equals("DIMMING") OrElse
g_devname.devname.ToUpper.Equals("485MUSIC") OrElse
g_devname.devname.ToUpper.Equals("INFRARED_FORWARD") OrElse
g_devname.devname.ToUpper.Equals("PB_RELAY_DEVICE") OrElse
g_devname.devname.ToUpper.Equals("PB_STRIP_DEVICE") OrElse
g_devname.devname.ToUpper.Equals("PB_LED_DEVICE") OrElse
g_devname.devname.ToUpper.Equals("DRY_CURTAIN") OrElse
g_devname.devname.ToUpper.Equals("LIGHT") OrElse
g_devname.devname.ToUpper.Equals("RELAY") OrElse
g_devname.devname.ToUpper.Equals("TEMP") OrElse
g_devname.devname.ToUpper.Equals("PB_LINE_CONTROL") OrElse
g_devname.devname.ToUpper.Equals("485FloorHeat".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("485FreshAir".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("CLED_FRESHAIR".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("CLEDFLOORHEAT".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("DRY_NoCard".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("Dev_ColorTemp".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("RKEY".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("BLEMUSIC".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("RS485_Curtain".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("Carbon_Device".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("Scene_Restore".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("HOPO_Curtain".ToUpper) OrElse
g_devname.devname.ToUpper.Equals("MUSIC".ToUpper) Then
If ActionParameter.CheckDataIsOk(g_devname.devname.ToUpper, highpric, BasicClasses) Then
_grd.Cell(e.Row, e.Col).BackColor = Color.White
_grd.Cell(e.Row, e.Col).ForeColor = Color.Black
AddTableToTableRowTagtow(e.Row, e.Col, highpric)
Else
If CheckDataIsOk(g_devname.devname, highpric) Then
_grd.Cell(e.Row, e.Col).BackColor = Color.White
_grd.Cell(e.Row, e.Col).ForeColor = Color.Black
AddTableToTableRowTagtow(e.Row, e.Col, highpric)
Else
_grd.Cell(e.Row, e.Col).BackColor = Color.OrangeRed
_grd.Cell(e.Row, e.Col).ForeColor = Color.DarkRed
AddTableToTableRowTagtow(e.Row, e.Col, highpric)
End If
End If
Else
If CheckDataIsOk(g_devname.devname, highpric) Then
_grd.Cell(e.Row, e.Col).BackColor = Color.White
_grd.Cell(e.Row, e.Col).ForeColor = Color.Black
AddTableToTableRowTagtow(e.Row, e.Col, highpric)
Else
_grd.Cell(e.Row, e.Col).BackColor = Color.OrangeRed
_grd.Cell(e.Row, e.Col).ForeColor = Color.DarkRed
AddTableToTableRowTagtow(e.Row, e.Col, highpric)
End If
End If
End Sub
Public Sub grdRemoveServerRow(serverstr As String)
If String.IsNullOrEmpty(serverstr) Then Return
Dim buf() As String = serverstr.Split(",")
Dim serverindex As String = $"{buf(0)},{buf(1)}"
'存在调用则不用删除
For i As Integer = TableRowNumber.Max To _grd.Rows - 1
If String.IsNullOrEmpty(_grd.Cell(i, TableColNumber.ServerAttribute).Text.Trim) Then Continue For
Dim Clfbuf() As String = _grd.Cell(i, TableColNumber.ServerAttribute).Text.Trim.Split(vbLf)
For Each index In Clfbuf
If index.Trim.IndexOf(serverindex) = 0 Then
Return
End If
Next
Next
If Not _ServerAction.ContainsKey(serverindex) Then Return
Dim deleterow As Integer = _ServerAction.Item(serverindex)
'
Dim srowid As CtabRange = GetRowDevNametabRange("HOSTSERVICE", TableColNumber.DeviceName)
'表格删除
If srowid.fr = deleterow Then
_grd.Cell(deleterow, TableColNumber.DeviceName).Text = "HOSTSERVICE"
_grd.Range(deleterow, TableColNumber.DeviceName, _grd.Rows - 1, TableColNumber.DeviceName).Locked = False
_grd.Range(deleterow, TableColNumber.DeviceName, _grd.Rows - 1, TableColNumber.DeviceName).Merge()
_grd.Range(deleterow, TableColNumber.DeviceName, _grd.Rows - 1, TableColNumber.DeviceName).Merge()
_grd.Range(deleterow, TableColNumber.DeviceName, _grd.Rows - 1, TableColNumber.DeviceName).Locked = True
End If
_grd.Row(deleterow).Delete()
'内存删除
Dic_ActionConfiguration.RemoveAt(deleterow - TableRowNumber.Max)
'更服务所在行行号
For i As Integer = 0 To _ServerAction.Count
If _ServerAction.Values(i) > deleterow Then
_ServerAction.Item(_ServerAction.Keys(i)) = _ServerAction.Values(i) - 1
End If
Next
'删除服务动作
_ServerAction.Remove(serverindex)
_ServerInsertRows = _ServerInsertRows - 1
End Sub
Public Sub grdInsertServerRow(DevModeName As String DevNodeName As String, DevNodeIndex As Integer rowtype As String, Keytype As String, hostNode As DeviceChildNodeClass)
Dim serverindex As String = $"{DevNodeIndex},{Keytype}"
If _ServerAction.ContainsKey(serverindex) Then Return
Dim InsertRow As Integer = _grd.Rows
_ServerAction.Add(serverindex, InsertRow)
Dim gTableRowTag As New TableRowTag()
Dim KeyName As String = ServiceAttribute.Getservername(DevNodeIndex, hostNode)
gTableRowTag.G_DevNodeName = DevNodeName
gTableRowTag.G_DevNodeIndex = DevNodeIndex
gTableRowTag.G_DevModeName = DevModeName
gTableRowTag.Set_G_Attributes(rowtype, BasicClasses, Keytype)
gTableRowTag.G_DicRow.Add(TableColNumber.choose, "1")
gTableRowTag.G_DicRow.Add(TableColNumber.SceneAttribute, $"{Keytype},1,0")
gTableRowTag.G_DicRow.Add(TableColNumber.SceneID, _SceneID)
gTableRowTag.G_DicRow.Add(TableColNumber.KeyVal, DevNodeIndex.ToString)
gTableRowTag.G_DicRow.Add(TableColNumber.KeyName, KeyName)
' If _grd.Rows <= InsertRow Then
'获取服务组起始行号
Dim srowid As CtabRange = GetRowDevNametabRange("HOSTSERVICE", TableColNumber.DeviceName)
_grd.AddItem("")
Dic_ActionConfiguration.Add(gTableRowTag)
Dim rindex As Integer = _grd.Rows - 1
_grd.Cell(rindex, TableColNumber.DeviceName).Text = $"{DevNodeName}"
_grd.Cell(rindex, TableColNumber.SceneID).Text = _SceneID.ToString
_grd.Cell(rindex, TableColNumber.KeyVal).Text = DevNodeIndex.ToString
_grd.Cell(rindex, TableColNumber.KeyName).Text = KeyName
_grd.Cell(rindex, TableColNumber.choose).Text = "1"
_grd.Cell(rindex, TableColNumber.SceneAttribute).Text = $"{Keytype},1,0"
_SceneID = _SceneID + 1
If Not IsNothing(srowid) Then
_grd.Range(srowid.fr, TableColNumber.DeviceName, rindex, TableColNumber.DeviceName).Locked = False
_grd.Range(srowid.fr, TableColNumber.DeviceName, rindex, TableColNumber.DeviceName).Merge()
_grd.Range(srowid.fr, TableColNumber.DeviceName, rindex, TableColNumber.DeviceName).Locked = True
End If
'Else
' _grd.InsertRow(InsertRow, 1)
' Dic_ActionConfiguration.Insert(_ServerInsertRows, gTableRowTag)
' _grd.Cell(InsertRow, TableColNumber.DeviceName).Text = $"{DevNodeName}"
' _grd.Cell(InsertRow, TableColNumber.SceneID).Text = _SceneID.ToString
' _grd.Cell(InsertRow, TableColNumber.KeyVal).Text = DevNodeIndex.ToString
' _grd.Cell(InsertRow, TableColNumber.KeyName).Text = KeyName
' _grd.Cell(InsertRow, TableColNumber.choose).Text = "1"
' _grd.Cell(InsertRow, TableColNumber.SceneAttribute).Text = $"{Keytype},1,0"
'End If
_ServerInsertRows = _ServerInsertRows + 1
_grd.Range(TableRowNumber.Max - 1, TableColNumber.RowID _grd.Rows - 1, _grd.Cols - 1).Alignment = AlignmentEnum.CenterCenter
_grd.Range(TableRowNumber.Max, TableColNumber.SceneAttribute, _grd.Rows - 1, _grd.Cols - 1).CellType = CellTypeEnum.ComboBox
_grd.Range(TableRowNumber.Max, TableColNumber.choose, _grd.Rows - 1, TableColNumber.choose).CellType = CellTypeEnum.CheckBox
End Sub
Public Sub ChangeTheServiceLineNumber()
'获取服务组起始行号
Dim srowid As CtabRange = GetRowDevNametabRange("HOSTSERVICE", TableColNumber.DeviceName)
If IsNothing(srowid) Then Return
Dim index As String
Dim buff() As String
For i = srowid.fr To srowid.lr
index = _grd.Cell(i, TableColNumber.KeyVal).Text.Trim
buff = _grd.Cell(i, TableColNumber.SceneAttribute).Text.Trim.Split(",")
index = $"{index},{buff(0)}"
_ServerAction.Item(index) = i
Next
End Sub
Private Sub AddTableToTableRowTag(row As Integer col As Integer, text As String)
If String.IsNullOrEmpty(text) Then Return
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(row - TableRowNumber.Max)
If rowtag.G_DicRow.ContainsKey(col.ToString) Then
rowtag.G_DicRow.Item(col.ToString) = text
Else
rowtag.G_DicRow.Add(col.ToString, text)
End If
End Sub
Private Sub AddTableToTableRowTagtow(row As Integer col As Integer, text As String)
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(row - TableRowNumber.Max)
If rowtag.G_DicRow.ContainsKey(col.ToString) Then
rowtag.G_DicRow.Item(col.ToString) = text
Else
rowtag.G_DicRow.Add(col.ToString, text)
End If
End Sub
Private Function AddTableToTableRowTagX(row As Integer col As Integer, text As String) As String
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(row - TableRowNumber.Max)
Dim reslut As String = String.Empty
If String.IsNullOrEmpty(text) Then
If rowtag.G_DicRow.ContainsKey(col.ToString) Then
reslut = rowtag.G_DicRow.Item(col.ToString)
End If
End If
If rowtag.G_DicRow.ContainsKey(col.ToString) Then
reslut = rowtag.G_DicRow.Item(col.ToString)
rowtag.G_DicRow.Item(col.ToString) = text
Else
rowtag.G_DicRow.Add(col.ToString, text)
End If
Return reslut
End Function
Public Function GetComboDropDownDic() As Dictionary(Of String,List(Of String))
Dim dic As New Dictionary(Of String,List(Of String))
Dim typeInten() As String = {"RELAY","RS485_Curtain".ToUpper,"LIGHT","CURTAIN","DRY_CURTAIN","DIMMING","TEMP","DO",
"INFRARED_FORWARD","CLED_FRESHAIR","CLEDFLOORHEAT","485FreshAir".ToUpper,"485FloorHeat".ToUpper,"PB_LINE_CONTROL",
"PB_LED_DEVICE","PB_STRIP_DEVICE","PB_RELAY_DEVICE","DRY_NoCard".ToUpper,"Dev_ColorTemp".ToUpper,"RKEY".ToUpper,
"BLEMUSIC".ToUpper,"Carbon_Device".ToUpper,"HOPO_Curtain".ToUpper,"Scene_Restore".ToUpper}
Try
For Each index In typeInten
AddLog($"获取类型{index}的下拉选项")
Dim li As New List(Of String)
If index.Equals("DO".ToUpper) Then
Dim strarry() As String = {"open","close","flash","Corresponding scenario"}
li.AddRange(strarry)
End If
Select Case index
Case "RELAY","PB_RELAY_DEVICE"
Dim cl = [Enum].GetValues(GetType(TableColSwitchKeyDate))
For Each Cindex In cl
li.Add(Chr(Cindex))
Next
Case "RS485_Curtain".ToUpper,"CURTAIN","DRY_CURTAIN"
Dim strarry() As String = {"open","close","stop","intertangent"}
li.AddRange(strarry)
Case "DIMMING","PB_LINE_CONTROL","PB_STRIP_DEVICE","PB_LED_DEVICE"
Dim strarry() As String = {Chr(TableColSwitchKeyDate.TurnDrown).ToString(),"5","20","50",Chr(TableColSwitchKeyDate.TurnOn).ToString()}
li.AddRange(strarry)
Case "TEMP","CLEDFLOORHEAT","485FloorHeat".ToUpper
Dim strarry() As String = {"Open 26 degrees","close"}
li.AddRange(strarry)
Case "INFRARED_FORWARD"
Dim strarry() As String = {"Turn on the TV","Turn off the TV","Mute ","volume+","volume-"}
li.AddRange(strarry)
Case "485FreshAir".ToUpper,"CLED_FRESHAIR"
Dim strarry() As String = {"open","close"}
li.AddRange(strarry)
Case "LIGHT"',"DO"
Dim strarry() As String = {"open","close","flash","Corresponding scenario"}
li.AddRange(strarry)
End Select
If li.Count > 0 OrElse index.Equals("DRY_NoCard".ToUpper) OrElse index.Equals("HOPO_Curtain".ToUpper) OrElse index.Equals("Dev_ColorTemp".ToUpper) OrElse
index.Equals("Carbon_Device".ToUpper) OrElse index.Equals("RKEY".ToUpper) OrElse index.Equals("BLEMUSIC".ToUpper) OrElse index.Equals("Scene_Restore".ToUpper) Then
li.Add("advanced")
End If
dic.Add(index,li)
Next
Return dic
Catch ex As Exception
AddLog($"获取对应类型的下拉选项失败 {ex.Message} ")进入下来选项并清空下拉选项21,14
Return dic
End Try
End Function
Public Sub AddLog(ByVal logMessage As String)
Dim logFilePath As String = "C:\Logs\MyAppLog.txt"
Try
' 确保日志目录存在
Dim logDirectory As String = Path.GetDirectoryName(logFilePath)
If Not Directory.Exists(logDirectory) Then
Directory.CreateDirectory(logDirectory)
End If
' 打开日志文件并追加日志消息
Using writer As New StreamWriter(logFilePath, True)
writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") & " - " & logMessage)
End Using
Catch ex As Exception
' 如果写入日志时发生错误,输出错误信息到控制台
Console.WriteLine("Error writing to log file: " & ex.Message)
End Try
End Sub
Private Sub Grid_ComboDropDown(Sender As Object, e As Grid.ComboDropDownEventArgs)
AddLog($"进入下来选项并清空下拉选项{e.Row},{e.Col}")
'Console.WriteLine($"Grid_ComboDropDown{_grd.Cell(e.Row, e.Col).Text }")
_grd.ComboBox(0).Items.Clear()
Dim ComboDropDownDic As Dictionary(Of String, List(Of String)) = GetComboDropDownDic()
AddLog($"获取对应类型的下拉选项完毕")
Select Case e.Row
Case TableRowNumber.FunctionAnotherName
If TableColNumber.ServerAttribute Then
For i = -24 To 24
_grd.ComboBox(0).Items.Add(i)
Next
End If
'Case ComboDropDownON.HostDev
' For Each HostDevFN In IO.Directory.GetFiles(HostDevFNP)
' Grid1.ComboBox(0).Items.Add(HostDevFN.Substring(HostDevFNP.Length, HostDevFN.Length - HostDevFNP.Length - 4))
' Next
Case >= TableRowNumber.Max
Console.WriteLine()
AddLog($"进入下拉添加选项")
If _grd.ActiveCell.Col = TableColNumber.SceneAttribute Then
AddLog($"进入ExecutionCondition")
Dim fromshow As New ExecutionCondition
fromshow.G_grid = _grd
fromshow.DicDevicemodel = Dic_Devicemodel
fromshow.G_ActionConfiguration = Dic_ActionConfiguration
fromshow.g_BasicClasses = BasicClasses
fromshow.G_Row = _grd.ActiveCell.Row
fromshow.G_celltag = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Tag)
If IsNothing(fromshow.G_celltag) Then
fromshow.G_celltag = New Dictionary(Of String, String)
End If
fromshow.G_ConfigActionConcitons = Condictions
fromshow.G_input = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.SceneAttribute).Text
fromshow.G_ModeDevType = Dic_ActionConfiguration.Item(_grd.ActiveCell.Row - TableRowNumber.Max).G_KeyType.ToArray
If fromshow.ShowDialog() <> DialogResult.OK Then Return
AddLog($"退出ExecutionCondition {fromshow.G_Result}{ JsonConvert.SerializeObject(fromshow.G_celltag)}")
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text = fromshow.G_Result
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Tag = JsonConvert.SerializeObject(fromshow.G_celltag)
ElseIf _grd.ActiveCell.Col = TableColNumber.ServerAttribute Then
Dim fromshow As New ServiceAttribute
AddLog($"退出ServerAttribute")
fromshow.G_input = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.ServerAttribute).Text
fromshow.G_hostNode = Nothing
For Each Anode In Dic_Devicemodel.Item(hostname).Nodes
If Anode.Name.Equals"HOSTSERVICE" Then
fromshow.G_hostNode = Anode
End If
Next
If fromshow.ShowDialog() <> DialogResult.OK Then Return
AddLog($"退出退出{fromshow.G_result}")
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text = fromshow.G_result
'ElseIf _grd.Cell(TableRowNumber.FunctionName, _grd.ActiveCell.Col).Text.Equals"MUSIC" Then
' Dim fromshow As New ActionParameter
' Dim g_devname As New CtabRange(_grd, TableRowNumber.FunctionName, _grd.ActiveCell.Col)
' fromshow.GetEquipmentParameter(g_devname.devname.ToUpper, _grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text, BasicClasses)
' If fromshow.ShowDialog() <> DialogResult.OK Then Return
' _grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text = fromshow.G_Result
ElseIf _grd.ActiveCell.Col > TableColNumber.ServerAttribute Then
Dim g_devname As New CtabRange(_grd, TableRowNumber.FunctionName, _grd.ActiveCell.Col)
AddLog($"准备设置音乐动作{e.Row},{e.Col}{g_devname.devname}")
If g_devname.devname.ToUpper.Equals("485MUSIC") OrElse
g_devname.devname.ToUpper.Equals("MUSIC".ToUpper) Then
AddLog($"设置音乐动作{e.Row},{e.Col}{g_devname.devname}")
Dim fromshow As New ActionParameter
fromshow.KeyName = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.KeyName).Text
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(e.Row - TableRowNumber.Max)
fromshow.g_DevNodename = rowtag.G_DevNodeName
fromshow.g_ExecutionMode = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.SceneAttribute).Text
fromshow.GetEquipmentParameter(g_devname.devname.ToUpper, _grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text, BasicClasses)
If fromshow.ShowDialog() <> DialogResult.OK Then Return
_grd.Cell(_grd.ActiveCell.Row, _grd.ActiveCell.Col).Text = fromshow.G_Result
Else
AddLog($"添加下拉选项1 {g_devname.devname.ToUpper} { JsonConvert.SerializeObject(ComboDropDownDic)}")
If ComboDropDownDic.ContainsKey(g_devname.devname.ToUpper) Then
Dim li As List(Of String) = ComboDropDownDic.Item(g_devname.devname.ToUpper)
If IsNothingli Then
Return
End If
_grd.ComboBox(0).Items.AddRange(li.ToArray)
Else
For Each index In [Enum].GetValues(GetType(TableColSwitchKeyDate))
_grd.ComboBox(0).Items.Add(Chr(index))
Next
End If
End If
End If
End Select
End Sub
Public Function CheckDataIsOk(devname As String datastr As String) As Boolean
If String.IsNullOrEmpty(datastr) Then Return True
Dim ComboDropDownDic As Dictionary(Of String, List(Of String)) = GetComboDropDownDic()
Select Case devname.ToUpper
Case "DIMMING", "PB_LINE_CONTROL", "PB_LED_DEVICE", "PB_STRIP_DEVICE"
Dim dvalint As Integer = -1
If datastr.Equals(Chr(TableColSwitchKeyDate.TurnDrown).ToString()) OrElse datastr.Equals(Chr(TableColSwitchKeyDate.TurnOn).ToString()) Then Return True
If Integer.TryParse(datastr, dvalint) Then
If dvalint > -1 AndAlso dvalint < 101 Then
Return True
End If
Else
Return False
End If
Case "485MUSIC"
Case "TEMP", "RS485_Curtain".ToUpper, "DRY_CURTAIN", "485FloorHeat".ToUpper, "485FreshAir".ToUpper, "INFRARED_FORWARD", "RELAY", "DO", "LIGHT", "CLED_FRESHAIR", "CLEDFLOORHEAT"
For Each indx In ComboDropDownDic.Item(devname.ToUpper)
If indx.Equals(datastr) Then
Return True
End If
Next
Return False
Case "MUSIC".ToUpper
Case "DRY_NoCard".ToUpper
Case "Dev_ColorTemp".ToUpper
Case "BLEMUSIC".ToUpper
Case "HOPO_Curtain".ToUpper
Case "Carbon_Device".ToUpper
Case "Scene_Restore".ToUpper
Case Else
For Each index In [Enum].GetValues(GetTypeTableColSwitchKeyDate)
If datastr.Equals(Chr(index).ToString) Then
Return True
End If
Next
End Select
Return False
End Function
Public Sub SpecifySetting(devname As String, cand As String)
Dim srowid As CtabRange = GetRowDevNametabRange(devname, TableColNumber.DeviceName)
If IsNothing(srowid) Then Return
For i = srowid.fr To srowid.lr
'If i = srowid.fr Then
'End If
Select Case _grd.Cell(i, TableColNumber.KeyName).Text
Case "Insert card"
_grd.Range(i, TableColNumber.KeyName, i, TableColNumber.KeyName).SelectCells()
AddSceneLine("Insert card")
_grd.Cell(i + 1, TableColNumber.KeyName).Text = "pull out"
'Console.WriteLine(_grd.Cell(i + 1, TableColNumber.SceneAttribute).Text)
If _grd.Cell(i + 1, TableColNumber.SceneAttribute).Text.Contains("1365,1") Then
_grd.Cell(i + 1, TableColNumber.SceneAttribute).Text = "2730,1,1152921504606846976"
Else
_grd.Cell(i + 1, TableColNumber.SceneAttribute).Text = "2,1,1152921504606846976"
End If
i = i + 1
Case "door bell"
_grd.Cell(i, TableColNumber.SceneAttribute).Text = "1,1,1152921504606847520"
Case "SOS pressed"
_grd.Range(i, TableColNumber.KeyName, i, TableColNumber.KeyName).SelectCells()
AddSceneLine("SOS pressed")
_grd.Cell(i + 1, TableColNumber.KeyName).Text = "SOS release"
_grd.Cell(i + 1, TableColNumber.SceneAttribute).Text = "2,1,1152921504606846976"
i = i + 1
Case "Open door contact"
_grd.Range(i, TableColNumber.KeyName, i, TableColNumber.KeyName).SelectCells()
AddSceneLine("Open door contact")
_grd.Cell(i + 1, TableColNumber.KeyName).Text = "Close door contact"
_grd.Cell(i, TableColNumber.SceneAttribute).Text = "2,1,1152921504606846976"
i = i + 1
Case Else
If _grd.Cell(i, TableColNumber.KeyName).Text.Contains("Sliding bar") Then
_grd.Range(i, TableColNumber.KeyName, i, TableColNumber.KeyName).SelectCells()
AddSceneLine("Right sliding")
_grd.Cell(i + 1, TableColNumber.KeyName).Text = "Left sliding"
_grd.Cell(i + 1, TableColNumber.SceneAttribute).Text = "1,1,1152921504606847008"
i = i + 1
End If
End Select
Next
End Sub
Public Function AddSceneLine(Optional valname As String = "" Optional condition As String = "") As Boolean
If _grd.ActiveCell.Row >= TableRowNumber.Max And _grd.ActiveCell.Col >= TableColNumber.choose Then
Dim Crowtag As TableRowTag = Dic_ActionConfiguration.Item(_grd.ActiveCell.Row - TableRowNumber.Max)
If Crowtag.G_DevNodeName.Equals("HOSTSERVICE") AndAlso False Then
MsgBox("The replication scenario fails, and the service scenario cannot be replicated")
Return False
Else
Dim rowtag As New TableRowTag
rowtag.G_DevModeName = Crowtag.G_DevModeName
rowtag.G_DevNodeName = Crowtag.G_DevNodeName
rowtag.G_DevNodeIndex = Crowtag.G_DevNodeIndex
rowtag.G_KeyType = Crowtag.G_KeyType
Dim old_SceneID As String = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.SceneID).Text
Dim FirstRow, Firstcol, LastCol, Lastrow As Integer
With _grd.Range(_grd.ActiveCell.Row, TableColNumber.DeviceName, _grd.ActiveCell.Row, TableColNumber.DeviceName)
FirstRow = .FirstRow
Firstcol = .FirstCol
LastCol = .LastCol
Lastrow = .LastRow
End With
Dic_ActionConfiguration.Insert(_grd.ActiveCell.Row - TableRowNumber.Max, rowtag)
Dim growlock As Boolean = _grd.Row(_grd.ActiveCell.Row).Locked
_grd.InsertRow(_grd.ActiveCell.Row, 1)
_grd.Row(_grd.ActiveCell.Row).Locked = growlock
For Each node In Crowtag.G_DicRow
If node.Key = TableColNumber.SceneID Then
rowtag.G_DicRow.Add(node.Key, old_SceneID)
_grd.Cell(_grd.ActiveCell.Row, node.Key).Text = old_SceneID
_grd.Cell(_grd.ActiveCell.Row + 1, node.Key).Text = _SceneID
Else
If node.Key = TableColNumber.KeyName AndAlso Not String.IsNullOrEmpty(valname) Then
rowtag.G_DicRow.Add(node.Key, valname)
_grd.Cell(_grd.ActiveCell.Row, node.Key).Text = valname
ElseIf node.Key = TableColNumber.SceneAttribute AndAlso Not String.IsNullOrEmpty(condition) Then
rowtag.G_DicRow.Add(node.Key, condition)
_grd.Cell(_grd.ActiveCell.Row, node.Key).Text = condition
Else
rowtag.G_DicRow.Add(node.Key, node.Value)
_grd.Cell(_grd.ActiveCell.Row, node.Key).Text = node.Value
End If
If node.Key = 6 Then
_grd.Cell(_grd.ActiveCell.Row, node.Key).Tag = _grd.Cell(_grd.ActiveCell.Row + 1, node.Key).Tag
End If
End If
Next
Crowtag.G_DicRow.Item(TableColNumber.SceneID) = _SceneID
_SceneID = _SceneID + 1
If FirstRow = _grd.ActiveCell.Row Then
_grd.Range(FirstRow, TableColNumber.choose, FirstRow, TableColNumber.Max).Locked = False
_grd.Range(FirstRow, TableColNumber.SceneAttribute, FirstRow, _grd.Cols - 1).CellType = CellTypeEnum.ComboBox
_grd.Range(FirstRow, TableColNumber.choose, FirstRow, TableColNumber.choose).CellType = CellTypeEnum.CheckBox
_grd.Range(FirstRow, TableColNumber.SceneID, FirstRow, TableColNumber.KeyVal).Locked = True
Dim rlockli As New List(Of Integer)
For rli = _grd.ActiveCell.Row To Lastrow + 1
If _grd.Row(rli).Locked = True Then
_grd.Row(rli).Locked = False
rlockli.Add(rli)
End If
Next
_grd.Range(_grd.ActiveCell.Row, Firstcol, FirstRow + 1, LastCol).Locked = False
_grd.Range(_grd.ActiveCell.Row, Firstcol, FirstRow + 1, LastCol).Merge()
_grd.Range(_grd.ActiveCell.Row, Firstcol, FirstRow + 1, LastCol).Locked = True
For Each rl In rlockli
_grd.Row(rl).Locked = True
Next
End If
'_grd.Range(_grd.ActiveCell.Row, Firstcol, Lastrow 1, LastCol).Locked = False
'_grd.Range(_grd.ActiveCell.Row, Firstcol, Lastrow + 1, LastCol).Merge()
'_grd.Range(_grd.ActiveCell.Row, Firstcol, Lastrow + 1, LastCol).Locked = True
ChangeTheServiceLineNumber()
Return True
End If
Else
MsgBox("Failed to copy the scenario. The scenario to be copied is not selected")
Return False
End If
End Function
Public Sub LaunchService()
'Dim srowid As CtabRange = GetRowDevNametabRange("HOSTSERVICE", TableColNumber.DeviceName)
'If IsNothing(srowid) Then Return
'For i = srowid.fr To srowid.lr
' If _grd.Row(i).Height > 0 Then
' _grd.Row(i).Height = 0
' Else
' _grd.Row(i).Height = 19
' End If
'Next
DisplayDicCol()
End Sub
Public oldColDisplayDic As Dictionary(Of Integer, Boolean)
Public Sub DisplayDicCol()
If IsNothing(_grd) OrElse _grd.Cols = 0 Then Return
If IsNothing(oldColDisplayDic) Then
oldColDisplayDic = New Dictionary(Of Integer, Boolean)
End If
Dim isEmpty As Integer = oldColDisplayDic.Count
For i = 1 To _grd.Cols - 1
If isEmpty = 0 Then
If _grd.Column(i).Visible = True Then
If oldColDisplayDic.ContainsKey(i) Then
oldColDisplayDic.Item(i) = True
Else
oldColDisplayDic.Add(i, True)
End If
Else
oldColDisplayDic.Add(i, False)
End If
_grd.Column(i).Visible = True
Else
If oldColDisplayDic.ContainsKey(i) Then
_grd.Column(i).Visible = oldColDisplayDic.Item(i)
oldColDisplayDic.Remove(i)
End If
End If
Next
End Sub
Private CopyActionData As Dictionary(Of Integer, String
Public Sub CopySceneActionData()
CopyActionData.Clear()
If _grd.ActiveCell.Row > TableRowNumber.Max - 1 Then
For ei As Integer = TableColNumber.KeyName To _grd.Cols - 1
CopyActionData.Add(ei, _grd.Cell(_grd.ActiveCell.Row, ei).Text.Trim)
Next
Else
MsgBox("Non-scene action data cannot be copied!")
End If
End Sub
Public Sub GlueSceneActionData()
If CopyActionData.Count = 0 Then Return
If _grd.ActiveCell.Row > TableRowNumber.Max - 1 Then
If AddSceneLine() Then
' _grd.Cell(_grd.ActiveCell.Row + 1, TableColNumber.KeyName).Text = _grd.Cell(_grd.ActiveCell.Row + 1, TableColNumber.KeyName).Text.Trim & "(复制)"
For Each index In CopyActionData
If index.Key = TableColNumber.KeyName Then
_grd.Cell(_grd.ActiveCell.Row + 1, index.Key).Text = index.Value.Trim & "(Copy)"
Else
_grd.Cell(_grd.ActiveCell.Row + 1, index.Key).Text = index.Value
End If
Next
End If
Else
Return
End If
End Sub
Public Sub SelectRowNode()
'LockGridAutoRedraw()
If _grd.ActiveCell.Row > TableRowNumber.Max - 1 Then
If _grd.ActiveCell.Col = TableColNumber.DeviceName Then
Dim fr, lr fc, lc As Integer
With _grd.Range(_grd.ActiveCell.Row, TableColNumber.DeviceName, _grd.ActiveCell.Row, TableColNumber.DeviceName)
fr = .FirstRow
lr = .LastRow
fc = .FirstCol
lc = .LastCol
End With
Dim Removename As String = _grd.Cell(fr, TableColNumber.DeviceName).Text.Trim
If Removename.Trim.Equals(hostname) Then
MsgBox("Host devices cannot be deleted!!!")
Return
ElseIf Removename.Trim.Equals("HOSTSERVICE") Then
MsgBox("The service module cannot be deleted!!!")
Return
Else
Dim devmode As DeviceModel = Dic_Devicemodel.Item(Removename)
Dic_Devicemodel.Remove(Removename)
Dim serverli As New List(Of String)
For i = fr To lr
'从模块最大行号开始删
Dim deleteid As Integer = lr - i + fr
'先删除输入行
_grd.Row(deleteid).Delete()
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(deleteid - TableRowNumber.Max)
Dic_ActionConfiguration.RemoveAt(deleteid - TableRowNumber.Max)
If rowtag.G_DicRow.ContainsKey(TableColNumber.ServerAttribute) Then
Dim serverstr As String = rowtag.G_DicRow.Item(TableColNumber.ServerAttribute)
If Not String.IsNullOrEmpty(serverstr) Then
serverli.Add(serverstr)
End If
End If
Next
ChangeTheServiceLineNumber()
For Each serverstr In serverli
Dim wbuff() As String = serverstr.Trim.Split(vbLf)
For Each index In wbuff
grdRemoveServerRow(index)
Next
Next
Dim coldevname As String = String.Empty
Dim TCols As Integer = _grd.Cols - 2
For ci = TableColNumber.InsertColumn To TCols
With _grd.Range(TableRowNumber.DeviceName, ci, TableRowNumber.DeviceName, ci)
fr = .FirstRow
lr = .LastRow
fc = .FirstCol
lc = .LastCol
End With
If Removename.Equals(_grd.Cell(fr, fc).Text.Trim) Then
'清空待删列缓存数据
DeleteTableClunm(fc, lc)
'删除列
Dim cons As Integer = ColumnAnothername.Count
For indekey = 0 To cons - 1
If ColumnAnothername.Keys(cons - 1 - indekey).Contains(Removename) Then
ColumnAnothername.Remove(ColumnAnothername.Keys(cons - 1 - indekey))
End If
Next
_grd.Range(0, fc, _grd.Rows - 1, lc).DeleteByCol()
_ColumnStartLoad = _ColumnStartLoad - (lc - fc + 1)
Exit For
End If
ci = lc
Next
'如果是特殊设备
Unboundrelay(devmode)
End If
Else
Dim topval inthepval downpval As String
topval = _grd.Cell(_grd.ActiveCell.Row - 1, TableColNumber.KeyVal).Text.Trim
inthepval = _grd.Cell(_grd.ActiveCell.Row, TableColNumber.KeyVal).Text.Trim
If _grd.ActiveCell.Row + 1 > _grd.Rows - 1 Then
downpval = String.Empty
Else
downpval = _grd.Cell(_grd.ActiveCell.Row + 1, TableColNumber.KeyVal).Text.Trim
End If
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(_grd.ActiveCell.Row - TableRowNumber.Max)
Dim g_devname = New CtabRange(_grd, _grd.ActiveCell.Row, TableColNumber.DeviceName)
If g_devname.devname.Trim.Equals("HOSTSERVICE") Then
MsgBox("服務模块不可删除!!!")
Return
End If
If Not String.IsNullOrEmpty(inthepval) Then
If topval.Equals(inthepval) OrElse downpval.Equals(inthepval) Then
Dim deleterow As Integer = _grd.ActiveCell.Row
Dim srowid As CtabRange = GetRowDevNametabRange(rowtag.G_DevModeName, TableColNumber.DeviceName)
_grd.Row(deleterow).Delete()
Dic_ActionConfiguration.RemoveAt(deleterow - TableRowNumber.Max)
If srowid.fr = deleterow Then
_grd.Cell(deleterow, TableColNumber.DeviceName).Text = rowtag.G_DevModeName
_grd.Range(deleterow, TableColNumber.DeviceName, srowid.lr - 1, TableColNumber.DeviceName).Merge()
_grd.Range(deleterow, TableColNumber.DeviceName, srowid.lr - 1, TableColNumber.DeviceName).Locked = True
End If
'If rowtag.G_DevModeName.Equalshostname Then
' _ServerInsertRows = _ServerInsertRows - 1
' For dei As Integer = 0 To _ServerAction.Count - 1
' _ServerAction.Item(_ServerAction.Keys(dei)) = _ServerAction.Values(dei) - 1
' Next
'End If
If rowtag.G_DicRow.ContainsKey(TableColNumber.ServerAttribute) Then
Dim serverstr As String = rowtag.G_DicRow.Item(TableColNumber.ServerAttribute)
If Not String.IsNullOrEmpty(serverstr) Then
Dim wbuff() As String = serverstr.Trim.Split(vbLf)
For Each index In wbuff
grdRemoveServerRow(index)
Next
End If
End If
ChangeTheServiceLineNumber()
Else
MsgBox("设备固定输入不可删除")
End If
End If
End If
ElseIf _grd.ActiveCell.Row = TableRowNumber.DeviceName AndAlso _grd.ActiveCell.Col >= TableColNumber.InsertColumn AndAlso _grd.ActiveCell.Col < (_grd.Cols - 1) Then
Dim g_devname = New CtabRange(_grd, TableRowNumber.DeviceName, _grd.ActiveCell.Col)
Dim srowid As CtabRange = GetRowDevNametabRange(g_devname.devname, TableColNumber.DeviceName)
If g_devname.devname.Trim.Equals(hostname) Then
MsgBox("主机设备不可删除!!!")
Return
End If
'删除行
Dim devmode As DeviceModel = Dic_Devicemodel.Item(g_devname.devname)
Dic_Devicemodel.Remove(g_devname.devname)
If Not IsNothingsrowid Then
Dim serverli As New List(Of String)
For i = srowid.fr To srowid.lr
'从模块最大行号开始删
Dim deleteid As Integer = srowid.lr - i + srowid.fr
'先删除输入行
_grd.Row(deleteid).Delete()
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(deleteid - TableRowNumber.Max)
Dic_ActionConfiguration.RemoveAt(deleteid - TableRowNumber.Max)
If rowtag.G_DicRow.ContainsKey(TableColNumber.ServerAttribute) Then
Dim serverstr As String = rowtag.G_DicRow.Item(TableColNumber.ServerAttribute)
If Not String.IsNullOrEmpty(serverstr) Then
serverli.Add(serverstr)
End If
End If
Next
End If
'清空待删列缓存数据
DeleteTableClunm(g_devname.fc, g_devname.lc)
'删除列
Dim cons As Integer = ColumnAnothername.Count
For indekey = 0 To cons - 1
If ColumnAnothername.Keys(cons - 1 - indekey).Contains(g_devname.devname) Then
ColumnAnothername.Remove(ColumnAnothername.Keys(cons - 1 - indekey))
End If
Next
_grd.Range(0, g_devname.fc, _grd.Rows - 1, g_devname.lc).DeleteByCol()
_ColumnStartLoad = _ColumnStartLoad - (g_devname.lc - g_devname.fc + 1)
'如果是特殊设备
Unboundrelay(devmode)
End If
UnLockGridAutoRedraw()
End Sub
Public Sub Unboundrelay(devmode As DeviceModel)
If IsNothingdevmode Then Return
If devmode.Nodes(0).Name.Equals("CURTAIN") OrElse
devmode.Nodes(0).Name.ToUpper.Equals("485FreshAir".ToUpper) OrElse
devmode.Nodes(0).Name.ToUpper.Equals("485FloorHeat".ToUpper) OrElse
devmode.Nodes(0).Name.ToUpper.Equals("CLED_FRESHAIR".ToUpper) OrElse
devmode.Nodes(0).Name.ToUpper.Equals("CLEDFLOORHEAT".ToUpper) Then
Dim oldbuf() As String = devmode.Desc.ProtocolData.Split(",")
If Not IsNothingoldbuf AndAlso oldbuf.Length > 0 Then
For Each index In oldbuf
Dim g_DevRELAYrow = GetDevLoopName("RELAY", "PB_RELAY_DEVICE")
If String.IsNullOrEmpty(index) Then Continue For
Dim oldcbuf() As String = index.Split("*")
Dim buf As String = $"{oldcbuf(0)}*{oldcbuf(1)}*{oldcbuf(2)}"
If g_DevRELAYrow.ContainsKey(buf) AndAlso _grd.Cols > g_DevRELAYrow.Item(buf) Then
_grd.Column(g_DevRELAYrow.Item(buf)).Visible = True
_grd.Column(g_DevRELAYrow.Item(buf)).Locked = False
End If
Next
End If
Else
For Each node In devmode.Nodes
If node.Name.ToUpper.Equals("TEMP") Then
Dim dic As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(devmode.Desc.ProtocolData)
If Not IsNothingdic AndAlso dic.Count > 0 Then
For Each index In dic
Dim g_DevRELAYrow = GetDevLoopName("RELAY", "PB_RELAY_DEVICE")
If g_DevRELAYrow.ContainsKey(index.Value) AndAlso _grd.Cols > g_DevRELAYrow.Item(index.Value) Then
_grd.Column(g_DevRELAYrow.Item(index.Value)).Visible = True
_grd.Column(g_DevRELAYrow.Item(index.Value)).Locked = False
End If
Next
End If
ElseIf node.Name.Equals("Dev_ColorTemp") Then
For i = 1 To node.Nodes.Count
Dim Index = node.Nodesi - 1
If Index.DefaultClass.Equals("Dev_ColorTemp") Then
Dim Oldcdic As List(Of List(Of String)) = JsonConvert.DeserializeObject(Of List(Of List(Of String)))(Index.Description)
If Not IsNothingOldcdic AndAlso Oldcdic.Count > 0 Then
For Each oldnode In Oldcdic
If Not IsNothingoldnode AndAlso oldnode.Count > 4 Then
SetColumnBind(oldnode(4), oldnode(0), oldnode(2), True)
End If
Next
End If
End If
Next
End If
Next
End If
End Sub
Public Sub SetColumnBind(devname As String, nodetype As String devloop As String, istrue As Boolean)
If String.IsNullOrEmpty(devloop) Then Return
For i = TableInteraction.TableColNumber.InsertColumn To _grd.Cols - 1
Dim g_devname = New CtabRange(_grd, TableInteraction.TableRowNumber.DeviceName, i)
If g_devname.devname.Equals(devname) Then
For ci = g_devname.fc To g_devname.lc
Dim g_devcloumn = New CtabRange(_grd, TableInteraction.TableRowNumber.FunctionAnotherName, i)
If g_devcloumn.devname.Equals(nodetype) Then
For vi = g_devcloumn.fc To g_devcloumn.lc
If _grd.Cell(TableInteraction.TableRowNumber.FunctionChildNodeID, vi).Text.Equals(devloop) Then
_grd.Column(vi).Visible = istrue
Console.WriteLine($"Column{vi},Visible{istrue}")
Exit Sub
End If
Next
End If
Next
End If
Next
End Sub
Private Sub DeleteTableClunm(startindex As Integer endtindex As Integer)
Dim len As Integer = endtindex - startindex + 1
Dim dic As New List(Of (Integer, String))
Dim dick, dicv As String
Dim G_DicRowlen As Integer = -1
For i = TableRowNumber.Max To _grd.Rows - 1
Dim rowtag As TableRowTag = Dic_ActionConfiguration.Item(i - TableRowNumber.Max)
'删除每行中需要删的列数据
'For j = startindex To endtindex
' If rowtag.G_DicRow.ContainsKey(j) Then
' rowtag.G_DicRow.Remove(j)
' End If
'Next
'变更列号
dic.Clear()
G_DicRowlen = rowtag.G_DicRow.Count - 1
For nodeindex As Integer = 0 To G_DicRowlen
dick = rowtag.G_DicRow.Keys(nodeindex)
dicv = rowtag.G_DicRow.Values(nodeindex)
If dick >= startindex AndAlso dick <= endtindex Then
dic.Add((dick, "Remove"))
End If
If dick > endtindex Then
dic.Add((dick, "Alter"))
End If
Next
If dic.Count > 2 Then
Console.WriteLine("")
End If
dic.Sort()
For Each node In dic
Select Case node.Item2
Case "Alter"
Dim news As String = rowtag.G_DicRow.Item(node.Item1)
rowtag.G_DicRow.Add((node.Item1 - len), rowtag.G_DicRow.Item(node.Item1))
rowtag.G_DicRow.Remove(node.Item1)
Case "Remove"
rowtag.G_DicRow.Remove(node.Item1)
End Select
Next
Next
End Sub
#End Region
#Region "编译"
Public Function TableCompiletoByte(Optional savePath As String = "",
Optional ByVal IsShowCompileResult As Boolean = False,
Optional ByVal ifCfgVerPlusPlus As Boolean = False) As Boolean
Dim lst As New List(Of Byte())
_actionIndex = 1
Dim newTableCompile As New TableCompile
Dim configInfoLst As New List(Of Byte())
' 编译配置信息
If IsNothing(ConfigInfo.Author) Then
MsgBox("Room type not selected")
Return False
End If
Dim tmpInfo() As Byte = FillConfigInfo(ConfigInfo, hostname).ToArray
configInfoLst.Add(tmpInfo)
Console.WriteLine($"Compile configuration information{ByteToString(tmpInfo)}")
lst.AddRange(configInfoLst.ToArray)
'编译设备存在
Dim deviceExistsDatas As List(Of Byte())
Dim OutDevlist As New List(Of Byte)
deviceExistsDatas = FillDeviceExistsData(Dic_Devicemodel)
lst.AddRange(deviceExistsDatas.ToArray)
'获取编译的设备动作
Dim actibuf As List(Of Byte()) = FillDeviceObject(Dic_Devicemodel, Dic_ActionConfiguration, _grd)
For Each buf In actibuf
lst.Add(buf)
Next
'语音
actibuf = VoicementDeviceObject()
For Each buf In actibuf
lst.Add(buf)
Next
'编译场景
Dim NoCardDatabuf As List(Of Byte()) = GetNoCardData()
For Each buf In NoCardDatabuf
lst.Add(buf)
Next
'编译场景信息
Dim SceneDatas As List(Of Byte())
SceneDatas = FillSceneData(Dic_ActionConfiguration)
lst.AddRange(SceneDatas.ToArray)
Dim frames As List(Of Byte()) = newTableCompile.FillDataFrames(lst)
Dim path As String = savePath.Replace(".blv", ".dat")
'Dim filename As String = Application.StartupPath & "\Shipment\test.dat"
'If Not IO.Directory.Exists(Application.StartupPath & "\Shipment\") Then IO.Directory.CreateDirectory(Application.StartupPath & "\Shipment\")
If IO.File.Exists(path) Then IO.File.Delete(path)
Using steam As New IO.FileStream(path, IO.FileMode.OpenOrCreate)
For Each frame As Byte() In frames
steam.Write(frame, 0, frame.Length)
Console.WriteLine($"Length:{frame.Length:D4} Data:{BitConverter.ToString(frame).Replace("-", " ")}")
Next
steam.Flush()
steam.Close()
End Using
Dim filebuff() As Byte = IO.File.ReadAllBytes(path)
Dim ismod As Integer = filebuff.Length Mod 4
Dim buff As New List(Of Byte)
buff.AddRange(filebuff)
For isnum As Integer = 1 To 4 - ismod
buff.Add(0)
Next
IO.File.WriteAllBytes(path, buff.ToArray)
MsgBox($"Compile complete{path}")
Return True
End Function
Public Function GetNoCardData() As List(Of Byte())
Dim result As New List(Of Byte())
Dim UniqueDevice As DeviceModel
Dim NoCardNode As DeviceChildNodeClass
Dim vli nli As List(Of Byte())
Dim mli As Byte()
For Each index In Dic_Devicemodel.Values
For Each node In index.Nodes
If node.Name.Equals("Virtual_Card") Then
UniqueDevice = index
NoCardNode = node
vli = PortInformation(NoCardNode)
nli = ConditionalInformation(UniqueDevice)
mli = EquipmentCommonStats(UniqueDevice)
If Not IsNothing(vli) AndAlso vli.Count > 0 AndAlso Not IsNothing(vli) AndAlso vli.Count > 0 Then
result.AddRange(vli)
result.AddRange(nli)
If Not IsNothing(mli) AndAlso mli.Count > 0 Then
result.Add(mli)
End If
End If
End If
Next
Next
Return result
End Function
Public Function EquipmentCommonStats(UniqueDevice As DeviceModel) As Byte()
Dim lst As New List(Of Byte)
Dim strbuf() As String = UniqueDevice.Desc.ProtocolData.Split(",")
If strbuf.Length < 2 Then Return Nothing
Dim cmd As Byte = &HB
lst.Add(cmd)
lst.Add(If(strbuf(0).Equals("1"), 1, 0))
Dim number As Integer = 0
If String.IsNullOrEmpty(strbuf(1)) Then
lst.AddRange(BitConverter.GetBytes(CShort(number)))
Else
Integer.TryParse(strbuf(1), number)
lst.AddRange(BitConverter.GetBytes(CShort(number)))
End If
lst.Add(CInt(strbuf(2)))
Return lst.ToArray
End Function
'端口信息
Public Function PortInformation(NoCardNode As DeviceChildNodeClass) As List(Of Byte())
Dim result As New List(Of Byte())
Dim sbuf() As String
Dim isport As Boolean
For Each node In NoCardNode.Nodes
sbuf = node.Description.Split(",")
isport = True
For i = 0 To sbuf.Length - 1
If String.IsNullOrEmpty(sbuf(i)) AndAlso (i <> 2 AndAlso i <> 3) Then
isport = False
End If
Next
If isport AndAlso sbuf.Length > 4 Then
result.Add(GetPortInformation(node.LoopAddr, node.Description))
Else
Continue For
End If
Next
Return result
End Function
Public Function GetPortInformation(LoopAddr As String nStr As String) As Byte()
Dim cmd As Byte = &H9
Dim Data = New List(Of Byte)
Dim strbuf() As String = nStr.Split(",")
Data.Add(cmd)
Data.Add(CInt(strbuf(5)))
Data.Add(CInt(strbuf(6)))
Data.AddRange(BitConverter.GetBytes(CShort(CInt(strbuf(4)))))
If String.IsNullOrEmpty(strbuf(2)) Then
Data.Add(0)
Else
Data.Add(CInt(strbuf(2)))
End If
Data.Add(CInt(LoopAddr)) '- 1) '增加了减1
If String.IsNullOrEmpty(strbuf(3)) OrElse strbuf(3).Equals("0") Then
Data.Add(0)
Else
Data.Add(1)
End If
Return Data.ToArray
End Function
Public Function ConditionalInformation(UniqueDevice As DeviceModel) As List(Of Byte())
Dim result As New List(Of Byte())
Dim sbuf() As String
Dim isport As Boolean
Dim IfGridRowdic As Dictionary(Of String, List(Of String))
Try
IfGridRowdic = JsonConvert.DeserializeObject(Of Dictionary(Of String, List(Of String)))(UniqueDevice.Desc.DevDescription)
Catch ex As Exception
Return Nothing
End Try
If IsNothing(IfGridRowdic) Then Return result
For Each index In IfGridRowdic
For Each node In index.Value
sbuf = node.Split(",")
isport = True
For Each nStr In sbuf
If String.IsNullOrEmpty(nStr) Then
isport = False
End If
Next
If isport AndAlso sbuf.Length > 3 Then
result.Add(GetConditionalInformation(index.Key, node))
Else
Continue For
End If
Next
Next
Return result
End Function
'条件信息
Public Function GetConditionalInformation(key As String, nStr As String) As Byte()
Dim cmd As Byte = &H8
Dim Data = New List(Of Byte)
Dim strbuf() As String = nStr.Split(",")
Dim nbbuf() As String
Data.Add(cmd)
nbbuf = strbuf(1).Split(":")
Data.Add(PowerSupply.GetNoCarDataKeyVal(nbbuf(0)))
Data.Add(CInt(key))
Data.Add(strbuf(0))
Data.AddRange(BitConverter.GetBytes(CShort(CInt(strbuf(13)))))
Data.Add(GetGlossary8(strbuf(14)))
For i = 1 To 11
'nbbuf = strbuf(i + 1).Split(":")
Data.Add(PowerSupply.GetNoCarDataKeyVal(strbuf(i + 1)))
Next
Return Data.ToArray
End Function
Public Function GetGlossary8(sb As String) As Byte
Dim result As Byte = 0
Select Case sb
Case "S"
result = 1
Case "m"
result = 2
Case "H"
result = 3
Case Else
result = 0
End Select
Return result
End Function
Private Function FillSceneData(SwitchConfig As List(Of TableRowTag)) As List(Of Byte())
Dim tmpBufferCount As Integer = 0
Dim resultDatas As New List(Of Byte())
Dim cmd As Byte = &H6
Dim buf As List(Of Byte)
For Each num In SwitchConfig
buf = New List(Of Byte)
buf.Add(cmd)
tmpBufferCount = CShort(num.G_DicRow.Item(TableColNumber.SceneID))
buf.AddRange(BitConverter.GetBytes(tmpBufferCount)) '2字节场景编号
Dim aliasData() As Byte = AliasEncoding.GetBytes(num.G_DicRow.Item(TableColNumber.KeyName))
ReDim Preserve aliasData(15)
buf.AddRange(aliasData) '16字节场景别名
buf.AddRange(BitConverter.GetBytes(tmpBufferCount)) '2n动作编号集
'tmpBufferCount = tmpBufferCount + buf.Count
resultDatas.Add(buf.ToArray)
Next
'PrintInfo("场景编译完成,长度:" & tmpBufferCount & "Bytes")
Return resultDatas
End Function
Public Function FillDeviceObject(ByRef DeviceModuleDic As Dictionary(Of String DeviceModel), SwitchConfig As List(Of TableRowTag), Grid1 As FlexCell.Grid) As List(Of Byte())
'返回变量
Dim result As New List(Of Byte())
'行tag
Dim rowtag As TableRowTag
'编译固定参书
Dim cmd As Byte = &H4
Dim g_devLoop As Integer = 1
'遍历每个事件
For i As Integer = 0 To SwitchConfig.Count - 1
'取行tag、
rowtag = SwitchConfig.Item(i)
'枚举列直
'判断是否执行
If rowtag.G_DicRow.Count > 0 AndAlso rowtag.G_DicRow.Item(TableColNumber.choose).Equals("1") AndAlso Not String.IsNullOrEmpty(rowtag.G_DicRow.Item(TableColNumber.SceneAttribute)) Then
Dim Grow As Integer = i + TableRowNumber.Max
Dim celltag As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(_grd.Cell(Grow, TableColNumber.SceneAttribute).Tag)
If Not IsNothing(celltag) AndAlso celltag.ContainsKey("CallRow") Then
Continue For
End If
'模型的设备类型
Console.WriteLine($"FillDeviceObject 2561 {rowtag.G_DevModeName}")
Dim devType As Byte
Try
devType = GetActionDeviceType(DeviceModuleDic, rowtag.G_DevModeName, rowtag.G_DevNodeName)
Catch ex As Exception
Console.WriteLine($"FillDeviceObject 2561 {rowtag.G_DevModeName}")
End Try
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, rowtag.G_DevModeName, rowtag.G_DevNodeName)
'回路地址
Dim devLoop() As Byte = BitConverter.GetBytes(CShort(rowtag.G_DevNodeIndex))
'获取场景属性
Dim Exbuf() As String = rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Split(",")
'事件编号
Dim strEventNum As UShort = 1
UShort.TryParse(Exbuf(0), strEventNum)
Dim eventNum() As Byte = BitConverter.GetBytes(strEventNum)
'执行条件编译数据
Dim clause() As Byte = GetConditionDataUnderConditionGroup(Exbuf(2))
'取执行模式
Dim condition As Byte
Dim isCheckOut As Integer = 0
Dim CheckOutdeng As Integer = 0
Select Case Exbuf(1)
Case "8", "9"
condition = GetExecModeDataUnderCondtion(2)
isCheckOut = CIntExbuf(1))
Case "7", "10"
condition = GetExecModeDataUnderCondtion(1)
isCheckOut = CIntExbuf(1))
Case Else
condition = GetExecModeDataUnderCondtion(Exbuf(1))
End Select
'事件条件别名
Dim aliasbuf(31) As Byte
'场景编号
Dim sceneIndex As UShort = CUShort(rowtag.G_DicRow.Item(TableColNumber.SceneID))
Dim sceneNum() As Byte = BitConverter.GetBytes(sceneIndex)
'30位保留字段
Dim keepBuf(31) As Byte
'保留字段(32字节) -> 2022-05-28 V3.1 32bytes
Dim keepParam(31) As Byte
'执行动作
Dim ncbuf As New List(Of Byte())
Dim Scenebuf As New List(Of Byte())
Dim multiplebuf As New List(Of List(Of Byte()))
Dim col As Integer = -1
Dim t_col As Integer = -1
Dim DevGroupName As String = String.Empty
Dim databuff As List(Of Byte())
Dim textval As String = String.Empty
Dim DevModeName As String
Dim Ismusic As Boolean = False
Dim CheckOutDic As New Dictionary(Of String, List(Of Byte))
'''转移到 入住服务
'If Not IsNothing(celltag) AndAlso celltag.ContainsKey("34 A9PB调光渐变时间") Then
' Dim Rdic As New Dictionary(Of String String)
' Dim Musicdic As New Dictionary(Of String String)
' Dim partime As String = String.Empty
' Dim partime1 As String = String.Empty
' For Each TheDevMode In DeviceModuleDic.Values
' Musicdic.Clear()
' Rdic.Clear()
' Select Case TheDevMode.Desc.Name
' Case "灯带"
' Rdic.Add("Dimming".ToUpper, "36 灯带调光渐变时间")
' partime = celltag.Item("36 灯带调光渐变时间")
' Case "1到10V调光"
' Rdic.Add("Dimming".ToUpper, "32 1-10V调光渐变时间")
' partime = celltag.Item("32 1-10V调光渐变时间")
' Case "A9调光"
' Rdic.Add("Dimming".ToUpper, "33 A9恒压调光渐变时间")
' partime = celltag.Item("33 A9恒压调光渐变时间")
' Case "A8PB调光"
' Rdic.Add("Dimming".ToUpper, "34 A9PB调光渐变时间")
' partime = celltag.Item("34 A9PB调光渐变时间")
' 'Case "PB"
' Case "PB_STRIP_DEVICE"
' Rdic.Add("PB_STRIP_DEVICE".ToUpper, "C8PLC外设恒压调光渐变时间")
' partime = celltag.Item("C8PLC外设恒压调光渐变时间")
' Case "BLV_C12"
' For Each configindex In TheDevMode.Nodes
' Select Case configindex.Name
' Case "PB_LINE_CONTROL".ToUpper
' Rdic.Add("PB_LINE_CONTROL".ToUpper, "C8PLC自带恒压调光渐变时间")
' partime = celltag.Item("C8PLC自带恒压调光渐变时间")
' partime1 = celltag.Item("48 主机调光百分比值(0-100)")
' Case "Dimming".ToUpper
' Rdic.Add("Dimming".ToUpper, "35 C12调光渐变时间")
' partime = celltag.Item("35 C12调光渐变时间")
' partime1 = celltag.Item("48 主机调光百分比值(0-100)")
' End Select
' Next
' If Not String.IsNullOrEmpty(celltag.Item("7 设定音乐音量")) Then
' Musicdic.Add(7, celltag.Item("7 设定音乐音量"))
' End If
' If Not String.IsNullOrEmpty(celltag.Item("8 设定提示音音量")) Then
' Musicdic.Add(8, celltag.Item("8 设定提示音音量"))
' End If
' If Not String.IsNullOrEmpty(celltag.Item("9 设定门铃和欢迎词音量")) Then
' Musicdic.Add(9, celltag.Item("9 设定门铃和欢迎词音量"))
' End If
' If Not String.IsNullOrEmpty(celltag.Item("10 设定全局音量上限")) Then
' Musicdic.Add(10, celltag.Item("10 设定全局音量上限"))
' 'Musicdic.Add(10, celltag.Item("10 设定最大音量限制"))
' End If
' If Not String.IsNullOrEmpty(celltag.Item("12 设定助眠音量")) Then
' Musicdic.Add(12, celltag.Item("12 设定助眠音量"))
' 'Musicdic.Add(10, celltag.Item("10 设定最大音量限制"))
' End If
' Case Else
' Continue For
' End Select
' If Rdic.ContainsKey("PB_LINE_CONTROL".ToUpper) Then
' If String.IsNullOrEmpty(partime) AndAlso String.IsNullOrEmpty(partime1) Then Continue For
' databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 1 $"0,0,9,{partime}", Rdic)
' If Not IsNothing(databuff) Then
' ncbuf.AddRange(databuff.ToArray)
' End If
' databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 1 $"0,0,10,{partime1}", Rdic)
' If Not IsNothing(databuff) Then
' ncbuf.AddRange(databuff.ToArray)
' End If
' End If
' If Rdic.ContainsKey("PB_STRIP_DEVICE".ToUpper) Then
' If String.IsNullOrEmpty(partime) AndAlso String.IsNullOrEmpty(partime1) Then Continue For
' databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_STRIP_DEVICE" 1 $"0,0,9,{partime}", Rdic)
' If Not IsNothing(databuff) Then
' ncbuf.AddRange(databuff.ToArray)
' End If
' 'databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 1 $"0,0,10,{partime}", Rdic)
' 'If Not IsNothing(databuff) Then
' ' ncbuf.AddRange(databuff.ToArray)
' 'End If
' End If
' If Rdic.ContainsKey("Dimming".ToUpper) Then
' If String.IsNullOrEmpty(partime) AndAlso String.IsNullOrEmpty(partime1) Then Continue For
' databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "Dimming" 1 $"0,0,1,{partime}", Rdic)
' If Not IsNothing(databuff) Then
' ncbuf.AddRange(databuff.ToArray)
' End If
' Rdic.Clear()
' Rdic.Add("Dimming".ToUpper, "48 主机调光百分比值(0-100)")
' databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "Dimming" 1 $"0,0,16,{partime1}", Rdic)
' If Not IsNothing(databuff) Then
' ncbuf.AddRange(databuff.ToArray)
' End If
' End If
' If Musicdic.Count > 0 Then
' For Each mnode In Musicdic
' databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "MUSIC" 1 $"0,0,0,{mnode.Key },{mnode.Value },0", Nothing)
' If IsNothing(databuff) Then Continue For
' ncbuf.AddRange(databuff.ToArray)
' Next
' End If
' Next
'End If
'遍历设备列表
If rowtag.G_DicRow.ContainsKey(TableColNumber.ServerAttribute) = False OrElse String.IsNullOrEmpty(rowtag.G_DicRow.Item(TableColNumber.ServerAttribute)) Then '按键
Else '服务
'获取场景属性
Dim Tserverbuf() As String = rowtag.G_DicRow.Item(TableColNumber.ServerAttribute).Split(vbLf)
For Each Findex In Tserverbuf
Dim serverbuf() As String = Findex.Split(",")
DevModeName = hostname
DevGroupName = "HOSTSERVICE"
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName serverbuf(0) serverbuf(1), Nothing, CInt(serverbuf(2)), CInt(serverbuf(3)))
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
Scenebuf.AddRange(databuff.ToArray)
Next
End If
If Not IsNothing(celltag) AndAlso celltag.ContainsKey("CallRowA") AndAlso Not String.IsNullOrEmpty(celltag.Item("CallRowA")) Then
'添加反饋燈
Dim callA() = celltag.Item("CallRowA").Split(",")
For Each callindex In callA
databuff = AdditionalFeedbackLamp(callindex DeviceModuleDic celltag)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
Scenebuf.AddRange(databuff.ToArray)
databuff = ParallelScenario(callindex DeviceModuleDic, SwitchConfig)
If Not IsNothing(databuff) Then
multiplebuf.Add(databuff)
End If
Next
End If
For Each index In rowtag.G_DicRow
Integer.TryParse(index.Key, col)
'If index.Value.Equals("插卡") Then
If index.Value.Equals("Check-in service") And rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Substring(0, 1).Equals("1") Then
Dim onecelltag As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(_grd.Cell(7, TableColNumber.SceneAttribute).Tag)
If Not IsNothing(onecelltag) AndAlso onecelltag.ContainsKey("34 A9PB Dimming gradient time") Then
Dim Rdic As New Dictionary(Of String String)
Dim Musicdic As New Dictionary(Of String String)
Dim partime As String = String.Empty
Dim partime1 As String = String.Empty
Dim partime2 As String = String.Empty
Dim partime3 As String = String.Empty
For Each TheDevMode In DeviceModuleDic.Values
Musicdic.Clear()
Rdic.Clear()
Select Case TheDevMode.Desc.Name
Case "灯带"
Rdic.Add("Dimming".ToUpper, "36 Dimming gradient time of light strip")
partime = onecelltag.Item("36 Dimming gradient time of light strip")
Case "1到10V调光"
Rdic.Add("Dimming".ToUpper, "32 1-10V Dimming gradient time")
partime = onecelltag.Item("32 1-10V Dimming gradient time")
Case "A9调光"
Rdic.Add("Dimming".ToUpper, "33 A9 Constant voltage dimming gradient time")
partime = onecelltag.Item("33 A9 Constant voltage dimming gradient time")
Case "A8PB调光"
Rdic.Add("Dimming".ToUpper, "34 A9PB Dimming gradient time")
partime = onecelltag.Item("34 A9PB Dimming gradient time")
'Case "PB"
Case "PB_STRIP_DEVICE"
Rdic.Add("PB_STRIP_DEVICE".ToUpper, "C8PLC peripheral constant voltage dimming gradient time")
partime = onecelltag.Item("C8PLC peripheral constant voltage dimming gradient time")
Case "BLV_C12"
For Each configindex In TheDevMode.Nodes
Select Case configindex.Name
Case "PB_LINE_CONTROL".ToUpper
Rdic.Add("PB_LINE_CONTROL".ToUpper, "C8PLC comes with constant pressure dimming gradient time")
partime = onecelltag.Item("C8PLC comes with constant pressure dimming gradient time")
If onecelltag.ContainsKey("48 Percentage of host dimming(0-100)") Then
partime1 = onecelltag.Item("48 Percentage of host dimming(0-100)")
Else
partime1 = Nothing
End If
If onecelltag.ContainsKey("50 Adjustable Lower limit Settings (0-100)") Then
partime2 = onecelltag.Item("50 Adjustable Lower limit Settings (0-100)")
Else
partime2 = Nothing
End If
If onecelltag.ContainsKey("49 Adjustable Upper limit Settings (0-100)") Then
partime3 = onecelltag.Item("49 Adjustable Upper limit Settings (0-100)")
Else
partime3 = Nothing
End If
Case "Dimming".ToUpper
Rdic.Add("Dimming".ToUpper, "35 C12 dimming gradient")
partime = onecelltag.Item("35 C12 Dimming gradient time")
If onecelltag.ContainsKey("48 Host dimming percentage (0-100)") Then
partime1 = onecelltag.Item("48 Host dimming percentage (0-100)")
Else
partime1 = Nothing
End If
If onecelltag.ContainsKey("50 Adjustable Lower limit Settings (0-100)") Then
partime2 = onecelltag.Item("50 Adjustable Lower limit Settings (0-100)")
Else
partime2 = Nothing
End If
If onecelltag.ContainsKey("49 Adjustable Upper limit Settings (0-100)") Then
partime3 = onecelltag.Item("49 Adjustable Upper limit Settings (0-100)")
Else
partime3 = Nothing
End If
End Select
Next
If Not String.IsNullOrEmpty(onecelltag.Item("7 Set music volume")) Then
Musicdic.Add(7, onecelltag.Item("7 Set music volume"))
End If
If Not String.IsNullOrEmpty(onecelltag.Item("8 Set prompt sound volume")) Then
Musicdic.Add(8, onecelltag.Item("8 Set prompt sound volume"))
End If
If Not String.IsNullOrEmpty(onecelltag.Item("9 Set doorbell and welcome message volume")) Then
Musicdic.Add(9, onecelltag.Item("9 Set doorbell and welcome message volume"))
End If
If Not String.IsNullOrEmpty(onecelltag.Item("10 Set global volume limit")) Then
Musicdic.Add(10, onecelltag.Item("10 Set global volume limit"))
'Musicdic.Add(10, onecelltag.Item("10 Set global volume limit"))
End If
If Not String.IsNullOrEmpty(onecelltag.Item("12 Set sleep aid volume")) Then
Musicdic.Add(12, onecelltag.Item("12 Set sleep aid volume"))
'Musicdic.Add(10, celltag.Item("10 设定最大音量限制"))
End If
Case Else
Continue For
End Select
If Rdic.ContainsKey("PB_LINE_CONTROL".ToUpper) Then
If String.IsNullOrEmpty(partime) AndAlso String.IsNullOrEmpty(partime1) Then Continue For
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 1 $"0,0,9,{partime}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
'databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 1 $"0,0,10,{partime1}", Rdic)
'If Not IsNothing(databuff) Then
' ncbuf.AddRange(databuff.ToArray)
'End If
End If
If Rdic.ContainsKey("PB_LINE_CONTROL".ToUpper) Then
If String.IsNullOrEmpty(partime) AndAlso String.IsNullOrEmpty(partime1) Then Continue For
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 1 $"0,0,9,{partime}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
If Not String.IsNullOrEmpty(partime1) Then
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 1 $"0,0,10,{partime1}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
If Not String.IsNullOrEmpty(partime2) Then
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 2 $"0,0,12,{partime2}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
If Not String.IsNullOrEmpty(partime3) Then
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "PB_LINE_CONTROL" 3 $"0,0,11,{partime3}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
End If
If String.IsNullOrEmpty(partime) AndAlso String.IsNullOrEmpty(partime1) Then Continue For
If Rdic.ContainsKey("Dimming".ToUpper) OrElse Rdic.ContainsKey("PB_LINE_CONTROL".ToUpper) Then
For Each devRKEYnode In devRKEY
If Not String.IsNullOrEmpty(partime2) Then
Rdic.Clear()
Rdic.Add("RKEY".ToUpper, "50 Adjustable Lower limit Settings (0-100)")
databuff = GetActionDatagather(DeviceModuleDic, devRKEYnode.Name, "RKEY" 1 $"0,0,6,{partime2}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
If Not String.IsNullOrEmpty(partime3) Then
Rdic.Clear()
Rdic.Add("RKEY".ToUpper, "49 Adjustable Upper limit Settings (0-100)")
databuff = GetActionDatagather(DeviceModuleDic, devRKEYnode.Name, "RKEY" 1 $"0,0,5,{partime3}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
Next
End If
If Rdic.ContainsKey("Dimming".ToUpper) Then
If String.IsNullOrEmpty(partime) AndAlso String.IsNullOrEmpty(partime1) Then Continue For
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "Dimming" 1 $"0,0,1,{partime}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
If Not String.IsNullOrEmpty(partime1) Then
Rdic.Clear()
Rdic.Add("Dimming".ToUpper, "48 Host dimming percentage (0-100)")
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "Dimming" 1 $"0,0,48,{partime1}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
If Not String.IsNullOrEmpty(partime2) Then
Rdic.Clear()
Rdic.Add("Dimming".ToUpper, "50 Adjustable Lower limit Settings (0-100)")
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "Dimming" 2 $"0,0,50,{partime2}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
If Not String.IsNullOrEmpty(partime3) Then
Rdic.Clear()
Rdic.Add("Dimming".ToUpper, "49 Adjustable Upper limit Settings (0-100)")
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "Dimming" 3 $"0,0,49,{partime3}", Rdic)
If Not IsNothing(databuff) Then
ncbuf.AddRange(databuff.ToArray)
End If
End If
End If
If Musicdic.Count > 0 Then
For Each mnode In Musicdic
databuff = GetActionDatagather(DeviceModuleDic, TheDevMode.Name, "MUSIC" 1 $"0,0,0,{mnode.Key },{mnode.Value },0", Nothing)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
Next
End If
Next
End If
For Each vindex In Voicement
If vindex.Desc.DevDescription.Length > 0 AndAlso vindex.Desc.DevDescription.Substring(0, 1).Equals("1") Then
databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "MUSIC" 1, "0,0,0,1,0,开启语音识别", Nothing)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
End If
Next
For Each vindex In devTempment
If vindex.Desc.DevDescription.Length > 0 AndAlso vindex.Desc.DevDescription.Substring(0, 1).Equals("1") Then
databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,1,1,0,0,温控器高级设置,0*秒*0 设置*1 插卡状态同步*1 开*0*0", Nothing)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
ElseIf vindex.Desc.DevDescription.Length > 0 AndAlso vindex.Desc.DevDescription.Substring(0, 1).Equals("0") Then
databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,1,2,0,0,温控器高级设置,0*秒*0 设置*1 插卡状态同步*1 开*0*0", Nothing)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
End If
'If vindex.Desc.DevDescription.Length > 6 AndAlso vindex.Desc.DevDescription.Substring(6, 1).Equals("1") Then
' databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,2,1,0,0,温控器高级设置,0*秒*0 设置*2 风速模式提示音*1 开*0*0", Nothing)
' If IsNothing(databuff) Then Continue For
' ncbuf.AddRange(databuff.ToArray)
'Else
' databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,2,2,0,0,温控器高级设置,0*秒*0 设置*2 风速模式提示音*1 开*0*0", Nothing)
' If IsNothing(databuff) Then Continue For
' ncbuf.AddRange(databuff.ToArray)
'End If
Next
'ElseIf index.Value.Equals("拔卡") Then
ElseIf index.Value.Equals("Check-in service") And rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Substring(0, 1).Equals("2") Then
Dim onecelltag As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(_grd.Cell(7, TableColNumber.SceneAttribute).Tag)
For Each vindex In Voicement
If vindex.Desc.DevDescription.Length > 0 AndAlso vindex.Desc.DevDescription.Substring(0, 1).Equals("1") Then
databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "MUSIC" 1, "0,0,0,2,0,关闭语音识别", Nothing)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
End If
Next
For Each vindex In devTempment
If vindex.Desc.DevDescription.Length > 0 AndAlso vindex.Desc.DevDescription.Substring(0, 1).Equals("1") Then
databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,1,1,0,0,温控器高级设置,0*秒*0 设置*1 插卡状态同步*1 开*0*0", Nothing)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
ElseIf vindex.Desc.DevDescription.Length > 0 AndAlso vindex.Desc.DevDescription.Substring(0, 1).Equals("0") Then
databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,1,2,0,0,温控器高级设置,0*秒*0 设置*1 插卡状态同步*1 开*0*0", Nothing)
If IsNothing(databuff) Then Continue For
ncbuf.AddRange(databuff.ToArray)
End If
'If vindex.Desc.DevDescription.Length > 6 AndAlso vindex.Desc.DevDescription.Substring(6, 1).Equals("1") Then
' databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,2,1,0,0,温控器高级设置,0*秒*0 设置*2 风速模式提示音*1 开*0*0", Nothing)
' If IsNothing(databuff) Then Continue For
' ncbuf.AddRange(databuff.ToArray)
'Else
' databuff = GetActionDatagather(DeviceModuleDic, vindex.Name, "Temp" 1, "0,2,0,2,2,0,0,温控器高级设置,0*秒*0 设置*2 风速模式提示音*1 开*0*0", Nothing)
' If IsNothing(databuff) Then Continue For
' ncbuf.AddRange(databuff.ToArray)
'End If
Next
End If
If col > TableColNumber.Max - 2 And col < Grid1.Cols - 1 Then
Integer.TryParse(Grid1.Cell(TableRowNumber.FunctionChildNodeID, col).Text, t_col)
Console.WriteLine($"{Grid1.Cell(TableRowNumber.FunctionChildNodeAnother, col).Text}_{Grid1.Cell(TableRowNumber.FunctionChildNodeID, col).Text}")
DevGroupName = Grid1.Cell(TableRowNumber.FunctionName, col - t_col + 1).Text
DevModeName = Grid1.Cell(TableRowNumber.DeviceName, Grid1.Range(TableRowNumber.DeviceName, col, TableRowNumber.DeviceName, col).FirstCol).Text
If DevGroupName.ToUpper.Equals("MUSIC") And Not String.IsNullOrEmpty(index.Value) Then
Ismusic = True
Else
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col index.Value, celltag)
If IsNothing(databuff) Then Continue For
Scenebuf.AddRange(databuff.ToArray)
End If
If index.Value.Contains("Play prompt sound") AndAlso (index.Value.Contains("2 Play (prompt sound)") OrElse index.Value.Contains("1 Mute (alert sound)")) Then
Dim strbuf() As String = index.Value.Split(vbLf)
For Each prnode In strbuf
If prnode.Contains("2 Play (prompt sound)") OrElse prnode.Contains("1 Mute (alert sound)") Then
DevModeName = hostname
DevGroupName = "HOSTSERVICE"
Dim serverbuf() As String = prnode.Split(",")
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName 24 serverbuf(2), Nothing, CInt(serverbuf(0)), CInt(serverbuf(1)))
Else
DevGroupName = Grid1.Cell(TableRowNumber.FunctionName, col - t_col + 1).Text
DevModeName = Grid1.Cell(TableRowNumber.DeviceName, Grid1.Range(TableRowNumber.DeviceName, col, TableRowNumber.DeviceName, col).FirstCol).Text
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col prnode, celltag)
End If
If isCheckOut > 0 Then
If rowtag.G_DevModeName.Equals(DevModeName) AndAlso prnode.Equals("Corresponding scenario") AndAlso DevGroupName.Equals("DO") AndAlso Grid1.Column(col).Visible = True Then
CheckOutdeng = t_col
End If
End If
If IsNothing(databuff) Then Continue For
If prnode.Equals("Corresponding scenario") AndAlso DevGroupName.Equals("DO") AndAlso rowtag.G_DicRow.Count = 6 AndAlso isCheckOut = 0 Then Continue For
ncbuf.AddRange(databuff.ToArray)
Next
Continue For
ElseIf index.Value.Contains("Huaersi Music Control") Then
Dim strbuf() As String = index.Value.Split(vbLf)
Dim Tpar As String = String.Empty
Dim tbuf() As String
For Each prnode In strbuf
If prnode.Contains("2 Shutdown") Then
tbuf = prnode.Split(",")
Tpar = $"{tbuf(0)},{tbuf(1)},{tbuf(2)},{tbuf(tbuf.Length - 2)}"
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col Tpar, celltag)
ncbuf.AddRange(databuff.ToArray)
Continue For
ElseIf prnode.Contains("1 Power on") Then
tbuf = prnode.Split(",")
Tpar = $"{tbuf(0)},{tbuf(1)},{tbuf(2)},{tbuf(tbuf.Length - 2)}"
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col Tpar, celltag)
ncbuf.AddRange(databuff.ToArray)
If prnode.Contains("channel") Then
Tpar = $"{tbuf(0)},{tbuf(1)},{tbuf(3)},0,{tbuf(tbuf.Length - 2)}"
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col Tpar, celltag)
ncbuf.AddRange(databuff.ToArray)
End If
If prnode.Contains("volume") Then
Tpar = $"{tbuf(0)},{tbuf(1)},0,{tbuf(4)},{tbuf(5)},{tbuf(tbuf.Length - 2)}"
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col Tpar, celltag)
ncbuf.AddRange(databuff.ToArray)
Else
Tpar = $"{tbuf(0)},{tbuf(1)},0,{tbuf(4)},{tbuf(tbuf.Length - 2)}"
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col Tpar, celltag)
ncbuf.AddRange(databuff.ToArray)
End If
End If
Next
Continue For
End If
databuff = GetActionDatagather(DeviceModuleDic, DevModeName, DevGroupName t_col index.Value, celltag)
If isCheckOut > 0 Then
If rowtag.G_DevModeName.Equals(DevModeName) AndAlso index.Value.Equals("Corresponding scenario") AndAlso DevGroupName.Equals("DO") AndAlso Grid1.Column(col).Visible = True Then
CheckOutdeng = t_col
End If
End If
If IsNothing(databuff) Then Continue For
If index.Value.Equals("Corresponding scenario") AndAlso DevGroupName.Equals("DO") AndAlso rowtag.G_DicRow.Count = 6 AndAlso isCheckOut = 0 Then Continue For
ncbuf.AddRange(databuff.ToArray)
End If
Next
'
If Ismusic = True And Scenebuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(0) '设备类型
li.Add(0) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(BitConverter.GetBytes(CShort(g_devLoop))) '设备回路 2
g_devLoop += 1
li.AddRange(BitConverter.GetBytes(CShort(0))) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(sceneNum) '2字节场景编号 2
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = Scenebuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In Scenebuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
End If
'本行动作数据
If ncbuf.Count > 50 Then
MsgBox($"{sceneIndex}The number of scene actions has exceeded the limit. Please increase the services to move some of the actions to the new service.。")
End If
If ncbuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(devType) '设备类型
li.Add(devAddr) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(devLoop) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
Dim valCount As UShort
If Ismusic = True Then
valCount = sceneIndex + 30000
Else
valCount = sceneIndex
End If
li.AddRange(BitConverter.GetBytes(valCount)) '2字节场景编号 2
li.AddRange(keepBuf) '30位保留字段 32
valCount = CUShort(ncbuf.Count)
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
'40901001
'40902001
'21 1 1 0 19 24 0 2
'3 0 1 0 14 0 0 1
If isCheckOut > 0 Then '判断是否需添加服务
CheckOutDic = CheckOutKey(isCheckOut, rowtag.G_DevNodeIndex, CheckOutdeng, li, devAddr)
For Each index In CheckOutDic
result.Add(index.Value.ToArray)
Next
Else
li = PowerSupplyService(rowtag, strEventNum, li DeviceModuleDic)
result.Add(li.ToArray)
End If
' Console.WriteLine($"UDP收到的数据{ByteToString(li.ToArray)}")
End If
'调用场景
For Each blian In multiplebuf
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(blian(0)(0)) '设备类型
li.Add(blian(1)(0)) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(blian(2)) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(blian(3)) '2字节场景编号 2
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = ncbuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
Next
Else
Continue For
End If
Next
Return result
End Function
Public Function PowerSupplyService(rowtag As TableRowTag strEventNum As UShort, li As List(Of Byte) DeviceModuleDic As Dictionary(Of String DeviceModel)) As List(Of Byte)
'判断是否是入住服务
Console.WriteLine(rowtag.G_DevNodeName.ToUpper.Equals("HOSTSERVICE"))
If rowtag.G_DevNodeName.ToUpper.Equals("HOSTSERVICE") AndAlso rowtag.G_DevNodeIndex = 1 Then
Dim DevDescription As String = String.Empty
Dim addr As Integer = 0
For Each index In DeviceModuleDic
For Each node In index.Value.Nodes
If node.DEV_TYPE_DATA.Equals("19") Then
DevDescription = index.Value.Desc.DevDescription
addr = GetActionDeviceAddr(DeviceModuleDic, index.Key, "")
End If
Next
Next
If Not String.IsNullOrEmpty(DevDescription) Then
Dim actionlen As Integer = 116
Dim buf() As String = DevDescription.Split(",")
Select Case strEventNum
Case 1
If buf(0).Equals("1") Then
li(actionlen) = li(actionlen) + 1
li.AddRange({21, addr, 1, 0, 16, 0, 0, 1})
End If
If buf(3).Equals("1") Then
li(actionlen) = li(actionlen) + 1
li.AddRange({21, addr, 1, 0, 192, 0, 10, 2})
End If
' GetActionDatagather()
Case 2
If buf(0).Equals("1") Then
li(actionlen) = li(actionlen) + 1
li.AddRange({21, addr, 1, 0, 32, 0, 10, 1})
End If
Case Else
End Select
End If
End If
Return li
End Function
Public Function CheckOutKey(isCheckOut As Integer, Diloop As Integer, devloop As Integer, li As List(Of Byte), addr As Integer) As Dictionary(Of String, List(Of Byte))
If devloop = 0 Then
devloop = Diloop
End If
Dim actionlen As Integer = 116
Dim resulrdic As New Dictionary(Of String, List(Of Byte))
Select Case isCheckOut '"7 清理", "8 勿扰", "9 稍后", "10 退房"
Case "7"
'li(actionlen) = li(actionlen) + 1
'li.AddRange({4, 0, 3, 0, 1, 0, 0, 1})
'resulrdic.Add("1", li)
Dim index As Integer
Dim actionlencun As Integer = li(actionlen) - 1
For i = 0 To actionlencun
index = (actionlencun - i) * 8 + actionlen
If li(index + 1) = 6 AndAlso li(index + 2) = addr AndAlso li(index + 3) = devloop AndAlso li(index + 4) = 0 AndAlso
li(index + 5) = 3 AndAlso li(index + 6) = 0 AndAlso li(index + 7) = 0 AndAlso li(index + 8) = 1 Then
li(actionlen) = li(actionlen) - 1
li.RemoveAt(index + 8)
li.RemoveAt(index + 7)
li.RemoveAt(index + 6)
li.RemoveAt(index + 5)
li.RemoveAt(index + 4)
li.RemoveAt(index + 3)
li.RemoveAt(index + 2)
li.RemoveAt(index + 1)
End If
Next
Dim li1(li.Count - 1), li2(actionlen) As Byte
Dim arrli1 arrli2 As List(Of Byte)
arrli1 = New List(Of Byte)
arrli2 = New List(Of Byte)
Array.Copy(li.ToArray, li2, actionlen)
'li2(actionlen) = 0
Array.Copy(li.ToArray, li1, li.Count - 1)
Dim clause() As Byte = GetConditionDataUnderConditionGroup("1224996759550300160")
Dim libufb() As Byte = li.ToArray
Array.Copy(clause, 0, libufb, 9, 8)
li.Clear()
li.AddRange(libufb)
li(3) = 1
li(actionlen) = li(actionlen) + 4
li.AddRange({4, 0, 11, 0, 1, 0, 0, 1})
li.AddRange({4, 0, 11, 0, 2, 0, 10, 2})
li.AddRange({21, 1, 1, 0, 19, 167, 0, 1})
Dim loopBuf() As Byte = BitConverter.GetBytes(CShort(devloop))
li.AddRange({6, addr, devloop, 0, 14, 0, 1, 2})
resulrdic.Add("1", li)
clause = GetConditionDataUnderConditionGroup("1224996725190561792")
Array.Copy(clause, 0, li1, 9, 8)
arrli1.Clear()
arrli1.AddRange(li1)
arrli1(3) = 2
arrli1(actionlen) = arrli1(actionlen) + 4
arrli1.AddRange({4, 0, 3, 0, 1, 0, 0, 1})
arrli1.AddRange({4, 0, 11, 0, 1, 0, 0, 1})
arrli1.AddRange({21, 1, 1, 0, 19, 168, 0, 2})
' arrli1.AddRange({6, addr, devloop, 0, 14, 0, 1, 2})
arrli1.AddRange({6, addr, devloop, 0, 3, 0, 0, 1})
resulrdic.Add("2", arrli1)
clause = GetConditionDataUnderConditionGroup("1224996690830821376")
Array.Copy(clause, 0, li2, 9, 8)
arrli2.Clear()
arrli2.AddRange(li2)
arrli2(3) = 3
arrli2(actionlen) = arrli2(actionlen) + 3
arrli2.AddRange({4, 0, 3, 0, 2, 0, 0, 1})
arrli2.AddRange({4, 0, 11, 0, 2, 0, 0, 1})
arrli2.AddRange({21, 1, 1, 0, 19, 169, 0, 2})
resulrdic.Add("3", arrli2)
Case "8"
li(actionlen) = li(actionlen) + 1
li.AddRange({4, 0, 2, 0, 1, 0, 0, 1})
resulrdic.Add("1", li)
Case "7"
li(actionlen) = li(actionlen) + 1
li.AddRange({4, 0, 3, 0, 1, 0, 0, 1})
resulrdic.Add("1", li)
Case "9"
li(actionlen) = li(actionlen) + 1
li.AddRange({4, 0, 7, 0, 1, 0, 0, 1})
resulrdic.Add("1", li)
Case "10"
Dim index As Integer
Dim actionlencun As Integer = li(actionlen) - 1
For i = 0 To actionlencun
index = (actionlencun - i) * 8 + actionlen
If li(index + 1) = 6 AndAlso li(index + 2) = addr AndAlso li(index + 3) = devloop AndAlso li(index + 4) = 0 AndAlso
li(index + 5) = 3 AndAlso li(index + 6) = 0 AndAlso li(index + 7) = 0 AndAlso li(index + 8) = 1 Then
li(actionlen) = li(actionlen) - 1
li.RemoveAt(index + 8)
li.RemoveAt(index + 7)
li.RemoveAt(index + 6)
li.RemoveAt(index + 5)
li.RemoveAt(index + 4)
li.RemoveAt(index + 3)
li.RemoveAt(index + 2)
li.RemoveAt(index + 1)
End If
Next
Dim li1(li.Count - 1), li2(li.Count - 1) As Byte
Dim arrli1 arrli2 As List(Of Byte)
arrli1 = New List(Of Byte)
arrli2 = New List(Of Byte)
Array.Copy(li.ToArray, li2, li.Count - 1)
Array.Copy(li.ToArray, li1, li.Count - 1)
Dim clause() As Byte = GetConditionDataUnderConditionGroup("1224996691906658304")
Dim libufb() As Byte = li.ToArray
Array.Copy(clause, 0, libufb, 9, 8)
li.Clear()
li.AddRange(libufb)
li(3) = 1
li(actionlen) = li(actionlen) + 4
li.AddRange({4, 0, 9, 0, 1, 0, 0, 1})
li.AddRange({4, 0, 9, 0, 2, 0, 10, 2})
li.AddRange({21, 1, 1, 0, 19, 24, 0, 1})
Dim loopBuf() As Byte = BitConverter.GetBytes(CShort(devloop))
li.AddRange({6, addr, devloop, 0, 14, 0, 1, 2})
resulrdic.Add("1", li)
clause = GetConditionDataUnderConditionGroup("1224996691369787392")
Array.Copy(clause, 0, li1, 9, 8)
arrli1.Clear()
arrli1.AddRange(li1)
arrli1(3) = 2
arrli1(actionlen) = arrli1(actionlen) + 3
arrli1.AddRange({4, 0, 6, 0, 1, 0, 0, 1})
arrli1.AddRange({21, 1, 1, 0, 19, 18, 0, 2})
' arrli1.AddRange({6, addr, devloop, 0, 14, 0, 1, 2})
arrli1.AddRange({6, addr, devloop, 0, 3, 0, 0, 1})
resulrdic.Add("2", arrli1)
clause = GetConditionDataUnderConditionGroup("1224996690831867904")
Array.Copy(clause, 0, li2, 9, 8)
arrli2.Clear()
arrli2.AddRange(li2)
arrli2(3) = 3
arrli2(actionlen) = arrli2(actionlen) + 3
arrli2.AddRange({4, 0, 6, 0, 2, 0, 0, 1})
arrli2.AddRange({21, 1, 1, 0, 19, 19, 0, 2})
arrli2.AddRange({6, addr, devloop, 0, 2, 0, 0, 1})
resulrdic.Add("3", arrli2)
'40901001
'40902001
'21 1 1 0 19 24 0 2
'3 0 1 0 14 0 0 1
Case Else
Return resulrdic
End Select
Return resulrdic
End Function
Public Function ParallelScenario(number As String, ByRef DeviceModuleDic As Dictionary(Of String DeviceModel), SwitchConfig As List(Of TableRowTag)) As List(Of Byte())
Dim li As New List(Of Byte())
'获取行号
Dim Nr As Integer = 0
For r = 7 To _grd.Rows - 1
If _grd.Cell(r, 3).Text.Equals(number) Then
Nr = r
Exit For
End If
Next
If Nr < 7 Then Return li
'模型的设备类型
Dim rowtag As TableRowTag = SwitchConfig.Item(Nr - TableRowNumber.Max)
'Console.WriteLine("ParallelScenario 3123")
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, rowtag.G_DevModeName, rowtag.G_DevNodeName)
li.Add({devType})
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, rowtag.G_DevModeName, rowtag.G_DevNodeName)
li.Add({devAddr})
'回路地址
Dim devLoop() As Byte = BitConverter.GetBytes(CShort(rowtag.G_DevNodeIndex))
li.Add(devLoop)
'场景编号
Dim sceneIndex As UShort = CUShort(rowtag.G_DicRow.Item(TableColNumber.SceneID))
Dim sceneNum() As Byte = BitConverter.GetBytes(sceneIndex)
li.Add(sceneNum)
Return li
End Function
Public Function AdditionalFeedbackLamp(number As String ByRef DeviceModuleDic As Dictionary(Of String DeviceModel), celltag As Dictionary(Of String, String)) As List(Of Byte())
Dim li As New List(Of Byte())
'获取行号
Dim Nr As Integer
For r = 7 To _grd.Rows - 1
Console.WriteLine(_grd.Cell(r, 3).Text)
If _grd.Cell(r, 3).Text.Equals(number) Then
Nr = r
Exit For
End If
Next
If Nr = 0 Then Return Nothing
'获取设备名
Dim devname As String = GetgrdRange(Nr, 1 tabRange.devname)
'获取设备名对应反馈灯列
Dim tabledev As CtabRange = GetCoLDevNametabRange(devname, TableRowNumber.DeviceName)
tabledev = GetCoLDevNametabRange("DO", TableRowNumber.FunctionName, tabledev.fc)
'行遍历反馈灯列动作
For col = tabledev.fc To tabledev.lc
If String.IsNullOrEmpty(_grd.Cell(Nr, col).Text) Then
Continue For
Else
Dim databuff = GetActionDatagather(DeviceModuleDic, devname, "DO" _grd.Cell(TableRowNumber.FunctionChildNodeID, col).Text _grd.Cell(Nr, col).Text, celltag)
li.AddRange(databuff.ToArray)
End If
Next
Return li
End Function
Private Function TempDeviceObject(ByRef Eventnumber As Integer, DeviceModuleDic As Dictionary(Of String DeviceModel) DevName As String, DevNodeName As String) As List(Of Byte())
'返回变量
Dim result As New List(Of Byte())
Dim ncbuf As New List(Of Byte())
Dim bytedic As New Dictionary(Of Integer, List(Of Byte()))
'编译固定参书
Dim cmd As Byte = &H4
'模型的设备类型
'Console.WriteLine("TempDeviceObject 3180")
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, DevName, DevNodeName)
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevName, DevNodeName)
'回路地址
Dim devLoop() As Byte = BitConverter.GetBytes(CShort(1))
'获取场景属性
'Dim Exbuf() As String = rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Split(",")
'事件编号
Dim strEventNum As UShort = 1
UShort.TryParse(1, strEventNum)
Dim eventNum() As Byte = BitConverter.GetBytes(strEventNum)
'执行条件编译数据
Dim clause() As Byte = GetConditionDataUnderConditionGroup(1152921504606846976)
'取执行模式
Dim condition As Byte = GetExecModeDataUnderCondtion(1)
'事件条件别名
Dim aliasbuf(31) As Byte
'场景编号
Dim sceneIndex As UShort
Dim sceneNum() As Byte
'30位保留字段
Dim keepBuf(31) As Byte
'保留字段(32字节) -> 2022-05-28 V3.1 32bytes
Dim keepParam(31) As Byte
Dim Dev As DeviceModel = DeviceModuleDic.Item(DevName)
'Dim Startname() As String = Dev.Desc.ProtocolData.Split(",")
Dim dic As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(Dev.Desc.ProtocolData)
If Not AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.红外转发, 1, dic) AndAlso
Not AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.风低, 3, dic) AndAlso
Not AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.冷阈开, 1, dic) AndAlso
Not AddPeripherals.CheckWhetherTheKeyExists2(dic) AndAlso
Not AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.互锁, 1, dic) Then
MsgBox($"无法识别温控类型,编译失败!!")
Return Nothing
End If
'判断所关联回路的回路设备存在
For Each index In dic
If String.IsNullOrEmpty(index.Value.Trim) Then Continue For
Dim Obuf() As String = index.Value.Trim.Split("*") '开
If Not DeviceModuleDic.ContainsKey(Obuf(0)) Then
MsgBox($"设备:{DevName}{vbCrLf }事件:{index.Key }{vbCrLf } 关联继电器回路:{index.Value}{vbCrLf }未找到,编译失败!!")
Return Nothing
End If
Next
Dim temptype As Integer = -1
' 判断是否是氟机 是则直接组包
If AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.红外转发, 1, dic) AndAlso Not AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.风低, 3, dic) Then
temptype = 0
Else '不是氟机
If AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.冷阈开, 4, dic) Then '双阈三线
temptype = 4
ElseIf AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.冷阈开, 1, dic) AndAlso
AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.热阈开, 1, dic) Then '双阈2线
temptype = 3
ElseIf AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.冷阈开, 1, dic) AndAlso
AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.冷阈关, 1, dic) Then '单阈三线
temptype = 2
ElseIf AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.冷阈开, 1, dic) Then '单阈2线
temptype = 1
ElseIf AddPeripherals.CheckWhetherTheKeyExists2(dic) Then
temptype = 5
ElseIf AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.风低, 3, dic) Then '单阈2线
temptype = 6
ElseIf AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.互锁, 1, dic) Then '单阈2线
temptype = 7
End If
End If
Dim Dbuf() As String
Eventnumber = Eventnumber + 1
For i = 1 To 11
clause = GetConditionDataUnderConditionGroup(1152939096792891392)
sceneIndex = CUShort(Eventnumber)
sceneNum = BitConverter.GetBytes(sceneIndex)
ncbuf.Clear()
Select Case i
Case 1 '开机
UShort.TryParse(32800, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Dbuf = dic.Item(GetDescriptionOriginal(AddPeripherals.Temproweven.红外转发)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "INFRARED_FORWARD", Dbuf(1), "0,1,1"))
Case 1
Case 2
Case 3
Case 5
'Continue For
Case 4
Case 6
End Select
If temptype <> 0 AndAlso AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.红外转发, 1, dic) Then
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.红外转发)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "INFRARED_FORWARD", Dbuf(1), "0,1,1"))
End If
If AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.互锁, 1, dic) Then
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.互锁)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "Temp", Dbuf(1), "0,1,1,1,1,1,16"))
End If
If checkbuf(1).Equals("1") Then
'Dbuf = dic.Item(GetDescriptionOriginal( AddPeripherals.Temproweven.互锁)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, hostname, "MUSIC", 1, "0,2,3,1,11,0"))
End If
If checkbuf(3).Equals("1") Then
ncbuf.Add(GetActionData(DeviceModuleDic, DevName, "Temp", 1, "0,2,0,2,1,0,0"))
Else
ncbuf.Add(GetActionData(DeviceModuleDic, DevName, "Temp", 1, "0,2,0,2,2,0,0"))
End If
Case 2 '关机
UShort.TryParse(32, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If temptype <> 0 AndAlso AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.红外转发, 1, dic) Then
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.红外转发)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "INFRARED_FORWARD", Dbuf(1), "0,1,1"))
End If
Select Case temptype
Case 0
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.红外转发)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "INFRARED_FORWARD", Dbuf(1), "0,1,1"))
Case 1
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 2
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 3
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 4
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 6
Case 5
'Continue For
End Select
If AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.风低, 3, dic) Then '单阈2线
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风低)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风中)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风高)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
End If
If AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.互锁, 1, dic) Then
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.互锁)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "Temp", Dbuf(1), "0,1,1,1,1,1,16"))
End If
If checkbuf(1).Equals("1") Then
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.互锁)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, hostname, "MUSIC", 1, "0,2,3,1,12,0"))
End If
If checkbuf(3).Equals("1") Then
ncbuf.Add(GetActionData(DeviceModuleDic, DevName, "Temp", 1, "0,2,0,2,1,0,0"))
Else
ncbuf.Add(GetActionData(DeviceModuleDic, DevName, "Temp", 1, "0,2,0,2,2,0,0"))
End If
Case 3 '冷阀开
UShort.TryParse(1028, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 6
Case 1
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 2
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 3
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 4
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 5
Continue For
End Select
Case 4 '冷阀关
UShort.TryParse(4, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 6
Case 1
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 2
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 3
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 4
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 5
Continue For
End Select
Case 5 '热阀开
UShort.TryParse(768, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 1
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 2
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 3
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 4
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 6
Case 5
Continue For
End Select
Case 6 '热阀关
UShort.TryParse(256, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 1
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 2
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 3
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 4
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.热阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈开)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.冷阈关)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 6
Case 5
Continue For
End Select
Case 7 '风速停
UShort.TryParse(8, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 5, 7
Continue For
Case Else
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风低)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风中)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风高)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
End Select
Case 8 '风速低
UShort.TryParse(2056, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 5, 7
Continue For
Case Else
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风低)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风中)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风高)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
End Select
Case 9 '风速中
UShort.TryParse(4104, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 5, 7
Continue For
Case Else
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风低)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风中)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风高)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
End Select
Case 10 '风速高
UShort.TryParse(6152, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152939096792891424)
End If
Select Case temptype
Case 0
Case 5, 7
Continue For
Case Else
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风低)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风中)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.风高)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
End Select
Case 11 '控制
UShort.TryParse(30, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152921504606847008)
End If
Select Case temptype
Case 0
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.红外转发)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "INFRARED_FORWARD", Dbuf(1), "0,1,1"))
Case 5
'Continue For
Case Else
End Select
If temptype <> 0 AndAlso AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.红外转发, 1, dic) Then
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.红外转发)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "INFRARED_FORWARD", Dbuf(1), "0,1,1"))
End If
If AddPeripherals.CheckWhetherTheKeyExists(AddPeripherals.Temproweven.互锁, 1, dic) Then
Dbuf = dic.Item(GetDescriptionOriginalAddPeripherals.Temproweven.互锁)).Trim.Split("*")
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), "Temp", Dbuf(1), "0,1,1,1,1,1,16"))
End If
End Select
If ncbuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(devType) '设备类型
li.Add(devAddr) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(devLoop) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(sceneNum) '2字节场景编号 2
Eventnumber = Eventnumber + 1
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = ncbuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
' Console.WriteLine($"UDP收到的数据{ByteToString(li.ToArray)}")
End If
Next
Return result
End Function
Private Function Virtual_CardFillDeviceObject(ByRef Eventnumber As Integer, DeviceModuleDic As Dictionary(Of String DeviceModel) DevName As String, DevNodeName As String) As List(Of Byte())
'返回变量
Dim result As New List(Of Byte())
Dim ncbuf As New List(Of Byte())
'编译固定参书
Dim cmd As Byte = &H4
'模型的设备类型
'Console.WriteLine("CURTAINFillDeviceObject 3615")
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, DevName, DevNodeName)
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevName, DevNodeName)
'回路地址
Dim devLoop() As Byte = BitConverter.GetBytes(CShort(1))
'获取场景属性
'Dim Exbuf() As String = rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Split(",")
'事件编号
Dim strEventNum As UShort = 1
'执行条件编译数据
Dim clause() As Byte = GetConditionDataUnderConditionGroup(0)
'取执行模式
Dim condition As Byte = GetExecModeDataUnderCondtion(1)
'事件条件别名
Dim aliasbuf(31) As Byte
'场景编号
Dim sceneIndex As UShort
Dim sceneNum() As Byte
'30位保留字段
Dim keepBuf(31) As Byte
'保留字段(32字节) -> 2022-05-28 V3.1 32bytes
Dim keepParam(31) As Byte
Dim Dev As DeviceModel = DeviceModuleDic.Item(DevName)
Eventnumber = Eventnumber + 1
For i = 1 To 2
UShort.TryParse(i, strEventNum)
Dim eventNum() As Byte = BitConverter.GetBytes(strEventNum)
sceneIndex = CUShort(Eventnumber)
sceneNum = BitConverter.GetBytes(sceneIndex)
ncbuf.Clear()
ncbuf.Add(GetActionData(DeviceModuleDic, hostname, "HOSTSERVICE", 1, i))
If ncbuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(devType) '设备类型
li.Add(devAddr) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(devLoop) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(sceneNum) '2字节场景编号 2
Eventnumber = Eventnumber + 1
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = ncbuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
' Console.WriteLine($"UDP收到的数据{ByteToString(li.ToArray)}")
End If
Next
Return result
End Function
Private Function DRY_NoCardFillDeviceObject(ByRef Eventnumber As Integer, DeviceModuleDic As Dictionary(Of String DeviceModel) DevName As String, DevNodeName As String) As List(Of Byte())
'返回变量
Dim result As New List(Of Byte())
Dim ncbuf As New List(Of Byte())
'编译固定参书
Dim cmd As Byte = &H4
'模型的设备类型
'Console.WriteLine("CURTAINFillDeviceObject 3615")
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, DevName, DevNodeName)
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevName, DevNodeName)
'回路地址
Dim devLoop() As Byte = BitConverter.GetBytes(CShort(1))
'获取场景属性
'Dim Exbuf() As String = rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Split(",")
'事件编号
Dim strEventNum As UShort = 1
UShort.TryParse(1, strEventNum)
Dim eventNum() As Byte = BitConverter.GetBytes(strEventNum)
'执行条件编译数据
Dim clause() As Byte = GetConditionDataUnderConditionGroup(0)
'取执行模式
Dim condition As Byte = GetExecModeDataUnderCondtion(1)
'事件条件别名
Dim aliasbuf(31) As Byte
'场景编号
Dim sceneIndex As UShort
Dim sceneNum() As Byte
'30位保留字段
Dim keepBuf(31) As Byte
'保留字段(32字节) -> 2022-05-28 V3.1 32bytes
Dim keepParam(31) As Byte
Dim Dev As DeviceModel = DeviceModuleDic.Item(DevName)
Eventnumber = Eventnumber + 1
For i = 1 To 1
sceneIndex = CUShort(Eventnumber)
sceneNum = BitConverter.GetBytes(sceneIndex)
ncbuf.Clear()
ncbuf.Add(GetActionData(DeviceModuleDic, hostname, "HOSTSERVICE", 1, "2"))
If ncbuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(devType) '设备类型
li.Add(devAddr) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(devLoop) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(sceneNum) '2字节场景编号 2
Eventnumber = Eventnumber + 1
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = ncbuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
' Console.WriteLine($"UDP收到的数据{ByteToString(li.ToArray)}")
End If
Next
Return result
End Function
Private Function Dev_ColorTempFillDeviceObject(ByRef Eventnumber As Integer, DeviceModuleDic As Dictionary(Of String DeviceModel) DevName As String, DevNodeName As String) As List(Of Byte())
'返回变量
Dim result As New List(Of Byte())
Dim ncbuf As New List(Of Byte())
'编译固定参书
Dim cmd As Byte = &HA
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevName, DevNodeName)
Dim cvint As Integer = 0
Dim Dev As DeviceModel = DeviceModuleDic.Item(DevName)
Integer.TryParse(Dev.Desc.DevDescription, cvint)
Dim li As New List(Of Byte)
li.Add(cmd)
li.Add(devAddr)
li.Add(cvint)
For Each node In Dev.Nodes
If node.Name.Equals("Dev_ColorTemp") Then
For i = 1 To cvint
Dim spbuf() As String = Nothing
If Not String.IsNullOrEmpty(node.Nodes(i - 1).DefaultAliasName) Then
spbuf = node.Nodes(i - 1).DefaultAliasName.Split(",")
spbuf = spbuf(1).Split(":")
Dim typem As Integer = 0
Integer.TryParse(spbuf0, typem)
li.Add(typem)
Dim vli As List(Of List(Of String) = JsonConvert.DeserializeObject(Of List(Of List(Of String))(node.Nodes(i - 1).Description)
For Each linode In vli
li.Add(CInt(linode3))
li.Add(CInt(linode1))
li.Add(CInt(linode2))
Next
If vli.Count < 5 Then
Dim licount As Integer = ((5 - vli.Count * 3) - 1
Dim testbuf(licount) As Byte
li.AddRange(testbuf)
End If
Else
Continue For
End If
Next
End If
Next
result.Add(li.ToArray)
Return result
End Function
Public Shared Function GetDescriptionOriginal(ByVal this As [Enum]) As String
Dim name = this.ToString()
Dim field = this.[GetType]().GetField(name)
If field Is Nothing Then Return name
Dim att = System.Attribute.GetCustomAttribute(field, GetType(DescriptionAttribute), False)
Return If(att Is Nothing, field.Name, (CType(att, DescriptionAttribute)).Description)
End Function
Private Function CURTAINFillDeviceObject(ByRef Eventnumber As Integer, DeviceModuleDic As Dictionary(Of String DeviceModel) DevName As String, DevNodeName As String) As List(Of Byte())
'返回变量
Dim result As New List(Of Byte())
Dim ncbuf As New List(Of Byte())
'编译固定参书
Dim cmd As Byte = &H4
'模型的设备类型
Console.WriteLine("CURTAINFillDeviceObject 3615")
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, DevName, DevNodeName)
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevName, DevNodeName)
'回路地址
Dim devLoop() As Byte = BitConverter.GetBytes(CShort(1))
'获取场景属性
'Dim Exbuf() As String = rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Split(",")
'事件编号
Dim strEventNum As UShort = 1
UShort.TryParse(1, strEventNum)
Dim eventNum() As Byte = BitConverter.GetBytes(strEventNum)
'执行条件编译数据
Dim clause() As Byte = GetConditionDataUnderConditionGroup(0)
'取执行模式
Dim condition As Byte = GetExecModeDataUnderCondtion(1)
'事件条件别名
Dim aliasbuf(31) As Byte
'场景编号
Dim sceneIndex As UShort
Dim sceneNum() As Byte
'30位保留字段
Dim keepBuf(31) As Byte
'保留字段(32字节) -> 2022-05-28 V3.1 32bytes
Dim keepParam(31) As Byte
Dim Dev As DeviceModel = DeviceModuleDic.Item(DevName)
Dim Startname() As String = Dev.Desc.ProtocolData.Split(",")
If Startname.Length < 2 Then Return Nothing
Dim Obuf() As String = Startname(0).Split("*") '开
Dim Dbuf() As String = Startname(1).Split("*") '关
If Not DeviceModuleDic.ContainsKey(Obuf(0)) Then
MsgBox($"{DevName} 干接点窗帘开继电器回路未找到!!")
Return Nothing
ElseIf Not DeviceModuleDic.ContainsKey(Dbuf(0)) Then
MsgBox($"{DevName} 干接点窗帘关继电器回路未找到!!")
Return Nothing
End If
Eventnumber = Eventnumber + 1
For i = 1 To 3
sceneIndex = CUShort(Eventnumber)
sceneNum = BitConverter.GetBytes(sceneIndex)
ncbuf.Clear()
Select Case i
Case 1 '窗帘开
UShort.TryParse(1, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Obuf(0), Obuf(2), Obuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Obuf(0), Obuf(2), Obuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString, CInt(Obuf(3)) 2))
ncbuf.Add(GetActionData(DeviceModuleDic, DevName, DevNodeName, 1, "0,2,3"))
Case 2
UShort.TryParse(2, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Obuf(0), Obuf(2), Obuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString, CInt(Dbuf(3)) 2))
ncbuf.Add(GetActionData(DeviceModuleDic, DevName, DevNodeName, 1, "0,2,3"))
Case 3
UShort.TryParse(6, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Obuf(0), Obuf(2), Obuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0), Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
' ncbuf.Add(GetActionData(DeviceModuleDic, Dbuf(0),Dbuf(2), Dbuf(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString, CInt(Dbuf(2)) 2))
ncbuf.Add(GetActionData(DeviceModuleDic, DevName, DevNodeName, 1, "0,2,3"))
End Select
If ncbuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(devType) '设备类型
li.Add(devAddr) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(devLoop) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(sceneNum) '2字节场景编号 2
Eventnumber = Eventnumber + 1
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = ncbuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
' Console.WriteLine($"UDP收到的数据{ByteToString(li.ToArray)}")
End If
Next
Return result
End Function
Private Function Rs485DeviceObject(Tdevtype As Integer, ByRef Eventnumber As Integer, DeviceModuleDic As Dictionary(Of String DeviceModel) DevName As String, DevNodeName As String) As List(Of Byte())
'返回变量
Dim result As New List(Of Byte())
Dim ncbuf As New List(Of Byte())
'编译固定参书
Dim cmd As Byte = &H4
'模型的设备类型
Console.WriteLine("Rs485DeviceObject 3729")
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, DevName, DevNodeName)
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevName, DevNodeName)
'回路地址
Dim devLoop() As Byte = BitConverter.GetBytes(CShort(1))
'获取场景属性
'Dim Exbuf() As String = rowtag.G_DicRow.Item(TableColNumber.SceneAttribute).Split(",")
'事件编号
Dim strEventNum As UShort = 1
UShort.TryParse(1, strEventNum)
Dim eventNum() As Byte = BitConverter.GetBytes(strEventNum)
'执行条件编译数据
Dim clause() As Byte = GetConditionDataUnderConditionGroup(1152921504606846976)
'取执行模式
Dim condition As Byte = GetExecModeDataUnderCondtion(1)
'事件条件别名
Dim aliasbuf(31) As Byte
'场景编号
Dim sceneIndex As UShort
Dim sceneNum() As Byte
'30位保留字段
Dim keepBuf(31) As Byte
'保留字段(32字节) -> 2022-05-28 V3.1 32bytes
Dim keepParam(31) As Byte
Dim Dev As DeviceModel = DeviceModuleDic.Item(DevName)
If String.IsNullOrEmpty(Dev.Desc.ProtocolData) Then Return Nothing
Dim Startname() As String = Dev.Desc.ProtocolData.Split(",")
If Dev.Desc.ProtocolData.Contains("Floor heating _ Valve open") Then
Dim uvdic As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(Dev.Desc.ProtocolData)
Dim uvlis As New List(Of String)
Select Case Tdevtype
Case 1
If String.IsNullOrEmpty(uvdic.Item("Floor heating _ Valve open")) Then Return Nothing
uvlis.Add(uvdic.Item("Floor heating _ Valve open"))
Case 2
If String.IsNullOrEmpty(uvdic.Item("Floor heating _ Valve open")) And String.IsNullOrEmpty(uvdic.Item("Floor heating _ Valve open")) And String.IsNullOrEmpty(uvdic.Item("Floor heating _ Valve open")) Then Return Nothing
uvlis.Add(uvdic.Item("Fresh wind _ Low wind speed"))
uvlis.Add(uvdic.Item("Fresh wind _ Wind speed"))
uvlis.Add(uvdic.Item("Fresh wind _ High wind speed"))
End Select
Startname = uvlis.ToArray
End If
Dim Rli As New List(Of String())
For i = 0 To Startname.Length - 1
Dim Obuf() As String = Startname(i).Split("*") '开
If Not DeviceModuleDic.ContainsKey(Obuf(0)) Then
If Tdevtype = 1 Then
MsgBox($" Floor heating valve open relay circuit not found")
Return Nothing
Else
Select Case i
Case 1
MsgBox($"Low fresh wind speed relay circuit not found")
Case 2
MsgBox($"Relay circuit not found in fresh wind speed")
Case 3
MsgBox($"High fresh wind speed Relay circuit not found")
End Select
Return Nothing
End If
Return Nothing
Else
Rli.Add(Obuf)
End If
Next
Eventnumber = Eventnumber + 1
Dim checkbuf() As String = Dev.Desc.DevDescription.Split(",")
If checkbuf(0).Equals("1") Then
clause = GetConditionDataUnderConditionGroup(1152921504606847008)
End If
Select Case Tdevtype
Case 1
For i = 1 To 2
sceneIndex = CUShort(Eventnumber)
sceneNum = BitConverter.GetBytes(sceneIndex)
ncbuf.Clear()
Select Case i
Case 1
UShort.TryParse(256, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(0)(0), Rli.Item(0)(2), Rli.Item(0)(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
Case 2
UShort.TryParse(0, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(0)(0), Rli.Item(0)(2), Rli.Item(0)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
End Select
If ncbuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(devType) '设备类型
li.Add(devAddr) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(devLoop) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(sceneNum) '2字节场景编号 2
Eventnumber = Eventnumber + 1
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = ncbuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
' Console.WriteLine($"UDP收到的数据{ByteToString(li.ToArray)}")
End If
Next
Case 2
For i = 1 To 4
sceneIndex = CUShort(Eventnumber)
sceneNum = BitConverter.GetBytes(sceneIndex)
ncbuf.Clear()
Select Case i
Case 1 '窗帘开
UShort.TryParse(0, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(0)(0), Rli.Item(0)(2), Rli.Item(0)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(1)(0), Rli.Item(1)(2), Rli.Item(1)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(2)(0), Rli.Item(2)(2), Rli.Item(2)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 2
UShort.TryParse(769, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(0)(0), Rli.Item(0)(2), Rli.Item(0)(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(1)(0), Rli.Item(1)(2), Rli.Item(1)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(2)(0), Rli.Item(2)(2), Rli.Item(2)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 3
UShort.TryParse(513, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(0)(0), Rli.Item(0)(2), Rli.Item(0)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(1)(0), Rli.Item(1)(2), Rli.Item(1)(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(2)(0), Rli.Item(2)(2), Rli.Item(2)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
Case 4
UShort.TryParse(257, strEventNum)
eventNum = BitConverter.GetBytes(strEventNum)
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(0)(0), Rli.Item(0)(2), Rli.Item(0)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(1)(0), Rli.Item(1)(2), Rli.Item(1)(1), Chr(TableColSwitchKeyDate.TurnDrown).ToString))
ncbuf.Add(GetActionData(DeviceModuleDic, Rli.Item(2)(0), Rli.Item(2)(2), Rli.Item(2)(1), Chr(TableColSwitchKeyDate.TurnOn).ToString))
End Select
If ncbuf.Count > 0 Then
Dim li As New List(Of Byte)
li.Add(cmd) '命令参数
li.Add(devType) '设备类型
li.Add(devAddr) '设备地址
li.AddRange(BitConverter.GetBytes(_actionIndex)) '动作编号 2
_actionIndex += 1
li.AddRange(devLoop) '设备回路 2
li.AddRange(eventNum) '添加事件编号 2
li.AddRange(clause) '获取执行模式 8
li.AddRange(keepParam) '条件保留32Byte 32
li.Add(condition) '获取执行条件编译数据 1
li.AddRange(aliasbuf) '32字节事件条件别名 2022-06-07 caocong 32
li.AddRange(sceneNum) '2字节场景编号 2
Eventnumber = Eventnumber + 1
li.AddRange(keepBuf) '30位保留字段 32
Dim valCount As UShort = ncbuf.Count
li.Add(valCount) '获取执行动作数量 2
For Each buf In ncbuf '32
li.AddRange(buf) '获取动作数据
Next
result.Add(li.ToArray)
' Console.WriteLine($"UDP收到的数据{ByteToString(li.ToArray)}")
End If
Next
End Select
Return result
End Function
Private Function GetActionDeviceType(DeviceModuleDic As Dictionary(Of String DeviceModel) DevName As String, DevNodeName As String) As Byte
Dim Dev As DeviceModel
Dev = DeviceModuleDic.Item(DevName)
If DevName.Equals(hostname) Then
For Each index In Dev.Config
If index.Name.Equals($"{DevNodeName } device group information") Then
For Each node In index.Attributes
If node.Name.Equals("DeviceType") Then
Return CInt(node.DataDefault)
End If
Next
End If
Next
Else
For Each index In Dev.Nodes
If index.Name.Equals($"{DevNodeName}") Then
Return CInt(index.DEV_TYPE_DATA)
End If
Next
End If
End Function
Private Function GetActionDeviceAddr(DeviceModuleDic As Dictionary(Of String DeviceModel), DevName As String, DevNodeName As String) As Byte
Dim Dev As DeviceModel = DeviceModuleDic.Item(DevName)
For Each index In Dev.Config
If DevName.Equals(hostname) Then
If index.Name.Equals($"{DevNodeName } device group information") Then
For Each node In index.Attributes
If node.Name.Equals("DeviceAddr") Then
Return CInt(node.DataDefault)
End If
Next
End If
Else
If index.Name.Equals($Device present) Then
For Each node In index.Attributes
If node.Name.Equals("Dialing address") Then
Return CInt(node.Value)
End If
Next
End If
End If
Next
End Function
Private Function GetConditionDataUnderConditionGroup(u64 As String) As Byte()
'Dim result As New List(Of Byte
'For i = 1 To 8
' result.Add(0)
'Next
'If pNode.RowType <> RowNode.RowTypeEnum.DeviceEventAllConditions Then Throw New Exception("转换条件时无效的类型")
'Dim a As New ConditionConverter
'For Each node As RowNode In pNode.Nodes
' Select Case node.Name
' Case " 1 动作输出使能"
' a.动作输出使能 = CInt(GetNodeSelectStringValue(node))
' Case " 2 判断房态"
' a.房态 = CInt(GetNodeSelectStringValue(node))
' Case " 3 控制取电服务"
' a.控制取电服务 = CInt(GetNodeSelectStringValue(node))
' Case " 4 判断取电状态"
' a.取电状态 = CInt(GetNodeSelectStringValue(node))
' Case " 5 判断勿扰状态"
' a.勿扰状态 = CInt(GetNodeSelectStringValue(node))
' Case " 6 判断清理状态"
' a.清理状态 = CInt(GetNodeSelectStringValue(node))
' Case " 7 判断呼叫状态"
' a.呼叫状态 = CInt(GetNodeSelectStringValue(node))
' Case " 8 判断洗衣状态"
' a.洗衣状态 = CInt(GetNodeSelectStringValue(node))
' Case " 9 判断退房状态"
' a.退房状态 = CInt(GetNodeSelectStringValue(node))
' Case "10 判断稍后状态"
' a.稍后状态 = CInt(GetNodeSelectStringValue(node))
' Case "11 判断SOS状态"
' a.SOS状态 = CInt(GetNodeSelectStringValue(node))
' ' Case "12 判断预约待租状态"
' Case "12 判断送餐状态"
' a.预约待租状态 = CInt(GetNodeSelectStringValue(node))
' Case "13 判断开锁状态"
' a.开锁状态 = CInt(GetNodeSelectStringValue(node))
' Case "14 判断行李状态"
' a.行李状态 = CInt(GetNodeSelectStringValue(node))
' Case "15 判断保险箱状态"
' a.保险箱状态 = CInt(GetNodeSelectStringValue(node))
' Case "16 判断门磁状态"
' a.门磁状态 = CInt(GetNodeSelectStringValue(node))
' Case "17 判断提示音状态"
' a.提示音状态 = CInt(GetNodeSelectStringValue(node))
' Case "18 判断背光状态"
' a.背光状态 = CInt(GetNodeSelectStringValue(node))
' Case "19 判断季节状态"
' a.季节状态 = CInt(GetNodeSelectStringValue(node))
' Case "20 判断时间状态"
' a.时间状态 = CInt(GetNodeSelectStringValue(node))
' Case "21 判断起夜状态"
' a.起夜状态 = CInt(GetNodeSelectStringValue(node))
' Case "22 判断锁定状态"
' a.锁定状态 = CInt(GetNodeSelectStringValue(node))
' Case Else
' Throw New Exception($"未知条件属性名:{node.Name}")
' End Select
'Next
'Return a.GetConditionData()
Dim num As UInt64 = 0
UInt64.TryParse(u64, num)
Return BitConverter.GetBytes(num)
End Function
''' <summary>
''' 从动作行节点获取动作数据
''' </summary>
''' <param name="node"></param>
''' <returns></returns>
Private Function GetActionDatagather(DeviceModuleDic As Dictionary(Of String DeviceModel), DevModeName As String, colname As String, DeviceLoop As String, textval As String, tagdic As Dictionary(Of String, String), Optional delaytime As Integer = 0 Optional unit As Integer = 1) As List(Of Byte())
' If node.RowType <> RowNode.RowTypeEnum.DeviceEventAction Then Throw New Exception($"行号:{node.RowListIndex},文本:{node.Text}不为动作节点")
If String.IsNullOrEmpty(textval) Then Return Nothing
Dim li As New List(Of Byte())
Dim strbuf() As String = textval.Split(vbLf)
For Each Tnode In strbuf
'执行方式,不同设备类型有不同方式
Dim bolicActio As List(Of Byte()) = GetSymbolicAction(colname, Tnode, tagdic)
If IsNothing(bolicActio) OrElse bolicActio.Count = 0 Then Return Nothing
For Each liindex In bolicActio
Dim buf(7) As Byte
'模型的设备类型
'Console.WriteLine("GetActionDatagather 4053")
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, DevModeName, colname)
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevModeName, colname)
'设备类型,外接设备设备类型(主机特殊处理)
buf(0) = devType
'设备地址,选择对象的设备拨码地址(主机特殊处理)
buf(1) = devAddr
'设备回路,选择对象的回路地址
Dim loopBuf() As Byte = BitConverter.GetBytes(CShort(DeviceLoop))
Array.Copy(loopBuf, 0, buf, 2, loopBuf.Length)
Dim par() As String = Tnode.Split(",")
If par.Length > 1 Then
Integer.TryParse(par(0), delaytime)
Integer.TryParse(par(1), unit)
End If
buf(4) = liindex(0) '执行方式 继电器开关
'执行内容,不同设备类型有不同内容
buf(5) = liindex(1) '执行内容
'延时时间,动作执行延时
buf(6) = delaytime '延时时间
'延时单位,做东执行延时单位
buf(7) = unit '延时单位
'2022-10-31 Momo 打印动作数据
' Dim tmpStr As String = BitConverter.ToString(buf).Replace("-", " ")
' PrintInfo(" [行号:" & node.RowListIndex & "] - " & "> 动作数据:" & tmpStr)
li.Add(buf)
Next
Next
Return li
End Function
Private Function GetActionData(DeviceModuleDic As Dictionary(Of String DeviceModel), DevModeName As String, colname As String, DeviceLoop As String, textval As String, Optional delaytime As Integer = 0 Optional unit As Integer = 1) As Byte()
' If node.RowType <> RowNode.RowTypeEnum.DeviceEventAction Then Throw New Exception($"行号:{node.RowListIndex},文本:{node.Text}不为动作节点")
If String.IsNullOrEmpty(textval) Then Return Nothing
Dim bolicActio As List(Of Byte()) = GetSymbolicAction(colname, textval, Nothing)
If IsNothing(bolicActio) OrElse bolicActio.Count = 0 Then Return Nothing
Dim buf(7) As Byte
'模型的设备类型
Dim devType As Byte = GetActionDeviceType(DeviceModuleDic, DevModeName, colname)
'模型的拨码地址
Dim devAddr As Byte = GetActionDeviceAddr(DeviceModuleDic, DevModeName, colname)
'设备类型,外接设备设备类型(主机特殊处理)
buf(0) = devType
'设备地址,选择对象的设备拨码地址(主机特殊处理)
buf(1) = devAddr
'设备回路,选择对象的回路地址
Dim loopBuf() As Byte = BitConverter.GetBytes(CShort(DeviceLoop))
Array.Copy(loopBuf, 0, buf, 2, loopBuf.Length)
Dim par() As String = textval.Split(",")
If par.Length > 1 Then
Integer.TryParse(par(0), delaytime)
Integer.TryParse(par(1), unit)
End If
'执行方式,不同设备类型有不同方式
buf(4) = bolicActio(0)(0) '执行方式 继电器开关
'执行内容,不同设备类型有不同内容
buf(5) = bolicActio(0)(1) '执行内容
'延时时间,动作执行延时
buf(6) = delaytime '延时时间
'延时单位,做东执行延时单位
buf(7) = unit '延时单位
'2022-10-31 Momo 打印动作数据
' Dim tmpStr As String = BitConverter.ToString(buf).Replace("-", " ")
' PrintInfo(" [行号:" & node.RowListIndex & "] - " & "> 动作数据:" & tmpStr)
Return buf
End Function
Public Function GetSymbolicAction(modetyupe As String, straction As String, defkey As Dictionary(Of String, String)) As List(Of Byte())
Dim result(1) As Byte
Dim Tresult(1) As Byte
Dim li As New List(Of Byte())
Dim parstr() As String = straction.Split(",")
Dim parCasre As String = String.Empty
If IsNothing(parstr) OrElse parstr.Length = 0 Then Return Nothing
Dim strli As New List(Of String)
strli.AddRange(parstr)
If strli.Item(strli.Count - 1).Contains("*") Then
strli.RemoveAt(strli.Count - 1)
parstr = strli.ToArray
End If
Select Case modetyupe
Case "RKEY"
If parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 0 Then result(1) = parstr(3)
li.Add(result)
End If
Case "RELAY", "PB_RELAY_DEVICE"
If parstr.Length = 1 Then
parCasre = parstr(0) '快速设置
Select Case parCasre
Case Chr(TableColSwitchKeyDate.TurnOn).ToString
result(0) = 1
Case Chr(TableColSwitchKeyDate.TurnDrown).ToString
result(0) = 2
'Case Chr(TableColSwitchKeyDate.OnTodrowm).ToString
' result(0) = 3
'Case Chr(TableColSwitchKeyDate.drowmToOn).ToString
' result(0) = 1
Case Else
Return Nothing
End Select
ElseIf parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
Else
Return Nothing
End If
li.Add(result)
Case "Dimming"
Dim strint As Integer = 0
If Not IsNothing(defkey) Then
If defkey.ContainsKey("Dimming".ToUpper) Then
Dim rbuf() As String = defkey.Item("Dimming".ToUpper).Split(" ")
If Not IsNothing(rbuf) Then
Integer.TryParse(rbuf(0), strint)
Integer.TryParse(rbuf(0), parstr(2))
End If
End If
End If
If parstr.Length = 1 Then
Dim dimmval As Integer = 0
If straction.Equals(Chr(TableColSwitchKeyDate.TurnOn).ToString) Then
straction = 80
ElseIf straction.Equals(Chr(TableColSwitchKeyDate.TurnDrown).ToString) Then
straction = 0
End If
Integer.TryParse(straction, dimmval)
result(1) = dimmval
If strint = 0 Then
If dimmval = 0 Then
strint = 2
Else
strint = 1
End If
End If
result(0) = strint
ElseIf parstr.Length > 2 Then '高级设置
' result(0) = parstr(2)
If (parstr.Count - 2) > 1 Then
result(1) = parstr(3)
'If strint = 0 Then
' If result(1) = 0 Then
' strint = 2
' Else
' strint = 1
' End If
'End If
result(0) = parstr(2)
End If
Else
Return Nothing
End If
li.Add(result)
Case "PB_LINE_CONTROL", "PB_STRIP_DEVICE", "PB_LED_DEVICE"
Dim strint As Integer = 0
If Not IsNothing(defkey) Then
If defkey.ContainsKey("Dimming".ToUpper) Then
Dim rbuf() As String = defkey.Item("Dimming".ToUpper).Split(" ")
If Not IsNothing(rbuf) Then
Integer.TryParse(rbuf(0), strint)
End If
End If
Select Case strint
Case 7
strint = 30 '主机未支持 2024.5.31
Case 8
strint = 31 '主机未支持 2024.5.31
Case 9
strint = 8
Case 10
strint = 28
Case 11
strint = 29
Case 26
strint = 26
Case 27
strint = 27
Case 28
strint = 32
Case 29
strint = 33
Case Else
strint = 0
End Select
'If defkey.ContainsKey("PB_LINE_CONTROL".ToUpper) Then
' Dim rbuf() As String = defkey.Item("PB_LINE_CONTROL".ToUpper).Split(" ")
' If Not IsNothing(rbuf) Then
' Integer.TryParse(rbuf(0), strint)
' End If
'End If
'If defkey.ContainsKey("PB_STRIP_DEVICE".ToUpper) Then
' Dim rbuf() As String = defkey.Item("PB_STRIP_DEVICE".ToUpper).Split(" ")
' If Not IsNothing(rbuf) Then
' Integer.TryParse(rbuf(0), strint)
' End If
'End If
End If
If parstr.Length = 1 Then
Dim dimmval As Integer = 0
If straction.Equals(Chr(TableColSwitchKeyDate.TurnOn).ToString) Then
result(1) = 1
result(0) = 17
ElseIf straction.Equals(Chr(TableColSwitchKeyDate.TurnDrown).ToString) Then
result(1) = 2
result(0) = 17
Else
Integer.TryParse(straction, dimmval)
result(1) = dimmval
'If strint = 0 Then
' If dimmval = 0 Then
' strint = 2
' Else
' strint = 1
' End If
'End If
result(0) = 18
End If
ElseIf parstr.Length > 2 Then '高级设置
' result(0) = parstr(2)
If (parstr.Count - 2) > 1 Then
result(1) = parstr(3)
'If strint = -1 Then
' If result(1) = 0 Then
' strint = 2
' Else
' strint = 1
' End If
'End If
result(0) = parstr(2)
End If
Else
Return Nothing
End If
li.Add(result)
Case "DO", "LIGHT"
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "open"
result(0) = 1
Case "close"
result(0) = 2
Case "flash"
result(0) = 14
Case "Corresponding scenario"
result(0) = 3
Case Else
Return Nothing
End Select
ElseIf parstr.Length > 2 Then
result(0) = parstr(2)
Else
Return Nothing
End If
li.Add(result)
Case "Temp"
If parstr.Length = 1 Then
parCasre = parstr(0) '快速设置
Select Case parCasre
Case "Open 26 degrees"
Dim sw As Integer = 1 '开关状态
Dim mode As Integer = 0 '模式
Dim speed As Integer = 2 '风速
Dim fm As Integer = 1 '阀门
Dim temp As Integer = 26 '温度
result(1) = fm
result(1) = result(1) Or (speed << 2)
result(1) = result(1) Or (mode << 4)
result(1) = result(1) Or (sw << 6)
result(0) = temp
Case "close"
Dim sw As Integer = 2 '开关状态
Dim mode As Integer = 0 '模式
Dim speed As Integer = 2 '风速
Dim fm As Integer = 1 '阀门
Dim temp As Integer = 26 '温度
result(1) = fm
result(1) = result(1) Or (speed << 2)
result(1) = result(1) Or (mode << 4)
result(1) = result(1) Or (sw << 6)
result(0) = temp
Case Else
Return Nothing
End Select
ElseIf parstr.Length > 6 Then '高级设置
Dim sw As Integer = CInt(parstr(2)) '开关状态
Dim mode As Integer = CInt(parstr(3)) '模式
Dim speed As Integer = CInt(parstr(4)) '风速
Dim fm As Integer = CInt(parstr(5)) '阀门
Dim temp As Integer = CInt(parstr(6)) '温度
result(1) = fm
result(1) = result(1) Or (speed << 2)
result(1) = result(1) Or (mode << 4)
result(1) = result(1) Or (sw << 6)
result(0) = temp
Else
Return Nothing
End If
li.Add(result)
Case "CURTAIN", "DRY_CURTAIN"
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "open"
result(0) = 1
Case "close"
result(0) = 2
Case "stop"
result(0) = 6
Case "intertangent"
result(0) = 4
Case Else
Return Nothing
End Select
ElseIf parstr.Length > 2 Then
result(0) = parstr(2)
Else
Return Nothing
End If
li.Add(result)
Case "RS485_Curtain"
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "open"
result(0) = 1
Case "close"
result(0) = 2
Case "stop"
result(0) = 6
Case "intertangent"
result(0) = 4
Case Else
Return Nothing
End Select
ElseIf parstr.Length > 2 Then
parCasre = parstr(2)
Else
parCasre = String.Empty
End If
li.Add(result)
Case "HOSTSERVICE"
Dim sw As Integer '开关状态
sw = CInt(straction)
result(0) = sw
li.Add(result)
Case "MUSIC"
'If Not IsNothing(defkey) Then
' If defkey.ContainsKey("MUSIC".ToUpper) Then
' Dim rbuf() As String = defkey.Item("Dimming".ToUpper).Split(" ")
' If Not IsNothing(rbuf) Then
' Integer.TryParse(rbuf(0), strint)
' End If
' End If
'End If
Dim dirIndex As Integer = 0 'node.Params(0).ValueData '文件夹索引
Dim modeStatus As Integer = 0 'node.Params(1).ValueData '播放时场景状态
Dim fileIndex As Integer = 0 'node.Params(2).ValueData '文件索引
If straction.Contains("Play prompt sound") AndAlso (straction.Contains("5 Volume +") OrElse straction.Contains("6 Volume -")) Then
parstr(4) = parstr(3)
parstr(3) = parstr(2)
parstr(2) = 0
End If
If straction.Contains("Play music") AndAlso (straction.Contains("1 play") OrElse straction.Contains("2 stop")) Then
parstr4 = 0
End If
Select Case parstr.Count - 3 '延时和延时单位占了数组两个元素
Case 1
dirIndex = parstr(2)
Case 2
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
Case 3
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
fileIndex = parstr4 '文件索引
Case > 3
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
fileIndex = parstr4 '文件索引
Case Else
End Select
'2022-05-06 Caocong: 先将变量初始化为0.有可能没有三个参数 ---end
result(0) = result(0) Or (dirIndex << 0)
result(0) = result(0) Or (modeStatus << 4)
result(1) = fileIndex
li.Add(result)
Case "CLED_FRESHAIR"
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "open"
Tresult(0) = 1
Tresult(1) = 2
li.Add(Tresult)
Case "close"
result(0) = 0
result(1) = 0
li.Add(result)
End Select
ElseIf parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 1 Then result(1) = parstr(3)
li.Add(result)
Else
Return Nothing
End If
Case "CLEDFLOORHEAT"
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "Open 26 degrees"
Tresult(0) = 1
Tresult(1) = 26
li.Add(Tresult)
Case "close"
result(0) = 1
result(1) = 0
li.Add(result)
End Select
ElseIf parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 1 Then result(1) = parstr(3)
li.Add(result)
Else
Return Nothing
End If
Case "485FreshAir"
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "open"
Tresult(0) = 1
Tresult(1) = 1
li.Add(Tresult)
result(0) = 4
result(1) = 2
li.Add(result)
Case "close"
result(0) = 1
result(1) = 0
li.Add(result)
End Select
ElseIf parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 1 Then result(1) = parstr(3)
li.Add(result)
Else
Return Nothing
End If
Case "485FloorHeat" '地暖
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "Open 26 degrees"
Tresult(0) = 1
Tresult(1) = 1
li.Add(Tresult)
result(0) = 3
result(1) = 26
li.Add(result)
Case "close"
result(0) = 1
result(1) = 0
li.Add(result)
End Select
ElseIf parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 1 Then result(1) = parstr(3)
li.Add(result)
Else
Return Nothing
End If
Case "INFRARED_FORWARD"
If parstr.Length = 1 Then
parCasre = parstr(0)
Select Case parCasre
Case "Turn on the TV"
result(0) = 1
result(1) = 18
Case "Turn off the TV"
result(0) = 2
result(1) = 1
Case "Mute"
result(0) = 1
result(1) = 1
Case "volume+"
result(0) = 1
result(1) = 3
Case "volume-"
result(0) = 1
result(1) = 4
Case Else
Return Nothing
End Select
li.Add(result)
ElseIf parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 1 Then result(1) = parstr(3)
li.Add(result)
Else
Return Nothing
End If
Case "DRY_NoCard"
If parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 1 Then result(1) = parstr(3)
li.Add(result)
Else
Return Nothing
End If
Case "Dev_ColorTemp"
If parstr.Length > 2 Then '高级设置
result(0) = parstr(2)
If (parstr.Count - 3) > 1 Then result(1) = parstr(3)
li.Add(result)
Else
Return Nothing
End If
Case "HOPO_Curtain"
If parstr.Length = 4 Then
result(0) = parstr(2)
ElseIf parstr.Length > 4 Then
result(0) = parstr(2)
result(1) = parstr(3)
Else
Return Nothing
End If
li.Add(result)
Case "BLEMUSIC"
Dim dirIndex As Integer = 0 'node.Params(0).ValueData '文件夹索引
Dim modeStatus As Integer = 0 'node.Params(1).ValueData '播放时场景状态
Dim fileIndex As Integer = 0 'node.Params(2).ValueData '文件索引
Select Case parstr.Count - 3 '延时和延时单位占了数组两个元素
Case 1
dirIndex = parstr(2)
result(0) = dirIndex
result(1) = modeStatus
Case 2
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
result(0) = dirIndex
result(1) = modeStatus
Case >= 3
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
fileIndex = parstr4 '文件索引
result(0) = result(0) Or (dirIndex << 0)
result(0) = result(0) Or (modeStatus << 4)
result(1) = fileIndex
Case Else
End Select
'2022-05-06 Caocong: 先将变量初始化为0.有可能没有三个参数 ---end
li.Add(result)
Case "Carbon_Device", "Scene_Restore"
Dim dirIndex As Integer = 0 'node.Params(0).ValueData '文件夹索引
Dim modeStatus As Integer = 0 'node.Params(1).ValueData '播放时场景状态
Dim fileIndex As Integer = 0 'node.Params(2).ValueData '文件索引
Select Case parstr.Count - 3 '延时和延时单位占了数组两个元素
Case 1
dirIndex = parstr(2)
result(0) = dirIndex
result(1) = modeStatus
Case 2
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
result(0) = dirIndex
result(1) = modeStatus
Case >= 3
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
fileIndex = parstr4 '文件索引
result(0) = dirIndex
result(1) = result(1) Or (fileIndex << 0)
result(1) = result(1) Or (modeStatus << 4)
Case Else
End Select
li.Add(result)
Case "485MUSIC"
Dim dirIndex As Integer = 0 'node.Params(0).ValueData '文件夹索引
Dim modeStatus As Integer = 0 'node.Params(1).ValueData '播放时场景状态
Dim fileIndex As Integer = 0 'node.Params(2).ValueData '文件索引
Select Case parstr.Count - 3 '延时和延时单位占了数组两个元素
Case 1
dirIndex = parstr(2)
Case 2
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
Case >= 3
dirIndex = parstr2 '文件夹索引
modeStatus = parstr3 '播放时场景状态
fileIndex = parstr4 '文件索引
Case Else
End Select
'2022-05-06 Caocong: 先将变量初始化为0.有可能没有三个参数 ---end
result(0) = result(0) Or (dirIndex << 0)
result(0) = result(0) Or (modeStatus << 4)
result(1) = fileIndex
li.Add(result)
Case Else
Return Nothing
End Select
Return li
End Function
Private Function GetExecModeDataUnderCondtion(straction As String) As Byte
Dim result As Integer = 1
Integer.TryParse(straction, result)
Return result
End Function
Public Function GetdevGroupHread(devMode As DeviceModel Addrstr As String) As Byte()
Dim buf = New List(Of Byte)
'命令参数
Dim cmd As Byte = &H4
Dim devType As Byte
'模型的拨码地址
Dim devAddr As Byte = Addrstr
Dim DevGroupName = $"DI"
For Each cnode In devMode.Nodes
If cnode.Name.Equals(DevGroupName) Then
devType = cnode.DEV_TYPE_DATA
End If
Next
buf.Add(cmd) '命令参数
buf.Add(devType) '设备类型
buf.Add(devAddr) '设备地址
Return buf.ToArray
End Function
Public Function GetActionGroupHread(devMode As DeviceModel) As Byte()
Dim buf = New List(Of Byte)
'命令参数
Dim cmd As Byte = &H4
Dim devType As Byte
'模型的拨码地址
Dim devAddr As Byte
Dim DevGroupName = $"DI设备组信息"
'模型的设备类型
For Each cnode In devMode.Config
If cnode.Name.Equals(DevGroupName) Then
For Each node In cnode.Attributes
Select Case node.Name
Case "DeviceType"
devType = node.DataDefault
Case "DeviceAddr"
devAddr = node.DataDefault
Case Else
Continue For
End Select
Next
End If
Next
buf.Add(cmd) '命令参数
buf.Add(devType) '设备类型
buf.Add(devAddr) '设备地址
Return buf.ToArray
End Function
'' <summary>
'' 填充设备存在
'' </summary>
'' <returns></returns>
Public Voicement As List(Of DeviceModel)
Public devTempment As List(Of DeviceModel)
Public devRKEY As List(Of DeviceModel)
Public Function FillDeviceExistsData(ByRef DeviceModuleDic As Dictionary(Of String DeviceModel)) As List(Of Byte())
Dim resultDatas As New List(Of Byte())
Dim cmd As Byte = &H3
Dim buf As List(Of Byte)
Dim devmovement As New List(Of DeviceModel)
Dim Heat485ment As New List(Of DeviceModel)
Dim Air485ment As New List(Of DeviceModel)
Dim AirDRYNoCard As New List(Of DeviceModel)
Dim Dev_ColorTemp As New List(Of DeviceModel)
Dim Dev_BLEMUSIC As New List(Of DeviceModel)
Dim VirtualCard As New List(Of DeviceModel)
Voicement = New List(Of DeviceModel)
devTempment = New List(Of DeviceModel)
devRKEY = New List(Of DeviceModel)
For Each Fnode In DeviceModuleDic.Values
' 配置RCU模型设备存在数据
If String.IsNullOrEmpty(Fnode.Desc.DevInterface) Then
buf = New List(Of Byte)
buf.Add(cmd)
Dim tmpBuffer() As Byte = FillRCUModelDeviceExsist(Fnode)
buf.AddRange(tmpBuffer)
resultDatas.Add(buf.ToArray)
'PrintInfo(" 主机模型 编译完成,长度:" & tmpBuffer.Count & " Bytes")
Else
Dim tmpBufferLst As List(Of Byte()) = FillExternalModelDeviceExsist(Fnode, DeviceModuleDic.Values(0))
Dim tmpOutData As Byte()
For i = 0 To tmpBufferLst.Count - 1
tmpOutData = tmpBufferLst(i).ToArray
resultDatas.Add(tmpOutData.ToArray)
Next
End If
For Each Ccnode In Fnode.Config
If Not IsNothing(Ccnode.CFG_Type) AndAlso Ccnode.CFG_Type.Equals("DeviceExists") Then
buf = New List(Of Byte)
Console.WriteLine(Ccnode.Name)
buf.Add(cmd)
Dim tmpBuffer() As Byte = FillModeDeviceExsist(Ccnode, Fnode)
buf.AddRange(tmpBuffer)
resultDatas.Add(buf.ToArray)
'PrintInfo(" 设备存在 编译完成,长度:" & tmpBuffer.Count & " Bytes")
End If
Next
For Each Ccnode In Fnode.Nodes
Select Case Ccnode.Name
Case "RKEY"
If Ccnode.Interface.Equals("DO") Then
devRKEY.Add(Fnode)
End If
Case "BLEMUSIC"
Dev_BLEMUSIC.Add(Fnode)
Case "Dev_ColorTemp"
Dev_ColorTemp.Add(Fnode)
Case "DRY_NoCard"
AirDRYNoCard.Add(Fnode)
Case "Temp"
devTempment.Add(Fnode)
Case "CURTAIN"
devmovement.Add(Fnode)
Case "485FreshAir", "CLED_FRESHAIR"
Air485ment.Add(Fnode)
Case "485FloorHeat", "CLEDFLOORHEAT"
Heat485ment.Add(Fnode)
Case "语音"
Voicement.Add(Fnode)
Case "Virtual_Card"
VirtualCard.Add(Fnode)
Case Else
End Select
Next
Next
Dim T_SceneID As Integer = _SceneID
Dim result As List(Of Byte())
For Each node In devmovement
result = CURTAINFillDeviceObject(T_SceneID, DeviceModuleDic, node.Name, "CURTAIN")
If IsNothing(result) Then Continue For
resultDatas.AddRange(result.ToArray)
Next
For Each node In AirDRYNoCard
result = DRY_NoCardFillDeviceObject(T_SceneID, DeviceModuleDic, node.Name, "DRY_NoCard")
If IsNothing(result) Then Continue For
resultDatas.AddRange(result.ToArray)
Next
For Each node In Dev_ColorTemp
result = Dev_ColorTempFillDeviceObject(T_SceneID, DeviceModuleDic, node.Name, "Dev_ColorTemp")
If IsNothing(result) Then Continue For
resultDatas.AddRange(result.ToArray)
Next
For Each node In VirtualCard
result = Virtual_CardFillDeviceObject(T_SceneID, DeviceModuleDic, node.Name, "Virtual_Card")
If IsNothing(result) Then Continue For
resultDatas.AddRange(result.ToArray)
Next
For Each node In devTempment
result = TempDeviceObject(T_SceneID, DeviceModuleDic, node.Name, "Temp")
If IsNothing(result) Then Continue For
resultDatas.AddRange(result.ToArray)
Next
For Each node In Heat485ment
For Each tname In node.Nodes
Select Case tname.Name
Case "485FloorHeat" "CLEDFLOORHEAT"
result = Rs485DeviceObject(1, T_SceneID, DeviceModuleDic, node.Name, tname.Name)
If IsNothing(result) Then Continue For
resultDatas.AddRange(result.ToArray)
End Select
Next
Next
For Each node In Air485ment
For Each tname In node.Nodes
Select Case tname.Name
Case "485FreshAir", "CLED_FRESHAIR"
result = Rs485DeviceObject(2, T_SceneID, DeviceModuleDic, node.Name, tname.Name)
If IsNothing(result) Then Continue For
resultDatas.AddRange(result.ToArray)
End Select
Next
Next
Return resultDatas
End Function
Public Function VoicementDeviceObject() As List(Of Byte())
Dim cmd As Byte = &H5
Dim lst As New List(Of Byte())
For Each node In Voicement
For Each Cnode In node.Config
If Cnode.CFG_Type.Equals("XiaoBaoCMD") Then
For Each cTnode In Cnode.Attributes
'Console.WriteLine($"cTnode.DataRangeValue:{cTnode.DataRangeValue}")
If Not String.IsNullOrEmpty(cTnode.DataRangeValue) Then
Dim Data = New List(Of Byte)
Data.Add(cmd)
Data.Add(CIntCnode.CFG_Value)
Data.Add(CIntcTnode.DataDefault)
Dim buf As String() = cTnode.DataRangeValue.Split("*")
If buf.Length = 2 Then
Dim devType As Byte = 0
Dim devAddr As Byte = 0
Data.Add(devType)
Data.Add(devAddr)
Data.AddRange(BitConverter.GetBytes(CShort(buf(0))))
lst.Add(Data.ToArray)
ElseIf buf.Length = 3 Then
If cTnode.DataRangeValue.Contains("HOSTSERVICE") Then
Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(1))
Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(1))
Data.Add(devType)
Data.Add(devAddr)
Data.AddRange(BitConverter.GetBytes(CShort(buf(2))))
lst.Add(Data.ToArray)
Else
Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(2))
Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(2))
Data.Add(devType)
Data.Add(devAddr)
Data.AddRange(BitConverter.GetBytes(CShort(buf(1))))
lst.Add(Data.ToArray)
End If
End If
'Select Case Cnode.Name
' Case "0 场景"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = 0
' Dim devAddr As Byte = 0
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(0))))
' Case "1 继电器"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(2))
' Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(2))
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(1))))
' Case "4 服务信息"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(1))
' Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(1))
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(2))))
' Case "5 窗帘"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(2))
' Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(2))
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(1))))
' Case "7 空调"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), "Temp")
' Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), "Temp")
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(1))))
' Case "15 电视"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(2))
' Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(2))
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(1))))
' Case "16 调光"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(2))
' Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(2))
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(1))))
' Case "18 灯带"
' Dim buf As String() = cTnode.DataRangeValue.Split("*")
' Dim devType As Byte = GetActionDeviceType(Dic_Devicemodel, buf(0), buf(2))
' Dim devAddr As Byte = GetActionDeviceAddr(Dic_Devicemodel, buf(0), buf(2))
' Data.Add(devType)
' Data.Add(devAddr)
' Data.AddRange(BitConverter.GetBytes(CShort(buf(1))))
' Case "21 音乐"
'End Select
End If
Next
End If
Next
'result = Rs485DeviceObject(2, T_SceneID, DeviceModuleDic, node.Name, node.Nodes(0).Name)
'If IsNothing(result) Then Continue For
'resultDatas.AddRange(result.ToArray)
Next
Return lst
End Function
''' <summary>
''' 根据RCU模型的设备存在属性组配置设备存在数据
''' </summary>
''' <param name="pNode">模型节点</param>
''' <returns></returns>
Private Function FillModeDeviceExsist(Ccnode As DeviceModelConfigGroup, pNode As DeviceModel) As Byte()
'If pNode.RowType <> RowNode.RowTypeEnum.ModelAttributes_DeviceExists Then Throw New Exception($"行号:{pNode.RowListIndex} 不为设备存在模型属性类型")
Dim buf As New List(Of Byte)
Dim Cbuf(10) As Byte
For Each node In Ccnode.Attributes
Select Case node.Name
Case "DeviceType"
Cbuf(0) = node.DataDefault
Case "DeviceAddr"
Cbuf(1) = node.DataDefault
Case "DevicePort"
Cbuf(2) = node.DataRangeValue
Case "DeviceBaud"
Dim baudData() As Byte = BitConverter.GetBytes(CInt(node.DataDefault))
Cbuf(3) = baudData(0)
Cbuf(4) = baudData(1)
Cbuf(5) = baudData(2)
Cbuf(6) = baudData(3)
Case "DeviceVer"
Cbuf(7) = node.DataDefault
Case "DeviceRetryNum"
Cbuf(8) = node.DataDefault
Case "DeviceRetryTime"
Dim retryTimeData() As Byte = BitConverter.GetBytes(CShort(node.DataDefault))
Cbuf(9) = retryTimeData(0)
Cbuf(10) = retryTimeData(1)
Case Else
Continue For
End Select
Next
buf.AddRange(Cbuf)
Dim keepParam(63) As Byte '保留字段(32字节) -> 2022-05-28 V3.1 32bytes->64Bytes
buf.AddRange(keepParam)
Dim index As Integer = Ccnode.Name.IndexOf("device group information")
Dim type As String = Ccnode.Name.Substring(0, index - 1)
Dim inputCount, outputCount As UShort
Dim inputSettings As New List(Of Byte)
Dim outputAliases As New List(Of Byte)
Dim inputGroupNode As DeviceChildNodeClass = Nothing
Dim outputGroupNode As DeviceChildNodeClass = Nothing
Select Case type.Trim '
Case "DI"
inputGroupNode = FindModelDeviceGroupUnderModel(pNode, "DI")
Case Else
outputGroupNode = FindModelDeviceGroupUnderModel(pNode, type)
End Select
If inputGroupNode Is Nothing Then
inputCount = 0
Else
For Each node In inputGroupNode.Nodes
'If node.RowType <> RowNode.RowTypeEnum.DeviceObject Then Continue For
'If node.Compile = False Then Continue For
inputCount += 1
inputSettings.AddRange(GetDeviceObjectSetting(pNode.Name, node.DefaultClass))
Next
End If
If outputGroupNode Is Nothing Then
outputCount = 0
Else
For Each node In outputGroupNode.Nodes
'If node.RowType <> RowNode.RowTypeEnum.DeviceObject Then Continue For
'If node.Compile = False Then Continue For
outputCount += 1
Dim aliasData() As Byte
'Momo 2022-05-03 增加DeviceAlias非空判断避免报错
If String.IsNullOrEmpty(node.Name) = False Then
aliasData = AliasEncoding.GetBytes(node.Name)
End If
ReDim Preserve aliasData(31) 'caocong 2022-06-07 修改别名长度16Byte -> 32Byte
outputAliases.AddRange(aliasData)
Console.WriteLine($"{node.DefaultAliasName}{vbCrLf}")
Next
Console.WriteLine($"{outputGroupNode.Name}:{outputGroupNode.Nodes.Count }:{outputAliases.Count }{vbCrLf}")
End If
buf.AddRange(BitConverter.GetBytes(inputCount)) '输入回路数(2字节)
buf.AddRange(BitConverter.GetBytes(outputCount)) '输出回路数(2字节)
buf.AddRange(inputSettings.ToArray) '所有输入回路设置(n*4字节)
buf.AddRange(outputAliases.ToArray) '所有输出回路别名(n*16字节)
Return buf.ToArray
End Function
Private Function FindModelDeviceGroupUnderModel(pNode As DeviceModel, name As String) As DeviceChildNodeClass
Dim resultNode As DeviceChildNodeClass = Nothing
''2022-05-14 2.0.2.0 版本以前匹配节点名称与“DI”DO字符串来确定是否返回端点
''外设有继电器时继电器名称为“Relay”Interface为“DO”此方法会范围“0”
For Each node In pNode.Nodes
'If node.RowType <> RowNode.RowTypeEnum.DeviceGroup Then Continue For
If String.Compare(node.Name, name, True) <> 0 Then Continue For
resultNode = node
Exit For
Next
Return resultNode
End Function
Private Function FindAttributeUnderModel(pNode As DeviceModel groupName As String, attributeName As String) As Boolean
For Each cnode In pNode.Config
If cnode.Name.Equals(groupName) Then
For Each ccnode In cnode.Attributes
If ccnode.Name.Equals(attributeName) Then
Return True
End If
Next
End If
Next
Return False
End Function
Private Function FillExternalModelDeviceExsist(pNode As DeviceModel, hostNode As DeviceModel) As List(Of Byte())
Dim outDataLst As New List(Of Byte()) '输出数据列表
Dim strObjGroupNodesTypedataAndProtocol As String = ""
Dim baudData(3) As Byte '波特率(4字节)
Dim retryTimeData(1) As Byte '重发次数(2字节)
Dim keepParam(59) As Byte '保留字段(32字节) -> 2022-05-28 V3.1 32bytes->64Bytes
Dim ipadd(3) As Byte
Dim ObjGroupNodesInOutDic As New Dictionary(Of String, List(Of Byte)) '键值对用于保存合并后的数据Val = 设备组编译后的byte数组
Dim ObjGroupNodesInputCnt As New Dictionary(Of String, UInt16) '键值对用于保存合并后的输入回路数Val = 设备组编译后的byte数组
Dim ObjGroupNodesoutputCnt As New Dictionary(Of String, UInt16) '键值对用于保存合并后的输出回路数Val = 设备组编译后的byte数组
Dim ObjGroupNodesInpuSettings As New Dictionary(Of String, List(Of Byte)) '用于保存合并后输入设定数组
Dim ObjGroupNodesOutputAliases As New Dictionary(Of String, List(Of Byte)) '用于保存合并后输出别名数组
'添加设备组公共信息
Dim Baudrate() As String = FindAttributeValueUnderModel(pNode, Device present, "Baud rate").Split(" ")
baudData = BitConverter.GetBytes(CInt(Baudrate(1)))
retryTimeData = BitConverter.GetBytes(CShort(FindAttributeValueUnderModel(pNode, Device present, "Resend time")))
Dim tmpAddr As Byte = CInt(FindAttributeValueUnderModel2(pNode, Device present, "Dialing address")) '设备地址(1字节)
Dim hostAddr As Byte = CInt(FindNodeValueUnderModel(hostNode, "RS485", pNode.Desc.DevInterface)) '设备地址(1字节)
Dim TemptDevType As Byte = 0
Dim ParentDevType As Byte = 0
Dim ParentDevAddr As Byte = 0
Dim ParentDevPort As Byte = 0
Dim bytes(9) As Byte
Dim node As Boolean = FindAttributeUnderModel(pNode, "Device present", "BleName")
If node Then
Dim nodestr = FindAttributeValueUnderModel2(pNode, "Device present", "BleName") '父设备美型(1字节)
bytes = System.Text.Encoding.UTF8.GetBytes(nodestr)
Array.Copy(bytes, 0, keepParam, 8, bytes.Length)
TemptDevType = bytes(0)
End If
node = FindAttributeUnderModel(pNode, Device present, "Parent device type")
If node Then
ParentDevType = CInt(FindAttributeValueUnderModel(pNode, Device present, "Parent device type")) '父设备美型(1字节)
End If
node = FindAttributeUnderModel(pNode, Device present, "Parent device address")
If node Then
ParentDevAddr = CInt(FindAttributeValueUnderModel(pNode, Device present, "Parent device address")) '父设备美型(1字节)
End If
node = FindAttributeUnderModel(pNode, Device present, "Parent device port")
If node Then
Dim BaudDevPort() As String = FindAttributeValueUnderModel(pNode, Device present, "Parent device port").Split(" ")
ParentDevPort = CInt(BaudDevPort(0)) '父设备美型(1字节)
End If
node = FindAttributeUnderModel(pNode, "Device present", "Valveless machine")
If node Then
Dim BaudDevPort() As String = FindAttributeValueUnderModel(pNode, "Device present", "Valveless machine").Split(" ")
TemptDevType = CInt(BaudDevPort(0)) '父设备美型(1字节)
End If
keepParam(0) = ParentDevType
keepParam(1) = ParentDevAddr
keepParam(2) = ParentDevPort
keepParam(8) = TemptDevType
For indexi = 1 To 5
node = FindAttributeUnderModel(pNode, "设备存在", $"弱电输入{indexi}")
If node Then
Dim BaudDevPort() As String = FindAttributeValueUnderModel(pNode, "设备存在", $"弱电输入{indexi}").Split(" ")
ParentDevPort = CInt(BaudDevPort(0)) '父设备美型(1字节)
keepParam(2 + indexi) = ParentDevPort
End If
Next
If Not IsNothing(pNode.Desc.DevTypeData) AndAlso pNode.Desc.DevTypeData.Equals("55") Then
Dim tabledev As CtabRange = GetRowDevNametabRange(pNode.Name, TableRowNumber.DeviceName)
If Not IsNothingtabledev Then
Dim txtbuf() As String
Dim txt As String
Dim txtbyte() As Byte
For indexi = tabledev.fr To tabledev.lr
txtbuf = _grd.Cell(indexi, TableColNumber.SceneAttribute).Text.Split(",")
txt = _grd.Cell(indexi, TableColNumber.SceneID).Text
txtbyte = BitConverter.GetBytes(CShort(txt))
If txtbuf(0).Equals("1") Then
Array.Copy(txtbyte, 0, keepParam, 8, txtbyte.Length)
ElseIf txtbuf(0).Equals("2") Then
Array.Copy(txtbyte, 0, keepParam, 10, txtbyte.Length)
End If
Next
End If
End If
For Each cnode In pNode.Nodes
strObjGroupNodesTypedataAndProtocol = cnode.DEV_TYPE_DATA & "," & cnode.PROTOCOL_VER
If ObjGroupNodesInOutDic.ContainsKey(strObjGroupNodesTypedataAndProtocol) = False Then
'添加输出合并设备键值对’
ObjGroupNodesInOutDic.Add(strObjGroupNodesTypedataAndProtocol, New List(Of Byte))
ObjGroupNodesInputCnt.Add(strObjGroupNodesTypedataAndProtocol, 0) '输入回路数 = 0
ObjGroupNodesoutputCnt.Add(strObjGroupNodesTypedataAndProtocol, 0) '输出回路数 = 0
ObjGroupNodesInpuSettings.Add(strObjGroupNodesTypedataAndProtocol, New List(Of Byte))
ObjGroupNodesOutputAliases.Add(strObjGroupNodesTypedataAndProtocol, New List(Of Byte))
With ObjGroupNodesInOutDic(strObjGroupNodesTypedataAndProtocol)
.Add(&H3) '设备存在,每个数据块前面都加上 &H03
.Add(CByte(cnode.DEV_TYPE_DATA)) '设备类型(1字节)
.Add(tmpAddr)
'PrintInfo(" *** 设备地址:" & tmpAddr.ToString)
.Add(hostAddr) '485端口(1字节)
.AddRange(baudData) '波特率(4字节)
.Add(CByte(cnode.PROTOCOL_VER)) '协议版本(1字节)
.Add(CInt(FindAttributeValueUnderModel(pNode, Device present, "Number of resending"))) '重发次数(1字节)
.AddRange(retryTimeData) '重发间隔(2字节)
If cnode.DEV_TYPE_DATA.Equals("42") Then
Dim ipAddr As IPAddress = IPAddress.Parse(FindAttributeValueUnderModel(pNode, Device present, "中控IP地址")) '设备地址(1字节)
ipadd = ipAddr.GetAddressBytes()
' PrintInfo(" 中控IP地址 IPadd :" & ipAddr.ToString)
ElseIf cnode.DEV_TYPE_DATA.Equals("43") Then
Dim ipAddr As IPAddress = IPAddress.Parse(FindAttributeValueUnderModel(pNode, Device present, "域控IP地址")) '设备地址(1字节)
ipadd = ipAddr.GetAddressBytes()
' PrintInfo(" 域控IP地址 IPadd :" & ipAddr.ToString)
End If
.AddRange(ipadd)
.AddRange(keepParam)
End With
End If
'遍历设备
For Each objNode In cnode.Nodes
Select Case objNode.Interface
Case "DI"
ObjGroupNodesInputCnt(strObjGroupNodesTypedataAndProtocol) += 1 '输入回路数+1
ObjGroupNodesInpuSettings(strObjGroupNodesTypedataAndProtocol).AddRange(GetDeviceObjectSetting(pNode.Name, objNode.DefaultClass))'输入回路设定’
ObjGroupNodesInpuSettings(strObjGroupNodesTypedataAndProtocol).AddRange(GetDeviceObjectSetting(pNode.Name, objNode.DefaultClass))'输入回路设定’
Case "DO"
Dim tmpDevAlias As String = String.Empty
If Not String.IsNullOrEmpty(objNode.DefaultAliasName) Then
tmpDevAlias = objNode.DefaultAliasName
End If
'If String.IsNullOrEmpty(tmpDevAlias) Then Continue For '未命名别名的输出设备不参与编译
Dim aliasData() As Byte = AliasEncoding.GetBytes(tmpDevAlias)
ReDim Preserve aliasData(31) 'caocong 2022-06-07 修改别名长度16Byte -> 32Byte
ObjGroupNodesoutputCnt(strObjGroupNodesTypedataAndProtocol) += 1 '输出回路数+1
ObjGroupNodesOutputAliases(strObjGroupNodesTypedataAndProtocol).AddRange(aliasData) '输出回路别名’
Case Else
Continue For
End Select
Next
Next
'遍历合并后的设备组(保存于键值对中)
For Each strKey As String In ObjGroupNodesInOutDic.Keys
Dim inputCnt As UInt16 = ObjGroupNodesInputCnt(strKey)
Dim outputCnt As UInt16 = ObjGroupNodesoutputCnt(strKey)
Dim arryInputSetting As Byte() = ObjGroupNodesInpuSettings(strKey).ToArray
Dim arryOutputSetting As Byte() = ObjGroupNodesOutputAliases(strKey).ToArray
ObjGroupNodesInOutDic(strKey).AddRange(BitConverter.GetBytes(inputCnt))
ObjGroupNodesInOutDic(strKey).AddRange(BitConverter.GetBytes(outputCnt))
ObjGroupNodesInOutDic(strKey).AddRange(arryInputSetting) '所有输入回路设置(n*4字节)
ObjGroupNodesInOutDic(strKey).AddRange(arryOutputSetting) '所有输出回路别名(n*16字节)
outDataLst.Add(ObjGroupNodesInOutDic(strKey).ToArray)
Next
Dim tmpOutData As Byte()
For i = 0 To outDataLst.Count - 1
tmpOutData = outDataLst(i).ToArray
Console.WriteLine($"设备编译数据:{ByteToString(tmpOutData.ToArray)}")
Next
Dim tmpBufferLst As List(Of Byte()) = SelfCheckingPower(pNode)
If IsNothing(tmpBufferLst) AndAlso tmpBufferLst.Count = 0 Then
Else
outDataLst.AddRange(tmpBufferLst.ToArray)
End If
Return outDataLst
End Function
Public Function SelfCheckingPower(pNode As DeviceModel) As List(Of Byte())
Dim outDataLst As New List(Of Byte()) '输出数据列表
If Not pNode.Desc.DevInterface.Equals("PB_BUS_LINE") Then Return outDataLst
For Each objNode In pNode.Nodes
If objNode.DEV_TYPE_DATA.Equals("49") OrElse objNode.DEV_TYPE_DATA.Equals("50") OrElse objNode.DEV_TYPE_DATA.Equals("51") Then
Dim cmd As Byte = &H7
Dim tmpAddr As Byte = CInt(FindAttributeValueUnderModel(pNode, Device present, "Dialing address")) '设备地址(1字节)
Dim devtype As Byte = CByte(objNode.DEV_TYPE_DATA)
'遍历设备
For Each jNode As DeviceChildNode In objNode.Nodes
'If objNode.RowType <> RowNode.RowTypeEnum.DeviceObject Then Continue For '设备
'If objNode.Compile = False Then Continue For '判断是否enable action
' Dim bpTag As DeviceObjectRowNodeTag = objNode.Tag
Select Case jNode.Interface
Case "DI"
Case "DO"
Dim nli As New List(Of Byte
Dim upAddr As Integer = CInt(FindAttributeValueUnderModel(pNode, Device present, $"Circuit {jNode.LoopAddr} self check power lower limit")) '设备地址(1字节)
Dim domAddr As Integer = CInt(FindAttributeValueUnderModel(pNode, Device present, $"Circuit {jNode.LoopAddr} self check power upper limit")) '设备地址(1字节)
nli.Add(cmd)
nli.Add(devtype)
nli.Add(tmpAddr)
nli.AddRange(BitConverter.GetBytes(CShort(jNode.LoopAddr)))
nli.AddRange(BitConverter.GetBytes(CShort(upAddr)))
nli.AddRange(BitConverter.GetBytes(CShort(domAddr)))
outDataLst.Add(nli.ToArray)
Case Else
Continue For
End Select
Next
End If
Next
Return outDataLst
End Function
Private Function GetDeviceObjectSetting(devname As String, nodetype As String) As Byte()
Dim buf() As Byte
Select Case nodetype
Case "KEY"
If devname.Equals(hostname) Then
buf = {3, 2, 2, 0}
Else
buf = {1, 2, 2, 0}
End If
Case "RKEY"
buf = {1, 0, 0, 100}
Case "PIR"
buf = {2, 2, 60, 0}
Case "DRY"
buf = {3, 2, 2, 0}
Case "SLIDER"
buf = {2, 2, 2, 0}
Case "CARD"
buf = {0, 1, 0, 0}
Case "Virtual_Card"
buf = {2, 0, 0, 0}
Case "MUSIC"
buf = {1, 0, 0, 0}
Case "Carbon_Device", "Scene_Restore"
buf = {1, 0, 0, 0}
End Select
'If devname.Equals(hostname) Then
' buf = {3, 2, 2, 0}
'Else
' buf = {1, 2, 2, 0}
'End If
'For Each node As RowNode In pNode.Nodes
' '查询设备属性集合
' If node.RowType <> RowNode.RowTypeEnum.DeviceAttributes Then Continue For
' '获取设备属性值
' Dim index As Integer = 0
' Dim tag As AttributeRowNodeTag
' For Each n As RowNode In node.Nodes
' tag = n.Tag
' buf(index) = tag.ValueData
' index += 1
' If index >= 4 Then Exit For
' Next
'Next
Return buf
End Function
Public Function ByteToString(databuff() As Byte)
Dim strData As String = String.Empty
For i = 0 To databuff.Length - 1
strData &= $" {Hex(databuff(i)).PadLeft(2, "0"c)}"
Next
Return strData
End Function
Private Function FindAttributeValueUnderModel(pNode As DeviceModel, groupName As String, attributeName As String) As String
For Each cnode In pNode.Config
If cnode.Name.Equals(groupName) Then
For Each ccnode In cnode.Attributes
If ccnode.Name.Equals(attributeName) Then
Return ccnode.DataDefault
End If
Next
End If
Next
End Function
Private Function FindAttributeValueUnderModel2(pNode As DeviceModel, groupName As String, attributeName As String) As String
For Each cnode In pNode.Config
If cnode.Name.Equals(groupName) Then
For Each ccnode In cnode.Attributes
If ccnode.Name.Equals(attributeName) Then
Return ccnode.Value
End If
Next
End If
Next
End Function
Private Function FindNodeValueUnderModel(pNode As DeviceModel, groupName As String, attributeName As String) As String
For Each cnode In pNode.Nodes
If cnode.Name.Equals(groupName) Then
For Each ccnode In cnode.Nodes
If ccnode.Interface.Equals(attributeName) Then
Return ccnode.LoopAddr
End If
Next
End If
Next
End Function
''' <summary>
''' 配置RCU模型设备存在数据
''' </summary>
''' <param name="pNode">模型节点</param>
''' <returns></returns>
Private Function FillRCUModelDeviceExsist(pNode As DeviceModel) As Byte()
' If pNode.RowType <> RowNode.RowTypeEnum.Model Then Throw New Exception($"行号:{pNode.RowListIndex} 不为RCU模型类型")
Dim buf As New List(Of Byte)
'Dim tag As ModelRowNodeTag = pNode.Tag
buf.Add(pNode.Desc.DevTypeData) '设备类型(1字节)
buf.Add(&H0) '设备地址(1字节)
buf.Add(&H0) '485端口(1字节)
Dim baudrate As Integer = 0
buf.AddRange(BitConverter.GetBytes(baudrate)) '波特率(4字节)
buf.Add(pNode.Desc.ProtocolVer) '协议版本(1字节)
buf.Add(&H0) '重发次数(1字节)
Dim retryInterval As Short = 0
buf.AddRange(BitConverter.GetBytes(retryInterval)) '重发间隔(2字节)
Dim keepParam(63) As Byte
buf.AddRange(keepParam) '保留字段(32字节) -> 2022-05-28 V3.1 32bytes->64Bytes
Dim inputCount As Short = 0
Dim outputCount As Short = 0
buf.AddRange(BitConverter.GetBytes(inputCount)) '输入回路数(2字节)
buf.AddRange(BitConverter.GetBytes(outputCount)) '输出回路数(2字节)
'所有输入回路设置(n*4字节)
'所有输出回路别名(n*16字节)
Return buf.ToArray
End Function
Public Function FillConfigInfo(configInfo As ConfigInfoStuct, adevName As String) As List(Of Byte)
Dim resultDatas As New List(Of Byte())
Dim cmd As Byte = &H1
Dim buf As List(Of Byte) = New List(Of Byte)
Dim arrayCopyLenght As Integer = 0
'命令
buf.Add(cmd)
'发布作者 P0~31
Dim bytesAuthor() As Byte = AliasEncoding.GetBytes(configInfo.Author.Trim)
Dim bytesAuthor_32bytes(31) As Byte
If bytesAuthor.Length <= 32 Then
arrayCopyLenght = bytesAuthor.Length
Else
arrayCopyLenght = 32
End If
Array.Copy(bytesAuthor, bytesAuthor_32bytes, arrayCopyLenght)
buf.AddRange(bytesAuthor_32bytes)
'软件版本号 P32~35
'Dim strConfigToolsVersion As String = Replace(configInfo.ConfigToolVersion, ".", "", 1, 4)
'Dim byetConfigToolsVersion() As Byte = System.Text.Encoding.UTF8.GetBytes(strConfigToolsVersion)
Dim ByteConfigToolsVersion() As String = configInfo.ConfigToolVersion.Split(".")
Dim byetConfigToolsVersion(3) As Byte
byetConfigToolsVersion(0) = Val(ByteConfigToolsVersion(0))
byetConfigToolsVersion(1) = Val(ByteConfigToolsVersion(1))
byetConfigToolsVersion(2) = Val(ByteConfigToolsVersion(2))
byetConfigToolsVersion(3) = Val(ByteConfigToolsVersion(3))
buf.AddRange(byetConfigToolsVersion)
'配置发布日期 P36~42
'Dim strReleaseDate As String = Format(configInfo.ReleaseDate, "yyyyMMddHHmmss")
'Dim byteReleaseDate() = System.Text.Encoding.UTF8.GetBytes(strReleaseDate)
Dim byteReleaseDate(6) As Byte '
byteReleaseDate(0) = configInfo.ReleaseDate.Year \ 256 'yy H
byteReleaseDate(1) = configInfo.ReleaseDate.Year Mod 256 'yy L
byteReleaseDate(2) = configInfo.ReleaseDate.Month 'Month
byteReleaseDate(3) = configInfo.ReleaseDate.Day 'd
byteReleaseDate(4) = configInfo.ReleaseDate.Hour 'h
byteReleaseDate(5) = configInfo.ReleaseDate.Minute 'm
byteReleaseDate(6) = configInfo.ReleaseDate.Second 's
buf.AddRange(byteReleaseDate)
'项目名称 P43~74
Dim byteHotelName() As Byte = AliasEncoding.GetBytes(configInfo.HotelName.Trim)
Dim byteHotelName_32Bytes(31) As Byte
If byteHotelName.Length <= 32 Then
arrayCopyLenght = byteHotelName.Length
Else
arrayCopyLenght = 32
End If
Array.Copy(byteHotelName, byteHotelName_32Bytes, arrayCopyLenght)
buf.AddRange(byteHotelName_32Bytes)
'项目编号 P75~78
Dim byteHotelCode() As Byte = iByte4(configInfo.HotelCode)
buf.AddRange(byteHotelCode)
'项目分组 P79~110
Dim byteHoteGroupName() As Byte = AliasEncoding.GetBytes(configInfo.HotelGroupName.Trim)
Dim byteHoteGroupName_32Bytes(31) As Byte
If byteHoteGroupName.Length <= 32 Then
arrayCopyLenght = byteHoteGroupName.Length
Else
arrayCopyLenght = 32
End If
Array.Copy(byteHoteGroupName, byteHoteGroupName_32Bytes, arrayCopyLenght)
buf.AddRange(byteHoteGroupName_32Bytes)
'房型别名 P111~142
Dim byteRoomTypeName() As Byte = AliasEncoding.GetBytes(configInfo.RoomTypeName.Trim)
Dim byteRoomTypeName_32Bytes(31) As Byte
If byteRoomTypeName.Length <= 32 Then
arrayCopyLenght = byteRoomTypeName.Length
Else
arrayCopyLenght = 32
End If
Array.Copy(byteRoomTypeName, byteRoomTypeName_32Bytes, arrayCopyLenght)
buf.AddRange(byteRoomTypeName_32Bytes)
'配置版本号 P143~146
'Dim byteConfigFileVersion() As Byte = iByte4(configInfo.CfgFileVersion)
'buf.AddRange(byteConfigFileVersion)
'Momo 2022-09-06 配置版本号只有3位 P143~145
Dim byteConfigFileVersion() As Byte = iByte3(configInfo.CfgFileVersion)
buf.AddRange(byteConfigFileVersion)
'配置机型 P146~P209 MCU机型名称 64
Dim tmpModelName As String = adevName.Trim
'MsgBox(tmpModelName)
Dim byteModelName() As Byte = AliasEncoding.GetBytes(tmpModelName)
Dim byteModelName_64Bytes(63) As Byte
If byteModelName.Length <= 64 Then
arrayCopyLenght = byteModelName.Length
Else
arrayCopyLenght = 64
End If
Array.Copy(byteModelName, byteModelName_64Bytes, arrayCopyLenght)
buf.AddRange(byteModelName_64Bytes)
'2024.12.20 CZH
Dim dtime As Short = 0
Try
dtime = CShort(_grd.Cell(TableRowNumber.FunctionAnotherName, TableColNumber.InsertColumn - 1).Text)
If dtime < -24 OrElse dtime > 24 Then
dtime = 0
End If
Catch ex As Exception
dtime = 0
End Try
Dim eventNum() As Byte = BitConverter.GetBytes(dtime)
buf.AddRange(eventNum)
'完成配置数据添加
Return buf 'resultDatas
End Function
''' <summary>
''' Integer 类型转 4 字节 byte数组高字节在前
''' </summary>
''' <param name="i"></param>
''' <returns></returns>
Public Function iByte4(ByVal i As Integer) As Byte()
Dim btemp() As Byte = {0, 0, 0, 0}
Dim b() As Byte = BitConverter.GetBytes(i)
btemp(3) = b(3)
btemp(2) = b(2)
btemp(1) = b(1)
btemp(0) = b(0)
Return btemp
End Function
''' <summary>
''' Integer 类型转 3 字节 byte数组高字节在前
''' </summary>
''' <param name="i"></param>
''' <returns></returns>
Public Function iByte3(ByVal i As Integer) As Byte()
Dim btemp() As Byte = {0, 0, 0}
Dim b() As Byte = BitConverter.GetBytes(i)
btemp(2) = b(2)
btemp(1) = b(1)
btemp(0) = b(0)
Return btemp
End Function
Public Function SaveToExle(g_XmlPath As String)
Try
_grd.ExportToExcel(g_XmlPath,)
Return True
Catch ex As Exception
Return False
End Try
End Function
Public Function Save(g_XmlPath As String)
Try
Dim fxml As New DrSeverGrid(Dic_Devicemodel, Dic_ActionConfiguration, _grd, BasicClassFilename, ConditionFileName)
fxml.Save(g_XmlPath)
Return True
Catch ex As Exception
Return False
End Try
End Function
Public Sub test()
For i = 5 To 20
Console.WriteLine($"Rows :{i} VAL {_grd.Row(i).Locked }")
For j = 1 To 10
Console.WriteLine($"cols :{j} VAL {_grd.Column(j).Locked }")
Console.WriteLine($"cell :{i}{j} VAL {_grd.Cell(i, j).Locked }")
Next
Next
_grd.Column(1).Locked = False
_grd.Row(9).Locked = False
_grd.Row(8).Locked = False
With _grd.Range(8, 1, 9, 1)
.ClearAll()
.Locked = False
'.Merge()
End With
End Sub
'上传无卡取电回路别名
Public Function tbl_room_ble_devlistInsert(HotelID As String, RoomTypeID As String) As String
'判断设备列表是否为空
Dim result As String = ""
Dim strbuf() As String
Dim arrayCopyLenght As String = $"{HotelID}_{RoomTypeID}"
result = $"'{arrayCopyLenght}',"
Dim kstr As String = ""
Dim cnt As Integer = 0
Dim updatastr As String = ""
For Each index In Dic_Devicemodel.Values
For Each node In index.Nodes
If node.Name.Equals("Virtual_Card") AndAlso node.Interface.Equals("DO") Then
cnt = 0
For Each node1 In node.Nodes
strbuf = node1.Description.Split(",")
'Description = "卫红外,关门磁(18),50,,2,2,0"
If strbuf.Count > 1 Then
kstr = $"{kstr}loop{cnt},"
result = $"{result}'{strbuf(1).Replace("(", "_").Replace(")", "")}',"
updatastr = $"{updatastr}loop{cnt} = VALUES(loop{cnt}),"
End If
cnt = cnt + 1
Next
End If
Next
Next
If kstr.Length > 0 Then
result = result.Substring(0, result.Length - 1)
kstr = kstr.Substring(0, kstr.Length - 1)
updatastr = updatastr.Substring(0, updatastr.Length - 1)
result = $"INSERT INTO tbl_rcu_virtualcard_looplogs (Combination_ID,{kstr}) VALUES ({result})
ON DUPLICATE KEY UPDATE {updatastr};"
Else
Return ""
End If
Return result
End Function
Public Function TestReportingScenario(_UserName As String, _HotleID As String, _RoomTypeID As String, filename As String, Version As String) As ReportingScenario
Dim aaa As New ReportingScenario(_UserName, _HotleID, _RoomTypeID, filename, Version, _grd, Dic_Devicemodel, Dic_ActionConfiguration)
Dim li As List(Of MDevNodeMessage) = aaa.getDateDisposeRuning
Dim str As String = JsonConvert.SerializeObject(li)
'MsgBox(str)
Dim nsurl As String = "https://boonlive-rcu.com/api/UploadRoomTypeModal" '"https://pms.boonlive-rcu.com/api/UploadRoomTypeModal"
GetAccountAuth(nsurl, str)
Return aaa
End Function
Private Function GetAccountAuth(url As String, data As String) As Boolean
Dim jsonString As String = HttpMothod.PostData2(url, data)
If String.IsNullOrWhiteSpace(jsonString) OrElse jsonString.ToUpper.Contains("False".ToUpper) Then
Throw New Exception($"用户鉴权异常,请联系管理员")
Return False
End If
Return True
End Function
Public Function LoadFile(path As String) As Boolean
'新主机项目 清空设备列表
Try
'Dim ts As DateTime = Now
'Dim st As TimeSpan
Dic_Devicemodel.Clear()
Dic_ActionConfiguration.Clear()
_ServerAction.Clear()
ColumnAnothername.Clear()
'记录主机名称
hostname = ""
_ServerInsertRows = 0
_SceneID = 1
_ColumnStartLoad = TableColNumber.Max - 1
initGrid1()
LockGridAutoRedraw()
Dim fxml As New DrSeverGrid(Dic_Devicemodel, Dic_ActionConfiguration, _grd, BasicClassFilename, ConditionFileName)
grdRemoveHandler()
'st = Now - ts
'Console.WriteLine($"st1:({st.TotalMilliseconds })")
fxml.LoadFile(path)
'st = Now - ts
'Console.WriteLine($"st2:({st.TotalMilliseconds })")
hostname = _grd.Cell(1, 8).Text
Dic_Devicemodel = fxml.Dic_Devicemodel
_grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text = getFunctionChildNodeAnother(Dic_Devicemodel)
_ColumnStartLoad = fxml.InsertColumn
BasicClassFilename = fxml.Dic_Bname
ConditionFileName = fxml.Dic_Cname
_SceneID = fxml.G_SceneID
ColumnAnothername = fxml.ColumnAnothername
_ServerInsertRows = _grd.Rows - 1
ChangeTheServiceLineNumber()
grdAddHandler()
UnLockGridAutoRedraw()
'st = Now - ts
'Console.WriteLine($"st3:({st.TotalMilliseconds })")
Return True
Catch ex As Exception
Return False
End Try
End Function
Public Function getFunctionChildNodeAnother(Devicemodel As Dictionary(Of String DeviceModel) As String
Dim result As String = String.Empty
For Each moduStr In Devicemodel.Values
If moduStr.Nodes.Count = 1 AndAlso (moduStr.Nodes(0).Nodes.Count = 0 OrElse moduStr.Nodes(0).DEV_TYPE_DATA.Equals("48") OrElse moduStr.Nodes(0).DEV_TYPE_DATA.Equals("46")) Then
If String.IsNullOrEmpty(result) Then
result = moduStr.Name
Else
result = result & "," & moduStr.Name
End If
End If
Next
Return result
'_grd.Cell(TableRowNumber.FunctionChildNodeAnother, TableColNumber.DeviceName).Text = "test"
End Function
#End Region
End Class
Public Class CtabRange
Public devname As String = String.Empty
Public fr As Integer = 0
Public lr As Integer = 0
Public fc As Integer = 0
Public lc As Integer = 0
Sub New(grd As FlexCell.Grid tabr As Integer, tabc As Integer)
If grd.Rows > tabr AndAlso grd.Cols > tabc Then
With grd.Range(tabr, tabc, tabr, tabc)
devname = grd.Cell(.FirstRow, .FirstCol).Text
fc = .FirstCol
lc = .LastCol
fr = .FirstRow
lr = .LastRow
End With
End If
End Sub
End Class