import serial from serial.tools import list_ports import numpy as np import re import time import globalDefs as Globals def send(ser, cmd): ser.write(cmd+'\r') time.sleep(1e-3) timeOut = 0xFFFF while ((not ser.inWaiting()) and timeOut > 0): timeOut -= 1 if (timeOut > 0): retCode = ser.readline() retCode = retCode.splitlines()[0] retSp = retCode.split(':') return retSp, retCode, timeOut def sendCheck(ser, cmd): retSp, retCode, timeOut = send(ser, cmd) assert timeOut > 0 assert retSp[1] == '0' return retSp, retCode, timeOut def decodeHwrz(s): a = "" for i in range(3): a += chr(int(s[2*i:2*i+2])) return a class EVMSelector(): VID=0x2047 PID=0x0A3C dv=-1 def __init__(self): portList=np.array([]) for port in serial.tools.list_ports.comports(): #print 'VID is 0x%04x PID is 0x%04x'%(port.vid,port.pid) if((port.vid==self.VID) and (port.pid==self.PID)): portList=np.append(portList,port) if(np.size(portList)%2): Globals.error('Number of ports with EVM\'s VID and PID seems to be odd number. Expected even number') return locList=dict() self.control=np.array([]) self.data=np.array([]) self.controlP=np.array([]) self.dataP=np.array([]) #print portList # import imp # mMSP5503Programmer=imp.load_source('mMSP5503Programmer','c:/Asterix/projects/OPT3101/OPT3101EVMrevE3_TIDAWideFov/'+'/mMSP5503Programmer.py') for i,port in enumerate(portList): try: ser=serial.Serial(port.device,9600) #print "Passed to open",port.device except: #print "Failed to open",port.device Globals.log('Serial port [%s] Locked'%port.device) continue ser.write('HWR?'+'\r') storeSize=5 time.sleep(1e-3) timeOut=0xFFFF while((not ser.inWaiting()) and timeOut>0): timeOut-=1 if(timeOut>0): retCode=ser.readline() retCode=retCode.splitlines()[0] retSp=retCode.split(':') #print "Appending ",retCode if(retSp[1]=='C'): retSp2, retCode2, timeOut2 = send(ser, 'HWRF') if (timeOut2 > 0): if (retSp2[1] == 'F'): Globals.error("Invalid EVM detected") return elif (int(retSp2[1]) >= 1): sendCheck(ser, 'FLS!R') z = sendCheck(ser, 'FLSH')[0] assert z[2] == '%02d'%storeSize r = [sendCheck(ser, 'FLSR')[0][2] for i in range(storeSize)] sendCheck(ser, 'FLS!R') s = "".join([decodeHwrz(st) if i != 1 else st[2:6] for i, st in enumerate(r)]) Globals.log("Device detected: " + s) assert s == "OPT4001DNP-Q1EVM" self.dv=1 else: Globals.error('Communication Error.') assert 0 self.controlP=np.append(self.controlP,port) self.control=np.append(self.control,port.device) if(retSp[1]=='D'): self.dataP=np.append(self.dataP,port) self.data=np.append(self.data,port.device) ser.close() if(not (np.size(self.controlP)==np.size(self.dataP))): Globals.error('Number of Control and Data ports not matched. Unlock all COM ports') return for c0,port in enumerate(self.controlP): try: ser=serial.Serial(port.device,9600) except: Globals.log('Serial port [%s] Locked'%port) continue ser.write('HWRX%d'%(c0+1)+'\r') ser.close() dataOrder=[] for c0,port in enumerate(self.dataP): try: ser=serial.Serial(port.device,9600) except: Globals.log('Serial port [%s] Locked'%port) continue ser.write('HWRX'+'\r') time.sleep(1e-3) timeOut=0xFFFF while((not ser.inWaiting()) and timeOut>0): timeOut-=1 if(timeOut>0): retCode=ser.readline() retCode=retCode.splitlines()[0] retSp=retCode.split(':') dataOrder.append(np.uint8(retSp[1])-1) ser.close() self.data=self.data[dataOrder] self.dataP=self.dataP[dataOrder] #for c0 in np.arange(np.size( return if __name__ == '__main__': evmList=EVMSelector() for c0 in np.arange(evmList.control.shape[0]): print "Control Port for EVM %d is "%c0,evmList.control[c0] print "Data Port for EVM %d is "%c0,evmList.data[c0]