123 lines
3.6 KiB
Python
123 lines
3.6 KiB
Python
from bottle import route, get, static_file, run
|
|
from bottle.ext.websocket import GeventWebSocketServer
|
|
from bottle.ext.websocket import websocket
|
|
from os.path import join as pathjoin
|
|
from statemachine import InitState, RegisteringState, IdleState, SchelltState, AcceptingState, CallTerminatingState, ForgottenState, BusyBeepingState, CallRunningState, WecktState, ConnectingState, DialingState
|
|
import threading
|
|
import json
|
|
|
|
class WebInitState(InitState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebRegisteringState(RegisteringState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebIdleState(IdleState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebSchelltState(SchelltState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebAcceptingState(AcceptingState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebCallTerminatingState(CallTerminatingState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebForgottenState(ForgottenState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebBusyBeepingState(BusyBeepingState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebCallRunningState(CallRunningState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebWecktState(WecktState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebConnectingState(ConnectingState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
class WebDialingState(DialingState):
|
|
def __init__(self, web):
|
|
self.web = web
|
|
super().__init__(web.controller)
|
|
|
|
def on_nummernschalter_input(self, num):
|
|
super().on_nummernschalter_input(num)
|
|
self.web.send_event({"event": "num_entered", "data": {"number": int(num)}})
|
|
|
|
|
|
class FeTapWeb():
|
|
def __init__(self, config, statemachine_controller):
|
|
self.config = config
|
|
self.controller = statemachine_controller
|
|
self.config = {"host": "0.0.0.0", "port": 8080}
|
|
self.websockets = []
|
|
route("/")(self.root)
|
|
get("/ws", apply=[websocket])(self.ws_connect)
|
|
route('/<path:path>')(self.statics)
|
|
pass
|
|
|
|
def root(self):
|
|
return "<h1>Hello world!</h1>"
|
|
|
|
def publish_status(self):
|
|
state_name = self.controller.state.__class__.__name__
|
|
new_state = eval("Web" + state_name)(self)
|
|
self.controller.state = new_state
|
|
data = {"state": state_name}
|
|
data = json.dumps(data)
|
|
for ws in self.websockets:
|
|
ws.send(data)
|
|
|
|
def send_event(self, js_event):
|
|
data = json.dumps(js_event)
|
|
for ws in self.websockets:
|
|
ws.send(data)
|
|
|
|
def ws_connect(self, ws):
|
|
self.websockets.append(ws)
|
|
while True:
|
|
data = ws.receive()
|
|
if data != None:
|
|
print(data)
|
|
else:
|
|
break
|
|
self.websockets.remove(ws)
|
|
|
|
def statics(self, path):
|
|
return static_file(path, root="./webinterface")
|
|
|
|
def start(self):
|
|
self.__running = True
|
|
w = threading.Thread(target=self.__webthread)
|
|
w.start()
|
|
|
|
def __webthread(self):
|
|
run(host=self.config["host"], port=self.config["port"], server=GeventWebSocketServer)
|
|
|