Repository navigation
Expand file tree
/
Copy pathclickEncoderIn.h
More file actions
119 lines (94 loc) · 3.1 KB
/
Copy pathclickEncoderIn.h
File metadata and controls
119 lines (94 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* -*- C++ -*- */
/**************
ClickEncoderStream.h
Jun. 2016
Modified by Christophe Persoz and Rui Azevedo.
Based on keyStream.h developed by Rui Azevado.
and ClickEncoder library by Peter Dannegger.
https://github.com/christophepersoz/encoder
Sept. 2014 Rui Azevedo - ruihfazevedo(@rrob@)gmail.com
quick and dirty keyboard driver
metaprog keyboard driver where N is the number of keys
all keys are expected to be a pin (buttons)
we can have reverse logic (pull-ups) by entering negative pin numbers
ex: -A0 means: pin A0 normally high, low when button pushed (reverse logic)
***/
#ifndef __ClickEncoderStream_h__
#define __ClickEncoderStream_h__
#include <Arduino.h>
#ifndef ARDUINO_SAM_DUE
// Arduino specific libraries
// #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega328P__)
// #include <stdint.h>
//#include <avr/io.h>
//#include <avr/interrupt.h>
#include <ClickEncoder.h>
// #endif
#include "../menu.h"
namespace Menu {
//emulate a stream based on clickEncoder movement returning +/- for every 'sensivity' steps
//buffer not needer because we have an accumulator
class ClickEncoderStream:public menuIn {
public:
ClickEncoder &enc; //associated hardware clickEncoder
int8_t sensivity;
int oldPos;
int pos;
ClickEncoder::Button btn;
inline void update() {
pos += enc.getValue();
if (btn == ClickEncoder::Open)//do not override previous input
btn = enc.getButton();
}
ClickEncoderStream(ClickEncoder &enc,int sensivity)
:enc(enc),
sensivity(sensivity),
oldPos(0),
pos(0),
btn(ClickEncoder::Open) {
pos = enc.getValue();
}
inline void setSensivity(int s) {
sensivity = s;
}
int available(void) {
return peek() != noCmd;
}
navCmd peek(void) {
update();
if (btn == ClickEncoder::Clicked)
return enterCmd;//menu::enterCode;
if (btn == ClickEncoder::DoubleClicked)
return escCmd;//menu::escCode;
btn=ClickEncoder::Open;//2017, must consume not used input to proceed
int d = pos - oldPos;
if (d <= -sensivity)
return downCmd;//menu::downCode;
if (d >= sensivity)
return upCmd;//menu::upCode;
return noCmd;
}
navCmd getCmd()
{
navCmd ch = peek();
btn = ClickEncoder::Open;
if (ch == upCmd)//menu::upCode)
oldPos += sensivity;
else if (ch == downCmd)//menu::downCode)
oldPos -= sensivity;
return ch;
}
// void flush() {
// btn=ClickEncoder::Open;//2017 clear current key
// update();
// oldPos = pos;
// }
//
// size_t write(uint8_t v) {
// oldPos = v;
// return 1;
// }
};
}//namespace Menu
#endif
#endif /* ClickEncoderStream_h */