2023-11-25 08:24:04 +00:00
|
|
|
|
using API_SequentMicrosystems.Models;
|
|
|
|
|
using Libs_SequentMicrosystems;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
|
|
|
|
namespace API_SequentMicrosystems.Services
|
|
|
|
|
{
|
|
|
|
|
public class RTDDAService
|
|
|
|
|
{
|
|
|
|
|
private RTDStackLevelReader _stackLevelReader = new RTDStackLevelReader();
|
|
|
|
|
public readonly List<byte> _stackLevels = new List<byte>();
|
|
|
|
|
|
|
|
|
|
public RTDDAService(IConfiguration configuration)
|
|
|
|
|
{
|
|
|
|
|
if (!Directory.Exists("RTDDA"))
|
|
|
|
|
Directory.CreateDirectory("RTDDA");
|
|
|
|
|
|
|
|
|
|
List<CardsConfig> cardsConfig = configuration.GetSection("Cards").Get<List<CardsConfig>>();
|
|
|
|
|
#pragma warning disable CS8604 // Může jít o argument s odkazem null.
|
|
|
|
|
CardsConfig config = cardsConfig.Where(x => x.ID == "0").First();
|
|
|
|
|
#pragma warning restore CS8604 // Může jít o argument s odkazem null.
|
|
|
|
|
foreach (char c in config.Levels.ToCharArray())
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_stackLevels.Add(byte.Parse(c.ToString()));
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine($"Char {c} is not convertable to byte");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ChanelsNames = LoadChanelsNames(); //ChanelsNames
|
|
|
|
|
PreconfiguredChanelsNames = LoadPreconfiguredChanelsNames(); //ChanelsPreconfiguredNames
|
2023-11-25 18:00:12 +00:00
|
|
|
|
CalibrationData = LoadCalibratioData();
|
2023-11-25 08:24:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Read data from all RTD cards
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>data from all RTD cards</returns>
|
|
|
|
|
public SortedList<byte, float[]> ReadAllCard()
|
|
|
|
|
{
|
|
|
|
|
SortedList<byte, float[]> data = new SortedList<byte, float[]>();
|
|
|
|
|
|
|
|
|
|
for (byte i = 0; i < 8; i++) //loop for read all stack levels
|
|
|
|
|
{
|
2023-11-25 18:00:12 +00:00
|
|
|
|
float[] RD = ReadCard(i); //read stack level
|
2023-11-25 08:24:04 +00:00
|
|
|
|
|
2023-11-25 18:00:12 +00:00
|
|
|
|
if (RD.Length > 3)
|
|
|
|
|
data.Add(i, RD); //Add readed data to SortedList
|
2023-11-25 08:24:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return data; //return data
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Read data from all configured cards
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>Data from all configuredd Cards</returns>
|
|
|
|
|
public SortedList<byte, float[]> ReadAllConfiguredCard()
|
|
|
|
|
{
|
|
|
|
|
SortedList<byte, float[]> data = new SortedList<byte, float[]>();
|
|
|
|
|
|
|
|
|
|
for (byte i = 0; i < 8; i++) //loop for read all stack levels
|
|
|
|
|
{
|
|
|
|
|
if (_stackLevels.Contains(i))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
data.Add(i, ReadCard(i)); //read stack level
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine($"RTD stack {i} is not available");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return data; //return data
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Read data from specified card
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="stack">stack level ID</param>
|
|
|
|
|
/// <returns>Data of selected stack card</returns>
|
|
|
|
|
public float[] ReadCard(byte stack)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
2023-11-30 15:29:25 +00:00
|
|
|
|
float[] data = _stackLevelReader.GetStack(stack); //return data from specified card and ted measure precision
|
2023-11-25 18:00:12 +00:00
|
|
|
|
|
|
|
|
|
for (byte i = 0;i < 8; i++)
|
|
|
|
|
{
|
|
|
|
|
data[i] += ReadCpecifiedChanelCalibration(stack, i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return data;
|
2023-11-25 08:24:04 +00:00
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return new float[0]; //if card read get error, return empty array
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region ChanelsName
|
|
|
|
|
private SortedList<byte, string[]> ChanelsNames;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Load Chanels Names from file
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private SortedList<byte, string[]> LoadChanelsNames()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
#pragma warning disable CS8603 // Může jít o vrácený odkaz null.
|
|
|
|
|
return JsonConvert.DeserializeObject<SortedList<byte, string[]>>(File.ReadAllText("RTDDA/Names.json"));
|
|
|
|
|
#pragma warning restore CS8603 // Může jít o vrácený odkaz null.
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return new();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Save ChanelsNames to FIle
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void SaveChanelsNames()
|
|
|
|
|
{
|
|
|
|
|
File.WriteAllText("RTDDA/Names.json", JsonConvert.SerializeObject(ChanelsNames));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get CHanelsNames
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public SortedList<byte, string[]> GetChanelsNames()
|
|
|
|
|
{
|
|
|
|
|
return ChanelsNames;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Save Chanels Names
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="ChN"></param>
|
|
|
|
|
public void SetChanelsNames(SortedList<byte, string[]> ChN)
|
|
|
|
|
{
|
|
|
|
|
ChanelsNames = ChN;
|
|
|
|
|
SaveChanelsNames();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region PreconfiguredChanelsNames
|
2023-11-25 18:00:12 +00:00
|
|
|
|
|
2023-11-25 08:24:04 +00:00
|
|
|
|
private List<string> PreconfiguredChanelsNames;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Load Preconfigurated Chanels Names from file
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private List<string> LoadPreconfiguredChanelsNames()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
#pragma warning disable CS8603 // Může jít o vrácený odkaz null.
|
|
|
|
|
return JsonConvert.DeserializeObject<List<string>>(File.ReadAllText("RTDDA/PNames.json"));
|
|
|
|
|
#pragma warning restore CS8603 // Může jít o vrácený odkaz null.
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return new();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Save Preconfigurated chanels names to File
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void SavePreconfiguratedChanelsNames()
|
|
|
|
|
{
|
|
|
|
|
File.WriteAllText("RTDDA/PNames.json", JsonConvert.SerializeObject(PreconfiguredChanelsNames));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get preconfigured chanels names
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public List<string> GetPreconfiguratedChanelsNames()
|
|
|
|
|
{
|
|
|
|
|
return PreconfiguredChanelsNames.ToList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Save Preconfigured ChanelsNames
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="ChN"></param>
|
|
|
|
|
public void SetPreconfiguratedChanelsNames(List<string> ChN)
|
|
|
|
|
{
|
|
|
|
|
PreconfiguredChanelsNames = ChN;
|
|
|
|
|
SavePreconfiguratedChanelsNames();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
2023-11-25 18:00:12 +00:00
|
|
|
|
#region Calibration
|
|
|
|
|
|
|
|
|
|
private SortedList<byte, float[]> CalibrationData;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Load Calibration data from File
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
private SortedList<byte, float[]> LoadCalibratioData()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
#pragma warning disable CS8603 // Může jít o vrácený odkaz null.
|
|
|
|
|
return JsonConvert.DeserializeObject<SortedList<byte, float[]>>(File.ReadAllText("RTDDA/Calibration.json"));
|
|
|
|
|
#pragma warning restore CS8603 // Může jít o vrácený odkaz null.
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return new();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Save Calibration data to File
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void SaveCalibrationData()
|
|
|
|
|
{
|
|
|
|
|
File.WriteAllText("RTDDA/Calibration.json", JsonConvert.SerializeObject(CalibrationData));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get Calibration Data
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public SortedList<byte, float[]> GetCalibrationData()
|
|
|
|
|
{
|
|
|
|
|
return CalibrationData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Set new calibration Data
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="CD"></param>
|
|
|
|
|
public void SetCalibrationData(SortedList<byte, float[]> CD)
|
|
|
|
|
{
|
|
|
|
|
CalibrationData = CD;
|
|
|
|
|
SaveCalibrationData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get Calibration data of specific card chanel
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="stack">Card stack position ID</param>
|
|
|
|
|
/// <param name="chanel">Chanel ID</param>
|
|
|
|
|
/// <returns>Calibration data of specific chanel</returns>
|
|
|
|
|
private float ReadCpecifiedChanelCalibration(byte stack, byte chanel)
|
|
|
|
|
{
|
|
|
|
|
if (!CalibrationData.ContainsKey(stack))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
if (CalibrationData[stack].Length < chanel)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
return CalibrationData[stack][chanel];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
2023-11-25 08:24:04 +00:00
|
|
|
|
}
|
|
|
|
|
}
|