Initial commit

master
George Knowlden 7 years ago
commit 100eebf6d5

2
.gitignore vendored

@ -0,0 +1,2 @@
venv/
__pycache__/

@ -0,0 +1,98 @@
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
# To handle requests
import json
# Get the host IP
import netifaces as ni
ni.ifaddresses("wlan0")
ip = ni.ifaddresses("wlan0")[ni.AF_INET][0]["addr"]
print("Host IP address:", ip)
# Get the host port
from tornado.options import define, options
define("port", default=8080, help="run on the given port", type=int)
# Our program for reading/writing to our output
import led
class IndexHandler(tornado.web.RequestHandler):
def get(self):
# TODO: render all the controls automatically depending on what we have connected
self.render("index.html", ip = ip, port = options.port)
ws_clients = []
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
if self not in ws_clients:
print("New connection")
ws_clients.append(self)
#self.write_message("Connected")
def on_message(self, message):
print("Message received:", message)
#self.write_message("Message received: " + message)
message = json.loads(message) #load the json
if message["message_type"] == "io_request":
# We have something that we need to do
if message["io_type"] == "led":
colour = message["led_colour"]
operation = message["operation"]
if operation == "toggle":
result = led.toggle(colour)
response = {"message_type": "io_response",
"io_type": "led",
"led_colour": colour,
"led_state": result}
send_to_all(json.dumps(response))
if operation == "read":
result = led.read(colour)
response = {"message_type": "io_response",
"io_type": "led",
"led_colour": colour,
"led_state": result}
send_to_all(json.dumps(response))
# if message == "BUTTON_PRESS":
# result = led.toggle()
# send_to_all("LED_STATE " + str(result))
# if message == "GET_STATES":
# states = led.read("R")
# send_to_all("LED_STATE" + str(states))
def on_close(self):
if self in ws_clients:
ws_clients.remove(self)
print("Connection closed")
def send_to_all(message):
for c in ws_clients:
c.write_message(message)
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
(r"/", IndexHandler),
(r"/ws", WebSocketHandler)
]
)
httpServer = tornado.httpserver.HTTPServer(app)
httpServer.listen(options.port)
print("Listening on port:", options.port)
tornado.ioloop.IOLoop.instance().start()

@ -0,0 +1,77 @@
<!DOCTYPE HTML>
<html>
<head>
<style>
body { margin: 0px; padding: 0px; }
canvas { border: 1px solid #9C9898; }
</style>
<script>
var socket = new WebSocket("ws://{{ ip }}:{{ port }}/ws");
socket.onopen = function(){
console.log("Connected");
//get initial states
var leds = ["R", "G"];
for (var i = 0; i < leds.length; i++) {
request = {"message_type": "io_request",
"io_type": "led",
"led_colour": leds[i],
"operation": "read"};
sendMessage(request);
}
};
socket.onmessage = function (message) {
console.log("receiving: " + message.data);
processInstruction(message.data);
};
function processInstruction(instruction) {
var instruction_json = JSON.parse(instruction);
console.log(instruction_json.message_type);
console.log(typeof instruction_json.message_type);
if (instruction_json.message_type == "io_response") {
console.log("here");
if (instruction_json.io_type == "led") {
console.log("here2");;
var colour = instruction_json.led_colour;
var state = instruction_json.led_state;
document.getElementById(colour).innerHTML = "LED state: " + state;
}
}
}
socket.onclose = function(){
console.log("disconnected");
};
sendMessage = function(message) {
socket.send(JSON.stringify(message));
};
function buttonPress(colour) {
var request = {"message_type": "io_request",
"io_type": "led",
"led_colour": colour,
"operation": "toggle"};
sendMessage(request);
}
</script>
</head>
<body>
<div id="container"></div>
<h1>Controller</h1>
<table>
<tr>
<td><button onClick="buttonPress('R')">Toggle red LED</button></td>
<td><p id="R">LED state: ?</p></td>
</tr>
<tr>
<td><button onClick="buttonPress('G')">Toggle green LED</button></td>
<td><p id="G">LED state: ?</p></td>
</tr>
</table>
</body>
</html>

@ -0,0 +1,35 @@
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
pins = [19, 26]
GPIO.setup(pins, GPIO.OUT, initial=GPIO.LOW)
def colour_to_pin(colour):
if colour == "R":
return 19
if colour == "G":
return 26
else:
return False
def on(colour):
pin = colour_to_pin(colour)
GPIO.output(pin, GPIO.HIGH)
def off(colour):
pin = colour_to_pin(colour)
GPIO.output(pin, GPIO.LOW)
def read(colour):
pin = colour_to_pin(colour)
return GPIO.input(pin)
def toggle(colour):
if read(colour):
off(colour)
return 0
else:
on(colour)
return 1

@ -0,0 +1,4 @@
netifaces==0.10.9
pkg-resources==0.0.0
RPi.GPIO==0.6.5
tornado==6.0.1
Loading…
Cancel
Save