LPCBeremiz.py
author laurent
Wed, 15 Feb 2012 00:44:24 +0100
changeset 684 d376a8b0b602
parent 680 61746934df41
parent 682 9d20df7c144a
child 691 bb340874f09e
permissions -rw-r--r--
Merge with Edouard's Modifications
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
     1
#!/usr/bin/env python
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
503
4c0cd5e54e1b LPC build and protocol tweaks
edouard
parents: 501
diff changeset
     3
import shutil
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
     4
import socket
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
     5
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
     6
__version__ = "$Revision$"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
     7
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
     8
import os, sys, getopt, wx, tempfile
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
     9
import __builtin__
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    10
from types import TupleType, StringType, UnicodeType
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    11
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    12
CWD = os.path.split(os.path.realpath(__file__))[0]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    13
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    14
def Bpath(*args):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    15
    return os.path.join(CWD,*args)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    16
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    17
if __name__ == '__main__':
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    18
    def usage():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    19
        print "\nUsage of LPCBeremiz.py :"
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    20
        print "\n   %s Projectpath Buildpath port\n"%sys.argv[0]
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    21
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    22
    try:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    23
        opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    24
    except getopt.GetoptError:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    25
        # print help information and exit:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    26
        usage()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    27
        sys.exit(2)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    28
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    29
    for o, a in opts:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    30
        if o in ("-h", "--help"):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    31
            usage()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    32
            sys.exit()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    33
    
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    34
    if len(args) != 3:
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    35
        usage()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    36
        sys.exit()
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    37
    else:
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    38
        projectOpen = args[0]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    39
        buildpath = args[1]
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    40
        try:
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    41
            port = int(args[2])
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    42
        except:
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    43
            usage()
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
    44
            sys.exit()
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
    45
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
    46
    if os.path.exists("LPC_DEBUG"):
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
    47
        __builtin__.__dict__["BMZ_DBG"] = True
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
    48
    else :
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
    49
        __builtin__.__dict__["BMZ_DBG"] = False
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
    50
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
    51
app = wx.PySimpleApp(redirect=BMZ_DBG)
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
    52
app.SetAppName('beremiz')
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
    53
wx.InitAllImageHandlers()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    54
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    55
# Import module for internationalization
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    56
import gettext
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    57
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    58
if __name__ == '__main__':
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    59
    __builtin__.__dict__['_'] = wx.GetTranslation#unicode_translation
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    60
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    61
from Beremiz import *
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
    62
from plugger import PluginsRoot, PlugTemplate, opjimg, connectors
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
    63
from plugins.canfestival import RootClass as CanOpenRootClass
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
    64
from plugins.canfestival.canfestival import _SlavePlug, _NodeListPlug, NodeManager
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    65
from plcopen.structures import LOCATIONDATATYPES
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    66
from PLCControler import LOCATION_PLUGIN, LOCATION_MODULE, LOCATION_GROUP,\
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    67
                         LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
    68
from PLCOpenEditor import IDEFrame, ProjectDialog
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    69
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    70
#-------------------------------------------------------------------------------
512
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 510
diff changeset
    71
#                          CANFESTIVAL PLUGIN HACK
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 510
diff changeset
    72
#-------------------------------------------------------------------------------
629
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    73
# from plugins.canfestival import canfestival
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    74
# class LPC_canfestival_config:
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    75
#     def getCFLAGS(self, *args):
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    76
#         return ""
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    77
# 
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    78
#     def getLDFLAGS(self, *args):
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    79
#         return ""
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    80
#         
61347cc521d1 fix unnecessary CanFestival plugin load in lpcberemiz
Edouard Tisserant
parents: 625
diff changeset
    81
# canfestival.local_canfestival_config = LPC_canfestival_config() 
512
36aeab46f27d Improved CanFEstival support for LPC - now build and link plugin generated files
edouard
parents: 510
diff changeset
    82
