p9813: Chainable LEDS

Initial commit of the p9813 chainable LED controller.
Added C, C++, python, java, and node examples.

Signed-off-by: Sergey Kiselev <sergey.kiselev@intel.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
This commit is contained in:
Noel Eck 2017-03-08 09:40:56 -08:00
parent b3a5275183
commit 58cdfadf4e
17 changed files with 830 additions and 0 deletions

BIN
docs/images/p9813.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -73,3 +73,4 @@ water.cxx WaterSample.java water.js water.py
wt5001.cxx WT5001Sample.java wt5001.js wt5001.py
yg1006.cxx YG1006Sample.java yg1006.js yg1006.py
sensortemplate.cxx SensorTemplateSample.java sensortemplate.js sensortemplate.py
p9813.cxx P9813Sample.java p9813.js p9813.py

View File

@ -330,6 +330,7 @@ add_example (rf22-client)
add_example (mcp2515)
add_example (max30100)
add_example (sensortemplate)
add_example (p9813)
# These are special cases where you specify example binary, source file and module(s)
include_directories (${PROJECT_SOURCE_DIR}/src)

48
examples/c++/p9813.cxx Normal file
View File

@ -0,0 +1,48 @@
/*
* Author: Sergey Kiselev <sergey.kiselev@intel.com>
* Copyright (c) 2017 Sergey Kiselev
* Based on the p9813 driver writen by Yannick Adam <yannick.adam@gmail.com>
*
* 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 "p9813.hpp"
#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;
int
main(int argc, char** argv)
{
//! [Interesting]
// Instantiate a chain of 2 LEDs using pin 2 for clock and pin 3 for data
upm::P9813 ledChain(2, 2, 3);
// Set all LEDs to Red
ledChain.setAllLeds(255, 0, 0);
// Set a single LED to green
ledChain.setLed(1, 0, 255, 0);
//! [Interesting]
return 0;
}

View File

@ -165,6 +165,7 @@ add_example(Ads1015Sample ads1x15)
add_example(MAX30100_Example max30100)
add_example(Ads1115Sample ads1x15)
add_example(SensorTemplateSample sensortemplate)
add_example(P9813Sample p9813)
add_example_with_path(Jhd1313m1_lcdSample lcd i2clcd)
add_example_with_path(Jhd1313m1Sample lcd i2clcd)

View File

@ -0,0 +1,42 @@
/*
* Author: Sergey Kiselev <sergey.kiselev@intel.com>
* Copyright (c) 2017 Sergey Kiselev
* Based on the apa102 driver writen by Yannick Adam <yannick.adam@gmail.com>
*
* 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 P9813Sample {
public static void main(String[] args) throws InterruptedException {
// ! [Interesting]
// Instantiate a chain of 2 LEDs using pin 2 for clock and pin 3 for data
upm_p9813.P9813 ledChain =
new upm_p9813.P9813(2, (short)2, (short)3, false);
System.out.println("Set all LEDs to blue");
ledChain.setAllLeds((short)0, (short)0, (short)255);
System.out.println("Set a single LED to red at index 1");
ledChain.setLed(1, (short)255, (short)0, (short)0);
// ! [Interesting]
}
}

View File

@ -0,0 +1,40 @@
/*
* Author: Sergey Kiselev <sergey.kiselev@intel.com>
* Copyright (c) 2017 Sergey Kiselev
* Based on the p9813 driver writen by Yannick Adam <yannick.adam@gmail.com>
*
* 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_p9813');
// Instantiate a chain of 2 LEDs using pin 2 for clock and pin 3 for data
var ledChain = new lib.P9813(2, 2, 3);
// Set all LEDs to blue
ledChain.setAllLeds(0, 0, 255);
// Set a single led to green
ledChain.setLed(1, 0, 255, 0);
// Exit
ledChain = null;
process.exit(0);

48
examples/python/p9813.py Normal file
View File

@ -0,0 +1,48 @@
#!/usr/bin/python
# Author: Sergey Kiselev <sergey.kiselev@intel.com>
# Copyright (c) 2016 Sergey Kiselev
# Based on the apa102 driver writen by Yannick Adam <yannick.adam@gmail.com>
#
# 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.
from __future__ import print_function
import time, sys, signal, atexit
from upm import pyupm_p9813 as mylib
def main():
# Instantiate a chain of 2 LEDs using pin 2 for clock and pin 3 for data
ledChain = mylib.P9813(2, 2, 3)
## 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")
ledChain.setAllLeds(0, 255, 0)
print("Setting LED 1 to Blue")
ledChain.setLed(1, 0, 0, 255)
if __name__ == '__main__':
main()

7
src/p9813/CMakeLists.txt Normal file
View File

@ -0,0 +1,7 @@
upm_mixed_module_init (NAME p9813
DESCRIPTION "P9813 Chainable RGB LEDs"
C_HDR p9813.h
C_SRC p9813.c
CPP_HDR p9813.hpp
CPP_SRC p9813.cxx
REQUIRES mraa)

20
src/p9813/javaupm_p9813.i Normal file
View File

@ -0,0 +1,20 @@
%module javaupm_p9813
%include "../upm.i"
%include "typemaps.i"
%{
#include "p9813.hpp"
%}
%include "p9813.hpp"
%pragma(java) jniclasscode=%{
static {
try {
System.loadLibrary("javaupm_p9813");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. \n" + e);
System.exit(1);
}
}
%}

7
src/p9813/jsupm_p9813.i Normal file
View File

@ -0,0 +1,7 @@
%module jsupm_p9813
%include "../upm.i"
%include "p9813.hpp"
%{
#include "p9813.hpp"
%}

149
src/p9813/p9813.c Normal file
View File

@ -0,0 +1,149 @@
/*
* Author: Sergey Kiselev <sergey.kiselev@intel.com>
* Copyright (c) 2017 Sergey Kiselev
*
* 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 <string.h>
#include <assert.h>
#include "p9813.h"
p9813_context p9813_init(int ledcount, int clk, int data) {
p9813_context dev = (p9813_context)malloc(sizeof(struct _p9813_context));
if(!dev)
return NULL;
memset(dev, 0, sizeof(struct _p9813_context));
dev->leds = ledcount;
// Try to allocate and zero out buffer
if ((dev->buffer = (uint8_t*)malloc(dev->leds * 3))) {
memset(dev->buffer, 0x00, dev->leds * 3);
} else {
printf("%s: Failed to allocate LED buffer.\n", __FUNCTION__);
p9813_close(dev);
return NULL;
}
dev->clk = NULL;
dev->data = NULL;
if (!(dev->clk = mraa_gpio_init(clk))) {
printf("%s: mraa_gpio_init(clk) failed.\n", __FUNCTION__);
p9813_close(dev);
return NULL;
}
mraa_gpio_dir(dev->clk, MRAA_GPIO_OUT);
if (!(dev->data = mraa_gpio_init(data))) {
printf("%s: mraa_gpio_init(data) failed.\n", __FUNCTION__);
p9813_close(dev);
return NULL;
}
return dev;
}
void p9813_close(p9813_context dev) {
assert(dev != NULL);
if (dev->clk)
mraa_gpio_close(dev->clk);
if (dev->data)
mraa_gpio_close(dev->data);
if(dev->buffer)
free(dev->buffer);
free(dev);
}
upm_result_t p9813_set_led(p9813_context dev, uint16_t index, uint8_t r, uint8_t g, uint8_t b) {
return p9813_set_leds(dev, index, index, r, g, b);
}
upm_result_t p9813_set_leds(p9813_context dev, uint16_t s_index, uint16_t e_index, uint8_t r, uint8_t g, uint8_t b) {
assert(dev != NULL);
int i;
for (i = s_index; i <= e_index; i++) {
dev->buffer[i * 3] = r;
dev->buffer[i * 3 + 1] = g;
dev->buffer[i * 3 + 2] = b;
}
return UPM_SUCCESS;
}
upm_result_t p9813_send_byte(p9813_context dev, uint8_t data)
{
for (uint16_t i = 0; i < 8; i++) {
// Write the data bit
mraa_gpio_write(dev->data, (data & 0x80) >> 7);
// Pulse the clock
mraa_gpio_write(dev->clk, 1);
usleep(20);
mraa_gpio_write(dev->clk, 0);
usleep(20);
// Shift to the next data bit
data <<= 1;
}
return UPM_SUCCESS;
}
upm_result_t p9813_refresh(p9813_context dev) {
uint16_t i;
uint8_t byte0, red, green, blue;
assert(dev != NULL);
// Begin data frame
p9813_send_byte(dev, 0x00);
p9813_send_byte(dev, 0x00);
p9813_send_byte(dev, 0x00);
p9813_send_byte(dev, 0x00);
for (i = 0; i <= dev->leds; i++) {
red = dev->buffer[i * 3];
green = dev->buffer[i * 3 + 1];
blue = dev->buffer[i * 3 + 2];
// The first byte is 11 followed by inverted bits 7 and 6 of blue, green, and red
byte0 = 0xFF;
byte0 ^= (blue >> 2) & 0x30; // XOR bits 4-5
byte0 ^= (green >> 4) & 0xC0; // XOR bits 2-3
byte0 ^= (red >> 6) & 0x03; // XOR bits 0-1
p9813_send_byte(dev, byte0);
p9813_send_byte(dev, blue);
p9813_send_byte(dev, green);
p9813_send_byte(dev, red);
}
// End data frame
p9813_send_byte(dev, 0x00);
p9813_send_byte(dev, 0x00);
p9813_send_byte(dev, 0x00);
p9813_send_byte(dev, 0x00);
return UPM_SUCCESS;
}

146
src/p9813/p9813.cxx Normal file
View File

@ -0,0 +1,146 @@
/*
* Author: Sergey Kiselev <sergey.kiselev@intel.com>
* Copyright (c) 2017 Sergey Kiselev
* Based on the apa102 driver writen by Yannick Adam <yannick.adam@gmail.com>
*
* 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 <cstring>
#include <iostream>
#include <stdexcept>
#include <stdlib.h>
#include <unistd.h>
#include "p9813.hpp"
using namespace upm;
P9813::P9813(uint16_t ledCount, uint16_t clkPin, uint16_t dataPin, bool batchMode)
: m_leds(ledCount), m_clkGpio(clkPin), m_dataGpio(dataPin), m_batchMode(batchMode)
{
mraa::Result res = mraa::SUCCESS;
// Set GPIO pins to output direction
res = m_clkGpio.dir(mraa::DIR_OUT);
if (res != mraa::SUCCESS) {
throw std::invalid_argument(std::string(__FUNCTION__) +
": GPIO failed to set direction");
}
res = m_dataGpio.dir(mraa::DIR_OUT);
if (res != mraa::SUCCESS) {
throw std::invalid_argument(std::string(__FUNCTION__) +
": GPIO failed to set direction");
}
}
void
P9813::setLed(uint16_t ledIdx, uint8_t r, uint8_t g, uint8_t b)
{
setLeds(ledIdx, ledIdx, r, g, b);
}
void
P9813::setAllLeds(uint8_t r, uint8_t g, uint8_t b)
{
setLeds(0, m_leds.size() - 1, r, g, b);
}
void
P9813::setLeds(uint16_t startIdx, uint16_t endIdx, uint8_t r, uint8_t g, uint8_t b)
{
for (uint16_t i = startIdx; i <= endIdx; i++) {
m_leds[i].red = r;
m_leds[i].green = g;
m_leds[i].blue = b;
}
if (!m_batchMode) {
pushState();
}
}
void
P9813::setLeds(uint16_t startIdx, uint16_t endIdx, std::vector<RgbColor> colors)
{
for (uint16_t i = startIdx, j = 0; i <= endIdx; i++) {
m_leds[i].red = colors[j].red;
m_leds[i].green = colors[j].green;
m_leds[i].blue = colors[j].blue;
}
if (!m_batchMode) {
pushState();
}
}
void
P9813::pushState(void)
{
// Begin data frame
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
for (uint16_t i = 0; i <= m_leds.size(); i++) {
uint8_t red = m_leds[i].red;
uint8_t green = m_leds[i].green;
uint8_t blue = m_leds[i].blue;
// The first byte is 11 followed by inverted bits 7 and 6 of blue, green, and red
uint8_t byte0 = 0xFF;
byte0 ^= (blue >> 2) & 0x30; // XOR bits 4-5
byte0 ^= (green >> 4) & 0xC0; // XOR bits 2-3
byte0 ^= (red >> 6) & 0x03; // XOR bits 0-1
sendByte(byte0);
sendByte(blue);
sendByte(green);
sendByte(red);
}
// End data frame
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
sendByte(0x00);
}
/*
* **************
* private area
* **************
*/
void
P9813::sendByte(uint8_t data)
{
for (uint16_t i = 0; i < 8; i++) {
// Write the data bit
m_dataGpio.write((data & 0x80) >> 7);
// Pulse the clock
m_clkGpio.write(1);
usleep(20);
m_clkGpio.write(0);
usleep(20);
// Shift to the next data bit
data <<= 1;
}
}

106
src/p9813/p9813.h Normal file
View File

@ -0,0 +1,106 @@
/*
* Author: Sergey Kiselev <sergey.kiselev@intel.com>
* Copyright (c) 2017 Sergey Kiselev
*
* 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 <stdint.h>
#include "upm.h"
#include "mraa/gpio.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file p9813.h
* @library p9813
* @brief C API for controlling P9813/Chainable RGN LEDs
*
* @include p9813.c
*/
/**
* Device context
*/
typedef struct _p9813_context {
// clock and data GPIO pins
mraa_gpio_context clk, data;
uint8_t* buffer;
int leds;
} *p9813_context;
/**
* Instantiates a new P9813 Chainable RGB LEDs
*
* @param ledcount Number of LEDs in the chain
* @param clk Clock pin
* @param data Data pin
* @return an initialized p9813 context on success, NULL on error.
*/
p9813_context p9813_init(int ledcount, int clk, int data);
/**
* P9813 close function
*
* @param dev The p9813_context to close
*/
void p9813_close(p9813_context dev);
/**
* Sets the color for one LED in the buffer
*
* @param dev The p9813_context to use
* @param index Index of the LED (0 based)
* @param r Red component (0-255)
* @param g Green component (0-255)
* @param b Blue component (0-255)
* @return upm_result_t UPM success/error code
*/
upm_result_t p9813_set_led(p9813_context dev, uint16_t index, uint8_t r, uint8_t g, uint8_t b);
/**
* Sets the color for multiple LEDs in the buffer
*
* @param dev The p9813_context to use
* @param s_index The start Index of the LED range (0 based)
* @param e_index The end Index of the LED range (0 based)
* @param r Red component (0-255)
* @param g Green component (0-255)
* @param b Blue component (0-255)
* @return upm_result_t UPM success/error code
*/
upm_result_t p9813_set_leds(p9813_context dev, uint16_t s_index, uint16_t e_index, uint8_t r, uint8_t g, uint8_t b);
/**
* Writes the buffer to the LED controllers thus updating the LEDs
*
* @param dev The p9813_context to use
* @return upm_result_t UPM success/error code
*/
upm_result_t p9813_refresh(p9813_context dev);
#ifdef __cplusplus
}
#endif

