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
87 void update() override;
88
89protected:
90 std::shared_ptr<EffectsControlItf> ffb;
91 std::shared_ptr<EffectsCalculator> effects_calc;
92 uint8_t axisCount=0;
93
94private:
96 void send_report();
97 const bool allowEstopReset = true; // Resets the Estop when the pin is released
98 //bool lastEstopState = false;
99 const Error estopError = Error(ErrorCode::emergencyStop, ErrorType::critical, "Emergency stop button triggered");
100
101 /* USB Report rate
102 * Warning: Report rate initialized by bInterval is overridden by saved speed preset at startup!
103 */
104 void setReportRate(uint8_t rateidx);
105 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...
106 uint8_t usb_report_rate_idx = ffbrates.defaultmode;
107#ifndef TIM_FFB
108 uint8_t ffb_rate_divider = 1;
109 uint8_t ffb_rate_counter = 0;
110#endif
111
112
115 uint8_t basediv;
116 uint8_t hiddiv;
117 };
118
119#if TUD_OPT_HIGH_SPEED // divider pair <FFB div, USB div from base>
120 const uint8_t defaultmode = 3;
121 uint32_t basefreq = 8000;
122 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
123#else
124 const uint8_t defaultmode = 0;
125 uint32_t basefreq = 1000;
126 std::array<FFB_update_rate_divider,4> dividers = {{{1,1},{2,1},{4,1},{8,1}}}; // 8 entries max. 1khz to 125hz
127#endif
128 };
130
131 const bool hidAxis32b;
132
133 std::string usb_report_rates_names();
134
135 uint8_t report_rate_cnt = 0;
136
137 std::unique_ptr<AxesManager> axes_manager;
138 //TIM_HandleTypeDef* timer_update;
139
140 std::vector<std::unique_ptr<ButtonSource>> btns;
141 std::vector<std::unique_ptr<AnalogSource>> analog_inputs;
142
143 std::unique_ptr<HID_GamepadReport_base> reportHID;
144
145 uint8_t reportSendCounter = 0;
146
147 const uint8_t analogAxisCount = 8;
148 //HID_CommandInterface hidCommands; // Enables full HID control
149 std::unique_ptr<HID_CommandInterface> hidCommands = std::make_unique<HID_CommandInterface>();
150
151 uint32_t lastUsbReportTick = 0;
152
153 volatile uint32_t lastEstop = 0;
154};
155
156#endif /* SRC_FFBWHEEL_H_ */
CommandStatus
std::shared_ptr< EffectsControlItf > ffb
Definition FFBHIDMain.h:90
uint8_t ffb_rate_counter
Definition FFBHIDMain.h:109
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:108
volatile Control_t control
Definition FFBHIDMain.h:95
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
void systick()
uint8_t usb_report_rate
Definition FFBHIDMain.h:105
void restoreFlash()
const Error estopError
Definition FFBHIDMain.h:99
const bool hidAxis32b
Definition FFBHIDMain.h:131
uint8_t axisCount
Definition FFBHIDMain.h:92
std::vector< std::unique_ptr< ButtonSource > > btns
Definition FFBHIDMain.h:140
static const FFB_update_rates ffbrates
Definition FFBHIDMain.h:129
void saveFlash()
volatile uint32_t lastEstop
Definition FFBHIDMain.h:153
uint8_t usb_report_rate_idx
Definition FFBHIDMain.h:106
virtual std::string getHelpstring()
Definition FFBHIDMain.h:56
std::unique_ptr< AxesManager > axes_manager
Definition FFBHIDMain.h:137
const bool allowEstopReset
Definition FFBHIDMain.h:97
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:147
virtual ~FFBHIDMain()
void send_report()
std::vector< std::unique_ptr< AnalogSource > > analog_inputs
Definition FFBHIDMain.h:141
std::shared_ptr< EffectsCalculator > effects_calc
Definition FFBHIDMain.h:91
uint8_t report_rate_cnt
Definition FFBHIDMain.h:135
void update() override
std::unique_ptr< HID_GamepadReport_base > reportHID
Definition FFBHIDMain.h:143
void updateControl()
const ClassIdentifier getInfo()=0
void errorCallback(const Error &error, bool cleared)
float getCurFFBFreq()
std::unique_ptr< HID_CommandInterface > hidCommands
Definition FFBHIDMain.h:149
uint32_t lastUsbReportTick
Definition FFBHIDMain.h:151
virtual void usbInit()=0
uint8_t reportSendCounter
Definition FFBHIDMain.h:145
SelectableInputs(const ClassChooser< ButtonSource > &btn_chooser, const ClassChooser< AnalogSource > &analog_chooser)
std::array< FFB_update_rate_divider, 7 > dividers
Definition FFBHIDMain.h:122