applelon 2 年之前
父節點
當前提交
c043fbe464
共有 33 個文件被更改,包括 683 次插入1063 次删除
  1. +0
    -1
      BPASmartClient.DRCoffee/BPASmartClient.DRCoffee.csproj
  2. +83
    -82
      BPASmartClient.DRCoffee/CoffeeMachine.cs
  3. +0
    -76
      BPASmartClient.DRCoffee/MorkCStatus.cs
  4. +2
    -1
      BPASmartClient.DRCoffee/Protocal/DrCoffeePackage.cs
  5. +2
    -1
      BPASmartClient.GSIceCream/BPASmartClient.GSIceCream.csproj
  6. +0
    -134
      BPASmartClient.GSIceCream/CommandHandler.cs
  7. +214
    -34
      BPASmartClient.GSIceCream/IceCreamMachine.cs
  8. +0
    -130
      BPASmartClient.GSIceCream/MorkIStatus.cs
  9. +2
    -1
      BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_DW.cs
  10. +2
    -1
      BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_UP.cs
  11. +2
    -1
      BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_DW.cs
  12. +2
    -1
      BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_UP.cs
  13. +2
    -1
      BPASmartClient.KLMCoffee/BPASmartClient.KLMCoffee.csproj
  14. +36
    -0
      BPASmartClient.KLMCoffee/CoffeeMachine.cs
  15. +0
    -44
      BPASmartClient.KLMCoffee/CommandEvent.cs
  16. +0
    -111
      BPASmartClient.KLMCoffee/CommandHandler.cs
  17. +6
    -0
      BPASmartClient.KLMCoffee/Protocal/SystemStatusModel.cs
  18. +1
    -1
      BPASmartClient.Model/BPASmartClient.Model.csproj
  19. +1
    -1
      BPASmartClient.Model/冰淇淋/Enum/MORKI_MODE.cs
  20. +7
    -3
      BPASmartClient.Model/冰淇淋/GSIceCreamEvent.cs
  21. +1
    -1
      BPASmartClient.Model/单片机/Enum/IC_CUP.cs
  22. +1
    -1
      BPASmartClient.Model/单片机/Enum/IC_SE.cs
  23. +10
    -5
      BPASmartClient.Model/单片机/SCChipEvent.cs
  24. +4
    -2
      BPASmartClient.Model/咖啡机/DRCoffeeEvent.cs
  25. +2
    -2
      BPASmartClient.Model/咖啡机/Enum/DrCoffeeCommCmd.cs
  26. +2
    -2
      BPASmartClient.Model/咖啡机/Enum/DrCoffeeDrinksCode.cs
  27. +1
    -1
      BPASmartClient.SCChip/BPASmartClient.SCChip.csproj
  28. +0
    -128
      BPASmartClient.SCChip/ChipStatus.cs
  29. +0
    -42
      BPASmartClient.SCChip/CommandEvent.cs
  30. +0
    -225
      BPASmartClient.SCChip/CommandHandler.cs
  31. +294
    -29
      BPASmartClient.SCChip/ICChipMachine.cs
  32. +1
    -1
      BPASmartClient/MainWindow.xaml
  33. +5
    -0
      BPASmartClient/MainWindow.xaml.cs

+ 0
- 1
BPASmartClient.DRCoffee/BPASmartClient.DRCoffee.csproj 查看文件

@@ -5,7 +5,6 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\BPASmartClient.MessageCommunication\BPASmartClient.MessageCommunication.csproj" />
<ProjectReference Include="..\BPASmartClient.Model\BPASmartClient.Model.csproj" />
<ProjectReference Include="..\BPASmartClient.Peripheral\BPASmartClient.Peripheral.csproj" />
<ProjectReference Include="..\BPASmartClient.SerialPort\BPASmartClient.SerialPort.csproj" />


+ 83
- 82
BPASmartClient.DRCoffee/CoffeeMachine.cs 查看文件

@@ -3,6 +3,7 @@ using BPASmartClient.EventBus;
using BPASmartClient.Helper;
using BPASmartClient.Message;
using BPASmartClient.Model;
using BPASmartClient.Model.咖啡机.Enum;
using BPASmartClient.Peripheral;
using BPASmartClient.SerialPort;
using System;
@@ -15,78 +16,33 @@ namespace BPASmartClient.DRCoffee
/// <summary>
/// 咖啡机
/// </summary>
public class CoffeeMachine: BasePeripheral
public class CoffeeMachine :BasePeripheral
{
//通讯代理
SerialPortClient commProxy = null;
//数据仓库
private DataStorage<byte> dataStorage = new DataStorage<byte>();
//主线程运行标识
private bool running = false;
//是否下发指令,主线程等待
private bool free = true;

private DrCoffeeStatus drCoffeeStatus;
/// <summary>
/// 咖啡机状态
/// </summary>
public DrCoffeeStatus CurrentCoffeeStatus
{
get { return drCoffeeStatus; }
set
{
if (drCoffeeStatus != value)
{
drCoffeeStatus = value;
CoffeeStatusChanged?.Invoke(value);
}
}
}
private DrCoffeeAppStatus coffeeAppStatus;
/// <summary>
/// 应用状态
/// </summary>
public DrCoffeeAppStatus CurrentCoffeeAppStatus
{
get { return coffeeAppStatus; }
set
{
if (coffeeAppStatus != value)
{
coffeeAppStatus = value;
CoffeeAppStatusChanged?.Invoke(value);
}
}
}

public Action<string> SendCallback;
public Action<string> ReciveCallback;

/// <summary>
/// 咖啡机状态改变回调
/// </summary>
public Action<DrCoffeeStatus> CoffeeStatusChanged;
/// <summary>
/// 应用状态改变回调
/// </summary>
public Action<DrCoffeeAppStatus> CoffeeAppStatusChanged;
/// <summary>
/// Dr咖啡机基础协议
/// </summary>
private bool free = false;
//状态询问指令
private byte[] cmdAsk;
//Dr咖啡机基础协议
private DrCoffeePackage drinksOrder = new DrCoffeePackage();

/// <summary>
/// 串口COM口
/// </summary>
//串口COM口
public string PortName { get; set; }
//串口波特率
public string BaudRate { get; set; }
//心跳时间
private DateTime lastRefreshTime = DateTime.MinValue;
/// <summary>
/// 串口波特率
/// 是否在线
/// </summary>
public string BaudRate { get; set; }

public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } }
public CoffeeMachine()
{
DrCoffeePackage package = new DrCoffeePackage();
package.CommCmd = DrCoffeeCommCmd.饮品制作指令;
cmdAsk = DrCoffee.Packe(package);
}

/// <summary>
@@ -94,10 +50,17 @@ namespace BPASmartClient.DRCoffee
/// </summary>
public override void Start()
{
commProxy.Start();
running = true;
MainLoop();
try
{
commProxy.Start();
IsConnected = true;
free = false;
MainLoop();
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeMachine 类,描述:[{ex.Message}]");
}
}

/// <summary>
@@ -105,8 +68,16 @@ namespace BPASmartClient.DRCoffee
/// </summary>
public override void Stop()
{
commProxy.Stop();
running = false;
try
{
commProxy.Stop();
IsConnected = false;
free = true;
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeMachine 类,描述:[{ex.Message}]");
}
}

/// <summary>
@@ -114,15 +85,14 @@ namespace BPASmartClient.DRCoffee
/// </summary>
private void MainLoop()
{
//ThreadManage.GetInstance.StartLong(new Action(() =>
//{
// if (free)
// {
// commProxy.SendData(commandHandler.GetStatusAsk());
// SendCallback?.Invoke(BitConverter.ToString(commandHandler.GetStatusAsk()));
// }
// Thread.Sleep(200);
//}),"咖啡机询问线程");
ThreadManage.GetInstance.StartLong(new Action(() =>
{
if (!free)
{
commProxy.SendData(cmdAsk);
}
Thread.Sleep(200);
}),"咖啡机询问线程");

ThreadManage.GetInstance.StartLong(new Action(() =>
{
@@ -137,9 +107,8 @@ namespace BPASmartClient.DRCoffee
{
temp.Add(item);
var package = DrCoffee.UnPack(temp.ToArray());
ReciveCallback?.Invoke(BitConverter.ToString(temp.ToArray()));
temp.Clear();
MorkCStatus.GetInstance().ProcessPackage(package);
ProcessPackage(package);
}
else
{
@@ -159,14 +128,45 @@ namespace BPASmartClient.DRCoffee
}
}
Thread.Sleep(5);
}), "咖啡机解析线程");
}),"咖啡机解析线程");
}

