瀏覽代碼

添加LED显示模块

yct 5 年之前
父節點
當前提交
77e184bb73
共有 20 個文件被更改,包括 2105 次插入498 次删除
  1. 1 1
      PLCLinker/PLCLinker/obj/Release/PLCLinker.csproj.CoreCompileInputs.cache
  2. 404 336
      PLCLinker/centralController/FormCentralController.Designer.cs
  3. 1 1
      PLCLinker/centralController/FormCentralController.cs
  4. 0 12
      PLCLinker/centralController/FormCentralController.resx
  5. 3 3
      PLCLinker/centralController/Monitor/Monitor.cs
  6. 0 1
      PLCLinker/centralController/Monitor/SystemInitializer.cs
  7. 2 2
      PLCLinker/centralController/NumMachine/NumMachine.cs
  8. 1067 0
      PLCLinker/centralController/allInOneMachine/Led5kSDK.cs
  9. 137 0
      PLCLinker/centralController/allInOneMachine/Program.cs
  10. 480 134
      PLCLinker/centralController/allInOneMachine/broadcastModule.cs
  11. 5 5
      PLCLinker/centralController/centralController.csproj
  12. 二進制
      PLCLinker/centralController/obj/Release/DesignTimeResolveAssemblyReferences.cache
  13. 二進制
      PLCLinker/centralController/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache
  14. 1 1
      PLCLinker/centralController/obj/Release/centralController.csproj.CoreCompileInputs.cache
  15. 4 2
      PLCLinker/centralController/obj/Release/centralController.csproj.FileListAbsolute.txt
  16. 二進制
      PLCLinker/centralController/obj/Release/centralController.csproj.GenerateResource.Cache
  17. 二進制
      PLCLinker/centralController/sdk/broadcast/DUCP.dll
  18. 二進制
      PLCLinker/centralController/sdk/broadcast/Led5kSDK.dll
  19. 二進制
      PLCLinker/centralController/sdk/broadcast/broadcastDLL.dll
  20. 二進制
      PLCLinker/centralController/sdk/broadcast/msvcr120d.dll

+ 1 - 1
PLCLinker/PLCLinker/obj/Release/PLCLinker.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-8b0c29bd7e29dd6f716140370526519f352b45b8
+87502a68a27e1cc27d81bb55af49bc180f1b8b08

文件差異過大導致無法顯示
+ 404 - 336
PLCLinker/centralController/FormCentralController.Designer.cs


+ 1 - 1
PLCLinker/centralController/FormCentralController.cs

@@ -462,7 +462,7 @@ namespace centralController
         {
             string disp = textBox1.Text;
             string audio = textBox2.Text;
-            Monitor.Monitor.allInOneMachine.DispForAWhile(0, disp, 10, 1, audio);
+            //Monitor.Monitor.allInOneMachine.DispForAWhile(0, disp, 10, 1, audio);
         }
 
         /// <summary>

+ 0 - 12
PLCLinker/centralController/FormCentralController.resx

@@ -117,9 +117,6 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="dotNetBarManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
   <metadata name="dataGridViewTextBoxColumn1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
@@ -147,9 +144,6 @@
   <metadata name="dataGridViewTextBoxColumn9.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
-  <metadata name="bar_bottom.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
   <metadata name="parkingRecordsID.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>True</value>
   </metadata>
@@ -180,12 +174,6 @@
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>37</value>
   </metadata>
-  <metadata name="bar_notification.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <metadata name="rtb_notification.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>

+ 3 - 3
PLCLinker/centralController/Monitor/Monitor.cs

@@ -1,5 +1,4 @@
-using allInOneMachine;
-using BroadcastModule;
+using BroadcastModule;
 using centralController.advert;
 using centralController.WebServer;
 using db;
@@ -62,7 +61,8 @@ namespace Monitor
         /// <summary>
         /// 显示板操作对象句柄
         /// </summary>
-        public static BroadcastLinker allInOneMachine;
+        public static BroadcastBoardManager allInOneMachine;
+
         public static string allInOneMachineIP { get; set; }
         public static int allInOneMachinePort { get; set; }
         /// <summary>

+ 0 - 1
PLCLinker/centralController/Monitor/SystemInitializer.cs

@@ -6,7 +6,6 @@ using System.Linq;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
-using allInOneMachine;
 using BroadcastModule;
 using centralController.advert;
 using centralController.model;

+ 2 - 2
PLCLinker/centralController/NumMachine/NumMachine.cs

