80 const uint8_t* report =
buffer;
81 uint8_t event_idx = report_id - FFB_ID_OFFSET;
88 new_effect((FFB_CreateNewEffect_Feature_Data_t*)(report));
92 FFB_SetEffect_t setEffectRepBuf;
93 memcpy(&setEffectRepBuf,report,std::min<uint16_t>(
sizeof(FFB_SetEffect_t),
bufsize));
113 case HID_ID_CONSTREP:
117 set_ramp((FFB_SetRamp_Data_t *)report);
130 case HID_ID_BLKFRREP:
154 uint8_t
id = report_id - FFB_ID_OFFSET;
157 case HID_ID_BLKLDREP:
161 return sizeof(FFB_BlockLoad_Feature_Data_t);
166 return sizeof(FFB_PIDPool_Feature_Data_t);
228 if(
data->effectBlockIndex == 0 ||
data->effectBlockIndex >
effects.size()){
243 int32_t index =
effects_calc->find_free_effect(effect->effectType);
254 this->
effects_calc->logEffectType(effect->effectType,
false);
278 uint8_t index = effect->effectBlockIndex;
279 if(index >
effects.size() || index == 0)
284 if (effect_p->
type != effect->effectType){
289 effect_p->
gain = effect->gain;
290 effect_p->
type = effect->effectType;
294 bool overridesCondition =
false;
300 if(!effect_p->
useSingleCondition && (effect->effectType == FFB_EFFECT_SPRING || effect->effectType == FFB_EFFECT_DAMPER || effect->effectType == FFB_EFFECT_INERTIA || effect->effectType == FFB_EFFECT_FRICTION))
304 overridesCondition =
true;
308 overridesCondition =
true;
313 if(!overridesCondition){
314 float phaseX = M_PI*2.0 * (effect->directionX/36000.0f);
316 effect_p->
axisMagnitudes[0] = directionEnable ? sin(phaseX) : (effect->enableAxis & X_AXIS_ENABLE ? (effect->directionX - 18000.0f) / 18000.0f : 0);
317 effect_p->
axisMagnitudes[1] = directionEnable ? -cos(phaseX) : (effect->enableAxis & Y_AXIS_ENABLE ? -(effect->directionY - 18000.0f) / 18000.0f : 0);
321 float phaseY = M_PI*2.0 * (effect->directionY/36000.0);
322 effect_p->
axisMagnitudes[3] = directionEnable ? sin(phaseY) : (effect->enableAxis & Z_AXIS_ENABLE ? (effect->directionZ - 18000.0f) / 18000.0f : 0);
324 if(effect->duration == 0){
325 effect_p->
duration = FFB_EFFECT_DURATION_INFINITE;
327 effect_p->
duration = effect->duration;
351 if(cond->effectBlockIndex == 0 || cond->effectBlockIndex >
effects.size()){
354 uint8_t axis = std::min(
axisCount,cond->parameterBlockOffset);
371 if(axis>0 && axis < MAX_AXIS && effect->conditions[axis].isActive()){
384 if(report->effectBlockIndex == 0 || report->effectBlockIndex >
effects.size()){
388 uint8_t
id = report->effectBlockIndex-1;
389 if(report->state == 3){
398 if(report->state == 2){
423 if(report->effectBlockIndex == 0 || report->effectBlockIndex >
effects.size()){
431 effect->
fadeTime = report->fadeTime;
436 if(report->effectBlockIndex == 0 || report->effectBlockIndex >
effects.size()){
442 effect->
endLevel = report->endLevel;
446 if(report->effectBlockIndex == 0 || report->effectBlockIndex >
effects.size()){
451 effect->
period = clip<uint32_t,uint32_t>(report->period,1,0x7fff);
453 effect->
offset = report->offset;
454 effect->
phase = report->phase;
460 for(uint8_t i=0;i<
effects.size();i++){
464 this->
reportFFBStatus.status = (HID_ACTUATOR_POWER) | (HID_ENABLE_ACTUATORS);
static void logSerialDebug(std::string string)
Send a log formatted sequence if debug is on.
virtual void fxUpdateEvent()
virtual void cfUpdateEvent()
std::array< FFB_Effect, EffectsCalculator::max_effects > & effects
reportFFB_status_t reportFFBStatus
void set_effect_operation(FFB_EffOp_Data_t *report)
void set_constant_effect(FFB_SetConstantForce_Data_t *effect)
uint16_t hidGet(uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer, uint16_t reqlen) override
FFB_BlockLoad_Feature_Data_t blockLoad_report
void setDirectionEnableMask(uint8_t mask)
std::shared_ptr< EffectsCalculator > effects_calc
uint8_t directionEnableMask
void set_gain(uint8_t gain)
void sendStatusReport(uint8_t effect)
void set_condition(FFB_SetCondition_Data_t *cond)
FFB_PIDPool_Feature_Data_t pool_report
void set_envelope(FFB_SetEnvelope_Data_t *report)
void ffb_control(uint8_t cmd)
static bool HID_SendReport(uint8_t *report, uint16_t len)
void new_effect(FFB_CreateNewEffect_Feature_Data_t *effect)
void hidOut(uint8_t report_id, hid_report_type_t report_type, const uint8_t *buffer, uint16_t bufsize) override
HidFFB(std::shared_ptr< EffectsCalculator > ec, uint8_t axisCount)
void set_ramp(FFB_SetRamp_Data_t *report)
void set_effect(FFB_SetEffect_t *effect)
void set_filters(FFB_Effect *effect)
void set_periodic(FFB_SetPeriodic_Data_t *report)
void registerHidCallback()
hid_report_type_t
HID Request Report Type.
static TU_ATTR_ALWAYS_INLINE bool tud_hid_report(uint8_t report_id, void const *report, uint16_t len)
static void * memcpy(void *dst, const void *src, size_t n)
uint16_t negativeSaturation
int16_t negativeCoefficient
int16_t positiveCoefficient
uint16_t positiveSaturation
float axisMagnitudes[MAX_AXIS]
FFB_Effect_Condition conditions[MAX_AXIS]