Skip to content

Commit

Permalink
[HID] Fixup axes min, neutral & max values
Browse files Browse the repository at this point in the history
  • Loading branch information
darthcloud committed Jun 28, 2022
1 parent 03b2979 commit cc4c824
Showing 1 changed file with 56 additions and 26 deletions.
82 changes: 56 additions & 26 deletions main/adapter/wireless/hid_generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,63 +303,88 @@ static void hid_pad_init(struct hid_report_meta *meta, struct hid_report *report
map->mask[0] |= BIT(PAD_LX_LEFT) | BIT(PAD_LX_RIGHT);
map->desc[0] |= BIT(PAD_LX_LEFT) | BIT(PAD_LX_RIGHT);
meta->hid_axes_idx[AXIS_LX] = i;
meta->hid_axes_meta[AXIS_LX].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[AXIS_LX].neutral = meta->hid_axes_meta[AXIS_LX].abs_max;
meta->hid_axes_meta[AXIS_LX].abs_max = report->usages[i].logical_max / 2;
if (report->usages[i].logical_min >= 0) {
meta->hid_axes_meta[AXIS_LX].neutral = report->usages[i].logical_max / 2;
}
else {
meta->hid_axes_meta[AXIS_LX].neutral = 0;
}
break;
case USAGE_GEN_DESKTOP_Y:
map->mask[0] |= BIT(PAD_LY_DOWN) | BIT(PAD_LY_UP);
map->desc[0] |= BIT(PAD_LY_DOWN) | BIT(PAD_LY_UP);
meta->hid_axes_idx[AXIS_LY] = i;
meta->hid_axes_meta[AXIS_LY].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[AXIS_LY].neutral = meta->hid_axes_meta[AXIS_LY].abs_max;
meta->hid_axes_meta[AXIS_LY].abs_max = report->usages[i].logical_max / 2;
if (report->usages[i].logical_min >= 0) {
meta->hid_axes_meta[AXIS_LY].neutral = report->usages[i].logical_max / 2;
}
else {
meta->hid_axes_meta[AXIS_LY].neutral = 0;
}
meta->hid_axes_meta[AXIS_LY].polarity = 1;
break;
case 0x32 /* USAGE_GEN_DESKTOP_Z */:
if (z_is_joy) {
map->mask[0] |= BIT(PAD_RX_LEFT) | BIT(PAD_RX_RIGHT);
map->desc[0] |= BIT(PAD_RX_LEFT) | BIT(PAD_RX_RIGHT);
meta->hid_axes_idx[AXIS_RX] = i;
meta->hid_axes_meta[AXIS_RX].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[AXIS_RX].neutral = meta->hid_axes_meta[AXIS_RX].abs_max;
meta->hid_axes_meta[AXIS_RX].abs_max = report->usages[i].logical_max / 2;
if (report->usages[i].logical_min >= 0) {
meta->hid_axes_meta[AXIS_RX].neutral = report->usages[i].logical_max / 2;
}
else {
meta->hid_axes_meta[AXIS_RX].neutral = 0;
}
}
else {
map->mask[0] |= BIT(PAD_LM);
map->desc[0] |= BIT(PAD_LM);
meta->hid_axes_idx[TRIG_L] = i;
meta->hid_axes_meta[TRIG_L].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[TRIG_L].neutral = meta->hid_axes_meta[TRIG_L].abs_max;
meta->hid_axes_meta[TRIG_L].abs_max = report->usages[i].logical_max;
meta->hid_axes_meta[TRIG_L].neutral = report->usages[i].logical_min;
}
break;
case 0x33 /* USAGE_GEN_DESKTOP_RX */:
if (z_is_joy) {
map->mask[0] |= BIT(PAD_LM);
map->desc[0] |= BIT(PAD_LM);
meta->hid_axes_idx[TRIG_L] = i;
meta->hid_axes_meta[TRIG_L].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[TRIG_L].neutral = meta->hid_axes_meta[TRIG_L].abs_max;
meta->hid_axes_meta[TRIG_L].abs_max = report->usages[i].logical_max;
meta->hid_axes_meta[TRIG_L].neutral = report->usages[i].logical_min;
}
else {
map->mask[0] |= BIT(PAD_RX_LEFT) | BIT(PAD_RX_RIGHT);
map->desc[0] |= BIT(PAD_RX_LEFT) | BIT(PAD_RX_RIGHT);
meta->hid_axes_idx[AXIS_RX] = i;
meta->hid_axes_meta[AXIS_RX].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[AXIS_RX].neutral = meta->hid_axes_meta[AXIS_RX].abs_max;
meta->hid_axes_meta[AXIS_RX].abs_max = report->usages[i].logical_max / 2;
if (report->usages[i].logical_min >= 0) {
meta->hid_axes_meta[AXIS_RX].neutral = report->usages[i].logical_max / 2;
}
else {
meta->hid_axes_meta[AXIS_RX].neutral = 0;
}
}
break;
case 0x34 /* USAGE_GEN_DESKTOP_RY */:
if (z_is_joy) {
map->mask[0] |= BIT(PAD_RM);
map->desc[0] |= BIT(PAD_RM);
meta->hid_axes_idx[TRIG_R] = i;
meta->hid_axes_meta[TRIG_R].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[TRIG_R].neutral = meta->hid_axes_meta[TRIG_R].abs_max;
meta->hid_axes_meta[TRIG_R].abs_max = report->usages[i].logical_max;
meta->hid_axes_meta[TRIG_R].neutral = report->usages[i].logical_min;
}
else {
map->mask[0] |= BIT(PAD_RY_DOWN) | BIT(PAD_RY_UP);
map->desc[0] |= BIT(PAD_RY_DOWN) | BIT(PAD_RY_UP);
meta->hid_axes_idx[AXIS_RY] = i;
meta->hid_axes_meta[AXIS_RY].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[AXIS_RY].neutral = meta->hid_axes_meta[AXIS_RY].abs_max;
meta->hid_axes_meta[AXIS_RY].abs_max = report->usages[i].logical_max / 2;
if (report->usages[i].logical_min >= 0) {
meta->hid_axes_meta[AXIS_RY].neutral = report->usages[i].logical_max / 2;
}
else {
meta->hid_axes_meta[AXIS_RY].neutral = 0;
}
meta->hid_axes_meta[AXIS_LY].polarity = 1;
}
break;
Expand All @@ -368,16 +393,21 @@ static void hid_pad_init(struct hid_report_meta *meta, struct hid_report *report
map->mask[0] |= BIT(PAD_RY_DOWN) | BIT(PAD_RY_UP);
map->desc[0] |= BIT(PAD_RY_DOWN) | BIT(PAD_RY_UP);
meta->hid_axes_idx[AXIS_RY] = i;
meta->hid_axes_meta[AXIS_RY].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[AXIS_RY].neutral = meta->hid_axes_meta[AXIS_RY].abs_max;
meta->hid_axes_meta[AXIS_LY].polarity = 1;
meta->hid_axes_meta[AXIS_RY].abs_max = report->usages[i].logical_max / 2;
if (report->usages[i].logical_min >= 0) {
meta->hid_axes_meta[AXIS_RY].neutral = report->usages[i].logical_max / 2;
}
else {
meta->hid_axes_meta[AXIS_RY].neutral = 0;
}
meta->hid_axes_meta[AXIS_RY].polarity = 1;
}
else {
map->mask[0] |= BIT(PAD_RM);
map->desc[0] |= BIT(PAD_RM);
meta->hid_axes_idx[TRIG_R] = i;
meta->hid_axes_meta[TRIG_R].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[TRIG_R].neutral = meta->hid_axes_meta[TRIG_R].abs_max;
meta->hid_axes_meta[TRIG_R].abs_max = report->usages[i].logical_max;
meta->hid_axes_meta[TRIG_R].neutral = report->usages[i].logical_min;
}
break;
case 0x39 /* USAGE_GEN_DESKTOP_HAT */:
Expand All @@ -395,15 +425,15 @@ static void hid_pad_init(struct hid_report_meta *meta, struct hid_report *report
map->mask[0] |= BIT(PAD_RM);
map->desc[0] |= BIT(PAD_RM);
meta->hid_axes_idx[TRIG_R] = i;
meta->hid_axes_meta[TRIG_R].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[TRIG_R].neutral = meta->hid_axes_meta[TRIG_R].abs_max;
meta->hid_axes_meta[TRIG_R].abs_max = report->usages[i].logical_max;
meta->hid_axes_meta[TRIG_R].neutral = report->usages[i].logical_min;
break;
case 0xC5 /* USAGE_SIMS_BRAKE */:
map->mask[0] |= BIT(PAD_LM);
map->desc[0] |= BIT(PAD_LM);
meta->hid_axes_idx[TRIG_L] = i;
meta->hid_axes_meta[TRIG_L].abs_max = pow(2, report->usages[i].bit_size) / 2;
meta->hid_axes_meta[TRIG_L].neutral = meta->hid_axes_meta[TRIG_L].abs_max;
meta->hid_axes_meta[TRIG_L].abs_max = report->usages[i].logical_max;
meta->hid_axes_meta[TRIG_L].neutral = report->usages[i].logical_min;
break;
}
break;
Expand Down Expand Up @@ -499,7 +529,7 @@ static void hid_pad_to_generic(struct bt_data *bt_data, struct generic_ctrl *ctr

ctrl_data->axes[i].meta = &meta->hid_axes_meta[i];

/* Is axis sign? */
/* Is axis unsign? */
if (bt_data->reports[PAD].usages[meta->hid_axes_idx[i]].logical_min >= 0) {
ctrl_data->axes[i].value = value - meta->hid_axes_meta[i].neutral + bt_data->axes_cal[i];
}
Expand Down

0 comments on commit cc4c824

Please sign in to comment.