tcl_factory_transfer.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # -*- coding: utf-8 -*-
  2. import sys,os,time
  3. reload(sys)
  4. sys.setdefaultencoding('utf-8')
  5. import struct,binascii
  6. from utils.serialboard_manager import *
  7. #用于数据链路层的数据格式化
  8. class TransferData():
  9. def __init__(self):
  10. print ""
  11. Command_Excute_Counter = 0
  12. Status_Transfer_Send = 0x01
  13. Status_Transfer_Return_Wait = 0x02
  14. Status_Transfer_Return_Timeout = 0x03
  15. Status_Transfer_CmdCRC_Error = 0x0F
  16. Transfer_Status = Status_Transfer_Send
  17. Status_Command_Return_Pass = 0x0A
  18. Status_Command_Return_Fail = 0x0E
  19. Status_Init = 0x00
  20. Command_Status = Status_Init
  21. Packet_Head_Offset = 0
  22. Packet_Len_Offset = 1
  23. Packet_uCommand_Offset = 2
  24. Packet_CRC_Len = 2
  25. Packet_CRC1_Back_Offset = -2
  26. Packet_CRC2_Back_Offset = -1
  27. Packet_Min_Len = 5
  28. Return_Cmd_Head = 0xAB
  29. Try_Count_Max = 3
  30. Command_Send_End_Time = 0
  31. Command_Read_End_Time = 0
  32. class TCLFactoryTransfer():
  33. CRC_TABLE = [0x0000,0x1021,0x2042,0x3063,0x4084,0x50A5,0x60C6,0x70E7, \
  34. 0x8108,0x9129,0xA14A,0xB16B,0xC18C,0xD1AD,0xE1CE,0xF1EF]
  35. Buffer_Len = 128
  36. def __init__(self):
  37. self.serialManager = TCLSerial()
  38. def CRCCalculate(self, bytearr, arrLen):
  39. #print "Calculate command CRC,arrlen=",arrLen
  40. uwCRC = 0xFFFF
  41. ucTemp = 0x00
  42. index = 0
  43. while(index < arrLen):
  44. #print "calculate byte:0x%x"%bytearr[index]
  45. ucTemp = (uwCRC>>0x0C)& 0xFF
  46. #print "calculate ucTemp:0x%x" % ucTemp
  47. uwCRC <<= 4
  48. uwCRC ^= TCLFactoryTransfer.CRC_TABLE[ucTemp ^((bytearr[index])>>0x04)]
  49. uwCRC &= 0xFFFF
  50. #print "calculate uwCRC:0x%x" % (uwCRC & 0xFFFF)
  51. ucTemp = (uwCRC >> 0x0C) & 0xFF
  52. #print "calculate ucTemp:0x%x" % ucTemp
  53. uwCRC <<= 4
  54. uwCRC ^= TCLFactoryTransfer.CRC_TABLE[ucTemp^(bytearr[index]&0x0F)]
  55. uwCRC &= 0xFFFF
  56. index += 1
  57. return uwCRC
  58. def appendCRC(self, bytearr):
  59. # print "[TCLFactoryTransfer:sendCommandToTV], command bytes:", binascii.hexlify(bytearr)
  60. crc = self.CRCCalculate(bytearr, bytearr.__len__() - Packet_CRC_Len)
  61. # print "[TCLFactoryTransfer:sendCommandToTV],bytearr crc:0x%x" % (crc & 0xFFFF)
  62. crc1_index = bytearr.__len__() - 2
  63. crc2_index = bytearr.__len__() - 1
  64. bytearr[crc1_index] = crc >> 8
  65. bytearr[crc2_index] = crc & 0x00FF
  66. #返回结果True:代表指令发送成功,包含CRC校验成功。False:代表指令发送失败,包含CRC校验失败
  67. def sendCommandToTV(self, bytearr):
  68. global Transfer_Status, Command_Excute_Counter,Command_Send_End_Time,Command_Read_End_Time
  69. Command_Excute_Counter += 1
  70. #print "[TCLFactoryTransfer:sendCommandToTV], transfer send counter=", Command_Excute_Counter
  71. Transfer_Status = Status_Transfer_Return_Wait
  72. self.appendCRC(bytearr)
  73. #print "[TCLFactoryTransfer:sendCommandToTV], command bytes with CRC:", binascii.hexlify(bytearr)
  74. self.serialManager.sendCommand(bytearr)
  75. Command_Send_End_Time = time.time()
  76. while (Transfer_Status == Status_Transfer_Return_Wait):
  77. pass
  78. #print "[TCLFactoryTransfer:sendCommandToTV],command result=0x%x"%Transfer_Status
  79. if (Transfer_Status == Status_Command_Return_Pass) or (Transfer_Status == Status_Command_Return_Fail):
  80. Transfer_Status = Status_Transfer_Send
  81. Command_Excute_Counter = 0
  82. return True
  83. else:
  84. if (Command_Excute_Counter == Try_Count_Max):
  85. Transfer_Status = Status_Transfer_Send
  86. Command_Excute_Counter = 0
  87. return False
  88. else:
  89. return self.sendCommandToTV(bytearr)
  90. def checkReturnCmdCRC(self, bytearr):
  91. global Transfer_Status,Command_Status
  92. Command_Status = Status_Init
  93. #print "[TCLFactoryTransfer:checkCmdCRC],bytearr:", binascii.hexlify(bytearr)
  94. if (bytearr.__len__() < Packet_Min_Len):
  95. return
  96. #print "[TCLFactoryTransfer:checkCmdCRC],bytearr Head=%x"%bytearr[0]
  97. if (bytearr[Packet_Head_Offset] == Return_Cmd_Head):
  98. cmd_len = bytearr[Packet_Len_Offset]
  99. crc = self.CRCCalculate(bytearr, cmd_len - Packet_CRC_Len)
  100. #print "[TCLFactoryTransfer:checkCmdCRC],bytearr crc:0x%x" % (crc & 0xFFFF)
  101. crc1 = crc >> 8
  102. crc2 = crc & 0x00FF
  103. if (cmd_len >= Packet_Min_Len) \
  104. and (crc1 == bytearr[cmd_len + Packet_CRC1_Back_Offset]) \
  105. and (crc2 == bytearr[cmd_len + Packet_CRC2_Back_Offset]):
  106. Transfer_Status = Command_Status = bytearr[Packet_uCommand_Offset]
  107. def readResultLine(self):
  108. global Command_Read_End_Time, Transfer_Status
  109. line = self.serialManager.readData(TCLFactoryTransfer.Buffer_Len)
  110. self.checkReturnCmdCRC(line)
  111. Command_Read_End_Time = time.time()
  112. if ((Command_Read_End_Time - Command_Send_End_Time) > 0.5) and (Transfer_Status == Status_Transfer_Return_Wait):
  113. print "Transfer read timeout!!!"
  114. Transfer_Status = Status_Transfer_Return_Timeout
  115. return Command_Status, line