Exemplo n.º 1
0
def changesn(ctx, new_sn, device):
    from py9b.command.mfg import WriteSNAuth, CalcSNAuth
    dev = {
        'esc': BT.ESC,
        'bms': BT.BMS,
        'extbms': BT.EXTBMS,
    }[device]
    with ctx.obj as tran:
        old_sn = tran.execute(ReadRegs(dev, 0x10, "14s"))[0].decode()
        print("Old S/N:", old_sn)

        uid3 = tran.execute(ReadRegs(dev, 0xDE, "<L"))[0]
        print("UID3: %08X" % (uid3))

        auth = CalcSnAuth(old_sn, new_sn, uid3)
        # auth = 0
        print("Auth: %08X" % (auth))

        try:
            tran.execute(WriteSNAuth(dev, new_sn.encode('utf-8'), auth))
            print("OK")
        except LinkTimeoutException:
            print("Timeout !")

        # save config and restart
        tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x01))
        time.sleep(3)

        old_sn = tran.execute(ReadRegs(dev, 0x10, "14s"))[0]
        print("Current S/N:", old_sn)
Exemplo n.º 2
0
    def changesn(self, new_sn):
        from py9b.command.mfg import WriteSN, CalcSNAuth

        tran = self.conn._tran
        old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0].decode()
        tprint("Old S/N:", old_sn)

        uid3 = tran.execute(ReadRegs(BT.ESC, 0xDE, "<L"))[0]
        tprint("UID3: %08X" % (uid3))

        auth = CalcSnAuth(old_sn, new_sn, uid3)
        # auth = 0
        tprint("Auth: %08X" % (auth))

        try:
            tran.execute(WriteSN(BT.ESC, new_sn.encode('utf-8'), auth))
            tprint("OK")
        except LinkTimeoutException:
            tprint("Timeout !")

        # save config and restart
        tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x01))
        time.sleep(3)

        old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0]
        tprint("Current S/N:", old_sn)
Exemplo n.º 3
0
    def UpdateFirmware(self, tran, dev, fwfile):
        tprint('update started')

        tprint('flashing ' + self.fwfilep + ' to ' + self.device)
        fwfile.seek(0, os.SEEK_END)
        fw_size = fwfile.tell()
        fwfile.seek(0)
        fw_page_size = 0x80

        dev = self.devices.get(self.device)

        for retry in range(self.PING_RETRIES):
            tprint('Pinging...')
            try:
                if dev == BT.BLE:
                    tran.execute(ReadRegs(dev, 0, "13s"))
                else:
                    tran.execute(ReadRegs(dev, 0x10, "14s"))
            except LinkTimeoutException:
                continue
            break
        else:
            tprint("Timed out!")
            return False
        tprint("OK")

        if self.lock:
            tprint('Locking...')
            tran.execute(WriteRegs(BT.ESC, 0x70, '<H', 0x0001))
        else:
            tprint('Not Locking...')

        tprint('Starting...')
        tran.execute(StartUpdate(dev, fw_size))

        tprint('Writing...')

        page = 0
        chk = 0
        while fw_size:
            self.update_progress(page, fw_size // fw_page_size + 1)
            chunk_sz = min(fw_size, fw_page_size)
            data = fwfile.read(chunk_sz)
            chk = self.checksum(chk, data)
            tran.execute(
                WriteUpdate(dev, page,
                            data + b'\x00' * (fw_page_size - chunk_sz)))
            page += 1
            fw_size -= chunk_sz

        tprint('Finalizing...')
        tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF))

        tprint('Reboot')
        tran.execute(RebootUpdate(dev))
        tprint('Done')
        tprint('update finished')
        return True
