From 95cc7e3af58a39bb34fb92ad989598b9cfd7ffaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 23 Dec 2017 10:03:59 +0100 Subject: [PATCH] updated tinyframe --- gex/protocol/TF_Config.h | 4 ++-- gex/protocol/TinyFrame.c | 30 ++++++++++++++++++++++++++---- main.c | 2 +- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/gex/protocol/TF_Config.h b/gex/protocol/TF_Config.h index 4dc088d..240e383 100644 --- a/gex/protocol/TF_Config.h +++ b/gex/protocol/TF_Config.h @@ -57,9 +57,9 @@ typedef uint8_t TF_COUNT; // --- Listener counts - determine sizes of the static slot tables --- // Frame ID listeners (wait for response / multi-part message) -#define TF_MAX_ID_LST 10 +#define TF_MAX_ID_LST 5 // Frame Type listeners (wait for frame with a specific first payload byte) -#define TF_MAX_TYPE_LST 10 +#define TF_MAX_TYPE_LST 5 // Generic listeners (fallback if no other listener catches it) #define TF_MAX_GEN_LST 1 diff --git a/gex/protocol/TinyFrame.c b/gex/protocol/TinyFrame.c index 4ad41e7..268f990 100644 --- a/gex/protocol/TinyFrame.c +++ b/gex/protocol/TinyFrame.c @@ -1,6 +1,8 @@ //--------------------------------------------------------------------------- #include "TinyFrame.h" #include +#include +#include //--------------------------------------------------------------------------- // Compatibility with ESP8266 SDK @@ -243,6 +245,7 @@ bool _TF_FN TF_AddIdListener(TinyFrame *tf, TF_Msg *msg, TF_Listener cb, TF_TICK return true; } } + fprintf(stderr,"TF failed to add ID listener\n"); return false; } @@ -372,6 +375,13 @@ static void _TF_FN TF_HandleReceivedMessage(TinyFrame *tf) if (res == TF_RENEW) { renew_id_listener(ilst); } + + if (res == TF_CLOSE) { + // Set userdata to NULL to avoid calling user for cleanup + ilst->userdata = NULL; + ilst->userdata2 = NULL; + cleanup_id_listener(tf, i, ilst); + } return; } } @@ -389,8 +399,12 @@ static void _TF_FN TF_HandleReceivedMessage(TinyFrame *tf) res = tlst->fn(tf, &msg); if (res != TF_NEXT) { - // if it's TF_CLOSE, we assume user already cleaned up userdata - // TF_RENEW doesn't make sense here because type listeners don't expire + // type listeners don't have userdata. + // TF_RENEW doesn't make sense here because type listeners don't expire = same as TF_STAY + + if (res == TF_CLOSE) { + cleanup_type_listener(tf, i, tlst); + } return; } } @@ -404,8 +418,16 @@ static void _TF_FN TF_HandleReceivedMessage(TinyFrame *tf) res = glst->fn(tf, &msg); if (res != TF_NEXT) { - // if it's TF_CLOSE, we assume user already cleaned up userdata - // TF_RENEW doesn't make sense here because generic listeners don't expire + // generic listeners don't have userdata. + // TF_RENEW doesn't make sense here because generic listeners don't expire = same as TF_STAY + + // note: It's not expected that user will have multiple generic listeners, or + // ever actually remove them. They're most useful as default callbacks if no other listener + // handled the message. + + if (res == TF_CLOSE) { + cleanup_generic_listener(tf, i, glst); + } return; } } diff --git a/main.c b/main.c index 84ca146..330de71 100644 --- a/main.c +++ b/main.c @@ -58,7 +58,7 @@ int main(void) msg = GEX_Query0(test, 0); assert(msg.type == MSG_SUCCESS); fprintf(stderr, "\"PING\" cmd: OK.\n"); - usleep(50000); + //usleep(20000); } #endif