I2c slave device to control NeoPixel strings

Dependencies:   NeoPixelString SimplyLog

Example program

#include "mbed.h"
#include "neopixel_string.h"
#include "i2c_device.h"
#include "neopixel_string_factory.h"
#include "neopixel_i2c_daemon.h"

// This must be an SPI MOSI pin.
#define DATA_PIN p5
#define STRING_SIZE 8

#define DEBUG_MODE 1
#include "log.h"

Serial pc(USBTX, USBRX); // tx, rx

int main() {
    pc.baud(115200);
    SimplyLog::Log::i("Neopixel driver loading\r\n");
    
    I2cSettings settings;
    settings.frequency = 100000;
    settings.address = 0x80;

    SimplyLog::Log::i("Slave is working @ %dHz\r\n", settings.frequency);
    SimplyLog::Log::i("Slave is working @ SLAVE_ADDRESS = 0x%x\r\n", settings.address);    
    
    SimplyLog::Log::i("Creating NeoPixel String\r\n");
    NeoPixelString * first_string = NeoPixelStringFactory::createNeoPixelString(DATA_PIN, STRING_SIZE);
    
    SimplyLog::Log::i("Creating I2cDevice\r\n");
    I2cDevice i2c(p28, p27, &settings);
    
    SimplyLog::Log::i("Creating NeoPixel I2c Daemon\r\n");
    NeoPixelI2cDaemon neo(&i2c, LED1);
    neo.attachPixelString(first_string);

    SimplyLog::Log::i("Listening in blocking mode\r\n");
    neo.listen(true);
    
    while(1) { }
}