@@ -515,8 +515,8 @@ namespace NumMachine
                             Log.WriteLog(LogType.process, LogFile.INFO, "号牌入队:" + node.LicenseNum);
                             if (Monitor.Monitor.allInOneMachine != null)
                             {
-                                Monitor.Monitor.allInOneMachine.DispForAWhile(2, node.LicenseNum, 25, 1, node.LicenseNum + ",入场");
-                                Monitor.Monitor.allInOneMachine.DispForAWhile(3, "号牌机编号:" + node.id, 25, 1, "");
+                                //Monitor.Monitor.allInOneMachine.DispForAWhile(2, node.LicenseNum, 25, 1, node.LicenseNum + ",入场");
+                                //Monitor.Monitor.allInOneMachine.DispForAWhile(3, "号牌机编号:" + node.id, 25, 1, "");
                             }
                         }
                     }

文件差異過大導致無法顯示
+ 1067 - 0
PLCLinker/centralController/allInOneMachine/Led5kSDK.cs


+ 137 - 0
PLCLinker/centralController/allInOneMachine/Program.cs

@@ -0,0 +1,137 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using ONNONLed5KSDKD;
+
+namespace BroadcastModule
+{
+    public class Program
+    {
+        public void MainTest(string[] args)
+        {
+            BroadcastBoardManager bbm = new BroadcastBoardManager();
+            uint handle = 0;
+            //addScreen 1 模式
+            if(bbm.AddScreen(0, Encoding.Default.GetBytes("192.168.0.17"),5005, Led5kSDK.bx_5k_card_type.BX_6K3_YY, 1, 2))
+            {
+                handle = bbm.boardList[bbm.boardList.Count - 1].boardParams.handle;
+            }
+            if (handle == 0)
+            {
+                Console.WriteLine("失败");
+                return;
+            }
+
+
+            //bb.RemoveDynamicAreas(handle);
+
+            ////第一行128*16显示文字,上下8像素留空
+            //bb.header_model.AreaWidth = 2;// 2=16/8
+            //bb.header_model.AreaHeight = 96;
+            //bb.header_model.AreaX = 8/8;
+            //bb.header_model.AreaY = 0;
+            //bb.header_model.SingleLine = 0x02;
+            //bb.header_model.NewLine = 0x02;
+            //bb.header_model.DisplayMode = 0x02;
+            //bb.header_model.StayTime = 2;
+            //bb.header_model.RunMode = 1;
+            //bb.header_model.Speed = 1;
+            ////bb.header_model.AreaY = 16;
+            //int areaNo = bb.AddDynamicArea(handle, bb.header_model);
+            //if (areaNo != -1)
+            //{
+            //    //bb.UpdateArea(handle, areaNo, Encoding.Default.GetBytes("\\C1温馨提示:请带好随\\C2身携带的物品," + "依次从\\C3后边门下车。\\n"));
+            //    bb.UpdateArea(handle, areaNo, Encoding.Default.GetBytes(""));
+            //}
+
+            ////第二、三行64*64显示一个指示标志
+            //bb.header_model.AreaWidth = 12;// 12=96/8
+            //bb.header_model.AreaHeight = 96;
+            //bb.header_model.SingleLine = 0x01;
+            //bb.header_model.NewLine = 0x01;
+            //bb.header_model.DisplayMode = 0x02;
+            //bb.header_model.StayTime = 5;
+            //bb.header_model.RunMode = 2;
+            //bb.header_model.AreaX = (32+16) / 8;
+            //bb.header_model.AreaY = 16;
+            //int area1 = bb.AddDynamicArea(handle, bb.header_model);
+            //if (area1 != -1)
+            //{
+            //    bb.UpdateArea(handle, area1, Encoding.Default.GetBytes("\\T001arrU64|"));
+            //    //updateList.Add(new AreaInfo(handle, area1, Encoding.Default.GetBytes(" ")));
+            //    //bb.UpdateArea(handle, areaNoArrU, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
+            //}
+            //////left
+            ////bb.header_model.AreaX = 0;
+            ////bb.header_model.AreaY = 0;
+            ////bb.header_model.AreaWidth = 8;// 8=64/8
+            ////bb.header_model.AreaHeight = 64;
+            ////int area2 = bb.AddDynamicArea(handle, bb.header_model);
+            ////if (area2 != -1)
+            ////{
+            ////    //updateList.Add(new AreaInfo(handle, area2, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|")));
+            ////    updateList.Add(new AreaInfo(handle, area2, Encoding.Default.GetBytes(" ")));
+            ////}
+
+            //string sentence = "温馨提示:请携带好随身物品,关闭车窗与车门,待所有人员离开车库后,再操作终端停车";
+            //List<string> sentenceContent = new List<string>();
+            //int i = 0;
+            //while(i < sentence.Length)
+            //{
+            //    if((i+6)%6==0)
+            //    {
+            //        if (i < sentence.Length - 5)
+            //        {
+            //            char[] temp = (sentence.Substring(i, 6)).ToCharArray();
+            //            temp = temp.Reverse().ToArray();
+            //            sentenceContent.Add(new String(temp));
+            //            i = i + 5;
+            //        }
+            //        else
+            //        {
+            //            sentenceContent.Add(new String(sentence.Substring(i).ToCharArray().Reverse().ToArray()));
+            //            break;
+            //        }
+            //    }
+            //    i++;
+            //}
+            //string[] dispContent = {"\\T001arrU64|", "\\T001arrD64|" , "\\T001arrL64|" , "\\T001arrR64|" };
+            ////string[] dispContent2 = { "\\T000arrU|", "\\T000arrD|", "\\T000arrL|", "\\T000arrR|" };
+
+            Task.Factory.StartNew(() =>
+            {
+                int count = 0;
+                int lightIndex = 0;
+                Random rnd = new Random(DateTime.Now.Millisecond);
+                bbm.boardList[0].UpdateText("温馨提示:请携带好随身物品,关闭车窗与车门,待所有人员离开车库后,再操作终端停车", 1);
+                lightIndex = rnd.Next(0, 4);
+                bbm.boardList[0].UpdateArrow(lightIndex);
+
+                while (count < 10000)
+                {
+                    
+                    //bb.UpdateArea(handle, areaNo, Encoding.Default.GetBytes(sentenceContent[count%sentenceContent.Count]));
+                    
+                    //bb.UpdateArea(handle, 1, Encoding.Default.GetBytes(dispContent[lightIndex]));
+
+                    //Console.WriteLine(areaNo + ", " + area1);
+                    //Console.WriteLine(dispContent[lightIndex]);
+                    //}
+                    //bb.UpdateArea(handle, 1, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
+                    //bb.UpdateArea(handle, 0, Encoding.Default.GetBytes("\\T000arrL|"));
+                    Thread.Sleep(1000);
+                    count++;
+                }
+            });
+            //bb.UpdateArea(handle, 2, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
+            //bb.UpdateArea(handle, 1, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
+            //bb.UpdateArea(handle, 0, Encoding.Default.GetBytes("\\T000arrL|"));
+
+            Console.ReadLine();
+            bbm.DestroyAll();
+        }
+    }
+}

