zoulei 1 年之前
父節點
當前提交
bd1bcda416

+ 95 - 2
Service/CheckServer/AddIns/CheckHelper.cs

@@ -8,12 +8,68 @@ using System.Collections;
 using System.Collections.Generic;
 using XdCxRhDW.Dto;
 using System.Security.Policy;
+using System.Runtime.InteropServices;
+using DevExpress.Utils.Text.Internal;
+using System.Text;
 
 namespace CheckServer
 {
-   
+
     public static class CheckHelper
     {
+        enum SigFlag : int
+        {
+            BPSK = 1,
+            QPSK = 2
+        }
+
+        struct slot
+        {
+            public SigFlag sigflag;
+            public int start;
+            public int len;
+            public SigMod mode;
+            public double ps;//码元速率
+        };
+        enum SigMod : int
+        {
+            bp96_ccow = 0,
+            bp96_01 = 1,
+            bp96_02 = 2,
+            bp96_03 = 3,
+            bp96_04 = 4,
+
+            bp192_01 = 5,
+            bp192_02 = 6,
+            bp192_03 = 7,
+            qp16_01 = 8,
+            qp16_02 = 9,
+            qp16_03 = 10,
+            qp16_04 = 11,
+            qp16_05 = 12,
+            qp16_06 = 13,
+            qp16_07 = 14,
+            qp16_08 = 15,
+            qp16_09 = 16,
+        }
+
+
+        private const string dll = @"AddIns\PSignalCheck.dll";//张志明写的DAMA检测算法,根据特征码识别
+
+
+        #region cpp dll Interop 
+        [DllImport(dll, EntryPoint = "SigalEst", CallingConvention = CallingConvention.Cdecl)]
+        private extern static void SigalEst(string file, long fsHz, int[] smpStart, int[] smpCount, int[] modes, double[] rates, double[] ffcs, double[] snrs, int len);
+
+        [DllImport(dll, EntryPoint = "PSignalInit", CallingConvention = CallingConvention.Cdecl)]
+        private static extern bool PSignalInit();
+
+        [DllImport(dll, EntryPoint = "PSignalCheck", CallingConvention = CallingConvention.Cdecl)]
+        private static extern int PSignalCheck(String ifile, Int64 fsample, double snr, ref IntPtr signalslots);
+
+        [DllImport(dll, EntryPoint = "pSignalFree", CallingConvention = CallingConvention.Cdecl)]
+        private static extern void pSignalFree(IntPtr ipt);
+        #endregion
         public static async Task<IEnumerable<DmcResult>> DmcCheckAsync(string fileName, double fsHz, EnumSigCheckTypeDto dmcType, double? bandKHz = null)
         {
             if (bandKHz == null || bandKHz.Value <= 0) bandKHz = 25;
@@ -50,17 +106,54 @@ namespace CheckServer
                  dmp.StartInfo.RedirectStandardError = true;
                  dmp.StartInfo.RedirectStandardOutput = true;
                  dmp.StartInfo.UseShellExecute = false;
+                 StringBuilder sb = new StringBuilder();
+                 dmp.OutputDataReceived += (sender, e) =>
+                 {
+                     sb.AppendLine(e.Data);
+                 };
                  dmp.Start();
+                 dmp.BeginOutputReadLine();
                  Stopwatch stopWatch = new Stopwatch();
                  stopWatch.Start();
                  dmp.WaitForExit();
                  stopWatch.Stop();
                  TimeSpan ts = stopWatch.Elapsed;
-                 var str = dmp.StandardOutput.ReadToEnd();
+                 var str = sb.ToString();
                  return ConvertDmcResult(dmcType, str, ts.TotalMilliseconds);
              });
         }
 
