BeRTOS
keytag.c
Go to the documentation of this file.
00001 
00049 #include "keytag.h"
00050 
00051 #include <cfg/debug.h>
00052 // Define log settings for cfg/log.h
00053 #define LOG_LEVEL    CONFIG_KEYTAG_LOG_LEVEL
00054 #define LOG_FORMAT   CONFIG_KEYTAG_LOG_FORMAT
00055 #include <cfg/log.h>
00056 #include <cfg/macros.h>
00057 
00058 #include <io/kfile.h>
00059 
00060 #include <string.h>
00064 #define TAG_STX 0x02
00065 
00069 #define TAG_ETX 0x03
00070 
00071 static void keytag_clearPkt(struct TagPacket *pkt)
00072 {
00073     pkt->sync = false;
00074     pkt->len = 0;
00075 }
00076 
00082 void keytag_poll(struct TagPacket *pkt)
00083 {
00084     uint8_t buf[CONFIG_TAG_MAX_LEN];
00085     int len;
00086     if ((len = keytag_recv(pkt, buf, sizeof(buf))) != EOF)
00087         kfile_write(pkt->host, buf, len);
00088 }
00089 
00095 int keytag_recv(struct TagPacket *pkt, uint8_t *tag, size_t len)
00096 {
00097     int c;
00098 
00099     /* Get all chars from buffer */
00100     while ((c = kfile_getc(pkt->tag)) != EOF)
00101     {
00102         /* Search for STX char in received chars */
00103         if (c == TAG_STX)
00104         {
00105             /* When STX is found a new packet begins */
00106             if (pkt->sync)
00107                 LOG_WARN("TAG double sync!\n");
00108             keytag_clearPkt(pkt);
00109             pkt->sync = true;
00110         }
00111         else if (pkt->sync)
00112         {
00113             /* Check for end of packet */
00114             if (c == TAG_ETX)
00115             {
00116                 /* Terminate the tag string */
00117                 size_t tag_len = MIN(len, pkt->len);
00118 
00119                 /* Save read tag */
00120                 memcpy(tag, pkt->buf, tag_len);
00121                 pkt->sync = false;
00122                 return tag_len;
00123             }
00124             else
00125             {
00126                 /* Check for buffer overflow */
00127                 if (pkt->len >= CONFIG_TAG_MAX_LEN)
00128                 {
00129                     LOG_ERR("TAG buffer overflow\n");
00130                     pkt->sync = false;
00131                 }
00132                 else
00133                 {
00134                     /* Add every char after STX to tag reading buffer */
00135                     if (pkt->sync)
00136                     {
00137                         pkt->buf[pkt->len] = c;
00138                         pkt->len++;
00139                     }
00140                 }
00141             }
00142         }
00143     }
00144     if (kfile_error(pkt->tag) != 0)
00145     {
00146         LOG_ERR("Error %04x\n", kfile_error(pkt->tag));
00147         kfile_clearerr(pkt->tag);
00148     }
00149 
00150     return EOF;
00151 }
00152 
00156 void keytag_init(struct TagPacket *pkt, struct KFile *comm, struct KFile *tag)
00157 {
00158     keytag_clearPkt(pkt);
00159     pkt->tag = tag;
00160     pkt->host = comm;
00161 }
00162