roo_display
API Documentation for roo_display
Loading...
Searching...
No Matches
spi.h
Go to the documentation of this file.
1#pragma once
2
3#include <Arduino.h>
4
5// Generic Arduino implementation.
6
7#include <SPI.h>
8
9#include "roo_backport.h"
10#include "roo_backport/byte.h"
12#include "roo_io/data/byte_order.h"
13#include "roo_io/memory/fill.h"
14
15namespace roo_display {
16
17template <typename SpiSettings>
18class ArduinoSpiDevice;
19
21 public:
22 template <typename SpiSettings>
24
25 ArduinoSpi(decltype(SPI)& spi = SPI) : spi_(spi) {}
26
27 void init() { spi_.begin(); }
28
30 spi_.begin(sck, miso, mosi);
31 }
32
33 private:
34 template <typename SpiSettings>
35 friend class ArduinoSpiDevice;
36
37 decltype(SPI)& spi_;
38};
39
40// SPI transport, using the default <SPI.h> from the Arduino framework.
41template <typename SpiSettings>
43 public:
44 // Creates the SPI transport, with specified transaction settings, using the
45 // provided SPI bus.
46 ArduinoSpiDevice(ArduinoSpi& spi) : spi_(spi.spi_) {}
47
48 ArduinoSpiDevice() : spi_(SPI) {}
49
50 void init() {}
51
56
61
62 void endTransaction() { spi_.endTransaction(); }
63
64 void flush() {}
65
66 void write(uint8_t data) { spi_.write(data); }
67
68 void write16(uint16_t data) { spi_.write16(data); }
69
71 spi_.write16(a);
72 spi_.write16(b);
73 }
74
75 // For whatever reasons, SPI.h doesn't have a const version of writeBytes, but
76 // the data doesn't get mutated, so we can safely cast away constness here.
77 void writeBytes(const roo::byte* data, uint32_t len) {
78 auto* raw = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(data));
79 spi_.writeBytes(raw, len);
80 }
81
82 void fill16(const roo::byte* data, uint32_t repetitions) {
83 roo::byte buf[64];
84 if (repetitions >= 32) {
85 roo_io::PatternFill<2>(buf, 32, data);
86 while (repetitions >= 32) {
87 spi_.writeBytes(reinterpret_cast<uint8_t*>(buf), 64);
88 repetitions -= 32;
89 }
90 spi_.writeBytes(reinterpret_cast<uint8_t*>(buf), repetitions * 2);
91 return;
92 }
93 roo_io::PatternFill<2>(buf, repetitions, data);
94 spi_.writeBytes(reinterpret_cast<uint8_t*>(buf), repetitions * 2);
95 }
96
97 void fill24(const roo::byte* data, uint32_t repetitions) {
98 roo::byte buf[96];
99 if (repetitions >= 32) {
100 roo_io::PatternFill<3>(buf, 32, data);
101 while (repetitions >= 32) {
102 spi_.writeBytes(reinterpret_cast<uint8_t*>(buf), 96);
103 repetitions -= 32;
104 }
105 spi_.writeBytes(reinterpret_cast<uint8_t*>(buf), repetitions * 3);
106 return;
107 }
108 roo_io::PatternFill<3>(buf, repetitions, data);
109 spi_.writeBytes(reinterpret_cast<uint8_t*>(buf), repetitions * 3);
110 }
111
112 void async_blit(const roo::byte* data, size_t row_stride_bytes,
113 size_t row_bytes, size_t row_count) {
114 if (data == nullptr || row_bytes == 0 || row_count == 0) {
115 return;
116 }
117
119 writeBytes(data, static_cast<uint32_t>(row_bytes * row_count));
120 return;
121 }
122
123 const roo::byte* row = data;
124 for (size_t i = 0; i < row_count; ++i) {
125 // Note that this is actually a synchronous call.
126 writeBytes(row, static_cast<uint32_t>(row_bytes));
128 }
129 }
130
131 roo::byte transfer(roo::byte data) {
132 return static_cast<roo::byte>(spi_.transfer(static_cast<uint8_t>(data)));
133 }
134 uint16_t transfer16(uint16_t data) { return spi_.transfer16(data); }
135
136 private:
137 decltype(SPI)& spi_;
138};
139
140} // namespace roo_display
void async_blit(const roo::byte *data, size_t row_stride_bytes, size_t row_bytes, size_t row_count)
Definition spi.h:112
ArduinoSpiDevice(ArduinoSpi &spi)
Definition spi.h:46
void fill24(const roo::byte *data, uint32_t repetitions)
Definition spi.h:97
void beginReadWriteTransaction()
Definition spi.h:52
void beginWriteOnlyTransaction()
Definition spi.h:57
uint16_t transfer16(uint16_t data)
Definition spi.h:134
void fill16(const roo::byte *data, uint32_t repetitions)
Definition spi.h:82
void write16(uint16_t data)
Definition spi.h:68
void writeBytes(const roo::byte *data, uint32_t len)
Definition spi.h:77
void write(uint8_t data)
Definition spi.h:66
void write16x2(uint16_t a, uint16_t b)
Definition spi.h:70
roo::byte transfer(roo::byte data)
Definition spi.h:131
ArduinoSpi(decltype(SPI)&spi=SPI)
Definition spi.h:25
void init(uint8_t sck, uint8_t miso, uint8_t mosi)
Definition spi.h:29
Defines 140 opaque HTML named colors.
static constexpr uint32_t clock
static constexpr SpiBitOrder bit_order
static constexpr SpiDataMode data_mode