DefaultFeederDebugPage.xaml 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. <UserControl x:Class="TeamAAS.Feeder.UI.DefaultFeederDebugPage"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:hc="https://handyorg.github.io/handycontrol"
  5. xmlns:sys="clr-namespace:System;assembly=mscorlib"
  6. xmlns:fe="clr-namespace:TeamAAS.Feeder.Enums"
  7. xmlns:fm="clr-namespace:TeamAAS.Feeder.Models"
  8. xmlns:local="clr-namespace:TeamAAS.Feeder.UI"
  9. xmlns:loc="clr-namespace:TeamAAS.Localization;assembly=TeamAAS.Global">
  10. <UserControl.Resources>
  11. <local:EnumDescriptionConverter x:Key="EnumDescriptionConverter"/>
  12. <BooleanToVisibilityConverter x:Key="BoolToVis"/>
  13. <ObjectDataProvider x:Key="FeederActionEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
  14. <ObjectDataProvider.MethodParameters>
  15. <x:Type TypeName="fe:FeederAction"/>
  16. </ObjectDataProvider.MethodParameters>
  17. </ObjectDataProvider>
  18. <ObjectDataProvider x:Key="SequenceStepTypeEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
  19. <ObjectDataProvider.MethodParameters>
  20. <x:Type TypeName="fm:SequenceStepType"/>
  21. </ObjectDataProvider.MethodParameters>
  22. </ObjectDataProvider>
  23. </UserControl.Resources>
  24. <!-- 主调试区:左面板(方向控制)+ 右面板(参数 Tab)。DataContext = FeederDebugViewModel -->
  25. <Grid>
  26. <Grid.ColumnDefinitions>
  27. <ColumnDefinition Width="340"/>
  28. <ColumnDefinition Width="*"/>
  29. </Grid.ColumnDefinitions>
  30. <!-- 左面板:方向九宫格 + 功能竖列 -->
  31. <Border Grid.Column="0" Background="{DynamicResource RegionBrush}" CornerRadius="8" Padding="16" Margin="0,0,6,0">
  32. <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
  33. <Grid.ColumnDefinitions>
  34. <ColumnDefinition Width="Auto"/>
  35. <ColumnDefinition Width="16"/>
  36. <ColumnDefinition Width="Auto"/>
  37. </Grid.ColumnDefinitions>
  38. <UniformGrid Grid.Column="0" Columns="3" Rows="3">
  39. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="6"
  40. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  41. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  42. <TextBlock Text="↘" FontSize="24" HorizontalAlignment="Center"/>
  43. <TextBlock Text="G" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  44. </StackPanel>
  45. </Button>
  46. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="3"
  47. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  48. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  49. <TextBlock Text="↓" FontSize="24" HorizontalAlignment="Center"/>
  50. <TextBlock Text="D" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  51. </StackPanel>
  52. </Button>
  53. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="1"
  54. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  55. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  56. <TextBlock Text="↙" FontSize="24" HorizontalAlignment="Center"/>
  57. <TextBlock Text="B" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  58. </StackPanel>
  59. </Button>
  60. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="5"
  61. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  62. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  63. <TextBlock Text="→" FontSize="24" HorizontalAlignment="Center"/>
  64. <TextBlock Text="F" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  65. </StackPanel>
  66. </Button>
  67. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="8"
  68. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  69. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  70. <TextBlock Text="⛶" FontSize="24" HorizontalAlignment="Center"/>
  71. <TextBlock Text="I" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  72. </StackPanel>
  73. </Button>
  74. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="0"
  75. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  76. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  77. <TextBlock Text="←" FontSize="24" HorizontalAlignment="Center"/>
  78. <TextBlock Text="A" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  79. </StackPanel>
  80. </Button>
  81. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="7"
  82. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  83. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  84. <TextBlock Text="↗" FontSize="24" HorizontalAlignment="Center"/>
  85. <TextBlock Text="H" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  86. </StackPanel>
  87. </Button>
  88. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="4"
  89. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  90. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  91. <TextBlock Text="↑" FontSize="24" HorizontalAlignment="Center"/>
  92. <TextBlock Text="E" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  93. </StackPanel>
  94. </Button>
  95. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="2"
  96. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Padding="0">
  97. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  98. <TextBlock Text="↖" FontSize="24" HorizontalAlignment="Center"/>
  99. <TextBlock Text="C" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  100. </StackPanel>
  101. </Button>
  102. </UniformGrid>
  103. <StackPanel Grid.Column="2" VerticalAlignment="Center">
  104. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="9"
  105. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Margin="0,3">
  106. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  107. <TextBlock Text="⇔" FontSize="22" HorizontalAlignment="Center"/>
  108. <TextBlock Text="J" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  109. </StackPanel>
  110. </Button>
  111. <Button Command="{Binding FeederDirectionCommand}" CommandParameter="10"
  112. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Margin="0,3">
  113. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  114. <TextBlock Text="⇕" FontSize="22" HorizontalAlignment="Center"/>
  115. <TextBlock Text="K" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  116. </StackPanel>
  117. </Button>
  118. <Button Command="{Binding ToggleBacklightCommand}"
  119. Style="{DynamicResource ButtonDefault}" Width="60" Height="60" Margin="0,3">
  120. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  121. <TextBlock FontSize="22" HorizontalAlignment="Center">
  122. <TextBlock.Style>
  123. <Style TargetType="TextBlock">
  124. <Setter Property="Text" Value="💡"/>
  125. <Style.Triggers>
  126. <DataTrigger Binding="{Binding Info.IsBacklightOn}" Value="True">
  127. <Setter Property="Text" Value="🔆"/>
  128. </DataTrigger>
  129. </Style.Triggers>
  130. </Style>
  131. </TextBlock.Style>
  132. </TextBlock>
  133. <TextBlock Text="{loc:Translate '灯'}" FontSize="12" Foreground="{DynamicResource SecondaryTextBrush}" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  134. </StackPanel>
  135. </Button>
  136. <Button Command="{Binding StopFeederActionCommand}"
  137. Style="{DynamicResource ButtonDanger}" Width="60" Height="60" Margin="0,6,0,0">
  138. <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
  139. <TextBlock Text="⏹" FontSize="22" HorizontalAlignment="Center"/>
  140. <TextBlock Text="{loc:Translate '停'}" FontSize="12" Foreground="White" HorizontalAlignment="Center" Margin="0,2,0,0"/>
  141. </StackPanel>
  142. </Button>
  143. </StackPanel>
  144. </Grid>
  145. </Border>
  146. <!-- 右面板:TabControl -->
  147. <Border Grid.Column="1" Background="{DynamicResource RegionBrush}" CornerRadius="8" Padding="12">
  148. <TabControl Background="Transparent" BorderThickness="0">
  149. <TabItem Header="{loc:Translate '🔧 振动集调试'}" FontSize="13">
  150. <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
  151. <Grid Margin="8">
  152. <Grid.RowDefinitions>
  153. <RowDefinition Height="Auto"/>
  154. <RowDefinition Height="*"/>
  155. <RowDefinition Height="Auto"/>
  156. </Grid.RowDefinitions>
  157. <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,12">
  158. <TextBlock Text="{loc:Translate '振动集:'}" VerticalAlignment="Center"/>
  159. <ComboBox ItemsSource="{Binding VibrationSetList}" SelectedIndex="{Binding SelectedVibrationSetIndex}"
  160. MinWidth="70" Margin="6,0,16,0" Padding="6,2"/>
  161. <TextBlock Text="{loc:Translate '动作:'}" VerticalAlignment="Center"/>
  162. <ComboBox ItemsSource="{Binding ActionLetterList}" SelectedIndex="{Binding SelectedActionIndex}"
  163. MinWidth="70" Margin="6,0,16,0" Padding="6,2"/>
  164. <TextBlock Text="{loc:Translate '持续(ms):'}" VerticalAlignment="Center"/>
  165. <hc:NumericUpDown Value="{Binding CurrentDuration}" Minimum="0" Maximum="20000" Increment="100" Width="110" Margin="6,0,16,0"/>
  166. <Button Content="{loc:Translate '▶ 执行'}" Command="{Binding ExecuteActionCommand}"
  167. Style="{DynamicResource ButtonPrimary}" Margin="0,0,4,0" Padding="10,3"/>
  168. <Button Content="{loc:Translate '⏹ 停止'}" Command="{Binding StopFeederActionCommand}"
  169. Style="{DynamicResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
  170. <Button Content="{loc:Translate '💾 下载参数'}" Command="{Binding DownloadParamCommand}"
  171. Style="{DynamicResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
  172. </StackPanel>
  173. <UniformGrid Grid.Row="1" Columns="2" Rows="2">
  174. <GroupBox Header="{loc:Translate '马达1'}" Margin="4" Padding="8" FontSize="16">
  175. <UniformGrid Columns="2">
  176. <TextBlock Text="{loc:Translate '振幅(%)'}" VerticalAlignment="Center"/>
  177. <hc:NumericUpDown Value="{Binding CurrentAction.Motor1.Amplitude, Mode=TwoWay}" Minimum="0" Maximum="100" Width="150"/>
  178. <TextBlock Text="{loc:Translate '频率(Hz)'}" VerticalAlignment="Center"/>
  179. <hc:NumericUpDown Value="{Binding CurrentAction.Motor1.Frequency, Mode=TwoWay}" Minimum="0" Maximum="250" Width="150"/>
  180. <TextBlock Text="{loc:Translate '相位(°)'}" VerticalAlignment="Center"/>
  181. <hc:NumericUpDown Value="{Binding CurrentAction.Motor1.Phase, Mode=TwoWay}" Minimum="0" Maximum="359" Width="150"/>
  182. <TextBlock Text="{loc:Translate '波形'}" VerticalAlignment="Center"/>
  183. <hc:ButtonGroup Padding="2">
  184. <ToggleButton Content="{loc:Translate '不启用'}" IsChecked="{Binding CurrentAction.Motor1.IsWaveNone, Mode=TwoWay}" Padding="4,2"/>
  185. <ToggleButton Content="∿" IsChecked="{Binding CurrentAction.Motor1.IsWaveSin, Mode=TwoWay}" Padding="6,2"/>
  186. <ToggleButton Content="⧊" IsChecked="{Binding CurrentAction.Motor1.IsWaveSaw, Mode=TwoWay}" Padding="6,2"/>
  187. <ToggleButton Content="⧋" IsChecked="{Binding CurrentAction.Motor1.IsWaveTri, Mode=TwoWay}" Padding="6,2"/>
  188. </hc:ButtonGroup>
  189. </UniformGrid>
  190. </GroupBox>
  191. <GroupBox Header="{loc:Translate '马达2'}" Margin="4" Padding="8">
  192. <UniformGrid Columns="2">
  193. <TextBlock Text="{loc:Translate '振幅(%)'}" VerticalAlignment="Center"/>
  194. <hc:NumericUpDown Value="{Binding CurrentAction.Motor2.Amplitude, Mode=TwoWay}" Minimum="0" Maximum="100" Width="150"/>
  195. <TextBlock Text="{loc:Translate '频率(Hz)'}" VerticalAlignment="Center"/>
  196. <hc:NumericUpDown Value="{Binding CurrentAction.Motor2.Frequency, Mode=TwoWay}" Minimum="0" Maximum="250" Width="150"/>
  197. <TextBlock Text="{loc:Translate '相位(°)'}" VerticalAlignment="Center"/>
  198. <hc:NumericUpDown Value="{Binding CurrentAction.Motor2.Phase, Mode=TwoWay}" Minimum="0" Maximum="359" Width="150"/>
  199. <TextBlock Text="{loc:Translate '波形'}" VerticalAlignment="Center"/>
  200. <hc:ButtonGroup Padding="2">
  201. <ToggleButton Content="{loc:Translate '不启用'}" IsChecked="{Binding CurrentAction.Motor2.IsWaveNone, Mode=TwoWay}" Padding="4,2"/>
  202. <ToggleButton Content="∿" IsChecked="{Binding CurrentAction.Motor2.IsWaveSin, Mode=TwoWay}" Padding="6,2"/>
  203. <ToggleButton Content="⧊" IsChecked="{Binding CurrentAction.Motor2.IsWaveSaw, Mode=TwoWay}" Padding="6,2"/>
  204. <ToggleButton Content="⧋" IsChecked="{Binding CurrentAction.Motor2.IsWaveTri, Mode=TwoWay}" Padding="6,2"/>
  205. </hc:ButtonGroup>
  206. </UniformGrid>
  207. </GroupBox>
  208. <GroupBox Header="{loc:Translate '马达3'}" Margin="4" Padding="8">
  209. <UniformGrid Columns="2">
  210. <TextBlock Text="{loc:Translate '振幅(%)'}" VerticalAlignment="Center"/>
  211. <hc:NumericUpDown Value="{Binding CurrentAction.Motor3.Amplitude, Mode=TwoWay}" Minimum="0" Maximum="100" Width="150"/>
  212. <TextBlock Text="{loc:Translate '频率(Hz)'}" VerticalAlignment="Center"/>
  213. <hc:NumericUpDown Value="{Binding CurrentAction.Motor3.Frequency, Mode=TwoWay}" Minimum="0" Maximum="250" Width="150"/>
  214. <TextBlock Text="{loc:Translate '相位(°)'}" VerticalAlignment="Center"/>
  215. <hc:NumericUpDown Value="{Binding CurrentAction.Motor3.Phase, Mode=TwoWay}" Minimum="0" Maximum="359" Width="150"/>
  216. <TextBlock Text="{loc:Translate '波形'}" VerticalAlignment="Center"/>
  217. <hc:ButtonGroup Padding="2">
  218. <ToggleButton Content="{loc:Translate '不启用'}" IsChecked="{Binding CurrentAction.Motor3.IsWaveNone, Mode=TwoWay}" Padding="4,2"/>
  219. <ToggleButton Content="∿" IsChecked="{Binding CurrentAction.Motor3.IsWaveSin, Mode=TwoWay}" Padding="6,2"/>
  220. <ToggleButton Content="⧊" IsChecked="{Binding CurrentAction.Motor3.IsWaveSaw, Mode=TwoWay}" Padding="6,2"/>
  221. <ToggleButton Content="⧋" IsChecked="{Binding CurrentAction.Motor3.IsWaveTri, Mode=TwoWay}" Padding="6,2"/>
  222. </hc:ButtonGroup>
  223. </UniformGrid>
  224. </GroupBox>
  225. <GroupBox Header="{loc:Translate '马达4'}" Margin="4" Padding="8">
  226. <UniformGrid Columns="2">
  227. <TextBlock Text="{loc:Translate '振幅(%)'}" VerticalAlignment="Center"/>
  228. <hc:NumericUpDown Value="{Binding CurrentAction.Motor4.Amplitude, Mode=TwoWay}" Minimum="0" Maximum="100" Width="150"/>
  229. <TextBlock Text="{loc:Translate '频率(Hz)'}" VerticalAlignment="Center"/>
  230. <hc:NumericUpDown Value="{Binding CurrentAction.Motor4.Frequency, Mode=TwoWay}" Minimum="0" Maximum="250" Width="150"/>
  231. <TextBlock Text="{loc:Translate '相位(°)'}" VerticalAlignment="Center"/>
  232. <hc:NumericUpDown Value="{Binding CurrentAction.Motor4.Phase, Mode=TwoWay}" Minimum="0" Maximum="359" Width="150"/>
  233. <TextBlock Text="{loc:Translate '波形'}" VerticalAlignment="Center"/>
  234. <hc:ButtonGroup Padding="2">
  235. <ToggleButton Content="{loc:Translate '不启用'}" IsChecked="{Binding CurrentAction.Motor4.IsWaveNone, Mode=TwoWay}" Padding="4,2"/>
  236. <ToggleButton Content="∿" IsChecked="{Binding CurrentAction.Motor4.IsWaveSin, Mode=TwoWay}" Padding="6,2"/>
  237. <ToggleButton Content="⧊" IsChecked="{Binding CurrentAction.Motor4.IsWaveSaw, Mode=TwoWay}" Padding="6,2"/>
  238. <ToggleButton Content="⧋" IsChecked="{Binding CurrentAction.Motor4.IsWaveTri, Mode=TwoWay}" Padding="6,2"/>
  239. </hc:ButtonGroup>
  240. </UniformGrid>
  241. </GroupBox>
  242. </UniformGrid>
  243. <GroupBox Grid.Row="2" Header="{loc:Translate '关于'}" Margin="4,12,4,4" Padding="8">
  244. <Grid>
  245. <Grid.ColumnDefinitions>
  246. <ColumnDefinition Width="100"/>
  247. <ColumnDefinition Width="*"/>
  248. </Grid.ColumnDefinitions>
  249. <StackPanel Grid.Column="0">
  250. <CheckBox Content="{loc:Translate '同步变化'}" IsChecked="{Binding IsSyncChanging}" Margin="0,4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  251. </StackPanel>
  252. <StackPanel Grid.Column="1" Margin="12,0,0,0">
  253. <StackPanel Orientation="Horizontal" Margin="0,2">
  254. <TextBlock Text="{loc:Translate '全局振幅:'}" VerticalAlignment="Center" MinWidth="60"/>
  255. <Slider Minimum="0" Maximum="100" Value="{Binding GlobalAmplitude}" Width="400" Margin="0,0,8,0"/>
  256. <TextBlock Text="{Binding GlobalAmplitude}" Width="38" VerticalAlignment="Center"/>
  257. </StackPanel>
  258. <StackPanel Orientation="Horizontal" Margin="0,4">
  259. <TextBlock Text="{loc:Translate '全局频率:'}" VerticalAlignment="Center" MinWidth="60"/>
  260. <Slider Minimum="0" Maximum="250" Value="{Binding GlobalFrequency}" Width="400" Margin="0,0,8,0"/>
  261. <TextBlock Text="{Binding GlobalFrequency}" Width="38" VerticalAlignment="Center"/>
  262. </StackPanel>
  263. </StackPanel>
  264. </Grid>
  265. </GroupBox>
  266. </Grid>
  267. </ScrollViewer>
  268. </TabItem>
  269. <TabItem Header="{loc:Translate '📜 序列集(送料流程)'}" FontSize="13">
  270. <Grid Margin="4">
  271. <Grid.RowDefinitions>
  272. <RowDefinition Height="Auto"/>
  273. <RowDefinition Height="*"/>
  274. <RowDefinition Height="Auto"/>
  275. </Grid.RowDefinitions>
  276. <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,4,0,8">
  277. <TextBlock Text="{loc:Translate '流程:'}" VerticalAlignment="Center"/>
  278. <ComboBox ItemsSource="{Binding CurrentSequences}" SelectedItem="{Binding SelectedSequence}"
  279. DisplayMemberPath="Name" MinWidth="140" Margin="6,0" Padding="6,2"/>
  280. <Button Content="{loc:Translate '➕ 新流程'}" Command="{Binding AddSequenceCommand}"
  281. Style="{DynamicResource ButtonPrimary}" Margin="0,0,4,0" Padding="10,3"/>
  282. <Button Content="{loc:Translate '🗑 删流程'}" Command="{Binding DeleteSequenceCommand}"
  283. Style="{DynamicResource ButtonDanger}" Margin="4,0" Padding="10,3"/>
  284. <Button Content="{loc:Translate '📝 重命名'}" Command="{Binding RenameSequenceCommand}"
  285. Style="{DynamicResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
  286. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="8,0"/>
  287. <TextBlock Text="{loc:Translate '添加步骤:'}" VerticalAlignment="Center"/>
  288. <Button Content="{loc:Translate '↔ 方向振动'}" Command="{Binding AddSequenceStepCommand}" CommandParameter="Direction"
  289. Style="{DynamicResource ButtonDefault}" Margin="6,0,4,0" Padding="10,3"/>
  290. <Button Content="{loc:Translate '⏱ 延时等待'}" Command="{Binding AddSequenceStepCommand}" CommandParameter="Delay"
  291. Style="{DynamicResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
  292. <Rectangle Width="1" Height="22" Fill="{DynamicResource BorderBrush}" Margin="8,0"/>
  293. <Button Content="⬆" Command="{Binding MoveUpStepCommand}" Style="{DynamicResource ButtonDefault}" Margin="0,0,4,0" Padding="8,3" IsEnabled="{Binding HasSelectedStep}"/>
  294. <Button Content="⬇" Command="{Binding MoveDownStepCommand}" Style="{DynamicResource ButtonDefault}" Margin="4,0" Padding="8,3" IsEnabled="{Binding HasSelectedStep}"/>
  295. <Button Content="🗑" Command="{Binding DeleteStepCommand}" Style="{DynamicResource ButtonDanger}" Margin="4,0" Padding="8,3" IsEnabled="{Binding HasSelectedStep}"/>
  296. </StackPanel>
  297. <DataGrid Grid.Row="1" ItemsSource="{Binding CurrentSequenceSteps}" SelectedItem="{Binding SelectedStep}"
  298. AutoGenerateColumns="False" CanUserAddRows="False"
  299. AlternatingRowBackground="{DynamicResource SecondaryRegionBrush}">
  300. <DataGrid.Columns>
  301. <DataGridTextColumn Header="#" Binding="{Binding Index}" Width="auto" IsReadOnly="True"/>
  302. <DataGridCheckBoxColumn Header="{loc:Translate '启用'}" Binding="{Binding Enabled}" Width="auto"/>
  303. <DataGridTemplateColumn Header="{loc:Translate '类型'}" Width="auto">
  304. <DataGridTemplateColumn.CellTemplate>
  305. <DataTemplate>
  306. <ComboBox ItemsSource="{Binding Source={StaticResource SequenceStepTypeEnum}}" SelectedItem="{Binding StepType}">
  307. <ComboBox.ItemTemplate>
  308. <DataTemplate>
  309. <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/>
  310. </DataTemplate>
  311. </ComboBox.ItemTemplate>
  312. </ComboBox>
  313. </DataTemplate>
  314. </DataGridTemplateColumn.CellTemplate>
  315. </DataGridTemplateColumn>
  316. <DataGridTemplateColumn Header="{loc:Translate '方向'}" Width="auto">
  317. <DataGridTemplateColumn.CellTemplate>
  318. <DataTemplate>
  319. <ComboBox ItemsSource="{Binding Source={StaticResource FeederActionEnum}}" SelectedItem="{Binding Direction}">
  320. <ComboBox.ItemTemplate>
  321. <DataTemplate>
  322. <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/>
  323. </DataTemplate>
  324. </ComboBox.ItemTemplate>
  325. </ComboBox>
  326. </DataTemplate>
  327. </DataGridTemplateColumn.CellTemplate>
  328. </DataGridTemplateColumn>
  329. <DataGridTemplateColumn Header="{loc:Translate '时间(ms)'}" Width="auto">
  330. <DataGridTemplateColumn.CellTemplate>
  331. <DataTemplate>
  332. <hc:NumericUpDown Value="{Binding TimeMs}" Minimum="0" Maximum="30000" Increment="50" Width="80"/>
  333. </DataTemplate>
  334. </DataGridTemplateColumn.CellTemplate>
  335. </DataGridTemplateColumn>
  336. <DataGridTextColumn Header="{loc:Translate '备注'}" Binding="{Binding Note}" Width="*"/>
  337. </DataGrid.Columns>
  338. </DataGrid>
  339. <StackPanel Grid.Row="2" Orientation="Horizontal" Margin="0,8,0,0">
  340. <Button Content="{loc:Translate '▶ 执行流程'}" Command="{Binding ExecuteSequenceCommand}"
  341. Style="{DynamicResource ButtonPrimary}" Padding="14,5" Margin="0,0,8,0"/>
  342. <Button Content="{loc:Translate '⏹ 停止流程'}" Command="{Binding StopSequenceCommand}"
  343. Style="{DynamicResource ButtonDanger}" Padding="14,5"/>
  344. <TextBlock Text="{Binding SequenceStatusText}" VerticalAlignment="Center" Margin="20,0,0,0"
  345. Foreground="{DynamicResource PrimaryBrush}" FontWeight="Bold"/>
  346. </StackPanel>
  347. </Grid>
  348. </TabItem>
  349. <TabItem Header="{loc:Translate '📥 输入输出'}" FontSize="13">
  350. <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
  351. <StackPanel Margin="8">
  352. <GroupBox Header="{loc:Translate '料斗输出参数'}" Margin="4" Padding="8">
  353. <StackPanel>
  354. <StackPanel Orientation="Horizontal" Margin="0,0,0,10">
  355. <TextBlock Text="{loc:Translate '输出组:'}" VerticalAlignment="Center"/>
  356. <ComboBox ItemsSource="{Binding HopperGroupList}" SelectedItem="{Binding SelectedHopperGroup}" MinWidth="70" Margin="6,0,12,0" Padding="6,2"/>
  357. <Button Content="{loc:Translate '⬇ 读取'}" Command="{Binding ReadHopperParamCommand}" Style="{DynamicResource ButtonDefault}" Margin="4,0" Padding="10,3"/>
  358. <Button Content="{loc:Translate '⬆ 下载'}" Command="{Binding WriteHopperParamCommand}" Style="{DynamicResource ButtonPrimary}" Margin="4,0" Padding="10,3"/>
  359. </StackPanel>
  360. <UniformGrid Columns="2">
  361. <CheckBox Content="{loc:Translate '数字量输出1'}" IsChecked="{Binding HopperParam.HopperDigitalOutput1}" VerticalAlignment="Center" Margin="4,6"/>
  362. <StackPanel Orientation="Horizontal" Margin="4,6">
  363. <TextBlock Text="{loc:Translate '模拟量输出1:'}" VerticalAlignment="Center" MinWidth="90"/>
  364. <hc:NumericUpDown Value="{Binding HopperParam.HopperAnalogOutput1}" Minimum="0" Maximum="10" Width="120"/>
  365. </StackPanel>
  366. <CheckBox Content="{loc:Translate '数字量输出2'}" IsChecked="{Binding HopperParam.HopperDigitalOutput2}" VerticalAlignment="Center" Margin="4,6"/>
  367. <StackPanel Orientation="Horizontal" Margin="4,6">
  368. <TextBlock Text="{loc:Translate '模拟量输出2:'}" VerticalAlignment="Center" MinWidth="90"/>
  369. <hc:NumericUpDown Value="{Binding HopperParam.HopperAnalogOutput2}" Minimum="0" Maximum="10" Width="120"/>
  370. </StackPanel>
  371. </UniformGrid>
  372. <StackPanel Orientation="Horizontal" Margin="4,6">
  373. <TextBlock Text="{loc:Translate '振动持续时间(ms):'}" VerticalAlignment="Center" MinWidth="130"/>
  374. <hc:NumericUpDown Value="{Binding HopperParam.HopperDuration}" Minimum="0" Maximum="60000" Increment="100" Width="140"/>
  375. </StackPanel>
  376. <StackPanel Orientation="Horizontal" Margin="0,8,0,0">
  377. <Button Content="{loc:Translate '▶ 执行料斗'}" Command="{Binding RunHopperOutputCommand}" Style="{DynamicResource ButtonPrimary}" Margin="0,0,8,0" Padding="12,4"/>
  378. <Button Content="{loc:Translate '⏹ 停止料斗'}" Command="{Binding StopHopperOutputCommand}" Style="{DynamicResource ButtonDanger}" Padding="12,4"/>
  379. </StackPanel>
  380. </StackPanel>
  381. </GroupBox>
  382. <GroupBox Header="{loc:Translate '输入触发(外部信号触发序列)'}" Margin="4,12,4,4" Padding="8">
  383. <StackPanel>
  384. <StackPanel Orientation="Horizontal" Margin="4,6">
  385. <TextBlock Text="{loc:Translate '输入1触发序列ID:'}" VerticalAlignment="Center" MinWidth="140"/>
  386. <hc:NumericUpDown Value="{Binding InputTrigger1}" Minimum="0" Maximum="26" Width="120"/>
  387. </StackPanel>
  388. <StackPanel Orientation="Horizontal" Margin="4,6">
  389. <TextBlock Text="{loc:Translate '输入2触发序列ID:'}" VerticalAlignment="Center" MinWidth="140"/>
  390. <hc:NumericUpDown Value="{Binding InputTrigger2}" Minimum="0" Maximum="26" Width="120"/>
  391. </StackPanel>
  392. <StackPanel Orientation="Horizontal" Margin="0,8,0,0">
  393. <Button Content="{loc:Translate '⬇ 读取'}" Command="{Binding ReadInputTriggerCommand}" Style="{DynamicResource ButtonDefault}" Margin="0,0,8,0" Padding="12,4"/>
  394. <Button Content="{loc:Translate '⬆ 写入'}" Command="{Binding WriteInputTriggerCommand}" Style="{DynamicResource ButtonPrimary}" Padding="12,4"/>
  395. </StackPanel>
  396. </StackPanel>
  397. </GroupBox>
  398. </StackPanel>
  399. </ScrollViewer>
  400. </TabItem>
  401. <TabItem Header="{loc:Translate '⚙ 系统参数(超时)'}" FontSize="13">
  402. <ScrollViewer VerticalScrollBarVisibility="Auto">
  403. <StackPanel Margin="8">
  404. <GroupBox Header="{loc:Translate '振动超时(关键:过短会导致动作被提前中断)'}" Margin="4" Padding="8">
  405. <StackPanel>
  406. <StackPanel Orientation="Horizontal" Margin="4,6">
  407. <TextBlock Text="{loc:Translate '平台振动超时(ms):'}" VerticalAlignment="Center" MinWidth="150"/>
  408. <hc:NumericUpDown Value="{Binding SystemParam.PlatShakeTimeout}" Minimum="1" Maximum="65535" Increment="100" Width="140"/>
  409. </StackPanel>
  410. <StackPanel Orientation="Horizontal" Margin="4,6">
  411. <TextBlock Text="{loc:Translate '料斗振动超时(ms):'}" VerticalAlignment="Center" MinWidth="150"/>
  412. <hc:NumericUpDown Value="{Binding SystemParam.HopperShakeTimeout}" Minimum="1" Maximum="65535" Increment="100" Width="140"/>
  413. </StackPanel>
  414. </StackPanel>
  415. </GroupBox>
  416. <GroupBox Header="{loc:Translate '背光参数'}" Margin="4,12,4,4" Padding="8">
  417. <StackPanel>
  418. <StackPanel Orientation="Horizontal" Margin="4,6">
  419. <TextBlock Text="{loc:Translate '背光超时(ms):'}" VerticalAlignment="Center" MinWidth="150"/>
  420. <hc:NumericUpDown Value="{Binding SystemParam.LightTimeout}" Minimum="1" Maximum="65535" Increment="100" Width="140"/>
  421. </StackPanel>
  422. <StackPanel Orientation="Horizontal" Margin="4,6">
  423. <TextBlock Text="{loc:Translate '光源亮度(%):'}" VerticalAlignment="Center" MinWidth="150"/>
  424. <hc:NumericUpDown Value="{Binding SystemParam.LightBrightness}" Minimum="1" Maximum="100" Width="140"/>
  425. </StackPanel>
  426. <StackPanel Orientation="Horizontal" Margin="4,6">
  427. <TextBlock Text="{loc:Translate '背光闪烁时间(ms):'}" VerticalAlignment="Center" MinWidth="150"/>
  428. <hc:NumericUpDown Value="{Binding SystemParam.LightFlashTime}" Minimum="1" Maximum="65535" Increment="100" Width="140"/>
  429. </StackPanel>
  430. </StackPanel>
  431. </GroupBox>
  432. <StackPanel Orientation="Horizontal" Margin="4,12,0,0">
  433. <Button Content="{loc:Translate '⬇ 读取系统参数'}" Command="{Binding ReadSystemParamCommand}" Style="{DynamicResource ButtonDefault}" Margin="0,0,8,0" Padding="14,5"/>
  434. <Button Content="{loc:Translate '⬆ 写入并保存'}" Command="{Binding WriteSystemParamCommand}" Style="{DynamicResource ButtonPrimary}" Padding="14,5"/>
  435. </StackPanel>
  436. </StackPanel>
  437. </ScrollViewer>
  438. </TabItem>
  439. </TabControl>
  440. </Border>
  441. </Grid>
  442. </UserControl>