StubFuncs_FactoryCommand.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.IO;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using UESTC.Auto.SCPIManager;
  8. using Uestc.Auto6.Dso.Hardware.Calibration.Data.Base;
  9. using Uestc.Auto6.Dso.ComModel;
  10. using Uestc.Auto6.Dso.Core;
  11. using Uestc.Auto6.Dso.Core.Hardware;
  12. using CalibrationData = Uestc.Auto6.Dso.Hardware.Calibration.Data.Base;
  13. namespace Uestc.Auto6.Dso.Scpi
  14. {
  15. partial class StubFunc
  16. {
  17. public static readonly List<string> AnalogInputSource = new List<string>() { "BNC", "SMA" };
  18. private static string ConvertParamToString(SCPICommandProcessFuncParam analyResult)
  19. {
  20. StringBuilder sb = new StringBuilder();
  21. if (analyResult.Params != null)
  22. {
  23. bool bFirst = true;
  24. foreach (byte[] param in analyResult.Params)
  25. {
  26. if (!bFirst)
  27. sb.Append(",");
  28. if (param != null)
  29. {
  30. foreach (byte b in param)
  31. {
  32. char c = (char)b;
  33. if (c != ' ' && c != '\r' && c != '\n')
  34. sb.Append(c);
  35. }
  36. }
  37. bFirst = false;
  38. }
  39. }
  40. return sb.ToString();
  41. }
  42. private static void PushCaliDataChangedHdCmd(CaliDataType caliDataType)
  43. {
  44. lock (CaliDataManager.DataChangedCaliDataType)
  45. {
  46. if (!CaliDataManager.DataChangedCaliDataType.Contains(caliDataType))
  47. CaliDataManager.DataChangedCaliDataType.Add(caliDataType);
  48. }
  49. CalibrationPrsnt.Push(HdCmd.CaliDataChanged);
  50. }
  51. public static bool scpiQuy_FPGA_Version(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  52. {
  53. sendMessage.IsDataBlock = false;
  54. sendMessage.SendData = System.Text.Encoding.UTF8.GetBytes(ExportHdFuncs.GetAllFPGAVersionInfo());
  55. return true;
  56. }
  57. public static bool scpiQuy_FPGA_WriteVersion(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  58. {
  59. sendMessage.IsDataBlock = false;
  60. sendMessage.SendData = System.Text.Encoding.UTF8.GetBytes(ExportHdFuncs.GetAllFPGAVersionInfo());
  61. return true;
  62. }
  63. public static bool scpiQuy_FPGA_AllWriteRegisterValue(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  64. {
  65. sendMessage.IsDataBlock = false;
  66. sendMessage.SendData = System.Text.Encoding.UTF8.GetBytes(ExportHdFuncs.ReadbackAllWritedRegisterValue());
  67. return true;
  68. }
  69. public static bool scpiSet_FPGA_WriteRegister(SCPICommandProcessFuncParam analyResult)
  70. {
  71. string paramStr = ConvertParamToString(analyResult);
  72. string[] paramList = paramStr.Split(',');
  73. if (paramList.Length < 3)
  74. return false;
  75. if (!UInt32.TryParse(paramList[0], out UInt32 addr))
  76. return false;
  77. if (!UInt32.TryParse(paramList[1], out UInt32 data))
  78. return false;
  79. bool bIsAcq = paramList[2] == "1" ? true : false;
  80. return ExportHdFuncs.FPGARegister_WriteValue(addr, data, bIsAcq);
  81. }
  82. #region 校准数据
  83. public static bool scpiQuy_CaliData_Get(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  84. {
  85. sendMessage.IsDataBlock = true;
  86. sendMessage.SendData = CalibrationData.Helper.GetICaliData((CaliDataType)analyResult.ChannelIndex).Serialize();
  87. PrintDebug(ConvertInputData(analyResult), ConvertOutputData(sendMessage.SendData, true));
  88. return true;
  89. }
  90. private static byte[] bigCaliData = new byte[16 * 1024 * 1024];
  91. private static CaliDataType lastCaliDataType = CaliDataType.None;
  92. private static int bigCaliDataIndex = 0;
  93. public static bool scpiSet_CaliData_Set(SCPICommandProcessFuncParam analyResult)
  94. {
  95. PrintDebug(ConvertInputData(analyResult), null);
  96. if (lastCaliDataType == CaliDataType.None)
  97. {
  98. bigCaliDataIndex = 0;
  99. lastCaliDataType = (CaliDataType)analyResult.ChannelIndex;
  100. }
  101. if (analyResult.Params[0].Length == 0)
  102. {
  103. //File.WriteAllBytes($@"d:\recved.bin", bigCaliData);
  104. CaliDataType caliDataType = (CaliDataType)analyResult.ChannelIndex;
  105. if (caliDataType != CaliDataType.DbiCoefficientsTables)
  106. CalibrationData.Helper.GetICaliData(caliDataType).Deserialize(bigCaliData);
  107. else
  108. DbiCoefficientsTables.Default.Deserialize(CaliDataManager.LastChangedDataType, bigCaliData);
  109. PushCaliDataChangedHdCmd(caliDataType);
  110. lastCaliDataType = CaliDataType.None;
  111. bigCaliDataIndex = 0;
  112. }
  113. else
  114. {
  115. byte[] data = ConvertBinDataFromScpiData(analyResult.Params[0]);
  116. Array.Copy(data, 0, bigCaliData, bigCaliDataIndex, data.Length);
  117. bigCaliDataIndex += data.Length;
  118. }
  119. return true;
  120. }
  121. public static bool scpiSet_CaliData_SaveToFile(SCPICommandProcessFuncParam analyResult)
  122. {
  123. PrintDebug(ConvertInputData(analyResult), null);
  124. CaliDataType caliDataType = (CaliDataType)analyResult.ChannelIndex;
  125. CalibrationData.Helper.GetICaliData(caliDataType).SaveToFile();
  126. //PushCaliDataChangedHdCmd(caliDataType);
  127. return true;
  128. }
  129. public static bool scpiSet_CaliData_LoadFromFile(SCPICommandProcessFuncParam analyResult)
  130. {
  131. PrintDebug(ConvertInputData(analyResult), null);
  132. CaliDataType caliDataType= (CaliDataType)analyResult.ChannelIndex;
  133. CalibrationData.Helper.GetICaliData(caliDataType).LoadFromFile();
  134. PushCaliDataChangedHdCmd(caliDataType);
  135. return true;
  136. }
  137. #endregion
  138. #region 波形数据
  139. public static bool scpiQuy_Factory_GetWaveData_Adc(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  140. {
  141. if (ExportHdFuncs.TakeAdcWaveform(out List<List<ushort>> waveData))
  142. {
  143. MemoryStream memoryStream = new MemoryStream();
  144. for (int coreIndex = 0; coreIndex < waveData.Count; coreIndex++)
  145. {
  146. foreach (ushort s in waveData[coreIndex])
  147. memoryStream.Write(BitConverter.GetBytes(s));
  148. }
  149. sendMessage.IsDataBlock = true;
  150. sendMessage.SendData = memoryStream.ToArray();
  151. memoryStream.Close();
  152. PrintDebug(ConvertInputData(analyResult), ConvertOutputData(sendMessage.SendData, true));
  153. return true;
  154. }
  155. else
  156. return false;
  157. }
  158. public static bool scpiQuy_Factory_TakeSpecialBinData(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  159. {
  160. string paramStr = ConvertParamToString(analyResult);
  161. if (ExportHdFuncs.TakeSpecialBinData(paramStr,out byte[] CapturedData))
  162. {
  163. MemoryStream memoryStream = new MemoryStream();
  164. memoryStream.Write(CapturedData);
  165. sendMessage.IsDataBlock = true;
  166. sendMessage.SendData = memoryStream.ToArray();
  167. memoryStream.Close();
  168. return true;
  169. }
  170. else
  171. return false;
  172. }
  173. public static bool scpiQuy_Factory_GetWaveData_Channel(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  174. {
  175. if (ExportHdFuncs.TakeChannelWaveform(out List<List<ushort>> waveData))
  176. {
  177. MemoryStream memoryStream = new MemoryStream();
  178. for (int channelIndex = 0; channelIndex < waveData.Count; channelIndex++)
  179. {
  180. foreach (ushort s in waveData[channelIndex])
  181. memoryStream.Write(BitConverter.GetBytes(s));
  182. }
  183. sendMessage.IsDataBlock = true;
  184. sendMessage.SendData = memoryStream.ToArray();
  185. memoryStream.Close();
  186. PrintDebug(ConvertInputData(analyResult), ConvertOutputData(sendMessage.SendData, true));
  187. return true;
  188. }
  189. else
  190. return false;
  191. }
  192. #endregion
  193. #region 厂家校准用逻辑参数
  194. public static bool scpiQuy_FactoryCaliLogicValue(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  195. {
  196. sendMessage.SendData = System.Text.Encoding.UTF8.GetBytes(ExportHdFuncs.FactoryCaliScpiProc_LogicValue_Get());
  197. return true;
  198. }
  199. public static bool scpiSet_FactoryCaliLogicValue(SCPICommandProcessFuncParam analyResult)
  200. {
  201. string paramStr = ConvertParamToString(analyResult);
  202. return ExportHdFuncs.FactoryCaliScpiProc_LogicValue_Set(paramStr);
  203. }
  204. #endregion 厂家校准用逻辑参数
  205. #region 厂家校准用特殊数据
  206. public static bool scpiQuy_FactoryCaliSpecialData(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  207. {
  208. string paramStr = ConvertParamToString(analyResult);
  209. sendMessage.SendData = System.Text.Encoding.UTF8.GetBytes(ExportHdFuncs.FactoryCaliScpiProc_SpecialData_Get(paramStr));
  210. return true;
  211. }
  212. public static bool scpiSet_FactoryCaliSpecialData(SCPICommandProcessFuncParam analyResult)
  213. {
  214. string paramStr = ConvertParamToString(analyResult);
  215. return ExportHdFuncs.FactoryCaliScpiProc_SpecialData_Set(paramStr);
  216. }
  217. public static bool scpiQuy_FactoryCaliSpecialReadBackAdcRegister(SCPICommandProcessFuncParam analyResult, ref SCPISendMessage sendMessage)
  218. {
  219. string paramStr = ConvertParamToString(analyResult);
  220. sendMessage.SendData = System.Text.Encoding.UTF8.GetBytes(ExportHdFuncs.ReadbackAdcRegisterData());
  221. return true;
  222. }
  223. public static bool scpiSet_FactoryCaliApplySource(SCPICommandProcessFuncParam analyResult)
  224. {
  225. bool TryGetScaleIndex(int valueByuV, out Core.AnaChnlScaleIndex scaleIndex)
  226. {
  227. scaleIndex = Core.AnaChnlScaleIndex.Lv1;
  228. for (int i = 0; i < AnalogChanneScaleDefine.PhyChCoarseLevelTableByuV.Count; i++)
  229. {
  230. if (AnalogChanneScaleDefine.PhyChCoarseLevelTableByuV[i] == valueByuV)
  231. {
  232. scaleIndex = (Core.AnaChnlScaleIndex)i;
  233. return true;
  234. }
  235. }
  236. return false;
  237. }
  238. string paramStr = ConvertParamToString(analyResult);
  239. string[] paramList = paramStr.Split(',');
  240. //打开[0,1],幅度档(mv数),基线位置[0],耦合[0=DC,1=AC,2=DC50],阻抗[0=1M,1=50],带宽限制[0=关闭,1=20M,2=100M],偏置[mv数],探头倍率[枚举],反向[0=off,1=on],单位[0=V,1=A]
  241. // 0 1 2 3 4 5 6 7 8 9
  242. if (Presenter.TryGetChannel((ChannelId)(analyResult.ChannelIndex - 1), out var ch))
  243. {
  244. AnalogPrsnt anaChnlPrsnt = (AnalogPrsnt)ch;
  245. anaChnlPrsnt.Active = paramList[0] == "1";
  246. double scaleBymV = double.Parse(paramList[1]);
  247. if (TryGetScaleIndex((int)(scaleBymV * 1_000), out Core.AnaChnlScaleIndex scaleIndex))
  248. anaChnlPrsnt.ScaleIndex = (int)scaleIndex;
  249. anaChnlPrsnt.Coupling = (AnaChnlCoupling)int.Parse(paramList[3]);
  250. anaChnlPrsnt.PosIndexBymDiv = double.Parse(paramList[2]);
  251. anaChnlPrsnt.Bandwidth = paramList[5] switch
  252. {
  253. "0" => 0,//AnaChnlBandwidth.Full,
  254. "1" => 1,//AnaChnlBandwidth.Bw20MHz,
  255. "2" => 2,//AnaChnlBandwidth.Bw500MHz,
  256. _ => 0//AnaChnlBandwidth.Full
  257. };
  258. anaChnlPrsnt.Bias = double.Parse(paramList[6]) * 1000; //mV==>uV
  259. anaChnlPrsnt.IsInverted = (paramList[8] == "1");
  260. }
  261. else
  262. return false;
  263. return true;
  264. }
  265. public static bool scpiSet_FactoryCaliApplyAllSource(SCPICommandProcessFuncParam analyResult)
  266. {
  267. bool TryGetScaleIndex(int valueByuV, out Core.AnaChnlScaleIndex scaleIndex)
  268. {
  269. scaleIndex = Core.AnaChnlScaleIndex.Lv1;
  270. for (int i = 0; i < AnalogChanneScaleDefine.PhyChCoarseLevelTableByuV.Count; i++)
  271. {
  272. if (AnalogChanneScaleDefine.PhyChCoarseLevelTableByuV[i] == valueByuV)
  273. {
  274. scaleIndex = (Core.AnaChnlScaleIndex)i;
  275. return true;
  276. }
  277. }
  278. return false;
  279. }
  280. string paramStr = ConvertParamToString(analyResult);
  281. string[] paramList = paramStr.Split(',');
  282. //打开[0,1],幅度档(mv数),基线位置[0],耦合[直流1M、交流、DC50OM,枚举],阻抗[0=1M_om,1=5O_om],带宽限制[0=关闭,1=20M,2=100M],偏置[mv数],探头倍率[枚举],反向[0=off,1=on],单位[0=V,1=A]
  283. // 0 1 2 3 4 5 6 7 8 9
  284. double scaleBymV = double.Parse(paramList[1]);
  285. if (!TryGetScaleIndex((int)(scaleBymV * 1_000), out Core.AnaChnlScaleIndex scaleIndex))
  286. return false;
  287. AnaChnlCoupling anaChnlCoupling = (AnaChnlCoupling)int.Parse(paramList[3]);
  288. Int32 anaChnlBandwidth = paramList[5] switch
  289. {
  290. "0" => 0,//AnaChnlBandwidth.Full,
  291. "1" => 1,//AnaChnlBandwidth.Bw20MHz,
  292. "2" => 2,//AnaChnlBandwidth.Bw500MHz,
  293. _ => 0//AnaChnlBandwidth.Full
  294. };
  295. double bias = double.Parse(paramList[6]) * 1000; //mV==>uV
  296. bool IsInverted = (paramList[8] == "1");
  297. bool bActive = paramList[0] == "1";
  298. double posIndex = double.Parse(paramList[2]);
  299. for (ChannelId channelId = ChannelId.C1; channelId < ChannelId.C1 + ChannelIdExt.AnaChnlNum; channelId++)
  300. {
  301. if (Presenter.TryGetChannel(channelId, out var ch))
  302. {
  303. AnalogPrsnt anaChnlPrsnt = (AnalogPrsnt)ch;
  304. try
  305. {
  306. anaChnlPrsnt.Active = bActive;
  307. anaChnlPrsnt.Coupling = anaChnlCoupling;
  308. anaChnlPrsnt.ScaleIndex = (int)scaleIndex;
  309. anaChnlPrsnt.PosIndexBymDiv = posIndex;
  310. anaChnlPrsnt.Bandwidth = anaChnlBandwidth;
  311. anaChnlPrsnt.Bias = bias;
  312. anaChnlPrsnt.IsInverted = IsInverted;
  313. }
  314. catch
  315. {
  316. }
  317. }
  318. }
  319. return true;
  320. }
  321. #endregion 厂家校准用特殊数据
  322. }
  323. }