AskSin++
Pins.h
1 
2 #ifndef __PINS_H__
3 #define __PINS_H__
4 
5 #include <Arduino.h>
6 #include <Alarm.h>
7 #include <AlarmClock.h>
8 
9 #ifndef PINPOLL_COUNT_LOW
10 #define PINPOLL_COUNT_LOW 1
11 #endif
12 #ifndef PINPOLL_COUNT_HIGH
13 #define PINPOLL_COUNT_HIGH 1
14 #endif
15 
16 namespace as {
17 
18 class ArduinoPins {
19 public:
20  inline static void setOutput (uint8_t pin) { pinMode(pin,OUTPUT); }
21  inline static void setInput (uint8_t pin) { pinMode(pin,INPUT); }
22  inline static void setHigh (uint8_t pin) { digitalWrite(pin,HIGH); }
23  inline static void setLow (uint8_t pin) { digitalWrite(pin,LOW); }
24  inline static uint8_t getState (uint8_t pin) { return digitalRead(pin); }
25 #ifdef ARDUINO_ARCH_STM32F1
26  inline static void setPWM (uint8_t pin) { pinMode(pin,PWM); }
27  inline static void setPWM (uint8_t pin,uint16_t value) { pwmWrite(pin,value); }
28 #else
29  inline static void setPWM (uint8_t pin) { pinMode(pin,OUTPUT); }
30  inline static void setPWM (uint8_t pin,uint8_t value) { analogWrite(pin,value); }
31 #endif
32 };
33 
34 #ifdef __AVR__
35 #ifdef DDRA
36  class PortA {
37  public:
38  inline static void setOutput (uint8_t pin) { DDRA |= (1 << pin); }
39  inline static void setInput (uint8_t pin) { DDRA &= ~(1 << pin); }
40  inline static void setHigh (uint8_t pin) { PORTA |= (1 << pin); }
41  inline static void setLow (uint8_t pin) { PORTA &= ~(1 << pin); }
42  inline static uint8_t getState (uint8_t pin) { return (PINA & (1 << pin)) == 0 ? LOW : HIGH; }
43  };
44 #endif
45  class PortB {
46  public:
47  inline static void setOutput (uint8_t pin) { DDRB |= (1 << pin); }
48  inline static void setInput (uint8_t pin) { DDRB &= ~(1 << pin); }
49  inline static void setHigh (uint8_t pin) { PORTB |= (1 << pin); }
50  inline static void setLow (uint8_t pin) { PORTB &= ~(1 << pin); }
51  inline static uint8_t getState (uint8_t pin) { return (PINB & (1 << pin)) == 0 ? LOW : HIGH; }
52  };
53  class PortC {
54  public:
55  inline static void setOutput (uint8_t pin) { DDRC |= (1 << pin); }
56  inline static void setInput (uint8_t pin) { DDRC &= ~(1 << pin); }
57  inline static void setHigh (uint8_t pin) { PORTC |= (1 << pin); }
58  inline static void setLow (uint8_t pin) { PORTC &= ~(1 << pin); }
59  inline static uint8_t getState (uint8_t pin) { return (PINC & (1 << pin)) == 0 ? LOW : HIGH; }
60  };
61  class PortD {
62  public:
63  inline static void setOutput (uint8_t pin) { DDRD |= (1 << pin); }
64  inline static void setInput (uint8_t pin) { DDRD &= ~(1 << pin); }
65  inline static void setHigh (uint8_t pin) { PORTD |= (1 << pin); }
66  inline static void setLow (uint8_t pin) { PORTD &= ~(1 << pin); }
67  inline static uint8_t getState (uint8_t pin) { return (PIND & (1 << pin)) == 0 ? LOW : HIGH; }
68  };
69 #endif
70 
71 
72  class PinPollingAlarm : public Alarm {
73  private:
74  uint8_t laststate;
75  uint8_t pin;
76  uint8_t mode;
77  uint8_t count;
78  void (*isr)(void);
79 
80  public:
81  PinPollingAlarm () : Alarm(1), laststate(LOW), pin(0), mode(0), count(1), isr(0) {
82  async(true);
83  }
84  virtual ~PinPollingAlarm () {}
85  uint8_t readPin() {
86  uint8_t p = digitalRead(pin);
87  // if state has changed - lower count - if count 0 return changed state
88  if( laststate != p ) {
89  --count;
90  // DDEC(count);
91  if( count > 0 ) {
92  p = laststate;
93  }
94  else {
95  count = (p == LOW ? PINPOLL_COUNT_LOW : PINPOLL_COUNT_HIGH);
96  // DPRINTLN("*");
97  }
98  }
99  else {
100  // we need 3 HIGH before we switch back to high
101  count = (p == LOW ? PINPOLL_COUNT_LOW : PINPOLL_COUNT_HIGH);
102  }
103  return p;
104  }
105  virtual void trigger (AlarmClock& clock) {
106  uint8_t state = readPin();
107  if( state != laststate) {
108  if( state == HIGH ) {
109  if( mode == CHANGE || mode == RISING ) {
110  isr();
111  }
112  }
113  else {
114  if( mode == CHANGE || mode == FALLING ) {
115  isr();
116  }
117  }
118  laststate = state;
119  }
120  set(1);
121  clock.add(*this);
122  }
123 
124  void enable (uint8_t p,void (*func)(void),uint8_t m) {
125  sysclock.cancel(*this);
126  pin = p;
127  isr = func;
128  mode = m;
129  laststate = digitalRead(pin);
130  DPRINT(F("Enable PinPolling: ")); DDEC(pin); DPRINT(F(" - ")); DDECLN(mode);
131  set(1);
132  sysclock.add(*this);
133  }
134  void disable () {
135  DPRINT(F("Disable PinPolling: ")); DDECLN(pin);
136  sysclock.cancel(*this);
137  }
138  };
139 
140  inline PinPollingAlarm& pinpolling4() { static PinPollingAlarm p; return p; }
141  inline PinPollingAlarm& pinpolling5() { static PinPollingAlarm p; return p; }
142  inline PinPollingAlarm& pinpolling6() { static PinPollingAlarm p; return p; }
143  inline PinPollingAlarm& pinpolling7() { static PinPollingAlarm p; return p; }
144  inline PinPollingAlarm& pinpolling8() { static PinPollingAlarm p; return p; }
145  inline PinPollingAlarm& pinpolling9() { static PinPollingAlarm p; return p; }
146  inline PinPollingAlarm& pinpolling10() { static PinPollingAlarm p; return p; }
147  inline PinPollingAlarm& pinpolling11() { static PinPollingAlarm p; return p; }
148  inline PinPollingAlarm& pinpolling12() { static PinPollingAlarm p; return p; }
149  inline PinPollingAlarm& pinpolling13() { static PinPollingAlarm p; return p; }
150  inline PinPollingAlarm& pinpolling14() { static PinPollingAlarm p; return p; }
151  inline PinPollingAlarm& pinpolling15() { static PinPollingAlarm p; return p; }
152  inline PinPollingAlarm& pinpolling16() { static PinPollingAlarm p; return p; }
153  inline PinPollingAlarm& pinpolling17() { static PinPollingAlarm p; return p; }
154  inline PinPollingAlarm& pinpolling18() { static PinPollingAlarm p; return p; }
155  inline PinPollingAlarm& pinpolling19() { static PinPollingAlarm p; return p; }
156  inline PinPollingAlarm& pinpolling20() { static PinPollingAlarm p; return p; }
157  inline PinPollingAlarm& pinpolling21() { static PinPollingAlarm p; return p; }
158  inline PinPollingAlarm& pinpolling22() { static PinPollingAlarm p; return p; }
159  inline PinPollingAlarm& pinpolling23() { static PinPollingAlarm p; return p; }
160  inline PinPollingAlarm& pinpolling24() { static PinPollingAlarm p; return p; }
161  inline PinPollingAlarm& pinpolling25() { static PinPollingAlarm p; return p; }
162  inline PinPollingAlarm& pinpolling26() { static PinPollingAlarm p; return p; }
163  inline PinPollingAlarm& pinpolling27() { static PinPollingAlarm p; return p; }
164  inline PinPollingAlarm& pinpolling28() { static PinPollingAlarm p; return p; }
165  inline PinPollingAlarm& pinpolling29() { static PinPollingAlarm p; return p; }
166  inline PinPollingAlarm& pinpolling30() { static PinPollingAlarm p; return p; }
167  inline PinPollingAlarm& pinpolling31() { static PinPollingAlarm p; return p; }
168 
169 }
170 
171 #endif
as::Alarm
Definition: Alarm.h:15
as::AlarmClock
Definition: AlarmClock.h:32
as::PortC
Definition: Pins.h:53
as::ArduinoPins
Definition: Pins.h:18
as::PortB
Definition: Pins.h:45
as::PortA
Definition: Pins.h:36
as::PortD
Definition: Pins.h:61
as::PinPollingAlarm
Definition: Pins.h:72