Added Client Synchronization function
parent
347348c81c
commit
8b62c82a15
|
@ -24,6 +24,11 @@
|
|||
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Saved Points
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="Sync">
|
||||
<span class="bi gg-sync" aria-hidden="true"></span> Sync Data
|
||||
</NavLink>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
@inject PointsService _PointsService
|
||||
@inject RTD8TMService _RTD8TMService
|
||||
@inject SyncService _SyncService
|
||||
@inject NavigationManager Navigator
|
||||
|
||||
|
||||
|
@ -28,7 +29,7 @@
|
|||
protected override void OnInitialized()
|
||||
{
|
||||
//_RTD8TMService.SetAddress("http://10.250.251.131/");
|
||||
_RTD8TMService.SetAddress(Navigator.BaseUri);
|
||||
_SyncService.SetAddress(Navigator.BaseUri);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
@inject NavigationManager Navigator
|
||||
@inject RTD8TMService _RTD8TMService
|
||||
@inject PointsService _PointsService
|
||||
@inject SyncService _SyncService
|
||||
|
||||
<PageTitle>Temperature</PageTitle>
|
||||
|
||||
|
@ -104,7 +105,7 @@
|
|||
protected override void OnInitialized()
|
||||
{
|
||||
//_RTD8TMService.SetAddress("http://10.250.251.131/");
|
||||
_RTD8TMService.SetAddress(Navigator.BaseUri);
|
||||
_SyncService.SetAddress(Navigator.BaseUri);
|
||||
_RTD8TMService.EventUpdateValues += UpdateView;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,17 +2,21 @@
|
|||
@using UI_SequentMicrosystems.Services
|
||||
|
||||
@inject NavigationManager Navigator
|
||||
@inject RTD8TMService _RTD8TMService
|
||||
@inject SyncService _SyncService
|
||||
|
||||
<PageTitle>Welcome</PageTitle>
|
||||
|
||||
<div class="text-center row">
|
||||
<div class="h6 col-3"><strong>TesDevice App V1.1</strong></div>
|
||||
<div class="h6 col-3">TesDevice App V1.2</div>
|
||||
<div class="col">Added Clients Synchronization</div>
|
||||
</div>
|
||||
<div class="text-center row">
|
||||
<div class="h6 col-3">TesDevice App V1.1</div>
|
||||
<div class="col">Added Automatic points Saving, Calibration and Calculating RTDCard values change in last 3O minutes in saved points</div>
|
||||
</div>
|
||||
<div class="text-center row">
|
||||
<div class="h6 col-3">TesDevice App V1.O</div>
|
||||
<div class="col">Firt Fully function Build --> Reading RTD cards, RTD Graph, Points Saving and exporting as csv</div>
|
||||
<div class="col">First Fully function Build --> Reading RTD cards, RTD Graph, Points Saving and exporting as csv</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
@ -24,7 +28,7 @@
|
|||
protected override void OnInitialized()
|
||||
{
|
||||
//_RTD8TMService.SetAddress("http://10.250.251.131/");
|
||||
_RTD8TMService.SetAddress(Navigator.BaseUri);
|
||||
_SyncService.SetAddress(Navigator.BaseUri);
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
@page "/Sync"
|
||||
|
||||
@using UI_SequentMicrosystems.Services
|
||||
@using UI_SequentMicrosystems.Models
|
||||
|
||||
@inject SyncService _SyncService
|
||||
@inject NavigationManager Navigator
|
||||
|
||||
|
||||
<PageTitle>Clients Sync</PageTitle>
|
||||
|
||||
<div class="text-white h6 text-center">
|
||||
This ClientID: <strong>@_SyncService.GetClientID()</strong>
|
||||
</div>
|
||||
|
||||
@if (SelectedSyncClientID != null)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<select class="form-select bg-dark text-white" aria-label="Default select example" @onchange="((x) =>
|
||||
{
|
||||
ClientSelected(x.Value.ToString());
|
||||
})">
|
||||
|
||||
@if (SelectedSyncClientID == null && SelectedSyncClientID == "")
|
||||
{
|
||||
<option selected value="-1">Select Sync Client ID</option>
|
||||
}
|
||||
else
|
||||
{
|
||||
<option value="-1">Select Sync Client ID</option>
|
||||
}
|
||||
|
||||
@foreach (string id in _SyncService.GetClientsIDs())
|
||||
{
|
||||
<option value="@id">@id</option>
|
||||
}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@if (SelectedSyncClientID != null && SelectedSyncClientID != "")
|
||||
{
|
||||
<div class="col-xs-12 col-md-2 align-self-center">
|
||||
<button class="btn btn-dark text-white no-border" @onclick="(() => _SyncService.SendClientSyncRequest(SelectedSyncClientID))">Synchronize With selected Client</button>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@code {
|
||||
private string SelectedSyncClientID { get; set; }
|
||||
|
||||
protected override async void OnInitialized()
|
||||
{
|
||||
//_RTD8TMService.SetAddress("http://10.250.251.131/");
|
||||
_SyncService.SetAddress(Navigator.BaseUri);
|
||||
SelectedSyncClientID = await _SyncService.GetSelectedSyncClient();
|
||||
_SyncService.EventUpdateClientsIDs += UpdateView;
|
||||
}
|
||||
|
||||
|
||||
private async void ClientSelected(string select)
|
||||
{
|
||||
Console.WriteLine($"SyncPage:ClientSelected Selected ID: {select}");
|
||||
if (select == "-1")
|
||||
{
|
||||
SelectedSyncClientID = "";
|
||||
await _SyncService.SendClientSyncRequest("");
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedSyncClientID = select;
|
||||
await _SyncService.SendClientSyncRequest(select);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task UpdateView(object? o, bool b)
|
||||
{
|
||||
await InvokeAsync(() =>
|
||||
{
|
||||
StateHasChanged();
|
||||
});
|
||||
}
|
||||
}
|
|
@ -18,6 +18,7 @@ namespace UI_SequentMicrosystems
|
|||
|
||||
builder.Services.AddSingleton<RTD8TMService>();
|
||||
builder.Services.AddSingleton<PointsService>();
|
||||
builder.Services.AddSingleton<SyncService>();
|
||||
|
||||
await builder.Build().RunAsync();
|
||||
}
|
||||
|
|
|
@ -72,6 +72,22 @@ namespace UI_SequentMicrosystems.Services
|
|||
return _PointsModel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set Points (used by sync)
|
||||
/// </summary>
|
||||
/// <param name="points"></param>
|
||||
public async void SetPoints(PointsModel points)
|
||||
{
|
||||
_PointsModel = points;
|
||||
|
||||
PointsCount = _PointsModel.RTD8TM.Keys.Count;
|
||||
|
||||
if (EventUpdateTopBar != null)
|
||||
{
|
||||
await EventUpdateTopBar.Invoke(this, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get points Count
|
||||
/// </summary>
|
||||
|
|
|
@ -46,6 +46,9 @@ namespace UI_SequentMicrosystems.Services
|
|||
GetChanelsNames();
|
||||
GetValueTypes();
|
||||
GetCalibrations();
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -435,6 +438,24 @@ namespace UI_SequentMicrosystems.Services
|
|||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get all Chart Data
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public SortedList<byte, List<List<RTD8TMPointModel>>> GetAllChartData()
|
||||
{
|
||||
return GraphData;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set Chart Data (used by syncservice)
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
public void SetChartData(SortedList<byte, List<List<RTD8TMPointModel>>> data)
|
||||
{
|
||||
GraphData = data;
|
||||
}
|
||||
|
||||
//Values Types
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -0,0 +1,201 @@
|
|||
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<string> _SyncClients = new();
|
||||
|
||||
public delegate Task AsyncEventHandler<TEventArgs>(object? sender, TEventArgs? e);
|
||||
public event AsyncEventHandler<bool>? EventUpdateClientsIDs;
|
||||
|
||||
public SyncService(PointsService pointsService, RTD8TMService rtD8TMService)
|
||||
{
|
||||
_pointsService = pointsService;
|
||||
_RTD8TMService = rtD8TMService;
|
||||
ClientID = CreateClientID();
|
||||
Console.WriteLine($"SyncService:* Local Client ID: {ClientID}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set api address
|
||||
/// </summary>
|
||||
/// <param name="address"></param>
|
||||
public void SetAddress(string address)
|
||||
{
|
||||
if (Address == address) { return; }
|
||||
Address = address;
|
||||
_RTD8TMService.SetAddress(Address);
|
||||
|
||||
|
||||
|
||||
StartConnection();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create Random ClientID
|
||||
/// </summary>
|
||||
private string CreateClientID()
|
||||
{
|
||||
string id = "";
|
||||
List<char> chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray().ToList();
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
id += chars[Random.Shared.Next(0, chars.Count - 1)];
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get this ClientID
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public string GetClientID()
|
||||
{
|
||||
return ClientID;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start connection to Server
|
||||
/// </summary>
|
||||
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<SortedList<byte, List<List<RTD8TMPointModel>>>>(data));
|
||||
}
|
||||
|
||||
private async Task ClientPointsyncData(object? o, string? id, string data)
|
||||
{
|
||||
if (data == null || id == null || id != SyncRequestedClientID) { return; }
|
||||
|
||||
_pointsService.SetPoints(JsonConvert.DeserializeObject<PointsModel>(data));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request Other Clients IDs
|
||||
/// </summary>
|
||||
public async void RequestClientsIds()
|
||||
{
|
||||
await SyncClient.SendClientsRequest();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Clients IDs
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<string> GetClientsIDs()
|
||||
{
|
||||
Console.WriteLine($"SyncService:GetClientsIDs {JsonConvert.SerializeObject(_SyncClients.ToList())}");
|
||||
return _SyncClients.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request Clients Sync
|
||||
/// </summary>
|
||||
/// <param name="ClientID">ID of client from sync requested</param>
|
||||
/// <returns></returns>
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get selected Sync Client
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<string> GetSelectedSyncClient()
|
||||
{
|
||||
if (SyncRequestedClientID == null || SyncRequestedClientID == "")
|
||||
{
|
||||
return "";
|
||||
}
|
||||
else
|
||||
{
|
||||
return SyncRequestedClientID;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue