Using MQTT on Dragonfly

Dependencies:   MQTT mbed mtsas

Revision:
5:ded8fe5991a2
Parent:
3:0a48c984e15b
Child:
6:4a25f3b9caef
--- a/main.cpp	Fri Aug 18 08:40:35 2017 +0000
+++ b/main.cpp	Tue Sep 05 15:00:17 2017 +0000
@@ -1,4 +1,5 @@
 #include "MTSCellularManager.hpp"
+#include "TripDataReader.hpp"
 #include "TlsMQTTClient.hpp"
 #include "Certificates.h"
 #include "config.hpp"
@@ -10,15 +11,27 @@
 // BC_NCE = 0 enables the battery charger
 // BC_NCE = 1 disables the battery charger
 DigitalOut bc_nce(PB_2);
+
 DigitalOut ledMQTTYield(D5);
+
 DigitalOut ledGPS(D8);
 
-static const int VEHICLE_DATA_POLLING_PERIOD_MS = 5000;
+MTSSerial obd(D1, D0);
+DigitalOut ledOBD(D6);
+
+static const int VEHICLE_DATA_SAMPLING_PERIOD_MS = 50;
+static Ticker vehicleDataSamplingTicker;
+static TripDataReader* pTripDataReader = NULL;
+static void vehicleDataSamplingCallback();
+
+static const int VEHICLE_DATA_REPORTING_PERIOD_MS = 3000;
 
 static bool exitCmd = false;
 
-static void sendVehicleData(MTSCellularManager::GPSStatus& gpsStatus);
-static void test2Handler(MQTT::MessageData& data);
+static void sendVehicleData(const MTSCellularManager::GPSStatus& gpsStatus,
+                            const TripDataReader::TripData& tripData);
+
+//static void test2Handler(MQTT::MessageData& data);
 
 int main() {
     // Disable the battery charger unless a battery is attached.
@@ -52,18 +65,37 @@
         logInfo("GPS Initialized");
     }
 
+    TripDataReader tripDataReader(obd, ledOBD);
+    pTripDataReader = &tripDataReader;
+    while (true) {
+        logInfo("Initializing OBD");
+        int r = tripDataReader.init();
+        logInfo("OBD Initialization result: %d", r);
+        if (0 == r) {
+            logInfo("Initializing OBD sampling ticker");
+            vehicleDataSamplingTicker.attach(
+                        &vehicleDataSamplingCallback,
+                        VEHICLE_DATA_SAMPLING_PERIOD_MS / 1000.);
+            logInfo("OBD sampling ticker initialized");
+            break;
+        }
+        wait_ms(100);
+    }
+
     logInfo("Initializing CyaSSL");
     CyaSSL_Init();
 
     while (!exitCmd) {
+        wait_ms(VEHICLE_DATA_REPORTING_PERIOD_MS);
+        TripDataReader::TripData tripData = tripDataReader.getTripData();
+        tripDataReader.resetAverageWindow();
         MTSCellularManager::GPSStatus gpsStatus = cellularManager.gpsPollStatus();
         if (gpsStatus.success) {
             ledGPS = 0;
-            sendVehicleData(gpsStatus);
+            sendVehicleData(gpsStatus, tripData);
         } else {
             ledGPS = 1;
         }
-        wait_ms(VEHICLE_DATA_POLLING_PERIOD_MS);
     }
 
     logInfo("Cleaning up CyaSSL");
@@ -77,7 +109,12 @@
     return 0;
 }
 
-static void sendVehicleData(MTSCellularManager::GPSStatus& gpsStatus) {
+static void vehicleDataSamplingCallback() {
+    pTripDataReader->sample();
+}
+
+static void sendVehicleData(const MTSCellularManager::GPSStatus& gpsStatus,
+                            const TripDataReader::TripData& tripData) {
     ledMQTTYield = 0;
 
     logInfo("Connecting MQTT Client");
@@ -94,19 +131,27 @@
         logInfo("MQTT connected");
 
         sprintf(buf, "{"
-            "\"driver_id\": 1,"
-            "\"runtime\": 10,"
-            "\"miles\": 10,"
+            "\"driver_id\": %s,"
+            "\"runtime\": %d,"
+            "\"miles\": %d,"
             "\"speed\": %f,"
-            "\"minT\": 40,"
-            "\"maxT\": 60,"
-            "\"avgT\": 50,"
-            "\"fuel\": 50,"
-            "\"brake\": 0,"
+            "\"minT\": %f,"
+            "\"maxT\": %f,"
+            "\"avgT\": %f,"
+            "\"fuel\": %d,"
+            "\"brake\": %d,"
             "\"lat\": %lf,"
             "\"lon\": %lf"
             "}",
-                gpsStatus.speedVal,
+                VEHICLE_ID,
+                tripData.runtime,
+                tripData.distance,
+                tripData.averageSpeed,
+                tripData.minimumThrottle,
+                tripData.maximumThrottle,
+                tripData.averageThrottle,
+                tripData.fuel,
+                tripData.hardBrakeCount,
                 gpsStatus.latitudeVal,
                 gpsStatus.longitudeVal);
         message.qos = MQTT::QOS1;