From 9fb4be1b44cdeae7baf2408a3d1d27ed32d3c212 Mon Sep 17 00:00:00 2001 From: Jeako Date: Tue, 1 Mar 2016 20:10:17 +0100 Subject: [PATCH] APA102: Initial implementation Signed-off-by: Yannick Adam Signed-off-by: Abhishek Malik --- docs/images/apa102.jpg | Bin 0 -> 73623 bytes examples/c++/CMakeLists.txt | 1 + examples/c++/apa102.cxx | 51 ++++++++++ examples/java/APA102Sample.java | 44 +++++++++ examples/java/CMakeLists.txt | 2 +- examples/javascript/apa102.js | 44 +++++++++ examples/python/apa102.py | 48 +++++++++ src/apa102/CMakeLists.txt | 5 + src/apa102/apa102.cxx | 166 ++++++++++++++++++++++++++++++++ src/apa102/apa102.h | 142 +++++++++++++++++++++++++++ src/apa102/javaupm_apa102.i | 30 ++++++ src/apa102/jsupm_apa102.i | 19 ++++ src/apa102/pyupm_apa102.i | 25 +++++ 13 files changed, 576 insertions(+), 1 deletion(-) create mode 100644 docs/images/apa102.jpg create mode 100644 examples/c++/apa102.cxx create mode 100644 examples/java/APA102Sample.java create mode 100644 examples/javascript/apa102.js create mode 100644 examples/python/apa102.py create mode 100644 src/apa102/CMakeLists.txt create mode 100644 src/apa102/apa102.cxx create mode 100644 src/apa102/apa102.h create mode 100644 src/apa102/javaupm_apa102.i create mode 100644 src/apa102/jsupm_apa102.i create mode 100644 src/apa102/pyupm_apa102.i diff --git a/docs/images/apa102.jpg b/docs/images/apa102.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43395e36a9deac787aecace93214c8afe9ad4335 GIT binary patch literal 73623 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 H$ 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%0DZes@%hn=9=}=u z8Rzt*fL!GN0EHZS(_5a@3P3L(l`cC9PCC#y9Fz5_Vhnpy(r2{;H9#&8b3vr-^z@@X zov6KrAsHM|&S=J3oq^YPNEqR?w^8j&j2<|oTw^4DR5mlqQD7UByyVljagI#@DdBVYP~31Di(C*L zrEoH|+>QZr!KLSLUO1&EKQ7fC^lHEu$GdY9#+&k!fHF^iN^+_P$-`4}3lP69ds1Kx z60cUz(vShru6>Oxk*f3N65q;}G|0%1gX!x>HNc6GV?T9$F+qd?2Jim0O@dqIBad2* z#t+>-`0qktVl9M8jnv{8<0?6)uua$of&m{ZAI6^IA>nvrrNW-|D?rEZ8fwM|AEg_B z(y9IGX~1fEOblk2%6D$h=ST*!WQ=i3w;B0qP6+GXhBWpKh7}mkUihYw&OkLdBWcg; zOe>Ms6azytJ!uFVdee&gaY>GXkcMNqq&OHAAy9b+kf7bir2??b1I{QoC#^V-@+iQ~ zG%`KC&*mt`Mt@pxUr=bl+rXehJMcPDgX#EFj_guk_oDUznH_y8;ACWCnnCCVJD*cY zfP@X$G{YK<)ScJzrZfO9G1jc{jAx|;WphsV+(ies1y2=TOJR?cRj|Z5ZguUBOUFsdekjz{>c1mX`$nuqL|R+bf%?Ya+pnRo^UEQx8o!q#H1O&v_u^4$R?&+nG=lh>rt5bAdZyMjh_DijZZ0R zqeY>ADCla$I->^Vjb-g^y$|@(bJ$XpE{!8uokSYO&<_5*R-`)FAH`fA_g;ssNVifZ zKs7w9=!Pktl@_)-@2ktKDN)J%>&#=+WL`5?#<1Xh>LnAR7`4>yI(GaibKe-HJTC9j zka9@%tquV1pYkblgVQ*pIXLw+0rK@UZXoxd=Nz82VEXl?$IL;XVtZ0!vF}biXWEk- z^*qzCg$L7`I{VO1%4q1hs6!Wy=97XlIK?O#Y*ObG*bVE=FF}eMh6C1-ahhoWU{c_f z=}MU`jM48%LSv|-pG;Ei`FCc5J5g?<8gq~9N79|^Kp(9DG!K@SIU|Eg!wg1xP)lamV=JKb))58LJazvcGWB}G0*2vQbbB0t1$d&;TfAD0LQH>stGU>nsTXtYOQex z0gG)>^`;DyfB^4G8zVRrxLv(F&?Fcm?za@X_V&(bXzwz|*$mQ?M2B zyR|0VwttmQ$_ULdN2gy}R=5%EG~SgjUT8mi80}8LM}bYpUMfR{;}l>FA6hKX5pBxn z1MsB5&-JND#{}k@IpguAm`}&*exC7rz~;bDx_OV+V?x0NOhBH0%zzqi7T$V^6MsI!pq*Qi4hJ zqu<`GS)d!WPb0lCqp1POrS1(tip>scCxj2JU19ENg+?%HlM5N`21h*9O$a?l=UQG` z`JFmbS~Vh`;<1wO4Dd1ZsExnPjMl3lT$+uL4xOkcb0w|&W}+|*^cM+D+6>dl2QJC|91!=ksxv1JT+nRfe$j;bl WcY7bgt?e6gOcAeoa*uJTGymDHnN{cj literal 0 HcmV?d00001 diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index 483695c6..0d5475f0 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -250,6 +250,7 @@ add_example (si7005) add_example (t6713) add_example (cwlsxxa) add_example (teams) +add_example (apa102) # These are special cases where you specify example binary, source file and module(s) include_directories (${PROJECT_SOURCE_DIR}/src) diff --git a/examples/c++/apa102.cxx b/examples/c++/apa102.cxx new file mode 100644 index 00000000..78ee6bda --- /dev/null +++ b/examples/c++/apa102.cxx @@ -0,0 +1,51 @@ +/* + * Author: Yannick Adam + * Copyright (c) 2016 Yannick Adam + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "apa102.h" +#include +#include +#include + +using namespace std; + +int +main(int argc, char** argv) +{ + //! [Interesting] + // Instantiate a strip of 30 LEDs on SPI bus 0 + upm::APA102* ledStrip = new upm::APA102(800, 0); + + // Set all LEDs to Red + ledStrip->setAllLeds(31, 255, 0, 0); + + // Set a section (10 to 20) to blue + ledStrip->setLeds(10, 20, 31, 0, 0, 255); + + // Set a single LED to green + ledStrip->setLed(15, 31, 0, 255, 0); + + delete ledStrip; + //! [Interesting] + return 0; +} diff --git a/examples/java/APA102Sample.java b/examples/java/APA102Sample.java new file mode 100644 index 00000000..4ebbdbff --- /dev/null +++ b/examples/java/APA102Sample.java @@ -0,0 +1,44 @@ +/* + * Author: Yannick Adam + * Copyright (c) 2016 Yannick Adam + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +public class APA102Sample { + + public static void main(String[] args) throws InterruptedException { + // ! [Interesting] + // Instantiate a strip of 30 LEDs on SPI bus 0 + upm_apa102.APA102 ledStrip = + new upm_apa102.APA102(30, (short)0, false, (byte)-1); + + System.out.println("Set all LEDs to blue"); + ledStrip.setAllLeds((short)31, (short)0, (short)0, (short)255); + + System.out.println("Set LEDs between 10 and 20 to green"); + ledStrip.setLeds(10, 20, (short)31, (short)0, (short)255, (short)0); + + System.out.println("Set a single LED to red at index 15"); + ledStrip.setLed(15, (short)31, (short)255, (short)0, (short)0); + + // ! [Interesting] + } +} diff --git a/examples/java/CMakeLists.txt b/examples/java/CMakeLists.txt index 6e8d0537..e56b77ef 100644 --- a/examples/java/CMakeLists.txt +++ b/examples/java/CMakeLists.txt @@ -107,7 +107,7 @@ add_example(Th02Example th02) add_example(FlexSensorExample flex) add_example(CWLSXXA_Example cwlsxxa) add_example(TEAMS_Example teams) - +add_example(APA102Sample apa102) add_example_with_path(Jhd1313m1_lcdSample lcd/upm_i2clcd.jar) add_example_with_path(Jhd1313m1Sample lcd/upm_i2clcd.jar) diff --git a/examples/javascript/apa102.js b/examples/javascript/apa102.js new file mode 100644 index 00000000..c8b841f7 --- /dev/null +++ b/examples/javascript/apa102.js @@ -0,0 +1,44 @@ +/*jslint node:true, vars:true, bitwise:true, unparam:true */ +/*jshint unused:true */ +/* +* Author: Yannick Adam +* Copyright (c) 2016 Yannick Adam +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +var lib = require('jsupm_apa102'); + +// Instantiate a strip of 30 LEDs on SPI Bus 0 +var ledStrip = new lib.APA102(30, 0); + +// Set all LEDs to blue +ledStrip.setAllLeds(31, 0, 0, 255); + +// Set a mid-section to red +ledStrip.setLeds(10,20, 31, 255, 0, 0); + +// Set a single led to green +ledStrip.setLed(15, 31, 0, 255, 0); + + +// Exit +ledStrip = null; +process.exit(0); diff --git a/examples/python/apa102.py b/examples/python/apa102.py new file mode 100644 index 00000000..721d4d42 --- /dev/null +++ b/examples/python/apa102.py @@ -0,0 +1,48 @@ +#!/usr/bin/python +# Author: Yannick Adam +# Copyright (c) 2016 Yannick Adam +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +import time, sys, signal, atexit +import pyupm_apa102 as mylib + +# Instantiate a strip of 30 LEDs on SPI bus 0 +ledStrip = mylib.APA102(30, 0, False) + +## Exit handlers ## +# This stops python from printing a stacktrace when you hit control-C +def SIGINTHandler(signum, frame): + raise SystemExit + +# Register exit handlers +signal.signal(signal.SIGINT, SIGINTHandler) + +print "Setting all LEDs to Green" +ledStrip.setAllLeds(31, 0, 255, 0) + +print "Setting LEDs between 10 and 20 to Red" +ledStrip.setLeds(10, 20, 31, 255, 0, 0) + +print "Setting LED 15 to Blue" +ledStrip.setLed(15, 31, 0, 0, 255) + + diff --git a/src/apa102/CMakeLists.txt b/src/apa102/CMakeLists.txt new file mode 100644 index 00000000..df7db9e0 --- /dev/null +++ b/src/apa102/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "apa102") +set (libdescription "upm apa102 led strip spi output module") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/apa102/apa102.cxx b/src/apa102/apa102.cxx new file mode 100644 index 00000000..8564a9d5 --- /dev/null +++ b/src/apa102/apa102.cxx @@ -0,0 +1,166 @@ +/* + * Author: Yannick Adam + * Copyright (c) 2016 Yannick Adam + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include "apa102.h" + +using namespace upm; + +APA102::APA102(uint16_t ledCount, uint8_t spiBus, bool batchMode, int8_t csn) + : m_ledCount(ledCount), m_batchMode(batchMode) +{ + mraa::Result res = mraa::SUCCESS; + m_leds = NULL; + + // Optional chip select pin + m_csnPinCtx = NULL; + if (csn > -1) { + m_csnPinCtx = new mraa::Gpio(csn); + res = m_csnPinCtx->dir(mraa::DIR_OUT); + if (res != mraa::SUCCESS) { + throw std::invalid_argument(std::string(__FUNCTION__) + + ": GPIO failed to set direction"); + } + } + + CSOff(); + // Initialize SPI + m_spi = new mraa::Spi(spiBus); + + // Initialize LED array + uint16_t endFrameLength = (m_ledCount + 15) / 16; // End frame should be (leds/2) bits + m_frameLength = endFrameLength + (m_ledCount + 1) * 4; + if ((m_leds = (uint8_t*) malloc(m_frameLength))) { + memset(m_leds, 0x00, m_frameLength - 4); // Clear state + memset(&m_leds[m_frameLength - endFrameLength], 0xFF, endFrameLength); // Frame End + + // Need to set the brightness to "0" for each Led + for (int i = 1; i <= m_ledCount; i++) { + m_leds[i * 4] = 224; + } + + } else { + throw std::runtime_error(std::string(__FUNCTION__) + + ": Failed to allocate memory for LED Strip"); + } +} + +APA102::~APA102() +{ + // Clear leds + if (m_leds) { + free(m_leds); + } + + // Clear SPI + if (m_spi) { + delete m_spi; + } + + // Clear GPIO + if (m_csnPinCtx) { + delete m_csnPinCtx; + } +} + + +void +APA102::setLed(uint16_t ledIdx, uint8_t brightness, uint8_t r, uint8_t g, uint8_t b) +{ + setLeds(ledIdx, ledIdx, brightness, r, g, b); +} + +void +APA102::setAllLeds(uint8_t brightness, uint8_t r, uint8_t g, uint8_t b) +{ + setLeds(0, m_ledCount - 1, brightness, r, g, b); +} + +void +APA102::setLeds(uint16_t startIdx, uint16_t endIdx, uint8_t brightness, uint8_t r, uint8_t g, uint8_t b) +{ + uint16_t s_idx = (startIdx + 1) * 4; + uint16_t e_idx = (endIdx + 1) * 4; + + for (uint16_t i = s_idx; i <= e_idx; i += 4) { + m_leds[i] = brightness | 224; + m_leds[i + 1] = b; + m_leds[i + 2] = g; + m_leds[i + 3] = r; + } + + if (!m_batchMode) { + pushState(); + } +} + +void +APA102::setLeds(uint16_t startIdx, uint16_t endIdx, uint8_t* colors) +{ + uint16_t s_idx = (startIdx + 1) * 4; + memcpy(&m_leds[s_idx], colors, (endIdx - startIdx + 1) * 4); + + if (!m_batchMode) { + pushState(); + } +} + +void +APA102::pushState(void) +{ + CSOn(); + m_spi->write(m_leds, m_frameLength); + CSOff(); +} + +/* + * ************** + * private area + * ************** + */ + +mraa::Result +APA102::CSOn() +{ + if (m_csnPinCtx) { + return m_csnPinCtx->write(HIGH); + } + + return mraa::ERROR_FEATURE_NOT_SUPPORTED; +} + +mraa::Result +APA102::CSOff() +{ + if (m_csnPinCtx) { + return m_csnPinCtx->write(LOW); + } + + return mraa::ERROR_FEATURE_NOT_SUPPORTED; +} diff --git a/src/apa102/apa102.h b/src/apa102/apa102.h new file mode 100644 index 00000000..bed3d0aa --- /dev/null +++ b/src/apa102/apa102.h @@ -0,0 +1,142 @@ +/* + * Author: Yannick Adam + * Copyright (c) 2016 Yannick Adam + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#pragma once + +#include +#include +#include + +#define HIGH 1 +#define LOW 0 + +namespace upm +{ +/** + * @brief APA102 RGB LED Strip driver library + * @defgroup apa102 libupm-apa102 + * @ingroup spi led + */ + +/** + * @library apa102 + * @sensor apa102 + * @comname APA102/DotStar LED Strip + * @type led + * @man adafruit + * @con spi + * + * @brief API for controlling APA102/DotStar RGB LED Strips + * + * APA102 LED Strips provide individually controllable LEDs through a SPI interface. + * For each LED, brightness (0-31) and RGB (0-255) values can be set. + * + * @image html apa102.jpg + */ +class APA102 +{ + public: + /** + * Instantiates a new APA102 LED Strip + * + * @param ledCount Number of APA102 leds in the strip + * @param spiBus SPI Bus number + * @param batchMode (optional) Immediatly write to SPI (false, default) or wait for a pushState + * call (true) + * @param csn (optional) Chip Select Pin + */ + APA102(uint16_t ledCount, uint8_t spiBus, bool batchMode = false, int8_t csn = -1); + + /** + * APA102 destructor + */ + ~APA102(); + + /** + * Change the color for a single led + * + * @param ledIdx Index of the LED in the strip (0 based) + * @param brightness Brightness value (0-31) + * @param r Red component (0-255) + * @param g Green component (0-255) + * @param b Blue component (0-255) + */ + void setLed(uint16_t ledIdx, uint8_t brightness, uint8_t r, uint8_t g, uint8_t b); + + /** + * Change the color for all leds + * + * @param brightness Brightness value (0-31) + * @param r Red component (0-255) + * @param g Green component (0-255) + * @param b Blue component (0-255) + */ + void setAllLeds(uint8_t brightness, uint8_t r, uint8_t g, uint8_t b); + + /** + * Change the color for a range of leds + * + * @param startIdx Start index of the range of LEDs in the strip (0 based) + * @param endIdx End index of the range of LEDs in the strip (0 based) + * @param brightness Brightness value (0-31) + * @param r Red component (0-255) + * @param g Green component (0-255) + * @param b Blue component (0-255) + */ + void + setLeds(uint16_t startIdx, uint16_t endIdx, uint8_t brightness, uint8_t r, uint8_t g, uint8_t b); + + /** + * (Advanced) Manually control the colors of a range of LEDS + * Best used to maximize performance + * + * @param startIdx Start index of the range of LEDs to update (0 based) + * @param endIdx End index of the range of LEDs to update (0 based) + * @param colors Pointer to an array of bytes. Each color is described as the following: + * B1: Brightness (224-255) B2: Blue (0-255) B3: Green (0-255) B4: Red + *(0-255) + * No check done on the boundaries + */ + void setLeds(uint16_t startIdx, uint16_t endIdx, uint8_t* colors); + + /** + * Outputs the current LED data to the SPI bus + * Note: Only required if batch mode is set to TRUE + * + */ + void pushState(); + + private: + mraa::Spi* m_spi; + mraa::Gpio* m_csnPinCtx; + + uint16_t m_ledCount; + uint8_t* m_leds; + uint16_t m_frameLength; + + bool m_batchMode; + + mraa::Result CSOn(); + mraa::Result CSOff(); +}; +} diff --git a/src/apa102/javaupm_apa102.i b/src/apa102/javaupm_apa102.i new file mode 100644 index 00000000..21456285 --- /dev/null +++ b/src/apa102/javaupm_apa102.i @@ -0,0 +1,30 @@ +%module javaupm_apa102 + +%include "../upm.i" +%include "typemaps.i" + +%typemap(jtype) (uint8_t *colors) "byte[]" +%typemap(jstype) (uint8_t *colors) "byte[]" +%typemap(jni) (uint8_t *colors) "jbyteArray" +%typemap(javain) (uint8_t *colors) "$javainput" + +%typemap(in) (uint8_t *colors) { + $1 = (uint8_t*)JCALL2(GetByteArrayElements, jenv, $input, NULL); +} + +%{ + #include "apa102.h" +%} + +%include "apa102.h" + +%pragma(java) jniclasscode=%{ + static { + try { + System.loadLibrary("javaupm_apa102"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. \n" + e); + System.exit(1); + } + } +%} diff --git a/src/apa102/jsupm_apa102.i b/src/apa102/jsupm_apa102.i new file mode 100644 index 00000000..2437e141 --- /dev/null +++ b/src/apa102/jsupm_apa102.i @@ -0,0 +1,19 @@ +%module jsupm_apa102 + +%include "../upm.i" +%inline %{ + #include +%} + +%typemap(in) (uint8_t *colors) { + if (!node::Buffer::HasInstance($input)) { + SWIG_exception_fail(SWIG_ERROR, "Expected a node Buffer"); + } + $1 = (uint8_t*) node::Buffer::Data($input); +} + +%include "apa102.h" + +%{ + #include "apa102.h" +%} diff --git a/src/apa102/pyupm_apa102.i b/src/apa102/pyupm_apa102.i new file mode 100644 index 00000000..941a33f0 --- /dev/null +++ b/src/apa102/pyupm_apa102.i @@ -0,0 +1,25 @@ +// Include doxygen-generated documentation +%include "pyupm_doxy2swig.i" + +%module pyupm_apa102 + +%include "../upm.i" + +%feature("autodoc", "3"); + +// setLeds +%typemap(in) (uint8_t *colors) { + if (PyByteArray_Check($input)) { + $1 = (uint8_t*) PyByteArray_AsString($input); + } else { + PyErr_SetString(PyExc_ValueError, "bytearray expected"); + return NULL; + } +} + +%include "apa102.h" + +%{ + + #include "apa102.h" +%}