Skip to content

Commit 7e7118c

Browse files
move serial defines and utility functions to utility file
1 parent 3120222 commit 7e7118c

File tree

2 files changed

+135
-92
lines changed

2 files changed

+135
-92
lines changed

examples/StandardFirmata/StandardFirmata.ino

Lines changed: 18 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -25,44 +25,14 @@
2525

2626
#include <Servo.h>
2727
#include <Wire.h>
28+
#include <ArduinoUnit.h>
29+
#include <Firmata.h>
30+
2831
// SoftwareSerial is only supported for AVR-based boards
2932
#if defined(ARDUINO_ARCH_AVR)
3033
#include <SoftwareSerial.h>
3134
#endif
32-
#include <ArduinoUnit.h>
33-
#include <Firmata.h>
34-
35-
#define HW_SERIAL0 0x00
36-
#define HW_SERIAL1 0x01
37-
#define HW_SERIAL2 0x02
38-
#define HW_SERIAL3 0x03
39-
40-
#define SW_SERIAL0 0x08
41-
#define SW_SERIAL1 0x09
42-
#define SW_SERIAL2 0x0A
43-
#define SW_SERIAL3 0x0B
44-
45-
// map configuration query response resolution value to serial pin type
46-
#define CONFIG_RX1 0x02
47-
#define CONFIG_TX1 0x03
48-
#define CONFIG_RX2 0x04
49-
#define CONFIG_TX2 0x05
50-
#define CONFIG_RX3 0x06
51-
#define CONFIG_TX3 0x07
52-
53-
#define SERIAL_CONFIG 0x10
54-
#define SERIAL_WRITE 0x20
55-
#define SERIAL_READ 0x30
56-
#define SERIAL_REPLY 0x40
57-
#define SERIAL_CLOSE 0x50
58-
#define SERIAL_FLUSH 0x60
59-
#define SERIAL_LISTEN 0x70
60-
#define SERIAL_READ_CONTINUOUSLY 0x00
61-
#define SERIAL_STOP_READING 0x01
62-
#define SERIAL_MODE_MASK 0xF0
63-
#define SERIAL_PORT_ID_MASK 0x0F
64-
#define MAX_SERIAL_PORTS 8
65-
35+
#include "utility/serialUtils.h"
6636

6737
#define I2C_WRITE B00000000
6838
#define I2C_READ B00001000
@@ -134,7 +104,6 @@ boolean isResetting = false;
134104

135105
int memCheckCounter = 0;
136106
char buffer[20];
137-
char debugBuffer[50];
138107

139108
/* utility functions */
140109
void wireWrite(byte data)
@@ -256,57 +225,6 @@ void checkSerial()
256225
}
257226
}
258227

