niMQTT
Dependencies: EthernetInterface mbed-rtos
Fork of niMQTT by
Revision 9:3be69efa4402, committed 2014-03-03
- 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 |
--- 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;
--- 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);