Browse Source

Added option to flash multiple devices from the ESPurna OTA Manager at once

i18n
Xose Pérez 7 years ago
parent
commit
ec3c5f5699
1 changed files with 84 additions and 24 deletions
  1. +84
    -24
      code/ota.py

+ 84
- 24
code/ota.py View File

@ -103,8 +103,48 @@ def get_boards():
boards.append(m.group(1))
return sorted(boards)
def get_empty_board():
"""
Returns the empty structure of a board to flash
"""
board = {'board': '', 'ip': '', 'size': 0, 'auth': '', 'flags': ''}
return board
def get_board_by_index(index):
"""
Returns the required data to flash a given board
"""
board = {}
if 1 <= index and index <= len(devices):
device = devices[index - 1]
board['hostname'] = device.get('hostname')
board['board'] = device.get('device', '')
board['ip'] = device.get('ip', '')
board['size'] = int(device.get('mem_size', 0) if device.get('mem_size', 0) == device.get('sdk_size', 0) else 0) / 1024
return board
def flash():
def get_board_by_hostname(hostname):
"""
Returns the required data to flash a given board
"""
hostname = hostname.lower()
for device in devices:
if device.get('hostname', '').lower() == hostname:
board = {}
board['hostname'] = device.get('hostname')
board['board'] = device.get('device')
if not board['board']:
return None
board['ip'] = device.get('ip')
if not board['ip']:
return None
board['size'] = int(device.get('sdk_size', 0)) / 1024
if board['size'] == 0:
return None
return board
return None
def input_board():
"""
Grabs info from the user about what device to flash
"""
@ -118,16 +158,10 @@ def flash():
print("Board number must be between 1 and %s\n" % str(len(devices)))
return None
board = {'board': '', 'ip': '', 'size': 0, 'auth': '', 'flags': ''}
if index > 0:
device = devices[index - 1]
board['board'] = device.get('device', '')
board['ip'] = device.get('ip', '')
board['size'] = int(device.get('mem_size', 0) if device.get('mem_size', 0) == device.get('sdk_size', 0) else 0) / 1024
board = get_board_by_index(index);
# Choose board type if none before
if len(board['board']) == 0:
if len(board.get('board', '')) == 0:
print()
count = 1
@ -146,7 +180,7 @@ def flash():
board['board'] = boards[index - 1]
# Choose board size of none before
if board['size'] == 0:
if board.get('size', 0) == 0:
try:
board['size'] = int(input("Board memory size (1 for 1M, 4 for 4M): "))
except:
@ -154,20 +188,18 @@ def flash():
return None
# Choose IP of none before
if len(board['ip']) == 0:
if len(board.get('ip', '')) == 0:
try:
board['ip'] = input("IP of the device to flash (empty for 192.168.4.1): ") or "192.168.4.1"
except:
print("Wrong IP")
return None
board['auth'] = input("Authorization key of the device to flash: ")
board['flags'] = input("Extra flags for the build: ")
return board
def run(device, env):
print("Building and flashing image over-the-air...")
command = "export ESPURNA_IP=\"%s\"; export ESPURNA_BOARD=\"%s\"; export ESPURNA_AUTH=\"%s\"; export ESPURNA_FLAGS=\"%s\"; platformio run --silent --environment %s -t upload"
command = command % (device['ip'], device['board'], device['auth'], device['flags'], env)
subprocess.check_call(command, shell=True)
@ -181,7 +213,10 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser(description=description)
parser.add_argument("-c", "--core", help="flash ESPurna core", default=0, action='count')
parser.add_argument("-f", "--flash", help="flash device", default=0, action='count')
parser.add_argument("-o", "--flags", help="extra flags", default='')
parser.add_argument("-p", "--password", help="auth password", default='')
parser.add_argument("-s", "--sort", help="sort devices list by field", default='hostname')
parser.add_argument("hostnames", nargs='*', help="Hostnames to update")
args = parser.parse_args()
print()
@ -210,24 +245,49 @@ if __name__ == '__main__':
# Flash device
if args.flash > 0:
device = flash()
if device:
# Board(s) to flash
queue = []
# Check if hostnames
for hostname in args.hostnames:
board = get_board_by_hostname(hostname)
if board:
board['auth'] = args.password
board['flags'] = args.flags
queue.append(board)
# If no boards ask the user
if len(queue) == 0:
board = input_board()
if board:
board['auth'] = args.password or input("Authorization key of the device to flash: ")
board['flags'] = args.flags or input("Extra flags for the build: ")
queue.append(board)
# If still no boards quit
if len(queue) == 0:
sys.exit(0)
# Flash eash board
for board in queue:
# Flash core version?
if args.core > 0:
device['flags'] = "-DESPURNA_CORE " + device['flags']
board['flags'] = "-DESPURNA_CORE " + board['flags']
env = "esp8266-%sm-ota" % device['size']
env = "esp8266-%sm-ota" % board['size']
# Summary
print()
print("ESPURNA_IP = %s" % device['ip'])
print("ESPURNA_BOARD = %s" % device['board'])
print("ESPURNA_AUTH = %s" % device['auth'])
print("ESPURNA_FLAGS = %s" % device['flags'])
print("ESPURNA_ENV = %s" % env)
print("HOST = %s" % board.get('hostname', board['ip']))
print("IP = %s" % board['ip'])
print("BOARD = %s" % board['board'])
print("AUTH = %s" % board['auth'])
print("FLAGS = %s" % board['flags'])
print("ENV = %s" % env)
response = input("\nAre these values right [y/N]: ")
print()
if response == "y":
run(device, env)
run(board, env)

Loading…
Cancel
Save