751{
752 if (report.empty())
753 return;
754
756 std::span<const uint8_t> body = report;
757
758 if (
device.layout.uses_report_ids) {
760 body = report.subspan(1);
761 }
762
763 bool matched = false;
764 bool eraser_flag = false;
765 bool invert_seen = false;
766
767 for (
const auto& field :
device.layout.fields) {
769 continue;
770
771 matched = true;
772 const int32_t raw = extract_field(body, field);
773
774 switch (field.slot) {
779 device.slots[field.slot] = normalise(raw, field.logical_min, field.logical_max);
780 break;
781
784 device.slots[field.slot] = to_degrees(raw, field.logical_min, field.logical_max, 90.0);
785 break;
786
788 device.slots[field.slot] = to_degrees(raw, field.logical_min, field.logical_max, 180.0);
789 break;
790
792 device.slots[field.slot] = normalise(raw, field.logical_min, field.logical_max) * 2.0 - 1.0;
793 break;
794
798 break;
799
800 case k_pseudo_in_range:
802 break;
803
804 case k_pseudo_tip:
806 break;
807
808 case k_pseudo_invert:
809 invert_seen = true;
810 eraser_flag = eraser_flag || (raw != 0);
811 break;
812
813 case k_pseudo_eraser:
814 eraser_flag = eraser_flag || (raw != 0);
815 set_button_bit(
device.slots, 2, raw != 0);
816 break;
817
818 case k_pseudo_barrel:
819 set_button_bit(
device.slots, 0, raw != 0);
820 break;
821
822 case k_pseudo_barrel_2:
823 set_button_bit(
device.slots, 1, raw != 0);
824 break;
825
826 case k_pseudo_serial: {
830 it->second.hardware_serial = static_cast<uint64_t>(
831 static_cast<uint32_t>(raw));
832 }
833 break;
834 }
835
836 default:
837 break;
838 }
839 }
840
841 if (!matched)
842 return;
843
844 if (invert_seen)
845 device.inverted = eraser_flag;
846
848}
vk::PhysicalDevice device
void emit_frame(TabletDevice &device)
std::mutex m_devices_mutex
std::unordered_map< uint32_t, TabletToolInfo > m_tools
@ DISTANCE
0.0 to 1.0, hover height
@ ROTATION
-180.0 to 180.0 degrees
@ X
0.0 to 1.0 across the active area
@ WHEEL_CLICKS
Integral detents this sample.
@ TILT_Y
-90.0 to 90.0 degrees
@ WHEEL
Degrees of wheel rotation this sample.
@ SLIDER
-1.0 to 1.0, barrel pressure or finger wheel
@ Y
0.0 to 1.0 across the active area
@ TILT_X
-90.0 to 90.0 degrees