projectwerk

Dependencies:   NeoPixelString SimplyLog

Fork of NeoPixelI2cSlave by Nico De Witte

Committer:
dwini
Date:
Sun Oct 25 11:25:11 2015 +0000
Revision:
0:3a31c84ed525
Child:
2:e0269262d1f2
Start of NeoPixel I2c Slave library.

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