@@ -7,13 +7,13 @@ | |||||
<SolidColorBrush x:Key="foreground" Color="#a2c2e8" /> | <SolidColorBrush x:Key="foreground" Color="#a2c2e8" /> | ||||
<SolidColorBrush x:Key="borderBrush" Color="#FF074B92" /> | <SolidColorBrush x:Key="borderBrush" Color="#FF074B92" /> | ||||
<SolidColorBrush x:Key="Titleforeground" Color="#FF07D7FF" /> | <SolidColorBrush x:Key="Titleforeground" Color="#FF07D7FF" /> | ||||
<SolidColorBrush x:Key="DataGridColumnHeaderColor" Color="#00c2f4"/> | |||||
<SolidColorBrush x:Key="LabelColor" Color="#FF00EEF3"/> | |||||
<SolidColorBrush x:Key="MainTitleforeground" Color="#feffff"/> | |||||
<SolidColorBrush x:Key="ButtonSelectForeground" Color="#4fade8"/> | |||||
<SolidColorBrush x:Key="ButtonUnSelectForeground" Color="#3afdff"/> | |||||
<SolidColorBrush x:Key="MeunSelectForeground" Color="#8f723c"/> | |||||
<SolidColorBrush x:Key="MeunUnSelectForeground" Color="White"/> | |||||
<SolidColorBrush x:Key="DataGridColumnHeaderColor" Color="#00c2f4" /> | |||||
<SolidColorBrush x:Key="LabelColor" Color="#FF00EEF3" /> | |||||
<SolidColorBrush x:Key="MainTitleforeground" Color="#feffff" /> | |||||
<SolidColorBrush x:Key="ButtonSelectForeground" Color="#4fade8" /> | |||||
<SolidColorBrush x:Key="ButtonUnSelectForeground" Color="#3afdff" /> | |||||
<SolidColorBrush x:Key="MeunSelectForeground" Color="#8f723c" /> | |||||
<SolidColorBrush x:Key="MeunUnSelectForeground" Color="White" /> | |||||
<!--<SolidColorBrush x:Key="foreground" Color="Red" /> | <!--<SolidColorBrush x:Key="foreground" Color="Red" /> | ||||
<SolidColorBrush x:Key="borderBrush" Color="Red" /> | <SolidColorBrush x:Key="borderBrush" Color="Red" /> | ||||
@@ -172,7 +172,7 @@ | |||||
<ImageBrush x:Key="imageBJ" ImageSource="/BPASmartClient.CustomResource;component/Image/图层1.png" /> | <ImageBrush x:Key="imageBJ" ImageSource="/BPASmartClient.CustomResource;component/Image/图层1.png" /> | ||||
<ImageBrush x:Key="image1" ImageSource="/BPASmartClient.CustomResource;component/Image/shape.png" /> | <ImageBrush x:Key="image1" ImageSource="/BPASmartClient.CustomResource;component/Image/shape.png" /> | ||||
<ImageBrush x:Key="image2" ImageSource="/BPASmartClient.CustomResource;component/Image/shape1.png" /> | <ImageBrush x:Key="image2" ImageSource="/BPASmartClient.CustomResource;component/Image/shape1.png" /> | ||||
<Style TargetType="Image"> | <Style TargetType="Image"> | ||||
<Style.Setters> | <Style.Setters> | ||||
<Setter Property="UseLayoutRounding" Value="True" /> | <Setter Property="UseLayoutRounding" Value="True" /> | ||||
@@ -981,7 +981,10 @@ | |||||
<Setter.Value> | <Setter.Value> | ||||
<ControlTemplate TargetType="Button"> | <ControlTemplate TargetType="Button"> | ||||
<Border x:Name="BD" Cursor="Hand"> | <Border x:Name="BD" Cursor="Hand"> | ||||
<StackPanel HorizontalAlignment="Center" Orientation="Horizontal" Cursor="Hand"> | |||||
<StackPanel | |||||
HorizontalAlignment="Center" | |||||
Cursor="Hand" | |||||
Orientation="Horizontal"> | |||||
<!--<Border Width="16" Margin="5"> | <!--<Border Width="16" Margin="5"> | ||||
<Border.Background> | <Border.Background> | ||||
<ImageBrush ImageSource="/BPASmartClient.CustomResource;component/Image/顶部切图/返回按钮图标.png" /> | <ImageBrush ImageSource="/BPASmartClient.CustomResource;component/Image/顶部切图/返回按钮图标.png" /> | ||||
@@ -1668,7 +1671,7 @@ | |||||
</Style> | </Style> | ||||
<Style x:Key="数码管Text" TargetType="TextBlock"> | <Style x:Key="数码管Text" TargetType="TextBlock"> | ||||
<Setter Property="FontFamily" Value="../Fonts/#Quartz M"></Setter> | |||||
<Setter Property="FontFamily" Value="../Fonts/#Quartz M" /> | |||||
<Setter Property="FontSize" Value="18" /> | <Setter Property="FontSize" Value="18" /> | ||||
<Setter Property="Foreground" Value="{DynamicResource foreground}" /> | <Setter Property="Foreground" Value="{DynamicResource foreground}" /> | ||||
<Setter Property="VerticalAlignment" Value="Center" /> | <Setter Property="VerticalAlignment" Value="Center" /> | ||||
@@ -1758,5 +1761,5 @@ | |||||
</Setter> | </Setter> | ||||
</Style> | </Style> | ||||
<!--#endregion--> | <!--#endregion--> | ||||
</ResourceDictionary> | </ResourceDictionary> |
@@ -22,15 +22,26 @@ | |||||
<RowDefinition /> | <RowDefinition /> | ||||
</Grid.RowDefinitions> | </Grid.RowDefinitions> | ||||
<StackPanel Grid.Row="0" Orientation="Horizontal"> | <StackPanel Grid.Row="0" Orientation="Horizontal"> | ||||
<TextBlock x:Name="time" FontSize="16" FontFamily="../Fonts/#Quartz M">14:48:30</TextBlock> | |||||
<TextBlock | |||||
x:Name="time" | |||||
FontFamily="../Fonts/#Quartz M" | |||||
FontSize="16"> | |||||
14:48:30 | |||||
</TextBlock> | |||||
<Image Margin="10,0,0,0" Style="{DynamicResource timeImage}" /> | <Image Margin="10,0,0,0" Style="{DynamicResource timeImage}" /> | ||||
</StackPanel> | </StackPanel> | ||||
<StackPanel Grid.Row="1" Orientation="Horizontal"> | <StackPanel Grid.Row="1" Orientation="Horizontal"> | ||||
<TextBlock x:Name="dateRL" FontSize="10" FontFamily="../Fonts/#Quartz M">星期一</TextBlock> | |||||
<TextBlock | |||||
x:Name="dateRL" | |||||
FontFamily="../Fonts/#Quartz M" | |||||
FontSize="10"> | |||||
星期一 | |||||
</TextBlock> | |||||
<TextBlock | <TextBlock | ||||
x:Name="date" FontFamily="../Fonts/#Quartz M" | |||||
x:Name="date" | |||||
Margin="10,0,0,0" | Margin="10,0,0,0" | ||||
FontFamily="../Fonts/#Quartz M" | |||||
FontSize="10"> | FontSize="10"> | ||||
2021-11-13 | 2021-11-13 | ||||
</TextBlock> | </TextBlock> | ||||
@@ -12,7 +12,7 @@ | |||||
mc:Ignorable="d"> | mc:Ignorable="d"> | ||||
<UserControl.Resources> | <UserControl.Resources> | ||||
<Style x:Key="btnNum" TargetType="{x:Type Button}"> | <Style x:Key="btnNum" TargetType="{x:Type Button}"> | ||||
<Setter Property="Cursor" Value="Hand"></Setter> | |||||
<Setter Property="Cursor" Value="Hand" /> | |||||
<Setter Property="HorizontalContentAlignment" Value="Center" /> | <Setter Property="HorizontalContentAlignment" Value="Center" /> | ||||
<Setter Property="VerticalContentAlignment" Value="Center" /> | <Setter Property="VerticalContentAlignment" Value="Center" /> | ||||
<Setter Property="Template"> | <Setter Property="Template"> | ||||
@@ -63,7 +63,7 @@ | |||||
</Setter> | </Setter> | ||||
</Style> | </Style> | ||||
<Style x:Key="btnFunc" TargetType="{x:Type Button}"> | <Style x:Key="btnFunc" TargetType="{x:Type Button}"> | ||||
<Setter Property="Cursor" Value="Hand"></Setter> | |||||
<Setter Property="Cursor" Value="Hand" /> | |||||
<Setter Property="HorizontalContentAlignment" Value="Center" /> | <Setter Property="HorizontalContentAlignment" Value="Center" /> | ||||
<Setter Property="VerticalContentAlignment" Value="Center" /> | <Setter Property="VerticalContentAlignment" Value="Center" /> | ||||
<!--<Setter Property="Padding" Value="1"/>--> | <!--<Setter Property="Padding" Value="1"/>--> | ||||
@@ -72,12 +72,10 @@ namespace BPASmartClient.Helper | |||||
if (actions.ContainsKey(key)) | if (actions.ContainsKey(key)) | ||||
if (par == null) | if (par == null) | ||||
{ | { | ||||
//if (actions[key].FuncObj != null) | |||||
return actions[key].FuncObj?.Invoke(); | return actions[key].FuncObj?.Invoke(); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
//if (actions[key].FuncPar != null) | |||||
return actions[key].FuncPar?.Invoke(par); | return actions[key].FuncPar?.Invoke(par); | ||||
} | } | ||||
return default; | return default; | ||||
@@ -0,0 +1,85 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Security.Cryptography; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPASmartClient.Helper | |||||
{ | |||||
public static class Aes128Helper | |||||
{ | |||||
/// <summary> | |||||
/// AES 加密 | |||||
/// </summary> | |||||
/// <param name="str">明文(待加密)</param> | |||||
/// <param name="aesSecretKey">密钥</param> | |||||
/// <returns></returns> | |||||
//public static string AESEncrypt(this string str, string aesSecretKey = "bpa20210418bpa20210418bpa*******") | |||||
//{ | |||||
// try | |||||
// { | |||||
// if (string.IsNullOrEmpty(str)) return null; | |||||
// byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); | |||||
// byte[] keyArray = UTF8Encoding.UTF8.GetBytes(aesSecretKey); | |||||
// RijndaelManaged rm = new RijndaelManaged | |||||
// { | |||||
// Key = keyArray, | |||||
// Mode = CipherMode.ECB, | |||||
// Padding = PaddingMode.PKCS7 | |||||
// }; | |||||
// ICryptoTransform cTransform = rm.CreateEncryptor(); | |||||
// Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); | |||||
// string strs = ""; | |||||
// for (var x = 0; x < resultArray.Length; x++) | |||||
// { | |||||
// var i = Convert.ToString(resultArray[x], 16); | |||||
// strs += i.PadLeft(2, '0'); | |||||
// } | |||||
// return strs; | |||||
// } | |||||
// catch (Exception ex) | |||||
// { | |||||
// return ""; | |||||
// } | |||||
//} | |||||
/// <summary> | |||||
/// AES 解密 | |||||
/// </summary> | |||||
/// <param name="str">密文(待解密)</param> | |||||
/// <param name="aesSecretKey">密钥</param> | |||||
/// <returns></returns> | |||||
//public static string AESDecrypt(this string str, string aesSecretKey = "bpa20210418bpa20210418bpa*******") | |||||
//{ | |||||
// try | |||||
// { | |||||
// if (string.IsNullOrEmpty(str)) return null; | |||||
// byte[] keyArray = UTF8Encoding.UTF8.GetBytes(aesSecretKey); | |||||
// byte[] toEncryptArray = new byte[str.Length / 2]; | |||||
// for (var x = 0; x < toEncryptArray.Length; x++) | |||||
// { | |||||
// var i = Convert.ToInt32(str.Substring(x * 2, 2), 16); | |||||
// toEncryptArray[x] = (byte)i; | |||||
// } | |||||
// RijndaelManaged rDel = new RijndaelManaged(); | |||||
// rDel.Key = keyArray; | |||||
// rDel.Mode = CipherMode.ECB; | |||||
// rDel.Padding = PaddingMode.PKCS7; | |||||
// ICryptoTransform cTransform = rDel.CreateDecryptor(); | |||||
// byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); | |||||
// return UTF8Encoding.UTF8.GetString(resultArray); | |||||
// } | |||||
// catch (Exception ex) | |||||
// { | |||||
// return ""; | |||||
// } | |||||
//} | |||||
} | |||||
} |
@@ -0,0 +1,188 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Diagnostics; | |||||
using System.Linq; | |||||
using System.Reflection; | |||||
using System.Runtime.InteropServices; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPASmartClient.Helper | |||||
{ | |||||
public class SystemUtils | |||||
{ | |||||
//private static ILogger logger = NLog.LogManager.GetCurrentClassLogger(); | |||||
public static bool isShowNumBoard = false; | |||||
[DllImport("kernel32.dll", SetLastError = true)] | |||||
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); | |||||
[DllImport("kernel32.dll", SetLastError = true)] | |||||
public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); | |||||
public static IntPtr ptr = new IntPtr(); | |||||
public static void ShowScreenKeyboard() | |||||
{ | |||||
try | |||||
{ | |||||
//ProcessStartInfo psi = new ProcessStartInfo(); | |||||
//psi.FileName = @"C:\Windows\System32\osk.exe"; | |||||
//psi.UseShellExecute = false; | |||||
//psi.CreateNoWindow = true; | |||||
//Process.Start(psi); | |||||
Process kbpr = System.Diagnostics.Process.Start(@"C:\Windows\System32\osk.exe"); // 打开系统键盘 | |||||
////判断软键盘是否进程是否已经存在,如果不存在进行调用 | |||||
//Process[] pro = Process.GetProcessesByName("osk"); | |||||
//bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr); | |||||
////键盘如果已经打开则重新打开,防止最小化无法显示 | |||||
//if (pro != null && pro.Length > 0) | |||||
//{ | |||||
// Process kbpr = pro[0]; | |||||
// kbpr.Kill(); | |||||
// if (isWow64FsRedirectionDisabled) | |||||
// { | |||||
// Process.Start(@"C:WINDOWSsystem32osk.exe"); | |||||
// Wow64RevertWow64FsRedirection(ptr); | |||||
// } | |||||
// return; | |||||
//} | |||||
////if (isWow64FsRedirectionDisabled) | |||||
////{ | |||||
//Process.Start(@"C:WINDOWSsystem32osk.exe"); | |||||
//Wow64RevertWow64FsRedirection(ptr); | |||||
//} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
//logger.Error(ex.Message); | |||||
} | |||||
} | |||||
//[DllImport("kernel32.dll", SetLastError = true)] | |||||
//private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); | |||||
//[DllImport("kernel32.dll", SetLastError = true)] | |||||
//public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); | |||||
//private const UInt32 WM_SYSCOMMAND = 0x112; | |||||
//private const UInt32 SC_RESTORE = 0xf120; | |||||
//[DllImport("user32.dll", CharSet = CharSet.Auto)] | |||||
//static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); | |||||
//private const string OnScreenKeyboadApplication = "osk.exe"; | |||||
///// <summary> | |||||
///// 启用系统软键盘 | |||||
///// </summary> | |||||
//public static void OpenKeyBoardFun() | |||||
//{ | |||||
// try | |||||
// { | |||||
// //判断软键盘是否进程是否已经存在,如果不存在进行调用 | |||||
// Process[] pro = Process.GetProcessesByName("osk"); | |||||
// //如果键盘已打开,则进行关闭操作 | |||||
// if (pro != null && pro.Length > 0) | |||||
// { | |||||
// CloseKeyBoardFun(); | |||||
// return; | |||||
// } | |||||
// // Get the name of the On screen keyboard | |||||
// string processName = System.IO.Path.GetFileNameWithoutExtension(OnScreenKeyboadApplication); | |||||
// // Check whether the application is not running | |||||
// var query = from process in Process.GetProcesses() | |||||
// where process.ProcessName == processName | |||||
// select process; | |||||
// var keyboardProcess = query.FirstOrDefault(); | |||||
// // launch it if it doesn't exist | |||||
// if (keyboardProcess == null) | |||||
// { | |||||
// IntPtr ptr = new IntPtr(); ; | |||||
// bool sucessfullyDisabledWow64Redirect = false; | |||||
// // Disable x64 directory virtualization if we're on x64, | |||||
// // otherwise keyboard launch will fail. | |||||
// if (System.Environment.Is64BitOperatingSystem) | |||||
// { | |||||
// sucessfullyDisabledWow64Redirect = Wow64DisableWow64FsRedirection(ref ptr); | |||||
// } | |||||
// // osk.exe is in windows/system folder. So we can directky call it without path | |||||
// using (Process osk = new Process()) | |||||
// { | |||||
// osk.StartInfo.FileName = OnScreenKeyboadApplication; | |||||
// osk.Start(); | |||||
// //osk.WaitForInputIdle(2000); | |||||
// } | |||||
// // Re-enable directory virtualisation if it was disabled. | |||||
// if (System.Environment.Is64BitOperatingSystem) | |||||
// if (sucessfullyDisabledWow64Redirect) | |||||
// Wow64RevertWow64FsRedirection(ptr); | |||||
// } | |||||
// else | |||||
// { | |||||
// // Bring keyboard to the front if it's already running | |||||
// var windowHandle = keyboardProcess.MainWindowHandle; | |||||
// SendMessage(windowHandle, WM_SYSCOMMAND, new IntPtr(SC_RESTORE), new IntPtr(0)); | |||||
// } | |||||
// } | |||||
// catch (Exception ex) | |||||
// { | |||||
// //LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.Message); | |||||
// //LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.StackTrace); | |||||
// } | |||||
//} | |||||
///// <summary> | |||||
///// 关闭系统软键盘 | |||||
///// </summary> | |||||
//public static void CloseKeyBoardFun() | |||||
//{ | |||||
// try | |||||
// { | |||||
// Process[] pros = Process.GetProcessesByName("osk"); | |||||
// foreach (Process p in pros) | |||||
// { | |||||
// p.Kill(); | |||||
// } | |||||
// } | |||||
// catch (Exception ex) | |||||
// { | |||||
// //LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.Message); | |||||
// //LogUtil.WriteLog(MethodBase.GetCurrentMethod().Name, LogUtil.ERROE, ex.StackTrace); | |||||
// } | |||||
//} | |||||
} | |||||
} |
@@ -52,6 +52,7 @@ namespace BPASmartClient.Lebai | |||||
status["RobotValue1"] = LebaiHelper.GetInstance().GetValueAsync(1).Value; | status["RobotValue1"] = LebaiHelper.GetInstance().GetValueAsync(1).Value; | ||||
status["GetInput"] = LebaiHelper.GetInstance().GetInput(); | status["GetInput"] = LebaiHelper.GetInstance().GetInput(); | ||||
status["GetInput2"] = LebaiHelper.GetInstance().GetInput(2); | status["GetInput2"] = LebaiHelper.GetInstance().GetInput(2); | ||||
if (LebaiHelper.GetInstance().robotData != null) status["RobotMode"] = LebaiHelper.GetInstance().robotData.RobotMode.Mode; | if (LebaiHelper.GetInstance().robotData != null) status["RobotMode"] = LebaiHelper.GetInstance().robotData.RobotMode.Mode; | ||||
LebaiHelper.GetInstance().GetRobotModeStatus(); | LebaiHelper.GetInstance().GetRobotModeStatus(); | ||||
Thread.Sleep(10); | Thread.Sleep(10); | ||||
@@ -117,6 +118,12 @@ namespace BPASmartClient.Lebai | |||||
case "机器人急停": | case "机器人急停": | ||||
LebaiHelper.GetInstance().EStopRobot(); | LebaiHelper.GetInstance().EStopRobot(); | ||||
break; | break; | ||||
case "暂停": | |||||
LebaiHelper.GetInstance().pauseMode(); | |||||
break; | |||||
case "恢复": | |||||
LebaiHelper.GetInstance().resumeMode(); | |||||
break; | |||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
@@ -149,6 +156,12 @@ namespace BPASmartClient.Lebai | |||||
public override void WriteData(string address, object value) | public override void WriteData(string address, object value) | ||||
{ | { | ||||
} | |||||
public void SetDO(bool value, int Ch=0) | |||||
{ | |||||
LebaiHelper.GetInstance().SetOutput(value,Ch); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -189,6 +189,42 @@ namespace BPASmartClient.LebaiRobot | |||||
MessageLog.GetInstance.ShowEx(ex.ToString()); | MessageLog.GetInstance.ShowEx(ex.ToString()); | ||||
} | } | ||||
} | } | ||||
/// <summary> | |||||
/// 暂停 | |||||
/// </summary> | |||||
public async void pauseMode() | |||||
{ | |||||
try | |||||
{ | |||||
if (robotData != null) | |||||
{ | |||||
await client.Pause(); | |||||
MessageLog.GetInstance.Show("机器人切换为暂停模式."); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageLog.GetInstance.ShowEx(ex.ToString()); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 恢复 | |||||
/// </summary> | |||||
public async void resumeMode() | |||||
{ | |||||
try | |||||
{ | |||||
if (robotData != null) | |||||
{ | |||||
await client.Resume(); | |||||
MessageLog.GetInstance.Show("机器人切换为暂停后恢复模式."); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageLog.GetInstance.ShowEx(ex.ToString()); | |||||
} | |||||
} | |||||
/// <summary> | /// <summary> | ||||
/// 机器人急停 | /// 机器人急停 | ||||
@@ -266,7 +302,24 @@ namespace BPASmartClient.LebaiRobot | |||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/// <summary> | |||||
/// 设置DO输出 | |||||
/// </summary> | |||||
/// <param name="pin"></param> | |||||
/// <returns></returns> | |||||
public void SetOutput(bool bDO, int pin = 0) | |||||
{ | |||||
try | |||||
{ | |||||
if (client == null) { return; } | |||||
var res = client.SetDIO(new DIO() { Pin = pin, Value = bDO ? 1 : 0 }); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageLog.GetInstance.ShowEx(ex.ToString()); | |||||
} | |||||
} | |||||
public bool GetTcpInput(int pin = 1) | public bool GetTcpInput(int pin = 1) | ||||
{ | { | ||||
try | try | ||||
@@ -64,6 +64,12 @@ namespace BPASmartClient.Modbus | |||||
} | } | ||||
public void Dispose() | |||||
{ | |||||
master.Dispose(); | |||||
Disconnect?.Invoke(); | |||||
} | |||||
private void Connect() | private void Connect() | ||||
{ | { | ||||
bool ErrorFlag = false; | bool ErrorFlag = false; | ||||
@@ -10,26 +10,56 @@ namespace BPASmartClient.Model | |||||
public class JuicerModel | public class JuicerModel | ||||
{ | { | ||||
#region 果汁机设备MORKT2 Lebai机器人 | #region 果汁机设备MORKT2 Lebai机器人 | ||||
public const int JUICE2_初始位 = 10021; | |||||
public const int JUICE2_检测位回原点 = 10023; | |||||
public const int JUICE2_取纸杯 = 10006; | |||||
public const int JUICE2_二次取杯 = 10008; | |||||
public const int JUICE2_纸杯检测 = 10007; | |||||
//public const int JUICE2_初始位 = 10021; | |||||
//public const int JUICE2_检测位回原点 = 10023; | |||||
//public const int JUICE2_取纸杯 = 10006; | |||||
//public const int JUICE2_二次取杯 = 10008; | |||||
//public const int JUICE2_纸杯检测 = 10007; | |||||
//public const int JUICE2_再检测 = 10024; | |||||
//public const int JUICE2_接咖啡 = 10009; | |||||
//public const int JUICE2_放咖啡杯 = 10010; | |||||
//public const int JUICE2_接茶叶 = 10017; | |||||
//public const int JUICE2_接茶水 = 10018; | |||||
//public const int JUICE2_接水 = 10020; | |||||
//public const int JUICE2_放水杯 = 10019; | |||||
//public const int JUICE2_接果汁公共位 = 10011; | |||||
//public const int JUICE2_接1号果汁 = 10012; | |||||
//public const int JUICE2_接2号果汁 = 10013; | |||||
//public const int JUICE2_接3号果汁 = 10014; | |||||
//public const int JUICE2_接4号果汁 = 10015; | |||||
//public const int JUICE2_放果汁杯 = 10016; | |||||
public const int JUICE2_初始位 = 10001; | |||||
public const int JUICE2_检测位回原点 = 10001; | |||||
public const int JUICE2_取空杯过渡位 = 10004; | |||||
public const int JUICE2_取纸杯 = 10002; | |||||
public const int JUICE2_取纸杯检测 = 10003; | |||||
public const int JUICE2_再检测 = 10024; | public const int JUICE2_再检测 = 10024; | ||||
public const int JUICE2_接咖啡 = 10009; | |||||
public const int JUICE2_放咖啡杯 = 10010; | |||||
public const int JUICE2_接茶叶 = 10017; | |||||
public const int JUICE2_接茶水 = 10018; | |||||
public const int JUICE2_接水 = 10020; | |||||
public const int JUICE2_放水杯 = 10019; | |||||
public const int JUICE2_接果汁公共位 = 10011; | |||||
public const int JUICE2_接1号果汁 = 10012; | |||||
public const int JUICE2_接2号果汁 = 10013; | |||||
public const int JUICE2_接3号果汁 = 10014; | |||||
public const int JUICE2_接4号果汁 = 10015; | |||||
public const int JUICE2_放果汁杯 = 10016; | |||||
public const int JUICE2_二次取杯 = 10008; | |||||
//public const int JUICE2_取杯完成后接饮料过渡位 = 10004; | |||||
public const int JUICE2_接咖啡 = 10004; | |||||
//public const int JUICE2_接咖啡放杯过渡位 = 10004; | |||||
public const int JUICE2_接果汁1 = 10004; | |||||
public const int JUICE2_接果汁2 = 10004; | |||||
public const int JUICE2_接果汁3 = 10004; | |||||
public const int JUICE2_接果汁4 = 10004; | |||||
public const int JUICE2_接茶叶 = 10004; | |||||
public const int JUICE2_接茶水 = 10004; | |||||
public const int JUICE2_接开水 = 10004; | |||||
//public const int JUICE2_接开水_茶水放杯过渡位 = 10004; | |||||
public const int JUICE2_放咖啡杯 = 10004;//放咖啡杯包括取接好咖啡的流程 | |||||
public const int JUICE2_放果汁杯1 = 10004; | |||||
public const int JUICE2_放果汁杯2 = 10004; | |||||
public const int JUICE2_放果汁杯3 = 10004; | |||||
public const int JUICE2_放果汁杯4 = 10004; | |||||
public const int JUICE2_放水杯 = 10004; | |||||
#endregion | #endregion | ||||
#region 果汁机设备 MORKT1 JAKA机器人 | #region 果汁机设备 MORKT1 JAKA机器人 | ||||
@@ -51,6 +51,24 @@ namespace BPASmartClient.MorkS | |||||
} | } | ||||
} | } | ||||
ActionManage.GetInstance.Register(new Action(() => | |||||
{ | |||||
Random rd = new Random(); | |||||
ThreadManage.GetInstance().StartLong(new Action(() => | |||||
{ | |||||
int NoodleLoc = rd.Next(1, 6); | |||||
int BowlLoc = rd.Next(10, 11); | |||||
string guid = new Guid().ToString(); | |||||
mORKS.RBTakeNoodleTask.Enqueue(new OrderLocInfo() { Loc = (ushort)NoodleLoc, SuborderId = guid }); | |||||
MessageLog.GetInstance.Show($"添加订单:面条位置【{NoodleLoc}】"); | |||||
mORKS.TakeBowlTask.Enqueue(new OrderLocInfo() { Loc = (ushort)BowlLoc, SuborderId = guid }); | |||||
MessageLog.GetInstance.Show($"添加订单:碗位置【{BowlLoc}】"); | |||||
Thread.Sleep(60000); | |||||
}), "ForOrder"); | |||||
}), "EnableForOrder"); | |||||
ActionManage.GetInstance.Register(new Action<object>((o) => | ActionManage.GetInstance.Register(new Action<object>((o) => | ||||
{ | { | ||||
if (o != null && o is WritePar writePar) WriteData(writePar.Address, writePar.Value); | if (o != null && o is WritePar writePar) WriteData(writePar.Address, writePar.Value); | ||||
@@ -367,21 +385,21 @@ namespace BPASmartClient.MorkS | |||||
/// </summary> | /// </summary> | ||||
private void TurntableControl() | private void TurntableControl() | ||||
{ | { | ||||
//if (GeneralConfig.EnableLocalSimOrder) | |||||
//{ | |||||
// //不做轮询,直接取面,模拟订单使用 | |||||
// if (mORKS.TurntableMoveInPlace && !mORKS.Feeding && mORKS.InitComplete && !mORKS.AllowTakeNoodle && mORKS.RBTakeNoodleTask.Count > 0) | |||||
// { | |||||
// if (mORKS.TurntableLowerLimit) | |||||
// { | |||||
// TurntableStart(mORKS.RBTakeNoodleTask.ElementAt(0).Loc); | |||||
// mORKS.TurntableLocLists.Clear(); | |||||
// mORKS.AllowTakeNoodle = true; | |||||
// DeviceProcessLogShow($"控制机器人去转台【{mORKS.RBTakeNoodleTask.ElementAt(0).Loc}】号位置取面"); | |||||
// } | |||||
// } | |||||
//} | |||||
//else | |||||
if (Global.EnableLocalSimOrder) | |||||
{ | |||||
//不做轮询,直接取面,模拟订单使用 | |||||
if (mORKS.TurntableMoveInPlace && !mORKS.Feeding && mORKS.InitComplete && !mORKS.AllowTakeNoodle && mORKS.RBTakeNoodleTask.Count > 0) | |||||
{ | |||||
if (mORKS.TurntableLowerLimit) | |||||
{ | |||||
TurntableStart(mORKS.RBTakeNoodleTask.ElementAt(0).Loc); | |||||
mORKS.TurntableLocLists.Clear(); | |||||
mORKS.AllowTakeNoodle = true; | |||||
DeviceProcessLogShow($"控制机器人去转台【{mORKS.RBTakeNoodleTask.ElementAt(0).Loc}】号位置取面"); | |||||
} | |||||
} | |||||
} | |||||
else | |||||
{ | { | ||||
//正常轮询 | //正常轮询 | ||||
if (mORKS.TurntableMoveInPlace && !mORKS.Feeding && mORKS.InitComplete && !mORKS.AllowTakeNoodle && mORKS.RBTakeNoodleTask.Count > 0) | if (mORKS.TurntableMoveInPlace && !mORKS.Feeding && mORKS.InitComplete && !mORKS.AllowTakeNoodle && mORKS.RBTakeNoodleTask.Count > 0) | ||||
@@ -0,0 +1,13 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPASmartClient.MorkS.Model | |||||
{ | |||||
public class Global | |||||
{ | |||||
public static bool EnableLocalSimOrder { get; set; } | |||||
} | |||||
} |
@@ -1,4 +1,4 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | <PropertyGroup> | ||||
<TargetFramework>net6.0-windows</TargetFramework> | <TargetFramework>net6.0-windows</TargetFramework> | ||||
@@ -7,10 +7,20 @@ | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<ProjectReference Include="..\BPASmartClient.Business\BPASmartClient.Business.csproj" /> | |||||
<ProjectReference Include="..\BPASmartClient.Device\BPASmartClient.Device.csproj" /> | <ProjectReference Include="..\BPASmartClient.Device\BPASmartClient.Device.csproj" /> | ||||
<ProjectReference Include="..\BPASmartClient.DRCoffee\BPASmartClient.DRCoffee.csproj" /> | |||||
<ProjectReference Include="..\BPASmartClient.GSIceCream\BPASmartClient.GSIceCream.csproj" /> | |||||
<ProjectReference Include="..\BPASmartClient.Juicer\BPASmartClient.Juicer.csproj" /> | <ProjectReference Include="..\BPASmartClient.Juicer\BPASmartClient.Juicer.csproj" /> | ||||
<ProjectReference Include="..\BPASmartClient.Lebai\BPASmartClient.Lebai.csproj" /> | <ProjectReference Include="..\BPASmartClient.Lebai\BPASmartClient.Lebai.csproj" /> | ||||
<ProjectReference Include="..\BPASmartClient.MCU\BPASmartClient.MCU.csproj" /> | <ProjectReference Include="..\BPASmartClient.MCU\BPASmartClient.MCU.csproj" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | |||||
<Page Update="View\DebugView.xaml"> | |||||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime> | |||||
<SubType>Designer</SubType> | |||||
</Page> | |||||
</ItemGroup> | |||||
</Project> | </Project> |
@@ -0,0 +1,75 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using BPASmartClient.Device; | |||||
using System.Collections.Concurrent; | |||||
namespace BPASmartClient.MorkTLebaiJC | |||||
{ | |||||
public class GVL_MorkTLebaiJC : IStatus | |||||
{ | |||||
/// <summary> | |||||
/// <summary> | |||||
/// 咖啡订单队列 | |||||
/// </summary> | |||||
public ConcurrentQueue<OrderLocInfo> morkOrderPushesCoffee = new ConcurrentQueue<OrderLocInfo>(); | |||||
/// <summary> | |||||
/// 是否有咖啡杯 | |||||
/// </summary> | |||||
public bool IsHaveCoffeeCup = false; | |||||
/// <summary> | |||||
/// 咖啡是否制作完成 | |||||
/// </summary> | |||||
public bool MakeCoffeeEnd = false; | |||||
/// <summary> | |||||
/// 果汁订单队列 | |||||
/// </summary> | |||||
public ConcurrentQueue<OrderLocInfo> morkOrderPushesJuicer = new ConcurrentQueue<OrderLocInfo>(); | |||||
/// <summary> | |||||
/// 果汁是否在制作中 | |||||
/// </summary> | |||||
public bool IsHaveJuiceCup = false; | |||||
/// <summary> | |||||
/// 咖啡是否制作完成 | |||||
/// </summary> | |||||
public bool MakeJuiceEnd = false; | |||||
/// <summary> | |||||
/// 做茶订单队列 | |||||
/// </summary> | |||||
public ConcurrentQueue<OrderLocInfo> morkOrderPushesTea = new ConcurrentQueue<OrderLocInfo>(); | |||||
/// <summary> | |||||
/// 茶或水是否在制作中 | |||||
/// </summary> | |||||
public bool IsHaveTeaWaterCup = false; | |||||
/// <summary> | |||||
/// 咖啡是否制作完成 | |||||
/// </summary> | |||||
public bool MakeTeaEnd = false; | |||||
/// <summary> | |||||
/// 做开水订单队列 | |||||
/// </summary> | |||||
public ConcurrentQueue<OrderLocInfo> morkOrderPushesWater = new ConcurrentQueue<OrderLocInfo>(); | |||||
/// <summary> | |||||
/// 等待取餐订单 | |||||
/// </summary> | |||||
public OrderLocInfo waitMorkOrder = new OrderLocInfo(); | |||||
/// <summary> | |||||
/// 当前正在制作咖啡 | |||||
/// </summary> | |||||
public OrderLocInfo MakeCoffeeOrder = new OrderLocInfo(); | |||||
/// <summary> | |||||
/// 订单ID | |||||
/// </summary> | |||||
public string SuborderId = null; | |||||
} | |||||
} |
@@ -0,0 +1,17 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace BPASmartClient.MorkTLebaiJC | |||||
{ | |||||
public class OrderLocInfo | |||||
{ | |||||
public string SuborderId { get; set; } | |||||
public ushort Loc { get; set; } | |||||
public ushort RecipeNumber { get; set; } | |||||
public int BatchingId { get; set; } | |||||
public string GoodName { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,399 @@ | |||||
<UserControl x:Class="BPASmartClient.MorkTJAKAJC.View.DebugView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:vm="clr-namespace:BPASmartClient.MorkTLebaiJC.ViewModel" | |||||
mc:Ignorable="d" | |||||
Name="调试界面" | |||||
d:DesignHeight="500" d:DesignWidth="1000" Unloaded="Dubug_Unloaded"> | |||||
<UserControl.DataContext> | |||||
<vm:DebugViewModel/> | |||||
</UserControl.DataContext> | |||||
<UserControl.Resources> | |||||
<ResourceDictionary> | |||||
<ResourceDictionary.MergedDictionaries> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||||
</ResourceDictionary.MergedDictionaries> | |||||
</ResourceDictionary> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="10*"/> | |||||
<ColumnDefinition Width="10*"/> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="10*"/> | |||||
<RowDefinition Height="10*"/> | |||||
<RowDefinition Height="20*"/> | |||||
</Grid.RowDefinitions> | |||||
<GroupBox Grid.ColumnSpan="2" | |||||
FontFamily="楷体" | |||||
FontSize="20" | |||||
Header=" 乐白机器人 "> | |||||
<Grid Margin="10"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="*"/> | |||||
<RowDefinition Height="*"/> | |||||
<RowDefinition Height="3*"/> | |||||
</Grid.RowDefinitions> | |||||
<StackPanel Orientation="Horizontal"> | |||||
<TextBlock Text="连接状态" /> | |||||
<TextBlock Text="{Binding RobotConnected}" | |||||
Margin="40,0"/> | |||||
<TextBlock Text="机器人模式:"/> | |||||
<TextBlock Text="{Binding RobotMode}" | |||||
Margin="40,0"/> | |||||
</StackPanel> | |||||
<TextBlock Text="连接状态" /> | |||||
<TextBlock Text="{Binding RobotConnected}" | |||||
Margin="120,0,0,0"/> | |||||
<ListBox Grid.Row="2" Background="Transparent" Margin="0,0,0,-9"> | |||||
<ListBox.Template> | |||||
<ControlTemplate TargetType="{x:Type ListBox}"> | |||||
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"> | |||||
<WrapPanel Orientation="Horizontal" IsItemsHost="True" ScrollViewer.CanContentScroll="True"/> | |||||
</ScrollViewer> | |||||
</ControlTemplate> | |||||
</ListBox.Template> | |||||
<Button Content="机器人启动" | |||||
Margin="20,5" Width="80" Height="40" | |||||
Command="{Binding Button_RobotControlCommand}" | |||||
CommandParameter="机器人启动"> | |||||
</Button> | |||||
<Button Content="启动示教" | |||||
Margin="20,5" Width="80" Height="40" | |||||
Command="{Binding Button_RobotControlCommand}" | |||||
CommandParameter="启动示教"/> | |||||
<Button Content="停止示教" | |||||
Margin="20,5" Width="80" Height="40" | |||||
Command="{Binding Button_RobotControlCommand}" | |||||
CommandParameter="停止示教"/> | |||||
<Button Content="机器人急停" | |||||
Margin="20,5" Width="80" Height="40" | |||||
Command="{Binding Button_RobotControlCommand}" | |||||
CommandParameter="机器人急停"/> | |||||
<Button Content="暂停" | |||||
Margin="10,5" Width="40" Height="40" | |||||
Command="{Binding Button_RobotControlCommand}" | |||||
CommandParameter="暂停"/> | |||||
<Button Content="恢复" | |||||
Margin="10,5" Width="40" Height="40" | |||||
Command="{Binding Button_RobotControlCommand}" | |||||
CommandParameter="恢复"/> | |||||
</ListBox> | |||||
<Grid Margin="629,-24,19,0" Grid.RowSpan="3"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition></RowDefinition> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<Grid Grid.Row="0"> | |||||
<TextBlock>DI</TextBlock> | |||||
<CheckBox Margin="50,0,0,0" IsEnabled="false" Name="Robot_DI0">DI0</CheckBox> | |||||
<CheckBox Margin="120,0,0,0" IsEnabled="false" Name="Robot_DI1">DI1</CheckBox> | |||||
<CheckBox Margin="190,0,0,0" IsEnabled="false" Name="Robot_DI2">DI2</CheckBox> | |||||
<CheckBox Margin="260,0,0,0" IsEnabled="false" Name="Robot_DI3">DI3</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Row="1"> | |||||
<TextBlock Width="50">DO</TextBlock> | |||||
<ComboBox Width="70" Margin="50,12,268,10" SelectedIndex="{Binding Lebai_DO_CH}"> | |||||
<ComboBoxItem IsSelected="true">DO0</ComboBoxItem> | |||||
<ComboBoxItem>DO1</ComboBoxItem> | |||||
<ComboBoxItem>DO2</ComboBoxItem> | |||||
<ComboBoxItem>DO3</ComboBoxItem> | |||||
</ComboBox> | |||||
<ComboBox Margin="142,12,108,10" Width="70" SelectedIndex="{Binding Lebai_DO_Value}"> | |||||
<ComboBoxItem IsSelected="true">true</ComboBoxItem> | |||||
<ComboBoxItem>false</ComboBoxItem> | |||||
</ComboBox> | |||||
<Button Width="50" Margin="260,12,10,10" Command="{Binding Button_LebaiDOuputCommand}" >输出</Button> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | |||||
</GroupBox> | |||||
<GroupBox Grid.Row="2" | |||||
FontFamily="楷体" | |||||
FontSize="20" | |||||
Header=" 果汁机 "> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="3*"/> | |||||
<RowDefinition Height="3*"/> | |||||
<RowDefinition Height="3*"/> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="连接状态" /> | |||||
<TextBlock Text="{Binding JuicerConnected}" | |||||
Margin="120,0,0,0"/> | |||||
<Grid Grid.Row="1"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="120"/> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="设备状态" /> | |||||
<Grid Grid.Column="1"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Grid.Column="0" Name="Heating" HorizontalAlignment="Center">制热</TextBlock> | |||||
<TextBlock Grid.Column="1" Name="cooling" HorizontalAlignment="Center">制冷</TextBlock> | |||||
<TextBlock Grid.Column="2" Name="LackOfWater" HorizontalAlignment="Center">缺水</TextBlock> | |||||
<TextBlock Grid.Column="3" Name="ChildLocks" HorizontalAlignment="Center">童锁</TextBlock> | |||||
<TextBlock Grid.Column="4" Name="Use" HorizontalAlignment="Center">使用</TextBlock> | |||||
</Grid> | |||||
</Grid> | |||||
<StackPanel Grid.Row="2" Orientation="Vertical"> | |||||
<StackPanel Margin="0,10,0,0" Orientation="Horizontal"> | |||||
<TextBlock>果汁</TextBlock> | |||||
<ComboBox Margin="100,0,0,0" | |||||
Width="100" > | |||||
<ComboBoxItem IsSelected="true">饮品1</ComboBoxItem> | |||||
<ComboBoxItem>饮品2</ComboBoxItem> | |||||
<ComboBoxItem>饮品3</ComboBoxItem> | |||||
<ComboBoxItem>饮品4</ComboBoxItem> | |||||
</ComboBox> | |||||
<ComboBox Margin="20,0,0,0" Width="100"> | |||||
<ComboBoxItem IsSelected="true">冷饮</ComboBoxItem> | |||||
<ComboBoxItem>热饮</ComboBoxItem> | |||||
</ComboBox> | |||||
<Button Command="{Binding Button_MakeIceCreamCommand}" | |||||
Margin="20,0" | |||||
Content="制作" /> | |||||
</StackPanel> | |||||
<StackPanel Margin="0,10,0,0" Orientation="Horizontal"> | |||||
</StackPanel> | |||||
</StackPanel> | |||||
</Grid> | |||||
</GroupBox> | |||||
<GroupBox Grid.Row="2" Grid.Column="1" | |||||
FontFamily="楷体" | |||||
FontSize="20" | |||||
Header=" 咖啡机"> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="30"/> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="连接状态" /> | |||||
<TextBlock Text="{Binding CoffeeConnected}" | |||||
Margin="120,0,0,0"/> | |||||
<Grid Grid.Row="1"> | |||||
<Grid.Resources> | |||||
<Style TargetType="TextBlock"> | |||||
<Setter Property="HorizontalAlignment" Value="Left" /> | |||||
<Setter Property="VerticalAlignment" Value="Center" /> | |||||
</Style> | |||||
</Grid.Resources> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="99" /> | |||||
<ColumnDefinition Width="140" /> | |||||
<ColumnDefinition Width="100" /> | |||||
<ColumnDefinition Width="171" /> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Height="23" Width="100" FontSize="18" HorizontalAlignment="Center">咖啡机状态</TextBlock> | |||||
<TextBlock FontSize="18" | |||||
Grid.Column="1" | |||||
Text="{Binding CoffeeStatus}" Height="23" /> | |||||
<TextBlock Grid.Column="2" Height="23" Width="80" FontSize="18">应用状态</TextBlock> | |||||
<TextBlock FontSize="18" | |||||
Grid.Column="3" | |||||
Text="{Binding AppStatus}" Height="23"/> | |||||
<TextBlock Grid.Row="1" Grid.Column="0" Height="22" Width="80" FontSize="18">告警信息</TextBlock> | |||||
<TextBlock FontSize="15" | |||||
Grid.Row="1" | |||||
Grid.Column="1" | |||||
Text="{Binding Warning}" /> | |||||
<TextBlock Grid.Row="1" Grid.Column="2" Height="22" Width="80" FontSize="18">故障信息</TextBlock> | |||||
<TextBlock FontSize="18" | |||||
Grid.Row="1" | |||||
Grid.Column="3" | |||||
Text="{Binding CaffeeFault}" Height="22" Width="60" /> | |||||
</Grid> | |||||
<StackPanel Grid.Row="2" Orientation="Vertical"> | |||||
<StackPanel Margin="0,10,0,0" Orientation="Horizontal"> | |||||
<TextBlock>饮品</TextBlock> | |||||
<ComboBox Margin="10,0" | |||||
Width="100" | |||||
ItemsSource="{Binding Coffees}" | |||||
SelectedItem="{Binding SelectedCoffee}" /> | |||||
<Button Margin="10,0" | |||||
Command="{}" | |||||
Content="制作"/> | |||||
<Button Margin="10,0" | |||||
Command="{}" | |||||
Content="停止制作"/> | |||||
</StackPanel> | |||||
<StackPanel Margin="0,10,0,0" Orientation="Horizontal"> | |||||
<TextBlock>模式</TextBlock> | |||||
<ComboBox Margin="10,0" | |||||
Width="100" | |||||
ItemsSource="{Binding CoffeeCmds}" | |||||
SelectedItem="{Binding SelectedCoffeeCmd}"/> | |||||
<Button Margin="10,0" | |||||
Command="{}" | |||||
Content="设置" Cursor="Hand"/> | |||||
</StackPanel> | |||||
</StackPanel> | |||||
</Grid> | |||||
</GroupBox> | |||||
<GroupBox Header="单片机控制" | |||||
FontSize="18" | |||||
Grid.Row="1" Grid.ColumnSpan="2" | |||||
Margin="0,0,0,10"> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="5*"/> | |||||
<ColumnDefinition Width="5*"/> | |||||
<ColumnDefinition Width="13*"/> | |||||
<ColumnDefinition Width="7*"/> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid Grid.Column="0" > | |||||
<TextBlock FontSize="12">连接状态</TextBlock> | |||||
<TextBlock Text="{Binding MCUConnected}" | |||||
Margin="70,0,0,0"/> | |||||
<TextBlock FontSize="12"></TextBlock> | |||||
</Grid> | |||||
<Grid Grid.Column="1" > | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition></RowDefinition> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid Grid.Row="0" Grid.Column="0" > | |||||
<TextBlock FontSize="12" HorizontalAlignment="Center">舵机控制</TextBlock> | |||||
</Grid> | |||||
<Grid Grid.Row="0" Grid.Column="1"> | |||||
<ComboBox Margin="0,0,0,0" FontSize="12" Width="60" SelectedIndex="{Binding MCU_PWM_CH}"> | |||||
<ComboBoxItem IsSelected="true">舵机1</ComboBoxItem> | |||||
<ComboBoxItem>舵机2</ComboBoxItem> | |||||
<ComboBoxItem>舵机3</ComboBoxItem> | |||||
<ComboBoxItem>舵机4</ComboBoxItem> | |||||
</ComboBox> | |||||
</Grid> | |||||
<Grid Grid.Row="1" Grid.Column="0"> | |||||
<Button FontSize="15" HorizontalAlignment="Center" Command="{Binding Button_MCUOuputCommand}">输出</Button> | |||||
</Grid> | |||||
<Grid Grid.Row="1" Grid.Column="1" Width="60" > | |||||
<TextBox Text="{Binding PWMInputNumber}"></TextBox> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | |||||
<Grid Grid.Column="2" > | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition></RowDefinition> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid Grid.Row="0" Grid.Column="0" > | |||||
<TextBlock FontSize="12" HorizontalAlignment="Center">DI输入</TextBlock> | |||||
</Grid> | |||||
<Grid Grid.Row="1" Grid.Column="0" Width="400"> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid Grid.Column="0"> | |||||
<CheckBox FontSize="12" IsEnabled="false" IsChecked="{Binding CH0}">DI0</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Column="1"> | |||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH1">DI1</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Column="2"> | |||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH2">DI2</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Column="3"> | |||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH3">DI3</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Column="4"> | |||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH4">DI4</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Column="5"> | |||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH5">DI5</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Column="6"> | |||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH6">DI6</CheckBox> | |||||
</Grid> | |||||
<Grid Grid.Column="7"> | |||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH7">DI7</CheckBox> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | |||||
<Grid Grid.Column="3" > | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition></RowDefinition> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid Grid.Column="0"> | |||||
<TextBlock FontSize="12" HorizontalAlignment="Center">DO输出</TextBlock> | |||||
</Grid> | |||||
<Grid Grid.Column="1" Grid.Row="0"> | |||||
<ComboBox Width="50" FontSize="12" HorizontalAlignment="Center" SelectedIndex="{Binding MCU_DO_CH}"> | |||||
<ComboBoxItem IsSelected="true">DO0</ComboBoxItem> | |||||
<ComboBoxItem>DO1</ComboBoxItem> | |||||
<ComboBoxItem>DO2</ComboBoxItem> | |||||
<ComboBoxItem>DO3</ComboBoxItem> | |||||
<ComboBoxItem>DO4</ComboBoxItem> | |||||
<ComboBoxItem>DO5</ComboBoxItem> | |||||
<ComboBoxItem>DO6</ComboBoxItem> | |||||
<ComboBoxItem>DO7</ComboBoxItem> | |||||
</ComboBox> | |||||
</Grid> | |||||
<Grid Grid.Column="0" Grid.Row="1"> | |||||
<Button Width="50" Command="{Binding Button_MCUDOuputCommand}">输出</Button> | |||||
</Grid> | |||||
<Grid Grid.Column="1" Grid.Row="1"> | |||||
<RadioButton FontSize="12" IsChecked="{Binding MCU_DO_Value}">True</RadioButton> | |||||
<RadioButton Margin="50,0,0,0" FontSize="12">false</RadioButton> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | |||||
</GroupBox> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,37 @@ | |||||
using BPASmartClient.Helper; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace BPASmartClient.MorkTJAKAJC.View | |||||
{ | |||||
/// <summary> | |||||
/// DebugView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class DebugView : UserControl | |||||
{ | |||||
public DebugView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
private void Dubug_Unloaded(object sender, RoutedEventArgs e) | |||||
{ | |||||
ThreadManage.GetInstance().StopTask("MorkT-状态刷新"); | |||||
ThreadManage.GetInstance().StopTask("MorkT-传感器监视"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,235 @@ | |||||
using BPASmartClient.Business; | |||||
using BPASmartClient.Device; | |||||
using BPASmartClient.DRCoffee; | |||||
using BPASmartClient.EventBus; | |||||
using BPASmartClient.GSIceCream; | |||||
using BPASmartClient.Helper; | |||||
using BPASmartClient.LebaiRobot; | |||||
using BPASmartClient.Message; | |||||
using BPASmartClient.Model; | |||||
using BPASmartClient.Model.乐白机器人; | |||||
using BPASmartClient.Model.冰淇淋.Enum; | |||||
using BPASmartClient.Model.单片机; | |||||
using BPASmartClient.Model.单片机.Enum; | |||||
using BPASmartClient.Model.咖啡机.Enum; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Threading; | |||||
namespace BPASmartClient.MorkTLebaiJC.ViewModel; | |||||
public class DebugViewModel : ObservableObject | |||||
{ | |||||
#region 乐白机器人 | |||||
/// <summary> | |||||
/// 乐白机器人连接状态 | |||||
/// </summary> | |||||
public string RobotConnected { get { return _robotConnected; } set { _robotConnected = value; OnPropertyChanged(); } } | |||||
private string _robotConnected { get; set; } | |||||
/// <summary> | |||||
/// 乐白机器人的模式状态 | |||||
/// </summary> | |||||
public string RobotMode { get { return _robotMode; } set { _robotMode = value; OnPropertyChanged(); } } | |||||
private string _robotMode { get; set; } | |||||
/// <summary> | |||||
/// 机器人控制指令 | |||||
/// </summary> | |||||
public RelayCommand<object> Button_RobotControlCommand { get; set; } | |||||
/// <summary> | |||||
/// 机器人控制 | |||||
/// </summary> | |||||
/// <param name="o"></param> | |||||
private void Button_RobotControl(object o) | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new LebaiRobot_LebaiControlEvent { DeviceId = DeviceId, LebaiControl = o.ToString() }); | |||||
} | |||||
#endregion | |||||
#region 果汁机 | |||||
/// <summary> | |||||
/// 果汁机的连接状态 | |||||
/// </summary> | |||||
public string JuicerConnected { get { return _JuicerConnected; } set { _JuicerConnected = value; OnPropertyChanged(); } } | |||||
private string _JuicerConnected { get; set; } | |||||
/// <summary> | |||||
/// 果汁机的状态 | |||||
/// </summary> | |||||
public string JuicerState { get { return _JuicerState; } set { _JuicerState = value; OnPropertyChanged(); } } | |||||
private string _JuicerState { get; set; } | |||||
#endregion | |||||
#region 咖啡机 | |||||
/// <summary> | |||||
/// 咖啡机连接状态 | |||||
/// </summary> | |||||
public string CoffeeConnected { get { return _coffeeConnected; } set { _coffeeConnected = value; OnPropertyChanged(); } } | |||||
private string _coffeeConnected { get; set; } | |||||
/// <summary> | |||||
/// 咖啡机状态 | |||||
/// </summary> | |||||
public string CoffeeStatus { get { return _coffeeStatus; } set { _coffeeStatus = value; OnPropertyChanged(); } } | |||||
private string _coffeeStatus { get; set; } | |||||
/// <summary> | |||||
/// 应用状态 | |||||
/// </summary> | |||||
public string AppStatus { get { return _appStatus; } set { _appStatus = value; OnPropertyChanged(); } } | |||||
private string _appStatus { get; set; } | |||||
/// <summary> | |||||
/// 告警 | |||||
/// </summary> | |||||
public string Warning { get { return _warning; } set { _warning = value; OnPropertyChanged(); } } | |||||
public string _warning { get; set; } | |||||
/// <summary> | |||||
/// 故障信息 | |||||
/// </summary> | |||||
public string CaffeeFault { get { return _caffeeFault; } set { _caffeeFault = value; OnPropertyChanged(); } } | |||||
public string _caffeeFault { get; set; } | |||||
public List<string> Coffees { get; set; } = new List<string>(); | |||||
public string SelectedCoffee { get; set; } | |||||
public List<string> CoffeeCmds { get; set; } = new List<string>(); | |||||
public string SelectedCoffeeCmd { get; set; } | |||||
/// <summary> | |||||
/// 制作咖啡 | |||||
/// </summary> | |||||
public RelayCommand Button_MakeCoffeeCommand { get; set; } | |||||
/// <summary> | |||||
/// 停止制作咖啡 | |||||
/// </summary> | |||||
public RelayCommand Button_StopMakeCoffeCommand { get; set; } | |||||
/// <summary> | |||||
/// 咖啡模式设置 | |||||
/// </summary> | |||||
public RelayCommand Button_CoffeeModeSetCommand { get; set; } | |||||
private void Button_MakeCoffee() | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_MakeCoffeeEvent() { DeviceId = DeviceId, DrinkCode = (DrCoffeeDrinksCode)Enum.Parse(typeof(DrCoffeeDrinksCode), SelectedCoffee)}); | |||||
} | |||||
private void Button_StopMakeCoffe() | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_CancelMakeCoffeeEvent() { DeviceId = DeviceId }); | |||||
} | |||||
private void Button_CoffeeModeSet() | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_CoffeeCommCmdEvent() { DeviceId = DeviceId, CommCmd = (DrCoffeeCommCmd)Enum.Parse(typeof(DrCoffeeCommCmd), SelectedCoffeeCmd)}); | |||||
} | |||||
#endregion | |||||
#region 单片机 | |||||
public string MCUConnected { get { return _mcuConnected; } set { _mcuConnected = value; OnPropertyChanged(); } } | |||||
private string _mcuConnected { get; set; } | |||||
public RelayCommand Button_MCUOuputCommand { get; set; } | |||||
public RelayCommand Button_MCUDOuputCommand { get; set; } | |||||
public RelayCommand Button_LebaiDOuputCommand { get; set; } | |||||
public int PWMInputNumber { get { return _pwmInputNumber; } set { _pwmInputNumber = value; OnPropertyChanged(); } } | |||||
private int _pwmInputNumber = 1; | |||||
public int MCU_PWM_CH { get { return _choosePWM; } set { _choosePWM = value; OnPropertyChanged(); } } | |||||
private int _choosePWM = 1; | |||||
public int MCU_DO_CH { get { return _mcuDO_CH; } set { _mcuDO_CH = value; OnPropertyChanged(); } } | |||||
private int _mcuDO_CH = 1; | |||||
public int Lebai_DO_CH { get { return _lebaiDO_CH; } set { _lebaiDO_CH = value; OnPropertyChanged(); } } | |||||
private int _lebaiDO_CH = 1; | |||||
public int Lebai_DO_Value { get { return _lebaiDO_Value; } set { _lebaiDO_Value = value; OnPropertyChanged(); } } | |||||
private int _lebaiDO_Value = 1; | |||||
private int[] DICH { get { return _diCH; } set { _diCH = value; OnPropertyChanged(); } } | |||||
private int[] _diCH = new int[8]; | |||||
public bool MCU_DO_Value { get { return _mcu_DO_Valuer; } set { _mcu_DO_Valuer = value; OnPropertyChanged(); } } | |||||
private bool _mcu_DO_Valuer = true; | |||||
private void Button_McuOutput() | |||||
{ | |||||
string sChoosePWM =Convert.ToString(MCU_PWM_CH+1); | |||||
new WriteMcu() { TagName = "ServoControl", Address = sChoosePWM, Value = PWMInputNumber }.Publish(); | |||||
} | |||||
private void Button_McuDOutput() | |||||
{ | |||||
string sChooseDO = Convert.ToString(MCU_DO_CH + 1); | |||||
new WriteMcu() { TagName = "OutputControl", Address = sChooseDO, Value = MCU_DO_Value }.Publish(); | |||||
} | |||||
private void Button_LebaiDOutput() | |||||
{ | |||||
string sChooseDO = Convert.ToString(Lebai_DO_CH + 1); | |||||
} | |||||
#endregion | |||||
/// <summary> | |||||
/// 设备ID | |||||
/// </summary> | |||||
public int DeviceId { get; set; } | |||||
/// <summary> | |||||
/// 设备数据 | |||||
/// </summary> | |||||
public ObservableCollection<VariableMonitor> variableMonitors { get; set; } | |||||
public DebugViewModel() | |||||
{ | |||||
Button_RobotControlCommand = new RelayCommand<object>(Button_RobotControl); | |||||
Button_MakeCoffeeCommand = new RelayCommand(Button_MakeCoffee); | |||||
Button_StopMakeCoffeCommand = new RelayCommand(Button_StopMakeCoffe); | |||||
Button_CoffeeModeSetCommand = new RelayCommand(Button_CoffeeModeSet); | |||||
Button_MCUOuputCommand = new RelayCommand(Button_McuOutput); | |||||
Button_MCUDOuputCommand = new RelayCommand(Button_McuDOutput); | |||||
Button_LebaiDOuputCommand = new RelayCommand(Button_LebaiDOutput); | |||||
foreach (DrCoffeeDrinksCode code in Enum.GetValues(typeof(DrCoffeeDrinksCode))) | |||||
{ | |||||
Coffees.Add(code.ToString()); | |||||
} | |||||
SelectedCoffee = Coffees[0]; | |||||
foreach (DrCoffeeCommCmd code in Enum.GetValues(typeof(DrCoffeeCommCmd))) | |||||
{ | |||||
CoffeeCmds.Add(code.ToString()); | |||||
} | |||||
SelectedCoffeeCmd = CoffeeCmds[0]; | |||||
Plugin.GetInstance()?.GetPlugin<DeviceMgr>()?.GetDevices().ForEach(device => | |||||
{ | |||||
if (device.Name == "MorkT") DeviceId = device.DeviceId | |||||
; | |||||
}); | |||||
ThreadManage.GetInstance().StartLong(new Action(() => | |||||
{ | |||||
variableMonitors = Plugin.GetInstance()?.GetPlugin<DeviceMgr>()?.GetDevices()?.FirstOrDefault(p => p.DeviceId == DeviceId)?.variableMonitors; | |||||
if (variableMonitors != null && variableMonitors.Count > 0) | |||||
{ | |||||
RobotConnected = variableMonitors.FirstOrDefault(p=>p.Notes == "机器人连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | |||||
CoffeeConnected = variableMonitors.FirstOrDefault(p => p.Notes == "咖啡机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | |||||
JuicerConnected = variableMonitors.FirstOrDefault(p => p.Notes == "果汁机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | |||||
MCUConnected = variableMonitors.FirstOrDefault(p => p.Notes == "单片机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | |||||
RobotMode = variableMonitors.FirstOrDefault(p => p.Notes == "机器人状态").CurrentValue; | |||||
CoffeeStatus = variableMonitors.FirstOrDefault(p => p.Notes == "咖啡机状态").CurrentValue; | |||||
AppStatus = variableMonitors.FirstOrDefault(p => p.Notes == "咖啡机应用状态").CurrentValue; | |||||
Warning = variableMonitors.FirstOrDefault(p => p.Notes == "咖啡机告警").CurrentValue; | |||||
CaffeeFault = variableMonitors.FirstOrDefault(p => p.Notes == "咖啡机故障").CurrentValue; | |||||
} | |||||
Thread.Sleep(500); | |||||
}), "MorkT-状态刷新"); | |||||
} | |||||
} | |||||
@@ -0,0 +1,94 @@ | |||||
using BPASmartClient.Business; | |||||
using BPASmartClient.Helper; | |||||
using BPASmartClient.Model.乐白机器人; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Globalization; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading; | |||||
using System.Threading.Tasks; | |||||
using System.Windows.Data; | |||||
using System.Windows.Media; | |||||
namespace BPASmartClient.MorkTLebaiJC.ViewModel | |||||
{ | |||||
public class MonitorViewModel: ObservableObject | |||||
{ | |||||
#region 传感器 | |||||
/// <summary> | |||||
/// 机器人夹爪传感器 | |||||
/// </summary> | |||||
public bool RobotSenser { get { return _robotSenser; } set { _robotSenser = value; OnPropertyChanged(); } } | |||||
private bool _robotSenser; | |||||
/// <summary> | |||||
/// 冰淇淋出口传感器 | |||||
/// </summary> | |||||
public bool IceCreamSenser { get { return _iceCreamSenser; } set { _iceCreamSenser = value; OnPropertyChanged(); } } | |||||
private bool _iceCreamSenser; | |||||
/// <summary> | |||||
/// 取餐口检测传感器 | |||||
/// </summary> | |||||
public bool TakeMealSenser { get { return _takeMealSenser; } set { _takeMealSenser = value; OnPropertyChanged(); } } | |||||
private bool _takeMealSenser; | |||||
#endregion | |||||
/// <summary> | |||||
/// 设备ID | |||||
/// </summary> | |||||
int DeviceId; | |||||
public MonitorViewModel() | |||||
{ | |||||
Plugin.GetInstance()?.GetPlugin<DeviceMgr>()?.GetDevices().ForEach(device => | |||||
{ | |||||
if (device.Name == "MorkT") DeviceId = device.DeviceId; | |||||
}); | |||||
ThreadManage.GetInstance().StartLong(new Action(() => | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new LebaiRobot_GetTCPInputEvent() { DeviceId = DeviceId, Pin = 1 },(res)=> | |||||
{ | |||||
if(res != null&& res.Length>0&& res[0] is bool b) | |||||
{ | |||||
RobotSenser = b; | |||||
} | |||||
}); | |||||
EventBus.EventBus.GetInstance().Publish(new LebaiRobot_GetInputEvent() { DeviceId = DeviceId, Pin = 0 }, (res) => | |||||
{ | |||||
if (res != null && res.Length > 0 && res[0] is bool b) | |||||
{ | |||||
TakeMealSenser = b; | |||||
} | |||||
}); | |||||
EventBus.EventBus.GetInstance().Publish(new LebaiRobot_GetTCPInputEvent() { DeviceId = DeviceId, Pin = 3 }, (res) => | |||||
{ | |||||
if (res != null && res.Length > 0 && res[0] is bool b) | |||||
{ | |||||
IceCreamSenser = b; | |||||
} | |||||
}); | |||||
Thread.Sleep(500); | |||||
}), "MorkT-传感器监视"); | |||||
} | |||||
} | |||||
public class BoolToColorConvert : IValueConverter | |||||
{ | |||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) | |||||
{ | |||||
return (bool) value? new SolidColorBrush(Color.FromRgb(144, 238, 144)) : new SolidColorBrush(Color.FromRgb(178, 34, 34)); | |||||
} | |||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) | |||||
{ | |||||
throw new NotImplementedException(); | |||||
} | |||||
} | |||||
} |
@@ -79,11 +79,11 @@ | |||||
<Button Content="暂停" | <Button Content="暂停" | ||||
Margin="10,5" Width="40" Height="40" | Margin="10,5" Width="40" Height="40" | ||||
Command="{Binding Button_RobotControlCommand}" | Command="{Binding Button_RobotControlCommand}" | ||||
CommandParameter="机器人急停"/> | |||||
CommandParameter="暂停"/> | |||||
<Button Content="恢复" | <Button Content="恢复" | ||||
Margin="10,5" Width="40" Height="40" | Margin="10,5" Width="40" Height="40" | ||||
Command="{Binding Button_RobotControlCommand}" | Command="{Binding Button_RobotControlCommand}" | ||||
CommandParameter="机器人急停"/> | |||||
CommandParameter="恢复"/> | |||||
</ListBox> | </ListBox> | ||||
<Grid Margin="629,-24,19,0" Grid.RowSpan="3"> | <Grid Margin="629,-24,19,0" Grid.RowSpan="3"> | ||||
<Grid.RowDefinitions> | <Grid.RowDefinitions> | ||||
@@ -125,7 +125,7 @@ | |||||
<RowDefinition Height="3*"/> | <RowDefinition Height="3*"/> | ||||
</Grid.RowDefinitions> | </Grid.RowDefinitions> | ||||
<TextBlock Text="连接状态" /> | <TextBlock Text="连接状态" /> | ||||
<TextBlock Text="{Binding IceCreamConnected}" | |||||
<TextBlock Text="{Binding JuicerConnected}" | |||||
Margin="120,0,0,0"/> | Margin="120,0,0,0"/> | ||||
<Grid Grid.Row="1"> | <Grid Grid.Row="1"> | ||||
<Grid.RowDefinitions> | <Grid.RowDefinitions> | ||||
@@ -273,6 +273,8 @@ | |||||
</Grid.ColumnDefinitions> | </Grid.ColumnDefinitions> | ||||
<Grid Grid.Column="0" > | <Grid Grid.Column="0" > | ||||
<TextBlock FontSize="12">连接状态</TextBlock> | <TextBlock FontSize="12">连接状态</TextBlock> | ||||
<TextBlock Text="{Binding MCUConnected}" | |||||
Margin="70,0,0,0"/> | |||||
<TextBlock FontSize="12"></TextBlock> | <TextBlock FontSize="12"></TextBlock> | ||||
</Grid> | </Grid> | ||||
<Grid Grid.Column="1" > | <Grid Grid.Column="1" > | ||||
@@ -290,7 +292,7 @@ | |||||
</Grid> | </Grid> | ||||
<Grid Grid.Row="0" Grid.Column="1"> | <Grid Grid.Row="0" Grid.Column="1"> | ||||
<ComboBox Margin="0,0,0,0" FontSize="12" Width="60"> | |||||
<ComboBox Margin="0,0,0,0" FontSize="12" Width="60" SelectedIndex="{Binding MCU_PWM_CH}"> | |||||
<ComboBoxItem IsSelected="true">舵机1</ComboBoxItem> | <ComboBoxItem IsSelected="true">舵机1</ComboBoxItem> | ||||
<ComboBoxItem>舵机2</ComboBoxItem> | <ComboBoxItem>舵机2</ComboBoxItem> | ||||
<ComboBoxItem>舵机3</ComboBoxItem> | <ComboBoxItem>舵机3</ComboBoxItem> | ||||
@@ -298,10 +300,10 @@ | |||||
</ComboBox> | </ComboBox> | ||||
</Grid> | </Grid> | ||||
<Grid Grid.Row="1" Grid.Column="0"> | <Grid Grid.Row="1" Grid.Column="0"> | ||||
<Button FontSize="15" HorizontalAlignment="Center">输出</Button> | |||||
<Button FontSize="15" HorizontalAlignment="Center" Command="{Binding Button_MCUOuputCommand}">输出</Button> | |||||
</Grid> | </Grid> | ||||
<Grid Grid.Row="1" Grid.Column="1" Width="60"> | |||||
<TextBox>1</TextBox> | |||||
<Grid Grid.Row="1" Grid.Column="1" Width="60" > | |||||
<TextBox Text="{Binding PWMInputNumber}"></TextBox> | |||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
@@ -330,7 +332,7 @@ | |||||
<ColumnDefinition></ColumnDefinition> | <ColumnDefinition></ColumnDefinition> | ||||
</Grid.ColumnDefinitions> | </Grid.ColumnDefinitions> | ||||
<Grid Grid.Column="0"> | <Grid Grid.Column="0"> | ||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH0">DI0</CheckBox> | |||||
<CheckBox FontSize="12" IsEnabled="false" IsChecked="{Binding CH0}">DI0</CheckBox> | |||||
</Grid> | </Grid> | ||||
<Grid Grid.Column="1"> | <Grid Grid.Column="1"> | ||||
<CheckBox FontSize="12" IsEnabled="false" Name="CH1">DI1</CheckBox> | <CheckBox FontSize="12" IsEnabled="false" Name="CH1">DI1</CheckBox> | ||||
@@ -372,7 +374,7 @@ | |||||
<TextBlock FontSize="12" HorizontalAlignment="Center">DO输出</TextBlock> | <TextBlock FontSize="12" HorizontalAlignment="Center">DO输出</TextBlock> | ||||
</Grid> | </Grid> | ||||
<Grid Grid.Column="1" Grid.Row="0"> | <Grid Grid.Column="1" Grid.Row="0"> | ||||
<ComboBox Width="50" FontSize="12" HorizontalAlignment="Center"> | |||||
<ComboBox Width="50" FontSize="12" HorizontalAlignment="Center" SelectedIndex="{Binding MCU_DO_CH}"> | |||||
<ComboBoxItem IsSelected="true">DO0</ComboBoxItem> | <ComboBoxItem IsSelected="true">DO0</ComboBoxItem> | ||||
<ComboBoxItem>DO1</ComboBoxItem> | <ComboBoxItem>DO1</ComboBoxItem> | ||||
<ComboBoxItem>DO2</ComboBoxItem> | <ComboBoxItem>DO2</ComboBoxItem> | ||||
@@ -384,10 +386,10 @@ | |||||
</ComboBox> | </ComboBox> | ||||
</Grid> | </Grid> | ||||
<Grid Grid.Column="0" Grid.Row="1"> | <Grid Grid.Column="0" Grid.Row="1"> | ||||
<Button Width="50">输出</Button> | |||||
<Button Width="50" Command="{Binding Button_MCUDOuputCommand}">输出</Button> | |||||
</Grid> | </Grid> | ||||
<Grid Grid.Column="1" Grid.Row="1"> | <Grid Grid.Column="1" Grid.Row="1"> | ||||
<RadioButton FontSize="12" IsChecked="true">True</RadioButton> | |||||
<RadioButton FontSize="12" IsChecked="{Binding MCU_DO_Value}">True</RadioButton> | |||||
<RadioButton Margin="50,0,0,0" FontSize="12">false</RadioButton> | <RadioButton Margin="50,0,0,0" FontSize="12">false</RadioButton> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
@@ -30,6 +30,8 @@ namespace BPASmartClient.MorkTJAKAJC.View | |||||
{ | { | ||||
ThreadManage.GetInstance().StopTask("MorkT-状态刷新"); | ThreadManage.GetInstance().StopTask("MorkT-状态刷新"); | ||||
ThreadManage.GetInstance().StopTask("MorkT-传感器监视"); | ThreadManage.GetInstance().StopTask("MorkT-传感器监视"); | ||||
} | } | ||||
} | } | ||||
} | } |
@@ -19,7 +19,6 @@ using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | using System.Collections.ObjectModel; | ||||
using System.Linq; | using System.Linq; | ||||
using System.Threading; | using System.Threading; | ||||
namespace BPASmartClient.MorkTJAKAJC.ViewModel; | namespace BPASmartClient.MorkTJAKAJC.ViewModel; | ||||
public class DebugViewModel : ObservableObject | public class DebugViewModel : ObservableObject | ||||
{ | { | ||||
@@ -65,109 +64,104 @@ namespace BPASmartClient.MorkTJAKAJC.ViewModel; | |||||
public string JuicerState { get { return _JuicerState; } set { _JuicerState = value; OnPropertyChanged(); } } | public string JuicerState { get { return _JuicerState; } set { _JuicerState = value; OnPropertyChanged(); } } | ||||
private string _JuicerState { get; set; } | private string _JuicerState { get; set; } | ||||
#endregion | |||||
#endregion | |||||
#region 咖啡机 | #region 咖啡机 | ||||
/// <summary> | |||||
/// 咖啡机连接状态 | |||||
/// </summary> | |||||
public string CoffeeConnected { get { return _coffeeConnected; } set { _coffeeConnected = value; OnPropertyChanged(); } } | |||||
private string _coffeeConnected { get; set; } | |||||
/// <summary> | |||||
/// 咖啡机状态 | |||||
/// </summary> | |||||
public string CoffeeStatus { get { return _coffeeStatus; } set { _coffeeStatus = value; OnPropertyChanged(); } } | |||||
private string _coffeeStatus { get; set; } | |||||
/// <summary> | |||||
/// 应用状态 | |||||
/// </summary> | |||||
public string AppStatus { get { return _appStatus; } set { _appStatus = value; OnPropertyChanged(); } } | |||||
private string _appStatus { get; set; } | |||||
/// <summary> | |||||
/// 告警 | |||||
/// </summary> | |||||
public string Warning { get { return _warning; } set { _warning = value; OnPropertyChanged(); } } | |||||
public string _warning { get; set; } | |||||
/// <summary> | |||||
/// 故障信息 | |||||
/// </summary> | |||||
public string CaffeeFault { get { return _caffeeFault; } set { _caffeeFault = value; OnPropertyChanged(); } } | |||||
public string _caffeeFault { get; set; } | |||||
public List<string> Coffees { get; set; } = new List<string>(); | |||||
public string SelectedCoffee { get; set; } | |||||
public List<string> CoffeeCmds { get; set; } = new List<string>(); | |||||
public string SelectedCoffeeCmd { get; set; } | |||||
/// <summary> | |||||
/// 制作咖啡 | |||||
/// </summary> | |||||
public RelayCommand Button_MakeCoffeeCommand { get; set; } | |||||
/// <summary> | |||||
/// 停止制作咖啡 | |||||
/// </summary> | |||||
public RelayCommand Button_StopMakeCoffeCommand { get; set; } | |||||
/// <summary> | |||||
/// 咖啡模式设置 | |||||
/// <summary> | |||||
/// 咖啡机连接状态 | |||||
/// </summary> | /// </summary> | ||||
public RelayCommand Button_CoffeeModeSetCommand { get; set; } | |||||
private void Button_MakeCoffee() | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_MakeCoffeeEvent() { DeviceId = DeviceId, DrinkCode = (DrCoffeeDrinksCode)Enum.Parse(typeof(DrCoffeeDrinksCode), SelectedCoffee)}); | |||||
} | |||||
private void Button_StopMakeCoffe() | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_CancelMakeCoffeeEvent() { DeviceId = DeviceId }); | |||||
} | |||||
private void Button_CoffeeModeSet() | |||||
{ | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_CoffeeCommCmdEvent() { DeviceId = DeviceId, CommCmd = (DrCoffeeCommCmd)Enum.Parse(typeof(DrCoffeeCommCmd), SelectedCoffeeCmd)}); | |||||
} | |||||
#endregion | |||||
#region 单片机 | |||||
public string CoffeeConnected { get { return _coffeeConnected; } set { _coffeeConnected = value; OnPropertyChanged(); } } | |||||
private string _coffeeConnected { get; set; } | |||||
/// <summary> | |||||
/// 咖啡机状态 | |||||
/// </summary> | |||||
public string CoffeeStatus { get { return _coffeeStatus; } set { _coffeeStatus = value; OnPropertyChanged(); } } | |||||
private string _coffeeStatus { get; set; } | |||||
/// <summary> | |||||
/// 应用状态 | |||||
/// </summary> | |||||
public string AppStatus { get { return _appStatus; } set { _appStatus = value; OnPropertyChanged(); } } | |||||
private string _appStatus { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 咖啡杯或冰淇淋杯落杯 | |||||
/// 告警 | |||||
/// </summary> | /// </summary> | ||||
public RelayCommand<object> Button_CupControlCommand { get; set; } | |||||
public string Warning { get { return _warning; } set { _warning = value; OnPropertyChanged(); } } | |||||
public string _warning { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 单片机冰淇淋机器制冷 | |||||
/// 故障信息 | |||||
/// </summary> | /// </summary> | ||||
public RelayCommand Button_SCChipRefrigerationCommand { get; set; } | |||||
public string CaffeeFault { get { return _caffeeFault; } set { _caffeeFault = value; OnPropertyChanged(); } } | |||||
public string _caffeeFault { get; set; } | |||||
public List<string> Coffees { get; set; } = new List<string>(); | |||||
public string SelectedCoffee { get; set; } | |||||
public List<string> CoffeeCmds { get; set; } = new List<string>(); | |||||
public string SelectedCoffeeCmd { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 单片机冰淇淋机器打料 | |||||
/// 制作咖啡 | |||||
/// </summary> | /// </summary> | ||||
public RelayCommand Button_SCChipDischargeCommand { get; set; } | |||||
public RelayCommand Button_MakeCoffeeCommand { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 模拟测试 | |||||
/// 停止制作咖啡 | |||||
/// </summary> | /// </summary> | ||||
public RelayCommand Button_SCChipTestCommand { get; set; } | |||||
public RelayCommand Button_StopMakeCoffeCommand { get; set; } | |||||
/// <summary> | |||||
/// 咖啡模式设置 | |||||
/// </summary> | |||||
public RelayCommand Button_CoffeeModeSetCommand { get; set; } | |||||
private void Button_CupControl(object CupType) | |||||
private void Button_MakeCoffee() | |||||
{ | { | ||||
EventBus.EventBus.GetInstance().Publish(new SCChip_TakeCupEvent() { DeviceId = DeviceId, Cup = (IC_CUP)Enum.Parse(typeof(IC_CUP), CupType.ToString()) }); | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_MakeCoffeeEvent() { DeviceId = DeviceId, DrinkCode = (DrCoffeeDrinksCode)Enum.Parse(typeof(DrCoffeeDrinksCode), SelectedCoffee)}); | |||||
} | } | ||||
private void Button_SCChipRefrigeration() | |||||
private void Button_StopMakeCoffe() | |||||
{ | { | ||||
EventBus.EventBus.GetInstance().Publish(new SCChip_RotorSwitchEvent { DeviceId = DeviceId, TurnOn = true }); | |||||
Thread.Sleep(500); | |||||
EventBus.EventBus.GetInstance().Publish(new SCChip_RotorSwitchEvent { DeviceId = DeviceId, TurnOn = false }); | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_CancelMakeCoffeeEvent() { DeviceId = DeviceId }); | |||||
} | } | ||||
private void Button_SCChipDischarge() | |||||
private void Button_CoffeeModeSet() | |||||
{ | { | ||||
EventBus.EventBus.GetInstance().Publish(new SCChip_MakeIceCreamEvent { DeviceId = DeviceId, SteeringEngine = IC_SE.SE_2 }); | |||||
EventBus.EventBus.GetInstance().Publish(new DRCoffee_CoffeeCommCmdEvent() { DeviceId = DeviceId, CommCmd = (DrCoffeeCommCmd)Enum.Parse(typeof(DrCoffeeCommCmd), SelectedCoffeeCmd)}); | |||||
} | } | ||||
#endregion | #endregion | ||||
/// <summary> | |||||
/// 设备ID | |||||
/// </summary> | |||||
public int DeviceId { get; set; } | |||||
#region 单片机 | |||||
public string MCUConnected { get { return _mcuConnected; } set { _mcuConnected = value; OnPropertyChanged(); } } | |||||
private string _mcuConnected { get; set; } | |||||
public RelayCommand Button_MCUOuputCommand { get; set; } | |||||
public RelayCommand Button_MCUDOuputCommand { get; set; } | |||||
public int PWMInputNumber { get { return _pwmInputNumber; } set { _pwmInputNumber = value; OnPropertyChanged(); } } | |||||
private int _pwmInputNumber = 1; | |||||
public int MCU_PWM_CH { get { return _choosePWM; } set { _choosePWM = value; OnPropertyChanged(); } } | |||||
private int _choosePWM = 1; | |||||
public int MCU_DO_CH { get { return _mcuDO_CH; } set { _mcuDO_CH = value; OnPropertyChanged(); } } | |||||
private int _mcuDO_CH = 1; | |||||
private int[] DICH { get { return _diCH; } set { _diCH = value; OnPropertyChanged(); } } | |||||
private int[] _diCH = new int[8]; | |||||
public bool MCU_DO_Value { get { return _mcu_DO_Valuer; } set { _mcu_DO_Valuer = value; OnPropertyChanged(); } } | |||||
private bool _mcu_DO_Valuer = true; | |||||
private void Button_McuOutput() | |||||
{ | |||||
string sChoosePWM =Convert.ToString(MCU_PWM_CH+1); | |||||
new WriteMcu() { TagName = "ServoControl", Address = sChoosePWM, Value = PWMInputNumber }.Publish(); | |||||
} | |||||
private void Button_McuDOutput() | |||||
{ | |||||
string sChooseDO = Convert.ToString(MCU_DO_CH + 1); | |||||
new WriteMcu() { TagName = "OutputControl", Address = sChooseDO, Value = MCU_DO_Value }.Publish(); | |||||
} | |||||
#endregion | |||||
/// <summary> | |||||
/// 设备ID | |||||
/// </summary> | |||||
public int DeviceId { get; set; } | |||||
/// <summary> | /// <summary> | ||||
/// 设备数据 | /// 设备数据 | ||||
/// </summary> | /// </summary> | ||||
@@ -180,15 +174,8 @@ namespace BPASmartClient.MorkTJAKAJC.ViewModel; | |||||
Button_StopMakeCoffeCommand = new RelayCommand(Button_StopMakeCoffe); | Button_StopMakeCoffeCommand = new RelayCommand(Button_StopMakeCoffe); | ||||
Button_CoffeeModeSetCommand = new RelayCommand(Button_CoffeeModeSet); | Button_CoffeeModeSetCommand = new RelayCommand(Button_CoffeeModeSet); | ||||
Button_CupControlCommand = new RelayCommand<object>(Button_CupControl); | |||||
Button_SCChipRefrigerationCommand = new RelayCommand(Button_SCChipRefrigeration); | |||||
Button_SCChipDischargeCommand = new RelayCommand(Button_SCChipDischarge); | |||||
Button_SCChipTestCommand = new RelayCommand(() => | |||||
{ | |||||
Button_SCChipRefrigeration(); | |||||
Thread.Sleep(50); | |||||
Button_SCChipDischarge(); | |||||
}); | |||||
Button_MCUOuputCommand = new RelayCommand(Button_McuOutput); | |||||
Button_MCUDOuputCommand = new RelayCommand(Button_McuDOutput); | |||||
foreach (DrCoffeeDrinksCode code in Enum.GetValues(typeof(DrCoffeeDrinksCode))) | foreach (DrCoffeeDrinksCode code in Enum.GetValues(typeof(DrCoffeeDrinksCode))) | ||||
{ | { | ||||
@@ -216,9 +203,10 @@ namespace BPASmartClient.MorkTJAKAJC.ViewModel; | |||||
if (variableMonitors != null && variableMonitors.Count > 0) | if (variableMonitors != null && variableMonitors.Count > 0) | ||||
{ | { | ||||
RobotConnected = variableMonitors.FirstOrDefault(p=>p.Notes == "机器人连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | |||||
RobotConnected = variableMonitors.FirstOrDefault(p=>p.Notes == "机器人连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | |||||
CoffeeConnected = variableMonitors.FirstOrDefault(p => p.Notes == "咖啡机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | CoffeeConnected = variableMonitors.FirstOrDefault(p => p.Notes == "咖啡机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | ||||
JuicerConnected = variableMonitors.FirstOrDefault(p => p.Notes == "果汁机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | JuicerConnected = variableMonitors.FirstOrDefault(p => p.Notes == "果汁机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | ||||
MCUConnected = variableMonitors.FirstOrDefault(p => p.Notes == "单片机连接状态").CurrentValue == "True" ? "已连接" : "未连接"; | |||||
RobotMode = variableMonitors.FirstOrDefault(p => p.Notes == "机器人状态").CurrentValue; | RobotMode = variableMonitors.FirstOrDefault(p => p.Notes == "机器人状态").CurrentValue; | ||||
@@ -229,7 +217,6 @@ namespace BPASmartClient.MorkTJAKAJC.ViewModel; | |||||
} | } | ||||
Thread.Sleep(500); | Thread.Sleep(500); | ||||
}), "MorkT-状态刷新"); | }), "MorkT-状态刷新"); | ||||
} | } | ||||
@@ -7,14 +7,14 @@ | |||||
<add key="IsEnableTest" value="false"/> | <add key="IsEnableTest" value="false"/> | ||||
<!--开发环境--> | <!--开发环境--> | ||||
<add key="apollouri" value="http://10.2.1.21:28080/"/> | |||||
<!--<add key="apollouri" value="http://10.2.1.21:28080/"/> | |||||
<add key="AppId" value="dev1_common"/> | <add key="AppId" value="dev1_common"/> | ||||
<add key ="Namespaces" value="DEV.Config"/> | |||||
<add key ="Namespaces" value="DEV.Config"/>--> | |||||
<!--正式环境--> | <!--正式环境--> | ||||
<!--<add key="apollouri" value="http://47.108.65.220:28080/"/> | |||||
<add key="apollouri" value="http://47.108.65.220:28080/"/> | |||||
<add key="AppId" value="order"/> | <add key="AppId" value="order"/> | ||||
<add key ="Namespaces" value="TEST1.Config"/>--> | |||||
<add key ="Namespaces" value="TEST1.Config"/> | |||||
<!--阿里云上报启动方式:API 或者 LOCAL--> | <!--阿里云上报启动方式:API 或者 LOCAL--> | ||||
<!--API :通过客户端ID,调用接口查询“设备连接信息”--> | <!--API :通过客户端ID,调用接口查询“设备连接信息”--> | ||||
@@ -5,10 +5,18 @@ | |||||
<TargetFramework>net6.0-windows</TargetFramework> | <TargetFramework>net6.0-windows</TargetFramework> | ||||
<Nullable>enable</Nullable> | <Nullable>enable</Nullable> | ||||
<UseWPF>true</UseWPF> | <UseWPF>true</UseWPF> | ||||
<ApplicationManifest>app.manifest</ApplicationManifest> | |||||
<ApplicationIcon>hbl.ico</ApplicationIcon> | |||||
</PropertyGroup> | </PropertyGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
<Content Include="hbl.ico" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="BPA.Message" Version="1.0.39" /> | |||||
<PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.1.2" /> | <PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.1.2" /> | ||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||
@@ -16,4 +24,10 @@ | |||||
<ProjectReference Include="..\BPASmartClient.Modbus\BPASmartClient.Modbus.csproj" /> | <ProjectReference Include="..\BPASmartClient.Modbus\BPASmartClient.Modbus.csproj" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | |||||
<Page Update="View\AdminstratorsView.xaml"> | |||||
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime> | |||||
</Page> | |||||
</ItemGroup> | |||||
</Project> | </Project> |
@@ -0,0 +1,23 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
namespace DosingSystem.Model | |||||
{ | |||||
public class ActionMenu : ObservableObject | |||||
{ | |||||
public string CommandParameter { get { return _mCommandParameter; } set { _mCommandParameter = value; OnPropertyChanged(); } } | |||||
private string _mCommandParameter; | |||||
public Permission[] permission { get { return _mpermission; } set { _mpermission = value; OnPropertyChanged(); } } | |||||
private Permission[] _mpermission; | |||||
public string MenuName { get { return _mMenuName; } set { _mMenuName = value; OnPropertyChanged(); } } | |||||
private string _mMenuName; | |||||
} | |||||
} |
@@ -0,0 +1,49 @@ | |||||
using BPA.Message; | |||||
using Newtonsoft.Json; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace DosingSystem.Model | |||||
{ | |||||
public class Config | |||||
{ | |||||
private volatile static Config _Instance; | |||||
public static Config GetInstance => _Instance ?? (_Instance = new Config()); | |||||
private Config() { } | |||||
public void Init() | |||||
{ | |||||
if (File.Exists("up.hbl")) | |||||
{ | |||||
var result = JsonConvert.DeserializeObject<UserManager>(File.ReadAllText("up.hbl").AESDecrypt()); | |||||
if (result == null || (result != null && result.userInfos.Count <= 0)) | |||||
{ | |||||
AddData(); | |||||
} | |||||
else | |||||
{ | |||||
Global.userManager = result; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
AddData(); | |||||
} | |||||
} | |||||
private void AddData() | |||||
{ | |||||
Global.userManager.userInfos.Add(new UserInfo() { permission = Permission.管理员, UserName = "admin", Password = "admin" }); | |||||
Global.userManager.userInfos.Add(new UserInfo() { permission = Permission.操作员, UserName = "czy", Password = "123456" }); | |||||
Global.userManager.userInfos.Add(new UserInfo() { permission = Permission.观察员, UserName = "gcy", Password = "654321" }); | |||||
Global.userManager.userInfos.Add(new UserInfo() { permission = Permission.技术员, UserName = "jsy", Password = "88888888" }); | |||||
File.WriteAllText("up.hbl", JsonConvert.SerializeObject(Global.userManager).AESEncrypt()); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,13 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace DosingSystem.Model | |||||
{ | |||||
public class Global | |||||
{ | |||||
public static UserManager userManager { get; set; } = new UserManager(); | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace DosingSystem.Model | |||||
{ | |||||
public class UserManager | |||||
{ | |||||
public List<UserInfo> userInfos { get; set; } = new List<UserInfo>(); | |||||
} | |||||
public class UserInfo | |||||
{ | |||||
public Permission permission { get; set; } | |||||
public string UserName { get; set; } | |||||
public string Password { get; set; } | |||||
} | |||||
public enum Permission : int | |||||
{ | |||||
管理员 = 1, | |||||
操作员 = 2, | |||||
观察员 = 3, | |||||
技术员=4 | |||||
} | |||||
} |
@@ -0,0 +1,178 @@ | |||||
<UserControl | |||||
x:Class="DosingSystem.View.AdminstratorsView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:helper="clr-namespace:DosingSystem.View.Helper" | |||||
xmlns:local="clr-namespace:DosingSystem.View" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:uc="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource" | |||||
xmlns:vm="clr-namespace:DosingSystem.ViewModel" | |||||
d:DesignHeight="600" | |||||
d:DesignWidth="800" | |||||
Loaded="UserControl_Loaded" | |||||
mc:Ignorable="d"> | |||||
<UserControl.DataContext> | |||||
<vm:AdminstratorsViewModel /> | |||||
</UserControl.DataContext> | |||||
<UserControl.Resources> | |||||
<Style x:Key="TxLogin" TargetType="TextBlock"> | |||||
<Setter Property="FontSize" Value="20" /> | |||||
<Setter Property="Foreground" Value="#ddd" /> | |||||
<Setter Property="HorizontalAlignment" Value="Center" /> | |||||
<Setter Property="VerticalAlignment" Value="Center" /> | |||||
</Style> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<!--<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="7*" /> | |||||
<ColumnDefinition Width="10*" /> | |||||
</Grid.ColumnDefinitions>--> | |||||
<!--<Grid.RowDefinitions> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="4*" /> | |||||
<RowDefinition Height="8*" /> | |||||
<RowDefinition Height="20*" /> | |||||
</Grid.RowDefinitions>--> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<!--#region 登录--> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="0.7*"/> | |||||
<ColumnDefinition /> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="权限:" /> | |||||
<ComboBox | |||||
Grid.Column="1" | |||||
Width="230" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
BorderBrush="#FF074B92" | |||||
BorderThickness="1" | |||||
FontFamily="楷体" | |||||
FontSize="20" | |||||
Foreground="#FF2AB2E7" | |||||
IsEditable="False" | |||||
ItemsSource="{Binding permission}" | |||||
Style="{StaticResource ComboBoxStyle}" | |||||
Text="{Binding SelectText}" /> | |||||
<TextBlock | |||||
Grid.Row="1" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="账号:" /> | |||||
<TextBox | |||||
x:Name="tbx_admin" | |||||
Grid.Row="1" | |||||
Grid.Column="1" | |||||
Width="230" | |||||
Height="28" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
HorizontalContentAlignment="Center" | |||||
VerticalContentAlignment="Top" | |||||
Background="Transparent" | |||||
BorderBrush="White" | |||||
BorderThickness="0,0,0,1" | |||||
FontSize="20" | |||||
Foreground="#F8F8FF" | |||||
GotFocus="TextBox_GotFocus" | |||||
Text="{Binding Admin, Mode=TwoWay}" /> | |||||
<TextBlock | |||||
Grid.Row="2" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="密码:" /> | |||||
<PasswordBox | |||||
x:Name="password" | |||||
Grid.Row="2" | |||||
Grid.Column="1" | |||||
Width="230" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
HorizontalContentAlignment="Center" | |||||
VerticalContentAlignment="Top" | |||||
helper:PasswordBoxHelper.PasswordContent="{Binding Password, Mode=TwoWay}" | |||||
Background="Transparent" | |||||
BorderBrush="White" | |||||
BorderThickness="0,0,0,1" | |||||
CaretBrush="White" | |||||
FontSize="16" | |||||
Foreground="#F8F8FF" | |||||
GotFocus="Password_GotFocus" /> | |||||
<TextBlock | |||||
Grid.Row="3" | |||||
Grid.ColumnSpan="2" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
FontFamily="楷体" | |||||
FontSize="16" | |||||
Foreground="#FFE2415C" | |||||
Text="{Binding ErrorMessage}" | |||||
TextWrapping="Wrap" /> | |||||
<Button | |||||
Grid.Row="4" | |||||
Grid.ColumnSpan="2" | |||||
Width="120" | |||||
Height="40" | |||||
VerticalAlignment="Center" | |||||
Background="Transparent" | |||||
BorderBrush="#ff19b7ec" | |||||
BorderThickness="2" | |||||
Command="{Binding AdminLoginCommand}" | |||||
Content="登 录" | |||||
FontSize="28" | |||||
Foreground="#9934F7F7" | |||||
IsDefault="True" /> | |||||
</Grid> | |||||
<!--#endregion--> | |||||
<!--#region 密码修改--> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition /> | |||||
<ColumnDefinition /> | |||||
</Grid.ColumnDefinitions> | |||||
</Grid> | |||||
<!--#endregion--> | |||||
<uc:UserKeyBoard | |||||
x:Name="myKeyboard" | |||||
Grid.Row="5" | |||||
Grid.ColumnSpan="2" | |||||
Margin="100,10,100,50" | |||||
Focusable="False" /> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,91 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
using static BPASmartClient.CustomResource.UserControls.UserKeyBoard; | |||||
namespace DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// AdministratorsView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class AdminstratorsView : UserControl | |||||
{ | |||||
public AdminstratorsView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
private void UserControl_Loaded(object sender, RoutedEventArgs e) | |||||
{ | |||||
this.tbx_admin.Focus(); | |||||
} | |||||
private void MyKeyDown_Admin(object _key) | |||||
{ | |||||
EKeyitem key = EKeyitem.A; | |||||
if (_key.GetType() == typeof(EKeyitem)) key = (EKeyitem)_key; | |||||
switch (key) | |||||
{ | |||||
case EKeyitem.DEL: | |||||
if (tbx_admin.Text.Length > 0) | |||||
{ | |||||
tbx_admin.Text = tbx_admin.Text.Substring(0, tbx_admin.Text.Length - 1); | |||||
} | |||||
break; | |||||
case EKeyitem.AC: | |||||
tbx_admin.Text = string.Empty; | |||||
break; | |||||
case EKeyitem.OK: | |||||
break; | |||||
default: | |||||
tbx_admin.Text += _key.ToString(); | |||||
break; | |||||
} | |||||
this.tbx_admin.Focus(); | |||||
} | |||||
private void MyKeyDown_Password(object _key) | |||||
{ | |||||
EKeyitem key = EKeyitem.A; | |||||
if (_key.GetType() == typeof(EKeyitem)) key = (EKeyitem)_key; | |||||
switch (key) | |||||
{ | |||||
case EKeyitem.DEL: | |||||
if (password.Password.Length > 0) | |||||
{ | |||||
password.Password = password.Password.Substring(0, password.Password.Length - 1); | |||||
} | |||||
break; | |||||
case EKeyitem.AC: | |||||
password.Password = string.Empty; | |||||
break; | |||||
case EKeyitem.OK: | |||||
break; | |||||
default: | |||||
password.Password += _key.ToString(); | |||||
break; | |||||
} | |||||
} | |||||
private void TextBox_GotFocus(object sender, RoutedEventArgs e) | |||||
{ | |||||
myKeyboard.MyKeyDown = MyKeyDown_Admin; | |||||
} | |||||
private void Password_GotFocus(object sender, RoutedEventArgs e) | |||||
{ | |||||
myKeyboard.MyKeyDown = MyKeyDown_Password; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,40 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
namespace DosingSystem.View.Helper | |||||
{ | |||||
/// <summary> | |||||
/// 为PasswordBox控件的Password增加绑定功能 | |||||
/// </summary> | |||||
public static class PasswordBoxHelper | |||||
{ | |||||
public static string GetPasswordContent(DependencyObject obj) => (string)obj.GetValue(PasswordContentProperty); | |||||
public static void SetPasswordContent(DependencyObject obj, string value) => obj.SetValue(PasswordContentProperty, value); | |||||
public static readonly DependencyProperty PasswordContentProperty = | |||||
DependencyProperty.RegisterAttached("PasswordContent", typeof(string), typeof(PasswordBoxHelper), | |||||
new PropertyMetadata(string.Empty, OnPasswordContentPropertyChanged)); | |||||
private static void OnPasswordContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |||||
{ | |||||
var box = d as PasswordBox; | |||||
box.PasswordChanged -= OnPasswordChanged; | |||||
var password = (string)e.NewValue; | |||||
if (box != null && box.Password != password) | |||||
box.Password = password; | |||||
box.PasswordChanged += OnPasswordChanged; | |||||
} | |||||
private static void OnPasswordChanged(object sender, RoutedEventArgs e) | |||||
{ | |||||
var box = sender as PasswordBox; | |||||
SetPasswordContent(box, box.Password); | |||||
} | |||||
} | |||||
} |
@@ -23,6 +23,29 @@ | |||||
<ResourceDictionary.MergedDictionaries> | <ResourceDictionary.MergedDictionaries> | ||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | <ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | ||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | <ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | ||||
<ResourceDictionary> | |||||
<!--#region ListBox样式--> | |||||
<Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}"> | |||||
<Setter Property="OverridesDefaultStyle" Value="True" /> | |||||
<Setter Property="SnapsToDevicePixels" Value="True" /> | |||||
<Setter Property="BorderBrush" Value="{x:Null}" /> | |||||
<Setter Property="Foreground" Value="White" /> | |||||
<Setter Property="FontSize" Value="20" /> | |||||
<Setter Property="HorizontalContentAlignment" Value="Center" /> | |||||
<Setter Property="VerticalContentAlignment" Value="Center" /> | |||||
<Setter Property="Template"> | |||||
<Setter.Value> | |||||
<ControlTemplate TargetType="{x:Type ListBoxItem}"> | |||||
<Border x:Name="border" CornerRadius="8"> | |||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> | |||||
</Border> | |||||
</ControlTemplate> | |||||
</Setter.Value> | |||||
</Setter> | |||||
</Style> | |||||
<!--#endregion--> | |||||
</ResourceDictionary> | |||||
</ResourceDictionary.MergedDictionaries> | </ResourceDictionary.MergedDictionaries> | ||||
</ResourceDictionary> | </ResourceDictionary> | ||||
</Window.Resources> | </Window.Resources> | ||||
@@ -56,33 +79,29 @@ | |||||
Style="{DynamicResource imagetop_Title}" /> | Style="{DynamicResource imagetop_Title}" /> | ||||
<Grid Grid.Column="1"> | <Grid Grid.Column="1"> | ||||
<StackPanel Orientation="Horizontal"> | |||||
<RadioButton | |||||
Command="{Binding TogglePag}" | |||||
CommandParameter="RecipeSettingsView.配方设置" | |||||
Content="配方设置" | |||||
Style="{StaticResource MenuRadioButtonStyle}" /> | |||||
<RadioButton | |||||
Command="{Binding TogglePag}" | |||||
CommandParameter="DeviceListView.设备列表" | |||||
Content="设备列表" | |||||
Style="{StaticResource MenuRadioButtonStyle}" /> | |||||
<RadioButton | |||||
Command="{Binding TogglePag}" | |||||
CommandParameter="HardwareStatusView.硬件状态" | |||||
Content="硬件状态" | |||||
Style="{StaticResource MenuRadioButtonStyle}" /> | |||||
<RadioButton | |||||
Command="{Binding TogglePag}" | |||||
CommandParameter="AlarmRecordView.报警记录" | |||||
Content="报警记录" | |||||
Style="{StaticResource MenuRadioButtonStyle}" /> | |||||
<RadioButton | |||||
Command="{Binding TogglePag}" | |||||
CommandParameter="RecipeControlView.配方控制" | |||||
Content="配方控制" | |||||
Style="{StaticResource MenuRadioButtonStyle}" /> | |||||
</StackPanel> | |||||
<ListBox | |||||
x:Name="lstEnt" | |||||
Background="{x:Null}" | |||||
BorderBrush="{x:Null}" | |||||
BorderThickness="0" | |||||
ItemContainerStyle="{StaticResource ResourceKey=ListBoxItemStyle1}" | |||||
ItemsSource="{Binding Menus}"> | |||||
<ListBox.ItemsPanel> | |||||
<ItemsPanelTemplate> | |||||
<StackPanel Orientation="Horizontal" /> | |||||
</ItemsPanelTemplate> | |||||
</ListBox.ItemsPanel> | |||||
<ListBox.ItemTemplate> | |||||
<DataTemplate> | |||||
<RadioButton | |||||
Command="{Binding DataContext.TogglePag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}" | |||||
CommandParameter="{Binding CommandParameter}" | |||||
Content="{Binding MenuName}" | |||||
GroupName="all" | |||||
Style="{StaticResource MenuRadioButtonStyle}" /> | |||||
</DataTemplate> | |||||
</ListBox.ItemTemplate> | |||||
</ListBox> | |||||
</Grid> | </Grid> | ||||
<StackPanel | <StackPanel | ||||
@@ -92,21 +111,61 @@ | |||||
VerticalAlignment="Top" | VerticalAlignment="Top" | ||||
Orientation="Horizontal"> | Orientation="Horizontal"> | ||||
<Border Style="{DynamicResource border竖线}" /> | <Border Style="{DynamicResource border竖线}" /> | ||||
<StackPanel | |||||
Margin="5" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center"> | |||||
<TextBlock FontSize="12">网</TextBlock> | |||||
<TextBlock FontSize="12">络</TextBlock> | |||||
</StackPanel> | |||||
<ToggleButton | |||||
Margin="5" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Cursor="Hand" | |||||
IsChecked="{Binding NetworkConnectState}" | |||||
Style="{DynamicResource StatusBtnStyle网络连接状态}" | |||||
ToolTip="网络连接状态" /> | |||||
<Grid> | |||||
<ToggleButton | |||||
Name="tb" | |||||
Margin="5" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Cursor="Hand" | |||||
IsChecked="{Binding UserManagement}" | |||||
Style="{DynamicResource StatusBtnStyle网络连接状态}" | |||||
ToolTip="用户管理" /> | |||||
<!-- 当 StaysOpen 设置为 True 时 popup失去焦点的时候不会自动关闭 --> | |||||
<Popup | |||||
AllowsTransparency="True" | |||||
Focusable="False" | |||||
IsOpen="{Binding IsChecked, ElementName=tb}" | |||||
Placement="Bottom" | |||||
PlacementTarget="{Binding ElementName=tb}" | |||||
StaysOpen="False"> | |||||
<Border Background="#081424" ClipToBounds="True"> | |||||
<Grid Width="100" Margin="0"> | |||||
<StackPanel Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}"> | |||||
<Button | |||||
Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}" | |||||
Margin="0,5,0,1" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Command="{Binding PasswordChange}" | |||||
Content="密码修改" | |||||
Cursor="Hand" /> | |||||
<Button | |||||
Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}" | |||||
Margin="0,5,0,1" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Command="{Binding Login}" | |||||
Content="登录账号" | |||||
Cursor="Hand" /> | |||||
<Button | |||||
Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}" | |||||
Margin="0,5,0,1" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Command="{Binding ExitLogin}" | |||||
Content="退出登录" | |||||
Cursor="Hand" /> | |||||
</StackPanel> | |||||
</Grid> | |||||
</Border> | |||||
</Popup> | |||||
</Grid> | |||||
<Border Style="{DynamicResource border竖线}" /> | <Border Style="{DynamicResource border竖线}" /> | ||||
<ToggleButton | <ToggleButton | ||||
HorizontalAlignment="Center" | HorizontalAlignment="Center" | ||||
@@ -176,7 +235,16 @@ | |||||
Foreground="#feffff" | Foreground="#feffff" | ||||
Text="{Binding WindowTitleName}" /> | Text="{Binding WindowTitleName}" /> | ||||
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal"> | |||||
<!--<StackPanel HorizontalAlignment="Right" Orientation="Horizontal"> | |||||
<Button | |||||
Grid.Row="0" | |||||
Width="70" | |||||
Margin="5,0,5,0" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Top" | |||||
Command="{Binding Login}" | |||||
Content="账号修改" | |||||
Cursor="Hand" /> | |||||
<Button | <Button | ||||
Name="login" | Name="login" | ||||
Grid.Row="0" | Grid.Row="0" | ||||
@@ -184,7 +252,7 @@ | |||||
Margin="5,0,5,0" | Margin="5,0,5,0" | ||||
HorizontalAlignment="Right" | HorizontalAlignment="Right" | ||||
VerticalAlignment="Top" | VerticalAlignment="Top" | ||||
Click="Button_Login" | |||||
Command="{Binding Login}" | |||||
Content="登录" | Content="登录" | ||||
Cursor="Hand" /> | Cursor="Hand" /> | ||||
<Button | <Button | ||||
@@ -197,7 +265,7 @@ | |||||
Command="{Binding LogoutCommand}" | Command="{Binding LogoutCommand}" | ||||
Content="注销" | Content="注销" | ||||
Cursor="Hand" /> | Cursor="Hand" /> | ||||
</StackPanel> | |||||
</StackPanel>--> | |||||
</Grid> | </Grid> | ||||
@@ -40,18 +40,5 @@ namespace DosingSystem.View | |||||
if (e.LeftButton == MouseButtonState.Pressed) this.DragMove(); | if (e.LeftButton == MouseButtonState.Pressed) this.DragMove(); | ||||
}; | }; | ||||
} | } | ||||
private void Button_Login(object sender, RoutedEventArgs e) | |||||
{ | |||||
} | |||||
private void Button_LogOut(object sender, RoutedEventArgs e) | |||||
{ | |||||
} | |||||
} | } | ||||
} | } |
@@ -0,0 +1,49 @@ | |||||
using BPASmartClient.Helper; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Collections.ObjectModel; | |||||
namespace DosingSystem.ViewModel | |||||
{ | |||||
public class AdminstratorsViewModel : ObservableObject | |||||
{ | |||||
public string Admin { get { return _admin; } set { _admin = value; OnPropertyChanged(); } } | |||||
private string _admin; | |||||
public string Password { get { return _password; } set { _password = value; OnPropertyChanged(); } } | |||||
private string _password; | |||||
public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; OnPropertyChanged(); } } | |||||
private string _errorMessage; | |||||
public string SelectText { get { return _mSelectText; } set { _mSelectText = value; OnPropertyChanged(); } } | |||||
private string _mSelectText; | |||||
public RelayCommand AdminLoginCommand { get; set; } | |||||
public ObservableCollection<string> permission { get; set; } = new ObservableCollection<string>(); | |||||
public AdminstratorsViewModel() | |||||
{ | |||||
AdminLoginCommand = new RelayCommand(() => | |||||
{ | |||||
var rest = ActionManage.GetInstance.SendResult("LoginDosingSystem", $"{Admin}-={Password}-={SelectText}"); | |||||
if (rest != null && rest is string str) | |||||
{ | |||||
ErrorMessage = str; | |||||
} | |||||
}); | |||||
permission.Add("管理员"); | |||||
permission.Add("操作员"); | |||||
permission.Add("观察员"); | |||||
permission.Add("技术员"); | |||||
SelectText = permission[0]; | |||||
} | |||||
} | |||||
} |
@@ -9,15 +9,108 @@ using System.Collections.ObjectModel; | |||||
using System.Windows; | using System.Windows; | ||||
using BPASmartClient.Helper; | using BPASmartClient.Helper; | ||||
using Microsoft.Toolkit.Mvvm.Input; | using Microsoft.Toolkit.Mvvm.Input; | ||||
using DosingSystem.Model; | |||||
using Newtonsoft.Json; | |||||
using System.IO; | |||||
namespace DosingSystem.ViewModel | namespace DosingSystem.ViewModel | ||||
{ | { | ||||
public class MainViewModel : ObservableObject | public class MainViewModel : ObservableObject | ||||
{ | { | ||||
ObservableCollection<ActionMenu> menus = new ObservableCollection<ActionMenu>(); | |||||
private Permission _permission; | |||||
public Permission permission | |||||
{ | |||||
get { return _permission; } | |||||
set | |||||
{ | |||||
var res = menus.Where(p => Array.FindIndex(p.permission, s => s == value) >= 0).ToList(); | |||||
if (res != null && res.Count > 0) | |||||
{ | |||||
Menus.Clear(); | |||||
res.ForEach((item) => { Menus.Add(item); }); | |||||
} | |||||
_permission = value; | |||||
} | |||||
} | |||||
public MainViewModel() | public MainViewModel() | ||||
{ | { | ||||
DoNavChanged("HardwareStatusView.硬件状态"); | |||||
TogglePag = new RelayCommand<object>(DoNavChanged); | TogglePag = new RelayCommand<object>(DoNavChanged); | ||||
Login = new RelayCommand(() => { DoNavChanged("AdminstratorsView.用户登录"); UserManagement = false; }); | |||||
PasswordChange = new RelayCommand(() => | |||||
{ | |||||
//DoNavChanged("PasswordChangeView.密码修改"); | |||||
UserManagement = false; | |||||
}); | |||||
ExitLogin = new RelayCommand(() => | |||||
{ | |||||
//DoNavChanged("LoginView.退出登录"); | |||||
UserManagement = false; | |||||
}); | |||||
Config.GetInstance.Init(); | |||||
LoginRegister(); | |||||
MenuInit(); | |||||
permission = Permission.观察员; | |||||
if (Menus.Count > 0) DoNavChanged(Menus.ElementAt(0).CommandParameter); | |||||
} | |||||
private void LoginRegister() | |||||
{ | |||||
ActionManage.GetInstance.Register(new Func<object, object>((o) => | |||||
{ | |||||
if (o != null && o is string str) | |||||
{ | |||||
var strs = str.Split("-="); | |||||
if (strs != null && strs.Length == 3) | |||||
{ | |||||
var us = Global.userManager.userInfos.FirstOrDefault(p => p.UserName == strs[0]); | |||||
if (us != null && strs[1] == us.Password && strs[2] == us.permission.ToString()) | |||||
{ | |||||
permission = us.permission; | |||||
return string.Empty; | |||||
} | |||||
} | |||||
} | |||||
return "用户名或密码错误"; | |||||
}), "LoginDosingSystem"); | |||||
} | |||||
private void MenuInit() | |||||
{ | |||||
menus.Add(new ActionMenu() | |||||
{ | |||||
MenuName = "配方设置", | |||||
CommandParameter = "RecipeSettingsView.配方设置", | |||||
permission = new Permission[] { Permission.管理员, Permission.技术员 }, | |||||
}); | |||||
menus.Add(new ActionMenu() | |||||
{ | |||||
MenuName = "设备列表", | |||||
CommandParameter = "DeviceListView.设备列表", | |||||
permission = new Permission[] { Permission.管理员, Permission.技术员 }, | |||||
}); | |||||
menus.Add(new ActionMenu() | |||||
{ | |||||
MenuName = "硬件状态", | |||||
CommandParameter = "HardwareStatusView.硬件状态", | |||||
permission = new Permission[] { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 }, | |||||
}); | |||||
menus.Add(new ActionMenu() | |||||
{ | |||||
MenuName = "报警记录", | |||||
CommandParameter = "AlarmRecordView.报警记录", | |||||
permission = new Permission[] { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 }, | |||||
}); | |||||
menus.Add(new ActionMenu() | |||||
{ | |||||
MenuName = "配方下发", | |||||
CommandParameter = "RecipeControlView.配方控制", | |||||
permission = new Permission[] { Permission.管理员, Permission.操作员 }, | |||||
}); | |||||
} | } | ||||
public void DoNavChanged(object obj) | public void DoNavChanged(object obj) | ||||
@@ -36,12 +129,24 @@ namespace DosingSystem.ViewModel | |||||
} | } | ||||
public RelayCommand<object> TogglePag { get; set; } | public RelayCommand<object> TogglePag { get; set; } | ||||
public RelayCommand Login { get; set; } | |||||
public RelayCommand PasswordChange { get; set; } | |||||
public RelayCommand ExitLogin { get; set; } | |||||
public ObservableCollection<ActionMenu> Menus { get; set; } = new ObservableCollection<ActionMenu>(); | |||||
public FrameworkElement MyWindow { get { return _mMyWindow; } set { _mMyWindow = value; OnPropertyChanged(); } } | public FrameworkElement MyWindow { get { return _mMyWindow; } set { _mMyWindow = value; OnPropertyChanged(); } } | ||||
private FrameworkElement _mMyWindow; | private FrameworkElement _mMyWindow; | ||||
public string WindowTitleName { get { return _mWindowTitleName; } set { _mWindowTitleName = value; OnPropertyChanged(); } } | public string WindowTitleName { get { return _mWindowTitleName; } set { _mWindowTitleName = value; OnPropertyChanged(); } } | ||||
private string _mWindowTitleName; | private string _mWindowTitleName; | ||||
public bool UserManagement { get { return _mUserManagement; } set { _mUserManagement = value; OnPropertyChanged(); } } | |||||
private bool _mUserManagement; | |||||
public bool AutoStart { get { return SystemHelper.GetInstance.IsAutoStart(); } set { SystemHelper.GetInstance.AutoStart(value); OnPropertyChanged(); } } | public bool AutoStart { get { return SystemHelper.GetInstance.IsAutoStart(); } set { SystemHelper.GetInstance.AutoStart(value); OnPropertyChanged(); } } | ||||
} | } | ||||
} | } |
@@ -0,0 +1,79 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> | |||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> | |||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> | |||||
<security> | |||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> | |||||
<!-- UAC 清单选项 | |||||
如果想要更改 Windows 用户帐户控制级别,请使用 | |||||
以下节点之一替换 requestedExecutionLevel 节点。 | |||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" /> | |||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> | |||||
<requestedExecutionLevel level="highestAvailable" uiAccess="false" /> | |||||
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。 | |||||
如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此 | |||||
元素。 | |||||
--> | |||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> | |||||
</requestedPrivileges> | |||||
</security> | |||||
</trustInfo> | |||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> | |||||
<application> | |||||
<!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的 | |||||
Windows 版本的列表。取消评论适当的元素, | |||||
Windows 将自动选择最兼容的环境。 --> | |||||
<!-- Windows Vista --> | |||||
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />--> | |||||
<!-- Windows 7 --> | |||||
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />--> | |||||
<!-- Windows 8 --> | |||||
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />--> | |||||
<!-- Windows 8.1 --> | |||||
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />--> | |||||
<!-- Windows 10 --> | |||||
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />--> | |||||
</application> | |||||
</compatibility> | |||||
<!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行 | |||||
自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需 | |||||
选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应 | |||||
在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。 | |||||
将应用程序设为感知长路径。请参阅 https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation --> | |||||
<!-- | |||||
<application xmlns="urn:schemas-microsoft-com:asm.v3"> | |||||
<windowsSettings> | |||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> | |||||
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> | |||||
</windowsSettings> | |||||
</application> | |||||
--> | |||||
<!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) --> | |||||
<!-- | |||||
<dependency> | |||||
<dependentAssembly> | |||||
<assemblyIdentity | |||||
type="win32" | |||||
name="Microsoft.Windows.Common-Controls" | |||||
version="6.0.0.0" | |||||
processorArchitecture="*" | |||||
publicKeyToken="6595b64144ccf1df" | |||||
language="*" | |||||
/> | |||||
</dependentAssembly> | |||||
</dependency> | |||||
--> | |||||
</assembly> |