Lumitronix_Iflex_Pro_Workshop
Library to interact with the iFlexPro
TwoWireBitBangImpleAvr.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2 LumitronixIFlex library helper functions for DotStars using general Pins (APA102/LPD8806).
3 
4 Written by Michael C. Miller.
5 
6 I invest time and resources providing this open source code,
7 please support me by dontating (see https://github.com/Makuna)
8 
9 -------------------------------------------------------------------------
10 This file is part of the LUMITRONIX_iFlex_Workshop library.
11 
12 LumitronixIFlexBus is free software: you can redistribute it and/or modify
13 it under the terms of the GNU Lesser General Public License as
14 published by the Free Software Foundation, either version 3 of
15 the License, or (at your option) any later version.
16 
17 LumitronixIFlexBus is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU Lesser General Public License for more details.
21 
22 You should have received a copy of the GNU Lesser General Public
23 License along with LumitronixIFlex. If not, see
24 <http://www.gnu.org/licenses/>.
25 -------------------------------------------------------------------------*/
26 
27 #pragma once
28 
29 
31 {
32 public:
34 
35  TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData) :
36  _pinClock(pinClock),
37  _pinData(pinData)
38  {
39  pinMode(pinClock, OUTPUT);
40  pinMode(pinData, OUTPUT);
41 
42  _portClock = portOutputRegister(digitalPinToPort(_pinClock));
43  _pinMaskClock = digitalPinToBitMask(_pinClock);
44  _portData = portOutputRegister(digitalPinToPort(_pinData));
45  _pinMaskData = digitalPinToBitMask(_pinData);
46  }
47 
49  {
50  pinMode(_pinClock, INPUT);
51  pinMode(_pinData, INPUT);
52  }
53 
54  void begin()
55  {
56  digitalWrite(_pinClock, LOW);
57  digitalWrite(_pinData, LOW);
58  }
59 
61  {
62 
63  }
64 
66  {
67  digitalWrite(_pinData, LOW);
68  }
69 
70  void transmitBit(uint8_t bit)
71  {
72  // set data bit on pin
73  // digitalWrite(_pinData, bit); // HIGH : LOW
74  if (bit)
75  {
76  *_portData |= _pinMaskData;
77  }
78  else
79  {
80  *_portData &= ~_pinMaskData;
81  }
82 
83  // set clock high as data is ready
84  // digitalWrite(_pinClock, HIGH);
85  *_portClock |= _pinMaskClock;
86 
87  // set clock low as data pin is changed
88  // digitalWrite(_pinClock, LOW);
89  *_portClock &= ~_pinMaskClock;
90  }
91 
92  void transmitByte(uint8_t data)
93  {
94  for (int bit = 7; bit >= 0; bit--)
95  {
96  // set data bit on pin
97  // digitalWrite(_pinData, (data & 0x80) == 0x80 ? HIGH : LOW);
98  if (data & 0x80)
99  {
100  *_portData |= _pinMaskData;
101  }
102  else
103  {
104  *_portData &= ~_pinMaskData;
105  }
106 
107  // set clock high as data is ready
108  // digitalWrite(_pinClock, HIGH);
109  *_portClock |= _pinMaskClock;
110 
111  data <<= 1;
112 
113  // set clock low as data pin is changed
114  // digitalWrite(_pinClock, LOW);
115  *_portClock &= ~_pinMaskClock;
116  }
117  }
118 
119  void transmitBytes(const uint8_t* data, size_t dataSize)
120  {
121  const uint8_t* endData = data + dataSize;
122  while (data < endData)
123  {
124  transmitByte(*data++);
125  }
126  }
127 
128  void applySettings([[maybe_unused]] const SettingsObject& settings)
129  {
130  }
131 
132 private:
133  const uint8_t _pinClock; // output pin number for clock line
134  const uint8_t _pinData; // output pin number for data line
135 
136  volatile uint8_t* _portData; // Output PORT register
137  uint8_t _pinMaskData; // Output PORT bitmask
138  volatile uint8_t* _portClock; // Output PORT register
139  uint8_t _pinMaskClock; // Output PORT bitmask
140 };
Definition: NeoSettings.h:29
Definition: TwoWireBitBangImple.h:31
void endTransaction()
Definition: TwoWireBitBangImpleAvr.h:65
~TwoWireBitBangImple()
Definition: TwoWireBitBangImpleAvr.h:48
NeoNoSettings SettingsObject
Definition: TwoWireBitBangImpleAvr.h:33
void transmitByte(uint8_t data)
Definition: TwoWireBitBangImpleAvr.h:92
TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData)
Definition: TwoWireBitBangImpleAvr.h:35
void beginTransaction()
Definition: TwoWireBitBangImpleAvr.h:60
void transmitBytes(const uint8_t *data, size_t dataSize)
Definition: TwoWireBitBangImpleAvr.h:119
void transmitBit(uint8_t bit)
Definition: TwoWireBitBangImpleAvr.h:70
void begin()
Definition: TwoWireBitBangImpleAvr.h:54
void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireBitBangImpleAvr.h:128