2021-12-05 13:08:59 +01:00
|
|
|
/*
|
2022-01-07 02:28:35 +01:00
|
|
|
* © 2021 Chris Harlow
|
2022-01-15 17:24:18 +01:00
|
|
|
* © 2022 Harald Barth
|
2022-01-07 02:28:35 +01:00
|
|
|
* All rights reserved.
|
2021-12-05 13:08:59 +01:00
|
|
|
*
|
|
|
|
* This file is part of DCC++EX
|
|
|
|
*
|
|
|
|
* This is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* It is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with CommandStation. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "SerialManager.h"
|
2022-01-15 17:24:18 +01:00
|
|
|
#include "DCCEXParser.h"
|
|
|
|
SerialManager * SerialManager::first=NULL;
|
2021-12-05 13:08:59 +01:00
|
|
|
|
2022-01-15 17:24:18 +01:00
|
|
|
SerialManager::SerialManager(Stream * myserial) {
|
|
|
|
serial=myserial;
|
|
|
|
next=first;
|
|
|
|
first=this;
|
|
|
|
bufferLength=0;
|
|
|
|
inCommandPayload=false;
|
|
|
|
}
|
2021-12-05 13:08:59 +01:00
|
|
|
|
|
|
|
void SerialManager::init() {
|
2022-01-15 17:24:18 +01:00
|
|
|
while (!Serial && millis() < 5000); // wait max 5s for Serial to start
|
|
|
|
Serial.begin(115200);
|
|
|
|
new SerialManager(&Serial);
|
2021-12-05 13:08:59 +01:00
|
|
|
#ifdef SERIAL3_COMMANDS
|
2022-01-15 17:24:18 +01:00
|
|
|
Serial3.begin(115200);
|
|
|
|
new SerialManager(&Serial3);
|
2021-12-05 13:08:59 +01:00
|
|
|
#endif
|
|
|
|
#ifdef SERIAL2_COMMANDS
|
2022-01-15 17:24:18 +01:00
|
|
|
Serial2.begin(115200);
|
|
|
|
new SerialManager(&Serial2);
|
2021-12-05 13:08:59 +01:00
|
|
|
#endif
|
|
|
|
#ifdef SERIAL1_COMMANDS
|
2022-01-15 17:24:18 +01:00
|
|
|
Serial1.begin(115200);
|
|
|
|
new SerialManager(&Serial1);
|
2021-12-05 13:08:59 +01:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void SerialManager::broadcast(RingStream * ring) {
|
2021-12-07 01:24:48 +01:00
|
|
|
for (SerialManager * s=first;s;s=s->next) s->broadcast2(ring);
|
2021-12-05 13:08:59 +01:00
|
|
|
}
|
|
|
|
void SerialManager::broadcast2(RingStream * ring) {
|
|
|
|
ring->printBuffer(serial);
|
|
|
|
}
|
|
|
|
|
|
|
|
void SerialManager::loop() {
|
2021-12-07 01:24:48 +01:00
|
|
|
for (SerialManager * s=first;s;s=s->next) s->loop2();
|
2021-12-05 13:08:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void SerialManager::loop2() {
|
|
|
|
while (serial->available()) {
|
|
|
|
char ch = serial->read();
|
|
|
|
if (ch == '<') {
|
|
|
|
inCommandPayload = true;
|
|
|
|
bufferLength = 0;
|
|
|
|
buffer[0] = '\0';
|
|
|
|
}
|
|
|
|
else if (ch == '>') {
|
|
|
|
buffer[bufferLength] = '\0';
|
|
|
|
DCCEXParser::parse(serial, buffer, NULL);
|
|
|
|
inCommandPayload = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (inCommandPayload) {
|
|
|
|
if (bufferLength < (COMMAND_BUFFER_SIZE-1)) buffer[bufferLength++] = ch;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-07 02:28:35 +01:00
|
|
|
}
|