COSA
An Object-Oriented Platform for Arduino Programming
SRPO.hh
Go to the documentation of this file.
1 
21 #ifndef COSA_SOFT_SRPO_HH
22 #define COSA_SOFT_SRPO_HH
23 
24 #include "Cosa/OutputPin.hh"
25 
26 namespace Soft {
27 
68 template<uint8_t N>
69 class SRPO {
70 public:
72  static const uint8_t PINS = N * CHARBITS;
73 
81  m_sda(sda),
82  m_scl(scl)
83  {
84  clear();
85  update();
86  }
87 
94  bool is_set(uint8_t pin)
95  __attribute__((always_inline))
96  {
97  uint8_t ix = (pin >> 3);
98  return ((m_port[ix] & _BV(pin & 0x7)) != 0);
99  }
100 
107  void is_clear(uint8_t pin)
108  __attribute__((always_inline))
109  {
110  uint8_t ix = (pin >> 3);
111  return ((m_port[ix] & _BV(pin & 0x7)) == 0);
112  }
113 
119  void set(uint8_t pin)
120  __attribute__((always_inline))
121  {
122  uint8_t ix = (pin >> 3);
123  m_port[ix] |= _BV(pin & 0x7);
124  }
125 
131  void clear(uint8_t pin)
132  __attribute__((always_inline))
133  {
134  uint8_t ix = (pin >> 3);
135  m_port[ix] &= ~_BV(pin & 0x7);
136  }
137 
143  void toggle(uint8_t pin)
144  __attribute__((always_inline))
145  {
146  if (is_set(pin))
147  clear(pin);
148  else
149  set(pin);
150  }
151 
156  void set()
157  __attribute__((always_inline))
158  {
159  memset(m_port, 0xff, N);
160  }
161 
166  void clear()
167  __attribute__((always_inline))
168  {
169  memset(m_port, 0, N);
170  }
171 
175  void update()
176  {
177  uint8_t ix = N;
178  while (ix--) m_sda.write(m_port[ix], m_scl);
179  }
180 
184  class OutputPin {
185  public:
186  OutputPin(SRPO<N>* srpo, uint8_t pin) :
187  m_srpo(srpo),
188  m_pin(pin)
189  {
190  }
191 
196  void set()
197  __attribute__((always_inline))
198  {
199  m_srpo->set(m_pin);
200  }
201 
206  void clear()
207  __attribute__((always_inline))
208  {
209  m_srpo->clear(m_pin);
210  }
211 
216  void toggle()
217  __attribute__((always_inline))
218  {
219  m_srpo->toggle(m_pin);
220  }
221 
222  protected:
224  const uint8_t m_pin;
225  };
226 
227 protected:
229  uint8_t m_port[N];
230 
233 
236 };
237 };
238 #endif
Definition: SPI.hh:32
void is_clear(uint8_t pin)
Definition: SRPO.hh:107
OutputPin(SRPO< N > *srpo, uint8_t pin)
Definition: SRPO.hh:186
void update()
Definition: SRPO.hh:175
void clear()
Definition: SRPO.hh:166
static const uint8_t PINS
Definition: SRPO.hh:72
uint8_t m_port[N]
Definition: SRPO.hh:229
#define CHARBITS
Definition: Types.h:57
bool is_set(uint8_t pin)
Definition: SRPO.hh:94
::OutputPin m_scl
Definition: SRPO.hh:235
SRPO(Board::DigitalPin sda=Board::D3, Board::DigitalPin scl=Board::D4)
Definition: SRPO.hh:79
void clear(uint8_t pin)
Definition: SRPO.hh:131
void toggle(uint8_t pin)
Definition: SRPO.hh:143
::OutputPin m_sda
Definition: SRPO.hh:232
SRPO< N > * m_srpo
Definition: SRPO.hh:223
const uint8_t m_pin
Definition: SRPO.hh:224