|
@@ -6,8 +6,24 @@
|
|
|
#define UPUBSUB_LISTENER_AMOUNT 64
|
|
|
#endif /* UPUBSUB_LISTENER_AMOUNT */
|
|
|
|
|
|
+#ifdef UPUBSUB_TEST
|
|
|
+
|
|
|
+struct upubsub_test_message_type {
|
|
|
+ char text[64];
|
|
|
+ int x;
|
|
|
+ int y;
|
|
|
+};
|
|
|
+
|
|
|
+#define UPUBSUB_MESSAGE_TYPE struct upubsub_test_message_type
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
#ifndef UPUBSUB_MESSAGE_SIZE
|
|
|
+#ifndef UPUBSUB_MESSAGE_TYPE
|
|
|
#define UPUBSUB_MESSAGE_SIZE 64
|
|
|
+#else
|
|
|
+#define UPUBSUB_MESSAGE_SIZE (sizeof(UPUBSUB_MESSAGE_TYPE))
|
|
|
+#endif
|
|
|
#endif /* UPUBSUB_MESSAGE_SIZE */
|
|
|
|
|
|
#ifndef UPUBSUB_TOPIC_AMOUNT
|
|
@@ -23,12 +39,23 @@ extern "C" {
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
+enum upubsub_message_data_type {
|
|
|
+ upubsub_message_data_type_bytes = 1,
|
|
|
+ upubsub_message_data_type_ptr = 2,
|
|
|
+ upubsub_message_data_type_typed = 3,
|
|
|
+};
|
|
|
+
|
|
|
struct upubsub_message {
|
|
|
const char * topic;
|
|
|
- size_t size;
|
|
|
- uint8_t copy[UPUBSUB_MESSAGE_SIZE];
|
|
|
- int copy_ok;
|
|
|
- void * data;
|
|
|
+ size_t size;
|
|
|
+ enum upubsub_message_data_type data_type;
|
|
|
+ union {
|
|
|
+ uint8_t bytes[UPUBSUB_MESSAGE_SIZE];
|
|
|
+ void * ptr;
|
|
|
+#ifdef UPUBSUB_MESSAGE_TYPE
|
|
|
+ UPUBSUB_MESSAGE_TYPE typed;
|
|
|
+#endif
|
|
|
+ } data;
|
|
|
};
|
|
|
|
|
|
struct upubsub_listener;
|
|
@@ -62,6 +89,9 @@ int upubsub_publish_data(struct upubsub u, const char * topic, void * data, size
|
|
|
int upubsub_publish_str(struct upubsub u, const char * topic, char * str);
|
|
|
int upubsub_unsubscribe_listener(struct upubsub * u, struct upubsub_listener * l);
|
|
|
|
|
|
+#ifdef UPUBSUB_MESSAGE_TYPE
|
|
|
+int upubsub_publish_type(struct upubsub u, const char * topic, UPUBSUB_MESSAGE_TYPE m);
|
|
|
+#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
@@ -211,16 +241,22 @@ int upubsub_publish_message(struct upubsub u, struct upubsub_message m) {
|
|
|
return sent;
|
|
|
}
|
|
|
|
|
|
-int upubsub_publish_data(struct upubsub u, const char * topic, void * data, size_t size) {
|
|
|
- struct upubsub_message m = { 0 };
|
|
|
- m.data = data;
|
|
|
+struct upubsub_message upubsub_message_make(const char * topic, void * data, size_t size) {
|
|
|
+ struct upubsub_message m = { 0 };
|
|
|
m.size = size;
|
|
|
- m.copy_ok = 0;
|
|
|
- if (m.size < UPUBSUB_MESSAGE_SIZE) {
|
|
|
- memcpy(m.copy, data, m.size);
|
|
|
- m.copy_ok = 1;
|
|
|
- }
|
|
|
+ if (m.size <= UPUBSUB_MESSAGE_SIZE) {
|
|
|
+ memcpy(m.data.bytes, data, m.size);
|
|
|
+ m.data_type = upubsub_message_data_type_bytes;
|
|
|
+ } else {
|
|
|
+ m.data.ptr = data;
|
|
|
+ m.data_type = upubsub_message_data_type_ptr;
|
|
|
+ }
|
|
|
m.topic = topic;
|
|
|
+ return m;
|
|
|
+}
|
|
|
+
|
|
|
+int upubsub_publish_data(struct upubsub u, const char * topic, void * data, size_t size) {
|
|
|
+ struct upubsub_message m = upubsub_message_make(topic, data, size);
|
|
|
return upubsub_publish_message(u, m);
|
|
|
}
|
|
|
|
|
@@ -229,6 +265,18 @@ int upubsub_publish_str(struct upubsub u, const char * topic, char * str) {
|
|
|
}
|
|
|
|
|
|
|
|
|
+#ifdef UPUBSUB_MESSAGE_TYPE
|
|
|
+int upubsub_publish_type(struct upubsub u, const char * topic, UPUBSUB_MESSAGE_TYPE mt) {
|
|
|
+ struct upubsub_message m = { 0 };
|
|
|
+ m.size = sizeof(mt);
|
|
|
+ m.data.typed = mt;
|
|
|
+ m.data_type = upubsub_message_data_type_typed;
|
|
|
+ m.topic = topic;
|
|
|
+ return upubsub_publish_message(u, m);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
int upubsub_unsubscribe_listener(struct upubsub * u, struct upubsub_listener * l) {
|
|
|
struct upubsub_listener * found = NULL;
|
|
|
|
|
@@ -258,7 +306,15 @@ int upubsub_unsubscribe(struct upubsub_listener * l) {
|
|
|
#include <stdio.h>
|
|
|
|
|
|
int listen_print_str(struct upubsub_listener *l, struct upubsub_message m) {
|
|
|
- printf("received on topic %s: data %s, %s\n", l->topic, (char*)(l->data), (char *)(m.data));
|
|
|
+ printf("received message on topic %s: data %s, %s\n", l->topic,
|
|
|
+ (char*)(l->data), (char *)(m.data.bytes));
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int listen_print_typed_str(struct upubsub_listener *l, struct upubsub_message m) {
|
|
|
+ printf("received typed message on topic %s: data %s, %s, %d, %d\n", l->topic,
|
|
|
+ (char*)(l->data), (char *)(m.data.typed.text),
|
|
|
+ m.data.typed.x, m.data.typed.y);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -303,8 +359,9 @@ int main(void) {
|
|
|
l[1] = upubsub_subscribe(&pusu, "POWER" , "APP1", listen_print_str);
|
|
|
l[2] = upubsub_subscribe(&pusu, "SYSTEM", "APP2", listen_print_str);
|
|
|
l[3] = upubsub_subscribe(&pusu, "SYSTEM", "WIND", listen_print_str);
|
|
|
- l[2] = upubsub_subscribe(&pusu, "SYSTEM", "APP3", listen_print_str);
|
|
|
- l[3] = upubsub_subscribe(&pusu, "POWER", "APP4", listen_print_str);
|
|
|
+ l[4] = upubsub_subscribe(&pusu, "SYSTEM", "APP3", listen_print_str);
|
|
|
+ l[5] = upubsub_subscribe(&pusu, "POWER" , "APP4", listen_print_str);
|
|
|
+ l[6] = upubsub_subscribe(&pusu, "TYPED" , "APP5", listen_print_typed_str);
|
|
|
|
|
|
|
|
|
printf("Publishing...\n");
|
|
@@ -313,6 +370,13 @@ int main(void) {
|
|
|
upubsub_publish_str(pusu, "SYSTEM", "CLICK(7,8)");
|
|
|
upubsub_publish_str(pusu, "SYSTEM", "ROLL(9,5)");
|
|
|
upubsub_publish_str(pusu, "NULL", "IGNORE");
|
|
|
+ {
|
|
|
+ UPUBSUB_MESSAGE_TYPE typed = {0};
|
|
|
+ strcpy(typed.text, "TYPED");
|
|
|
+ typed.x = 10;
|
|
|
+ typed.y = 20;
|
|
|
+ upubsub_publish_type(pusu, "TYPED", typed);
|
|
|
+ }
|
|
|
|
|
|
printf("Removing topics...\n");
|
|
|
upubsub_unsubscribe(l[1]);
|
|
@@ -324,6 +388,13 @@ int main(void) {
|
|
|
upubsub_publish_str(pusu, "SYSTEM", "CLICK(7,8) 2");
|
|
|
upubsub_publish_str(pusu, "SYSTEM", "ROLL(9,5) 2");
|
|
|
upubsub_publish_str(pusu, "NULL", "IGNORE");
|
|
|
+ {
|
|
|
+ UPUBSUB_MESSAGE_TYPE typed = {0};
|
|
|
+ strcpy(typed.text, "TYPED");
|
|
|
+ typed.x = 30;
|
|
|
+ typed.y = 40;
|
|
|
+ upubsub_publish_type(pusu, "TYPED", typed);
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|