Add field value clamping functionality
This commit is contained in:
32
hid-pidff.c
32
hid-pidff.c
@@ -213,6 +213,36 @@ static int pidff_rescale_signed(int i, struct hid_field *field)
|
|||||||
field->logical_minimum / -0x8000;
|
field->logical_minimum / -0x8000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clamp minimum value for the given field
|
||||||
|
*/
|
||||||
|
static int pidff_clamp_min(int i, struct hid_field *field)
|
||||||
|
{
|
||||||
|
int ret = i < field->logical_minimum ? field->logical_minimum : i;
|
||||||
|
pr_debug("clamped min value from %d to %d\n", i, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clamp maximum value for the given field
|
||||||
|
*/
|
||||||
|
static int pidff_clamp_max(int i, struct hid_field *field)
|
||||||
|
{
|
||||||
|
int ret = i > field->logical_maximum ? field->logical_maximum : i;
|
||||||
|
pr_debug("clamped max value from %d to %d\n", i, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clamp value for the given field
|
||||||
|
*/
|
||||||
|
static int pidff_clamp(int i, struct hid_field *field)
|
||||||
|
{
|
||||||
|
i = pidff_clamp_min(i, field);
|
||||||
|
i = pidff_clamp_max(i, field);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
static void pidff_set(struct pidff_usage *usage, u16 value)
|
static void pidff_set(struct pidff_usage *usage, u16 value)
|
||||||
{
|
{
|
||||||
usage->value[0] = pidff_rescale(value, 0xffff, usage->field);
|
usage->value[0] = pidff_rescale(value, 0xffff, usage->field);
|
||||||
@@ -359,7 +389,7 @@ static void pidff_set_periodic_report(struct pidff_device *pidff,
|
|||||||
pidff_set_signed(&pidff->set_periodic[PID_OFFSET],
|
pidff_set_signed(&pidff->set_periodic[PID_OFFSET],
|
||||||
effect->u.periodic.offset);
|
effect->u.periodic.offset);
|
||||||
pidff_set(&pidff->set_periodic[PID_PHASE], effect->u.periodic.phase);
|
pidff_set(&pidff->set_periodic[PID_PHASE], effect->u.periodic.phase);
|
||||||
pidff->set_periodic[PID_PERIOD].value[0] = effect->u.periodic.period;
|
pidff->set_periodic[PID_PERIOD].value[0] = pidff_clamp(effect->u.periodic.period, pidff->set_periodic[PID_PERIOD].field);
|
||||||
|
|
||||||
hid_hw_request(pidff->hid, pidff->reports[PID_SET_PERIODIC],
|
hid_hw_request(pidff->hid, pidff->reports[PID_SET_PERIODIC],
|
||||||
HID_REQ_SET_REPORT);
|
HID_REQ_SET_REPORT);
|
||||||
|
|||||||
Reference in New Issue
Block a user