MessageData.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System;
  2. namespace Vinno.FIS.Sonopost.Features.Oled
  3. {
  4. public enum MessageType
  5. {
  6. QueryStatus = 0x00,
  7. SetBaudRate = 0x11,
  8. SetBrightness = 0x15,
  9. OpenScreen = 0x16,
  10. CloseScreen = 0x17,
  11. ClearScreen = 0x20,
  12. DisplayEnglishSmallInCurrentPage = 0x21,//文本显示 5*8英文
  13. DisplayEnglishLargeInCurrentPage = 0x22,//8*16英文
  14. DisplayChineseLargeInCurrentPage = 0x23,//16*16中文
  15. DisplayEnglishSmall2InCurrentPage = 0x24,//8*8英文
  16. DisplayEnglishMediumInCurrentPage = 0x25,//6*12英文
  17. DisplayChineseMediumInCurrentPage = 0x26,//12*12中文
  18. DisplayImageInCurrentPage = 0x27,//图片显示
  19. AddPage = 0x30,//1-6
  20. DisplayEnglishSmallWithPageNum = 0x31,//修改页面 5*8英文
  21. DisplayEnglishLargeWithPageNum = 0x32,//8*16英文
  22. DisplayChineseLargeWithPageNum = 0x33,//16*16中文
  23. DisplayEnglishSmall2WithPageNum = 0x39,//8*8英文
  24. DisplayEnglishMediumWithPageNum = 0x3a,//6*12英文
  25. DisplayChineseMediumWithPageNum = 0x3b,//12*12中文
  26. DisplayImageWithPageNum = 0x3c,//图片修改
  27. SearchPage = 0x34,
  28. DeletePage = 0x36,
  29. PreviousPage = 0x37,
  30. NextPage = 0x38
  31. }
  32. public interface ISendData
  33. {
  34. /// <summary>
  35. /// Message type
  36. /// </summary>
  37. MessageType MessageType { get; }
  38. /// <summary>
  39. /// Generate buffer which will be send to oled screen.
  40. /// </summary>
  41. /// <returns></returns>
  42. byte[] GenerateBuffer();
  43. }
  44. public abstract class BaseData : ISendData
  45. {
  46. protected const byte FrameHeader = 0xAA;
  47. public MessageType MessageType { get; }
  48. public BaseData(MessageType messageType)
  49. {
  50. MessageType = messageType;
  51. }
  52. public abstract byte[] GenerateBuffer();
  53. }
  54. public class CommandData : BaseData
  55. {
  56. private readonly byte data;
  57. private readonly bool _hasData;
  58. public CommandData(MessageType messageType) : base(messageType)
  59. {
  60. _hasData = false;
  61. }
  62. public CommandData(MessageType messageType, byte data) : base(messageType)
  63. {
  64. this.data = data;
  65. _hasData = true;
  66. }
  67. public override byte[] GenerateBuffer()
  68. {
  69. if (_hasData)
  70. {
  71. return new byte[3] { FrameHeader, (byte)MessageType, data };
  72. }
  73. else
  74. {
  75. return new byte[2] { FrameHeader, (byte)MessageType };
  76. }
  77. }
  78. }
  79. public class DisplayData : BaseData
  80. {
  81. private readonly byte _page;
  82. private readonly byte _row;
  83. private readonly byte _col;
  84. private readonly byte[] _data;
  85. public DisplayData(MessageType messageType, byte row, byte col, byte[] data, byte page = 255) : base(messageType)
  86. {
  87. _row = row;
  88. _col = col;
  89. _data = data;
  90. _page = page;
  91. }
  92. public override byte[] GenerateBuffer()
  93. {
  94. switch (MessageType)
  95. {
  96. case MessageType.DisplayEnglishSmallInCurrentPage:
  97. case MessageType.DisplayEnglishLargeInCurrentPage:
  98. case MessageType.DisplayChineseLargeInCurrentPage:
  99. case MessageType.DisplayEnglishSmall2InCurrentPage:
  100. case MessageType.DisplayEnglishMediumInCurrentPage:
  101. case MessageType.DisplayChineseMediumInCurrentPage:
  102. {
  103. var message = new byte[4 + _data.Length];
  104. message[0] = FrameHeader;
  105. message[1] = (byte)MessageType;
  106. message[2] = _row;
  107. message[3] = _col;
  108. Buffer.BlockCopy(_data, 0, message, 4, _data.Length);
  109. return message;
  110. }
  111. case MessageType.DisplayEnglishSmallWithPageNum:
  112. case MessageType.DisplayEnglishLargeWithPageNum:
  113. case MessageType.DisplayChineseLargeWithPageNum:
  114. case MessageType.DisplayEnglishSmall2WithPageNum:
  115. case MessageType.DisplayEnglishMediumWithPageNum:
  116. case MessageType.DisplayChineseMediumWithPageNum:
  117. {
  118. var message = new byte[5 + _data.Length];
  119. message[0] = FrameHeader;
  120. message[1] = (byte)MessageType;
  121. message[2] = _page;
  122. message[3] = _row;
  123. message[4] = _col;
  124. Buffer.BlockCopy(_data, 0, message, 5, _data.Length);
  125. return message;
  126. }
  127. }
  128. throw new ArgumentException("Message type not supported");
  129. }
  130. }
  131. public class ImageData : BaseData
  132. {
  133. private readonly byte _page;
  134. private readonly byte _x;
  135. private readonly byte _y;
  136. private readonly byte _width;
  137. private readonly byte _height;
  138. private readonly byte[] _data;
  139. public ImageData(MessageType messageType, byte x, byte y, byte width, byte height, byte[] data, byte page = 255) : base(messageType)
  140. {
  141. _x = x;
  142. _y = y;
  143. _width = width;
  144. _height = height;
  145. _data = data;
  146. _page = page;
  147. }
  148. public override byte[] GenerateBuffer()
  149. {
  150. if (MessageType == MessageType.DisplayImageInCurrentPage)
  151. {
  152. var message = new byte[6 + _data.Length];
  153. message[0] = FrameHeader;
  154. message[1] = (byte)MessageType;
  155. message[2] = _x;
  156. message[3] = _y;
  157. message[4] = _width;
  158. message[5] = _height;
  159. Buffer.BlockCopy(_data, 0, message, 6, _data.Length);
  160. return message;
  161. }
  162. else if (MessageType == MessageType.DisplayImageWithPageNum)
  163. {
  164. var message = new byte[7 + _data.Length];
  165. message[0] = FrameHeader;
  166. message[1] = (byte)MessageType;
  167. message[2] = _page;
  168. message[3] = _x;
  169. message[4] = _y;
  170. message[5] = _width;
  171. message[6] = _height;
  172. Buffer.BlockCopy(_data, 0, message, 7, _data.Length);
  173. return message;
  174. }
  175. throw new ArgumentException("Message type not supported");
  176. }
  177. }
  178. }