AskSin++
PinPosition.h
1 //- -----------------------------------------------------------------------------------------------------------------------
2 // AskSin++
3 // 2017-10-19 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
4 //- -----------------------------------------------------------------------------------------------------------------------
5 
6 #ifndef __PINPOSITION_H__
7 #define __PINPOSITION_H__
8 
9 
10 #include "Sensors.h"
11 
12 namespace as {
13 
14 template <uint16_t WAITMILLIS_AFTER_ENABLE=0>
15 class OnePinPosition : public Position {
16  uint8_t sens;
17  uint8_t en;
18 public:
19  OnePinPosition () : sens(0), en(0) { _present = true; }
20 
21  void init (uint8_t pin, uint8_t enpin) {
22  sens=pin;
23  en = enpin;
24  if (en != 0) pinMode(en, OUTPUT);
25  }
26 
27  void measure (__attribute__((unused)) bool async=false) {
28  _position = ( AskSinBase::readPin(sens, en, WAITMILLIS_AFTER_ENABLE) == 0) ? State::PosA : State::PosB;
29  }
30 };
31 
32 class TwoPinPosition : public Position {
33  // pin mapping can be changed by bootloader config data
34  // map pins to pos 00 01 10 11
35  uint8_t posmap[4] = {State::PosC,State::PosC,State::PosB,State::PosA};
36  uint8_t sens1, sens2;
37 public:
38  TwoPinPosition () : sens1(0), sens2(0) { _present = true; }
39 
40  void init (uint8_t pin1,uint8_t pin2, const uint8_t* pmap) {
41  memcpy(posmap,pmap,4);
42  init(pin1,pin2);
43  }
44 
45  void init (uint8_t pin1,uint8_t pin2) {
46  sens1=pin1;
47  sens2=pin2;
48  }
49 
50  void measure (__attribute__((unused)) bool async=false) {
51  uint8_t pinstate = AskSinBase::readPin(sens2) << 1 | AskSinBase::readPin(sens1);
52  _position = posmap[pinstate & 0x03];
53  }
54 };
55 
56 }
57 
58 #endif
as::OnePinPosition
Definition: PinPosition.h:15
as::Position
Definition: Sensors.h:57
as::AskSinBase::readPin
static uint8_t readPin(uint8_t pinnr, uint8_t enablenr=0, uint8_t ms=0)
Definition: AskSinPP.h:186
as::TwoPinPosition
Definition: PinPosition.h:32