Skip to content

Commit 9433b27

Browse files
committed
Add system calls to Marshaller
1 parent fa5b3d6 commit 9433b27

File tree

3 files changed

+78
-16
lines changed

3 files changed

+78
-16
lines changed

Firmata.cpp

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,7 @@ void FirmataClass::begin(Stream &s)
146146
*/
147147
void FirmataClass::printVersion(void)
148148
{
149-
FirmataStream->write(REPORT_VERSION);
150-
FirmataStream->write(FIRMATA_PROTOCOL_MAJOR_VERSION);
151-
FirmataStream->write(FIRMATA_PROTOCOL_MINOR_VERSION);
149+
marshaller.sendVersion(FIRMATA_PROTOCOL_MAJOR_VERSION, FIRMATA_PROTOCOL_MINOR_VERSION);
152150
}
153151

154152
/**
@@ -188,17 +186,8 @@ void FirmataClass::disableBlinkVersion()
188186
*/
189187
void FirmataClass::printFirmwareVersion(void)
190188
{
191-
byte i;
192-
193189
if (firmwareVersionCount) { // make sure that the name has been set before reporting
194-
startSysex();
195-
FirmataStream->write(REPORT_FIRMWARE);
196-
FirmataStream->write(firmwareVersionVector[0]); // major version number
197-
FirmataStream->write(firmwareVersionVector[1]); // minor version number
198-
for (i = 2; i < firmwareVersionCount; ++i) {
199-
sendValueAsTwo7bitBytes(firmwareVersionVector[i]);
200-
}
201-
endSysex();
190+
marshaller.sendFirmwareVersion(static_cast<uint8_t>(firmwareVersionVector[0]), static_cast<uint8_t>(firmwareVersionVector[1]), (firmwareVersionCount - 2), reinterpret_cast<uint8_t *>(&firmwareVersionVector[2]));
202191
}
203192
}
204193

FirmataMarshaller.cpp

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,28 @@ void FirmataMarshaller::end(void)
159159
//* Output Stream Handling
160160
//******************************************************************************
161161

162+
/**
163+
* Query the target's firmware name and version
164+
*/
165+
void FirmataMarshaller::queryFirmwareVersion(void)
166+
const
167+
{
168+
if ( (Stream *)NULL == FirmataStream ) { return; }
169+
FirmataStream->write(START_SYSEX);
170+
FirmataStream->write(REPORT_FIRMWARE);
171+
FirmataStream->write(END_SYSEX);
172+
}
173+
174+
/**
175+
* Query the target's Firmata protocol version
176+
*/
177+
void FirmataMarshaller::queryVersion(void)
178+
const
179+
{
180+
if ( (Stream *)NULL == FirmataStream ) { return; }
181+
FirmataStream->write(REPORT_VERSION);
182+
}
183+
162184
/**
163185
* Halt the stream of analog readings from the Firmata host application. The range of pins is
164186
* limited to [0..15] when using the REPORT_ANALOG. The maximum result of the REPORT_ANALOG is limited to 14 bits
@@ -224,7 +246,6 @@ void FirmataMarshaller::sendAnalog(uint8_t pin, uint16_t value)
224246
const
225247
{
226248
if ( (Stream *)NULL == FirmataStream ) { return; }
227-
228249
if ( (0xF >= pin) && (0x3FFF >= value) ) {
229250
FirmataStream->write(ANALOG_MESSAGE|pin);
230251
transformByteStreamToMessageBytes(sizeof(value), reinterpret_cast<uint8_t *>(&value), sizeof(value));
@@ -285,7 +306,43 @@ const
285306
FirmataStream->write(DIGITAL_MESSAGE | (portNumber & 0xF));
286307
// Tx bits 0-6 (protocol v1 and higher)
287308
// Tx bits 7-13 (bit 7 only for protocol v2 and higher)
288-
transformByteStreamToMessageBytes(sizeof(portData), reinterpret_cast<uint8_t *>(&portData), 2);
309+
transformByteStreamToMessageBytes(sizeof(portData), reinterpret_cast<uint8_t *>(&portData), sizeof(portData));
310+
}
311+
312+
/**
313+
* Sends the firmware name and version to the Firmata host application.
314+
* @param major The major verison number
315+
* @param minor The minor version number
316+
* @param bytec The length of the firmware name
317+
* @param bytev The firmware name array
318+
*/
319+
void FirmataMarshaller::sendFirmwareVersion(uint8_t major, uint8_t minor, size_t bytec, uint8_t *bytev)
320+
const
321+
{
322+
if ( (Stream *)NULL == FirmataStream ) { return; }
323+
size_t i;
324+
FirmataStream->write(START_SYSEX);
325+
FirmataStream->write(REPORT_FIRMWARE);
326+
FirmataStream->write(major);
327+
FirmataStream->write(minor);
328+
for (i = 0; i < bytec; ++i) {
329+
transformByteStreamToMessageBytes(sizeof(bytev[i]), reinterpret_cast<uint8_t *>(&bytev[i]), sizeof(bytev[i]));
330+
}
331+
FirmataStream->write(END_SYSEX);
332+
}
333+
334+
/**
335+
* Send the Firmata protocol version to the Firmata host application.
336+
* @param major The major verison number
337+
* @param minor The minor version number
338+
*/
339+
void FirmataMarshaller::sendVersion(uint8_t major, uint8_t minor)
340+
const
341+
{
342+
if ( (Stream *)NULL == FirmataStream ) { return; }
343+
FirmataStream->write(REPORT_VERSION);
344+
FirmataStream->write(major);
345+
FirmataStream->write(minor);
289346
}
290347

