735{
736 if (report.empty())
737 return;
738
740 std::span<const uint8_t> body = report;
741
742 if (device.layout.uses_report_ids) {
744 body = report.subspan(1);
745 }
746
747 bool matched = false;
748 bool eraser_flag = false;
749 bool invert_seen = false;
750
751 for (const auto& field : device.layout.fields) {
753 continue;
754
755 matched = true;
756 const int32_t raw = extract_field(body, field);
757
758 switch (field.slot) {
763 device.slots[field.slot] = normalise(raw, field.logical_min, field.logical_max);
764 break;
765
768 device.slots[field.slot] = to_degrees(raw, field.logical_min, field.logical_max, 90.0);
769 break;
770
772 device.slots[field.slot] = to_degrees(raw, field.logical_min, field.logical_max, 180.0);
773 break;
774
776 device.slots[field.slot] = normalise(raw, field.logical_min, field.logical_max) * 2.0 - 1.0;
777 break;
778
782 break;
783
784 case k_pseudo_in_range:
786 break;
787
788 case k_pseudo_tip:
790 break;
791
792 case k_pseudo_invert:
793 invert_seen = true;
794 eraser_flag = eraser_flag || (raw != 0);
795 break;
796
797 case k_pseudo_eraser:
798 eraser_flag = eraser_flag || (raw != 0);
799 set_button_bit(device.slots, 2, raw != 0);
800 break;
801
802 case k_pseudo_barrel:
803 set_button_bit(device.slots, 0, raw != 0);
804 break;
805
806 case k_pseudo_barrel_2:
807 set_button_bit(device.slots, 1, raw != 0);
808 break;
809
810 case k_pseudo_serial: {
812 auto it =
m_tools.find(device.pen_id);
814 it->second.hardware_serial = static_cast<uint64_t>(
815 static_cast<uint32_t>(raw));
816 }
817 break;
818 }
819
820 default:
821 break;
822 }
823 }
824
825 if (!matched)
826 return;
827
828 if (invert_seen)
829 device.inverted = eraser_flag;
830
832}
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