Skip to content

Commit 5f295a4

Browse files
committed
Play conditional effects only when used
Playing the friction effect alters the other effects even when the clipping parameter is set to zero. Such as producing a buzzing effect when a constant force is playing. See issue #26.
1 parent d491136 commit 5f295a4

File tree

1 file changed

+72
-44
lines changed

1 file changed

+72
-44
lines changed

hid-lg4ff.c

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -450,48 +450,79 @@ void lg4ff_update_slot(struct lg4ff_slot *slot, struct lg4ff_effect_parameters *
450450

451451
memcpy(original_cmd, slot->current_cmd, sizeof(original_cmd));
452452

453+
if ((original_cmd[0] & 0xf) == 1) {
454+
original_cmd[0] = (original_cmd[0] & 0xf0) + 0xc;
455+
}
456+
457+
if (slot->effect_type == FF_CONSTANT) {
458+
if (slot->cmd_op == 0) {
459+
slot->cmd_op = 1;
460+
} else {
461+
slot->cmd_op = 0xc;
462+
}
463+
} else {
464+
if (parameters->clip == 0) {
465+
slot->cmd_op = 3;
466+
} else if (slot->cmd_op == 3) {
467+
slot->cmd_op = 1;
468+
} else {
469+
slot->cmd_op = 0xc;
470+
}
471+
}
472+
453473
slot->current_cmd[0] = (0x10 << slot->id) + slot->cmd_op;
454-
switch (slot->effect_type) {
455-
case FF_CONSTANT:
456-
slot->current_cmd[1] = 0x00;
457-
slot->current_cmd[2 + slot->id] = TRANSLATE_FORCE(parameters->level);
458-
slot->current_cmd[3] = 0;
459-
slot->current_cmd[4] = 0;
460-
slot->current_cmd[5] = 0;
461-
slot->current_cmd[6] = 0;
462-
break;
463-
case FF_SPRING:
464-
d1 = SCALE_VALUE_U16(((parameters->d1) + 0x8000) & 0xffff, 11);
465-
d2 = SCALE_VALUE_U16(((parameters->d2) + 0x8000) & 0xffff, 11);
466-
s1 = parameters->k1 < 0;
467-
s2 = parameters->k2 < 0;
468-
slot->current_cmd[1] = 0x0b;
469-
slot->current_cmd[2] = d1 >> 3;
470-
slot->current_cmd[3] = d2 >> 3;
471-
slot->current_cmd[4] = (SCALE_COEFF(parameters->k2, 4) << 4) + SCALE_COEFF(parameters->k1, 4);
472-
slot->current_cmd[5] = ((d2 & 7) << 5) + ((d1 & 7) << 1) + (s2 << 4) + s1;
473-
slot->current_cmd[6] = SCALE_VALUE_U16(parameters->clip, 8);
474-
break;
475-
case FF_DAMPER:
476-
s1 = parameters->k1 < 0;
477-
s2 = parameters->k2 < 0;
478-
slot->current_cmd[1] = 0x0c;
479-
slot->current_cmd[2] = SCALE_COEFF(parameters->k1, 4);
480-
slot->current_cmd[3] = s1;
481-
slot->current_cmd[4] = SCALE_COEFF(parameters->k2, 4);
482-
slot->current_cmd[5] = s2;
483-
slot->current_cmd[6] = SCALE_VALUE_U16(parameters->clip, 8);
484-
break;
485-
case FF_FRICTION:
486-
s1 = parameters->k1 < 0;
487-
s2 = parameters->k2 < 0;
488-
slot->current_cmd[1] = 0x0e;
489-
slot->current_cmd[2] = SCALE_COEFF(parameters->k1, 8);
490-
slot->current_cmd[3] = SCALE_COEFF(parameters->k2, 8);
491-
slot->current_cmd[4] = SCALE_VALUE_U16(parameters->clip, 8);
492-
slot->current_cmd[5] = (s2 << 4) + s1;
493-
slot->current_cmd[6] = 0;
494-
break;
474+
475+
if (slot->cmd_op == 3) {
476+
slot->current_cmd[1] = 0;
477+
slot->current_cmd[2] = 0;
478+
slot->current_cmd[3] = 0;
479+
slot->current_cmd[4] = 0;
480+
slot->current_cmd[5] = 0;
481+
slot->current_cmd[6] = 0;
482+
} else {
483+
switch (slot->effect_type) {
484+
case FF_CONSTANT:
485+
slot->current_cmd[1] = 0x00;
486+
slot->current_cmd[2] = 0;
487+
slot->current_cmd[3] = 0;
488+
slot->current_cmd[4] = 0;
489+
slot->current_cmd[5] = 0;
490+
slot->current_cmd[6] = 0;
491+
slot->current_cmd[2 + slot->id] = TRANSLATE_FORCE(parameters->level);
492+
break;
493+
case FF_SPRING:
494+
d1 = SCALE_VALUE_U16(((parameters->d1) + 0x8000) & 0xffff, 11);
495+
d2 = SCALE_VALUE_U16(((parameters->d2) + 0x8000) & 0xffff, 11);
496+
s1 = parameters->k1 < 0;
497+
s2 = parameters->k2 < 0;
498+
slot->current_cmd[1] = 0x0b;
499+
slot->current_cmd[2] = d1 >> 3;
500+
slot->current_cmd[3] = d2 >> 3;
501+
slot->current_cmd[4] = (SCALE_COEFF(parameters->k2, 4) << 4) + SCALE_COEFF(parameters->k1, 4);
502+
slot->current_cmd[5] = ((d2 & 7) << 5) + ((d1 & 7) << 1) + (s2 << 4) + s1;
503+
slot->current_cmd[6] = SCALE_VALUE_U16(parameters->clip, 8);
504+
break;
505+
case FF_DAMPER:
506+
s1 = parameters->k1 < 0;
507+
s2 = parameters->k2 < 0;
508+
slot->current_cmd[1] = 0x0c;
509+
slot->current_cmd[2] = SCALE_COEFF(parameters->k1, 4);
510+
slot->current_cmd[3] = s1;
511+
slot->current_cmd[4] = SCALE_COEFF(parameters->k2, 4);
512+
slot->current_cmd[5] = s2;
513+
slot->current_cmd[6] = SCALE_VALUE_U16(parameters->clip, 8);
514+
break;
515+
case FF_FRICTION:
516+
s1 = parameters->k1 < 0;
517+
s2 = parameters->k2 < 0;
518+
slot->current_cmd[1] = 0x0e;
519+
slot->current_cmd[2] = SCALE_COEFF(parameters->k1, 8);
520+
slot->current_cmd[3] = SCALE_COEFF(parameters->k2, 8);
521+
slot->current_cmd[4] = SCALE_VALUE_U16(parameters->clip, 8);
522+
slot->current_cmd[5] = (s2 << 4) + s1;
523+
slot->current_cmd[6] = 0;
524+
break;
525+
}
495526
}
496527

497528
if (memcmp(original_cmd, slot->current_cmd, sizeof(original_cmd))) {
@@ -917,11 +948,8 @@ static void lg4ff_init_slots(struct lg4ff_device_entry *entry)
917948

918949
for (i = 0; i < 4; i++) {
919950
entry->slots[i].id = i;
920-
entry->slots[i].cmd_op = 0x01;
921951
lg4ff_update_slot(&entry->slots[i], &parameters);
922952
lg4ff_send_cmd(entry, entry->slots[i].current_cmd);
923-
entry->slots[i].cmd_op = 0x0c;
924-
lg4ff_update_slot(&entry->slots[i], &parameters);
925953
entry->slots[i].is_updated = 0;
926954
}
927955
}

0 commit comments

Comments
 (0)