ddsfdggfa

Revision:
0:6015e28a6fb1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xstp.c	Fri Jun 17 16:22:34 2016 +0000
@@ -0,0 +1,120 @@
+/** @file xstp.c
+ * @brief Implementación del porotocolo XSTP
+ */
+#include "xstp.h"
+#include <stdlib.h>
+#include <string.h>
+
+uint8_t* escapeData(uint8_t *destlen, uint8_t *src, uint8_t srclen){
+    /* Destino de igual tamaño que el origen */
+    uint8_t *dest = (uint8_t*) malloc(sizeof(uint8_t) * srclen);
+    *destlen = srclen;
+
+     /* Copiar nueva data */
+    uint8_t sidx = 0;
+    uint8_t didx = 0;
+    uint8_t from = 0;
+    uint8_t to = 0;
+    uint8_t mustescape = 0;
+
+    while (sidx < srclen) {
+        /* Buscar bytes a escapar */
+        for (; sidx < srclen && !(mustescape = (src[sidx] == 0x7c)); sidx++);
+
+        /* Copiar bytes */
+        to = sidx;
+        memcpy(dest + didx, src + from, to - from);
+        didx += to - from;
+        from = sidx;
+
+        if (mustescape) {
+            /* Agregar escape */
+            (*destlen)++;
+            dest = (uint8_t*) realloc(dest, sizeof(uint8_t) * *destlen);
+            dest[didx] = 0x7b;
+            didx++;
+
+            /* Agregar byte reservado */
+            dest[didx] = src[sidx] ^ 0x20;
+            didx++;
+
+            /* Avanzar byte reservado */
+            sidx++;
+            from = sidx;
+        }
+    }
+    return dest;
+}
+
+int buildSensorPacket(XSTPPacket *packet, uint8_t ssv){
+    packet->data = (uint8_t*) malloc(sizeof(uint8_t) * 2);
+
+    /* Packet type */
+    *(packet->data) = 0x01;
+
+    /* SSV */
+    *(packet->data+1) = ssv;
+    packet->len = 2;
+
+    return 0;
+}
+
+int buildErrorPacket(XSTPPacket *packet, uint16_t ecode){
+    packet->data = (uint8_t*) malloc(sizeof(uint8_t) * 3);
+
+    /* Packet type */
+    *(packet->data) = 0x02;
+
+    /* Error code */
+    *(packet->data+1) = (uint8_t) (ecode >> 8);
+    *(packet->data+2) = (uint8_t) ecode;
+    packet->len = 3;
+
+    return 0;
+}
+
+int attachSensor(XSTPPacket *packet, uint16_t sid, uint8_t *data, uint8_t len){
+    uint8_t hsid = (uint8_t) (sid >> 8);
+    uint8_t lsid = (uint8_t) sid;
+
+    /* Escapar sid y data */
+    uint8_t hesidlen, lesidlen, edatalen;
+    uint8_t* hesid = escapeData(&hesidlen, &hsid, 1);
+    uint8_t* lesid = escapeData(&lesidlen, &lsid, 1);
+    uint8_t* edata = escapeData(&edatalen, data, len);
+
+    /* Error al intentar agregar más de XSTP_MAXDATA bytes */
+    if (packet->len + 1 +  hesidlen + lesidlen + edatalen > XSTP_MAXDATA) return 1;
+
+    /* Reasignar espacio de memoria */
+    packet->data = (uint8_t*) realloc(packet->data,
+            sizeof(uint8_t) * (packet->len + 1 + hesidlen + lesidlen + edatalen) );
+
+    /* Agregar delimitador */
+    *(packet->data + packet->len) = 0x7c;
+    packet->len += 1;
+
+    /* Agregar SID */
+    memcpy(packet->data + packet->len, hesid, hesidlen);
+    packet->len += hesidlen;
+    memcpy(packet->data + packet->len, lesid, lesidlen);
+    packet->len += lesidlen;
+
+    /* Agregar data */
+    memcpy(packet->data + packet->len, edata, edatalen);
+    packet->len += edatalen;
+
+    free(hesid);
+    free(lesid);
+    free(edata);
+
+    return 0;
+}
+
+int freePacket(XSTPPacket *packet){
+    /* Liberar la data y la estructura*/
+    free(packet->data);
+
+    return 0;
+}
+