Пример #1
0
    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
Пример #3
0
 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))
Пример #5
0
 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)
Пример #9
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
Пример #10
0
 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))
Пример #13
0
 def deleteFile(self, fileno):
     self.init()
     self.send(u"\xe8\x00" + RDLaser.fromNumber(fileno, 2) +
               RDLaser.fromNumber(fileno, 2))
Пример #14
0
 def calculateTime(self, fileno):
     self.init()
     return RDLaser.toNumber(
         self.request(u"\xe8\x04" + RDLaser.fromNumber(fileno, 2)))
Пример #15
0
 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()
Пример #16
0
 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))
Пример #17
0
 def __init__(self, addr="127.0.0.1"):
     RDLaser.getClient()
     self.addr = addr
     pass