protected override void InitStatus()
/// <summary>
/// 咖啡机状态解析
/// </summary>
/// <param name="package"></param>
public void ProcessPackage(DrCoffeePackage package)
{
if (((DrCoffeeStatus)status["CoffeeStatus"]) == DrCoffeeStatus.Running && package.Status != DrCoffeeStatus.Running)
{
status["CoffeeStatus"] = package.Status;
lastRefreshTime = DateTime.Now;
new DRCoffee_CoffeEndCookEvent() { Id = DeviceId }.Publish();
}
else status["CoffeeStatus"] = package.Status;
status["AppStatus"] = package.ApplicationStatus;
status["Warning"] = package.Warning;
status["Fault"] = package.Fault;

if ((DrCoffeeStatus)status["CoffeeStatus"] == DrCoffeeStatus.Warning
|| (DrCoffeeStatus)status["CoffeeStatus"] == DrCoffeeStatus.Fault
|| (DrCoffeeWarning)status["Warning"] != DrCoffeeWarning.无警告
|| (DrCoffeeFault)status["Fault"] != DrCoffeeFault.无故障
)
{
IsWork = false;
}
else
IsWork = true;
}

protected override void InitStatus()
{
status["CoffeeStatus"] = DrCoffeeStatus.Wait;
status["AppStatus"] = DrCoffeeAppStatus.应用无状态;
status["Warning"] = DrCoffeeWarning.无警告;
status["Fault"] = DrCoffeeFault.无故障;
}

public override void Init()
{
@@ -181,7 +181,7 @@ namespace BPASmartClient.DRCoffee
free = true;
Thread.Sleep(200);
drinksOrder.CommCmd = DrCoffeeCommCmd.饮品制作指令;
//drinksOrder.DrinksCode = ((DRCoffee_MakeCoffeeEvent)@event).CommCmd;
drinksOrder.DrinksCode = ((DRCoffee_MakeCoffeeEvent)@event).DrinkCode;
commProxy.SendData(DrCoffee.Packe(drinksOrder));
Thread.Sleep(200);
free = false;
@@ -218,7 +218,7 @@ namespace BPASmartClient.DRCoffee
{
free = true;
Thread.Sleep(200);
//drinksOrder.CommCmd = (DrCoffeeCommCmd)int.Parse(e.obj_MessageObj.ToString());
drinksOrder.CommCmd = ((DRCoffee_CoffeeCommCmdEvent)@event).CommCmd;
commProxy.SendData(DrCoffee.Packe(drinksOrder));
Thread.Sleep(200);
free = false;
@@ -229,5 +229,6 @@ namespace BPASmartClient.DRCoffee
}
});
}

}
}

+ 0
- 76
BPASmartClient.DRCoffee/MorkCStatus.cs 查看文件

@@ -1,76 +0,0 @@
using BPASmartClient.DRCoffee;
using BPASmartClient.MessageCommunication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.DRCoffee
{
public class MorkCStatus
{
private volatile static MorkCStatus _Instance;
public static MorkCStatus GetInstance() => _Instance ?? (_Instance = new MorkCStatus());
private MorkCStatus() { }

private DateTime lastRefreshTime = DateTime.MinValue;
/// <summary>
/// 是否在线
/// </summary>
public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } }
/// <summary>
/// 咖啡机状态
/// </summary>
public DrCoffeeStatus CoffeeStatus { get; set; }
/// <summary>
/// 应用状态
/// </summary>
public DrCoffeeAppStatus AppStatus { get; set; }
/// <summary>
/// 警告信息
/// </summary>
public DrCoffeeWarning Warning { get; set; }
/// <summary>
/// 故障信息
/// </summary>
public DrCoffeeFault Fault { get; set; }

public bool CanDo
{
get

{
if (!OnLine)
return false;
if (Warning != DrCoffeeWarning.无警告)
return false;
if (Fault != DrCoffeeFault.无故障)
return false;
return true;
}
}

/// <summary>
/// 咖啡机状态解析
/// </summary>
/// <param name="package"></param>
public void ProcessPackage(DrCoffeePackage package)
{
if (CoffeeStatus == DrCoffeeStatus.Running && package.Status != DrCoffeeStatus.Running)
{
CoffeeStatus = package.Status;
Class_InnerMessageBus.GetInstance().PostMessage(this,Class_MessageName.DRCoffee_CoffeEndCook,"");
}
else {
CoffeeStatus = package.Status;
}

AppStatus = package.ApplicationStatus;
Warning = package.Warning;
Fault = package.Fault;

lastRefreshTime = DateTime.Now;
}
}
}

+ 2
- 1
BPASmartClient.DRCoffee/Protocal/DrCoffeePackage.cs 查看文件

@@ -1,4 +1,5 @@
using System;
using BPASmartClient.Model.咖啡机.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;


+ 2
- 1
BPASmartClient.GSIceCream/BPASmartClient.GSIceCream.csproj 查看文件

@@ -5,7 +5,8 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\BPASmartClient.MessageCommunication\BPASmartClient.MessageCommunication.csproj" />
<ProjectReference Include="..\BPASmartClient.Model\BPASmartClient.Model.csproj" />
<ProjectReference Include="..\BPASmartClient.Peripheral\BPASmartClient.Peripheral.csproj" />
<ProjectReference Include="..\BPASmartClient.SerialPort\BPASmartClient.SerialPort.csproj" />
</ItemGroup>



+ 0
- 134
BPASmartClient.GSIceCream/CommandHandler.cs 查看文件

@@ -1,134 +0,0 @@
using BPASmartClient.Message;
using BPASmartClient.MessageCommunication;
using BPASmartClient.MessageCommunication.MsgControl;
using BPASmartClient.SerialPort;
using System;
using System.Threading;

namespace BPASmartClient.GSIceCream
{
/// <summary>
/// 指令封装
/// </summary>
internal class CommandHandler
{
byte[] cmdHeartDW;

private SerialPortClient commProxy;
public Action<bool> PauseAsk { get; set; }

/// <summary>
/// 初始化
/// </summary>
internal void Init(SerialPortClient commProxy)
{
this.commProxy = commProxy;
ICMSG_Heart_DW heartDW = new ICMSG_Heart_DW();
cmdHeartDW = IcPack.StructureToByte(heartDW);
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.GSIceCream_ModeSet,"ModeSetHandler");
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.GSIceCream_Discharge,"DischargeHandler");
}

/// <summary>
/// 发送心跳
/// </summary>
internal byte[] GetHeartDW()
{
return cmdHeartDW;
}
/// <summary>
/// 模式设置
/// </summary>
public void ModeSetHandler(object sender,InnerMessageEventArgs e)
{
try
{
if (e.obj_MessageObj is MORKI_MODE)
{
PauseAsk?.Invoke(true);
Thread.Sleep(200);
var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build((MORKI_MODE)(e.obj_MessageObj)));
commProxy.SendData(data);
Thread.Sleep(200);
PauseAsk?.Invoke(false);
MessageLog.GetInstance.Show(string.Format("设置模式[{0}]",Enum.GetName(typeof(MORKI_MODE),(MORKI_MODE)e.obj_MessageObj)));
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,ModeSetHandler 类,描述:[{ex.Message}]");
}
}

/// <summary>
/// 打料
/// </summary>
public void DischargeHandler(object sender,InnerMessageEventArgs e)
{
try
{
if (e.obj_MessageObj is MORKI_MODE)
{
if (MorkIStatus.GetInstance().Fault != MORKI_FAULT.未发生故障)
{
MessageLog.GetInstance.Show(string.Format("当前存在故障[{0}%],不允许制作",MorkIStatus.GetInstance().Fault));
//callBack?.Invoke(false);
return;
}
if (MorkIStatus.GetInstance().CXB <= 86)
{
MessageLog.GetInstance.Show(string.Format("当前成型比[{0}%],低于86%,不允许制作",MorkIStatus.GetInstance().CXB));
//callBack?.Invoke(false);
return;
}

bool modeRight = MorkIStatus.GetInstance().CurrentMode == MORKI_MODE.制冷模式;

if (!modeRight)
{
PauseAsk?.Invoke(true);
Thread.Sleep(200);

var temp = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.制冷模式));
commProxy.SendData(temp);

Thread.Sleep(200);
PauseAsk?.Invoke(false);
MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.制冷模式));

