Skip to content

File syn_encoder.h

File List > input > syn_encoder.h

Go to the documentation of this file

#ifndef SYN_ENCODER_H
#define SYN_ENCODER_H

#include "../common/syn_defs.h"
#include "../drivers/syn_gpio.h"
#include "../dsp/syn_signal.h"

#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ── Encoder direction ──────────────────────────────────────────────────── */

typedef enum {
    SYN_ENCODER_NONE = 0, 
    SYN_ENCODER_CW = 1,   
    SYN_ENCODER_CCW = -1, 
} SYN_EncoderDir;

/* ── Encoder descriptor ─────────────────────────────────────────────────── */

typedef struct {
    SYN_GPIO_Pin pin_a; 
    SYN_GPIO_Pin pin_b; 
    int32_t position;   
    int32_t delta;      
    uint8_t last_state; 
    int8_t last_dir;    
    /* Optional: step multiplier (for encoders with detents every N states) */
    uint8_t steps_per_detent; 
    int8_t sub_count;         
    /* Statistics (optional) */
    SYN_Signal *stats; 
} SYN_Encoder;

/* ── API ────────────────────────────────────────────────────────────────── */

void syn_encoder_init(SYN_Encoder *enc, SYN_GPIO_Pin pin_a, SYN_GPIO_Pin pin_b);

void syn_encoder_set_steps_per_detent(SYN_Encoder *enc, uint8_t spd);

void syn_encoder_update(SYN_Encoder *enc);

int32_t syn_encoder_get_delta(SYN_Encoder *enc);

static inline int32_t syn_encoder_position(const SYN_Encoder *enc)
{
    return enc->position;
}

static inline void syn_encoder_set_position(SYN_Encoder *enc, int32_t pos)
{
    enc->position = pos;
}

static inline SYN_EncoderDir syn_encoder_direction(const SYN_Encoder *enc)
{
    return (SYN_EncoderDir)enc->last_dir;
}

void syn_encoder_set_stats(SYN_Encoder *enc, SYN_Signal *stats);

#ifdef __cplusplus
}
#endif

#endif /* SYN_ENCODER_H */