Skip to content

Commit 7e7d2e9

Browse files
committed
improved modm:driver:encoder_input.bitbang
1 parent 6632a19 commit 7e7d2e9

File tree

3 files changed

+29
-31
lines changed

3 files changed

+29
-31
lines changed

src/modm/driver/encoder/bitbang_encoder_input.hpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,19 @@ namespace modm
2626
*
2727
* @tparam SignalA First modm::platform::Gpio pin to input the encoder signal.
2828
* @tparam SignalB Second modm::platform::Gpio pin to input the encoder signal.
29-
* @tparam POSTSCALER n_cycles to count as one in-/decrement.
30-
* @tparam DeltaType Must be signed integer and fit at least POSTSCALER. The Bigger
29+
* @tparam PRESCALER n_cycles to count as one in-/decrement.
30+
* @tparam DeltaType Must be signed integral and fit at least PRESCALER. The Bigger
3131
* DeltaType, the more inc-/decrements can be stored temporarily.
32+
* @tparam ValueType Must be unsigned integral.
3233
*/
33-
template<typename SignalA, typename SignalB, uint8_t POSTSCALER = 4,
34+
template<typename SignalA, typename SignalB, uint8_t PRESCALER = 4,
3435
std::signed_integral DeltaType = int8_t>
3536
class BitBangEncoderInput
3637
{
37-
static_assert(std::popcount(POSTSCALER) == 1,
38-
"POSTSCALER must be an integer to basis 2 and not 0: 1, 2, 4, 8, 16, ...");
39-
static_assert(POSTSCALER <= std::numeric_limits<DeltaType>::max(),
40-
"DeltaType is to small for POSTSCALER.");
38+
static_assert(std::popcount(PRESCALER) == 1,
39+
"PRESCALER must be an integer to basis 2 and not 0: 1, 2, 4, 8, 16, ...");
40+
static_assert(PRESCALER <= std::numeric_limits<DeltaType>::max(),
41+
"DeltaType is to small for PRESCALER.");
4142

4243
using Signals = modm::platform::SoftwareGpioPort<SignalA, SignalB>;
4344

@@ -47,19 +48,19 @@ class BitBangEncoderInput
4748
uint8_t inline getRaw();
4849

4950
public:
50-
using ValueType = DeltaType;
5151
BitBangEncoderInput() : raw_last(0), delta(0){};
5252

53+
using InputType = modm::platform::Gpio::InputType;
5354
// Connect SingalA and SignalB and store power-up state
5455
inline void
55-
connect();
56+
initialize(const modm::platform::Gpio::InputType inputType = modm::platform::Gpio::InputType::PullUp);
5657

5758
// Call @1kHz for manual movement
5859
inline void
5960
update();
6061

61-
ValueType
62-
getIncrement();
62+
DeltaType
63+
getDelta();
6364

6465
private:
6566
uint8_t raw_last;

src/modm/driver/encoder/bitbang_encoder_input.lb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def init(module):
1515
module.description = """
1616
# Quadrature Encoder Input
1717
18-
This driver decodes a AB (incremental) encoder signal.
18+
This driver decodes an AB (incremental) encoder signal.
1919
Ported from code created by Peter Dannegger:
2020
https://www.mikrocontroller.net/articles/Drehgeber.
2121
"""

src/modm/driver/encoder/bitbang_encoder_input_impl.hpp

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@
1515

1616
#include <cmath>
1717

18-
template<typename SignalA, typename SignalB, uint8_t POSTSCALER,
19-
std::signed_integral DeltaType>
18+
template<typename SignalA, typename SignalB, uint8_t PRESCALER, std::signed_integral DeltaType>
2019
inline uint8_t
21-
modm::BitBangEncoderInput<SignalA, SignalB, POSTSCALER, DeltaType>::getRaw()
20+
modm::BitBangEncoderInput<SignalA, SignalB, PRESCALER, DeltaType>::getRaw()
2221
{
2322
const uint8_t read = Signals::read();
2423
// convert graycode to binary
@@ -28,42 +27,40 @@ modm::BitBangEncoderInput<SignalA, SignalB, POSTSCALER, DeltaType>::getRaw()
2827
return raw;
2928
}
3029

31-
template<typename SignalA, typename SignalB, uint8_t POSTSCALER,
32-
std::signed_integral DeltaType>
30+
template<typename SignalA, typename SignalB, uint8_t PRESCALER, std::signed_integral DeltaType>
3331
inline void
34-
modm::BitBangEncoderInput<SignalA, SignalB, POSTSCALER, DeltaType>::connect()
32+
modm::BitBangEncoderInput<SignalA, SignalB, PRESCALER, DeltaType>::initialize(
33+
const modm::platform::Gpio::InputType inputType
34+
)
3535
{
36-
Signals::setInput(::Gpio::InputType::PullUp);
36+
Signals::setInput(inputType);
3737

3838
// Tare power-on state
3939
modm::delay(10us);
4040
raw_last = getRaw();
4141
}
4242

43-
template<typename SignalA, typename SignalB, uint8_t POSTSCALER,
44-
std::signed_integral DeltaType>
43+
template<typename SignalA, typename SignalB, uint8_t PRESCALER, std::signed_integral DeltaType>
4544
inline void
46-
modm::BitBangEncoderInput<SignalA, SignalB, POSTSCALER, DeltaType>::update()
45+
modm::BitBangEncoderInput<SignalA, SignalB, PRESCALER, DeltaType>::update()
4746
{
48-
uint8_t raw = getRaw();
47+
const uint8_t raw = getRaw();
4948
const uint8_t diff = raw_last - raw;
49+
5050
if (diff & 0b01)
5151
{
5252
raw_last = raw;
5353
delta += (diff & 0b10) - 1; // bit 1 = direction (+/-)
5454
}
5555
}
5656

57-
template<typename SignalA, typename SignalB, uint8_t POSTSCALER,
58-
std::signed_integral DeltaType>
57+
template<typename SignalA, typename SignalB, uint8_t PRESCALER, std::signed_integral DeltaType>
5958
DeltaType
60-
modm::BitBangEncoderInput<SignalA, SignalB, POSTSCALER, DeltaType>::getIncrement()
59+
modm::BitBangEncoderInput<SignalA, SignalB, PRESCALER, DeltaType>::getDelta()
6160
{
6261
::modm::atomic::Lock _;
63-
DeltaType val = delta;
64-
65-
delta &= (POSTSCALER - 1); // mask out higher bits
6662

67-
constexpr uint8_t shift = std::log2(POSTSCALER); // Number of fraction bits
68-
return val >> shift; // return whats left without fractions
63+
DeltaType ret = delta;
64+
delta &= (PRESCALER - 1); // Only keep prescaler fraction
65+
return ret >> int(std::log2(PRESCALER)); // return delta without prescaler fraction
6966
}

0 commit comments

Comments
 (0)