This commit is contained in:
Степанов Станислав 2025-02-07 17:00:03 +03:00
commit 933d9a14cb
3 changed files with 156 additions and 0 deletions

51
inc/Encoder.h Normal file
View File

@ -0,0 +1,51 @@
//
// Created by villuton on 06.02.25.
//
#ifndef ENCODER_H
#define ENCODER_H
#include <stdbool.h>
#include <stdint-gcc.h>
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

12
modular.json Normal file
View File

@ -0,0 +1,12 @@
{
"dep": [
],
"cmake": {
"inc_dirs": [
"inc"
],
"srcs": [
"src/**.c"
]
}
}

93
src/Encoder.c Normal file
View File

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