using RobotLib.Communication; using System; using System.Collections.Generic; using System.Text.Json; namespace RobotLib.Battery { public class DevBattery : DevBase { private float voltage; private const string TOPIC_ROBO_REQ_BATTERY = "/mobile/cmd/battery/get_volt"; private const string TOPIC_ROBO_RESP_BATTERY = "/mobile/state/battery/voltage"; public event EventHandler BatteryChanged; public float Voltage { get { return voltage; } private set { // value changed? if (voltage != value) { // set new voltage and raise event voltage = value; BatteryChanged?.Invoke(this, new BatteryEventArgs(voltage)); } } } public DevBattery(IPublisherSubscriber com) : base(com, new List() { TOPIC_ROBO_RESP_BATTERY }) { } public override void Refresh() { this.RequestBatteryVoltage(); } public void RequestBatteryVoltage() { base.SendMessage(TOPIC_ROBO_REQ_BATTERY, true.ToString()); } protected override void ParseMessage(string fromTopic, string message) { if (fromTopic == TOPIC_ROBO_RESP_BATTERY) { var parsedString = GetValueFromMesage("voltage", message); if (parsedString == null) parsedString = "?"; // example message = "Battery: 1.25 V" var valueUnit = parsedString.Trim().Split(' '); string voltage = valueUnit[0].Trim(); float fVoltage = float.NaN; if(float.TryParse(voltage, out fVoltage)) { this.Voltage = fVoltage; } } } private T GetValueFromMesage(string parameter, string message) { var data = JsonSerializer.Deserialize>(message); data.TryGetValue(parameter, out T value); return value; } } }