+ 480 - 134
PLCLinker/centralController/allInOneMachine/broadcastModule.cs

@@ -1,183 +1,529 @@
 using System;
 using System.Collections.Generic;
-using System.Configuration;
 using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
-using BroadcastModule;
+using ONNONLed5KSDKD;
 
-namespace allInOneMachine
+namespace BroadcastModule
 {
-    public class BroadcastLinker
+    public class BroadcastBoardManager
     {
-        public static BroadcastLinker ins = new BroadcastLinker();
-        static BroadcastBoard board;
-        static string ip;
-        static int port;
-        static int minimumInterval = 5;
-        static DisplayedMsg[] displayedMsg = new DisplayedMsg[4];
-        static Queue<DisplayedMsg>[] msgQueue = new Queue<DisplayedMsg>[4];
-        static object msgLock = new object();
+        public List<BroadcastBoard> boardList;
+        public Led5kSDK.bx_5k_area_header header_model;
 
+        public BroadcastBoardManager()
+        {
+            header_model.AreaType = 0x06;
+            //横向偏移
+            header_model.AreaX = 0;
+            //纵向偏移
+            header_model.AreaY = 0;
+            //宽度,需将点数除以8
+            header_model.AreaWidth = 32 / 8;
+            //高度
+            header_model.AreaHeight = 32;
+            //0自动循环显示 1完成后停留在最后一页 2超时未完成删除该信息
+            header_model.RunMode = 0;
+            header_model.Reserved1 = 0;
+            header_model.Reserved2 = 0;
+            header_model.Reserved3 = 0;
+            //1静止显示 2快速打出 3向左移动 4向右移动 5向上移动 6向下移动
+            header_model.DisplayMode = 0x02;
+            header_model.ExitMode = 0x00;
+            //1快-24慢 
+            header_model.Speed = 5;
+            //多少个0.5s
+            header_model.StayTime = 6;
+            //1单行 2多行
+            header_model.SingleLine = 0x01;
+            //1手动换行 2自动
+            header_model.NewLine = 0x01;
+            header_model.Timeout = 2;
+        }
+
+        /// <summary>
+        /// 增加屏幕
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="led_ip"></param>
+        /// <param name="led_port"></param>
+        /// <param name="card_type"></param>
+        /// <param name="tmout_sec"></param>
+        /// <param name="mode"></param>
+        /// <returns></returns>
+        public bool AddScreen(int id, byte[] led_ip, uint led_port, Led5kSDK.bx_5k_card_type card_type, int tmout_sec, int mode)
+        {
+            uint hand = Led5kSDK.CreateClient(led_ip, led_port, card_type, tmout_sec, mode, null);
+            if (hand == 0)
+                return false;
+            else
+            {
+                BroadcastBoard bb = new BroadcastBoard(id, led_ip, led_port, card_type, hand);
+                bb.InitBoard(hand);
+                boardList.Add(bb);
+                return true;
+            }
+        }
         /// <summary>
-        /// 初始化单例
+        /// 关闭所有屏幕连接
         /// </summary>
-        public static void Start()
+        public void DestroyAll()
         {
-            Task.Factory.StartNew(() =>
+            foreach (BroadcastBoard bb in boardList)
             {
-                try
+                bb.RemoveDynamicAreas(bb.boardParams.handle);
+                Led5kSDK.Destroy(bb.boardParams.handle);
+            }
+        }
+        /// <summary>
+        /// 删除特定屏幕连接
+        /// </summary>
+        /// <param name="index"></param>
+        public void DestroyBoard(int index)
+        {
+            foreach (BroadcastBoard bb in boardList)
+            {
+                if (bb.boardParams.id == index)
                 {
-                    ip = ConfigurationManager.AppSettings["allInOneMachineIP"];
-                    port = Int32.Parse(ConfigurationManager.AppSettings["allInOneMachinePort"]);
-                    board = new BroadcastBoard(ip, port, 5);
-                    board.UpdateTime();
-                    //ins.VolumeControl(100);
-                    board.Play(0, BroadcastBoard.PlayMode.download, "欢迎光临");
-                    board.Play(1, BroadcastBoard.PlayMode.download, "智象停车");
-                    board.Play(2, BroadcastBoard.PlayMode.download, "date");
-                    board.Play(3, BroadcastBoard.PlayMode.download, "time");
-                    //ins.Refresh();
-                    board.Play(0, BroadcastBoard.PlayMode.audio, "欢迎光临");
-                    OriginState();
-                    for (int i = 0; i < 4; i++)
+                    bb.RemoveDynamicAreas(bb.boardParams.handle);
+                    Led5kSDK.Destroy(bb.boardParams.handle);
+                }
+            }
+        }
+        /// <summary>
+        /// 时间同步
+        /// </summary>
+        public bool UpdateTimeAll()
+        {
+            foreach (BroadcastBoard bb in boardList)
+            {
+                if (bb.boardParams.handle != 0)
+                {
+                    int err = ONNONLed5KSDKD.Led5kSDK.CON_SytemClockCorrect(bb.boardParams.handle);
+                    if (err != 0)
                     {
-                        displayedMsg[i] = null;
-                        msgQueue[i] = new Queue<DisplayedMsg>();
+                        return false;
                     }
                 }
-                catch (Exception e) { Console.WriteLine(e.Message); ins = null; }
-                Run();
-            });
+            }
+            return true;
+        }
+    }
+
+    public class BroadcastBoard
+    {
+        public BoardParams boardParams;
+        private Dictionary<uint, List<Led5kSDK.bx_5k_area_header>> handleDynamicAreasMap;
+        private int volume = 10;
+        public Led5kSDK.bx_5k_area_header header_model;
+        private object area1Lock;
+        private object area2Lock;
+        private string[] arrows = { "\\T001arrU64|", "\\T001arrD64|", "\\T001arrL64|", "\\T001arrR64|" };
+        //************************************************ 方法块 **************************************************
+        // *************** 公有方法 ***************
+        public BroadcastBoard(int id, byte[] ip, uint port, Led5kSDK.bx_5k_card_type card_type, uint handle)
+        {
+            handleDynamicAreasMap = new Dictionary<uint, List<Led5kSDK.bx_5k_area_header>>();
+            header_model = new Led5kSDK.bx_5k_area_header();
+            Led5kSDK.InitSdk(2, 2);
+            area1Lock = new object();
+            area2Lock = new object();
+            boardParams = new BoardParams(id, ip, port, card_type, handle);
         }
 
-        static void Run()
+        /// <summary>
+        /// 初始化控制板
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        public bool InitBoard(uint handle)
+        {
+            if (boardParams == null)
+                return false;
+            RemoveDynamicAreas(handle);
+
+            //第一行128*16显示文字,上下8像素留空
+            AreaInfo area1 = new AreaInfo(handle, 0, Encoding.Default.GetBytes(""));
+            area1.header.AreaWidth = 2;// 2=16/8
+            area1.header.AreaHeight = 96;
+            area1.header.AreaX = 8 / 8;
+            area1.header.AreaY = 0;
+            area1.header.SingleLine = 0x02;
+            area1.header.NewLine = 0x02;
+            area1.header.DisplayMode = 0x02;
+            area1.header.StayTime = 4;
+            area1.header.RunMode = 2;
+            area1.header.Speed = 2;
+            area1.header.Timeout = 5;
+            //bb.header_model.AreaY = 16;
+            area1.index = AddDynamicArea(handle, area1.header);
+            if (area1.index != -1)
+            {
+                UpdateArea(handle, area1.index, Encoding.Default.GetBytes(""));
+                boardParams.areas.Add(area1);
+            }
+            else
+            {
+                return false;
+            }
+
+            //第二、三行64*64显示一个指示标志
+            AreaInfo area2 = new AreaInfo(handle, 1, Encoding.Default.GetBytes(""));
+            area2.header.AreaWidth = 8;// 8=64/8
+            area2.header.AreaHeight = 64;
+            area2.header.SingleLine = 0x01;
+            area2.header.NewLine = 0x01;
+            area2.header.DisplayMode = 0x02;
+            area2.header.StayTime = 5;
+            area2.header.RunMode = 2;
+            area2.header.AreaX = (32 + 16) / 8;
+            area2.header.AreaY = 16;
+            area2.index = AddDynamicArea(handle, area2.header);
+            if (area2.index != -1)
+            {
+                UpdateArea(handle, area2.index, Encoding.Default.GetBytes(""));
+                boardParams.areas.Add(area2);
+                //bb.UpdateArea(handle, areaNoArrU, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
+            }
+            else
+            {
+                return false;
+            }
+
+            //顶角右偏32像素的16*16块专用于播放声音
+            AreaInfo areaSound = new AreaInfo(handle, 2, Encoding.Default.GetBytes(""));
+            areaSound.header.AreaWidth = 2;// 2=16/8
+            areaSound.header.AreaHeight = 16;
+            areaSound.header.SingleLine = 0x02;
+            areaSound.header.NewLine = 0x02;
+            areaSound.header.DisplayMode = 0x02;
+            areaSound.header.StayTime = 1;
+            areaSound.header.RunMode = 2;
+            areaSound.header.AreaX = 32 / 8;
+            areaSound.header.AreaY = 0;
+            areaSound.header.Speed = 4;
+            areaSound.index = AddDynamicArea(handle, areaSound.header);
+            if (areaSound.index != -1)
+            {
+                UpdateArea(handle, areaSound.index, Encoding.Default.GetBytes(""));
+                boardParams.areas.Add(areaSound);
+                //bb.UpdateArea(handle, areaNoArrU, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
+            }
+            else
+            {
+                return false;
+            }
+
+            return true;
+        }
+        /// <summary>
+        /// 更新第一块区域文字信息
+        /// </summary>
+        /// <param name="sentence"></param>
+        /// <param name="slice"></param>
+        public bool UpdateText(string sentence, int waitSec, int slice = 6)
         {
-            Task.Factory.StartNew(() =>
+            List<string> sentenceContent = new List<string>();
+            int i = 0;
+            if (boardParams.handle == 0 || boardParams.areas.Count<2)
+                return false;
+            while (i < sentence.Length)
+            {
+                if ((i + slice) % slice == 0)
+                {
+                    if (i < sentence.Length - slice + 1)
+                    {
+                        char[] temp = (sentence.Substring(i, slice)).ToCharArray();
+                        temp = temp.Reverse().ToArray();
+                        sentenceContent.Add(new String(temp));
+                        i = i + slice - 1;
+                    }
+                    else
+                    {
+                        sentenceContent.Add(new String(sentence.Substring(i).ToCharArray().Reverse().ToArray()));
+                        break;
+                    }
+                }
+                i++;
+            }
+            lock (area1Lock)
             {
-                while (true)
+                Task.Factory.StartNew(() =>
                 {
-                    lock (msgLock)
+                    int count = 0;
+                    UpdateArea(boardParams.handle, boardParams.areas[2].index, Encoding.Default.GetBytes(""),true, Encoding.Default.GetBytes(sentence));
+                    while (count < sentenceContent.Count)
                     {
-                        for (int i = 0; i < 4; i++)
+                        UpdateArea(boardParams.handle, boardParams.areas[0].index, Encoding.Default.GetBytes(sentenceContent[count]));
+                        Thread.Sleep(waitSec * 1000);
+                        count++;
+                    }
+                });
+            }
+            return true;
+        }
+        /// <summary>
+        /// 更新下方箭头显示
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        public bool UpdateArrow(int index)
+        {
+            if (index > 3)
+                return false;
+            if (boardParams.handle == 0 || boardParams.areas.Count < 2)
+                return false;
+            lock (area2Lock)
+            {
+                if (index < 0)
+                {
+                    UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(""));
+                }
+                else
+                {
+                    UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(arrows[index]));
+                }
+            }
+            return true;
+        }
+        /// <summary>
+        /// 删除某屏幕所有动态区
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <returns></returns>
+        public bool RemoveDynamicAreas(uint handle)
+        {
+            if (!handleDynamicAreasMap.ContainsKey(handle))
+            {
+                return false;
+            }
+            else
+            {
+                List<Led5kSDK.bx_5k_area_header> list;
+                handleDynamicAreasMap.TryGetValue(handle, out list);
+                int err = 0;
+                if (list != null)
+                {
+                    for (int i = 0; i < list.Count; i++)
+                    {
+                        err += Led5kSDK.SCREEN_DelDynamicArea(handle, (byte)i);
+                    }
+                }
+                return err == 0 ? true : false;
+            }
+        }
+        /// <summary>
+        /// 删除某屏幕特定编号的动态区
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        public bool RemoveDynamicAreas(uint handle, int index)
+        {
+            if (!handleDynamicAreasMap.ContainsKey(handle))
+            {
+                return false;
+            }
+            else
+            {
+                List<Led5kSDK.bx_5k_area_header> list;
+                handleDynamicAreasMap.TryGetValue(handle, out list);
+                int err = 0;
+                if (list != null)
+                {
+                    for (int i = 0; i < list.Count; i++)
+                    {
+                        if(list[i].DynamicAreaLoc == index)
                         {
-                            try
-                            {
-                                //若存在信息显示,则更新剩余时间,超时恢复默认状态
-                                if (displayedMsg[i] != null)
-                                {
-                                    int existTime = (int)(DateTime.Now - displayedMsg[i].enteringTime).TotalSeconds;
-                                    //有消息等待且最短时间间隔已过
-                                    if (msgQueue[i].Count != 0 && existTime > minimumInterval)
-                                    {
-                                        displayedMsg[i] = msgQueue[i].Dequeue();
-                                        displayedMsg[i].enteringTime = DateTime.Now;
-                                        board.Play(displayedMsg[i].winID, BroadcastBoard.PlayMode.temporary, displayedMsg[i].str, 3);
-                                        if (displayedMsg[i].audio != "")
-                                        {
-                                            board.Play(0, BroadcastBoard.PlayMode.audio, displayedMsg[i].audio);
-                                        }
-                                    }
-                                    //判断消息剩余时间,不足则恢复默认
-                                    else
-                                    {
-                                        int timeLeft = displayedMsg[i].delay - existTime;
-                                        if (timeLeft <= 0)
-                                        {
-                                            if (displayedMsg[i].switchMode == 1)
-                                                board.Play(displayedMsg[i].winID, BroadcastBoard.PlayMode.readBuffer, "", 0, 0);
-                                            else if (displayedMsg[i].switchMode == 2)
-                                                OriginState();
-                                            displayedMsg[i] = null;
-                                        }
-                                    }
-                                }
-                                else if (msgQueue[i].Count != 0)
-                                {
-                                    displayedMsg[i] = msgQueue[i].Dequeue();
-                                    displayedMsg[i].enteringTime = DateTime.Now;
-                                    board.Play(displayedMsg[i].winID, BroadcastBoard.PlayMode.temporary, displayedMsg[i].str, 3);
-                                    if (displayedMsg[i].audio != "")
-                                    {
-                                        board.Play(0, BroadcastBoard.PlayMode.audio, displayedMsg[i].audio);
-                                    }
-                                }
-                            }
-                            catch (Exception e) { Console.WriteLine("更新异常," + e.Message); }
+                            err = Led5kSDK.SCREEN_DelDynamicArea(handle, list[i].DynamicAreaLoc);
+                            return true;
                         }
-
                     }
-                    Thread.Sleep(500);
                 }
-            });
+                return err == 0 ? true : false;
+            }
         }
 