DateTime freeTime = DateTime.Now.AddSeconds(5);
while (DateTime.Now < freeTime)
{
Thread.Sleep(10);
modeRight = MorkIStatus.GetInstance().CurrentMode == MORKI_MODE.制冷模式;
if (modeRight)
break;
}
}

if (modeRight)
{
PauseAsk?.Invoke(true);
Thread.Sleep(200);
var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.打料));
commProxy.SendData(data);
Thread.Sleep(200);
PauseAsk?.Invoke(false);
Class_InnerMessageBus.GetInstance().PostMessage(this,Class_MessageName.GSIceCream_EndCook,"");
MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.打料));
//callBack?.Invoke(true);
}
else
{
MessageLog.GetInstance.Show(string.Format("出料操作->模式切换失败,当前模式[{0}],不允许出料",MorkIStatus.GetInstance().CurrentMode));
//callBack?.Invoke(false);
}
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,ModeSetHandler 类,描述:[{ex.Message}]");
}
}
}
}

+ 214
- 34
BPASmartClient.GSIceCream/IceCreamMachine.cs 查看文件

@@ -1,47 +1,77 @@
using BPASmartClient.Helper;
using BPASmartClient.EventBus;
using BPASmartClient.Helper;
using BPASmartClient.Message;
using BPASmartClient.Model;
using BPASmartClient.Model.冰淇淋.Enum;
using BPASmartClient.Peripheral;
using BPASmartClient.SerialPort;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using static BPASmartClient.EventBus.EventBus;
using static BPASmartClient.GSIceCream.MessageDefine;

namespace BPASmartClient.GSIceCream
{
public class IceCreamMachine
{
//指令组装
private CommandHandler commandHandler = new CommandHandler();
public class IceCreamMachine :BasePeripheral
{
//通讯代理
SerialPortClient commProxy = null;
//是否下发指令,主线程等待
private bool free = false;
//心跳指令
private byte[] cmdHeartDW;
//数据仓库
private DataStorage<byte> dataStorage = new DataStorage<byte>();
//主线程运行标识
private bool running = false;
//是否下发指令,主线程等待
private bool free = true;
public Action<string> SendCallback;
public Action<string> ReciveCallback;
//串口COM口
public string PortName { get; set; }
//串口波特率
public string BaudRate { get; set; }
//心跳时间
private DateTime lastRefreshTime = DateTime.MinValue;
//是否在线
public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } }

public IceCreamMachine(string portName, BaudRates baud)
public IceCreamMachine()
{
commProxy = new SerialPortClient(portName, baud);
commProxy.SetDataStorage(dataStorage);
commandHandler.Init(commProxy);
commandHandler.PauseAsk = delegate (bool pause)
{
free = !pause;
};
ICMSG_Heart_DW heartDW = new ICMSG_Heart_DW();
cmdHeartDW = IcPack.StructureToByte(heartDW);
}

public void Start()
/// <summary>
/// 主线程开始运行
/// </summary>
public override void Start()
{
commProxy.Start();
running = true;
MainLoop();
try
{
commProxy.Start();
IsConnected = true;
free = false;
MainLoop();
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]");
}
}

public void Stop()
/// <summary>
/// 停止运行
/// </summary>
public override void Stop()
{
try
{
commProxy.Stop();
IsConnected = false;
free = true;
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]");
}
}

private MSG_RESOLVE_STEP currentStep;
@@ -49,10 +79,9 @@ namespace BPASmartClient.GSIceCream
{
ThreadManage.GetInstance.StartLong(new Action(() =>
{
if (free)
if (!free)
{
commProxy.SendData(commandHandler.GetHeartDW());
SendCallback?.Invoke(BitConverter.ToString(commandHandler.GetHeartDW()));
commProxy.SendData(cmdHeartDW);
}
Thread.Sleep(500);
}), "冰淇淋询问线程");
@@ -60,16 +89,12 @@ namespace BPASmartClient.GSIceCream
ThreadManage.GetInstance.StartLong(new Action(() =>
{
ResolveMsg();
//Thread.Sleep(2000);
}), "冰淇淋解析线程");
}
int contentLength = 0;
int currentContentOffset = 0;
private void ResolveMsg()
{

//while (running)
//{
List<byte> temp = new List<byte>();
//一系列解包
while (dataStorage.GetSize() > 0)
@@ -142,13 +167,168 @@ namespace BPASmartClient.GSIceCream
}
temp.Add(dataStorage.GetData());
temp.Add(dataStorage.GetData());
ReciveCallback?.Invoke(BitConverter.ToString(temp.ToArray()));
MorkIStatus.GetInstance().ProcessMsg(temp.ToArray());
ProcessMsg(temp.ToArray());
currentStep = MSG_RESOLVE_STEP.NONE;
continue;
}
Thread.Sleep(5);
//}
}

private void ProcessHeart(ICMSG_Heart_UP heartUpMsg)
{
status["CurrentMode"] = heartUpMsg.MS;
status["YLWD"] = BitConverter.ToInt16(new byte[] { heartUpMsg.YLWD_L,heartUpMsg.YLWD_H },0);
status["HQWD"] = BitConverter.ToInt16(new byte[] { heartUpMsg.HQWD_L,heartUpMsg.HQWD_H },0);
status["HJWD"] = BitConverter.ToInt16(new byte[] { heartUpMsg.HJWD_L,heartUpMsg.HJWD_H },0);
status["DL"] = BitConverter.ToInt16(new byte[] { heartUpMsg.DL_L,heartUpMsg.DL_H },0);
status["Fault"] = (MORKI_FAULT)BitConverter.ToInt16(new byte[] { heartUpMsg.GZ_L,heartUpMsg.GZ_H },0);
status["CXB"] = heartUpMsg.CXB;
status["DLCompleted"] = (heartUpMsg.DLTJ >> 4 & 1) == 1;

if (RTrig.GetInstance("打料完成检测").Start((bool)status["DLCompleted"]))
{
MessageLog.GetInstance.Show("打料完成");
}

if (RTrig.GetInstance("打料中检测").Start(!(bool)status["DLCompleted"]))
{
MessageLog.GetInstance.Show("打料中");
}
}

private void ProcessModeUp(ICMSG_MODE_UP modeUpMsg)
{
MessageLog.GetInstance.Show(string.Format("模式返回为:{0}",modeUpMsg.Mode));
}

public void ProcessMsg(byte[] data)
{
lastRefreshTime = DateTime.Now;
try
{
if (data.Length < 5)
return;
switch (data[2])
{
case (byte)IC_CMD.HEART:
var msg = IcPack.ByteToStructure<ICMSG_Heart_UP>(data.ToArray());
ProcessHeart(msg);
break;
case (byte)IC_CMD.MODE:
var modeUp = IcPack.ByteToStructure<ICMSG_MODE_UP>(data.ToArray());
ProcessModeUp(modeUp);
break;
}
}
catch (Exception ex)
{

}
}

protected override void InitStatus()
{
status["YLWD"] = (short)0;
status["HQWD"] = (short)0;
status["HJWD"] = (short)0;
status["DL"] = (short)0;
status["DY"] = (short)0;
status["CurrentMode"] = MORKI_MODE.待机模式;
status["Fault"] = MORKI_FAULT.未发生故障;
status["CXB"] = (byte)0;
status["CXB_Threshold"] = (byte)0;
status["DLCompleted"] = true;
}

public override void Init()
{
commProxy = new SerialPortClient(PortName,(BaudRates)Enum.Parse(typeof(BaudRates),BaudRate));
commProxy.SetDataStorage(dataStorage);


//广深冰淇淋机模式设置
EventBus.EventBus.GetInstance().Subscribe<GSIceCream_ModeSetEvent>(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack)
{
try
{
free = true;
Thread.Sleep(200);
var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build(((GSIceCream_ModeSetEvent)@event).Mode));
commProxy.SendData(data);
Thread.Sleep(200);
free = false;
MessageLog.GetInstance.Show(string.Format("设置模式[{0}]",Enum.GetName(typeof(MORKI_MODE),((GSIceCream_ModeSetEvent)@event).Mode)));
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]");
}
});

