URMAnalysisProcessV3.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. using System;
  2. using System.IO;
  3. using System.Runtime.InteropServices;
  4. using Vinno.Infrastructure;
  5. using System.Diagnostics;
  6. using System.IO.MemoryMappedFiles;
  7. using System.Threading;
  8. using Vinno.DataManager.Utilities;
  9. using Vinno.DataTypes;
  10. using WingServerCommon.Log;
  11. using Logger = WingServerCommon.Log.Logger;
  12. namespace WingAIDiagnosisService.URMManage
  13. {
  14. public class URMAnalysisProcess
  15. {
  16. private bool initSrMain;
  17. private int _urmwidth;
  18. private int _urmheight;
  19. private int aviFrames;
  20. private URMAnalysisModeRecord _urmModeRecord;
  21. private Process _SRLibWrapperProcess;
  22. private MemoryMappedFile _file;
  23. string mapName = "VinnoSrResultV1";
  24. private ManualResetEvent signal = new ManualResetEvent(false);
  25. private int urmStabilizer = 0;
  26. private static URMAnalysisProcess instance;
  27. private bool _processFlag = false;
  28. private static readonly bool Debug = false;
  29. public URMAnalysisProcess()
  30. {
  31. mapName = Guid.NewGuid().ToString("N");
  32. _SRLibWrapperProcess = new Process();
  33. var analyzeHostName = Path.Combine(ServiceManager.RootPath, "URM", "net6.0", "SRLibWrapper.exe");
  34. //if (!VinnoFile.Exists(analyzeHostName) || !DigitalSignatureChecker.VerifySignature(analyzeHostName))
  35. //{
  36. // Logger.WriteLineErrorIf(Debug, "SRLibWrapper.exe not found or signature is invalid.");
  37. //}
  38. var startInfo = new ProcessStartInfo
  39. {
  40. FileName = analyzeHostName,
  41. Arguments = $"",
  42. CreateNoWindow = true,
  43. UseShellExecute = false,
  44. RedirectStandardOutput = true,
  45. RedirectStandardInput = true,
  46. RedirectStandardError = true,
  47. };
  48. _SRLibWrapperProcess.StartInfo = startInfo;
  49. _SRLibWrapperProcess.Start();
  50. _SRLibWrapperProcess.OutputDataReceived += OutputHandler;
  51. _SRLibWrapperProcess.ErrorDataReceived += OutputHandler;
  52. _SRLibWrapperProcess.BeginOutputReadLine();
  53. _SRLibWrapperProcess.BeginErrorReadLine();
  54. }
  55. ~URMAnalysisProcess()
  56. {
  57. ProcessDispose();
  58. }
  59. public void ProcessDispose()
  60. {
  61. try
  62. {
  63. if (_file != null)
  64. _file.Dispose();
  65. WingServerCommon.Log.Logger.WriteLineInfo($"URMAnalysisProcess ProcessDispose start, HasExited:{_SRLibWrapperProcess?.HasExited}");
  66. // Console.WriteLine($"URMAnalysisProcess ProcessDispose start, HasExited:{_SRLibWrapperProcess?.HasExited}");
  67. if (_SRLibWrapperProcess != null && !_SRLibWrapperProcess.HasExited)
  68. {
  69. _SRLibWrapperProcess?.Kill();
  70. _SRLibWrapperProcess?.Dispose();
  71. }
  72. }
  73. catch (Exception ex)
  74. {
  75. WingServerCommon.Log.Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisProcess ProcessDispose error, ex:{ex}");
  76. // Console.WriteLine($"AIDiagnosisService URMAnalysisProcess ProcessDispose error, ex:{ex}");
  77. }
  78. }
  79. public static URMAnalysisProcess GetInstance()
  80. {
  81. if (instance == null)
  82. {
  83. instance = new URMAnalysisProcess();
  84. }
  85. return instance;
  86. }
  87. private void OutputHandler(object sender, DataReceivedEventArgs e)
  88. {
  89. try
  90. {
  91. if (!string.IsNullOrEmpty(e.Data))
  92. {
  93. if (!e.Data.Contains("SRLibLog"))
  94. return;
  95. var infos = e.Data.Split(',');
  96. if (!string.IsNullOrEmpty(infos[1]))
  97. {
  98. _processFlag = true;
  99. switch (infos[1])
  100. {
  101. case "step1ok":
  102. var needmemorysize = long.Parse(infos[2]);
  103. Logger.WriteLineInfo($"Akio step1ok needmemorysize is {needmemorysize}");
  104. if (_file != null)
  105. _file.Dispose();
  106. _file = MemoryMappedFile.CreateNew(mapName, needmemorysize,
  107. MemoryMappedFileAccess.ReadWrite);
  108. var step2info = "Step2," + mapName;
  109. _SRLibWrapperProcess.StandardInput.WriteLine(step2info);
  110. break;
  111. case "step2ok":
  112. Logger.WriteLineInfo("Akio step2ok");
  113. signal.Set();
  114. break;
  115. case "SRLibFail":
  116. _processFlag = false;
  117. signal.Set();
  118. Logger.WriteLineError("AKio " + e.Data);
  119. break;
  120. }
  121. }
  122. }
  123. }
  124. catch (Exception ex)
  125. {
  126. WingServerCommon.Log.Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisProcess OutputHandler error, ex:{ex}");
  127. }
  128. }
  129. public bool URMAnalysis(string urmFold, URMAnalysisModeRecord urmModeRecord)
  130. {
  131. using (new AutoPerformance("Akio:URMAnalysisProcess"))
  132. {
  133. signal.Reset();
  134. if (ResourceManager.GetValue("Product-GeneralSpecification", "UrmParamLogOut", false))
  135. {
  136. Logger.WriteLineInfo("Matlab " + urmFold);
  137. }
  138. if (_SRLibWrapperProcess.HasExited)
  139. {
  140. var analyzeHostName = Path.Combine(ServiceManager.RootPath, "URM", "net6.0", "SRLibWrapper.exe");
  141. //if (!VinnoFile.Exists(analyzeHostName) || !DigitalSignatureChecker.VerifySignature(analyzeHostName))
  142. //{
  143. // Logger.WriteLineErrorIf(Debug, "SRLibWrapper.exe not found or signature is invalid.");
  144. //}
  145. var startInfo = new ProcessStartInfo
  146. {
  147. FileName = analyzeHostName,
  148. Arguments = $"",
  149. CreateNoWindow = true,
  150. UseShellExecute = false,
  151. RedirectStandardOutput = true,
  152. RedirectStandardInput = true,
  153. RedirectStandardError = true,
  154. };
  155. _SRLibWrapperProcess.StartInfo = startInfo;
  156. _SRLibWrapperProcess.Start();
  157. _SRLibWrapperProcess.OutputDataReceived += OutputHandler;
  158. _SRLibWrapperProcess.ErrorDataReceived += OutputHandler;
  159. _SRLibWrapperProcess.BeginOutputReadLine();
  160. }
  161. _urmModeRecord = urmModeRecord;
  162. //_mode = Mode;
  163. // TODO 通过接口传入 urmStabilizer 的值
  164. //urmStabilizer = (int)_mode.Parameters.GetItem<FloatParameter>(RecordParams.URMStabilizer).Value;
  165. var step1info = "Step1," + urmStabilizer.ToString() + "," + urmFold;
  166. _SRLibWrapperProcess.StandardInput.WriteLine(step1info);
  167. int alltime = 0;
  168. while (alltime < 1800000)
  169. {
  170. if (!signal.WaitOne(5000))
  171. {
  172. alltime += 5000;
  173. if (_SRLibWrapperProcess.HasExited)
  174. {
  175. _processFlag = false;
  176. signal.Set();
  177. break;
  178. }
  179. }
  180. else
  181. {
  182. break;
  183. }
  184. }
  185. if (signal.WaitOne() && !_SRLibWrapperProcess.HasExited)
  186. {
  187. if (_processFlag)
  188. URMAnalysis();
  189. }
  190. else
  191. {
  192. Logger.WriteLineError("Akio:URMAnalysisi TimeOut Or _SRLibWrapperProcess not exit");
  193. }
  194. if (_file != null)
  195. _file.Dispose();
  196. return _processFlag;
  197. }
  198. }
  199. public bool URMAnalysis()
  200. {
  201. RecordNativeArray maskArray = new RecordNativeArray(0);
  202. using (var accessor = _file.CreateViewAccessor(0, 0))
  203. {
  204. IntPtr accessorptr = accessor.SafeMemoryMappedViewHandle.DangerousGetHandle();
  205. unsafe
  206. {
  207. var pointptr = (byte*)accessorptr.ToPointer();
  208. if (urmStabilizer < 2)
  209. {
  210. int packets = *(int*)pointptr;
  211. pointptr += sizeof(int);
  212. _urmwidth = *(int*)pointptr;
  213. pointptr += sizeof(int);
  214. _urmheight = *(int*)pointptr;
  215. pointptr += sizeof(int);
  216. aviFrames = *(int*)pointptr;
  217. pointptr += sizeof(int);
  218. if (packets <= 0 || _urmwidth <= 0 || _urmheight <= 0 || aviFrames <= 0)
  219. {
  220. return false;
  221. }
  222. var res = _urmModeRecord.URMRes;
  223. var scaleofx = *(float*)pointptr * res;
  224. pointptr += sizeof(float);
  225. var scaleofy = *(float*)pointptr * res;
  226. pointptr += sizeof(float);
  227. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_x, scaleofx);
  228. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_y, scaleofy);
  229. _urmModeRecord.URMScaleOfPixel_x = scaleofx;
  230. _urmModeRecord.URMScaleOfPixel_y = scaleofy;
  231. maskArray.Resize(_urmwidth * _urmheight * sizeof(byte));
  232. Buffer.MemoryCopy(pointptr, maskArray.Start.ToPointer(), _urmwidth * _urmheight * sizeof(byte), _urmwidth * _urmheight * sizeof(byte));
  233. pointptr += _urmwidth * _urmheight * sizeof(byte);
  234. RecordNativeArray matout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  235. Buffer.MemoryCopy(pointptr, matout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  236. pointptr += _urmwidth * _urmheight * sizeof(double);
  237. RecordNativeArray matdirout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  238. Buffer.MemoryCopy(pointptr, matdirout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  239. pointptr += _urmwidth * _urmheight * sizeof(double);
  240. RecordNativeArray matvelout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  241. Buffer.MemoryCopy(pointptr, matvelout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  242. pointptr += _urmwidth * _urmheight * sizeof(double);
  243. RecordNativeArray matangleout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  244. Buffer.MemoryCopy(pointptr, matangleout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  245. pointptr += _urmwidth * _urmheight * sizeof(double);
  246. Logger.WriteLineInfo($"Akio:_urmBeams is {_urmwidth},_urmSamples is {_urmheight},packets is {packets}");
  247. //_urmModeRecord.SetParameter(RecordParams.URMDenArray, matout, TimeStamp.ErrorTime);
  248. //_urmModeRecord.SetParameter(RecordParams.URMDirArray, matdirout, TimeStamp.ErrorTime);
  249. //_urmModeRecord.SetParameter(RecordParams.URMVelArray, matvelout, TimeStamp.ErrorTime);
  250. //_urmModeRecord.SetParameter(RecordParams.URMAngleImgArray, matangleout, TimeStamp.ErrorTime);
  251. //_urmModeRecord.SetParameter(RecordParams.URMMask, maskArray, TimeStamp.ErrorTime);
  252. //_urmModeRecord.SetParameter(RecordParams.URMSrcHeight, _urmheight, TimeStamp.ErrorTime);
  253. //_urmModeRecord.SetParameter(RecordParams.URMSrcWidth, _urmwidth, TimeStamp.ErrorTime);
  254. _urmModeRecord.URMDenArray = matout; // RecordNativeArray
  255. _urmModeRecord.URMDirArray = matdirout; // RecordNativeArray
  256. _urmModeRecord.URMVelArray = matvelout; // RecordNativeArray
  257. _urmModeRecord.URMAngleImgArray = matangleout; // RecordNativeArray
  258. _urmModeRecord.URMMask = maskArray; // RecordNativeArray
  259. _urmModeRecord.URMSrcHeight = _urmheight; // int
  260. _urmModeRecord.URMSrcWidth = _urmwidth; // int
  261. int[] PointNumList = new int[aviFrames];
  262. for (int i = 0; i < aviFrames; i++)
  263. {
  264. PointNumList[i] = *(int*)pointptr;
  265. pointptr += sizeof(int);
  266. }
  267. var AllPointNum = *(int*)pointptr;
  268. pointptr += sizeof(int);
  269. var pointsArray = new URMPoint[AllPointNum];
  270. int sizeOfPoint = Marshal.SizeOf<URMPoint>();
  271. int totalSize = sizeOfPoint * AllPointNum;
  272. fixed (URMPoint* PointsArrayptr = pointsArray)
  273. {
  274. Buffer.MemoryCopy(pointptr, PointsArrayptr, totalSize, totalSize);
  275. }
  276. //_urmModeRecord.SetParameter(RecordParams.URMPoints, pointsArray, TimeStamp.ErrorTime);
  277. //_urmModeRecord.SetParameter(RecordParams.URMPointNums, PointNumList, TimeStamp.ErrorTime);
  278. _urmModeRecord.URMPoints = pointsArray; // URMPoint[]
  279. _urmModeRecord.URMPointNums = PointNumList; // int[]
  280. }
  281. else
  282. {
  283. _urmwidth = *(int*)pointptr;
  284. pointptr += sizeof(int);
  285. _urmheight = *(int*)pointptr;
  286. pointptr += sizeof(int);
  287. aviFrames = *(int*)pointptr;
  288. pointptr += sizeof(int);
  289. if (_urmwidth <= 0 || _urmheight <= 0 || aviFrames <= 0)
  290. {
  291. return false;
  292. }
  293. //var res = _urmModeRecord.GetParameter(RecordParams.URMRes, 10.0);
  294. var res = _urmModeRecord.URMRes;
  295. var scaleofx = *(float*)pointptr * res;
  296. pointptr += sizeof(float);
  297. var scaleofy = *(float*)pointptr * res;
  298. pointptr += sizeof(float);
  299. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_x, scaleofx);
  300. //_urmModeRecord.SetParameter(RecordParams.URMScaleOfPixel_y, scaleofy);
  301. _urmModeRecord.URMScaleOfPixel_x = scaleofx;
  302. _urmModeRecord.URMScaleOfPixel_y = scaleofy;
  303. maskArray.Resize(_urmwidth * _urmheight * sizeof(byte));
  304. Buffer.MemoryCopy(pointptr, maskArray.Start.ToPointer(), _urmwidth * _urmheight * sizeof(byte), _urmwidth * _urmheight * sizeof(byte));
  305. pointptr += _urmwidth * _urmheight * sizeof(byte);
  306. RecordNativeArray matangleout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  307. Buffer.MemoryCopy(pointptr, matangleout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  308. pointptr += _urmwidth * _urmheight * sizeof(double);
  309. RecordNativeArray matout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  310. Buffer.MemoryCopy(pointptr, matout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  311. pointptr += _urmwidth * _urmheight * sizeof(double);
  312. RecordNativeArray matdirout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  313. Buffer.MemoryCopy(pointptr, matdirout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  314. pointptr += _urmwidth * _urmheight * sizeof(double);
  315. RecordNativeArray matvelout = new RecordNativeArray(_urmwidth * _urmheight * sizeof(double));
  316. Buffer.MemoryCopy(pointptr, matvelout.Start.ToPointer(), _urmwidth * _urmheight * sizeof(double), _urmwidth * _urmheight * sizeof(double));
  317. pointptr += _urmwidth * _urmheight * sizeof(double);
  318. Logger.WriteLineInfo($"Akio:_urmBeams is {_urmwidth},_urmSamples is {_urmheight}");
  319. //_urmModeRecord.SetParameter(RecordParams.URMDenArray, matout, TimeStamp.ErrorTime);
  320. //_urmModeRecord.SetParameter(RecordParams.URMDirArray, matdirout, TimeStamp.ErrorTime);
  321. //_urmModeRecord.SetParameter(RecordParams.URMVelArray, matvelout, TimeStamp.ErrorTime);
  322. //_urmModeRecord.SetParameter(RecordParams.URMAngleImgArray, matangleout, TimeStamp.ErrorTime);
  323. //_urmModeRecord.SetParameter(RecordParams.URMMask, maskArray, TimeStamp.ErrorTime);
  324. //_urmModeRecord.SetParameter(RecordParams.URMSrcHeight, _urmheight, TimeStamp.ErrorTime);
  325. //_urmModeRecord.SetParameter(RecordParams.URMSrcWidth, _urmwidth, TimeStamp.ErrorTime);
  326. _urmModeRecord.URMDenArray = matout; // RecordNativeArray
  327. _urmModeRecord.URMDirArray = matdirout; // RecordNativeArray
  328. _urmModeRecord.URMVelArray = matvelout; // RecordNativeArray
  329. _urmModeRecord.URMAngleImgArray = matangleout; // RecordNativeArray
  330. _urmModeRecord.URMMask = maskArray; // RecordNativeArray
  331. _urmModeRecord.URMSrcHeight = _urmheight; // int
  332. _urmModeRecord.URMSrcWidth = _urmwidth;
  333. int[] PointNumList = new int[aviFrames];
  334. for (int i = 0; i < aviFrames; i++)
  335. {
  336. PointNumList[i] = *(int*)pointptr;
  337. pointptr += sizeof(int);
  338. }
  339. var AllPointNum = *(int*)pointptr;
  340. pointptr += sizeof(int);
  341. var pointsArray = new URMPoint[AllPointNum];
  342. int sizeOfPoint = Marshal.SizeOf<URMPoint>();
  343. int totalSize = sizeOfPoint * AllPointNum;
  344. fixed (URMPoint* PointsArrayptr = pointsArray)
  345. {
  346. Buffer.MemoryCopy(pointptr, PointsArrayptr, totalSize, totalSize);
  347. }
  348. //_urmModeRecord.SetParameter(RecordParams.URMPoints, pointsArray, TimeStamp.ErrorTime);
  349. //_urmModeRecord.SetParameter(RecordParams.URMPointNums, PointNumList, TimeStamp.ErrorTime);
  350. _urmModeRecord.URMPoints = pointsArray; // URMPoint[]
  351. _urmModeRecord.URMPointNums = PointNumList; // int[]
  352. }
  353. }
  354. }
  355. return true;
  356. }
  357. }
  358. }