def requestFilelist(self, filename=None, overwrite=False): filelist = [] resp = self.request(u"\xda\x00\x04\x05") if resp == None: return filelist, False num_files = RDLaser.toNumber(resp) for i in range(0, num_files): resp = self.request(u"\xe8\x01" + RDLaser.fromNumber(i + 1, 2)) if resp == None: break filename_ = resp[:-1].upper() ''' fileno = RDLaser.toNumber(resp[:2], 2) if i+1 != fileno: raise ValueError("Reported filenumber does not match iterator") ''' filelist.append(filename_) if filename is not None and filename.upper() == filename_[:-1]: while not daemon: print "Duplicate Filename %s, overwrite?" % filename inp = raw_input("[Y/N] ") if inp.lower() == "y": overwrite = True break elif inp.lower() == "n": break if overwrite: self.send(u"\xe8\x00" + RDLaser.fromNumber(i + 1, 2) + RDLaser.fromNumber(i + 1, 2)) return filelist, True return filelist, False if filename is not None: self.send(u"\xe8\x02\xe7\x01" + filename + u"\x00") return filelist, True
def __init__(self, filedir="./rdfiles/"): RDLaser.getServer() self.filedir = filedir self.responses = { "da00057e": u"\xda\x01\x05\x7e\x06\x28\x41\x4a\x10", "da000b12": u"\xda\x01\x0b\x12\x0f\x11\x64\x00\x00", } pass
def send(self, data): scr = RDLaser.checksum(RDLaser.scramblestr(data)) if self.debug: print u"\x1B[42m> " + self.addr + ": " + ( scr.encode("hex")) + u"\x1B[0m - " + data.encode("HEX") RDLaser.getClient().sendto(scr, (self.addr, RDLaser.SERVER_PORT)) data, server_addr = self.recv() if (data != '\xc6'): return False return True
def send(self, addr, data): scr = RDLaser.scramblestr(data) if self.debug: if data[:3] == u"\xe8\x01\x00": uns = str(ord(data[3])) + " - " + data[4:-1] else: uns = data.encode("HEX") print u"\x1B[32m> " + addr + ": " + ( scr.encode("hex")) + u"\x1B[0m - " + uns RDLaser.getServer().sendto(scr, (addr, RDLaser.CLIENT_PORT))
def recv(self): try: data, server_addr = RDLaser.getClient().recvfrom(RDLaser.BUF_SIZE) except socket.timeout: if self.debug: print u"\x1B[30;48;5;1m TIMEOUT REACHED \x1B[0m" return (None, None) if self.debug: print u"\x1B[44m< " + server_addr[0] + ": " + data.encode( "HEX") + u"\x1B[0m - " + RDLaser.descramblestr(data).encode( "HEX") return (data, server_addr)
def recv(self): data, addr = RDLaser.getServer().recvfrom(RDLaser.BUF_SIZE) if data[:2] != RDLaser.checksum(data[2:])[:2]: print data[0:2].encode("HEX") if self.debug: print(u"\x1B[31mCHECKSUM MISMATCH\x1B[0m") return ("", addr) data = RDLaser.descramblestr(data[2:]) if self.debug: print(u"\x1B[34m< " + addr[0] + ": " + RDLaser.scramblestr(data).encode("HEX") + u"\x1B[0m - " + data.encode("HEX")) self.send(addr[0], '\xcc') #send ACK return (data, addr)
def sendSystemInfo(self, addr, opt): # 0x01 = TOTAL ON TIME (s) # 0x02 = TOTAL PROCESSING TIME (s) # 0x03 = TOTAL PROCESSING TIMES (#) # 0x08 = PREVIOUS PROCESSING TIME (ms) # 0x11 = TOTAL TRAVEL Y (m) # 0x23 = TOTAL TRAVEL X (m) self.send(addr, u"\xda\x01\x04" + chr(opt) + RDLaser.fromNumber(0))
def callback(self, addr, data): # HANDSHAKE, MODEL, STATE? if data == self.HANDSHAKE: self.send(addr, u"\xda\x01\x05\x7e\x06\x28\x41\x4a\x10") #STATE #elif data == u"\x02\x73\xd4\x89\x8d\x89": # ssend(addr, "d4098d8989c98d810b".decode("HEX")) elif data == u"\xda\x00\x00\x60": self.respond(addr, data, 65535) # Filelist request elif data == u"\xda\x00\x04\x05": self.sendFilelist(addr) elif data[:2] == u"\xe8\x00": self.deleteFile(RDLaser.toNumber(data[2:], 2)) #elif data[:2] == u"\xe8\x04": # self.calculateTime(RDLaser.toNumber(data[2:], 2)) elif data[0] == u"\xe5": self.sendFile(RDLaser.toNumber(data[1:], 2)) # System info request elif data[2:-1] == u"\xda\x00\x04": self.sendSystemInfo(addr, ord(data[-1])) # Model number query elif data == RDLaser.MAINBOARD_VERSION: self.send( addr, u"\xda\x01\x05\x7f" + RDLaser.values[RDLaser.MAINBOARD_VERSION] + u"\x00") # Specific codes (deprecated) elif data.encode("hex") in self.responses: self.send(addr, self.responses[data.encode("hex")]) # Generic answer ### # Query is as following: # 0x89 0xXX 0xDA 0x00 0xYY 0xZZ # Answers are in following format: # 0xDA 0x01 0xYY 0xZZ ... # so each request [4:6] must match response [2:4] # Rest of the answer (...) does not noticably change anything as far as tested ### elif data[:2] == u"\xda\x00": try: self.respond(addr, data, RDLaser.values[data]) except: self.respond(addr, data, 0)
def readSystemInfo(self, opt): data = self.request(opt) if data is None: return None else: val = RDLaser.toNumber(data[-5:]) try: RDLaser.values[opt] = val except: pass return val
def request(self, data): if not self.send(data): return None resp, server_addr = self.recv() if resp == None: return None resp = RDLaser.descramblestr(resp) if resp[2:4] == data[2:4]: return resp[4:] else: if self.debug: print u"\x1B[30;48;5;1m MESSAGE CODE MISMATCH %s / %s \x1B[0m" % ( resp[2:4].encode("HEX"), data[2:4].encode("HEX")) return None
def sendFilelist(self, addr): if self.debug: print u"\x1B[31m# SEND FILELIST\x1B[0m" files = next(os.walk(self.filedir))[2] num_files = len(files) i = 0 while i < num_files: if "." in files[i] and files[i].rsplit('.', 1)[1].lower() == "rd": i += 1 else: del files[i] num_files -= 1 fname = "" self.send(addr, u"\xda\x01\x04\x05" + RDLaser.fromNumber(len(files))) for i in range(0, len(files)): data, sender_addr = self.recv() if len(data) == 6 and ord(data[-1]) is i: if self.debug: print u"\x1B[5m\x1B[31m# DUPLICATE FILE, NO LONGER SEND FILELIST\x1B[0m\x1B[25m" return #request processing time elif data[-2] == u"\x07": self.callback(addr, data) data, sender_addr = self.recv() elif ord(data[-1]) is not i + 1: if self.debug: print u"\x1B[5m\x1B[31m# INVALID REQUEST, CANCELLED DOWNLOAD?\x1B[0m\x1B[25m" self.callback(addr, data) return fname = files[i].split('.', 1)[0] #Send filename, \0 terminated self.send( sender_addr[0], u"\xe8\x01" + (RDLaser.fromNumber(i + 1, 2) + fname[:8].upper()) + u"\x00") if self.debug: print(u"\x1B[31m# FILELIST SENT\x1B[0m")
def respond(self, addr, data, n): self.send(addr, u"\xda\x01" + data[2:4] + RDLaser.fromNumber(n))
def deleteFile(self, fileno): self.init() self.send(u"\xe8\x00" + RDLaser.fromNumber(fileno, 2) + RDLaser.fromNumber(fileno, 2))
def calculateTime(self, fileno): self.init() return RDLaser.toNumber( self.request(u"\xe8\x04" + RDLaser.fromNumber(fileno, 2)))
def getFile(self, fileno, file): self.init() self.send(u"\xe5" + RDLaser.fromNumber(fileno, 2)) while True: self.request(u"\xe5\x01\x01" + RDLaser.fromNumber(i, 5)) file.close()
def moveAxis(self, axis, nm=10000, speed=100000): self.send(u"\xc9\x02" + RDLaser.fromNumber(speed)) return self.send(u"\xd9" + chr(axis) + u"\x02" + RDLaser.toNumber(nm))
def __init__(self, addr="127.0.0.1"): RDLaser.getClient() self.addr = addr pass