COSA
An Object-Oriented Platform for Arduino Programming
OutputPin.hh
Go to the documentation of this file.
1 
21 #ifndef COSA_OUTPUT_PIN_HH
22 #define COSA_OUTPUT_PIN_HH
23 
24 #include "Cosa/Pin.hh"
25 
29 class OutputPin : public Pin {
30 public:
36  OutputPin(Board::DigitalPin pin, uint8_t initial = 0) :
37  Pin((uint8_t) pin)
38  {
39  synchronized {
40  *DDR() |= m_mask;
41  if (initial) {
42  *PORT() |= m_mask;
43  }
44  else {
45  *PORT() &= ~m_mask;
46  }
47  }
48  }
49 
56  static void mode(Board::DigitalPin pin, uint8_t initial = 0)
57  {
58  volatile uint8_t* port = PORT(pin);
59  volatile uint8_t* ddr = DDR(pin);
60  const uint8_t mask = MASK(pin);
61  synchronized {
62  *ddr |= mask;
63  if (initial) {
64  *port |= mask;
65  }
66  else {
67  *port &= ~mask;
68  }
69  }
70  }
71 
75  void _set() const
76  __attribute__((always_inline))
77  {
78  *PORT() |= m_mask;
79  }
80 
85  void set() const
86  __attribute__((always_inline))
87  {
88  synchronized *PORT() |= m_mask;
89  }
90 
95  void high() const
96  __attribute__((always_inline))
97  {
98  synchronized *PORT() |= m_mask;
99  }
100 
105  void on() const
106  __attribute__((always_inline))
107  {
108  synchronized *PORT() |= m_mask;
109  }
110 
114  void _clear() const
115  __attribute__((always_inline))
116  {
117  *PORT() &= ~m_mask;
118  }
119 
124  void clear() const
125  __attribute__((always_inline))
126  {
127  synchronized *PORT() &= ~m_mask;
128  }
129 
134  void low() const
135  __attribute__((always_inline))
136  {
137  synchronized *PORT() &= ~m_mask;
138  }
139 
144  void off() const
145  __attribute__((always_inline))
146  {
147  synchronized *PORT() &= ~m_mask;
148  }
149 
153  void _toggle() const
154  __attribute__((always_inline))
155  {
156  *PIN() = m_mask;
157  }
158 
163  void toggle() const
164  __attribute__((always_inline))
165  {
166  synchronized *PIN() = m_mask;
167  }
168 
174  __attribute__((always_inline))
175  {
176  *PIN(pin) = MASK(pin);
177  }
178 
184  void _set(int value) const
185  __attribute__((always_inline))
186  {
187  if (value) {
188  *PORT() |= m_mask;
189  }
190  else {
191  *PORT() &= ~m_mask;
192  }
193  }
194 
201  void set(int value) const
202  __attribute__((always_inline))
203  {
204  synchronized {
205  if (value) {
206  *PORT() |= m_mask;
207  }
208  else {
209  *PORT() &= ~m_mask;
210  }
211  }
212  }
213 
219  void _write(int value) const
220  __attribute__((always_inline))
221  {
222  if (value) {
223  *PORT() |= m_mask;
224  }
225  else {
226  *PORT() &= ~m_mask;
227  }
228  }
229 
236  void write(int value) const
237  __attribute__((always_inline))
238  {
239  synchronized {
240  if (value) {
241  *PORT() |= m_mask;
242  }
243  else {
244  *PORT() &= ~m_mask;
245  }
246  }
247  }
248 
255  OutputPin& operator=(int value)
256  __attribute__((always_inline))
257  {
258  write(value);
259  return (*this);
260  }
261 
269  __attribute__((always_inline))
270  {
271  write(rhs);
272  return (*this);
273  }
274 
284  void write(uint8_t value, OutputPin& clk, Direction order = MSB_FIRST) const;
285 
297  void write(uint16_t value, uint8_t bits, uint16_t us) const;
298 
306  static void write(Board::DigitalPin pin, int value)
307  __attribute__((always_inline))
308  {
309  volatile uint8_t* port = PORT(pin);
310  const uint8_t mask = MASK(pin);
311 #if (ARDUINO > 150)
312 #if defined(PORTH)
313  if (((int) port < PORTH)
314  && __builtin_constant_p(pin)
315  && __builtin_constant_p(value)) {
316 #else
317  if (__builtin_constant_p(pin) && __builtin_constant_p(value)) {
318 #endif
319  if (value) {
320  *port |= mask;
321  }
322  else {
323  *port &= ~mask;
324  }
325  }
326  else
327 #endif
328  synchronized {
329  if (value) {
330  *port |= mask;
331  }
332  else {
333  *port &= ~mask;
334  }
335  }
336  }
337 
345  static void _write(Board::DigitalPin pin, uint8_t value)
346  __attribute__((always_inline))
347  {
348  volatile uint8_t* port = PORT(pin);
349  const uint8_t mask = MASK(pin);
350  if (value) {
351  *port |= mask;
352  }
353  else {
354  *port &= ~mask;
355  }
356  }
357 
364  OutputPin& operator<<(int value)
365  __attribute__((always_inline))
366  {
367  set(value);
368  return (*this);
369  }
370 
378  void pulse(uint16_t us) const
379  __attribute__((always_inline))
380  {
381  synchronized {
382  _toggle();
383  DELAY(us);
384  _toggle();
385  }
386  }
387 };
388 
389 #endif
OutputPin & operator=(Pin &rhs)
Definition: OutputPin.hh:268
void _clear() const
Definition: OutputPin.hh:114
void _set(int value) const
Definition: OutputPin.hh:184
uint8_t pin() const
Definition: Pin.hh:103
Definition: Pin.hh:35
static uint8_t MASK(uint8_t pin)
Definition: Pin.hh:42
void pulse(uint16_t us) const
Definition: OutputPin.hh:378
#define DELAY(us)
Definition: Types.h:280
void off() const
Definition: OutputPin.hh:144
void low() const
Definition: OutputPin.hh:134
Direction
Definition: Pin.hh:84
void write(int value) const
Definition: OutputPin.hh:236
OutputPin(Board::DigitalPin pin, uint8_t initial=0)
Definition: OutputPin.hh:36
static void mode(Board::DigitalPin pin, uint8_t initial=0)
Definition: OutputPin.hh:56
void toggle() const
Definition: OutputPin.hh:163
void _toggle() const
Definition: OutputPin.hh:153
OutputPin & operator=(int value)
Definition: OutputPin.hh:255
void _write(int value) const
Definition: OutputPin.hh:219
void _set() const
Definition: OutputPin.hh:75
static void _write(Board::DigitalPin pin, uint8_t value)
Definition: OutputPin.hh:345
void high() const
Definition: OutputPin.hh:95
void on() const
Definition: OutputPin.hh:105
void clear() const
Definition: OutputPin.hh:124
const uint8_t m_mask
Definition: Pin.hh:227
OutputPin & operator<<(int value)
Definition: OutputPin.hh:364
volatile uint8_t * PORT() const
Definition: Pin.hh:254
volatile uint8_t * PIN() const
Definition: Pin.hh:236
static void toggle(Board::DigitalPin pin)
Definition: OutputPin.hh:173
static void write(Board::DigitalPin pin, int value)
Definition: OutputPin.hh:306
volatile uint8_t * DDR() const
Definition: Pin.hh:245