291348
/**
@@ -336,7 +393,7 @@ const
336393
FirmataStream->write(START_SYSEX);
337394
FirmataStream->write(command);
338395
for (i = 0; i < bytec; ++i) {
339-
transformByteStreamToMessageBytes(sizeof(bytev[i]), reinterpret_cast<uint8_t *>(&bytev[i]), 2);
396+
transformByteStreamToMessageBytes(sizeof(bytev[i]), reinterpret_cast<uint8_t *>(&bytev[i]), sizeof(bytev[i]));
340397
}
341398
FirmataStream->write(END_SYSEX);
342399
}
@@ -361,3 +418,14 @@ const
361418
{
362419
sendSysex(SAMPLING_INTERVAL, sizeof(interval_ms), reinterpret_cast<uint8_t *>(&interval_ms));
363420
}
421+
422+
/**
423+
* Perform a software reset on the target. For example, StandardFirmata.ino will initialize
424+
* everything to a known state and reset the parsing buffer.
425+
*/
426+
void FirmataMarshaller::systemReset(void)
427+
const
428+
{
429+
if ( (Stream *)NULL == FirmataStream ) { return; }
430+
FirmataStream->write(SYSTEM_RESET);
431+
}

FirmataMarshaller.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class FirmataMarshaller
3939
void end();
4040

4141
/* serial send handling */
42+
void queryFirmwareVersion(void) const;
43+
void queryVersion(void) const;
4244
void reportAnalogDisable(uint8_t pin) const;
4345
void reportAnalogEnable(uint8_t pin) const;
4446
void reportDigitalPortDisable(uint8_t portNumber) const;
@@ -48,11 +50,14 @@ class FirmataMarshaller
4850
void sendCapabilityQuery(void) const;
4951
void sendDigital(uint8_t pin, uint8_t value) const;
5052
void sendDigitalPort(uint8_t portNumber, uint16_t portData) const;
53+
void sendFirmwareVersion(uint8_t major, uint8_t minor, size_t bytec, uint8_t *bytev) const;
54+
void sendVersion(uint8_t major, uint8_t minor) const;
5155
void sendPinMode(uint8_t pin, uint8_t config) const;
5256
void sendPinStateQuery(uint8_t pin) const;
5357
void sendString(const char *string) const;
5458
void sendSysex(uint8_t command, size_t bytec, uint8_t *bytev) const;
5559
void setSamplingInterval(uint16_t interval_ms) const;
60+
void systemReset(void) const;
5661

5762
private:
5863
/* utility methods */

0 commit comments

Comments
 (0)