switched DevBase to IPublisherSubscriber instead of Com,

added and implemented DevSplitFlap,
added IsConnected property to IPublisherSubscriber
main
Jonas Arnold 4 years ago
parent 4e8d9e1695
commit c48196e44d
  1. 7
      ADIS_Csharp/RobotLib/Communication/IPublisherSubscriber.cs
  2. 2
      ADIS_Csharp/RobotLib/Communication/SubscribedMsgArrivedEventArgs.cs
  3. 31
      ADIS_Csharp/RobotLib/DevBase.cs
  4. 58
      ADIS_Csharp/RobotLib/DevSplitFlap/DevSplitFlap.cs
  5. 12
      ADIS_Csharp/RobotLib/DevSplitFlap/SplitFlapDisplayEventArgs.cs

@ -2,13 +2,18 @@
namespace RobotLib.Communication
{
internal interface IPublisherSubscriber
public interface IPublisherSubscriber
{
/// <summary>
/// New message to a subscribed topic arrived.
/// </summary>
event EventHandler<SubscribedMsgArrivedEventArgs> NewMessageArrived;
/// <summary>
/// Connection state.
/// </summary>
bool IsConnected { get; }
/// <summary>
/// Subscribe to a topic.
/// </summary>

@ -10,7 +10,7 @@ namespace RobotLib.Communication
public SubscribedMsgArrivedEventArgs(string topic, string message)
{
Topic = topic;
Message = data;
Message = message;
}
}
}

@ -1,8 +1,5 @@
using System;
using RobotLib.Communication;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RobotLib
{
@ -10,40 +7,40 @@ namespace RobotLib
{
protected NLog.Logger log { get; private set; }
public DevBase(Com com) : this(com, string.Empty) { }
public DevBase(Com com, string keyword)
public DevBase(IPublisherSubscriber com) : this(com, new List<string>()) { }
public DevBase(IPublisherSubscriber com, List<string> interestedTopics)
{
log = NLog.LogManager.GetLogger(GetType().ToString());
Keyword = keyword;
Com = com;
com.MessageReveived += MessageReveived;
InterestedTopics = interestedTopics;
com.NewMessageArrived += Com_NewMessageArrived;
}
protected string Keyword { get; }
protected Com Com { get; }
protected virtual void MessageReveived(object sender, MessageEventArgs e)
protected List<string> InterestedTopics { get; }
protected IPublisherSubscriber Com { get; }
protected void Com_NewMessageArrived(object sender, SubscribedMsgArrivedEventArgs e)
{
if (e.Message.StartsWith(Keyword))
if (InterestedTopics.Contains(e.Topic))
{
ParseMessage(e.Message);
ParseMessage(e.Topic, e.Message);
}
}
protected void SendMessage(string message)
protected void SendMessage(string topic, string message)
{
if (Com.IsConnected)
{
log.Trace("Esp32> " + message);
Com.SendMsg(message);
Com.Publish(topic, message);
}
else
{
log.Warn("Not connected! Could not send message: " + message);
}
}
protected virtual void ParseMessage(string message) { }
protected virtual void ParseMessage(string fromTopic, string message) { }
public virtual void Refresh() { }

@ -0,0 +1,58 @@
using RobotLib.Communication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace RobotLib.DevSplitFlap
{
internal 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, string>() { { "setupId", setupId.ToString() }, { "hardwareId", hardwareId.ToString() } });
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)
{
string parsedMessage = (string)GetValueFromMesage("message", message);
if (parsedMessage == null) parsedMessage = "?";
SplitFlapDisplayEventArgs eventArgs = new(parsedMessage);
SplitFlapDisplayChanged?.Invoke(this, eventArgs);
}
}
private object GetValueFromMesage(string parameter,string message)
{
var data = JsonSerializer.Deserialize<Dictionary<string, object>>(message);
object value = null;
data.TryGetValue(parameter, out value);
return value;
}
}
}

@ -0,0 +1,12 @@
namespace RobotLib.DevSplitFlap
{
public class SplitFlapDisplayEventArgs
{
public string DisplayMessage { get; }
public SplitFlapDisplayEventArgs(string displayMessage)
{
DisplayMessage = displayMessage;
}
}
}
Loading…
Cancel
Save