diff --git a/NinjaBlockEthernet/NinjaBlockEthernet.cpp b/NinjaBlockEthernet/NinjaBlockEthernet.cpp old mode 100644 new mode 100755 index f286581..6534d87 --- a/NinjaBlockEthernet/NinjaBlockEthernet.cpp +++ b/NinjaBlockEthernet/NinjaBlockEthernet.cpp @@ -139,11 +139,15 @@ const byte kHeaderLength = sizeof(kStrHeaderEnd); // will keep reading bytes until it has matched the header, or it has read all available bytes inline void skipHeader(const int bytesAvailable, int &bytesRead) { //skip past header + //Serial.print("_Head="); for (uint8_t matching=0 ; (matching < kHeaderLength) && (bytesRead < bytesAvailable) ; bytesRead++) { - matching = ((recvclient.read() == kStrHeaderEnd[matching]) ? matching+1 : 0); + char curByte = recvclient.read(); + //Serial.print(curByte); + matching = ((curByte == kStrHeaderEnd[matching]) ? matching+1 : 0); } + //Serial.println(""); } const char kCharInvertedCommas = '\"'; @@ -179,11 +183,17 @@ char * valueString(const char *name, char *data, int &index, const int length) { } if (index < length) { //if searching for a string seek end of string ("), otherwise (,) ends an int - char endChar = (data[index-1]==kCharInvertedCommas) ? kCharInvertedCommas : ','; + char endChar = ','; + if (data[index-1]==kCharInvertedCommas) endChar = kCharInvertedCommas; + if (data[index]=='{') endChar = '}'; + int start = index; - while ((index < length) && (data[index] != endChar)) { + while ((index < length) && (data[index] != endChar) && (data[index] != '}')) { index++; } + + if((index < length) && (endChar == '}')) index++; + if (index < length) { data[index] = '\0'; // insert string terminator after value (string or int) result = &data[start]; @@ -194,7 +204,8 @@ char * valueString(const char *name, char *data, int &index, const int length) { bool NinjaBlockClass::receiveConnected(void) { bool gotHeader = false; - bool gotData = false; + bool gotData = false; + IsTick = false; int bytesAvailable = recvclient.available(); if (bytesAvailable > 0) { @@ -213,10 +224,13 @@ bool NinjaBlockClass::receiveConnected(void) { char data[DATA_SIZE]; //read data into array eg. {"DEVICE":[{"G":"0","V":0,"D":1000,"DA":"FFFFFF"}]} + Serial.print("_Recv="); for (bytesRead=0; bytesReadchar[] + // itoa(brightness,buf,10); + // analogWrite(led, brightness); + // } + // } + + if (NinjaBlock.intDID == 1000) { + + // FFFFFF is "white" in the RGB widget we identified as + if (strcmp(NinjaBlock.strDATA,"FFFFFF") == 0) { + #if ENABLE_SERIAL + Serial.println("LED ON"); + #endif + digitalWrite(led, HIGH); + } else if (strcmp(NinjaBlock.strDATA,"000000") == 0) { + #if ENABLE_SERIAL + Serial.println("LED OFF"); + #endif + digitalWrite(led, LOW); + } + + } + } else { + // Do something with int data + // Serial.print("intDATA="); + // Serial.println(NinjaBlock.intDATA); + } } diff --git a/NinjaBlockEthernet/examples/Ninja_Matrix/Ninja_Matrix.ino b/NinjaBlockEthernet/examples/Ninja_Matrix/Ninja_Matrix.ino index 89054dd..6fc326a 100644 --- a/NinjaBlockEthernet/examples/Ninja_Matrix/Ninja_Matrix.ino +++ b/NinjaBlockEthernet/examples/Ninja_Matrix/Ninja_Matrix.ino @@ -124,45 +124,77 @@ void loop() { if(NinjaBlock.receive()) { - // If this function returns true, there are commands (data) from the server - // Return values are: - // NinjaBlock.strGUID - // NinjaBlock.intVID - // NinjaBlock.intDID - // NinjaBlock.intDATA - if data is integer - // NinjaBlock.strDATA - if data is string - - digitalWrite(statusled, HIGH); // flash the status led on data received - - Serial.print("DA:"); - if (NinjaBlock.IsDATAString) { - Serial.print(NinjaBlock.strDATA); - if (NinjaBlock.intDID == 7000) { - dmd.drawMarquee(NinjaBlock.strDATA,strlen(NinjaBlock.strDATA),(32*DISPLAYS_ACROSS)-1,0, WHITE, BLACK); - marquee = true; - // TODO: Draw strings that will fit rather than scrolling them, change font, draw pixels, etc. - } - } else { - // Do something with int data - Serial.print("INT="); - Serial.print(NinjaBlock.intDATA); - } - - Serial.print(" DID:"); - Serial.println(NinjaBlock.intDID); - } - - if ( marquee ) { - long start=millis(); - long timer=start; - boolean ret=false; - while(!ret){ - if ((timer+30) < millis()) { - ret=dmd.stepMarquee(-1,0); - timer=millis(); - } - } - } + // If this function returns true, there are either commands (data) from the server + // or a keep alive Tick has been sent + //First, you MUST check if it is a Tick + if(NinjaBlock.IsTick) { //There is no input, just a keep alive update + + //Make sure any devices tha don't regularly send data to the cloud + // are updated here or they will time out + + } else { //There is data to respond to + + // Return values are: + // NinjaBlock.strGUID + // NinjaBlock.intVID + // NinjaBlock.intDID + // NinjaBlock.intDATA - if data is integer + // NinjaBlock.strDATA - if data is string (note char[64]) + + if (NinjaBlock.IsDATAString) { + + // Serial.print("strDATA="); + // Serial.println(NinjaBlock.strDATA); + + // NOTE: This library can now read serialised JSON + // It will appear as a DATA String, but will contain multiple values + // If your DeviceID sends serialised JSON adapt the following code: + // (responds to a Light protocol sending "on":true and "bri":0-254) + // + // int bytesRead = 0; + // int bytesAvailable = strlen(NinjaBlock.strDATA); + // if (jsonString("on\\\":true", NinjaBlock.strDATA, bytesRead, bytesAvailable) != NULL) { + // char * strValue = jsonString("bri\\\":", NinjaBlock.strDATA, bytesRead, bytesAvailable); + // if(strValue != NULL) { + // int brightness = atoi(strValue); + // char buf[8]; //Using a buffer for String->char[] + // itoa(brightness,buf,10); + // analogWrite(led, brightness); + // } + // } + + digitalWrite(statusled, HIGH); // flash the status led on data received + + Serial.print("DA:"); + if (NinjaBlock.IsDATAString) { + Serial.print(NinjaBlock.strDATA); + if (NinjaBlock.intDID == 7000) { + dmd.drawMarquee(NinjaBlock.strDATA,strlen(NinjaBlock.strDATA),(32*DISPLAYS_ACROSS)-1,0, WHITE, BLACK); + marquee = true; + // TODO: Draw strings that will fit rather than scrolling them, change font, draw pixels, etc. + } + } else { + // Do something with int data + Serial.print("INT="); + Serial.print(NinjaBlock.intDATA); + } + + Serial.print(" DID:"); + Serial.println(NinjaBlock.intDID); + } + } + + if ( marquee ) { + long start=millis(); + long timer=start; + boolean ret=false; + while(!ret){ + if ((timer+30) < millis()) { + ret=dmd.stepMarquee(-1,0); + timer=millis(); + } + } + } }