Open FFBoard
Open source force feedback firmware
Loading...
Searching...
No Matches
FFBHIDMain.h
Go to the documentation of this file.
1/*
2 * FFBWheel.h
3 *
4 * Created on: 31.01.2020
5 * Author: Yannick
6 */
7
8#ifndef SRC_FFBWHEEL_H_
9#define SRC_FFBWHEEL_H_
10//#include <CmdParser.h>
11#include <CanAnalog.h>
12#include <FFBoardMain.h>
13#include <MotorPWM.h>
14
15#include "TMC4671.h"
16#include "flash_helpers.h"
17#include "ButtonSource.h"
18#include "EncoderLocal.h"
19
20#include "Axis.h"
21#include "cppmain.h"
22#include "HidFFB.h"
23#include "TimerHandler.h"
24#include "ClassChooser.h"
25#include "ExtiHandler.h"
26#include "AxesManager.h"
27#include "EffectsCalculator.h"
28#include "ffb_defs.h"
29#include "UsbHidHandler.h"
30#include "ErrorHandler.h"
31#include "memory"
32#include "HidCommandInterface.h"
33#include "SelectableInputs.h"
34#include "thread.hpp"
35
37#ifdef TIM_FFB
38, TimerHandler // Adds timer handler
39#endif
40{
44
45public:
46 FFBHIDMain(uint8_t axisCount,bool hidAxis32b = false);
47 virtual ~FFBHIDMain();
48 void setFFBEffectsCalc(std::shared_ptr<EffectsControlItf> ffb,std::shared_ptr<EffectsCalculator> effects_calc);
49
50 //static ClassIdentifier info;
52 static bool isCreatable() {return true;};
53
54 CommandStatus command(const ParsedCommand& cmd,std::vector<CommandReply>& replies);
55 void registerCommands();
56 virtual std::string getHelpstring(){
57 return "Force feedback HID game controller";
58 }
59
60
61 virtual void usbInit() = 0; // initialize a composite usb device
62 void usbSuspend(); // Called on usb disconnect and suspend
63 void usbResume(); // Called on usb resume
64
65 void saveFlash();
66 void restoreFlash();
67
68 void Run();
69 void updateControl();
70
71 void emergencyStop(bool reset);
72 uint32_t getRate();
73 bool getFfbActive();
74
75 //void timerElapsed(TIM_HandleTypeDef* htim);
76 void exti(uint16_t GPIO_Pin);
77
78 void errorCallback(const Error &error, bool cleared);
79
80 void systick();
81#ifdef TIM_FFB
82 void timerElapsed(TIM_HandleTypeDef* htim);
83#endif
84
85 float getCurFFBFreq();
86
87protected:
88 std::shared_ptr<EffectsControlItf> ffb;
89 std::shared_ptr<EffectsCalculator> effects_calc;
90 uint8_t axisCount=0;
91
92private:
94 void send_report();
95 const bool allowEstopReset = true; // Resets the Estop when the pin is released
96 //bool lastEstopState = false;
97 const Error estopError = Error(ErrorCode::emergencyStop, ErrorType::critical, "Emergency stop button triggered");
98
99 /* USB Report rate
100 * Warning: Report rate initialized by bInterval is overridden by saved speed preset at startup!
101 */
102 void setReportRate(uint8_t rateidx);
103 uint8_t usb_report_rate = HID_BINTERVAL; //for FS USB 1 = 1000hz, 2 = 500hz, 3 = 333hz 4 = 250hz, 5 = 200hz 6 = 166hz, 8 = 125hz etc...
104 uint8_t usb_report_rate_idx = ffbrates.defaultmode;
105#ifndef TIM_FFB
106 uint8_t ffb_rate_divider = 1;
107 uint8_t ffb_rate_counter = 0;
108#endif
109
110
113 uint8_t basediv;
114 uint8_t hiddiv;
115 };
116
117#if TUD_OPT_HIGH_SPEED // divider pair <FFB div, USB div from base>
118 const uint8_t defaultmode = 3;
119 uint32_t basefreq = 8000;
120 std::array<FFB_update_rate_divider,7> dividers = {{{1,1},{2,1},{4,1},{8,1},{16,1},{32,1},{64,1}}}; // 8khz to 125hz
121#else
122 const uint8_t defaultmode = 0;
123 uint32_t basefreq = 1000;
124 std::array<FFB_update_rate_divider,4> dividers = {{{1,1},{2,1},{4,1},{8,1}}}; // 8 entries max. 1khz to 125hz
125#endif
126 };
128
129 const bool hidAxis32b;
130
131 std::string usb_report_rates_names();
132
133 uint8_t report_rate_cnt = 0;
134
135 std::unique_ptr<AxesManager> axes_manager;
136 //TIM_HandleTypeDef* timer_update;
137
138 std::vector<std::unique_ptr<ButtonSource>> btns;
139 std::vector<std::unique_ptr<AnalogSource>> analog_inputs;
140
141 std::unique_ptr<HID_GamepadReport_base> reportHID;
142
143 uint8_t reportSendCounter = 0;
144
145 const uint8_t analogAxisCount = 8;
146 //HID_CommandInterface hidCommands; // Enables full HID control
147 std::unique_ptr<HID_CommandInterface> hidCommands = std::make_unique<HID_CommandInterface>();
148
149 uint32_t lastUsbReportTick = 0;
150
151 volatile uint32_t lastEstop = 0;
152};
153
154#endif /* SRC_FFBWHEEL_H_ */
CommandStatus
std::shared_ptr< EffectsControlItf > ffb
Definition FFBHIDMain.h:88
uint8_t ffb_rate_counter
Definition FFBHIDMain.h:107
uint32_t getRate()
void setReportRate(uint8_t rateidx)
void usbResume()
void usbSuspend()
std::string usb_report_rates_names()
void exti(uint16_t GPIO_Pin)
static bool isCreatable()
Definition FFBHIDMain.h:52
uint8_t ffb_rate_divider
Definition FFBHIDMain.h:106
volatile Control_t control
Definition FFBHIDMain.h:93
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
void systick()
uint8_t usb_report_rate
Definition FFBHIDMain.h:103
void restoreFlash()
const Error estopError
Definition FFBHIDMain.h:97
const bool hidAxis32b
Definition FFBHIDMain.h:129
uint8_t axisCount
Definition FFBHIDMain.h:90
std::vector< std::unique_ptr< ButtonSource > > btns
Definition FFBHIDMain.h:138
static const FFB_update_rates ffbrates
Definition FFBHIDMain.h:127
void saveFlash()
volatile uint32_t lastEstop
Definition FFBHIDMain.h:151
uint8_t usb_report_rate_idx
Definition FFBHIDMain.h:104
virtual std::string getHelpstring()
Definition FFBHIDMain.h:56
std::unique_ptr< AxesManager > axes_manager
Definition FFBHIDMain.h:135
const bool allowEstopReset
Definition FFBHIDMain.h:95
void setFFBEffectsCalc(std::shared_ptr< EffectsControlItf > ffb, std::shared_ptr< EffectsCalculator > effects_calc)
void timerElapsed(TIM_HandleTypeDef *htim)
bool getFfbActive()
FFBHIDMain(uint8_t axisCount, bool hidAxis32b=false)
const uint8_t analogAxisCount
Definition FFBHIDMain.h:145
virtual ~FFBHIDMain()
void send_report()
std::vector< std::unique_ptr< AnalogSource > > analog_inputs
Definition FFBHIDMain.h:139
std::shared_ptr< EffectsCalculator > effects_calc
Definition FFBHIDMain.h:89
uint8_t report_rate_cnt
Definition FFBHIDMain.h:133
std::unique_ptr< HID_GamepadReport_base > reportHID
Definition FFBHIDMain.h:141
void updateControl()
const ClassIdentifier getInfo()=0
void errorCallback(const Error &error, bool cleared)
float getCurFFBFreq()
std::unique_ptr< HID_CommandInterface > hidCommands
Definition FFBHIDMain.h:147
uint32_t lastUsbReportTick
Definition FFBHIDMain.h:149
virtual void usbInit()=0
uint8_t reportSendCounter
Definition FFBHIDMain.h:143
SelectableInputs(const ClassChooser< ButtonSource > &btn_chooser, const ClassChooser< AnalogSource > &analog_chooser)
std::array< FFB_update_rate_divider, 7 > dividers
Definition FFBHIDMain.h:120