From 02e80b382712f8fe581acdbf8693a904b693a10b Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Wed, 30 Jul 2025 00:51:55 +0200 Subject: [PATCH] Nuke treeset --- filters/Makefile | 12 ++++++++ filters/filters.c | 71 ++++++++++++++++++++++++++++++++++++++++++++ lua_advanced/esc.c | 70 +++++++++++++++++++++++++++++++++++++++++++ lua_advanced/esc.h | 4 +++ lua_advanced/esc.lua | 27 +++++++++++++++++ 5 files changed, 184 insertions(+) create mode 100644 filters/Makefile create mode 100644 filters/filters.c create mode 100644 lua_advanced/esc.c create mode 100644 lua_advanced/esc.h create mode 100644 lua_advanced/esc.lua diff --git a/filters/Makefile b/filters/Makefile new file mode 100644 index 0000000..2213e3d --- /dev/null +++ b/filters/Makefile @@ -0,0 +1,12 @@ +CC ?= gcc +CFLAGS ?= -Wall -O2 + +TARGET = main.elf +SRC = message.c main_demo.c + +$(TARGET): $(SRC) + @echo CC $@ + @$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean: + rm -f $(TARGET) diff --git a/filters/filters.c b/filters/filters.c new file mode 100644 index 0000000..c559c53 --- /dev/null +++ b/filters/filters.c @@ -0,0 +1,71 @@ +#include +#include +#include + +#define N 8 + +uint16_t buffer[N]; +uint8_t idx = 0; + +/* + * Pros: Simple and smooths well. + * Cons: Lag, slow to respond to real changes. + */ +uint16_t moving_average(uint16_t new_sample) { + buffer[idx++] = new_sample; + if (idx >= N) + idx = 0; + + uint32_t sum = 0; + for (int i = 0; i < N; i++) sum += buffer[i]; + return sum / N; +} + +float alpha = 0.1f; // Between 0 (more smoothing) and 1 (less) +float filtered = 0; + +/* + * Pros: Very lightweight, tunable. + * Cons: Might not remove all burst noise + */ +uint16_t low_pass_filter(uint16_t new_sample) { + filtered = alpha * new_sample + (1 - alpha) * filtered; + return (uint16_t)filtered; +} + +int compare_uint16(const void *a, const void *b) { + return (*(uint16_t *)a - *(uint16_t *)b); +} + +uint16_t median_filter(uint16_t new_sample) { + static uint16_t window[N]; + static uint8_t index = 0; + window[index++] = new_sample; + if (index >= N) + index = 0; + + // Copy and sort + uint16_t sorted[N]; + memcpy(sorted, window, sizeof(sorted)); + qsort(sorted, N, sizeof(uint16_t), compare_uint16); + return sorted[N / 2]; +} + +#undef N +#define N 5 +float coeffs[N] = {0.1, 0.15, 0.5, 0.15, 0.1}; // Symmetric LPF +float buffer[N] = {0}; +int index = 0; + +float fir_filter(float sample) { + buffer[index] = sample; + float result = 0; + int i, j = index; + for (i = 0; i < N; i++) { + result += coeffs[i] * buffer[j]; + j = (j - 1 + N) % N; + } + index = (index + 1) % N; + return result; +} + diff --git a/lua_advanced/esc.c b/lua_advanced/esc.c new file mode 100644 index 0000000..026ca2e --- /dev/null +++ b/lua_advanced/esc.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include + +struct EscConfig { + int maxspeed; + float odometer; + bool started; +}; + +static struct EscConfig esc_config = { + .maxspeed = 100, + .odometer = 12.5f, + .started = false, +}; + +/* Lua: get_esc_config() -> table */ +static int l_get_esc_config(lua_State *L) { + lua_newtable(L); + + lua_pushstring(L, "maxspeed"); + lua_pushinteger(L, esc_config.maxspeed); + lua_settable(L, -3); + + lua_pushstring(L, "odometer"); + lua_pushnumber(L, esc_config.odometer); + lua_settable(L, -3); + + lua_pushstring(L, "started"); + lua_pushboolean(L, esc_config.started); + lua_settable(L, -3); + + return 1; // return the table +} + +/* Lua: set_maxspeed(value) */ +static int l_set_maxspeed(lua_State *L) { + int maxspeed = luaL_checkinteger(L, 1); + esc_config.maxspeed = maxspeed; + return 0; +} + +/* Lua: set_started(value) */ +static int l_set_started(lua_State *L) { + int started = lua_toboolean(L, 1); + esc_config.started = started; + return 0; +} + +/* Lua: add_odometer(delta) */ +static int l_add_odometer(lua_State *L) { + float delta = luaL_checknumber(L, 1); + esc_config.odometer += delta; + return 0; +} + +static const struct luaL_Reg esc_funcs[] = { + {"get_esc_config", l_get_esc_config}, + {"set_maxspeed", l_set_maxspeed}, + {"set_started", l_set_started}, + {"add_odometer", l_add_odometer}, + {NULL, NULL}, +}; + +/* Register the functions into Lua as global "esc" */ +void register_esc(lua_State *L) { + luaL_newlib(L, esc_funcs); // create table with all funcs + lua_setglobal(L, "esc"); // set global "esc" +} diff --git a/lua_advanced/esc.h b/lua_advanced/esc.h new file mode 100644 index 0000000..e1880bc --- /dev/null +++ b/lua_advanced/esc.h @@ -0,0 +1,4 @@ +#pragma once +#include + +void register_esc(lua_State *L); diff --git a/lua_advanced/esc.lua b/lua_advanced/esc.lua new file mode 100644 index 0000000..c9abe87 --- /dev/null +++ b/lua_advanced/esc.lua @@ -0,0 +1,27 @@ +---@meta + +---@class EscConfig +---@field maxspeed integer +---@field odometer number +---@field started boolean + +---@class esc +esc = {} + +---Get current ESC config +---@return EscConfig +function esc.get_esc_config() end + +---Set maximum speed +---@param value integer +function esc.set_maxspeed(value) end + +---Set started flag +---@param value boolean +function esc.set_started(value) end + +---Add to odometer +---@param delta number +function esc.add_odometer(delta) end + +return esc