-/*
- * Examples of a packet headers:
- *
- * Image widget:
- * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- * +02|00|00|00|00|10|3e|10|01|00|00|00|20|03|00|00|e0|01|00|00|53|E8|00|00+
- * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- *
- * Brightness widget:
- * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- * +04|00|00|00|00|0c|ff|ff|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00+
- * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- */
-
-#define AM7x01_PACKET_TYPE_INIT 0x01
-#define AM7x01_PACKET_TYPE_IMAGE 0x02
-#define AM7x01_PACKET_TYPE_POWER 0x04
-#define AM7x01_PACKET_TYPE_UNKNOWN 0x05
-
-struct buffer {
- unsigned int len;
- uint8_t *data;
-};
-
-struct header{
- uint32_t packet_type;
- uint32_t unknown1;
- uint32_t unknown2;
- uint32_t width;
- uint32_t height;
- uint32_t payload_size;
-};
-
-struct packet {
- struct header header;
- uint8_t payload[];
-};
-
-static struct buffer *packet_allocate_buffer(struct packet *p)
-{
- struct buffer *buffer;
-
- if (p == NULL) {
- perror("packet NULL");
- return NULL;
- }
-
- buffer = malloc(sizeof(*buffer));
- if (buffer == NULL) {
- perror("malloc buffer");
- return NULL;
- }
-
- buffer->len = sizeof(p->header); /* + p->header.payload_size; */
-
- buffer->data = malloc(buffer->len);
- if (buffer->data == NULL) {
- perror("malloc buffer->data");
- free(buffer);
- return NULL;
- }
- return buffer;
-}
-
-static void packet_free_buffer(struct buffer *buffer)
-{
- free(buffer->data);
- free(buffer);
- buffer = NULL;
-}
-
-static int packet_pack(struct packet *p, struct buffer *buffer)
-{
- unsigned int offset;
- uint32_t tmp;
-
- if (p == NULL || buffer == NULL)
- return -EINVAL;
-
- /* TODO: check for packet payload being NULL? */
- if (buffer->data == NULL || buffer->len < sizeof(*p))
- return -EINVAL;
-
- offset = 0;
-
- tmp = htole32(p->header.packet_type);
- memcpy(buffer->data + offset, &tmp, sizeof(p->header.packet_type));
- offset += sizeof(p->header.packet_type);
-
- tmp = htole32(p->header.unknown1);
- memcpy(buffer->data + offset, &tmp, sizeof(p->header.unknown1));
- offset += sizeof(p->header.unknown1);
-
- tmp = htole32(p->header.unknown2);
- memcpy(buffer->data + offset, &tmp, sizeof(p->header.unknown2));
- offset += sizeof(p->header.unknown2);
-
- tmp = htole32(p->header.width);
- memcpy(buffer->data + offset, &tmp, sizeof(p->header.width));
- offset += sizeof(p->header.width);
-
- tmp = htole32(p->header.height);
- memcpy(buffer->data + offset, &tmp, sizeof(p->header.height));
- offset += sizeof(p->header.height);
-
- tmp = htole32(p->header.payload_size);
- memcpy(buffer->data + offset, &tmp, sizeof(p->header.payload_size));
- offset += sizeof(p->header.payload_size);