#-------------------------------------------------------------------------------
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    83
#                              LPCModule Class
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    84
#-------------------------------------------------------------------------------
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    85
472
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    86
LOCATION_TYPES = {"I": LOCATION_VAR_INPUT,
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    87
                  "Q": LOCATION_VAR_OUTPUT,
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    88
                  "M": LOCATION_VAR_MEMORY}
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    89
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    90
LOCATION_DIRS = dict([(dir, size) for size, dir in LOCATION_TYPES.iteritems()])
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    91
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    92
LOCATION_SIZES = {}
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    93
for size, types in LOCATIONDATATYPES.iteritems():
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    94
    for type in types:
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    95
        LOCATION_SIZES[type] = size
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
    96
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    97
def _GetModuleChildren(module):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    98
    children = []
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
    99
    for child in module["children"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   100
        if child["type"] == LOCATION_GROUP:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   101
            children.extend(child["children"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   102
        else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   103
            children.append(child)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   104
    return children
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   105
550
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   106
def _GetVariables(module):
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   107
    variables = []
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   108
    for child in module["children"]:
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   109
        if child["type"] in [LOCATION_GROUP, LOCATION_MODULE]:
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   110
            variables.extend(_GetVariables(child))
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   111
        else:
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   112
            variables.append(child)
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   113
    return variables
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   114
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   115
def _GetLastModuleGroup(module):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   116
    group = module
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   117
    for child in module["children"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   118
        if child["type"] == LOCATION_GROUP:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   119
            group = child
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   120
    return group["children"]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   121
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   122
def _GetModuleBySomething(module, something, toks):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   123
    for child in _GetModuleChildren(module):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   124
        if child.get(something) == toks[0]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   125
            if len(toks) > 1:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   126
                return _GetModuleBySomething(child, something, toks[1:])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   127
            return child
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   128
    return None
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   129
472
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
   130
def _GetModuleVariable(module, location, direction):
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   131
    for child in _GetModuleChildren(module):
472
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
   132
        if child["location"] == location and child["type"] == LOCATION_TYPES[direction]:
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   133
            return child
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   134
    return None
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   135
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   136
def _RemoveModuleChild(module, child):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   137
    if child in module["children"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   138
        module["children"].remove(child)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   139
    else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   140
        for group in module["children"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   141
            if group["type"] == LOCATION_GROUP and child in group["children"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   142
                group["children"].remove(child)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   143
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   144
BUS_TEXT = """/* Code generated by LPCBus plugin */
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   145
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   146
/* LPCBus plugin includes */
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   147
#include "app_glue.h"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   148
#ifdef _WINDOWS_H
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   149
  #include "iec_types.h"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   150
#else
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   151
  #include "iec_std_lib.h"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   152
#endif
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   153
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   154
%(declare_code)s
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   155
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   156
/* LPCBus plugin user variables definition */
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   157
%(var_decl)s
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   158
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   159
/* LPCBus plugin functions */
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   160
int __init_%(location_str)s(int argc,char **argv)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   161
{
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   162
%(init_code)s
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   163
  return 0;
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   164
}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   165
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   166
void __cleanup_%(location_str)s(void)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   167
{
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   168
}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   169
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   170
void __retrieve_%(location_str)s(void)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   171
{
550
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   172
%(retrieve_code)s
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   173
}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   174
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   175
void __publish_%(location_str)s(void)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   176
{
550
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   177
%(publish_code)s
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   178
}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   179
"""
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   180
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   181
class LPCBus(object):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   182
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   183
    def __init__(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   184
        self.VariableLocationTree = []
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   185
        self.ResetUsedLocations()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   186
        self.Icon = None
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   187
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   188
    def __getitem__(self, key):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   189
        if key == "children":
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   190
            return self.VariableLocationTree
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   191
        raise KeyError, "Only 'children' key is available"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   192
    
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   193
    def PlugEnabled(self):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   194
        return None
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   195
    
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   196
    def SetIcon(self, icon):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   197
        self.Icon = icon
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   198
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   199
    def _GetChildBySomething(self, something, toks):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   200
        return _GetModuleBySomething({"children" : self.VariableLocationTree}, something, toks)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   201
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   202
    def GetBaseTypes(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   203
        return self.GetPlugRoot().GetBaseTypes()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   204
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   205
    def GetSizeOfType(self, type):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   206
        return LOCATION_SIZES[self.GetPlugRoot().GetBaseType(type)]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   207
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   208
    def _GetVariableLocationTree(self, current_location, infos):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   209
        if infos["type"] == LOCATION_MODULE:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   210
            location = current_location + (infos["IEC_Channel"],)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   211
            return {"name": infos["name"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   212
                    "type": infos["type"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   213
                    "location": ".".join(map(str, location + ("x",))), 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   214
                    "icon": infos["icon"], 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   215
                    "children": [self._GetVariableLocationTree(location, child) for child in infos["children"]]}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   216
        elif infos["type"] == LOCATION_GROUP:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   217
            return {"name": infos["name"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   218
                    "type": infos["type"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   219
                    "location": "", 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   220
                    "icon": infos["icon"], 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   221
                    "children": [self._GetVariableLocationTree(current_location, child) for child in infos["children"]]}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   222
        else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   223
            size = self.GetSizeOfType(infos["IEC_type"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   224
            location = "%" + LOCATION_DIRS[infos["type"]] + size + ".".join(map(str, current_location + infos["location"]))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   225
            return {"name": infos["name"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   226
                    "type": infos["type"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   227
                    "size": size,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   228
                    "IEC_type": infos["IEC_type"],
659
71a824446673 Adding support for drag'n dropping located variables from topology panel to configurations and resources variable panel for declaring global located variables
laurent
parents: 652
diff changeset
   229
                    "var_name": infos["name"],
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   230
                    "location": location,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   231
                    "description": infos["description"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   232
                    "children": []}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   233
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   234
    def GetVariableLocationTree(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   235
        return {"name": self.BaseParams.getName(),
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   236
                "type": LOCATION_PLUGIN,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   237
                "location": self.GetFullIEC_Channel(),
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   238
                "icon": self.Icon, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   239
                "children": [self._GetVariableLocationTree(self.GetCurrentLocation(), child) 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   240
                             for child in self.VariableLocationTree]}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   241
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   242
    def PlugTestModified(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   243
        return False
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   244
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   245
    def PlugMakeDir(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   246
        pass
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   247
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   248
    def PlugRequestSave(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   249
        return None
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   250
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   251
    def ResetUsedLocations(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   252
        self.UsedLocations = {}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   253
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   254
    def _AddUsedLocation(self, parent, location):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   255
        num = location.pop(0)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   256
        if not parent.has_key(num):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   257
            parent[num] = {"used": False, "children": {}}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   258
        if len(location) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   259
            self._AddUsedLocation(parent[num]["children"], location)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   260
        else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   261
            parent[num]["used"] = True
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   262
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   263
    def AddUsedLocation(self, location):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   264
        if len(location) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   265
            self._AddUsedLocation(self.UsedLocations, list(location))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   266
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   267
    def _CheckLocationConflicts(self, parent, location):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   268
        num = location.pop(0)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   269
        if not parent.has_key(num):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   270
            return False
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   271
        if len(location) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   272
            if parent[num]["used"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   273
                return True
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   274
            return self._CheckLocationConflicts(parent[num]["children"], location)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   275
        elif len(parent[num]["children"]) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   276
            return True
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   277
        return False
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   278
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   279
    def CheckLocationConflicts(self, location):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   280
        if len(location) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   281
            return self._CheckLocationConflicts(self.UsedLocations, list(location))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   282
        return False
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   283
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   284
    def PlugGenerate_C(self, buildpath, locations):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   285
        """
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   286
        Generate C code
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   287
        @param current_location: Tupple containing plugin IEC location : %I0.0.4.5 => (0,0,4,5)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   288
        @param locations: List of complete variables locations \
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   289
            [{"IEC_TYPE" : the IEC type (i.e. "INT", "STRING", ...)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   290
            "NAME" : name of the variable (generally "__IW0_1_2" style)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   291
            "DIR" : direction "Q","I" or "M"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   292
            "SIZE" : size "X", "B", "W", "D", "L"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   293
            "LOC" : tuple of interger for IEC location (0,1,2,...)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   294
            }, ...]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   295
        @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   296
        """
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   297
        current_location = self.GetCurrentLocation()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   298
        # define a unique name for the generated C file
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   299
        location_str = "_".join(map(str, current_location))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   300
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   301
        code_str = {"location_str": location_str,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   302
                    "var_decl": "",
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   303
                    "declare_code": "",
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   304
                    "init_code": "",
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   305
                    "retrieve_code": "",
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   306
                    "publish_code": "",
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   307
                   }
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   308
        
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   309
        for module in _GetModuleChildren(self):
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   310
            if module["init"] != "":
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   311
                code_str["init_code"] += "  %s\n" % module["init"]
550
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   312
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   313
        # Adding variables
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   314
        vars = []
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   315
        self.ResetUsedLocations()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   316
        for location in locations:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   317
            loc = location["LOC"][len(current_location):]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   318
            group = next = self
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   319
            i = 0
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   320
            while next is not None and i < len(loc):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   321
                next = self._GetChildBySomething("IEC_Channel", loc[:i + 1])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   322
                if next is not None:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   323
                    i += 1
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   324
                    group = next
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   325
            var_loc = loc[i:]
530
862d9adcd904 Bug when trying to generate LPCBus code fixed
laurent
parents: 526
diff changeset
   326
            for variable in _GetModuleChildren(group):
566
657900299557 Fix bug in LPCBeremiz that use input retrieve and publish code for ouput with the same location
laurent
parents: 561
diff changeset
   327
                if variable["location"] == var_loc and location["DIR"] == LOCATION_DIRS[variable["type"]]:
543
3dec6ff88620 Disabled boring standard conformance checks, fixed possible race condition with StatusTimer, fixed warning message in AbortTransfer
Lolitech
parents: 541
diff changeset
   328
#                    if location["DIR"] != LOCATION_DIRS[variable["type"]]:
3dec6ff88620 Disabled boring standard conformance checks, fixed possible race condition with StatusTimer, fixed warning message in AbortTransfer
Lolitech
parents: 541
diff changeset
   329
#                        raise Exception, "Direction conflict in variable definition"
3dec6ff88620 Disabled boring standard conformance checks, fixed possible race condition with StatusTimer, fixed warning message in AbortTransfer
Lolitech
parents: 541
diff changeset
   330
#                    if location["IEC_TYPE"] != variable["IEC_type"]:
3dec6ff88620 Disabled boring standard conformance checks, fixed possible race condition with StatusTimer, fixed warning message in AbortTransfer
Lolitech
parents: 541
diff changeset
   331
#                        raise Exception, "Type conflict in variable definition"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   332
                    if location["DIR"] == "Q":
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   333
                        if self.CheckLocationConflicts(location["LOC"]):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   334
                            raise Exception, "BYTE and BIT from the same BYTE can't be used together"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   335
                        self.AddUsedLocation(location["LOC"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   336
                    vars.append({"location": location["NAME"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   337
                                 "Type": variable["IEC_type"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   338
                                 "Retrieve": variable["retrieve"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   339
                                 "Publish": variable["publish"],
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   340
                                })
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   341
                    break
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   342
        base_types = self.GetPlugRoot().GetBaseTypes()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   343
        for var in vars:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   344
            prefix = ""
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   345
            if var["Type"] in base_types:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   346
                prefix = "IEC_"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   347
            code_str["var_decl"] += "%s%s beremiz%s;\n"%(prefix, var["Type"], var["location"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   348
            code_str["var_decl"] += "%s%s *%s = &beremiz%s;\n"%(prefix, var["Type"], var["location"], var["location"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   349
            if var["Retrieve"] != "":
550
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   350
                code_str["retrieve_code"] += "  " + var["Retrieve"] % ("*" + var["location"]) + "\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   351
            if var["Publish"] != "":
550
b03f586547c9 Adding support for initialize all LPC module variables even if not used
laurent
parents: 549
diff changeset
   352
                code_str["publish_code"] += "  " + var["Publish"] % ("*" + var["location"]) + "\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   353
        
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
   354
        Gen_Module_path = os.path.join(buildpath, "Bus_%s.c"%location_str)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   355
        module = open(Gen_Module_path,'w')
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   356
        module.write(BUS_TEXT % code_str)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   357
        module.close()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   358
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   359
        matiec_flags = '"-I%s"'%os.path.abspath(self.GetPlugRoot().GetIECLibPath())
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   360
        return [(Gen_Module_path, matiec_flags)],"",True
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   361
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   362
#-------------------------------------------------------------------------------
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   363
#                          LPC CanFestival Plugin Class
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   364
#-------------------------------------------------------------------------------
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   365
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   366
DEFAULT_SETTINGS = {
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   367
    "CAN_Baudrate": "125K",
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   368
    "Slave_NodeId": 2,
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   369
    "Master_NodeId": 1,
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   370
}
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   371
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   372
class LPCCanOpenSlave(_SlavePlug):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   373
    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   374
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   375
      <xsd:element name="CanFestivalSlaveNode">
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   376
        <xsd:complexType>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   377
          <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   378
          <xsd:attribute name="NodeId" type="xsd:string" use="optional" default="%(Slave_NodeId)d"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   379
          <xsd:attribute name="Sync_Align" type="xsd:integer" use="optional" default="0"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   380
          <xsd:attribute name="Sync_Align_Ratio" use="optional" default="50">
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   381
            <xsd:simpleType>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   382
                <xsd:restriction base="xsd:integer">
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   383
                    <xsd:minInclusive value="1"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   384
                    <xsd:maxInclusive value="99"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   385
                </xsd:restriction>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   386
            </xsd:simpleType>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   387
          </xsd:attribute>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   388
        </xsd:complexType>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   389
      </xsd:element>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   390
    </xsd:schema>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   391
    """ % DEFAULT_SETTINGS
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   392
    
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   393
    def __init__(self):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   394
        # TODO change netname when name change
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   395
        NodeManager.__init__(self)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   396
        odfilepath = self.GetSlaveODPath()
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   397
        if(os.path.isfile(odfilepath)):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   398
            self.OpenFileInCurrent(odfilepath)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   399
        else:
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   400
            self.CreateNewNode("SlaveNode",  # Name - will be changed at build time
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   401
                               0x00,         # NodeID - will be changed at build time
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   402
                               "slave",      # Type
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   403
                               "",           # description 
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   404
                               "None",       # profile
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   405
                               "", # prfile filepath
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   406
                               "heartbeat",  # NMT
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   407
                               [])           # options
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   408
            self.OnPlugSave()
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   409
    
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   410
    def GetCanDevice(self):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   411
        return str(self.BaseParams.getIEC_Channel())
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   412
    
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   413
class LPCCanOpenMaster(_NodeListPlug):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   414
    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   415
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   416
      <xsd:element name="CanFestivalNode">
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   417
        <xsd:complexType>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   418
          <xsd:attribute name="CAN_Baudrate" type="xsd:string" use="optional" default="%(CAN_Baudrate)s"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   419
          <xsd:attribute name="NodeId" type="xsd:string" use="optional" default="%(Master_NodeId)d"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   420
          <xsd:attribute name="Sync_TPDOs" type="xsd:boolean" use="optional" default="true"/>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   421
        </xsd:complexType>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   422
      </xsd:element>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   423
    </xsd:schema>
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   424
    """ % DEFAULT_SETTINGS
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   425
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   426
    def GetCanDevice(self):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   427
        return str(self.BaseParams.getIEC_Channel())
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   428
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   429
class LPCCanOpen(CanOpenRootClass):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   430
    XSD = None
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   431
    PlugChildsTypes = [("CanOpenNode",LPCCanOpenMaster, "CanOpen Master"),
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   432
                       ("CanOpenSlave",LPCCanOpenSlave, "CanOpen Slave")]
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   433
    
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   434
    def GetCanDriver(self):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   435
        return ""
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   436
    
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   437
    def LoadChilds(self):
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   438
        PlugTemplate.LoadChilds(self)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   439
        
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   440
        if self.GetChildByName("Master") is None:
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   441
            master = self.PlugAddChild("Master", "CanOpenNode", 0)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   442
            master.BaseParams.setEnabled(False)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   443
        
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   444
        if self.GetChildByName("Slave") is None:
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   445
            slave = self.PlugAddChild("Slave", "CanOpenSlave", 1)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   446
            slave.BaseParams.setEnabled(False)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   447
    
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   448
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   449
#-------------------------------------------------------------------------------
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   450
#                              LPCPluginsRoot Class
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   451
#-------------------------------------------------------------------------------
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   452
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   453
def mycopytree(src, dst):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   454
    """
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   455
    Copy content of a directory to an other, omit hidden files
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   456
    @param src: source directory
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   457
    @param dst: destination directory
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   458
    """
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   459
    for i in os.listdir(src):
652
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   460
        if not i.startswith('.') and i != "pous.xml":
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   461
            srcpath = os.path.join(src,i)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   462
            dstpath = os.path.join(dst,i)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   463
            if os.path.isdir(srcpath):
503
4c0cd5e54e1b LPC build and protocol tweaks
edouard
parents: 501
diff changeset
   464
                if os.path.exists(dstpath):
4c0cd5e54e1b LPC build and protocol tweaks
edouard
parents: 501
diff changeset
   465
                    shutil.rmtree(dstpath)
4c0cd5e54e1b LPC build and protocol tweaks
edouard
parents: 501
diff changeset
   466
                os.makedirs(dstpath)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   467
                mycopytree(srcpath, dstpath)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   468
            elif os.path.isfile(srcpath):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   469
                shutil.copy2(srcpath, dstpath)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   470
572
c965548cb6f7 Fixed MD5 computation for makefile based toolchain, helps avoiding unnecessary builds
edouard
parents: 571
diff changeset
   471
[SIMULATION_MODE, TRANSFER_MODE] = range(2)
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   472
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   473
class LPCPluginsRoot(PluginsRoot):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   474
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   475
    PluginMethods = [
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   476
        {"bitmap" : opjimg("Debug"),
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   477
         "name" : _("Simulate"),
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   478
         "tooltip" : _("Simulate PLC"),
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   479
         "method" : "_Simulate"},
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   480
        {"bitmap" : opjimg("Run"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   481
         "name" : _("Run"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   482
         "shown" : False,
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   483
         "tooltip" : _("Start PLC"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   484
         "method" : "_Run"},
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   485
        {"bitmap" : opjimg("Stop"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   486
         "name" : _("Stop"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   487
         "shown" : False,
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   488
         "tooltip" : _("Stop Running PLC"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   489
         "method" : "_Stop"},
541
4d9ca788205e Adding compile button when unconnected
laurent
parents: 539
diff changeset
   490
        {"bitmap" : opjimg("Build"),
4d9ca788205e Adding compile button when unconnected
laurent
parents: 539
diff changeset
   491
         "name" : _("Build"),
4d9ca788205e Adding compile button when unconnected
laurent
parents: 539
diff changeset
   492
         "tooltip" : _("Build project into build folder"),
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
   493
         "method" : "_Build"},
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   494
        {"bitmap" : opjimg("Transfer"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   495
         "name" : _("Transfer"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   496
         "shown" : False,
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   497
         "tooltip" : _("Transfer PLC"),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   498
         "method" : "_Transfer"},
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   499
    ]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   500
652
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   501
    def __init__(self, frame, logger, buildpath):
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   502
        self.OrigBuildPath = buildpath
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   503
        
478
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   504
        PluginsRoot.__init__(self, frame, logger)
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   505
        
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   506
        self.PlugChildsTypes += [("LPCBus", LPCBus, "LPC bus"), ("CanOpen", LPCCanOpen, "CanOpen bus")]
652
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   507
        self.PlugType = "LPC"
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   508
        
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   509
        self.OnlineMode = "OFF"
561
4cc6eef4778f Fix bug on LPCConnector initial value
laurent
parents: 560
diff changeset
   510
        self.LPCConnector = None
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   511
        
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   512
        self.CurrentMode = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   513
        self.previous_mode = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   514
        
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   515
        self.SimulationBuildPath = None
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   516
        
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   517
        self.AbortTransferTimer = None
652
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   518
    
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   519
    def PluginLibraryFilePath(self):
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   520
        if self.OrigBuildPath is not None:
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   521
            return os.path.join(self.OrigBuildPath, "pous.xml")
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   522
        else:
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   523
            return PluginsRoot.PluginLibraryFilePath(self)
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   524
    
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   525
    def GetProjectName(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   526
        return self.Project.getname()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   527
510
8038c08b9874 Getting default target when no target defined fixed
laurent
parents: 503
diff changeset
   528
    def GetDefaultTargetName(self):
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   529
        if self.CurrentMode == SIMULATION_MODE:
510
8038c08b9874 Getting default target when no target defined fixed
laurent
parents: 503
diff changeset
   530
            return PluginsRoot.GetDefaultTargetName(self)
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   531
        else:
510
8038c08b9874 Getting default target when no target defined fixed
laurent
parents: 503
diff changeset
   532
            return "LPC"
8038c08b9874 Getting default target when no target defined fixed
laurent
parents: 503
diff changeset
   533
8038c08b9874 Getting default target when no target defined fixed
laurent
parents: 503
diff changeset
   534
    def GetTarget(self):
8038c08b9874 Getting default target when no target defined fixed
laurent
parents: 503
diff changeset
   535
        target = PluginsRoot.GetTarget(self)
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   536
        if self.CurrentMode != SIMULATION_MODE:
510
8038c08b9874 Getting default target when no target defined fixed
laurent
parents: 503
diff changeset
   537
            target.getcontent()["value"].setBuildPath(self.BuildPath)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   538
        return target
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   539
    
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   540
    def _getBuildPath(self):
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   541
        if self.CurrentMode == SIMULATION_MODE:
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   542
            if self.SimulationBuildPath is None:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   543
                self.SimulationBuildPath = os.path.join(tempfile.mkdtemp(), os.path.basename(self.ProjectPath), "build")
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   544
            return self.SimulationBuildPath
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   545
        else:
494
9e4263099427 Bug when opening with not empty buildpath parameter fixed
laurent
parents: 492
diff changeset
   546
            return PluginsRoot._getBuildPath(self)
503
4c0cd5e54e1b LPC build and protocol tweaks
edouard
parents: 501
diff changeset
   547
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
   548
    def _Build(self):
599
c7be4d09c5f4 Adding save project before building on LPCBeremiz
laurent
parents: 598
diff changeset
   549
        save = self.ProjectTestModified()
c7be4d09c5f4 Adding save project before building on LPCBeremiz
laurent
parents: 598
diff changeset
   550
        if save:
c7be4d09c5f4 Adding save project before building on LPCBeremiz
laurent
parents: 598
diff changeset
   551
            self.SaveProject()
c7be4d09c5f4 Adding save project before building on LPCBeremiz
laurent
parents: 598
diff changeset
   552
            self.AppFrame._Refresh(TITLE, FILEMENU)
503
4c0cd5e54e1b LPC build and protocol tweaks
edouard
parents: 501
diff changeset
   553
        if self.BuildPath is not None:
4c0cd5e54e1b LPC build and protocol tweaks
edouard
parents: 501
diff changeset
   554
            mycopytree(self.OrigBuildPath, self.BuildPath)
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
   555
        PluginsRoot._Build(self)
599
c7be4d09c5f4 Adding save project before building on LPCBeremiz
laurent
parents: 598
diff changeset
   556
        if save:
c7be4d09c5f4 Adding save project before building on LPCBeremiz
laurent
parents: 598
diff changeset
   557
            wx.CallAfter(self.AppFrame.RefreshAll)
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   558
    
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   559
    def SetProjectName(self, name):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   560
        return self.Project.setname(name)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   561
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   562
    def SetOnlineMode(self, mode, path=None):
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   563
        if self.OnlineMode != mode.upper():
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   564
            self.OnlineMode = mode.upper()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   565
            
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   566
            if self.OnlineMode != "OFF":
543
3dec6ff88620 Disabled boring standard conformance checks, fixed possible race condition with StatusTimer, fixed warning message in AbortTransfer
Lolitech
parents: 541
diff changeset
   567
                uri = "LPC://%s/%s" % (self.OnlineMode,path)
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   568
                try:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   569
                    self.LPCConnector = connectors.ConnectorFactory(uri, self)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   570
                except Exception, msg:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   571
                    self.logger.write_error(_("Exception while connecting %s!\n")%uri)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   572
                    self.logger.write_error(traceback.format_exc())
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   573
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   574
                # Did connection success ?
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   575
                if self.LPCConnector is None:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   576
                    # Oups.
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   577
                    self.logger.write_error(_("Connection failed to %s!\n")%uri)
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   578
                
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   579
            else:
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   580
                self.LPCConnector = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   581
            
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   582
            self.ApplyOnlineMode()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   583
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   584
    def ApplyOnlineMode(self):
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   585
        if self.CurrentMode != SIMULATION_MODE:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   586
            self.KillDebugThread()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   587
            
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   588
            self._connector = self.LPCConnector
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   589
            
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   590
            # Init with actual PLC status and print it
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   591
            self.UpdateMethodsFromPLCStatus()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   592
                
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   593
            if self.LPCConnector is not None and self.OnlineMode == "APPLICATION":
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   594
                
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   595
                self.CompareLocalAndRemotePLC()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   596
                            
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   597
                if self.previous_plcstate is not None:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   598
                    status = _(self.previous_plcstate)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   599
                else:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   600
                    status = ""
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   601
                self.logger.write(_("PLC is %s\n")%status)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   602
                
575
6765adf58711 Removed status polling for LPC, as status cannot change by itself, fixed MD5 comparison in app mode
edouard
parents: 574
diff changeset
   603
                #if self.StatusTimer and not self.StatusTimer.IsRunning():
6765adf58711 Removed status polling for LPC, as status cannot change by itself, fixed MD5 comparison in app mode
edouard
parents: 574
diff changeset
   604
                #    # Start the status Timer
6765adf58711 Removed status polling for LPC, as status cannot change by itself, fixed MD5 comparison in app mode
edouard
parents: 574
diff changeset
   605
                #    self.StatusTimer.Start(milliseconds=2000, oneShot=False)
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   606
                
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   607
                if self.previous_plcstate=="Started":
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   608
                    if self.DebugAvailable() and self.GetIECProgramsAndVariables():
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   609
                        self.logger.write(_("Debug connect matching running PLC\n"))
576
7fcdc0d3d8d9 Some typo fixes to make debug related methods in LPCAppOject stop throwing exceptions, less agressive error message when unplugging LPC
edouard
parents: 575
diff changeset
   610
                        self._connect_debug()
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   611
                    else:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   612
                        self.logger.write_warning(_("Debug do not match PLC - stop/transfert/start to re-enable\n"))
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   613
            
543
3dec6ff88620 Disabled boring standard conformance checks, fixed possible race condition with StatusTimer, fixed warning message in AbortTransfer
Lolitech
parents: 541
diff changeset
   614
            elif self.StatusTimer and self.StatusTimer.IsRunning():
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   615
                self.StatusTimer.Stop()
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   616
            
572
c965548cb6f7 Fixed MD5 computation for makefile based toolchain, helps avoiding unnecessary builds
edouard
parents: 571
diff changeset
   617
            if self.CurrentMode == TRANSFER_MODE:
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   618
                
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   619
                if self.OnlineMode == "BOOTLOADER":
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   620
                    self.BeginTransfer()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   621
                
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   622
                elif self.OnlineMode == "APPLICATION":
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   623
                    self.CurrentMode = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   624
                    self.AbortTransferTimer.Stop()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   625
                    self.AbortTransferTimer = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   626
                    
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   627
                    self.logger.write(_("PLC transferred successfully\n"))
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   628
    
444
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   629
    # Update a PLCOpenEditor Pou variable name
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   630
    def UpdateProjectVariableName(self, old_name, new_name):
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   631
        self.Project.updateElementName(old_name, new_name)
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   632
        self.BufferProject()
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   633
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   634
    def RemoveProjectVariableByAddress(self, address):
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   635
        self.Project.removeVariableByAddress(address)
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   636
        self.BufferProject()
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   637
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   638
    def RemoveProjectVariableByFilter(self, leading):
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   639
        self.Project.removeVariableByFilter(leading)
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   640
        self.BufferProject()
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
   641
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   642
    def LoadProject(self, ProjectPath, BuildPath=None):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   643
        """
478
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   644
        Load a project contained in a folder
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   645
        @param ProjectPath: path of the project folder
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   646
        """
478
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   647
        if os.path.basename(ProjectPath) == "":
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   648
            ProjectPath = os.path.dirname(ProjectPath)
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   649
        
478
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   650
        # Verify that project contains a PLCOpen program
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   651
        plc_file = os.path.join(ProjectPath, "plc.xml")
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   652
        if os.path.isfile(plc_file):
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   653
            # Load PLCOpen file
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   654
            result = self.OpenXMLFile(plc_file)
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   655
            if result:
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   656
                return result
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   657
        else:
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   658
            self.CreateNewProject({"companyName": "",
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   659
                                   "productName": "",
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   660
                                   "productVersion": "",
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   661
                                   "projectName": "",
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   662
                                   "pageSize": (0, 0),
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   663
                                   "scaling": {}})
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   664
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   665
        # Change XSD into class members
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   666
        self._AddParamsMembers()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   667
        self.PluggedChilds = {}
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   668
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   669
        # Keep track of the root plugin (i.e. project path)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   670
        self.ProjectPath = ProjectPath
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   671
        
478
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   672
        self.BuildPath = self._getBuildPath()
652
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   673
        if self.OrigBuildPath is not None:
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
   674
            mycopytree(self.OrigBuildPath, self.BuildPath)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   675
        
478
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   676
        # If dir have already be made, and file exist
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   677
        if os.path.isdir(self.PlugPath()) and os.path.isfile(self.PluginXmlFilePath()):
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   678
            #Load the plugin.xml file into parameters members
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   679
            result = self.LoadXMLParams()
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   680
            if result:
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   681
                return result
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   682
            #Load and init all the childs
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   683
            self.LoadChilds()
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   684
        
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   685
        if self.GetChildByName("CanOpen") is None:
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   686
            canopen = self.PlugAddChild("CanOpen", "CanOpen", 0)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   687
            canopen.BaseParams.setEnabled(False)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   688
            canopen.LoadChilds()
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
   689
        
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   690
        if self.PlugTestModified():
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   691
            self.SaveProject()
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
   692
        
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   693
        if wx.GetApp() is None:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   694
            self.RefreshPluginsBlockLists()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   695
        else:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   696
            wx.CallAfter(self.RefreshPluginsBlockLists)
478
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   697
029688dad14d Replacing target_Makefile by target_LPC
laurent
parents: 472
diff changeset
   698
        return None
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   699
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   700
    ############# Real PLC object access #############
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   701
    def UpdateMethodsFromPLCStatus(self):
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   702
        # Get PLC state : Running or Stopped
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   703
        # TODO : use explicit status instead of boolean
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   704
        if self.OnlineMode == "OFF":
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   705
            status = "Disconnected"
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   706
        elif self.OnlineMode == "BOOTLOADER":
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   707
            status = "Connected"
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   708
        else:
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   709
            if self._connector is not None:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   710
                status = self._connector.GetPLCstatus()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   711
            else:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   712
                status = "Disconnected"
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   713
        if self.previous_plcstate != status or self.previous_mode != self.CurrentMode:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   714
            simulating = self.CurrentMode == SIMULATION_MODE
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   715
            for args in {
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   716
                     "Started" :     [("_Simulate", False),
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   717
                                      ("_Run", False),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   718
                                      ("_Stop", True),
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
   719
                                      ("_Build", True),
559
0f5544587037 Fix buttons state according to online mode
laurent
parents: 555
diff changeset
   720
                                      ("_Transfer", True)],
0f5544587037 Fix buttons state according to online mode
laurent
parents: 555
diff changeset
   721
                     "Stopped" :     [("_Simulate", False),
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   722
                                      ("_Run", True),
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   723
                                      ("_Stop", False),
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
   724
                                      ("_Build", True),
559
0f5544587037 Fix buttons state according to online mode
laurent
parents: 555
diff changeset
   725
                                      ("_Transfer", True)],
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   726
                     "Connected" :   [("_Simulate", not simulating),
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   727
                                      ("_Run", True),
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   728
                                      ("_Stop", simulating),
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
   729
                                      ("_Build", True),
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   730
                                      ("_Transfer", True)],
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   731
                     "Disconnected" :[("_Simulate", not simulating),
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   732
                                      ("_Run", False),
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   733
                                      ("_Stop", simulating),
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
   734
                                      ("_Build", True),
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   735
                                      ("_Transfer", False)],
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   736
                   }.get(status,[]):
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   737
                self.ShowMethod(*args)
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   738
            self.previous_plcstate = status
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   739
            self.previous_mode = self.CurrentMode
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   740
            return True
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   741
        return False
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
   742
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   743
    def Generate_plc_declare_locations(self):
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   744
        """
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   745
        Declare used locations in order to simulatePLC in a black box
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   746
        """
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   747
        return """#include "iec_types_all.h"
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   748
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   749
#define __LOCATED_VAR(type, name, ...) \
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   750
type beremiz_##name;\
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   751
type *name = &beremiz_##name;
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   752
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   753
#include "LOCATED_VARIABLES.h"
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   754
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   755
#undef __LOCATED_VAR
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   756
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   757
"""
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   758
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   759
    def _Simulate(self):
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   760
        """
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   761
        Method called by user to Simulate PLC
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   762
        """
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   763
        self.CurrentMode = SIMULATION_MODE
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   764
        
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   765
        uri = "LOCAL://"
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   766
        try:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   767
            self._connector = connectors.ConnectorFactory(uri, self)
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   768
        except Exception, msg:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   769
            self.logger.write_error(_("Exception while connecting %s!\n")%uri)
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   770
            self.logger.write_error(traceback.format_exc())
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   771
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   772
        # Did connection success ?
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   773
        if self._connector is None:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   774
            # Oups.
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   775
            self.logger.write_error(_("Connection failed to %s!\n")%uri)
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   776
            self.StopSimulation()
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   777
            return False
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   778
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   779
        buildpath = self._getBuildPath()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   780
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   781
        # Eventually create build dir
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   782
        if not os.path.exists(buildpath):
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   783
            os.makedirs(buildpath)
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   784
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   785
        # Generate SoftPLC IEC code
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   786
        IECGenRes = self._Generate_SoftPLC()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   787
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   788
         # If IEC code gen fail, bail out.
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   789
        if not IECGenRes:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   790
            self.logger.write_error(_("IEC-61131-3 code generation failed !\n"))
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   791
            self.StopSimulation()
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   792
            return False
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   793
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   794
        # Reset variable and program list that are parsed from
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   795
        # CSV file generated by IEC2C compiler.
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   796
        self.ResetIECProgramsAndVariables()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   797
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   798
        gen_result = self.PlugGenerate_C(buildpath, self.PLCGeneratedLocatedVars)
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   799
        PlugCFilesAndCFLAGS, PlugLDFLAGS, DoCalls = gen_result[:3]
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   800
        # if some files have been generated put them in the list with their location
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   801
        if PlugCFilesAndCFLAGS:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   802
            self.LocationCFilesAndCFLAGS = [(self.GetCurrentLocation(), PlugCFilesAndCFLAGS, DoCalls)]
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   803
        else:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   804
            self.LocationCFilesAndCFLAGS = []
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   805
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   806
        # plugin asks for some LDFLAGS
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   807
        if PlugLDFLAGS:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   808
            # LDFLAGS can be either string
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   809
            if type(PlugLDFLAGS)==type(str()):
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   810
                self.LDFLAGS=[PlugLDFLAGS]
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   811
            #or list of strings
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   812
            elif type(PlugLDFLAGS)==type(list()):
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   813
                self.LDFLAGS=PlugLDFLAGS[:]
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   814
        else:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   815
            self.LDFLAGS=[]
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   816
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   817
        # Template based part of C code generation
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   818
        # files are stacked at the beginning, as files of plugin tree root
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   819
        for generator, filename, name in [
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   820
           # debugger code
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   821
           (self.Generate_plc_debugger, "plc_debugger.c", "Debugger"),
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   822
           # init/cleanup/retrieve/publish, run and align code
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   823
           (self.Generate_plc_common_main,"plc_common_main.c","Common runtime"),
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   824
           # declare located variables for simulate in a black box
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   825
           (self.Generate_plc_declare_locations,"plc_declare_locations.c","Declare Locations")]:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   826
            try:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   827
                # Do generate
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   828
                code = generator()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   829
                if code is None:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   830
                     raise
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   831
                code_path = os.path.join(buildpath,filename)
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   832
                open(code_path, "w").write(code)
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   833
                # Insert this file as first file to be compiled at root plugin
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   834
                self.LocationCFilesAndCFLAGS[0][1].insert(0,(code_path, self.plcCFLAGS))
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   835
            except Exception, exc:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   836
                self.logger.write_error(name+_(" generation failed !\n"))
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   837
                self.logger.write_error(traceback.format_exc())
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   838
                self.StopSimulation()
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   839
                return False
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   840
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   841
        # Get simulation builder
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   842
        builder = self.GetBuilder()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   843
        if builder is None:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   844
            self.logger.write_error(_("Fatal : cannot get builder.\n"))
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   845
            self.StopSimulation()
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   846
            return False
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   847
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   848
        # Build
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   849
        try:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   850
            if not builder.build() :
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   851
                self.logger.write_error(_("C Build failed.\n"))
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   852
                self.StopSimulation()
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   853
                return False
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   854
        except Exception, exc:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   855
            self.logger.write_error(_("C Build crashed !\n"))
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   856
            self.logger.write_error(traceback.format_exc())
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   857
            self.StopSimulation()
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   858
            return False
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   859
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   860
        data = builder.GetBinaryCode()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   861
        if data is not None :
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   862
            if self._connector.NewPLC(builder.GetBinaryCodeMD5(), data, []):
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   863
                if self.AppFrame is not None:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   864
                    self.AppFrame.CloseDebugTabs()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   865
                    self.AppFrame.RefreshInstancesTree()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   866
                self.UnsubscribeAllDebugIECVariable()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   867
                self.ProgramTransferred()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   868
                self.logger.write(_("Transfer completed successfully.\n"))
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   869
            else:
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   870
                self.logger.write_error(_("Transfer failed\n"))
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   871
                self.StopSimulation()
492
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   872
                return False
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   873
        
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   874
        self._Run()
0852c4682179 Adding support for simulation in LPCBeremiz
laurent
parents: 487
diff changeset
   875
                
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   876
        if not self.StatusTimer.IsRunning():
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   877
            # Start the status Timer
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   878
            self.StatusTimer.Start(milliseconds=500, oneShot=False)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   879
    
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   880
    def StopSimulation(self):
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   881
        self.CurrentMode = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   882
        self.ApplyOnlineMode()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   883
    
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   884
    def _Stop(self):
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   885
        PluginsRoot._Stop(self)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   886
        
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   887
        if self.CurrentMode == SIMULATION_MODE:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   888
            self.StopSimulation()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   889
560
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   890
    def CompareLocalAndRemotePLC(self):
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   891
        if self.LPCConnector is None:
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   892
            return
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   893
        # We are now connected. Update button status
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   894
        MD5 = self.GetLastBuildMD5()
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   895
        # Check remote target PLC correspondance to that md5
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   896
        if MD5 is not None and self.LPCConnector.MatchMD5(MD5):
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   897
            # warns controller that program match
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   898
            self.ProgramTransferred()
681fe60443fc Fix transfer button enable state and build button state
laurent
parents: 559
diff changeset
   899
677
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   900
    def ResetBuildMD5(self):
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   901
        builder=self.GetBuilder()
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   902
        if builder is not None:
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   903
            builder.ResetBinaryCodeMD5()
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   904
        
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   905
    def GetLastBuildMD5(self):
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   906
        builder=self.GetBuilder()
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   907
        if builder is not None:
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   908
            return builder.GetBinaryCodeMD5(self.OnlineMode)
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   909
        else:
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   910
            return None
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   911
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   912
    def _Transfer(self):
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   913
        if self.CurrentMode is None and self.OnlineMode != "OFF":
572
c965548cb6f7 Fixed MD5 computation for makefile based toolchain, helps avoiding unnecessary builds
edouard
parents: 571
diff changeset
   914
            self.CurrentMode = TRANSFER_MODE
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   915
            
677
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   916
            if PluginsRoot._Build(self):
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   917
            
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   918
                ID_ABORTTRANSFERTIMER = wx.NewId()
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   919
                self.AbortTransferTimer = wx.Timer(self.AppFrame, ID_ABORTTRANSFERTIMER)
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   920
                self.AppFrame.Bind(wx.EVT_TIMER, self.AbortTransfer, self.AbortTransferTimer)  
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   921
                
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   922
                if self.OnlineMode == "BOOTLOADER":
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   923
                    self.BeginTransfer()
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   924
                
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   925
                else:
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   926
                    self.logger.write(_("Resetting PLC\n"))
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   927
                    #self.StatusTimer.Stop()
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   928
                    self.LPCConnector.ResetPLC()
607731b33026 Fix 'Transfer" button state according to last build result
laurent
parents: 659
diff changeset
   929
                    self.AbortTransferTimer.Start(milliseconds=5000, oneShot=True)
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   930
    
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   931
    def BeginTransfer(self):
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   932
        self.logger.write(_("Start PLC transfer\n"))
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   933
        
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   934
        self.AbortTransferTimer.Stop()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   935
        PluginsRoot._Transfer(self)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   936
        self.AbortTransferTimer.Start(milliseconds=5000, oneShot=True)
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   937
    
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   938
    def AbortTransfer(self, event):
543
3dec6ff88620 Disabled boring standard conformance checks, fixed possible race condition with StatusTimer, fixed warning message in AbortTransfer
Lolitech
parents: 541
diff changeset
   939
        self.logger.write_warning(_("Timeout waiting PLC to recover\n"))
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   940
        
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   941
        self.CurrentMode = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   942
        self.AbortTransferTimer.Stop()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   943
        self.AbortTransferTimer = None
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   944
        event.Skip()
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
   945
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   946
    def _Run(self):
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   947
        """
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   948
        Start PLC
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   949
        """
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   950
        if self.GetIECProgramsAndVariables():
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   951
            self._connector.StartPLC()
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   952
            self.logger.write(_("Starting PLC\n"))
576
7fcdc0d3d8d9 Some typo fixes to make debug related methods in LPCAppOject stop throwing exceptions, less agressive error message when unplugging LPC
edouard
parents: 575
diff changeset
   953
            self._connect_debug()
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   954
        else:
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   955
            self.logger.write_error(_("Couldn't start PLC !\n"))
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   956
        self.UpdateMethodsFromPLCStatus()
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
   957
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   958
#-------------------------------------------------------------------------------
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   959
#                              LPCBeremiz Class
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   960
#-------------------------------------------------------------------------------
549
5dd92bd6e6e5 Fixed bug on frame close.
Lolitech
parents: 547
diff changeset
   961
lpcberemiz_cmd=None
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   962
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   963
class LPCBeremiz(Beremiz):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   964
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   965
    def _init_coll_FileMenu_Items(self, parent):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   966
        AppendMenu(parent, help='', id=wx.ID_SAVE,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   967
              kind=wx.ITEM_NORMAL, text=_(u'Save\tCTRL+S'))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   968
        AppendMenu(parent, help='', id=wx.ID_CLOSE,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   969
              kind=wx.ITEM_NORMAL, text=_(u'Close Tab\tCTRL+W'))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   970
        parent.AppendSeparator()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   971
        AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   972
              kind=wx.ITEM_NORMAL, text=_(u'Page Setup'))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   973
        AppendMenu(parent, help='', id=wx.ID_PREVIEW,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   974
              kind=wx.ITEM_NORMAL, text=_(u'Preview'))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   975
        AppendMenu(parent, help='', id=wx.ID_PRINT,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   976
              kind=wx.ITEM_NORMAL, text=_(u'Print'))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   977
        parent.AppendSeparator()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   978
        AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   979
              kind=wx.ITEM_NORMAL, text=_(u'Properties'))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   980
        parent.AppendSeparator()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   981
        AppendMenu(parent, help='', id=wx.ID_EXIT,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   982
              kind=wx.ITEM_NORMAL, text=_(u'Quit\tCTRL+Q'))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   983
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   984
        self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   985
        self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   986
        self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   987
        self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   988
        self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   989
        self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   990
        self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   991
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   992
    def _init_ctrls(self, prnt):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   993
        IDEFrame._init_ctrls(self, prnt)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   994
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   995
        self.Bind(wx.EVT_MENU, self.OnOpenWidgetInspector, id=ID_BEREMIZINSPECTOR)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   996
        accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL|wx.ACCEL_ALT, ord('I'), ID_BEREMIZINSPECTOR)])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   997
        self.SetAcceleratorTable(accel)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   998
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
   999
        self.PLCConfig = wx.ScrolledWindow(id=ID_BEREMIZPLCCONFIG,
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1000
              name='PLCConfig', parent=self.LeftNoteBook, pos=wx.Point(0, 0),
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1001
              size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER|wx.HSCROLL|wx.VSCROLL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1002
        self.PLCConfig.SetBackgroundColour(wx.WHITE)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1003
        self.PLCConfig.Bind(wx.EVT_LEFT_DOWN, self.OnPanelLeftDown)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1004
        self.PLCConfig.Bind(wx.EVT_SIZE, self.OnMoveWindow)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1005
        self.LeftNoteBook.InsertPage(0, self.PLCConfig, _("Topology"), True)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1006
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1007
        self.LogConsole = wx.TextCtrl(id=ID_BEREMIZLOGCONSOLE, value='',
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1008
                  name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0),
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1009
                  size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1010
        self.LogConsole.Bind(wx.EVT_LEFT_DCLICK, self.OnLogConsoleDClick)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1011
        self.BottomNoteBook.AddPage(self.LogConsole, _("Log Console"))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1012
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1013
        self._init_beremiz_sizers()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1014
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1015
    def OnCloseFrame(self, event):
519
3a5faff52e5c Adding message to standard output to signal when LPCBeremiz is closed
laurent
parents: 517
diff changeset
  1016
        global frame
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1017
        
596
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1018
        if self.CheckSaveBeforeClosing(_("Close Application")):
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1019
            
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1020
            frame.Hide()
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1021
            
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1022
            self.PluginRoot.ResetAppFrame(lpcberemiz_cmd.Log)
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1023
            if self.PluginRoot.OnlineMode == 0:
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1024
                self.PluginRoot._connector = None
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1025
            
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1026
            self.PluginRoot.KillDebugThread()
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1027
            self.KillLocalRuntime()
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1028
            
598
6c919bc1551d Adding support for saving frame size while closing and restore it at next launch
laurent
parents: 597
diff changeset
  1029
            self.SaveFrameSize()
6c919bc1551d Adding support for saving frame size while closing and restore it at next launch
laurent
parents: 597
diff changeset
  1030
            
596
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1031
            lpcberemiz_cmd.Log.write("Closed\n")
b36422acae13 Adding warning message on LPCBeremiz when closing frame and program not saved
laurent
parents: 578
diff changeset
  1032
            
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1033
        event.Veto()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1034
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1035
    def ShowProperties(self):
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1036
        old_values = self.Controler.GetProjectProperties()
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1037
        dialog = ProjectDialog(self ,False)
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1038
        dialog.SetValues(old_values)
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1039
        if dialog.ShowModal() == wx.ID_OK:
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1040
            new_values = dialog.GetValues()
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1041
            new_values["creationDateTime"] = old_values["creationDateTime"]
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1042
            if new_values != old_values:
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1043
                self.Controler.SetProjectProperties(None, new_values)
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1044
                self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, 
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1045
                              TYPESTREE, INSTANCESTREE, SCALING)
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1046
        dialog.Destroy()
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1047
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1048
    def RefreshFileMenu(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1049
        if self.PluginRoot is not None:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1050
            selected = self.TabsOpened.GetSelection()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1051
            if selected >= 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1052
                graphic_viewer = isinstance(self.TabsOpened.GetPage(selected), Viewer)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1053
            else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1054
                graphic_viewer = False
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1055
            if self.TabsOpened.GetPageCount() > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1056
                self.FileMenu.Enable(wx.ID_CLOSE, True)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1057
                if graphic_viewer:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1058
                    self.FileMenu.Enable(wx.ID_PREVIEW, True)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1059
                    self.FileMenu.Enable(wx.ID_PRINT, True)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1060
                else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1061
                    self.FileMenu.Enable(wx.ID_PREVIEW, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1062
                    self.FileMenu.Enable(wx.ID_PRINT, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1063
            else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1064
                self.FileMenu.Enable(wx.ID_CLOSE, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1065
                self.FileMenu.Enable(wx.ID_PREVIEW, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1066
                self.FileMenu.Enable(wx.ID_PRINT, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1067
            self.FileMenu.Enable(wx.ID_PAGE_SETUP, True)
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1068
            self.FileMenu.Enable(wx.ID_SAVE, self.PluginRoot.PlugTestModified())
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1069
            self.FileMenu.Enable(wx.ID_PROPERTIES, True)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1070
        else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1071
            self.FileMenu.Enable(wx.ID_CLOSE, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1072
            self.FileMenu.Enable(wx.ID_PAGE_SETUP, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1073
            self.FileMenu.Enable(wx.ID_PREVIEW, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1074
            self.FileMenu.Enable(wx.ID_PRINT, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1075
            self.FileMenu.Enable(wx.ID_SAVE, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1076
            self.FileMenu.Enable(wx.ID_PROPERTIES, False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1077
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1078
    def RefreshPLCParams(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1079
        self.Freeze()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1080
        self.ClearSizer(self.PLCParamsSizer)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1081
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1082
        if self.PluginRoot is not None:    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1083
            plcwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1084
            if self.PluginRoot.PlugTestModified():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1085
                bkgdclr = CHANGED_TITLE_COLOUR
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1086
            else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1087
                bkgdclr = TITLE_COLOUR
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1088
                
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1089
            if self.PluginRoot not in self.PluginInfos:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1090
                self.PluginInfos[self.PluginRoot] = {"right_visible" : False}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1091
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1092
            plcwindow.SetBackgroundColour(TITLE_COLOUR)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1093
            plcwindow.Bind(wx.EVT_LEFT_DOWN, self.OnPanelLeftDown)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1094
            self.PLCParamsSizer.AddWindow(plcwindow, 0, border=0, flag=wx.GROW)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1095
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1096
            plcwindowsizer = wx.BoxSizer(wx.HORIZONTAL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1097
            plcwindow.SetSizer(plcwindowsizer)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1098
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1099
            st = wx.StaticText(plcwindow, -1)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1100
            st.SetFont(wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"]))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1101
            st.SetLabel(self.PluginRoot.GetProjectName())
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1102
            plcwindowsizer.AddWindow(st, 0, border=5, flag=wx.ALL|wx.ALIGN_CENTER)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1103
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1104
            plcwindowmainsizer = wx.BoxSizer(wx.VERTICAL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1105
            plcwindowsizer.AddSizer(plcwindowmainsizer, 0, border=5, flag=wx.ALL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1106
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1107
            plcwindowbuttonsizer = wx.BoxSizer(wx.HORIZONTAL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1108
            plcwindowmainsizer.AddSizer(plcwindowbuttonsizer, 0, border=0, flag=wx.ALIGN_CENTER)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1109
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1110
            msizer = self.GenerateMethodButtonSizer(self.PluginRoot, plcwindow, not self.PluginInfos[self.PluginRoot]["right_visible"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1111
            plcwindowbuttonsizer.AddSizer(msizer, 0, border=0, flag=wx.GROW)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1112
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1113
        self.PLCConfigMainSizer.Layout()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1114
        self.RefreshScrollBars()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1115
        self.Thaw()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1116
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1117
    def GenerateTreeBranch(self, plugin):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1118
        leftwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1119
        if plugin.PlugTestModified():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1120
            bkgdclr=CHANGED_WINDOW_COLOUR
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1121
        else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1122
            bkgdclr=WINDOW_COLOUR
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1123
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1124
        leftwindow.SetBackgroundColour(bkgdclr)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1125
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1126
        if plugin not in self.PluginInfos:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1127
            self.PluginInfos[plugin] = {"expanded" : False, "left_visible" : False, "right_visible" : False}
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1128
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1129
        self.PluginInfos[plugin]["children"] = plugin.IECSortedChilds()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1130
        plugin_infos = plugin.GetVariableLocationTree()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1131
        plugin_locations = []
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1132
        if len(self.PluginInfos[plugin]["children"]) == 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1133
            plugin_locations = plugin_infos["children"]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1134
            if not self.PluginInfos[plugin].has_key("locations_infos"):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1135
                self.PluginInfos[plugin]["locations_infos"] = {"root": {"expanded" : False}}
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1136
            
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1137
            self.PluginInfos[plugin]["locations_infos"]["root"]["left"] = None
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1138
            self.PluginInfos[plugin]["locations_infos"]["root"]["right"] = None
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1139
            self.PluginInfos[plugin]["locations_infos"]["root"]["children"] = []
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1140
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1141
        self.PluginTreeSizer.AddWindow(leftwindow, 0, border=0, flag=wx.GROW)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1142
        
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1143
        leftwindowvsizer = wx.BoxSizer(wx.VERTICAL)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1144
        leftwindow.SetSizer(leftwindowvsizer)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1145
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1146
        leftwindowsizer = wx.BoxSizer(wx.HORIZONTAL)
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1147
        leftwindowvsizer.AddSizer(leftwindowsizer, 0, border=0, flag=0)
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1148
        
680
61746934df41 Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1149
        self.GenerateEnableButton(leftwindow, leftwindowsizer, plugin)
61746934df41 Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1150
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1151
        st = wx.StaticText(leftwindow, -1)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1152
        st.SetFont(wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"]))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1153
        st.SetLabel(plugin.GetFullIEC_Channel())
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1154
        leftwindowsizer.AddWindow(st, 0, border=5, flag=wx.RIGHT)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1155
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1156
        expandbutton_id = wx.NewId()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1157
        expandbutton = wx.lib.buttons.GenBitmapToggleButton(id=expandbutton_id, bitmap=wx.Bitmap(Bpath( 'images', 'plus.png')),
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1158
              name='ExpandButton', parent=leftwindow, pos=wx.Point(0, 0),
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1159
              size=wx.Size(13, 13), style=wx.NO_BORDER)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1160
        expandbutton.labelDelta = 0
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1161
        expandbutton.SetBezelWidth(0)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1162
        expandbutton.SetUseFocusIndicator(False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1163
        expandbutton.SetBitmapSelected(wx.Bitmap(Bpath( 'images', 'minus.png')))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1164
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1165
        if len(self.PluginInfos[plugin]["children"]) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1166
            expandbutton.SetToggle(self.PluginInfos[plugin]["expanded"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1167
            def togglebutton(event):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1168
                if expandbutton.GetToggle():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1169
                    self.ExpandPlugin(plugin)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1170
                else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1171
                    self.CollapsePlugin(plugin)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1172
                self.PluginInfos[plugin]["expanded"] = expandbutton.GetToggle()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1173
                self.PLCConfigMainSizer.Layout()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1174
                self.RefreshScrollBars()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1175
                event.Skip()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1176
            expandbutton.Bind(wx.EVT_BUTTON, togglebutton, id=expandbutton_id)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1177
        elif len(plugin_locations) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1178
            locations_infos = self.PluginInfos[plugin]["locations_infos"]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1179
            expandbutton.SetToggle(locations_infos["root"]["expanded"])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1180
            def togglebutton(event):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1181
                if expandbutton.GetToggle():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1182
                    self.ExpandLocation(locations_infos, "root")
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1183
                else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1184
                    self.CollapseLocation(locations_infos, "root")
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1185
                self.PluginInfos[plugin]["expanded"] = expandbutton.GetToggle()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1186
                locations_infos["root"]["expanded"] = expandbutton.GetToggle()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1187
                self.PLCConfigMainSizer.Layout()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1188
                self.RefreshScrollBars()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1189
                event.Skip()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1190
            expandbutton.Bind(wx.EVT_BUTTON, togglebutton, id=expandbutton_id)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1191
        else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1192
            expandbutton.Enable(False)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1193
        leftwindowsizer.AddWindow(expandbutton, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1194
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1195
        sb = wx.StaticBitmap(leftwindow, -1)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1196
        icon = plugin_infos.get("icon", None)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1197
        if icon is None:
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1198
            icon_bitmap = self.LocationImageList.GetBitmap(self.LocationImageDict[plugin_infos["type"]])
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1199
        else: 
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1200
            icon_bitmap = wx.Bitmap(icon)
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1201
        sb.SetBitmap(icon_bitmap)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1202
        leftwindowsizer.AddWindow(sb, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1203
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1204
        st_id = wx.NewId()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1205
        st = wx.StaticText(leftwindow, st_id, size=wx.DefaultSize, style=wx.NO_BORDER)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1206
        st.SetFont(wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"]))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1207
        st.SetLabel(plugin.MandatoryParams[1].getName())
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1208
        leftwindowsizer.AddWindow(st, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1209
        
682
9d20df7c144a Adding support for integrating CanFestival plugin panels in Beremiz main frame
smarteh-dev
parents: 678
diff changeset
  1210
        rightwindow = self.GenerateParamsPanel(plugin, bkgdclr)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1211
        self.PluginTreeSizer.AddWindow(rightwindow, 0, border=0, flag=wx.GROW)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1212
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1213
        self.PluginInfos[plugin]["left"] = leftwindow
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1214
        self.PluginInfos[plugin]["right"] = rightwindow
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1215
        for child in self.PluginInfos[plugin]["children"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1216
            self.GenerateTreeBranch(child)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1217
            if not self.PluginInfos[child]["expanded"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1218
                self.CollapsePlugin(child)
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1219
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1220
        if len(plugin_locations) > 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1221
            locations_infos = self.PluginInfos[plugin]["locations_infos"]
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1222
            treectrl = wx.TreeCtrl(self.PLCConfig, -1, size=wx.DefaultSize, 
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1223
                                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.NO_BORDER|wx.TR_HIDE_ROOT|wx.TR_NO_LINES|wx.TR_LINES_AT_ROOT)
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1224
            treectrl.SetImageList(self.LocationImageList)
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1225
            treectrl.Bind(wx.EVT_TREE_BEGIN_DRAG, self.GenerateLocationBeginDragFunction(locations_infos))
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1226
            treectrl.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.GenerateLocationExpandCollapseFunction(locations_infos, True))
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1227
            treectrl.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.GenerateLocationExpandCollapseFunction(locations_infos, False))
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1228
            
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1229
            treectrl.AddRoot("")
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1230
            self.PluginTreeSizer.AddWindow(treectrl, 0, border=0, flag=0)
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1231
            
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1232
            rightwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1233
            rightwindow.SetBackgroundColour(wx.WHITE)
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1234
            self.PluginTreeSizer.AddWindow(rightwindow, 0, border=0, flag=wx.GROW)
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1235
            
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1236
            locations_infos["root"]["left"] = treectrl
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1237
            locations_infos["root"]["right"] = rightwindow
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1238
            for location in plugin_locations:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1239
                locations_infos["root"]["children"].append("root.%s" % location["name"])
650
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1240
                self.GenerateLocationTreeBranch(treectrl, treectrl.GetRootItem(), locations_infos, "root", location)
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1241
            if locations_infos["root"]["expanded"]:
26236e691330 Replacing sizers structure for locations tree by a treectrl in Topology panel in order to make refreshing of this panel faster
laurent
parents: 629
diff changeset
  1242
                self.ExpandLocation(locations_infos, "root")
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1243
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1244
class StdoutPseudoFile:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1245
    
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1246
    def __init__(self, port):
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1247
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1248
        self.socket.connect(('localhost', port))
552
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1249
        self.Buffer = ""
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1250
    
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1251
    def __del__(self):
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1252
        self.socket.close()
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1253
    
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1254
    def readline(self):
552
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1255
        idx = self.Buffer.find("\n")
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1256
        if idx == -1:
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1257
            self.Buffer += self.socket.recv(2048)
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1258
            idx = self.Buffer.find("\n")
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1259
        if idx != -1:
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1260
            line = self.Buffer[:idx+1]
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1261
            self.Buffer = self.Buffer[idx+1:]
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1262
            if BMZ_DBG:
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1263
                print "command >"+line
552
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1264
            return line
ab7916df0de7 Bug with recv from socket fixed
laurent
parents: 551
diff changeset
  1265
        return ""
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1266
    
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1267
    """ Base class for file like objects to facilitate StdOut for the Shell."""
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1268
    def write(self, s, style = None):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1269
        if s != '':
578
6f5795bdee49 Making debugger more stable with LPC
edouard
parents: 576
diff changeset
  1270
            self.socket.send(s.encode('utf8'))
6f5795bdee49 Making debugger more stable with LPC
edouard
parents: 576
diff changeset
  1271
        
6f5795bdee49 Making debugger more stable with LPC
edouard
parents: 576
diff changeset
  1272
    def writeyield(self, s):
6f5795bdee49 Making debugger more stable with LPC
edouard
parents: 576
diff changeset
  1273
        self.write(s)
6f5795bdee49 Making debugger more stable with LPC
edouard
parents: 576
diff changeset
  1274
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1275
    def write_warning(self, s):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1276
        self.write(s)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1277
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1278
    def write_error(self, s):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1279
        self.write(s)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1280
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1281
    def flush(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1282
        pass
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1283
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1284
    def isatty(self):
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1285
        return False
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1286
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1287
if __name__ == '__main__':
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1288
    
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1289
    from threading import Thread, Timer, Semaphore
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1290
    import cmd
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1291
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1292
    wx_eval_lock = Semaphore(0)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1293
    eval_res = None
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1294
    def wx_evaluator(callable, *args, **kwargs):
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1295
        global eval_res
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1296
        eval_res = None
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1297
        try:
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1298
            eval_res=callable(*args,**kwargs)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1299
        finally:
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1300
            wx_eval_lock.release()
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1301
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1302
    def evaluator(callable, *args, **kwargs):
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1303
        global eval_res
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1304
        wx.CallAfter(wx_evaluator,callable,*args,**kwargs)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1305
        wx_eval_lock.acquire()
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1306
        return eval_res
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1307
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1308
    # Command log for debug, for viewing from wxInspector
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1309
    if BMZ_DBG:
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1310
        __builtins__.cmdlog = []
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1311
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1312
    class LPCBeremiz_Cmd(cmd.Cmd):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1313
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1314
        prompt = ""
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1315
        RefreshTimer = None
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1316
        
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1317
        def __init__(self, PluginRoot, Log):
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1318
            cmd.Cmd.__init__(self, stdin=Log, stdout=Log)
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1319
            self.use_rawinput = False
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1320
            self.Log = Log
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1321
            self.PluginRoot = PluginRoot
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1322
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1323
        def RestartTimer(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1324
            if self.RefreshTimer is not None:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1325
                self.RefreshTimer.cancel()
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1326
            self.RefreshTimer = Timer(0.1, wx.CallAfter, args = [self.Refresh])
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1327
            self.RefreshTimer.start()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1328
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1329
        def Exit(self):
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1330
            global frame, app
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1331
            self.Close()
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1332
            app.ExitMainLoop()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1333
            return True
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1334
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1335
        def do_EOF(self, line):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1336
            return self.Exit()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1337
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1338
        def Show(self):
445
1b1dc8ad2498 Bug when asking two consecutive times 'Show' fixed
berem
parents: 444
diff changeset
  1339
            global frame
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1340
            if frame is not None:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1341
                self.PluginRoot.SetAppFrame(frame, frame.Log)
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1342
                frame.Show()
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1343
                frame.Raise()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1344
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1345
        def Refresh(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1346
            global frame
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1347
            if frame is not None:
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1348
                frame._Refresh(TITLE, INSTANCESTREE, FILEMENU, EDITMENU)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1349
                frame.RefreshEditor()
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1350
                frame.RefreshAll()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1351
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1352
        def Close(self):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1353
            global frame
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1354
            
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1355
            self.PluginRoot.ResetAppFrame(self.Log)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1356
            if frame is not None:
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1357
                frame.Hide()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1358
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1359
        def Compile(self):
625
08d4cc1ceb9b Fixed LPCBeremiz to refect recent root plugin build method name to change
Edouard Tisserant
parents: 599
diff changeset
  1360
            self.PluginRoot._Build()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1361
        
500
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1362
        def SetProjectProperties(self, projectname, productname, productversion, companyname):
af7c28de4cc7 Adding support for defining mandatory parameters and creating blank xml file when there is nothing in the folder in LPCBeremiz
laurent
parents: 494
diff changeset
  1363
            properties = self.PluginRoot.GetProjectProperties()
597
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1364
            new_properties = properties.copy()
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1365
            new_properties["projectName"] = projectname
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1366
            new_properties["productName"] = productname
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1367
            new_properties["productVersion"] = productversion
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1368
            new_properties["companyName"] = companyname
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1369
            if new_properties != properties:
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1370
                self.PluginRoot.SetProjectProperties(properties=new_properties)
6fbfd3bf2927 Fix bug in LPCBeremiz marking any newly opened project as modified
laurent
parents: 596
diff changeset
  1371
                self.RestartTimer()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1372
        
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
  1373
        def SetOnlineMode(self, mode, path=None):
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1374
            self.PluginRoot.SetOnlineMode(mode, path)
487
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
  1375
            self.RestartTimer()
1df4a28d3586 Adding support for receiving PLC state from LPCComposer
laurent
parents: 478
diff changeset
  1376
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1377
        def AddBus(self, iec_channel, name, icon=None):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1378
            for child in self.PluginRoot.IterChilds():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1379
                if child.BaseParams.getName() == name:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1380
                    return "Error: A bus named %s already exists\n" % name
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1381
                elif child.BaseParams.getIEC_Channel() == iec_channel:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1382
                    return "Error: A bus with IEC_channel %d already exists\n" % iec_channel
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1383
            bus = self.PluginRoot.PlugAddChild(name, "LPCBus", iec_channel)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1384
            if bus is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1385
                return "Error: Unable to create bus\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1386
            bus.SetIcon(icon)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1387
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1388
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1389
        def RenameBus(self, iec_channel, name):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1390
            bus = self.PluginRoot.GetChildByIECLocation((iec_channel,))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1391
            if bus is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1392
                return "Error: No bus found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1393
            for child in self.PluginRoot.IterChilds():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1394
                if child != bus and child.BaseParams.getName() == name:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1395
                    return "Error: A bus named %s already exists\n" % name
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1396
            bus.BaseParams.setName(name)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1397
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1398
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1399
        def ChangeBusIECChannel(self, old_iec_channel, new_iec_channel):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1400
            bus = self.PluginRoot.GetChildByIECLocation((old_iec_channel,))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1401
            if bus is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1402
                return "Error: No bus found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1403
            for child in self.PluginRoot.IterChilds():
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1404
                if child != bus and child.BaseParams.getIEC_Channel() == new_iec_channel:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1405
                    return "Error: A bus with IEC_channel %d already exists\n" % new_iec_channel
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1406
            if wx.GetApp() is None:
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1407
                self.PluginRoot.UpdateProjectVariableLocation(str(old_iec_channel), 
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1408
                                                              str(new_iec_channel))
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1409
            else:
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1410
                self.PluginRoot.UpdateProjectVariableLocation(
539
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1411
                             str(old_iec_channel), 
6ff2c1d34640 Modifying LPCBeremiz to launch silently a frame and show or hide it on demand.
laurent
parents: 530
diff changeset
  1412
                             str(new_iec_channel))
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1413
            bus.BaseParams.setIEC_Channel(new_iec_channel)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1414
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1415
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1416
        def RemoveBus(self, iec_channel):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1417
            bus = self.PluginRoot.GetChildByIECLocation((iec_channel,))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1418
            if bus is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1419
                return "Error: No bus found\n"
444
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1420
            self.PluginRoot.RemoveProjectVariableByFilter(str(iec_channel))
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1421
            self.PluginRoot.PluggedChilds["LPCBus"].remove(bus)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1422
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1423
    
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1424
        def AddModule(self, parent, iec_channel, name, icode, icon=None):
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1425
            module = self.PluginRoot.GetChildByIECLocation(parent)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1426
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1427
                return "Error: No parent found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1428
            for child in _GetModuleChildren(module):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1429
                if child["name"] == name:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1430
                    return "Error: A module named %s already exists\n" % name
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1431
                elif child["IEC_Channel"] == iec_channel:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1432
                    return "Error: A module with IEC_channel %d already exists\n" % iec_channel 
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1433
            _GetLastModuleGroup(module).append({"name": name, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1434
                                                "type": LOCATION_MODULE, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1435
                                                "IEC_Channel": iec_channel, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1436
                                                "icon": icon, 
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1437
                                                "init": icode, 
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1438
                                                "children": []})
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1439
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1440
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1441
        def RenameModule(self, iec_location, name):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1442
            module = self.PluginRoot.GetChildByIECLocation(iec_location)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1443
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1444
                return "Error: No module found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1445
            parent = self.PluginRoot.GetChildByIECLocation(iec_location[:-1])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1446
            if parent is self.PluginRoot:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1447
                return "Error: No module found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1448
            if module["name"] != name:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1449
                for child in _GetModuleChildren(parent):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1450
                    if child["name"] == name:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1451
                        return "Error: A module named %s already exists\n" % name
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1452
                module["name"] = name
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1453
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1454
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1455
        def ChangeModuleIECChannel(self, old_iec_location, new_iec_channel):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1456
            module = self.PluginRoot.GetChildByIECLocation(old_iec_location)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1457
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1458
                return "Error: No module found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1459
            parent = self.PluginRoot.GetChildByIECLocation(old_iec_location[:-1])
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1460
            if parent is self.PluginRoot:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1461
                return "Error: No module found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1462
            if module["IEC_Channel"] != new_iec_channel:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1463
                for child in _GetModuleChildren(parent):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1464
                    if child["IEC_Channel"] == new_iec_channel:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1465
                        return "Error: A module with IEC_channel %d already exists\n" % new_iec_channel
444
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1466
            self.PluginRoot.UpdateProjectVariableLocation(".".join(map(str, old_iec_location)), ".".join(map(str, old_iec_location[:1] + (new_iec_channel,))))
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1467
            module["IEC_Channel"] = new_iec_channel
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1468
            self.RestartTimer()
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1469
        
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1470
        def ChangeModuleInitCode(self, iec_location, icode):
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1471
            module = self.PluginRoot.GetChildByIECLocation(iec_location)
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1472
            if module is None:
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1473
                return "Error: No module found\n"
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1474
            module["init"] = icode
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1475
        
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1476
        def RemoveModule(self, parent, iec_channel):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1477
            module = self.PluginRoot.GetChildByIECLocation(parent)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1478
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1479
                return "Error: No parent found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1480
            child = _GetModuleBySomething(module, "IEC_Channel", (iec_channel,))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1481
            if child is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1482
                return "Error: No module found\n"
444
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1483
            self.PluginRoot.RemoveProjectVariableByFilter(".".join(map(str, parent + (iec_channel,))))
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1484
            _RemoveModuleChild(module, child)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1485
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1486
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1487
        def StartGroup(self, parent, name, icon=None):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1488
            module = self.PluginRoot.GetChildByIECLocation(parent)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1489
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1490
                return "Error: No parent found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1491
            for child in module["children"]:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1492
                if child["type"] == LOCATION_GROUP and child["name"] == name:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1493
                    return "Error: A group named %s already exists\n" % name
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1494
            module["children"].append({"name": name, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1495
                                      "type": LOCATION_GROUP, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1496
                                      "icon": icon, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1497
                                      "children": []})
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1498
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1499
    
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1500
        def AddVariable(self, parent, location, name, direction, type, rcode, pcode, description=""):
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1501
            module = self.PluginRoot.GetChildByIECLocation(parent)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1502
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1503
                return "Error: No parent found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1504
            for child in _GetModuleChildren(module):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1505
                if child["name"] == name:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1506
                    return "Error: A variable named %s already exists\n" % name
472
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
  1507
                if child["location"] == location and child["type"] == LOCATION_TYPES[direction]:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1508
                    return "Error: A variable with location %s already exists\n" % ".".join(map(str, location))
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1509
            _GetLastModuleGroup(module).append({"name": name, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1510
                                                "location": location, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1511
                                                "type": LOCATION_TYPES[direction], 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1512
                                                "IEC_type": type, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1513
                                                "description": description, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1514
                                                "retrieve": rcode, 
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1515
                                                "publish": pcode})
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1516
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1517
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1518
        def ChangeVariableParams(self, parent, location, new_name, new_direction, new_type, new_rcode, new_pcode, new_description=None):
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1519
            module = self.PluginRoot.GetChildByIECLocation(parent)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1520
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1521
                return "Error: No parent found\n"
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1522
            variable = None
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1523
            for child in _GetModuleChildren(module):
472
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
  1524
                if child["location"] == location and child["type"] == LOCATION_TYPES[new_direction]:
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1525
                    variable = child
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1526
                elif child["name"] == new_name:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1527
                    return "Error: A variable named %s already exists\n" % new_name
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1528
            if variable is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1529
                return "Error: No variable found\n"
444
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1530
            if variable["name"] != new_name:
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1531
                self.PluginRoot.UpdateProjectVariableName(variable["name"], new_name)
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1532
                variable["name"] = new_name
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1533
            variable["type"] = LOCATION_TYPES[new_direction]
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1534
            variable["IEC_type"] = new_type
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1535
            variable["retrieve"] = new_rcode
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1536
            variable["publish"] = new_pcode
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1537
            if new_description is not None:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1538
                variable["description"] = new_description
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1539
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1540
    
472
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
  1541
        def RemoveVariable(self, parent, location, direction):
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1542
            module = self.PluginRoot.GetChildByIECLocation(parent)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1543
            if module is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1544
                return "Error: No parent found\n"
472
80eb3bde98e3 Adding support for defining input and output with the same location in LPCBeremiz
laurent
parents: 445
diff changeset
  1545
            child = _GetModuleVariable(module, location, direction)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1546
            if child is None:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1547
                return "Error: No variable found\n"
444
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1548
            size = LOCATION_SIZES[self.PluginRoot.GetBaseType(child["IEC_type"])]
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1549
            address = "%" + LOCATION_DIRS[child["type"]] + size + ".".join(map(str, parent + location))
8eb1186fc9cf Adding support for updating or removing located variables by their address or leading address numbers when changing or removing VariableTree element
laurent
parents: 442
diff changeset
  1550
            self.PluginRoot.RemoveProjectVariableByAddress(address)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1551
            _RemoveModuleChild(module, child)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1552
            self.RestartTimer()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1553
        
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1554
    def location(loc):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1555
        return tuple(map(int, loc.split(".")))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1556
    
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1557
    def GetCmdFunction(function, arg_types, opt=0):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1558
        arg_number = len(arg_types)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1559
        def CmdFunction(self, line):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1560
            args_toks = line.split('"')
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1561
            if len(args_toks) % 2 == 0:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1562
                self.Log.write("Error: Invalid command\n")
526
68375ccdf968 Added flush when printing to standard output.
tkragelj
parents: 521
diff changeset
  1563
                sys.stdout.flush()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1564
                return
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1565
            args = []
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1566
            for num, arg in enumerate(args_toks):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1567
                if num % 2 == 0:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1568
                    stripped = arg.strip()
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1569
                    if stripped:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1570
                        args.extend(stripped.split(" "))
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1571
                else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1572
                    args.append(arg)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1573
            number = None
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1574
            extra = ""
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1575
            if opt == 0 and len(args) != arg_number:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1576
                number = arg_number
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1577
            elif len(args) > arg_number:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1578
                number = arg_number
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1579
                extra = " at most"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1580
            elif len(args) < arg_number - opt:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1581
                number = arg_number - opt
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1582
                extra = " at least"
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1583
            if number is not None:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1584
                if number == 0:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1585
                    self.Log.write("Error: No argument%s expected\n" % extra)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1586
                elif number == 1:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1587
                    self.Log.write("Error: 1 argument%s expected\n" % extra)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1588
                else:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1589
                    self.Log.write("Error: %d arguments%s expected\n" % (number, extra))
526
68375ccdf968 Added flush when printing to standard output.
tkragelj
parents: 521
diff changeset
  1590
                sys.stdout.flush()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1591
                return
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1592
            for num, arg in enumerate(args):
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1593
                try:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1594
                    args[num] = arg_types[num](arg)
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1595
                except:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1596
                    self.Log.write("Error: Invalid value for argument %d\n" % (num + 1))
526
68375ccdf968 Added flush when printing to standard output.
tkragelj
parents: 521
diff changeset
  1597
                    sys.stdout.flush()
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1598
                    return
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1599
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1600
            func = getattr(self, function)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1601
            res = evaluator(func,*args)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1602
571
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1603
            if BMZ_DBG:
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1604
                cmdlog.append((function,line,res))
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1605
                if len(cmdlog) > 100: #prevent debug log to grow too much
427bf9130d12 Debug switch (file in CWD). LPC : better MD5 handling, Run button in boot mode, handling data feedback in boot protocol
edouard
parents: 566
diff changeset
  1606
                    cmdlog.pop(0) 
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1607
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1608
            if isinstance(res, (StringType, UnicodeType)):
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1609
                self.Log.write(res)
442
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1610
                return False
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1611
            else:
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1612
                return res
f971de6d274f Adding Beremiz LPCComposer specific file
laurent
parents:
diff changeset
  1613
        return CmdFunction
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1614
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1615
    def CmdThreadProc(PluginRoot, Log):
549
5dd92bd6e6e5 Fixed bug on frame close.
Lolitech
parents: 547
diff changeset
  1616
        global lpcberemiz_cmd
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1617
        for function, (arg_types, opt) in {"Exit": ([], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1618
                                           "Show": ([], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1619
                                           "Refresh": ([], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1620
                                           "Close": ([], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1621
                                           "Compile": ([], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1622
                                           "SetProjectProperties": ([str, str, str, str], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1623
                                           "SetOnlineMode": ([str, str], 1),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1624
                                           "AddBus": ([int, str, str], 1),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1625
                                           "RenameBus": ([int, str], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1626
                                           "ChangeBusIECChannel": ([int, int], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1627
                                           "RemoveBus": ([int], 0),
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1628
                                           "AddModule": ([location, int, str, str, str], 1), 
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1629
                                           "RenameModule": ([location, str], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1630
                                           "ChangeModuleIECChannel": ([location, int], 0),
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1631
                                           "ChangeModuleInitCode": ([location, str], 0),
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1632
                                           "RemoveModule": ([location, int], 0),
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1633
                                           "StartGroup": ([location, str, str], 1),
553
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1634
                                           "AddVariable": ([location, location, str, str, str, str, str, str], 1),
d071efd2a94b Move init code from variable to module
laurent
parents: 552
diff changeset
  1635
                                           "ChangeVariableParams": ([location, location, str, str, str, str, str, str], 1),
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1636
                                           "RemoveVariable": ([location, location], 0)}.iteritems():
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1637
            
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1638
            setattr(LPCBeremiz_Cmd, "do_%s" % function, GetCmdFunction(function, arg_types, opt))
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1639
        lpcberemiz_cmd = LPCBeremiz_Cmd(PluginRoot, Log)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1640
        lpcberemiz_cmd.cmdloop()
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1641
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1642
    Log = StdoutPseudoFile(port)
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1643
652
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
  1644
    PluginRoot = LPCPluginsRoot(None, Log, buildpath)
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1645
    if projectOpen is not None and os.path.isdir(projectOpen):
652
eb2d9f2b3567 Adding support for loading specific POUs library in LPCBeremiz
laurent
parents: 650
diff changeset
  1646
        result = PluginRoot.LoadProject(projectOpen)
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1647
        if result:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1648
            Log.write("Error: Invalid project directory", result)
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1649
    else:
551
d18e86b603bc Adding support for command line communication by socket instead of stdin/stdout
laurent
parents: 550
diff changeset
  1650
        Log.write("Error: No such file or directory")
547
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1651
    
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1652
    cmd_thread=Thread(target=CmdThreadProc, args=[PluginRoot, Log])
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1653
    cmd_thread.start()
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1654
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1655
    # Install a exception handle for bug reports
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1656
    AddExceptHook(os.getcwd(),__version__)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1657
    
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1658
    frame = LPCBeremiz(None, plugin_root=PluginRoot, debug=True)
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1659
    
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1660
    app.MainLoop()
5748d695beee Reorganization of threading for command line and wx main loops. Commands are now cleanly serialized through calls to wx.CallAfter. wx mainloop now runs on main thread.
Lolitech
parents: 543
diff changeset
  1661