259-
/*
260-
* Return the serial serial pin type (RX1, TX1, RX2, TX2, etc) for the specified pin
261-
*/
262-
byte getSerialPinType(byte pin) {
263-
#if defined(PIN_SERIAL1_RX)
264-
if (pin == PIN_SERIAL1_RX) return CONFIG_RX1;
265-
if (pin == PIN_SERIAL1_TX) return CONFIG_TX1;
266-
#endif
267-
#if defined(PIN_SERIAL2_RX)
268-
if (pin == PIN_SERIAL2_RX) return CONFIG_RX2;
269-
if (pin == PIN_SERIAL2_TX) return CONFIG_TX2;
270-
#endif
271-
#if defined(PIN_SERIAL3_RX)
272-
if (pin == PIN_SERIAL3_RX) return CONFIG_RX3;
273-
if (pin == PIN_SERIAL3_TX) return CONFIG_TX3;
274-
#endif
275-
return 0;
276-
}
277-
278-
byte configHWSerialPins(byte portId) {
279-
byte rxPin, txPin;
280-
switch (portId) {
281-
#if defined(PIN_SERIAL1_RX)
282-
case HW_SERIAL1:
283-
rxPin = PIN_SERIAL1_RX;
284-
txPin = PIN_SERIAL1_TX;
285-
break;
286-
#endif
287-
#if defined(PIN_SERIAL2_RX)
288-
case HW_SERIAL2:
289-
rxPin = PIN_SERIAL2_RX;
290-
txPin = PIN_SERIAL2_TX;
291-
break;
292-
#endif
293-
#if defined(PIN_SERIAL3_RX)
294-
case HW_SERIAL3:
295-
rxPin = PIN_SERIAL3_RX;
296-
txPin = PIN_SERIAL3_TX;
297-
break;
298-
#endif
299-
default:
300-
return 0;
301-
}
302-
setPinModeCallback(rxPin, MODE_SERIAL);
303-
setPinModeCallback(txPin, MODE_SERIAL);
304-
305-
// Fixes an issue where some serial devices would not work properly with Arduino Due
306-
// because all Arduino pins are set to OUTPUT by default in StandardFirmata.
307-
pinMode(rxPin, INPUT);
308-
}
309-
310228
void attachServo(byte pin, int minPulse, int maxPulse)
311229
{
312230
if (servoCount < MAX_SERVOS) {
@@ -804,6 +722,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
804722
{
805723
long baud = (long)argv[1] | ((long)argv[2] << 7) | ((long)argv[3] << 14);
806724
byte txPin, rxPin;
725+
serial_pins pins;
807726

808727
serialBytesToRead[portId] = (int)argv[4] | ((int)argv[5] << 7);
809728

@@ -815,7 +734,14 @@ void sysexCallback(byte command, byte argc, byte *argv)
815734
if (portId < 8) {
816735
serialPort = getPortFromId(portId);
817736
if (serialPort != NULL) {
818-
configHWSerialPins(portId);
737+
pins = getSerialPinNumbers(portId);
738+
if (pins.rx != 0 && pins.tx != 0) {
739+
setPinModeCallback(pins.rx, MODE_SERIAL);
740+
setPinModeCallback(pins.tx, MODE_SERIAL);
741+
// Fixes an issue where some serial devices would not work properly with Arduino Due
742+
// because all Arduino pins are set to OUTPUT by default in StandardFirmata.
743+
pinMode(pins.rx, INPUT);
744+
}
819745
((HardwareSerial*)serialPort)->begin(baud);
820746
}
821747
} else {
@@ -863,7 +789,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
863789
data = argv[i] + (argv[i + 1] << 7);
864790
serialPort->write(data);
865791
}
866-
break;
792+
break; // SERIAL_WRITE
867793
}
868794
case SERIAL_READ:
869795
if (argv[1] == SERIAL_READ_CONTINUOUSLY) {
@@ -892,7 +818,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
892818
serialIndex--;
893819
}
894820
}
895-
break;
821+
break; // SERIAL_READ
896822
case SERIAL_CLOSE:
897823
serialPort = getPortFromId(portId);
898824
if (serialPort != NULL) {
@@ -908,13 +834,13 @@ void sysexCallback(byte command, byte argc, byte *argv)
908834
#endif
909835
}
910836
}
911-
break;
837+
break; // SERIAL_CLOSE
912838
case SERIAL_FLUSH:
913839
serialPort = getPortFromId(portId);
914840
if (serialPort != NULL) {
915841
getPortFromId(portId)->flush();
916842
}
917-
break;
843+
break; // SERIAL_FLUSH
918844
#if defined(SoftwareSerial_h)
919845
case SERIAL_LISTEN:
920846
// can only call listen() on software serial ports
@@ -924,7 +850,7 @@ void sysexCallback(byte command, byte argc, byte *argv)
924850
((SoftwareSerial*)serialPort)->listen();
925851
}
926852
}
927-
break;
853+
break; // SERIAL_LISTEN
928854
#endif
929855
}
930856
break;

utility/serialUtils.h

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/*
2+
serialUtils.h - Definitions and utility functions for the Serial feature.
3+
Copyright (c) 2015 Jeff Hoefs. All rights reserved.
4+
5+
This library is free software; you can redistribute it and/or
6+
modify it under the terms of the GNU Lesser General Public
7+
License as published by the Free Software Foundation; either
8+
version 2.1 of the License, or (at your option) any later version.
9+
10+
See file LICENSE.txt for further informations on licensing terms.
11+
12+
Last update August 23rd, 2015
13+
*/
14+
15+
#ifndef SERIAL_UTILS_H
16+
#define SERIAL_UTILS_H
17+
18+
// Serial port Ids
19+
#define HW_SERIAL0 0x00
20+
#define HW_SERIAL1 0x01
21+
#define HW_SERIAL2 0x02
22+
#define HW_SERIAL3 0x03
23+
24+
#define SW_SERIAL0 0x08
25+
#define SW_SERIAL1 0x09
26+
#define SW_SERIAL2 0x0A
27+
#define SW_SERIAL3 0x0B
28+
29+
#define SERIAL_PORT_ID_MASK 0x0F
30+
#define MAX_SERIAL_PORTS 8
31+
32+
// map configuration query response resolution value to serial pin type
33+
#define RES_RX1 0x02
34+
#define RES_TX1 0x03
35+
#define RES_RX2 0x04
36+
#define RES_TX2 0x05
37+
#define RES_RX3 0x06
38+
#define RES_TX3 0x07
39+
40+
// Serial command bytes
41+
#define SERIAL_CONFIG 0x10
42+
#define SERIAL_WRITE 0x20
43+
#define SERIAL_READ 0x30
44+
#define SERIAL_REPLY 0x40
45+
#define SERIAL_CLOSE 0x50
46+
#define SERIAL_FLUSH 0x60
47+
#define SERIAL_LISTEN 0x70
48+
49+
// Serial read modes
50+
#define SERIAL_READ_CONTINUOUSLY 0x00
51+
#define SERIAL_STOP_READING 0x01
52+
#define SERIAL_MODE_MASK 0xF0
53+
54+
struct serial_pins {
55+
uint8_t rx;
56+
uint8_t tx;
57+
};
58+
59+
/*
60+
* Get the serial serial pin type (RX1, TX1, RX2, TX2, etc) for the specified pin.
61+
*/
62+
inline uint8_t getSerialPinType(uint8_t pin) {
63+
#if defined(PIN_SERIAL_RX)
64+
// TODO when use of HW_SERIAL0 is enabled
65+
#endif
66+
#if defined(PIN_SERIAL1_RX)
67+
if (pin == PIN_SERIAL1_RX) return RES_RX1;
68+
if (pin == PIN_SERIAL1_TX) return RES_TX1;
69+
#endif
70+
#if defined(PIN_SERIAL2_RX)
71+
if (pin == PIN_SERIAL2_RX) return RES_RX2;
72+
if (pin == PIN_SERIAL2_TX) return RES_TX2;
73+
#endif
74+
#if defined(PIN_SERIAL3_RX)
75+
if (pin == PIN_SERIAL3_RX) return RES_RX3;
76+
if (pin == PIN_SERIAL3_TX) return RES_TX3;
77+
#endif
78+
return 0;
79+
}
80+
81+
/*
82+
* Get the RX and TX pins numbers for the specified HW serial port.
83+
*/
84+
inline serial_pins getSerialPinNumbers(uint8_t portId) {
85+
serial_pins pins;
86+
switch (portId) {
87+
#if defined(PIN_SERIAL_RX)
88+
// case HW_SERIAL0:
89+
// // TODO when use of HW_SERIAL0 is enabled
90+
// break;
91+
#endif
92+
#if defined(PIN_SERIAL1_RX)
93+
case HW_SERIAL1:
94+
pins.rx = PIN_SERIAL1_RX;
95+
pins.tx = PIN_SERIAL1_TX;
96+
break;
97+
#endif
98+
#if defined(PIN_SERIAL2_RX)
99+
case HW_SERIAL2:
100+
pins.rx = PIN_SERIAL2_RX;
101+
pins.tx = PIN_SERIAL2_TX;
102+
break;
103+
#endif
104+
#if defined(PIN_SERIAL3_RX)
105+
case HW_SERIAL3:
106+
pins.rx = PIN_SERIAL3_RX;
107+
pins.tx = PIN_SERIAL3_TX;
108+
break;
109+
#endif
110+
default:
111+
pins.rx = 0;
112+
pins.tx = 0;
113+
}
114+
return pins;
115+
}
116+
117+
#endif /* SERIAL_UTILS_H */

0 commit comments

Comments
 (0)