LEDDriver_NXP_Arduino 1.0.0
LED driver device operation sample code for Arduino
Loading...
Searching...
No Matches
LEDDriver.cpp
1#include "LEDDriver.h"
2
3/* LEDDriver class ******************************************/
4
5LEDDriver::LEDDriver( uint8_t n_ch, uint8_t PWM_r, uint8_t oe ) :
6 n_channel( n_ch ), reg_PWM( PWM_r ), oe_pin( oe ), bp( NULL )
7{
8}
9
10LEDDriver::~LEDDriver()
11{
12 if ( bp )
13 delete[] bp;
14}
15
16void LEDDriver::pwm( uint8_t ch, float value )
17{
18 if ( bp ) {
19 bp[ ch ] = (uint8_t)(value * 255.0);
20 }
21 else {
22 reg_access( reg_PWM + ch, (uint8_t)(value * 255.0) );
23 }
24}
25
26void LEDDriver::pwm( float* values )
27{
28 if ( bp ) {
29 for ( int i = 0; i < n_channel; i++ )
30 bp[ i ] = (uint8_t)(values[ i ] * 255.0);
31 }
32 else {
33 uint8_t v[ n_channel ];
34 for ( int i = 0; i < n_channel; i++ )
35 v[ i ] = (uint8_t)(values[ i ] * 255.0);
36
37 reg_access( 0x80 | reg_PWM, v, n_channel );
38 }
39}
40
41void LEDDriver::flush( void )
42{
43 if ( bp )
44 reg_access( 0x80 | reg_PWM, bp, n_channel );
45}
46
47void LEDDriver::buffer_enable( bool flag )
48{
49 if ( bp ) {
50 delete[] bp;
51 bp = NULL;
52 }
53
54 if ( flag ) {
55 bp = new uint8_t[ n_channel ];
56 for ( int i = 0; i < n_channel; i++ )
57 bp[ i ] = 0x00;
58 }
59
60}
61
62
63/* PCA995x class ******************************************/
64
65PCA995x::PCA995x( uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, const uint8_t* ar, uint8_t oe ) :
66 LEDDriver( n_ch, PWM_r, oe ), reg_IREF( IREF_r ), reg_IREFALL( IREFALL_r ), arp( ar )
67{
68 // do nothing.
69 // leave it in default state.
70}
71
72PCA995x::~PCA995x()
73{
74}
75
76void PCA995x::begin( float current, board env, bool bflag )
77{
78 init( current );
79
80 if ( env ) {
81 pinMode( oe_pin, OUTPUT );
82 digitalWrite( oe_pin , 0 );
83 }
84
85 buffer_enable( bflag );
86}
87
88void PCA995x::irefall( uint8_t iref )
89{
90 reg_access( reg_IREFALL, iref );
91}
92
93
94
95/* PCA995x_I2C class ******************************************/
96
97PCA995x_I2C::PCA995x_I2C( uint8_t i2c_address, uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, const uint8_t* ar, uint8_t oe ) :
98 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, ar, oe ),
99 I2C_device( i2c_address )
100{
101}
102
103PCA995x_I2C::PCA995x_I2C( TwoWire& wire, uint8_t i2c_address, uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, const uint8_t* ar, uint8_t oe ) :
104 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, ar, oe ),
105 I2C_device( wire, i2c_address )
106{
107}
108
109PCA995x_I2C::~PCA995x_I2C()
110{
111}
112
113void PCA995x_I2C::reg_access( uint8_t reg, uint8_t val )
114{
115 write_r8( reg, val );
116}
117
118void PCA995x_I2C::reg_access( uint8_t reg, uint8_t *vp, int len )
119{
120 reg_w( 0x80 | reg, vp, len );
121}
122
123uint8_t PCA995x_I2C::reg_access( uint8_t reg )
124{
125 return read_r8( reg );
126}
127
128void PCA995x_I2C::reg_access_r( uint8_t reg, uint8_t *vp, int len )
129{
130 reg_r( 0x80 | reg, vp, len );
131}
132
133
134
135/* PCA995x_SPI class ******************************************/
136
137PCA995x_SPI::PCA995x_SPI( uint8_t n_ch, uint8_t PWM_r, uint8_t IREF_r, uint8_t IREFALL_r, const uint8_t* ar, uint8_t oe ) :
138 PCA995x( n_ch, PWM_r, IREF_r, IREFALL_r, ar, oe )
139{
140 spi_setting = SPISettings( 1000000, MSBFIRST, SPI_MODE0 );
141}
142
143PCA995x_SPI::~PCA995x_SPI()
144{
145}
146
147void PCA995x_SPI::txrx( uint8_t *data, int size )
148{
149 SPI.beginTransaction( spi_setting );
150
151 digitalWrite( SS, LOW );
152 SPI.transfer( data, size );
153 digitalWrite( SS, HIGH );
154
155 SPI.endTransaction();
156}
157
158void PCA995x_SPI::reg_access( uint8_t reg, uint8_t val )
159{
160 uint8_t data[] = { (uint8_t)(reg << 1), val };
161
162 txrx( data, sizeof( data ) );
163}
164
165void PCA995x_SPI::reg_access( uint8_t reg, uint8_t *vp, int len )
166{
167 uint8_t data[ len * 2 ];
168
169 for ( int i = 0; i < len; i++ ) {
170 data[ i * 2 + 0 ] = (reg << 1) + (i * 2);
171 data[ i * 2 + 1 ] = vp[ i ];
172 }
173
174 for ( int i = 0; i < len * 2; i += 2 )
175 txrx( data + i, 2 );
176}
177
178uint8_t PCA995x_SPI::reg_access( uint8_t reg )
179{
180 uint8_t data0[ 2 ] = { (uint8_t)((reg << 1) | 0x01), 0xFF };
181 uint8_t data1[ 2 ] = { 0xFF, 0xFF };
182
183 txrx( data0, sizeof( data0 ) );
184 txrx( data1, sizeof( data1 ) );
185
186 return data1[ 1 ];
187}
188
189void PCA995x_SPI::reg_access_r( uint8_t reg, uint8_t *vp, int len )
190{
191 for ( int i = 0; i < len; i++ ) {
192 *vp++ = reg_access( reg + i );
193 }
194}
195
196void PCA995x_SPI::reg_w( uint8_t reg, uint8_t val )
197{
198 reg_access( reg, val );
199}
200
201void PCA995x_SPI::reg_w( uint8_t reg, uint8_t *vp, int len )
202{
203 reg_access( reg, vp, len );
204}
205
206uint8_t PCA995x_SPI::reg_r( uint8_t reg )
207{
208 return reg_access( reg );
209}
210
211void PCA995x_SPI::reg_r( uint8_t reg, uint8_t *vp, int len )
212{
213 reg_access_r( reg, vp, len );
214}
215
216void PCA995x_SPI::write_r8( uint8_t reg, uint8_t val )
217{
218 reg_w( reg, val );
219}
220
221uint8_t PCA995x_SPI::read_r8( uint8_t reg )
222{
223 return reg_r( reg );
224}
225
226void PCA995x_SPI::irefall( uint8_t iref )
227{
228 write_r8( reg_IREFALL, iref );
229}
230
231void PCA995x_SPI::pwm( uint8_t ch, float value )
232{
233 write_r8( reg_PWM + ch, (uint8_t)(value * 255.0) );
234}
235
236void PCA995x_SPI::pwm( float* values )
237{
238 uint8_t v[ n_channel ];
239 for ( int i = 0; i < n_channel; i++ )
240 v[ i ] = (uint8_t)(values[ i ] * 255.0);
241
242 reg_w( reg_PWM, v, n_channel );
243}
void pwm(uint8_t ch, float value)
Definition LEDDriver.cpp:16
void buffer_enable(bool flag)
Definition LEDDriver.cpp:47
void flush(void)
Definition LEDDriver.cpp:41
void irefall(uint8_t iref)
void irefall(uint8_t iref)
Definition LEDDriver.cpp:88