Exemplo n.º 4
0
def UpdateFirmware(link, tran, dev, fwfile):
    fwfile.seek(0, os.SEEK_END)
    fw_size = fwfile.tell()
    fwfile.seek(0)
    fw_page_size = 0x80

    print("Pinging...", end="")
    for retry in range(PING_RETRIES):
        print(".", end="")
        try:
            if dev == BT.BLE:
                tran.execute(ReadRegs(dev, 0, "13s"))
            else:
                tran.execute(ReadRegs(dev, 0x10, "14s"))
        except LinkTimeoutException:
            continue
        break
    else:
        print("Timed out !")
        return False
    print("OK")

    if args.interface != "blefleet":
        print("Locking...")
        tran.execute(WriteRegs(BT.ESC, 0x70, "<H", 0x0001))
    else:
        print("Not Locking...")

    print("Starting...")
    tran.execute(StartUpdate(dev, fw_size))

    print("Writing...")
    pb = ProgressBar(maxval=fw_size // fw_page_size + 1).start()
    page = 0
    chk = 0
    while fw_size:
        pb.update(page)
        chunk_sz = min(fw_size, fw_page_size)
        data = fwfile.read(chunk_sz)
        chk = checksum(chk, data)
        # tran.execute(WriteUpdate(dev, page, data))
        tran.execute(
            WriteUpdate(dev, page, data + b"\x00" * (fw_page_size - chunk_sz))
        )  # TODO: Ninebot wants this padding. Will it work on M365 too?
        page += 1
        fw_size -= chunk_sz
    pb.finish()

    print("Finalizing...")
    tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF))

    print("Reboot")
    tran.execute(RebootUpdate(dev))
    print("Done")
    return True
Exemplo n.º 5
0
    def UpdateFirmware(self, link, tran, dev, fwfile):
        print('flashing ' + fwfilep + ' to ' + self.device)
        fwfile.seek(0, os.SEEK_END)
        fw_size = fwfile.tell()
        fwfile.seek(0)
        fw_page_size = 0x80

        dev = self.devices.get(self.device)
        print('Pinging...')
        for retry in range(PING_RETRIES):
            print('.')
            try:
                if dev == BT.BLE:
                    tran.execute(ReadRegs(dev, 0, '13s'))
                else:
                    tran.execute(ReadRegs(dev, 0x10, '14s'))
            except LinkTimeoutException:
                continue
            break
        else:
            print('Timed out !')
            return False
        print('OK')

        if self.interface != 'tcpnl':
            print('Locking...')
            tran.execute(WriteRegs(BT.ESC, 0x70, '<H', 0x0001))
        else:
            print('Not Locking...')

        print('Starting...')
        tran.execute(StartUpdate(dev, fw_size))

        print('Writing...')
        page = 0
        chk = 0
        while fw_size:
            chunk_sz = min(fw_size, fw_page_size)
            data = fwfile.read(chunk_sz)
            chk = checksum(chk, data)
            #tran.execute(WriteUpdate(dev, page, data))
            tran.execute(
                WriteUpdate(dev, page,
                            data + b'\x00' * (fw_page_size - chunk_sz)))
            page += 1
            fw_size -= chunk_sz

        print('Finalizing...')
        tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF))

        print('Reboot')
        tran.execute(RebootUpdate(dev))
        print('Done')
        return True
Exemplo n.º 6
0
def UpdateFirmware(link, tran, dev, fwfile):
    fwfile.seek(0, os.SEEK_END)
    fw_size = fwfile.tell()
    fwfile.seek(0)
    fw_page_size = 0x80

    print('Pinging...', end='')
    for retry in range(PING_RETRIES):
        print('.', end='')
        try:
            if dev == BT.BLE:
                tran.execute(ReadRegs(dev, 0, '13s'))
            else:
                tran.execute(ReadRegs(dev, 0x10, '14s'))
        except LinkTimeoutException:
            continue
        break
    else:
        print('Timed out !')
        return False
    print('OK')

    print('Locking...')
    tran.execute(WriteRegs(BT.ESC, 0x70, '<H', 0x0001))

    print('Starting...')
    tran.execute(StartUpdate(dev, fw_size))

    print('Writing...')
    pb = ProgressBar(maxval=fw_size // fw_page_size + 1).start()
    page = 0
    chk = 0
    while fw_size:
        pb.update(page)
        chunk_sz = min(fw_size, fw_page_size)
        data = fwfile.read(chunk_sz)
        chk = checksum(chk, data)
        #tran.execute(WriteUpdate(dev, page, data))
        tran.execute(
            WriteUpdate(dev, page, data + b'\x00' * (fw_page_size - chunk_sz))
        )  # TODO: Ninebot wants this padding. Will it work on M365 too?
        page += 1
        fw_size -= chunk_sz
    pb.finish()

    print('Finalizing...')
    tran.execute(FinishUpdate(dev, chk ^ 0xFFFFFFFF))

    print('Reboot')
    tran.execute(RebootUpdate(dev))
    print('Done')
    return True
Exemplo n.º 7
0
        exit("Timed out !")
    print("")

    #lock
    #tran.execute(WriteRegs(BT.ESC, 0x70, "<H", 0x01))

    old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0]
    print("Old S/N:", old_sn)

    uid3 = tran.execute(ReadRegs(BT.ESC, 0xDE, "<L"))[0]
    print("UID3: %08X" % (uid3))

    auth = CalcSnAuth(old_sn, new_sn, uid3)
    #auth = 0
    print("Auth: %08X" % (auth))

    try:
        tran.execute(WriteSN(BT.ESC, new_sn, auth))
        print("OK")
    except LinkTimeoutException:
        print("Timeout !")

    # save config and restart
    tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x01))
    sleep(3)

    old_sn = tran.execute(ReadRegs(BT.ESC, 0x10, "14s"))[0]
    print("Current S/N:", old_sn)

    link.close()
