Étape 4: télécommande
Tel que défini :
#define UNIFIEDFUNCTION "theFunction"
et puis dans setup() :
Spark.function(UNIFIEDFUNCTION, setColorInModeFunction);
Cette fonction est appelée à partir d’Internet via le NSURLRequest puis les branches en plusieurs parties selon le mode et la valeur de comptage. Cette partie peut peut-être obtenir plus sophistiquée, une somme de contrôle pourrait être introduite et ainsi de suite.
int setColorInModeFunction(String args) { unsigned char allValuesMaxCount = 25; // 64 chars -24 separator = 40 digis; // 40/25 digits = 1.6 digits per value double allValues[allValuesMaxCount]; unsigned int count = parseArgsIntoDoubles(args, allValues); if(count > allValuesMaxCount) {// How to deal with a once-in-a-lifetime situation? Serial.println("Houston, we have a problem!"); } double mode = allValues[0]; if(THEFEATURE_FUNCTION == mode)// set overall brightness and rotation {// 1 == rpm, 2 = brightness double rotationExponent = allValues[1]; rotationDirectionIsClock = (0 < rotationExponent); float buttonRpmExp = (float)fabs(rotationExponent); rpm = (unsigned int) round(pow(2,buttonRpmExp));// the only case we get fractional exponents, e.g. smooth changes buttonRpmIndex = (unsigned char)round(buttonRpmExp);// to get the buttons as index right brightness = (float)constrain(allValues[2],0.0,1.0); int exp; double fraction = frexp(256.0*brightness, &exp); brightnessIndex = (unsigned char)constrain(exp,0,7); } else if (SINGLECOL_FUNCTION == mode && 3 == count)// set one indexed color { unsigned int aColorIndex = constrain((unsigned long)(floor(allValues[1])),0,11); theColorValues[aColorIndex] = constrain((unsigned long)(floor(allValues[2])),0,0xFFFFFF); } else // some more or all colors will be set { unsigned char startIndex = 0; unsigned char offset = 0; unsigned char colorsCount = 12; // 12: there will be 12 values for all the LEDs, there is no mode, value is positive if( 0 <= mode && 12 == count)// we got all values, no explicit mode { // nothing } else if(INDEXEDCOL_FUNCTION == mode) { // set all values for the loop startIndex = constrain((unsigned long)(floor(allValues[1])),0,11); colorsCount = constrain((unsigned long)(floor(allValues[2])),1,12); offset = 3; } if(13 > startIndex + colorsCount)// no more than 12 for(unsigned int i = 0; i < colorsCount ; i++) {// set the indexed color from offset to end unsigned char readIndex = offset + i; // for readability, start at offset; theColorValues[i + startIndex] = constrain((unsigned long)(floor(allValues[readIndex])),0,0xFFFFFF); }; } return count; }
Les images montrent certains cas particuliers. Toutes les LED en rouge raccourcit l’appel, parce que la couleur rouge est à 0x0000FF hexadécimal, décimal seulement 256. C’est seulement à l’appel. Les deux images montrent les deux beaucoup de LED en noir, ce qui donne une série de « 0 ».
Le dernier d'entre eux montre l’interface pour définir une couleur avec un prédéfinies et un curseur de luminosité. À partir de cette interface, la couleur peut être définie comme couleur unique.