#include "sma_filter.h"

void SMAFilter_Init(SMAFilter_t* f)
{
    if (f == 0) return;

    f->sum = 0;
    f->idx = 0;
    f->count = 0;

    for (uint16_t i = 0; i < SMA_FILTER_WINDOW; i++) {
        f->buffer[i] = 0;
    }
}

int32_t SMAFilter_Update(SMAFilter_t* f, int32_t x)
{
    if (f == 0) return x;

    // Пока окно не заполнено полностью, делим по фактическому count.
    if (f->count < SMA_FILTER_WINDOW) {
        f->buffer[f->idx] = x;
        f->sum += x;
        f->idx++;
        if (f->idx >= SMA_FILTER_WINDOW) f->idx = 0;
        f->count++;
        return (int32_t)(f->sum / (int32_t)f->count);
    }

    // Окно заполнено: "вычитаем старое + добавляем новое".
    int32_t old = f->buffer[f->idx];
    f->buffer[f->idx] = x;
    f->sum += (x - old);

    f->idx++;
    if (f->idx >= SMA_FILTER_WINDOW) f->idx = 0;

    return (int32_t)(f->sum / (int32_t)SMA_FILTER_WINDOW);
}

