26 Log.traceln(
"ModuleHandler::OnReceive");
28 if (receive_buffer.len + num_bytes > receive_buffer.size) {
34 uint8_t* module_handler_rx_buffer_idx = module_handler_rx_buffer;
36 bool msg_end = module_handler_rx_buffer_idx;
38 ++module_handler_rx_buffer_idx;
41 bool msg_end =
static_cast<bool>(Wire.read());
42 Log.verboseln(
"msg_end: %T", msg_end);
46 uint8_t* prev_end = NULL;
47 if (receive_buffer.len == 0) {
48 prev_end = receive_buffer.data;
50 prev_end = receive_buffer.data + receive_buffer.len;
54 for (uint8_t* end = prev_end; end < prev_end + num_bytes - 1; end++) {
57 *end = *module_handler_rx_buffer_idx;
59 module_handler_rx_buffer_idx++;
62 if (!Wire.available()) {
63 Log.errorln(
"Specified number of bytes is not available");
70 Log.verboseln(
"Wire.read -> %X", *end);
78 Log.traceln(
"Message done");
79 Log.traceln(
"Decoding message");
80 for (
int i = 0;
i < receive_buffer.len;
i++) {
81 Log.verboseln(
"receive_buffer[%d] = %X",
i, receive_buffer.data[
i]);
88 Log.verboseln(
"Forwarding message to: cmd.which_command: %d",
92 if (req_map.find(cmd.which_command) == req_map.end()) {
93 Log.errorln(
"No module registered for command type: %d",
97 receive_buffer.len = 0;
98 receive_buffer.idx = 0;
102 last_module = req_map.at(cmd.which_command);
105 last_module->OnReceive(cmd);
108 receive_buffer.len = 0;
109 receive_buffer.idx = 0;
114 Log.traceln(
"ModuleHandler::OnRequest");
117 if (request_buffer.len == 0) {
118 Log.traceln(
"Copy data into the request buffer");
120 request_buffer.len = last_module->OnRequest(request_buffer.data);
121 Log.traceln(
"Done processing OnRequest");
122 Log.traceln(
"Buffer length: %d", request_buffer.len);
127 Log.traceln(
"Sending length %d", request_buffer.len);
130 uint8_t len_bytes[2] = {};
131 len_bytes[1] = (uint8_t)request_buffer.len & 0xFF;
132 len_bytes[0] = (uint8_t)((request_buffer.len >> 8) & 0xFF);
134 Log.verboseln(
"len_bytes = {%X, %X}", len_bytes[0], len_bytes[1]);
137 Wire.write(len_bytes,
sizeof(len_bytes));
139 Log.traceln(
"Successfully sent length");
146 Log.traceln(
"Sending data");
150 static const int wire_buffer_size = 32;
153 size_t bytes_remaining = request_buffer.len - request_buffer.idx;
154 Log.traceln(
"Bytes remaining: %d", bytes_remaining);
162 bool finished = bytes_remaining < wire_buffer_size - 1;
163 size_t bytes_to_send = 0;
167 Log.traceln(
"Writing with finished flag");
171 bytes_to_send = bytes_remaining;
173 Log.traceln(
"Writing with not finished flag");
177 bytes_to_send = wire_buffer_size - 1;
181 uint8_t* end = request_buffer.data + request_buffer.idx;
184 for (
int i = 0;
i < bytes_to_send;
i++) {
185 Log.verboseln(
"request_buffer[%d] = %X", request_buffer.idx +
i, end[
i]);
188 Wire.write(end, bytes_to_send);
190 request_buffer.idx += bytes_to_send;
195 request_buffer.len = 0;
196 request_buffer.idx = 0;