diff --git a/.github/workflows/clang.yml b/.github/workflows/clang.yml index fce00089..221c17f0 100644 --- a/.github/workflows/clang.yml +++ b/.github/workflows/clang.yml @@ -235,13 +235,13 @@ jobs: - name: Summary env: - clang-threshold: 68 + clang-threshold: 35 run: | - echo "Status: ${{ steps.tidy.outputs.clang-tidy-checks-failed }} checks failed, threshold for success is ${{ env.clang-threshold }}." + echo "Status: ${{ steps.tidy.outputs.checks-failed }} checks failed, threshold for success is ${{ env.clang-threshold }}." echo "Clang report:" if [ -n "${{ github.event.pull_request.number }}" ]; then echo "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}?pr=${{ github.event.pull_request.number }}" else echo "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" fi - exit $(( ${{ steps.tidy.outputs.clang-tidy-checks-failed }} > ${{ env.clang-threshold }} )) + exit $(( ${{ steps.tidy.outputs.checks-failed }} > ${{ env.clang-threshold }} )) diff --git a/firmware/include/extensions/ButtonExtension.h b/firmware/include/extensions/ButtonExtension.h index 13271f33..45159382 100644 --- a/firmware/include/extensions/ButtonExtension.h +++ b/firmware/include/extensions/ButtonExtension.h @@ -12,19 +12,19 @@ class ButtonExtension final : public ExtensionModule #ifdef PIN_SW1 bool brightnessIncrease = false; - inline static bool powerLong = false; - inline static bool powerShort = false; + static inline bool powerLong = false; + static inline bool powerShort = false; #endif #ifdef PIN_SW2 - inline static bool modeLong = false; - inline static bool modeShort = false; + static inline bool modeLong = false; + static inline bool modeShort = false; #endif #ifdef PIN_SW1 static inline volatile bool powerState = false; #endif #ifdef PIN_SW2 - inline static volatile bool modeState = false; + static inline volatile bool modeState = false; #endif #ifdef PIN_SW1 diff --git a/firmware/include/extensions/HomeAssistantExtension.h b/firmware/include/extensions/HomeAssistantExtension.h index e76d353b..0f3456bb 100644 --- a/firmware/include/extensions/HomeAssistantExtension.h +++ b/firmware/include/extensions/HomeAssistantExtension.h @@ -11,14 +11,14 @@ class HomeAssistantExtension final : public ExtensionModule private: static constexpr std::string_view name{"Home Assistant"}; - bool pending = false; - - inline static const std::string discoveryTopic = + static inline const std::string discoveryTopic = std::format("homeassistant/device/0x{:x}/config", ESP.getEfuseMac()); static constexpr std::string_view payloadOff = R"({"power":false})"; static constexpr std::string_view payloadOn = R"({"power":true})"; + bool pending = false; + void transmit(); public: diff --git a/firmware/include/extensions/RtcExtension.h b/firmware/include/extensions/RtcExtension.h index f690a0f3..11fb0b29 100644 --- a/firmware/include/extensions/RtcExtension.h +++ b/firmware/include/extensions/RtcExtension.h @@ -17,7 +17,7 @@ class RtcExtension final : public ExtensionModule static constexpr std::string_view name{"RTC"}; #ifdef PIN_INT - inline static bool pending = true; + static inline bool pending = true; #endif #if defined(RTC_DS3231) || defined(RTC_DS3232) @@ -38,13 +38,13 @@ class RtcExtension final : public ExtensionModule explicit RtcExtension() : ExtensionModule(name) {}; #ifdef RTC_DS1307 - inline static RtcDS1307 rtc{Wire}; + static inline RtcDS1307 rtc{Wire}; #elif defined(RTC_DS3231) - inline static RtcDS3231 rtc{Wire}; + static inline RtcDS3231 rtc{Wire}; #elif defined(RTC_DS3232) - inline static RtcDS3232 rtc{Wire}; + static inline RtcDS3232 rtc{Wire}; #elif defined(RTC_PCF8563) - inline static RtcPCF8563 rtc{Wire}; + static inline RtcPCF8563 rtc{Wire}; #endif // RTC_DS1307 void configure() override; diff --git a/firmware/include/middlewares/GoogleWeatherMiddleware.h b/firmware/include/middlewares/GoogleWeatherMiddleware.h index a36ad832..fee6227a 100644 --- a/firmware/include/middlewares/GoogleWeatherMiddleware.h +++ b/firmware/include/middlewares/GoogleWeatherMiddleware.h @@ -79,7 +79,7 @@ class GoogleWeatherMiddleware final : public WeatherHandler }}; // https://developers.google.com/maps/documentation/weather - inline static std::vector queries{ + static inline std::vector queries{ "location.latitude=" LATITUDE "&location.longitude=" LONGITUDE "&key=" GOOGLEWEATHER_KEY, #if TEMPERATURE_CELSIUS "location.latitude=" LATITUDE "&location.longitude=" LONGITUDE "&unitsSystem=METRIC&key=" GOOGLEWEATHER_KEY, diff --git a/firmware/include/middlewares/OpenMeteoMiddleware.h b/firmware/include/middlewares/OpenMeteoMiddleware.h index 008b0b1c..72e1c43b 100644 --- a/firmware/include/middlewares/OpenMeteoMiddleware.h +++ b/firmware/include/middlewares/OpenMeteoMiddleware.h @@ -32,7 +32,7 @@ class OpenMeteoMiddleware final : public WeatherHandler }}; // https://open-meteo.com/en/docs#api-documentation - inline static std::vector> parts{ + static inline std::vector> parts{ { "api.open-meteo.com", "latitude=" LATITUDE "&longitude=" LONGITUDE "¤t=temperature_2m,weather_code", diff --git a/firmware/include/middlewares/OpenWeatherMiddleware.h b/firmware/include/middlewares/OpenWeatherMiddleware.h index 996164f5..a564669a 100644 --- a/firmware/include/middlewares/OpenWeatherMiddleware.h +++ b/firmware/include/middlewares/OpenWeatherMiddleware.h @@ -34,7 +34,7 @@ class OpenWeatherMiddleware final : public WeatherHandler // https://openweathermap.org/api/one-call-3#current // https://openweathermap.org/current#one - inline static std::vector> parts{ + static inline std::vector> parts{ { "/data/3.0/onecall", "lat=" LATITUDE "&lon=" LONGITUDE "&exclude=alerts,daily,hourly,minutely&appid=" OPENWEATHER_KEY, diff --git a/firmware/include/middlewares/WorldWeatherOnlineMiddleware.h b/firmware/include/middlewares/WorldWeatherOnlineMiddleware.h index 3a177c00..6b685908 100644 --- a/firmware/include/middlewares/WorldWeatherOnlineMiddleware.h +++ b/firmware/include/middlewares/WorldWeatherOnlineMiddleware.h @@ -32,7 +32,7 @@ class WorldWeatherOnlineMiddleware final : public WeatherHandler }}; // https://www.worldweatheronline.com/weather-api/api/docs/local-city-town-weather-api.aspx - inline static std::vector queries{ + static inline std::vector queries{ #ifdef LOCATION "q=" LOCATION "&cc=yes&fx=no&mca=no&format=json&key=" WORLDWEATHERONLINE_KEY, #endif diff --git a/firmware/include/middlewares/WttrInMiddleware.h b/firmware/include/middlewares/WttrInMiddleware.h index ccafb0d4..ab15baf8 100644 --- a/firmware/include/middlewares/WttrInMiddleware.h +++ b/firmware/include/middlewares/WttrInMiddleware.h @@ -35,7 +35,7 @@ class WttrInMiddleware final : public WeatherHandler // https://wttr.in/:help // https://github.com/chubin/wttr.in#readme - inline static std::vector> parts{ + static inline std::vector> parts{ { "/", "format=j1", diff --git a/firmware/include/middlewares/YrMiddleware.h b/firmware/include/middlewares/YrMiddleware.h index e02742f2..1a20f29c 100644 --- a/firmware/include/middlewares/YrMiddleware.h +++ b/firmware/include/middlewares/YrMiddleware.h @@ -129,7 +129,7 @@ class YrMiddleware final : public WeatherHandler // https://api.met.no/weatherapi/locationforecast/2.0/documentation // https://api.met.no/weatherapi/nowcast/2.0/documentation - inline static std::vector paths{ + static inline std::vector paths{ "/weatherapi/locationforecast/2.0/complete", "/weatherapi/nowcast/2.0/complete", }; diff --git a/firmware/include/modes/CircleMode.h b/firmware/include/modes/CircleMode.h index 501496d3..bf8c37ec 100644 --- a/firmware/include/modes/CircleMode.h +++ b/firmware/include/modes/CircleMode.h @@ -11,12 +11,12 @@ class CircleMode final : public ModeModule static constexpr float x = (GRID_COLUMNS - 1) / 2.0F; static constexpr float y = (GRID_ROWS - 1) / 2.0F; - inline static const uint8_t maxRadius = - 3 + ceilf((max(GRID_COLUMNS * PITCH_HORIZONTAL / static_cast(PITCH_VERTICAL), - GRID_ROWS *PITCH_VERTICAL / static_cast(PITCH_HORIZONTAL)) / - M_SQRT2 + - M_SQRT1_2) / - 2.0F); + // NOLINTNEXTLINE(bugprone-throwing-static-initialization,cert-err58-cpp) + static inline const uint8_t maxRadius{static_cast(ceilf( + hypotf(((GRID_COLUMNS - 1) / 2.0F) * + (static_cast(2 * PITCH_HORIZONTAL) / static_cast(PITCH_HORIZONTAL + PITCH_VERTICAL)), + ((GRID_ROWS - 1) / 2.0F) * + (static_cast(2 * PITCH_VERTICAL) / static_cast(PITCH_HORIZONTAL + PITCH_VERTICAL)))))}; bool lit = true; diff --git a/firmware/include/modes/MetaballsMode.h b/firmware/include/modes/MetaballsMode.h index b9f9c289..fc279ddd 100644 --- a/firmware/include/modes/MetaballsMode.h +++ b/firmware/include/modes/MetaballsMode.h @@ -14,7 +14,7 @@ class MetaballsMode final : public ModeModule GRID_ROWS *PITCH_VERTICAL / static_cast(PITCH_HORIZONTAL)) / std::numbers::pi; static constexpr float radiusSq = radius * radius; - static constexpr float speed = 5e-6 * GRID_COLUMNS * GRID_ROWS; + static constexpr float speed = 5e-6F * static_cast(GRID_COLUMNS * GRID_ROWS); static constexpr uint8_t multiplier = 1U << 3U; diff --git a/firmware/include/modes/PixelSequenceMode.h b/firmware/include/modes/PixelSequenceMode.h index f249a5e9..323826e6 100644 --- a/firmware/include/modes/PixelSequenceMode.h +++ b/firmware/include/modes/PixelSequenceMode.h @@ -10,11 +10,11 @@ class PixelSequenceMode final : public ModeModule { private: - static constexpr std::array pixelOrder{LED_MAP}; + static constexpr std::array pixels{LED_MAP}; bool lit = true; - uint16_t address = 0; + uint16_t idx = 0; unsigned long lastMillis = 0; diff --git a/firmware/include/services/DisplayService.h b/firmware/include/services/DisplayService.h index d28ba572..e5a36ebb 100644 --- a/firmware/include/services/DisplayService.h +++ b/firmware/include/services/DisplayService.h @@ -20,7 +20,7 @@ class DisplayService final : public ServiceModule #ifdef PWM_DEPTH static constexpr uint8_t depth = min(PWM_DEPTH, SOC_LEDC_TIMER_BIT_WIDTH); #else - // NOLINTNEXTLINE(bugprone-throwing-static-initialization) + // NOLINTNEXTLINE(bugprone-throwing-static-initialization,cert-err58-cpp) static inline const uint8_t depth = min(max( 8U, static_cast(8.0F - (std::numbers::pi_v * log2f(static_cast(fps) / 120.0F)))), diff --git a/firmware/src/extensions/HeapExtension.cpp b/firmware/src/extensions/HeapExtension.cpp index ef084bde..3ae4e81f 100644 --- a/firmware/src/extensions/HeapExtension.cpp +++ b/firmware/src/extensions/HeapExtension.cpp @@ -41,7 +41,7 @@ void HeapExtension::onHomeAssistant(JsonDocument &discovery, std::string topic, component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); component[HomeAssistantAbbreviations::expire_after].set(UINT8_MAX); component[HomeAssistantAbbreviations::icon].set("mdi:memory"); - component[HomeAssistantAbbreviations::name].set(std::string(Extensions.name.data()).append(" task stack")); + component[HomeAssistantAbbreviations::name].set(std::string(Extensions.name).append(" task stack")); component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); diff --git a/firmware/src/extensions/HomeAssistantExtension.cpp b/firmware/src/extensions/HomeAssistantExtension.cpp index f9fad155..66a7057d 100644 --- a/firmware/src/extensions/HomeAssistantExtension.cpp +++ b/firmware/src/extensions/HomeAssistantExtension.cpp @@ -11,7 +11,6 @@ #include #include -#include void HomeAssistantExtension::begin() { @@ -103,8 +102,8 @@ void HomeAssistantExtension::onTransmit(JsonObjectConst payload, std::string_vie { pending = true; } - // Remove - else if (payload["action"].is() && !strcmp(payload["action"].as(), "remove")) + // Action: Remove + else if (payload["action"].is() && payload["action"].as() == "remove") { undiscover(); } @@ -115,7 +114,7 @@ void HomeAssistantExtension::onHomeAssistant(JsonDocument &discovery, std::strin { topic.append(name); { - const std::string id{std::regex_replace(name.data(), std::regex(R"(\s+)"), "").append("_main")}; + const std::string id{"HomeAssistant_main"}; const std::string topicDisplay{std::string("frekvens/" HOSTNAME "/").append(Display.name)}; JsonObject component{discovery[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::brightness_command_template].set(R"({"brightness":{{value}}})"); diff --git a/firmware/src/extensions/InfraredExtension.cpp b/firmware/src/extensions/InfraredExtension.cpp index 29cd24af..64c48e0f 100644 --- a/firmware/src/extensions/InfraredExtension.cpp +++ b/firmware/src/extensions/InfraredExtension.cpp @@ -154,7 +154,7 @@ void InfraredExtension::setActive(bool _active) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "active", static_cast(active)); + nvs_set_u8(handle, "active", static_cast(active)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/extensions/MicrophoneExtension.cpp b/firmware/src/extensions/MicrophoneExtension.cpp index 16d0cc1f..c1918cbc 100644 --- a/firmware/src/extensions/MicrophoneExtension.cpp +++ b/firmware/src/extensions/MicrophoneExtension.cpp @@ -93,7 +93,7 @@ void MicrophoneExtension::setActive(bool _active) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "active", static_cast(active)); + nvs_set_u8(handle, "active", static_cast(active)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/extensions/PhotocellExtension.cpp b/firmware/src/extensions/PhotocellExtension.cpp index 28e5b383..43dc62f7 100644 --- a/firmware/src/extensions/PhotocellExtension.cpp +++ b/firmware/src/extensions/PhotocellExtension.cpp @@ -53,7 +53,7 @@ void PhotocellExtension::handle() direction = !direction; counter /= 2; } - counter += _brightness - brightness; + counter = static_cast(counter + _brightness - brightness); if (abs(counter) > UINT8_MAX) { brightness = _brightness; @@ -76,7 +76,7 @@ void PhotocellExtension::setActive(bool _active) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "active", static_cast(active)); + nvs_set_u8(handle, "active", static_cast(active)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/extensions/PlaylistExtension.cpp b/firmware/src/extensions/PlaylistExtension.cpp index 262b9994..dd26be01 100644 --- a/firmware/src/extensions/PlaylistExtension.cpp +++ b/firmware/src/extensions/PlaylistExtension.cpp @@ -95,7 +95,7 @@ void PlaylistExtension::setActive(bool _active) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "active", static_cast(active)); + nvs_set_u8(handle, "active", static_cast(active)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/extensions/ScreenshotExtension.cpp b/firmware/src/extensions/ScreenshotExtension.cpp index 8b274286..02a43ca9 100644 --- a/firmware/src/extensions/ScreenshotExtension.cpp +++ b/firmware/src/extensions/ScreenshotExtension.cpp @@ -33,7 +33,7 @@ void ScreenshotExtension::transmit() void ScreenshotExtension::onReceive(JsonObjectConst payload, std::string_view source) // NOLINT(misc-unused-parameters) { - // Pull + // Action: Pull if (payload["action"].is() && payload["action"].as() == "pull") { pending = true; diff --git a/firmware/src/extensions/ServerSentEventsExtension.cpp b/firmware/src/extensions/ServerSentEventsExtension.cpp index b92affff..1d870c67 100644 --- a/firmware/src/extensions/ServerSentEventsExtension.cpp +++ b/firmware/src/extensions/ServerSentEventsExtension.cpp @@ -16,7 +16,7 @@ void ServerSentEventsExtension::onTransmit(JsonObjectConst payload, std::string_ const size_t length = measureJson(payload); std::vector message(length + 1); serializeJson(payload, message.data(), length + 1); - events.send(message.data(), source.data()); + events.send(message.data(), std::string(source).c_str()); } void ServerSentEventsExtension::onConnect(AsyncEventSourceClient *client) diff --git a/firmware/src/extensions/SignalExtension.cpp b/firmware/src/extensions/SignalExtension.cpp index 4c1e43c6..8cc3e55e 100644 --- a/firmware/src/extensions/SignalExtension.cpp +++ b/firmware/src/extensions/SignalExtension.cpp @@ -96,7 +96,7 @@ void SignalExtension::onReceive(JsonObjectConst payload, } } signals.push_back(sign); - ESP_LOGD("Queue", "received"); // NOLINT(cppcoreguidelines-pro-type-vararg) + ESP_LOGD("Queue", "received"); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) } } diff --git a/firmware/src/extensions/StatusLedExtension.cpp b/firmware/src/extensions/StatusLedExtension.cpp index 78e43711..6775ed56 100644 --- a/firmware/src/extensions/StatusLedExtension.cpp +++ b/firmware/src/extensions/StatusLedExtension.cpp @@ -4,7 +4,7 @@ #include "config/constants.h" // NOLINT(misc-include-cleaner) -#include +#include // NOLINT(misc-include-cleaner) void StatusLedExtension::configure() { pinMode(PIN_LED, OUTPUT); } diff --git a/firmware/src/handlers/WeatherHandler.cpp b/firmware/src/handlers/WeatherHandler.cpp index 6c159db0..0ef27363 100644 --- a/firmware/src/handlers/WeatherHandler.cpp +++ b/firmware/src/handlers/WeatherHandler.cpp @@ -87,7 +87,7 @@ std::optional WeatherHandler::getCondition(uint8_t c return codeset.condition; } } - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) ESP_LOGD("Response", "unknown condition code %d", code); return std::nullopt; } @@ -103,7 +103,7 @@ std::optional WeatherHandler::getCondition(uint16_t return codeset.condition; } } - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) ESP_LOGD("Response", "unknown condition code %d", code); return std::nullopt; } diff --git a/firmware/src/middlewares/GoogleWeatherMiddleware.cpp b/firmware/src/middlewares/GoogleWeatherMiddleware.cpp index ac124137..9effcc0d 100644 --- a/firmware/src/middlewares/GoogleWeatherMiddleware.cpp +++ b/firmware/src/middlewares/GoogleWeatherMiddleware.cpp @@ -32,7 +32,7 @@ void GoogleWeatherMiddleware::update(std::optional & doc["temperature"]["degrees"].is() && doc["weatherCondition"]["type"].is()) { condition = getCondition(doc["weatherCondition"]["type"].as(), codesets); - temperature = static_cast(roundf(doc["temperature"]["degrees"].as())); + temperature = static_cast(lroundf(doc["temperature"]["degrees"].as())); return; } queries.pop_back(); diff --git a/firmware/src/middlewares/HomeAssistantWeatherMiddleware.cpp b/firmware/src/middlewares/HomeAssistantWeatherMiddleware.cpp index d3375d26..4ba089fe 100644 --- a/firmware/src/middlewares/HomeAssistantWeatherMiddleware.cpp +++ b/firmware/src/middlewares/HomeAssistantWeatherMiddleware.cpp @@ -32,7 +32,7 @@ void HomeAssistantWeatherMiddleware::update(std::optional() && doc["state"].is()) { condition = getCondition(doc["state"].as(), codesets); - temperature = static_cast(roundf(doc["attributes"]["temperature"].as())); + temperature = static_cast(lroundf(doc["attributes"]["temperature"].as())); return; } paths.pop_back(); diff --git a/firmware/src/middlewares/OpenMeteoMiddleware.cpp b/firmware/src/middlewares/OpenMeteoMiddleware.cpp index b0a77b02..40e6953c 100644 --- a/firmware/src/middlewares/OpenMeteoMiddleware.cpp +++ b/firmware/src/middlewares/OpenMeteoMiddleware.cpp @@ -33,7 +33,7 @@ void OpenMeteoMiddleware::update(std::optional &cond doc["current"]["temperature_2m"].is() && doc["current"]["weather_code"].is()) { condition = getCondition(doc["current"]["weather_code"].as(), codesets); - temperature = static_cast(roundf(doc["current"]["temperature_2m"].as())); + temperature = static_cast(lroundf(doc["current"]["temperature_2m"].as())); return; } parts.pop_back(); diff --git a/firmware/src/middlewares/OpenWeatherMiddleware.cpp b/firmware/src/middlewares/OpenWeatherMiddleware.cpp index bbb78631..5be1c6e4 100644 --- a/firmware/src/middlewares/OpenWeatherMiddleware.cpp +++ b/firmware/src/middlewares/OpenWeatherMiddleware.cpp @@ -37,14 +37,14 @@ void OpenWeatherMiddleware::update(std::optional &co { // API 2.5 condition = getCondition(doc["weather"][0]["id"].as(), codesets); - temperature = static_cast(roundf(doc["main"]["temp"].as())); + temperature = static_cast(lroundf(doc["main"]["temp"].as())); return; } if (deserialization && doc["current"]["temp"].is() && doc["current"]["weather"]["id"].is()) { // API 3.0 condition = getCondition(doc["current"]["weather"]["id"].as(), codesets); - temperature = static_cast(roundf(doc["current"]["temp"].as())); + temperature = static_cast(lroundf(doc["current"]["temp"].as())); return; } parts.pop_back(); diff --git a/firmware/src/middlewares/YrMiddleware.cpp b/firmware/src/middlewares/YrMiddleware.cpp index 1e60f796..2954eee0 100644 --- a/firmware/src/middlewares/YrMiddleware.cpp +++ b/firmware/src/middlewares/YrMiddleware.cpp @@ -36,7 +36,7 @@ void YrMiddleware::update(std::optional &condition, doc["properties"]["timeseries"][0]["data"]["next_1_hours"]["summary"]["symbol_code"].as(), codesets); temperature = static_cast( - roundf(doc["properties"]["timeseries"][0]["data"]["instant"]["details"]["air_temperature"].as())); + lroundf(doc["properties"]["timeseries"][0]["data"]["instant"]["details"]["air_temperature"].as())); return; } paths.pop_back(); diff --git a/firmware/src/modes/AnimationMode.cpp b/firmware/src/modes/AnimationMode.cpp index 583b4d42..44f4608b 100644 --- a/firmware/src/modes/AnimationMode.cpp +++ b/firmware/src/modes/AnimationMode.cpp @@ -109,8 +109,8 @@ void AnimationMode::transmit(uint8_t index, std::span frame) void AnimationMode::onReceive(JsonObjectConst payload, std::string_view source) // NOLINT(misc-unused-parameters) { - // Action: pull - if (payload["action"].is() && !strcmp(payload["action"].as(), "pull")) + // Action: Pull + if (payload["action"].is() && payload["action"].as() == "pull") { lastMillis = millis() + (GRID_COLUMNS * GRID_ROWS); index = 0; diff --git a/firmware/src/modes/BinaryEpochMode.cpp b/firmware/src/modes/BinaryEpochMode.cpp index 01cfb6f0..6157f154 100644 --- a/firmware/src/modes/BinaryEpochMode.cpp +++ b/firmware/src/modes/BinaryEpochMode.cpp @@ -11,7 +11,7 @@ void BinaryEpochMode::handle() if (epoch != _epoch) { epoch = _epoch; - for (uint8_t i = 0; i < GRID_COLUMNS * GRID_ROWS / 8; ++i) + for (uint8_t i = 0; i < static_cast(GRID_COLUMNS * GRID_ROWS / 8); ++i) { const uint8_t x = GRID_COLUMNS - 2 - (i % (GRID_COLUMNS / 2) * 2); const uint8_t y = GRID_ROWS - 4 - (i / (GRID_COLUMNS / 2) * 4); diff --git a/firmware/src/modes/BreakoutClockMode.cpp b/firmware/src/modes/BreakoutClockMode.cpp index 634ad433..3e89c40b 100644 --- a/firmware/src/modes/BreakoutClockMode.cpp +++ b/firmware/src/modes/BreakoutClockMode.cpp @@ -24,11 +24,11 @@ void BreakoutClockMode::begin() void BreakoutClockMode::handle() { - const uint8_t nextX = - static_cast(lroundf(xDec + (cosf(static_cast(deg) * static_cast(DEG_TO_RAD)) * speed))); + const uint8_t nextX{ + static_cast(lroundf(xDec + (cosf(static_cast(deg) * static_cast(DEG_TO_RAD)) * speed)))}; // NOLINTNEXTLINE(cppcoreguidelines-init-variables) - const uint8_t nextY = static_cast( - std::lroundf(yDec - (sinf(static_cast(deg) * static_cast(DEG_TO_RAD)) * speed))); + const uint8_t nextY{static_cast( + std::lroundf(yDec - (sinf(static_cast(deg) * static_cast(DEG_TO_RAD)) * speed)))}; if (y <= 0 && deg < 180) { // Top @@ -74,7 +74,7 @@ void BreakoutClockMode::handle() y = lroundf(yDec); Display.setPixel(x, y); const float rad = atanf((GRID_ROWS - 2 - yDec) / abs(paddle[1] - xDec)); - if (xDec < paddle.front() && rad < 1 && paddle.front() > 0) + if (xDec < paddle.front() && rad < 1 && paddle.front() > 0) // NOLINT(bugprone-branch-clone) { // Left Display.setPixel(paddle.back(), GRID_ROWS - 1, 0); @@ -82,7 +82,7 @@ void BreakoutClockMode::handle() paddle.push_front(paddle.front() - 1); Display.setPixel(paddle.front(), GRID_ROWS - 1); } - else if (xDec > paddle.back() && rad < 1 && paddle.back() < GRID_COLUMNS - 1) + else if (xDec > paddle.back() && rad < 1 && paddle.back() < GRID_COLUMNS - 1) // NOLINT(bugprone-branch-clone) { // Right Display.setPixel(paddle.front(), GRID_ROWS - 1, 0); diff --git a/firmware/src/modes/CircleMode.cpp b/firmware/src/modes/CircleMode.cpp index 8e03f9f3..d12e741d 100644 --- a/firmware/src/modes/CircleMode.cpp +++ b/firmware/src/modes/CircleMode.cpp @@ -14,16 +14,16 @@ void CircleMode::handle() #endif // EXTENSION_MICROPHONE { bool _lit = lit; - for (uint8_t _radius = radius; _radius <= maxRadius; _radius += 3) + for (uint16_t _radius = radius; _radius < static_cast(maxRadius) + 1U; _radius += 3U) { - Display.drawEllipse(x, y, _radius, 1.25F, false, _lit ? UINT8_MAX : 0); + Display.drawEllipse(x, y, static_cast(_radius), 1.0F, false, _lit ? UINT8_MAX : 0); _lit = !_lit; } lastMillis = millis(); ++radius; - if (radius > 3) + if (radius > 3U) { - radius = 1; + radius = 1U; lit = !lit; } } diff --git a/firmware/src/modes/ClockMode.cpp b/firmware/src/modes/ClockMode.cpp index 0cf3e831..27337dc1 100644 --- a/firmware/src/modes/ClockMode.cpp +++ b/firmware/src/modes/ClockMode.cpp @@ -62,12 +62,13 @@ void ClockMode::drawDigits() strikethrough = mm2.getHeight() > 6; Display.clearFrame(); hh1.draw((GRID_COLUMNS / 2) - 1 - fontWidth + ((fontWidth - hh1.getWidth()) / 2), - (GRID_ROWS / 2) - 1 - hh1.getHeight()); - hh2.draw((GRID_COLUMNS / 2) + 1 + ((fontWidth - hh2.getWidth()) / 2), (GRID_ROWS / 2) - 1 - hh2.getHeight()); + static_cast((GRID_ROWS / 2) - 1 - hh1.getHeight())); + hh2.draw((GRID_COLUMNS / 2) + 1 + ((fontWidth - hh2.getWidth()) / 2), + static_cast((GRID_ROWS / 2) - 1 - hh2.getHeight())); mm1.draw((GRID_COLUMNS / 2) - 1 - fontWidth + ((fontWidth - mm1.getWidth()) / 2), - (GRID_COLUMNS / 2) + static_cast(strikethrough)); + static_cast((GRID_COLUMNS / 2) + (strikethrough ? 1 : 0))); mm2.draw((GRID_COLUMNS / 2) + 1 + ((fontWidth - mm2.getWidth()) / 2), - (GRID_COLUMNS / 2) + static_cast(strikethrough)); + static_cast((GRID_COLUMNS / 2) + (strikethrough ? 1 : 0))); } void ClockMode::drawTicker() // NOLINT(readability-make-member-function-const) @@ -75,14 +76,14 @@ void ClockMode::drawTicker() // NOLINT(readability-make-member-function-const) if (strikethrough) { Display.setPixel((GRID_COLUMNS / 2) - (60 / 4 / 2) - 1 + ((second + 2) / 4), - (second & 1U) == 0 ? (GRID_ROWS / 2) - 1 : GRID_ROWS / 2, + (static_cast(second) & 1U) == 0 ? (GRID_ROWS / 2) - 1 : GRID_ROWS / 2, 0); } second = local.tm_sec; if (strikethrough) { Display.setPixel((GRID_COLUMNS / 2) - (60 / 4 / 2) - 1 + ((second + 2) / 4), - (second & 1U) == 0 ? (GRID_ROWS / 2) - 1 : GRID_ROWS / 2, + (static_cast(second) & 1U) == 0 ? (GRID_ROWS / 2) - 1 : GRID_ROWS / 2, INT8_MAX); } else if (second < 8) @@ -135,7 +136,7 @@ void ClockMode::setTicking(bool _ticking) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "ticking", static_cast(ticking)); + nvs_set_u8(handle, "ticking", static_cast(ticking)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/modes/CountdownMode.cpp b/firmware/src/modes/CountdownMode.cpp index 77e0f276..578ee0ee 100644 --- a/firmware/src/modes/CountdownMode.cpp +++ b/firmware/src/modes/CountdownMode.cpp @@ -26,7 +26,7 @@ void CountdownMode::configure() nvs_get_str(handle, "font", fontName.data(), &len); } int64_t _epoch{}; - if (nvs_get_i64(handle, "epoch", &_epoch) == ESP_OK) + if (nvs_get_i64(handle, "epoch", &_epoch) == ESP_OK) // NOLINT(bugprone-branch-clone) { nvs_close(handle); epoch = std::chrono::system_clock::time_point{std::chrono::seconds{_epoch}}; @@ -73,13 +73,13 @@ void CountdownMode::handle() const uint8_t fontWidth{max({_tl.getWidth(), _tr.getWidth(), _bl.getWidth(), _br.getWidth()})}; Display.clearFrame(); _tl.draw((GRID_COLUMNS / 2) - 1 - fontWidth + ((fontWidth - _tl.getWidth()) / 2), - (GRID_ROWS / 2) - 1 - _tl.getHeight()); + static_cast((GRID_ROWS / 2) - 1 - _tl.getHeight())); _tr.draw((GRID_COLUMNS / 2) + 1 + ((fontWidth - _tr.getWidth()) / 2), - (GRID_ROWS / 2) - 1 - _tr.getHeight()); + static_cast((GRID_ROWS / 2) - 1 - _tr.getHeight())); _bl.draw((GRID_COLUMNS / 2) - 1 - fontWidth + ((fontWidth - _bl.getWidth()) / 2), - (GRID_COLUMNS / 2) + static_cast(_bl.getHeight() > 5)); + static_cast((GRID_COLUMNS / 2) + static_cast(_bl.getHeight() > 5))); _br.draw((GRID_COLUMNS / 2) + 1 + ((fontWidth - _br.getWidth()) / 2), - (GRID_COLUMNS / 2) + static_cast(_br.getHeight() > 5)); + static_cast((GRID_COLUMNS / 2) + static_cast(_br.getHeight() > 5))); if (seconds == 0 && minutes == 0 && hours == 0) { blink = INT8_MAX; @@ -90,7 +90,7 @@ void CountdownMode::handle() } } } - else if (blink != 0 && odd == static_cast(seconds & 1)) + else if (blink != 0 && odd == static_cast(static_cast(seconds) & 1U)) { --blink; odd = !odd; diff --git a/firmware/src/modes/DrawMode.cpp b/firmware/src/modes/DrawMode.cpp index a08b7cfa..d680c0f6 100644 --- a/firmware/src/modes/DrawMode.cpp +++ b/firmware/src/modes/DrawMode.cpp @@ -90,6 +90,7 @@ void DrawMode::transmit() void DrawMode::onReceive(JsonObjectConst payload, std::string_view source) // NOLINT(misc-unused-parameters) { + // Action if (payload["action"].is()) { const std::string_view action{payload["action"].as()}; diff --git a/firmware/src/modes/EqualizerMode.cpp b/firmware/src/modes/EqualizerMode.cpp index 4205a1d9..d2628ae6 100644 --- a/firmware/src/modes/EqualizerMode.cpp +++ b/firmware/src/modes/EqualizerMode.cpp @@ -42,9 +42,9 @@ void EqualizerMode::handle() const uint8_t maxX = minX + width - 1; if (bar.level < bar.target) { - for (uint8_t x = minX; x <= maxX; ++x) + for (size_t x = minX; x <= maxX; ++x) { - Display.setPixel(x, bar.level, 0); + Display.setPixel(static_cast(x), bar.level, 0); } ++bar.level; } diff --git a/firmware/src/modes/FireworkMode.cpp b/firmware/src/modes/FireworkMode.cpp index 686aab13..5ebb11ae 100644 --- a/firmware/src/modes/FireworkMode.cpp +++ b/firmware/src/modes/FireworkMode.cpp @@ -69,7 +69,7 @@ void FireworkMode::exploding() if (millis() - lastMillis > INT8_MAX) { ++radius; - Display.drawEllipse(rocketX, rocketY, radius, 1, true, UINT8_MAX / maxRadius * radius); + Display.drawEllipse(rocketX, rocketY, radius, 1.0F, true, UINT8_MAX / maxRadius * radius); lastMillis = millis(); if (radius >= maxRadius) { @@ -85,7 +85,7 @@ void FireworkMode::fading() { --brightness; } - Display.drawEllipse(rocketX, rocketY, radius, 1, true, brightness); + Display.drawEllipse(rocketX, rocketY, radius, 1.0F, true, brightness); lastMillis = millis(); if (brightness <= 0) { diff --git a/firmware/src/modes/GameOfLifeMode.cpp b/firmware/src/modes/GameOfLifeMode.cpp index 794351a0..633073b3 100644 --- a/firmware/src/modes/GameOfLifeMode.cpp +++ b/firmware/src/modes/GameOfLifeMode.cpp @@ -46,7 +46,8 @@ void GameOfLifeMode::handle() pending = false; } std::vector seeds(GRID_COLUMNS * (GRID_ROWS - (clock ? 5 : 0)), false); - for (uint8_t i = active; i < GRID_COLUMNS * (GRID_ROWS - (clock ? 5 : 0)) / (1U << 4U); ++i) + for (uint8_t i = active; i < static_cast(GRID_COLUMNS * (GRID_ROWS - (clock ? 5 : 0)) / (1U << 4U)); + ++i) { seeds[random(1, GRID_COLUMNS - 1) + (random(clock ? 6 : 1, GRID_ROWS - 1) * (GRID_COLUMNS - (clock ? 5 : 0)))] = true; @@ -96,7 +97,7 @@ void GameOfLifeMode::setClock(bool _clock) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "clock", static_cast(clock)); + nvs_set_u8(handle, "clock", static_cast(clock)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/modes/HomeThermometerMode.cpp b/firmware/src/modes/HomeThermometerMode.cpp index f51d076b..bae6db3e 100644 --- a/firmware/src/modes/HomeThermometerMode.cpp +++ b/firmware/src/modes/HomeThermometerMode.cpp @@ -42,8 +42,8 @@ void HomeThermometerMode::draw() const uint8_t height{textOutdoor.getHeight()}; const uint8_t marginsY = (GRID_ROWS - (height * 2)) / 3; Display.clearFrame(); - textIndoor.draw((GRID_COLUMNS - textIndoor.getWidth()) / 2, marginsY); - textOutdoor.draw((GRID_COLUMNS - textOutdoor.getWidth()) / 2, GRID_ROWS - marginsY - height); + textIndoor.draw(static_cast((GRID_COLUMNS - textIndoor.getWidth()) / 2), static_cast(marginsY)); + textOutdoor.draw(static_cast((GRID_COLUMNS - textOutdoor.getWidth()) / 2), GRID_ROWS - marginsY - height); } void HomeThermometerMode::transmit() @@ -60,21 +60,21 @@ void HomeThermometerMode::transmit() void HomeThermometerMode::onReceive(JsonObjectConst payload, std::string_view source) // NOLINT(misc-unused-parameters) { - if (payload["indoor"].is()) + if (payload["indoor"].is()) // NOLINT(bugprone-branch-clone) { setTemperature("indoor", payload["indoor"].as()); } else if (payload["indoor"].is()) { - setTemperature("indoor", roundf(payload["indoor"].as())); + setTemperature("indoor", lroundf(payload["indoor"].as())); } - if (payload["outdoor"].is()) + if (payload["outdoor"].is()) // NOLINT(bugprone-branch-clone) { setTemperature("outdoor", payload["outdoor"].as()); } else if (payload["outdoor"].is()) { - setTemperature("outdoor", roundf(payload["outdoor"].as())); + setTemperature("outdoor", lroundf(payload["outdoor"].as())); } } diff --git a/firmware/src/modes/MetaballsMode.cpp b/firmware/src/modes/MetaballsMode.cpp index bddc2db4..47f6e702 100644 --- a/firmware/src/modes/MetaballsMode.cpp +++ b/firmware/src/modes/MetaballsMode.cpp @@ -24,76 +24,82 @@ void MetaballsMode::begin() void MetaballsMode::handle() { #if EXTENSION_MICROPHONE - if (Extensions.Microphone().isTriggered()) -#endif // EXTENSION_MICROPHONE + if (!Extensions.Microphone().isTriggered()) { + return; + } +#endif // EXTENSION_MICROPHONE #if PITCH_HORIZONTAL != PITCH_VERTICAL - const bool rotated = (static_cast(Display.getOrientation()) % 2) != 0; - const float xRatio = static_cast(2 * (rotated ? PITCH_VERTICAL : PITCH_HORIZONTAL)) / - static_cast(PITCH_VERTICAL + PITCH_HORIZONTAL); - const float yRatio = static_cast(2 * (rotated ? PITCH_HORIZONTAL : PITCH_VERTICAL)) / - static_cast(PITCH_VERTICAL + PITCH_HORIZONTAL); + const bool rotated = (static_cast(Display.getOrientation()) & 1U) != 0; + const float xRatio = static_cast(2 * (rotated ? PITCH_VERTICAL : PITCH_HORIZONTAL)) / + static_cast(PITCH_VERTICAL + PITCH_HORIZONTAL); + const float yRatio = static_cast(2 * (rotated ? PITCH_HORIZONTAL : PITCH_VERTICAL)) / + static_cast(PITCH_VERTICAL + PITCH_HORIZONTAL); #endif // PITCH_HORIZONTAL == PITCH_VERTICAL - for (const Ball &ball : balls) + for (const Ball &ball : balls) + { + const uint8_t xMin = + static_cast(max(static_cast(ball.x - radius - max(ball.xVelocity, 0.0F)), 0)); + const uint8_t yMin = + static_cast(max(static_cast(ball.y - radius - max(ball.yVelocity, 0.0F)), 0)); + const uint8_t xMax = static_cast( + min(static_cast(ceilf(ball.x + radius - min(ball.xVelocity, 0.0F))), GRID_COLUMNS - 1)); + const uint8_t yMax = static_cast( + min(static_cast(ceilf(ball.y + radius - min(ball.yVelocity, 0.0F))), GRID_ROWS - 1)); + for (uint8_t x = xMin; x <= xMax; ++x) { - const uint8_t xMin = max(ball.x - radius - max(ball.xVelocity, 0), 0); - const uint8_t yMin = max(ball.y - radius - max(ball.yVelocity, 0), 0); - const uint8_t xMax = min(ceilf(ball.x + radius - min(ball.xVelocity, 0)), GRID_COLUMNS - 1); - const uint8_t yMax = min(ceilf(ball.y + radius - min(ball.yVelocity, 0)), GRID_ROWS - 1); - for (uint8_t x = xMin; x <= xMax; ++x) + for (uint8_t y = yMin; y <= yMax; ++y) { - for (uint8_t y = yMin; y <= yMax; ++y) + uint8_t brightness = 0; + for (const Ball &ball : balls) { - uint8_t brightness = 0; - for (const Ball &ball : balls) - { #if PITCH_HORIZONTAL == PITCH_VERTICAL - const float xDistance = (ball.x - static_cast(x)); - const float yDistance = (ball.y - static_cast(y)); + const float xDistance = ball.x - static_cast(x); + const float yDistance = ball.y - static_cast(y); #else - const float xDistance = (ball.x - static_cast(x)) * xRatio; - const float yDistance = (ball.y - static_cast(y)) * yRatio; + const float xDistance = (ball.x - static_cast(x)) * xRatio; + const float yDistance = (ball.y - static_cast(y)) * yRatio; #endif // PITCH_HORIZONTAL == PITCH_VERTICAL - const float distanceSq = (xDistance * xDistance) + (yDistance * yDistance); - if (distanceSq < radiusSq) + const float distanceSq = (xDistance * xDistance) + (yDistance * yDistance); + if (distanceSq < radiusSq) + { + brightness = static_cast( + min(static_cast(brightness) + + contributions[static_cast(distanceSq * (1U << 6U) / radiusSq)], + UINT8_MAX)); + if (brightness == UINT8_MAX) { - brightness = min( - brightness + contributions[static_cast(distanceSq * UINT8_MAX / radiusSq)], - UINT8_MAX); - if (brightness >= UINT8_MAX) - { - break; - } + break; } } - Display.setPixel(x, y, brightness); } + Display.setPixel(x, y, brightness); } } - for (Ball &ball : balls) + } + for (Ball &ball : balls) + { + ball.x += ball.xVelocity; + ball.y += ball.yVelocity; + if (ball.x < 0) { - ball.x += ball.xVelocity; - ball.y += ball.yVelocity; - if (ball.x < 0) - { - ball.x = 0; - ball.xVelocity = speed * static_cast(random(1, multiplier)); - } - else if (ball.x > GRID_COLUMNS - 1) - { - ball.x = GRID_COLUMNS - 1; - ball.xVelocity = -speed * static_cast(random(1, multiplier)); - } - if (ball.y < 0) - { - ball.y = 0; - ball.yVelocity = speed * static_cast(random(1, multiplier)); - } - else if (ball.y > GRID_ROWS - 1) - { - ball.y = GRID_ROWS - 1; - ball.yVelocity = -speed * static_cast(random(1, multiplier)); - } + ball.x = 0; + ball.xVelocity = speed * static_cast(random(1, multiplier)); + } + else if (ball.x > GRID_COLUMNS - 1) + { + ball.x = GRID_COLUMNS - 1; + ball.xVelocity = -speed * static_cast(random(1, multiplier)); + } + if (ball.y < 0) + { + ball.y = 0; + ball.yVelocity = speed * static_cast(random(1, multiplier)); + } + else if (ball.y > GRID_ROWS - 1) + { + ball.y = GRID_ROWS - 1; + ball.yVelocity = -speed * static_cast(random(1, multiplier)); } } } diff --git a/firmware/src/modes/PingPongMode.cpp b/firmware/src/modes/PingPongMode.cpp index 5107bf04..6a274925 100644 --- a/firmware/src/modes/PingPongMode.cpp +++ b/firmware/src/modes/PingPongMode.cpp @@ -179,7 +179,7 @@ void PingPongMode::setClock(bool _clock) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "clock", static_cast(clock)); + nvs_set_u8(handle, "clock", static_cast(clock)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/modes/PixelSequenceMode.cpp b/firmware/src/modes/PixelSequenceMode.cpp index 47b6ac4f..003d1807 100644 --- a/firmware/src/modes/PixelSequenceMode.cpp +++ b/firmware/src/modes/PixelSequenceMode.cpp @@ -16,16 +16,16 @@ void PixelSequenceMode::handle() { for (uint16_t i = 0; i < GRID_COLUMNS * GRID_ROWS; ++i) { - if (pixelOrder[i] == address) + if (pixels[i] == idx) { Display.setPixel(i % GRID_COLUMNS, i / GRID_COLUMNS, lit ? UINT8_MAX : 0); break; } } - ++address; - if (address >= GRID_COLUMNS * GRID_ROWS) + ++idx; + if (idx >= GRID_COLUMNS * GRID_ROWS) { - address = 0; + idx = 0; lit = !lit; } lastMillis = millis(); diff --git a/firmware/src/modes/SnakeMode.cpp b/firmware/src/modes/SnakeMode.cpp index 0f0ad6a5..2624ecf3 100644 --- a/firmware/src/modes/SnakeMode.cpp +++ b/firmware/src/modes/SnakeMode.cpp @@ -246,7 +246,7 @@ void SnakeMode::setClock(bool _clock) nvs_handle_t handle{}; if (nvs_open(std::string(name).c_str(), nvs_open_mode_t::NVS_READWRITE, &handle) == ESP_OK) { - nvs_set_u8(handle, "clock", static_cast(clock)); + nvs_set_u8(handle, "clock", static_cast(clock)); // NOLINT(readability-implicit-bool-conversion) nvs_commit(handle); nvs_close(handle); } diff --git a/firmware/src/services/ConnectivityService.cpp b/firmware/src/services/ConnectivityService.cpp index d715664d..065bf470 100644 --- a/firmware/src/services/ConnectivityService.cpp +++ b/firmware/src/services/ConnectivityService.cpp @@ -210,7 +210,7 @@ void ConnectivityService::onIPv4(WiFiEvent_t event, // NOLINT(misc-unused-par WiFiEventInfo_t info) // NOLINT(misc-unused-parameters) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) - ESP_LOGI("Wi-Fi", "IPv4 %s", WiFi.localIP().toString().c_str()); + ESP_LOGI("Wi-Fi", "IPv4 %s", WiFi.localIP().toString().c_str()); // NOLINT(hicpp-vararg) if (!Connectivity.routable) { onRoutable(); @@ -323,8 +323,8 @@ void ConnectivityService::onReceive(JsonObjectConst payload, connect(payload["ssid"].as(), payload["key"].is() ? payload["key"].as() : nullptr); } - // Scan - if (payload["action"].is() && !strcmp(payload["action"].as(), "scan")) + // Action: Scan + if (payload["action"].is() && payload["action"].as() == "scan") { ESP_LOGD("Wi-Fi", "scanning for networks..."); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) WiFi.scanNetworks(true); diff --git a/firmware/src/services/DeviceService.cpp b/firmware/src/services/DeviceService.cpp index 739a9703..f04563eb 100644 --- a/firmware/src/services/DeviceService.cpp +++ b/firmware/src/services/DeviceService.cpp @@ -204,19 +204,25 @@ void DeviceService::receive(JsonObjectConst payload, std::string_view source, st if (operational) { ESP_LOGV("Status", "receiving"); // NOLINT(cppcoreguidelines-avoid-do-while) - const std::array services{ - &Connectivity, - &Device, - &Display, - &Modes, - }; - for (ServiceModule *service : services) + if (Connectivity.name == destination) { - if (service->name == destination) - { - service->onReceive(payload, source); - return; - } + Connectivity.onReceive(payload, source); + return; + } + if (Device.name == destination) + { + Device.onReceive(payload, source); + return; + } + if (Display.name == destination) + { + Display.onReceive(payload, source); + return; + } + if (Modes.name == destination) + { + Modes.onReceive(payload, source); + return; } for (ExtensionModule *extension : Extensions.getAll()) { @@ -226,7 +232,7 @@ void DeviceService::receive(JsonObjectConst payload, std::string_view source, st return; } } - ModeModule *mode{Modes.getMode()}; + ModeModule *mode{Modes.getMode()}; // NOLINT(misc-const-correctness) if (mode != nullptr && mode->name == destination) { mode->onReceive(payload, source); @@ -243,21 +249,22 @@ void DeviceService::receive(JsonObjectConst payload, std::string_view source, st void DeviceService::onReceive(JsonObjectConst payload, std::string_view source) // NOLINT(misc-unused-parameters) { - if (payload["action"].is()) + // Action + if (payload["action"].is()) { - const char *const action = payload["action"].as(); // NOLINT(cppcoreguidelines-init-variables) + const std::string_view action{payload["action"].as()}; // Power off - if (strcmp(action, "power") == 0) + if (action == "power") { setPower(false); } // Reboot - else if (strcmp(action, "reboot") == 0) + else if (action == "reboot") { setPower(true); } // Restore - else if (strcmp(action, "restore") == 0) + else if (action == "restore") { restore(); } diff --git a/firmware/src/services/DisplayService.cpp b/firmware/src/services/DisplayService.cpp index 3022217c..ea1a06b1 100644 --- a/firmware/src/services/DisplayService.cpp +++ b/firmware/src/services/DisplayService.cpp @@ -26,7 +26,7 @@ void DisplayService::configure() SPI.beginTransaction( SPISettings(static_cast(1U << 9U) * GRID_COLUMNS * GRID_ROWS * fps, MSBFIRST, SPI_MODE0)); - hw_timer_t *timer = timerBegin(static_cast(UINT8_MAX) * fps); + hw_timer_t *timer = timerBegin(static_cast(UINT8_MAX) * fps); // NOLINT(cppcoreguidelines-init-variables) timerAttachInterrupt(timer, &onTimer); timerAlarm(timer, 1, true, 0); @@ -74,13 +74,13 @@ IRAM_ATTR void DisplayService::onTimer() } } -void DisplayService::flush() +void DisplayService::flush() // NOLINT(readability-function-cognitive-complexity) { if (!render) { return; } - size_t idx = 0; + size_t idx = 0; // NOLINT(misc-const-correctness) for (size_t byte = 0; byte < GRID_COLUMNS * GRID_ROWS / 8; ++byte) { uint8_t bits = 0; @@ -133,7 +133,7 @@ void DisplayService::flush() std::array counts{}; for (size_t idx = 0; idx < frame.size(); ++idx) { - const uint8_t value = frame[idx]; + const uint8_t value = frame[idx]; // NOLINT(cppcoreguidelines-init-variables) if (value > 0 && value < UINT8_MAX) { ++counts[value]; @@ -148,7 +148,7 @@ void DisplayService::flush() std::array indices{}; for (size_t idx = 0; idx < frame.size(); ++idx) { - const uint8_t value = frame[idx]; + const uint8_t value = frame[idx]; // NOLINT(cppcoreguidelines-init-variables) if (value > 0 && value < UINT8_MAX) { indices[next[value]++] = idx; @@ -160,6 +160,7 @@ void DisplayService::flush() { planes[plane][byte] = planes[plane - 1][byte]; } + // NOLINTNEXTLINE(cppcoreguidelines-init-variables) for (size_t i = offsets[plane]; i < offsets[plane] + counts[plane]; ++i) { planes[plane][indices[i] >> 3U] &= @@ -204,7 +205,7 @@ void DisplayService::setOrientation(Orientation _orientation) default: return; } - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg) ESP_LOGI("Status", "orientation %d°", static_cast(_orientation) * 90U); pixels = _pixels; orientation = _orientation; @@ -372,7 +373,7 @@ uint8_t DisplayService::getPixel(uint8_t x, uint8_t y) const { if (x >= GRID_COLUMNS || y >= GRID_ROWS) { - ESP_LOGV("Device", "invalid pixel %d:%d", x, y); // NOLINT(cppcoreguidelines-pro-type-vararg) + ESP_LOGV("Device", "invalid pixel %d:%d", x, y); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) } return frame[pixels[x + (y * GRID_COLUMNS)]]; } @@ -381,7 +382,7 @@ void DisplayService::setPixel(uint8_t x, uint8_t y, uint8_t brightness) { if (x >= GRID_COLUMNS || y >= GRID_ROWS) { - ESP_LOGV("Device", "invalid pixel %d:%d", x, y); // NOLINT(cppcoreguidelines-pro-type-vararg) + ESP_LOGV("Device", "invalid pixel %d:%d", x, y); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) } frame[pixels[x + (y * GRID_COLUMNS)]] = brightness; render = true; @@ -392,30 +393,32 @@ void DisplayService::drawEllipse(float x, float y, float radius, float ratio, bo { #if PITCH_HORIZONTAL == PITCH_VERTICAL const float xRatio = - static_cast(PITCH_HORIZONTAL * 2) / (ratio * static_cast(PITCH_VERTICAL + PITCH_HORIZONTAL)); + static_cast(PITCH_HORIZONTAL * 2) / (ratio * static_cast(PITCH_HORIZONTAL + PITCH_VERTICAL)); const float yRatio = - static_cast(PITCH_VERTICAL * 2) / (ratio * static_cast(PITCH_VERTICAL + PITCH_HORIZONTAL)); + static_cast(PITCH_VERTICAL * 2) / (ratio * static_cast(PITCH_HORIZONTAL + PITCH_VERTICAL)); #else - const bool rotated = (static_cast(orientation) & 1U) != 0; + const bool rotated = (static_cast(orientation) & 1U) != 0U; const float xRatio = static_cast(2 * (rotated ? PITCH_VERTICAL : PITCH_HORIZONTAL)) / - (ratio * (PITCH_VERTICAL + PITCH_HORIZONTAL)); + (ratio * static_cast(PITCH_HORIZONTAL + PITCH_VERTICAL)); const float yRatio = static_cast(2 * (rotated ? PITCH_HORIZONTAL : PITCH_VERTICAL)) / - (ratio * (PITCH_VERTICAL + PITCH_HORIZONTAL)); + (ratio * static_cast(PITCH_HORIZONTAL + PITCH_VERTICAL)); #endif // PITCH_HORIZONTAL == PITCH_VERTICAL - const uint8_t xMax = min(GRID_COLUMNS - 1, ceilf(x + (radius / xRatio))); - const uint8_t xMin = max(0, floorf(x - (radius / xRatio))); - const uint8_t yMax = min(GRID_COLUMNS - 1, ceilf(y + (radius / yRatio))); - const uint8_t yMin = max(0, floorf(y - (radius / yRatio))); - for (uint16_t _x = xMin; _x <= xMax; ++_x) + const uint8_t xMax = + static_cast(min(static_cast(GRID_COLUMNS - 1), ceilf(x + (radius / xRatio)))); + const uint8_t xMin = static_cast(max(0.0F, floorf(x - (radius / xRatio)))); + const uint8_t yMax = + static_cast(min(static_cast(GRID_ROWS - 1), ceilf(y + (radius / yRatio)))); + const uint8_t yMin = static_cast(max(0.0F, floorf(y - (radius / yRatio)))); + for (size_t _x = xMin; _x <= xMax; ++_x) { - for (uint16_t _y = yMin; _y <= yMax; ++_y) + for (size_t _y = yMin; _y <= yMax; ++_y) { const float xDistance = xRatio * (static_cast(_x) - x); const float yDistance = yRatio * (static_cast(_y) - y); - const float distance = sqrtf((xDistance * xDistance) + (yDistance * yDistance)); + const float distance = hypotf(xDistance, yDistance); if (fill ? (distance <= radius) : (fabsf(distance - radius) < .5F)) { - setPixel(_x, _y, brightness); + setPixel(static_cast(_x), static_cast(_y), brightness); } } } @@ -427,16 +430,16 @@ void DisplayService::drawRectangle(uint8_t minX, uint8_t minY, uint8_t maxX, uin { if (fill) { - for (uint16_t x = minX; x <= maxX; ++x) + for (uint16_t x = minX; x < static_cast(maxX) + 1U; ++x) { - for (uint16_t y = minY; y <= maxY; ++y) + for (uint16_t y = minY; y < static_cast(maxY) + 1U; ++y) { setPixel(static_cast(x), static_cast(y), brightness); } } return; } - for (uint16_t x = minX; x <= maxX; ++x) + for (uint16_t x = minX; x < static_cast(maxX) + 1U; ++x) { setPixel(static_cast(x), minY, brightness); if (maxY != minY) @@ -444,9 +447,9 @@ void DisplayService::drawRectangle(uint8_t minX, uint8_t minY, uint8_t maxX, uin setPixel(static_cast(x), maxY, brightness); } } - if (maxY > minY + 1) + if (maxY > minY + 1U) { - for (uint16_t y = static_cast(minY) + 1; y <= static_cast(maxY) - 1; ++y) + for (uint16_t y = minY + 1U; y < static_cast(maxY); ++y) { setPixel(minX, static_cast(y), brightness); if (maxX != minX) diff --git a/firmware/src/services/ModesService.cpp b/firmware/src/services/ModesService.cpp index 524dfbe8..78e6b296 100644 --- a/firmware/src/services/ModesService.cpp +++ b/firmware/src/services/ModesService.cpp @@ -95,6 +95,7 @@ void ModesService::setActive(bool active) } } +// NOLINTNEXTLINE(readability-function-cognitive-complexity) std::unique_ptr ModesService::getMode(std::string_view modeName) { #if MODE_ANIMATION