|
@@ -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();
|
|
|
}
|
|
|
}
|
|
|
}
|