Как использовать FF_CONSTANT для принудительной обратной связи для Linux?

#linux-kernel #joystick #input-devices

#linux-ядро #джойстик #устройства ввода

Вопрос:

Я не могу использовать эффект силы FF_CONSTANT. Мой код попытки:

 struct ff_effect joy_effect_, joy_effect_2;
if (iwantconstantforce)
    {
      joy_effect_.id = -1;
      joy_effect_.type = FF_CONSTANT;
      joy_effect_.direction = 0x0000;  // down
      joy_effect_.replay.length = 100;
      joy_effect_.replay.delay = 0;

      joy_effect_.trigger.button = 0;
      joy_effect_.trigger.interval = 100;

      joy_effect_.u.constant.level = 65535;
      joy_effect_.u.constant.envelope.attack_length = joy_effect_.replay.length / 10;
      joy_effect_.u.constant.envelope.fade_length = joy_effect_.replay.length / 10;

      joy_effect_.u.constant.envelope.attack_level = joy_effect_.u.constant.level / 10;
      joy_effect_.u.constant.envelope.fade_level = joy_effect_.u.constant.level / 10;
    }
  

Я могу создавать эффекты FF_SPRING и FF_DAMPER с помощью следующих кодов.

 if (youwantdampereffect)
    {
      joy_effect_.id = -1;
      joy_effect_.direction = 0;  // down
      joy_effect_.type = FF_DAMPER;
      joy_effect_.replay.length = 20;
      joy_effect_.replay.delay = 0;
      
      joy_effect_.u.condition[0].right_saturation = 65535;
      joy_effect_.u.condition[0].left_saturation = 65535;
      joy_effect_.u.condition[0].right_coeff = 65535 / 2;
      joy_effect_.u.condition[0].left_coeff = 65535 / 2;
      joy_effect_.u.condition[0].deadband = 0;
      joy_effect_.u.condition[0].center = 0;

      int ret = ioctl(ff_fd_, EVIOCSFF, amp;joy_effect_);        // upload the effect
    }

    if (youwantspringeffect)
    {
      joy_effect_2.id = -1;
      joy_effect_2.direction = 0;  // down
      joy_effect_2.type = FF_SPRING;
      joy_effect_2.replay.length = 20;
      joy_effect_2.replay.delay = 0;

      joy_effect_2.u.condition[0].right_saturation = 65535 / 2;
      joy_effect_2.u.condition[0].left_saturation = 65535 / 2;
      joy_effect_2.u.condition[0].right_coeff = 32767;
      joy_effect_2.u.condition[0].left_coeff = 32767;
      joy_effect_2.u.condition[0].deadband = 0;
      joy_effect_2.u.condition[0].center = 0;

      int ret = ioctl(ff_fd_, EVIOCSFF, amp;joy_effect_2);        // upload the effect
    }
  

Я не нахожу никакой информации о том, что такое эффект постоянной силы или когда имеет смысл его использовать.
Может кто-нибудь рассказать о его важности и использовании?

Спасибо 🙂

Комментарии:

1. Я не знаком с джойстиками, поскольку работает с другими устройствами. Во-первых, я не вижу ioctl вызова внутри if (iwantconstantforce) вы пропустили его при публикации своего вопроса здесь или вы забыли добавить его и в свою программу? Кроме того, я нашел ссылку github.com/flosse/linuxconsole/blob/master/utils/fftest.c вы можете просто проверить, как используется FF_CONSTAN, и попробовать это в своем коде. Надеюсь, это может как-то помочь)

2. Спасибо @NickS. Есть большая вероятность, что я забыл ioctl вызвать в своем коде, мне придется повторить это снова. Спасибо, что так тщательно изучили мой код. Скоро я снова начну работать над этим. Я опубликую здесь, если проблема будет решена.