|
|
|
@ -2,22 +2,22 @@ |
|
|
|
using System.Text; |
|
|
|
using System.Text; |
|
|
|
using M2Mqtt; |
|
|
|
using M2Mqtt; |
|
|
|
using M2Mqtt.Messages; |
|
|
|
using M2Mqtt.Messages; |
|
|
|
using Swan.Formatters; |
|
|
|
using System.Text.Json; |
|
|
|
|
|
|
|
using System.Linq; |
|
|
|
|
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
|
|
|
|
|
|
|
|
namespace RaspiControl { |
|
|
|
namespace RaspiControl { |
|
|
|
class Programm { |
|
|
|
class Programm { |
|
|
|
private static MqttClient client; |
|
|
|
private static MqttClient client; |
|
|
|
private static Navigation navigation; |
|
|
|
|
|
|
|
private static Joystick joystick; |
|
|
|
|
|
|
|
static void Main(string[] args) { |
|
|
|
static void Main(string[] args) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
client = new MqttClient("localhost"); |
|
|
|
client = new MqttClient("localhost"); |
|
|
|
client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived; |
|
|
|
client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived; |
|
|
|
string clientId = Guid.NewGuid().ToString(); |
|
|
|
string clientId = Guid.NewGuid().ToString(); |
|
|
|
client.Connect(clientId); |
|
|
|
client.Connect(clientId); |
|
|
|
client.Subscribe(new string[] { "APROG/REQUEST" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE }); |
|
|
|
client.Subscribe(new string[] { MqttConstants.DEVICE_STATUS_APP_TOPIC }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE }); |
|
|
|
navigation= new Navigation(); |
|
|
|
Joystick joystick = new Joystick(); |
|
|
|
joystick= new Joystick(); |
|
|
|
|
|
|
|
joystick.JoystickChanged += Joystick_JoystickChanged; |
|
|
|
joystick.JoystickChanged += Joystick_JoystickChanged; |
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception ex) { |
|
|
|
} catch (Exception ex) { |
|
|
|
@ -30,25 +30,81 @@ namespace RaspiControl { |
|
|
|
case JoystickButton.None: |
|
|
|
case JoystickButton.None: |
|
|
|
break; |
|
|
|
break; |
|
|
|
case JoystickButton.Left: |
|
|
|
case JoystickButton.Left: |
|
|
|
client.Publish("mobile/cmd/nav/left", Encoding.UTF8.GetBytes($"{navigation.GetAngleLeftStep()}"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); |
|
|
|
client.Publish(MqttConstants.MOBILE_NAV_TURN_TOPIC, Encoding.UTF8.GetBytes($"{NavigationConstants.TURN_ANGLE_LEFT}"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case JoystickButton.Right: |
|
|
|
case JoystickButton.Right: |
|
|
|
client.Publish("mobile/cmd/nav/right", Encoding.UTF8.GetBytes($"{navigation.GetAngleRightStep()}"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); |
|
|
|
client.Publish(MqttConstants.MOBILE_NAV_TURN_TOPIC, Encoding.UTF8.GetBytes($"{NavigationConstants.TURN_ANGLE_RIGHT}"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case JoystickButton.Up: |
|
|
|
case JoystickButton.Up: |
|
|
|
|
|
|
|
client.Publish(MqttConstants.MOBILE_NAV_MOVE_TOPIC, Encoding.UTF8.GetBytes($"{NavigationConstants.SPEED_FORWARD}"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case JoystickButton.Down: |
|
|
|
case JoystickButton.Down: |
|
|
|
|
|
|
|
client.Publish(MqttConstants.MOBILE_NAV_MOVE_TOPIC, Encoding.UTF8.GetBytes($"{NavigationConstants.SPEED_BACKWARD}"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case JoystickButton.Center: |
|
|
|
case JoystickButton.Center: |
|
|
|
navigation.ResetAngle(); |
|
|
|
client.Publish(MqttConstants.MOBILE_NAV_STOP_TOPIC, Encoding.UTF8.GetBytes($"{NavigationConstants.STOP}"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false); |
|
|
|
client.Publish("mobile/cmd/nav/drive", Encoding.UTF8.GetBytes("true"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); |
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static void PublishSplitFlapDisplay(string message) { |
|
|
|
|
|
|
|
string payload = JsonSerializer.Serialize<Dictionary<string, string>>(new Dictionary<string, string>() { { "message", message } }); |
|
|
|
|
|
|
|
client.Publish(MqttConstants.SPLITFLAP_DISPLAY, Encoding.UTF8.GetBytes(payload),MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE,false); |
|
|
|
|
|
|
|
} |
|
|
|
private static void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { |
|
|
|
private static void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { |
|
|
|
Console.Write(e.Topic + "\n"); |
|
|
|
string deviceId = ""; |
|
|
|
Console.Write(Encoding.UTF8.GetString(e.Message) + "\n"); |
|
|
|
Dictionary<string, object> data; |
|
|
|
|
|
|
|
if (e.Topic.StartsWith(string.Join('/',MqttConstants.DEVICE_STATUS_APP_TOPIC.Split('/').Take(2)))) { |
|
|
|
|
|
|
|
if(e.Topic.EndsWith(MqttConstants.DEVICE_STATUS_APP_TOPIC.Split('/').Last())) { |
|
|
|
|
|
|
|
deviceId = deviceIdFromStatusTopic(e.Topic); |
|
|
|
|
|
|
|
if(deviceId == "mobile") { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
data = getValueFromTopic(Encoding.UTF8.GetString(e.Message)); |
|
|
|
|
|
|
|
object value; |
|
|
|
|
|
|
|
data.TryGetValue("state", out value); |
|
|
|
|
|
|
|
if (value != null) { |
|
|
|
|
|
|
|
APP_STATE appState = (APP_STATE)Convert.ToUInt16(value.ToString()); |
|
|
|
|
|
|
|
switch (appState) { |
|
|
|
|
|
|
|
case APP_STATE.STARTUP: |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case APP_STATE.INIT: |
|
|
|
|
|
|
|
PublishSplitFlapDisplay("INIT"); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case APP_STATE.CALIBRATE: |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case APP_STATE.FOLLOW_LINE: |
|
|
|
|
|
|
|
PublishSplitFlapDisplay("AUTO"); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case APP_STATE.IDLE: |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case APP_STATE.FINAL: |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case APP_STATE.READY: |
|
|
|
|
|
|
|
PublishSplitFlapDisplay("REDY"); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
throw new ArgumentException(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} catch(Exception) { |
|
|
|
|
|
|
|
Console.WriteLine($"Invalid payload received: {Encoding.UTF8.GetString(e.Message)}"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
Console.WriteLine($"on topic: {e.Topic} no key with state found! | {Encoding.UTF8.GetString(e.Message)}"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static string deviceIdFromStatusTopic(string statusTopic) { |
|
|
|
|
|
|
|
string[] topic = statusTopic.Split('/'); |
|
|
|
|
|
|
|
return topic[topic.Length - 2]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static Dictionary<string, object> getValueFromTopic(string topic) { |
|
|
|
|
|
|
|
return JsonSerializer.Deserialize<Dictionary<string, object>>(topic); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |