From b89f458c19d81c29ba5dedc3ea59240fcb703f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Fri, 13 Oct 2017 11:14:20 +0200 Subject: [PATCH] fixed bugz --- TinyFrame.c | 17 +++++++++-------- TinyFrame.h | 2 +- test.c | 39 +++++++++++++++++++++++++-------------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/TinyFrame.c b/TinyFrame.c index b93ea10..55fc727 100644 --- a/TinyFrame.c +++ b/TinyFrame.c @@ -40,7 +40,7 @@ typedef struct _GenericListener_struct_ { /** * Frame parser internal state */ -static struct TinyFrameInstance { +static struct TinyFrameStruct { /* Own state */ TF_PEER peer_bit; //!< Own peer bit (unqiue to avoid msg ID clash) TF_ID next_id; //!< Next frame / frame chain ID @@ -341,7 +341,7 @@ static void _TF_FN TF_HandleReceivedMessage(void) // ID listeners first for (i = 0; i < tf.count_id_lst; i++) { ilst = &tf.id_listeners[i]; - if (ilst->fn && ilst->id == frame_id) { + if (ilst->fn && ilst->id == msg.frame_id) { msg.userdata = ilst->userdata; if (ilst->fn(&msg)) return; } @@ -352,7 +352,7 @@ static void _TF_FN TF_HandleReceivedMessage(void) // Type listeners for (i = 0; i < tf.count_type_lst; i++) { tlst = &tf.type_listeners[i]; - if (tlst->fn && tlst->type == type) { + if (tlst->fn && tlst->type == msg.type) { if (tlst->fn(&msg)) return; } } @@ -476,7 +476,7 @@ void _TF_FN TF_AcceptChar(unsigned char c) CKSUM_RESET(tf.cksum); // Start collecting the payload - if (tf.len >= TF_MAX_PAYLOAD) { + if (tf.len >= TF_MAX_PAYLOAD_RX) { // ERROR - frame too long. Consume, but do not store. tf.discard_data = true; } @@ -546,7 +546,7 @@ static inline int _TF_FN TF_Compose(uint8_t *outbuff, TF_ID *id_ptr, CKSUM_RESET(cksum); // sanitize len - if (data_len > TF_MAX_PAYLOAD) { + if (data_len > TF_MAX_PAYLOAD_TX) { return TF_ERROR; } @@ -626,7 +626,7 @@ bool _TF_FN TF_Send(TF_MSG *msg, TF_LISTENER listener, TF_TICKS timeout) if (len == TF_ERROR) return false; - if (listener) TF_AddIdListener(msg->frame_id, listener); + if (listener) TF_AddIdListener(msg, listener, timeout); TF_WriteImpl((const uint8_t *) tf.sendbuf, (TF_LEN)len); return true; @@ -644,6 +644,7 @@ bool _TF_FN TF_Respond(TF_MSG *msg, bool renew) bool _TF_FN TF_RenewIdListener(TF_ID id) { + size_t i; IdListener *lst; for (i = 0; i < tf.count_id_lst; i++) { lst = &tf.id_listeners[i]; @@ -658,7 +659,7 @@ bool _TF_FN TF_RenewIdListener(TF_ID id) /** Timebase hook - for timeouts */ void _TF_FN TF_Tick(void) { - int i; + size_t i; TF_MSG msg; IdListener *lst; @@ -677,7 +678,7 @@ void _TF_FN TF_Tick(void) msg.userdata = lst->userdata; msg.data = NULL; // this is a signal that listener should clean up - lst->fn(msg); + lst->fn(&msg); lst->fn = NULL; // Discard listener } } diff --git a/TinyFrame.h b/TinyFrame.h index a27ea97..11be373 100644 --- a/TinyFrame.h +++ b/TinyFrame.h @@ -139,7 +139,7 @@ typedef enum { } TF_PEER; /** Data structure for sending / receiving messages */ -typedef struct { +typedef struct _TF_MSG_STRUCT_ { TF_ID frame_id; // message ID bool is_response; // internal flag, set when using the Respond function. frame_id is then kept unchanged. TF_TYPE type; // received or sent message type diff --git a/test.c b/test.c index e41dc4f..2ec775e 100644 --- a/test.c +++ b/test.c @@ -3,6 +3,8 @@ #include #include "TinyFrame.h" +typedef unsigned char* pu8; + static void dumpFrame(const uint8_t *buff, TF_LEN len); /** @@ -20,19 +22,21 @@ void TF_WriteImpl(const uint8_t *buff, TF_LEN len) } /** An example listener function */ -bool myListener(TF_ID frame_id, TF_TYPE type, const uint8_t *buff, TF_LEN len) +bool myListener(TF_MSG *msg) { printf("\033[33mRX frame\n" " type: %02Xh\n" " data: \"%.*s\"\n" " len: %u\n" - " id: %Xh\033[0m\n", type, len, buff, len, frame_id); + " id: %Xh\033[0m\n", + msg->type, msg->len, msg->data, msg->len, msg->frame_id); return true; } -bool testIdListener(TF_ID frame_id, TF_TYPE type, const uint8_t *buff, TF_LEN len) +bool testIdListener(TF_MSG *msg) { - printf("OK - ID Listener triggered for msg (type %02X, id %Xh)!", type, frame_id); + printf("OK - ID Listener triggered for msg (type %02X, id %Xh)!", + msg->type, msg->frame_id); return true; } @@ -44,20 +48,27 @@ void main(void) printf("------ Simulate sending a message --------\n"); - TF_Send(0x22, (unsigned char*)"Hello TinyFrame", 16, NULL, NULL); + TF_MSG msg; + TF_ClearMsg(&msg); + msg.type = 0x22; + msg.data = (pu8)"Hello TinyFrame"; + msg.len = 16; + TF_Send(&msg, NULL, 0); const char *longstr = "Lorem ipsum dolor sit amet."; - TF_Send(0x33, (unsigned char*)longstr, (TF_LEN)(strlen(longstr)+1), NULL, NULL); - - TF_Send(0x44, (unsigned char*)"Hello2", 7, NULL, NULL); - - TF_Send0(0xF0, NULL, NULL); - - TF_Send1(0xF1, 'Q', NULL, NULL); + msg.type = 0x33; + msg.data = (pu8)longstr; + msg.len = strlen(longstr)+1; // add the null byte + TF_Send(&msg, NULL, 0); - TF_Send2(0xF2, 'A', 'Z', NULL, NULL); + msg.type = 0x44; + msg.data = (pu8)"Hello2"; + msg.len = 7; + TF_Send(&msg, NULL, 0); - TF_Send0(0x77, testIdListener, NULL); + msg.len = 0; + msg.type = 0x77; + TF_Send(&msg, testIdListener, 0); } // helper func for testing