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