Files
trikkeSensors/main/trikke_protocol.h
T

95 lines
2.7 KiB
C

#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#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_STATUS_SIZE 32
#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_TYPE_STATUS 3
#define TRIKKE_PACKET_FLAG_TIMESTAMP_DELTA_SATURATED 0x01
#define TRIKKE_WIRE_TIMESTAMP_DELTA_UNIT_US 10
#define TRIKKE_WIRE_MAX_TIMESTAMP_DELTA_US \
((uint64_t)UINT16_MAX * TRIKKE_WIRE_TIMESTAMP_DELTA_UNIT_US)
#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;
typedef struct {
uint32_t sensor_read_failure_count;
uint32_t queue_overflow_count;
uint32_t transport_begin_retry_count;
uint32_t transport_disconnect_count;
uint32_t transport_send_failure_count;
uint32_t transport_replay_count;
uint32_t transport_invalid_ack_count;
} trikke_wire_status_t;
bool trikke_wire_timestamp_delta_fits(
int64_t previous_timestamp_us,
int64_t timestamp_us);
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);
size_t trikke_encode_status_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_status_t *status);