ble_dfu = BleDfuControllerSecure(options.address.upper(), hexfile,
                                             datfile)
        else:
            ble_dfu = BleDfuControllerLegacy(options.address.upper(), hexfile,
                                             datfile)

        # Initialize inputs
        ble_dfu.input_setup()

        #ble_dfu.switch_to_dfu_mode()
        print " 1 switch to DFU success? "
        # Connect to peer device. Assume application mode switch to dfu mode.
        if ble_dfu.scan_and_connect():
            #success = ble_dfu.switch_to_dfu_mode()
            print " already in  DFU "
            ble_dfu.start()
        else:
            print "scan and connect was no success "
        if ble_dfu.scan_and_connect():
            print " already in  DFU "
            ble_dfu.start()
        else:
            print "scan and connect was no success "

        #    if not success:
        #        if ble_dfu.scan_and_connect():
        #            success = ble_dfu.switch_to_dfu_mode()
        #            print "switch to DFU success? %s"  % success
        if not ble_dfu.check_DFU_mode():
            print "Need to switch to DFU mode"
        #        success = ble_dfu.switch_to_dfu_mode()
Exemple #2
0
def main():

    try:
        parser = optparse.OptionParser(
            usage=
            '%prog -f <hex_file> -a <dfu_target_address>\n\nExample:\n\tdfu.py -f application.hex -d application.dat -a cd:e3:4a:47:1c:e4',
            version='0.5')

        parser.add_option('-a',
                          '--address',
                          action='store',
                          dest="address",
                          type="string",
                          default=None,
                          help='DFU target address.')

        parser.add_option('-f',
                          '--file',
                          action='store',
                          dest="hexfile",
                          type="string",
                          default=None,
                          help='hex file to be uploaded.')

        parser.add_option('-d',
                          '--dat',
                          action='store',
                          dest="datfile",
                          type="string",
                          default=None,
                          help='dat file to be uploaded.')

        parser.add_option('-z',
                          '--zip',
                          action='store',
                          dest="zipfile",
                          type="string",
                          default=None,
                          help='zip file to be used.')

        parser.add_option('--secure',
                          action='store_true',
                          dest='secure_dfu',
                          default=True,
                          help='Use secure bootloader (Nordic SDK > 12)')

        parser.add_option('--legacy',
                          action='store_false',
                          dest='secure_dfu',
                          help='Use secure bootloader (Nordic SDK < 12)')

        parser.add_option('-v',
                          '--verbose',
                          action='store_true',
                          dest='verbose',
                          help='Enable verbose mode')
        options, args = parser.parse_args()

    except Exception as e:
        print(e)
        print("For help use --help")
        sys.exit(2)

    try:
        ''' Validate input parameters '''

        if not options.address:
            parser.print_help()
            exit(2)

        unpacker = None
        hexfile = None
        datfile = None

        if options.zipfile != None:

            if (options.hexfile != None) or (options.datfile != None):
                print("Conflicting input directives")
                exit(2)

            unpacker = Unpacker()
            #print options.zipfile
            try:
                hexfile, datfile = unpacker.unpack_zipfile(options.zipfile)
            except Exception as e:
                print("ERR")
                print(e)
                pass

        else:
            if (not options.hexfile) or (not options.datfile):
                parser.print_help()
                exit(2)

            if not os.path.isfile(options.hexfile):
                print("Error: Hex file doesn't exist")
                exit(2)

            if not os.path.isfile(options.datfile):
                print("Error: DAT file doesn't exist")
                exit(2)

            hexfile = options.hexfile
            datfile = options.datfile
        ''' Start of Device Firmware Update processing '''

        if options.verbose:
            init_msg = \
"""
    ================================
    ==                            ==
    ==         DFU Server         ==
    ==                            ==
    ================================
"""
            # print "DFU Server start"
            print(init_msg)

        if options.secure_dfu:
            ble_dfu = BleDfuControllerSecure(options.address.upper(), hexfile,
                                             datfile)
        else:
            ble_dfu = BleDfuControllerLegacy(options.address.upper(), hexfile,
                                             datfile)

        # Initialize inputs
        ble_dfu.input_setup()

        # Connect to peer device. Assume application mode.
        if ble_dfu.scan_and_connect():
            if not ble_dfu.check_DFU_mode():
                print("Need to switch to DFU mode")
                success = ble_dfu.switch_to_dfu_mode()
                if not success:
                    print("Couldn't reconnect")
        else:
            # The device might already be in DFU mode (MAC + 1)
            ble_dfu.target_mac_increase(1)

            # Try connection with new address
            print("Couldn't connect, will try DFU MAC")
            if not ble_dfu.scan_and_connect():
                raise Exception("Can't connect to device")

        ble_dfu.start()

        # Disconnect from peer device if not done already and clean up.
        ble_dfu.disconnect()

    except Exception as e:
        # print traceback.format_exc()
        print("Exception at line {}: {}".format(sys.exc_info()[2].tb_lineno,
                                                e))
        pass

    except:
        pass

    # If Unpacker for zipfile used then delete Unpacker
    if unpacker != None:
        unpacker.delete()

    if options.verbose:
        print("DFU Server done")