using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Lebai.SDK; using Lebai.SDK.Dtos; using Robotc; using BPASmartClient.Message; using BPASmartClient.Helper; using TaskStatus = Lebai.SDK.Dtos.TaskStatus; using BPASmartClient.Peripheral; using BPASmartClient.EventBus; using static BPASmartClient.EventBus.EventBus; using BPASmartClient.Model; namespace BPASmartClient.Lebai { public class LebaiRobot: BasePeripheral { //public const int SENCE_自嗨 = 10008; //public const int SENCE_接冰淇淋1 = 10004; //public const int SENCE_接冰淇淋2 = 10003; //public const int SENCE_接冰淇淋3 = 10005; //public const int SENCE_咖啡 = 10006; //#region 新增场景 //public const int SENCE_取咖啡杯 = 10013; //public const int SENCE_咖啡杯检测 = 10014; //public const int SENCE_再次取杯 = 10017; //public const int SENCE_接咖啡 = 10015; //public const int SENCE_送咖啡 = 10016; //无取走咖啡检测配合场景 //public const int SENCE_New送咖啡 = 10021;//有取走咖啡检测配合场景 //public const int SENCE_有无咖啡检测 = 10019; //public const int SENCE_再送咖啡 = 10020; //public const int SENCE_复位 = 10018; //#endregion //public const int SENCE_欢迎 = 10002; #region 且时且多设备 //取咖啡杯 set:=1 get:=101 10031 //取冰淇淋杯 set:=1 get:=101 10032 //咖啡杯检测 set:=1 get:=101 10033 //冰淇淋杯检测 set:=1 get:=101 10034 //二次取咖啡杯 set:=1 get:=101 10035 //二次取冰淇淋杯 set:=1 get:=101 10036 //接咖啡 set:=1 get:=101 10037 //接冰淇淋公共点 set:=1 get:=101 10038 //接1号冰淇淋 set:=1 get:=101 10039 //接2号冰淇淋 set:=1 get:=101 10040 //接3号冰淇淋 set:=1 get:=101 10041 //放咖啡位置 set:=1 get:=101 10042 //放冰淇淋位置 set:=1 get:=101 10043 public const int SENCE_取咖啡杯 = 10031; public const int SENCE_取冰淇淋杯 = 10032; public const int SENCE_咖啡杯检测 = 10033; public const int SENCE_冰淇淋杯检测 = 10034; public const int SENCE_二次取咖啡杯 = 10035; public const int SENCE_二次取冰淇淋杯 = 10036; public const int SENCE_接咖啡 = 10037; public const int SENCE_接冰淇淋公共点 = 10038; public const int SENCE_接1号冰淇淋 = 10039; public const int SENCE_接2号冰淇淋 = 10040; public const int SENCE_接3号冰淇淋 = 10041; public const int SENCE_放咖啡位置 = 10042; public const int SENCE_放冰淇淋位置 = 10043; //add 新加场景 public const int SENCE_接咖啡后回原点 = 10051; public const int SENCE_咖啡杯回原点 = 10050; public const int SENCE_冰淇淋杯回原点 = 10049; public const int SENCE_取咖啡出餐 = 10052; #endregion /// /// IP地址 /// public string IpAddress { get; set; } /// /// 抓手上传感器输入位索引 /// public int HandSensor { get; set; } /// /// 输出信号量索引 /// public int OutputSingalValue { get; set; } private volatile static LebaiRobot _Instance; public static LebaiRobot GetInstance => _Instance ?? (_Instance = new LebaiRobot()); private LebaiRobot() { } private LebaiRobotClient client; private RobotData robotData; public bool IsIdle { get; set; } = false; public bool IsConnected { get { return null != robotData; } } public void Connect(string ip) { bool ErrorFlag = false; while (robotData == null) { try { client = new LebaiRobotClient(ip); robotData = client.GetRobotData().Result; } catch (Exception ex) { if (!ErrorFlag) { MessageLog.GetInstance.ShowEx(ex.ToString()); ErrorFlag = true; } Thread.Sleep(3000); } } StartRobot(); MessageLog.GetInstance.Show("乐百机器人连接成功!"); } /// /// 机器人重连检测 /// /// public void Reconnect(string ip) { if (client == null) { try { client = new LebaiRobotClient(ip); } catch (Exception) { // throw; } } check: while (robotData != null) { try { robotData = client.GetRobotData().Result; } catch (Exception) { robotData = null; // throw; } } MessageLog.GetInstance.Show("乐白机器人断开连接,准备重连"); int num = 0; while (num < 6 && robotData == null) { try { robotData = client.GetRobotData().Result; } catch (Exception ex) { if (num == 5) { MessageLog.GetInstance.ShowEx(ex.ToString()); } } if (num < 5 && robotData == null) { Thread.Sleep(1000); MessageLog.GetInstance.Show($"乐白机器人正在尝试第{num + 1}次重连...."); } else if (num >= 5 && robotData == null) { MessageLog.GetInstance.Show("乐白机器人重连失败,请检查硬件连接"); //return; } num++; } if (robotData != null) { StartRobot(); MessageLog.GetInstance.Show("乐白机器人重连成功"); } goto check; } public void GetRobotModeStatus() { if (robotData == null) return; int mode = robotData.RobotMode.Mode; IsIdle = mode == 5; for (int i = 0; i < 14; i++) { if (RTrig.GetInstance(((ELebaiRModel)i).ToString()).Start(mode == i)) MessageLog.GetInstance.Show(((ELebaiRModel)i).ToString()); } } public void GetSpeed() { //client.StartSys().GetAwaiter(); var aa = client.GetActualTcpSpeed().GetAwaiter(); //robotData.RobotMode.Mode } /// /// 启动机器人 /// public async void StartRobot() { if (robotData != null) { await client.StartSys(); await client.Sync(); MessageLog.GetInstance.Show("机器人启动成功"); } } /// /// 启动示教 /// public async void StartTeachMode() { try { if (robotData != null) { await client.TeachMode(); MessageLog.GetInstance.Show("机器人切换为示教模式."); } } catch (Exception ex) { MessageLog.GetInstance.ShowEx(ex.ToString()); } } /// /// 结束示教 /// public async void EndtTeachMode() { try { if (robotData != null) { await client.EndTeachMode(); MessageLog.GetInstance.Show("机器人切换为停止示教模式."); } } catch (Exception ex) { MessageLog.GetInstance.ShowEx(ex.ToString()); } } /// /// 机器人急停 /// public async void EStopRobot() { try { if (robotData != null) { await client.EStop(); MessageLog.GetInstance.Show("机器人急停"); } } catch (Exception ex) { MessageLog.GetInstance.ShowEx(ex.ToString()); } } /// /// 获取抓手重量 /// /// public double GetClawWdight() { if (robotData != null) { return client.GetClawWeight().Result.Weight_; } return 0; } /// /// 获取信号量 /// /// /// public SignalResult? GetValueAsync(int index = 0) { if (robotData == null) return default(SignalResult); SignalValue signalValue = new SignalValue(); signalValue.Index = index; return client?.GetSignal(signalValue).Result; } /// /// 设置信号量 /// /// /// /// public SignalResult? SetValue(int value, int index = 0) { if (robotData == null) return default; SignalValue signalValue = new SignalValue(); signalValue.Index = index; signalValue.Value = value; return client.SetSignal(signalValue).Result; } /// /// 获取输入DI状态 /// /// /// public bool GetInput(int pin = 0) { if (client == null) return false; var res = client.GetDIO(new IOPin() { Pin = pin }).Result; if (res != null) { return res.Value == 1 ? true : false; } return false; } /// /// 运行指定的场景 /// /// public async void Scene(int id) { CancellationToken cancellationToken = default(CancellationToken); var result = await client.GetTasks(new GetTasksInput { PageIndex = 1, PageSize = 1 }, cancellationToken); var first = result?.Items?.FirstOrDefault(); var r = first == null || first.Status != TaskStatus.Running && first.Status != TaskStatus.Pause; while (!r) { Thread.Sleep(5); result = await client.GetTasks(new GetTasksInput { PageIndex = 1, PageSize = 1 }, cancellationToken); first = result?.Items?.FirstOrDefault(); r = first == null || first.Status != TaskStatus.Running && first.Status != TaskStatus.Pause; } while (GetValueAsync().Value != 0) { Thread.Sleep(500); } Thread.Sleep(1000); if (robotData == null || client == null) return; //if (!client.GetIsCanRunTask().Result) return; await client?.RunScene(id); MessageLog.GetInstance.Show($"调用场景:{id}"); } protected override void InitStatus() { status["Connected"] = false; status["HandSensor"] = 0; status["OutputSingalValue"] = 0; } public override void Start() { Connect(IpAddress); } public override void Stop() { } public override void Init() { EventBus.EventBus.GetInstance().Subscribe(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack ) { }); InitStatus(); } } }