Дана следующая функция:
Если я выполню setColor("R:0,G:0,B:255,");
Я ожидаю red
, grn
, blu
значения должны быть:
0 0 255
кроме как я получаю 0 0 0
Это нормально работает для R:255,G:0,B:0,
или же R:0,G:255,B:0,
хоть.
int setColor(String command) {
//Parse the incoming command string
//Example command R:123,G:100,B:50,
//RGB values should be between 0 to 255
int red = getColorValue(command, "R:", "G");
int grn = getColorValue(command, "G:", "B");
int blu = getColorValue(command, "B:", ",");
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red, grn, blu));
}
strip.show();
return 1;
}
int getColorValue(String command, String first, String second) {
int rgbValue;
String val = command.substring(command.indexOf(first)+2, command.indexOf(second));
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
Я могу предположить, что command.indexOf(second)
всегда найдет тебя первый запятая, поэтому для B
val
становится пустой строкой.
При условии, что indexOf
что-то похожее на .Net-х, может быть попробовать
int start = command.indexOf(first)+2;
int end = command.indexOf(second, start)
String val = command.substring(start+2, end);
Обратите внимание на второй аргумент для второго вызова indexOf
Я думаю это сделает indexOf
искать спички после start
, Я также думаю, что вам лучше пройти ","
как second
для всех вызовов и добавьте +1 или -1 к end
чтобы компенсировать это прохождение ","
вместо "G"
а также "B"
,
Или просто используйте другой ограничитель для B
часть, как R:0,G:0,B:0.
(точка вместо запятой).
Не зная вашего String
Реализация, я могу только сделать обоснованное предположение.
Что происходит то indexOf(second)
не дает вам то, что вы думаете.
"R:0,G:0,B:255,"^ ^- indexOf("B:")
|- indexOf(",")
Это работает для других ваших случаев, поскольку ни одна из вещей, которые они ищут, не встречается в строке более одного раза.
Глядя на SparkCore Документы мы находим документацию для обоих indexOf
а также substring
,
индекс()
Находит символ или строку в другой строке. По умолчанию поиск выполняется с начала строки, но также может начинаться с заданного индекса, что позволяет найти все экземпляры символа или строки.
string.indexOf(val)
string.indexOf(val, from)
подстрока ()
string.substring(from)
string.substring(from, to)
Так что теперь, чтобы решить вашу проблему, вы можете использовать второй вариант indexOf
и передайте тот индекс, который вы нашли при первом поиске.
int getColorValue(String command, String first, String second) {
int rgbValue;
int beg = command.indexOf(first)+2;
int end = command.indexOf(second, beg);
String val = command.substring(beg, end);
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
В этом случае я бы разделил строку, используя запятую в качестве разделителя, а затем проанализировал каждую подстроку в пару ключ-значение. Вы можете использовать вектор значения для второй части, если у вас всегда есть последовательность «R, G, B», и в этом случае зачем вообще есть «R:», «G:» или «B:»?
В итоге я просто изменил свой код:
int setColor(String command) {
int commaIndex = command.indexOf(',');
int secondCommaIndex = command.indexOf(',', commaIndex+1);
int lastCommaIndex = command.lastIndexOf(',');
String red = command.substring(0, commaIndex);
String grn = command.substring(commaIndex+1, secondCommaIndex);
String blu = command.substring(lastCommaIndex+1);
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red.toInt(), grn.toInt(), blu.toInt()));
}
strip.show();
return 1;
}
Я просто делаю: 255,0,0
и это работает удовольствие.