86 lines
1.8 KiB
C#
86 lines
1.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace ESPServer
|
|
{
|
|
/*
|
|
* Описание параметра, который может придти от юнита
|
|
*/
|
|
class UnitValue
|
|
{
|
|
// Название параметра
|
|
public string name;
|
|
// Текущее значение
|
|
public float value;
|
|
// Сдвиг адреса, по которому это значение будет храниться в modbus
|
|
public int addressOffset;
|
|
}
|
|
|
|
/*
|
|
* Описание конкретного модуля (релейный, датчик, whatever)
|
|
*/
|
|
class Unit
|
|
{
|
|
// Айдишник юнита (мак-адрес)
|
|
public string id;
|
|
// Название (для генерации конфигов например)
|
|
public string name;
|
|
// Базовый адрес в модбасе
|
|
public int baseAddress;
|
|
// Значения которые есть в юните
|
|
public Dictionary<string, UnitValue> values;
|
|
// текущий IP юнита
|
|
public string ip;
|
|
|
|
public UnitValue GetValue(string name)
|
|
{
|
|
if (!values.ContainsKey(name))
|
|
{
|
|
return null;
|
|
}
|
|
return values[name];
|
|
}
|
|
|
|
public int MinOffset
|
|
{
|
|
get
|
|
{
|
|
int min = int.MaxValue;
|
|
foreach (var u in values) if (u.Value.addressOffset < min) min = u.Value.addressOffset;
|
|
return min;
|
|
}
|
|
}
|
|
|
|
public int MaxOffset
|
|
{
|
|
get
|
|
{
|
|
int max = int.MinValue;
|
|
foreach (var u in values) if (u.Value.addressOffset > max) max = u.Value.addressOffset;
|
|
return max;
|
|
}
|
|
}
|
|
|
|
public bool HasAddress(int address)
|
|
{
|
|
foreach (var u in values)
|
|
{
|
|
if (u.Value.addressOffset + baseAddress == address) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public virtual byte[] GetWriteCommand(int address, float value)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
public virtual bool IsValueWritable(UnitValue v)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|