node-red-contrib-open-protocol-desoutter
Version:
A Node-RED node to interface with other systems using the Open Protocol
1,466 lines (1,328 loc) • 44.1 kB
HTML
<!--
Copyright: (c) 2018-2020, Smart-Tech Controle e Automação
GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
-->
<!-- --< Begin >--------- OpenProtocol Config (desoutter-config) ---------------------- -->
<!--
Copyright: (c) 2020, Jeremy London
GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
-->
<!-- Updates to use desoutter-config name -->
<script type="text/x-red" data-template-name="desoutter-config">
<div class="form-row">
<label for="node-config-input-name">
<i class="fa fa-tag"></i>
<span data-i18n="open-protocol.util.label.name"></span>
</label>
<input type="text" id="node-config-input-name" data-i18n="[placeholder]open-protocol.util.label.name">
</div>
<div class="form-row">
<label for="node-config-input-controllerIP">
<i class="fa fa-home"></i>
<span data-i18n="open-protocol.config.label.controller"></span>
</label>
<input type="text" style="width: 30%" id="node-config-input-controllerIP" data-i18n="[placeholder]open-protocol.config.label.controller">
<span style="margin-left:10px" data-i18n="open-protocol.config.label.port"></span>
<input type="text" id="node-config-input-controllerPort" style="width: 60px;" data-i18n="[placeholder]open-protocol.config.label.port">
</div>
<div class="form-row">
<label for="node-config-input-keepAlive">
<i class="fa fa-clock-o"></i>
<span data-i18n="open-protocol.config.label.keep-alive"></span>
</label>
<input type="text" id="node-config-input-keepAlive"> ms
</div>
<div class="form-row">
<label for="node-config-input-timeout">
<i class="fa fa-clock-o"></i>
<span data-i18n="open-protocol.config.label.timeout"></span>
</label>
<input type="text" id="node-config-input-timeout"> ms
</div>
<div class="form-row">
<label for="node-config-input-retries">
<i class="fa fa-repeat"></i>
<span data-i18n="open-protocol.config.label.retries"></span>
</label>
<input type="text" id="node-config-input-retries"> times
</div>
<div class="form-row">
<label for="node-config-input-linkLayer">
<i class="fa fa-link"></i>
<span data-i18n="open-protocol.config.label.force-link-layer"></span>
</label>
<select type="text" id="node-config-input-linkLayer">
<option value="auto" data-i18n="open-protocol.config.label.options.auto"></option>
<option value="true" data-i18n="open-protocol.config.label.options.true"></option>
<option value="false" data-i18n="open-protocol.config.label.options.false"></option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-disablemidparsing">
<i class="fa fa-tag"></i>
<span data-i18n="open-protocol.config.label.disable-mid-parsing"></span>
</label>
<input type="text" id="node-config-input-disablemidparsing" data-i18n="[placeholder]open-protocol.config.label.disable-mid-parsing">
</div>
<div class="form-row">
<label> </label>
<input type="checkbox" id="node-config-input-rawData" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-config-input-rawData" style="width:70%;">
<span data-i18n="open-protocol.config.label.raw-data"></span>
</label>
</div>
<div class="form-row">
<label> </label>
<input type="checkbox" id="node-config-input-generic" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-config-input-generic" style="width:70%;">
<span data-i18n="open-protocol.config.label.generic"></span>
</label>
</div>
</script>
<!--
Copyright: (c) 2020, Jeremy London
GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
-->
<!-- Updates to use desoutter-config name -->
<script type="text/x-red" data-help-name="desoutter-config">
<p>This node is a expansion on the node by <a href="https://netsmarttech.com" target="_blank">Smart-Tech</a> as part of the <a href="https://netsmarttech.com/page/st-one" target="_blank">ST-One</a> project</p>
<h3>Options</h3>
<dl class="message-properties">
<dt>Controller
<span class="property-type">IP Address</span>
</dt>
<dd> ip address of controller. </dd>
<dt>Port
<span class="property-type">Number</span>
</dt>
<dd> port of controller. </dd>
<dt>KeepAlive
<span class="property-type">Number</span>
</dt>
<dd> max time without communication. </dd>
<dt>Timeout
<span class="property-type">Number</span>
</dt>
<dd> max time without connection. </dd>
<dt>Retries
<span class="property-type">Number</span>
</dt>
<dd> retries of connection. </dd>
<dt>Link Layer
<span class="property-type">Link Layer</span>
</dt>
<dd> Link Layer mode,
<code>Auto</code>: auto negotiation,
<code>True</code>: force link layer,
<code>False</code>: disable link layer
</dd>
<dt>Disable MID parsing
<span class="property-type">String</span>
</dt>
<dd> receiver MIDs with body not parsing. </dd>
<dt>Raw Data
<span class="property-type">Boolean</span>
</dt>
<dd> adds the parameter <code>_raw</code> in all messages, containing the message buffer. </dd>
<dt>Generic Mode
<span class="property-type">Boolean</span>
</dt>
<dd> the nodes use calls generics. </dd>
</dl>
</script>
<!--
Copyright: (c) 2020, Jeremy London
GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
-->
<!-- Updates to use desoutter-config name -->
<script type="text/javascript">
RED.nodes.registerType('desoutter-config', {
category: 'config',
color: '#FFAAAA',
defaults: {
name: {
value: '',
},
controllerIP: {
value: '',
required: true,
},
controllerPort: {
value: 4545,
required: true,
},
keepAlive: {
value: 10000,
},
timeout: {
value: 3000,
},
retries: {
value: 3,
},
disablemidparsing: {
value: '',
},
rawData: {
value: false,
},
generic: {
value: false,
},
linkLayer: {
value: 'auto',
},
},
label() {
if (this.name) {
return this.name;
}
const name = this.controllerIP;
return name;
},
oneditprepare() {
$('#node-config-input-keepAlive').spinner({
min: 0,
});
$('#node-config-input-timeout').spinner({
min: 0,
});
$('#node-config-input-retries').spinner({
min: 0,
});
},
});
</script>
<!-- --< End >--------- OpenProtocol Config (desoutter-config) ---------------------- -->
<!-- --< Begin >--------- OpenProtocol Node (desoutter-node) ---------------------- -->
<!--
Copyright: (c) 2020, Jeremy London
GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
-->
<!-- Updates to use desoutter-node name -->
<script type="text/x-red" data-template-name="desoutter-node">
<div class="form-row">
<label for="node-input-config">
<i class="fa fa-cog"></i>
<span data-i18n="open-protocol.node.label.config"></span>
</label>
<input type="text" id="node-input-config" data-i18n="[placeholder]open-protocol.node.label.config">
</div>
<div class="form-row">
<label for="node-input-midGroup">
<i class="fa fa-link"></i>
<span data-i18n="open-protocol.node.label.mid"></span>
</label>
<select style="width:70%;" id="node-input-midGroup"></select>
</div>
<!-- HIDE -->
<div class="form-row" id="div-custom-mid">
<label for="node-input-customMid">
<i class="fa fa-tag"></i>
<span data-i18n="open-protocol.node.label.custom-mid"></span>
</label>
<input type="text" id="node-input-customMid" data-i18n="[placeholder]open-protocol.node.label.custom-mid">
</div>
<!-- HIDE -->
<div class="form-row" id="div-revision">
<label for="node-input-revision">
<i class="fa fa-link"></i>
<span data-i18n="open-protocol.node.label.revision"></span>
</label>
<select style="width:70%;" id="node-input-revision"></select>
</div>
<!-- HIDE -->
<div class="form-row" id="div-custom-revision">
<label for="node-input-customRevision">
<i class="fa fa-tag"></i>
<span data-i18n="open-protocol.node.label.custom-revision"></span>
</label>
<input type="text" id="node-input-customRevision" data-i18n="[placeholder]open-protocol.node.label.custom-revision">
</div>
<!-- HIDE -->
<div class="form-row" id="div-auto-subscribe">
<label> </label>
<input type="checkbox" id="node-input-autoSubscribe" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-autoSubscribe" style="width:70%;">
<span data-i18n="open-protocol.node.label.auto-subscribe"></span>
</label>
</div>
<div class="form-row" id="div-forward-errors">
<label> </label>
<input type="checkbox" id="node-input-forwardErrors" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-forwardErrors" style="width:70%;">
<span data-i18n="open-protocol.node.label.forward-errors"></span>
</label>
</div>
<div class="form-row">
<label for="node-input-name">
<i class="fa fa-tag"></i>
<span data-i18n="open-protocol.util.label.name"></span>
</label>
<input type="text" id="node-input-name" data-i18n="[placeholder]open-protocol.util.label.name">
</div>
<div class="form-tips" id="div-tips">
<div id="code-info" style="height:auto; width:90%; font-family: monospace"></div>
</div>
</script>
<!--
Copyright: (c) 2020, Jeremy London
GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
-->
<!-- Updates to use desoutter-node name -->
<script type="text/x-red" data-help-name="desoutter-node">
<p>Tool communication using OpenProtocol</p>
<p>This node is a expansion on the node by <a href="https://netsmarttech.com" target="_blank">Smart-Tech</a> as part of the <a href="https://netsmarttech.com/page/st-one" target="_blank">ST-One</a> project</p>
<h3>Inputs</h3>
<dl class="message-properties">
<p> Use the parameters according to tips in node. </p>
<dt>
payload
<span class="property-type"> string | buffer | object </span>
</dt>
<dt>
subscribe
<span class="property-type"> boolean </span>
</dt>
</dl>
<h3>Outputs</h3>
<ol class="node-ports">
<li>Feedback
<dl class="message-properties">
<dt> msg <span class="property-type"> object </object></span> </dt>
<dd> header of MID. </dd>
<dt> msg.payload <span class="property-type"> object | string </object></span> </dt>
<dd> body of MID. </dd>
</dl>
</li>
<li>Data
<p> Available in <code>subscribe</code> and <code>custom</code> options. </p>
<dl class="message-properties">
<dt> msg <span class="property-type"> object </object></span> </dt>
<dd> header of MID. </dd>
<dt> msg.payload <span class="property-type"> object | string </object></span> </dt>
<dd> body of MID. </dd>
</dl>
</li>
</ol>
<h3>Options</h3>
<dl class="message-properties">
<dt>Config
<span class="property-type">OP Controller</span>
</dt>
<dd> select controller. </dd>
<dt>Mid Group
<span class="property-type">MID Group</span>
</dt>
<dd> select function this node. </dd>
<dt>Revision
<span class="property-type">Revision</span>
</dt>
<dd> select revision for MID Group,
<code>Auto</code>: auto negotiation,
<code>Custom</code>: add revision not listed
</dd>
<dt>Custom revision
<span class="property-type">Number</span>
</dt>
<dd> add number of custom revision. </dd>
<dt>Auto Subscribe
<span class="property-type">Boolean</span>
</dt>
<dd> active auto subscribe on start. </dd>
<dt>Forward Errors
<span class="property-type">Boolean</span>
</dt>
<dd> this option adds parameter <code>msg.error</code> in error cases. </dd>
</dl>
</script>
<script type="text/javascript">
(function() {
// __AUTO__GENERATED__
const base = {
'3': {
text: '3 - communicationStop',
typeRequest: 'COMMAND',
family: 'communicationStop',
implemented: true,
revisions: [1],
params: [],
},
'11': {
text: '11 - psetID',
typeRequest: 'REQUEST',
family: 'psetID',
implemented: true,
revisions: [1, 2, 3],
params: [],
},
'13': {
text: '13 - psetData',
typeRequest: 'REQUEST',
family: 'psetData',
implemented: false,
revisions: [1],
params: [],
},
'15': {
text: '15 - psetSelected',
typeRequest: 'SUBSCRIBE',
family: 'psetSelected',
implemented: true,
revisions: [2, 1],
params: [],
},
'18': {
text: '18 - selectPset',
typeRequest: 'COMMAND',
family: 'selectPset',
implemented: true,
revisions: [1],
params: { '1': [{ name: 'parameterSetID', type: 'number', desc: '0 - 999' }] },
},
'19': {
text: '19 - setPsetBatchSize',
typeRequest: 'COMMAND',
family: 'setPsetBatchSize',
implemented: true,
revisions: [1],
params: {
'1': [
{ name: 'parameterSetID', type: 'number', desc: '0 - 999' },
{
name: 'batchSize',
type: 'number',
desc: '0 - 99',
},
],
},
},
'20': {
text: '20 - resetPsetBatchCounter',
typeRequest: 'COMMAND',
family: 'resetPsetBatchCounter',
implemented: true,
revisions: [1],
params: { '1': [{ name: 'parameterSetID', type: 'number', desc: '0 - 999' }] },
},
'22': {
text: '22 - lockAtBatchDoneUpload',
typeRequest: 'SUBSCRIBE',
family: 'lockAtBatchDoneUpload',
implemented: true,
revisions: [1],
params: [],
},
'25': {
text: '25 - parameterUserSetDownload',
typeRequest: 'COMMAND',
family: 'parameterUserSetDownload',
implemented: true,
revisions: [1],
params: [],
},
'31': {
text: '31 - jobIdUpload',
typeRequest: 'REQUEST',
family: 'jobIdUpload',
implemented: true,
revisions: [1],
params: [],
},
'33': {
text: '33 - jobDataUpload',
typeRequest: 'REQUEST',
family: 'jobDataUpload',
implemented: false,
revisions: [1],
params: [],
},
'35': {
text: '35 - jobInfo',
typeRequest: 'SUBSCRIBE',
family: 'jobInfo',
implemented: true,
revisions: [1, 2, 3, 4, 5],
params: [],
},
'38': {
text: '38 - selectJob',
typeRequest: 'COMMAND',
family: 'selectJob',
implemented: true,
revisions: [2, 1],
params: {
'1': [{ name: 'jobID', type: 'number', desc: '0 - 99' }],
'2': [{ name: 'jobID', type: 'number', desc: '0 - 9999' }],
},
},
'39': {
text: '39 - jobRestart',
typeRequest: 'COMMAND',
family: 'jobRestart',
implemented: true,
revisions: [2, 1],
params: {
'1': [{ name: 'jobID', type: 'number', desc: '0 - 99' }],
'2': [{ name: 'jobID', type: 'number', desc: '0 - 9999' }],
},
},
'41': {
text: '41 - toolDataUpload',
typeRequest: 'REQUEST',
family: 'toolDataUpload',
implemented: true,
revisions: [1, 2, 3, 4, 5],
params: [],
},
'42': {
text: '42 - disableTool',
typeRequest: 'COMMAND',
family: 'disableTool',
implemented: true,
revisions: [1],
params: [],
},
'43': {
text: '43 - enableTool',
typeRequest: 'COMMAND',
family: 'enableTool',
implemented: true,
revisions: [1],
params: [],
},
'44': {
text: '44 - disconnectTool',
typeRequest: 'COMMAND',
family: 'disconnectTool',
implemented: true,
revisions: [1],
params: [],
},
'45': {
text: '45 - setCalibrationValue',
typeRequest: 'COMMAND',
family: 'setCalibrationValue',
implemented: false,
revisions: [1],
params: [],
},
'46': {
text: '46 - setPrimaryTool',
typeRequest: 'COMMAND',
family: 'setPrimaryTool',
implemented: false,
revisions: [1],
params: [],
},
'47': {
text: '47 - toolPairingHandling',
typeRequest: 'COMMAND',
family: 'toolPairingHandling',
implemented: false,
revisions: [1],
params: [],
},
'50': {
text: '50 - vinDownload',
typeRequest: 'COMMAND',
family: 'vinDownload',
implemented: true,
revisions: [1],
params: { '1': [{ name: 'numberVIN', type: 'string', desc: '25 ASCII characters' }] },
},
'52': {
text: '52 - vin',
typeRequest: 'SUBSCRIBE',
family: 'vin',
implemented: true,
revisions: [2, 1],
params: [],
},
'61': {
text: '61 - lastTightening',
typeRequest: 'SUBSCRIBE',
family: 'lastTightening',
implemented: true,
revisions: [7, 6, 5, 4, 3, 2, 1],
params: [],
},
'65': {
text: '65 - oldTighteningResultUpload',
typeRequest: 'REQUEST',
family: 'oldTighteningResultUpload',
implemented: true,
revisions: [7, 6, 5, 4, 3, 2, 1],
params: {
'1': [{ name: 'tighteningID', type: 'string', desc: '10 ASCII digits' }],
'2': [{ name: 'tighteningID', type: 'string', desc: '10 ASCII digits' }],
'3': [{ name: 'tighteningID', type: 'string', desc: '10 ASCII digits' }],
'4': [{ name: 'tighteningID', type: 'string', desc: '10 ASCII digits' }],
'5': [{ name: 'tighteningID', type: 'string', desc: '10 ASCII digits' }],
'6': [{ name: 'tighteningID', type: 'string', desc: '10 ASCII digits' }],
'7': [{ name: 'tighteningID', type: 'string', desc: '10 ASCII digits' }],
},
},
'71': {
text: '71 - alarm',
typeRequest: 'SUBSCRIBE',
family: 'alarm',
implemented: true,
revisions: [2, 1],
params: [],
},
'81': {
text: '81 - readTimeUpload',
typeRequest: 'REQUEST',
family: 'readTimeUpload',
implemented: true,
revisions: [1],
params: [],
},
'82': {
text: '82 - setTime',
typeRequest: 'COMMAND',
family: 'setTime',
implemented: true,
revisions: [1],
params: {
'1': [
{
name: 'time',
type: 'string',
desc: '19 ASCII characters: YYYY-MM-DD:HH:MM:SS',
rev: [1],
},
],
},
},
'91': {
text: '91 - multiSpindleStatus',
typeRequest: 'SUBSCRIBE',
family: 'multiSpindleStatus',
implemented: true,
revisions: [1],
params: [],
},
'101': {
text: '101 - multiSpindleResult',
typeRequest: 'SUBSCRIBE',
family: 'multiSpindleResult',
implemented: false,
revisions: [1],
params: [],
},
'106': {
text: '106 - lastPowerMACSTighteningResultStationData',
typeRequest: 'SUBSCRIBE',
family: 'lastPowerMACSTighteningResultStationData',
implemented: false,
revisions: [1],
params: [],
},
'110': {
text: '110 - displayUserTextOnCompact',
typeRequest: 'COMMAND',
family: 'displayUserTextOnCompact',
implemented: false,
revisions: [1],
params: [],
},
'111': {
text: '111 - displayUserTextOnGraph',
typeRequest: 'COMMAND',
family: 'displayUserTextOnGraph',
implemented: false,
revisions: [1],
params: [],
},
'113': {
text: '113 - flashGreenLightOnTool',
typeRequest: 'COMMAND',
family: 'flashGreenLightOnTool',
implemented: true,
revisions: [1],
params: [],
},
'121': {
text: '121 - jobLineControl',
typeRequest: 'SUBSCRIBE',
family: 'jobLineControl',
implemented: true,
revisions: [1],
params: [],
},
'127': {
text: '127 - abortJob',
typeRequest: 'COMMAND',
family: 'abortJob',
implemented: true,
revisions: [1],
params: [],
},
'128': {
text: '128 - jobBatchIncrement',
typeRequest: 'COMMAND',
family: 'jobBatchIncrement',
implemented: true,
revisions: [1],
params: [],
},
'129': {
text: '129 - jobBatchDecrement',
typeRequest: 'COMMAND',
family: 'jobBatchDecrement',
implemented: false,
revisions: [1],
params: [],
},
'130': {
text: '130 - jobOff',
typeRequest: 'COMMAND',
family: 'jobOff',
implemented: false,
revisions: [1],
params: [],
},
'131': {
text: '131 - setJobLineControlStart',
typeRequest: 'COMMAND',
family: 'setJobLineControlStart',
implemented: true,
revisions: [1],
params: [],
},
'132': {
text: '132 - setJobLineAlert1',
typeRequest: 'COMMAND',
family: 'setJobLineAlert1',
implemented: true,
revisions: [1],
params: [],
},
'133': {
text: '133 - setJobLineAlert2',
typeRequest: 'COMMAND',
family: 'setJobLineAlert2',
implemented: true,
revisions: [1],
params: [],
},
'140': {
text: '140 - executeDynamicJob',
typeRequest: 'COMMAND',
family: 'executeDynamicJob',
implemented: false,
revisions: [1],
params: [],
},
'150': {
text: '150 - identifierDownload',
typeRequest: 'COMMAND',
family: 'identifierDownload',
implemented: false,
revisions: [1],
params: [],
},
'152': {
text: '152 - multipleIdentifierResultParts',
typeRequest: 'SUBSCRIBE',
family: 'multipleIdentifierResultParts',
implemented: true,
revisions: [1],
params: [],
},
'155': {
text: '155 - bypassIdentifier',
typeRequest: 'COMMAND',
family: 'bypassIdentifier',
implemented: true,
revisions: [1],
params: [],
},
'156': {
text: '156 - resetLatestIdentifier',
typeRequest: 'COMMAND',
family: 'resetLatestIdentifier',
implemented: true,
revisions: [1],
params: [],
},
'157': {
text: '157 - resetAllIdentifiers',
typeRequest: 'COMMAND',
family: 'resetAllIdentifiers',
implemented: true,
revisions: [1],
params: [],
},
'200': {
text: '200 - setExternallyControlledRelays',
typeRequest: 'COMMAND',
family: 'setExternallyControlledRelays',
implemented: false,
revisions: [1],
params: [],
},
'211': {
text: '211 - statusExternallyMonitoredInputs',
typeRequest: 'SUBSCRIBE',
family: 'statusExternallyMonitoredInputs',
implemented: true,
revisions: [1],
params: [],
},
'215': {
text: '215 - ioDeviceStatus',
typeRequest: 'REQUEST',
family: 'ioDeviceStatus',
implemented: false,
revisions: [1],
params: [],
},
'217': {
text: '217 - relayFunction',
typeRequest: 'SUBSCRIBE',
family: 'relayFunction',
implemented: false,
revisions: [1],
params: [],
},
'221': {
text: '221 - digitalInputFunction',
typeRequest: 'SUBSCRIBE',
family: 'digitalInputFunction',
implemented: false,
revisions: [1],
params: [],
},
'224': {
text: '224 - setDigitalInputFunction',
typeRequest: 'COMMAND',
family: 'setDigitalInputFunction',
implemented: false,
revisions: [1],
params: [],
},
'225': {
text: '225 - resetDigitalInputFunction',
typeRequest: 'COMMAND',
family: 'resetDigitalInputFunction',
implemented: false,
revisions: [1],
params: [],
},
'240': {
text: '240 - userDataDownload',
typeRequest: 'COMMAND',
family: 'userDataDownload',
implemented: false,
revisions: [1],
params: [],
},
'242': {
text: '242 - userData',
typeRequest: 'SUBSCRIBE',
family: 'userData',
implemented: true,
revisions: [1],
params: [],
},
'245': {
text: '245 - userDataDownloadWithOffset',
typeRequest: 'COMMAND',
family: 'userDataDownloadWithOffset',
implemented: false,
revisions: [1],
params: [],
},
'251': {
text: '251 - selectorSocketInfo',
typeRequest: 'SUBSCRIBE',
family: 'selectorSocketInfo',
implemented: true,
revisions: [1],
params: [],
},
'254': {
text: '254 - selectorControlGreenLights',
typeRequest: 'COMMAND',
family: 'selectorControlGreenLights',
implemented: false,
revisions: [1],
params: [],
},
'255': {
text: '255 - selectorControlRedLights',
typeRequest: 'COMMAND',
family: 'selectorControlRedLights',
implemented: false,
revisions: [1],
params: [],
},
'262': {
text: '262 - toolTagID',
typeRequest: 'REQUEST',
family: 'toolTagID',
implemented: true,
revisions: [1],
params: [],
},
'270': {
text: '270 - controllerReboot',
typeRequest: 'COMMAND',
family: 'controllerReboot',
implemented: true,
revisions: [1],
params: [],
},
'301': {
text: '301 - histogramUpload',
typeRequest: 'REQUEST',
family: 'histogramUpload',
implemented: false,
revisions: [1],
params: [],
},
'401': {
text: '401 - automaticManualMode',
typeRequest: 'SUBSCRIBE',
family: 'automaticManualMode',
implemented: true,
revisions: [1],
params: [],
},
'411': {
text: '411 - autoDisableSettings',
typeRequest: 'REQUEST',
family: 'autoDisableSettings',
implemented: true,
revisions: [1],
params: [],
},
'421': {
text: '421 - openProtocolCommandsDisabled',
typeRequest: 'SUBSCRIBE',
family: 'openProtocolCommandsDisabled',
implemented: true,
revisions: [1],
params: [],
},
'501': {
text: '501 - motorTuningResultData',
typeRequest: 'SUBSCRIBE',
family: 'motorTuningResultData',
implemented: true,
revisions: [1],
params: [],
},
'504': {
text: '504 - motorTuning',
typeRequest: 'COMMAND',
family: 'motorTuning',
implemented: true,
revisions: [1],
params: [],
},
'2100': {
text: '2100 - deviceCommand',
typeRequest: 'COMMAND',
family: 'deviceCommand',
implemented: false,
revisions: [1],
params: [],
},
'2502': {
text: '2502 - passwordRequest',
typeRequest: 'COMMAND',
family: 'passwordRequest',
implemented: false,
revisions: [1],
params: [],
},
'2503': {
text: '2503 - passwordResponse',
typeRequest: 'COMMAND',
family: 'passwordResponse',
implemented: false,
revisions: [1],
params: [],
},
'2505': {
text: '2505 - selectParameterSetDynamically',
typeRequest: 'COMMAND',
family: 'selectParameterSetDynamically',
implemented: false,
revisions: [1],
params: [],
},
'2601': {
text: '2601 - modeIdUpload',
typeRequest: 'REQUEST',
family: 'modeIdUpload',
implemented: true,
revisions: [1],
params: [],
},
'2603': {
text: '2603 - modeDataUpload',
typeRequest: 'REQUEST',
family: 'modeDataUpload',
implemented: false,
revisions: [1],
params: [],
},
'2606': {
text: '2606 - selectMode',
typeRequest: 'COMMAND',
family: 'selectMode',
implemented: false,
revisions: [1],
params: [],
},
'9999': {
text: '9999 - keepAlive',
typeRequest: 'REQUEST',
family: 'keepAlive',
implemented: true,
revisions: [1],
params: [],
},
};
// __AUTO__GENERATED__
/*
Copyright: (c) 2020, Jeremy London
GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
*/
// Updates to use desoutter-node & desoutter-config name
RED.nodes.registerType('desoutter-node', {
category: 'advanced',
color: '#50D3EF',
defaults: {
name: {
value: '',
},
config: {
value: '',
type: 'desoutter-config',
},
midGroup: {
value: '',
required: true,
},
customMid: {
value: '',
},
revision: {
value: '',
required: true,
},
customRevision: {
value: '',
},
autoSubscribe: {
value: true,
},
forwardErrors: {
value: false,
},
outputs: {
value: 1,
},
},
inputs: 1,
outputs: 1,
icon: 'wrench.png',
paletteLabel: 'open protocol',
outputLabels(index) {
// TODO: Estudar melhores labels
if (index === 0) {
return this._('open-protocol.util.label.feedback');
}
if (index === 1) {
return this._('open-protocol.util.label.data');
}
if (index === 2) {
return this._('open-protocol.util.label.status-alarm');
}
if (index === 3) {
return this._('open-protocol.util.label.ack-alarm');
}
},
label() {
if (this.name) {
return this.name;
}
let name = '';
if (!this.midGroup) {
return this._('open-protocol.util.label.node');
}
if (this.midGroup === 'Connect') {
name = this._('open-protocol.util.label.connect');
}
if (this.midGroup === 'Custom') {
name = this._('open-protocol.util.label.custom');
}
if (name === '') {
name = base[this.midGroup].family;
}
const selectConfig = RED.nodes.node(this.config);
if (selectConfig) {
name = `${selectConfig.label()}: ${name}`;
}
return name;
},
labelStyle() {
return this.name ? 'node_label_italic' : '';
},
oneditprepare() {
const base_midGroup = Object.keys(base);
const node = this;
const select_midGroup = $('#node-input-midGroup');
const select_revision = $('#node-input-revision');
atualizaMidGroup();
// --- Changes
select_midGroup.change(() => {
controlaInterface();
atualizaOutputs();
atualizaRevision();
select_revision.change();
});
select_revision.change(() => {
controlaInterface();
atualizaTips();
});
// --- Changes
// --- <Begin> -- Functions ---
function atualizaMidGroup() {
const subCategories = {
SUBSCRIBE: $('<optgroup>').prop('label', 'Subscriptions'),
REQUEST: $('<optgroup>').prop('label', 'Requests'),
COMMAND: $('<optgroup>').prop('label', 'Commands'),
CONTROL: $('<optgroup>').prop('label', 'Controls'),
};
base_midGroup.forEach(item => {
// issue #2 - Remove MidGroups 3 e 9999
if (item === '3' || item === '9999') {
return;
}
const option = $(`<option>`)
.val(item)
.text(base[item].text);
subCategories[base[item].typeRequest].append(option);
});
subCategories.CONTROL.append(
$(`<option>`)
.val('Connect')
.text('Connection'),
);
subCategories.CONTROL.append(
$(`<option>`)
.val('Custom')
.text('Custom MID'),
);
select_midGroup.append(subCategories.SUBSCRIBE);
select_midGroup.append(subCategories.REQUEST);
select_midGroup.append(subCategories.COMMAND);
select_midGroup.append(subCategories.CONTROL);
if (node.midGroup) {
select_midGroup.val(node.midGroup);
}
if (select_midGroup.val() === '') {
select_midGroup.val('15');
}
}
function atualizaRevision() {
const localMidGroup = select_midGroup.val();
if (!localMidGroup || localMidGroup === 'Custom' || localMidGroup === 'Connect') {
return;
}
const detalhes = base[localMidGroup];
const base_revisions = detalhes.revisions;
select_revision
.find('option')
.remove()
.end();
if (detalhes.params.length === 0) {
if (node.revision === 'Auto') {
select_revision.append(
$(`<option>`)
.val('Auto')
.text('Auto'),
);
select_revision.val('Auto');
} else {
select_revision.append(
$(`<option>`)
.val('Auto')
.text('Auto'),
);
}
}
base_revisions.forEach(item => {
const option = $(`<option>`)
.val(item.toString())
.text(item);
select_revision.append(option);
if (node.revision === item.toString()) {
select_revision.val(item.toString());
}
});
if (node.revision === 'Custom') {
select_revision.append(
$('<option>')
.val('Custom')
.text('Custom'),
);
select_revision.val('Custom');
} else {
select_revision.append(
$('<option>')
.val('Custom')
.text('Custom'),
);
}
if (!base_revisions.includes(Number(node.revision)) && node.revision !== 'Custom') {
node.revision = undefined;
}
if (select_revision.val() === '') {
select_revision.val('Auto');
}
if (select_revision.val() === '') {
select_revision.val('1');
}
}
function controlaInterface() {
const localMidGroup = select_midGroup.val();
const localRevision = select_revision.val();
const div_customMid = $('#div-custom-mid');
const div_revision = $('#div-revision');
const div_customRevision = $('#div-custom-revision');
const div_autoSubscribe = $('#div-auto-subscribe');
const div_forwardErrors = $('#div-forward-errors');
const div_tips = $('#div-tips');
div_customMid.hide();
div_revision.hide();
div_customRevision.hide();
div_autoSubscribe.hide();
div_tips.hide();
if (!localMidGroup) {
return;
}
if (localMidGroup === 'Connect') {
div_tips.show();
return;
}
if (localMidGroup === 'Custom') {
div_tips.show();
return;
}
if (localRevision === 'Custom') {
div_revision.show();
div_customRevision.show();
return;
}
const detalhes = base[localMidGroup];
if (
detalhes.implemented &&
detalhes.typeRequest === 'SUBSCRIBE' &&
detalhes.params.length === 0
) {
div_autoSubscribe.show();
}
div_revision.show();
if (localRevision) {
div_tips.show();
}
}
function atualizaTips() {
const codeInfo = $('#code-info');
const localMidGroup = select_midGroup.val();
const localRevision = select_revision.val();
if (!localMidGroup) {
return;
}
if (localMidGroup === 'Connect') {
const content = node._('open-protocol.tips.connect');
codeInfo.html(content);
return;
}
if (localMidGroup === 'Custom') {
const content = node._('open-protocol.tips.custom');
codeInfo.html(content);
return;
}
const detalhes = base[localMidGroup];
let content = '';
if (!detalhes.implemented) {
content = `<h4>${detalhes.typeRequest} - ${detalhes.family}<\/h4>${node._(
'open-protocol.tips.not-implemented',
)}`;
codeInfo.html(content);
return;
}
if (detalhes.params.length === 0 && detalhes.typeRequest !== 'SUBSCRIBE') {
content = `<h4>${detalhes.typeRequest} - ${detalhes.family}<\/h4>${node._(
'open-protocol.tips.not-params',
)}`;
codeInfo.html(content);
return;
}
if (detalhes.params.length === 0 && detalhes.typeRequest === 'SUBSCRIBE') {
content = `<h4>${detalhes.typeRequest} - ${detalhes.family}<\/h4>${node._(
'open-protocol.tips.subscribe',
)}`;
codeInfo.html(content);
return;
}
if (localRevision && localRevision !== 'Auto' && localRevision !== 'Custom') {
content =
`<h4>${detalhes.typeRequest} - ${detalhes.family}<\/h4>${node._(
'open-protocol.tips.params.header',
)}<h6>Revision: ${localRevision} </h6>` + `<code>msg.payload = {}<\/code><br>`;
detalhes.params[localRevision].forEach(value => {
const param = node._('open-protocol.tips.params.tags.param');
const type = node._('open-protocol.tips.params.tags.type');
const desc = node._('open-protocol.tips.params.tags.description');
const local =
'<blockquote>' +
`${param}: <code>msg.payload.${value.name}</code> <br>` +
`${type}: <code>${value.type}</code> <br>` +
`${desc}: ${value.desc}</blockquote>`;
content = content.concat(local);
});
codeInfo.html(content);
return;
}
codeInfo.html('');
}
function atualizaOutputs() {
const localMidGroup = select_midGroup.val();
if (!localMidGroup) {
return;
}
if (localMidGroup === 'Custom') {
node.outputs = 1;
return;
}
if (localMidGroup === 'Connect') {
node.outputs = 1;
return;
}
if (localMidGroup === '71') {
node.outputs = 4;
return;
}
const { typeRequest } = base[localMidGroup];
if (typeRequest === 'SUBSCRIBE') {
node.outputs = 2;
} else {
node.outputs = 1;
}
}
// --- <End> -- Functions ---
},
});
})();
</script>
<!-- --< End >--------- OpenProtocol Node (desoutter-node) ---------------------- -->