#!/usr/bin/env python # ---------------------------------------------------------------------------- # "THE BEER-WARE LICENSE" (Revision 42): # Fabio Manz wrote this file. As long as you retain # this notice you can do whatever you want with this stuff. If we meet some day, # and you think this stuff is worth it, you can buy me a beer in return. # ---------------------------------------------------------------------------- import sys import re import requests import platform # For getting the operating system name import subprocess # For executing a shell command import os import time ip_regex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" def main(argv): print("--- flash2560 - Created by Fabio Manz ---") hostname = "192.168.4.1" input_file = "none" # Handle the command line arguments for index, arg in enumerate(argv): if arg == "-h" or arg == "--help": print_help() sys.exit(0) elif arg == "-H" or arg == "--hostname": if index + 1 < len(argv) and re.search(ip_regex, argv[index + 1]): hostname = argv[index + 1] if not ping(hostname): print("IP is not reachable:") sys.exit(2) else: print("IP address is not right") print_help() sys.exit(1) elif arg == "-f" or arg == "--file": if index + 1 < len(argv) and os.path.isfile(argv[index + 1]): input_file = argv[index + 1] else: print("Can't open file") print_help() sys.exit(3) if input_file == "none": print("No input file") print_help() sys.exit(4) response = requests.post('http://' + hostname + '/pgmmega/sync') # ------------ GET AVR in SYNC ---------------------------------------- if response.status_code != 204: print("Failed to reset the AVR (HTML ERROR: " + response.status_code + ")") sys.exit(5) while True: response = requests.get('http://' + hostname + '/pgmmega/sync') if "SYNC" in response.content.decode('ASCII'): print(response.content) break elif "NOT READY" not in response.content.decode('ASCII'): print("Could not get in Sync with AVR") sys.exit(7) time.sleep(0.1) # -------------- Upload HEX file ----------------------------------------- hex_file = open(input_file).read() response = requests.post('http://' + hostname + '/pgmmega/upload', data=hex_file, timeout=20.0) if "Success" in response.content.decode('ASCII'): print("+++++ Success :) ++++++") else: print("Failed :(") sys.exit(8) # Reset the avr to solve a bug in the bootloader that the program dows not start immediately time.sleep(0.1) requests.post('http://' + hostname + '/console/reset') sys.exit(0) def print_help(): print('\n') print("Usage: ") print("flash2560.py -H -f ") print("\nExample:") print("flash2560.py -H 192.168.4.1 -f Sketch.hex") def ping(host): param = '-n' if platform.system().lower() == 'windows' else '-c' command = ['ping', param, '1', host] output = open(os.devnull, 'w') return subprocess.call(command, stdout=output) == 0 if __name__ == "__main__": main(sys.argv[1:])