109 lines
3.3 KiB
C#
109 lines
3.3 KiB
C#
// See https://aka.ms/new-console-template for more information
|
|
using MP.MONO.Data.Controllers;
|
|
using Newtonsoft.Json;
|
|
using StackExchange.Redis;
|
|
|
|
string lineSep = "------------------------------------------------------";
|
|
string redisConf = "127.0.0.1:6379";
|
|
|
|
Random rand = new Random();
|
|
SimController simGen = new SimController();
|
|
|
|
Console.WriteLine(lineSep);
|
|
Console.WriteLine($"Starting Machine SIM - redis server on {redisConf}!");
|
|
Console.WriteLine(lineSep);
|
|
Console.WriteLine("");
|
|
Console.WriteLine("Running - press CTRL-C to stop SIM");
|
|
Console.WriteLine("");
|
|
|
|
//Create a connection
|
|
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(redisConf);
|
|
ISubscriber sub = redis.GetSubscriber();
|
|
IDatabase? redisDb = redis.GetDatabase();
|
|
|
|
// avvio tutti i thread...
|
|
Thread threadStatus = new Thread(simStatus);
|
|
Thread threadAlarms = new Thread(simAlarms);
|
|
Thread threadParams = new Thread(simParameters);
|
|
|
|
threadStatus.Start();
|
|
threadAlarms.Start();
|
|
threadParams.Start();
|
|
|
|
/// <summary>
|
|
/// Hash Redis contenente i dati MP di una specifico TYPE (es StatusMacchina, StateMachineIngressi, ...)
|
|
/// </summary>
|
|
/// <param name="dataType"></param>
|
|
/// <returns></returns>
|
|
string mHash(string dataType)
|
|
{
|
|
return $"MAPO-MONO:{dataType}";
|
|
}
|
|
|
|
void saveAndSendMessage(string memKey, string value, string notifyChannel, string message)
|
|
{
|
|
// effettuo la scrittura nell'area di memoria indicata
|
|
redisDb.StringSetAsync(memKey, value); ;
|
|
//redis.GetDatabase().SetAdd(memKey, value);
|
|
//redis.GetDatabase().StringSetAsync(memKey, value);
|
|
|
|
// invio notifica tramite il canale richiesto
|
|
sub.Publish(notifyChannel, message);
|
|
Console.WriteLine($"[{notifyChannel}] key: {memKey} | val: {value} | message: {message}");
|
|
}
|
|
void simAlarms()
|
|
{
|
|
int minPeriod = 3000;
|
|
int maxPeriod = 10000;
|
|
|
|
do
|
|
{
|
|
List<string> activeAlarms = new List<string>();
|
|
//int alarmCode = rand.Next(0, 255);
|
|
int alarmCode = rand.Next(0, 160);
|
|
// se >= 128 --> 0 (no alarm)
|
|
alarmCode = alarmCode <= 127 ? alarmCode : 0;
|
|
for (int i = 0; i < 8; i++)
|
|
{
|
|
if ((alarmCode & (1 << i)) != 0)
|
|
{
|
|
activeAlarms.Add($"Alarm {i:000}");
|
|
}
|
|
}
|
|
string rawData = JsonConvert.SerializeObject(activeAlarms);
|
|
// decodifico allarme e lo trasformo in List<String> di allarmi attivi...
|
|
saveAndSendMessage(mHash("Machine:Alarms:Current"), rawData, "allarms", rawData);
|
|
// attesa random
|
|
Thread.Sleep(rand.Next(minPeriod, maxPeriod));
|
|
} while (true);
|
|
}
|
|
void simParameters()
|
|
{
|
|
int minPeriod = 50;
|
|
int maxPeriod = 300;
|
|
|
|
do
|
|
{
|
|
var newParams = simGen.MachineGetParameters();
|
|
string rawData = JsonConvert.SerializeObject(newParams);
|
|
saveAndSendMessage(mHash("Machine:Parameters:Current"), rawData, "parameters", rawData);
|
|
// attesa random
|
|
Thread.Sleep(rand.Next(minPeriod, maxPeriod));
|
|
} while (true);
|
|
}
|
|
void simStatus()
|
|
{
|
|
int minPeriod = 2000;
|
|
int maxPeriod = 3000;
|
|
|
|
do
|
|
{
|
|
// recupero uno stato simulato
|
|
var newStatus = simGen.MachineGetStatus();
|
|
string rawData = JsonConvert.SerializeObject(newStatus);
|
|
saveAndSendMessage(mHash("Machine:Status:Current"), rawData, "status", rawData);
|
|
|
|
// attesa random
|
|
Thread.Sleep(rand.Next(minPeriod, maxPeriod));
|
|
} while (true);
|
|
} |