-        public void DispForAWhile(int winID, string str, int delay, int switchMode, string audio)
+        // *************** 私有方法 ***************
+        /// <summary>
+        /// 增加动态区
+        /// </summary>
+        /// <param name="handle"></param>
+        /// <param name="header"></param>
+        private int AddDynamicArea(uint handle, Led5kSDK.bx_5k_area_header header)
         {
-            if (ins != null)
+            List<Led5kSDK.bx_5k_area_header> list;
+            if (!handleDynamicAreasMap.ContainsKey(handle))
+            {
+                list = new List<Led5kSDK.bx_5k_area_header>();
+                list.Add(header);
+                header.DynamicAreaLoc = 0;
+                handleDynamicAreasMap.Add(handle, list);
+                return 0;
+            }
+            else
             {
-                lock (msgLock)
+                handleDynamicAreasMap.TryGetValue(handle, out list);
+                if (list != null)
                 {
-                    DisplayedMsg msg = new DisplayedMsg(winID, str, delay, switchMode, audio);
-                    try
+                    int no = list[list.Count - 1].DynamicAreaLoc + 1;
+                    header.DynamicAreaLoc = (byte)(no);
+                    list.Add(header);
+                    return no;
+                }
+                return -1;
+            }
+        }
+        /// <summary>
+        /// 动态区域更新函数
+        /// </summary>
+        /// <param name="i"></param>
+        private bool UpdateArea(uint handle, int index, byte[] areaText)
+        {
+            int err = -1;
+            List<Led5kSDK.bx_5k_area_header> list;
+            if (!handleDynamicAreasMap.ContainsKey(handle))
+            {
+                return false;
+            }
+            else
+            {
+                handleDynamicAreasMap.TryGetValue(handle, out list);
+                if (list != null)
+                {
+                    for (int i = 0; i < list.Count; i++)
                     {
-                        if (msgQueue[winID] != null)
+                        if (index == list[i].DynamicAreaLoc)
                         {
-                            msgQueue[winID].Enqueue(msg);
+                            Led5kSDK.bx_5k_area_header temp = list[i];
+                            temp.DataLen = areaText.Length;
+                            err = Led5kSDK.SCREEN_SendDynamicArea(handle, temp, (ushort)temp.DataLen, areaText);
+                            break;
                         }
                     }
-                    catch { Console.WriteLine("入队异常"); }
+                    if (err == 0)
+                        return true;
+                    else
+                        return false;
                 }
-                //ins.Play(winID, BroadcastBoard.PlayMode.temporary, str, 1);
-                //Task.Factory.StartNew(() =>
-                //{
-                //    if (switchMode == 1)
-                //    {
-                //        Thread.Sleep(delay * 1000);
-                //        ins.Play(winID, BroadcastBoard.PlayMode.readBuffer, "", 0, 0);
-                //    }
-                //    else if (switchMode == 2)
-                //    {
-                //        Thread.Sleep(delay * 1000);
-                //        OriginState();
-                //    }
-                //});
+                else
+                    return false;
             }
         }
