APICycleVDP/GenerateVDPCycle/Program.cs

295 lines
6.7 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
namespace GenerateVDPCycle
{
class Program
{
static List<GenCycle> tasks = new List<GenCycle>();
static void Main(string[] args)
{
var r = new Random();
for(var i = 1; i <= 48; i++)
{
var a = new GenCycle(i);
a.Start();
tasks.Add(a);
}
Task.Delay(1000 * 5).Wait();
while (true)
{
for (var i = 0; i < tasks.Count; i++)
{
if (i % 10 == 0 && i != 0)
Console.WriteLine();
Console.Write(tasks[i].GetSmallStatus() + "|");
}
Console.WriteLine();
Task.Delay(1000 * 60 * 10).Wait();
}
}
}
public class GenCycle
{
private int vdp = 0;
private int curCycle = 0;
private DateTime factStart = DateTime.Now;
private DateTime factEnd = DateTime.Now;
private DateTime thinkEnd = DateTime.Now;
private bool cycle = false;
private Task taskCycle = null;
public GenCycle(int vdp)
{
this.vdp = vdp;
}
public bool GetCurrCycle()
{
try
{
using (var db = new DB.VdpDB())
{
var tmp = (from u in db.Cycles
where
u.NumVdp == vdp
orderby u.FactStart descending
select u).FirstOrDefault();
if (tmp == null)
{
curCycle = 0;
return false;
}
curCycle = tmp.NumCycle;
factStart = tmp.FactStart;
factEnd = tmp.FactEnd;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return false;
}
return true;
}
public void GetNextCycle()
{
var r = new Random();
var a = r.Next(100);
switch (curCycle)
{
case 0: curCycle =
(a < 50) ? 14 : 2; break;
case 1: curCycle = 2; break;
case 2: curCycle = 5; break;
case 5: curCycle = 6; break;
case 6: curCycle = 7; break;
case 7: curCycle =
(a < 20) ? 5 : 8; break;
case 8: curCycle = 9; break;
case 9: curCycle = 10; break;
case 10: curCycle = 11; break;
case 11: curCycle = 12; break;
case 12: curCycle = 0; break;
case 14: curCycle = 15; break;
case 15: curCycle = 16; break;
case 16: curCycle = 1; break;
default: curCycle = 0; break;
}
}
public void GetTimeStart()
{
factStart = factEnd;
}
public void GetTimeThinkEnd()
{
switch (curCycle)
{
case 0: thinkEnd = factStart.AddMinutes(15); break;
case 1: thinkEnd = factStart.AddMinutes(15); break;
case 2: thinkEnd = factStart.AddMinutes(10); break;
case 5: thinkEnd = factStart.AddMinutes(13); break;
case 6: thinkEnd = factStart.AddMinutes(7); break;
case 7: thinkEnd = factStart.AddMinutes(5); break;
case 8: thinkEnd = factStart.AddMinutes(10); break;
case 9: thinkEnd = factStart.AddMinutes(5); break;
case 10: thinkEnd = factStart.AddMinutes(60); break;
case 11: thinkEnd = factStart.AddMinutes(15); break;
case 12: thinkEnd = factStart.AddMinutes(30); break;
case 14: thinkEnd = factStart.AddMinutes(10); break;
case 15: thinkEnd = factStart.AddMinutes(20); break;
case 16: thinkEnd = factStart.AddMinutes(15); break;
default: thinkEnd = factStart.AddMinutes(15); break;
}
}
public void GetTimeFactEnd()
{
var r = new Random();
var sec = 0;
switch (curCycle)
{
case 0:
sec = r.Next(7 * 60) - (5 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 1:
sec = r.Next(3 * 60) - (2 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 2:
sec = r.Next(11 * 60) - (1 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 5:
sec = r.Next(4 * 60) - (3 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 6:
sec = r.Next(4 * 60) - (3 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 7:
sec = r.Next(7 * 60) - (2 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 8:
sec = r.Next(11 * 60) - (1 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 9:
sec = r.Next(2 * 60) - (1 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 10:
sec = r.Next(40 * 60) - (30 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 11:
sec = r.Next(5 * 60) - (3 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 12:
sec = r.Next(20 * 60) - (10 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 14:
sec = r.Next(11 * 60) - (1 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 15:
sec = r.Next(4 * 60) - (3 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
case 16:
sec = r.Next(4 * 60) - (3 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
default:
sec = r.Next(7 * 60) - (5 * 60);
factEnd = thinkEnd.AddSeconds(sec);
break;
}
}
public bool SaveToDB()
{
try
{
using (var db = new DB.VdpDB())
{
var tmp = new DB.Cycle()
{
NumVdp = vdp,
NumCycle = curCycle,
FactStart = factStart,
FactEnd = factEnd,
ThinkEnd = thinkEnd
};
db.Cycles.Add(tmp);
db.SaveChanges();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return false;
}
return true;
}
public void Start()
{
cycle = true;
taskCycle = this.Cycle();
}
public void Stop()
{
cycle = false;
taskCycle.Wait();
}
async public Task Cycle()
{
while (cycle)
{
if (GetCurrCycle())
{
if(DateTime.Now >= factEnd)
{
/*if (vdp == 1)
Console.WriteLine("Generate next cycle.");*/
GetNextCycle();
GetTimeStart();
GetTimeThinkEnd();
GetTimeFactEnd();
while (!SaveToDB())
{
Console.WriteLine("VDP " + vdp.ToString("D2") + ": Can't connect to DB.");
await Task.Delay(5000);
}
}
} else
{
/*if (vdp == 1)
Console.WriteLine("Generate new cycle.");*/
GetTimeStart();
GetTimeThinkEnd();
GetTimeFactEnd();
while (!SaveToDB())
{
Console.WriteLine("VDP " + vdp.ToString("D2") + ": Can't connect to DB.");
await Task.Delay(5000);
}
}
while (cycle && (DateTime.Now < factEnd))
{
var secAwait = (factEnd - DateTime.Now).TotalSeconds;
/*if(vdp == 1)
Console.WriteLine("Time to cycle update " + secAwait.ToString());*/
if (secAwait >= 5)
{
/*if (vdp == 1)
Console.WriteLine("Delay 5 sec");*/
await Task.Delay(5000);
}
else
{
/*if (vdp == 1)
Console.WriteLine("Delay last secs");*/
await Task.Delay(Convert.ToInt32(Math.Ceiling(secAwait)) * 1000);
}
}
}
}
public string GetSmallStatus()
{
return vdp.ToString("D2") + "-" + curCycle.ToString("D2");
}
}
}