Eric Micallef
/
smat_controller
541 smart traffic controller
mqtt.h@2:f10d6fecb345, 2019-12-06 (annotated)
- 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?
User | Revision | Line number | New 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 |