-
-        static void OriginState()
+        /// <summary>
+        /// 动态区域更新函数
+        /// </summary>
+        /// <param name="i"></param>
+        private bool UpdateArea(uint handle, int index, byte[] areaText, bool soundOnly, byte[] soundText)
         {
-            if (ins != null)
+            int err = -1;
+            List<Led5kSDK.bx_5k_area_header> list;
+            if (!handleDynamicAreasMap.ContainsKey(handle))
             {
-                board.Play(0, BroadcastBoard.PlayMode.readBuffer, "", 0, 0);
-                board.Play(1, BroadcastBoard.PlayMode.readBuffer, "", 0, 0);
-                board.Play(2, BroadcastBoard.PlayMode.readBuffer, "", 0, 0);
-                board.Play(3, BroadcastBoard.PlayMode.readBuffer, "", 0, 0);
+                return false;
+            }
+            else
+            {
+                handleDynamicAreasMap.TryGetValue(handle, out list);
+                if (list != null)
+                {
+                    for (int i = 0; i < list.Count; i++)
+                    {
+                        if (index == list[i].DynamicAreaLoc)
+                        {
+                            Led5kSDK.bx_5k_area_header temp = list[i];
+                            temp.DataLen = areaText.Length;
+                            if(!soundOnly)
+                                err = Led5kSDK.SCREEN_SendSoundDynamicArea(handle, temp, (ushort)temp.DataLen, areaText, 2, 0, 10, 5, soundText.Length, soundText);
+                            else
+                                err = Led5kSDK.SCREEN_SendSoundDynamicArea(handle, temp, 0, Encoding.Default.GetBytes(""), 2, 0, 1, 5, soundText.Length, soundText);
+                            break;
+                        }
+                    }
+                    if (err == 0)
+                        return true;
+                    else
+                        return false;
+                }
+                else
+                    return false;
             }
         }
 
