Skip to content

Commit 30fc4be

Browse files
commented out unsetFirmwareVersion in Firmata.cpp and commented out test in firmata_test.ino. Renamed pin13strobe to strobeBlinkPin. Blink version only when using default hardware serial.
2 parents 57bbd49 + ec7aad4 commit 30fc4be

File tree

5 files changed

+179
-18
lines changed

5 files changed

+179
-18
lines changed

Firmata.cpp

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ void FirmataClass::endSysex(void)
4949
FirmataClass::FirmataClass()
5050
{
5151
firmwareVersionCount = 0;
52-
init();
52+
firmwareVersionVector = 0;
53+
systemReset();
5354
}
5455

5556
//******************************************************************************
@@ -67,13 +68,13 @@ void FirmataClass::begin(long speed)
6768
{
6869
Serial.begin(speed);
6970
begin(Serial);
71+
blinkVersion();
7072
}
7173

7274
/* begin method for overriding default stream */
7375
void FirmataClass::begin(Stream &s)
7476
{
7577
FirmataSerial = &s;
76-
blinkVersion();
7778
printVersion();
7879
printFirmwareVersion();
7980
}
@@ -89,9 +90,9 @@ void FirmataClass::blinkVersion(void)
8990
{
9091
// flash the pin with the protocol version
9192
pinMode(VERSION_BLINK_PIN,OUTPUT);
92-
pin13strobe(FIRMATA_MAJOR_VERSION, 40, 210);
93+
strobeBlinkPin(FIRMATA_MAJOR_VERSION, 40, 210);
9394
delay(250);
94-
pin13strobe(FIRMATA_MINOR_VERSION, 40, 210);
95+
strobeBlinkPin(FIRMATA_MINOR_VERSION, 40, 210);
9596
delay(125);
9697
}
9798

@@ -126,6 +127,9 @@ void FirmataClass::setFirmwareNameAndVersion(const char *name, byte major, byte
126127
firmwareVersionCount = strlen(name) + 2;
127128
filename = name;
128129
}
130+
131+
free(firmwareVersionVector);
132+
129133
firmwareVersionVector = (byte *) malloc(firmwareVersionCount);
130134
firmwareVersionVector[firmwareVersionCount] = 0;
131135
firmwareVersionVector[0] = major;
@@ -136,6 +140,14 @@ void FirmataClass::setFirmwareNameAndVersion(const char *name, byte major, byte
136140
// (char)major, (char)minor, firmwareVersionVector);
137141
}
138142

143+
// this method is only used for unit testing
144+
// void FirmataClass::unsetFirmwareVersion()
145+
// {
146+
// firmwareVersionCount = 0;
147+
// free(firmwareVersionVector);
148+
// firmwareVersionVector = 0;
149+
// }
150+
139151
//------------------------------------------------------------------------------
140152
// Serial Receive Handling
141153

@@ -179,7 +191,7 @@ void FirmataClass::processInput(void)
179191
int command;
180192

