using RobotLib.Communication; using RobotLib.SplitFlap; using System; using System.Collections.Generic; using System.Text.Json; namespace RobotLib.Movement { public class DevLineSensor : DevBase { private const string TOPIC_ROBO_CALIB_CMD = "/mobile/cmd/line_sens/calib"; private const string TOPIC_ROBO_GET_CALIB = "/mobile/cmd/line_sens/get_calib"; private const string TOPIC_ROBO_CALIB_STATE = "/mobile/state/line_sens/calib_data"; public event EventHandler NewCalibrationDataArrived; public DevLineSensor(IPublisherSubscriber com) : base(com, new List() { TOPIC_ROBO_CALIB_STATE }) { } public void GetCalibrationData() { base.SendMessage(TOPIC_ROBO_GET_CALIB, true.ToString()); } public void StartCalibration(bool start) { string payload = JsonSerializer.Serialize(new Dictionary() { { "start", start } }); base.SendMessage(TOPIC_ROBO_CALIB_CMD, payload); } protected override void ParseMessage(string fromTopic, string message) { if (fromTopic == TOPIC_ROBO_CALIB_STATE) { var parsedState = GetValueFromMesage("state", message); var parsedValues = GetValueFromMesage("data", message); if (parsedState == null) parsedState = "?"; if (parsedValues == null) parsedValues = "?"; LineSensorCalibrationDataEventArgs eventArgs = new(parsedState, parsedValues); NewCalibrationDataArrived?.Invoke(this, eventArgs); } } private T GetValueFromMesage(string parameter, string message) { var data = JsonSerializer.Deserialize>(message); data.TryGetValue(parameter, out T value); return value; } } }