Функция выхода Arduino Adalight после тайм-аута
Я работаю над проектом с Arduino и Ledstrip. Я делаю комбинацию Philips Ambilight и Philips оттенка на одной полосе. Я использую кнопки для переключения между Hue и Ambilight, для этого я использую код adalight.
Я могу переключиться с Hue (color();) на функцию ambilight, но не обратно с adalight на функцию color, когда функция ambilight не получает ответ от обработки. Кажется, он остается в функции ambilight. когда он не получает ответа, начинает работать следующий фрагмент кода:
// If no data received for an extended time, turn off all LEDs.
if((t - lastByteTime) > serialTimeout) {
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); //filling Led array by zeroes
FastLED.show();
lastByteTime = t; // Reset counter
}
Я много чего перепробовал, но ничего не получается. Итак, мой вопрос: как выйти из функции amblight и вернуться к функции цвета?
void loop() {
if(state == 0){
color();
}
if(state == 1){
ambilight();
}
}
void color(){
for (i=0; i< strip.numPixels(); i++){
strip.setPixelColor(i, 255,0,0);
}
strip.show();
}
void ambilight(){
button();
uint8_t
buffer[256],
indexIn = 0,
indexOut = 0,
mode = 0,
hi, lo, chk, i, spiFlag;
int16_t
bytesBuffered = 0,
hold = 0,
c;
int32_t
bytesRemaining;
unsigned long
startTime,
lastByteTime,
lastAckTime,
t;
int32_t outPos = 0;
startTime = micros();
lastByteTime = lastAckTime = millis();
for(;;) {
// Implementation is a simple finite-state machine.
// Regardless of mode, check for serial input each time:
t = millis();
if((bytesBuffered < 256) && ((c = Serial.read()) >= 0)) {
buffer[indexIn++] = c;
bytesBuffered++;
lastByteTime = lastAckTime = t; // Reset timeout counters
}
else {
// No data received. If this persists, send an ACK packet
// to host once every second to alert it to our presence.
if((t - lastAckTime) > 1000) {
Serial.print("Ada\n"); // Send ACK string to host
lastAckTime = t; // Reset counter
}
// If no data received for an extended time, turn off all LEDs.
if((t - lastByteTime) > serialTimeout) {
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); //filling Led array by zeroes
FastLED.show();
lastByteTime = t; // Reset counter
}
}
if(mode == 0){
// In header-seeking mode. Is there enough data to check?
if(bytesBuffered >= HEADERSIZE) {
// Indeed. Check for a 'magic word' match.
for(i=0; (i<MAGICSIZE) && (buffer[indexOut++] == magic[i++]););
if(i == MAGICSIZE) {
// Magic word matches. Now how about the checksum?
hi = buffer[indexOut++];
lo = buffer[indexOut++];
chk = buffer[indexOut++];
if(chk == (hi ^ lo ^ 0x55)) {
// Checksum looks valid. Get 16-bit LED count, add 1
// (# LEDs is always > 0) and multiply by 3 for R,G,B.
bytesRemaining = 3L * (256L * (long)hi + (long)lo + 1L);
bytesBuffered -= 3;
outPos = 0;
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
mode = 1; // Proceed to latch wait mode
}
else {
// Checksum didn't match; search resumes after magic word.
indexOut -= 3; // Rewind
}
} // else no header match. Resume at first mismatched byte.
bytesBuffered -= i;
}
}
if (mode == 1){
if(bytesRemaining > 0) {
if(bytesBuffered > 0) {
if (outPos < sizeof(leds))
ledsRaw[outPos++] = buffer[indexOut++]; // Issue next byte
bytesBuffered--;
bytesRemaining--;
}
// If serial buffer is threatening to underrun, start
// introducing progressively longer pauses to allow more
// data to arrive (up to a point).
}
else {
// End of data -- issue latch:
startTime = micros();
mode = 0; // Begin next header search
FastLED.show();
}
}
} // end for(;;)
}