ENEL400 / L3PDU

Dependents:   LoRaBaseStation LoRaTerminal

BasicPacket/BasicPacket.cpp

Committer:
rba90
Date:
2016-06-30
Revision:
2:f4f46b04ab8a
Parent:
1:dda08634a9be
Child:
3:35e5a721f198

File content as of revision 2:f4f46b04ab8a:

#include "BasicPacket.h"
#include "crc.h"
#include <string>

#ifdef _DEBUG
#include <cassert>
#endif

BasicPacket::BasicPacket()
{
    // init variables
    memset(_buffer, 0x0, sizeof(_buffer));
    _isVerified = false;
}

BasicPacket::BasicPacket(uint8_t *data)
{
    // the user takes the responsibility of making sure
    // they have sufficient memory for data buffer
    
    // copy data to internal buffer
    memcpy(_buffer, data, sizeof(_buffer));

    // set verify flag
    _isVerified = false;
}

BasicPacket::~BasicPacket()
{

}

void BasicPacket::generateCrc()
{
    _buffer[3] = crc8(_buffer, 3);

    // set verify flag
    _isVerified = true;
}

bool BasicPacket::verify()
{
    if (_isVerified)
    {
        return true;
    }
    else
    {
        return _buffer[3] == crc8(_buffer, 3);
    }
}

void BasicPacket::serialize(uint8_t *buffer)
{
    memcpy(buffer, _buffer, sizeof(_buffer));
}

void BasicPacket::setFid(uint8_t fid)
{
    // clear upper 4 bits
    _buffer[0] &= 0x0f;
    
    // set bits
    _buffer[0] |= fid << 4;

    // set verify flag
    _isVerified = false;
}

void BasicPacket::setField1(uint8_t field)
{
    // clear lower 4 bits
    _buffer[0] &= 0xf0;

    // set bits
    _buffer[0] |= field & 0x0f;

    // set verify flag
    _isVerified = false;
}

void BasicPacket::setField2(uint8_t field)
{
    _buffer[1] = field;

    // set verify flag
    _isVerified = false;
}

void BasicPacket::setField3(uint8_t field)
{
    _buffer[2] = field;

    // set verify flag
    _isVerified = false;
}

uint8_t BasicPacket::getFid()
{
    return (_buffer[0] & 0xf0) >> 4;
}

uint8_t BasicPacket::getField1()
{
    return _buffer[0] & 0x0f;
}

uint8_t BasicPacket::getField2()
{
    return _buffer[1];
}

uint8_t BasicPacket::getField3()
{
    return _buffer[2];
}

uint8_t BasicPacket::getCrc()
{
    if (_isVerified)
    {
        return _buffer[3];
    }
    else
    {
        return crc8(_buffer, 3);
    }
}

#ifdef _DEBUG
void BasicPacket::unit_test()
{
    // value test
    BasicPacket testObject;
    testObject.setFid(0x1);
    testObject.setField1(0x2);
    testObject.setField2(0x34);
    testObject.setField3(0x67);

    assert(0x1 == testObject.getFid());
    assert(0x2 == testObject.getField1());
    assert(0x34 == testObject.getField2());
    assert(0x67 == testObject.getField3());

    assert(false == testObject.verify());
    testObject.generateCrc();
    assert(true == testObject.verify());
    assert(0xeb == testObject.getCrc());

    // value test 2
    uint8_t testString[] = { 0x12, 0x34, 0x67, 0xeb };
    BasicPacket testObject2(testString);

    assert(0x1 == testObject2.getFid());
    assert(0x2 == testObject2.getField1());
    assert(0x34 == testObject2.getField2());
    assert(0x67 == testObject2.getField3());

    assert(true == testObject2.verify());
    testObject2.generateCrc();
    assert(true == testObject2.verify());
    assert(0xeb == testObject2.getCrc());
}
#endif