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 <kern/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     #warning __FILTER_NEXT_WARNING__
00085     #warning keytag_poll function is depreca use keytag_recv instead
00086     uint8_t buf[CONFIG_TAG_MAX_LEN];
00087     int len;
00088     if ((len = keytag_recv(pkt, buf, sizeof(buf))) != EOF)
00089         kfile_write(pkt->host, buf, len);
00090 }
00091 
00097 int keytag_recv(struct TagPacket *pkt, uint8_t *tag, size_t len)
00098 {
00099     int c;
00100 
00101     /* Get all chars from buffer */
00102     while ((c = kfile_getc(pkt->tag)) != EOF)
00103     {
00104         /* Search for STX char in received chars */
00105         if (c == TAG_STX)
00106         {
00107             /* When STX is found a new packet begins */
00108             if (pkt->sync)
00109                 LOG_WARN("TAG double sync!\n");
00110             keytag_clearPkt(pkt);
00111             pkt->sync = true;
00112         }
00113         else if (pkt->sync)
00114         {
00115             /* Check for end of packet */
00116             if (c == TAG_ETX)
00117             {
00118                 /* Terminate the tag string */
00119                 size_t tag_len = MIN(len, pkt->len);
00120 
00121                 /* Save read tag */
00122                 memcpy(tag, pkt->buf, tag_len);
00123                 pkt->sync = false;
00124                 return tag_len;
00125             }
00126             else
00127             {
00128                 /* Check for buffer overflow */
00129                 if (pkt->len >= CONFIG_TAG_MAX_LEN)
00130                 {
00131                     LOG_ERR("TAG buffer overflow\n");
00132                     pkt->sync = false;
00133                 }
00134                 else
00135                 {
00136                     /* Add every char after STX to tag reading buffer */
00137                     if (pkt->sync)
00138                     {
00139                         pkt->buf[pkt->len] = c;
00140                         pkt->len++;
00141                     }
00142                 }
00143             }
00144         }
00145     }
00146     if (kfile_error(pkt->tag) != 0)
00147     {
00148         LOG_ERR("Error %04x\n", kfile_error(pkt->tag));
00149         kfile_clearerr(pkt->tag);
00150     }
00151 
00152     return EOF;
00153 }
00154 
00158 void keytag_init(struct TagPacket *pkt, struct KFile *comm, struct KFile *tag)
00159 {
00160     keytag_clearPkt(pkt);
00161     pkt->tag = tag;
00162     pkt->host = comm;
00163 }
00164