diff --git a/master/master.ino b/master/master.ino index e64ac66..24d992c 100644 --- a/master/master.ino +++ b/master/master.ino @@ -1,4 +1,7 @@ #include +#include +#include +#include "config.h" #define READ_BYTES_FROM_WIRE 1 @@ -9,6 +12,17 @@ #define ALTITUDE_TRIGGER_BIT 4 #define ALTITUDE_HIGH_BIT 8 +#define HEADING_SIM_UP "sim/autopilot/heading_up" +#define HEADING_SIM_DOWN "sim/autopilot/heading_down" +// XXX: double check altitude values +#define ALTITUDE_SIM_UP "sim/autopilot/altitude_up" +#define ALTITUDE_SIM_DOWN "sim/autopilot/altitude_down" +#define AIRPSEED_SIM_UP "sim/autopilot/airspeed_up" +#define AIRSPEED_SIM_DOWN "sim/autopilot/airspeed_down" + +#define MQTT_SIM_COMMAND_TOPIC "/xplane/meta/cmnd" +#define MQTT_SIM_VALUE_TOPIC "/xplane/rref/#" + struct device { byte address; String name; @@ -20,11 +34,72 @@ struct device devices[] = { int numDevices = -1; +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + +const char broker[] = "openhab.sugarland.lan"; +int port = 1883; +const char topic[] = MQTT_SIM_VALUE_TOPIC; + +EthernetClient client; +MqttClient mqttClient(client); + +void onMqttMessage(int messageSize) { +// // we received a message, print out the topic and contents +// Serial.println("Received a message with topic '"); +// Serial.print(mqttClient.messageTopic()); +// Serial.print("', length "); +// Serial.print(messageSize); +// Serial.println(" bytes:"); +// +// // use the Stream interface to print the contents +// while (mqttClient.available()) { +// Serial.print((char)mqttClient.read()); +// } +// Serial.println(); +// +// Serial.println(); +} + +void sendMqttMessage(char *topic, char *message) { + mqttClient.beginMessage(topic); + mqttClient.print(message); + mqttClient.endMessage(); +} + void setup() { + // count devices for loop numDevices = sizeof(devices) / sizeof(device); - + + // start the Ethernet connection: + if (Ethernet.begin(mac) == 0) { + Serial.println("Failed to configure Ethernet using DHCP"); + // no point in carrying on, so do nothing forevermore: + while (1); + } + // print your local IP address: + Serial.println(Ethernet.localIP()); + + // MQTT auth + mqttClient.setUsernamePassword(MQTT_USER, MQTT_PASS); + + // MQTT connection + if (!mqttClient.connect(broker, port)) { + Serial.print("MQTT connection failed! Error code = "); + Serial.println(mqttClient.connectError()); + + while (1); + } else { + Serial.println("MQTT connected"); + } + + // subscribe to MQTT topic + mqttClient.onMessage(onMqttMessage); + mqttClient.subscribe(topic); + + // start I2C Wire.begin(); + // for debugging pinMode(LED_TX, OUTPUT); digitalWrite(LED_TX, HIGH); pinMode(LED_RX, OUTPUT); @@ -42,15 +117,15 @@ void loop() { if (data != DATA_STOP_BYTE) { if (data & ALTITUDE_TRIGGER_BIT) { if (data & ALTITUDE_HIGH_BIT) { - Serial.println("Altitude up"); + sendMqttMessage(MQTT_SIM_COMMAND_TOPIC, ALTITUDE_SIM_UP); } else { - Serial.println("Altitude down"); + sendMqttMessage(MQTT_SIM_COMMAND_TOPIC, ALTITUDE_SIM_DOWN); } } else if (data & HEADING_TRIGGER_BIT) { if (data & HEADING_HIGH_BIT) { - Serial.println("Heading right"); + sendMqttMessage(MQTT_SIM_COMMAND_TOPIC, HEADING_SIM_UP); } else { - Serial.println("Heading left"); + sendMqttMessage(MQTT_SIM_COMMAND_TOPIC, HEADING_SIM_DOWN); } } else { // who are you?