1018
This commit is contained in:
commit
933d9a14cb
|
|
@ -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
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"dep": [
|
||||||
|
],
|
||||||
|
"cmake": {
|
||||||
|
"inc_dirs": [
|
||||||
|
"inc"
|
||||||
|
],
|
||||||
|
"srcs": [
|
||||||
|
"src/**.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;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue