@@ -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