# HG changeset patch # User Edouard Tisserant # Date 1529738195 -7200 # Node ID b579e2155d02d02dfac2877b1aa66017b58ebd84 # Parent b7d803fc44dba3211bcb113544c6eddc4815ffcd# Parent 7f59aa39866926bcc2e2494f5f6e82dced810b83 merge diff -r b7d803fc44db -r b579e2155d02 bacnet/runtime/server.c --- a/bacnet/runtime/server.c Mon Jun 18 12:17:07 2018 +0300 +++ b/bacnet/runtime/server.c Sat Jun 23 09:16:35 2018 +0200 @@ -428,6 +428,10 @@ } +// This mutex blocks execution of __init_%(locstr)s() until initialization is done +static int init_done = 0; +static pthread_mutex_t init_done_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t init_done_cond = PTHREAD_COND_INITIALIZER; /** Main function of server demo. **/ int bn_server_run(server_node_t *server_node) { @@ -450,6 +454,12 @@ bvlc_bdt_restore_local(); /* Initiliaze the bacnet server 'device' */ Device_Init(server_node->device_name); + + pthread_mutex_lock(&init_done_lock); + init_done = 1; + pthread_cond_signal(&init_done_cond); + pthread_mutex_unlock(&init_done_lock); + /* Set the password (max 31 chars) for Device Communication Control request. */ /* Default in the BACnet stack is hardcoded as "filister" */ /* (char *) cast is to remove the cast. The function is incorrectly declared/defined in the BACnet stack! */ @@ -549,6 +559,7 @@ int __init_%(locstr)s (int argc, char **argv){ int index; + init_done = 0; /* init each local server */ /* NOTE: All server_nodes[].init_state are initialised to 0 in the code * generated by the BACnet plugin @@ -567,6 +578,13 @@ goto error_exit; } } + + pthread_mutex_lock(&init_done_lock); + while (!init_done) { + pthread_cond_wait(&init_done_cond, &init_done_lock); + } + pthread_mutex_unlock(&init_done_lock); + server_node.init_state = 2; // we have created the node and thread return 0; diff -r b7d803fc44db -r b579e2155d02 wxglade_hmi/wxglade_hmi.py --- a/wxglade_hmi/wxglade_hmi.py Mon Jun 18 12:17:07 2018 +0300 +++ b/wxglade_hmi/wxglade_hmi.py Sat Jun 23 09:16:35 2018 +0200 @@ -90,7 +90,10 @@ def CTNGenerate_C(self, buildpath, locations): - hmi_frames = [] + # list containing description of all objects declared in wxglade + hmi_objects = [] + # list containing only description of the main frame object + main_frames = [] wxgfile_path = self._getWXGLADEpath() if os.path.exists(wxgfile_path): @@ -100,12 +103,17 @@ for node in wxgtree.childNodes[1].childNodes: if node.nodeType == wxgtree.ELEMENT_NODE: - hmi_frames.append({ - "name": node.getAttribute("name"), + name = node.getAttribute("name") + wxglade_object_desc = { + "name": name, "class": node.getAttribute("class"), "handlers": [ hnode.firstChild.data for hnode in - node.getElementsByTagName("handler")]}) + node.getElementsByTagName("handler")]} + + hmi_objects.append(wxglade_object_desc) + if name == self.CTNName() : + main_frames.append(wxglade_object_desc) hmipyfile_path = os.path.join(self._getBuildPath(), "hmi.py") if wx.Platform == '__WXMSW__': @@ -122,12 +130,12 @@ else: define_hmi = "" - declare_hmi = "\n".join(["%(name)s = None\n" % x + - "\n".join(["%(class)s.%(h)s = %(h)s" % + declare_hmi = "\n".join(["%(name)s = None\n" % x for x in main_frames]) + declare_hmi += "\n".join(["\n".join(["%(class)s.%(h)s = %(h)s" % dict(x, h=h) for h in x['handlers']]) - for x in hmi_frames]) + for x in hmi_objects]) global_hmi = ("global %s\n" % ",".join( - [x["name"] for x in hmi_frames]) if len(hmi_frames) > 0 else "") + [x["name"] for x in main_frames]) if len(main_frames) > 0 else "") init_hmi = "\n".join(["""\ def OnCloseFrame(evt): wx.MessageBox(_("Please stop PLC to close")) @@ -135,10 +143,10 @@ %(name)s = %(class)s(None) %(name)s.Bind(wx.EVT_CLOSE, OnCloseFrame) %(name)s.Show() -""" % x for x in hmi_frames]) +""" % x for x in main_frames]) cleanup_hmi = "\n".join( ["if %(name)s is not None: %(name)s.Destroy()" % x - for x in hmi_frames]) + for x in main_frames]) self.PreSectionsTexts = { "globals": define_hmi, @@ -150,6 +158,11 @@ "start": init_hmi, } + if len(main_frames) == 0 and \ + len(getattr(self.CodeFile, "start").getanyText().strip()) == 0: + self.GetCTRoot().logger.write_warning( + _("Warning: WxGlade HMI has no object with name identical to extension name, and no python code is provided in start section to create object.\n")) + return PythonFileCTNMixin.CTNGenerate_C(self, buildpath, locations) def _editWXGLADE(self):