-        private class DisplayedMsg
-        {
-            public string str;
-            public string audio;
-            public int winID;
-            public int delay;
-            /// <summary>
-            /// 播放完成后处理方式,0不做操作,1当前恢复默认,2整体恢复默认
-            /// </summary>
-            public int switchMode;
-            public DateTime enteringTime;
+        ///// <summary>
+        ///// 播放方法
+        ///// </summary>
+        ///// <param name="winID">显示屏窗口ID</param>
+        ///// <param name="mode">播放模式</param>
+        ///// <param name="str">待显示或播语音字符串,输入“date”或“time”分别显示日期与时间</param>
+        ///// <param name="time">保持时间</param>
+        ///// <param name="fieldID">存储块ID</param>
+        ///// <param name="startIndex">开始下标</param>
+        ///// <param name="endIndex">结束下标</param>
+        //public void Play(int winID, PlayMode mode, string str, int time = 0, int fieldID = 0, int startIndex = 0, int endIndex = 0)
+        //{
+        //    switch (mode)
+        //    {
+        //        case PlayMode.temporary:
+        //            DispString(winID, str, time);
+        //            break;
+        //        case PlayMode.download:
+        //            DownloadString(winID, str, fieldID);
+        //            break;
+        //        case PlayMode.readBuffer:
+        //            DispDownStr(winID, fieldID);
+        //            break;
+        //        case PlayMode.delete:
+        //            DelFile(winID, startIndex, endIndex);
+        //            break;
+        //        case PlayMode.audio:
+        //            AudioPlay(str);
+        //            break;
+        //    }
+        //}
+    }
 
