Files
feanor/FeanorClient/ClientWorker.cs
Martijn Dijkstra 6a44bd4fd2 Add project files.
2025-05-08 09:10:15 +02:00

169 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using Maser.Feanor.Model;
using Maser.Feanor.Biz;
using Maser.Feanor.Server;
using System.Net;
namespace Maser.Feanor.Client
{
public class ClientWorker
{
public ClientWorker(Chamber Chamber)
{
_Chamber = Chamber;
ThreadPool.SetMaxThreads(1000, 1000);
_thread = null;
_status = ChamberStatus.Init;
try
{
_Server = Servers.GetInstanceByChamber(_Chamber);
}
catch (Exception ex)
{
string s = "class ClientWorker->Servers.GetInstanceByChamber() (chamber: " + _Chamber.ToString() + ")\n Exception: " + ex.Message;
throw new Exception(s);
}
}
private Thread _thread;
public ChamberStatus Status { get { return _status; } }
private ChamberStatus _status;
private Boolean _isKicking;
public DateTime LastKick { get { return _lastKick; } }
private DateTime _lastKick;
public DateTime LastHTTP { get { return _LastHTTP; } }
private DateTime _LastHTTP;
private DateTime _LastDBWrite; // Used for detecting idling of server
Int32 _KickIntervalms = 60000; // Normal interval for contenttoclient request --> 1 minute
Int32 interval = 5000; // Interval for first contenttoclient request --> 5 seconds
private Server.Server _Server;
public Server.Server Server { get { return _Server; } }
private Chamber _Chamber;
public Chamber Chamber { get { return _Chamber; } }
public bool IsRunning
{
get
{
return (_thread != null) && _thread.IsAlive && _isKicking;
}
}
public bool Start()
{
if (!IsRunning)
{
_status = ChamberStatus.Initializing;
_thread = new Thread(new ThreadStart(ThreadFunction));
_thread.Start();
return true;
}
return false;
}
public bool Stop()
{
DateTime OnStop = DateTime.Now;
_status = ChamberStatus.AbortRequested;
// De-set _isStarted and wait max 10 seconds for result.
while ((_isKicking) && (OnStop.AddSeconds(10) > DateTime.Now))
Thread.Sleep(100);
if (_isKicking)
{
_thread.Abort();
_isKicking = false;
return _thread.Join(2000);
}
return !_isKicking;
}
private void ThreadFunction()
{
// Send the time of the Feanor client to the server on startup
try
{
if (!_Server.WriteDatetime(Time.UTC) || !_Server.WriteSensors())
_status = ChamberStatus.NoConn;
}
catch { _status = ChamberStatus.NoConn; }
Results resultBiz = new Results();
_lastKick = DateTime.Now;
while (_status != ChamberStatus.AbortRequested && ((Thread.CurrentThread.ThreadState & System.Threading.ThreadState.AbortRequested) == 0))
{
// Try to read from server every _lastKick milliseconds
if (DateTime.Now > _lastKick.AddMilliseconds(interval)) // was: _KickIntervalms is het /contenttoclient interval! (nu 1 min!)
{
interval = _KickIntervalms;
_lastKick = DateTime.Now;
if (_Server.Read())
{
_LastHTTP = DateTime.Now;
_status = ChamberStatus.Running;
if (_Server.Results.Count > 0)
{
if(_Server.Chamber.Humidity == true)
{
resultBiz.Add(_Server.Results); // stuurt de resultaten naar de SQL DB (Results)
}
else
{
resultBiz.AddOudeHal(_Server.Results); // stuurt de resultaten naar de SQL DB (Results)
}
_LastDBWrite = DateTime.Now;
}
if (DateTime.Now > _LastDBWrite.AddSeconds(_Chamber.Interval * 2))
_status = ChamberStatus.Idle;
}
else
_status = ChamberStatus.NoConn;
}
// It might be interesting to periodically update the calibration and sensor lists in the server.
// It might be interesting to periodically update the calibration and sensor lists in the server.
// _Server.SetSensorsAndCalibrations();
_isKicking = true;
Thread.Sleep(250);
}
_isKicking = false;
_status = ChamberStatus.Aborted;
}
}
}