keytag.c
Go to the documentation of this file.00001
00049 #include "keytag.h"
00050
00051 #include <cfg/debug.h>
00052
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
00100 while ((c = kfile_getc(pkt->tag)) != EOF)
00101 {
00102
00103 if (c == TAG_STX)
00104 {
00105
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
00114 if (c == TAG_ETX)
00115 {
00116
00117 size_t tag_len = MIN(len, pkt->len);
00118
00119
00120 memcpy(tag, pkt->buf, tag_len);
00121 pkt->sync = false;
00122 return tag_len;
00123 }
00124 else
00125 {
00126
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
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