|
1 | 1 | // Copyright (c) 2022 DisplayLink (UK) Ltd. |
| 2 | +#include <format> |
| 3 | + |
2 | 4 | #include "../library/evdi_lib.h" |
3 | | -#include <pybind11/pybind11.h> |
4 | 5 | #include "Card.h" |
5 | 6 | #include "Buffer.h" |
6 | 7 |
|
7 | 8 | namespace py = pybind11; |
8 | 9 |
|
9 | | - |
10 | 10 | void default_update_ready_handler(int buffer_to_be_updated, void *user_data) |
11 | 11 | { |
12 | | - Card* card_ptr = reinterpret_cast<Card*>(user_data); |
13 | | - assert(buffer_to_be_updated == card_ptr->buffer_requested->buffer.id); |
14 | | - card_ptr->grab_pixels(); |
| 12 | + Card *card_ptr = reinterpret_cast<Card *>(user_data); |
| 13 | + assert(buffer_to_be_updated == card_ptr->buffer_requested->buffer.id); |
| 14 | + card_ptr->grab_pixels(); |
15 | 15 | } |
16 | 16 |
|
17 | 17 | void card_C_mode_handler(struct evdi_mode mode, void *user_data) |
18 | 18 | { |
19 | | - py::module logging = py::module::import("logging"); |
20 | | - logging.attr("info")("Got mode_changed signal."); |
21 | | - Card* card = reinterpret_cast<Card*>(user_data); |
| 19 | + py::module logging = py::module::import("logging"); |
| 20 | + logging.attr("info")("Got mode_changed signal."); |
| 21 | + Card *card = reinterpret_cast<Card *>(user_data); |
22 | 22 |
|
23 | | - assert(card); |
| 23 | + assert(card); |
24 | 24 |
|
25 | | - card->setMode(mode); |
26 | | - card->makeBuffers(2); |
| 25 | + card->setMode(mode); |
| 26 | + card->makeBuffers(2); |
27 | 27 |
|
28 | | - if(card->m_modeHandler != nullptr){ |
29 | | - card->m_modeHandler(mode); |
30 | | - } |
| 28 | + if (!card->mode_handler.is_none()) { |
| 29 | + card->mode_handler(mode); |
| 30 | + } |
31 | 31 |
|
32 | | - card->request_update(); |
| 32 | + card->request_update(); |
33 | 33 | } |
34 | 34 |
|
35 | 35 | void Card::setMode(struct evdi_mode mode) |
36 | 36 | { |
37 | | - this->mode = mode; |
| 37 | + this->mode = mode; |
38 | 38 | } |
39 | 39 |
|
40 | 40 | void Card::makeBuffers(int count) |
41 | 41 | { |
42 | | - clearBuffers(); |
43 | | - for(int i=0; i<count; i++){ |
44 | | - buffers.emplace_back(new Buffer(mode, evdiHandle)); |
45 | | - } |
| 42 | + clearBuffers(); |
| 43 | + for (int i = 0; i < count; i++) { |
| 44 | + buffers.emplace_back(new Buffer(mode, evdiHandle)); |
| 45 | + } |
46 | 46 | } |
47 | 47 |
|
48 | 48 | void Card::clearBuffers() |
49 | 49 | { |
50 | | - buffer_requested.reset(); |
51 | | - buffers.clear(); |
| 50 | + buffer_requested.reset(); |
| 51 | + buffers.clear(); |
52 | 52 | } |
53 | 53 |
|
54 | | -void dpms_handler(int dpms_mode, void* /*user_data*/){ |
55 | | - py::module logging = py::module::import("logging"); |
56 | | - logging.attr("info")("Got dpms signal." + std::to_string(dpms_mode)); |
| 54 | +void dpms_handler(int dpms_mode, void * /*user_data*/) |
| 55 | +{ |
| 56 | + py::module logging = py::module::import("logging"); |
| 57 | + logging.attr("info")(std::format("Got dpms signal: \"{}\"", dpms_mode)); |
57 | 58 | } |
58 | 59 |
|
59 | | -Card::Card(int device) : |
60 | | - evdiHandle(evdi_open(device)) |
| 60 | +Card::Card(int device) |
| 61 | + : evdiHandle(evdi_open(device)) |
61 | 62 | { |
62 | | - if(evdiHandle==nullptr) |
63 | | - { |
64 | | - throw py::value_error("Card /dev/dri/card" + std::to_string(device) + "does not exists!"); |
65 | | - } |
66 | | - |
67 | | - memset(&eventContext, 0, sizeof(eventContext)); |
| 63 | + if (evdiHandle == nullptr) { |
| 64 | + throw py::value_error(std::format( |
| 65 | + "Failed to open card \"/dev/dri/card{}\"", device)); |
| 66 | + } |
68 | 67 |
|
69 | | - m_modeHandler = nullptr; |
70 | | - acquire_framebuffer_cb = nullptr; |
| 68 | + memset(&eventContext, 0, sizeof(eventContext)); |
71 | 69 |
|
72 | | - eventContext.mode_changed_handler = &card_C_mode_handler; |
73 | | - eventContext.update_ready_handler = &default_update_ready_handler; |
74 | | - eventContext.dpms_handler=dpms_handler; |
75 | | - eventContext.user_data = this; |
| 70 | + eventContext.mode_changed_handler = &card_C_mode_handler; |
| 71 | + eventContext.update_ready_handler = &default_update_ready_handler; |
| 72 | + eventContext.dpms_handler = dpms_handler; |
| 73 | + eventContext.user_data = this; |
76 | 74 |
|
77 | | - memset(&mode, 0, sizeof(mode)); |
| 75 | + memset(&mode, 0, sizeof(mode)); |
78 | 76 | } |
79 | 77 |
|
80 | 78 | Card::~Card() |
81 | 79 | { |
82 | | - close(); |
| 80 | + close(); |
83 | 81 | } |
84 | 82 |
|
85 | 83 | void Card::close() |
86 | 84 | { |
87 | | - if(evdiHandle != nullptr) |
88 | | - { |
89 | | - clearBuffers(); |
90 | | - evdi_close(evdiHandle); |
91 | | - } |
92 | | - evdiHandle = nullptr; |
| 85 | + if (evdiHandle != nullptr) { |
| 86 | + clearBuffers(); |
| 87 | + evdi_close(evdiHandle); |
| 88 | + } |
| 89 | + evdiHandle = nullptr; |
93 | 90 | } |
94 | 91 |
|
95 | 92 | void Card::connect(const char *edid, const unsigned int edid_length, |
96 | | - const uint32_t pixel_area_limit, const uint32_t pixel_per_second_limit) |
| 93 | + const uint32_t pixel_area_limit, |
| 94 | + const uint32_t pixel_per_second_limit) |
97 | 95 | { |
98 | | - evdi_connect2(evdiHandle, reinterpret_cast<const unsigned char *>(edid), |
99 | | - edid_length, pixel_area_limit, pixel_per_second_limit); |
| 96 | + evdi_connect2(evdiHandle, reinterpret_cast<const unsigned char *>(edid), |
| 97 | + edid_length, pixel_area_limit, pixel_per_second_limit); |
100 | 98 | } |
101 | 99 |
|
102 | 100 | void Card::disconnect() |
103 | 101 | { |
104 | | - evdi_disconnect(evdiHandle); |
| 102 | + evdi_disconnect(evdiHandle); |
105 | 103 | } |
106 | 104 |
|
107 | 105 | struct evdi_mode Card::getMode() const |
108 | 106 | { |
109 | | - return mode; |
| 107 | + return mode; |
110 | 108 | } |
111 | 109 |
|
112 | 110 | void Card::handle_events(int waiting_time) |
113 | 111 | { |
114 | | - fd_set rfds; |
115 | | - struct timeval tv; |
116 | | - FD_ZERO(&rfds); |
117 | | - int fd = evdi_get_event_ready(evdiHandle); |
118 | | - FD_SET(fd, &rfds); |
119 | | - tv.tv_sec = 0; |
120 | | - tv.tv_usec = waiting_time*1000; |
121 | | - |
122 | | - request_update(); |
123 | | - |
124 | | - if(select(fd + 1, &rfds, NULL, NULL, &tv)){ |
125 | | - evdi_handle_events(evdiHandle, &eventContext); |
126 | | - } |
| 112 | + fd_set rfds; |
| 113 | + struct timeval tv; |
| 114 | + FD_ZERO(&rfds); |
| 115 | + int fd = evdi_get_event_ready(evdiHandle); |
| 116 | + FD_SET(fd, &rfds); |
| 117 | + tv.tv_sec = 0; |
| 118 | + tv.tv_usec = waiting_time * 1000; |
| 119 | + |
| 120 | + request_update(); |
| 121 | + |
| 122 | + if (select(fd + 1, &rfds, NULL, NULL, &tv)) { |
| 123 | + evdi_handle_events(evdiHandle, &eventContext); |
| 124 | + } |
127 | 125 | } |
128 | 126 |
|
129 | 127 | void Card::request_update() |
130 | 128 | { |
131 | | - if(buffer_requested){ |
132 | | - return; |
133 | | - } |
134 | | - |
135 | | - for(auto &i : buffers){ |
136 | | - if(i.use_count() == 1) |
137 | | - { |
138 | | - buffer_requested = i; |
139 | | - break; |
140 | | - } |
141 | | - } |
142 | | - |
143 | | - if(!buffer_requested){ |
144 | | - return; |
145 | | - } |
146 | | - |
147 | | - bool update_ready = evdi_request_update(evdiHandle, buffer_requested->buffer.id); |
148 | | - |
149 | | - if(update_ready){ |
150 | | - grab_pixels(); |
151 | | - } |
| 129 | + if (buffer_requested) { |
| 130 | + return; |
| 131 | + } |
| 132 | + |
| 133 | + for (auto &i : buffers) { |
| 134 | + if (i.use_count() == 1) { |
| 135 | + buffer_requested = i; |
| 136 | + break; |
| 137 | + } |
| 138 | + } |
| 139 | + |
| 140 | + if (!buffer_requested) { |
| 141 | + return; |
| 142 | + } |
| 143 | + |
| 144 | + bool update_ready = |
| 145 | + evdi_request_update(evdiHandle, buffer_requested->buffer.id); |
| 146 | + |
| 147 | + if (update_ready) { |
| 148 | + grab_pixels(); |
| 149 | + } |
152 | 150 | } |
153 | 151 |
|
154 | 152 | void Card::grab_pixels() |
155 | 153 | { |
156 | | - if(!buffer_requested){ |
157 | | - return; |
158 | | - } |
| 154 | + if (!buffer_requested) { |
| 155 | + return; |
| 156 | + } |
159 | 157 |
|
160 | | - evdi_grab_pixels(evdiHandle, buffer_requested->buffer.rects, &buffer_requested->buffer.rect_count); |
| 158 | + evdi_grab_pixels(evdiHandle, buffer_requested->buffer.rects, |
| 159 | + &buffer_requested->buffer.rect_count); |
161 | 160 |
|
162 | | - if(acquire_framebuffer_cb) |
163 | | - acquire_framebuffer_cb(std::move(buffer_requested)); |
164 | | - buffer_requested = nullptr; |
| 161 | + if (acquire_framebuffer_handler) |
| 162 | + acquire_framebuffer_handler(std::move(buffer_requested)); |
| 163 | + buffer_requested = nullptr; |
165 | 164 |
|
166 | | - request_update(); |
| 165 | + request_update(); |
167 | 166 | } |
0 commit comments