BeRTOS
|
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