-            public DisplayedMsg(int winID, string str, int delay, int switchMode, string audio)
-            {
-                this.winID = winID;
-                this.str = str;
-                this.delay = delay;
-                this.switchMode = switchMode;
-                this.audio = audio;
-                enteringTime = DateTime.Now;
-            }
+    public class BoardParams
+    {
+        public int id;
+        public byte[] ip;
+        public uint port;
+        public Led5kSDK.bx_5k_card_type card_type;
+        public uint handle;
+        public List<AreaInfo> areas;
+        public BoardParams(int id, byte[] ip, uint port, Led5kSDK.bx_5k_card_type card_type, uint handle)
+        {
+            this.id = id;
+            this.ip = ip;
+            this.port = port;
+            this.card_type = card_type;
+            this.handle = handle;
+            areas = new List<AreaInfo>();
+        }
+    }
+
+    public class AreaInfo
+    {
+        public uint winHandle;
+        public int index;
+        public bool display;
+        public byte[] text;
+        public Led5kSDK.bx_5k_area_header header;
+        public AreaInfo(uint handle, int index, byte[] text)
+        {
+            this.winHandle = handle;
+            this.index = index;
+            this.text = text.ToArray();
+            header = new Led5kSDK.bx_5k_area_header();
+        }
+        public override string ToString()
+        {
+            return winHandle + ", " + index + ", " + display + ", " + text.ToList().ToString();
         }
     }
 }

