123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580 |
- using System;
- using System.Collections.Generic;
- 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 ONNONLed5KSDKD;
- namespace BroadcastModule
- {
- public class BroadcastBoardManager
- {
- public List<BroadcastBoard> boardList;
- public Led5kSDK.bx_5k_area_header header_model;
- public BroadcastBoardManager()
- {
- header_model = new Led5kSDK.bx_5k_area_header();
- 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;
- Led5kSDK.InitSdk(2, 2);
- boardList = new List<BroadcastBoard>();
- //初始化时启动连接检查线程
- Task.Factory.StartNew(() =>
- {
- while (!Monitor.Monitor.isClosing)
- {
- foreach (BroadcastBoard bb in boardList)
- {
- bb.CheckConnection();
- }
- Thread.Sleep(5000);
- }
- });
- }
- /// <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);
- BroadcastBoard bb = new BroadcastBoard(id, led_ip, led_port, card_type, hand);
- if (hand == 0)
- {
- boardList.Add(bb);
- return false;
- }
- else
- {
- bb.connected = true;
- bb.InitBoard(hand);
- boardList.Add(bb);
- return true;
- }
- }
- /// <summary>
- /// 关闭所有屏幕连接
- /// </summary>
- public void DestroyAll()
- {
- foreach (BroadcastBoard bb in boardList)
- {
- 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)
- {
- 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)
- {
- return false;
- }
- }
- }
- return true;
- }
- }
- public class BroadcastBoard
- {
- public BoardParams boardParams;
- public bool connected;
- 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();
- area1Lock = new object();
- area2Lock = new object();
- boardParams = new BoardParams(id, ip, port, card_type, handle);
- }
- /// <summary>
- /// 检查连接状态
- /// </summary>
- /// <returns></returns>
- public bool CheckConnection()
- {
- int count = 3;
- int result = -1;
- while (count > 0)
- {
- if (boardParams.handle != 0)
- {
- result = Led5kSDK.CON_PING(boardParams.handle);
- Console.WriteLine("屏幕ping结果: " + result);
- if (result == 0)
- break;
- }
- else
- {
- boardParams.handle = Led5kSDK.CreateClient(boardParams.ip, boardParams.port, boardParams.card_type, 1, 2, null);
- }
- count--;
- if (count == 0 && result != 0 && boardParams.handle != 0)
- {
- Led5kSDK.Destroy(boardParams.handle);
- boardParams.handle = 0;
- }
- }
- connected = (result == 0 ? true : false);
- return connected;
- }
- /// <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)
- {
- 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)
- {
- Task.Factory.StartNew(() =>
- {
- int count = 0;
- UpdateArea(boardParams.handle, boardParams.areas[2].index, Encoding.Default.GetBytes(""), true, Encoding.Default.GetBytes(sentence));
- while (count < sentenceContent.Count)
- {
- 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)
- {
- err = Led5kSDK.SCREEN_DelDynamicArea(handle, list[i].DynamicAreaLoc);
- return true;
- }
- }
- }
- return err == 0 ? true : false;
- }
- }
- // *************** 私有方法 ***************
- /// <summary>
- /// 增加动态区
- /// </summary>
- /// <param name="handle"></param>
- /// <param name="header"></param>
- private int AddDynamicArea(uint handle, Led5kSDK.bx_5k_area_header header)
- {
- 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
- {
- handleDynamicAreasMap.TryGetValue(handle, out list);
- if (list != null)
- {
- 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 (index == list[i].DynamicAreaLoc)
- {
- Led5kSDK.bx_5k_area_header temp = list[i];
- temp.DataLen = areaText.Length;
- err = Led5kSDK.SCREEN_SendDynamicArea(handle, temp, (ushort)temp.DataLen, areaText);
- break;
- }
- }
- if (err == 0)
- return true;
- else
- return false;
- }
- else
- return false;
- }
- }
- /// <summary>
- /// 动态区域更新函数
- /// </summary>
- /// <param name="i"></param>
- private bool UpdateArea(uint handle, int index, byte[] areaText, bool soundOnly, byte[] soundText)
- {
- 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 (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, 1, 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;
- }
- }
- ///// <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 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();
- }
- }
- }
|