Advanced Distributed Systems module at HSLU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

53 lines
1.9 KiB

using RobotLib.Communication;
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace RobotLib.SplitFlap
{
public class DevSplitFlap : DevBase
{
private const string TOPIC_INITALL = "/splitFlap/cmd/init/";
private const string TOPIC_CONFIGURE_SF = "/splitFlap/config/setup/";
private const string TOPIC_DISPLAY = "/splitFlap/cmd/display/";
public event EventHandler<SplitFlapDisplayEventArgs> SplitFlapDisplayChanged;
public DevSplitFlap(IPublisherSubscriber com) : base(com, new List<string>() { TOPIC_DISPLAY }) { }
public void InitializeAllSplitflaps()
{
base.SendMessage(TOPIC_INITALL, "");
}
public void ConfigureSplitflap(int setupId, int hardwareId)
{
string payload = JsonSerializer.Serialize(new Dictionary<string, int>() { { "setupId", setupId }, { "hardwareId", hardwareId } });
base.SendMessage(TOPIC_CONFIGURE_SF, payload);
}
public void Display(string message)
{
string payload = JsonSerializer.Serialize(new Dictionary<string, string>() { { "message", message } });
base.SendMessage(TOPIC_DISPLAY, payload);
}
protected override void ParseMessage(string fromTopic, string message)
{
if(fromTopic == TOPIC_DISPLAY)
{
var parsedMessage = GetValueFromMesage<string>("message", message);
if (parsedMessage == null) parsedMessage = "?";
SplitFlapDisplayEventArgs eventArgs = new(parsedMessage);
SplitFlapDisplayChanged?.Invoke(this, eventArgs);
}
}
private T GetValueFromMesage<T>(string parameter,string message)
{
var data = JsonSerializer.Deserialize<Dictionary<string, T>>(message);
data.TryGetValue(parameter, out T value);
return value;
}
}
}