X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fnet%2Fkeytag.c;h=2f75b3ee63f66a2afe784935121074c7a897b039;hb=911d2706a86d326786bfe721dcc3d63aeade7f28;hp=de890de3dff6ae6e1f1684af7faba03b596262a0;hpb=0230e8971b9260d8c0ca00482856d07de1b7c290;p=bertos.git diff --git a/bertos/net/keytag.c b/bertos/net/keytag.c index de890de3..2f75b3ee 100644 --- a/bertos/net/keytag.c +++ b/bertos/net/keytag.c @@ -31,8 +31,12 @@ * --> * * \author Andrea Grandi + * \author Daniele Basile * - * \brief Tag protocol (protocol). + * \brief KeyTAG parser. + * + * This module parse TAG message that come from comunication channel, + * and convert the tag value into string. * * TAG protocol is decribed in this way: *
@@ -44,13 +48,25 @@
 
 #include "keytag.h"
 
-#include 
+#include 
+// Define log settings for cfg/log.h
+#define LOG_LEVEL    CONFIG_KEYTAG_LOG_LEVEL
+#define LOG_FORMAT   CONFIG_KEYTAG_LOG_FORMAT
+#include 
+#include 
 
-#include 
-#include 
+#include 
 
-#include 
-#include 
+#include 
+/**
+ * Starting communication char (STX).
+ */
+#define TAG_STX 0x02
+
+/**
+ * Ending communication char (ETX).
+ */
+#define TAG_ETX 0x03
 
 static void keytag_clearPkt(struct TagPacket *pkt)
 {
@@ -58,14 +74,27 @@ static void keytag_clearPkt(struct TagPacket *pkt)
 	pkt->len = 0;
 }
 
-void keytag_init(struct TagPacket *pkt, struct KFile *comm, struct KFile *tag)
+/**
+ * DEPRECATED FUCNTIONS
+ * To read the tag string from device you shoul use the keytag_recv
+ * fuction, that return the string if we had received it.
+ */
+void keytag_poll(struct TagPacket *pkt)
 {
-	keytag_clearPkt(pkt);
-	pkt->host = comm;
-	pkt->tag = tag;
+	#warning __FILTER_NEXT_WARNING__
+	#warning keytag_poll function is depreca use keytag_recv instead
+	uint8_t buf[CONFIG_TAG_MAX_LEN];
+	int len;
+	if ((len = keytag_recv(pkt, buf, sizeof(buf))) != EOF)
+		kfile_write(pkt->host, buf, len);
 }
 
-void keytag_poll(struct TagPacket *pkt)
+/**
+ * Receive the tag message from channel, and if
+ * the tag is good put the converted string into given buffer.
+ * The fuction return the len of found tag string, otherwise EOF.
+ */
+int keytag_recv(struct TagPacket *pkt, uint8_t *tag, size_t len)
 {
 	int c;
 
@@ -77,7 +106,7 @@ void keytag_poll(struct TagPacket *pkt)
 		{
 			/* When STX is found a new packet begins */
 			if (pkt->sync)
-				kprintf("TAG double sync!\n");
+				LOG_WARN("TAG double sync!\n");
 			keytag_clearPkt(pkt);
 			pkt->sync = true;
 		}
@@ -86,17 +115,20 @@ void keytag_poll(struct TagPacket *pkt)
 			/* Check for end of packet */
 			if (c == TAG_ETX)
 			{
-				pkt->buf[TAG_MAX_PRINT_CHARS] = '\x0';
-				/* Write read TAG on communication serial */
-				kfile_printf(pkt->host, "tag %s", pkt->buf);
+				/* Terminate the tag string */
+				size_t tag_len = MIN(len, pkt->len);
+
+				/* Save read tag */
+				memcpy(tag, pkt->buf, tag_len);
 				pkt->sync = false;
+				return tag_len;
 			}
 			else
 			{
 				/* Check for buffer overflow */
-				if (pkt->len >= TAG_MAX_LEN)
+				if (pkt->len >= CONFIG_TAG_MAX_LEN)
 				{
-					kprintf("TAG buffer overflow\n");
+					LOG_ERR("TAG buffer overflow\n");
 					pkt->sync = false;
 				}
 				else
@@ -113,9 +145,20 @@ void keytag_poll(struct TagPacket *pkt)
 	}
 	if (kfile_error(pkt->tag) != 0)
 	{
-		if (kfile_error(pkt->tag) != SERRF_RXTIMEOUT)
-			kprintf("Error %08x\n", kfile_error(pkt->tag));
+		LOG_ERR("Error %04x\n", kfile_error(pkt->tag));
 		kfile_clearerr(pkt->tag);
 	}
 
+	return EOF;
 }
+
+/**
+ * Init the keytag module.
+ */
+void keytag_init(struct TagPacket *pkt, struct KFile *comm, struct KFile *tag)
+{
+	keytag_clearPkt(pkt);
+	pkt->tag = tag;
+	pkt->host = comm;
+}
+