broadcastModule.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using ONNONLed5KSDKD;
  11. namespace BroadcastModule
  12. {
  13. public class BroadcastBoardManager
  14. {
  15. public List<BroadcastBoard> boardList;
  16. public Led5kSDK.bx_5k_area_header header_model;
  17. public BroadcastBoardManager()
  18. {
  19. header_model.AreaType = 0x06;
  20. //横向偏移
  21. header_model.AreaX = 0;
  22. //纵向偏移
  23. header_model.AreaY = 0;
  24. //宽度,需将点数除以8
  25. header_model.AreaWidth = 32 / 8;
  26. //高度
  27. header_model.AreaHeight = 32;
  28. //0自动循环显示 1完成后停留在最后一页 2超时未完成删除该信息
  29. header_model.RunMode = 0;
  30. header_model.Reserved1 = 0;
  31. header_model.Reserved2 = 0;
  32. header_model.Reserved3 = 0;
  33. //1静止显示 2快速打出 3向左移动 4向右移动 5向上移动 6向下移动
  34. header_model.DisplayMode = 0x02;
  35. header_model.ExitMode = 0x00;
  36. //1快-24慢
  37. header_model.Speed = 5;
  38. //多少个0.5s
  39. header_model.StayTime = 6;
  40. //1单行 2多行
  41. header_model.SingleLine = 0x01;
  42. //1手动换行 2自动
  43. header_model.NewLine = 0x01;
  44. header_model.Timeout = 2;
  45. }
  46. /// <summary>
  47. /// 增加屏幕
  48. /// </summary>
  49. /// <param name="id"></param>
  50. /// <param name="led_ip"></param>
  51. /// <param name="led_port"></param>
  52. /// <param name="card_type"></param>
  53. /// <param name="tmout_sec"></param>
  54. /// <param name="mode"></param>
  55. /// <returns></returns>
  56. public bool AddScreen(int id, byte[] led_ip, uint led_port, Led5kSDK.bx_5k_card_type card_type, int tmout_sec, int mode)
  57. {
  58. uint hand = Led5kSDK.CreateClient(led_ip, led_port, card_type, tmout_sec, mode, null);
  59. if (hand == 0)
  60. return false;
  61. else
  62. {
  63. BroadcastBoard bb = new BroadcastBoard(id, led_ip, led_port, card_type, hand);
  64. bb.InitBoard(hand);
  65. boardList.Add(bb);
  66. return true;
  67. }
  68. }
  69. /// <summary>
  70. /// 关闭所有屏幕连接
  71. /// </summary>
  72. public void DestroyAll()
  73. {
  74. foreach (BroadcastBoard bb in boardList)
  75. {
  76. bb.RemoveDynamicAreas(bb.boardParams.handle);
  77. Led5kSDK.Destroy(bb.boardParams.handle);
  78. }
  79. }
  80. /// <summary>
  81. /// 删除特定屏幕连接
  82. /// </summary>
  83. /// <param name="index"></param>
  84. public void DestroyBoard(int index)
  85. {
  86. foreach (BroadcastBoard bb in boardList)
  87. {
  88. if (bb.boardParams.id == index)
  89. {
  90. bb.RemoveDynamicAreas(bb.boardParams.handle);
  91. Led5kSDK.Destroy(bb.boardParams.handle);
  92. }
  93. }
  94. }
  95. /// <summary>
  96. /// 时间同步
  97. /// </summary>
  98. public bool UpdateTimeAll()
  99. {
  100. foreach (BroadcastBoard bb in boardList)
  101. {
  102. if (bb.boardParams.handle != 0)
  103. {
  104. int err = ONNONLed5KSDKD.Led5kSDK.CON_SytemClockCorrect(bb.boardParams.handle);
  105. if (err != 0)
  106. {
  107. return false;
  108. }
  109. }
  110. }
  111. return true;
  112. }
  113. }
  114. public class BroadcastBoard
  115. {
  116. public BoardParams boardParams;
  117. private Dictionary<uint, List<Led5kSDK.bx_5k_area_header>> handleDynamicAreasMap;
  118. private int volume = 10;
  119. public Led5kSDK.bx_5k_area_header header_model;
  120. private object area1Lock;
  121. private object area2Lock;
  122. private string[] arrows = { "\\T001arrU64|", "\\T001arrD64|", "\\T001arrL64|", "\\T001arrR64|" };
  123. //************************************************ 方法块 **************************************************
  124. // *************** 公有方法 ***************
  125. public BroadcastBoard(int id, byte[] ip, uint port, Led5kSDK.bx_5k_card_type card_type, uint handle)
  126. {
  127. handleDynamicAreasMap = new Dictionary<uint, List<Led5kSDK.bx_5k_area_header>>();
  128. header_model = new Led5kSDK.bx_5k_area_header();
  129. Led5kSDK.InitSdk(2, 2);
  130. area1Lock = new object();
  131. area2Lock = new object();
  132. boardParams = new BoardParams(id, ip, port, card_type, handle);
  133. }
  134. /// <summary>
  135. /// 初始化控制板
  136. /// </summary>
  137. /// <param name="handle"></param>
  138. /// <returns></returns>
  139. public bool InitBoard(uint handle)
  140. {
  141. if (boardParams == null)
  142. return false;
  143. RemoveDynamicAreas(handle);
  144. //第一行128*16显示文字,上下8像素留空
  145. AreaInfo area1 = new AreaInfo(handle, 0, Encoding.Default.GetBytes(""));
  146. area1.header.AreaWidth = 2;// 2=16/8
  147. area1.header.AreaHeight = 96;
  148. area1.header.AreaX = 8 / 8;
  149. area1.header.AreaY = 0;
  150. area1.header.SingleLine = 0x02;
  151. area1.header.NewLine = 0x02;
  152. area1.header.DisplayMode = 0x02;
  153. area1.header.StayTime = 4;
  154. area1.header.RunMode = 2;
  155. area1.header.Speed = 2;
  156. area1.header.Timeout = 5;
  157. //bb.header_model.AreaY = 16;
  158. area1.index = AddDynamicArea(handle, area1.header);
  159. if (area1.index != -1)
  160. {
  161. UpdateArea(handle, area1.index, Encoding.Default.GetBytes(""));
  162. boardParams.areas.Add(area1);
  163. }
  164. else
  165. {
  166. return false;
  167. }
  168. //第二、三行64*64显示一个指示标志
  169. AreaInfo area2 = new AreaInfo(handle, 1, Encoding.Default.GetBytes(""));
  170. area2.header.AreaWidth = 8;// 8=64/8
  171. area2.header.AreaHeight = 64;
  172. area2.header.SingleLine = 0x01;
  173. area2.header.NewLine = 0x01;
  174. area2.header.DisplayMode = 0x02;
  175. area2.header.StayTime = 5;
  176. area2.header.RunMode = 2;
  177. area2.header.AreaX = (32 + 16) / 8;
  178. area2.header.AreaY = 16;
  179. area2.index = AddDynamicArea(handle, area2.header);
  180. if (area2.index != -1)
  181. {
  182. UpdateArea(handle, area2.index, Encoding.Default.GetBytes(""));
  183. boardParams.areas.Add(area2);
  184. //bb.UpdateArea(handle, areaNoArrU, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
  185. }
  186. else
  187. {
  188. return false;
  189. }
  190. //顶角右偏32像素的16*16块专用于播放声音
  191. AreaInfo areaSound = new AreaInfo(handle, 2, Encoding.Default.GetBytes(""));
  192. areaSound.header.AreaWidth = 2;// 2=16/8
  193. areaSound.header.AreaHeight = 16;
  194. areaSound.header.SingleLine = 0x02;
  195. areaSound.header.NewLine = 0x02;
  196. areaSound.header.DisplayMode = 0x02;
  197. areaSound.header.StayTime = 1;
  198. areaSound.header.RunMode = 2;
  199. areaSound.header.AreaX = 32 / 8;
  200. areaSound.header.AreaY = 0;
  201. areaSound.header.Speed = 4;
  202. areaSound.index = AddDynamicArea(handle, areaSound.header);
  203. if (areaSound.index != -1)
  204. {
  205. UpdateArea(handle, areaSound.index, Encoding.Default.GetBytes(""));
  206. boardParams.areas.Add(areaSound);
  207. //bb.UpdateArea(handle, areaNoArrU, Encoding.Default.GetBytes("\\T000arrL|\\n\\T000arrU|\\n\\T000arrR|\\n\\T000arrD|"));
  208. }
  209. else
  210. {
  211. return false;
  212. }
  213. return true;
  214. }
  215. /// <summary>
  216. /// 更新第一块区域文字信息
  217. /// </summary>
  218. /// <param name="sentence"></param>
  219. /// <param name="slice"></param>
  220. public bool UpdateText(string sentence, int waitSec, int slice = 6)
  221. {
  222. List<string> sentenceContent = new List<string>();
  223. int i = 0;
  224. if (boardParams.handle == 0 || boardParams.areas.Count<2)
  225. return false;
  226. while (i < sentence.Length)
  227. {
  228. if ((i + slice) % slice == 0)
  229. {
  230. if (i < sentence.Length - slice + 1)
  231. {
  232. char[] temp = (sentence.Substring(i, slice)).ToCharArray();
  233. temp = temp.Reverse().ToArray();
  234. sentenceContent.Add(new String(temp));
  235. i = i + slice - 1;
  236. }
  237. else
  238. {
  239. sentenceContent.Add(new String(sentence.Substring(i).ToCharArray().Reverse().ToArray()));
  240. break;
  241. }
  242. }
  243. i++;
  244. }
  245. lock (area1Lock)
  246. {
  247. Task.Factory.StartNew(() =>
  248. {
  249. int count = 0;
  250. UpdateArea(boardParams.handle, boardParams.areas[2].index, Encoding.Default.GetBytes(""),true, Encoding.Default.GetBytes(sentence));
  251. while (count < sentenceContent.Count)
  252. {
  253. UpdateArea(boardParams.handle, boardParams.areas[0].index, Encoding.Default.GetBytes(sentenceContent[count]));
  254. Thread.Sleep(waitSec * 1000);
  255. count++;
  256. }
  257. });
  258. }
  259. return true;
  260. }
  261. /// <summary>
  262. /// 更新下方箭头显示
  263. /// </summary>
  264. /// <param name="index"></param>
  265. /// <returns></returns>
  266. public bool UpdateArrow(int index)
  267. {
  268. if (index > 3)
  269. return false;
  270. if (boardParams.handle == 0 || boardParams.areas.Count < 2)
  271. return false;
  272. lock (area2Lock)
  273. {
  274. if (index < 0)
  275. {
  276. UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(""));
  277. }
  278. else
  279. {
  280. UpdateArea(boardParams.handle, boardParams.areas[1].index, Encoding.Default.GetBytes(arrows[index]));
  281. }
  282. }
  283. return true;
  284. }
  285. /// <summary>
  286. /// 删除某屏幕所有动态区
  287. /// </summary>
  288. /// <param name="handle"></param>
  289. /// <returns></returns>
  290. public bool RemoveDynamicAreas(uint handle)
  291. {
  292. if (!handleDynamicAreasMap.ContainsKey(handle))
  293. {
  294. return false;
  295. }
  296. else
  297. {
  298. List<Led5kSDK.bx_5k_area_header> list;
  299. handleDynamicAreasMap.TryGetValue(handle, out list);
  300. int err = 0;
  301. if (list != null)
  302. {
  303. for (int i = 0; i < list.Count; i++)
  304. {
  305. err += Led5kSDK.SCREEN_DelDynamicArea(handle, (byte)i);
  306. }
  307. }
  308. return err == 0 ? true : false;
  309. }
  310. }
  311. /// <summary>
  312. /// 删除某屏幕特定编号的动态区
  313. /// </summary>
  314. /// <param name="handle"></param>
  315. /// <param name="index"></param>
  316. /// <returns></returns>
  317. public bool RemoveDynamicAreas(uint handle, int index)
  318. {
  319. if (!handleDynamicAreasMap.ContainsKey(handle))
  320. {
  321. return false;
  322. }
  323. else
  324. {
  325. List<Led5kSDK.bx_5k_area_header> list;
  326. handleDynamicAreasMap.TryGetValue(handle, out list);
  327. int err = 0;
  328. if (list != null)
  329. {
  330. for (int i = 0; i < list.Count; i++)
  331. {
  332. if(list[i].DynamicAreaLoc == index)
  333. {
  334. err = Led5kSDK.SCREEN_DelDynamicArea(handle, list[i].DynamicAreaLoc);
  335. return true;
  336. }
  337. }
  338. }
  339. return err == 0 ? true : false;
  340. }
  341. }
  342. // *************** 私有方法 ***************
  343. /// <summary>
  344. /// 增加动态区
  345. /// </summary>
  346. /// <param name="handle"></param>
  347. /// <param name="header"></param>
  348. private int AddDynamicArea(uint handle, Led5kSDK.bx_5k_area_header header)
  349. {
  350. List<Led5kSDK.bx_5k_area_header> list;
  351. if (!handleDynamicAreasMap.ContainsKey(handle))
  352. {
  353. list = new List<Led5kSDK.bx_5k_area_header>();
  354. list.Add(header);
  355. header.DynamicAreaLoc = 0;
  356. handleDynamicAreasMap.Add(handle, list);
  357. return 0;
  358. }
  359. else
  360. {
  361. handleDynamicAreasMap.TryGetValue(handle, out list);
  362. if (list != null)
  363. {
  364. int no = list[list.Count - 1].DynamicAreaLoc + 1;
  365. header.DynamicAreaLoc = (byte)(no);
  366. list.Add(header);
  367. return no;
  368. }
  369. return -1;
  370. }
  371. }
  372. /// <summary>
  373. /// 动态区域更新函数
  374. /// </summary>
  375. /// <param name="i"></param>
  376. private bool UpdateArea(uint handle, int index, byte[] areaText)
  377. {
  378. int err = -1;
  379. List<Led5kSDK.bx_5k_area_header> list;
  380. if (!handleDynamicAreasMap.ContainsKey(handle))
  381. {
  382. return false;
  383. }
  384. else
  385. {
  386. handleDynamicAreasMap.TryGetValue(handle, out list);
  387. if (list != null)
  388. {
  389. for (int i = 0; i < list.Count; i++)
  390. {
  391. if (index == list[i].DynamicAreaLoc)
  392. {
  393. Led5kSDK.bx_5k_area_header temp = list[i];
  394. temp.DataLen = areaText.Length;
  395. err = Led5kSDK.SCREEN_SendDynamicArea(handle, temp, (ushort)temp.DataLen, areaText);
  396. break;
  397. }
  398. }
  399. if (err == 0)
  400. return true;
  401. else
  402. return false;
  403. }
  404. else
  405. return false;
  406. }
  407. }
  408. /// <summary>
  409. /// 动态区域更新函数
  410. /// </summary>
  411. /// <param name="i"></param>
  412. private bool UpdateArea(uint handle, int index, byte[] areaText, bool soundOnly, byte[] soundText)
  413. {
  414. int err = -1;
  415. List<Led5kSDK.bx_5k_area_header> list;
  416. if (!handleDynamicAreasMap.ContainsKey(handle))
  417. {
  418. return false;
  419. }
  420. else
  421. {
  422. handleDynamicAreasMap.TryGetValue(handle, out list);
  423. if (list != null)
  424. {
  425. for (int i = 0; i < list.Count; i++)
  426. {
  427. if (index == list[i].DynamicAreaLoc)
  428. {
  429. Led5kSDK.bx_5k_area_header temp = list[i];
  430. temp.DataLen = areaText.Length;
  431. if(!soundOnly)
  432. err = Led5kSDK.SCREEN_SendSoundDynamicArea(handle, temp, (ushort)temp.DataLen, areaText, 2, 0, 10, 5, soundText.Length, soundText);
  433. else
  434. err = Led5kSDK.SCREEN_SendSoundDynamicArea(handle, temp, 0, Encoding.Default.GetBytes(""), 2, 0, 1, 5, soundText.Length, soundText);
  435. break;
  436. }
  437. }
  438. if (err == 0)
  439. return true;
  440. else
  441. return false;
  442. }
  443. else
  444. return false;
  445. }
  446. }
  447. ///// <summary>
  448. ///// 播放方法
  449. ///// </summary>
  450. ///// <param name="winID">显示屏窗口ID</param>
  451. ///// <param name="mode">播放模式</param>
  452. ///// <param name="str">待显示或播语音字符串,输入“date”或“time”分别显示日期与时间</param>
  453. ///// <param name="time">保持时间</param>
  454. ///// <param name="fieldID">存储块ID</param>
  455. ///// <param name="startIndex">开始下标</param>
  456. ///// <param name="endIndex">结束下标</param>
  457. //public void Play(int winID, PlayMode mode, string str, int time = 0, int fieldID = 0, int startIndex = 0, int endIndex = 0)
  458. //{
  459. // switch (mode)
  460. // {
  461. // case PlayMode.temporary:
  462. // DispString(winID, str, time);
  463. // break;
  464. // case PlayMode.download:
  465. // DownloadString(winID, str, fieldID);
  466. // break;
  467. // case PlayMode.readBuffer:
  468. // DispDownStr(winID, fieldID);
  469. // break;
  470. // case PlayMode.delete:
  471. // DelFile(winID, startIndex, endIndex);
  472. // break;
  473. // case PlayMode.audio:
  474. // AudioPlay(str);
  475. // break;
  476. // }
  477. //}
  478. }
  479. public class BoardParams
  480. {
  481. public int id;
  482. public byte[] ip;
  483. public uint port;
  484. public Led5kSDK.bx_5k_card_type card_type;
  485. public uint handle;
  486. public List<AreaInfo> areas;
  487. public BoardParams(int id, byte[] ip, uint port, Led5kSDK.bx_5k_card_type card_type, uint handle)
  488. {
  489. this.id = id;
  490. this.ip = ip;
  491. this.port = port;
  492. this.card_type = card_type;
  493. this.handle = handle;
  494. areas = new List<AreaInfo>();
  495. }
  496. }
  497. public class AreaInfo
  498. {
  499. public uint winHandle;
  500. public int index;
  501. public bool display;
  502. public byte[] text;
  503. public Led5kSDK.bx_5k_area_header header;
  504. public AreaInfo(uint handle, int index, byte[] text)
  505. {
  506. this.winHandle = handle;
  507. this.index = index;
  508. this.text = text.ToArray();
  509. header = new Led5kSDK.bx_5k_area_header();
  510. }
  511. public override string ToString()
  512. {
  513. return winHandle + ", " + index + ", " + display + ", " + text.ToList().ToString();
  514. }
  515. }
  516. }