541 smart traffic controller

Dependencies:   MQTT

Committer:
micallef25
Date:
Fri Dec 06 15:47:37 2019 +0000
Revision:
2:f10d6fecb345
basic communication with mqtt and car threads

Who changed what in which revision?

UserRevisionLine numberNew contents of line
micallef25 2:f10d6fecb345 1 #ifndef _MQTT_H_
micallef25 2:f10d6fecb345 2 #define _MQTT_H_
micallef25 2:f10d6fecb345 3
micallef25 2:f10d6fecb345 4 #include "mbed.h"
micallef25 2:f10d6fecb345 5 #include "MQTTNetwork.h"
micallef25 2:f10d6fecb345 6 #include "MQTTClient.h"
micallef25 2:f10d6fecb345 7 #include "MQTTmbed.h"
micallef25 2:f10d6fecb345 8 #include <assert.h>
micallef25 2:f10d6fecb345 9
micallef25 2:f10d6fecb345 10 #define MAX_CARS_ON_ROAD 5
micallef25 2:f10d6fecb345 11
micallef25 2:f10d6fecb345 12 enum drive_state_t{
micallef25 2:f10d6fecb345 13 NORMAL_STATE = 0,
micallef25 2:f10d6fecb345 14 STOPPED_STATE,
micallef25 2:f10d6fecb345 15 CROSSING_STATE
micallef25 2:f10d6fecb345 16 };
micallef25 2:f10d6fecb345 17
micallef25 2:f10d6fecb345 18 typedef struct position_msg{
micallef25 2:f10d6fecb345 19 int position;
micallef25 2:f10d6fecb345 20 int speed;
micallef25 2:f10d6fecb345 21 int car_id;
micallef25 2:f10d6fecb345 22 int road_id;
micallef25 2:f10d6fecb345 23 int counter; // for debugging and ensuring everyone is synchronized
micallef25 2:f10d6fecb345 24 drive_state_t state; // for debugging
micallef25 2:f10d6fecb345 25 }position_msg_t;
micallef25 2:f10d6fecb345 26
micallef25 2:f10d6fecb345 27
micallef25 2:f10d6fecb345 28 typedef struct control_msg{
micallef25 2:f10d6fecb345 29 int speed;
micallef25 2:f10d6fecb345 30 int car_id;
micallef25 2:f10d6fecb345 31 int road_id;
micallef25 2:f10d6fecb345 32 int counter; // for debugging synchronization
micallef25 2:f10d6fecb345 33 }control_msg_t;
micallef25 2:f10d6fecb345 34
micallef25 2:f10d6fecb345 35
micallef25 2:f10d6fecb345 36 class mqtt{
micallef25 2:f10d6fecb345 37
micallef25 2:f10d6fecb345 38 private:
micallef25 2:f10d6fecb345 39 // static functions for control message callbacks
micallef25 2:f10d6fecb345 40 static void control_message_arrived(MQTT::MessageData& md);
micallef25 2:f10d6fecb345 41
micallef25 2:f10d6fecb345 42 // functions for creatin of mqtt and wifi bring up
micallef25 2:f10d6fecb345 43 WiFiInterface* setup_wifi();
micallef25 2:f10d6fecb345 44 int send_position_msg(position_msg_t* msg);
micallef25 2:f10d6fecb345 45 void manage_network();
micallef25 2:f10d6fecb345 46 void bringup_network();
micallef25 2:f10d6fecb345 47
micallef25 2:f10d6fecb345 48 // data structures needed for creation of network
micallef25 2:f10d6fecb345 49 MQTT::Client<MQTTNetwork, Countdown>* client;
micallef25 2:f10d6fecb345 50 MQTT::Client<MQTTNetwork, Countdown>* setup_mqtt(MQTTNetwork& network);
micallef25 2:f10d6fecb345 51 MQTTNetwork* new_network;
micallef25 2:f10d6fecb345 52
micallef25 2:f10d6fecb345 53 // thread that will manage the mqtt network status
micallef25 2:f10d6fecb345 54 Thread* thread;
micallef25 2:f10d6fecb345 55
micallef25 2:f10d6fecb345 56 // queue for sending position msessages
micallef25 2:f10d6fecb345 57 Queue<position_msg_t, 16> position_queue;
micallef25 2:f10d6fecb345 58
micallef25 2:f10d6fecb345 59 // queue for control message passsing between mqtt and car threads
micallef25 2:f10d6fecb345 60 Queue<control_msg_t, 1> control_queue[MAX_CARS_ON_ROAD];
micallef25 2:f10d6fecb345 61
micallef25 2:f10d6fecb345 62
micallef25 2:f10d6fecb345 63 public:
micallef25 2:f10d6fecb345 64 // singleton instance for managing network
micallef25 2:f10d6fecb345 65 // we can only have one network so this should prohibit accidental
micallef25 2:f10d6fecb345 66 // creations of multiple objects
micallef25 2:f10d6fecb345 67 static mqtt* mqtt_singleton;
micallef25 2:f10d6fecb345 68
micallef25 2:f10d6fecb345 69 //
micallef25 2:f10d6fecb345 70 int mqtt_id;
micallef25 2:f10d6fecb345 71
micallef25 2:f10d6fecb345 72 // empty constructor
micallef25 2:f10d6fecb345 73 mqtt();
micallef25 2:f10d6fecb345 74
micallef25 2:f10d6fecb345 75 // setup and tear down API's
micallef25 2:f10d6fecb345 76 void setup_network();
micallef25 2:f10d6fecb345 77 int shutdown_network();
micallef25 2:f10d6fecb345 78
micallef25 2:f10d6fecb345 79
micallef25 2:f10d6fecb345 80 static mqtt *instance()
micallef25 2:f10d6fecb345 81 {
micallef25 2:f10d6fecb345 82 if (!mqtt_singleton)
micallef25 2:f10d6fecb345 83 mqtt_singleton = new mqtt;
micallef25 2:f10d6fecb345 84 return mqtt_singleton;
micallef25 2:f10d6fecb345 85 }
micallef25 2:f10d6fecb345 86
micallef25 2:f10d6fecb345 87 // adding to a queue to be sent on mqtt network
micallef25 2:f10d6fecb345 88 inline void add_to_position_queue(position_msg_t* msg)
micallef25 2:f10d6fecb345 89 {
micallef25 2:f10d6fecb345 90 position_queue.put(msg);
micallef25 2:f10d6fecb345 91 }
micallef25 2:f10d6fecb345 92
micallef25 2:f10d6fecb345 93 // adding to a queue to be sent on mqtt network
micallef25 2:f10d6fecb345 94 inline void add_to_control_queue(int car_id,control_msg_t* msg)
micallef25 2:f10d6fecb345 95 {
micallef25 2:f10d6fecb345 96 control_queue[car_id].put(msg);
micallef25 2:f10d6fecb345 97 }
micallef25 2:f10d6fecb345 98
micallef25 2:f10d6fecb345 99 // adding to a queue to be sent on mqtt network
micallef25 2:f10d6fecb345 100 inline control_msg_t* get_control_msg(int car_id)
micallef25 2:f10d6fecb345 101 {
micallef25 2:f10d6fecb345 102 osEvent evt = control_queue[car_id].get();
micallef25 2:f10d6fecb345 103 assert(evt.status == osEventMessage);
micallef25 2:f10d6fecb345 104 control_msg_t *message = (control_msg_t*)evt.value.p;
micallef25 2:f10d6fecb345 105 return message;
micallef25 2:f10d6fecb345 106 }
micallef25 2:f10d6fecb345 107
micallef25 2:f10d6fecb345 108 };
micallef25 2:f10d6fecb345 109
micallef25 2:f10d6fecb345 110
micallef25 2:f10d6fecb345 111 #endif