//广深冰淇淋机打料
EventBus.EventBus.GetInstance().Subscribe<GSIceCream_DischargeEvent>(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack)
{
try
{
if ((MORKI_FAULT)status["Fault"] != MORKI_FAULT.未发生故障)
{
MessageLog.GetInstance.Show(string.Format("当前存在故障[{0}%],不允许制作",(MORKI_FAULT)status["Fault"]));
new GSIceCream_EndCookEvent() { Id = DeviceId,Status = false }.Publish();
return;
}
if ((byte)status["CXB"] <= 86)
{
MessageLog.GetInstance.Show(string.Format("当前成型比[{0}%],低于86%,不允许制作",(byte)status["CXB"]));
new GSIceCream_EndCookEvent() { Id = DeviceId,Status = false }.Publish();
return;
}

bool modeRight = (MORKI_MODE)status["CurrentMode"] == MORKI_MODE.制冷模式;

if (!modeRight)
{
free = true;
Thread.Sleep(200);

var temp = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.制冷模式));
commProxy.SendData(temp);

Thread.Sleep(200);
free = false;
MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.制冷模式));

DateTime freeTime = DateTime.Now.AddSeconds(5);
while (DateTime.Now < freeTime)
{
Thread.Sleep(10);
modeRight = (MORKI_MODE)status["CurrentMode"] == MORKI_MODE.制冷模式;
if (modeRight)
break;
}
}

if (modeRight)
{
free = true;
Thread.Sleep(200);
var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.打料));
commProxy.SendData(data);
Thread.Sleep(200);
free = false;
new GSIceCream_EndCookEvent() { Id = DeviceId,Status =true}.Publish();
MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.打料));
}
else
{
MessageLog.GetInstance.Show(string.Format("出料操作->模式切换失败,当前模式[{0}],不允许出料",(MORKI_MODE)status["CurrentMode"]));
new GSIceCream_EndCookEvent() { Id = DeviceId,Status = false }.Publish();
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]");
}
});
}
}



+ 0
- 130
BPASmartClient.GSIceCream/MorkIStatus.cs 查看文件

@@ -1,130 +0,0 @@
using BPASmartClient.Helper;
using BPASmartClient.Message;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static BPASmartClient.GSIceCream.MessageDefine;

namespace BPASmartClient.GSIceCream
{
public class MorkIStatus
{
private volatile static MorkIStatus _Instance;
public static MorkIStatus GetInstance() => _Instance ?? (_Instance = new MorkIStatus());
private MorkIStatus() { }
private DateTime lastRefreshTime = DateTime.MinValue;
/// <summary>
/// 是否在线
/// </summary>
public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } }
/// <summary>
/// 预冷温度
/// </summary>
public short YLWD { get; set; }
/// <summary>
/// 回气温度
/// </summary>
public short HQWD { get; set; }
/// <summary>
/// 环境温度
/// </summary>
public short HJWD { get; set; }
/// <summary>
/// 电流
/// </summary>
public short DL { get; set; }
/// <summary>
/// 电压
/// </summary>
public short DY { get; set; }
/// <summary>
/// 当前模式
/// </summary>
public MORKI_MODE CurrentMode { get; set; }
/// <summary>
/// 故障
/// </summary>
public MORKI_FAULT Fault { get; set; }
/// <summary>
/// 成型比
/// </summary>
public byte CXB { get; set; }
/// <summary>
/// 成型比(门限)
/// </summary>
public byte CXB_Threshold { get; set; }
/// <summary>
/// 打料完成(完成为true,正在打料为false)
/// </summary>
public bool DLCompleted { get; set; }


public bool CanDo
{
get
{
if (!OnLine)
return false;
if (Fault != MORKI_FAULT.未发生故障)
return false;
if (CXB < CXB_Threshold)
return false;
return true;
}
}

private void ProcessHeart(ICMSG_Heart_UP heartUpMsg)
{
CurrentMode = heartUpMsg.MS;
YLWD = BitConverter.ToInt16(new byte[] { heartUpMsg.YLWD_L, heartUpMsg.YLWD_H }, 0);
HQWD = BitConverter.ToInt16(new byte[] { heartUpMsg.HQWD_L, heartUpMsg.HQWD_H }, 0);
HJWD = BitConverter.ToInt16(new byte[] { heartUpMsg.HJWD_L, heartUpMsg.HJWD_H }, 0);
DL = BitConverter.ToInt16(new byte[] { heartUpMsg.DL_L, heartUpMsg.DL_H }, 0);
Fault = (MORKI_FAULT)BitConverter.ToInt16(new byte[] { heartUpMsg.GZ_L, heartUpMsg.GZ_H }, 0);
CXB = heartUpMsg.CXB;
DLCompleted = (heartUpMsg.DLTJ >> 4 & 1) == 1;

if (RTrig.GetInstance("打料完成检测").Start(DLCompleted))
{
MessageLog.GetInstance.Show("打料完成");
}

if(RTrig.GetInstance("打料中检测").Start(!DLCompleted))
{
MessageLog.GetInstance.Show("打料中");
}
}

private void ProcessModeUp(ICMSG_MODE_UP modeUpMsg)
{
MessageLog.GetInstance.Show(string.Format("模式返回为:{0}", modeUpMsg.Mode));
}

public void ProcessMsg(byte[] data)
{
lastRefreshTime = DateTime.Now;
try
{
if (data.Length < 5)
return;
switch (data[2])
{
case (byte)IC_CMD.HEART:
var msg = IcPack.ByteToStructure<ICMSG_Heart_UP>(data.ToArray());
ProcessHeart(msg);
break;
case (byte)IC_CMD.MODE:
var modeUp = IcPack.ByteToStructure<ICMSG_MODE_UP>(data.ToArray());
ProcessModeUp(modeUp);
break;
}
}
catch (Exception ex)
{

}
}
}
}

+ 2
- 1
BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_DW.cs 查看文件

@@ -1,4 +1,5 @@
using System;
using BPASmartClient.Model.冰淇淋.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;


+ 2
- 1
BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_UP.cs 查看文件

@@ -1,4 +1,5 @@
using System;
using BPASmartClient.Model.冰淇淋.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;


+ 2
- 1
BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_DW.cs 查看文件

@@ -1,4 +1,5 @@
using System;
using BPASmartClient.Model.冰淇淋.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;


+ 2
- 1
BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_UP.cs 查看文件

@@ -1,4 +1,5 @@
using System.Runtime.InteropServices;
using BPASmartClient.Model.冰淇淋.Enum;
using System.Runtime.InteropServices;
using static BPASmartClient.GSIceCream.MessageDefine;

namespace BPASmartClient.GSIceCream


+ 2
- 1
BPASmartClient.KLMCoffee/BPASmartClient.KLMCoffee.csproj 查看文件

@@ -5,7 +5,8 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\BPASmartClient.MessageCommunication\BPASmartClient.MessageCommunication.csproj" />
<ProjectReference Include="..\BPASmartClient.Model\BPASmartClient.Model.csproj" />
<ProjectReference Include="..\BPASmartClient.Peripheral\BPASmartClient.Peripheral.csproj" />
<ProjectReference Include="..\BPASmartClient.SerialPort\BPASmartClient.SerialPort.csproj" />
</ItemGroup>



+ 36
- 0
BPASmartClient.KLMCoffee/CoffeeMachine.cs 查看文件

@@ -0,0 +1,36 @@
using BPASmartClient.Helper;
using BPASmartClient.SerialPort;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.KLMCoffee
{
public class CoffeeMachine
{
//通讯代理
SerialPortClient commProxy = null;
//数据仓库
private DataStorage<byte> dataStorage = new DataStorage<byte>();
//是否下发指令,主线程等待
private bool free = false;
//状态询问指令
private byte[] cmdAsk;
//串口COM口
public string PortName { get; set; }
//串口波特率
public string BaudRate { get; set; }
//心跳时间
private DateTime lastRefreshTime = DateTime.MinValue;
//是否在线
public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } }
public CoffeeMachine()
{

}


}
}

+ 0
- 44
BPASmartClient.KLMCoffee/CommandEvent.cs 查看文件

