MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ unpack_report()

void MayaFlux::Core::TabletBackend::unpack_report ( TabletDevice &  device,
std::span< const uint8_t >  report 
)
private

Definition at line 750 of file TabletBackend.cpp.

751{
752 if (report.empty())
753 return;
754
755 uint8_t report_id = 0;
756 std::span<const uint8_t> body = report;
757
758 if (device.layout.uses_report_ids) {
759 report_id = report[0];
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) {
768 if (field.report_id != report_id)
769 continue;
770
771 matched = true;
772 const int32_t raw = extract_field(body, field);
773
774 switch (field.slot) {
775 case TabletFrame::X:
776 case TabletFrame::Y:
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
796 device.slots[TabletFrame::WHEEL] = static_cast<double>(raw);
797 device.slots[TabletFrame::WHEEL_CLICKS] = static_cast<double>(raw);
798 break;
799
800 case k_pseudo_in_range:
801 set_state_bit(device.slots, TabletState::IN_PROXIMITY, raw != 0);
802 break;
803
804 case k_pseudo_tip:
805 set_state_bit(device.slots, TabletState::IN_CONTACT, raw != 0);
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: {
827 std::lock_guard lock(m_devices_mutex);
828 auto it = m_tools.find(device.pen_id);
829 if (it != m_tools.end()) {
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}
uint8_t report_id
vk::PhysicalDevice device
Definition VKDevice.cpp:121
void emit_frame(TabletDevice &device)
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

References device, MayaFlux::Core::TabletFrame::DISTANCE, emit_frame(), MayaFlux::Core::IN_CONTACT, MayaFlux::Core::IN_PROXIMITY, m_devices_mutex, m_tools, MayaFlux::Core::TabletFrame::PRESSURE, report_id, MayaFlux::Core::TabletFrame::ROTATION, MayaFlux::Core::TabletFrame::SLIDER, MayaFlux::Core::TabletFrame::TILT_X, MayaFlux::Core::TabletFrame::TILT_Y, MayaFlux::Core::TabletFrame::WHEEL, MayaFlux::Core::TabletFrame::WHEEL_CLICKS, MayaFlux::Core::TabletFrame::X, and MayaFlux::Core::TabletFrame::Y.

Referenced by poll_device().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: