MayaFlux 0.5.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 734 of file TabletBackend.cpp.

735{
736 if (report.empty())
737 return;
738
739 uint8_t report_id = 0;
740 std::span<const uint8_t> body = report;
741
742 if (device.layout.uses_report_ids) {
743 report_id = report[0];
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) {
752 if (field.report_id != report_id)
753 continue;
754
755 matched = true;
756 const int32_t raw = extract_field(body, field);
757
758 switch (field.slot) {
759 case TabletFrame::X:
760 case TabletFrame::Y:
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
780 device.slots[TabletFrame::WHEEL] = static_cast<double>(raw);
781 device.slots[TabletFrame::WHEEL_CLICKS] = static_cast<double>(raw);
782 break;
783
784 case k_pseudo_in_range:
785 set_state_bit(device.slots, TabletState::IN_PROXIMITY, raw != 0);
786 break;
787
788 case k_pseudo_tip:
789 set_state_bit(device.slots, TabletState::IN_CONTACT, raw != 0);
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: {
811 std::lock_guard lock(m_devices_mutex);
812 auto it = m_tools.find(device.pen_id);
813 if (it != m_tools.end()) {
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
831 emit_frame(device);
832}
uint8_t report_id
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 MayaFlux::Core::TabletFrame::DISTANCE, emit_frame(), MayaFlux::Core::TabletLayout::fields, MayaFlux::Core::IN_CONTACT, MayaFlux::Core::IN_PROXIMITY, MayaFlux::Core::TabletBackend::TabletDevice::inverted, MayaFlux::Core::TabletBackend::TabletDevice::layout, m_devices_mutex, m_tools, MayaFlux::Core::TabletBackend::TabletDevice::pen_id, MayaFlux::Core::TabletFrame::PRESSURE, report_id, MayaFlux::Core::TabletFrame::ROTATION, MayaFlux::Core::TabletFrame::SLIDER, MayaFlux::Core::TabletBackend::TabletDevice::slots, MayaFlux::Core::TabletFrame::TILT_X, MayaFlux::Core::TabletFrame::TILT_Y, MayaFlux::Core::TabletLayout::uses_report_ids, 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: