Initialisation depot

This commit is contained in:
Serge NOEL
2026-06-17 14:00:51 +02:00
commit efdf1683af
33190 changed files with 5907629 additions and 0 deletions
@@ -0,0 +1,52 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Apple macOS version 5.8.0">
<title>JMRI: LogixNG Documentation</title>
<meta name="author" content="Daniel Bergqvist">
<meta name="keywords" content="logixng model railroad JMRI LogixNG PanelPro">
<!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<div id="container">
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>LogixNG - The Categories enum</h1>
<h2>The Categories enum</h2>
<p>Every type of expression and action has a predefined category to which the expression or
action belongs to. The main usage of categories is to sort expressions by category when the
user adds a new expression or action and therefore selects which to add.</p>
<ul>
<li><strong>ITEM</strong><br>
An item on the layout, for example turnout, sensor or signal mast.</li>
<li><strong>COMMON</strong><br>
Commonly used items. For example the expressions And, Or and Timer, and the actions Many
and IfThen.</li>
<li><strong>OTHER</strong><br>
All other expressions and actions which don't fit in the above categories.</li>
<li><strong>EXRAVAGANZA</strong><br>
Things seldom used, included mostly for fun, but maybe useful in some cases. These are
partly included to demonstrate the possibilities that LogixNG offers.</li>
</ul>
<!--#include virtual="/Footer" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
</div>
<!-- closes #container -->
<script src="/js/help.js"></script>
</body>
</html>
@@ -0,0 +1,233 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Apple macOS version 5.8.0">
<title>JMRI: LogixNG Documentation</title>
<meta name="author" content="Daniel Bergqvist">
<meta name="keywords" content="logixng model railroad JMRI LogixNG PanelPro">
<!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<div id="container">
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>LogixNG - Create Expressions, Actions, and so on</h1>
<h2>The structure of LogixNG</h2>
<p>LogixNG is a tree structure, where the root is a LogixNG. The LogixNG can have
ConditionalNGs as children.</p>
<p>A ConditionalNG have a female digital action socket to which an digital action can be
connected.</p>
Each ConditionalNG can have digital actions
<h2>The locking mechanism</h2>
<p>LogixNG has a lock that has three possible values.</p>
<ul>
<li>NONE - The item is not locked.</li>
<li>USER_LOCK - The item is locked by the user and can be unlocked by the user.</li>
<li>HARD_LOCK - The item is locked by a hard lock that cannot be unlocked by the user by
the user interface. But it can be removed by editing the xml file. This lock is used for
items that normally shouldn't be changed.</li>
</ul>
<h2>The Base interface</h2>
<p>Expressions, Actions, and others, all implements the Base interface. It has methods that
are common to everything in LogixNG.</p>
<h3>Methods</h3>
<h4>getSystemName</h4>
<p>This is the same method as NamedBean.getSystemName(). It's included here to give the XML
classes access to this method having MaleSocket extend NamedBean.</p>
<h4>getConfiguratorClassName</h4>
<p>Returns the fully qualified class name of the class that is used to configurate this
class. That class needs to implement the
jmri.jmrit.logixng.swing.PluginConfiguratorInterface interface.</p>
<h4>getShortDescription</h4>
<p>Get a short description of this item.</p>
<h4>getLongDescription</h4>
<p>Get a long description of this item.</p>
<h4>getChild</h4>
<p>Get a child of this item.</p>
<h4>getChildCount</h4>
<p>Get the number of children.</p>
<h4>getCategory</h4>
<p>Get the category.</p>
<h4>isExternal</h4>
<p>Is this external? Does it affects or is dependent on external things, like turnouts and
sensors? Timers are considered as internal since they behavies the same on every computer
on every layout.</p>
<h4>getLock</h4>
<p>Get the status of the lock.</p>
<h4>setLock</h4>
<p>Set the status of the lock.</p>
<h2>Creating an Expression</h2>
<p>An expression must implement the <strong>Expression</strong> interface, that in turn
inherits the <strong>NamedBean</strong> interface. It's recommended that expression classes
extends the <strong>AbstractExpression</strong> class which has a default implementation of
the NamedBean interface.</p>
<h3>Methods</h3>
<h4>evaluate</h4>
<p>Evaluates the expression and returns the result of the expression.</p>
<h4>reset</h4>
<p>Resets the evaluation. The method <strong>reset()</strong> is called then when the
closest ancestor Action is activated. An example is a timer who is used to delay the
execution of an action's child action.</p>
<p>A parent expression must to call <strong>reset()</strong> on its children when the
method <strong>reset()</strong> is called on the parent.</p>
<h2>Creating an Action</h2>
<p>An action must implement the <strong>Action</strong> interface, that in turn inherits
the <strong>NamedBean</strong> interface. It's recommended that action classes extends the
<strong>AbstractAction</strong> class which has a default implementation of the NamedBean
interface.</p>
<h3>Methods</h3>
<p><strong>executeStart</strong>
</p>
<p>Start execution of this Action.</p>
<p><strong>executeContinue</strong>
</p>
<p>Continue execution of this Action.</p>
<p><strong>executeRestart</strong>
</p>
<p>Restart the execute of this Action.</p>
<p><strong>abort</strong>
</p>
<p>Abort this action.</p>
<h2>Creating an AnalogExpression</h2>
<p>An analog expression must implement the <strong>AnalogExpression</strong> interface,
that in turn inherits the <strong>NamedBean</strong> interface. It's recommended that
expression classes extends the <strong>AbstractAnalogExpression</strong> class which has a
default implementation of the NamedBean interface.</p>
<h3>Methods</h3>
<h4>evaluate</h4>
<p>Evaluates the expression and returns the result of the expression.</p>
<h2>Creating an AnalogAction</h2>
<p>An analog action must implement the <strong>AnalogAction</strong> interface, that in
turn inherits the <strong>NamedBean</strong> interface. It's recommended that analog action
classes extends the <strong>AbstractAnalogAction</strong> class which has a default
implementation of the NamedBean interface.</p>
<h3>Methods</h3>
<p><strong>setValue</strong>
</p>
<p>Set an analog value.</p>
<h2>Creating an StringExpression</h2>
<p>A string expression must implement the <strong>Expression</strong> interface, that in
turn inherits the <strong>NamedBean</strong> interface. It's recommended that string
expression classes extends the <strong>AbstractStringExpression</strong> class which has a
default implementation of the NamedBean interface.</p>
<h3>Methods</h3>
<h4>evaluate</h4>
<p>Evaluates the string expression and returns the result of the string expression.</p>
<h2>Creating an StringAction</h2>
<p>A string action must implement the <strong>StringAction</strong> interface, that in turn
inherits the <strong>NamedBean</strong> interface. It's recommended that string action
classes extends the <strong>AbstractStringAction</strong> class which has a default
implementation of the NamedBean interface.</p>
<h3>Methods</h3>
<p><strong>setValue</strong>
</p>
<p>Set a string value.</p>
<h2>Register an expression or an action</h2>
<p>In order for JMRI to be able to use the expression or the action, it needs to be told
about it. That is done by implementing a ExpressionFactory or a ActionFactory that can tell
JMRI about the expressions or actions and then mark it with the <a href=
"../plugins.shtml">@ServiceProvider</a> annotation. A single factory can register many
classes. For classes that are supplied with JMRI, it's recommended to use the
<strong>DefaultExpressionFactory</strong> and the
<strong>DefaultActionFactory</strong>.</p>
<h2>AbstractExpression and AbstractAction vs AbstractNamedBean</h2>
<p>The <strong>NamedBean</strong> interface has the methods <strong>setState()</strong> and
<strong>getState()</strong>. These should never be implemented in expressions and
actions.</p>
<p>For expressions, <strong>getState()</strong> returns <strong>Expression.TRUE</strong> or
<strong>Expression.FALSE</strong> dependent on the last result of the expression, but this
is handled automaticly by <strong>InternalExpression</strong>. The method
<strong>setState()</strong> has no impact on expressions.</p>
<p>For actions, neither of <strong>setState()</strong> or <strong>getState()</strong> will
ever be called since <strong>InternalAction</strong> will prevent that.</p>
<!--#include virtual="/Footer" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
</div>
<!-- closes #container -->
<script src="/js/help.js"></script>
</body>
</html>
@@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Apple macOS version 5.8.0">
<title>JMRI: LogixNG Documentation</title>
<meta name="author" content="Daniel Bergqvist">
<meta name="keywords" content="logixng model railroad JMRI LogixNG PanelPro">
<!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<div id="container">
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>JMRI Code: LogixNG</h1>
<p>This page describes the technical aspects of LogixNG and how to add new features to
LogixNG. It's recommended to read the <a href="../../../tools/LogixNG.shtml">User
manual</a> first which describes the concept of LogixNG.</p>
<h2>LogixNG technical pages</h2>
<ul>
<li>
<a href="PackageStructure.shtml">The structure of LogixNG packages</a>
</li>
<li>
<a href="CategoriesEnum.shtml">The Categories enum</a>
</li>
<li>
<a href="CreateExpressionsAndActions.shtml">Create Expressions, Actions, and so on</a>
</li>
<li>
<a href="Sockets.shtml">Sockets</a>
</li>
<li>
<a href="Plugins.shtml">Plugins for LogixNG</a>
</li>
<li>
<a href="UnitTesting.shtml">Unit testing of LogixNG</a>
</li>
</ul>
<h2>Aaaa</h2>
<p>Bbbb.</p>
<!--#include virtual="/Footer" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
</div>
<!-- closes #container -->
<script src="/js/help.js"></script>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Apple macOS version 5.8.0">
<title>JMRI: LogixNG Documentation</title>
<meta name="author" content="Daniel Bergqvist">
<meta name="keywords" content="logixng model railroad JMRI LogixNG PanelPro">
<!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<div id="container">
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>LogixNG - Package structure</h1>
<h2>The package structure of LogixNG</h2>
<p>A major design principle for LogixNG is modularity. In order to achieve that, LogixNG
has the following structure.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;</h3>
<p>&lt;type&gt; can be "analog", "digital", "generic" or "string".</p>
<p>The package jmri.jmrit.logixng.analog has everything that is related to analog actions
and analog expressions.</p>
<p>The package jmri.jmrit.logixng.digital has everything that is related to digital actions
and digital expressions.</p>
<p>The package jmri.jmrit.logixng.string has everything that is related to string actions
and string expressions.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.actions</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.actions has the actions that are shipped
with JMRI. These are registered by a factory class and should not be accessed directly. An
action class should not use another action class directly.</p>
<p>There should not be any assumptions on which actions are included in JMRI. The lists of
action classes is supplied by the AnalogActionManager, DigitalActionManager and
StringActionManager. This ensures that action classes can be added later, either to the
JMRI source code or at runtime as plugins.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.actions.swing</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.actions.swing has the swing classes that are
used to configure action classes. Each action class must have its own swing class in this
package.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.actions.configurexml</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.actions.configurexml has the xml classes
that are used to configure action classes. Each action class must have its own xml class in
this package.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.expressions</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.expressions has the expressions that are
shipped with JMRI. These are registered by a factory class and should not be accessed
directly. An expression class should not use another expression class directly.</p>
<p>There should not be any assumptions on which expressions are included in JMRI. The lists
of expression classes is supplied by the AnalogExpressionManager, DigitalActionManager and
StringActionManager. This ensures that expression classes can be added later, either to the
JMRI source code or at runtime as plugins.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.expressions.swing</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.expressions.swing has the swing classes that
are used to configure expression classes. Each expression class must have its own swing
class in this package.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.expressions.configurexml</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.expressions.configurexml has the xml classes
that are used to configure expression classes. Each expression class must have its own xml
class in this package.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.implementation</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.implementation has some classes that are
used by actions and expressions, for example implementation of managers and implementation
of male and female sockets.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.implementation.configurexml</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.implementation.configurexml has the xml
classes that are used to configure implementation classes.</p>
<h3>jmri.jmrit.logixng.&lt;type&gt;.log</h3>
<p>The package jmri.jmrit.logixng.&lt;type&gt;.log has classes used for logging of the
current state of the actions and expressions.</p>
<h3>jmri.jmrit.logixng.implementation</h3>
<p>The package jmri.jmrit.logixng.implementation has implementations of everything that is
not actions, expressions or tools. No other parts of JMRI nor LogixNG should access this
package directly.</p>
<h3>jmri.jmrit.logixng.implementation.configurexml</h3>
<p>The package jmri.jmrit.logixng.implementation.configurexml has the xml classes that are
used to configure implementation classes.</p>
<h3>jmri.jmrit.tools.swing</h3>
<p>The package jmri.jmrit.logixng.tools.swing has the editor, debugger and time diagram of
LogixNG.</p>
<h3>Exceptions to the above rules</h3>
<p>The ImportLogix tool uses many expressions in the jmri.jmrit.logixng.expressions package
and many actions in the jmri.jmrit.logixng.actions package.</p>
<p>The XML schema xml/schema/types/logixng-4.13.4.xsd uses the default managers in the
jmri.jmrit.logixng.implementation package.</p>
<!--#include virtual="/Footer" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
</div>
<!-- closes #container -->
<script src="/js/help.js"></script>
</body>
</html>
@@ -0,0 +1,110 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Apple macOS version 5.8.0">
<title>JMRI: LogixNG Documentation</title>
<meta name="author" content="Daniel Bergqvist">
<meta name="keywords" content="logixng model railroad JMRI LogixNG PanelPro">
<!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<div id="container">
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>LogixNG - Plugins for LogixNG</h1>
<p style="color:yellow;background-color:red">LogixNG has gone thru big changes and the code
for plugins is not up to date.</p>
<h2>Plugins for LogixNG</h2>
<p>JMRI supports extending JMRI in several ways by adding a jar file with classes to the
JMRI class path. But LogixNG is stored in the panel xml files and these are validated when
they are loaded, so when adding native expressions and actions, the logixng xml schema must
be updated.</p>
<p><a href="https://github.com/danielb987/JMRI_LogixNG_Plugins">JMRI_LogixNG_Plugins</a> is
an example project with some expression plugins and action plugins. The project has
<a href="https://danielb987.github.io/JMRI_LogixNG_Plugins.Documentation/javadoc/">Javadoc</a>.
The file <a href=
"https://github.com/danielb987/JMRI_LogixNG_Plugins.Documentation/raw/master/docs/distribution/JMRI_LogixNG_Plugins.jar">
JMRI_LogixNG_Plugins.jar</a> is the current version of the plugin. The classes in
JMRI_LogixNG_Plugins are not considered useful but intended to demonstrate the
possibilities with LogixNG. For example, ExpressionBlink and ActionHideAndShowPanel can be
used to repeatedly hide and show a selected panel. It has no prototypical usage but can be
used to play a joke with a fellow model railroader...</p>
<h3>Implementing an expression or action plugin</h3>
<p>In order to be able to save the configuration of the plugin in the panel XML files, the
plugin saves and restores the configuration in a <strong>Map&lt;String,
String&gt;</strong>. The developer of the plugin decides on how to store its configuration
in this map.</p>
<p>An expression or action that is a plugin must implement the
<strong>ExpressionPlugin</strong> or the <strong>ActionPlugin</strong>. These interfaces
has three additional methods.</p>
<p><strong>init()</strong>
</p>
<p>Initializes the plugin. This method is called after an instance of the plugin is created
if there exists a configuration. Note that this method is not called the first time an
instance has been created, before it has been configured by the configurator.</p>
<p><strong>getConfig()</strong>
</p>
<p>Returns the configuration for this plugin to be stored in for example a panel file.</p>
<p><strong>getConfiguratorClassName()</strong>
</p>
<p>Returns the class name of the configurator class. In order to be able to use the plugin
in a headless environment, the plugin itself is recommended to not use any swing code. This
method is called then this plugin needs to be configurated and a class is needed that can
configure this plugin. That class needs to be in the same jar file as this plugin and it
needs to implement the <strong>PluginConfiguratorInterface</strong>. One configurator class
may be the configurator for many plugins.</p>
<h3>The PluginConfiguratorInterface interface</h3>
<p>A class that is able to configure one or many plugins is called a configurator. It
generates a <strong>JPanel</strong> with the controls that are needed to configure the
plugin.</p>
<p>The PluginConfiguratorInterface interface has these methods.</p>
<p><strong>getConfigPanel()</strong>
</p>
<p>Returns a <strong>JPanel</strong> that can configure this plugin.</p>
<p><strong>getConfigFromPanel()</strong>
</p>
<p>Returns the configuration for this plugin to be stored in for example a panel file.</p>
<h3>Plugin in the JMRI classpath</h3>
<p>JMRI can automaticly load plugins in the JMRI classpath. That is done by implementing a
<strong>LogixNGPluginFactory</strong> that can tell JMRI about the expressions or actions
and then mark it with the <a href="../plugins.shtml">@ServiceProvider</a> annotation. A
single factory can register many classes. The <a href=
"https://github.com/danielb987/JMRI_LogixNG_Plugins">JMRI_LogixNG_Plugins</a> has an
example. <!--#include virtual="/Footer" --></p>
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
</div>
<!-- closes #container -->
<script src="/js/help.js"></script>
</body>
</html>
@@ -0,0 +1,111 @@
<!-- Sidebar -->
<!-- This is the sidebar definition for help/doc/Technical/logixng pages -->
<hr class="hide">
<div id="side"> <!-- Block of text on left side of page -->
<div style="text-align: center">Code documentation</div>
<dl>
<dt class="dtheader">LogixNG</dt>
<dd>
<ul>
<li><a href="LogixNG.shtml">LogixNG overview</a>
<li><a href="PackageStructure.shtml">Package structure</a>
<li><a href="CategoriesEnum.shtml">The Categories enum</a>
<li><a href="CreateExpressionsAndActions.shtml">Create Expressions, Actions, and so on</a>
<li><a href="Sockets.shtml">Sockets</a>
<li><a href="Plugins.shtml">Plugins for LogixNG</a>
<li><a href="UnitTesting.shtml">Unit testing of LogixNG</a>
</ul>
</dd>
<dt class="dtheader">Development tools</dt>
<dd>
<ul>
<li><a href="../getgitcode.shtml">Getting the code via Git</a>
<li><a href="../gitdeveloper.shtml">Developing with JMRI Code</a>
<li><a href="../GitFAQ.shtml">Git FAQs</a>
<li>Building with:
<ul>
<li><a href="../Ant.shtml">Ant</a>
<li><a href="../NetBeans.shtml">NetBeans</a>
<li><a href="../Eclipse.shtml">Eclipse</a>
<li><a href="../IntelliJ.shtml">IntelliJ IDEA</a>
</ul>
</li>
</ul>
</dd>
<dt class="dtheader">Code Structure</dt>
<dd>
<ul>
<li><a href="../IntroStructure.shtml">Introduction</a>
<li><a href="../Names.shtml">Names and Naming</a>
<li><a href="../AppStructure.shtml">Application Structure</a>
<li><a href="../Patterns.shtml">Code Structure Patterns</a>
<li><a href="../Swing.shtml">Swing Structure</a>
<li><a href="../SystemStructure.shtml">External Connection Structure</a>
<li><a href="../AppPreferences.shtml">Application Preferences</a>
<li><a href="../Threads.shtml">Threading</a>
<li><a href="../XmlUsage.shtml">Use of XML</a>
<ul>
<li><a href="../XmlSchema.shtml">XML Schema</a>
<li><a href="../XmlView.shtml">XSLT Formatting</a>
</ul>
<li><a href="../WebSite.shtml">Web Site</a>
<li><a href="/JavaDoc/doc">Javadocs</a><ul>
<li><a href="/JavaDoc/doc/index-files/index-1.html">Name Index</a>
<li><A HREF="/JavaDoc/doc/index.html">Packages</A>
<li><A HREF="/JavaDoc/doc/allclasses-frame.html">Classes</A>
</ul>
</ul>
</dd>
<dt class="dtheader">Techniques and Standards</dt>
<dd>
<ul>
<li><a href="../RP.shtml">Recommended Practices</a>
<li><a href="../ContinuousIntegration.shtml">Continuous Integration</a>
<li><a href="../I8N.shtml">Internationalization</a>
<li><a href="../Logging.shtml">Logging &amp; Error Handling</a>
<li><a href="../JUnit.shtml">Unit testing with JUnit</a>
<li><a href="../Javadoc.shtml">Documentation with Javadoc and UML</a>
<li><a href="../SpotBugs.shtml">Run the SpotBugs static analysis tool</a>
<li><a href="../Help.shtml">Providing help with JavaHelp</a>
<li><a href="../FileNames.shtml">Portable Filename Method</a>
<li><a href="../XmlPersistance.shtml">XML Persistance</a>
</ul>
</dd>
<dt class="dtheader">How To</dt>
<dd>
<ul>
<li><a href="../plugins.shtml">Extend JMRI</a>
<li><a href="../NewSystem.shtml">Add a New System</a>
<li><a href="../NewType.shtml">Add a New Type</a>
</ul>
</dd>
<dt class="dtheader">Functional Info</dt>
<dd>
<ul>
<li><a href="../TurnoutFeedback.shtml">Turnout Feedback</a>
<li><a href="../Networking.shtml">Network Connections</a>
<li><a href="../StartUpScripts.shtml">How the startup scripts work</a>
<li><a href="LogixNG.shtml">LogixNG</a>
</ul>
</dd>
<dt class="dtheader">Background Info</dt>
<dd>
<ul>
<li><a href="../TechRoadMap.shtml">Technology Roadmap</a>
<li><a href="../JVMCapabilities.shtml">Survey of JVM Capabilities</a>
<li><a href="../Poll2007.shtml">Usage Poll, Spring 2007</a>
</ul>
</dd>
</dl>
</div> <!-- closes #side -->
<!-- /Sidebar -->
@@ -0,0 +1,67 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Apple macOS version 5.8.0">
<title>JMRI: LogixNG Documentation</title>
<meta name="author" content="Daniel Bergqvist">
<meta name="keywords" content="logixng model railroad JMRI LogixNG PanelPro">
<!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<div id="container">
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>LogixNG - Sockets</h1>
<h2>Sockets</h2>
<p>LogixNG is designed to be flexible and easy to extend. A major idea is that tools should
not need to know details of expressions and actions.</p>
<p>A LogixNG has a tree of Actions, Expressions, and more, and these are connected by
sockets. The parent has one or more female sockets and every child has a male socket.</p>
<p>When an Action or Expression is created and registered in its manager, it's given a male
socket. And it's always thru the male socket that the Action or Expression is handled.</p>
<p>When a LogixNG editor wants to create an action or expression to put into a female
socket, it can ask the LogixNG_Manager which classes that is possible to connect to this
female socket and then let the user select one of these.</p>
<p>An action or expression can have any number of female sockets of any type, which means
that the structure is very flexible. For example, the ActionIfThen action has a female
Expression socket and a female Action socket. And the ActionDoStringAction has a female
StringExpression and a female StringAction.</p>
<p>The LogixNG toolsm for example the editor, doesn't need to know about the actions,
expressions, and others, which means that completely new types can be added without needing
to change the LogixNG tools.</p>
<h2>Female sockets</h2>
<p>The female sockets tells the LogixNG tools that there is a place to connect something.
And the female socket can tell if any given male socket is compatible with this female
socket.</p>
<h2>Male sockets</h2>
<p>The male sockets is used to plug in into a compatible female socket.</p>
<p>The male sockets also handles some generic logic for their action or expression, for
example debug tools and logging.</p>
<!--#include virtual="/Footer" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
</div>
<!-- closes #container -->
<script src="/js/help.js"></script>
</body>
</html>
@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="HTML Tidy for HTML5 for Apple macOS version 5.8.0">
<title>JMRI: LogixNG Documentation</title>
<meta name="author" content="Daniel Bergqvist">
<meta name="keywords" content="logixng model railroad JMRI LogixNG PanelPro">
<!--#include virtual="/help/en/parts/Style.shtml" -->
</head>
<body>
<div id="container">
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar.shtml" -->
<div id="mainContent">
<!-- Page Body -->
<h1>Unit testing of LogixNG</h1>
<h2>Goals for unit testing of LogixNG</h2>
<p>There are two main goals with the code that is testing LogixNG.</p>
<ul>
<li>The entire code must be tested completely, including every branch. This means that on
the coverage report, both "Missed Instructions" and "Missed Branches" should be zero for
every class in LogixNG. This goal is impossible to reach entirely, but whenether
possible, this goal must be acheived.</li>
<li>The tests must be as close as possible to "real world" testing. The testing
infrastructure must test the code as realistically as possible.</li>
</ul>
<!--#include virtual="/Footer" -->
</div>
<!-- closes #mainContent-->
</div>
<!-- closes #mBody-->
</div>
<!-- closes #container -->
<script src="/js/help.js"></script>
</body>
</html>