/* * @file dataframe.c * * @date: 31. 12. 2022 * @author: juraj * * @brief Simple Data Frame * * Structure of data frame: * - starting byte (0xCC) * - length of frame: count of bytes in payload. Maximum length: 254 (0xFE)h * - payload * * Supported data types: * - uint8_t, int8_t * - uint16_t, int16_t * - uint32_t, int32_t * - float * * \code{.c} void main(){ uint8_t data[128]; packet_create(data, 128); packet_add_uint8(0xAB); packet_add_uint16(0xABCD); packet_add_uint32(0x12345678); packet_add_float(0.265); int data_length = packet_commit(); } * \endcode * */ #include "dataframe.h" uint8_t *packet; static volatile uint8_t length; static volatile uint8_t capacity; void packet_create(uint8_t *usr_packet, uint8_t size) { packet = usr_packet; capacity = size; packet[0] = HEADER_CHAR; packet[1] = 0; //length of packet length = 2; } uint8_t packet_add_uint8(uint8_t d) { if((length+1) >= capacity){ return VALUE_ERR; } packet[length] = d; length++; return VALUE_OK; } uint8_t packet_add_uint16(uint16_t d) { if((length+2) >= capacity){ return VALUE_ERR; } packet[length++] = (d >> 8) & 0xFF; packet[length++] = d & 0xFF; return VALUE_OK; } uint8_t packet_add_uint32(uint32_t d) { if((length+4) >= capacity){ return VALUE_ERR; } packet[length++] = (d >> 24) & 0xFF; packet[length++] = (d >> 16) & 0xFF; packet[length++] = (d >> 8) & 0xFF; packet[length++] = d & 0xFF; return VALUE_OK; } uint8_t packet_add_int8(int8_t d) { return packet_add_uint8((uint8_t)d); } uint8_t packet_add_int16(int16_t d) { return packet_add_uint16((uint16_t)d); } uint8_t packet_add_int32(int32_t d) { return packet_add_uint32((uint32_t)d); } uint8_t packet_add_float(float f) { if((length+4) >= capacity){ return VALUE_ERR; } uint8_t *ptr; ptr = (unsigned char *)&f; packet[length++] = *(ptr); packet[length++] = *(ptr+1); packet[length++] = *(ptr+2); packet[length++] = *(ptr+3); return VALUE_OK; } uint8_t packet_commit() { packet[1] = length; return length; }