11#include " device.hpp"
22#include " screen_mxcfb.hpp"
33#include " screen_rm2fb.hpp"
4+ #include < fcntl.h>
45#include < fstream>
6+ #include < filesystem>
57#include < stdexcept>
68#include < string>
79#include < utility>
810
11+ namespace fs = std::filesystem;
12+
913namespace rmioc
1014{
1115
@@ -23,78 +27,94 @@ device::device(
2327, screen_device(std::move(screen_device))
2428{}
2529
26- auto device::detect (device_request request ) -> device
30+ auto get_device_type ( ) -> device::types
2731{
2832 std::ifstream device_id_file{" /sys/devices/soc0/machine" };
2933 std::string device_id;
3034 std::getline (device_id_file, device_id);
3135
32- types type = types::reMarkable1;
33- std::unique_ptr<buttons> buttons_device;
34- std::unique_ptr<touch> touch_device;
35- std::unique_ptr<pen> pen_device;
36- std::unique_ptr<screen> screen_device;
37-
3836 if (device_id == " reMarkable 1.0" || device_id == " reMarkable Prototype 1" )
3937 {
40- type = types::reMarkable1;
41-
42- if (request.has_buttons ())
43- {
44- buttons_device = std::make_unique<buttons>(" /dev/input/event2" );
45- }
38+ return device::types::reMarkable1;
39+ }
4640
47- if (request.has_touch ())
48- {
49- touch_device = std::make_unique<touch>(
50- " /dev/input/event1" ,
51- /* flip_x = */ true ,
52- /* flip_y = */ true
53- );
54- }
41+ if (device_id == " reMarkable 2.0" )
42+ {
43+ return device::types::reMarkable2;
44+ }
5545
56- if (request.has_pen ())
57- {
58- pen_device = std::make_unique<pen>(
59- " /dev/input/event0" ,
60- /* flip_x = */ false ,
61- /* flip_y = */ true
62- );
63- }
46+ throw std::runtime_error{" Unknown reMarkable model (device identifier \
47+ is “" + device_id + " ”" };
48+ }
6449
65- if (request.has_screen ())
50+ void discover_input_devices (
51+ const char * base_path,
52+ device::types type,
53+ device_request request,
54+ std::unique_ptr<buttons>& buttons_device,
55+ std::unique_ptr<touch>& touch_device,
56+ std::unique_ptr<pen>& pen_device
57+ )
58+ {
59+ for (const auto & entry : fs::directory_iterator (base_path))
60+ {
61+ if (entry.is_character_file ())
6662 {
67- screen_device = std::make_unique<screen_mxcfb>(" /dev/fb0" );
63+ const char * path = entry.path ().c_str ();
64+
65+ if (buttons::is (path))
66+ {
67+ if (request.has_buttons ())
68+ {
69+ buttons_device = std::make_unique<buttons>(path);
70+ }
71+ }
72+ else if (touch::is (path))
73+ {
74+ if (request.has_touch ())
75+ {
76+ touch_device = std::make_unique<touch>(
77+ path,
78+ /* flip_x = */ type == device::types::reMarkable1,
79+ /* flip_y = */ true
80+ );
81+ }
82+ }
83+ else if (pen::is (path))
84+ {
85+ if (request.has_pen ())
86+ {
87+ pen_device = std::make_unique<pen>(
88+ path,
89+ /* flip_x = */ false ,
90+ /* flip_y = */ true
91+ );
92+ }
93+ }
6894 }
6995 }
70- else if (device_id == " reMarkable 2.0" )
71- {
72- type = types::reMarkable2;
96+ }
7397
74- if (request.has_buttons ())
75- {
76- buttons_device = std::make_unique<buttons>(" /dev/input/event0" );
77- }
98+ auto device::detect (device_request request) -> device
99+ {
100+ std::ifstream device_id_file{" /sys/devices/soc0/machine" };
101+ std::string device_id;
102+ std::getline (device_id_file, device_id);
78103
79- if (request.has_touch ())
80- {
81- touch_device = std::make_unique<touch>(
82- " /dev/input/event2" ,
83- /* flip_x = */ false ,
84- /* flip_y = */ true
85- );
86- }
104+ types type = get_device_type ();
105+ std::unique_ptr<buttons> buttons_device;
106+ std::unique_ptr<touch> touch_device;
107+ std::unique_ptr<pen> pen_device;
108+ std::unique_ptr<screen> screen_device;
87109
88- if (request.has_pen ())
110+ // Use the appropriate screen driver based on current device type
111+ if (request.has_screen ())
112+ {
113+ if (type == types::reMarkable1)
89114 {
90- pen_device = std::make_unique<pen>(
91- " /dev/input/event1" ,
92- /* flip_x = */ false ,
93- /* flip_y = */ true
94- );
115+ screen_device = std::make_unique<screen_mxcfb>(" /dev/fb0" );
95116 }
96-
97- if (request.has_screen ())
117+ else
98118 {
99119 constexpr auto rm2fb_msgqueue_key = 0x2257c ;
100120 screen_device = std::make_unique<screen_rm2fb>(
@@ -103,11 +123,12 @@ auto device::detect(device_request request) -> device
103123 );
104124 }
105125 }
106- else
107- {
108- throw std::runtime_error{" Unknown reMarkable model (device identifier \
109- says “" + device_id + " ”" };
110- }
126+
127+ // Auto-detect and open requested input devices
128+ discover_input_devices (
129+ " /dev/input" , type, request,
130+ buttons_device, touch_device, pen_device
131+ );
111132
112133 return device (
113134 type,
0 commit comments