init
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
using DTS.Common.Base;
|
||||
|
||||
namespace DTS.Common.Interface.Sensors.SensorsList
|
||||
{
|
||||
public interface ISensorsListOverdueView : IBaseView { }
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace DTS.Common.RibbonControl
|
||||
{
|
||||
public class MenuButtonData : ControlData
|
||||
{
|
||||
public MenuButtonData()
|
||||
: this(false)
|
||||
{
|
||||
}
|
||||
|
||||
public MenuButtonData(bool isApplicationMenu)
|
||||
{
|
||||
_isApplicationMenu = isApplicationMenu;
|
||||
}
|
||||
|
||||
public bool IsVerticallyResizable
|
||||
{
|
||||
get => _isVerticallyResizable;
|
||||
|
||||
set
|
||||
{
|
||||
if (_isVerticallyResizable == value) return;
|
||||
_isVerticallyResizable = value;
|
||||
OnPropertyChanged(new PropertyChangedEventArgs("IsVerticallyResizable"));
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsHorizontallyResizable
|
||||
{
|
||||
get => _isHorizontallyResizable;
|
||||
|
||||
set
|
||||
{
|
||||
if (_isHorizontallyResizable == value) return;
|
||||
_isHorizontallyResizable = value;
|
||||
OnPropertyChanged(new PropertyChangedEventArgs("IsHorizontallyResizable"));
|
||||
}
|
||||
}
|
||||
|
||||
private bool _isVerticallyResizable, _isHorizontallyResizable;
|
||||
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
|
||||
public ObservableCollection<ControlData> ControlDataCollection
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_controlDataCollection == null)
|
||||
{
|
||||
_controlDataCollection = new ObservableCollection<ControlData>();
|
||||
|
||||
if (_nestingDepth <= ViewModelData.MenuItemNestingCount)
|
||||
{
|
||||
_nestingDepth++;
|
||||
|
||||
var smallImage = new Uri("/Common;component/RibbonControl/Images/Paste_16x16.png", UriKind.Relative);
|
||||
var largeImage = new Uri("/Common;component/RibbonControl/Images/Paste_32x32.png", UriKind.Relative);
|
||||
|
||||
for (var i = 0; i < ViewModelData.GalleryCount; i++)
|
||||
{
|
||||
var galleryData = new GalleryData()
|
||||
{
|
||||
Label = "Gallery " + i,
|
||||
SmallImage = smallImage,
|
||||
LargeImage = largeImage,
|
||||
ToolTipTitle = "ToolTip Title",
|
||||
ToolTipDescription = "ToolTip Description",
|
||||
ToolTipImage = smallImage,
|
||||
Command = ViewModelData.DefaultCommand
|
||||
};
|
||||
galleryData.SelectedItem = galleryData.CategoryDataCollection[0].GalleryItemDataCollection[ViewModelData.GalleryItemCount - 1];
|
||||
|
||||
_controlDataCollection.Add(galleryData);
|
||||
}
|
||||
for (var i = 0; i < ViewModelData.MenuItemCount; i++)
|
||||
{
|
||||
var menuItemData = _isApplicationMenu ? new ApplicationMenuItemData(true) : new MenuItemData(false);
|
||||
menuItemData.Label = "MenuItem " + i;
|
||||
menuItemData.SmallImage = smallImage;
|
||||
menuItemData.LargeImage = largeImage;
|
||||
menuItemData.ToolTipTitle = "ToolTip Title";
|
||||
menuItemData.ToolTipDescription = "ToolTip Description";
|
||||
menuItemData.ToolTipImage = smallImage;
|
||||
menuItemData.Command = ViewModelData.DefaultCommand;
|
||||
menuItemData._nestingDepth = _nestingDepth;
|
||||
|
||||
_controlDataCollection.Add(menuItemData);
|
||||
}
|
||||
|
||||
_controlDataCollection.Add(new SeparatorData());
|
||||
|
||||
for (var i = 0; i < ViewModelData.SplitMenuItemCount; i++)
|
||||
{
|
||||
var splitMenuItemData = _isApplicationMenu ? new ApplicationSplitMenuItemData(true) : new SplitMenuItemData(false);
|
||||
splitMenuItemData.Label = "SplitMenuItem " + i;
|
||||
splitMenuItemData.SmallImage = smallImage;
|
||||
splitMenuItemData.LargeImage = largeImage;
|
||||
splitMenuItemData.ToolTipTitle = "ToolTip Title";
|
||||
splitMenuItemData.ToolTipDescription = "ToolTip Description";
|
||||
splitMenuItemData.ToolTipImage = smallImage;
|
||||
splitMenuItemData.Command = ViewModelData.DefaultCommand;
|
||||
splitMenuItemData._nestingDepth = _nestingDepth;
|
||||
splitMenuItemData.IsCheckable = true;
|
||||
|
||||
_controlDataCollection.Add(splitMenuItemData);
|
||||
}
|
||||
}
|
||||
}
|
||||
return _controlDataCollection;
|
||||
}
|
||||
}
|
||||
private ObservableCollection<ControlData> _controlDataCollection;
|
||||
private int _nestingDepth;
|
||||
private bool _isApplicationMenu;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,380 @@
|
||||
using DTS.Common.Interface.Sensors;
|
||||
using DTS.Common.Interface.TestSetups;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace DTS.Common.Classes.TestSetups
|
||||
{
|
||||
public class ISFSensorRecord : IISFSensorRecord
|
||||
{
|
||||
private char[] _record1 = new char[ConstantsAndEnums.RECORD_LENGTH];
|
||||
|
||||
/// <summary>
|
||||
/// RECORD_LENGTH the whole first record
|
||||
/// </summary>
|
||||
public char[] Record1
|
||||
{
|
||||
get => _record1;
|
||||
set
|
||||
{
|
||||
_record1.Fill(' ');
|
||||
Array.Copy(value, 0, _record1, 0, Math.Min(ConstantsAndEnums.RECORD_LENGTH, value.Length));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 2 characters, starting at character 75
|
||||
/// </summary>
|
||||
public char[] Tag
|
||||
{
|
||||
get => _record1.GetValues(75, 2);
|
||||
set => _record1.SetValues(value, 75, 2, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 5 characters start at character 7
|
||||
/// </summary>
|
||||
public char[] DataChannelNumber
|
||||
{
|
||||
get => _record1.GetValues(7, 5);
|
||||
set => _record1.SetValues(value, 7, 5, ' ');
|
||||
}
|
||||
|
||||
public void SetDataChannelNumber(short value)
|
||||
{
|
||||
DataChannelNumber = value.ToString().ToCharArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 1 character, starting at character 15
|
||||
/// </summary>
|
||||
public bool UserIdSensorIDIsNotSpecified
|
||||
{
|
||||
get => _record1[15] == '1';
|
||||
set => _record1[15] = value ? '1' : '0';
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 11 characters start at 19
|
||||
/// </summary>
|
||||
public char[] CapacityCharacters
|
||||
{
|
||||
get => _record1.GetValues(19, 11);
|
||||
set => _record1.SetValues(value, 19, 11, ' ');
|
||||
}
|
||||
|
||||
public void SetCapacity(double capacity)
|
||||
{
|
||||
CapacityCharacters = capacity.ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray();
|
||||
}
|
||||
|
||||
public double GetCapacity()
|
||||
{
|
||||
var s = CapacityCharacters.ToString();
|
||||
s = s.Trim();
|
||||
if (double.TryParse(s, out var d))
|
||||
{
|
||||
return d;
|
||||
}
|
||||
return double.NaN;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 12 characters, starting at 30
|
||||
/// </summary>
|
||||
public char[] SerialNumber
|
||||
{
|
||||
get => _record1.GetValues(30, 12);
|
||||
set => _record1.SetValues(value, 30, 12, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 11 characters, start at 42
|
||||
/// is Sensitivity/1000 (V)
|
||||
/// can also be c0 if polynomial
|
||||
/// </summary>
|
||||
public char[] Sensitivity
|
||||
{
|
||||
get => _record1.GetValues(42, 11);
|
||||
set => _record1.SetValues(value, 42, 11, ' ');
|
||||
}
|
||||
|
||||
public void SetSensitivity(double sensitivity)
|
||||
{
|
||||
Sensitivity = sensitivity.ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray();
|
||||
}
|
||||
|
||||
public double GetSensitivity()
|
||||
{
|
||||
var s = Sensitivity.ToString().Trim();
|
||||
if (double.TryParse(s, out var d))
|
||||
{
|
||||
return d;
|
||||
}
|
||||
return double.NaN;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 11 characters starting at 53
|
||||
/// </summary>
|
||||
public char[] BridgeResistance
|
||||
{
|
||||
get => _record1.GetValues(53, 11);
|
||||
set => _record1.SetValues(value, 53, 11, ' ');
|
||||
}
|
||||
|
||||
public void SetBridgeResistance(double resistance)
|
||||
{
|
||||
BridgeResistance = resistance.ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray();
|
||||
}
|
||||
|
||||
private char[] _record2 = new char[ConstantsAndEnums.RECORD_LENGTH];
|
||||
|
||||
/// <summary>
|
||||
/// RECORD_LENGTH
|
||||
/// </summary>
|
||||
public char[] Record2
|
||||
{
|
||||
get => _record2;
|
||||
set
|
||||
{
|
||||
_record2.Fill(' ');
|
||||
Array.Copy(value, 0, _record2, 0, ConstantsAndEnums.RECORD_LENGTH);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 12 characters, starting at character 7 (of record 2)
|
||||
/// </summary>
|
||||
public char[] EngineeringUnits
|
||||
{
|
||||
get => _record2.GetValues(7, 12);
|
||||
set => _record2.SetValues(value, 7, 12, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 11 characters, starting at character 20
|
||||
/// </summary>
|
||||
public char[] C1
|
||||
{
|
||||
get => _record2.GetValues(20, 11);
|
||||
set => _record2.SetValues(value, 20, 11, ' ');
|
||||
}
|
||||
public void SetC1(double c1)
|
||||
{
|
||||
C1 = c1.ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray();
|
||||
}
|
||||
|
||||
public double GetC1()
|
||||
{
|
||||
var s = C1.ToString().Trim();
|
||||
if (double.TryParse(s, out var d))
|
||||
{
|
||||
return d;
|
||||
}
|
||||
return double.NaN;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 17 characters, starting at character 31
|
||||
/// </summary>
|
||||
public char[] EID
|
||||
{
|
||||
get => _record2.GetValues(31, 17);
|
||||
set => _record2.SetValues(value, 31, 17, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 4 characters, starting at 49
|
||||
/// </summary>
|
||||
public char[] Unknown1
|
||||
{
|
||||
get => _record2.GetValues(49, 4);
|
||||
set => _record2.SetValues(value, 49, 4, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 2 characters, starting at 53
|
||||
/// </summary>
|
||||
public char[] Unknown2
|
||||
{
|
||||
get => _record2.GetValues(53, 2);
|
||||
set => _record2.SetValues(value, 53, 2, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 11 characters starting at 55 (TOM ONLY [sensortype TI])
|
||||
/// is /1000 of ordinary
|
||||
/// </summary>
|
||||
public char[] FireDelay
|
||||
{
|
||||
get => _record2.GetValues(55, 11);
|
||||
set => _record2.SetValues(value, 55, 11, ' ');
|
||||
}
|
||||
|
||||
public void SetFireDelay(double fireDelay)
|
||||
{
|
||||
FireDelay = fireDelay.ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 8 characters, starting at 66
|
||||
/// STANDARD is the default value, we don't really support anything else currently
|
||||
/// </summary>
|
||||
public char[] TOMConfigurationName
|
||||
{
|
||||
get => _record2.GetValues(66, 8);
|
||||
set => _record2.SetValues(value, 66, 8, ' ');
|
||||
}
|
||||
|
||||
private char[] _record3 = new char[ConstantsAndEnums.RECORD_LENGTH];
|
||||
|
||||
/// <summary>
|
||||
/// RECORD_LENGTH, third record of 4
|
||||
/// </summary>
|
||||
public char[] Record3
|
||||
{
|
||||
get => _record3;
|
||||
set
|
||||
{
|
||||
_record3.Fill(' ');
|
||||
Array.Copy(value, 0, _record3, 0, Math.Min(ConstantsAndEnums.RECORD_LENGTH, value.Length));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 15 characters start at 14 of record 3
|
||||
/// </summary>
|
||||
public char[] CommentPart1
|
||||
{
|
||||
get => _record3.GetValues(14, 15);
|
||||
set => _record3.SetValues(value, 14, 15, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 40 characters starting at 33
|
||||
/// </summary>
|
||||
public char[] CommentPart2
|
||||
{
|
||||
get => _record3.GetValues(33, 40);
|
||||
set => _record3.SetValues(value, 33, 40, ' ');
|
||||
}
|
||||
|
||||
private char[] _record4 = new char[ConstantsAndEnums.RECORD_LENGTH];
|
||||
|
||||
/// <summary>
|
||||
/// RECORD_LENGTH, the 4th record of 4
|
||||
/// </summary>
|
||||
public char[] Record4
|
||||
{
|
||||
get => _record4;
|
||||
set
|
||||
{
|
||||
_record4.Fill(' ');
|
||||
Array.Copy(value, 0, _record4, 0, Math.Min(ConstantsAndEnums.RECORD_LENGTH, value.Length));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 15 characters, starting at character 12
|
||||
/// </summary>
|
||||
public char[] CommentPart3
|
||||
{
|
||||
get => _record4.GetValues(12, 15);
|
||||
set => _record4.SetValues(value, 12, 15, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// sets CommentPart1, CommentPart2, CommentPart3
|
||||
/// </summary>
|
||||
/// <param name="s"></param>
|
||||
public void SetSensorComment(string s)
|
||||
{
|
||||
var newBuffer = new char[15 + 40 + 15];
|
||||
newBuffer.SetValues(s.ToCharArray(), 0, newBuffer.Length, ' ');
|
||||
//comment1 - 15 chars
|
||||
CommentPart1 = newBuffer.GetValues(0, 15);
|
||||
//comment2 - 40chars
|
||||
CommentPart2 = newBuffer.GetValues(15, 40);
|
||||
//comment3 - 15chars
|
||||
CommentPart3 = newBuffer.GetValues(55, 15);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 20 characters starting at 30
|
||||
/// checked for digital inputs (should contain N/O or N/C)
|
||||
/// </summary>
|
||||
public char[] SensorType
|
||||
{
|
||||
get => _record4.GetValues(30, 20);
|
||||
set => _record4.SetValues(value, 30, 20, ' ');
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 11 characters starting at 50
|
||||
/// </summary>
|
||||
public char[] C2
|
||||
{
|
||||
get => _record4.GetValues(50, 11);
|
||||
set => _record4.SetValues(value, 50, 11, ' ');
|
||||
}
|
||||
|
||||
public void SetC2(double c2)
|
||||
{
|
||||
C2 = c2.ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray();
|
||||
}
|
||||
/// <summary>
|
||||
/// 11 characters starting at 61
|
||||
/// notice for poly's we should be multiplying by 1000D?
|
||||
/// calibration.Records.Records.First().Poly.SetCoefficient(0, calibration.Records.Records[0].Sensitivity / 1000.0D);
|
||||
/// calibration.Records.Records.First().Poly.SetCoefficient(1, c1 / 1000.0D);
|
||||
/// calibration.Records.Records.First().Poly.SetCoefficient(2, c2 / 1000.0D);
|
||||
/// calibration.Records.Records.First().Poly.SetCoefficient(3, c3 / 1000.0D);
|
||||
/// </summary>
|
||||
public char[] C3
|
||||
{
|
||||
get => _record4.GetValues(61, 11);
|
||||
set => _record4.SetValues(value, 61, 11, ' ');
|
||||
}
|
||||
|
||||
public void SetC3(double c3)
|
||||
{
|
||||
C3 = c3.ToString(System.Globalization.CultureInfo.InvariantCulture).ToCharArray();
|
||||
}
|
||||
/// <summary>
|
||||
/// writes record to stream
|
||||
/// </summary>
|
||||
/// <param name="writer"></param>
|
||||
public void Write(System.IO.BinaryWriter writer)
|
||||
{
|
||||
writer.Write(Record1);
|
||||
writer.Write(Record2);
|
||||
writer.Write(Record3);
|
||||
writer.Write(Record4);
|
||||
}
|
||||
|
||||
public ISFSensorRecord()
|
||||
{
|
||||
_record1.Fill(' ');
|
||||
_record2.Fill(' ');
|
||||
_record3.Fill(' ');
|
||||
_record4.Fill(' ');
|
||||
TOMConfigurationName = "STANDARD".ToCharArray();
|
||||
}
|
||||
|
||||
public void SetSensor(ISensorData sensor)
|
||||
{
|
||||
SerialNumber = sensor.SerialNumber.ToCharArray();
|
||||
var sc = sensor.GetLatestCalibration();
|
||||
SetSensitivity(sc.Records.Records[0].Sensitivity);
|
||||
SetBridgeResistance(sensor.BridgeResistance);
|
||||
SetCapacity(sensor.Capacity);
|
||||
SetSensorComment(sensor.Comment);
|
||||
Tag = "VS".ToCharArray();
|
||||
UserIdSensorIDIsNotSpecified = true;
|
||||
EID = sensor.EID.ToCharArray();
|
||||
EngineeringUnits = sc.EngineeringUnits.ToCharArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace DTS.Common.Converters
|
||||
{
|
||||
/// <summary>
|
||||
/// This converter is used to bind a value to a group of radio buttons, and can be used with bool parameters only.
|
||||
/// It depends on the converter parameter, which maps a radio button to a specific value.
|
||||
/// </summary>
|
||||
///
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// Notice the converter parameter.
|
||||
/// Its role is to make sure to get opposite values for the two radio buttons (when one is true, the other is false).
|
||||
/// --------------------------------------------------------------------------------------------------
|
||||
/// | value | param | result : (RadioButton.IsChecked = !(value ^ param)) where ^ is the XOR operator |
|
||||
/// --------------------------------------------------------------------------------------------------
|
||||
/// | true | true | true |
|
||||
/// | false | true | false |
|
||||
/// | true | false | false |
|
||||
/// | false | false | true |
|
||||
/// --------------------------------------------------------------------------------------------------
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
[ValueConversion(typeof(bool?), typeof(bool))]
|
||||
public class RadioButtonCheckedConverter : IValueConverter
|
||||
{
|
||||
/// <summary>
|
||||
/// Maps a radio button to a specific value.
|
||||
/// </summary>
|
||||
/// <param name="value">The value produced by the binding source.</param>
|
||||
/// <param name="targetType">The target output type.</param>
|
||||
/// <param name="parameter">The converter parameter to use.</param>
|
||||
/// <param name="culture">The culture to use in the format operation.</param>
|
||||
/// <returns>
|
||||
/// <value>
|
||||
/// <see langword="true" /> if [value] and [parameter] have same values; otherwise <see langword="false" />.
|
||||
/// </value>
|
||||
/// </returns>
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
var param = bool.Parse(parameter.ToString());
|
||||
if (value == null)
|
||||
return false;
|
||||
|
||||
return !((bool)value ^ param); // ^ is the XOR operator
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Maps a radio button to a specific value.
|
||||
/// </summary>
|
||||
/// <param name="value">The value that is produced by the binding target.</param>
|
||||
/// <param name="targetType">This parameter is not used.</param>
|
||||
/// <param name="parameter">The converter parameter to use.</param>
|
||||
/// <param name="culture">This parameter is not used.</param>
|
||||
/// <returns>
|
||||
/// <value>
|
||||
/// <see langword="true" /> if [value] and [parameter] have same values; otherwise <see langword="false" />.
|
||||
/// </value>
|
||||
/// </returns>
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
var param = bool.Parse(parameter.ToString());
|
||||
return !((bool)value ^ param);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
D-1\MN-1-{CHANNEL NUMBER}:{CHANNEL NAME};
|
||||
D-1\MN1-1-{CHANNEL NUMBER}:DE;
|
||||
D-1\MN2-1-{CHANNEL NUMBER}:D;
|
||||
D-1\MN3-1-{CHANNEL NUMBER}:M;
|
||||
D-1\LT-1-{CHANNEL NUMBER}:WDFR;
|
||||
D-1\MML\N-1-{CHANNEL NUMBER}:1;
|
||||
D-1\MNF\N-1-{CHANNEL NUMBER}-1:1;
|
||||
D-1\WP-1-{CHANNEL NUMBER}-1-1:{CHANNEL NUMBER};
|
||||
D-1\WI-1-{CHANNEL NUMBER}-1-1:0;
|
||||
D-1\FP-1-{CHANNEL NUMBER}-1-1:1;
|
||||
D-1\FI-1-{CHANNEL NUMBER}-1-1:0;
|
||||
D-1\WFM-1-{CHANNEL NUMBER}-1-1:FW;
|
||||
C-{CHANNEL NUMBER}\DCN:{CHANNEL NAME};
|
||||
C-{CHANNEL NUMBER}\MN1:{CHANNEL NAME};
|
||||
C-{CHANNEL NUMBER}\BFM:{BYTE FORMAT};
|
||||
C-{CHANNEL NUMBER}\DCT:COE;
|
||||
C-{CHANNEL NUMBER}\MN4:PCM
|
||||
C-{CHANNEL NUMBER}\CO\N:1;
|
||||
C-{CHANNEL NUMBER}\CO:{CHANNEL OFFSET EU};
|
||||
C-{CHANNEL NUMBER}\CO-1:{CHANNEL SCALEFACTOR EU};
|
||||
C-{CHANNEL NUMBER}\MN3:{CHANNEL EU};
|
||||
C-{CHANNEL NUMBER}\MOT1:{CHANNEL MAX RANGE EU};
|
||||
C-{CHANNEL NUMBER}\MOT3:{CHANNEL MAX RANGE EU};
|
||||
C-{CHANNEL NUMBER}\MOT5:{CHANNEL MAX RANGE EU};
|
||||
C-{CHANNEL NUMBER}\MOT2:{CHANNEL MIN RANGE EU};
|
||||
C-{CHANNEL NUMBER}\MOT4:{CHANNEL MIN RANGE EU};
|
||||
C-{CHANNEL NUMBER}\MOT6:{CHANNEL MIN RANGE EU};
|
||||
Reference in New Issue
Block a user