Loading...
Searching...
No Matches
protocol.h
Go to the documentation of this file.
1#ifndef PROTOCOL_H
2#define PROTOCOL_H
3
4#include <stdint.h>
5
6#define PROTOCOL_VERSION 4
7
8/* Position of the values in the command packet */
9#define UD_COMMAND_MODE 0
10#define UD_COMMAND_POS_1 1
11#define UD_COMMAND_POS_2 3
12#define UD_COMMAND_VEL_1 5
13#define UD_COMMAND_VEL_2 6
14#define UD_COMMAND_IQ_1 7
15#define UD_COMMAND_IQ_2 8
16#define UD_COMMAND_KP_1 9
17#define UD_COMMAND_KP_2 10
18#define UD_COMMAND_KD_1 11
19#define UD_COMMAND_KD_2 12
20#define UD_COMMAND_ISAT_12 13
21
22/* Command packet -> mode : bits */
24#define UD_COMMAND_MODE_ES (1<<15)
26#define UD_COMMAND_MODE_EM1 (1<<14)
28#define UD_COMMAND_MODE_EM2 (1<<13)
30#define UD_COMMAND_MODE_EPRE (1<<12)
32#define UD_COMMAND_MODE_EI1OC (1<<11)
34#define UD_COMMAND_MODE_EI2OC (1<<10)
36#define UD_COMMAND_MODE_TIMEOUT (0xFF<<0) //Timeout
37
38/* Qvalues for each fields */
39#define UD_QN_POS 24
40#define UD_QN_VEL 11
41#define UD_QN_IQ 10
42#define UD_QN_ISAT 3
43#define UD_QN_CR 15
44#define UD_QN_ADC 16
45#define UD_QN_KP 11
46#define UD_QN_KD 10
47
48#define IMU_QN_ACC 11
49#define IMU_QN_GYR 11
50#define IMU_QN_EF 13
51
52/* Position of the values in the sensor packet */
53#define UD_SENSOR_STATUS 0
54#define UD_SENSOR_TIMESTAMP 1
55#define UD_SENSOR_POS_1 2
56#define UD_SENSOR_POS_2 4
57#define UD_SENSOR_VEL_1 6
58#define UD_SENSOR_VEL_2 7
59#define UD_SENSOR_IQ_1 8
60#define UD_SENSOR_IQ_2 9
61#define UD_SENSOR_CR_1 10
62#define UD_SENSOR_CR_2 11
63#define UD_SENSOR_ADC_1 12
64#define UD_SENSOR_ADC_2 13
65
66/* sensor packet -> status : bits */
68#define UD_SENSOR_STATUS_SE (1<<15)
70#define UD_SENSOR_STATUS_M1E (1<<14)
72#define UD_SENSOR_STATUS_M1R (1<<13)
74#define UD_SENSOR_STATUS_M2E (1<<12)
76#define UD_SENSOR_STATUS_M2R (1<<11)
78#define UD_SENSOR_STATUS_IDX1D (1<<10)
80#define UD_SENSOR_STATUS_IDX2D (1<<9)
82#define UD_SENSOR_STATUS_IDX1T (1<<8)
84#define UD_SENSOR_STATUS_IDX2T (1<<7)
85
87#define UD_SENSOR_STATUS_ERROR (0xF<<0)
88
89/* sensor packet -> status -> ERROR : values */
91#define UD_SENSOR_STATUS_ERROR_NO_ERROR 0
93#define UD_SENSOR_STATUS_ERROR_ENCODER1 1
95#define UD_SENSOR_STATUS_ERROR_SPI_RECV_TIMEOUT 2
98#define UD_SENSOR_STATUS_ERROR_CRIT_TEMP 3 // currently unused
100#define UD_SENSOR_STATUS_ERROR_POSCONV 4
102#define UD_SENSOR_STATUS_ERROR_POS_ROLLOVER 5
104#define UD_SENSOR_STATUS_ERROR_ENCODER2 6
106#define UD_SENSOR_STATUS_ERROR_OTHER 7
108#define UD_LENGTH 14
109
110/* To properly handle SPI type conversion */
111#define SUB_REG_u16(p_packet, pos) (*((uint16_t *) ((p_packet) + (pos))))
112#define SUB_REG_u32(p_packet, pos) (*((uint32_t *) ((p_packet) + (pos))))
113
114#define SUB_REG_16(p_packet, pos) (*((int16_t *) ((p_packet) + (pos))))
115#define SUB_REG_32(p_packet, pos) (*((int32_t *) ((p_packet) + (pos))))
116
117
118
119#define D32Q24_TO_D16QN(a,n) ((a)>>(24-(n))&0xFFFF)
120#define D32Q24_TO_D8QN(a,n) ((a)>>(24-(n))&0xFF)
121
122#define uD16QN_TO_D32Q24(a,n) (((uint32_t)(a))<<(24-(n)))
123#define uD8QN_TO_D32Q24(a,n) (((uint32_t)(a))<<(24-(n)))
124
125#define D16QN_TO_D32Q24(a,n) (((int32_t)(a))<<(24-(n)))
126#define D8QN_TO_D32Q24(a,n) (((int32_t)(a))<<(24-(n)))
127
128#define D32QN_TO_FLOAT(a,n) ((float)(a)) / (1<<(n))
129#define D16QN_TO_FLOAT(a,n) ((float)(a)) / (1<<(n))
130#define D8QN_TO_FLOAT(a,n) ((float)(a)) / (1<<(n))
131
132#define FLOAT_TO_uD32QN(a,n) ((uint32_t) std::min(std::max(((a) * (1<<(n))), 0.0), 4294967295.0))
133#define FLOAT_TO_uD16QN(a,n) ((uint16_t) std::min(std::max(((a) * (1<<(n))), 0.0), 65535.0))
134#define FLOAT_TO_uD8QN(a,n) ((uint8_t) std::min(std::max(((a) * (1<<(n))), 0.0), 255.0))
135
136#define FLOAT_TO_D32QN(a,n) ((int32_t) std::min(std::max(((a) * (1<<(n))), -2147483647.0), 2147483647.0))
137#define FLOAT_TO_D16QN(a,n) ((int16_t) std::min(std::max((a) * (1<<(n)), -32767.0), 32767.0))
138#define FLOAT_TO_D8QN(a,n) ((int8_t) std::min(std::max(((a) * (1<<(n))), -127.0), +127.0))
139
140
141#endif