Files
tbf/TBF/Rig/ControlBoard/Papouch/PapouchCBCfg.cs
T

313 lines
12 KiB
C#

using Config.Entities;
///
/// Copyright (c) 2020-2021 Sensus Slovensko a.s.
///
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;
using Common;
using TBF.Rig.Generic;
namespace TBF.Rig.ControlBoard.Papouch
{
public enum QuidoVariant
{
None,
QuidoRS_4_4,
QuidoRS_8_8,
QuidoRS_2_16,
QuidoRS_2_32,
Count
}
public class PapouchCBCfg : ComponentCfgBase, Generic.IChildComponentCfg, IParamsProvider
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PapouchCBCfg) })[0];
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl(IList<Config.Entities.Component> cmpntEntities)
{
var parents = cmpntEntities.Where(x => x.ClassName == "Modbus.Common");
return new Configs.ParamsProvider.ComponentCfgCtrl(this, parents);
}
///
/// Serialized parameters
///
public QuidoVariant Variant1; /// None, QuidoRS_4_4, QuidoRS_8_8, QuidoRS_2_16 or QuidoRS_2_32
public int ModbusAddress1; /// 1 .. 254
public int OffsetOutputs1; /// 0 .. (128 - output bits count)
public int OffsetInputs1; /// 0 .. (128 - input bits count)
public QuidoVariant Variant2; /// None, QuidoRS_4_4, QuidoRS_8_8, QuidoRS_2_16 or QuidoRS_2_32
public int ModbusAddress2; /// 1 .. 254
public int OffsetOutputs2; /// 0 .. (128 - output bits count)
public int OffsetInputs2; /// 0 .. (128 - input bits count)
public QuidoVariant Variant3; /// None, QuidoRS_4_4, QuidoRS_8_8, QuidoRS_2_16 or QuidoRS_2_32
public int ModbusAddress3; /// 1 .. 254
public int OffsetOutputs3; /// 0 .. (128 - output bits count)
public int OffsetInputs3; /// 0 .. (128 - input bits count)
public QuidoVariant Variant4; /// None, QuidoRS_4_4, QuidoRS_8_8, QuidoRS_2_16 or QuidoRS_2_32
public int ModbusAddress4; /// 1 .. 254
public int OffsetOutputs4; /// 0 .. (128 - output bits count)
public int OffsetInputs4; /// 0 .. (128 - input bits count)
/// Private parameterless constructor invoked by all other (public) constructors
PapouchCBCfg() { }
public PapouchCBCfg(IComponentFactory factory)
: this()
{
Name = "CB";
ParentName = "Modbus";
InitializeAll();
}
public string ComponentName { get { return Name; } }
public void InitializeAll()
{
Variant1 = QuidoVariant.QuidoRS_8_8;
ModbusAddress1 = 1;
OffsetOutputs1 = 0;
OffsetInputs1 = 64;
Variant2 = QuidoVariant.None;
ModbusAddress2 = 0;
OffsetOutputs2 = 0;
OffsetInputs2 = 0;
Variant3 = QuidoVariant.None;
ModbusAddress3 = 0;
OffsetOutputs3 = 0;
OffsetInputs3 = 0;
Variant4 = QuidoVariant.None;
ModbusAddress4 = 0;
OffsetOutputs4 = 0;
OffsetInputs4 = 0;
}
string[] paramNames = new string[]
{
"Board 1: Variant", /// 0
"Board 1: Modbus address", /// 1
"Board 1: Offset outputs", /// 2
"Board 1: Offset inputs", /// 3
"Board 2: Variant", /// 4
"Board 2: Modbus address", /// 5
"Board 2: Offset outputs", /// 6
"Board 2: Offset inputs", /// 7
"Board 3: Variant", /// 8
"Board 3: Modbus address", /// 9
"Board 3: Offset outputs", /// 10
"Board 3: Offset inputs", /// 11
"Board 4: Variant", /// 12
"Board 4: Modbus address", /// 13
"Board 4: Offset outputs", /// 14
"Board 4: Offset inputs", /// 15
};
public string ParamName(int i) { return paramNames[i]; }
public int ParamsCount() { return paramNames.Length; }
public ICollection<string> ParamValues(int i)
{
switch (i)
{
case 0:
case 4:
case 8:
case 12:
return new string[] { QuidoVariant.None.ToString(),
QuidoVariant.QuidoRS_4_4.ToString(),
QuidoVariant.QuidoRS_8_8.ToString(),
QuidoVariant.QuidoRS_2_16.ToString(),
QuidoVariant.QuidoRS_2_32.ToString() };
default:
return null;
}
}
public string ToString(int i)
{
switch (i)
{
case 0: return Variant1.ToString();
case 1: return ModbusAddress1.ToString();
case 2: return OffsetOutputs1.ToString();
case 3: return OffsetInputs1.ToString();
case 4: return Variant2.ToString();
case 5: return ModbusAddress2.ToString();
case 6: return OffsetOutputs2.ToString();
case 7: return OffsetInputs2.ToString();
case 8: return Variant3.ToString();
case 9: return ModbusAddress3.ToString();
case 10: return OffsetOutputs3.ToString();
case 11: return OffsetInputs3.ToString();
case 12: return Variant4.ToString();
case 13: return ModbusAddress4.ToString();
case 14: return OffsetOutputs4.ToString();
case 15: return OffsetInputs4.ToString();
default:
return string.Format("name={0}({1}) {2}/a{3}/o{4}/i{5} {6}/a{7}/o{8}/i{9} {10}/a{11}/o{12}/i{13} {14}/a{15}/o{16}/i{17}",
Name, (string.IsNullOrEmpty(ParentName) ? "-" : ParentName),
Variant1, ModbusAddress1, OffsetOutputs1, OffsetInputs1,
Variant2, ModbusAddress2, OffsetOutputs2, OffsetInputs2,
Variant3, ModbusAddress3, OffsetOutputs3, OffsetInputs3,
Variant4, ModbusAddress4, OffsetOutputs4, OffsetInputs4);
}
}
public CfgUpdateFlags UpdateParam(int i, string str)
{
switch (i)
{
case 0:
foreach (var v in new QuidoVariant[] { QuidoVariant.QuidoRS_4_4, QuidoVariant.QuidoRS_8_8, QuidoVariant.QuidoRS_2_16, QuidoVariant.QuidoRS_2_32 })
{
if (str == v.ToString())
{
Variant1 = v;
return CfgUpdateFlags.RestartRqrd;
}
}
Variant1 = QuidoVariant.None;
return CfgUpdateFlags.None;
case 1: ModbusAddress1 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 2: OffsetOutputs1 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 3: OffsetInputs1 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 4:
foreach (var v in new QuidoVariant[] { QuidoVariant.QuidoRS_4_4, QuidoVariant.QuidoRS_8_8, QuidoVariant.QuidoRS_2_16, QuidoVariant.QuidoRS_2_32 })
{
if (str == v.ToString())
{
Variant2 = v;
return CfgUpdateFlags.RestartRqrd;
}
}
Variant2 = QuidoVariant.None;
return CfgUpdateFlags.None;
case 5: ModbusAddress2 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 6: OffsetOutputs2 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 7: OffsetInputs2 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 8:
foreach (var v in new QuidoVariant[] { QuidoVariant.QuidoRS_4_4, QuidoVariant.QuidoRS_8_8, QuidoVariant.QuidoRS_2_16, QuidoVariant.QuidoRS_2_32 })
{
if (str == v.ToString())
{
Variant3 = v;
return CfgUpdateFlags.RestartRqrd;
}
}
Variant3 = QuidoVariant.None;
return CfgUpdateFlags.None;
case 9: ModbusAddress3 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 10: OffsetOutputs3 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 11: OffsetInputs3 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 12:
foreach (var v in new QuidoVariant[] { QuidoVariant.QuidoRS_4_4, QuidoVariant.QuidoRS_8_8, QuidoVariant.QuidoRS_2_16, QuidoVariant.QuidoRS_2_32 })
{
if (str == v.ToString())
{
Variant4 = v;
return CfgUpdateFlags.RestartRqrd;
}
}
Variant4 = QuidoVariant.None;
return CfgUpdateFlags.None;
case 13: ModbusAddress4 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 14: OffsetOutputs4 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
case 15: OffsetInputs4 = (byte)int.Parse(str); return CfgUpdateFlags.RestartRqrd;
default: return CfgUpdateFlags.None;
}
}
public bool ValidateParam(int i, string str, out string message)
{
message = string.Empty;
int idummy;
switch (i)
{
case 0:
case 4:
case 8:
case 12:
if (ParamValues(i).Contains(str)) return true;
break;
case 1:
case 5:
case 9:
case 13:
if (int.TryParse(str, out idummy) && idummy >= 1 && idummy <= 254) return true;
break;
case 2:
case 3:
case 6:
case 7:
case 10:
case 11:
case 14:
case 15:
if (int.TryParse(str, out idummy) && idummy >= 0 && idummy <= 127) return true;
break;
default:
message = "Invalid index";
return false;
}
message = ParamName(i) + " is invalid";
return false;
}
void CopyContentTo(PapouchCBCfg prms)
{
prms.ParentName = ParentName;
prms.Variant1 = Variant1;
prms.ModbusAddress1 = ModbusAddress1;
prms.OffsetOutputs1 = OffsetOutputs1;
prms.OffsetInputs1 = OffsetInputs1;
prms.Variant2 = Variant2;
prms.ModbusAddress2 = ModbusAddress2;
prms.OffsetOutputs2 = OffsetOutputs2;
prms.OffsetInputs2 = OffsetInputs2;
prms.Variant3 = Variant3;
prms.ModbusAddress3 = ModbusAddress3;
prms.OffsetOutputs3 = OffsetOutputs3;
prms.OffsetInputs3 = OffsetInputs3;
prms.Variant4 = Variant4;
prms.ModbusAddress4 = ModbusAddress4;
prms.OffsetOutputs4 = OffsetOutputs4;
prms.OffsetInputs4 = OffsetInputs4;
}
public IParamsProvider Clone()
{
PapouchCBCfg pars = new PapouchCBCfg();
CopyContentTo(pars);
return pars;
}
public bool UpdateEmbeddedDbEntity()
{
return true; /// =OK, do nothing
}
}
}