aboutsummaryrefslogtreecommitdiff
path: root/src/ootx_decoder.h
blob: 8ddf527ccca7631d8c6b4e518bde80a4f54f2e20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// (C) 2017 Joshua Allen, MIT/x11 License.
//
//All MIT/x11 Licensed Code in this file may be relicensed freely under the GPL or LGPL licenses.

#ifndef OOTX_DECODER_H
#define OOTX_DECODER_H

#include <stddef.h>
#include <stdint.h>

typedef struct {
	uint16_t length;
	uint8_t* data;
	uint32_t crc32;
} ootx_packet;

typedef struct {
	uint8_t* buffer;
	uint16_t buf_offset;
	uint8_t bits_written;
	uint16_t* payload_size;

	uint32_t preamble;
	uint8_t bits_processed;
	uint8_t found_preamble;

	uint8_t bit_count[2];

	void * user;
	int user1;
} ootx_decoder_context;


typedef float float16;

typedef struct {
	uint16_t fw_version;//Firmware version (bit 15..6), protocol version (bit 5..0)
	uint32_t id; //Unique identifier of the base station
	float16 fcal_0_phase; //"phase" for rotor 0
	float16 fcal_1_phase; //"phase" for rotor 1
	float16 fcal_0_tilt; //"tilt" for rotor 0
	float16 fcal_1_tilt; //"tilt" for rotor 1
	uint8_t sys_unlock_count; //Lowest 8 bits of the rotor desynchronization counter
	uint8_t hw_version; //Hardware version
	float16 fcal_0_curve; //"curve" for rotor 0
	float16 fcal_1_curve; //"curve" for rotor 1
	int8_t accel_dir_x; //"orientation vector"
	int8_t accel_dir_y; //"orientation vector"
	int8_t accel_dir_z; //"orientation vector"
	float16 fcal_0_gibphase; //"gibbous phase" for rotor 0 (normalized angle)
	float16 fcal_1_gibphase; //"gibbous phase" for rotor 1 (normalized angle)
	float16 fcal_0_gibmag; //"gibbous magnitude" for rotor 0
	float16 fcal_1_gibmag; //"gibbous magnitude" for rotor 1
	uint8_t mode_current; //Currently selected mode (default: 0=A, 1=B, 2=C)
	uint8_t sys_faults; //"fault detect flags" (should be 0)
} lighthouse_info_v6;

void init_lighthouse_info_v6(lighthouse_info_v6* lhi, uint8_t* data);
void print_lighthouse_info_v6(lighthouse_info_v6* lhi);

void ootx_init_decoder_context(ootx_decoder_context *ctx);
void ootx_free_decoder_context(ootx_decoder_context *ctx);

uint8_t ootx_process_bit(ootx_decoder_context *ctx, uint32_t length);
void ootx_pump_bit(ootx_decoder_context *ctx, uint8_t dbit);

uint8_t ootx_decode_bit(uint32_t length);

extern void (*ootx_packet_clbk)(ootx_decoder_context *ctx, ootx_packet* packet);
extern void (*ootx_bad_crc_clbk)(ootx_decoder_context *ctx, ootx_packet* packet, uint32_t crc);

#endif