]> AND Private Git Repository - Cipher_code.git/blob - Arduino/libraries/Firmata/utility/SerialFirmata.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
aze
[Cipher_code.git] / Arduino / libraries / Firmata / utility / SerialFirmata.h
1 /*
2   SerialFirmata.h
3   Copyright (C) 2016 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   This version of SerialFirmata.h differs from the ConfigurableFirmata
13   version in the following ways:
14
15   - Defines FIRMATA_SERIAL_FEATURE (could add to Configurable version as well)
16   - Imports Firmata.h rather than ConfigurableFirmata.h
17
18   Last updated October 16th, 2016
19 */
20
21 #ifndef SerialFirmata_h
22 #define SerialFirmata_h
23
24 #include <Firmata.h>
25 #include "FirmataFeature.h"
26 // SoftwareSerial is currently only supported for AVR-based boards and the Arduino 101.
27 // Limited to Arduino 1.6.6 or higher because Arduino builder cannot find SoftwareSerial
28 // prior to this release.
29 #if (ARDUINO > 10605) && (defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_ARC32))
30 #include <SoftwareSerial.h>
31 #endif
32
33 #define FIRMATA_SERIAL_FEATURE
34
35 // Serial port Ids
36 #define HW_SERIAL0                  0x00
37 #define HW_SERIAL1                  0x01
38 #define HW_SERIAL2                  0x02
39 #define HW_SERIAL3                  0x03
40 #define HW_SERIAL4                  0x04
41 #define HW_SERIAL5                  0x05
42 #define HW_SERIAL6                  0x06
43 // extensible up to 0x07
44
45 #define SW_SERIAL0                  0x08
46 #define SW_SERIAL1                  0x09
47 #define SW_SERIAL2                  0x0A
48 #define SW_SERIAL3                  0x0B
49 // extensible up to 0x0F
50
51 #define SERIAL_PORT_ID_MASK         0x0F
52 #define MAX_SERIAL_PORTS            8
53 #define SERIAL_READ_ARR_LEN         12
54
55 // map configuration query response resolution value to serial pin type
56 #define RES_RX1                     0x02
57 #define RES_TX1                     0x03
58 #define RES_RX2                     0x04
59 #define RES_TX2                     0x05
60 #define RES_RX3                     0x06
61 #define RES_TX3                     0x07
62 #define RES_RX4                     0x08
63 #define RES_TX4                     0x09
64 #define RES_RX5                     0x0a
65 #define RES_TX5                     0x0b
66 #define RES_RX6                     0x0c
67 #define RES_TX6                     0x0d
68
69 // Serial command bytes
70 #define SERIAL_CONFIG               0x10
71 #define SERIAL_WRITE                0x20
72 #define SERIAL_READ                 0x30
73 #define SERIAL_REPLY                0x40
74 #define SERIAL_CLOSE                0x50
75 #define SERIAL_FLUSH                0x60
76 #define SERIAL_LISTEN               0x70
77
78 // Serial read modes
79 #define SERIAL_READ_CONTINUOUSLY    0x00
80 #define SERIAL_STOP_READING         0x01
81 #define SERIAL_MODE_MASK            0xF0
82
83 namespace {
84
85   struct serial_pins {
86     uint8_t rx;
87     uint8_t tx;
88   };
89
90   /*
91    * Get the serial serial pin type (RX1, TX1, RX2, TX2, etc) for the specified pin.
92    */
93   inline uint8_t getSerialPinType(uint8_t pin) {
94   #if defined(PIN_SERIAL_RX)
95     // TODO when use of HW_SERIAL0 is enabled
96   #endif
97   #if defined(PIN_SERIAL1_RX)
98     if (pin == PIN_SERIAL1_RX) return RES_RX1;
99     if (pin == PIN_SERIAL1_TX) return RES_TX1;
100   #endif
101   #if defined(PIN_SERIAL2_RX)
102     if (pin == PIN_SERIAL2_RX) return RES_RX2;
103     if (pin == PIN_SERIAL2_TX) return RES_TX2;
104   #endif
105   #if defined(PIN_SERIAL3_RX)
106     if (pin == PIN_SERIAL3_RX) return RES_RX3;
107     if (pin == PIN_SERIAL3_TX) return RES_TX3;
108   #endif
109   #if defined(PIN_SERIAL4_RX)
110     if (pin == PIN_SERIAL4_RX) return RES_RX4;
111     if (pin == PIN_SERIAL4_TX) return RES_TX4;
112   #endif
113   #if defined(PIN_SERIAL5_RX)
114     if (pin == PIN_SERIAL5_RX) return RES_RX5;
115     if (pin == PIN_SERIAL5_TX) return RES_TX5;
116   #endif
117   #if defined(PIN_SERIAL6_RX)
118     if (pin == PIN_SERIAL6_RX) return RES_RX6;
119     if (pin == PIN_SERIAL6_TX) return RES_TX6;
120   #endif
121     return 0;
122   }
123
124   /*
125    * Get the RX and TX pins numbers for the specified HW serial port.
126    */
127   inline serial_pins getSerialPinNumbers(uint8_t portId) {
128     serial_pins pins;
129     switch (portId) {
130   #if defined(PIN_SERIAL_RX)
131         // case HW_SERIAL0:
132         //   // TODO when use of HW_SERIAL0 is enabled
133         //   break;
134   #endif
135   #if defined(PIN_SERIAL1_RX)
136       case HW_SERIAL1:
137         pins.rx = PIN_SERIAL1_RX;
138         pins.tx = PIN_SERIAL1_TX;
139         break;
140   #endif
141   #if defined(PIN_SERIAL2_RX)
142       case HW_SERIAL2:
143         pins.rx = PIN_SERIAL2_RX;
144         pins.tx = PIN_SERIAL2_TX;
145         break;
146   #endif
147   #if defined(PIN_SERIAL3_RX)
148       case HW_SERIAL3:
149         pins.rx = PIN_SERIAL3_RX;
150         pins.tx = PIN_SERIAL3_TX;
151         break;
152   #endif
153   #if defined(PIN_SERIAL4_RX)
154       case HW_SERIAL4:
155         pins.rx = PIN_SERIAL4_RX;
156         pins.tx = PIN_SERIAL4_TX;
157         break;
158   #endif
159   #if defined(PIN_SERIAL5_RX)
160       case HW_SERIAL5:
161         pins.rx = PIN_SERIAL5_RX;
162         pins.tx = PIN_SERIAL5_TX;
163         break;
164   #endif
165   #if defined(PIN_SERIAL6_RX)
166       case HW_SERIAL6:
167         pins.rx = PIN_SERIAL6_RX;
168         pins.tx = PIN_SERIAL6_TX;
169         break;
170   #endif
171       default:
172         pins.rx = 0;
173         pins.tx = 0;
174     }
175     return pins;
176   }
177
178 } // end namespace
179
180
181 class SerialFirmata: public FirmataFeature
182 {
183   public:
184     SerialFirmata();
185     boolean handlePinMode(byte pin, int mode);
186     void handleCapability(byte pin);
187     boolean handleSysex(byte command, byte argc, byte* argv);
188     void update();
189     void reset();
190     void checkSerial();
191
192   private:
193     byte reportSerial[MAX_SERIAL_PORTS];
194     int serialBytesToRead[SERIAL_READ_ARR_LEN];
195     signed char serialIndex;
196
197 #if defined(SoftwareSerial_h)
198     Stream *swSerial0;
199     Stream *swSerial1;
200     Stream *swSerial2;
201     Stream *swSerial3;
202 #endif
203
204     Stream* getPortFromId(byte portId);
205
206 };
207
208 #endif /* SerialFirmata_h */