Reference
Example Code
#include <stdint.h>
/*! Bit-packs a number.
\param buffer The buffer to write into.
\param number The number to bit-pack. Should be between -(2^29-1) and 2^29-1.
\return How many bytes were written (1 to 5). */
size_t bitpackNumber(uint8_t* buffer, int32_t number)
{
size_t i = 0;
if (number < 0) { number = -number; number <<= 1; number |= 1; }
else { number <<= 1; }
while (i < 5)
{
buffer[i ++] = (number & 0x3f) | (number >= 0x40 ? 0x40 : 0x00);
number >>= 6; if (!number) { break; }
}
return i;
}
/*! Computes a 14-bit CRC.
\param data The buffer to compute the CRC of.
\param length The length of the data.
\return The CRC. */
uint16_t crc14(const uint8_t* data, size_t length)
{
uint16_t crc = 0x3fff; size_t i, bit;
for (i = 0; i < length; i ++)
{
crc ^= data[i] & 0x7f;
for (bit = 0; bit < 7; bit ++)
{
if (crc & 1) { crc >>= 1; crc ^= 0x22f0; }
else { crc >>= 1; }
}
}
return crc ^ 0x3fff;
}
/*! Writes a Packet Serial command into a buffer.
\param address The address of the Kangaroo. By default, this is 128.
\param command The command number.
6