BlocklyDuino - with additional blocks for the ZeeDee.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

151 lines
5.0 KiB

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# credit: http://sheep.art.pl/Wiki%20Engine%20in%20Python%20from%20Scratch
import BaseHTTPServer
import SimpleHTTPServer
import itertools
import logging
import platform
import os
import re
import subprocess
import tempfile
import urllib
from optparse import OptionParser
logging.basicConfig(level=logging.DEBUG)
arduino_cmd = None
def get_arduino_command():
"""Attempt to find or guess the path to the Arduino binary."""
global arduino_cmd
if not arduino_cmd:
if platform.system() == "Darwin":
arduino_cmd_guesses = ["/Applications/Arduino.app/Contents/MacOS/Arduino"]
elif platform.system() == "Windows":
arduino_cmd_guesses = [
"c:\Program Files\Arduino\Arduino.exe",
"c:\Program Files (x86)\Arduino\Arduino.exe"
]
else:
arduino_cmd_guesses = []
for guess in arduino_cmd_guesses:
if os.path.exists(guess):
logging.info("Found Arduino command at %s", guess)
arduino_cmd = guess
break
else:
logging.info("Couldn't find Arduino command; hoping it's on the path!")
arduino_cmd = "arduino"
return arduino_cmd
def guess_port_name():
"""Attempt to guess a port name that we might find an Arduino on."""
portname = None
if platform.system() == "Windows":
import _winreg as winreg
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM")
# We'll guess it's the last COM port.
for i in itertools.count():
try:
portname = winreg.EnumValue(key, i)[1]
except WindowsError:
break
else:
# We'll guess it's the first non-bluetooth tty. or cu. prefixed device
ttys = [filename for filename in os.listdir("/dev")
if (filename.startswith("tty.") or filename.startswith("cu."))
and not "luetooth" in filename]
ttys.sort(key=lambda k:(k.startswith("cu."), k))
if ttys:
portname = "/dev/" + ttys[0]
logging.info("Guessing port name as %s", portname)
return portname
parser = OptionParser()
parser.add_option("--port", dest="port", help="Upload to serial port named PORT", metavar="PORT")
parser.add_option("--board", dest="board", help="Board definition to use", metavar="BOARD")
parser.add_option("--command", dest="cmd", help="Arduino command name", metavar="CMD")
class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_HEAD(self):
"""Send response headers"""
if self.path != "/":
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_HEAD(self)
self.send_response(200)
self.send_header("content-type", "text/html;charset=utf-8")
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
def do_GET(self):
"""Send page text"""
if self.path != "/":
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
else:
self.send_response(302)
self.send_header("Location", "/blockly/apps/blocklyduino/index.html")
self.end_headers()
def do_POST(self):
"""Save new page text and display it"""
if self.path != "/":
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_POST(self)
options, args = parser.parse_args()
length = int(self.headers.getheader('content-length'))
if length:
text = self.rfile.read(length)
print "sketch to upload: " + text
dirname = tempfile.mkdtemp()
sketchname = os.path.join(dirname, os.path.basename(dirname)) + ".ino"
f = open(sketchname, "wb")
f.write(text + "\n")
f.close()
print "created sketch at %s" % (sketchname,)
# invoke arduino to build/upload
compile_args = [
options.cmd or get_arduino_command(),
"--upload",
"--port",
options.port or guess_port_name(),
]
if options.board:
compile_args.extend([
"--board",
options.board
])
compile_args.append(sketchname)
print "Uploading with %s" % (" ".join(compile_args))
rc = subprocess.call(compile_args)
if not rc == 0:
print "arduino --upload returned " + `rc`
self.send_response(400)
else:
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
else:
self.send_response(400)
if __name__ == '__main__':
print "Blocklyduino can now be accessed at http://127.0.0.1:8080/"
server = BaseHTTPServer.HTTPServer(("127.0.0.1", 8080), Handler)
server.pages = {}
server.serve_forever()