|
|
@ -8,14 +8,14 @@ |
|
|
|
# ------------------------------------------------------------------------------- |
|
|
|
from __future__ import print_function |
|
|
|
|
|
|
|
import shutil |
|
|
|
import argparse |
|
|
|
import os |
|
|
|
import re |
|
|
|
import shutil |
|
|
|
import socket |
|
|
|
import subprocess |
|
|
|
import sys |
|
|
|
import time |
|
|
|
import os |
|
|
|
|
|
|
|
from zeroconf import ServiceBrowser, ServiceStateChange, Zeroconf |
|
|
|
|
|
|
@ -33,6 +33,7 @@ description = "ESPurna OTA Manager v0.3" |
|
|
|
devices = [] |
|
|
|
discover_last = 0 |
|
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
def on_service_state_change(zeroconf, service_type, name, state_change): |
|
|
@ -61,7 +62,7 @@ def on_service_state_change(zeroconf, service_type, name, state_change): |
|
|
|
} |
|
|
|
|
|
|
|
for key, item in info.properties.items(): |
|
|
|
device[key.decode('UTF-8')] = item.decode('UTF-8'); |
|
|
|
device[key.decode('UTF-8')] = item.decode('UTF-8') |
|
|
|
|
|
|
|
# rename fields (needed for sorting by name) |
|
|
|
device['app'] = device['app_name'] |
|
|
@ -75,35 +76,35 @@ def list_devices(): |
|
|
|
""" |
|
|
|
Shows the list of discovered devices |
|
|
|
""" |
|
|
|
output_format="{:>3} {:<14} {:<15} {:<17} {:<12} {:<12} {:<25} {:<8} {:<8} {:<10}" |
|
|
|
output_format = "{:>3} {:<14} {:<15} {:<17} {:<12} {:<12} {:<25} {:<8} {:<8} {:<10}" |
|
|
|
print(output_format.format( |
|
|
|
"#", |
|
|
|
"HOSTNAME", |
|
|
|
"IP", |
|
|
|
"MAC", |
|
|
|
"APP", |
|
|
|
"VERSION", |
|
|
|
"DEVICE", |
|
|
|
"MEM_SIZE", |
|
|
|
"SDK_SIZE", |
|
|
|
"FREE_SPACE" |
|
|
|
"#", |
|
|
|
"HOSTNAME", |
|
|
|
"IP", |
|
|
|
"MAC", |
|
|
|
"APP", |
|
|
|
"VERSION", |
|
|
|
"DEVICE", |
|
|
|
"MEM_SIZE", |
|
|
|
"SDK_SIZE", |
|
|
|
"FREE_SPACE" |
|
|
|
)) |
|
|
|
print("-" * 139) |
|
|
|
|
|
|
|
index = 0 |
|
|
|
for device in devices: |
|
|
|
index = index + 1 |
|
|
|
index += 1 |
|
|
|
print(output_format.format( |
|
|
|
index, |
|
|
|
device.get('hostname', ''), |
|
|
|
device.get('ip', ''), |
|
|
|
device.get('mac', ''), |
|
|
|
device.get('app_name', ''), |
|
|
|
device.get('app_version', ''), |
|
|
|
device.get('target_board', ''), |
|
|
|
device.get('mem_size', 0), |
|
|
|
device.get('sdk_size', 0), |
|
|
|
device.get('free_space', 0), |
|
|
|
index, |
|
|
|
device.get('hostname', ''), |
|
|
|
device.get('ip', ''), |
|
|
|
device.get('mac', ''), |
|
|
|
device.get('app_name', ''), |
|
|
|
device.get('app_version', ''), |
|
|
|
device.get('target_board', ''), |
|
|
|
device.get('mem_size', 0), |
|
|
|
device.get('sdk_size', 0), |
|
|
|
device.get('free_space', 0), |
|
|
|
)) |
|
|
|
|
|
|
|
print() |
|
|
@ -120,11 +121,13 @@ def get_boards(): |
|
|
|
boards.append(m.group(1)) |
|
|
|
return sorted(boards) |
|
|
|
|
|
|
|
|
|
|
|
def get_device_size(device): |
|
|
|
if device.get('mem_size', 0) == device.get('sdk_size', 0): |
|
|
|
return int(device.get('mem_size', 0)) / 1024 |
|
|
|
return 0 |
|
|
|
|
|
|
|
|
|
|
|
def get_empty_board(): |
|
|
|
""" |
|
|
|
Returns the empty structure of a board to flash |
|
|
@ -132,12 +135,13 @@ def get_empty_board(): |
|
|
|
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): |
|
|
|
if 1 <= index <= len(devices): |
|
|
|
device = devices[index - 1] |
|
|
|
board['hostname'] = device.get('hostname') |
|
|
|
board['board'] = device.get('target_board', '') |
|
|
@ -145,6 +149,7 @@ def get_board_by_index(index): |
|
|
|
board['size'] = get_device_size(device) |
|
|
|
return board |
|
|
|
|
|
|
|
|
|
|
|
def get_board_by_mac(mac): |
|
|
|
""" |
|
|
|
Returns the required data to flash a given board |
|
|
@ -161,6 +166,7 @@ def get_board_by_mac(mac): |
|
|
|
return board |
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
def get_board_by_hostname(hostname): |
|
|
|
""" |
|
|
|
Returns the required data to flash a given board |
|
|
@ -178,6 +184,7 @@ def get_board_by_hostname(hostname): |
|
|
|
return board |
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
def input_board(): |
|
|
|
""" |
|
|
|
Grabs info from the user about what device to flash |
|
|
@ -192,7 +199,7 @@ def input_board(): |
|
|
|
print("Board number must be between 1 and %s\n" % str(len(devices))) |
|
|
|
return None |
|
|
|
|
|
|
|
board = get_board_by_index(index); |
|
|
|
board = get_board_by_index(index) |
|
|
|
|
|
|
|
# Choose board type if none before |
|
|
|
if len(board.get('board', '')) == 0: |
|
|
@ -202,7 +209,7 @@ def input_board(): |
|
|
|
boards = get_boards() |
|
|
|
for name in boards: |
|
|
|
print("%3d\t%s" % (count, name)) |
|
|
|
count = count + 1 |
|
|
|
count += 1 |
|
|
|
print() |
|
|
|
try: |
|
|
|
index = int(input("Choose the board type you want to flash: ")) |
|
|
@ -227,9 +234,11 @@ def input_board(): |
|
|
|
|
|
|
|
return board |
|
|
|
|
|
|
|
|
|
|
|
def boardname(board): |
|
|
|
return board.get('hostname', board['ip']) |
|
|
|
|
|
|
|
|
|
|
|
def store(device, env): |
|
|
|
source = ".pioenvs/%s/firmware.elf" % env |
|
|
|
destination = ".pioenvs/elfs/%s.elf" % boardname(device).lower() |
|
|
@ -240,6 +249,7 @@ def store(device, env): |
|
|
|
|
|
|
|
shutil.move(source, destination) |
|
|
|
|
|
|
|
|
|
|
|
def run(device, env): |
|
|
|
print("Building and flashing image over-the-air...") |
|
|
|
environ = os.environ.copy() |
|
|
@ -253,6 +263,7 @@ def run(device, env): |
|
|
|
|
|
|
|
store(device, env) |
|
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
@ -277,8 +288,8 @@ if __name__ == '__main__': |
|
|
|
browser = ServiceBrowser(zeroconf, "_arduino._tcp.local.", handlers=[on_service_state_change]) |
|
|
|
discover_last = time.time() |
|
|
|
while time.time() < discover_last + DISCOVER_TIMEOUT: |
|
|
|
None |
|
|
|
#zeroconf.close() |
|
|
|
pass |
|
|
|
# zeroconf.close() |
|
|
|
|
|
|
|
if len(devices) == 0: |
|
|
|
print("Nothing found!\n") |
|
|
|