URMAnalysisProcessV3.cs 20 KB

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