@@ -1,44 +0,0 @@
using BPASmartClient.KLMCoffee.Protocal;

namespace BPASmartClient.KLMCoffee
{
/// <summary>
/// 制作咖啡
/// </summary>
public class MakeCoffeeEvent
{
public DrinkType DrinkCode { get; set; }
}

/// <summary>
/// 取消制作
/// </summary>
public class CancelMakeCoffeeEvent
{

}

/// <summary>
/// 模式设置
/// </summary>
public class CoffeeCommCmdEvent
{
//public DrCoffeeCommCmd CommCmd { get; set; }
}

/// <summary>
/// 开始制作
/// </summary>
public class CoffeBeginCook
{

}

/// <summary>
/// 结束制作
/// </summary>
public class CoffeEndCook
{

}
}

+ 0
- 111
BPASmartClient.KLMCoffee/CommandHandler.cs 查看文件

@@ -1,111 +0,0 @@
using BPASmartClient.KLMCoffee.Protocal;
using BPASmartClient.MessageCommunication;
using BPASmartClient.MessageCommunication.MsgControl;
using BPASmartClient.SerialPort;
using System;
using System.Threading;

namespace BPASmartClient.KLMCoffee
{
/// <summary>
/// 指令封装
/// </summary>
internal class CommandHandler
{
byte[] cmdAsk;
private SerialPortClient commProxy;
private K95Command drinksOrder = new K95Command();
public Action<bool> PauseAsk { get; set; }

/// <summary>
/// 初始化
/// </summary>
internal void Init(SerialPortClient commProxy)
{
this.commProxy = commProxy;
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.KLMCoffee_MakeCoffee,"MakeCoffeeHandler");
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.KLMCoffee_CancelMakeCoffee,"CancelMakeCoffeeHandler");
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.KLMCoffee_CoffeeCommCmd,"CoffeeCommCmdHandler");
}

///// <summary>
///// 制作咖啡
///// </summary>
//public void MakeCoffeeHandler(object sender,InnerMessageEventArgs e)
//{
// try
// {
// if (e.obj_MessageObj is MakeCoffeeEvent)
// {
// PauseAsk?.Invoke(true);
// Thread.Sleep(200);
// drinksOrder.ReturnsCommandData(K95CommandEnum.配方咖啡制作.GetString(),new new RecipeModel().Packe
// );
// drinksOrder.CommCmd = DrCoffeeCommCmd.饮品制作指令;
// drinksOrder.DrinksCode = (DrCoffeeDrinksCode)int.Parse(e.obj_MessageObj.ToString());
// commProxy.SendData(DrCoffee.Packe(drinksOrder));
// Thread.Sleep(200);
// PauseAsk?.Invoke(false);
// }
// }
// catch (Exception ex)
// {
// MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CancelMakeCoffeeHandler 类,描述:[{ex.Message}]");
// }
//}

///// <summary>
///// 取消制作
///// </summary>
//public void CancelMakeCoffeeHandler(object sender,InnerMessageEventArgs e)
//{
// try
// {
// PauseAsk?.Invoke(true);
// Thread.Sleep(200);
// drinksOrder.CommCmd = DrCoffeeCommCmd.取消应用指令;
// drinksOrder.DrinksCode = 0;
// commProxy.SendData(DrCoffee.Packe(drinksOrder));
// Thread.Sleep(200);
// PauseAsk?.Invoke(false);
// }
// catch (Exception ex)
// {
// MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CancelMakeCoffeeHandler 类,描述:[{ex.Message}]");
// }
//}

///// <summary>
///// 模式设置
///// </summary>
///// <param name="sender"></param>
///// <param name="e"></param>
//public void CoffeeCommCmdHandler(object sender,InnerMessageEventArgs e)
//{
// try
// {
// if (e.obj_MessageObj is string)
// {
// PauseAsk?.Invoke(true);
// Thread.Sleep(200);
// drinksOrder.CommCmd = (DrCoffeeCommCmd)int.Parse(e.obj_MessageObj.ToString());
// commProxy.SendData(DrCoffee.Packe(drinksOrder));
// Thread.Sleep(200);
// PauseAsk?.Invoke(false);
// }
// }
// catch (Exception ex)
// {
// MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeCommCmdHandler 类,描述:[{ex.Message}]");
// }
//}

/// <summary>
/// 发送状态询问
/// </summary>
internal byte[] GetStatusAsk()
{
return cmdAsk;
}
}
}

+ 6
- 0
BPASmartClient.KLMCoffee/Protocal/SystemStatusModel.cs 查看文件

@@ -12,26 +12,32 @@ namespace BPASmartClient.KLMCoffee.Protocal
/// 系统状态
/// </summary>
public K95SysTemStatus temStatus { get; set; }

/// <summary>
/// 饮品类型
/// </summary>
public DrinkType drinkType { get; set; }

/// <summary>
/// 制作状态
/// </summary>
public MakeStatus makeStatus { get; set; }

/// <summary>
/// 当前任务
/// </summary>
public TaskIndex taskIndex { get; set; }

/// <summary>
/// 当前进度 10%
/// </summary>
public int progress { get; set; }

/// <summary>
/// 故障信息
/// </summary>
public FaultMessage faultMessage { get; set; }

/// <summary>
/// 保养信息
/// </summary>


+ 1
- 1
BPASmartClient.Model/BPASmartClient.Model.csproj 查看文件

@@ -11,7 +11,7 @@
</ItemGroup>

<ItemGroup>
<Folder Include="机器人\" />
<Folder Include="机器人\Enum\" />
</ItemGroup>

</Project>

