kilnController/picoreflowd.py

115 wiersze
2.8 KiB
Python
Czysty Zwykły widok Historia

2013-11-23 23:21:26 +00:00
import threading,time,logging,json
2013-11-23 21:25:20 +00:00
import bottle
from gevent.pywsgi import WSGIServer
from geventwebsocket import WebSocketHandler, WebSocketError
2013-11-23 23:21:26 +00:00
from oven import Oven
log_format = '%(asctime)s %(levelname)s %(name)s: %(message)s'
logging.basicConfig(level = logging.DEBUG, format = log_format)
log = logging.getLogger("picoreflowd")
2013-11-23 21:25:20 +00:00
app = bottle.Bottle()
oven = Oven()
oven.start()
wsocks = []
wsocks_control = []
def notifyAll(message):
message_json = json.dumps(message)
2013-11-23 23:21:26 +00:00
log.debug("sending to %d clients: %s"%(len(wsocks),message_json))
for wsock in wsocks:
if wsock:
try:
wsock.send(message_json)
except:
2013-11-23 23:21:26 +00:00
log.error("could not write to socket %s"%wsock)
wsocks.remove(wsock)
else:
wsocks.remove(wsock)
2013-11-23 21:25:20 +00:00
class OvenWatcher(threading.Thread):
def __init__(self,oven):
threading.Thread.__init__(self)
self.daemon = True
2013-11-23 21:25:20 +00:00
self.oven = oven
2013-11-23 21:25:20 +00:00
def run(self):
while True:
oven_state = self.oven.get_state()
notifyAll(oven_state)
time.sleep(1)
2013-11-23 21:25:20 +00:00
ovenWatcher = OvenWatcher(oven)
ovenWatcher.start()
2013-11-23 22:26:06 +00:00
@app.route('/')
def index():
return bottle.redirect('/picoreflow/index.html')
@app.route('/picoreflow/:filename#.*#')
def send_static(filename):
2013-11-23 23:21:26 +00:00
log.debug("serving %s"%filename)
2013-11-23 22:26:06 +00:00
return bottle.static_file(filename, root='./public/')
2013-11-23 21:25:20 +00:00
@app.route('/run')
def start_oven():
oven.run_profile("abc")
2013-11-23 21:25:20 +00:00
return "Starting"
@app.route('/control')
def handle_control():
env = bottle.request.environ;
print env
wsock = env.get('wsgi.websocket')
if not wsock:
abort(400, 'Expected WebSocket request.')
2013-11-23 21:25:20 +00:00
wsocks_control.append(wsock)
while True:
try:
message = wsock.receive()
wsock.send("Your message was: %r" % message)
if message == "start":
2013-11-23 23:21:26 +00:00
log.info("Start command received")
2013-11-23 21:25:20 +00:00
oven.run_profile("abc")
elif message == "stop":
2013-11-23 23:21:26 +00:00
log.info("Stop command received")
2013-11-23 21:25:20 +00:00
oven.abort_run()
except WebSocketError:
break
2013-11-23 21:25:20 +00:00
@app.route('/status')
def handle_websocket():
env = bottle.request.environ;
print env
wsock = env.get('wsgi.websocket')
if not wsock:
abort(400, 'Expected WebSocket request.')
2013-11-23 21:25:20 +00:00
wsocks.append(wsock)
while True:
try:
message = wsock.receive()
wsock.send("Your message was: %r" % message)
except WebSocketError:
break
2013-11-23 21:25:20 +00:00
def main():
2013-11-23 23:21:26 +00:00
ip = "0.0.0.0"
port = 8080
log.info("Starting picoreflowd")
log.info("listening to %s:%d"%(ip,port))
server = WSGIServer((ip,port), app,
2013-11-23 21:25:20 +00:00
handler_class=WebSocketHandler)
server.serve_forever()
if __name__ == "__main__":
main()