# This file is part of Beremiz
# Copyright (C) 2019: Edouard TISSERANT
# See COPYING file for copyrights details.
from __future__ import absolute_import
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor
from twisted.web.static import File
from autobahn.twisted.websocket import WebSocketServerFactory, WebSocketServerProtocol
from autobahn.twisted.resource import WebSocketResource
class HMISession(object):
def __init__(self, protocol_instance):
# TODO: kill existing session for robustness
assert(svghmi_session is None)
self.protocol_instance = protocol_instance
# svghmi_sessions.append(self)
# get a unique bit index amont other svghmi_sessions,
# so that we can match flags passed by C->python callback
# svghmi_sessions.remove(self)
def onMessage(self, msg):
# TODO : pass it to the C side recieve_message()
# - refresh rates / subsriptions
# TODO multiclient : pass client index as well
class HMIProtocol(WebSocketServerProtocol):
def __init__(self, *args, **kwargs):
WebSocketServerProtocol.__init__(self, *args, **kwargs)
self._hmi_session = HMISession(self)
def onClose(self, wasClean, code, reason):
def onMessage(self, msg, isBinary):
self._hmi_session.onMessage(msg)
#self.sendMessage(msg, binary)
# Called by PLCObject at start
def _runtime_svghmi0_start():
global svghmi_listener, svghmi_root
wsfactory = WebSocketServerFactory()
wsfactory.protocol = HMIProtocol
# svghmi_root.putChild("",File(".svg"))
svghmi_root.putChild("ws",WebSocketResource(wsfactory))
sitefactory = Site(svghmi_root)
svghmi_listener = reactor.listenTCP(8008, sitefactory)
# start a thread that call the C part of SVGHMI
# Called by PLCObject at stop
def _runtime_svghmi0_stop():
svghmi_listener.stopListening()