123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- # -*- coding: utf-8 -*-
- import sys,os,time
- reload(sys)
- sys.setdefaultencoding('utf-8')
- import struct,binascii
- from utils.serialboard_manager import *
- #用于数据链路层的数据格式化
- class TransferData():
- def __init__(self):
- print ""
- Command_Excute_Counter = 0
- Status_Transfer_Send = 0x01
- Status_Transfer_Return_Wait = 0x02
- Status_Transfer_Return_Timeout = 0x03
- Status_Transfer_CmdCRC_Error = 0x0F
- Transfer_Status = Status_Transfer_Send
- Status_Command_Return_Pass = 0x0A
- Status_Command_Return_Fail = 0x0E
- Status_Init = 0x00
- Command_Status = Status_Init
- Packet_Head_Offset = 0
- Packet_Len_Offset = 1
- Packet_uCommand_Offset = 2
- Packet_CRC_Len = 2
- Packet_CRC1_Back_Offset = -2
- Packet_CRC2_Back_Offset = -1
- Packet_Min_Len = 5
- Return_Cmd_Head = 0xAB
- Try_Count_Max = 3
- Command_Send_End_Time = 0
- Command_Read_End_Time = 0
- class TCLFactoryTransfer():
- CRC_TABLE = [0x0000,0x1021,0x2042,0x3063,0x4084,0x50A5,0x60C6,0x70E7, \
- 0x8108,0x9129,0xA14A,0xB16B,0xC18C,0xD1AD,0xE1CE,0xF1EF]
- Buffer_Len = 128
- def __init__(self):
- self.serialManager = TCLSerial()
- def CRCCalculate(self, bytearr, arrLen):
- #print "Calculate command CRC,arrlen=",arrLen
- uwCRC = 0xFFFF
- ucTemp = 0x00
- index = 0
- while(index < arrLen):
- #print "calculate byte:0x%x"%bytearr[index]
- ucTemp = (uwCRC>>0x0C)& 0xFF
- #print "calculate ucTemp:0x%x" % ucTemp
- uwCRC <<= 4
- uwCRC ^= TCLFactoryTransfer.CRC_TABLE[ucTemp ^((bytearr[index])>>0x04)]
- uwCRC &= 0xFFFF
- #print "calculate uwCRC:0x%x" % (uwCRC & 0xFFFF)
- ucTemp = (uwCRC >> 0x0C) & 0xFF
- #print "calculate ucTemp:0x%x" % ucTemp
- uwCRC <<= 4
- uwCRC ^= TCLFactoryTransfer.CRC_TABLE[ucTemp^(bytearr[index]&0x0F)]
- uwCRC &= 0xFFFF
- index += 1
- return uwCRC
- def appendCRC(self, bytearr):
- # print "[TCLFactoryTransfer:sendCommandToTV], command bytes:", binascii.hexlify(bytearr)
- crc = self.CRCCalculate(bytearr, bytearr.__len__() - Packet_CRC_Len)
- # print "[TCLFactoryTransfer:sendCommandToTV],bytearr crc:0x%x" % (crc & 0xFFFF)
- crc1_index = bytearr.__len__() - 2
- crc2_index = bytearr.__len__() - 1
- bytearr[crc1_index] = crc >> 8
- bytearr[crc2_index] = crc & 0x00FF
- #返回结果True:代表指令发送成功,包含CRC校验成功。False:代表指令发送失败,包含CRC校验失败
- def sendCommandToTV(self, bytearr):
- global Transfer_Status, Command_Excute_Counter,Command_Send_End_Time,Command_Read_End_Time
- Command_Excute_Counter += 1
- #print "[TCLFactoryTransfer:sendCommandToTV], transfer send counter=", Command_Excute_Counter
- Transfer_Status = Status_Transfer_Return_Wait
- self.appendCRC(bytearr)
- #print "[TCLFactoryTransfer:sendCommandToTV], command bytes with CRC:", binascii.hexlify(bytearr)
- self.serialManager.sendCommand(bytearr)
- Command_Send_End_Time = time.time()
- while (Transfer_Status == Status_Transfer_Return_Wait):
- pass
- #print "[TCLFactoryTransfer:sendCommandToTV],command result=0x%x"%Transfer_Status
- if (Transfer_Status == Status_Command_Return_Pass) or (Transfer_Status == Status_Command_Return_Fail):
- Transfer_Status = Status_Transfer_Send
- Command_Excute_Counter = 0
- return True
- else:
- if (Command_Excute_Counter == Try_Count_Max):
- Transfer_Status = Status_Transfer_Send
- Command_Excute_Counter = 0
- return False
- else:
- return self.sendCommandToTV(bytearr)
- def checkReturnCmdCRC(self, bytearr):
- global Transfer_Status,Command_Status
- Command_Status = Status_Init
- #print "[TCLFactoryTransfer:checkCmdCRC],bytearr:", binascii.hexlify(bytearr)
- if (bytearr.__len__() < Packet_Min_Len):
- return
- #print "[TCLFactoryTransfer:checkCmdCRC],bytearr Head=%x"%bytearr[0]
- if (bytearr[Packet_Head_Offset] == Return_Cmd_Head):
- cmd_len = bytearr[Packet_Len_Offset]
- crc = self.CRCCalculate(bytearr, cmd_len - Packet_CRC_Len)
- #print "[TCLFactoryTransfer:checkCmdCRC],bytearr crc:0x%x" % (crc & 0xFFFF)
- crc1 = crc >> 8
- crc2 = crc & 0x00FF
- if (cmd_len >= Packet_Min_Len) \
- and (crc1 == bytearr[cmd_len + Packet_CRC1_Back_Offset]) \
- and (crc2 == bytearr[cmd_len + Packet_CRC2_Back_Offset]):
- Transfer_Status = Command_Status = bytearr[Packet_uCommand_Offset]
- def readResultLine(self):
- global Command_Read_End_Time, Transfer_Status
- line = self.serialManager.readData(TCLFactoryTransfer.Buffer_Len)
- self.checkReturnCmdCRC(line)
- Command_Read_End_Time = time.time()
- if ((Command_Read_End_Time - Command_Send_End_Time) > 0.5) and (Transfer_Status == Status_Transfer_Return_Wait):
- print "Transfer read timeout!!!"
- Transfer_Status = Status_Transfer_Return_Timeout
- return Command_Status, line
|