using AmrControl.Dto;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Policy;
namespace AmrControl.ADS
{
[Serializable]
public class JGR_Tc_Model
{
// 0:仓储车 , 1:运输车, 2:仓储位充电器,3:轨道位充电器
public byte jgrType;
//出厂编号,30个长度带'\0',有效最多29个字节
public string jgrSN;
//车ID,取值范围0~63,不同类型的车/充电器的jgrID可以重复
public byte jgrID;
//无线模块的地址,长度2字节
public ushort rcAddr;
//无线模块的频率码,取值0~155,对应频率为 900+RC_FreqCode*0.2,单位MHz,默认频率码为0x32(50)
public byte rcFreqCode;
//在线/离线状态 是否在线(通讯是否正常)
public byte isOnline;
//健康状态 =0:正常; >=1:异常,异常编码看接口给
public byte isHealthy;
//充电标志,1:充电中,0:未在充电
public byte isCharging;
//充电电压,单位:V
public float chargeVoltage;
//充电电流,单位:mA
public float chargeCurrent;
//电池剩余电量,取值 0~100 , 100表示满电量
public byte electricity;
//驱动器通电/断电状态
public byte isDriverPowerOn;
//(*工作模式
//1: 正常工作模式,即自动控制模式,只需给出运动的目标坐标,动作序列小车自己控制,正常工作时使用;
//2:调试模式,即手动控制模式,用于调试,每一个动作都需要发送指令*)
public byte workMode;
//车轮位置(车身姿态) =1高姿态,=2中姿态,=3低姿态
public byte wheelPosition;
//行进/停止状态
//(* 车体运动状态
//0:静止状态
//1:X负向移动
//2:X正向移动
//3:Y负向移动
//4:Y正向移动*)
public byte moveStatus;
//移动速度,单位:m/s
public float moveSpeed;
//当前位置X
public short currLocation_X;
//当前位置Y
public short currLocation_Y;
//目标位置X
public short destLocation_X;
//目标位置Y
public short destLocation_Y;
///
/// 显示位置X,Y坐标
///
public int displayX;
public int displayY;
//车轮是否在位置切换中
public byte isWheelAltering;
//4个碰撞传感器,true:碰撞,false:未碰撞
public byte[] collideSensor;
//X加速度,单位 m/s2
public float acceleration_X;
//Y加速度,单位 m/s2
public float acceleration_Y;
//Z加速度,单位 m/s2
public float acceleration_Z;
//XZ角度,单位:°
public float angleXZ;
//YZ角度,单位:°
public float angleYZ;
//吊篮限位标志,吊篮处于的位置 0:最高点; 1~7层
public byte basketPosition;
//吊篮抓夹状态 1:闭合状态; 2:张开状态
public byte basketGripperStatus;
//吊篮是否在移动,吊篮运动状态 吊篮运动状态 0:静止; 1:正在上提; 2:正在下放
public byte basketMoveStatus;
//RFID
public string rfid;
///
/// 需要移动的路径
///
[JsonIgnore]
public List movingPaths;
public JGR_Tc_Model()
{
collideSensor = new byte[4];
movingPaths = new List();
}
public int GetPathCounts()
{
int count = 0;
lock(this)
{
count = movingPaths.Count;
}
return count;
}
public MovingPath GetFirstPath()
{
MovingPath path = null;
lock (this)
{
if(movingPaths.Count > 0)
{
path = movingPaths[0];
}
}
return path;
}
public MovingPath RemoveFirstPath()
{
MovingPath path = null;
lock (this)
{
if (movingPaths.Count > 0)
{
path = movingPaths[0];
movingPaths.RemoveAt(0);
}
}
return path;
}
public void ClearPath()
{
lock (this)
{
movingPaths.Clear();
}
}
///
/// 如果对象为空,可以加入,表示当前这辆车只能执行一组动作
///
///
public void AddPath(List paths)
{
lock (this)
{
if(movingPaths.Count == 0)
{
movingPaths.AddRange(paths);
}
}
}
}
//用内存对齐方式并不对,可能是和TC程序接口是C#开发的有关 [StructLayout(LayoutKind.Sequential, Pack = 1)]
///
/// TC程序中定义的JGR小车的数据结构
///
[Serializable]
public struct JGR_Ads_Struct
{
//出厂编号,30个长度带'\0',有效最多29个字节
[JsonConverter(typeof(TcModelArrayConverter))]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
public byte[] jgrSN;
// 0:仓储车 , 1:运输车, 2:仓储位充电器,3:轨道位充电器
public byte jgrType;
//车ID,取值范围0~63,不同类型的车/充电器的jgrID可以重复
public byte jgrID;
//无线模块的地址,长度2字节
public ushort rcAddr;
//无线模块的频率码,取值0~155,对应频率为 900+RC_FreqCode*0.2,单位MHz,默认频率码为0x32(50)
public byte rcFreqCode;
//在线/离线状态 是否在线(通讯是否正常)
public byte isOnline;
//健康状态 true:正常; false:异常
public byte isHealthy;
//充电标志,1:充电中,0:未在充电
public byte isCharging;
//充电电压,单位:V
public float chargeVoltage;
//充电电流,单位:mA
public float chargeCurrent;
//电池剩余电量,取值 0~100 , 100表示满电量
public byte electricity;
//驱动器通电/断电状态
public byte isDriverPowerOn;
//(*工作模式
//1: 正常工作模式,即自动控制模式,只需给出运动的目标坐标,动作序列小车自己控制,正常工作时使用;
//2:调试模式,即手动控制模式,用于调试,每一个动作都需要发送指令*)
public byte workMode;
//车轮位置(车身姿态) =1高姿态,=2中姿态,=3低姿态
public byte wheelPosition;
//行进/停止状态
//(* 车体运动状态
//0:静止状态
//1:X负向移动
//2:X正向移动
//3:Y负向移动
//4:Y正向移动*)
public byte moveStatus;
//移动速度,单位:m/s
public float moveSpeed;
//当前位置X
public short currLocation_X;
//当前位置Y
public short currLocation_Y;
//目标位置X
public short destLocation_X;
//目标位置Y
public short destLocation_Y;
//车轮是否在位置切换中
public byte isWheelAltering;
//4个碰撞传感器,true:碰撞,false:未碰撞
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] collideSensor;
//X加速度,单位 m/s2
public float acceleration_X;
//Y加速度,单位 m/s2
public float acceleration_Y;
//Z加速度,单位 m/s2
public float acceleration_Z;
//XZ角度,单位:°
public float angleXZ;
//YZ角度,单位:°
public float angleYZ;
//吊篮限位标志,吊篮处于的位置 1:最高点; 2:最低点
public byte basketPosition;
//吊篮抓夹状态 1:闭合状态; 2:张开状态
public byte basketGripperStatus;
//吊篮是否在移动,吊篮运动状态 吊篮运动状态 0:静止; 1:正在上提; 2:正在下放
public byte basketMoveStatus;
//RFID
[JsonConverter(typeof(TcModelArrayConverter))]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public byte[] rfid;
}
///
/// 车、充电桩的类型
///
public enum JgrType : byte
{
///
/// 仓储车
///
StorageCar = 0,
///
/// 轨道车
///
RailCar = 1,
///
/// 仓储充电桩
///
StorageCharging = 2,
///
/// 轨道充电桩
///
RailCharging = 3
}
}