using API_SequentMicrosystems.Models; using Newtonsoft.Json; using System.Timers; namespace API_SequentMicrosystems.Services { public class PointsService { private System.Timers.Timer _SaveTimer; private bool _SavePoints; private System.Timers.Timer? _timer; private RTDDAService _RTDDAService; public PointsService(IConfiguration conf, RTDDAService _RTDDAS) { if (!Directory.Exists("Points")) Directory.CreateDirectory("Points"); _RTDDAService = _RTDDAS; #pragma warning disable CS8604 // Může jít o argument s odkazem null. _SaveTimer = new System.Timers.Timer(conf.GetValue("PointsSaveToFileMinimumSec") * 1000); #pragma warning restore CS8604 // Může jít o argument s odkazem null. _SaveTimer.Elapsed += SaveTimerElapsed; _SaveTimer.AutoReset = true; _SaveTimer.Start(); _points = LoadPoints(); } private List _points; /// /// Load points from File /// /// private List LoadPoints() { try { #pragma warning disable CS8603 // Může jít o vrácený odkaz null. return JsonConvert.DeserializeObject>(File.ReadAllText("Points/SavedData.json")); #pragma warning restore CS8603 // Může jít o vrácený odkaz null. } catch { return new(); } } /// /// Save points to File /// private void SavePoints() { File.WriteAllText("Points/SavedData.json", JsonConvert.SerializeObject(_points.ToList())); } /// /// Get saved Points /// /// public List GetPoints() { return _points.ToList(); } /// /// Get points from start with limit /// /// Limit of returned points /// public List GetPoints(int limit) { return _points.Take(limit).ToList(); } /// /// Get Points with start and count limit /// /// Start at this list position /// Limit of returned points /// public List GetPoints(int start, int limit) { return _points.Skip(start).Take(limit).ToList(); } /// /// Get Points with start element and limit /// /// Limit of returned points /// Point from start reading /// public List GetPoints(int limit, PointsModel pm) { return _points.Skip(_points.IndexOf(pm) + 1).Take(limit).ToList(); } /// /// Delete Points /// public void DeletePoints() { _points = new(); SavePoints(); } /// /// Save data/status point /// public void SavePoint() { PointsModel pm = new PointsModel(); //initialize point object pm.Time = DateTime.Now; //set time of point created pm.RTDDA = _RTDDAService.ReadAllCard(); //save RTD data to point _points.Add(pm); //add point to list _SavePoints = true; } /// /// Start AutoSave points with specified delay /// /// public void AutoSaveStart(int msec) { if (_timer != null && _timer.Enabled) { AutoSaveStop(); } _timer = new System.Timers.Timer(msec); _timer.AutoReset = true; _timer.Elapsed += TimerElapsed; _timer.Start(); } /// /// Stop AutoSaving points /// /// public int AutoSaveStop() { if (_timer == null) return _points.Count; _timer.Stop(); _timer.Close(); return _points.Count; } /// /// TimerElapsed and saving point /// /// /// private void TimerElapsed(object? o, ElapsedEventArgs? e) { SavePoint(); } private void SaveTimerElapsed(object? o, ElapsedEventArgs? e) { if (_SavePoints) { _SavePoints = false; SavePoints(); } } } }