commit 933d9a14cba9ca28d1833bdf1660cc8d53a220f3 Author: Villuton Date: Fri Feb 7 17:00:03 2025 +0300 1018 diff --git a/inc/Encoder.h b/inc/Encoder.h new file mode 100644 index 0000000..aac41c2 --- /dev/null +++ b/inc/Encoder.h @@ -0,0 +1,51 @@ +// +// Created by villuton on 06.02.25. +// +#ifndef ENCODER_H +#define ENCODER_H + +#include +#include + +typedef enum { + ENC_NON = 0, + ENC_FWD = 0b1<<0, + ENC_BACK=0b1<<1, + ENC_KEY=0b1<<2, + ENC_FWD_KEY = ENC_FWD|ENC_KEY, + ENC_BACK_KEY = ENC_BACK|ENC_KEY, + ENC_NOT_DEF=0b1<<3, +}eEncoderEvent; + +#define ENCODER_WITHOUT_KEY 0b1<<0 +#define ENCODER_PIN_REWERT 0b1<<1 + +typedef bool (*pinGetProvider)(void *pinEnv); + +typedef struct { + void *pinA; + void *pinB; + void *pinKey; + + pinGetProvider pinGet; + + + bool undefState; + int countValue; + uint8_t encoderState; + uint8_t newValue; + uint8_t fullState; + + uint16_t flags; +}tEncoder; + +void Encoder_Init(tEncoder *env, + void *pinA, + void *pinB, + void *pinKey, + pinGetProvider pinGet, + uint16_t flags); +eEncoderEvent Encoder_Check(tEncoder *env); +int Encoder_GetCounter(tEncoder *env); + +#endif //ENCODER_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..bc858d4 --- /dev/null +++ b/modular.json @@ -0,0 +1,12 @@ +{ + "dep": [ + ], + "cmake": { + "inc_dirs": [ + "inc" + ], + "srcs": [ + "src/**.c" + ] + } +} \ No newline at end of file diff --git a/src/Encoder.c b/src/Encoder.c new file mode 100644 index 0000000..aeee5ed --- /dev/null +++ b/src/Encoder.c @@ -0,0 +1,93 @@ +// +// Created by villuton on 06.02.25. +// +#include "Encoder.h" + +#define EncoderPinGet(PIN) env->pinGet(PIN) + +void Encoder_Init(tEncoder *env, + void *pinA, + void *pinB, + void *pinKey, + pinGetProvider pinGet, + uint16_t flags){ + env->pinA = pinA; + env->pinB = pinB; + env->pinKey = pinKey; + env->pinGet = pinGet; + env->flags = flags; +} + +/* + | y2 y1 x2 x1 Вперёд Назад Состояние +------------------------------------------------------------------ +0 |0 0 0 0 0 0 Стоп +1 |0 0 0 1 0 1 Назад +2 |0 0 1 0 1 0 Вперёд +3 |0 0 1 1 0 0 Не определено +4 |0 1 0 0 1 0 Вперед +5 |0 1 0 1 0 0 Стоп +6 |0 1 1 0 0 1/0 Назад* +7 |0 1 1 1 0 1 Назад +8 |1 0 0 0 0 1 Назад +9 |1 0 0 1 1/0 0 Вперёд* +A |1 0 1 0 0 0 Стоп +B |1 0 1 1 1 0 Вперёд +C |1 1 0 0 0 0 Не определено +D |1 1 0 1 1 0 Вперёд +E |1 1 1 0 0 1 Назад +F |1 1 1 1 0 0 Стоп +------------------------------------------------------------------ + */ +eEncoderEvent Encoder_Check(tEncoder *env){ + uint8_t result = ENC_NON; + + static uint8_t oldResult = ENC_NON; + + env->newValue = ((EncoderPinGet(env->pinA)&0b1)<<0b1)|(EncoderPinGet(env->pinB)&0b1); + env->fullState = env->newValue | env->encoderState << 2; + switch(env->fullState) + { + case 0x2: case 0x4: case 0xB: case 0xD: //case 0x9: + if(env->undefState){ + env->undefState = false; + } else{ + env->countValue ++; + result = ENC_FWD; + + } + break; + case 0x1: case 0x7: case 0x8: case 0xE://case 0x6: + if(env->undefState){ + env->undefState = false; + } else{ + + env->countValue--; + result = ENC_BACK; + } + break; + case 0x3:case 0xC:case 0xF:case 0x5:case 0xA: + env->undefState = true; + default: + break; + } + env->encoderState = env->newValue; + + if((oldResult|result)==(ENC_BACK|ENC_FWD)){ + oldResult = result; + result = ENC_NON; + } + + if(result != ENC_NON) { + if (env->flags & ENCODER_WITHOUT_KEY) { + return result; + } else { + return EncoderPinGet(env->pinKey) ? (result | ENC_KEY) : result; + } + } + + return result; +} +int Encoder_GetCounter(tEncoder *env){ + return env->countValue; +} \ No newline at end of file