#pragma once #include #include #define TRIKKE_WIRE_VERSION 1 #define TRIKKE_WIRE_HEADER_SIZE 36 #define TRIKKE_WIRE_SAMPLE_RECORD_SIZE 20 #define TRIKKE_WIRE_METADATA_SIZE 48 #define TRIKKE_WIRE_MAX_RECORDS 8 #define TRIKKE_WIRE_MAX_PACKET_SIZE \ (TRIKKE_WIRE_HEADER_SIZE + \ TRIKKE_WIRE_SAMPLE_RECORD_SIZE * TRIKKE_WIRE_MAX_RECORDS) #define TRIKKE_PACKET_TYPE_METADATA 1 #define TRIKKE_PACKET_TYPE_SAMPLES 2 #define TRIKKE_PACKET_FLAG_TIMESTAMP_DELTA_SATURATED 0x01 #define TRIKKE_METADATA_FLAG_ACCEL_Y_NEGX_Z 0x0001 #define TRIKKE_METADATA_FLAG_GYRO_IDENTITY 0x0002 #define TRIKKE_METADATA_FLAG_GYRO_POLARITY 0x0004 #define TRIKKE_METADATA_FLAG_GYRO_SCALE_NOMINAL 0x0008 typedef struct { uint32_t sequence; int64_t timestamp_us; int16_t accel_x; int16_t accel_y; int16_t accel_z; int16_t gyro_x; int16_t gyro_y; int16_t gyro_z; uint8_t accel_status; uint8_t gyro_status; } trikke_wire_sample_t; typedef struct { uint16_t sample_rate_hz; uint16_t accel_range_g; uint16_t gyro_range_dps; uint16_t flags; float accel_offset_counts[3]; float accel_counts_per_g[3]; float gyro_bias_counts[3]; float gyro_mdps_per_lsb; } trikke_wire_metadata_t; size_t trikke_encode_metadata_packet( uint8_t *output, size_t output_size, uint32_t packet_sequence, int64_t timestamp_us, uint32_t dropped_sample_count, uint32_t loop_overrun_count, const trikke_wire_metadata_t *metadata); size_t trikke_encode_sample_packet( uint8_t *output, size_t output_size, uint32_t packet_sequence, uint32_t dropped_sample_count, uint32_t loop_overrun_count, const trikke_wire_sample_t *samples, size_t sample_count);