niMQTT

Dependencies:   EthernetInterface mbed-rtos

Fork of niMQTT by Guilhem Saurel

Revision:
9:3be69efa4402
Parent:
8:438958bb9df3
--- 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;