Exemplo n.º 8
0
# from py9b.link.ble import BLELink
from py9b.link.serial import SerialLink
from py9b.transport.base import BaseTransport as BT
from py9b.transport.packet import BasePacket as PKT

# from py9b.transport.xiaomi import XiaomiTransport
from py9b.transport.ninebot import NinebotTransport
from py9b.command.regio import ReadRegs, WriteRegs

# link = SerialLink(dump=True)
link = TCPLink()
# link = BLELink()

with link:
    print("Scanning...")
    ports = link.scan()
    print(ports)

    # tran = XiaomiTransport(link)
    tran = NinebotTransport(link)

    link.open(("127.0.0.20:6000"))
    # 	link.open(ports[0][1])
    print("Connected")

    print("Locking...")
    tran.execute(WriteRegs(BT.ESC, 0x70, "<H", 0x0001))

    link.close()
Exemplo n.º 9
0
 def reboot(self):
     tran = self.conn._tran
     tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x0001))
     tprint('Done')
Exemplo n.º 10
0
 def unlock(self):
     tran = self.conn._tran
     tran.execute(WriteRegs(BT.ESC, 0x71, "<H", 0x0001))
     tprint('Done')
Exemplo n.º 11
0
 def powerdown(self):
     tran = self.conn._tran
     tran.execute(WriteRegs(BT.ESC, 0x79, "<H", 0x0001))
     tprint('Done')
Exemplo n.º 12
0
def reboot(ctx):
    with ctx.obj as tran:
        tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x0001))
        print('Done')
Exemplo n.º 13
0
def unlock(ctx):
    with ctx.obj as tran:
        tran.execute(WriteRegs(BT.ESC, 0x71, "<H", 0x0001))
        print('Done')
Exemplo n.º 14
0
 def reboot(self):
     with self.c as tran:
         tran.execute(WriteRegs(BT.ESC, 0x78, "<H", 0x0001))
         tprint('Done')
Exemplo n.º 15
0
 def unlock(self):
     with self.c as tran:
         tran.execute(WriteRegs(BT.ESC, 0x71, "<H", 0x0001))
         tprint('Done')
Exemplo n.º 16
0
 def powerdown(self):
     with self.c as tran:
         tran.execute(WriteRegs(BT.ESC, 0x79, "<H", 0x0001))
         tprint('Done')
Exemplo n.º 17
0
def powerdown(ctx):
    with ctx.obj as tran:
        tran.execute(WriteRegs(BT.ESC, 0x79, "<H", 0x0001))
        print('Done')
Exemplo n.º 18
0
from py9b.link.base import LinkOpenException, LinkTimeoutException
from py9b.link.tcp import TCPLink
from py9b.link.ble import BLELink
from py9b.link.serial import SerialLink
from py9b.transport.base import BaseTransport as BT
from py9b.transport.packet import BasePacket as PKT
from py9b.transport.xiaomi import XiaomiTransport
from py9b.transport.ninebot import NinebotTransport
from py9b.command.regio import ReadRegs, WriteRegs

#link = SerialLink(dump=True)
#link = TCPLink()
link = BLELink()

with link:
    print "Scanning..."
    ports = link.scan()
    print ports

    #tran = XiaomiTransport(link)
    tran = NinebotTransport(link)

    #link.open(("192.168.1.45", 6000))
    link.open(ports[0][1])
    print "Connected"

    print('Power off...')
    tran.execute(WriteRegs(BT.ESC, 0x79, '<H', 0x0001))

    link.close()