Open FFBoard
Open source force feedback firmware
global_callbacks.cpp
Go to the documentation of this file.
1/*
2 * global_callbacks.cpp
3 *
4 * Created on: 23.01.2020
5 * Author: Yannick
6 */
7
8#include "vector"
9#include <global_callbacks.h>
10#include "main.h"
11#include "cppmain.h"
12#include "FFBoardMain.h"
13#include "ledEffects.h"
14#include "voltagesense.h"
15#include "constants.h"
16
17#include "UsbHidHandler.h"
18#include "PersistentStorage.h"
19#include "ExtiHandler.h"
20#include "UartHandler.h"
21#include "AdcHandler.h"
22#include "TimerHandler.h"
23#include "CommandHandler.h"
24#include "EffectsCalculator.h"
25#include "SpiHandler.h"
26#include "HidCommandInterface.h"
27#include "I2CHandler.h"
28
29#ifdef CANBUS
30#include "CanHandler.h"
31#include "CAN.h"
32#endif
33
34#ifdef MIDI
35#include "MidiHandler.h"
36#include "midi_device.h"
37#endif
38
39#include "cdc_device.h"
40#include "CDCcomm.h"
41
43
44#ifdef ADC1_CHANNELS
45volatile uint32_t ADC1_BUF[ADC1_CHANNELS] = {0};
46extern ADC_HandleTypeDef hadc1;
47#endif
48#ifdef ADC2_CHANNELS
49volatile uint32_t ADC2_BUF[ADC2_CHANNELS] = {0};
50extern ADC_HandleTypeDef hadc2;
51#endif
52#ifdef ADC3_CHANNELS
53volatile uint32_t ADC3_BUF[ADC3_CHANNELS] = {0};
54extern ADC_HandleTypeDef hadc3;
55#endif
56
60void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
61 //Pulse braking mosfet if internal voltage is higher than supply.
62 if(hadc == &VSENSE_HADC)
63 brakeCheck();
64
65 uint8_t chans = 0;
66 volatile uint32_t* buf = getAnalogBuffer(hadc,&chans);
67 if(buf == NULL)
68 return;
69
71 c->adcUpd(buf,chans,hadc);
72 }
73
74}
75
80__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim){
82}
83
84void HAL_TIM_PeriodElapsedCallback_CPP(TIM_HandleTypeDef* htim) {
86 c->timerElapsed(htim);
87 }
88}
89
93void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
95 c->exti(GPIO_Pin);
96 }
97}
98
99void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
101 c->uartRxComplete(huart);
102 }
103}
104
105void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
107 c->uartTxComplete(huart);
108 }
109}
110
111#ifdef CANBUS
112// CAN
113#ifdef CANTYPE_CAN2B
114// RX
115void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan){
116 CANPort* portInst = CANPort::handleToPort(hcan);
117 for(uint8_t i = 0; i < HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO0); i++){
118 CAN_rx_msg msg;
119 CAN_RxHeaderTypeDef canRxHeader; // Receive header 0
120 if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &canRxHeader, msg.data) == HAL_OK){
121 msg.header = CAN_msg_header_rx(&canRxHeader);
122 msg.fifo = 0;
124 c->canRxPendCallback(portInst,msg);
125 }
126 }
127 }
128}
129void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan){
130 CANPort* portInst = CANPort::handleToPort(hcan);
131 for(uint8_t i = 0; i < HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO1); i++){
132 CAN_rx_msg msg;
133 CAN_RxHeaderTypeDef canRxHeader; // Receive header 1
134 if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &canRxHeader, msg.data) == HAL_OK){
135 msg.header = CAN_msg_header_rx(&canRxHeader);
136 msg.fifo = 1;
138 c->canRxPendCallback(portInst,msg);
139 }
140 }
141 }
142}
143
144void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan){
146 c->canRxFullCallback(CANPort::handleToPort(hcan),0);
147 }
148}
149void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan){
151 c->canRxFullCallback(CANPort::handleToPort(hcan),1);
152 }
153}
155void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan){
157 c->canTxCpltCallback(CANPort::handleToPort(hcan),0);
158 }
159}
160void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan){
162 c->canTxCpltCallback(CANPort::handleToPort(hcan),1);
163 }
164}
165void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan){
167 c->canTxCpltCallback(CANPort::handleToPort(hcan),2);
168 }
169}
170void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan){
172 c->canTxAbortCallback(CANPort::handleToPort(hcan),0);
173 }
174}
175void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan){
177 c->canTxAbortCallback(CANPort::handleToPort(hcan),1);
178 }
179}
180void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan){
182 c->canTxAbortCallback(CANPort::handleToPort(hcan),2);
183 }
184}
185
186void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan){
188 c->canErrorCallback(CANPort::handleToPort(hcan),hcan->ErrorCode);
189 }
190 hcan->ErrorCode = 0; // Clear errors
191}
192#endif
193
194#endif
195
196// SPI
197
198void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi){
200 c->SpiTxCplt(hspi);
201 }
202}
203
204void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi){
206 c->SpiRxCplt(hspi);
207 }
208}
209
210void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi){
212 c->SpiTxRxCplt(hspi);
213 }
214}
215
216void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi){
218 c->SpiTxHalfCplt(hspi);
219 }
220}
221
222void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi){
224 c->SpiRxHalfCplt(hspi);
225 }
226}
227
228void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi){
230 c->SpiTxRxHalfCplt(hspi);
231 }
232}
233
234void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi){
236 c->SpiError(hspi);
237 }
238}
239
240// I2C
241
242void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef * hi2c){
244 c->I2cTxCplt(hi2c);
245 }
246}
247
248void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef * hi2c){
250 c->I2cRxCplt(hi2c);
251 }
252}
253
254void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef * hi2c){
256 c->I2cTxCplt(hi2c);
257 }
258}
259
260void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef * hi2c){
262 c->I2cRxCplt(hi2c);
263 }
264}
265
266void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c){
268 c->I2cError(hi2c);
269 }
270}
271
272
273//void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
274//void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
275
276// USB Callbacks
278uint8_t const * tud_descriptor_device_cb(void){
280}
281
282uint8_t const * tud_descriptor_configuration_cb(uint8_t index){
283 return usb_device->getUsbConfigurationDesc(index);
284}
285
286uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid){
287 return usb_device->getUsbStringDesc(index, langid);
288}
289
290uint8_t const * tud_hid_descriptor_report_cb(uint8_t itf){
292}
293
294void tud_cdc_rx_cb(uint8_t itf){
295 pulseSysLed();
296 if(mainclass!=nullptr){
298 }
299}
300
301void tud_cdc_tx_complete_cb(uint8_t itf){
302
304}
305
306
307
312void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize){
313 if((report_type == HID_REPORT_TYPE_INVALID || report_type == HID_REPORT_TYPE_OUTPUT) && report_id == 0){
314 report_id = *buffer;
315 }
316
319
320 if(report_id == HID_ID_HIDCMD){
323 }
324
325
326}
327
331uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type,uint8_t* buffer, uint16_t reqlen){
333 return UsbHidHandler::globalHidHandler->hidGet(report_id, report_type, buffer,reqlen); // reply buffer should not contain report ID in first byte
334 return 0;
335}
336
340void tud_hid_report_complete_cb(uint8_t itf, uint8_t const* report, uint8_t len){
343 }
344 if(UsbHidHandler::globalHidHandler != nullptr){
346 }
347}
348
349#ifdef MIDI
354void tud_midi_rx_cb(uint8_t itf){
355 if(!midihandler) return;
358 }
359}
360#endif
361
367}
370}
371
377}
380}
381
382
383volatile uint32_t* getAnalogBuffer(ADC_HandleTypeDef* hadc,uint8_t* chans){
384 #ifdef ADC1_CHANNELS
385 if(hadc == &hadc1){
386 *chans = ADC1_CHANNELS;
387 return ADC1_BUF;
388 }
389 #endif
390
391 #ifdef ADC2_CHANNELS
392 if(hadc == &hadc2){
393 *chans = ADC2_CHANNELS;
394 return ADC2_BUF;
395 }
396 #endif
397
398 #ifdef ADC3_CHANNELS
399 if(hadc == &hadc3){
400 *chans = ADC3_CHANNELS;
401 return ADC3_BUF;
402 }
403 #endif
404 return NULL;
405}
406
407void startADC(){
408 #ifdef ADC1_CHANNELS
409 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1_BUF, ADC1_CHANNELS);
410 #endif
411 #ifdef ADC2_CHANNELS
412 HAL_ADC_Start_DMA(&hadc2, (uint32_t*)ADC2_BUF, ADC2_CHANNELS);
413 #endif
414 #ifdef ADC3_CHANNELS
415 HAL_ADC_Start_DMA(&hadc3, (uint32_t*)ADC3_BUF, ADC3_CHANNELS);
416 #endif
417}
static std::vector< AdcHandler * > adcHandlers
Definition: AdcHandler.h:16
Definition: CAN.h:119
static CANPort * handleToPort(void *handle)
Definition: CAN.cpp:23
static void cdcFinished(uint8_t itf=0)
Definition: CDCcomm.cpp:31
static std::vector< CanHandler * > & getCANHandlers()
Definition: CanHandler.h:55
static std::vector< ExtiHandler * > extiHandlers
Definition: ExtiHandler.h:14
virtual void usbResume()
Definition: FFBoardMain.cpp:85
virtual void cdcRcvReady(uint8_t itf)
Definition: FFBoardMain.cpp:40
virtual void usbSuspend()
Definition: FFBoardMain.cpp:78
void transferComplete(uint8_t itf, uint8_t const *report, uint8_t len)
void hidCmdCallback(HID_CMD_Data_t *data)
static HID_CommandInterface * globalInterface
static std::vector< I2CHandler * > & getI2CHandlers()
Definition: I2CHandler.h:21
virtual void midiRx(uint8_t itf, uint8_t packet[4])
Definition: MidiHandler.cpp:25
static uint8_t buf[4]
Definition: MidiHandler.h:27
static std::vector< SpiHandler * > & getSPIHandlers()
Definition: SpiHandler.h:31
static std::vector< TimerHandler * > timerHandlers
Definition: TimerHandler.h:16
virtual const uint8_t * getUsbDeviceDesc()
Definition: USBdevice.cpp:49
virtual const uint8_t * getUsbConfigurationDesc(uint8_t index)
Definition: USBdevice.cpp:53
virtual uint16_t * getUsbStringDesc(uint8_t index, uint16_t langid)
Definition: USBdevice.cpp:60
static std::vector< UartHandler * > & getUARTHandlers()
Definition: UartHandler.h:16
virtual uint16_t hidGet(uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer, uint16_t reqlen)
static UsbHidHandler * globalHidHandler
Definition: UsbHidHandler.h:15
virtual void hidOut(uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer, uint16_t bufsize)
void transferComplete(uint8_t itf, uint8_t const *report, uint8_t len)
Definition: UsbHidHandler.h:27
static const uint8_t * getHidDesc()
volatile uint32_t * getAnalogBuffer(ADC_HandleTypeDef *hadc, uint8_t *chans)
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan)
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
FFBoardMain * mainclass
void startADC()
uint16_t const * tud_descriptor_string_cb(uint8_t index, uint16_t langid)
void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan)
void tud_cdc_tx_complete_cb(uint8_t itf)
uint8_t const * tud_descriptor_device_cb(void)
ADC_HandleTypeDef hadc1
void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan)
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan)
void tud_midi_rx_cb(uint8_t itf)
void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan)
void tud_hid_report_complete_cb(uint8_t itf, uint8_t const *report, uint8_t len)
void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer, uint16_t bufsize)
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
void tud_umount_cb()
void tud_mount_cb()
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
uint8_t const * tud_hid_descriptor_report_cb(uint8_t itf)
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
void HAL_TIM_PeriodElapsedCallback_CPP(TIM_HandleTypeDef *htim)
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
USBdevice * usb_device
uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer, uint16_t reqlen)
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
volatile uint32_t ADC1_BUF[ADC1_CHANNELS]
MidiHandler * midihandler
volatile uint32_t ADC3_BUF[ADC3_CHANNELS]
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
void tud_cdc_rx_cb(uint8_t itf)
void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)
ADC_HandleTypeDef hadc3
void tud_suspend_cb()
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan)
void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi)
uint8_t const * tud_descriptor_configuration_cb(uint8_t index)
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
void tud_resume_cb()
ADC_HandleTypeDef hadc2
void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi)
volatile uint32_t ADC2_BUF[ADC2_CHANNELS]
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan)
hid_report_type_t
HID Request Report Type.
Definition: hid.h:85
@ HID_REPORT_TYPE_INVALID
Definition: hid.h:86
@ HID_REPORT_TYPE_OUTPUT
Output.
Definition: hid.h:88
void pulseSysLed()
Definition: ledEffects.cpp:39
bool tud_midi_n_packet_read(uint8_t itf, uint8_t packet[4])
Definition: midi_device.c:203
uint8_t const * buffer
Definition: midi_device.h:100
uint32_t bufsize
Definition: midi_device.h:95
Definition: CAN.h:96
uint8_t fifo
Definition: CAN.h:100
uint8_t data[CAN_MSGBUFSIZE]
Definition: CAN.h:97
CAN_msg_header_rx header
Definition: CAN.h:99
void brakeCheck()