fetapi/webinterface.py

128 lines
3.8 KiB
Python
Raw Normal View History

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
2021-02-24 22:29:41 +01:00
from statemachine import InitState, RegisteringState, IdleState, SchelltState, AcceptingState, CallTerminatingState, ForgottenState, BusyBeepingState, CallRunningState, WecktState, ConnectingState, DialingState
import threading
2021-02-24 23:34:26 +01:00
import json
2021-02-22 15:39:57 +01:00
2021-02-24 22:29:41 +01:00
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)
2021-02-25 14:03:47 +01:00
def on_incoming_call(self):
super().on_incoming_call()
remote_number = self.web.controller.phone.get_remote_number()
self.web.send_event({"event": "incoming_call", "data": {"from": remote_number}})
2021-02-24 22:29:41 +01:00
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)
2021-02-24 20:59:20 +01:00
class WebDialingState(DialingState):
2021-02-24 22:29:41 +01:00
def __init__(self, web):
self.web = web
super().__init__(web.controller)
2021-02-24 20:59:20 +01:00
def on_nummernschalter_input(self, num):
super().on_nummernschalter_input(num)
2021-02-24 23:47:38 +01:00
self.web.send_event({"event": "num_entered", "data": {"number": int(num)}})
2021-02-24 20:59:20 +01:00
2021-02-22 15:39:57 +01:00
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)
2021-02-22 15:39:57 +01:00
pass
def root(self):
2021-02-22 15:39:57 +01:00
return "<h1>Hello world!</h1>"
def publish_status(self):
2021-02-24 23:47:38 +01:00
state_name = self.controller.state.__class__.__name__
new_state = eval("Web" + state_name)(self)
2021-02-24 22:29:41 +01:00
self.controller.state = new_state
2021-02-24 23:47:38 +01:00
data = {"state": state_name}
data = json.dumps(data)
for ws in self.websockets:
2021-02-24 23:47:38 +01:00
ws.send(data)
2021-02-24 23:34:26 +01:00
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)