BPASmartClient.GSIceCream/Protocal/MORKI_MODE.cs → BPASmartClient.Model/冰淇淋/Enum/MORKI_MODE.cs 查看文件

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.GSIceCream
namespace BPASmartClient.Model.冰淇淋.Enum
{
/*
* 模式 参数

+ 7
- 3
BPASmartClient.Model/冰淇淋/GSIceCreamEvent.cs 查看文件

@@ -1,4 +1,5 @@
using System;
using BPASmartClient.Model.冰淇淋.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -17,7 +18,7 @@ namespace BPASmartClient.Model
/// </summary>
public class GSIceCream_ModeSetEvent :BaseEvent
{
public MORKI_MODE Mode { get; set; }
}

/// <summary>
@@ -33,6 +34,9 @@ namespace BPASmartClient.Model
/// </summary>
public class GSIceCream_EndCookEvent :BaseEvent
{

/// <summary>
/// 状态:true 成功 false 失败
/// </summary>
public bool Status { get; set; }
}
}

BPASmartClient.SCChip/Protocal/IC_CUP.cs → BPASmartClient.Model/单片机/Enum/IC_CUP.cs 查看文件

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.SCChip
namespace BPASmartClient.Model.单片机.Enum
{
/// <summary>
/// 杯子

BPASmartClient.SCChip/Protocal/IC_SE.cs → BPASmartClient.Model/单片机/Enum/IC_SE.cs 查看文件

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.SCChip
namespace BPASmartClient.Model.单片机.Enum
{
/// <summary>
/// 冰淇淋舵机

+ 10
- 5
BPASmartClient.Model/单片机/SCChipEvent.cs 查看文件

@@ -1,4 +1,5 @@
using System;
using BPASmartClient.Model.单片机.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -17,7 +18,10 @@ namespace BPASmartClient.Model.单片机
/// </summary>
public class SCChip_TakeCupEvent :BaseEvent
{

/// <summary>
/// 杯
/// </summary>
public IC_CUP Cup { get; set; }
}

/// <summary>
@@ -25,7 +29,7 @@ namespace BPASmartClient.Model.单片机
/// </summary>
public class SCChip_MakeIceCreamEvent :BaseEvent
{
public IC_SE SteeringEngine { get; set; }
}

/// <summary>
@@ -33,7 +37,8 @@ namespace BPASmartClient.Model.单片机
/// </summary>
public class SCChip_SESwitchCreamEvent :BaseEvent
{

public IC_SE SteeringEngine { get; set; }
public bool IsOpen { get; set; }
}

/// <summary>
@@ -41,6 +46,6 @@ namespace BPASmartClient.Model.单片机
/// </summary>
public class SCChip_RotorSwitchEvent :BaseEvent
{
public bool TurnOn { get; set; }
}
}

+ 4
- 2
BPASmartClient.Model/咖啡机/DRCoffeeEvent.cs 查看文件

@@ -1,4 +1,5 @@
using System;
using BPASmartClient.Model.咖啡机.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -17,6 +18,7 @@ namespace BPASmartClient.Model
/// </summary>
public class DRCoffee_MakeCoffeeEvent :BaseEvent
{
public DrCoffeeDrinksCode DrinkCode { get; set; }
}

/// <summary>
@@ -32,7 +34,7 @@ namespace BPASmartClient.Model
/// </summary>
public class DRCoffee_CoffeeCommCmdEvent :BaseEvent
{
public DrCoffeeCommCmd CommCmd { get; set; }
}

/// <summary>


BPASmartClient.DRCoffee/Protocal/DrCoffeeCommCmd.cs → BPASmartClient.Model/咖啡机/Enum/DrCoffeeCommCmd.cs 查看文件

@@ -4,12 +4,12 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.DRCoffee
namespace BPASmartClient.Model.咖啡机.Enum
{
/// <summary>
/// 通信指令
/// </summary>
public enum DrCoffeeCommCmd : byte
public enum DrCoffeeCommCmd :byte
{
无指令 = 0x00,
饮品制作指令 = 0x01,

BPASmartClient.DRCoffee/Protocal/DrCoffeeDrinksCode.cs → BPASmartClient.Model/咖啡机/Enum/DrCoffeeDrinksCode.cs 查看文件

@@ -4,12 +4,12 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BPASmartClient.DRCoffee
namespace BPASmartClient.Model.咖啡机.Enum
{
/// <summary>
/// 饮品编号
/// </summary>
public enum DrCoffeeDrinksCode : byte
public enum DrCoffeeDrinksCode :byte
{
意式浓缩 = 1,
美式咖啡 = 2,

+ 1
- 1
BPASmartClient.SCChip/BPASmartClient.SCChip.csproj 查看文件

@@ -5,7 +5,7 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\BPASmartClient.MessageCommunication\BPASmartClient.MessageCommunication.csproj" />
<ProjectReference Include="..\BPASmartClient.Model\BPASmartClient.Model.csproj" />
<ProjectReference Include="..\BPASmartClient.Peripheral\BPASmartClient.Peripheral.csproj" />
<ProjectReference Include="..\BPASmartClient.SerialPort\BPASmartClient.SerialPort.csproj" />
</ItemGroup>


+ 0
- 128
BPASmartClient.SCChip/ChipStatus.cs 查看文件

@@ -1,128 +0,0 @@
using System;

namespace BPASmartClient.SCChip
{
public class ChipStatus
{
private volatile static ChipStatus _Instance;
public static ChipStatus GetInstance() => _Instance ?? (_Instance = new ChipStatus());
private ChipStatus() { }

private DateTime lastRefreshTime = DateTime.MinValue;
/// <summary>
/// 是否在线
/// </summary>
public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } }
/// <summary>
/// 取冰淇淋杯完成
/// </summary>
public bool CompletedTake_CPU_CUP_ICECREAM { get; set; }
/// <summary>
/// 取咖啡杯完成
/// </summary>
public bool CompletedTake_CPU_CUP_COFFEE { get; set; }
/// <summary>
/// 1号舵机打开完成
/// </summary>
public bool CompletedOpen_SE_1 { get; set; }
/// <summary>
/// 2号舵机打开完成
/// </summary>
public bool CompletedOpen_SE_2 { get; set; }
/// <summary>
/// 3号舵机打开完成
/// </summary>
public bool CompletedOpen_SE_3 { get; set; }
/// <summary>
/// 1号舵机关闭完成
/// </summary>
public bool CompletedClose_SE_1 { get; set; }
/// <summary>
/// 2号舵机关闭完成
/// </summary>
public bool CompletedClose_SE_2 { get; set; }
/// <summary>
/// 3号舵机关闭完成
/// </summary>
public bool CompletedClose_SE_3 { get; set; }
/// <summary>
/// 是否存在物品
/// </summary>
public bool ArticleExits { get; set; }
/// <summary>
/// 物品距离
/// </summary>
public byte ArticleDist { get; set; }

public bool CanDo
{
get
{
if (!OnLine)
return false;
return true;
}
}

public void ProcessMsg(ICChipPackage data)
{
try
{
switch (data.Cmd)
{
case IC_CMD.HEART_BEAT:
lastRefreshTime = DateTime.Now;
break;
case IC_CMD.TAKE_CUP:
switch ((IC_CUP)data.Value) {
case IC_CUP.CUP_COFFEE:
CompletedTake_CPU_CUP_COFFEE = true;
break;
case IC_CUP.CUP_ICECREAM:
CompletedTake_CPU_CUP_ICECREAM = true;
break;
}
break;
case IC_CMD.OPEN_SE:
switch ((IC_SE)data.Value)
{
case IC_SE.SE_1:
CompletedOpen_SE_1 = true;
break;
case IC_SE.SE_2:
CompletedOpen_SE_2 = true;
break;
case IC_SE.SE_3:
CompletedOpen_SE_3 = true;
break;
}
break;
case IC_CMD.CLOSE_SE:
switch ((IC_SE)data.Value)
{
case IC_SE.SE_1:
CompletedClose_SE_1 = true;
break;
case IC_SE.SE_2:
CompletedClose_SE_2 = true;
break;
case IC_SE.SE_3:
CompletedClose_SE_3 = true;
break;
}
break;
case IC_CMD.ARTICLE_EXITS:
ArticleExits = data.Value > 0;
break;
case IC_CMD.ARTICLE_DIST:
ArticleDist = data.Value;
break;
}
}
catch (Exception ex)
{

}
}
}
}

+ 0
- 42
BPASmartClient.SCChip/CommandEvent.cs 查看文件

@@ -1,42 +0,0 @@
using BPASmartClient.SCChip;

namespace BPASmartClient.SCChip
{
public class TakeCupEvent
{
/// <summary>
/// 杯
/// </summary>
public IC_CUP Cup { get; set; }
}

public class MakeIceCreamEvent
{
public IC_SE SteeringEngine { get; set; }
}

public class SESwitchCreamEvent
{
public IC_SE SteeringEngine { get; set; }
public bool IsOpen { get; set; }
}

public class RotorSwitchEvent
{
public bool TurnOn { get; set; }
}
/// <summary>
/// 检测有无杯子
/// </summary>
public class ArticleExitsEvent
{
}
/// <summary>
/// 检测物品距离
/// </summary>
public class ArticleDistEvent
{

}
}

+ 0
- 225
BPASmartClient.SCChip/CommandHandler.cs 查看文件

@@ -1,225 +0,0 @@
using BPASmartClient.Message;
using BPASmartClient.MessageCommunication;
using BPASmartClient.MessageCommunication.MsgControl;
using BPASmartClient.SerialPort;
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace BPASmartClient.SCChip
{
/// <summary>
/// 指令封装
/// </summary>
internal class CommandHandler
{
private SerialPortClient commProxy;
private ICChipPackage package = new ICChipPackage();

/// <summary>
/// 初始化
/// </summary>
internal void Init(SerialPortClient commProxy)
{
this.commProxy = commProxy;
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_TakeCup,"TakeCupHandler");
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_MakeIceCream,"MakeIceCreamHandler");
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_SESwitchCream,"SESwitchCreamHandler");
Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_RotorSwitch,"RotorSwitchHandler");

}

/// <summary>
/// STM32F103RCT6单片机舵机打开或者关闭
/// </summary>
public void SESwitchCreamHandler(object sender,InnerMessageEventArgs e)
{
try
{
if (e.obj_MessageObj is TakeCupEvent)
{
ChipStatus.GetInstance().ArticleDist = 0;
package.Cmd = (e.obj_MessageObj as SESwitchCreamEvent).IsOpen ? IC_CMD.OPEN_SE : IC_CMD.CLOSE_SE;
package.Value = (byte)(e.obj_MessageObj as SESwitchCreamEvent).SteeringEngine;
commProxy.SendData(StructureToByte(package));
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,SESwitchCreamHandler 类,描述:[{ex.Message}]");
}
}

/// <summary>
/// STM32F103RCT6单片机控制冰淇淋机器转
/// </summary>
public void RotorSwitchHandler(object sender,InnerMessageEventArgs e)
{
try
{
if (e.obj_MessageObj is RotorSwitchEvent)
{
package.Cmd = IC_CMD.ROTOR;
package.Value = (e.obj_MessageObj as RotorSwitchEvent).TurnOn ? (byte)IC_ROTOR.OPEN_ROTOR : (byte)IC_ROTOR.CLOSE_ROTOR;
commProxy.SendData(StructureToByte(package));
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,RotorSwitchHandler 类,描述:[{ex.Message}]");
}
}

/// <summary>
/// STM32F103RCT6单片机舵机打料
/// </summary>
public void MakeIceCreamHandler(object sender,InnerMessageEventArgs e)
{
try
{
if (e.obj_MessageObj is MakeIceCreamEvent)
{
switch ((e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine)
{
case IC_SE.SE_1:
ChipStatus.GetInstance().CompletedOpen_SE_1 = false;
break;
case IC_SE.SE_2:
ChipStatus.GetInstance().CompletedOpen_SE_2 = false;
break;
case IC_SE.SE_3:
ChipStatus.GetInstance().CompletedOpen_SE_3 = false;
break;
}
package.Cmd = IC_CMD.OPEN_SE;
package.Value = (byte)(e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine;
commProxy.SendData(StructureToByte(package));

bool wait = true;
DateTime waitTimeout = DateTime.Now.AddSeconds(3);
while (wait)
{
wait = DateTime.Now < waitTimeout;
if (wait)
{
switch ((e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine)
{
case IC_SE.SE_1:
wait = !ChipStatus.GetInstance().CompletedOpen_SE_1;
break;
case IC_SE.SE_2:
wait = !ChipStatus.GetInstance().CompletedOpen_SE_2;
break;
case IC_SE.SE_3:
wait = !ChipStatus.GetInstance().CompletedOpen_SE_3;
break;
}
}
Thread.Sleep(10);
}
Thread.Sleep(2000);
package.Cmd = IC_CMD.CLOSE_SE;
package.Value = (byte)(e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine;
commProxy.SendData(StructureToByte(package));

wait = true;
waitTimeout = DateTime.Now.AddSeconds(3);
while (wait)
{
wait = DateTime.Now < waitTimeout;
if (wait)
{
switch ((e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine)
{
case IC_SE.SE_1:
wait = !ChipStatus.GetInstance().CompletedClose_SE_1;
break;
case IC_SE.SE_2:
wait = !ChipStatus.GetInstance().CompletedClose_SE_2;
break;
case IC_SE.SE_3:
wait = !ChipStatus.GetInstance().CompletedClose_SE_3;
break;
}
}
Thread.Sleep(10);
}
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,MakeIceCreamHandler 类,描述:[{ex.Message}]");
}
}

/// <summary>
/// STM32F103RCT6单片机下杯
/// </summary>
public void TakeCupHandler(object sender,InnerMessageEventArgs e)
{
try
{
if (e.obj_MessageObj is TakeCupEvent)
{
switch ((e.obj_MessageObj as TakeCupEvent).Cup)
{
case IC_CUP.CUP_ICECREAM:
ChipStatus.GetInstance().CompletedTake_CPU_CUP_ICECREAM = false;
break;
case IC_CUP.CUP_COFFEE:
ChipStatus.GetInstance().CompletedTake_CPU_CUP_COFFEE = false;
break;
}
package.Cmd = IC_CMD.TAKE_CUP;
package.Value = (byte)(e.obj_MessageObj as TakeCupEvent).Cup;
commProxy.SendData(StructureToByte(package));

bool wait = true;
var waitTimeout = DateTime.Now.AddSeconds(3);
while (wait)
{
wait = DateTime.Now < waitTimeout;
if (wait)
{
switch ((e.obj_MessageObj as TakeCupEvent).Cup)
{
case IC_CUP.CUP_ICECREAM:
wait = !ChipStatus.GetInstance().CompletedTake_CPU_CUP_ICECREAM;
break;
case IC_CUP.CUP_COFFEE:
wait = !ChipStatus.GetInstance().CompletedTake_CPU_CUP_COFFEE;
break;
}
}
Thread.Sleep(10);
}
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,TakeCupHandler 类,描述:[{ex.Message}]");
}
}

private byte[] StructureToByte(ICChipPackage structure)
{
structure.Header = 0xAA;
structure.Sender = IC_SENDER.CONSOLE;
structure.End = 0xBB;

int size = Marshal.SizeOf(typeof(ICChipPackage));
byte[] buffer = new byte[size];
IntPtr bufferIntPtr = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structure, bufferIntPtr, true);
Marshal.Copy(bufferIntPtr, buffer, 0, size);
}
finally
{
Marshal.FreeHGlobal(bufferIntPtr);
}
return buffer;
}
}
}

+ 294
- 29
BPASmartClient.SCChip/ICChipMachine.cs 查看文件

@@ -1,59 +1,86 @@
using BPASmartClient.Helper;
using BPASmartClient.EventBus;
using BPASmartClient.Helper;
using BPASmartClient.Message;
using BPASmartClient.Model;
using BPASmartClient.Model.单片机;
using BPASmartClient.Model.单片机.Enum;
using BPASmartClient.Peripheral;
using BPASmartClient.SerialPort;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading;
using static BPASmartClient.EventBus.EventBus;

namespace BPASmartClient.SCChip
{
public class ICChipMachine: BasePeripheral
public class ICChipMachine :BasePeripheral
{
//指令组装
private CommandHandler commandHandler = new CommandHandler();
//通讯代理
SerialPortClient commProxy = null;
//数据仓库
private DataStorage<byte> dataStorage = new DataStorage<byte>();
//主线程运行标识
private bool running = false;
//是否下发指令,主线程等待
public Action<string> SendCallback;
public Action<string> ReciveCallback;

/// <summary>
/// 串口COM口
/// </summary>
//单片机基础协议
private ICChipPackage package = new ICChipPackage();
//串口COM口
public string PortName { get; set; }
//串口波特率
public string BaudRate { get; set; }
//心跳时间
private DateTime lastRefreshTime = DateTime.MinValue;
/// <summary>
/// 串口波特率
/// 是否在线
/// </summary>
public string BaudRate { get; set; }
public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } }

public ICChipMachine()
{
//commProxy = new SerialPortClient(portName, baud);
//commProxy.SetDataStorage(dataStorage);
//commandHandler.Init(commProxy);

}

/// <summary>
/// 主线程开始运行
/// </summary>
public override void Start()
{
commProxy.Start();
running = true;
MainLoop();
try
{
commProxy.Start();
IsConnected = true;
MainLoop();
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]");
}

}

/// <summary>
/// 停止运行
/// </summary>
public override void Stop()
{
try
{
commProxy.Stop();
IsConnected = false;
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]");
}
}

/// <summary>
/// 主循环,循环询问状态
/// </summary>
private void MainLoop()
{
ThreadManage.GetInstance.StartLong(new Action(() =>
{
ResolveMsg();
//Thread.Sleep(2000);
}), "单片机解析线程");
}),"单片机解析线程");
}

private void ResolveMsg()
@@ -74,7 +101,7 @@ namespace BPASmartClient.SCChip
if (temp[4] == 0xBB)
{
var package = ByteToStructure(temp.ToArray());
ChipStatus.GetInstance().ProcessMsg(package);
ProcessMsg(package);
}
temp.Clear();
}
@@ -93,8 +120,8 @@ namespace BPASmartClient.SCChip
IntPtr allocIntPtr = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(dataBuffer, 0, allocIntPtr, size);
structure = (ICChipPackage)Marshal.PtrToStructure(allocIntPtr, typeof(ICChipPackage));
Marshal.Copy(dataBuffer,0,allocIntPtr,size);
structure = (ICChipPackage)Marshal.PtrToStructure(allocIntPtr,typeof(ICChipPackage));
}
finally
{
@@ -103,16 +130,254 @@ namespace BPASmartClient.SCChip
return structure;
}

protected override void InitStatus()
private byte[] StructureToByte(ICChipPackage structure)
{
structure.Header = 0xAA;
structure.Sender = IC_SENDER.CONSOLE;
structure.End = 0xBB;

int size = Marshal.SizeOf(typeof(ICChipPackage));
byte[] buffer = new byte[size];
IntPtr bufferIntPtr = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structure,bufferIntPtr,true);
Marshal.Copy(bufferIntPtr,buffer,0,size);
}
finally
{
Marshal.FreeHGlobal(bufferIntPtr);
}
return buffer;
}

public override void Stop()
public void ProcessMsg(ICChipPackage data)
{
try
{
switch (data.Cmd)
{
case IC_CMD.HEART_BEAT:
lastRefreshTime = DateTime.Now;
status["OnLine"] = OnLine;
break;
case IC_CMD.TAKE_CUP:
switch ((IC_CUP)data.Value)
{
case IC_CUP.CUP_COFFEE:
status["CompletedTake_CPU_CUP_COFFEE"] = true;
break;
case IC_CUP.CUP_ICECREAM:
status["CompletedTake_CPU_CUP_ICECREAM"] = true;
break;
}
break;
case IC_CMD.OPEN_SE:
switch ((IC_SE)data.Value)
{
case IC_SE.SE_1:
status["CompletedOpen_SE_1"] = true;
break;
case IC_SE.SE_2:
status["CompletedOpen_SE_2"] = true;
break;
case IC_SE.SE_3:
status["CompletedOpen_SE_3"] = true;
break;
}
break;
case IC_CMD.CLOSE_SE:
switch ((IC_SE)data.Value)
{
case IC_SE.SE_1:
status["CompletedClose_SE_1"] = true;
break;
case IC_SE.SE_2:
status["CompletedClose_SE_2"] = true;
break;
case IC_SE.SE_3:
status["CompletedClose_SE_3"] = true;
break;
}
break;
}
if(!OnLine) IsWork = false;
else IsWork = true;
}
catch (Exception ex)
{

}
}

protected override void InitStatus()
{
status["CompletedTake_CPU_CUP_ICECREAM"] = false;
status["CompletedTake_CPU_CUP_COFFEE"] = false;
status["CompletedOpen_SE_1"] = false;
status["CompletedOpen_SE_2"] = false;
status["CompletedOpen_SE_3"] = false;
status["CompletedClose_SE_1"] = false;
status["CompletedClose_SE_2"] = false;
status["CompletedClose_SE_3"] = false;
}

public override void Init()
{
commProxy = new SerialPortClient(PortName,(BaudRates)Enum.Parse(typeof(BaudRates),BaudRate));
commProxy.SetDataStorage(dataStorage);

//STM32F103RCT6单片机下杯
EventBus.EventBus.GetInstance().Subscribe<SCChip_TakeCupEvent>(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack)
{
try
{
switch ((@event as SCChip_TakeCupEvent).Cup)
{
case IC_CUP.CUP_ICECREAM:
status["CompletedTake_CPU_CUP_ICECREAM"] = false;
break;
case IC_CUP.CUP_COFFEE:
status["CompletedTake_CPU_CUP_COFFEE"] = false;
break;
}
package.Cmd = IC_CMD.TAKE_CUP;
package.Value = (byte)(@event as SCChip_TakeCupEvent).Cup;
commProxy.SendData(StructureToByte(package));

bool wait = true;
var waitTimeout = DateTime.Now.AddSeconds(3);
while (wait)
{
wait = DateTime.Now < waitTimeout;
if (wait)
{
switch ((@event as SCChip_TakeCupEvent).Cup)
{
case IC_CUP.CUP_ICECREAM:
wait = !(bool)status["CompletedTake_CPU_CUP_ICECREAM"];
break;
case IC_CUP.CUP_COFFEE:
wait = !(bool)status["CompletedTake_CPU_CUP_COFFEE"];
break;
}
}
Thread.Sleep(10);
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]");
}
});

//STM32F103RCT6单片机舵机打料
EventBus.EventBus.GetInstance().Subscribe<SCChip_MakeIceCreamEvent>(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack)
{
try
{
switch ((IC_SE)(@event as SCChip_MakeIceCreamEvent).SteeringEngine)
{
case IC_SE.SE_1:
status["CompletedOpen_SE_1"] = false;
break;
case IC_SE.SE_2:
status["CompletedOpen_SE_2"] = false;
break;
case IC_SE.SE_3:
status["CompletedOpen_SE_3"] = false;
break;
}
package.Cmd = IC_CMD.OPEN_SE;
package.Value = (byte)(@event as SCChip_MakeIceCreamEvent).SteeringEngine;
commProxy.SendData(StructureToByte(package));

bool wait = true;
DateTime waitTimeout = DateTime.Now.AddSeconds(3);
while (wait)
{
wait = DateTime.Now < waitTimeout;
if (wait)
{
switch ((IC_SE)(@event as SCChip_MakeIceCreamEvent).SteeringEngine)
{
case IC_SE.SE_1:
wait = !(bool)status["CompletedOpen_SE_1"];
break;
case IC_SE.SE_2:
wait = !(bool)status["CompletedOpen_SE_2"];
break;
case IC_SE.SE_3:
wait = !(bool)status["CompletedOpen_SE_3"];
break;
}
}
Thread.Sleep(10);
}
Thread.Sleep(2000);
package.Cmd = IC_CMD.CLOSE_SE;
package.Value = (byte)(@event as SCChip_MakeIceCreamEvent).SteeringEngine;
commProxy.SendData(StructureToByte(package));

wait = true;
waitTimeout = DateTime.Now.AddSeconds(3);
while (wait)
{
wait = DateTime.Now < waitTimeout;
if (wait)
{
switch ((IC_SE)(@event as SCChip_MakeIceCreamEvent).SteeringEngine)
{
case IC_SE.SE_1:
wait = !(bool)status["CompletedClose_SE_1"];
break;
case IC_SE.SE_2:
wait = !(bool)status["CompletedClose_SE_2"];
break;
case IC_SE.SE_3:
wait = !(bool)status["CompletedClose_SE_3"];
break;
}
}
Thread.Sleep(10);
}
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]");
}
});

//STM32F103RCT6单片机舵机打开或者关闭
EventBus.EventBus.GetInstance().Subscribe<SCChip_SESwitchCreamEvent>(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack)
{
try
{
package.Cmd = (@event as SCChip_SESwitchCreamEvent).IsOpen ? IC_CMD.OPEN_SE : IC_CMD.CLOSE_SE;
package.Value = (byte)(@event as SCChip_SESwitchCreamEvent).SteeringEngine;
commProxy.SendData(StructureToByte(package));
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeCommCmdHandler 类,描述:[{ex.Message}]");
}
});

//STM32F103RCT6单片机控制冰淇淋机器转
EventBus.EventBus.GetInstance().Subscribe<SCChip_RotorSwitchEvent>(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack)
{
try
{
package.Cmd = IC_CMD.ROTOR;
package.Value = (@event as SCChip_RotorSwitchEvent).TurnOn ? (byte)IC_ROTOR.OPEN_ROTOR : (byte)IC_ROTOR.CLOSE_ROTOR;
commProxy.SendData(StructureToByte(package));
}
catch (Exception ex)
{
MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]");
}
});

}
}



+ 1
- 1
BPASmartClient/MainWindow.xaml 查看文件

@@ -10,6 +10,6 @@
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="153,123,0,0" VerticalAlignment="Top" Click="Button_Click"/>

<pry:IcoButton IcoText="&#xe626;"/>
<!--<pry:IcoButton IcoText="&#xe626;"/>-->
</Grid>
</Window>

+ 5
- 0
BPASmartClient/MainWindow.xaml.cs 查看文件

@@ -1,6 +1,8 @@
using BPASmartClient.Business;
using BPASmartClient.EventBus;
using BPASmartClient.Model;
using BPASmartClient.Model.冰淇淋.Enum;
using BPASmartClient.Model.咖啡机.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -32,6 +34,9 @@ namespace BPASmartClient
private void Button_Click(object sender, RoutedEventArgs e)
{
new Demo_MakeCoffeeEvent() { Id = "1" }.Publish();
new DRCoffee_MakeCoffeeEvent() { Id = "1", DrinkCode= DrCoffeeDrinksCode.两杯意式浓缩 }.Publish();
new DRCoffee_CoffeeCommCmdEvent() { Id = "1",CommCmd = DrCoffeeCommCmd.冲煮系统快速冲洗指令}.Publish();

}
}
}

Loading…
取消
儲存