|
@@ -6,10 +6,21 @@
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/queue.h"
|
|
#include "freertos/queue.h"
|
|
#include "freertos/task.h"
|
|
#include "freertos/task.h"
|
|
|
|
+#include <stdio.h>
|
|
|
|
|
|
#define UPUBSUB_IMPLEMENTATION
|
|
#define UPUBSUB_IMPLEMENTATION
|
|
#include "upubsub.h"
|
|
#include "upubsub.h"
|
|
|
|
|
|
|
|
+#ifndef TWALI_TASK_QUEUE_SIZE
|
|
|
|
+#define TWALI_TASK_QUEUE_SIZE 32
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#ifndef TWALI_TASK_TOPICS_COUNT
|
|
|
|
+#define TWALI_TASK_TOPICS_COUNT 32
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
struct twali_task {
|
|
struct twali_task {
|
|
struct twali_system * system;
|
|
struct twali_system * system;
|
|
struct twali_task * parent;
|
|
struct twali_task * parent;
|
|
@@ -19,18 +30,33 @@ struct twali_task {
|
|
void * data;
|
|
void * data;
|
|
int low_power_delay;
|
|
int low_power_delay;
|
|
int delay;
|
|
int delay;
|
|
|
|
+ int done;
|
|
|
|
+ void (*message)(struct twali_task *t, struct upubsub_message m);
|
|
void (*update)(struct twali_task *t);
|
|
void (*update)(struct twali_task *t);
|
|
|
|
+ const char * topics[TWALI_TASK_TOPICS_COUNT];
|
|
|
|
+ struct upubsub_listener * listeners[TWALI_TASK_TOPICS_COUNT];
|
|
};
|
|
};
|
|
|
|
|
|
void twali_task_task(void * object) {
|
|
void twali_task_task(void * object) {
|
|
struct twali_task * t = object;
|
|
struct twali_task * t = object;
|
|
struct twali_power * p = twali_system_power(t->system);
|
|
struct twali_power * p = twali_system_power(t->system);
|
|
|
|
|
|
- for (;;) {
|
|
+ do {
|
|
|
|
+ struct upubsub_message mesg;
|
|
|
|
|
|
bool update_display = false;
|
|
bool update_display = false;
|
|
unsigned int delay_time = 0;
|
|
unsigned int delay_time = 0;
|
|
*/
|
|
*/
|
|
|
|
+
|
|
|
|
+ if( xQueueReceive(t->queue,
|
|
|
|
+ &(mesg),
|
|
|
|
+ ( TickType_t ) 10 ) == pdPASS ) {
|
|
|
|
+ if (t->message) {
|
|
|
|
+ t->message(t, mesg);
|
|
|
|
+ } else {
|
|
|
|
+ printf("Task %s received message topic %s\n", t->name, mesg.topic);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if (twali_power_low(p) && (t->low_power_delay > 0)) {
|
|
if (twali_power_low(p) && (t->low_power_delay > 0)) {
|
|
vTaskDelay(t->low_power_delay / portTICK_PERIOD_MS);
|
|
vTaskDelay(t->low_power_delay / portTICK_PERIOD_MS);
|
|
@@ -42,15 +68,61 @@ void twali_task_task(void * object) {
|
|
t->update(t);
|
|
t->update(t);
|
|
}
|
|
}
|
|
vTaskDelay(t->delay / portTICK_PERIOD_MS);
|
|
vTaskDelay(t->delay / portTICK_PERIOD_MS);
|
|
- }
|
|
+ } while (!t->done);
|
|
- printf("deleting task %s\n", t->name);
|
|
+ twali_task_stop(t);
|
|
- vTaskDelete(NULL);
|
|
+}
|
|
|
|
+
|
|
|
|
+int task_upubsub_listen_func(struct upubsub_listener *l, struct upubsub_message m) {
|
|
|
|
+ struct twali_task *t = l->data;
|
|
|
|
+ return (int)xQueueSend(t->queue, &m, 0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct upubsub_listener * twali_task_subscribe_topic(struct twali_task * t, const char * topic) {
|
|
|
|
+ return twali_system_subscribe_listener(t->system, topic, t, task_upubsub_listen_func);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int twali_task_subscribe_all_topics(struct twali_task *t) {
|
|
|
|
+ int i;
|
|
|
|
+ if (!t->system) {
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ for (i = 0; i < TWALI_TASK_TOPICS_COUNT; i++) {
|
|
|
|
+ const char * topic = t->topics[i];
|
|
|
|
+ if (topic) {
|
|
|
|
+ t->listeners[i] = twali_task_subscribe_topic(t, topic);
|
|
|
|
+ } else {
|
|
|
|
+ t->listeners[i] = NULL;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
int twali_task_start(struct twali_task * t, int priority) {
|
|
int twali_task_start(struct twali_task * t, int priority) {
|
|
BaseType_t res;
|
|
BaseType_t res;
|
|
res = xTaskCreate(twali_task_task, t->name, 10000, (void *) t, priority, &t->task);
|
|
res = xTaskCreate(twali_task_task, t->name, 10000, (void *) t, priority, &t->task);
|
|
- return res == pdPASS;
|
|
+ t->queue = xQueueCreate( (UBaseType_t) TWALI_TASK_QUEUE_SIZE,
|
|
|
|
+ (UBaseType_t) sizeof(struct upubsub_message));
|
|
|
|
+
|
|
|
|
+ t->system = twali_system_singleton_pointer;
|
|
|
|
+ }*/
|
|
|
|
+ if (!t->system) {
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ twali_task_subscribe_all_topics(t);
|
|
|
|
+ return res == pdPASS && t->queue != 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int twali_task_stop(struct twali_task * t) {
|
|
|
|
+ printf("deleting task %s\n", t->name);
|
|
|
|
+ int i;
|
|
|
|
+ for (i = 0; i < TWALI_TASK_TOPICS_COUNT; i ++) {
|
|
|
|
+ if (t->listeners[i]) {
|
|
|
|
+ upubsub_unsubscribe(t->listeners[i]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ vQueueDelete(t->queue);
|
|
|
|
+ vTaskDelete(NULL);
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|