136
src/p9813/p9813.hpp Normal file
View File

@ -0,0 +1,136 @@
/*
* Author: Sergey Kiselev <sergey.kiselev@intel.com>
* Copyright (c) 2017 Sergey Kiselev
* Based on the apa102 driver writen by Yannick Adam <yannick.adam@gmail.com>
*
* 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 <mraa/gpio.hpp>
#include <vector>
namespace upm
{
/**
* @brief P9813 Chainable RGB LEDs driver library
* @defgroup p9813 libupm-p9813
* @ingroup adafruit gpio led
*/
typedef struct {
uint8_t red, green, blue;
} RgbColor;
/**
* @library p9813
* @sensor p9813
* @comname Chainable RGB LED driver
* @type led
* @man adafruit
* @con gpio
* @web https://www.adafruit.com/product/2343
*
* @brief API for controlling P9813/Chainable RGB LEDs
*
* P9813 LED controller provides individually controllable LEDs through a two pin protocol
* For each LED, an RGB (0-255) value can be set.
*
* @image html p9813.jpg
* @snippet p9813.cxx Interesting
*/
class P9813
{
public:
/**
* Instantiates a new P9813 LED chain
*
* @param ledCount Number of P9813 leds in the chain
* @param clkPin Clock Pin
* @param dataPin Data Pin
* @param batchMode (optional) Immediately write to the LED controllers (false, default) or wait for a pushState
* call (true)
* @param csn (optional) Chip Select Pin
*/
P9813(uint16_t ledCount, uint16_t clkPin, uint16_t dataPin, bool batchMode = false);
/**
* P9813 destructor
*/
virtual ~P9813() {};
/**
* Set the color for a single LED
*
* @param ledIdx Index of the LED in the chain (0 based)
* @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 r, uint8_t g, uint8_t b);
/**
* Set the color for all LEDs
*
* @param r Red component (0-255)
* @param g Green component (0-255)
* @param b Blue component (0-255)
*/
void setAllLeds(uint8_t r, uint8_t g, uint8_t b);
/**
* Set the color for a range of LEDs
*
* @param startIdx Start index of the range of LEDs in the chain (0 based)
* @param endIdx End index of the range of LEDs in the chain (0 based)
* @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 r, uint8_t g, uint8_t b);
/**
* (Advanced) Manually control the colors and brightness 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 Vector containing RgbColor structures for each LED
* No check done on the boundaries
*/
void setLeds(uint16_t startIdx, uint16_t endIdx, std::vector<RgbColor> colors);
/**
* Outputs the current LED data to the LED controllers
* Note: Only required if batch mode is set to TRUE
*
*/
void pushState();
private:
std::vector<RgbColor> m_leds;
mraa::Gpio m_clkGpio;
mraa::Gpio m_dataGpio;
bool m_batchMode;
void sendByte(uint8_t data);
};
}

