Skip to content
krabipacket.cpp 2.96 KiB
Newer Older
#include "krabipacket.h"

Alexandre Manoury's avatar
Alexandre Manoury committed
#include <string.h>

#ifndef ROBOTHW
#include <QDebug>
#endif

KrabiPacket::KrabiPacket(uint8_t id, W_TABLE watch) : mId(id), mCursor(1), mLength(2), mLengthSecurized(0), mValid(true)
Alexandre Manoury's avatar
Alexandre Manoury committed
    mPacket[0] = mId;
Alexandre Manoury's avatar
Alexandre Manoury committed
    if (watch != W_NULL)
        add((uint16_t) watch);
Alexandre Manoury's avatar
Alexandre Manoury committed
KrabiPacket::KrabiPacket(uint8_t *data, uint8_t size) : mCursor(1), mLength(0), mLengthSecurized(size)
Alexandre Manoury's avatar
Alexandre Manoury committed
    memcpy(mPacketSecurized, data, mLengthSecurized);

    unsecurize();

    mId = mPacket[0];

    checkValidity();
Alexandre Manoury's avatar
Alexandre Manoury committed
#ifndef ROBOTHW

KrabiPacket::KrabiPacket(QByteArray data) : mCursor(1), mLength(0)
Alexandre Manoury's avatar
Alexandre Manoury committed
#ifdef BLUETOOTH
    uint8_t* array = (uint8_t*)(data.toStdString().c_str());
    mLengthSecurized = data.size();
Alexandre Manoury's avatar
Alexandre Manoury committed
    memcpy(mPacketSecurized, array, mLengthSecurized);
Alexandre Manoury's avatar
Alexandre Manoury committed
    unsecurize();
Alexandre Manoury's avatar
Alexandre Manoury committed
    mId = mPacket[0];

    checkValidity();
#endif
Alexandre Manoury's avatar
Alexandre Manoury committed
QByteArray KrabiPacket::dataByteArray()
Alexandre Manoury's avatar
Alexandre Manoury committed
    QByteArray q((char*) data(), length());

    return q;
Alexandre Manoury's avatar
Alexandre Manoury committed
#endif

bool KrabiPacket::checkValidity()
Alexandre Manoury's avatar
Alexandre Manoury committed
    uint8_t checksum = mPacket[mLength - 1];
    uint8_t computedChecksum = 0;
    for(int i(0); i < mLength - 1; i++)
        computedChecksum += mPacket[i];

    mValid = (checksum == computedChecksum);
Alexandre Manoury's avatar
Alexandre Manoury committed
#ifndef ROBOTHW
    if (!mValid)
        qDebug() << "ERROR : " << checksum << " != " << computedChecksum;
#endif
Alexandre Manoury's avatar
Alexandre Manoury committed
    return mValid;
Alexandre Manoury's avatar
Alexandre Manoury committed
bool KrabiPacket::isValid()
Alexandre Manoury's avatar
Alexandre Manoury committed
    return mValid;
}
Arnaud Cadot's avatar
Arnaud Cadot committed
void KrabiPacket::addData(void* data, uint8_t size)
Alexandre Manoury's avatar
Alexandre Manoury committed
{
    if (mCursor + size + KRABIPACKET_SUFFIX_SIZE > KRABIPACKET_MAXSIZE)
        return;
Alexandre Manoury's avatar
Alexandre Manoury committed
    memcpy(mPacket + mCursor, data, size);
    mCursor += size;
    mLength += size;
Alexandre Manoury's avatar
Alexandre Manoury committed
void KrabiPacket::copyData(void* dest, uint8_t size)
    if (mCursor + size >= mLength)
        return;

Alexandre Manoury's avatar
Alexandre Manoury committed
    memcpy(dest, mPacket + mCursor, size);
    mCursor += size;
Arnaud Cadot's avatar
Arnaud Cadot committed
void KrabiPacket::addString(char* data)
Alexandre Manoury's avatar
Alexandre Manoury committed
    int size = 0;
    while( data[size] != '\0' )
        size++;
Alexandre Manoury's avatar
Alexandre Manoury committed
    addData(data, size + 1);
}

char* KrabiPacket::getString()
{
    char* ptr = (char*)(mPacket + mCursor);
    while( mPacket[mCursor] != '\0' )
        mCursor++;

    return ptr;
}

void KrabiPacket::setId(uint8_t id)
{
    mId = id;
}

uint8_t KrabiPacket::id()
{
    return mId;
}

uint8_t KrabiPacket::length()
{
    securize();
    return mLengthSecurized;
}

void KrabiPacket::securize()
{
    // securize (delete CR + LF)
    mLengthSecurized = 0;
    for(int i(0); i < mLength; i++)
Alexandre Manoury's avatar
Alexandre Manoury committed
        if (mPacket[i] == 0x0A || mPacket[i] == 0xFF)
            mPacketSecurized[mLengthSecurized++] = 0xFF;
        mPacketSecurized[mLengthSecurized++] = mPacket[i];
Alexandre Manoury's avatar
Alexandre Manoury committed
}

void KrabiPacket::unsecurize()
{
    mLength = 0;
    for(int i(0); i < mLengthSecurized; i++)
Alexandre Manoury's avatar
Alexandre Manoury committed
        if (mPacketSecurized[i] == 0xFF)
            i++;
        mPacket[mLength++] = mPacketSecurized[i];
Alexandre Manoury's avatar
Alexandre Manoury committed
}

uint8_t* KrabiPacket::data()
{
    // checksum
    uint8_t checksum = 0;
    for(int i(0); i < mLength - 1; i++)
        checksum += mPacket[i];
    mPacket[mLength - 1] = checksum;

    securize();
Alexandre Manoury's avatar
Alexandre Manoury committed
    return mPacketSecurized;