const int MAX_STRING_LENGTH = 50;
char receivedString[MAX_STRING_LENGTH];
const int lampPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int numLamps = 8;
int currentPosition = 0;
// Определение структуры для хранения команд
struct Command {
char type; // Тип команды
int arg1; // Первый аргумент (для команды "?")
int arg2; // Второй аргумент (для команды "?")
};
// Максимальное количество команд
const int MAX_COMMANDS = 100; // Установите максимальное количество команд по вашему усмотрению
Command commands[MAX_COMMANDS];
int parseCommands(String inputString) {
int index = 0;
int startPos = 0;
// Разбиваем строку на подстроки с использованием Serial.readStringUntil(';')
for (int i = 0; i < inputString.length(); i++) {
if (inputString.charAt(i) == ';') {
// Извлекаем подстроку между разделителями
String commandStr = inputString.substring(startPos, i);
// Заполняем структуру Command в зависимости от типа команды
Command currentCommand;
currentCommand.type = commandStr.charAt(0);
// Для команды "?" извлекаем аргументы
if (currentCommand.type == '?') {
sscanf(commandStr.c_str(), "?%d,%d", ¤tCommand.arg1, ¤tCommand.arg2);
}
commands[index++] = currentCommand;
// Проверяем, чтобы не выйти за пределы массива команд
if (index >= MAX_COMMANDS) {
break;
}
startPos = i + 1;
}
}
// Обработка последней команды
if (index < MAX_COMMANDS) {
String lastCommandStr = inputString.substring(startPos);
Command lastCommand;
lastCommand.type = lastCommandStr.charAt(0);
// Для команды "?" извлекаем аргументы
if (lastCommand.type == '?') {
sscanf(lastCommandStr.c_str(), "?%d,%d", &lastCommand.arg1, &lastCommand.arg2);
}
commands[index] = lastCommand;
}
return index;
}
void setup() {
Serial.begin(9600);
Serial.println(0);
}
void loop() {
if (Serial.available() > 0) {
int i = parseCommands(Serial.readString());
executeCommands(i);
}
}
void executeCommands(int index)
{
int i = 0;
while (commands[i].type != '!' && i < index)
{
delay(300);
Command command = commands[i];
i++;
Serial.print(i);
Serial.print(":");
Serial.print(command.type);
Serial.print(":");
Serial.println(digitalRead(lampPins[currentPosition]));
Serial.print(":");
Serial.print(currentPosition);
Serial.print(":");
switch (command.type)
{
case '?':
if (digitalRead(lampPins[currentPosition]) == LOW)
{
Serial.print("yes");
i = command.arg1 - 1;
}
if (digitalRead(lampPins[currentPosition]) == HIGH)
{
Serial.print("no");
i = command.arg2 - 1;
}
break;
case 'L':
currentPosition = (currentPosition + 1) % numLamps;
break;
case 'R':
currentPosition = (currentPosition - 1 + numLamps) % numLamps;
break;
case 'T':
digitalWrite(lampPins[currentPosition], HIGH);
break;
case 'D':
digitalWrite(lampPins[currentPosition], LOW);
break;
default:
Serial.println("error");
break;
}
Serial.println();
}
}
// Ваш код продолжает выполняться здесь