DataItemDefine.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. using System.Runtime.InteropServices;
  2. using System.Runtime.Serialization;
  3. using System;
  4. namespace EPInterface.Data
  5. {
  6. //[DataContract]
  7. //public enum EPDState
  8. //{
  9. // [EnumMember]
  10. // UnSampling, //硬件未进入采样
  11. // [EnumMember]
  12. // Running, //计算中
  13. // [EnumMember]
  14. // Pause, //暂停
  15. // [EnumMember]
  16. // Idle,
  17. //};
  18. //[DataContract]
  19. //public enum EPDEventType
  20. //{
  21. // [EnumMember]
  22. // Default = 0, //基础信息
  23. // [EnumMember]
  24. // Info = 1, //基础信息
  25. // [EnumMember]
  26. // Error, //基础信息
  27. // [EnumMember]
  28. // Start, //步骤 开始
  29. // [EnumMember]
  30. // Delay, //步骤 延迟
  31. // [EnumMember]
  32. // Normalize, //步骤
  33. // [EnumMember]
  34. // Check, //步骤 检查条件
  35. // [EnumMember]
  36. // EndPoint, //步骤 触发
  37. // [EnumMember]
  38. // Stop, //步骤 停止
  39. //};
  40. //[DataContract]
  41. //[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
  42. //public struct HardwareInfo
  43. //{
  44. // [MarshalAs(UnmanagedType.U8)]
  45. // public ulong Ver;
  46. // [MarshalAs(UnmanagedType.U2)]
  47. // public ushort Pixes;
  48. // [MarshalAs(UnmanagedType.R8)]
  49. // public double FirstCoefficient;
  50. // [MarshalAs(UnmanagedType.R8)]
  51. // public double SecondCoefficient;
  52. // [MarshalAs(UnmanagedType.R8)]
  53. // public double ThirdCoefficient;
  54. // [MarshalAs(UnmanagedType.R8)]
  55. // public double Intercept;
  56. // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
  57. // public char[] Serial;
  58. // [MarshalAs(UnmanagedType.U8)]
  59. // public ulong IntegrationTime;
  60. // [MarshalAs(UnmanagedType.U8)]
  61. // public ulong SamplingTime;
  62. // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
  63. // public double[] Wave;
  64. //}
  65. //[DataContract]
  66. //[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
  67. //public struct RawDataItem
  68. //{
  69. // public static readonly int Size = Marshal.SizeOf(typeof(RawDataItem));
  70. // [MarshalAs(UnmanagedType.I8)]
  71. // public long Ticket;
  72. // [MarshalAs(UnmanagedType.I4)] //累积次数
  73. // public int Counter;
  74. // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] //全光谱数据
  75. // public ushort[] RawData;
  76. // [MarshalAs(UnmanagedType.I4)] //波段数据
  77. // public int RegionNum;
  78. // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
  79. // public double[] RegionData;
  80. // [MarshalAs(UnmanagedType.I4)] //趋势数据, 表达式
  81. // public int TrendNum;
  82. // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
  83. // public double[] TrendData;
  84. //}
  85. //[DataContract]
  86. //public class CRawDataItem
  87. //{
  88. // [DataMember]
  89. // public long Ticket
  90. // {
  91. // get;set;
  92. // }
  93. // [DataMember]
  94. // public ushort[] RawData
  95. // { get;
  96. // set;
  97. // }
  98. // [DataMember]
  99. // public int RegionNum
  100. // {
  101. // get; set;
  102. // }
  103. // [DataMember]
  104. // public double[] RegionData
  105. // {
  106. // get;set;
  107. // }
  108. // [DataMember]
  109. // public int TrendNum
  110. // {
  111. // get;set;
  112. // }
  113. // [DataMember]
  114. // public double[] TrendData
  115. // {
  116. // get;set;
  117. // }
  118. // public CRawDataItem()
  119. // {
  120. // Ticket = 0;
  121. // RawData = new ushort[1024];
  122. // RegionNum = 32;
  123. // RegionData = new double[32];
  124. // TrendNum = 32;
  125. // TrendData = new double[32];
  126. // }
  127. //}
  128. public static class EpConst
  129. {
  130. public const int MAX_BAND_COUNT = 8;
  131. public const int RAW_LENGTH = 4096;
  132. public const int DATA_LENGTH = 32;
  133. public const int MAX_BAND_RANGE_NM = 20;
  134. public const int MAX_ZERO_BAND_COUNT = 3;
  135. public const int NORMALIZATION_TIME = 1000;
  136. public const int MAX_INTERVAL = 200;
  137. public const int MAX_FORMULA_LEN = 256;
  138. public const int OFFSET_FIRST_DATA = 34664;
  139. public const int RAW_SIZE = RAW_LENGTH * sizeof(ushort);
  140. public const int DATA_SIZE = DATA_LENGTH * sizeof(double);
  141. }
  142. public enum RawDataType
  143. {
  144. None,
  145. OES = 1,
  146. IEP = 2,
  147. MIX = 3,
  148. MULTI = 4,
  149. Invalid = 65535
  150. }
  151. [DataContract]
  152. public enum EPDState
  153. {
  154. [EnumMember] UnSampling, //硬件未进入采样
  155. [EnumMember] Running, //计算中
  156. [EnumMember] Pause, //暂停
  157. [EnumMember] Idle,
  158. [EnumMember] Recording, //记录中
  159. };
  160. [DataContract]
  161. public enum EPDEventType
  162. {
  163. [EnumMember] Default = 0, //基础信息
  164. [EnumMember] Info = 1, //基础信息
  165. [EnumMember] Error = 2, //基础信息
  166. [EnumMember] Start = 3, //步骤 开始
  167. [EnumMember] DelayEnd = 4, //步骤 延迟
  168. [EnumMember] Normalize = 5, //步骤
  169. [EnumMember] Check = 6, //步骤 检查条件
  170. [EnumMember] EndPoint = 7, //步骤 触发
  171. [EnumMember] Stop = 8, //步骤 停止
  172. [EnumMember] RF_ON = 9, // 射频 起辉
  173. [EnumMember] RF_OFF = 10, // 射频 灭辉
  174. [EnumMember] RecipeStart = 11, //Recipe 启动
  175. [EnumMember] RecipeStop = 12, //Recipe 停止
  176. [EnumMember] TrendData = 0x10, //TrendData
  177. [EnumMember] UserNotification = 0x11,
  178. [EnumMember] UserWarning = 0x12,
  179. [EnumMember] UserError = 0x13,
  180. [EnumMember] UserFault = 0x14,
  181. [EnumMember] SpectrumData = 0x15, //SpectrumData
  182. [EnumMember] HeartBeat = 0x20, //心跳
  183. [EnumMember] StepDelayEnd = 0x30,
  184. [EnumMember] StepCheck = 0x31,
  185. [EnumMember] StepOveretch = 0x32,
  186. [EnumMember] StepOverMaxTime = 0x33,
  187. [EnumMember] StepEnd = 0x34,
  188. [EnumMember] Satisfied = 0x35,
  189. [EnumMember] CheckFailed = 0x36,
  190. [EnumMember] OverMaxTime = 0x3A,
  191. [EnumMember] OverEtch = 0x3B,
  192. [EnumMember] WithinMinTime = 0x3C,
  193. [EnumMember] StepNum = 0x80,
  194. [EnumMember] GasEvent,
  195. [EnumMember] LFEvent,
  196. [EnumMember] HFEvent,
  197. [EnumMember] ReprocessClearEvent = 0x0101,
  198. [EnumMember] ScriptErrorMsg = 0x0102,
  199. };
  200. [DataContract]
  201. [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
  202. public struct HardwareInfo
  203. {
  204. [MarshalAs(UnmanagedType.U8)] public ulong Ver;
  205. [MarshalAs(UnmanagedType.I4)] public int Index;
  206. [MarshalAs(UnmanagedType.I4)] public int Pixels;
  207. [MarshalAs(UnmanagedType.R8)] public double FirstCoefficient;
  208. [MarshalAs(UnmanagedType.R8)] public double SecondCoefficient;
  209. [MarshalAs(UnmanagedType.R8)] public double ThirdCoefficient;
  210. [MarshalAs(UnmanagedType.R8)] public double Intercept;
  211. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public char[] Serial;
  212. [MarshalAs(UnmanagedType.U8)] public ulong IntegrationTime;
  213. [MarshalAs(UnmanagedType.I4)] public int SamplingTime;
  214. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)]
  215. public double[] Wave;
  216. }
  217. [DataContract]
  218. [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
  219. public struct RawDataItem : IComparable
  220. {
  221. public static readonly int Size = Marshal.SizeOf(typeof(RawDataItem));
  222. [MarshalAs(UnmanagedType.I8)]
  223. [DataMember] public long Ticket;
  224. [MarshalAs(UnmanagedType.I4)]
  225. [DataMember] public int Counter; //累积次数
  226. [MarshalAs(UnmanagedType.ByValArray, SizeConst = EpConst.RAW_LENGTH)]
  227. [DataMember] public ushort[] OES; //OES
  228. [MarshalAs(UnmanagedType.ByValArray, SizeConst = EpConst.RAW_LENGTH)] // with flashlamp on
  229. [DataMember] public ushort[] IEP; //IEP
  230. [MarshalAs(UnmanagedType.ByValArray, SizeConst = EpConst.RAW_LENGTH)] // with flashlamp off
  231. [DataMember] public ushort[] IEP_OES;
  232. [MarshalAs(UnmanagedType.I4)]
  233. [DataMember] public int RegionNum; //波段数据
  234. [MarshalAs(UnmanagedType.ByValArray, SizeConst = EpConst.DATA_LENGTH)]
  235. [DataMember] public double[] RegionData;
  236. [MarshalAs(UnmanagedType.I4)]
  237. [DataMember] public int TrendNum; //趋势数据, 表达式
  238. [MarshalAs(UnmanagedType.ByValArray, SizeConst = EpConst.DATA_LENGTH)]
  239. [DataMember] public double[] TrendData;
  240. public RawDataItem(int _)
  241. {
  242. Ticket = 0;
  243. Counter = 0;
  244. RegionNum = 0;
  245. TrendNum = 0;
  246. OES = new ushort[EpConst.RAW_LENGTH];
  247. IEP = new ushort[EpConst.RAW_LENGTH];
  248. IEP_OES = new ushort[EpConst.RAW_LENGTH];
  249. RegionData = new double[EpConst.DATA_LENGTH];
  250. TrendData = new double[EpConst.DATA_LENGTH];
  251. }
  252. public RawDataItem(RawDataItem2 item)
  253. {
  254. Ticket = item.Ticket;
  255. Counter = 0;
  256. TrendNum = item.TrendNum;
  257. RegionNum = item.RegionNum;
  258. OES = new ushort[EpConst.RAW_LENGTH];
  259. IEP = new ushort[EpConst.RAW_LENGTH];
  260. IEP_OES = new ushort[EpConst.RAW_LENGTH];
  261. RegionData = new double[EpConst.DATA_LENGTH];
  262. TrendData = new double[EpConst.DATA_LENGTH];
  263. if (item.OES == null)
  264. return;
  265. Buffer.BlockCopy(item.OES, 0, IEP_OES, 0, EpConst.RAW_SIZE);
  266. Buffer.BlockCopy(item.IEP, 0, IEP, 0, EpConst.RAW_SIZE);
  267. Buffer.BlockCopy(item.TrendData, 0, TrendData, 0, EpConst.DATA_SIZE);
  268. Buffer.BlockCopy(item.RegionData, 0, RegionData, 0, EpConst.DATA_SIZE);
  269. }
  270. public int CompareTo(object obj)
  271. {
  272. var item = (RawDataItem)obj;
  273. if (this.Ticket < item.Ticket) return -1;
  274. else if (this.Ticket > item.Ticket) return 1;
  275. else return 0;
  276. }
  277. }
  278. [DataContract]
  279. [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
  280. public struct RawDataItem2
  281. {
  282. public static readonly int Size = Marshal.SizeOf(typeof(RawDataItem2));
  283. [MarshalAs(UnmanagedType.I8)] public long Ticket;
  284. [MarshalAs(UnmanagedType.I4)] public int Counter; //累积次数
  285. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)] //全光谱数据
  286. public ushort[] OES; //OES
  287. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)] //全光谱数据
  288. public ushort[] IEP; //IEP
  289. [MarshalAs(UnmanagedType.I4)] public int RegionNum; //波段数据
  290. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
  291. public double[] RegionData;
  292. [MarshalAs(UnmanagedType.I4)] public int TrendNum; //趋势数据, 表达式
  293. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
  294. public double[] TrendData;
  295. }
  296. [DataContract]
  297. public class CRawDataItem
  298. {
  299. [DataMember] public long Ticket { get; set; }
  300. [DataMember] public ushort[] OES { get; set; }
  301. [DataMember] public ushort[] IEP { get; set; } // with flashlamp on
  302. [DataMember] public ushort[] IEP_OES { get; set; } // with flashlamp off
  303. [DataMember] public int RegionNum { get; set; }
  304. [DataMember] public double[] RegionData { get; set; }
  305. [DataMember] public int TrendNum { get; set; }
  306. [DataMember] public double[] TrendData { get; set; }
  307. public CRawDataItem(int len = EpConst.RAW_LENGTH) : this(len, len)
  308. {
  309. }
  310. private void init(int oesLen, int iepLen)
  311. {
  312. Ticket = 0;
  313. OES = new ushort[oesLen];
  314. IEP = new ushort[iepLen];
  315. IEP_OES = new ushort[iepLen];
  316. RegionNum = 0;
  317. RegionData = new double[EpConst.DATA_LENGTH];
  318. TrendNum = 0;
  319. TrendData = new double[EpConst.DATA_LENGTH];
  320. }
  321. public CRawDataItem(int oesLen, int iepLen)
  322. {
  323. init(oesLen, iepLen);
  324. }
  325. public CRawDataItem(RawDataType type, int len = 1201)
  326. {
  327. var oesLen = type == RawDataType.IEP ? 0 : len;
  328. var iepLen = type == RawDataType.OES ? 0 : len;
  329. init(oesLen, iepLen);
  330. }
  331. public CRawDataItem(RawDataItem item, RawDataType type, int len = 1201)
  332. {
  333. var oesLen = type == RawDataType.IEP ? 0 : len;
  334. var iepLen = type == RawDataType.OES ? 0 : len;
  335. init(oesLen, iepLen);
  336. Buffer.BlockCopy(item.OES, 0, OES, 0, oesLen * sizeof(ushort));
  337. Buffer.BlockCopy(item.IEP_OES, 0, IEP_OES, 0, iepLen * sizeof(ushort));
  338. Buffer.BlockCopy(item.IEP, 0, IEP, 0, iepLen * sizeof(ushort));
  339. Buffer.BlockCopy(item.TrendData, 0, TrendData, 0, EpConst.DATA_SIZE);
  340. Buffer.BlockCopy(item.RegionData, 0, RegionData, 0, EpConst.DATA_SIZE);
  341. }
  342. }
  343. }