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) { } }
neopixel_i2c_daemon.cpp@2:e0269262d1f2, 2015-10-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |