mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-04-21 12:31:19 +02:00
save current
This commit is contained in:
parent
943eaa0484
commit
f0b3f5dc16
119
IO_RSproto.cpp
119
IO_RSproto.cpp
@ -41,19 +41,25 @@ taskBuffer::~taskBuffer()
|
|||||||
// destructor
|
// destructor
|
||||||
}
|
}
|
||||||
|
|
||||||
void taskBuffer::doCommand(uint8_t *commandBuffer, int commandSize) {
|
void taskBuffer::doCommand(char *commandBuffer, int commandSize) {
|
||||||
for (taskBuffer * t=first;t;t=t->next) t->doCommand2(commandBuffer,commandSize);
|
for (taskBuffer * t=first;t;t=t->next) t->doCommand2(commandBuffer,commandSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taskBuffer::doCommand2(uint8_t *commandBuffer, int commandSize) {
|
void taskBuffer::doCommand2(char *commandBuffer, int commandSize) {
|
||||||
// process commands here to be sent
|
// process commands here to be sent
|
||||||
|
|
||||||
//_serial->begin(115200);
|
//_serial->begin(115200);
|
||||||
//ArduinoPins::fastWriteDigital(bus->_txPin, HIGH);
|
//ArduinoPins::fastWriteDigital(bus->_txPin, HIGH);
|
||||||
if (_txPin != -1) digitalWrite(_txPin,HIGH);
|
//int counter = 0;
|
||||||
serial->write(commandBuffer, 7);
|
//RSproto *bus = RSproto::findBus(0);
|
||||||
//serial->flush();
|
//RSprotonode *node = bus->findNode(commandSize);
|
||||||
if (_txPin != -1) digitalWrite(_txPin,LOW);
|
//while (node->resFlag == 0 && counter < 5) {
|
||||||
|
if (_txPin != -1) digitalWrite(_txPin,HIGH);
|
||||||
|
serial->print(commandBuffer);
|
||||||
|
if (_txPin != -1) digitalWrite(_txPin,LOW);
|
||||||
|
//counter++;
|
||||||
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void taskBuffer::init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin) {
|
void taskBuffer::init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin) {
|
||||||
@ -73,7 +79,7 @@ void taskBuffer::loop2() {
|
|||||||
while (serial->available()) {
|
while (serial->available()) {
|
||||||
char ch = serial->read();
|
char ch = serial->read();
|
||||||
if (!inCommandPayload) {
|
if (!inCommandPayload) {
|
||||||
if (ch == STARTBYTE) {
|
if (ch == '<') {
|
||||||
inCommandPayload = PAYLOAD_NORMAL;
|
inCommandPayload = PAYLOAD_NORMAL;
|
||||||
bufferLength = 0;
|
bufferLength = 0;
|
||||||
buffer[0] = '\0';
|
buffer[0] = '\0';
|
||||||
@ -94,7 +100,7 @@ void taskBuffer::loop2() {
|
|||||||
inCommandPayload++;
|
inCommandPayload++;
|
||||||
}
|
}
|
||||||
if (inCommandPayload == PAYLOAD_NORMAL) {
|
if (inCommandPayload == PAYLOAD_NORMAL) {
|
||||||
if (ch == ENDBYTE) {
|
if (ch == '>') {
|
||||||
buffer[bufferLength] = '\0';
|
buffer[bufferLength] = '\0';
|
||||||
parseRx(buffer);
|
parseRx(buffer);
|
||||||
inCommandPayload = PAYLOAD_FALSE;
|
inCommandPayload = PAYLOAD_FALSE;
|
||||||
@ -125,17 +131,33 @@ void taskBuffer::parseOne(uint8_t *buf) {
|
|||||||
while (buf[0] == '<' || buf[0] == ' ')
|
while (buf[0] == '<' || buf[0] == ' ')
|
||||||
buf++; // strip off any number of < or spaces
|
buf++; // strip off any number of < or spaces
|
||||||
|
|
||||||
uint8_t toNode = buf[0];
|
char curBuff[10];
|
||||||
|
byte outArray[25];
|
||||||
|
int chrCntr = 0;
|
||||||
|
int byteCntr = 0;
|
||||||
|
for (int i = 0; i< 200; i++) {
|
||||||
|
if (buf[i] == '\n') break;
|
||||||
|
else if (buf[i] == 0x20) {
|
||||||
|
chrCntr = 0;
|
||||||
|
sscanf(curBuff, "%d", &outArray[byteCntr]);
|
||||||
|
byteCntr++;
|
||||||
|
} else {
|
||||||
|
curBuff[chrCntr] = buffer[i];
|
||||||
|
chrCntr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t toNode = outArray[0];
|
||||||
if (toNode != 0) return; // not for master
|
if (toNode != 0) return; // not for master
|
||||||
uint8_t fromNode = buf[1];
|
uint8_t fromNode = outArray[1];
|
||||||
if (fromNode == 0) return; // why did out own data come round the ring back to us?
|
if (fromNode == 0) return; // why did out own data come round the ring back to us?
|
||||||
uint8_t opcode = buf[2];
|
uint8_t opcode = outArray[2];
|
||||||
RSproto *bus = RSproto::findBus(0);
|
RSproto *bus = RSproto::findBus(0);
|
||||||
RSprotonode *node = bus->findNode(fromNode);
|
RSprotonode *node = bus->findNode(fromNode);
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case EXIOPINS:
|
case EXIOPINS:
|
||||||
{node->_numDigitalPins = buf[3];
|
{node->_numDigitalPins = outArray[3];
|
||||||
node->_numAnaloguePins = buf[4];
|
node->_numAnaloguePins = outArray[4];
|
||||||
|
|
||||||
// See if we already have suitable buffers assigned
|
// See if we already have suitable buffers assigned
|
||||||
if (node->_numDigitalPins>0) {
|
if (node->_numDigitalPins>0) {
|
||||||
@ -182,15 +204,15 @@ void taskBuffer::parseOne(uint8_t *buf) {
|
|||||||
break;}
|
break;}
|
||||||
case EXIOINITA: {
|
case EXIOINITA: {
|
||||||
for (int i = 3; i < node->_numAnaloguePins; i++) {
|
for (int i = 3; i < node->_numAnaloguePins; i++) {
|
||||||
node->_analoguePinMap[i] = buf[i];
|
node->_analoguePinMap[i] = outArray[i];
|
||||||
}
|
}
|
||||||
node->resFlag = 1;
|
node->resFlag = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EXIOVER: {
|
case EXIOVER: {
|
||||||
node->_majorVer = buf[3];
|
node->_majorVer = outArray[3];
|
||||||
node->_minorVer = buf[4];
|
node->_minorVer = outArray[4];
|
||||||
node->_patchVer = buf[5];
|
node->_patchVer = outArray[5];
|
||||||
node->resFlag = 1;
|
node->resFlag = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -204,14 +226,14 @@ void taskBuffer::parseOne(uint8_t *buf) {
|
|||||||
}
|
}
|
||||||
case EXIORDD: {
|
case EXIORDD: {
|
||||||
for (int i = 3; i < (node->_numDigitalPins+7)/8; i++) {
|
for (int i = 3; i < (node->_numDigitalPins+7)/8; i++) {
|
||||||
node->_digitalInputStates[i-3] = buf[i];
|
node->_digitalInputStates[i-3] = outArray[i];
|
||||||
}
|
}
|
||||||
node->resFlag = 1;
|
node->resFlag = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EXIORDAN: {
|
case EXIORDAN: {
|
||||||
for (int i = 3; i < node->_numAnaloguePins*2; i++) {
|
for (int i = 3; i < node->_numAnaloguePins*2; i++) {
|
||||||
node->_analogueInputBuffer[i-3] = buf[i];
|
node->_analogueInputBuffer[i-3] = outArray[i];
|
||||||
}
|
}
|
||||||
node->resFlag = 1;
|
node->resFlag = 1;
|
||||||
break;
|
break;
|
||||||
@ -299,9 +321,10 @@ bool RSprotonode::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
|
|||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
|
|
||||||
uint8_t pullup = (uint8_t)params[0];
|
uint8_t pullup = (uint8_t)params[0];
|
||||||
uint8_t outBuffer[] = {0xFD, _nodeID, 0, EXIODPUP, (uint8_t)pin, pullup, 0xFE};
|
char buff[25];
|
||||||
|
sprintf(buff, "<%i %i %i %i %i>", _nodeID, 0, EXIODPUP, pin, pullup);
|
||||||
unsigned long startMillis = millis();
|
unsigned long startMillis = millis();
|
||||||
task->doCommand(outBuffer,7);
|
task->doCommand(buff,_nodeID);
|
||||||
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
||||||
if (resFlag != 1) {
|
if (resFlag != 1) {
|
||||||
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin);
|
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin);
|
||||||
@ -314,9 +337,10 @@ bool RSprotonode::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
|
|||||||
int RSprotonode::_configureAnalogIn(VPIN vpin) {
|
int RSprotonode::_configureAnalogIn(VPIN vpin) {
|
||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
//RSproto *mainrs = RSproto::findBus(_busNo);
|
//RSproto *mainrs = RSproto::findBus(_busNo);
|
||||||
uint8_t commandBuffer[] = {0xFD, _nodeID, 0, EXIOENAN, (uint8_t) pin, 0xFE};
|
char buff[25];
|
||||||
|
sprintf(buff, "<%i %i %i %i %i %i>", _nodeID, 0, EXIOENAN, pin, _firstVpin);
|
||||||
unsigned long startMillis = millis();
|
unsigned long startMillis = millis();
|
||||||
task->doCommand(commandBuffer, 6);
|
task->doCommand(buff, _nodeID);
|
||||||
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
||||||
if (resFlag != 1) {
|
if (resFlag != 1) {
|
||||||
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin);
|
DIAG(F("EX-IOExpander485 Vpin %u cannot be used as a digital input pin"), pin);
|
||||||
@ -327,33 +351,26 @@ bool RSprotonode::_configure(VPIN vpin, ConfigTypeEnum configType, int paramCoun
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RSprotonode::_begin() {
|
void RSprotonode::_begin() {
|
||||||
uint8_t commandBuffer[] = {0xFD, _nodeID, 0, EXIOINIT, (uint8_t)_nPins, (uint8_t)(_firstVpin & 0xFF), (uint8_t)(_firstVpin >> 8), 0xFE};
|
char buff[25];
|
||||||
|
sprintf(buff, "<%i %i %i %i %i %i %i>", _nodeID, 0, EXIOINIT, _nPins, (_firstVpin & 0xFF), (_firstVpin >> 8));
|
||||||
unsigned long startMillis = millis();
|
unsigned long startMillis = millis();
|
||||||
task->doCommand(commandBuffer,8);
|
task->doCommand(buff,_nodeID);
|
||||||
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
|
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
|
||||||
if (resFlag != 1) {
|
if (resFlag != 1) {
|
||||||
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINIT"), _nodeID);
|
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINIT"), _nodeID);
|
||||||
}
|
}
|
||||||
resFlag = 0;
|
resFlag = 0;
|
||||||
commandBuffer[0] = 0xFD;
|
sprintf(buff, "<%i %i %i>", _nodeID, 0, EXIOINITA);
|
||||||
commandBuffer[1] = _nodeID;
|
|
||||||
commandBuffer[2] = 0;
|
|
||||||
commandBuffer[3] = EXIOINITA;
|
|
||||||
commandBuffer[4] = 0xFE;
|
|
||||||
startMillis = millis();
|
startMillis = millis();
|
||||||
task->doCommand(commandBuffer,5);
|
task->doCommand(buff,_nodeID);
|
||||||
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
|
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
|
||||||
if (resFlag != 1) {
|
if (resFlag != 1) {
|
||||||
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINITA"), _nodeID);
|
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOINITA"), _nodeID);
|
||||||
}
|
}
|
||||||
resFlag = 0;
|
resFlag = 0;
|
||||||
commandBuffer[0] = 0xFD;
|
sprintf(buff, "<%i %i %i>", _nodeID, 0, EXIOVER);
|
||||||
commandBuffer[1] = _nodeID;
|
|
||||||
commandBuffer[2] = 0;
|
|
||||||
commandBuffer[3] = EXIOVER;
|
|
||||||
commandBuffer[4] = 0xFE;
|
|
||||||
startMillis = millis();
|
startMillis = millis();
|
||||||
task->doCommand(commandBuffer,3);
|
task->doCommand(buff,_nodeID);
|
||||||
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
|
while (resFlag == 0 && millis() - startMillis < 1000); // blocking for now
|
||||||
if (resFlag != 1) {
|
if (resFlag != 1) {
|
||||||
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
|
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
|
||||||
@ -376,16 +393,10 @@ int RSprotonode::_read(VPIN vpin) {
|
|||||||
void RSprotonode::_write(VPIN vpin, int value) {
|
void RSprotonode::_write(VPIN vpin, int value) {
|
||||||
if (_deviceState == DEVSTATE_FAILED) return;
|
if (_deviceState == DEVSTATE_FAILED) return;
|
||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
uint8_t digitalOutBuffer[7];
|
char buff[25];
|
||||||
digitalOutBuffer[0] = 0xFD;
|
sprintf(buff, "<%i %i %i %i %i>", _nodeID, 0, EXIOWRD, pin, value);
|
||||||
digitalOutBuffer[1] = _nodeID;
|
|
||||||
digitalOutBuffer[2] = 0;
|
|
||||||
digitalOutBuffer[3] = EXIOWRD;
|
|
||||||
digitalOutBuffer[4] = (uint8_t) pin;
|
|
||||||
digitalOutBuffer[5] = (uint8_t) value;
|
|
||||||
digitalOutBuffer[6] = 0xFE;
|
|
||||||
unsigned long startMillis = millis();
|
unsigned long startMillis = millis();
|
||||||
task->doCommand(digitalOutBuffer,7);
|
task->doCommand(buff,_nodeID);
|
||||||
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
||||||
if (resFlag != 1) {
|
if (resFlag != 1) {
|
||||||
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
|
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
|
||||||
@ -407,21 +418,11 @@ void RSprotonode::_write(VPIN vpin, int value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RSprotonode::_writeAnalogue(VPIN vpin, int value, uint8_t profile, uint16_t duration) {
|
void RSprotonode::_writeAnalogue(VPIN vpin, int value, uint8_t profile, uint16_t duration) {
|
||||||
uint8_t servoBuffer[11];
|
|
||||||
int pin = vpin - _firstVpin;
|
int pin = vpin - _firstVpin;
|
||||||
servoBuffer[0] = 0xFD;
|
char buff[25];
|
||||||
servoBuffer[1] = _nodeID;
|
sprintf(buff, "<%i %i %i %i %i %i %i>", _nodeID, 0, EXIOWRAN, pin, value, profile, duration);
|
||||||
servoBuffer[2] = 0;
|
|
||||||
servoBuffer[3] = EXIOWRAN;
|
|
||||||
servoBuffer[4] = (uint8_t) pin;
|
|
||||||
servoBuffer[5] = (uint8_t) value & 0xFF;
|
|
||||||
servoBuffer[6] = (uint8_t) value >> 8;
|
|
||||||
servoBuffer[7] = (uint8_t) profile;
|
|
||||||
servoBuffer[8] = (uint8_t) duration & 0xFF;
|
|
||||||
servoBuffer[9] = (uint8_t) duration >> 8;
|
|
||||||
servoBuffer[10] = 0xFE;
|
|
||||||
unsigned long startMillis = millis();
|
unsigned long startMillis = millis();
|
||||||
task->doCommand(servoBuffer,11);
|
task->doCommand(buff,_nodeID);
|
||||||
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
while (resFlag == 0 && millis() - startMillis < 500); // blocking for now
|
||||||
if (resFlag != 1) {
|
if (resFlag != 1) {
|
||||||
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
|
DIAG(F("EX-IOExpander485 Node:%d ERROR EXIOVER"), _nodeID);
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
*
|
*
|
||||||
* firstVPIN = first vpin in block allocated to this device
|
* firstVPIN = first vpin in block allocated to this device
|
||||||
* numVPINs = number of vpins
|
* numVPINs = number of vpins
|
||||||
* nodeID = 1-252
|
* nodeID = 1-251
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IO_RS485_H
|
#ifndef IO_RS485_H
|
||||||
@ -111,14 +111,14 @@ static taskBuffer *first;
|
|||||||
STARTBYTE = 0xFD,
|
STARTBYTE = 0xFD,
|
||||||
ENDBYTE = 0xFE,
|
ENDBYTE = 0xFE,
|
||||||
};
|
};
|
||||||
void doCommand2(uint8_t *commandBuffer=NULL, int commandSize=0);
|
void doCommand2(char *commandBuffer, int commandSize=0);
|
||||||
void loop2();
|
void loop2();
|
||||||
void parseRx(uint8_t *buf);
|
void parseRx(uint8_t *buf);
|
||||||
void parseOne(uint8_t *buf);
|
void parseOne(uint8_t *buf);
|
||||||
public:
|
public:
|
||||||
taskBuffer(Stream * myserial);
|
taskBuffer(Stream * myserial);
|
||||||
~taskBuffer();
|
~taskBuffer();
|
||||||
static void doCommand(uint8_t *commandBuffer=NULL, int commandSize=0);
|
static void doCommand(char *commandBuffer, int commandSize=0);
|
||||||
static void init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin=-1);
|
static void init(HardwareSerial &hwSerial, unsigned long baud, int8_t txPin=-1);
|
||||||
static void loop();
|
static void loop();
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user