diff -r 41fc23fd21c4 -r 361366b891ca svghmi/svghmi_server.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svghmi/svghmi_server.py Wed Sep 11 12:24:30 2019 +0200 @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# 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 + +# TODO session list lock +svghmi_sessions = [] + +class HMISession(object): + def __init__(self, protocol_instance): + global svghmi_sessions + svghmi_sessions.append(self) + + # TODO multiclient : + # get a unique bit index amont other svghmi_sessions, + # so that we can match flags passed by C->python callback + + def __del__(self): + global svghmi_sessions + svghmi_sessions.remove(self) + + def onMessage(): + # TODO : pass it to the C side recieve_message() + # update HMITree + # - values + # - refresh rates / subsriptions + + # TODO multiclient : pass client index as well + pass + + +class HMIProtocol(WebSocketServerProtocol): + + def __init__(self, *args, **kwargs): + self._hmi_session = None + WebSocketServerProtocol.__init__(self, *args, **kwargs) + + def onOpen(self): + self._hmi_session = HMISession(self) + print "open" + + def onClose(self, wasClean, code, reason): + del self._hmi_session + self._hmi_session = None + print "close" + + def onMessage(self, msg, isBinary): + self._hmi_session.onMessage(msg) + print msg + #self.sendMessage(msg, binary) + +svghmi_root = None +svghmi_listener = None + +# Called by PLCObject at start +def _runtime_svghmi0_start(): + global svghmi_listener, svghmi_root + + svghmi_root = Resource() + + 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) + + # TODO + # start a thread that call the C part of SVGHMI + + +# Called by PLCObject at stop +def _runtime_svghmi0_stop(): + global svghmi_listener + svghmi_listener.stopListening