using System;
using MECF.Framework.Simulator.Core.Driver;
using Aitex.Core.Util;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Threading;
namespace athosSimulator.Robot
{
public class RorzeRobot751Simulator : SocketDeviceSimulator
{
public enum STAT_s1
{
OperationMode,
OriginSearchCompletion,
CommandProcessing,
OperationStatus,
OperationSpeed
}
public enum STAT_s2
{
IdentificationCode,
ErrorCode
}
private string _motionCmd = "HOME,EXTD,LOAD,UNLD,TRNS,EXCH,CLMP,UCLM,WMAP,UTRN,MGET,MPUT,MGT1,MGT2,MPT1,MPT2,WCHK,ALEX,ALLD,ALUL,ALGT,ALEA,ALMV,STEP,GCHK";
private const string RORZECMD = "^oTRB1";
private readonly char[] delimiters = { ':', '.', '(', ',' ,')' };
///
/// STAT s1 / s2
///
private char[] s1 = new char[5] { '0', '0' ,'0', '0', '0' };
private char[] s2 = new char[4] { '0', '0', '0', '0' };
public RorzeRobot751Simulator(int port) : base(port, -1, "\r", ' ')
{
}
///
/// Message处理
///
///
protected override void ProcessUnsplitMessage(string str)
{
// 处理Message
OnProcessMessage(str);
}
private void OnProcessMessage(string str)
{
if (!Regex.IsMatch(str, RORZECMD)) return;
// 发送ACK 表示收到
string[] cmdStrs = str.Split(delimiters);
string ack = "";
if(cmdStrs.Length < 2) return;
string cmd = cmdStrs[1];
if (_motionCmd.Contains(cmdStrs[1])) cmd = "MOTIONCMD";
switch (cmd)
{
case "STAT":
ack = "aTRB1." + $"{cmdStrs[1]}" + $":{GetSTATStr()}";
break;
case "INIT":
OnWriteMessage($"aTRB1.{cmdStrs[1]}:");
Thread.Sleep((ushort)500);
SetState("s1", (int)STAT_s1.OperationMode, '1');//OperationMode: Remote
SetState("s1", (int)STAT_s1.OriginSearchCompletion, '1');//OriginSearchCompletion: Completed
ack = "eTRB1." + $"STAT" + $":{GetSTATStr()}";
Thread.Sleep((ushort)3000);
break;
case "ORGN":
OnWriteMessage($"aTRB1.{cmdStrs[1]}:");
Thread.Sleep((ushort)500);
SetState("s1", (int)STAT_s1.OriginSearchCompletion, '1');//OriginSearchCompletion: Completed
SetState("s1", (int)STAT_s1.OperationStatus, '0');//OperationStatus: Stop
ack = "eTRB1." + $"STAT" + $":{GetSTATStr()}";
Thread.Sleep((ushort)3000);
break;
case "MOTIONCMD":
OnWriteMessage($"aTRB1.{cmdStrs[1]}:");
Thread.Sleep((ushort)500);
SetState("s1", (int)STAT_s1.OriginSearchCompletion, '1');//OriginSearchCompletion: Completed
SetState("s1", (int)STAT_s1.OperationStatus, '0');//OperationStatus: Stop
ack = "eTRB1." + $"STAT" + $":{GetSTATStr()}";
Thread.Sleep((ushort)3000);
break;
case "EXST":
ack = "aTRB1." + $"{cmdStrs[1]}" + $":0";
break;
default:
ack = "aTRB1." + $"{cmdStrs[1]}" + ":";
break;
}
OnWriteMessage(ack);
}
///
/// 设置STAT数据状态
///
///
///
///
private void SetState(string module, int bitNum, char value)
{
switch (module)
{
case "s1":
s1[bitNum] = value;
break;
case "s2":
s2[bitNum] = value;
break;
default:
break;
}
}
///
/// Get STAT String (s1 / s2)
///
///
private string GetSTATStr()
{
string s1Str = (s1[0] + "" + s1[1] + s1[2] + s1[3] + s1[4]);
string s2Str = (s2[0] + "" + s2[1] + s1[2] + s2[3]);
return $"{s1Str}/{s2Str}";
}
}
}