+        public static async Task<IEnumerable<DmcResult>> DAMACheckAsync(string fileName, double fsHz, EnumSigCheckTypeDto dmcType, double? bandKHz = null)
+        {
+            var val = await Task.Run(() =>
+                   {
+                       Stopwatch stopWatch = new Stopwatch();
+                       stopWatch.Start();
+                       IntPtr res = IntPtr.Zero;
+                       PSignalInit();
+                       int rcount = PSignalCheck(fileName, (long)fsHz, 18, ref res);
+                       List<slot> rcontainer = new List<slot>();
+                       for (int idx = 0; idx < rcount; ++idx)
+                       {
+                           IntPtr tmp = IntPtr.Add(res, idx * Marshal.SizeOf<slot>());
+                           slot sl = Marshal.PtrToStructure<slot>(tmp);
+                           rcontainer.Add(sl);
+                       }
+
+                       pSignalFree(res);
+                       stopWatch.Stop();
+                       return rcontainer.Select(t => new DmcResult()
+                       {
+                           DmcType = dmcType.GetEnumDisplayName(),
+                           Length = t.len,
+                           Start = t.start,
+                           //UserName = t.mode.ToString(),
+                           Times = (int)stopWatch.ElapsedMilliseconds,
+                       });
+                   });
+            return val;
+        }
+
         private static IEnumerable<DmcResult> ConvertDmcResult(EnumSigCheckTypeDto type, string res, double tm)
         {
             var lines = res.Split(Environment.NewLine.ToArray(), StringSplitOptions.RemoveEmptyEntries);

二進制
Service/CheckServer/AddIns/PSignalCheck.dll


+ 80 - 0
Service/CheckServer/AddIns/PSignalCheck.h

@@ -0,0 +1,80 @@
+#pragma once
+
+#ifdef _WIN32
+# if defined(PSignalCheck_LIB)
+#  define PSignalCheck_EXPORT __declspec(dllexport)
+# else
+#  define PSignalCheck_EXPORT __declspec(dllimport)
+# endif
+#else
+#  define PSignalCheck_EXPORT
+#endif
+
+#define BPSK 1
+#define QPSK 2
+
+
+#define bp96_ccow 0
+#define bp96_01 1
+#define bp96_02 2
+#define bp96_03 3
+#define bp96_04 4
+#define bp192_01 5
+#define bp192_02 6
+#define bp192_03 7
+
+#define qp16_01 8
+#define qp16_02 9
+#define qp16_03 10
+#define qp16_04 11
+#define qp16_05 12
+#define qp16_06 13
+#define qp16_07 14
+#define qp16_08 15
+#define qp16_09 16
+
+struct slot
+{
+	slot() {}
+	slot(int s, int l, double p, int m, int sm)
+	{
+		start = s;
+		len = l;
+		ps = p;
+		mode = m;
+		sigflag = sm;
+	}
+	int sigflag;
+	int start;
+	int len;
+	int mode;
+	double ps;
+
+	bool operator < (const slot& item1) const
+	{
+		return start < item1.start;
+	}
+};
+
+extern "C"
+{
+	///
+	/// 初始化
+	///
+	PSignalCheck_EXPORT void PSignalInit();
+
+	///
+	/// fileName	: 输入文件
+	/// fsample		: 采样率
+	/// snr			: 门限
+	/// signalslots	: 输出
+	/// return		-1:数据读取失败
+	///				其他 返回个数
+	///
+	PSignalCheck_EXPORT int PSignalCheck(const char *fileName, __int64 fsample, double snr, slot **signalslots);
+
+	///
+	/// 清空开辟的空间
+	///
+	PSignalCheck_EXPORT void pSignalFree(slot *signalslots);
+};

+ 3 - 0
Service/CheckServer/App.config

@@ -10,6 +10,9 @@
 		<!--定位平台Http地址-->
 		<add key="PosPlatformAddr" value="http://127.0.0.1:8091" />
 
+		<!--使用老板本检测=1,使用新版本检测=2,老板本无结果时使用新版本=3-->
+		<add key="DamaVersion" value="1"/>
+
 	</appSettings>
 	<startup>
 		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />

+ 6 - 0
Service/CheckServer/CheckServer.csproj

@@ -229,6 +229,12 @@
   <ItemGroup>
     <None Include="AddIns\SignalProc.h" />
   </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\PSignalCheck.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\PSignalCheck.h" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PostBuildEvent>del DevExpress*.xml,EntityFramework*.xml,Serilog*.xml,Newtonsoft*.xml

+ 23 - 3
Service/CheckServer/Controllers/CheckController.cs

@@ -1,6 +1,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Configuration;
 using System.IO;
 using System.Linq;
 using System.Threading.Tasks;
@@ -26,7 +27,6 @@ namespace CheckServer.Controllers
         {
             try
             {
-                Serilog.Log.Information($"正在检测文件{dto.file1}");
                 dto.file1 = GetLocalFile(dto.file1);
                 List<DetectResDto> list = new List<DetectResDto>();
                 List<DmcResult> listRes = new List<DmcResult>();
@@ -35,8 +35,28 @@ namespace CheckServer.Controllers
                 List<DmcResult> kyResults = new List<DmcResult>();
                 if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.DAMA))
                 {
-                    var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
-                    dmcResults.AddRange(dmcResult);
+                    var damaVersion = ConfigurationManager.AppSettings["DamaVersion"];
+                    if (string.IsNullOrWhiteSpace(damaVersion) || damaVersion.Trim() == "1")
+                    {
+                        var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
+                        dmcResults.AddRange(dmcResult);
+                    }
+                    else if (damaVersion.Trim() == "2")
+                    {
+                        var dmcResult = await CheckHelper.DAMACheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
+                        dmcResults.AddRange(dmcResult);
+                    }
+                    else
+                    {
+                        var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
+                        dmcResults.AddRange(dmcResult);
+                        if (dmcResult == null || !dmcResult.Any())
+                        {
+                            var dmcResult2 = await CheckHelper.DAMACheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
+                            dmcResults.AddRange(dmcResult);
+                        }
+                    }
+                 
                 }
                 if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.IBS))
                 {

+ 1 - 1
XdCxRhDW.App/ExtensionsDev/MapControlEx.cs

@@ -3051,7 +3051,7 @@ public static class MapControlEx
                         {
                             suffix = ".jpg";
                         }
-                        imgUrl = $"{HttpServerAddr}/{LayerName}/{zoomLevel}/{tilePositionX}/{tilePositionY}{suffix}";
+                        imgUrl = $"{HttpServerAddr}/{LayerName}/{zoomLevel}/{tilePositionX}/{-tilePositionY}{suffix}";
                     }
                     //string imgUrl = string.Format("http://192.168.0.214:58089/{0}/{1}/{2}/{3}", (int)GoogleMapType.Normal, zoomLevel, tilePositionX, tilePositionY);
                     Uri u = new Uri(imgUrl);