Committer:
dwini
Date:
Sun Oct 25 11:36:21 2015 +0000
Revision:
2:e0269262d1f2
Parent:
0:3a31c84ed525
Add alive led to i2c daemon

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dwini 0:3a31c84ed525 1 #include "neopixel_i2c_daemon.h"
dwini 0:3a31c84ed525 2
dwini 0:3a31c84ed525 3 #define DEBUG_MODE 1
dwini 0:3a31c84ed525 4 #include "log.h"
dwini 0:3a31c84ed525 5
dwini 2:e0269262d1f2 6 NeoPixelI2cDaemon::NeoPixelI2cDaemon(I2cDevice * i2c, PinName alive_pin) : alive(alive_pin) {
dwini 0:3a31c84ed525 7 this->i2c = i2c;
dwini 2:e0269262d1f2 8 cAlive = 0;
dwini 0:3a31c84ed525 9 }
dwini 0:3a31c84ed525 10
dwini 0:3a31c84ed525 11 void NeoPixelI2cDaemon::attachPixelString(NeoPixelString * pixelstring) {
dwini 0:3a31c84ed525 12 pixelstrings.push_back(pixelstring);
dwini 0:3a31c84ed525 13 }
dwini 0:3a31c84ed525 14
dwini 0:3a31c84ed525 15 void NeoPixelI2cDaemon::allOff(void) {
dwini 0:3a31c84ed525 16 for (unsigned int i = 0; i < pixelstrings.size(); i++) {
dwini 0:3a31c84ed525 17 pixelstrings[i]->update(Colors::Black);
dwini 0:3a31c84ed525 18 }
dwini 0:3a31c84ed525 19 }
dwini 0:3a31c84ed525 20
dwini 0:3a31c84ed525 21 void NeoPixelI2cDaemon::allSingleColor(neopixel::Pixel singlecolor) {
dwini 0:3a31c84ed525 22 for (unsigned int i = 0; i < pixelstrings.size(); i++) {
dwini 0:3a31c84ed525 23 pixelstrings[i]->update(singlecolor);
dwini 0:3a31c84ed525 24 }
dwini 0:3a31c84ed525 25 }
dwini 0:3a31c84ed525 26
dwini 0:3a31c84ed525 27 void NeoPixelI2cDaemon::diagnoseAll(void) {
dwini 0:3a31c84ed525 28 for (unsigned int i = 0; i < pixelstrings.size(); i++) {
dwini 0:3a31c84ed525 29 pixelstrings[i]->diagnose();
dwini 0:3a31c84ed525 30 }
dwini 0:3a31c84ed525 31 }
dwini 0:3a31c84ed525 32
dwini 0:3a31c84ed525 33 void NeoPixelI2cDaemon::listen(bool blocking=false) {
dwini 0:3a31c84ed525 34 char buffer[10];
dwini 0:3a31c84ed525 35
dwini 0:3a31c84ed525 36 while (blocking) {
dwini 0:3a31c84ed525 37 // Check for i2c message
dwini 0:3a31c84ed525 38 int i = i2c->receive();
dwini 0:3a31c84ed525 39 // NoData - the slave has not been addressed
dwini 0:3a31c84ed525 40 // ReadAddressed - the master has requested a read from this slave
dwini 0:3a31c84ed525 41 // WriteAddressed - the master is writing to this slave
dwini 0:3a31c84ed525 42 // WriteGeneral - the master is writing to all slave
dwini 0:3a31c84ed525 43
dwini 0:3a31c84ed525 44 switch (i) {
dwini 0:3a31c84ed525 45
dwini 0:3a31c84ed525 46 case I2cDevice::ReadAddressed:
dwini 0:3a31c84ed525 47 char sendbuffer[1];
dwini 0:3a31c84ed525 48 sendbuffer[0] = pixelstrings.size();
dwini 0:3a31c84ed525 49 int result = i2c->write(sendbuffer, sizeof(sendbuffer));
dwini 0:3a31c84ed525 50 i2c->stop();
dwini 0:3a31c84ed525 51
dwini 0:3a31c84ed525 52 if (!result) { // 0 on success, non-0 otherwise
dwini 0:3a31c84ed525 53 SimplyLog::Log::i("Send info to master successfully\r\n");
dwini 0:3a31c84ed525 54 } else {
dwini 0:3a31c84ed525 55 SimplyLog::Log::w("Send info to master failed\r\n");
dwini 0:3a31c84ed525 56 }
dwini 0:3a31c84ed525 57 break;
dwini 0:3a31c84ed525 58
dwini 0:3a31c84ed525 59 case I2cDevice::WriteAddressed:
dwini 0:3a31c84ed525 60 {
dwini 0:3a31c84ed525 61 // First we read the command byte
dwini 0:3a31c84ed525 62 int command = i2c->read();
dwini 0:3a31c84ed525 63
dwini 0:3a31c84ed525 64 // Check the command
dwini 0:3a31c84ed525 65 switch (command)
dwini 0:3a31c84ed525 66 {
dwini 0:3a31c84ed525 67 case OFF:
dwini 0:3a31c84ed525 68 i2c->stop(); // Necessary !! Otherwise write will fail on master end
dwini 0:3a31c84ed525 69 SimplyLog::Log::i("Killing all neopixel leds\r\n");
dwini 0:3a31c84ed525 70 allOff();
dwini 0:3a31c84ed525 71 break;
dwini 0:3a31c84ed525 72
dwini 0:3a31c84ed525 73 case DIAGNOSTIC:
dwini 0:3a31c84ed525 74 i2c->stop(); // Necessary !! Otherwise write will fail on master end
dwini 0:3a31c84ed525 75 SimplyLog::Log::i("Executing diagnostic of neopixel strings\r\n");
dwini 0:3a31c84ed525 76 diagnoseAll();
dwini 0:3a31c84ed525 77 SimplyLog::Log::i("Diagnostic finished\r\n");
dwini 0:3a31c84ed525 78 break;
dwini 0:3a31c84ed525 79
dwini 0:3a31c84ed525 80 case SINGLE_COLOR:
dwini 0:3a31c84ed525 81 // Expect 3 more bytes [red green blue]
dwini 0:3a31c84ed525 82 if(!i2c->read(buffer, 3)) { //0 on success, non-0 otherwise
dwini 0:3a31c84ed525 83 neopixel::Pixel color;
dwini 0:3a31c84ed525 84 color.red = buffer[0];
dwini 0:3a31c84ed525 85 color.green = buffer[1];
dwini 0:3a31c84ed525 86 color.blue = buffer[2];
dwini 0:3a31c84ed525 87 allSingleColor(color);
dwini 0:3a31c84ed525 88
dwini 0:3a31c84ed525 89 SimplyLog::Log::i("Setting single color [r,g,b] = [%d,%d,%d]\r\n", color.red, color.green, color.blue);
dwini 0:3a31c84ed525 90 } else {
dwini 0:3a31c84ed525 91 SimplyLog::Log::w("Single color set received with missing params\r\n");
dwini 0:3a31c84ed525 92 }
dwini 0:3a31c84ed525 93 break;
dwini 0:3a31c84ed525 94
dwini 0:3a31c84ed525 95 default:
dwini 0:3a31c84ed525 96 i2c->stop(); // Necessary !! Otherwise write will fail on master end
dwini 0:3a31c84ed525 97 SimplyLog::Log::w("Unknown command byte\r\n");
dwini 0:3a31c84ed525 98 }
dwini 0:3a31c84ed525 99 }
dwini 0:3a31c84ed525 100 }
dwini 0:3a31c84ed525 101
dwini 0:3a31c84ed525 102 for(int i = 0; i < 10; i++) {
dwini 0:3a31c84ed525 103 buffer[i] = 0; // Clear buffer
dwini 0:3a31c84ed525 104 }
dwini 2:e0269262d1f2 105
dwini 2:e0269262d1f2 106 // Alive LED
dwini 2:e0269262d1f2 107 cAlive = (cAlive + 1) % 100000;
dwini 2:e0269262d1f2 108 if (!cAlive) {
dwini 2:e0269262d1f2 109 alive = !alive;
dwini 2:e0269262d1f2 110 }
dwini 0:3a31c84ed525 111 }
dwini 0:3a31c84ed525 112 }