181193
// TODO make sure it handles -1 properly
182-
194+
183195
if (parsingSysex) {
184196
if(inputData == END_SYSEX) {
185197
//stop sysex byte
@@ -400,8 +412,10 @@ void FirmataClass::detach(byte command)
400412
//* Private Methods
401413
//******************************************************************************
402414

403-
// initialize to a known state
404-
void FirmataClass::init(void)
415+
416+
417+
// resets the system state upon a SYSTEM_RESET message from the host software
418+
void FirmataClass::systemReset(void)
405419
{
406420
byte i;
407421

@@ -414,24 +428,19 @@ void FirmataClass::init(void)
414428
}
415429

416430
parsingSysex = false;
417-
sysexBytesRead = 0;
418-
}
419-
420-
// resets the system state upon a SYSTEM_RESET message from the host software
421-
void FirmataClass::systemReset(void)
422-
{
423-
init();
431+
sysexBytesRead = 0;
424432

425433
if(currentSystemResetCallback)
426434
(*currentSystemResetCallback)();
427435

428-
FirmataSerial->flush();
436+
//flush(); //TODO uncomment when Firmata is a subclass of HardwareSerial
429437
}
430438

431439

440+
432441
// =============================================================================
433442
// used for flashing the pin for the version number
434-
void FirmataClass::pin13strobe(int count, int onInterval, int offInterval)
443+
void FirmataClass::strobeBlinkPin(int count, int onInterval, int offInterval)
435444
{
436445
byte i;
437446
pinMode(VERSION_BLINK_PIN, OUTPUT);

Firmata.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class FirmataClass
9898
void printFirmwareVersion(void);
9999
//void setFirmwareVersion(byte major, byte minor); // see macro below
100100
void setFirmwareNameAndVersion(const char *name, byte major, byte minor);
101+
//void unsetFirmwareVersion(); // only used for unit test
101102
/* serial receive handling */
102103
int available(void);
103104
void processInput(void);
@@ -140,10 +141,9 @@ class FirmataClass
140141
sysexCallbackFunction currentSysexCallback;
141142

142143
/* private methods ------------------------------ */
143-
void init(void);
144144
void processSysexMessage(void);
145145
void systemReset(void);
146-
void pin13strobe(int count, int onInterval, int offInterval);
146+
void strobeBlinkPin(int count, int onInterval, int offInterval);
147147
void sendValueAsTwo7bitBytes(int value);
148148
void startSysex(void);
149149
void endSysex(void);

test/readme.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#Testing Firmata
2+
3+
TO DO: overview of firmata testing process.
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#include <ArduinoUnit.h>
2+
#include <Firmata.h>
3+
4+
TestSuite suite;
5+
6+
void setup()
7+
{
8+
Serial.begin(9600);
9+
}
10+
11+
void loop()
12+
{
13+
suite.run();
14+
}
15+
16+
void assertStringsEqual(Test& __test__, const char* expected, const String& actual)
17+
{
18+
size_t expectedLength = strlen(expected);
19+
assertEquals(expectedLength, actual.length());
20+
for (size_t i = 0; i < expectedLength; i++)
21+
{
22+
assertEquals(expected[i], actual[i]);
23+
}
24+
}
25+
26+
// test(setFirmwareVersionDoesNotLeakMemory)
27+
// {
28+
// Firmata.setFirmwareVersion(1, 0);
29+
// int initialMemory = freeMemory();
30+
31+
// Firmata.setFirmwareVersion(1, 0);
32+
33+
// assertEquals(0, initialMemory - freeMemory());
34+
35+
// Firmata.unsetFirmwareVersion();
36+
// }
37+
38+
test(beginPrintsVersion)
39+
{
40+
FakeStream stream;
41+
42+
Firmata.begin(stream);
43+
44+
char expected[] =
45+
{
46+
REPORT_VERSION,
47+
FIRMATA_MAJOR_VERSION,
48+
FIRMATA_MINOR_VERSION,
49+
0
50+
};
51+
assertStringsEqual(__test__, expected, stream.bytesWritten());
52+
}
53+
54+
void processMessage(const byte* message, size_t length)
55+
{
56+
FakeStream stream;
57+
Firmata.begin(stream);
58+
59+
for (size_t i = 0; i < length; i++)
60+
{
61+
stream.nextByte(message[i]);
62+
Firmata.processInput();
63+
}
64+
}
65+
66+
byte _digitalPort;
67+
int _digitalPortValue;
68+
void writeToDigitalPort(byte port, int value)
69+
{
70+
_digitalPort = port;
71+
_digitalPortValue = value;
72+
}
73+
74+
void setupDigitalPort() {
75+
_digitalPort = 0;
76+
_digitalPortValue = 0;
77+
}
78+
79+
test(processWriteDigital_0)
80+
{
81+
setupDigitalPort();
82+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
83+
84+
byte message[] = { DIGITAL_MESSAGE, 0, 0 };
85+
processMessage(message, 3);
86+
87+
assertEquals(0, _digitalPortValue);
88+
}
89+
90+
test(processWriteDigital_127)
91+
{
92+
setupDigitalPort();
93+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
94+
95+
byte message[] = { DIGITAL_MESSAGE, 127, 0 };
96+
processMessage(message, 3);
97+
98+
assertEquals(127, _digitalPortValue);
99+
}
100+
101+
test(processWriteDigital_128)
102+
{
103+
setupDigitalPort();
104+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
105+
106+
byte message[] = { DIGITAL_MESSAGE, 0, 1 };
107+
processMessage(message, 3);
108+
109+
assertEquals(128, _digitalPortValue);
110+
}
111+
112+
test(processWriteLargestDigitalValue)
113+
{
114+
setupDigitalPort();
115+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
116+
117+
byte message[] = { DIGITAL_MESSAGE, 0x7F, 0x7F };
118+
processMessage(message, 3);
119+
120+
// Maximum of 14 bits can be set (B0011111111111111)
121+
assertEquals(0x3FFF, _digitalPortValue);
122+
}
123+
124+
test(defaultDigitalWritePortIsZero)
125+
{
126+
setupDigitalPort();
127+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
128+
129+
byte message[] = { DIGITAL_MESSAGE, 0, 0 };
130+
processMessage(message, 3);
131+
132+
assertEquals(0, _digitalPort);
133+
}
134+
135+
test(specifiedDigitalWritePort)
136+
{
137+
setupDigitalPort();
138+
Firmata.attach(DIGITAL_MESSAGE, writeToDigitalPort);
139+
140+
byte message[] = { DIGITAL_MESSAGE + 1, 0, 0 };
141+
processMessage(message, 3);
142+
143+
assertEquals(1, _digitalPort);
144+
}
145+

test/unit/readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#Firmata Unit Tests
2+
3+
TO DO: instructions on running unit tests and creating new tests for new
4+
features.

0 commit comments

Comments
 (0)