using Newtonsoft.Json; using UI_SequentMicrosystems.Models; using Wrapper_Api_SequentMicrosystems.SignalR; namespace UI_SequentMicrosystems.Services { public class SyncService { private PointsService _pointsService { get; set; } private RTD8TMService _RTD8TMService { get; set; } private string? Address { get; set; } private string ClientID { get; set; } private string? SyncRequestedClientID { get; set; } private Sync? SyncClient { get; set; } private List _SyncClients = new(); public delegate Task AsyncEventHandler(object? sender, TEventArgs? e); public event AsyncEventHandler? EventUpdateClientsIDs; public SyncService(PointsService pointsService, RTD8TMService rtD8TMService) { _pointsService = pointsService; _RTD8TMService = rtD8TMService; ClientID = CreateClientID(); Console.WriteLine($"SyncService:* Local Client ID: {ClientID}"); } /// /// Set api address /// /// public void SetAddress(string address) { if (Address == address) { return; } Address = address; _RTD8TMService.SetAddress(Address); StartConnection(); } /// /// Create Random ClientID /// private string CreateClientID() { string id = ""; List chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray().ToList(); for (int i = 0; i < 4; i++) { id += chars[Random.Shared.Next(0, chars.Count - 1)]; } return id; } /// /// Get this ClientID /// /// public string GetClientID() { return ClientID; } /// /// Start connection to Server /// private async void StartConnection() { if (Address == null) { return; } SyncClient = new(Address); SyncClient.EventClientIDRequest += ClientIDRequestRequested; SyncClient.EventClientsIDResponse += ClientIDRequestResponse; SyncClient.EventClientSyncRequest += ClientSyncRequested; SyncClient.EventClientRTD8TMChartSync += ClientRTD8TMSyncData; SyncClient.EventClientPointsSync += ClientPointsyncData; RequestClientsIds(); } private async Task ClientIDRequestRequested(object? o, bool b) { if (SyncClient == null) { return; } _SyncClients.Clear(); await SyncClient.SendClientsResponse(ClientID); } #pragma warning disable CS1998 // V této asynchronní metodě chybí operátory await a spustí se synchronně. private async Task ClientIDRequestResponse(object? o, string? id) { if (id == null || id == ClientID) { return; } Console.WriteLine($"SyncService:ClientIDRequestResponse clientID: {id}"); _SyncClients.Add(id); if (EventUpdateClientsIDs != null) { await EventUpdateClientsIDs.Invoke(this, true); } } private async Task ClientSyncRequested(object? o, string? id) { if (SyncClient == null || id == null || id != ClientID) { return; } await SyncClient.SendClientsPoints(ClientID, JsonConvert.SerializeObject(_pointsService.GetPoints())); await SyncClient.SendClientsRTD8TMChart(ClientID, JsonConvert.SerializeObject(_RTD8TMService.GetAllChartData())); } private async Task ClientRTD8TMSyncData(object? o, string? id, string data) { if (data == null || id == null || id != SyncRequestedClientID) { return; } _RTD8TMService.SetChartData(JsonConvert.DeserializeObject>>>(data)); } private async Task ClientPointsyncData(object? o, string? id, string data) { if (data == null || id == null || id != SyncRequestedClientID) { return; } _pointsService.SetPoints(JsonConvert.DeserializeObject(data)); } /// /// Request Other Clients IDs /// public async void RequestClientsIds() { await SyncClient.SendClientsRequest(); } /// /// Get Clients IDs /// /// public List GetClientsIDs() { Console.WriteLine($"SyncService:GetClientsIDs {JsonConvert.SerializeObject(_SyncClients.ToList())}"); return _SyncClients.ToList(); } /// /// Request Clients Sync /// /// ID of client from sync requested /// public async Task SendClientSyncRequest(string ClientID) { if (SyncClient == null) { return; } SyncRequestedClientID = ClientID; if (SyncRequestedClientID == "") { return; } await SyncClient.SendClientSyncRequest(ClientID); if (EventUpdateClientsIDs != null) { await EventUpdateClientsIDs.Invoke(this, true); } } /// /// Get selected Sync Client /// /// public async Task GetSelectedSyncClient() { if (SyncRequestedClientID == null || SyncRequestedClientID == "") { return ""; } else { return SyncRequestedClientID; } } } }