Skip to content

Define new protocol in RF_Protocols.h

Portisch edited this page Feb 20, 2019 · 5 revisions

Let's take the example from decode 0xB1 sniffed data.

These are the Parameters needed to be defined:

typedef struct PROTOCOL_DATA_UINT8_T
{
	// pointer to array of uint8_t elements
	SI_VARIABLE_SEGMENT_POINTER(dat, uint8_t, SI_SEG_CODE);
	// size of the array
	uint8_t size;
} PROTOCOL_DATA_UINT8_T;

typedef struct PROTOCOL_DATA_UINT16_T
{
	// pointer to array of uint16_t elements
	SI_VARIABLE_SEGMENT_POINTER(dat, uint16_t, SI_SEG_CODE);
	// size of the array
	uint8_t size;
} PROTOCOL_DATA_UINT16_T;

typedef struct BUCKET_PROTOCOL_DATA
{
	// array and array size of buckets
	PROTOCOL_DATA_UINT16_T buckets;
	// array and array size of start buckets
	PROTOCOL_DATA_UINT8_T start;
	// array and array size of bit 0 buckets
	PROTOCOL_DATA_UINT8_T bit0;
	// array and array size of bit 1 buckets
	PROTOCOL_DATA_UINT8_T bit1;
	// array and array size of end buckets
	PROTOCOL_DATA_UINT8_T end;
	// bit count for this protocol
	uint8_t bit_count;
} BUCKET_PROTOCOL_DATA;

/*
 * New protocol description
 */
#if EFM8BB1_SUPPORT_new_protocol_PROTOCOL == 1
#define new_protocol
SI_SEGMENT_VARIABLE(PROTOCOL_BUCKETS(new_protocol)[], static uint16_t, SI_SEG_CODE) = { };
SI_SEGMENT_VARIABLE(PROTOCOL_START(new_protocol)[], static uint8_t, SI_SEG_CODE) = { };
SI_SEGMENT_VARIABLE(PROTOCOL_BIT0(new_protocol)[], static uint8_t, SI_SEG_CODE) = { };
SI_SEGMENT_VARIABLE(PROTOCOL_BIT1(new_protocol)[], static uint8_t, SI_SEG_CODE) = { };
SI_SEGMENT_VARIABLE(PROTOCOL_END(new_protocol)[], static uint8_t, SI_SEG_CODE) = { };
#endif

Find the pulse time

First the pulse time needs to be found.
We do have these 4 buckets from this sniffed data:
Hex: AA B1 04 017C 046A 0BCC 2378 3818190908181908190909090908190819081818190909091A 55

Bucket 0 length: 380µs
Bucket 1 length: 1130µs
Bucket 2 length: 3020µs
Bucket 3 length: 9080µs

So you are able to insert these values in the PROTOCOL_BUCKETS array:

SI_SEGMENT_VARIABLE(PROTOCOL_BUCKETS(new_protocol)[], static uint16_t, SI_SEG_CODE) = { 380, 1130, 3020, 9080 };`

HIGH/LOW marking

Use the defined macro HIGH(x) or LOW(x) to define a bucket number as high or low bucket.

Add compiler flag

Implement in RF_Config.h and RF_Protocols.h a new compiler flag for this protocol.

#define EFM8BB1_SUPPORT_new_protocol_PROTOCOL		1		// new_protocol

START

Find the sync bucket like this example:
A3
[A] & 0x07 == 2: So first sync bucket is number 2 (high)
[3] & 0x07 == 3: So second sync bucket is number 3 (low)

So you are able to insert these values in the PROTOCOL_START array:

SI_SEGMENT_VARIABLE(PROTOCOL_START(new_protocol)[], static uint8_t, SI_SEG_CODE) = { HIGH(2), LOW(3) };`  

BIT0

As a bit 0 is high Bucket 0 length: 380µs followed by low Bucket 1 length: 1130µs the result will be:

SI_SEGMENT_VARIABLE(PROTOCOL_BIT0(new_protocol)[], static uint8_t, SI_SEG_CODE) = { HIGH(0), LOW(1) };

BIT1

As a bit 1 is high Bucket 1 length: 1130µs followed by low Bucket 0 length: 380µs the result will be:

SI_SEGMENT_VARIABLE(PROTOCOL_BIT1(new_protocol)[], static uint8_t, SI_SEG_CODE) = { HIGH(1), LOW(0) };

END

This can be use if the protocol does include like a pause between the transmit repeats:

SI_SEGMENT_VARIABLE(PROTOCOL_END(new_protocol)[], static uint8_t, SI_SEG_CODE) = { LOW(0) };

If this is not used just do not define an PROTOCOL_END.

BIT_COUNT

By the decoded data the bit count would be 24 bits.
This may vary by the used protocol.

Combine everything to the protcol array:

Below the single protocols there is a array where you have to add the new protocol data.

SI_SEGMENT_VARIABLE(PROTOCOL_DATA[], static struct BUCKET_PROTOCOL_DATA, SI_SEG_CODE)

Just add at the end of the array the new data and complete it with the bit count and "inverse" parameter.
When no PROTOCOL_END is used:

#if EFM8BB1_SUPPORT_new_protocol_PROTOCOL == 1
		/*
		 * New protocol description
		 */
		{
			{ &PROTOCOL_BUCKETS(new_protocol), ARRAY_LENGTH(PROTOCOL_BUCKETS(new_protocol)) },
			{ &PROTOCOL_START(new_protocol), ARRAY_LENGTH(PROTOCOL_START(new_protocol)) },
			{ &PROTOCOL_BIT0(new_protocol), ARRAY_LENGTH(PROTOCOL_BIT0(new_protocol)) },
			{ &PROTOCOL_BIT1(new_protocol), ARRAY_LENGTH(PROTOCOL_BIT1(new_protocol)) },
			{ NULL, 0 },
			24
		}
#endif

When PROTOCOL_END is used:

#if EFM8BB1_SUPPORT_new_protocol_PROTOCOL == 1
		/*
		 * New protocol description
		 */
		{
			{ &PROTOCOL_BUCKETS(new_protocol), ARRAY_LENGTH(PROTOCOL_BUCKETS(new_protocol)) },
			{ &PROTOCOL_START(new_protocol), ARRAY_LENGTH(PROTOCOL_START(new_protocol)) },
			{ &PROTOCOL_BIT0(new_protocol), ARRAY_LENGTH(PROTOCOL_BIT0(new_protocol)) },
			{ &PROTOCOL_BIT1(new_protocol), ARRAY_LENGTH(PROTOCOL_BIT1(new_protocol)) },
			{ &PROTOCOL_END(new_protocol), ARRAY_LENGTH(PROTOCOL_END(new_protocol)) },
			24
		}
#endif
Clone this wiki locally