tidstagning/Procedure.cs
2022-11-03 21:58:32 +01:00

151 lines
3.8 KiB
C#

using System.Collections.Generic;
using System.Diagnostics;
using System;
using Timer = System.Threading.Timer;
using System.Globalization;
namespace Tidstagning
{
class Procedure
{
Relay? horn;
ResultList? log;
List<DateTime> signaler;
uint signalLength = 500;
Timer? delayTimer;
int idx;
public Procedure()
{
signaler = new List<DateTime>();
}
public void ReadFile(string file)
{
System.IO.StreamReader procedure_handle = new System.IO.StreamReader(file);
string? line;
while ((line = procedure_handle.ReadLine()) != null)
{
addEntry(line);
}
procedure_handle.Dispose();
}
public void addEntry(string input)
{
string input_filtered = input.Trim();
if (input_filtered.Length > 0)
{
try
{
signaler.Add(DateTime.Parse(input_filtered, new CultureInfo("da-DK")));
}
catch(ArgumentNullException)
{
Debug.WriteLine("Failed to parse: " + input);
}
signaler.Sort();
}
}
public string TextualRepresentation()
{
string t = "";
if (signaler.Count > 0)
{
foreach (DateTime signal in signaler)
{
if (DateTime.Now > (signal.AddMilliseconds(signalLength)))
{
t += "✔";
}
else if (DateTime.Now > signal)
{
t += "o ";
}
else
{
t += " ";
}
t += signal.ToString(new CultureInfo("da-DK")) + "\r\n";
}
}
return t;
}
public void Clear()
{
signaler = new List<DateTime>();
idx = 0;
if (delayTimer != null)
delayTimer.Dispose();
}
public void setObjects(Relay horn_obj, ResultList log_obj)
{
this.horn = horn_obj;
this.log = log_obj;
Run();
}
public void adjustSignalLength(uint lengthMS)
{
signalLength = lengthMS;
}
public void Run()
{
if (signaler.Count > 0)
{
SetUpTimer(signaler[idx]);
}
}
private void SetUpTimer(DateTime alertTime)
{
DateTime current = DateTime.Now;
TimeSpan timeToGo = alertTime.TimeOfDay - current.TimeOfDay;
if (timeToGo < TimeSpan.Zero)
{
if (!next())
{
return;
}
Run();
return;//time already passed
}
if (log is not null)
{
;
log.Write("Næste signal: " + alertTime.ToString(@"HH\:mm\:ss", new CultureInfo("da-DK")) + " Om: " + timeToGo.ToString(@"hh\:mm\:ss", new CultureInfo("da-DK")));
}
delayTimer = new Timer(x =>
{
this.Alarm();
}, null, timeToGo, new TimeSpan(0));
}
private void Alarm()
{
if (log is not null)
log.Write("HORN!");
if (horn is not null)
horn.Sound(signalLength);
next();
Run();
}
private bool next()
{
if (idx >= (signaler.Count - 1))
return false;
idx++;
return true;
}
}
}