gamma-tools.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. # -*- coding: UTF-8 -*-
  2. import time
  3. import re # 正则表达式;
  4. import numpy as np
  5. import zipfile
  6. import gzip
  7. import autoGamma
  8. from mokaSerail import MokaSerial
  9. def readPartern():
  10. f = open(u"cfg.txt") # 返回一个文件对象
  11. line = f.readline() # 调用文件的 readline()方法,一次读取一行
  12. print(u"第一行", line)
  13. line = line.replace("\r", "")
  14. line = line.replace('\n', '')
  15. TV_COM = line.split(",")[0]
  16. CA_COM = line.split(",")[1]
  17. print("value", TV_COM, CA_COM)
  18. PAR_LIST = []
  19. while line:
  20. print(line)
  21. line = f.readline()
  22. if line.__len__() != 0:
  23. line = line.replace("\r", "")
  24. line = line.replace('\n', '')
  25. ls_d = line.split(',')
  26. # PAR_LIST.append(line.split(','))
  27. PAR_LIST.append([int(ls_d[0]), int(ls_d[1]), int(ls_d[2])])
  28. f.close()
  29. print(PAR_LIST)
  30. return TV_COM, CA_COM, PAR_LIST
  31. def get_ca_data(data):
  32. # 正则表达式;
  33. # OK00,P1 3716;3956;.0091\r
  34. p = re.compile(r"(\D*)(\d+),P1 (.*);(.*);(.*)", re.DOTALL)
  35. mo = p.search(data)
  36. if mo is None:
  37. print("无匹配正则")
  38. pw = re.compile(r"(\D*)(\d+)", re.DOTALL)
  39. mo = pw.search(data)
  40. if mo is None:
  41. # print("短匹配失败")
  42. return None, None, None, None, None
  43. else:
  44. return mo.group(1), mo.group(2), None, None, None
  45. else:
  46. return mo.group(1), mo.group(2), mo.group(3), mo.group(4), mo.group(5)
  47. def xyY_to_XYZ(x, y, Y):
  48. X = x * Y / y
  49. Z = (1 - x - y) * Y / y
  50. return X, Y, Z
  51. def gen_gzip(gm_file, save_file):
  52. # 压缩gamma.ini成zip,再写入到TV?? 还是直接写入gamma.ini到TV ??
  53. fin = open(gm_file, 'rb')
  54. gf = gzip.open('gamma_org.gzip', 'wb')
  55. data = fin.read()
  56. gf.write(data)
  57. fin.close()
  58. gf.close()
  59. # 计算原始文件crc32;
  60. # crc32 = binascii.crc32(data)
  61. # 重新读取gzip,再切掉8个字节?后再保存
  62. fg = open('gamma_org.gzip', 'rb')
  63. g_data = fg.read()
  64. fg.close()
  65. # 生成新的gamma.zip.
  66. fg = open(save_file, 'wb+')
  67. start_index = 10 + 'gamma_org.gzip'.__len__() + 1
  68. data_save = g_data[start_index:-4]
  69. fg.write(g_data[8:10])
  70. fg.write(data_save)
  71. fg.close()
  72. def test_all():
  73. # 读取配置文件;
  74. TV_COM, CA_COM, PAR_LIST = readPartern()
  75. NP_LIST = np.array(PAR_LIST)
  76. # 取第一列,再取第4位到末尾;
  77. Index11 = NP_LIST[:, 1][3:]
  78. print("11 pattern", Index11)
  79. # 打开CA310
  80. ca_port = MokaSerial()
  81. ca_port.open(CA_COM, 19200, 7, 'E', 2)
  82. # 开启CA310
  83. data = ca_port.sendcmd([0x43, 0x4F, 0x4D, 0x2C, 0x31, 0x0D])
  84. print("CA310 开启", data)
  85. if False:
  86. data = ca_port.sendcmd([0x4D, 0x44, 0x53, 0x2C, 0x30, 0x0D])
  87. print("CA310 显示模式", data)
  88. data = ca_port.sendcmd([0x53, 0x43, 0x53, 0x2C, 0x33, 0x0D])
  89. print("CA310 同步模式", data)
  90. data = ca_port.sendcmd([0x46, 0x53, 0x43, 0x2C, 0x32, 0x0D])
  91. print("CA310 测量速度", data)
  92. time.sleep(0.5)
  93. data = ca_port.sendcmd([0x5A, 0x52, 0x43, 0x0D])
  94. print("CA310 零校准", data)
  95. data = ca_port.sendcmd([0x4D, 0x43, 0x48, 0x2C, 0x30, 0x31, 0x0D])
  96. print("CA310 锁定键控", data)
  97. # 打开TV串口;
  98. tv_port = MokaSerial()
  99. tv_port.open(TV_COM)
  100. print("进工厂模式")
  101. data = tv_port.sendcmd([0xAA, 0x06, 0x10, 0x01, 0xA7, 0xEF])
  102. print("白平衡初始化")
  103. data = tv_port.sendcmd([0xAA, 0x06, 0x16, 0x01, 0x0D, 0x49])
  104. print("关闭Localdimming")
  105. data = tv_port.sendcmd([0xAA, 0x07, 0x9F, 0x07, 0x00, 0xE1, 0x74])
  106. print("打开内置pattern")
  107. data = tv_port.sendcmd([0xAA, 0x06, 0x27, 0x02, 0x0B, 0x8E])
  108. print("切换标准色温")
  109. data = tv_port.sendcmd([0xAA, 0x06, 0x31, 0x01, 0x92, 0x38])
  110. print("gamma初始化")
  111. data = tv_port.sendcmd([0xAA, 0x07, 0x9F, 0x09, 0x01, 0xD2, 0x5A])
  112. XYZ_ALL = []
  113. xyY_ALL = []
  114. print("内置pattern切换与CA310读取")
  115. for item in PAR_LIST:
  116. # print("item",item)
  117. if item.__len__() == 3:
  118. tv_port.send_parttern([int(item[0]), int(item[1]), int(item[2])])
  119. time.sleep(1)
  120. data = ca_port.sendcmd([0x4D, 0x45, 0x53, 0x0D])
  121. print("CA310数据读取",data)
  122. # bytes转成字符串;
  123. data = data.decode('utf-8')
  124. data = data.replace('\r', '')
  125. r1, r2, d1, d2, d3 = get_ca_data(data)
  126. # print("CA310数据:", d1, d2, d3)
  127. # X, Y, Z = xyY_to_XYZ(float(d1) / 10000, float(d2) / 10000, float(d3))
  128. print("CA410数据:", d1, d2, d3)
  129. X, Y, Z = xyY_to_XYZ(float(d1) / 1000, float(d2) / 1000, float(d3))
  130. print("XYZ", X, Y, Z)
  131. XYZ_ALL.append([X, Y, Z])
  132. xyY_ALL.append([d1, d2, d3])
  133. print("关闭内置pattern")
  134. data = tv_port.sendcmd([0xAA, 0x06, 0x27, 0x00, 0x2B, 0xCC])
  135. xyY_ALL = xyY_ALL[::-1]
  136. # for n in range(0, 11):
  137. # xyY_ALL[n] = xyY_ALL[n].reverse()
  138. print(f"原始测量的xyY_11 is : \n")
  139. for i in range(0, 14):
  140. print(f"0.{xyY_ALL[i][0]} 0.{xyY_ALL[i][1]} {xyY_ALL[i][2]}")
  141. # 关闭CA310
  142. data = ca_port.sendcmd([0x43, 0x4F, 0x4D, 0x2C, 0x30, 0x0D])
  143. # 调用gamma算法生成gamma.ini
  144. factory = autoGamma.FiretvFactory()
  145. RGBcalculator = factory.create()
  146. print("XYZ_ALL", XYZ_ALL)
  147. RGB255 = RGBcalculator.calRGB255_for_Debug(np.array(XYZ_ALL[0:3]).T, np.array(XYZ_ALL[3:]).T, np.array(Index11),
  148. 0.313, 0.329, 2.2)
  149. autoGamma.dumpRGB2ini(RGB255)
  150. #  生成切割文件;
  151. gen_gzip('gamma.ini', 'gamma_cut.zip')
  152. # 调用串口命令写入TV中;
  153. tv_port.send_gamma('gamma_cut.zip')
  154. # 使生效;
  155. tv_port.send_gamma_active('gamma.ini')
  156. autoGamma.showRGBcurve(RGB255)
  157. def get_test_result():
  158. # 读取配置文件;
  159. TV_COM, CA_COM, PAR_LIST = readPartern()
  160. NP_LIST = np.array(PAR_LIST)
  161. # 取第一列,再取第4位到末尾;
  162. Index11 = NP_LIST[:, 1][3:]
  163. print("11 pattern", Index11)
  164. # 打开CA310
  165. ca_port = MokaSerial()
  166. ca_port.open(CA_COM, 19200, 7, 'E', 2)
  167. # 开启CA310
  168. data = ca_port.sendcmd([0x43, 0x4F, 0x4D, 0x2C, 0x31, 0x0D])
  169. print("CA310 开启", data)
  170. if True:
  171. data = ca_port.sendcmd([0x4D, 0x44, 0x53, 0x2C, 0x30, 0x0D])
  172. print("CA310 显示模式", data)
  173. data = ca_port.sendcmd([0x53, 0x43, 0x53, 0x2C, 0x33, 0x0D])
  174. print("CA310 同步模式", data)
  175. data = ca_port.sendcmd([0x46, 0x53, 0x43, 0x2C, 0x32, 0x0D])
  176. print("CA310 测量速度", data)
  177. time.sleep(1)
  178. data = ca_port.sendcmd([0x5A, 0x52, 0x43, 0x0D])
  179. print("CA310 零校准", data)
  180. data = ca_port.sendcmd([0x4D, 0x43, 0x48, 0x2C, 0x30, 0x31, 0x0D])
  181. print("CA310 锁定键控", data)
  182. # 打开TV串口;
  183. tv_port = MokaSerial()
  184. tv_port.open(TV_COM)
  185. print("进工厂模式")
  186. data = tv_port.sendcmd([0xAA, 0x06, 0x10, 0x01, 0xA7, 0xEF])
  187. print("打开内置pattern")
  188. data = tv_port.sendcmd([0xAA, 0x06, 0x27, 0x02, 0x0B, 0x8E])
  189. XYZ_ALL = []
  190. xyY_ALL = []
  191. print("内置pattern切换与CA310读取")
  192. for item in PAR_LIST:
  193. # print("item",item)
  194. if item.__len__() == 3:
  195. tv_port.send_parttern([int(item[0]), int(item[1]), int(item[2])])
  196. time.sleep(0.5)
  197. data = ca_port.sendcmd([0x4D, 0x45, 0x53, 0x0D])
  198. # bytes转成字符串;
  199. data = data.decode('utf-8')
  200. data = data.replace('\r', '')
  201. r1, r2, d1, d2, d3 = get_ca_data(data)
  202. # print("CA310数据:", d1, d2, d3)
  203. # X, Y, Z = xyY_to_XYZ(float(d1) / 10000, float(d2) / 10000, float(d3))
  204. print("CA410数据:", d1, d2, d3)
  205. X, Y, Z = xyY_to_XYZ(float(d1) / 1000, float(d2) / 1000, float(d3))
  206. print("XYZ", X, Y, Z)
  207. XYZ_ALL.append([X, Y, Z])
  208. xyY_ALL.append([d1, d2, d3])
  209. print("关闭内置pattern")
  210. data = tv_port.sendcmd([0xAA, 0x06, 0x27, 0x00, 0x2B, 0xCC])
  211. xyY_ALL = xyY_ALL[::-1]
  212. print(f"测量的xyY_11 is : \n")
  213. for i in range(0, 14):
  214. print(f"0.{xyY_ALL[i][0]} 0.{xyY_ALL[i][1]} {xyY_ALL[i][2]}")
  215. # 关闭CA310
  216. data = ca_port.sendcmd([0x43, 0x4F, 0x4D, 0x2C, 0x30, 0x0D])
  217. def test_zip():
  218. # 创建zip压缩包;
  219. zipFile = zipfile.ZipFile(r'gamma.zip', 'w')
  220. # 写入ini到zip中;
  221. zipFile.write(r'gamma.ini', 'gamma.ini', zipfile.ZIP_DEFLATED)
  222. zipFile.close()
  223. def test_gzip():
  224. fin = open('gamma.ini', 'rb')
  225. gf = gzip.open('gamma.gzip', 'wb')
  226. data = fin.read()
  227. gf.write(data)
  228. fin.close()
  229. gf.close()
  230. def test_result():
  231. # xyY_ALL = [[1,2,3],[4,5,6],[7,8,9]]
  232. # xyY_ALL = xyY_ALL[::-1]
  233. # for i in range(0, 3):
  234. # print(f"0.{xyY_ALL[i][0]} 0.{xyY_ALL[i][1]} {xyY_ALL[i][2]}")
  235. X = 7.82195
  236. Y = 3.78406
  237. Z = 2.37614
  238. x = X / (X + Y + Z)
  239. y = Y / (X + Y + Z)
  240. print(f"x={x} y= {y}")
  241. if __name__ == "__main__":
  242. test_all()
  243. # test_result()
  244. # test_tv()
  245. # gen_gzip(r'F:\bin\TCLTools\gamma.ini', 'aaa.cut.zip')
  246. # test_ca310()
  247. # test_gzip()