67
src/p9813/p9813_fti.c Normal file
View File

@ -0,0 +1,67 @@
/*
* Author: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
* Copyright (c) 2016 Intel Corporation.
*
* 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 "p9813.h"
#include "upm_fti.h"
/**
* This file implements the Function Table Interface (FTI) for this sensor
*/
const char upm_p9813_name[] = "P9813";
const char upm_p9813_description[] = "P9813/Chainable RGB LEDs";
const upm_protocol_t upm_p9813_protocol[] = {UPM_GPIO};
const upm_sensor_t upm_p9813_category[] = {};
// forward declarations
const void* upm_p9813_get_ft(upm_sensor_t sensor_type);
void* upm_p9813_init_name();
void upm_p9813_close(void *dev);
static const upm_sensor_ft ft =
{
.upm_sensor_init_name = &upm_p9813_init_name,
.upm_sensor_close = &upm_p9813_close,
};
const void* upm_p9813_get_ft(upm_sensor_t sensor_type)
{
switch(sensor_type)
{
case UPM_SENSOR:
return &ft;
default:
return NULL;
}
}
void* upm_p9813_init_name()
{
return NULL;
}
void upm_p9813_close(void *dev)
{
p9813_close((p9813_context)dev);
}

11
src/p9813/pyupm_p9813.i Normal file
View File

@ -0,0 +1,11 @@
// Include doxygen-generated documentation
%include "pyupm_doxy2swig.i"
%module pyupm_p9813
%include "../upm.i"
%feature("autodoc", "3");
%include "p9813.hpp"
%{
#include "p9813.hpp"
%}