174 lines
8.6 KiB
JavaScript
174 lines
8.6 KiB
JavaScript
class Signals {
|
|
constructor(indicators) {
|
|
this.indicators = indicators;
|
|
}
|
|
// Call to display Create new signal dialog.
|
|
open_signal_Form() { document.getElementById("new_sig_form").style.display = "grid"; }
|
|
// Call to hide Create new signal dialog.
|
|
close_signal_Form() { document.getElementById("new_sig_form").style.display = "none"; }
|
|
|
|
fill_prop(target_id, indctr){
|
|
// arg1: Id of of a selection element.
|
|
// arg2: Name of an indicator
|
|
// Replace the options of an HTML select elements
|
|
// with the properties an indicator object.
|
|
|
|
// Fetch the objects using name and id received.
|
|
var target = document.getElementById(target_id);
|
|
var properties = window.UI.data.indicators[indctr];
|
|
|
|
// Remove any previous options in the select tag.
|
|
removeOptions(target);
|
|
// Loop through each property in the object.
|
|
// Create an option element for each one.
|
|
// Append it to the selection element.
|
|
for(let prop in properties)
|
|
{
|
|
if (prop =='type'|| prop == 'visible' || prop == 'period'){continue;}
|
|
if (prop.substring(0,5) == 'color'){continue;}
|
|
var opt = document.createElement("option");
|
|
opt.innerHTML = prop;
|
|
target.appendChild(opt);
|
|
}
|
|
return;
|
|
function removeOptions(selectElement) {
|
|
var i, L = selectElement.options.length - 1;
|
|
for(i = L; i >= 0; i--) {
|
|
selectElement.remove(i);
|
|
}
|
|
}
|
|
}
|
|
switch_panel(p1,p2){
|
|
// Panel switcher for multi page forms
|
|
// arg1 = target from id
|
|
// arg2 = next target id
|
|
// This function is used in the New Signal dialog in signals
|
|
document.getElementById(p1).style.display='none';
|
|
document.getElementById(p2).style.display='grid';
|
|
}
|
|
|
|
hideIfTrue(firstValue, scndValue, id){
|
|
// Compare first two args and hides an element if they are equal.
|
|
// This function is used in the New Signal dialog in signals
|
|
if( firstValue == scndValue){
|
|
document.getElementById(id).style.display='none';
|
|
}else{
|
|
document.getElementById(id).style.display='block'
|
|
}
|
|
}
|
|
ns_next(n){
|
|
// This function is used in the New Signal dialog in signals
|
|
if (n==1){
|
|
// Check input fields.
|
|
let sigName = document.getElementById('signal_name').value;
|
|
let sigSource = document.getElementById('sig_source').value;
|
|
let sigProp = document.getElementById('sig_prop').value;
|
|
if (sigName == '' ) { alert('Please give the signal a name.'); return; }
|
|
// Populate sig_display
|
|
document.getElementById('sig_display').innerHTML = (sigName + ': {' + sigSource + ':' + sigProp +'}');
|
|
// Popilate Value input
|
|
let indctrVal = document.getElementById(sigSource + '_' + sigProp).value;
|
|
document.getElementById('value').value = indctrVal;
|
|
|
|
this.switch_panel('panel_1','panel_2');
|
|
}
|
|
if (n==2){
|
|
|
|
// Collect all the input fields.
|
|
|
|
let sigName = document.getElementById('signal_name').value; // The name of the New Signal.
|
|
let sigSource = document.getElementById('sig_source').value; // The source(indicator) of the signal.
|
|
let sigProp = document.getElementById('sig_prop').value; // The property to evaluate.
|
|
let sig2Source = document.getElementById('sig2_source').value; // The second source if selected.
|
|
let sig2Prop = document.getElementById('sig2_prop').value; // The second property to evaluate.
|
|
let operator = document.querySelector('input[name="Operator"]:checked').value; // The operator this evaluation will use.
|
|
let range = document.getElementById('rangeVal').value; // The value of any range being evaluated.
|
|
let sigType = document.getElementById('select_s_type').value; // The type of signal value or indicator comparison.
|
|
let value = document.getElementById('value').value; // The input value if it is a value comparison.
|
|
|
|
// Create a string to define the signal.
|
|
|
|
// Include the first indicator source.
|
|
var sig1 = `${sigSource} : ${sigProp}`;
|
|
// If it is a comparison signal include the second indicator source.
|
|
if (sigType == 'Comparison') {
|
|
var sig2 = `${sig2Source} : ${sig2Prop}`;
|
|
}
|
|
// If it is a value signal include the value.
|
|
if (sigType == 'Value') {var sig2 = value;}
|
|
|
|
// If the operator is set to range, include the range value in the string.
|
|
if (operator == '+/-') {
|
|
var operatorStr = `${operator} ${range}`;
|
|
} else{
|
|
var operatorStr = operator;
|
|
}
|
|
|
|
let sigDisplayStr = `(${sigName}) (${sig1}) (${operatorStr}) (${sig2})`;
|
|
|
|
// Get the current realtime values of the sources.
|
|
let sig1_realtime = document.getElementById(sigSource + '_' + sigProp).value;
|
|
|
|
if (sigType == 'Comparison') {
|
|
// If its a comparison get the second value from the second source.
|
|
var sig2_realtime = document.getElementById(sig2Source + '_' + sig2Prop).value;
|
|
}else {
|
|
// If not the second realtime value is literally the value.
|
|
var sig2_realtime = sig2;
|
|
}
|
|
// Populate the signal display field with the string.
|
|
document.getElementById('sig_display2').innerHTML = sigDisplayStr;
|
|
|
|
// Populate the realtime values display.
|
|
let realtime_Str = `(${sigProp} : ${sig1_realtime}) (${operatorStr}) (${sig2_realtime})`;
|
|
document.getElementById('sig_realtime').innerHTML = realtime_Str;
|
|
// Evaluate the signal
|
|
var evalStr;
|
|
if (operator == '=') {evalStr = (sig1_realtime == sig2_realtime);console.log([sig1_realtime, sig2_realtime, operator,evalStr]);}
|
|
if (operator == '>') {evalStr = (sig1_realtime > sig2_realtime);}
|
|
if (operator == '<') {evalStr = (sig1_realtime < sig2_realtime);}
|
|
if (operator == '+/-') {
|
|
evalStr = (Math.abs(sig1_realtime - sig2_realtime) <= range);
|
|
}
|
|
|
|
// Populate the signal eval field with the string.
|
|
document.getElementById('sig_eval').innerHTML = evalStr;
|
|
|
|
// Show the panel
|
|
this.switch_panel('panel_2','panel_3');
|
|
}
|
|
}
|
|
|
|
submitNewSignal(){
|
|
|
|
// Collect all the input fields.
|
|
|
|
var sigName = document.getElementById('signal_name').value; // The name of the New Signal.
|
|
var sigSource = document.getElementById('sig_source').value; // The source(indicator) of the signal.
|
|
var sigProp = document.getElementById('sig_prop').value; // The property to evaluate.
|
|
var sig2Source = document.getElementById('sig2_source').value; // The second source if selected.
|
|
var sig2Prop = document.getElementById('sig2_prop').value; // The second property to evaluate.
|
|
var operator = document.querySelector('input[name="Operator"]:checked').value; // The operator this evaluation will use.
|
|
var range = document.getElementById('rangeVal').value; // The value of any range being evaluated.
|
|
var sigType = document.getElementById('select_s_type').value; // The type of signal value or indicator comparison.
|
|
var value = document.getElementById('value').value; // The input value if it is a value comparison.
|
|
|
|
if (sigType == 'Comparison'){
|
|
var sig2Source = sig2Source;
|
|
var sig2Prop = sig2Prop;
|
|
}else{
|
|
var sig2Source = 'value';
|
|
var sig2Prop = value;
|
|
}
|
|
if (operator == "+/-" ){
|
|
var range = {range : range};
|
|
var data = {sigName, sigSource, sigProp, operator, sig2Source, sig2Prop, range};
|
|
}else{
|
|
var data = {sigName, sigSource, sigProp, operator, sig2Source, sig2Prop};
|
|
}
|
|
/* It may be more maintainable to configure the connection inside the different classes
|
|
than passing functions, references and callbacks around. */
|
|
|
|
window.UI.data.comms.send_to_app( "new_signal", data);
|
|
}
|
|
} |