+ 5 - 5
PLCLinker/centralController/centralController.csproj

@@ -37,10 +37,6 @@
     <ApplicationIcon>icon.ico</ApplicationIcon>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="broadcastDLL, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>sdk\broadcast\broadcastDLL.dll</HintPath>
-    </Reference>
     <Reference Include="db, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>sdk\mysql\db.dll</HintPath>
@@ -170,6 +166,8 @@
   <ItemGroup>
     <Compile Include="advert\AdvertManager.cs" />
     <Compile Include="allInOneMachine\broadcastModule.cs" />
+    <Compile Include="allInOneMachine\Led5kSDK.cs" />
+    <Compile Include="allInOneMachine\Program.cs" />
     <Compile Include="entity\AbstractMessage.cs" />
     <Compile Include="entity\Jsonhelper.cs" />
     <Compile Include="FormAboutUs.cs">
@@ -374,7 +372,9 @@
     <None Include="resource\image\map\car.png" />
     <Content Include="icon.ico" />
     <None Include="resource\image\icon.png" />
-    <Content Include="sdk\broadcast\broadcastDLL.dll" />
+    <Content Include="sdk\broadcast\Led5kSDK.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
     <Content Include="sdk\log4net\log4net.dll" />
     <Content Include="sdk\mysql\MySql.Data.dll" />
     <Content Include="sdk\PLC\PLCS7.dll" />

二進制
PLCLinker/centralController/obj/Release/DesignTimeResolveAssemblyReferences.cache


二進制
PLCLinker/centralController/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache


+ 1 - 1
PLCLinker/centralController/obj/Release/centralController.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-1894c814d0c0ce0d40c4a43d30ae54298a837fad
+3398d78de3fcc3fdbcb3ec2b3ec2c74f125bb553

+ 4 - 2
PLCLinker/centralController/obj/Release/centralController.csproj.FileListAbsolute.txt

@@ -181,7 +181,6 @@ E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonit
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\centralController.exe.config
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\centralController.exe
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\centralController.pdb
-E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\broadcastDLL.dll
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\db.dll
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\DevComponents.DotNetBar.Schedule.dll
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\DevComponents.DotNetBar.SuperGrid.dll
@@ -260,7 +259,10 @@ E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonit
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csproj.CopyComplete
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.exe
 E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.pdb
-E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojResolveAssemblyReference.cache
 E:\superScene\智能停车项目\智能停车项目v2.0\PLCLinker\centralController\obj\Release\centralController.FormAboutUs.resources
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.FormAboutUs.resources
 C:\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojAssemblyReference.cache
+E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.FormAboutUs.resources
+E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\broadcast\Led5kSDK.dll
+E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\bin\Release\sdk\VZ_Sdk\iDecoders.dll
+E:\superScene\智能停车项目\智能停车项目\智能泊车系统\parkMonitorV2\parkMonitor_V2.0\PLCLinker\centralController\obj\Release\centralController.csprojResolveAssemblyReference.cache

二進制
PLCLinker/centralController/obj/Release/centralController.csproj.GenerateResource.Cache


二進制
PLCLinker/centralController/sdk/broadcast/DUCP.dll


二進制
PLCLinker/centralController/sdk/broadcast/Led5kSDK.dll


二進制
PLCLinker/centralController/sdk/broadcast/broadcastDLL.dll


二進制
PLCLinker/centralController/sdk/broadcast/msvcr120d.dll