diff --git a/BPASmartClient.Argox/ArgoxHelper.cs b/BPASmartClient.Argox/ArgoxHelper.cs
new file mode 100644
index 00000000..26d462aa
--- /dev/null
+++ b/BPASmartClient.Argox/ArgoxHelper.cs
@@ -0,0 +1,106 @@
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace BPASmartClient.Argox
+{
+ public class ArgoxHelper
+ {
+
+ private volatile static ArgoxHelper _Instance;
+ public static ArgoxHelper GetInstance => _Instance ?? (_Instance = new ArgoxHelper());
+ private ArgoxHelper() { }
+
+ public void Print()
+ {
+ int nLen, ret, sw;
+ byte[] pbuf = new byte[128];
+ string strmsg;
+ IntPtr ver;
+ System.Text.Encoding encAscII = System.Text.Encoding.ASCII;
+ System.Text.Encoding encUnicode = System.Text.Encoding.Unicode;
+
+ // dll 版本.
+ ver = DLLHelper.B_Get_DLL_Version(0);
+
+ // 搜索端口号.
+ nLen = DLLHelper.B_GetUSBBufferLen() + 1;
+ strmsg = "DLL ";
+ strmsg += Marshal.PtrToStringAnsi(ver);
+ strmsg += "\r\n";
+ if (nLen > 1)
+ {
+ byte[] buf1, buf2;
+ int len1 = 128, len2 = 128;
+ buf1 = new byte[len1];
+ buf2 = new byte[len2];
+ DLLHelper.B_EnumUSB(pbuf);
+ DLLHelper.B_GetUSBDeviceInfo(1, buf1, out len1, buf2, out len2);
+ sw = 1;
+ if (1 == sw)
+ {
+ ret = DLLHelper.B_CreatePrn(12, encAscII.GetString(buf2, 0, len2));// 打开 USB.
+ }
+ else
+ {
+ ret = DLLHelper.B_CreateUSBPort(1);// must call B_GetUSBBufferLen() function fisrt.
+ }
+ if (0 != ret)
+ {
+ strmsg += "Open USB fail!";
+ }
+ else
+ {
+ strmsg += "Open USB:\r\nDevice name: ";
+ strmsg += encAscII.GetString(buf1, 0, len1);
+ strmsg += "\r\nDevice path: ";
+ strmsg += encAscII.GetString(buf2, 0, len2);
+ //sw = 2;
+ if (2 == sw)
+ {
+ //Immediate Error Report.
+ DLLHelper.B_WriteData(1, encAscII.GetBytes("^ee\r\n"), 5);//^ee
+ ret = DLLHelper.B_ReadData(pbuf, 4, 1000);
+ }
+ }
+ }
+ else
+ {
+ System.IO.Directory.CreateDirectory(DLLHelper.szSavePath);
+ ret = DLLHelper.B_CreatePrn(0, DLLHelper.szSaveFile);// open file.
+ strmsg += "Open ";
+ strmsg += DLLHelper.szSaveFile;
+ if (0 != ret)
+ {
+ strmsg += " file fail!";
+ }
+ else
+ {
+ strmsg += " file succeed!";
+ }
+ }
+ Debug.WriteLine(strmsg);
+ if (0 != ret)
+ return;
+
+ // 样品设置.
+ DLLHelper.B_Set_DebugDialog(0);
+ DLLHelper.B_Set_Originpoint(0, 0);
+ DLLHelper.B_Select_Option(2);
+ DLLHelper.B_Set_Darkness(8);
+ DLLHelper.B_Del_Pcx("*");// delete all picture.
+ DLLHelper.B_WriteData(0, encAscII.GetBytes(DLLHelper.sznop2), DLLHelper.sznop2.Length);
+ DLLHelper.B_WriteData(1, encAscII.GetBytes(DLLHelper.sznop1), DLLHelper.sznop1.Length);
+ DLLHelper.B_Set_LabelForSmartPrint(254 * 3, 30);//label information: length= 3 * 25.4 mm, gap= 3 mm.
+
+ int TextX = 160;
+ int BoxX = 150;
+ DLLHelper.B_Draw_Box(BoxX, 20, 4, 670, 370);//画框
+ DLLHelper.B_Prn_Text_TrueType(TextX, 40, 30, "楷体", 1, 400, 0, 0, 0, "AA", $"原料名称:榨菜配方");
+ DLLHelper.B_Prn_Text_TrueType_W(TextX, 80, 30, 20, "楷体", 1, 400, 0, 0, 0, "AB", $"日期:{DateTime.Now.ToString("yyy-MM-dd")}");
+ DLLHelper.B_Prn_Text_TrueType_Uni(TextX, 120, 30, "楷体", 1, 400, 0, 0, 0, "AC", Encoding.Unicode.GetBytes($"时间:{DateTime.Now.ToString("HH:mm:ss")}"), 1);//UTF-16
+ DLLHelper.B_Print_Out(1);//打印数量
+ DLLHelper.B_ClosePrn();
+ }
+ }
+}
\ No newline at end of file
diff --git a/BPASmartClient.Argox/BPASmartClient.Argox.csproj b/BPASmartClient.Argox/BPASmartClient.Argox.csproj
new file mode 100644
index 00000000..e16ace56
--- /dev/null
+++ b/BPASmartClient.Argox/BPASmartClient.Argox.csproj
@@ -0,0 +1,23 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
diff --git a/BPASmartClient.Argox/DLLHelper.cs b/BPASmartClient.Argox/DLLHelper.cs
new file mode 100644
index 00000000..040e1b91
--- /dev/null
+++ b/BPASmartClient.Argox/DLLHelper.cs
@@ -0,0 +1,241 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BPASmartClient.Argox
+{
+ internal class DLLHelper
+ {
+ public const uint IMAGE_BITMAP = 0;
+ public const uint LR_LOADFROMFILE = 16;
+
+ [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, int cxDesired, int cyDesired, uint fuLoad);
+
+ [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+ public static extern int DeleteObject(IntPtr ho);
+ public const string szSavePath = "C:\\Argox";
+ public const string szSaveFile = "C:\\Argox\\PPLB_Example.Prn";
+ public const string sznop1 = "nop_front\r\n";
+ public const string sznop2 = "nop_middle\r\n";
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Bar2d_Maxi(int x, int y, int cl, int cc, int pc, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Bar2d_PDF417(int x, int y, int w, int v, int s, int c, int px, int py, int r, int l, int t, int o, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Bar2d_PDF417_N(int x, int y, int w, int h, string pParameter, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Bar2d_DataMatrix(int x, int y, int r, int l, int h, int v, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern void B_ClosePrn();
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_CreatePrn(int selection, string filename);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Del_Form(string formname);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Del_Pcx(string pcxname);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Draw_Box(int x, int y, int thickness, int hor_dots, int ver_dots);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Draw_Line(char mode, int x, int y, int hor_dots, int ver_dots);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Error_Reporting(char option);
+
+ [DllImport("Winpplb.dll")]
+ public static extern IntPtr B_Get_DLL_Version(int nShowMessage);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Get_DLL_VersionA(int nShowMessage);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Get_Graphic_ColorBMP(int x, int y, string filename);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Get_Graphic_ColorBMPEx(int x, int y, int nWidth, int nHeight, int rotate, string id_name, string filename);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Get_Graphic_ColorBMP_HBitmap(int x, int y, int nWidth, int nHeight, int rotate, string id_name, IntPtr hbm);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Get_Pcx(int x, int y, string filename);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Initial_Setting(int Type, string Source);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_WriteData(int IsImmediate, byte[] pbuf, int length);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_ReadData(byte[] pbuf, int length, int dwTimeoutms);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Load_Pcx(int x, int y, string pcxname);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Open_ChineseFont(string path);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Print_Form(int labset, int copies, string form_out, string var);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Print_MCopy(int labset, int copies);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Print_Out(int labset);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Prn_Barcode(int x, int y, int ori, string type, int narrow, int width, int height, char human, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern void B_Prn_Configuration();
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Prn_Text(int x, int y, int ori, int font, int hor_factor, int ver_factor, char mode, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Prn_Text_Chinese(int x, int y, int fonttype, string id_name, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Prn_Text_TrueType(int x, int y, int FSize, string FType, int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Prn_Text_TrueType_W(int x, int y, int FHeight, int FWidth, string FType, int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Select_Option(int option);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Select_Option2(int option, int p);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Select_Symbol(int num_bit, int symbol, int country);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Select_Symbol2(int num_bit, string csymbol, int country);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Backfeed(char option);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Backfeed_Offset(int offset);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_CutPeel_Offset(int offset);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_BMPSave(int nSave, string strBMPFName);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Darkness(int darkness);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_DebugDialog(int nEnable);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Direction(char direction);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Form(string formfile);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Labgap(int lablength, int gaplength);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Labwidth(int labwidth);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Originpoint(int hor, int ver);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Prncomport(int baud, char parity, int data, int stop);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Prncomport_PC(int nBaudRate, int nByteSize, int nParity, int nStopBits, int nDsr, int nCts, int nXonXoff);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_Speed(int speed);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_ProcessDlg(int nShow);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_ErrorDlg(int nShow);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_GetUSBBufferLen();
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_EnumUSB(byte[] buf);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_CreateUSBPort(int nPort);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_ResetPrinter();
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_GetPrinterResponse(byte[] buf, int nMax);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_TFeedMode(int nMode);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_TFeedTest();
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_CreatePort(int nPortType, int nPort, string filename);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Execute_Form(string form_out, string var);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Bar2d_QR(int x, int y, int model, int scl, char error, char dinput, int c, int d, int p, string data);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_GetNetPrinterBufferLen();
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_EnumNetPrinter(byte[] buf);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_CreateNetPort(int nPort);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Prn_Text_TrueType_Uni(int x, int y, int FSize, string FType, int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name, byte[] data, int format);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Prn_Text_TrueType_UniB(int x, int y, int FSize, string FType, int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name, byte[] data, int format);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_GetUSBDeviceInfo(int nPort, byte[] pDeviceName, out int pDeviceNameLen, byte[] pDevicePath, out int pDevicePathLen);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_EncryptionKey(string encryptionKey);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Check_EncryptionKey(string decodeKey, string encryptionKey, int dwTimeoutms);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_CommTimeout(int ReadTotalTimeoutConstant, int WriteTotalTimeoutConstant);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Get_CommTimeout(out int ReadTotalTimeoutConstant, out int WriteTotalTimeoutConstant);
+
+ [DllImport("Winpplb.dll")]
+ public static extern int B_Set_LabelForSmartPrint(int lablength, int gaplength);
+ }
+}
diff --git a/BPASmartClient.Argox/WinPort.dll b/BPASmartClient.Argox/WinPort.dll
new file mode 100644
index 00000000..a2a2e247
Binary files /dev/null and b/BPASmartClient.Argox/WinPort.dll differ
diff --git a/BPASmartClient.Argox/Winpplb.dll b/BPASmartClient.Argox/Winpplb.dll
new file mode 100644
index 00000000..250274df
Binary files /dev/null and b/BPASmartClient.Argox/Winpplb.dll differ
diff --git a/BPASmartClient.CustomResource/BPASmartClient.CustomResource.csproj b/BPASmartClient.CustomResource/BPASmartClient.CustomResource.csproj
index 883716d6..5130dc63 100644
--- a/BPASmartClient.CustomResource/BPASmartClient.CustomResource.csproj
+++ b/BPASmartClient.CustomResource/BPASmartClient.CustomResource.csproj
@@ -38,6 +38,7 @@
+
@@ -112,6 +113,7 @@
+
@@ -165,6 +167,7 @@
+
@@ -247,6 +250,7 @@
+
@@ -266,6 +270,7 @@
+
@@ -276,6 +281,7 @@
+
@@ -309,6 +315,7 @@
+
diff --git a/BPASmartClient.CustomResource/Image/bg12.png b/BPASmartClient.CustomResource/Image/bg12.png
new file mode 100644
index 00000000..a6a3d5a5
Binary files /dev/null and b/BPASmartClient.CustomResource/Image/bg12.png differ
diff --git a/BPASmartClient.CustomResource/Image/弹窗.png b/BPASmartClient.CustomResource/Image/弹窗.png
new file mode 100644
index 00000000..7d4f8fdd
Binary files /dev/null and b/BPASmartClient.CustomResource/Image/弹窗.png differ
diff --git a/BPASmartClient.CustomResource/Image/组 8.png b/BPASmartClient.CustomResource/Image/组 8.png
new file mode 100644
index 00000000..c58a30eb
Binary files /dev/null and b/BPASmartClient.CustomResource/Image/组 8.png differ
diff --git a/BPASmartClient.CustomResource/Pages/Model/MenuManage.cs b/BPASmartClient.CustomResource/Pages/Model/MenuManage.cs
index 143f5b24..1edcc1ab 100644
--- a/BPASmartClient.CustomResource/Pages/Model/MenuManage.cs
+++ b/BPASmartClient.CustomResource/Pages/Model/MenuManage.cs
@@ -24,10 +24,33 @@ namespace BPASmartClient.CustomResource.Pages.Model
public class MenuModel : ObservableObject
{
+
+ private Permission[] pers
+ {
+ get
+ {
+ List permissionList = new List();
+ foreach (var item in subMenumodels)
+ {
+ foreach (var p in item.SubMenuPermission)
+ {
+ if (!permissionList.Contains(p)) permissionList.Add(p);
+ }
+ }
+ return permissionList.ToArray();
+ }
+ }
+
+ /////
+ ///// 主菜单权限
+ /////
+ //public Permission[] MainMenuPermission { get { return _mMainMenuPermission; } set { _mMainMenuPermission = value; OnPropertyChanged(); } }
+ //private Permission[] _mMainMenuPermission;
+
///
/// 主菜单权限
///
- public Permission[] MainMenuPermission { get { return _mMainMenuPermission; } set { _mMainMenuPermission = value; OnPropertyChanged(); } }
+ public Permission[] MainMenuPermission { get { return pers; } set { _mMainMenuPermission = value; OnPropertyChanged(); } }
private Permission[] _mMainMenuPermission;
///
diff --git a/BPASmartClient.CustomResource/Pages/Model/MessageLog.cs b/BPASmartClient.CustomResource/Pages/Model/MessageLog.cs
index 0ca755ee..f49f8f33 100644
--- a/BPASmartClient.CustomResource/Pages/Model/MessageLog.cs
+++ b/BPASmartClient.CustomResource/Pages/Model/MessageLog.cs
@@ -22,6 +22,8 @@ namespace BPASmartClient.CustomResource.Pages.Model
public Action RunLog { get; set; }
+
+
public ObservableCollection runLogs { get; set; } = new ObservableCollection();
public ObservableCollection userLogs { get; set; } = new ObservableCollection();
@@ -32,12 +34,6 @@ namespace BPASmartClient.CustomResource.Pages.Model
Sqlite.GetInstance.Save();
}
- //public void GetLog()
- //{
- // Sqlite.GetInstance.GetData();
- // Sqlite.GetInstance.GetData();
- //}
-
public void ShowUserLog(string info)
{
lock (userlock)
@@ -68,10 +64,12 @@ namespace BPASmartClient.CustomResource.Pages.Model
};
Sqlite.GetInstance.Base.Add(runLog);
Application.Current.Dispatcher.Invoke(new Action(() => { runLogs.Insert(0, runLog); }));
- RunLog?.Invoke(info);
+ RunLog?.Invoke(info);
}
}
+
+
}
}
diff --git a/BPASmartClient.CustomResource/Pages/Model/NfcServer.cs b/BPASmartClient.CustomResource/Pages/Model/NfcServer.cs
new file mode 100644
index 00000000..803ac497
--- /dev/null
+++ b/BPASmartClient.CustomResource/Pages/Model/NfcServer.cs
@@ -0,0 +1,49 @@
+using BPASmartClient.CustomResource.Pages.ViewModel;
+using BPASmartClient.Nfc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace BPASmartClient.CustomResource.Pages.Model
+{
+ public class NfcServer
+ {
+
+ private volatile static NfcServer _Instance;
+ public static NfcServer GetInstance => _Instance ?? (_Instance = new NfcServer());
+ private NfcServer() { }
+ public bool EnableLogin { get; set; }
+
+ public Action Update { get; set; }
+ public void Init()
+ {
+ NFCHelper.GetInstance.Update = new Action(() =>
+ {
+ Update?.Invoke();
+ if (!EnableLogin)
+ {
+ if (NFCHelper.GetInstance.GetReadResult?.CardNum.Length > 0)
+ {
+ string id = NFCHelper.GetInstance.GetReadResult?.CardNum;
+ var res = Global.userManager.userInfos.FirstOrDefault(p => p.CardId?.FirstOrDefault(s => s == id) != null);
+ if (res != null)
+ {
+ if (Global.userInfo.permission != res.permission)
+ {
+ BPASmartClient.Message.MessageLog.GetInstance.ShowDebugLog("NFC卡登录");
+ LoginViewModel.NfcLogin(id);
+ }
+ }
+
+ }
+ }
+ });
+
+ NFCHelper.GetInstance.Init();
+ }
+
+ }
+}
diff --git a/BPASmartClient.CustomResource/Pages/Model/UserInfo.cs b/BPASmartClient.CustomResource/Pages/Model/UserInfo.cs
index ab40a200..eeb35e4c 100644
--- a/BPASmartClient.CustomResource/Pages/Model/UserInfo.cs
+++ b/BPASmartClient.CustomResource/Pages/Model/UserInfo.cs
@@ -10,14 +10,10 @@ namespace BPASmartClient.CustomResource.Pages.Model
{
public class UserInfo:ObservableObject
{
- public string Id { get { return _id; } set { _id = value;OnPropertyChanged(); } }
- private string _id;
- public Permission Permission { get { return _permission; } set { _permission = value; OnPropertyChanged(); } }
- private Permission _permission;
- public string UserName { get { return _userName; } set { _userName = value;OnPropertyChanged(); } }
- private string _userName;
- public string Password { get { return _password; } set { _password = value; OnPropertyChanged(); } }
- private string _password;
+ public Permission permission { get; set; }
+ public string UserName { get; set; }
+ public string Password { get; set; }
+ public List CardId { get; set; } = new List();
}
}
diff --git a/BPASmartClient.CustomResource/Pages/View/DebugLogView.xaml b/BPASmartClient.CustomResource/Pages/View/DebugLogView.xaml
new file mode 100644
index 00000000..cf7e2af0
--- /dev/null
+++ b/BPASmartClient.CustomResource/Pages/View/DebugLogView.xaml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.CustomResource/Pages/View/DebugLogView.xaml.cs b/BPASmartClient.CustomResource/Pages/View/DebugLogView.xaml.cs
new file mode 100644
index 00000000..647ce68a
--- /dev/null
+++ b/BPASmartClient.CustomResource/Pages/View/DebugLogView.xaml.cs
@@ -0,0 +1,28 @@
+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.CustomResource.Pages.View
+{
+ ///
+ /// DebugLogView.xaml 的交互逻辑
+ ///
+ public partial class DebugLogView : UserControl
+ {
+ public DebugLogView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/BPASmartClient.CustomResource/Pages/View/LoginView.xaml.cs b/BPASmartClient.CustomResource/Pages/View/LoginView.xaml.cs
index e98b6cf0..622c8395 100644
--- a/BPASmartClient.CustomResource/Pages/View/LoginView.xaml.cs
+++ b/BPASmartClient.CustomResource/Pages/View/LoginView.xaml.cs
@@ -30,7 +30,14 @@ namespace BPASmartClient.CustomResource.Pages.View
Username.SelectionStart = Username.Text.Trim().Length;
this.Loaded += LoginView_Loaded;
- ActionManage.GetInstance.Register(new Action(() => { this.DialogResult = true; this.Close(); }), "LoginOk", true);
+ ActionManage.GetInstance.Register(new Action(() =>
+ {
+ if (this.IsVisible)
+ {
+ this.DialogResult = true;
+ this.Close();
+ }
+ }), "LoginOk", true);
ActionManage.GetInstance.Register(new Action(() => { this.DialogResult = false; this.Close(); }), "ExitAction", true);
}
diff --git a/BPASmartClient.CustomResource/Pages/View/NfcSetView.xaml b/BPASmartClient.CustomResource/Pages/View/NfcSetView.xaml
new file mode 100644
index 00000000..293d1d6f
--- /dev/null
+++ b/BPASmartClient.CustomResource/Pages/View/NfcSetView.xaml
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.CustomResource/Pages/View/NfcSetView.xaml.cs b/BPASmartClient.CustomResource/Pages/View/NfcSetView.xaml.cs
new file mode 100644
index 00000000..65e154f5
--- /dev/null
+++ b/BPASmartClient.CustomResource/Pages/View/NfcSetView.xaml.cs
@@ -0,0 +1,45 @@
+using BPASmartClient.CustomResource.Pages.Model;
+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.Shapes;
+
+namespace BPASmartClient.CustomResource.Pages.View
+{
+ ///
+ /// NfcSetView.xaml 的交互逻辑
+ ///
+ public partial class NfcSetView : Window
+ {
+ public NfcSetView()
+ {
+ InitializeComponent();
+ this.Closing += NfcSetView_Closing;
+ ActionManage.GetInstance.Register(new Action(() =>
+ {
+ Application.Current.Dispatcher.Invoke(new Action(() => { this.Close(); }));
+ NfcServer.GetInstance.EnableLogin = false;
+ }), "Exit", true);
+ }
+
+ private void NfcSetView_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
+ {
+ NfcServer.GetInstance.EnableLogin = false;
+ }
+
+ private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ this.Close();
+ }
+ }
+}
diff --git a/BPASmartClient.CustomResource/Pages/View/SubPagLoginView.xaml.cs b/BPASmartClient.CustomResource/Pages/View/SubPagLoginView.xaml.cs
index 835e2dc0..6956b672 100644
--- a/BPASmartClient.CustomResource/Pages/View/SubPagLoginView.xaml.cs
+++ b/BPASmartClient.CustomResource/Pages/View/SubPagLoginView.xaml.cs
@@ -25,8 +25,23 @@ namespace BPASmartClient.CustomResource.Pages.View
InitializeComponent();
Username.Focus();
Username.SelectionStart = Username.Text.Trim().Length;
- ActionManage.GetInstance.Register(new Action(() => { this.DialogResult = true; this.Close(); }), "LoginOk", true);
- ActionManage.GetInstance.Register(new Action(() => { this.DialogResult = false; this.Close(); }), "ExitAction", true);
+ ActionManage.GetInstance.Register(new Action(() =>
+ {
+ if (this.IsVisible)
+ {
+ this.DialogResult = true;
+ this.Close();
+ }
+
+ }), "LoginOk", true);
+ ActionManage.GetInstance.Register(new Action(() =>
+ {
+ if (this.IsVisible)
+ {
+ this.DialogResult = false;
+ this.Close();
+ }
+ }), "ExitAction", true);
}
private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
diff --git a/BPASmartClient.CustomResource/Pages/ViewModel/DebugLogViewModel.cs b/BPASmartClient.CustomResource/Pages/ViewModel/DebugLogViewModel.cs
new file mode 100644
index 00000000..116a1851
--- /dev/null
+++ b/BPASmartClient.CustomResource/Pages/ViewModel/DebugLogViewModel.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+using BPASmartClient.Message;
+using Microsoft.Toolkit.Mvvm.ComponentModel;
+
+namespace BPASmartClient.CustomResource.Pages.ViewModel
+{
+ public class DebugLogViewModel : ObservableObject
+ {
+ public DebugLogViewModel()
+ {
+ MessageLog.GetInstance.DebugLog = new Action((o) =>
+ {
+ Message = MessageLog.GetInstance.DebugLogInfo;
+ });
+ }
+
+ public static string Message { get { return _mMessage; } set { _mMessage = value; OnStaticPropertyChanged(); } }
+ private static string _mMessage = string.Empty;
+
+ public static event EventHandler StaticPropertyChanged;
+ private static void OnStaticPropertyChanged([CallerMemberName] string PropName = "")
+ {
+ StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(PropName));
+ }
+
+
+ }
+}
diff --git a/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs b/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs
index 60c66490..5b411af2 100644
--- a/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs
+++ b/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs
@@ -24,6 +24,37 @@ namespace BPASmartClient.CustomResource.Pages.ViewModel
});
}
+ public static void NfcLogin(string cardId)
+ {
+ var res = Global.userManager.userInfos.FirstOrDefault(p => p.CardId?.FirstOrDefault(s => s == cardId && s.Length > 0) != null);
+ if (res != null)
+ {
+ Global.userInfo.permission = res.permission;
+ Global.userInfo.UserName = res.UserName;
+ Global.userInfo.Password = res.Password;
+ for (int i = 0; i < MenuManage.GetInstance.menuModels.Count; i++)
+ {
+ if (MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuPermission.Contains(res.permission))
+ MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Visible;
+ else
+ MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Collapsed;
+
+ if (MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.FirstOrDefault(p => p.SubMenuPermission.Contains(res.permission)) == null)
+ MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Collapsed;
+
+ for (int m = 0; m < MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.Count; m++)
+ {
+ if (MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuPermission.Contains(res.permission))
+ MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuVisibility = Visibility.Visible;
+ else
+ MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuVisibility = Visibility.Collapsed;
+ }
+ }
+ Application.Current.Dispatcher.Invoke(new Action(() => { ActionManage.GetInstance.Send("LoginOk"); }));
+
+ }
+ }
+
private void Login()
{
var res = Global.userManager.userInfos.FirstOrDefault(p => p.UserName == UserName && p.Password == Password);
diff --git a/BPASmartClient.CustomResource/Pages/ViewModel/NfcSetViewModel.cs b/BPASmartClient.CustomResource/Pages/ViewModel/NfcSetViewModel.cs
new file mode 100644
index 00000000..a31d8a71
--- /dev/null
+++ b/BPASmartClient.CustomResource/Pages/ViewModel/NfcSetViewModel.cs
@@ -0,0 +1,136 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Toolkit.Mvvm.ComponentModel;
+using System.Collections.ObjectModel;
+using BPASmartClient.CustomResource.Pages.Enums;
+using Microsoft.Toolkit.Mvvm.Input;
+using BPASmartClient.CustomResource.Pages.Model;
+using BPASmartClient.Nfc;
+using System.Threading;
+using BPASmartClient.Helper;
+
+namespace BPASmartClient.CustomResource.Pages.ViewModel
+{
+ public class NfcSetViewModel : ObservableObject
+ {
+ public NfcSetViewModel()
+ {
+ NfcServer.GetInstance.EnableLogin = true;
+ permissions.Clear();
+ Enum.GetNames(typeof(Permission)).ToList()?.ForEach(item => { permissions.Add(new PermissionSelect() { PermissionName = item }); });
+
+ NfcServer.GetInstance.Update = new Action(() =>
+ {
+ CardNum = NFCHelper.GetInstance.GetReadResult.CardNum;
+ if (CardNum.Length <= 0) return;
+
+ if (!UserAdd && !UserCnange)
+ {
+ Info = "Error:请选择操作模式;";
+ return;
+ }
+
+ if (UserAdd)
+ {
+ var per = Global.userManager.userInfos.FirstOrDefault(p => p.CardId.Contains(CardNum));
+ if (per != null)
+ {
+ Info = "Error:用户已存在!;";
+ return;
+ }
+ if (permissions?.FirstOrDefault(p => p.PermissionSelected == true) == null)
+ {
+ Info = "Error:请选择一个权限;";
+ return;
+ }
+ var res = permissions.FirstOrDefault(p => p.PermissionSelected == true);
+ if (res != null)
+ {
+ int index = Array.FindIndex(Global.userManager.userInfos.ToArray(), p => p.permission.ToString() == res.PermissionName);
+ if (index >= 0 && index < Global.userManager.userInfos.Count)
+ {
+ if (!Global.userManager.userInfos.ElementAt(index).CardId.Contains(NFCHelper.GetInstance.GetReadResult.CardNum))
+ {
+ Global.userManager.userInfos.ElementAt(index).CardId.Add(NFCHelper.GetInstance.GetReadResult.CardNum);
+ Config.GetInstance.SaveUser();
+ Info = $"Info:ID {NFCHelper.GetInstance.GetReadResult.CardNum} 添加成功;";
+ Thread.Sleep(1000);
+ ActionManage.GetInstance.Send("Exit");
+ }
+ }
+ else
+ Info = $"Info:ID {NFCHelper.GetInstance.GetReadResult.CardNum} 已存在;";
+ }
+ }
+
+ if (UserCnange)
+ {
+ int index = Array.FindIndex(Global.userManager.userInfos.ToArray(), p => p.CardId.FirstOrDefault(s => s == CardNum) != null);
+ if (index >= 0 && index < Global.userManager.userInfos.Count)
+ {
+ if (Global.userManager.userInfos.ElementAt(index).CardId.Contains(CardNum))
+ Global.userManager.userInfos.ElementAt(index).CardId.Remove(CardNum);
+ Config.GetInstance.SaveUser();
+ Info = $"Info:ID {CardNum} 注销成功;";
+ Thread.Sleep(1000);
+ ActionManage.GetInstance.Send("Exit");
+ }
+ else
+ {
+ Info = "Info:当前卡在系统中不存在;";
+ return;
+ }
+ }
+ });
+ }
+
+ private bool Verify()
+ {
+ if (permissions?.FirstOrDefault(p => p.PermissionSelected == true) == null)
+ {
+ Info = "Error:请选择一个权限;";
+ return false;
+ }
+ if (CardNum == null || CardNum?.Length <= 0)
+ {
+ Info = "Error:请将卡放到刷卡区;";
+ return false;
+ }
+ return true;
+ }
+
+ public ObservableCollection permissions { get; set; } = new ObservableCollection();
+
+ public string CardNum { get { return _mCardNum; } set { _mCardNum = value; OnPropertyChanged(); } }
+ private string _mCardNum;
+
+ public string Info { get { return _mInfo; } set { _mInfo = value; OnPropertyChanged(); } }
+ private string _mInfo;
+
+ public bool UserAdd { get { return _mUserAdd; } set { _mUserAdd = value; OnPropertyChanged(); } }
+ private bool _mUserAdd;
+
+ public bool UserCnange { get { return _mUserCnange; } set { _mUserCnange = value; OnPropertyChanged(); } }
+ private bool _mUserCnange;
+
+ public RelayCommand SavePermission { get; set; }
+
+ public RelayCommand DeletePermission { get; set; }
+
+ }
+
+ public class PermissionSelect : ObservableObject
+ {
+
+ public string PermissionName { get { return _mPermissionName; } set { _mPermissionName = value; OnPropertyChanged(); } }
+ private string _mPermissionName;
+
+
+ public bool PermissionSelected { get { return _mPermissionSelected; } set { _mPermissionSelected = value; OnPropertyChanged(); } }
+ private bool _mPermissionSelected = false;
+
+ }
+}
diff --git a/BPASmartClient.Helper/ActionManage.cs b/BPASmartClient.Helper/ActionManage.cs
index ca7b05cc..af80601e 100644
--- a/BPASmartClient.Helper/ActionManage.cs
+++ b/BPASmartClient.Helper/ActionManage.cs
@@ -95,23 +95,31 @@ namespace BPASmartClient.Helper
if (action != null)
{
if (IsAutoCancelRegister && actions.ContainsKey(key)) actions.TryRemove(key, out Delegation d);
- if (!actions.ContainsKey(key))
+ try
{
- if (action is Action actionBus)
- actions.TryAdd(key, new Delegation() { ActionBus = actionBus });
+ if (!actions.ContainsKey(key))
+ {
+ if (action is Action actionBus)
+ actions.TryAdd(key, new Delegation() { ActionBus = actionBus });
- if (action is Action
diff --git a/BPASmartClient.Helper/ExcelHelper.cs b/BPASmartClient.Helper/ExcelHelper.cs
new file mode 100644
index 00000000..96cbdd49
--- /dev/null
+++ b/BPASmartClient.Helper/ExcelHelper.cs
@@ -0,0 +1,151 @@
+using BPASmartClient.Message;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.OleDb;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+
+namespace BPASmartClient.Helper
+{
+ public class ExcelHelper
+ {
+ public DataTable GetExcelToDataTableBySheet(string FileFullPath, string SheetName)
+
+ {
+
+ //此连接只能操作Excel2007之前(.xls)文件
+
+ //string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + FileFullPath + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'";
+
+ //此连接可以操作.xls与.xlsx文件
+
+ string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + FileFullPath + ";Extended Properties='Excel 12.0; HDR=NO; IMEX=1'";
+
+
+ OleDbConnection conn = new OleDbConnection(strConn);
+
+ conn.Open();
+
+ DataSet ds = new DataSet();
+
+ OleDbDataAdapter odda = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", SheetName), conn);
+
+ //OleDbDataAdapter odda = new OleDbDataAdapter(string.Format("select * from [Sheet1$]", conn),conn);
+
+ odda.Fill(ds, SheetName);
+
+ conn.Close();
+
+ return ds.Tables[0];
+
+ }
+ //根据Excel物理路径获取Excel文件中所有表名
+
+ public String[] GetExcelSheetNames(string excelFile)
+
+ {
+ OleDbConnection objConn = null;
+ System.Data.DataTable dt = null;
+ try
+ {
+ //此连接只能操作Excel2007之前(.xls)文件
+
+ //string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + excelFile + ";Extended Properties='Excel 8.0; HDR=NO; IMEX=1'";
+
+ //此连接可以操作.xls与.xlsx文件
+
+ string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + excelFile + ";Extended Properties='Excel 12.0; HDR=NO; IMEX=1'";
+
+ objConn = new OleDbConnection(strConn);
+ objConn.Open();
+ dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
+
+ if (dt == null)
+ {
+ return null;
+ }
+ String[] excelSheets = new String[dt.Rows.Count];
+ int i = 0;
+ foreach (DataRow row in dt.Rows)
+ {
+ excelSheets[i] = row["TABLE_NAME"].ToString();
+ i++;
+ }
+ return excelSheets;
+ }
+ catch
+ {
+ return null;
+ }
+ finally
+ {
+ if (objConn != null)
+ {
+ objConn.Close();
+ objConn.Dispose();
+ }
+ if (dt != null)
+ {
+ dt.Dispose();
+ }
+ }
+ }
+
+ public static DataTable ReadDataFromCSV( string file)
+ {
+ Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
+ DataTable dt = null;
+ if(File.Exists(file))
+ {
+ dt = new DataTable();
+ FileStream fs = new FileStream(file, FileMode.Open,FileAccess.Read);
+ StreamReader sr;
+
+ try
+ {
+ Encoding encoding = Encoding.Default;
+ using (sr = new StreamReader(fs, Encoding.GetEncoding("GB2312")))
+ {
+ string head = sr.ReadLine();
+ string[] headNames = head.Split(',');
+ for (int i = 0; i < headNames.Length; i++)
+ {
+ dt.Columns.Add(headNames[i], typeof(string));
+ }
+ while (!sr.EndOfStream)
+ {
+ string lineStr = sr.ReadLine();
+ if (lineStr != null)
+ {
+ string[] lines = lineStr.Split(',');
+ DataRow dr = dt.NewRow();
+ for (int i = 0; i < lines.Length; i++)
+ {
+ dr[i] = lines[i];
+ }
+ dt.Rows.Add(dr);
+ }
+ }
+ sr.Close();
+ fs.Close();
+ }
+
+ }
+ catch (Exception ex)
+ {
+ MessageLog.GetInstance.ShowEx($"读取csv文件异常:{ex.Message}");
+ }
+ }
+ return dt;
+
+ }
+ }
+
+
+}
+
diff --git a/BPASmartClient.KHKJ/BPASmartClient.KHKJ.csproj b/BPASmartClient.KHKJ/BPASmartClient.KHKJ.csproj
new file mode 100644
index 00000000..3656ee97
--- /dev/null
+++ b/BPASmartClient.KHKJ/BPASmartClient.KHKJ.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.KHKJ/Class1.cs b/BPASmartClient.KHKJ/Class1.cs
new file mode 100644
index 00000000..4cbe8e57
--- /dev/null
+++ b/BPASmartClient.KHKJ/Class1.cs
@@ -0,0 +1,7 @@
+namespace BPASmartClient.KHKJ
+{
+ public class Class1
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/BPASmartClient.KHKJ/KHKJMachine.cs b/BPASmartClient.KHKJ/KHKJMachine.cs
new file mode 100644
index 00000000..b940c7ed
--- /dev/null
+++ b/BPASmartClient.KHKJ/KHKJMachine.cs
@@ -0,0 +1,120 @@
+using BPASmartClient.Helper;
+using BPASmartClient.Message;
+using BPASmartClient.SerialPort;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+
+namespace BPASmartClient.KHKJ
+{
+ public class KHKJMachine
+ {
+ //通讯代理
+ SerialPortClient commProxy = null;
+ //数据仓库
+ private DataStorage dataStorage = new DataStorage();
+
+ //是否下发指令,主线程等待
+ private bool free = false;
+
+ //状态询问指令
+ private byte[] cmdAsk;
+
+ public KHKJMachine()
+ {
+
+ MainLoop();
+ }
+
+ public void Communication(string serialPort)
+ {
+ commProxy = new SerialPortClient(serialPort, BaudRates.BR_9600);
+ commProxy.SetDataStorage(dataStorage);
+ commProxy.Start();
+ free = true;
+
+ }
+
+ private void MainLoop()
+ {
+ ThreadManage.GetInstance().StartLong(new Action(() =>
+ {
+ if (!free)
+ {
+ commProxy.SendData(cmdAsk);
+ }
+ Thread.Sleep(500);
+ }), "KHKJ询问线程");
+
+ ThreadManage.GetInstance().StartLong(new Action(() =>
+ {
+ ResolveMsg();
+ }), "KHKJ解析线程");
+ }
+
+ private void ResolveMsg()
+ {
+ List temp = new List();
+ //一系列解包
+ while (dataStorage.GetSize() > 0)
+ {
+ byte item = dataStorage.GetData();
+ List data = new List() { item };
+ if (Encoding.ASCII.GetString(data.ToArray()) == ":")
+ {
+ temp.Add(item);
+ while (dataStorage.GetSize() < 32) { Thread.Sleep(5); }
+
+ while (temp.Count < 32)
+ {
+ temp.Add(dataStorage.GetData());
+ }
+ List vs = new List() { temp[temp.Count - 4], temp[temp.Count - 3], temp[temp.Count - 2], temp[temp.Count - 1] };
+
+ string t = Encoding.ASCII.GetString(vs.ToArray()).ToLower();
+ var package = Encoding.ASCII.GetString(temp.ToArray());
+ //if (package.Contains("\\r\\n"))
+ //{
+ // ProcessMsg(package);
+ //}
+ temp.Clear();
+ }
+ continue;
+ }
+ Thread.Sleep(500);
+ }
+
+ public void Stop()
+ {
+ try
+ {
+ commProxy.Stop();
+ free = true;
+ }
+ catch (Exception ex)
+ {
+ MessageLog.GetInstance.ShowEx($"BPASmartClient.KLMCoffee 中引发错误,CoffeeMachine 类,描述:[{ex.Message}]");
+ }
+ }
+
+
+ ///
+ /// 16进制转字节数组
+ ///
+ ///
+ ///
+ public byte[] HexStringToByteArray( string hexstring)
+ {
+ var byteArray = new byte[hexstring.Length/2];
+ for (int i = 0; i < byteArray.Length; i++)
+ {
+ var x = Convert.ToInt32(hexstring.Substring(i * 2, 2), 16);
+ byteArray[i] = (byte)x;
+ }
+ return byteArray;
+ }
+ }
+}
diff --git a/BPASmartClient.Message/MessageLog.cs b/BPASmartClient.Message/MessageLog.cs
index 75da5e61..3467aee0 100644
--- a/BPASmartClient.Message/MessageLog.cs
+++ b/BPASmartClient.Message/MessageLog.cs
@@ -22,6 +22,10 @@ namespace BPASmartClient.Message
///
public Action InfoNotify { get; set; }
+ public Action DebugLog { get; set; }
+
+ public string DebugLogInfo { get; set; } = string.Empty;
+
///
/// 日志信息
///
@@ -37,6 +41,13 @@ namespace BPASmartClient.Message
LogInfo = $"{DateTime.Now.ToString("HH:mm:ss")}:{info} \n\r {LogInfo}";
if (InfoNotify != null) InfoNotify(info);
}
+
+ public void ShowDebugLog(string info)
+ {
+ Debug.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}:{info}");
+ DebugLogInfo = $"{DateTime.Now.ToString("HH:mm:ss")}:{info} \n\r {DebugLogInfo}";
+ DebugLog?.Invoke(info);
+ }
#endregion
#region 异常消息日志
diff --git a/BPASmartClient.MilkWithTea/App.xaml b/BPASmartClient.MilkWithTea/App.xaml
index dc565115..83ac9a37 100644
--- a/BPASmartClient.MilkWithTea/App.xaml
+++ b/BPASmartClient.MilkWithTea/App.xaml
@@ -83,7 +83,7 @@
-
+
@@ -93,9 +93,9 @@
+ HorizontalAlignment="Center" />
@@ -191,6 +191,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -204,8 +236,10 @@
-
-
+
+
+
@@ -213,9 +247,28 @@
+ HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -247,15 +300,15 @@
Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
-
@@ -392,7 +444,7 @@
-
+
@@ -585,7 +637,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/BPASmartClient.MilkWithTea/App.xaml.cs b/BPASmartClient.MilkWithTea/App.xaml.cs
index 42734460..266bb6c8 100644
--- a/BPASmartClient.MilkWithTea/App.xaml.cs
+++ b/BPASmartClient.MilkWithTea/App.xaml.cs
@@ -1,4 +1,5 @@
-using System;
+using BPASmartClient.Helper;
+using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
@@ -13,5 +14,11 @@ namespace BPASmartClient.MilkWithTea
///
public partial class App : Application
{
+ protected override void OnStartup(StartupEventArgs e)
+ {
+ base.OnStartup(e);
+ SystemHelper.GetInstance.CreateDesktopShortcut();
+
+ }
}
}
diff --git a/BPASmartClient.MilkWithTea/BPASmartClient.MilkWithTea.csproj b/BPASmartClient.MilkWithTea/BPASmartClient.MilkWithTea.csproj
index b7de3156..8282b987 100644
--- a/BPASmartClient.MilkWithTea/BPASmartClient.MilkWithTea.csproj
+++ b/BPASmartClient.MilkWithTea/BPASmartClient.MilkWithTea.csproj
@@ -5,8 +5,14 @@
net6.0-windows
enable
true
+ hbl.ico
+ hbl.ico
+
+
+
+
@@ -22,6 +28,10 @@
PreserveNewest
+
+ True
+ \
+
diff --git a/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml b/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml
index 2b27ca59..4aa6b2f7 100644
--- a/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml
+++ b/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml
@@ -7,6 +7,7 @@
xmlns:ccontrols="http://schemas.microsoft.com/expression/2010/drawing"
mc:Ignorable="d" x:Name="circularProgress"
Height="100" Width="100">
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml.cs b/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml.cs
index 953dcde6..bcb05fff 100644
--- a/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml.cs
+++ b/BPASmartClient.MilkWithTea/Control/CircularProgressBar.xaml.cs
@@ -10,6 +10,7 @@ using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
+using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
@@ -53,7 +54,7 @@ namespace BPASmartClient.MilkWithTea.Control
{
if (angle > 360) return;
- if (angle <= 0) return;
+ if (angle < 0) return;
int offset = 5;
if (angle > 359) angle = 359.8;
@@ -65,12 +66,33 @@ namespace BPASmartClient.MilkWithTea.Control
double startPositionX = radius + offset;
double startPositionY = offset;
- if (angle > 180)
+ Storyboard sb = new Storyboard();
+ DoubleAnimation yd1 = new DoubleAnimation();//实例化浮点动画
+ cyclePath.RenderTransform = new RotateTransform();//设置为旋转动画
+ cyclePath.RenderTransformOrigin = new Point(0.5, 0.5);//设置旋转的中心
+ yd1.From = 0;//动画的起始值
+ yd1.To = 360;//动画的结束值
+ yd1.Duration = TimeSpan.FromSeconds(3);//动画的播放时间
+ yd1.RepeatBehavior = RepeatBehavior.Forever;//设置动画循环播放
+ Storyboard.SetTarget(yd1, cyclePath);//给故事板绑定动画
+ Storyboard.SetTargetProperty(yd1, new PropertyPath("RenderTransform.Angle"));//动画的依赖属性
+ sb.Children.Add(yd1);//故事板添加动画
+
+ if (angle == 0)
+ {
+ string Data = string.Format("M {0} {1} A {2} {2} 0 1 1 {3} {4}", startPositionX, startPositionY, radius, Math.Round(x, 2) + offset, Math.Round(y, 2) + offset);
+ this.cyclePath.Data = Geometry.Parse(Data);
+
+ sb.Begin();//播放动画
+ }
+
+ else if (angle > 180)
{
//string Data = string.Format("M {0} 0 A {0} {0} 0 1 1 {1} {2}", radius, Math.Round(x, 2), Math.Round(y, 2));
string Data = string.Format("M {0} {1} A {2} {2} 0 1 1 {3} {4}", startPositionX, startPositionY, radius, Math.Round(x, 2) + offset, Math.Round(y, 2) + offset);
this.cyclePath.Data = Geometry.Parse(Data);
+ sb.Stop();
}
else
{
@@ -80,7 +102,10 @@ namespace BPASmartClient.MilkWithTea.Control
string Data = string.Format("M {0} {1} A {2} {2} 0 0 1 {3} {4}", startPositionX, startPositionY, radius, Math.Round(x, 2) + offset, Math.Round(y, 2) + offset);
this.cyclePath.Data = Geometry.Parse(Data);
+ sb.Stop();
}
+
+
}
}
diff --git a/BPASmartClient.MilkWithTea/GLobal.cs b/BPASmartClient.MilkWithTea/GLobal.cs
index ac24bfe9..386fbb90 100644
--- a/BPASmartClient.MilkWithTea/GLobal.cs
+++ b/BPASmartClient.MilkWithTea/GLobal.cs
@@ -1,4 +1,5 @@
-using Model;
+using BPASmartClient.Model;
+using Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
@@ -19,6 +20,10 @@ namespace BPASmartClient.MilkWithTea
public static bool makeEnable = false;
public static ObservableCollection MaterialRecipes { get; set; } = new ObservableCollection();
+ ///
+ /// 设备信息列表
+ ///
+ public static ObservableCollection deviceConfig { get; set; } = new ObservableCollection();
///
diff --git a/BPASmartClient.MilkWithTea/MainWindow.xaml b/BPASmartClient.MilkWithTea/MainWindow.xaml
index 174834ae..736e97d9 100644
--- a/BPASmartClient.MilkWithTea/MainWindow.xaml
+++ b/BPASmartClient.MilkWithTea/MainWindow.xaml
@@ -12,6 +12,7 @@
+
@@ -96,6 +99,7 @@
+
-
+
+
diff --git a/BPASmartClient.MilkWithTea/MainWindow.xaml.cs b/BPASmartClient.MilkWithTea/MainWindow.xaml.cs
index 091c776d..8d2e064e 100644
--- a/BPASmartClient.MilkWithTea/MainWindow.xaml.cs
+++ b/BPASmartClient.MilkWithTea/MainWindow.xaml.cs
@@ -20,6 +20,7 @@ using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
+using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
@@ -40,6 +41,10 @@ namespace BPASmartClient.MilkWithTea
}
+ Storyboard sb = new Storyboard();
+ DoubleAnimation yd1 = new DoubleAnimation();//实例化浮点动画
+ DoubleAnimation yd2 = new DoubleAnimation();
+
private void Initialize()
{
@@ -196,6 +201,8 @@ namespace BPASmartClient.MilkWithTea
private void NavButton_Click(object sender, RoutedEventArgs e)
{
+
+ FadeInOut(0, 1, 750, 0);
try
{
if (sender is Button bt )
@@ -203,6 +210,7 @@ namespace BPASmartClient.MilkWithTea
Type type = Type.GetType($"BPASmartClient.MilkWithTea.View.{bt.Tag?.ToString()}");
ConstructorInfo cti = type.GetConstructor(System.Type.EmptyTypes);
contentRegion.Content = (FrameworkElement)cti.Invoke(null);
+ sb.Begin();
}
}
catch (Exception ex)
@@ -210,5 +218,23 @@ namespace BPASmartClient.MilkWithTea
MessageLog.GetInstance.ShowEx($"BPASmartClient 中引发错误,MainWindow.xaml.cs 类MenuItem_Click(),描述:[{ex.Message}]");
}
}
+
+
+ private void FadeInOut(double opactityFrom ,double opactityTo,double yForm,double yTo)
+ {
+ contentRegion.RenderTransform = new TranslateTransform();
+ yd1.From = opactityFrom;//动画的起始值
+ yd1.To = opactityTo;//动画的结束值
+ yd1.Duration = TimeSpan.FromSeconds(0.8);
+ Storyboard.SetTarget(yd1, contentRegion);//给故事板绑定动画
+ Storyboard.SetTargetProperty(yd1, new PropertyPath("Opacity"));//动画的依赖属性
+ yd2.From = yForm;//动画的起始值
+ yd2.To = yTo;//动画的结束值
+ yd2.Duration = TimeSpan.FromSeconds(0.5);
+ Storyboard.SetTarget(yd2, contentRegion);//给故事板绑定动画
+ Storyboard.SetTargetProperty(yd2, new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)"));//动画的依赖属性
+ sb.Children.Add(yd1);//故事板添加动画
+ sb.Children.Add(yd2);
+ }
}
}
diff --git a/BPASmartClient.MilkWithTea/View/LocalConfigureView.xaml b/BPASmartClient.MilkWithTea/View/LocalConfigureView.xaml
index a8fbca5d..9b6ed672 100644
--- a/BPASmartClient.MilkWithTea/View/LocalConfigureView.xaml
+++ b/BPASmartClient.MilkWithTea/View/LocalConfigureView.xaml
@@ -14,7 +14,6 @@
@@ -97,11 +78,9 @@
-
-
-
+
@@ -121,7 +100,7 @@
-
-
@@ -190,13 +170,13 @@
-
-
+
+
@@ -214,16 +194,17 @@
+ VerticalContentAlignment="Center"
+ Margin="2" FontSize="16"
+ Width="160" Height="28" />
-
@@ -243,8 +224,9 @@
@@ -260,7 +242,7 @@
-
-
+
-
-
-
+
+
-
-
-
-
+
+
@@ -77,10 +74,6 @@
-
-
-
-
@@ -98,7 +91,7 @@
@@ -106,11 +99,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -172,7 +165,7 @@
-
+
@@ -192,12 +185,15 @@
Width="200" HorizontalAlignment="Left" Foreground="LightSlateGray">
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.MilkWithTea/View/ParameterSetting.xaml b/BPASmartClient.MilkWithTea/View/ParameterSetting.xaml
index b3eb4be9..281b45b3 100644
--- a/BPASmartClient.MilkWithTea/View/ParameterSetting.xaml
+++ b/BPASmartClient.MilkWithTea/View/ParameterSetting.xaml
@@ -6,7 +6,7 @@
xmlns:local="clr-namespace:BPASmartClient.MilkWithTea.View"
xmlns:vm="clr-namespace:BPASmartClient.MilkWithTea.ViewModel"
mc:Ignorable="d"
- d:DesignHeight="800" d:DesignWidth="1400" Background="Transparent" >
+ d:DesignHeight="900" d:DesignWidth="1400" Background="Transparent" >
@@ -25,10 +25,11 @@
-
+
+
-
+
@@ -37,29 +38,29 @@
-
-
+
-
-
-
-
-
-
+
+
+
+
+
-
-
+
-
-
+
+
@@ -109,5 +110,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.MilkWithTea/ViewModel/MainControlViewModel.cs b/BPASmartClient.MilkWithTea/ViewModel/MainControlViewModel.cs
index 07f8306b..b27afd0b 100644
--- a/BPASmartClient.MilkWithTea/ViewModel/MainControlViewModel.cs
+++ b/BPASmartClient.MilkWithTea/ViewModel/MainControlViewModel.cs
@@ -39,12 +39,14 @@ namespace BPASmartClient.MilkWithTea.ViewModel
/// 当前正在制作的奶茶
///
public string CurrentGood { get { return _currentGood; } set { _currentGood = value; OnPropertyChanged(); } }
- private string _currentGood = "无";
+ private string _currentGood = "茉莉花茶";
///
/// 奶茶制作百分比
///
public string MakePercent { get { return _makePercent; } set { _makePercent = value; OnPropertyChanged(); } }
- private string _makePercent = "100";
+ private string _makePercent = "0";
+
+
///
/// 当前正在制作的奶茶
@@ -56,6 +58,8 @@ namespace BPASmartClient.MilkWithTea.ViewModel
///
public RelayCommand MakeGoodCommand { get; set; }
+
+
public MainControlViewModel()
{
MakeGoodCommand = new RelayCommand(new Action(() =>
@@ -63,32 +67,34 @@ namespace BPASmartClient.MilkWithTea.ViewModel
}));
Init();
- MorkOrderPush morkOrderPush = new MorkOrderPush() { GoodsName = "水果奶茶", SortNum = 1 };
+ MorkOrderPush morkOrderPush = new MorkOrderPush() { GoodsName = "珍珠奶茶", SortNum = 1 };
+ MorkOrderPush morkOrderPush1 = new MorkOrderPush() { GoodsName = "茉莉花茶", SortNum = 2 };
+ MorkOrderPush morkOrderPush2 = new MorkOrderPush() { GoodsName = "芝芝梅梅", SortNum = 3 };
orderStatusLists.Add(new MorkOrder()
{
- StartDate = "11",EndDate ="15",CompleteDate ="4",OrderStatus = ORDER_STATUS.COOKING,
+ StartDate = "11:20",EndDate ="11:24",CompleteDate ="4",OrderStatus = ORDER_STATUS.COMPLETED_COOK,
OrderPush = morkOrderPush
});
orderStatusLists.Add(new MorkOrder()
{
- StartDate = "11",
- EndDate = "15",
+ StartDate = "11:36",
+ EndDate = "11:40",
CompleteDate = "4",
OrderStatus = ORDER_STATUS.COOKING,
- OrderPush = morkOrderPush
+ OrderPush = morkOrderPush1
});
orderStatusLists.Add(new MorkOrder()
{
- StartDate = "11",
- EndDate = "15",
- CompleteDate = "4",
- OrderStatus = ORDER_STATUS.COOKING,
- OrderPush = morkOrderPush
+ StartDate = "10:33",
+ EndDate = "10:28",
+ CompleteDate = "5",
+ OrderStatus = ORDER_STATUS.COMPLETED_TAKE,
+ OrderPush = morkOrderPush2
});
diff --git a/BPASmartClient.MilkWithTea/ViewModel/MainWindowVeiwModel.cs b/BPASmartClient.MilkWithTea/ViewModel/MainWindowVeiwModel.cs
index 5aa4dc74..6dad830f 100644
--- a/BPASmartClient.MilkWithTea/ViewModel/MainWindowVeiwModel.cs
+++ b/BPASmartClient.MilkWithTea/ViewModel/MainWindowVeiwModel.cs
@@ -1,4 +1,5 @@
using BPASmartClient.Helper;
+using BPASmartClient.Model;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Model;
using System;
@@ -31,6 +32,7 @@ namespace BPASmartClient.MilkWithTea.ViewModel
GLobal.posionPath = Path.Combine(path, "MaterialPosion.json");
GLobal.MaterialRecipes = GLobal.GetJsonToT(GLobal.recipePath);
+ GLobal.deviceConfig = GLobal.GetJsonToT($"{LocaPath.GetInstance().GetDeviceConfigPath}奶茶味魔方.json");
}
}
diff --git a/BPASmartClient.MilkWithTea/ViewModel/PatrameterSettiongViewModel.cs b/BPASmartClient.MilkWithTea/ViewModel/PatrameterSettiongViewModel.cs
index 72ebfdc8..ed2b05fa 100644
--- a/BPASmartClient.MilkWithTea/ViewModel/PatrameterSettiongViewModel.cs
+++ b/BPASmartClient.MilkWithTea/ViewModel/PatrameterSettiongViewModel.cs
@@ -1,10 +1,14 @@
using BPASmartClient.Helper;
+using BPASmartClient.Message;
+using BPASmartClient.Model;
using BPASmartClient.MorkTM;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;
+using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -80,21 +84,39 @@ namespace BPASmartClient.MilkWithTea.ViewModel
///
public RelayCommand CheckMaterailWeightCommand { get; set; }
- public PatrameterSettiongViewModel()
- {
- foreach(MaterialPosion materialPosion in Enum.GetValues(typeof(MaterialPosion)))
- {
- materialPosions.Add(materialPosion);
- }
+ #region 设备配置
+
+ ///
+ /// 店铺名称
+ ///
+ public string ShopName { get { return _shopName; } set { _shopName = value; OnPropertyChanged(); } }
+ private string _shopName;
+ ///
+ /// 店铺ID
+ ///
+ public string ShopID { get { return _shopID; } set { _shopID = value; OnPropertyChanged(); } }
+ private string _shopID;
+ ///
+ /// 设备ID
+ ///
+ public string DeviceID { get { return _deviceID; } set { _deviceID = value; OnPropertyChanged(); } }
+ private string _deviceID;
+ ///
+ /// PLC地址
+ ///
+ public string PLCAdress { get { return _pLCAdress; } set { _pLCAdress = value; OnPropertyChanged(); } }
+ private string _pLCAdress;
- foreach(OutMaterialPosion outMaterialPosion in Enum.GetValues(typeof(OutMaterialPosion)))
- {
- TurntablePosion.Add(outMaterialPosion);
- }
+ public RelayCommand SaveDevicesCommand { get; set; }
+ #endregion
+ public PatrameterSettiongViewModel()
+ {
+
OutMaterailCommad = new RelayCommand(new Action(() =>
{
ActionManage.GetInstance.Send("通道口出料", new object[] { MaterialID +1, OutMaterailWeight });
+
}));
TurntableCommad = new RelayCommand(new Action(() =>
@@ -118,6 +140,39 @@ namespace BPASmartClient.MilkWithTea.ViewModel
ActionManage.GetInstance.Send("矫正重量", new object[] { CorrectPassway + 1, CorrectMatetailWeight });
}));
+ SaveDevicesCommand = new RelayCommand(SaveDeviceMessage);
+
+ init();
+ }
+ private void init()
+ {
+ foreach (MaterialPosion materialPosion in Enum.GetValues(typeof(MaterialPosion)))
+ {
+ materialPosions.Add(materialPosion);
+ }
+
+ foreach (OutMaterialPosion outMaterialPosion in Enum.GetValues(typeof(OutMaterialPosion)))
+ {
+ TurntablePosion.Add(outMaterialPosion);
+ }
+ ShopName = GLobal.deviceConfig.ElementAt(0).ShopName;
+ ShopID = GLobal.deviceConfig.ElementAt(0).ShopId;
+ DeviceID = GLobal.deviceConfig.ElementAt(0).deviceModels.ElementAt(0).DeviceId;
+ PLCAdress = GLobal.deviceConfig.ElementAt(0).deviceModels.ElementAt(0).communicationDevcies.ElementAt(0).communicationPar.IPAddress;
+ }
+
+ private void SaveDeviceMessage()
+ {
+ if (GLobal.deviceConfig.Count > 0)
+ {
+ GLobal.deviceConfig.ElementAt(0).ShopName = ShopName;
+ GLobal.deviceConfig.ElementAt(0).ShopId = ShopID;
+ GLobal.deviceConfig.ElementAt(0).deviceModels.ElementAt(0).DeviceId = DeviceID;
+ GLobal.deviceConfig.ElementAt(0).deviceModels.ElementAt(0).Id = Guid.NewGuid().ToString();
+ GLobal.deviceConfig.ElementAt(0).deviceModels.ElementAt(0).communicationDevcies.ElementAt(0).communicationPar.IPAddress = PLCAdress;
+ File.WriteAllText($"{LocaPath.GetInstance().GetDeviceConfigPath}奶茶味魔方.json", JsonConvert.SerializeObject(GLobal.deviceConfig));
+ }
+
}
}
}
diff --git a/BPASmartClient.MilkWithTea/hbl.ico b/BPASmartClient.MilkWithTea/hbl.ico
new file mode 100644
index 00000000..cf89051a
Binary files /dev/null and b/BPASmartClient.MilkWithTea/hbl.ico differ
diff --git a/BPASmartClient.Modbus/BPASmartClient.Modbus.csproj b/BPASmartClient.Modbus/BPASmartClient.Modbus.csproj
index b40ec4c7..646a09bc 100644
--- a/BPASmartClient.Modbus/BPASmartClient.Modbus.csproj
+++ b/BPASmartClient.Modbus/BPASmartClient.Modbus.csproj
@@ -6,6 +6,7 @@
+
diff --git a/BPASmartClient.Modbus/ModbusRTU.cs b/BPASmartClient.Modbus/ModbusRTU.cs
new file mode 100644
index 00000000..912d8a0a
--- /dev/null
+++ b/BPASmartClient.Modbus/ModbusRTU.cs
@@ -0,0 +1,225 @@
+using NModbus;
+using System;
+using System.Collections.Generic;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BPASmartClient.Modbus
+{
+ public class ModbusRTU
+ {
+ #region 参数配置
+ private static IModbusMaster master;
+ private static IModbusSerialMaster serialMaster;
+ private static ModbusFactory factory;
+ private static SerialPort port;
+ //写线圈或写寄存器数组
+ private bool[] coilsBuffer;
+ private ushort[] registerBuffer;
+ //功能码
+ private string functionCode;
+
+ //串口参数
+ private string portName;
+ private int baudRate;
+ private Parity parity;
+ private int dataBits;
+ private StopBits stopBits;
+
+ #endregion
+
+ #region 串口配置
+ ///
+ /// 串口参数获取
+ ///
+ /// 返回串口配置参数>
+ public void InitSerialPortParameter(string protName, int bauRate, string currentParity, int dataBits, string currentStopBits)
+ {
+ switch (currentParity)
+ {
+ case "奇":
+ parity = Parity.Odd;
+ break;
+ case "偶":
+ parity = Parity.Even;
+ break;
+ case "无":
+ parity = Parity.None;
+ break;
+ default:
+ break;
+ }
+ switch (currentStopBits)
+ {
+ case "1":
+ stopBits = StopBits.One;
+ break;
+ case "2":
+ stopBits = StopBits.Two;
+ break;
+ default:
+ break;
+ }
+ port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
+ //master = factory.CreateMaster()
+ }
+
+
+ #endregion
+
+ #region 串口收/发
+ public async void ExecuteFunctionRecive(string functionCode, byte slaveAddress, ushort startAddress, ushort numberOfPoints)
+ {
+ try
+ {
+
+ if (port.IsOpen == false)
+ {
+ port.Open();
+ }
+ if (functionCode != null)
+ {
+ switch (functionCode)
+ {
+ case "01 Read Coils"://读取单个线圈
+ try
+ {
+ coilsBuffer = master.ReadCoils(slaveAddress, startAddress, numberOfPoints);
+ }
+ catch (Exception)
+ {
+ //MessageBox.Show(e.Message);
+ break;
+ }
+ break;
+ case "02 Read DisCrete Inputs"://读取输入线圈/离散量线圈
+ try
+ {
+ coilsBuffer = master.ReadInputs(slaveAddress, startAddress, numberOfPoints);
+ }
+ catch (Exception)
+ {
+ break;
+ }
+
+ break;
+ case "03 Read Holding Registers"://读取保持寄存
+ try
+ {
+ registerBuffer = master.ReadHoldingRegisters(slaveAddress, startAddress, numberOfPoints);
+ }
+ catch (Exception)
+ {
+
+ break;
+ }
+ break;
+ case "04 Read Input Registers"://读取输入寄存器
+ try
+ {
+ registerBuffer = master.ReadInputRegisters(slaveAddress, startAddress, numberOfPoints);
+ }
+ catch (Exception)
+ {
+
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ }
+ port.Close();
+ }
+ catch (Exception ex)
+ {
+ port.Close();
+ }
+ }
+
+ public async void ExecuteFunctionSend(string data, byte slaveAddress, ushort startAddress)
+ {
+ try
+ {
+
+ if (port.IsOpen == false)
+ {
+ port.Open();
+ }
+ if (functionCode != null)
+ {
+ switch (functionCode)
+ {
+ case "05 Write Single Coil"://写单个线圈
+ SetWriteParametes(data,true);
+ await master.WriteSingleCoilAsync(slaveAddress, startAddress, coilsBuffer[0]);
+ break;
+ case "06 Write Single Registers"://写单个输入线圈/离散量线圈
+ SetWriteParametes(data,true);
+ await master.WriteSingleRegisterAsync(slaveAddress, startAddress, registerBuffer[0]);
+ break;
+ case "0F Write Multiple Coils"://写一组线圈
+ SetWriteParametes(data);
+ await master.WriteMultipleCoilsAsync(slaveAddress, startAddress, coilsBuffer);
+ break;
+ case "10 Write Multiple Registers"://写一组保持寄存器
+ SetWriteParametes(data);
+ await master.WriteMultipleRegistersAsync(slaveAddress, startAddress, registerBuffer);
+ break;
+ default:
+ break;
+ }
+
+ }
+ port.Close();
+ }
+ catch (Exception ex)
+ {
+ port.Close();
+ }
+ }
+ #endregion
+
+
+
+ ///
+ /// 设置写参数
+ ///
+ private void SetWriteParametes(string data,bool isParametes =false)
+ {
+
+ //判断是否写线圈
+ if (isParametes)
+ {
+ string[] strarr = data.Split(' ');
+ coilsBuffer = new bool[strarr.Length];
+ //转化为bool数组
+ for (int i = 0; i < strarr.Length; i++)
+ {
+ // strarr[i] == "0" ? coilsBuffer[i] = false : coilsBuffer[i] = true;
+ if (strarr[i] == "0")
+ {
+ coilsBuffer[i] = false;
+ }
+ else
+ {
+ coilsBuffer[i] = true;
+ }
+ }
+ }
+ else
+ {
+ //转化ushort数组
+ string[] strarr = data.Split(' ');
+ registerBuffer = new ushort[strarr.Length];
+ for (int i = 0; i < strarr.Length; i++)
+ {
+ registerBuffer[i] = ushort.Parse(strarr[i]);
+ }
+ }
+ }
+ }
+}
diff --git a/BPASmartClient.MorkTM/BPASmartClient.MorkTM.csproj b/BPASmartClient.MorkTM/BPASmartClient.MorkTM.csproj
index c10b5d75..fc9a23ad 100644
--- a/BPASmartClient.MorkTM/BPASmartClient.MorkTM.csproj
+++ b/BPASmartClient.MorkTM/BPASmartClient.MorkTM.csproj
@@ -47,6 +47,7 @@
+
diff --git a/BPASmartClient.MorkTM/Control_MorkTM.cs b/BPASmartClient.MorkTM/Control_MorkTM.cs
index da30111d..6eda755a 100644
--- a/BPASmartClient.MorkTM/Control_MorkTM.cs
+++ b/BPASmartClient.MorkTM/Control_MorkTM.cs
@@ -36,7 +36,7 @@ namespace BPASmartClient.MorkTM
Dictionary res = new Dictionary();
res.Add(Convert.ToInt32(o[0]), Convert.ToSingle(o[1]));
SetMatertialWeight(res);
- Thread.Sleep(1000);
+ Thread.Sleep(100);
OpenUsePassageWay(Convert.ToInt32(o[0]));
}
}), "通道口出料");
@@ -82,7 +82,7 @@ namespace BPASmartClient.MorkTM
{
if (o != null && o is WritePar writePar) WriteData(writePar.Address, writePar.Value);
}), "WriteBools");
- morkTM.ReachPosions = new List() { morkTM.ReachOutPosion_0, morkTM.ReachPosion_1, morkTM.ReachPosion_2, morkTM.ReachPosion_3, morkTM.ReachPosion_4, morkTM.ReachPosion_5, morkTM.ReachPosion_6 };
+ morkTM.ReachPosions = new List() { morkTM.ReachPosion_1, morkTM.ReachPosion_2, morkTM.ReachPosion_3, morkTM.ReachPosion_4, morkTM.ReachPosion_5, morkTM.ReachPosion_6 , morkTM.ReachOutPosion_0, };
DeviceProcessLogShow("设备初始化完成");
@@ -170,11 +170,12 @@ namespace BPASmartClient.MorkTM
{
if (morkTM.morkOrderPushesTeaWithMilk.TryDequeue(out OrderLocInfo orderLoc)) //&&原点位置是否有杯子)
{
+ DeviceProcessLogShow($"开始制作奶茶{orderLoc.GoodName}");
morkTM.MakeCount = 0;
SetMatertialWeight(orderLoc.GoodPushes);//设置物料出料量
morkTM.RecipesPushes.Clear();
morkTM.RecipesPushes = orderLoc.GoodPushes;
- MakeProcess(orderLoc.GoodName, morkTM.MakeCount, morkTM.RecipesPushes.Count);
+ MakeProcess(orderLoc.GoodName, morkTM.MakeCount, morkTM.RecipesPushes.Count);//制作进度
OrderChange(orderLoc.SuborderId, ORDER_STATUS.COOKING);
foreach (var item in morkTM.RecipesPushes)
{
@@ -189,9 +190,6 @@ namespace BPASmartClient.MorkTM
OrderChange(orderLoc.SuborderId, ORDER_STATUS.COMPLETED_COOK);
MakeProcess(orderLoc.GoodName, 1, 1);
DeviceProcessLogShow($"奶茶{orderLoc.GoodName}制作完成");
-
-
-
}
}
}
@@ -240,7 +238,7 @@ namespace BPASmartClient.MorkTM
return;
}
}
- while(!morkTM.ReachPosions[i])//等待转盘到达信号
+ while(!morkTM.ReachPosions[i-1])//等待转盘到达信号
{
Thread.Sleep(1000);
}
@@ -284,13 +282,12 @@ namespace BPASmartClient.MorkTM
return ;
}
}
- while(morkTM.ReachPosions[i-1])
+ while(morkTM.ReachPosions[posion - 1])
{
Thread.Sleep(1000);
}
WriteData(address,false);
-
-
+ DeviceProcessLogShow($"转盘转动到位置{i}");
}
}
@@ -316,6 +313,7 @@ namespace BPASmartClient.MorkTM
private void CheckPassway(int passway,int time)
{
WriteData(polymer.PasswayPosionList[(MaterialPosion)passway], Convert.ToInt32(time * expand));//写入出料时间
+ Thread.Sleep(100);
WriteData("M5.0", true);//开始校正
}
@@ -348,6 +346,7 @@ namespace BPASmartClient.MorkTM
{
int value = Convert.ToInt32(material.Value*expand);
WriteData(polymer.MaterialPosionList[(MaterialPosion)material.Key], value);
+ DeviceProcessLogShow($"通道{material.Key}预设料{material.Value}g");
Thread.Sleep(200);
}
}
diff --git a/BPASmartClient.MorkTM/PolymerBatching.cs b/BPASmartClient.MorkTM/PolymerBatching.cs
index 694b78d3..05285ffb 100644
--- a/BPASmartClient.MorkTM/PolymerBatching.cs
+++ b/BPASmartClient.MorkTM/PolymerBatching.cs
@@ -1,5 +1,7 @@
-using System;
+using BPASmartClient.Helper;
+using System;
using System.Collections.Generic;
+using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -15,7 +17,7 @@ namespace BPASmartClient.MorkTM
}
public enum OutMaterialPosion
{
- 出料位=0, 一号位 = 1, 二号位 = 2, 三号位 = 3, 四号位 = 4, 五号位 = 5, 六号位 = 6
+ 一号位 = 1, 二号位 = 2, 三号位 = 3, 四号位 = 4, 五号位 = 5, 六号位 = 6,出料位 = 0
}
public class CommationPosionPLC
{
@@ -34,7 +36,7 @@ namespace BPASmartClient.MorkTM
public class PolymerBatching
{
///
- /// 物料对应的plc点位
+ /// 物料需求对应的plc点位
///
public Dictionary MaterialPosionList = new Dictionary()
{
@@ -69,7 +71,7 @@ namespace BPASmartClient.MorkTM
};
///
- /// 通道校正PLC点位
+ /// 通道校正值PLC点位
///
public Dictionary PasswayPosionList = new Dictionary()
{
@@ -108,48 +110,50 @@ namespace BPASmartClient.MorkTM
///
public List TurnPosionPLCs = new List()
{
- new CommationPosionPLC("M4.0","M14.0",OutMaterialPosion.一号位),
- new CommationPosionPLC("M4.1","M14.1",OutMaterialPosion.二号位),
- new CommationPosionPLC("M4.2","M14.2",OutMaterialPosion.三号位),
- new CommationPosionPLC("M4.3","M14.3",OutMaterialPosion.四号位),
- new CommationPosionPLC("M4.4","M14.4",OutMaterialPosion.五号位),
- new CommationPosionPLC("M4.5","M14.5",OutMaterialPosion.六号位),
+ //new CommationPosionPLC("M4.0","M14.0",OutMaterialPosion.一号位),
+ //new CommationPosionPLC("M4.1","M14.1",OutMaterialPosion.二号位),
+ //new CommationPosionPLC("M4.2","M14.2",OutMaterialPosion.三号位),
+ //new CommationPosionPLC("M4.3","M14.3",OutMaterialPosion.四号位),
+ //new CommationPosionPLC("M4.4","M14.4",OutMaterialPosion.五号位),
+ //new CommationPosionPLC("M4.5","M14.5",OutMaterialPosion.六号位),
};
- ///
+ ///
/// plc出料点位
///
public List OutPosionPLCs = new List()
{
- new CommationPosionPLC("M0.0","M10.0",MaterialPosion.Top1),
- new CommationPosionPLC("M0.1","M10.1",MaterialPosion.Top2),
- new CommationPosionPLC("M0.2","M10.2",MaterialPosion.Top3),
- new CommationPosionPLC("M0.3","M10.3",MaterialPosion.Top4),
- new CommationPosionPLC("M0.4","M10.4",MaterialPosion.Top5),
- new CommationPosionPLC("M0.5","M10.5",MaterialPosion.Top6),
- new CommationPosionPLC("M0.6","M10.6",MaterialPosion.Top7),
- new CommationPosionPLC("M0.7","M10.7",MaterialPosion.Top8),
- new CommationPosionPLC("M1.0","M11.0",MaterialPosion.Top9),
- new CommationPosionPLC("M1.1","M11.1",MaterialPosion.Top10),
- new CommationPosionPLC("M1.2","M11.2",MaterialPosion.Top11),
- new CommationPosionPLC("M1.3","M11.3",MaterialPosion.Top12),
- new CommationPosionPLC("M1.4","M11.4",MaterialPosion.Top13),
- new CommationPosionPLC("M1.5","M11.5",MaterialPosion.Top14),
- new CommationPosionPLC("M1.6","M11.6",MaterialPosion.Top15),
- new CommationPosionPLC("M1.7","M11.7",MaterialPosion.Top16),
- new CommationPosionPLC("M2.0","M12.0",MaterialPosion.Top17),
- new CommationPosionPLC("M2.1","M12.1",MaterialPosion.Top18),
- new CommationPosionPLC("M2.2","M12.2",MaterialPosion.Top19),
- new CommationPosionPLC("M2.3","M12.3",MaterialPosion.Top20),
- new CommationPosionPLC("M2.4","M12.4",MaterialPosion.Top21),
- new CommationPosionPLC("M2.5","M12.5",MaterialPosion.Top22),
- new CommationPosionPLC("M2.6","M12.6",MaterialPosion.Top23),
- new CommationPosionPLC("M2.7","M12.7",MaterialPosion.Top24),
- new CommationPosionPLC("M3.0","M13.0",MaterialPosion.Top25),
- new CommationPosionPLC("M3.1","M13.1",MaterialPosion.Top26),
- new CommationPosionPLC("M3.2","M13.2",MaterialPosion.Top27),
- new CommationPosionPLC("M3.3","M13.3",MaterialPosion.Top28),
+ //new CommationPosionPLC("M0.0","M10.0",MaterialPosion.Top1),
+ //new CommationPosionPLC("M0.1","M10.1",MaterialPosion.Top2),
+ //new CommationPosionPLC("M0.2","M10.2",MaterialPosion.Top3),
+ //new CommationPosionPLC("M0.3","M10.3",MaterialPosion.Top4),
+ //new CommationPosionPLC("M0.4","M10.4",MaterialPosion.Top5),
+ //new CommationPosionPLC("M0.5","M10.5",MaterialPosion.Top6),
+ //new CommationPosionPLC("M0.6","M10.6",MaterialPosion.Top7),
+ //new CommationPosionPLC("M0.7","M10.7",MaterialPosion.Top8),
+ //new CommationPosionPLC("M1.0","M11.0",MaterialPosion.Top9),
+ //new CommationPosionPLC("M1.1","M11.1",MaterialPosion.Top10),
+ //new CommationPosionPLC("M1.2","M11.2",MaterialPosion.Top11),
+ //new CommationPosionPLC("M1.3","M11.3",MaterialPosion.Top12),
+ //new CommationPosionPLC("M1.4","M11.4",MaterialPosion.Top13),
+ //new CommationPosionPLC("M1.5","M11.5",MaterialPosion.Top14),
+ //new CommationPosionPLC("M1.6","M11.6",MaterialPosion.Top15),
+ //new CommationPosionPLC("M1.7","M11.7",MaterialPosion.Top16),
+ //new CommationPosionPLC("M2.0","M12.0",MaterialPosion.Top17),
+ //new CommationPosionPLC("M2.1","M12.1",MaterialPosion.Top18),
+ //new CommationPosionPLC("M2.2","M12.2",MaterialPosion.Top19),
+ //new CommationPosionPLC("M2.3","M12.3",MaterialPosion.Top20),
+ //new CommationPosionPLC("M2.4","M12.4",MaterialPosion.Top21),
+ //new CommationPosionPLC("M2.5","M12.5",MaterialPosion.Top22),
+ //new CommationPosionPLC("M2.6","M12.6",MaterialPosion.Top23),
+ //new CommationPosionPLC("M2.7","M12.7",MaterialPosion.Top24),
+ //new CommationPosionPLC("M3.0","M13.0",MaterialPosion.Top25),
+ //new CommationPosionPLC("M3.1","M13.1",MaterialPosion.Top26),
+ //new CommationPosionPLC("M3.2","M13.2",MaterialPosion.Top27),
+ //new CommationPosionPLC("M3.3","M13.3",MaterialPosion.Top28),
};
-
+ ///
+ /// 通道绑定出料位置
+ ///
public void GetMaterialInfo()
{
List materialPosions = Enum.GetValues(typeof(MaterialPosion)).Cast().ToList();
@@ -168,9 +172,36 @@ namespace BPASmartClient.MorkTM
}
}
- }
+
+ }
+ ///
+ /// 出料通道和出料口位置绑定集合
+ /// 一号位(1,2,3,4,5),二号位(6,7,8,9,10),三号位(11,12,13,14),4号位(15,16,17,18),五号位(19,20,21,22,23),六号位(24,25,26,27,28)
+ ///
public Dictionary, CommationPosionPLC> GoodsMaterialPosion = new Dictionary, CommationPosionPLC>();
+
+ string Path = AppDomain.CurrentDomain.BaseDirectory + "AccessFile\\DeviceConfig\\PLCVars.csv";
+
+ private void init()
+ {
+ DataTable dt = ExcelHelper.ReadDataFromCSV(Path);
+ DataRowCollection dr = dt.Rows;
+ for (int i = 0; i < 28; i++)
+ {
+ OutPosionPLCs.Add(new CommationPosionPLC(dr[i][0].ToString(), dr[i][2].ToString(), (MaterialPosion)i+1));
+ }
+ for(int i = 28; i <34;i++)
+ {
+ TurnPosionPLCs.Add(new CommationPosionPLC(dr[i][0].ToString(), dr[i][2].ToString(), (OutMaterialPosion)i - 27));
+ }
+
+ }
+
+ public PolymerBatching()
+ {
+ init();
+ }
}
}
diff --git a/BPASmartClient.Nfc/BPASmartClient.Nfc.csproj b/BPASmartClient.Nfc/BPASmartClient.Nfc.csproj
new file mode 100644
index 00000000..2cce1ae6
--- /dev/null
+++ b/BPASmartClient.Nfc/BPASmartClient.Nfc.csproj
@@ -0,0 +1,28 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.Nfc/NFCHelper.cs b/BPASmartClient.Nfc/NFCHelper.cs
new file mode 100644
index 00000000..ffc32ef7
--- /dev/null
+++ b/BPASmartClient.Nfc/NFCHelper.cs
@@ -0,0 +1,242 @@
+using BPASmartClient.Helper;
+using BPASmartClient.Message;
+using System.Text.RegularExpressions;
+
+namespace BPASmartClient.Nfc
+{
+ public class NFCHelper
+ {
+ private volatile static NFCHelper _Instance;
+ public static NFCHelper GetInstance => _Instance ?? (_Instance = new NFCHelper());
+ private NFCHelper() { }
+
+ public ReadResult GetReadResult { get; set; } = new ReadResult();
+
+ public Action Update { get; set; }
+
+ //转换卡号专用
+ private byte[] convertSNR(string str, int keyN)
+ {
+ string regex = "[^a-fA-F0-9]";
+ string tmpJudge = Regex.Replace(str, regex, "");
+
+ //长度不对,直接退回错误
+ if (tmpJudge.Length != 12) return null;
+
+ string[] tmpResult = Regex.Split(str, regex);
+ byte[] result = new byte[keyN];
+ int i = 0;
+ foreach (string tmp in tmpResult)
+ {
+ result[i] = Convert.ToByte(tmp, 16);
+ i++;
+ }
+ return result;
+ }
+
+ //数据输入判断函数2个
+ private string formatStr(string str, int num_blk)
+ {
+
+ string tmp = Regex.Replace(str, "[^a-fA-F0-9]", "");
+ //长度不对直接报错
+ //num_blk==-1指示不用检查位数
+ if (num_blk == -1) return tmp;
+ //num_blk==其它负数,为-1/num_blk
+ if (num_blk < -1)
+ {
+ if (tmp.Length != -16 / num_blk * 2) return null;
+ else return tmp;
+ }
+ if (tmp.Length != 16 * num_blk * 2) return null;
+ else return tmp;
+ }
+ private void convertStr(byte[] after, string before, int length)
+ {
+ for (int i = 0; i < length; i++)
+ {
+ after[i] = Convert.ToByte(before.Substring(2 * i, 2), 16);
+ }
+ }
+
+ //显示命令执行结果
+ private string showStatue(int Code)
+ {
+ string msg = "";
+ switch (Code)
+ {
+ case 0x00:
+ msg = "命令执行成功";
+ break;
+ case 0x01:
+ msg = "命令操作失败";
+ break;
+ case 0x02:
+ msg = "地址校验错误";
+ break;
+ case 0x03:
+ msg = "找不到已选择的端口";
+ break;
+ case 0x04:
+ msg = "读写器返回超时";
+ break;
+ case 0x05:
+ msg = "数据包流水号不正确";
+ break;
+ case 0x07:
+ msg = "接收异常";
+ break;
+ case 0x0A:
+ msg = "参数值超出范围";
+ break;
+ case 0x80:
+ msg = "参数设置成功";
+ break;
+ case 0x81:
+ msg = "参数设置失败";
+ break;
+ case 0x82:
+ msg = "通讯超时";
+ break;
+ case 0x83:
+ msg = "卡不存在";
+ break;
+ case 0x84:
+ msg = "接收卡数据出错";
+ break;
+ case 0x85:
+ msg = "未知的错误";
+ break;
+ case 0x87:
+ msg = "输入参数或者输入命令格式错误";
+ break;
+ case 0x89:
+ msg = "输入的指令代码不存在";
+ break;
+ case 0x8A:
+ msg = "在对于卡块初始化命令中出现错误";
+ break;
+ case 0x8B:
+ msg = "在防冲突过程中得到错误的序列号";
+ break;
+ case 0x8C:
+ msg = "密码认证没通过";
+ break;
+ case 0x8F:
+ msg = "读取器接收到未知命令";
+ break;
+ case 0x90:
+ msg = "卡不支持这个命令";
+ break;
+ case 0x91:
+ msg = "命令格式有错误";
+ break;
+ case 0x92:
+ msg = "在命令的FLAG参数中,不支持OPTION 模式";
+ break;
+ case 0x93:
+ msg = "要操作的BLOCK不存在";
+ break;
+ case 0x94:
+ msg = "要操作的对象已经别锁定,不能进行修改";
+ break;
+ case 0x95:
+ msg = "锁定操作不成功";
+ break;
+ case 0x96:
+ msg = "写操作不成功";
+ break;
+ default:
+ msg = "未知错误2";
+ break;
+ }
+ return msg;
+ }
+
+ ///
+ /// 结果显示
+ ///
+ ///
+ ///
+ ///
+ ///
+ private string showData(byte[] data, int s, int e)
+ {
+ string res = string.Empty;
+ //非负转换
+ for (int i = 0; i < e; i++)
+ {
+ if (data[s + i] < 0)
+ data[s + i] = Convert.ToByte(Convert.ToInt32(data[s + i]) + 256);
+ }
+
+ for (int i = 0; i < e; i++)
+ {
+ res += data[s + i].ToString("X2") + " ";
+ }
+ return res;
+ }
+
+ public void Init()
+ {
+ ThreadManage.GetInstance().StartLong(new Action(() =>
+ {
+ Read();
+ if (GetReadResult.ErrorInfo.Length > 0) MessageLog.GetInstance.ShowDebugLog(GetReadResult.ErrorInfo);
+ Thread.Sleep(1000);
+ }), "NFC数据读取");
+ }
+
+ public void Read(ReadKeyEnum readKeyEnum = ReadKeyEnum.KeyA, ReadTypeEnum readTypeEnum = ReadTypeEnum.Idle, byte ReadStart = 16, byte ReadNum = 1)
+ {
+ //数据是一个64位的长整形,读取块的数量就是指第几个字
+
+ if (ReadStart < 0 || ReadStart > 63) return;
+ if (ReadNum <= 0 || ReadNum > 4) return;
+ byte mode1 = (readKeyEnum == ReadKeyEnum.KeyB) ? (byte)0x01 : (byte)0x00;
+ byte mode2 = (readTypeEnum == ReadTypeEnum.All) ? (byte)0x01 : (byte)0x00;
+ byte mode = (byte)((mode1 << 1) | mode2);
+ byte blk_add = ReadStart;
+ byte num_blk = ReadNum;
+ //秘钥:
+ //第一组:FF FF FF FF FF FF
+ //第二组:B0 B1 B2 B3 B4 B5
+ //第三组:A0 A1 A2 A3 A4 A5
+ byte[] snr = new byte[6];
+ snr = convertSNR("FF FF FF FF FF FF", 6);
+ if (snr == null)
+ {
+ GetReadResult.ErrorInfo = "序列号无效!";
+ return;
+ }
+
+ byte[] buffer = new byte[16 * num_blk];
+ try
+ {
+ int nRet = Reader.MF_Read(mode, blk_add, num_blk, snr, buffer);
+ GetReadResult.StatueCode = showStatue(nRet);
+ if (nRet != 0)
+ {
+ GetReadResult.StatueCode = showStatue(buffer[0]);
+ GetReadResult.CardNum = string.Empty;
+ GetReadResult.Data = string.Empty;
+ }
+ else
+ {
+ GetReadResult.CardNum = showData(snr, 0, 4);
+ GetReadResult.Data = showData(buffer, 0, 16 * num_blk);
+ }
+ }
+ catch (Exception ex)
+ {
+ GetReadResult.CardNum = string.Empty;
+ GetReadResult.Data = string.Empty;
+ MessageLog.GetInstance.ShowDebugLog(ex.ToString());
+ }
+ finally
+ {
+ Update?.Invoke();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BPASmartClient.Nfc/ReadKeyEnum.cs b/BPASmartClient.Nfc/ReadKeyEnum.cs
new file mode 100644
index 00000000..9ab7a9c2
--- /dev/null
+++ b/BPASmartClient.Nfc/ReadKeyEnum.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BPASmartClient.Nfc
+{
+ public enum ReadKeyEnum
+ {
+ KeyA,
+ KeyB,
+ }
+
+ public enum ReadTypeEnum
+ {
+ Idle,
+ All
+ }
+}
diff --git a/BPASmartClient.Nfc/ReadResult.cs b/BPASmartClient.Nfc/ReadResult.cs
new file mode 100644
index 00000000..2e9afe1f
--- /dev/null
+++ b/BPASmartClient.Nfc/ReadResult.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BPASmartClient.Nfc
+{
+ public class ReadResult
+ {
+ public string ErrorInfo { get; set; } = string.Empty;
+ public string CardNum { get; set; } = string.Empty;
+ public string StatueCode { get; set; } = string.Empty;
+ public string Data { get; set; } = string.Empty;
+ }
+}
diff --git a/BPASmartClient.Nfc/Reader.cs b/BPASmartClient.Nfc/Reader.cs
new file mode 100644
index 00000000..c582b1b4
--- /dev/null
+++ b/BPASmartClient.Nfc/Reader.cs
@@ -0,0 +1,263 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BPASmartClient.Nfc
+{
+ public class Reader
+ {
+ /*System Setting*/
+ [DllImport("function.dll")]
+
+ public static extern int SetSerNum(byte[] newValue, [In] byte[] buffer);
+ /*
+ 函数功能:设置 8个字节的产品序列号。
+
+ 输入参数: 描述
+ newValue 8个字节的读写器序列号
+ buffer 用来返回接收到的数据的指针
+
+ 输出参数:
+
+ buffer 返回STATUS后的状态
+ * 如果设置成功,则*buffer=0x 80
+ 如果设置失败,则*buffer为底层(读卡器单片机)上传的错误代码
+
+ 返回值:
+ 0x00,设置成功
+ 0x01,设置失败
+ */
+
+ [DllImport("function.dll")]
+
+ public static extern int GetSerNum([In] byte[] buffer);
+ /*
+ 函数功能:
+ 读取由厂家预设的1个字节的读卡器地址和8个字节序列号.
+
+ 输入参数:
+ buffer 传入一个指针,用来返回接收到的数据
+
+ 输出参数:
+
+ buffer buffer[0] 读写器地址
+ buffer[1...8] 8个字节的读写器序列号
+
+ 返回值:
+ 0x00,操作成功
+ 0x01,操作失败
+ */
+
+ [DllImport("function.dll")]
+
+ public static extern int GetVersionNum([In] byte[] strVersionNum);
+ /*
+ 函数功能:
+ 读取读写器的版本号.
+
+ 输入参数:
+ VersionNum 待读入的版本号
+
+ 输出参数:
+ *VersionNum
+ * 如果 :操作失败, 则VersionNum [0] 为 错误代码
+ 如果 :操作成功, 则VersionNum [0..N] 为读入的版本号
+ 返回值:
+ 0x00,操作成功
+ 0x01,操作失败
+ */
+
+ [DllImport("function.dll")]
+
+ public static extern int ControlLED(int freq, int duration, [In] byte[] buffer);
+ /*
+ 函数功能: 设置读卡器的错误提示
+
+ 输入参数:
+ buffer 待返回的参数
+
+ 输出参数:
+ buffer 如果 :操作失败, 则buffer [0] 为 错误代码(参考2.2)
+ 如果 :操作成功, 则buffer [0] 为成功标志 ,即为0x80
+
+ 返回值:
+ 0x00,操作成功,
+ 0x01,操作失败
+ */
+
+ [DllImport("function.dll")]
+
+ public static extern int ControlBuzzer(int freq, int duration, [In] byte[] buffer);
+ /*
+ 函数功能: 控制读卡器的正确提示
+
+ 输入参数:
+ buffer 待返回的参数
+
+ 输出参数:
+ buffer 如果 :操作失败, 则buffer [0] 为 错误代码(参考2.2)
+ 如果 :操作成功, 则buffer [0] 为成功标志 ,即为0x80
+
+ 返回值:
+ 0x00,操作成功,
+ 0x01,操作失败
+ */
+
+ /*14443A-MF*/
+ [DllImport("function.dll")]
+ public static extern int MF_Read(byte mode, byte blk_add, byte num_blk, [In] byte[] snr, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Write(byte mode, byte blk_add, byte num_blk, [In] byte[] snr, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int MF_InitValue(byte mode, byte SectNum, [In] byte[] snr, [In] byte[] value);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Dec(byte mode, byte SectNum, [In] byte[] snr, [In] byte[] value);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Inc(byte mode, byte SectNum, [In] byte[] snr, [In] byte[] value);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Request([In] byte[] commHandle, int DeviceAdddress, byte inf_mode, [In] byte[] Buffer);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Select([In] byte[] commHandle, int DeviiceAddress, byte inf_mode, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Halt();
+
+ [DllImport("function.dll")]
+ public static extern int MF_Anticoll([In] byte[] commHandle, int DeviceAddress, [In] byte[] snr, [In] byte[] status);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Restore([In] byte[] commHandle, int DeviceAddress, byte mode, byte cardlength, [In] byte[] carddata);
+
+ [DllImport("function.dll")]
+ public static extern int MF_Getsnr(int mode, int halt, [In] byte[] snr, [In] byte[] value);
+
+
+ /*Ultralight*/
+ [DllImport("function.dll")]
+ public static extern int UL_Request(byte mode, [In] byte[] snr);
+
+ [DllImport("function.dll")]
+ public static extern int UL_HLRead(byte mode, byte blk_add, [In] byte[] snr, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int UL_HLWrite(byte mode, byte blk_add, [In] byte[] snr, [In] byte[] buffer);
+
+
+ /*ISO14443TypeB*/
+ [DllImport("function.dll")]
+ public static extern int TypeB_Request([In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int TYPEB_SFZSNR(byte mode, byte halt, [In] byte[] snr, [In] byte[] value);
+
+ [DllImport("function.dll")]
+ public static extern int TypeB_TransCOS([In] byte[] cmd, int cmdSize, [In] byte[] buffer);
+
+
+
+ /*ISO15693*/
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_Inventory([In] byte[] Cardnumber, [In] byte[] pBuffer);
+ /*
+ 函数功能:此命令通过防冲突用于得到读卡区域内所有卡片的序列号(能得到的卡片数量与模块天线的输出功率有关,一般能对2~6卡进行防冲突)
+
+ 输入参数:
+ Cardnumber 返回的卡的数量(一个字节)
+ pBuffer 返回的数据(包括FLAG和DSFID和8*n个字节的卡号)
+
+ 输出参数:
+ 如果:操作成功
+ Cardnumber 返回的卡的数量(一个字节)
+ pBuffer 返回的数据(包括FLAG和DSFID和8*n个字节的卡号)
+
+ 如果:操作失败,则*nrOfCard为错误代码
+
+ 返回值:
+ 0x00,操作成功,
+ 0x01,操作失败
+ */
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_Read(byte flags, byte blk_add, byte num_blk, [In] byte[] uid, [In] byte[] buffer);
+ /*
+ 函数功能:
+ 用来读取1个或多个扇区的值,如果要读每个块的安全位,
+ 将FLAGS中Option_flag置为1,即FLAG = 0X42,每个扇区将返回5个字节,包括1个表示安全状态字节和4个字节的块内容,这时候每次最多能读12个块。
+ 如果FLAG = 02,将只返回4字节的块内容,这时候每次最多能读63个块。
+
+ 输入参数:
+ flags 0x02 不带uid
+ 0x22 带uid
+ 0x42 不带uid但是要读安全位
+ blk_add, 要读的起始块号
+ num_blk, 块的数量
+ *uid UID信息
+ *buffer 返回值
+
+ 输出参数:
+ 操作成功,buffer[0] 返回的flag buffer[1..N] Data
+ 操作失败,buffer[0]为错误代码
+
+ 返回值:
+ 0x00,操作成功,
+ 0x01,操作失败
+ */
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_Write(byte flag, byte blk_add, byte num_blk, [In] byte[] uid, [In] byte[] data);
+ /*
+ 函数功能: 对一个块进行写操作(每次只能写一个块)
+
+ 输入参数:
+ flags 0x02 不带uid
+ 0x22 带uid
+ 0x42 不带uid但是要读安全位
+ blk_add, 要写的起始块号
+ num_blk, 写的块的数量
+ *uid UID信息
+ *data 返回值
+
+ 输出参数:
+ 如果:操作失败,则data[0]为错误代码
+
+ 返回值:
+ 0x00,操作成功,
+ 0x01,操作失败
+ */
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_GetSysInfo(byte flag, [In] byte[] uid, [In] byte[] Buffer);
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_Lock(byte flags, byte num_blk, [In] byte[] uid, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_Select(byte flags, [In] byte[] uid, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_WriteAFI(byte flags, byte afi, [In] byte[] uid, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_LockAFI(byte flags, [In] byte[] uid, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_WriteDSFID(byte flags, byte DSFID, [In] byte[] uid, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_LockDSFID(byte flags, [In] byte[] uid, [In] byte[] buffer);
+
+ [DllImport("function.dll")]
+ public static extern int ISO15693_GetMulSecurity(byte flag, byte blkAddr, byte blkNum, [In] byte[] uid, [In] byte[] pBuffer);
+
+ }
+}
diff --git a/BPASmartClient.Nfc/USB.dll b/BPASmartClient.Nfc/USB.dll
new file mode 100644
index 00000000..37cf8e2e
Binary files /dev/null and b/BPASmartClient.Nfc/USB.dll differ
diff --git a/BPASmartClient.Nfc/function.dll b/BPASmartClient.Nfc/function.dll
new file mode 100644
index 00000000..7d04969b
Binary files /dev/null and b/BPASmartClient.Nfc/function.dll differ
diff --git a/BPASmartClient.SerialPort/SerialPortClient.cs b/BPASmartClient.SerialPort/SerialPortClient.cs
index b966aab9..633c3372 100644
--- a/BPASmartClient.SerialPort/SerialPortClient.cs
+++ b/BPASmartClient.SerialPort/SerialPortClient.cs
@@ -154,7 +154,7 @@ namespace BPASmartClient.SerialPort
{
if (!IsHavePort)
{
- MessageLog.GetInstance.Show($"{portName}连接失败");
+ //MessageLog.GetInstance.Show("咖乐美咖啡机连接失败");
return;
}
if (comPort.IsOpen) comPort.Close();
@@ -164,7 +164,7 @@ namespace BPASmartClient.SerialPort
comPort.DataBits = (int)dataBits;
comPort.StopBits = stopBits;
comPort.Open();
- MessageLog.GetInstance.Show($"{portName}连接成功");
+ //MessageLog.GetInstance.Show("咖乐美咖啡机连接成功");
}
}
diff --git a/BPASmartClient/App.config b/BPASmartClient/App.config
index 013b8327..c29e4b30 100644
--- a/BPASmartClient/App.config
+++ b/BPASmartClient/App.config
@@ -6,17 +6,17 @@
-
-
-
+
-
+
diff --git a/BPASmartClient/Control/ShopDeviceConfigView.xaml b/BPASmartClient/Control/ShopDeviceConfigView.xaml
index 2ae084cc..04e18471 100644
--- a/BPASmartClient/Control/ShopDeviceConfigView.xaml
+++ b/BPASmartClient/Control/ShopDeviceConfigView.xaml
@@ -384,11 +384,11 @@
Grid.Column="3"
Width="170"
HorizontalAlignment="Left"
+ Command="{Binding NewShopCommand}"
Content="新建店铺"
FontSize="16"
Foreground="{StaticResource TextBlockForeground}"
IcoText=""
- Command="{Binding NewShopCommand}"
Style="{StaticResource IcoButtonStyle}" />
.Save();
MessageLog.GetInstance.LogSave();
+ ThreadManage.GetInstance().Dispose();
}
private void MenuInit()
{
+ NfcServer.GetInstance.Init();
#region 配方管理菜单
ObservableCollection RecipeManage = new ObservableCollection();
@@ -71,7 +77,6 @@ namespace BPASmartClient.DosingSystem
MainMenuIcon = "",
MainMenuName = "配方管理",
Alias = "Recipe Management",
- MainMenuPermission = new Permission[] { Permission.管理员 },
subMenumodels = RecipeManage,
});
#endregion
@@ -102,12 +107,19 @@ namespace BPASmartClient.DosingSystem
ToggleWindowPath = "Pages.View.AlarmView"
});
+ InfoLog.Add(new SubMenumodel()
+ {
+ SubMenuName = "调试日志",
+ SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员, Permission.技术员 },
+ AssemblyName = "BPASmartClient.CustomResource",
+ ToggleWindowPath = "Pages.View.DebugLogView"
+ });
+
MenuManage.GetInstance.menuModels.Add(new MenuModel()
{
MainMenuIcon = "",
MainMenuName = "消息日志",
Alias = "Message Log",
- MainMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
subMenumodels = InfoLog,
});
#endregion
@@ -130,15 +142,11 @@ namespace BPASmartClient.DosingSystem
ToggleWindowPath = "View.HardwareStatusView"
});
-
-
-
MenuManage.GetInstance.menuModels.Add(new MenuModel()
{
MainMenuIcon = "",
MainMenuName = "设备监控",
Alias = "Device Monitor",
- MainMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
subMenumodels = DeviceMonitor,
});
#endregion
@@ -161,13 +169,19 @@ namespace BPASmartClient.DosingSystem
ToggleWindowPath = "Pages.View.PasswordChangeView"
});
+ UserManager.Add(new SubMenumodel()
+ {
+ SubMenuName = "NFC登录设置",
+ SubMenuPermission = new Permission[] { Permission.管理员 },
+ AssemblyName = "BPASmartClient.CustomResource",
+ ToggleWindowPath = "Pages.View.NfcSetView"
+ });
MenuManage.GetInstance.menuModels.Add(new MenuModel()
{
MainMenuIcon = "",
MainMenuName = "用户管理",
Alias = "User Management",
- MainMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
subMenumodels = UserManager,
});
#endregion
diff --git a/DosingSystem/BPASmartClient.DosingSystem.csproj b/DosingSystem/BPASmartClient.DosingSystem.csproj
index f2efc607..d6aaf8b9 100644
--- a/DosingSystem/BPASmartClient.DosingSystem.csproj
+++ b/DosingSystem/BPASmartClient.DosingSystem.csproj
@@ -7,7 +7,7 @@
true
hbl.ico
- AnyCPU
+ x86
True
@@ -24,6 +24,7 @@
+
diff --git a/DosingSystem/View/DeviceListView.xaml b/DosingSystem/View/DeviceListView.xaml
index d17dbae8..46d4ef9c 100644
--- a/DosingSystem/View/DeviceListView.xaml
+++ b/DosingSystem/View/DeviceListView.xaml
@@ -51,7 +51,7 @@
Height="500"
CurrentValue="50" />-->
-
+
diff --git a/DosingSystem/View/RecipeControlView.xaml b/DosingSystem/View/RecipeControlView.xaml
index 24b50e5d..9fe24d73 100644
--- a/DosingSystem/View/RecipeControlView.xaml
+++ b/DosingSystem/View/RecipeControlView.xaml
@@ -46,7 +46,7 @@
-
+
+ Height="30"
+ Background="#00BEFA">
+
@@ -46,7 +47,7 @@
-
+
@@ -76,20 +77,18 @@
+ ItemsSource="{Binding DisplayMenus}"
+ ScrollViewer.CanContentScroll="False"
+ ScrollViewer.HorizontalScrollBarVisibility="Hidden"
+ ScrollViewer.VerticalScrollBarVisibility="Disabled">
-
+
@@ -186,8 +185,7 @@ ScrollViewer.HorizontalScrollBarVisibility="Hidden"
Content="退出"
Cursor="Hand"
Style="{DynamicResource CommonBtn_返回}"
- ToolTip="退出程序"
- />
+ ToolTip="退出程序" />
@@ -229,8 +227,7 @@ ScrollViewer.HorizontalScrollBarVisibility="Hidden"
+ IsChecked="{Binding Status}" />
-
+ Content="{Binding MyWindow}" />
-
+
diff --git a/SmartClient.sln b/SmartClient.sln
index 46422491..5cd109b1 100644
--- a/SmartClient.sln
+++ b/SmartClient.sln
@@ -118,6 +118,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.MorkTSingle"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.MilkWithTea", "BPASmartClient.MilkWithTea\BPASmartClient.MilkWithTea.csproj", "{BFA4E222-BBCC-4AC7-9EA4-4549AEF3174B}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElectricCurrentTestDemo", "..\..\TEST\ElectricCurrentTestDemo\ElectricCurrentTestDemo.csproj", "{75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BPASmartClient.KHKJ", "BPASmartClient.KHKJ\BPASmartClient.KHKJ.csproj", "{C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.Nfc", "BPASmartClient.Nfc\BPASmartClient.Nfc.csproj", "{42D35B7C-764C-4692-AA85-9B343A0F5B7F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BPASmartClient.Argox", "BPASmartClient.Argox\BPASmartClient.Argox.csproj", "{B8D499BA-A18A-4FD6-B036-44F02B4D164B}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1112,6 +1120,86 @@ Global
{BFA4E222-BBCC-4AC7-9EA4-4549AEF3174B}.Release|x64.Build.0 = Release|Any CPU
{BFA4E222-BBCC-4AC7-9EA4-4549AEF3174B}.Release|x86.ActiveCfg = Release|Any CPU
{BFA4E222-BBCC-4AC7-9EA4-4549AEF3174B}.Release|x86.Build.0 = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|ARM.Build.0 = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|x64.Build.0 = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Debug|x86.Build.0 = Debug|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|ARM.ActiveCfg = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|ARM.Build.0 = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|ARM64.Build.0 = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|x64.ActiveCfg = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|x64.Build.0 = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|x86.ActiveCfg = Release|Any CPU
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44}.Release|x86.Build.0 = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|ARM.Build.0 = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|x64.Build.0 = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Debug|x86.Build.0 = Debug|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|ARM.ActiveCfg = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|ARM.Build.0 = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|ARM64.Build.0 = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|x64.ActiveCfg = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|x64.Build.0 = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|x86.ActiveCfg = Release|Any CPU
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B}.Release|x86.Build.0 = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|ARM.Build.0 = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|x64.Build.0 = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Debug|x86.Build.0 = Debug|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|ARM.ActiveCfg = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|ARM.Build.0 = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|ARM64.Build.0 = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|x64.ActiveCfg = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|x64.Build.0 = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|x86.ActiveCfg = Release|Any CPU
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F}.Release|x86.Build.0 = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|ARM.ActiveCfg = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|ARM.Build.0 = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|x64.Build.0 = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Debug|x86.Build.0 = Debug|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|ARM.ActiveCfg = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|ARM.Build.0 = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|ARM64.Build.0 = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|x64.ActiveCfg = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|x64.Build.0 = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|x86.ActiveCfg = Release|Any CPU
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1166,6 +1254,10 @@ Global
{099E047C-F40E-47A3-A5BA-81FC1500D5E8} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625}
{2366AC9B-B662-4550-9486-AF848B4D2961} = {9FB27073-61A0-4FE3-94DB-5FDDE062332F}
{BFA4E222-BBCC-4AC7-9EA4-4549AEF3174B} = {8712125E-14CD-4E1B-A1CE-4BDE03805942}
+ {75B55300-ABC3-4CA1-B9B6-DF954E6C7B44} = {8712125E-14CD-4E1B-A1CE-4BDE03805942}
+ {C0060FB3-7AEA-4D14-ADCE-DB78D3665D5B} = {666CB1A9-562E-453A-A2C7-FD9D77CFDFDD}
+ {42D35B7C-764C-4692-AA85-9B343A0F5B7F} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625}
+ {B8D499BA-A18A-4FD6-B036-44F02B4D164B} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9AEC9B81-0222-4DE9-B642-D915C29222AC}