BxAreaDynamic.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import struct
  2. from .BxArea import BaseArea, NewBxArea
  3. class BxAreaDynamic(BaseArea):
  4. def __init__(self, id, runMode, dispMode, x, y, w, h, data, soundData, is5K):
  5. super().__init__(0, x, y, w, h)
  6. self.is5K = is5K
  7. self.id = id
  8. self.lineSpace = 0
  9. self.runMode = runMode
  10. self.timeout = 5
  11. self.soundMode = 0x00
  12. self.soundPerson = 0x00
  13. self.soundRepeat = 0x00
  14. self.soundVolume = 0x01
  15. self.soundSpeed = 0x10
  16. self.soundData = soundData if soundData else []
  17. self.extendParaLen = 0
  18. self.alignment = 0
  19. self.singleLine = 0x02
  20. self.autoNewLine = 0x01
  21. self.dispMode = dispMode
  22. self.exitMode = 0
  23. self.speed = 0x0a
  24. self.holdTime = 0x08
  25. self.data = data if data else []
  26. def Length(self):
  27. """获取区域长度"""
  28. return 27 + len(self.data)
  29. def Build(self):
  30. """构建区域数据"""
  31. result = bytearray()
  32. # 写入类型
  33. result.append(self.typ)
  34. # 处理坐标和尺寸
  35. x8 = self.GetX()
  36. w8 = self.GetW()
  37. if self.is5K:
  38. x8 = self.x // 8
  39. w8 = self.w // 8
  40. # 写入坐标和尺寸(小端序)
  41. result.extend(struct.pack('<H', x8))
  42. result.extend(struct.pack('<H', self.GetY()))
  43. result.extend(struct.pack('<H', w8))
  44. result.extend(struct.pack('<H', self.GetH()))
  45. # 写入动态区编号
  46. result.append(self.id)
  47. # 写入行间距
  48. result.append(self.lineSpace)
  49. # 写入运行模式
  50. result.append(self.runMode)
  51. # 写入超时时间
  52. result.extend(struct.pack('<h', self.timeout))
  53. # 写入声音模式
  54. result.append(self.soundMode)
  55. # 处理声音参数
  56. if self.soundMode == 0x01 or self.soundMode == 0x02:
  57. pr = ((self.soundRepeat << 4) & 0xf0) | (self.soundPerson & 0x0f)
  58. result.append(pr)
  59. result.append(self.soundVolume)
  60. result.append(self.soundSpeed)
  61. # 处理声音数据
  62. if self.soundMode == 0x02:
  63. soundDataLen = len(self.soundData)
  64. result.extend(struct.pack('<I', soundDataLen))
  65. result.extend(self.soundData)
  66. # 写入扩展参数长度
  67. result.append(self.extendParaLen)
  68. # 写入对齐方式
  69. result.append(self.alignment)
  70. # 写入单行模式
  71. result.append(self.singleLine)
  72. # 写入自动换行
  73. result.append(self.autoNewLine)
  74. # 写入显示模式
  75. result.append(self.dispMode)
  76. # 写入退出模式
  77. result.append(self.exitMode)
  78. # 写入速度
  79. result.append(self.speed)
  80. # 写入保持时间
  81. result.append(self.holdTime)
  82. # 写入数据长度
  83. result.extend(struct.pack('<I', len(self.data)))
  84. # 写入数据
  85. result.extend(self.data)
  86. return bytes(result)
  87. def SetSoundMode(self, soundMode):
  88. """设置声音模式"""
  89. if soundMode > 2:
  90. self.soundMode = 0x02
  91. else:
  92. self.soundMode = soundMode
  93. def SetSoundPerson(self, soundPerson):
  94. """设置声音人物"""
  95. if soundPerson > 5:
  96. self.soundPerson = 0
  97. else:
  98. self.soundPerson = soundPerson
  99. def SetSoundRepeat(self, soundRepeat):
  100. """设置声音重复次数"""
  101. if soundRepeat > 15:
  102. self.soundRepeat = 15
  103. else:
  104. self.soundRepeat = soundRepeat
  105. def SetSoundVolume(self, soundVolume):
  106. """设置声音音量"""
  107. if soundVolume > 10:
  108. self.soundVolume = 10
  109. else:
  110. self.soundVolume = soundVolume
  111. def SetSoundSpeed(self, soundSpeed):
  112. """设置声音速度"""
  113. if soundSpeed < 1:
  114. self.soundSpeed = 1
  115. elif soundSpeed > 10:
  116. self.soundSpeed = 10
  117. else:
  118. self.soundSpeed = soundSpeed
  119. # 创建BxAreaDynamic实例的函数
  120. def NewBxAreaDynamic(id, runMode, dispMode, x, y, w, h, data, soundData, is5K):
  121. return BxAreaDynamic(id, runMode, dispMode, x, y, w, h, data, soundData, is5K)
  122. # 创建程序动态区域实例的函数
  123. def NewBxAreaProgram(id, runMode, dispMode, alignment, x, y, w, h, data, is5K):
  124. area = BxAreaDynamic(id, runMode, dispMode, x, y, w, h, data, [], is5K)
  125. area.alignment = alignment
  126. area.soundVolume = 0x05
  127. area.soundSpeed = 0x05
  128. area.speed = 0x01
  129. return area