Skip to content
Snippets Groups Projects
Verified Commit caebafb8 authored by Jakub Vaněk's avatar Jakub Vaněk
Browse files

Fix EV3 sensor mode count decoding

It turns out that the underlying problem was that the sensor sends
the number of modes minus one and the code here did not account for it.
parent 721e94c0
No related branches found
No related tags found
No related merge requests found
Pipeline #109882 passed
...@@ -301,7 +301,7 @@ bool ev3_sensor_describe_data(ev3_sensor *link, uint mode, data_miniinfo *out) { ...@@ -301,7 +301,7 @@ bool ev3_sensor_describe_data(ev3_sensor *link, uint mode, data_miniinfo *out) {
return false; return false;
} }
ev3_lock(); ev3_lock();
if (mode <= link->sensor_metadata.mode_count) { if (mode < link->sensor_metadata.mode_count) {
sensor_mode *mode_info = &link->sensor_metadata.modes[mode]; sensor_mode *mode_info = &link->sensor_metadata.modes[mode];
out->format = mode_info->format; out->format = mode_info->format;
out->num_values = mode_info->values; out->num_values = mode_info->values;
......
...@@ -54,26 +54,26 @@ void sensor_info_update(sensor_info *info, const uint8_t *msg, size_t len) { ...@@ -54,26 +54,26 @@ void sensor_info_update(sensor_info *info, const uint8_t *msg, size_t len) {
return; return;
} }
info->mode_count = parsed.mode_count; info->mode_count = parsed.mode_count + 1;
if (info->mode_count > MAX_SENSOR_MODE_COUNT) { if (info->mode_count > MAX_SENSOR_MODE_COUNT) {
info->mode_count = MAX_SENSOR_MODE_COUNT; info->mode_count = MAX_SENSOR_MODE_COUNT;
} }
#if FULL_TYPEDATA #if FULL_TYPEDATA
info->visible_mode_count = parsed.visible_mode_count; info->visible_mode_count = parsed.visible_mode_count + 1;
if (info->visible_mode_count > MAX_SENSOR_MODE_COUNT) { if (info->visible_mode_count > MAX_SENSOR_MODE_COUNT) {
info->visible_mode_count = MAX_SENSOR_MODE_COUNT; info->visible_mode_count = MAX_SENSOR_MODE_COUNT;
} }
#endif #endif
for (int i = 0; i <= info->mode_count; i++) { for (int i = 0; i < info->mode_count; i++) {
sensor_mode_init(&info->modes[i]); sensor_mode_init(&info->modes[i]);
} }
} }
} else if (mtype == MTYPE_INFO) { } else if (mtype == MTYPE_INFO) {
require_at_least_bytes(len, 2); require_at_least_bytes(len, 2);
unsigned int mode_no = subtype_of_message(msg[0]); unsigned int mode_no = subtype_of_message(msg[0]);
if (mode_no <= info->mode_count) { if (mode_no < info->mode_count) {
sensor_mode_update(&info->modes[mode_no], msg, len); sensor_mode_update(&info->modes[mode_no], msg, len);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment