Open FFBoard
Open source force feedback firmware
Loading...
Searching...
No Matches
ffb_defs.h
Go to the documentation of this file.
1/*
2 * ffb_defs.h
3 *
4 * Created on: Feb 9, 2020
5 * Author: Yannick
6 */
7
8#ifndef FFB_DEFS_H_
9#define FFB_DEFS_H_
10
11#include "cppmain.h"
12#include "Filters.h"
13#include "constants.h" // For #define MAX_AXIS
14#define FFB_ID_OFFSET 0x00
15#define MAX_EFFECTS 40
16
17// HID Descriptor definitions - Axes
18#define HID_USAGE_X 0x30
19#define HID_USAGE_Y 0x31
20#define HID_USAGE_Z 0x32
21#define HID_USAGE_RX 0x33
22#define HID_USAGE_RY 0x34
23#define HID_USAGE_RZ 0x35
24#define HID_USAGE_SL0 0x36
25#define HID_USAGE_SL1 0x37
26#define HID_USAGE_WHL 0x38
27#define HID_USAGE_POV 0x39
28
29// HID Descriptor definitions - FFB Effects
30#define HID_USAGE_CONST 0x26 // Usage ET Constant Force
31#define HID_USAGE_RAMP 0x27 // Usage ET Ramp
32#define HID_USAGE_SQUR 0x30 // Usage ET Square
33#define HID_USAGE_SINE 0x31 // Usage ET Sine
34#define HID_USAGE_TRNG 0x32 // Usage ET Triangle
35#define HID_USAGE_STUP 0x33 // Usage ET Sawtooth Up
36#define HID_USAGE_STDN 0x34 // Usage ET Sawtooth Down
37#define HID_USAGE_SPRNG 0x40 // Usage ET Spring
38#define HID_USAGE_DMPR 0x41 // Usage ET Damper
39#define HID_USAGE_INRT 0x42 // Usage ET Inertia
40#define HID_USAGE_FRIC 0x43 // Usage ET Friction
41
42
43// HID Descriptor definitions - FFB Report IDs
44#define HID_ID_STATE 0x02 // Usage PID State report
45
46#define HID_ID_EFFREP 0x01 // Usage Set Effect Report
47#define HID_ID_ENVREP 0x02 // Usage Set Envelope Report
48#define HID_ID_CONDREP 0x03 // Usage Set Condition Report
49#define HID_ID_PRIDREP 0x04 // Usage Set Periodic Report
50#define HID_ID_CONSTREP 0x05 // Usage Set Constant Force Report
51#define HID_ID_RAMPREP 0x06 // Usage Set Ramp Force Report
52#define HID_ID_CSTMREP 0x07 // Usage Custom Force Data Report
53#define HID_ID_SMPLREP 0x08 // Usage Download Force Sample
54#define HID_ID_EFOPREP 0x0A // Usage Effect Operation Report
55#define HID_ID_BLKFRREP 0x0B // Usage PID Block Free Report
56#define HID_ID_CTRLREP 0x0C // Usage PID Device Control
57#define HID_ID_GAINREP 0x0D // Usage Device Gain Report
58#define HID_ID_SETCREP 0x0E // Usage Set Custom Force Report
59// Features
60#define HID_ID_NEWEFREP 0x11 // Usage Create New Effect Report
61#define HID_ID_BLKLDREP 0x12 // Usage Block Load Report
62#define HID_ID_POOLREP 0x13 // Usage PID Pool Report
63
64// Control
65#define HID_ID_CUSTOMCMD 0xAF // Custom cmd (old. reserved)
66#define HID_ID_HIDCMD 0xA1 // HID cmd
67#define HID_ID_STRCMD 0xAC // HID cmd as string. reserved
68//#define HID_ID_CUSTOMCMD_IN 0xA2 // Custom cmd in. reserved
69//#define HID_ID_CUSTOMCMD_OUT 0xA1 // Custom cmd out. reserved
70
71
72#define FFB_EFFECT_NONE 0x00
73#define FFB_EFFECT_CONSTANT 0x01
74#define FFB_EFFECT_RAMP 0x02
75#define FFB_EFFECT_SQUARE 0x03
76#define FFB_EFFECT_SINE 0x04
77#define FFB_EFFECT_TRIANGLE 0x05
78#define FFB_EFFECT_SAWTOOTHUP 0x06
79#define FFB_EFFECT_SAWTOOTHDOWN 0x07
80#define FFB_EFFECT_SPRING 0x08
81#define FFB_EFFECT_DAMPER 0x09
82#define FFB_EFFECT_INERTIA 0x0A
83#define FFB_EFFECT_FRICTION 0x0B
84#define FFB_EFFECT_CUSTOM 0x0C
85
86#define HID_ACTUATOR_POWER 0x08
87#define HID_SAFETY_SWITCH 0x04
88#define HID_ENABLE_ACTUATORS 0x02
89#define HID_EFFECT_PAUSE 0x01
90#define HID_ENABLE_ACTUATORS_MASK 0xFD
91#define HID_EFFECT_PLAYING 0x10
92
93#define HID_DIRECTION_ENABLE 0x04
94#define FFB_EFFECT_DURATION_INFINITE 0xffff
95
96// Only include these for cpp
97#ifdef __cplusplus
98
99
100template<class dtypeaxis>
101struct __attribute__((__packed__)) reportHID_t {
102 uint8_t id = 1;
103 uint64_t buttons = 0;
104#if MAX_AXIS >= 1
105 dtypeaxis X = 0;
106#else
107 int16_t X = 0;
108#endif
109#if MAX_AXIS >= 2
110 dtypeaxis Y = 0;
111#else
112 int16_t Y = 0;
113#endif
114#if MAX_AXIS >= 3
115 dtypeaxis Z = 0;
116#else
117 int16_t Z = 0;
118#endif
119 int16_t RX = 0;
120 int16_t RY = 0;
121 int16_t RZ = 0;
122 int16_t Dial = 0;
123 int16_t Slider = 0;
124};
125
130public:
131 virtual void setHidReportAxis(uint8_t idx, uint32_t val) = 0;
132 virtual uint8_t* getBuffer() = 0;
133 virtual uint32_t getLength() = 0;
134 virtual uint64_t getButtons() = 0;
135 virtual void setButtons(uint64_t btn) = 0;
136 virtual bool changed() = 0;
137 virtual void swap() = 0;
138};
139
140template<class dtypeaxis>
142private:
143 reportHID_t<dtypeaxis> report1;
144 reportHID_t<dtypeaxis> report2;
145 reportHID_t<dtypeaxis>* report = &report1;
146
147public:
148 uint64_t getButtons() override {return report->buttons;}
149 void setButtons(uint64_t btn) override {report->buttons = btn;}
150
151 void setHidReportAxis(uint8_t idx, uint32_t val) override {
152 switch(idx){
153 case 0:
154 report->X = val;
155 break;
156 case 1:
157 report->Y = val;
158 break;
159 case 2:
160 report->Z = val;
161 break;
162 case 3:
163 report->RX = val;
164 break;
165 case 4:
166 report->RY = val;
167 break;
168 case 5:
169 report->RZ = val;
170 break;
171 case 6:
172 report->Dial = val;
173 break;
174 case 7:
175 report->Slider = val;
176 break;
177 default:
178 return;
179 }
180 }
181 bool changed() override {return memcmp(&report1,&report2,sizeof(reportHID_t<dtypeaxis>)) != 0;}
182 void swap() override {report = (report == &report1 ? &report2 : &report1);} // Swaps report buffers
183
184 uint32_t getLength() override {return sizeof(reportHID_t<dtypeaxis>);}
185 uint8_t* getBuffer() override {return reinterpret_cast<uint8_t*>(this->report);}
186
187};
188
189
190typedef struct
191{
192 const uint8_t reportId = HID_ID_STATE+FFB_ID_OFFSET;
193 //uint8_t effectBlockIndex = 1; //EffectId
194 uint8_t status = (HID_ACTUATOR_POWER) | (HID_ENABLE_ACTUATORS); // Bits: 0=Device Paused,1=Actuators Enabled,2=Safety Switch,3=Actuator Power, 4=Effect Playing
195
196} __attribute__((packed)) reportFFB_status_t;
197
198
199
200typedef struct
201 {
202 uint8_t reportId = 1;
203 uint8_t effectBlockIndex = 0; // 1..max_effects
204 uint8_t effectType = 0;
205 uint16_t duration = 0; // 0..32767 ms
206 uint16_t triggerRepeatInterval = 0; // 0..32767 ms
207 uint16_t samplePeriod = 0; // 0..32767 ms
208 uint16_t startDelay = 0; // 0..32767 ms
209 uint8_t gain = 255; // 0..255 scaler
210 uint8_t triggerButton = 0; // button ID. unused
211 uint8_t enableAxis = 0; // bits: 0=X, 1=Y, 2=DirectionEnable
212 uint16_t directionX = 0; // angle (0=0 .. 36000=360deg)
213 uint16_t directionY = 0; // angle (0=0 .. 36000=360deg) TODO axes are last bytes in struct if fewer axes are used. use different report if this is not enough anymore!
214//#if MAX_AXIS == 3
215// uint8_t directionZ = 0; // angle (0=0 .. 255=360deg)
216//#endif
217 // uint16_t typeSpecificBlockOffsetX = 0; // Needed?
218 // uint16_t typeSpecificBlockOffsetY = 0;
219// uint16_t startDelay; // 0..32767 ms
220} __attribute__((packed)) FFB_SetEffect_t;
221
222typedef struct
223 {
224 uint8_t reportId;
225 uint8_t effectBlockIndex; // 1..max_effects
226 uint8_t parameterBlockOffset; // bits: 0..3=parameterBlockOffset, 4..5=instance1, 6..7=instance2
227 int16_t cpOffset; // Center
228 int16_t positiveCoefficient; // Scaler for positive range
230 uint16_t positiveSaturation; // Clipping point for positive range
232 uint16_t deadBand;
233} __attribute__((packed)) FFB_SetCondition_Data_t;
234
235
236typedef struct
237 {
238 //uint8_t reportId; // ID removed by tinyusb
239 uint8_t effectType; // Effect type ID
240 uint16_t byteCount; // Size of custom effects
241} __attribute__((packed)) FFB_CreateNewEffect_Feature_Data_t;
242
243// Feature GET report
244typedef struct
245 {
246 //uint8_t reportId = HID_ID_BLKLDREP; // No report ID for tinyusb feature GET
247 uint8_t effectBlockIndex; // 1..max_effects
248 uint8_t loadStatus; // 1=Success,2=Full,3=Error
250} __attribute__((packed)) FFB_BlockLoad_Feature_Data_t;
251
252typedef struct
253 {
254 //uint8_t reportId = HID_ID_POOLREP; // No report ID for tinyusb feature GET
255 uint16_t ramPoolSize = MAX_EFFECTS;
256 uint8_t maxSimultaneousEffects = MAX_EFFECTS;
257 uint8_t memoryManagement = 1; // 0=DeviceManagedPool (0/1), 1=SharedParameterBlocks (0/1)
258} __attribute__((packed)) FFB_PIDPool_Feature_Data_t;
259
260
261typedef struct
262 {
263 uint8_t reportId;
264 uint8_t effectBlockIndex;
265 uint16_t magnitude;
266 int16_t offset;
267 uint16_t phase; // degrees
268 uint32_t period; // 0..32767 ms
269} __attribute__((packed)) FFB_SetPeriodic_Data_t;
270
271typedef struct
272{
273 uint8_t reportId;
274 uint8_t effectBlockIndex;
275 uint16_t attackLevel;
276 uint16_t fadeLevel;
277 uint32_t attackTime;
278 uint32_t fadeTime;
279} __attribute__((packed)) FFB_SetEnvelope_Data_t;
280
281typedef struct
282{
283 uint8_t reportId;
284 uint8_t effectBlockIndex;
285 uint16_t startLevel;
286 uint16_t endLevel;
287} __attribute__((packed)) FFB_SetRamp_Data_t;
288
289typedef struct
290{
291 int16_t cpOffset = 0; // Center point
294 uint16_t positiveSaturation = 0;
295 uint16_t negativeSaturation = 0;
296 uint16_t deadBand = 0;
297
298 bool isActive(){ // Condition is active if either coefficient is not zero
300 }
302
303typedef struct
304{
305 uint8_t reportId;
306 uint8_t effectBlockIndex;
307 uint8_t state;
308 uint8_t loopCount;
309} __attribute__((packed)) FFB_EffOp_Data_t;
310
311// Internal struct for storing effects
312typedef struct
313{
314 volatile uint8_t state = 0;
315 uint8_t type = FFB_EFFECT_NONE; // Type
316 int16_t offset = 0; // Center point
317 uint8_t gain = 255; // Scaler. often unused
318 int16_t magnitude = 0; // High res intensity of effect
319 int16_t startLevel = 0; // Ramp effect
320 int16_t endLevel = 0; // Ramp effect
321 float axisMagnitudes[MAX_AXIS] = {0}; // 0=0,100%=1
322
324 int16_t phase = 0;
325 uint16_t period = 0;
326 uint32_t duration = FFB_EFFECT_DURATION_INFINITE; // Duration in ms
327 uint16_t attackLevel = 0, fadeLevel = 0; // Envelope effect
328 uint32_t attackTime = 0, fadeTime = 0; // Envelope effect
329
330 std::unique_ptr<Biquad> filter[MAX_AXIS] = { nullptr }; // Optional filter
331 uint16_t startDelay = 0;
332 uint32_t startTime = 0; // Elapsed time in ms before effect starts
333 uint16_t samplePeriod = 0;
334 bool useEnvelope = false;
336} FFB_Effect;
337
338
339
340// --------------- Effects------------------------
341typedef struct
342 {
343 uint8_t reportId;
344 uint8_t effectBlockIndex; // 1..max_effects
345 int16_t magnitude; // High res intensity
346} __attribute__((packed)) FFB_SetConstantForce_Data_t;
347
348#endif //c++
349
350#endif /* FFB_DEFS_H_ */
virtual uint64_t getButtons()=0
virtual bool changed()=0
Must use setter to prevent unaligned access.
virtual void setButtons(uint64_t btn)=0
virtual uint32_t getLength()=0
virtual void swap()=0
virtual void setHidReportAxis(uint8_t idx, uint32_t val)=0
virtual uint8_t * getBuffer()=0
uint64_t getButtons() override
Definition ffb_defs.h:148
reportHID_t< dtypeaxis > report2
Definition ffb_defs.h:144
reportHID_t< dtypeaxis > report1
Definition ffb_defs.h:143
void setHidReportAxis(uint8_t idx, uint32_t val) override
Definition ffb_defs.h:151
bool changed() override
Must use setter to prevent unaligned access.
Definition ffb_defs.h:181
reportHID_t< dtypeaxis > * report
Definition ffb_defs.h:145
void swap() override
Definition ffb_defs.h:182
uint8_t * getBuffer() override
Definition ffb_defs.h:185
void setButtons(uint64_t btn) override
Definition ffb_defs.h:149
uint32_t getLength() override
Definition ffb_defs.h:184
struct __attribute__((__packed__)) reportHID_t
Definition ffb_defs.h:101
int16_t positiveCoefficient
Definition ffb_defs.h:228
uint8_t memoryManagement
Definition ffb_defs.h:257
uint8_t parameterBlockOffset
Definition ffb_defs.h:226
uint16_t startLevel
Definition ffb_defs.h:285
uint32_t fadeTime
Definition ffb_defs.h:278
uint16_t duration
Definition ffb_defs.h:205
uint16_t startDelay
Definition ffb_defs.h:208
uint8_t effectBlockIndex
Definition ffb_defs.h:203
uint16_t negativeSaturation
Definition ffb_defs.h:231
uint8_t triggerButton
Definition ffb_defs.h:210
uint8_t enableAxis
Definition ffb_defs.h:211
uint16_t ramPoolAvailable
Definition ffb_defs.h:249
uint16_t magnitude
Definition ffb_defs.h:265
uint8_t maxSimultaneousEffects
Definition ffb_defs.h:256
uint8_t effectType
Definition ffb_defs.h:204
uint16_t phase
Definition ffb_defs.h:267
uint8_t status
Definition ffb_defs.h:194
uint16_t triggerRepeatInterval
Definition ffb_defs.h:206
const uint8_t reportId
Definition ffb_defs.h:192
uint32_t attackTime
Definition ffb_defs.h:277
int16_t offset
Definition ffb_defs.h:266
uint16_t directionX
Definition ffb_defs.h:212
uint8_t loopCount
Definition ffb_defs.h:308
uint16_t samplePeriod
Definition ffb_defs.h:207
uint8_t gain
Definition ffb_defs.h:209
uint8_t loadStatus
Definition ffb_defs.h:248
uint8_t state
Definition ffb_defs.h:307
uint16_t fadeLevel
Definition ffb_defs.h:276
int16_t negativeCoefficient
Definition ffb_defs.h:229
uint16_t endLevel
Definition ffb_defs.h:286
int16_t cpOffset
Definition ffb_defs.h:227
uint16_t deadBand
Definition ffb_defs.h:232
uint16_t positiveSaturation
Definition ffb_defs.h:230
uint16_t directionY
Definition ffb_defs.h:213
uint16_t attackLevel
Definition ffb_defs.h:275
uint16_t ramPoolSize
Definition ffb_defs.h:255
uint16_t byteCount
Definition ffb_defs.h:240
uint32_t period
Definition ffb_defs.h:268
uint16_t negativeSaturation
Definition ffb_defs.h:295
int16_t negativeCoefficient
Definition ffb_defs.h:293
int16_t positiveCoefficient
Definition ffb_defs.h:292
uint16_t positiveSaturation
Definition ffb_defs.h:294
uint16_t period
Definition ffb_defs.h:325
bool useEnvelope
Definition ffb_defs.h:334
uint16_t startDelay
Definition ffb_defs.h:331
int16_t startLevel
Definition ffb_defs.h:319
uint8_t type
Definition ffb_defs.h:315
bool useSingleCondition
Definition ffb_defs.h:335
uint8_t gain
Definition ffb_defs.h:317
std::unique_ptr< Biquad > filter[MAX_AXIS]
Definition ffb_defs.h:330
uint32_t duration
Definition ffb_defs.h:326
int16_t magnitude
Definition ffb_defs.h:318
uint32_t attackTime
Definition ffb_defs.h:328
float axisMagnitudes[MAX_AXIS]
Definition ffb_defs.h:321
FFB_Effect_Condition conditions[MAX_AXIS]
Definition ffb_defs.h:323
uint16_t attackLevel
Definition ffb_defs.h:327
int16_t endLevel
Definition ffb_defs.h:320
volatile uint8_t state
Definition ffb_defs.h:314
uint32_t startTime
Definition ffb_defs.h:332
uint32_t fadeTime
Definition ffb_defs.h:328
uint16_t samplePeriod
Definition ffb_defs.h:333
int16_t offset
Definition ffb_defs.h:316
uint16_t fadeLevel
Definition ffb_defs.h:327
int16_t phase
Definition ffb_defs.h:324