Nuke treeset

This commit is contained in:
Imbus 2025-07-30 00:51:55 +02:00
parent 45ef1c4271
commit 02e80b3827
5 changed files with 184 additions and 0 deletions

12
filters/Makefile Normal file
View file

@ -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)

71
filters/filters.c Normal file
View file

@ -0,0 +1,71 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#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;
}

70
lua_advanced/esc.c Normal file
View file

@ -0,0 +1,70 @@
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
#include <stdbool.h>
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"
}

4
lua_advanced/esc.h Normal file
View file

@ -0,0 +1,4 @@
#pragma once
#include <lua.h>
void register_esc(lua_State *L);

27
lua_advanced/esc.lua Normal file
View file

@ -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