xrp style wpilib comms
Loading...
Searching...
No Matches
xrp_gyro.h
Go to the documentation of this file.
1#pragma once
2#define XRP_TAG_GYRO 0x16
3#include "message_type.h"
4
5typedef struct {
6 union {
7 float rates[3];
8 struct {
9 float x; // Gyro rate around X/roll axis
10 float y; // Gyro rate around Y/pitch axis
11 float z; // Gyro rate around Z/yaw axis
12 };
13 };
14 union {
15 float angles[3];
16 struct {
17 float roll; // Angle around X axis
18 float pitch; // Angle around Y axis
19 float yaw; // Angle around Z axis
20 };
21 };
23
24template <>
26 static constexpr uint8_t value = XRP_TAG_GYRO;
27 static constexpr bool hasId = false;
28};
29
30#include "byteutils.h"
31
32class XrpGyro : public MessageType {
33public:
35 : data({ { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } }) // Initialize with default values
36 {
37 }
38
39 XrpGyro(float xRate, float yRate, float zRate, float roll, float pitch, float yaw)
40 : data({ { xRate, yRate, zRate }, { roll, pitch, yaw } })
41 {
42 }
43
44 int getTag() override
45 {
46 return XRP_TAG_GYRO;
47 }
48 bool hasId() override
49 {
50 return false; // Gyro data does not have an ID
51 }
52 uint8_t getId() override
53 {
54 return 255; // No ID for gyro data
55 }
56 void setData(const void* dataPtr) override
57 {
58 if (dataPtr != nullptr) {
59 data = *static_cast<const xrp_gyro_t*>(dataPtr);
60 }
61 }
62 void* getData() override
63 {
64 return &data;
65 }
66 int toNetworkBuffer(char* buffer, int pos, int end) override
67 {
68 if (end - pos < 26) {
69 return 0;
70 }
71 buffer[pos] = 25; // size excluding itself
72 buffer[pos + 1] = XRP_TAG_GYRO;
73 floatToNetwork(data.rates[0], buffer, pos + 2);
74 floatToNetwork(data.rates[1], buffer, pos + 6);
75 floatToNetwork(data.rates[2], buffer, pos + 10);
76 floatToNetwork(data.angles[0], buffer, pos + 14);
77 floatToNetwork(data.angles[1], buffer, pos + 18);
78 floatToNetwork(data.angles[2], buffer, pos + 22);
79 return 26; // 1 for size, 1 for tag, 2*3*4=24 for values
80 }
81 int fromNetworkBuffer(char* buf, int pos, int end) override
82 {
83 return 0; // not implemented, it doesn't make much sense to get a gyro reading from the computer
84 // if (end - pos < 25) {
85 // return 0;
86 // }
87 // // buf[pos] is the tag, which should have already been confirmed to be XRP_TAG_GYRO
88 // data.rates[0] = networkToFloat(buf, pos + 1);
89 // data.rates[1] = networkToFloat(buf, pos + 5);
90 // data.rates[2] = networkToFloat(buf, pos + 9);
91 // data.angles[0] = networkToFloat(buf, pos + 13);
92 // data.angles[1] = networkToFloat(buf, pos + 17);
93 // data.angles[2] = networkToFloat(buf, pos + 21);
94 // return 25; // 1 byte for tag, 3*4=12 for rates, 3*4=12 for angles
95 }
96
97 // default destructor is fine
98
99protected:
101};
void floatToNetwork(float num, char *buf, int offset)
Definition byteutils.cpp:44
Definition message_type.h:3
Definition xrp_gyro.h:32
int fromNetworkBuffer(char *buf, int pos, int end) override
Definition xrp_gyro.h:81
XrpGyro()
Definition xrp_gyro.h:34
bool hasId() override
Definition xrp_gyro.h:48
void * getData() override
Definition xrp_gyro.h:62
int toNetworkBuffer(char *buffer, int pos, int end) override
Definition xrp_gyro.h:66
int getTag() override
Definition xrp_gyro.h:44
XrpGyro(float xRate, float yRate, float zRate, float roll, float pitch, float yaw)
Definition xrp_gyro.h:39
xrp_gyro_t data
Definition xrp_gyro.h:100
uint8_t getId() override
Definition xrp_gyro.h:52
void setData(const void *dataPtr) override
Definition xrp_gyro.h:56
Definition message_type.h:18
static constexpr uint8_t value
Definition message_type.h:19
Definition xrp_gyro.h:5
float angles[3]
Definition xrp_gyro.h:15
float z
Definition xrp_gyro.h:11
float rates[3]
Definition xrp_gyro.h:7
float yaw
Definition xrp_gyro.h:19
float pitch
Definition xrp_gyro.h:18
float y
Definition xrp_gyro.h:10
float roll
Definition xrp_gyro.h:17
float x
Definition xrp_gyro.h:9