Lumitronix_Iflex_Pro_Workshop
Library to interact with the iFlexPro
TwoWireSpiImple.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2 LumitronixIFlex library helper functions for DotStars using SPI (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 #include <SPI.h>
30 
32 {
33 public:
36 
37  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
38 
39  static const uint32_t Clock = 40000000L;
40 };
41 
43 {
44 public:
47 
48  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
49 
50  static const uint32_t Clock = 30000000L;
51 };
52 
54 {
55 public:
58 
59  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
60 
61  static const uint32_t Clock = 20000000L;
62 };
63 
65 {
66 public:
69 
70  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
71 
72  static const uint32_t Clock = 15000000L;
73 };
74 
76 {
77 public:
80 
81  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
82 
83  static const uint32_t Clock = 10000000L;
84 };
85 
87 {
88 public:
91 
92  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
93 
94  static const uint32_t Clock = 5000000L;
95 };
96 
98 {
99 public:
102 
103  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
104 
105  static const uint32_t Clock = 2000000L;
106 };
107 
109 {
110 public:
113 
114  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
115 
116  static const uint32_t Clock = 1000000L;
117 };
118 
120 {
121 public:
124 
125  static void applySettings([[maybe_unused]] const SettingsObject& settings) {}
126 
127  static const uint32_t Clock = 500000L;
128 };
129 
131 {
132 public:
133  NeoSpiSettings(uint32_t clock) :
134  Clock(clock)
135  {
136  }
137  uint32_t Clock;
138 };
139 
141 {
142 public:
144 
146  Clock(10000000)
147  {};
148 
149  void applySettings([[maybe_unused]] const SettingsObject& settings)
150  {
151  Clock = settings.Clock;
152  }
153 
154  uint32_t Clock;
155 };
156 
157 template<typename T_SPISPEED> class TwoWireSpiImple
158 {
159 public:
160  typedef typename T_SPISPEED::SettingsObject SettingsObject;
161 
162  TwoWireSpiImple(uint8_t, uint8_t) // clock and data pins ignored for hardware SPI
163  {
164  }
165 
167  {
168  SPI.end();
169  }
170 
171 #if defined(ARDUINO_ARCH_ESP32)
172  // for cases where hardware SPI can have pins changed
173  void begin(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
174  {
175  SPI.begin(sck, miso, mosi, ss);
176  }
177 #endif
178 
179  void begin()
180  {
181  SPI.begin();
182  }
183 
185  {
186  SPI.beginTransaction(SPISettings(_speed.Clock, MSBFIRST, SPI_MODE0));
187  }
188 
190  {
191  SPI.endTransaction();
192  }
193 
194  void transmitByte(uint8_t data)
195  {
196  SPI.transfer(data);
197  }
198 
199  void transmitBytes(const uint8_t* data, size_t dataSize)
200  {
201 #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
202  // ESPs have a method to write without inplace overwriting the send buffer
203  // since we don't care what gets received, use it for performance
204  // FIX: but for what ever reason on Esp32, its not const
205  SPI.writeBytes(const_cast<uint8_t*>(data), dataSize);
206 
207 #else
208  // default ARDUINO transfer inplace overwrites the send buffer
209  // which is bad in this case, so we have to send one byte at a time
210  const uint8_t* endData = data + dataSize;
211  while (data < endData)
212  {
213  SPI.transfer(*data++);
214  }
215 #endif
216  }
217 
218  void applySettings([[maybe_unused]] const SettingsObject& settings)
219  {
220  _speed.applySettings(settings);
221  }
222 
223 private:
224  T_SPISPEED _speed;
225 };
Definition: NeoSettings.h:29
Definition: TwoWireSpiImple.h:131
uint32_t Clock
Definition: TwoWireSpiImple.h:137
NeoSpiSettings(uint32_t clock)
Definition: TwoWireSpiImple.h:133
Definition: TwoWireSpiImple.h:76
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:78
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:81
SpiSpeed10Mhz()
Definition: TwoWireSpiImple.h:79
static const uint32_t Clock
Definition: TwoWireSpiImple.h:83
Definition: TwoWireSpiImple.h:65
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:70
SpiSpeed15Mhz()
Definition: TwoWireSpiImple.h:68
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:67
static const uint32_t Clock
Definition: TwoWireSpiImple.h:72
Definition: TwoWireSpiImple.h:109
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:114
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:111
static const uint32_t Clock
Definition: TwoWireSpiImple.h:116
SpiSpeed1Mhz()
Definition: TwoWireSpiImple.h:112
Definition: TwoWireSpiImple.h:54
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:59
static const uint32_t Clock
Definition: TwoWireSpiImple.h:61
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:56
SpiSpeed20Mhz()
Definition: TwoWireSpiImple.h:57
Definition: TwoWireSpiImple.h:98
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:103
SpiSpeed2Mhz()
Definition: TwoWireSpiImple.h:101
static const uint32_t Clock
Definition: TwoWireSpiImple.h:105
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:100
Definition: TwoWireSpiImple.h:43
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:48
SpiSpeed30Mhz()
Definition: TwoWireSpiImple.h:46
static const uint32_t Clock
Definition: TwoWireSpiImple.h:50
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:45
Definition: TwoWireSpiImple.h:32
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:37
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:34
static const uint32_t Clock
Definition: TwoWireSpiImple.h:39
SpiSpeed40Mhz()
Definition: TwoWireSpiImple.h:35
Definition: TwoWireSpiImple.h:120
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:125
static const uint32_t Clock
Definition: TwoWireSpiImple.h:127
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:122
SpiSpeed500Khz()
Definition: TwoWireSpiImple.h:123
Definition: TwoWireSpiImple.h:87
static const uint32_t Clock
Definition: TwoWireSpiImple.h:94
SpiSpeed5Mhz()
Definition: TwoWireSpiImple.h:90
static void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:92
NeoNoSettings SettingsObject
Definition: TwoWireSpiImple.h:89
Definition: TwoWireSpiImple.h:141
NeoSpiSettings SettingsObject
Definition: TwoWireSpiImple.h:143
SpiSpeedHz()
Definition: TwoWireSpiImple.h:145
void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:149
uint32_t Clock
Definition: TwoWireSpiImple.h:154
Definition: TwoWireSpiImple.h:158
void begin()
Definition: TwoWireSpiImple.h:179
void transmitBytes(const uint8_t *data, size_t dataSize)
Definition: TwoWireSpiImple.h:199
T_SPISPEED::SettingsObject SettingsObject
Definition: TwoWireSpiImple.h:160
void endTransaction()
Definition: TwoWireSpiImple.h:189
~TwoWireSpiImple()
Definition: TwoWireSpiImple.h:166
TwoWireSpiImple(uint8_t, uint8_t)
Definition: TwoWireSpiImple.h:162
void transmitByte(uint8_t data)
Definition: TwoWireSpiImple.h:194
void applySettings([[maybe_unused]] const SettingsObject &settings)
Definition: TwoWireSpiImple.h:218
void beginTransaction()
Definition: TwoWireSpiImple.h:184