I would start by building a simple function to put a set of bits into your bit-buffer at a given position.
Code:
#include <stdio.h>
// This doesn't account for values which have start+length spanning word boundaries.
void setBits ( unsigned long *buffer, unsigned long value, int start, int length ) {
int index = start / 32;
int bitpos= start % 32;
unsigned long mask = ( ( 1 << length ) - 1 ) << bitpos;
buffer[index] &= ~mask;
buffer[index] |= (value << bitpos) & mask;
}
int main()
{
unsigned long buffer[5] = { 0 };
setBits(buffer,0x12,0,5);
setBits(buffer,0x34,8,8);
setBits(buffer,0xFFFF,36,16);
for ( int i = 0 ; i < 5 ; i++ ) {
printf("%08lx\n",buffer[i]);
}
return 0;
}
Then write an ENCODE_EVENT function which calls setBits three times.