projectwerk

Dependencies:   NeoPixelString SimplyLog

Fork of NeoPixelI2cSlave by Nico De Witte

Revision:
0:3a31c84ed525
Child:
2:e0269262d1f2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/neopixel_i2c_daemon.cpp	Sun Oct 25 11:25:11 2015 +0000
@@ -0,0 +1,105 @@
+#include "neopixel_i2c_daemon.h"
+
+#define DEBUG_MODE 1
+#include "log.h"
+
+NeoPixelI2cDaemon::NeoPixelI2cDaemon(I2cDevice * i2c){
+    this->i2c = i2c;
+}
+
+void NeoPixelI2cDaemon::attachPixelString(NeoPixelString * pixelstring) {
+    pixelstrings.push_back(pixelstring);   
+}
+
+void NeoPixelI2cDaemon::allOff(void) {
+    for (unsigned int i = 0; i < pixelstrings.size(); i++) {
+        pixelstrings[i]->update(Colors::Black);
+    }   
+}
+
+void NeoPixelI2cDaemon::allSingleColor(neopixel::Pixel singlecolor) {
+    for (unsigned int i = 0; i < pixelstrings.size(); i++) {
+        pixelstrings[i]->update(singlecolor);
+    }   
+}
+
+void NeoPixelI2cDaemon::diagnoseAll(void) {
+    for (unsigned int i = 0; i < pixelstrings.size(); i++) {
+        pixelstrings[i]->diagnose();
+    }   
+}
+
+void NeoPixelI2cDaemon::listen(bool blocking=false) {
+    char buffer[10];
+
+    while (blocking) {
+        // Check for i2c message
+        int i = i2c->receive();
+            // NoData - the slave has not been addressed
+            // ReadAddressed - the master has requested a read from this slave
+            // WriteAddressed - the master is writing to this slave
+            // WriteGeneral - the master is writing to all slave
+
+        switch (i) {
+
+            case I2cDevice::ReadAddressed:
+                char sendbuffer[1];
+                sendbuffer[0] = pixelstrings.size();
+                int result = i2c->write(sendbuffer, sizeof(sendbuffer));
+                i2c->stop();
+
+                if (!result) {     // 0 on success, non-0 otherwise
+                    SimplyLog::Log::i("Send info to master successfully\r\n");
+                } else {
+                    SimplyLog::Log::w("Send info to master failed\r\n");
+                }
+                break;
+
+            case I2cDevice::WriteAddressed:
+            {
+                // First we read the command byte
+                int command = i2c->read();
+                
+                // Check the command
+                switch (command)
+                {
+                    case OFF:
+                        i2c->stop();    // Necessary !! Otherwise write will fail on master end
+                        SimplyLog::Log::i("Killing all neopixel leds\r\n");
+                        allOff();
+                        break;
+
+                    case DIAGNOSTIC:
+                        i2c->stop();    // Necessary !! Otherwise write will fail on master end
+                        SimplyLog::Log::i("Executing diagnostic of neopixel strings\r\n");
+                        diagnoseAll();
+                        SimplyLog::Log::i("Diagnostic finished\r\n");
+                        break;
+
+                    case SINGLE_COLOR:
+                        // Expect 3 more bytes [red green blue]
+                        if(!i2c->read(buffer, 3)) {      //0 on success, non-0 otherwise
+                            neopixel::Pixel color;
+                            color.red = buffer[0];
+                            color.green = buffer[1];
+                            color.blue = buffer[2];
+                            allSingleColor(color);
+
+                            SimplyLog::Log::i("Setting single color [r,g,b] = [%d,%d,%d]\r\n", color.red, color.green, color.blue);
+                        } else {
+                            SimplyLog::Log::w("Single color set received with missing params\r\n");
+                        }
+                        break;
+                    
+                    default:
+                        i2c->stop();    // Necessary !! Otherwise write will fail on master end
+                        SimplyLog::Log::w("Unknown command byte\r\n");
+                }
+            }
+        }
+
+        for(int i = 0; i < 10; i++) {
+            buffer[i] = 0;    // Clear buffer
+        }
+    }
+}
\ No newline at end of file