From ec20c707ea677c9b2c8e585b78c9837a2f6e7372 Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 30 May 2022 13:11:38 +0200 Subject: refactor(minion): make reading wifi module more reliable --- minion/src/util.cpp | 12 ++++++------ minion/src/util.hpp | 12 ++++++++++-- minion/src/wifi_module.cpp | 15 +++++++++++---- 3 files changed, 27 insertions(+), 12 deletions(-) (limited to 'minion/src') diff --git a/minion/src/util.cpp b/minion/src/util.cpp index 15cf840..708e47d 100644 --- a/minion/src/util.cpp +++ b/minion/src/util.cpp @@ -3,22 +3,22 @@ namespace util { -auto str_ends_with(const char *str, const char *other_str) noexcept -> bool +auto str_ends_with(const char *target, size_t target_end, const char *other) noexcept + -> bool { - if (str == nullptr || other_str == nullptr) + if (target == nullptr || other == nullptr) { return false; } - auto str_length = strlen(str); - auto other_str_length = strlen(other_str); + const auto other_str_length = strlen(other); - if (other_str_length > str_length) + if (other_str_length > target_end) { return false; } - return strncmp(str + str_length - other_str_length, other_str, other_str_length) == 0; + return strncmp(target + target_end - other_str_length, other, other_str_length) == 0; } void substr(const char *str, const char *end, char *dest) noexcept diff --git a/minion/src/util.hpp b/minion/src/util.hpp index 0dbb03f..2955cf1 100644 --- a/minion/src/util.hpp +++ b/minion/src/util.hpp @@ -13,7 +13,15 @@ auto malloc(size_t size) noexcept -> Type * return static_cast(::malloc(size)); } -auto str_ends_with(const char *str, const char *other_str) noexcept -> bool; +/** + * Returns whether or not a string ends with the content of another string. + * + * @param target The string to compare the end of. + * @param target_end The end position of the target string. + * @param other The string to compare with. + */ +auto str_ends_with(const char *target, size_t target_end, const char *other) noexcept + -> bool; /** * Extracts a portion of a string. @@ -32,7 +40,7 @@ void substr(const char *str, const char *end, char *dest) noexcept; * @param str_one The first string. * @param str_two The second string. * - * @returns Whether or not the two string are the same. + * @returns Whether or not the two strings contain the same content. */ auto streq(const char *str_one, const char *str_two) noexcept -> bool; diff --git a/minion/src/wifi_module.cpp b/minion/src/wifi_module.cpp index 5174168..953e9fa 100644 --- a/minion/src/wifi_module.cpp +++ b/minion/src/wifi_module.cpp @@ -498,22 +498,29 @@ auto WiFiModule::_read(uint64_t timeout, char *response_out) noexcept { char character = _read_byte(); + if (has_end) + { + continue; + } + + const auto end_pos = index + 1U; + response_out[index] = character; - response_out[index + 1] = '\0'; + response_out[end_pos] = '\0'; - if (util::str_ends_with(response_out, "OK")) + if (util::str_ends_with(response_out, end_pos, "OK")) { status = WiFiModuleResponseStatus::OK; has_end = true; } - if (util::str_ends_with(response_out, "ERROR")) + if (util::str_ends_with(response_out, end_pos, "ERROR")) { status = WiFiModuleResponseStatus::ERROR; has_end = true; } - if (util::str_ends_with(response_out, "FAIL")) + if (util::str_ends_with(response_out, end_pos, "FAIL")) { status = WiFiModuleResponseStatus::FAIL; has_end = true; -- cgit v1.2.3-18-g5258