// Copyright (c) 2023 Oleg Kalachev // Repository: https://github.com/okalachev/flix // Utility functions #pragma once #include #include #include const float ONE_G = 9.80665; extern double t; float mapf(long x, long in_min, long in_max, float out_min, float out_max) { return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min; } float mapff(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } bool invalid(float x) { return !isfinite(x); } bool valid(float x) { return isfinite(x); } // Wrap angle to [-PI, PI) float wrapAngle(float angle) { angle = fmodf(angle, 2 * PI); if (angle > PI) { angle -= 2 * PI; } else if (angle < -PI) { angle += 2 * PI; } return angle; } // Disable reset on low voltage void disableBrownOut() { REG_CLR_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ENA); } // Trim and split string by spaces void splitString(String& str, String& token0, String& token1, String& token2) { str.trim(); char chars[str.length() + 1]; str.toCharArray(chars, str.length() + 1); token0 = strtok(chars, " "); token1 = strtok(NULL, " "); // String(NULL) creates empty string token2 = strtok(NULL, ""); } // Delay filter for boolean signals - ensures the signal is on for at least 'delay' seconds class Delay { public: float delay; float start = NAN; Delay(float delay) : delay(delay) {} bool update(bool on) { if (!on) { start = NAN; return false; } if (isnan(start)) { start = t; } return t - start >= delay; } };