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 _stackLevels = new List(); public RTDDAService(IConfiguration configuration) { if (!Directory.Exists("RTDDA")) Directory.CreateDirectory("RTDDA"); List cardsConfig = configuration.GetSection("Cards").Get>(); #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 CalibrationData = LoadCalibratioData(); } /// /// Read data from all RTD cards /// /// data from all RTD cards public SortedList ReadAllCard() { SortedList data = new SortedList(); for (byte i = 0; i < 8; i++) //loop for read all stack levels { float[] RD = ReadCard(i); //read stack level if (RD.Length > 3) data.Add(i, RD); //Add readed data to SortedList } return data; //return data } /// /// Read data from all configured cards /// /// Data from all configuredd Cards public SortedList ReadAllConfiguredCard() { SortedList data = new SortedList(); 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 } /// /// Read data from specified card /// /// stack level ID /// Data of selected stack card public float[] ReadCard(byte stack) { try { float[] data = _stackLevelReader.GetStack(stack); //return data from specified card and ted measure precision for (byte i = 0;i < 8; i++) { data[i] += ReadCpecifiedChanelCalibration(stack, i); } return data; } catch { return new float[0]; //if card read get error, return empty array } } #region ChanelsName private SortedList ChanelsNames; /// /// Load Chanels Names from file /// /// private SortedList LoadChanelsNames() { try { #pragma warning disable CS8603 // Může jít o vrácený odkaz null. return JsonConvert.DeserializeObject>(File.ReadAllText("RTDDA/Names.json")); #pragma warning restore CS8603 // Může jít o vrácený odkaz null. } catch { return new(); } } /// /// Save ChanelsNames to FIle /// private void SaveChanelsNames() { File.WriteAllText("RTDDA/Names.json", JsonConvert.SerializeObject(ChanelsNames)); } /// /// Get CHanelsNames /// /// public SortedList GetChanelsNames() { return ChanelsNames; } /// /// Save Chanels Names /// /// public void SetChanelsNames(SortedList ChN) { ChanelsNames = ChN; SaveChanelsNames(); } #endregion #region PreconfiguredChanelsNames private List PreconfiguredChanelsNames; /// /// Load Preconfigurated Chanels Names from file /// /// private List LoadPreconfiguredChanelsNames() { try { #pragma warning disable CS8603 // Může jít o vrácený odkaz null. return JsonConvert.DeserializeObject>(File.ReadAllText("RTDDA/PNames.json")); #pragma warning restore CS8603 // Může jít o vrácený odkaz null. } catch { return new(); } } /// /// Save Preconfigurated chanels names to File /// private void SavePreconfiguratedChanelsNames() { File.WriteAllText("RTDDA/PNames.json", JsonConvert.SerializeObject(PreconfiguredChanelsNames)); } /// /// Get preconfigured chanels names /// /// public List GetPreconfiguratedChanelsNames() { return PreconfiguredChanelsNames.ToList(); } /// /// Save Preconfigured ChanelsNames /// /// public void SetPreconfiguratedChanelsNames(List ChN) { PreconfiguredChanelsNames = ChN; SavePreconfiguratedChanelsNames(); } #endregion #region Calibration private SortedList CalibrationData; /// /// Load Calibration data from File /// /// private SortedList LoadCalibratioData() { try { #pragma warning disable CS8603 // Může jít o vrácený odkaz null. return JsonConvert.DeserializeObject>(File.ReadAllText("RTDDA/Calibration.json")); #pragma warning restore CS8603 // Může jít o vrácený odkaz null. } catch { return new(); } } /// /// Save Calibration data to File /// private void SaveCalibrationData() { File.WriteAllText("RTDDA/Calibration.json", JsonConvert.SerializeObject(CalibrationData)); } /// /// Get Calibration Data /// /// public SortedList GetCalibrationData() { return CalibrationData; } /// /// Set new calibration Data /// /// public void SetCalibrationData(SortedList CD) { CalibrationData = CD; SaveCalibrationData(); } /// /// Get Calibration data of specific card chanel /// /// Card stack position ID /// Chanel ID /// Calibration data of specific chanel 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 } }