niMQTT

Dependencies:   EthernetInterface mbed-rtos

Fork of niMQTT by Guilhem Saurel

Files at this revision

API Documentation at this revision

Comitter:
Palantir
Date:
Mon Mar 03 14:53:08 2014 +0000
Parent:
8:438958bb9df3
Commit message:
Add second thread, so we don't block

Changed in this revision

niMQTT.cpp Show annotated file Show diff for this revision Revisions of this file
niMQTT.h Show annotated file Show diff for this revision Revisions of this file
diff -r 438958bb9df3 -r 3be69efa4402 niMQTT.cpp
--- a/niMQTT.cpp	Tue Aug 13 13:36:05 2013 +0000
+++ b/niMQTT.cpp	Mon Mar 03 14:53:08 2014 +0000
@@ -1,9 +1,15 @@
 #include "niMQTT.h"
 
-niMQTT::niMQTT(char *server, void (*callback)(const char*, const char*), char *id, int port, char *username, char *password, bool debug):
-    server(server), port(port), id(id), callback(callback), username(username), password(password),
-    debug(debug), connected(true), message_id(0), thread(&niMQTT::thread_starter, this),
-    waiting_new_packet(true), packet_sent(false), waiting_connack(0), waiting_suback(0), waiting_pingresp(0) {
+niMQTT::niMQTT(char *server, void (*callback)(const char*, const char*), 
+    char *id, int port, char *username, char *password, bool debug):
+    server(server), port(port), id(id), callback(callback), username(username), 
+    password(password),
+    debug(debug), connected(true), message_id(0), 
+    ping_thread(&niMQTT::ping_thread_starter, this),
+    recv_thread(&niMQTT::recv_thread_starter, this),
+    waiting_new_packet(true), packet_sent(false), waiting_connack(0), 
+    waiting_suback(0), waiting_pingresp(0) 
+{
     init();
 }
 
@@ -15,7 +21,8 @@
 
     printf("Socket connected.\r\n");
 
-    thread.signal_set(START_THREAD);
+    ping_thread.signal_set(START_THREAD);
+    recv_thread.signal_set(START_THREAD);
 
     return connect();
 }
@@ -331,23 +338,37 @@
     connect();
 }
 
-void niMQTT::thread_starter(void const *p) {
+void niMQTT::ping_thread_starter(void const *p) {
     niMQTT *instance = (niMQTT*)p;
-    instance->thread_worker();
+    instance->ping_thread_worker();
+}
+
+void niMQTT::recv_thread_starter(void const *p) {
+    niMQTT *instance = (niMQTT*)p;
+    instance->recv_thread_worker();
 }
 
-void niMQTT::thread_worker() {
-    if (debug) printf("*thread_worker\r\n");
-    thread.signal_wait(START_THREAD);
+void niMQTT::ping_thread_worker() {
+    if (debug) printf("*ping_thread_worker\r\n");
+    ping_thread.signal_wait(START_THREAD);
     while (connected) {
-        if (debug) printf("New loop in thread worker\r\n");
-        recv();
+        if (debug) printf("New loop in ping thread worker\r\n");
         Thread::wait(KEEP_ALIVE*100); // KEEP_ALIVE / 10 in seconds
         if (!packet_sent) pingreq();
         packet_sent = false;
     }
 }
 
+void niMQTT::recv_thread_worker() {
+    if (debug) printf("*recv_thread_worker\r\n");
+    recv_thread.signal_wait(START_THREAD);
+    while (connected) {
+        if (debug) printf("New loop in recv thread worker\r\n");
+        recv();
+        packet_sent = false;
+    }
+}
+
 void niMQTT::get_remaining_length(int remaining_length, char *packet) {
     int X = remaining_length;
     int n = 1;
diff -r 438958bb9df3 -r 3be69efa4402 niMQTT.h
--- a/niMQTT.h	Tue Aug 13 13:36:05 2013 +0000
+++ b/niMQTT.h	Mon Mar 03 14:53:08 2014 +0000
@@ -111,9 +111,12 @@
         int pingresp();
         int disconnect();
 
-        static void thread_starter(void const *p);
-        void thread_worker();
-        Thread thread;
+        static void ping_thread_starter(void const *p);
+        static void recv_thread_starter(void const *p);
+        void ping_thread_worker();
+        void recv_thread_worker();
+        Thread ping_thread;
+        Thread recv_thread;
 
         void publish_received();
         virtual void call_callback(const char *topic, const char *message);