diff options
43 files changed, 8142 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..b136a3781 --- /dev/null +++ b/.gitmodules | |||
@@ -0,0 +1,3 @@ | |||
1 | [submodule "protocol/usb_hid/USB_Host_Shield_2.0"] | ||
2 | path = protocol/usb_hid/USB_Host_Shield_2.0 | ||
3 | url = git://github.com/felis/USB_Host_Shield_2.0.git | ||
diff --git a/protocol/usb_hid/README b/protocol/usb_hid/README new file mode 100644 index 000000000..0acf677f8 --- /dev/null +++ b/protocol/usb_hid/README | |||
@@ -0,0 +1,9 @@ | |||
1 | Third party Libraries | ||
2 | --------------------- | ||
3 | USB_Host_Shield_2.0 | ||
4 | Circuits@Home repository is git-submoduled. Do git submodule init & update to get the content. | ||
5 | https://github.com/felis/USB_Host_Shield_2.0 | ||
6 | |||
7 | arduino-1.0.1 | ||
8 | Arduino files copied from: | ||
9 | https://github.com/arduino/Arduino/hardware/arduino/{cores,variants} | ||
diff --git a/protocol/usb_hid/USB_Host_Shield_2.0 b/protocol/usb_hid/USB_Host_Shield_2.0 new file mode 160000 | |||
Subproject d2ae0b4cd47d4ee88eb93177acb142299025e2e | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Arduino.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Arduino.h new file mode 100644 index 000000000..830c9952f --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Arduino.h | |||
@@ -0,0 +1,215 @@ | |||
1 | #ifndef Arduino_h | ||
2 | #define Arduino_h | ||
3 | |||
4 | #include <stdlib.h> | ||
5 | #include <string.h> | ||
6 | #include <math.h> | ||
7 | |||
8 | #include <avr/pgmspace.h> | ||
9 | #include <avr/io.h> | ||
10 | #include <avr/interrupt.h> | ||
11 | |||
12 | #include "binary.h" | ||
13 | |||
14 | #ifdef __cplusplus | ||
15 | extern "C"{ | ||
16 | #endif | ||
17 | |||
18 | #define HIGH 0x1 | ||
19 | #define LOW 0x0 | ||
20 | |||
21 | #define INPUT 0x0 | ||
22 | #define OUTPUT 0x1 | ||
23 | #define INPUT_PULLUP 0x2 | ||
24 | |||
25 | #define true 0x1 | ||
26 | #define false 0x0 | ||
27 | |||
28 | #define PI 3.1415926535897932384626433832795 | ||
29 | #define HALF_PI 1.5707963267948966192313216916398 | ||
30 | #define TWO_PI 6.283185307179586476925286766559 | ||
31 | #define DEG_TO_RAD 0.017453292519943295769236907684886 | ||
32 | #define RAD_TO_DEG 57.295779513082320876798154814105 | ||
33 | |||
34 | #define SERIAL 0x0 | ||
35 | #define DISPLAY 0x1 | ||
36 | |||
37 | #define LSBFIRST 0 | ||
38 | #define MSBFIRST 1 | ||
39 | |||
40 | #define CHANGE 1 | ||
41 | #define FALLING 2 | ||
42 | #define RISING 3 | ||
43 | |||
44 | #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) | ||
45 | #define DEFAULT 0 | ||
46 | #define EXTERNAL 1 | ||
47 | #define INTERNAL 2 | ||
48 | #else | ||
49 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284P__) | ||
50 | #define INTERNAL1V1 2 | ||
51 | #define INTERNAL2V56 3 | ||
52 | #else | ||
53 | #define INTERNAL 3 | ||
54 | #endif | ||
55 | #define DEFAULT 1 | ||
56 | #define EXTERNAL 0 | ||
57 | #endif | ||
58 | |||
59 | // undefine stdlib's abs if encountered | ||
60 | #ifdef abs | ||
61 | #undef abs | ||
62 | #endif | ||
63 | |||
64 | #define min(a,b) ((a)<(b)?(a):(b)) | ||
65 | #define max(a,b) ((a)>(b)?(a):(b)) | ||
66 | #define abs(x) ((x)>0?(x):-(x)) | ||
67 | #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) | ||
68 | #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) | ||
69 | #define radians(deg) ((deg)*DEG_TO_RAD) | ||
70 | #define degrees(rad) ((rad)*RAD_TO_DEG) | ||
71 | #define sq(x) ((x)*(x)) | ||
72 | |||
73 | #define interrupts() sei() | ||
74 | #define noInterrupts() cli() | ||
75 | |||
76 | #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) | ||
77 | #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) | ||
78 | #define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) | ||
79 | |||
80 | #define lowByte(w) ((uint8_t) ((w) & 0xff)) | ||
81 | #define highByte(w) ((uint8_t) ((w) >> 8)) | ||
82 | |||
83 | #define bitRead(value, bit) (((value) >> (bit)) & 0x01) | ||
84 | #define bitSet(value, bit) ((value) |= (1UL << (bit))) | ||
85 | #define bitClear(value, bit) ((value) &= ~(1UL << (bit))) | ||
86 | #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) | ||
87 | |||
88 | |||
89 | typedef unsigned int word; | ||
90 | |||
91 | #define bit(b) (1UL << (b)) | ||
92 | |||
93 | typedef uint8_t boolean; | ||
94 | typedef uint8_t byte; | ||
95 | |||
96 | void init(void); | ||
97 | |||
98 | void pinMode(uint8_t, uint8_t); | ||
99 | void digitalWrite(uint8_t, uint8_t); | ||
100 | int digitalRead(uint8_t); | ||
101 | int analogRead(uint8_t); | ||
102 | void analogReference(uint8_t mode); | ||
103 | void analogWrite(uint8_t, int); | ||
104 | |||
105 | unsigned long millis(void); | ||
106 | unsigned long micros(void); | ||
107 | void delay(unsigned long); | ||
108 | void delayMicroseconds(unsigned int us); | ||
109 | unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); | ||
110 | |||
111 | void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); | ||
112 | uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); | ||
113 | |||
114 | void attachInterrupt(uint8_t, void (*)(void), int mode); | ||
115 | void detachInterrupt(uint8_t); | ||
116 | |||
117 | void setup(void); | ||
118 | void loop(void); | ||
119 | |||
120 | // Get the bit location within the hardware port of the given virtual pin. | ||
121 | // This comes from the pins_*.c file for the active board configuration. | ||
122 | |||
123 | #define analogInPinToBit(P) (P) | ||
124 | |||
125 | // On the ATmega1280, the addresses of some of the port registers are | ||
126 | // greater than 255, so we can't store them in uint8_t's. | ||
127 | extern const uint16_t PROGMEM port_to_mode_PGM[]; | ||
128 | extern const uint16_t PROGMEM port_to_input_PGM[]; | ||
129 | extern const uint16_t PROGMEM port_to_output_PGM[]; | ||
130 | |||
131 | extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; | ||
132 | // extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; | ||
133 | extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; | ||
134 | extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; | ||
135 | |||
136 | // Get the bit location within the hardware port of the given virtual pin. | ||
137 | // This comes from the pins_*.c file for the active board configuration. | ||
138 | // | ||
139 | // These perform slightly better as macros compared to inline functions | ||
140 | // | ||
141 | #define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) | ||
142 | #define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) | ||
143 | #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) | ||
144 | #define analogInPinToBit(P) (P) | ||
145 | #define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) | ||
146 | #define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) | ||
147 | #define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) ) | ||
148 | |||
149 | #define NOT_A_PIN 0 | ||
150 | #define NOT_A_PORT 0 | ||
151 | |||
152 | #ifdef ARDUINO_MAIN | ||
153 | #define PA 1 | ||
154 | #define PB 2 | ||
155 | #define PC 3 | ||
156 | #define PD 4 | ||
157 | #define PE 5 | ||
158 | #define PF 6 | ||
159 | #define PG 7 | ||
160 | #define PH 8 | ||
161 | #define PJ 10 | ||
162 | #define PK 11 | ||
163 | #define PL 12 | ||
164 | #endif | ||
165 | |||
166 | #define NOT_ON_TIMER 0 | ||
167 | #define TIMER0A 1 | ||
168 | #define TIMER0B 2 | ||
169 | #define TIMER1A 3 | ||
170 | #define TIMER1B 4 | ||
171 | #define TIMER2 5 | ||
172 | #define TIMER2A 6 | ||
173 | #define TIMER2B 7 | ||
174 | |||
175 | #define TIMER3A 8 | ||
176 | #define TIMER3B 9 | ||
177 | #define TIMER3C 10 | ||
178 | #define TIMER4A 11 | ||
179 | #define TIMER4B 12 | ||
180 | #define TIMER4C 13 | ||
181 | #define TIMER4D 14 | ||
182 | #define TIMER5A 15 | ||
183 | #define TIMER5B 16 | ||
184 | #define TIMER5C 17 | ||
185 | |||
186 | #ifdef __cplusplus | ||
187 | } // extern "C" | ||
188 | #endif | ||
189 | |||
190 | #ifdef __cplusplus | ||
191 | #include "WCharacter.h" | ||
192 | #include "WString.h" | ||
193 | #include "HardwareSerial.h" | ||
194 | |||
195 | uint16_t makeWord(uint16_t w); | ||
196 | uint16_t makeWord(byte h, byte l); | ||
197 | |||
198 | #define word(...) makeWord(__VA_ARGS__) | ||
199 | |||
200 | unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); | ||
201 | |||
202 | void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); | ||
203 | void noTone(uint8_t _pin); | ||
204 | |||
205 | // WMath prototypes | ||
206 | long random(long); | ||
207 | long random(long, long); | ||
208 | void randomSeed(unsigned int); | ||
209 | long map(long, long, long, long, long); | ||
210 | |||
211 | #endif | ||
212 | |||
213 | #include "pins_arduino.h" | ||
214 | |||
215 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/CDC.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/CDC.cpp new file mode 100644 index 000000000..1ee3a488a --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/CDC.cpp | |||
@@ -0,0 +1,233 @@ | |||
1 | |||
2 | |||
3 | /* Copyright (c) 2011, Peter Barrett | ||
4 | ** | ||
5 | ** Permission to use, copy, modify, and/or distribute this software for | ||
6 | ** any purpose with or without fee is hereby granted, provided that the | ||
7 | ** above copyright notice and this permission notice appear in all copies. | ||
8 | ** | ||
9 | ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||
10 | ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||
11 | ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR | ||
12 | ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES | ||
13 | ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||
14 | ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | ||
15 | ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||
16 | ** SOFTWARE. | ||
17 | */ | ||
18 | |||
19 | #include "Platform.h" | ||
20 | #include "USBAPI.h" | ||
21 | #include <avr/wdt.h> | ||
22 | |||
23 | #if defined(USBCON) | ||
24 | #ifdef CDC_ENABLED | ||
25 | |||
26 | #if (RAMEND < 1000) | ||
27 | #define SERIAL_BUFFER_SIZE 16 | ||
28 | #else | ||
29 | #define SERIAL_BUFFER_SIZE 64 | ||
30 | #endif | ||
31 | |||
32 | struct ring_buffer | ||
33 | { | ||
34 | unsigned char buffer[SERIAL_BUFFER_SIZE]; | ||
35 | volatile int head; | ||
36 | volatile int tail; | ||
37 | }; | ||
38 | |||
39 | ring_buffer cdc_rx_buffer = { { 0 }, 0, 0}; | ||
40 | |||
41 | typedef struct | ||
42 | { | ||
43 | u32 dwDTERate; | ||
44 | u8 bCharFormat; | ||
45 | u8 bParityType; | ||
46 | u8 bDataBits; | ||
47 | u8 lineState; | ||
48 | } LineInfo; | ||
49 | |||
50 | static volatile LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; | ||
51 | |||
52 | #define WEAK __attribute__ ((weak)) | ||
53 | |||
54 | extern const CDCDescriptor _cdcInterface PROGMEM; | ||
55 | const CDCDescriptor _cdcInterface = | ||
56 | { | ||
57 | D_IAD(0,2,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,1), | ||
58 | |||
59 | // CDC communication interface | ||
60 | D_INTERFACE(CDC_ACM_INTERFACE,1,CDC_COMMUNICATION_INTERFACE_CLASS,CDC_ABSTRACT_CONTROL_MODEL,0), | ||
61 | D_CDCCS(CDC_HEADER,0x10,0x01), // Header (1.10 bcd) | ||
62 | D_CDCCS(CDC_CALL_MANAGEMENT,1,1), // Device handles call management (not) | ||
63 | D_CDCCS4(CDC_ABSTRACT_CONTROL_MANAGEMENT,6), // SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported | ||
64 | D_CDCCS(CDC_UNION,CDC_ACM_INTERFACE,CDC_DATA_INTERFACE), // Communication interface is master, data interface is slave 0 | ||
65 | D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_ACM),USB_ENDPOINT_TYPE_INTERRUPT,0x10,0x40), | ||
66 | |||
67 | // CDC data interface | ||
68 | D_INTERFACE(CDC_DATA_INTERFACE,2,CDC_DATA_INTERFACE_CLASS,0,0), | ||
69 | D_ENDPOINT(USB_ENDPOINT_OUT(CDC_ENDPOINT_OUT),USB_ENDPOINT_TYPE_BULK,0x40,0), | ||
70 | D_ENDPOINT(USB_ENDPOINT_IN (CDC_ENDPOINT_IN ),USB_ENDPOINT_TYPE_BULK,0x40,0) | ||
71 | }; | ||
72 | |||
73 | int WEAK CDC_GetInterface(u8* interfaceNum) | ||
74 | { | ||
75 | interfaceNum[0] += 2; // uses 2 | ||
76 | return USB_SendControl(TRANSFER_PGM,&_cdcInterface,sizeof(_cdcInterface)); | ||
77 | } | ||
78 | |||
79 | bool WEAK CDC_Setup(Setup& setup) | ||
80 | { | ||
81 | u8 r = setup.bRequest; | ||
82 | u8 requestType = setup.bmRequestType; | ||
83 | |||
84 | if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType) | ||
85 | { | ||
86 | if (CDC_GET_LINE_CODING == r) | ||
87 | { | ||
88 | USB_SendControl(0,(void*)&_usbLineInfo,7); | ||
89 | return true; | ||
90 | } | ||
91 | } | ||
92 | |||
93 | if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType) | ||
94 | { | ||
95 | if (CDC_SET_LINE_CODING == r) | ||
96 | { | ||
97 | USB_RecvControl((void*)&_usbLineInfo,7); | ||
98 | return true; | ||
99 | } | ||
100 | |||
101 | if (CDC_SET_CONTROL_LINE_STATE == r) | ||
102 | { | ||
103 | _usbLineInfo.lineState = setup.wValueL; | ||
104 | |||
105 | // auto-reset into the bootloader is triggered when the port, already | ||
106 | // open at 1200 bps, is closed. this is the signal to start the watchdog | ||
107 | // with a relatively long period so it can finish housekeeping tasks | ||
108 | // like servicing endpoints before the sketch ends | ||
109 | if (1200 == _usbLineInfo.dwDTERate) { | ||
110 | // We check DTR state to determine if host port is open (bit 0 of lineState). | ||
111 | if ((_usbLineInfo.lineState & 0x01) == 0) { | ||
112 | *(uint16_t *)0x0800 = 0x7777; | ||
113 | wdt_enable(WDTO_120MS); | ||
114 | } else { | ||
115 | // Most OSs do some intermediate steps when configuring ports and DTR can | ||
116 | // twiggle more than once before stabilizing. | ||
117 | // To avoid spurious resets we set the watchdog to 250ms and eventually | ||
118 | // cancel if DTR goes back high. | ||
119 | |||
120 | wdt_disable(); | ||
121 | wdt_reset(); | ||
122 | *(uint16_t *)0x0800 = 0x0; | ||
123 | } | ||
124 | } | ||
125 | return true; | ||
126 | } | ||
127 | } | ||
128 | return false; | ||
129 | } | ||
130 | |||
131 | |||
132 | int _serialPeek = -1; | ||
133 | void Serial_::begin(uint16_t baud_count) | ||
134 | { | ||
135 | } | ||
136 | |||
137 | void Serial_::end(void) | ||
138 | { | ||
139 | } | ||
140 | |||
141 | void Serial_::accept(void) | ||
142 | { | ||
143 | ring_buffer *buffer = &cdc_rx_buffer; | ||
144 | int c = USB_Recv(CDC_RX); | ||
145 | int i = (unsigned int)(buffer->head+1) % SERIAL_BUFFER_SIZE; | ||
146 | |||
147 | // if we should be storing the received character into the location | ||
148 | // just before the tail (meaning that the head would advance to the | ||
149 | // current location of the tail), we're about to overflow the buffer | ||
150 | // and so we don't write the character or advance the head. | ||
151 | if (i != buffer->tail) { | ||
152 | buffer->buffer[buffer->head] = c; | ||
153 | buffer->head = i; | ||
154 | } | ||
155 | } | ||
156 | |||
157 | int Serial_::available(void) | ||
158 | { | ||
159 | ring_buffer *buffer = &cdc_rx_buffer; | ||
160 | return (unsigned int)(SERIAL_BUFFER_SIZE + buffer->head - buffer->tail) % SERIAL_BUFFER_SIZE; | ||
161 | } | ||
162 | |||
163 | int Serial_::peek(void) | ||
164 | { | ||
165 | ring_buffer *buffer = &cdc_rx_buffer; | ||
166 | if (buffer->head == buffer->tail) { | ||
167 | return -1; | ||
168 | } else { | ||
169 | return buffer->buffer[buffer->tail]; | ||
170 | } | ||
171 | } | ||
172 | |||
173 | int Serial_::read(void) | ||
174 | { | ||
175 | ring_buffer *buffer = &cdc_rx_buffer; | ||
176 | // if the head isn't ahead of the tail, we don't have any characters | ||
177 | if (buffer->head == buffer->tail) { | ||
178 | return -1; | ||
179 | } else { | ||
180 | unsigned char c = buffer->buffer[buffer->tail]; | ||
181 | buffer->tail = (unsigned int)(buffer->tail + 1) % SERIAL_BUFFER_SIZE; | ||
182 | return c; | ||
183 | } | ||
184 | } | ||
185 | |||
186 | void Serial_::flush(void) | ||
187 | { | ||
188 | USB_Flush(CDC_TX); | ||
189 | } | ||
190 | |||
191 | size_t Serial_::write(uint8_t c) | ||
192 | { | ||
193 | /* only try to send bytes if the high-level CDC connection itself | ||
194 | is open (not just the pipe) - the OS should set lineState when the port | ||
195 | is opened and clear lineState when the port is closed. | ||
196 | bytes sent before the user opens the connection or after | ||
197 | the connection is closed are lost - just like with a UART. */ | ||
198 | |||
199 | // TODO - ZE - check behavior on different OSes and test what happens if an | ||
200 | // open connection isn't broken cleanly (cable is yanked out, host dies | ||
201 | // or locks up, or host virtual serial port hangs) | ||
202 | if (_usbLineInfo.lineState > 0) { | ||
203 | int r = USB_Send(CDC_TX,&c,1); | ||
204 | if (r > 0) { | ||
205 | return r; | ||
206 | } else { | ||
207 | setWriteError(); | ||
208 | return 0; | ||
209 | } | ||
210 | } | ||
211 | setWriteError(); | ||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | // This operator is a convenient way for a sketch to check whether the | ||
216 | // port has actually been configured and opened by the host (as opposed | ||
217 | // to just being connected to the host). It can be used, for example, in | ||
218 | // setup() before printing to ensure that an application on the host is | ||
219 | // actually ready to receive and display the data. | ||
220 | // We add a short delay before returning to fix a bug observed by Federico | ||
221 | // where the port is configured (lineState != 0) but not quite opened. | ||
222 | Serial_::operator bool() { | ||
223 | bool result = false; | ||
224 | if (_usbLineInfo.lineState > 0) | ||
225 | result = true; | ||
226 | delay(10); | ||
227 | return result; | ||
228 | } | ||
229 | |||
230 | Serial_ Serial; | ||
231 | |||
232 | #endif | ||
233 | #endif /* if defined(USBCON) */ | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Client.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Client.h new file mode 100644 index 000000000..ea134838a --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Client.h | |||
@@ -0,0 +1,26 @@ | |||
1 | #ifndef client_h | ||
2 | #define client_h | ||
3 | #include "Print.h" | ||
4 | #include "Stream.h" | ||
5 | #include "IPAddress.h" | ||
6 | |||
7 | class Client : public Stream { | ||
8 | |||
9 | public: | ||
10 | virtual int connect(IPAddress ip, uint16_t port) =0; | ||
11 | virtual int connect(const char *host, uint16_t port) =0; | ||
12 | virtual size_t write(uint8_t) =0; | ||
13 | virtual size_t write(const uint8_t *buf, size_t size) =0; | ||
14 | virtual int available() = 0; | ||
15 | virtual int read() = 0; | ||
16 | virtual int read(uint8_t *buf, size_t size) = 0; | ||
17 | virtual int peek() = 0; | ||
18 | virtual void flush() = 0; | ||
19 | virtual void stop() = 0; | ||
20 | virtual uint8_t connected() = 0; | ||
21 | virtual operator bool() = 0; | ||
22 | protected: | ||
23 | uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; | ||
24 | }; | ||
25 | |||
26 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/HID.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HID.cpp new file mode 100644 index 000000000..ac6360844 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HID.cpp | |||
@@ -0,0 +1,520 @@ | |||
1 | |||
2 | |||
3 | /* Copyright (c) 2011, Peter Barrett | ||
4 | ** | ||
5 | ** Permission to use, copy, modify, and/or distribute this software for | ||
6 | ** any purpose with or without fee is hereby granted, provided that the | ||
7 | ** above copyright notice and this permission notice appear in all copies. | ||
8 | ** | ||
9 | ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||
10 | ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||
11 | ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR | ||
12 | ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES | ||
13 | ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||
14 | ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | ||
15 | ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||
16 | ** SOFTWARE. | ||
17 | */ | ||
18 | |||
19 | #include "Platform.h" | ||
20 | #include "USBAPI.h" | ||
21 | #include "USBDesc.h" | ||
22 | |||
23 | #if defined(USBCON) | ||
24 | #ifdef HID_ENABLED | ||
25 | |||
26 | //#define RAWHID_ENABLED | ||
27 | |||
28 | // Singletons for mouse and keyboard | ||
29 | |||
30 | Mouse_ Mouse; | ||
31 | Keyboard_ Keyboard; | ||
32 | |||
33 | //================================================================================ | ||
34 | //================================================================================ | ||
35 | |||
36 | // HID report descriptor | ||
37 | |||
38 | #define LSB(_x) ((_x) & 0xFF) | ||
39 | #define MSB(_x) ((_x) >> 8) | ||
40 | |||
41 | #define RAWHID_USAGE_PAGE 0xFFC0 | ||
42 | #define RAWHID_USAGE 0x0C00 | ||
43 | #define RAWHID_TX_SIZE 64 | ||
44 | #define RAWHID_RX_SIZE 64 | ||
45 | |||
46 | extern const u8 _hidReportDescriptor[] PROGMEM; | ||
47 | const u8 _hidReportDescriptor[] = { | ||
48 | |||
49 | // Mouse | ||
50 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 54 | ||
51 | 0x09, 0x02, // USAGE (Mouse) | ||
52 | 0xa1, 0x01, // COLLECTION (Application) | ||
53 | 0x09, 0x01, // USAGE (Pointer) | ||
54 | 0xa1, 0x00, // COLLECTION (Physical) | ||
55 | 0x85, 0x01, // REPORT_ID (1) | ||
56 | 0x05, 0x09, // USAGE_PAGE (Button) | ||
57 | 0x19, 0x01, // USAGE_MINIMUM (Button 1) | ||
58 | 0x29, 0x03, // USAGE_MAXIMUM (Button 3) | ||
59 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | ||
60 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | ||
61 | 0x95, 0x03, // REPORT_COUNT (3) | ||
62 | 0x75, 0x01, // REPORT_SIZE (1) | ||
63 | 0x81, 0x02, // INPUT (Data,Var,Abs) | ||
64 | 0x95, 0x01, // REPORT_COUNT (1) | ||
65 | 0x75, 0x05, // REPORT_SIZE (5) | ||
66 | 0x81, 0x03, // INPUT (Cnst,Var,Abs) | ||
67 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | ||
68 | 0x09, 0x30, // USAGE (X) | ||
69 | 0x09, 0x31, // USAGE (Y) | ||
70 | 0x09, 0x38, // USAGE (Wheel) | ||
71 | 0x15, 0x81, // LOGICAL_MINIMUM (-127) | ||
72 | 0x25, 0x7f, // LOGICAL_MAXIMUM (127) | ||
73 | 0x75, 0x08, // REPORT_SIZE (8) | ||
74 | 0x95, 0x03, // REPORT_COUNT (3) | ||
75 | 0x81, 0x06, // INPUT (Data,Var,Rel) | ||
76 | 0xc0, // END_COLLECTION | ||
77 | 0xc0, // END_COLLECTION | ||
78 | |||
79 | // Keyboard | ||
80 | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 47 | ||
81 | 0x09, 0x06, // USAGE (Keyboard) | ||
82 | 0xa1, 0x01, // COLLECTION (Application) | ||
83 | 0x85, 0x02, // REPORT_ID (2) | ||
84 | 0x05, 0x07, // USAGE_PAGE (Keyboard) | ||
85 | |||
86 | 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) | ||
87 | 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) | ||
88 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | ||
89 | 0x25, 0x01, // LOGICAL_MAXIMUM (1) | ||
90 | 0x75, 0x01, // REPORT_SIZE (1) | ||
91 | |||
92 | 0x95, 0x08, // REPORT_COUNT (8) | ||
93 | 0x81, 0x02, // INPUT (Data,Var,Abs) | ||
94 | 0x95, 0x01, // REPORT_COUNT (1) | ||
95 | 0x75, 0x08, // REPORT_SIZE (8) | ||
96 | 0x81, 0x03, // INPUT (Cnst,Var,Abs) | ||
97 | |||
98 | 0x95, 0x06, // REPORT_COUNT (6) | ||
99 | 0x75, 0x08, // REPORT_SIZE (8) | ||
100 | 0x15, 0x00, // LOGICAL_MINIMUM (0) | ||
101 | 0x25, 0x65, // LOGICAL_MAXIMUM (101) | ||
102 | 0x05, 0x07, // USAGE_PAGE (Keyboard) | ||
103 | |||
104 | 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) | ||
105 | 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) | ||
106 | 0x81, 0x00, // INPUT (Data,Ary,Abs) | ||
107 | 0xc0, // END_COLLECTION | ||
108 | |||
109 | #if RAWHID_ENABLED | ||
110 | // RAW HID | ||
111 | 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 | ||
112 | 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), | ||
113 | |||
114 | 0xA1, 0x01, // Collection 0x01 | ||
115 | 0x85, 0x03, // REPORT_ID (3) | ||
116 | 0x75, 0x08, // report size = 8 bits | ||
117 | 0x15, 0x00, // logical minimum = 0 | ||
118 | 0x26, 0xFF, 0x00, // logical maximum = 255 | ||
119 | |||
120 | 0x95, 64, // report count TX | ||
121 | 0x09, 0x01, // usage | ||
122 | 0x81, 0x02, // Input (array) | ||
123 | |||
124 | 0x95, 64, // report count RX | ||
125 | 0x09, 0x02, // usage | ||
126 | 0x91, 0x02, // Output (array) | ||
127 | 0xC0 // end collection | ||
128 | #endif | ||
129 | }; | ||
130 | |||
131 | extern const HIDDescriptor _hidInterface PROGMEM; | ||
132 | const HIDDescriptor _hidInterface = | ||
133 | { | ||
134 | D_INTERFACE(HID_INTERFACE,1,3,0,0), | ||
135 | D_HIDREPORT(sizeof(_hidReportDescriptor)), | ||
136 | D_ENDPOINT(USB_ENDPOINT_IN (HID_ENDPOINT_INT),USB_ENDPOINT_TYPE_INTERRUPT,0x40,0x01) | ||
137 | }; | ||
138 | |||
139 | //================================================================================ | ||
140 | //================================================================================ | ||
141 | // Driver | ||
142 | |||
143 | u8 _hid_protocol = 1; | ||
144 | u8 _hid_idle = 1; | ||
145 | |||
146 | #define WEAK __attribute__ ((weak)) | ||
147 | |||
148 | int WEAK HID_GetInterface(u8* interfaceNum) | ||
149 | { | ||
150 | interfaceNum[0] += 1; // uses 1 | ||
151 | return USB_SendControl(TRANSFER_PGM,&_hidInterface,sizeof(_hidInterface)); | ||
152 | } | ||
153 | |||
154 | int WEAK HID_GetDescriptor(int i) | ||
155 | { | ||
156 | return USB_SendControl(TRANSFER_PGM,_hidReportDescriptor,sizeof(_hidReportDescriptor)); | ||
157 | } | ||
158 | |||
159 | void WEAK HID_SendReport(u8 id, const void* data, int len) | ||
160 | { | ||
161 | USB_Send(HID_TX, &id, 1); | ||
162 | USB_Send(HID_TX | TRANSFER_RELEASE,data,len); | ||
163 | } | ||
164 | |||
165 | bool WEAK HID_Setup(Setup& setup) | ||
166 | { | ||
167 | u8 r = setup.bRequest; | ||
168 | u8 requestType = setup.bmRequestType; | ||
169 | if (REQUEST_DEVICETOHOST_CLASS_INTERFACE == requestType) | ||
170 | { | ||
171 | if (HID_GET_REPORT == r) | ||
172 | { | ||
173 | //HID_GetReport(); | ||
174 | return true; | ||
175 | } | ||
176 | if (HID_GET_PROTOCOL == r) | ||
177 | { | ||
178 | //Send8(_hid_protocol); // TODO | ||
179 | return true; | ||
180 | } | ||
181 | } | ||
182 | |||
183 | if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType) | ||
184 | { | ||
185 | if (HID_SET_PROTOCOL == r) | ||
186 | { | ||
187 | _hid_protocol = setup.wValueL; | ||
188 | return true; | ||
189 | } | ||
190 | |||
191 | if (HID_SET_IDLE == r) | ||
192 | { | ||
193 | _hid_idle = setup.wValueL; | ||
194 | return true; | ||
195 | } | ||
196 | } | ||
197 | return false; | ||
198 | } | ||
199 | |||
200 | //================================================================================ | ||
201 | //================================================================================ | ||
202 | // Mouse | ||
203 | |||
204 | Mouse_::Mouse_(void) : _buttons(0) | ||
205 | { | ||
206 | } | ||
207 | |||
208 | void Mouse_::begin(void) | ||
209 | { | ||
210 | } | ||
211 | |||
212 | void Mouse_::end(void) | ||
213 | { | ||
214 | } | ||
215 | |||
216 | void Mouse_::click(uint8_t b) | ||
217 | { | ||
218 | _buttons = b; | ||
219 | move(0,0,0); | ||
220 | _buttons = 0; | ||
221 | move(0,0,0); | ||
222 | } | ||
223 | |||
224 | void Mouse_::move(signed char x, signed char y, signed char wheel) | ||
225 | { | ||
226 | u8 m[4]; | ||
227 | m[0] = _buttons; | ||
228 | m[1] = x; | ||
229 | m[2] = y; | ||
230 | m[3] = wheel; | ||
231 | HID_SendReport(1,m,4); | ||
232 | } | ||
233 | |||
234 | void Mouse_::buttons(uint8_t b) | ||
235 | { | ||
236 | if (b != _buttons) | ||
237 | { | ||
238 | _buttons = b; | ||
239 | move(0,0,0); | ||
240 | } | ||
241 | } | ||
242 | |||
243 | void Mouse_::press(uint8_t b) | ||
244 | { | ||
245 | buttons(_buttons | b); | ||
246 | } | ||
247 | |||
248 | void Mouse_::release(uint8_t b) | ||
249 | { | ||
250 | buttons(_buttons & ~b); | ||
251 | } | ||
252 | |||
253 | bool Mouse_::isPressed(uint8_t b) | ||
254 | { | ||
255 | if ((b & _buttons) > 0) | ||
256 | return true; | ||
257 | return false; | ||
258 | } | ||
259 | |||
260 | //================================================================================ | ||
261 | //================================================================================ | ||
262 | // Keyboard | ||
263 | |||
264 | Keyboard_::Keyboard_(void) | ||
265 | { | ||
266 | } | ||
267 | |||
268 | void Keyboard_::begin(void) | ||
269 | { | ||
270 | } | ||
271 | |||
272 | void Keyboard_::end(void) | ||
273 | { | ||
274 | } | ||
275 | |||
276 | void Keyboard_::sendReport(KeyReport* keys) | ||
277 | { | ||
278 | HID_SendReport(2,keys,sizeof(KeyReport)); | ||
279 | } | ||
280 | |||
281 | extern | ||
282 | const uint8_t _asciimap[128] PROGMEM; | ||
283 | |||
284 | #define SHIFT 0x80 | ||
285 | const uint8_t _asciimap[128] = | ||
286 | { | ||
287 | 0x00, // NUL | ||
288 | 0x00, // SOH | ||
289 | 0x00, // STX | ||
290 | 0x00, // ETX | ||
291 | 0x00, // EOT | ||
292 | 0x00, // ENQ | ||
293 | 0x00, // ACK | ||
294 | 0x00, // BEL | ||
295 | 0x2a, // BS Backspace | ||
296 | 0x2b, // TAB Tab | ||
297 | 0x28, // LF Enter | ||
298 | 0x00, // VT | ||
299 | 0x00, // FF | ||
300 | 0x00, // CR | ||
301 | 0x00, // SO | ||
302 | 0x00, // SI | ||
303 | 0x00, // DEL | ||
304 | 0x00, // DC1 | ||
305 | 0x00, // DC2 | ||
306 | 0x00, // DC3 | ||
307 | 0x00, // DC4 | ||
308 | 0x00, // NAK | ||
309 | 0x00, // SYN | ||
310 | 0x00, // ETB | ||
311 | 0x00, // CAN | ||
312 | 0x00, // EM | ||
313 | 0x00, // SUB | ||
314 | 0x00, // ESC | ||
315 | 0x00, // FS | ||
316 | 0x00, // GS | ||
317 | 0x00, // RS | ||
318 | 0x00, // US | ||
319 | |||
320 | 0x2c, // ' ' | ||
321 | 0x1e|SHIFT, // ! | ||
322 | 0x34|SHIFT, // " | ||
323 | 0x20|SHIFT, // # | ||
324 | 0x21|SHIFT, // $ | ||
325 | 0x22|SHIFT, // % | ||
326 | 0x24|SHIFT, // & | ||
327 | 0x34, // ' | ||
328 | 0x26|SHIFT, // ( | ||
329 | 0x27|SHIFT, // ) | ||
330 | 0x25|SHIFT, // * | ||
331 | 0x2e|SHIFT, // + | ||
332 | 0x36, // , | ||
333 | 0x2d, // - | ||
334 | 0x37, // . | ||
335 | 0x38, // / | ||
336 | 0x27, // 0 | ||
337 | 0x1e, // 1 | ||
338 | 0x1f, // 2 | ||
339 | 0x20, // 3 | ||
340 | 0x21, // 4 | ||
341 | 0x22, // 5 | ||
342 | 0x23, // 6 | ||
343 | 0x24, // 7 | ||
344 | 0x25, // 8 | ||
345 | 0x26, // 9 | ||
346 | 0x33|SHIFT, // : | ||
347 | 0x33, // ; | ||
348 | 0x36|SHIFT, // < | ||
349 | 0x2e, // = | ||
350 | 0x37|SHIFT, // > | ||
351 | 0x38|SHIFT, // ? | ||
352 | 0x1f|SHIFT, // @ | ||
353 | 0x04|SHIFT, // A | ||
354 | 0x05|SHIFT, // B | ||
355 | 0x06|SHIFT, // C | ||
356 | 0x07|SHIFT, // D | ||
357 | 0x08|SHIFT, // E | ||
358 | 0x09|SHIFT, // F | ||
359 | 0x0a|SHIFT, // G | ||
360 | 0x0b|SHIFT, // H | ||
361 | 0x0c|SHIFT, // I | ||
362 | 0x0d|SHIFT, // J | ||
363 | 0x0e|SHIFT, // K | ||
364 | 0x0f|SHIFT, // L | ||
365 | 0x10|SHIFT, // M | ||
366 | 0x11|SHIFT, // N | ||
367 | 0x12|SHIFT, // O | ||
368 | 0x13|SHIFT, // P | ||
369 | 0x14|SHIFT, // Q | ||
370 | 0x15|SHIFT, // R | ||
371 | 0x16|SHIFT, // S | ||
372 | 0x17|SHIFT, // T | ||
373 | 0x18|SHIFT, // U | ||
374 | 0x19|SHIFT, // V | ||
375 | 0x1a|SHIFT, // W | ||
376 | 0x1b|SHIFT, // X | ||
377 | 0x1c|SHIFT, // Y | ||
378 | 0x1d|SHIFT, // Z | ||
379 | 0x2f, // [ | ||
380 | 0x31, // bslash | ||
381 | 0x30, // ] | ||
382 | 0x23|SHIFT, // ^ | ||
383 | 0x2d|SHIFT, // _ | ||
384 | 0x35, // ` | ||
385 | 0x04, // a | ||
386 | 0x05, // b | ||
387 | 0x06, // c | ||
388 | 0x07, // d | ||
389 | 0x08, // e | ||
390 | 0x09, // f | ||
391 | 0x0a, // g | ||
392 | 0x0b, // h | ||
393 | 0x0c, // i | ||
394 | 0x0d, // j | ||
395 | 0x0e, // k | ||
396 | 0x0f, // l | ||
397 | 0x10, // m | ||
398 | 0x11, // n | ||
399 | 0x12, // o | ||
400 | 0x13, // p | ||
401 | 0x14, // q | ||
402 | 0x15, // r | ||
403 | 0x16, // s | ||
404 | 0x17, // t | ||
405 | 0x18, // u | ||
406 | 0x19, // v | ||
407 | 0x1a, // w | ||
408 | 0x1b, // x | ||
409 | 0x1c, // y | ||
410 | 0x1d, // z | ||
411 | 0x2f|SHIFT, // | ||
412 | 0x31|SHIFT, // | | ||
413 | 0x30|SHIFT, // } | ||
414 | 0x35|SHIFT, // ~ | ||
415 | 0 // DEL | ||
416 | }; | ||
417 | |||
418 | uint8_t USBPutChar(uint8_t c); | ||
419 | |||
420 | // press() adds the specified key (printing, non-printing, or modifier) | ||
421 | // to the persistent key report and sends the report. Because of the way | ||
422 | // USB HID works, the host acts like the key remains pressed until we | ||
423 | // call release(), releaseAll(), or otherwise clear the report and resend. | ||
424 | size_t Keyboard_::press(uint8_t k) | ||
425 | { | ||
426 | uint8_t i; | ||
427 | if (k >= 136) { // it's a non-printing key (not a modifier) | ||
428 | k = k - 136; | ||
429 | } else if (k >= 128) { // it's a modifier key | ||
430 | _keyReport.modifiers |= (1<<(k-128)); | ||
431 | k = 0; | ||
432 | } else { // it's a printing key | ||
433 | k = pgm_read_byte(_asciimap + k); | ||
434 | if (!k) { | ||
435 | setWriteError(); | ||
436 | return 0; | ||
437 | } | ||
438 | if (k & 0x80) { // it's a capital letter or other character reached with shift | ||
439 | _keyReport.modifiers |= 0x02; // the left shift modifier | ||
440 | k &= 0x7F; | ||
441 | } | ||
442 | } | ||
443 | |||
444 | // Add k to the key report only if it's not already present | ||
445 | // and if there is an empty slot. | ||
446 | if (_keyReport.keys[0] != k && _keyReport.keys[1] != k && | ||
447 | _keyReport.keys[2] != k && _keyReport.keys[3] != k && | ||
448 | _keyReport.keys[4] != k && _keyReport.keys[5] != k) { | ||
449 | |||
450 | for (i=0; i<6; i++) { | ||
451 | if (_keyReport.keys[i] == 0x00) { | ||
452 | _keyReport.keys[i] = k; | ||
453 | break; | ||
454 | } | ||
455 | } | ||
456 | if (i == 6) { | ||
457 | setWriteError(); | ||
458 | return 0; | ||
459 | } | ||
460 | } | ||
461 | sendReport(&_keyReport); | ||
462 | return 1; | ||
463 | } | ||
464 | |||
465 | // release() takes the specified key out of the persistent key report and | ||
466 | // sends the report. This tells the OS the key is no longer pressed and that | ||
467 | // it shouldn't be repeated any more. | ||
468 | size_t Keyboard_::release(uint8_t k) | ||
469 | { | ||
470 | uint8_t i; | ||
471 | if (k >= 136) { // it's a non-printing key (not a modifier) | ||
472 | k = k - 136; | ||
473 | } else if (k >= 128) { // it's a modifier key | ||
474 | _keyReport.modifiers &= ~(1<<(k-128)); | ||
475 | k = 0; | ||
476 | } else { // it's a printing key | ||
477 | k = pgm_read_byte(_asciimap + k); | ||
478 | if (!k) { | ||
479 | return 0; | ||
480 | } | ||
481 | if (k & 0x80) { // it's a capital letter or other character reached with shift | ||
482 | _keyReport.modifiers &= ~(0x02); // the left shift modifier | ||
483 | k &= 0x7F; | ||
484 | } | ||
485 | } | ||
486 | |||
487 | // Test the key report to see if k is present. Clear it if it exists. | ||
488 | // Check all positions in case the key is present more than once (which it shouldn't be) | ||
489 | for (i=0; i<6; i++) { | ||
490 | if (0 != k && _keyReport.keys[i] == k) { | ||
491 | _keyReport.keys[i] = 0x00; | ||
492 | } | ||
493 | } | ||
494 | |||
495 | sendReport(&_keyReport); | ||
496 | return 1; | ||
497 | } | ||
498 | |||
499 | void Keyboard_::releaseAll(void) | ||
500 | { | ||
501 | _keyReport.keys[0] = 0; | ||
502 | _keyReport.keys[1] = 0; | ||
503 | _keyReport.keys[2] = 0; | ||
504 | _keyReport.keys[3] = 0; | ||
505 | _keyReport.keys[4] = 0; | ||
506 | _keyReport.keys[5] = 0; | ||
507 | _keyReport.modifiers = 0; | ||
508 | sendReport(&_keyReport); | ||
509 | } | ||
510 | |||
511 | size_t Keyboard_::write(uint8_t c) | ||
512 | { | ||
513 | uint8_t p = press(c); // Keydown | ||
514 | uint8_t r = release(c); // Keyup | ||
515 | return (p); // just return the result of press() since release() almost always returns 1 | ||
516 | } | ||
517 | |||
518 | #endif | ||
519 | |||
520 | #endif /* if defined(USBCON) */ \ No newline at end of file | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.cpp new file mode 100644 index 000000000..f40ddee06 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.cpp | |||
@@ -0,0 +1,428 @@ | |||
1 | /* | ||
2 | HardwareSerial.cpp - Hardware serial library for Wiring | ||
3 | Copyright (c) 2006 Nicholas Zambetti. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | |||
19 | Modified 23 November 2006 by David A. Mellis | ||
20 | Modified 28 September 2010 by Mark Sproul | ||
21 | */ | ||
22 | |||
23 | #include <stdlib.h> | ||
24 | #include <stdio.h> | ||
25 | #include <string.h> | ||
26 | #include <inttypes.h> | ||
27 | #include "Arduino.h" | ||
28 | #include "wiring_private.h" | ||
29 | |||
30 | // this next line disables the entire HardwareSerial.cpp, | ||
31 | // this is so I can support Attiny series and any other chip without a uart | ||
32 | #if defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H) | ||
33 | |||
34 | #include "HardwareSerial.h" | ||
35 | |||
36 | // Define constants and variables for buffering incoming serial data. We're | ||
37 | // using a ring buffer (I think), in which head is the index of the location | ||
38 | // to which to write the next incoming character and tail is the index of the | ||
39 | // location from which to read. | ||
40 | #if (RAMEND < 1000) | ||
41 | #define SERIAL_BUFFER_SIZE 16 | ||
42 | #else | ||
43 | #define SERIAL_BUFFER_SIZE 64 | ||
44 | #endif | ||
45 | |||
46 | struct ring_buffer | ||
47 | { | ||
48 | unsigned char buffer[SERIAL_BUFFER_SIZE]; | ||
49 | volatile unsigned int head; | ||
50 | volatile unsigned int tail; | ||
51 | }; | ||
52 | |||
53 | #if defined(USBCON) | ||
54 | ring_buffer rx_buffer = { { 0 }, 0, 0}; | ||
55 | ring_buffer tx_buffer = { { 0 }, 0, 0}; | ||
56 | #endif | ||
57 | #if defined(UBRRH) || defined(UBRR0H) | ||
58 | ring_buffer rx_buffer = { { 0 }, 0, 0 }; | ||
59 | ring_buffer tx_buffer = { { 0 }, 0, 0 }; | ||
60 | #endif | ||
61 | #if defined(UBRR1H) | ||
62 | ring_buffer rx_buffer1 = { { 0 }, 0, 0 }; | ||
63 | ring_buffer tx_buffer1 = { { 0 }, 0, 0 }; | ||
64 | #endif | ||
65 | #if defined(UBRR2H) | ||
66 | ring_buffer rx_buffer2 = { { 0 }, 0, 0 }; | ||
67 | ring_buffer tx_buffer2 = { { 0 }, 0, 0 }; | ||
68 | #endif | ||
69 | #if defined(UBRR3H) | ||
70 | ring_buffer rx_buffer3 = { { 0 }, 0, 0 }; | ||
71 | ring_buffer tx_buffer3 = { { 0 }, 0, 0 }; | ||
72 | #endif | ||
73 | |||
74 | inline void store_char(unsigned char c, ring_buffer *buffer) | ||
75 | { | ||
76 | int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; | ||
77 | |||
78 | // if we should be storing the received character into the location | ||
79 | // just before the tail (meaning that the head would advance to the | ||
80 | // current location of the tail), we're about to overflow the buffer | ||
81 | // and so we don't write the character or advance the head. | ||
82 | if (i != buffer->tail) { | ||
83 | buffer->buffer[buffer->head] = c; | ||
84 | buffer->head = i; | ||
85 | } | ||
86 | } | ||
87 | |||
88 | #if !defined(USART0_RX_vect) && defined(USART1_RX_vect) | ||
89 | // do nothing - on the 32u4 the first USART is USART1 | ||
90 | #else | ||
91 | #if !defined(USART_RX_vect) && !defined(SIG_USART0_RECV) && \ | ||
92 | !defined(SIG_UART0_RECV) && !defined(USART0_RX_vect) && \ | ||
93 | !defined(SIG_UART_RECV) | ||
94 | #error "Don't know what the Data Received vector is called for the first UART" | ||
95 | #else | ||
96 | void serialEvent() __attribute__((weak)); | ||
97 | void serialEvent() {} | ||
98 | #define serialEvent_implemented | ||
99 | #if defined(USART_RX_vect) | ||
100 | SIGNAL(USART_RX_vect) | ||
101 | #elif defined(SIG_USART0_RECV) | ||
102 | SIGNAL(SIG_USART0_RECV) | ||
103 | #elif defined(SIG_UART0_RECV) | ||
104 | SIGNAL(SIG_UART0_RECV) | ||
105 | #elif defined(USART0_RX_vect) | ||
106 | SIGNAL(USART0_RX_vect) | ||
107 | #elif defined(SIG_UART_RECV) | ||
108 | SIGNAL(SIG_UART_RECV) | ||
109 | #endif | ||
110 | { | ||
111 | #if defined(UDR0) | ||
112 | unsigned char c = UDR0; | ||
113 | #elif defined(UDR) | ||
114 | unsigned char c = UDR; | ||
115 | #else | ||
116 | #error UDR not defined | ||
117 | #endif | ||
118 | store_char(c, &rx_buffer); | ||
119 | } | ||
120 | #endif | ||
121 | #endif | ||
122 | |||
123 | #if defined(USART1_RX_vect) | ||
124 | void serialEvent1() __attribute__((weak)); | ||
125 | void serialEvent1() {} | ||
126 | #define serialEvent1_implemented | ||
127 | SIGNAL(USART1_RX_vect) | ||
128 | { | ||
129 | unsigned char c = UDR1; | ||
130 | store_char(c, &rx_buffer1); | ||
131 | } | ||
132 | #elif defined(SIG_USART1_RECV) | ||
133 | #error SIG_USART1_RECV | ||
134 | #endif | ||
135 | |||
136 | #if defined(USART2_RX_vect) && defined(UDR2) | ||
137 | void serialEvent2() __attribute__((weak)); | ||
138 | void serialEvent2() {} | ||
139 | #define serialEvent2_implemented | ||
140 | SIGNAL(USART2_RX_vect) | ||
141 | { | ||
142 | unsigned char c = UDR2; | ||
143 | store_char(c, &rx_buffer2); | ||
144 | } | ||
145 | #elif defined(SIG_USART2_RECV) | ||
146 | #error SIG_USART2_RECV | ||
147 | #endif | ||
148 | |||
149 | #if defined(USART3_RX_vect) && defined(UDR3) | ||
150 | void serialEvent3() __attribute__((weak)); | ||
151 | void serialEvent3() {} | ||
152 | #define serialEvent3_implemented | ||
153 | SIGNAL(USART3_RX_vect) | ||
154 | { | ||
155 | unsigned char c = UDR3; | ||
156 | store_char(c, &rx_buffer3); | ||
157 | } | ||
158 | #elif defined(SIG_USART3_RECV) | ||
159 | #error SIG_USART3_RECV | ||
160 | #endif | ||
161 | |||
162 | void serialEventRun(void) | ||
163 | { | ||
164 | #ifdef serialEvent_implemented | ||
165 | if (Serial.available()) serialEvent(); | ||
166 | #endif | ||
167 | #ifdef serialEvent1_implemented | ||
168 | if (Serial1.available()) serialEvent1(); | ||
169 | #endif | ||
170 | #ifdef serialEvent2_implemented | ||
171 | if (Serial2.available()) serialEvent2(); | ||
172 | #endif | ||
173 | #ifdef serialEvent3_implemented | ||
174 | if (Serial3.available()) serialEvent3(); | ||
175 | #endif | ||
176 | } | ||
177 | |||
178 | |||
179 | #if !defined(USART0_UDRE_vect) && defined(USART1_UDRE_vect) | ||
180 | // do nothing - on the 32u4 the first USART is USART1 | ||
181 | #else | ||
182 | #if !defined(UART0_UDRE_vect) && !defined(UART_UDRE_vect) && !defined(USART0_UDRE_vect) && !defined(USART_UDRE_vect) | ||
183 | #error "Don't know what the Data Register Empty vector is called for the first UART" | ||
184 | #else | ||
185 | #if defined(UART0_UDRE_vect) | ||
186 | ISR(UART0_UDRE_vect) | ||
187 | #elif defined(UART_UDRE_vect) | ||
188 | ISR(UART_UDRE_vect) | ||
189 | #elif defined(USART0_UDRE_vect) | ||
190 | ISR(USART0_UDRE_vect) | ||
191 | #elif defined(USART_UDRE_vect) | ||
192 | ISR(USART_UDRE_vect) | ||
193 | #endif | ||
194 | { | ||
195 | if (tx_buffer.head == tx_buffer.tail) { | ||
196 | // Buffer empty, so disable interrupts | ||
197 | #if defined(UCSR0B) | ||
198 | cbi(UCSR0B, UDRIE0); | ||
199 | #else | ||
200 | cbi(UCSRB, UDRIE); | ||
201 | #endif | ||
202 | } | ||
203 | else { | ||
204 | // There is more data in the output buffer. Send the next byte | ||
205 | unsigned char c = tx_buffer.buffer[tx_buffer.tail]; | ||
206 | tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; | ||
207 | |||
208 | #if defined(UDR0) | ||
209 | UDR0 = c; | ||
210 | #elif defined(UDR) | ||
211 | UDR = c; | ||
212 | #else | ||
213 | #error UDR not defined | ||
214 | #endif | ||
215 | } | ||
216 | } | ||
217 | #endif | ||
218 | #endif | ||
219 | |||
220 | #ifdef USART1_UDRE_vect | ||
221 | ISR(USART1_UDRE_vect) | ||
222 | { | ||
223 | if (tx_buffer1.head == tx_buffer1.tail) { | ||
224 | // Buffer empty, so disable interrupts | ||
225 | cbi(UCSR1B, UDRIE1); | ||
226 | } | ||
227 | else { | ||
228 | // There is more data in the output buffer. Send the next byte | ||
229 | unsigned char c = tx_buffer1.buffer[tx_buffer1.tail]; | ||
230 | tx_buffer1.tail = (tx_buffer1.tail + 1) % SERIAL_BUFFER_SIZE; | ||
231 | |||
232 | UDR1 = c; | ||
233 | } | ||
234 | } | ||
235 | #endif | ||
236 | |||
237 | #ifdef USART2_UDRE_vect | ||
238 | ISR(USART2_UDRE_vect) | ||
239 | { | ||
240 | if (tx_buffer2.head == tx_buffer2.tail) { | ||
241 | // Buffer empty, so disable interrupts | ||
242 | cbi(UCSR2B, UDRIE2); | ||
243 | } | ||
244 | else { | ||
245 | // There is more data in the output buffer. Send the next byte | ||
246 | unsigned char c = tx_buffer2.buffer[tx_buffer2.tail]; | ||
247 | tx_buffer2.tail = (tx_buffer2.tail + 1) % SERIAL_BUFFER_SIZE; | ||
248 | |||
249 | UDR2 = c; | ||
250 | } | ||
251 | } | ||
252 | #endif | ||
253 | |||
254 | #ifdef USART3_UDRE_vect | ||
255 | ISR(USART3_UDRE_vect) | ||
256 | { | ||
257 | if (tx_buffer3.head == tx_buffer3.tail) { | ||
258 | // Buffer empty, so disable interrupts | ||
259 | cbi(UCSR3B, UDRIE3); | ||
260 | } | ||
261 | else { | ||
262 | // There is more data in the output buffer. Send the next byte | ||
263 | unsigned char c = tx_buffer3.buffer[tx_buffer3.tail]; | ||
264 | tx_buffer3.tail = (tx_buffer3.tail + 1) % SERIAL_BUFFER_SIZE; | ||
265 | |||
266 | UDR3 = c; | ||
267 | } | ||
268 | } | ||
269 | #endif | ||
270 | |||
271 | |||
272 | // Constructors //////////////////////////////////////////////////////////////// | ||
273 | |||
274 | HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer, | ||
275 | volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, | ||
276 | volatile uint8_t *ucsra, volatile uint8_t *ucsrb, | ||
277 | volatile uint8_t *udr, | ||
278 | uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x) | ||
279 | { | ||
280 | _rx_buffer = rx_buffer; | ||
281 | _tx_buffer = tx_buffer; | ||
282 | _ubrrh = ubrrh; | ||
283 | _ubrrl = ubrrl; | ||
284 | _ucsra = ucsra; | ||
285 | _ucsrb = ucsrb; | ||
286 | _udr = udr; | ||
287 | _rxen = rxen; | ||
288 | _txen = txen; | ||
289 | _rxcie = rxcie; | ||
290 | _udrie = udrie; | ||
291 | _u2x = u2x; | ||
292 | } | ||
293 | |||
294 | // Public Methods ////////////////////////////////////////////////////////////// | ||
295 | |||
296 | void HardwareSerial::begin(unsigned long baud) | ||
297 | { | ||
298 | uint16_t baud_setting; | ||
299 | bool use_u2x = true; | ||
300 | |||
301 | #if F_CPU == 16000000UL | ||
302 | // hardcoded exception for compatibility with the bootloader shipped | ||
303 | // with the Duemilanove and previous boards and the firmware on the 8U2 | ||
304 | // on the Uno and Mega 2560. | ||
305 | if (baud == 57600) { | ||
306 | use_u2x = false; | ||
307 | } | ||
308 | #endif | ||
309 | |||
310 | try_again: | ||
311 | |||
312 | if (use_u2x) { | ||
313 | *_ucsra = 1 << _u2x; | ||
314 | baud_setting = (F_CPU / 4 / baud - 1) / 2; | ||
315 | } else { | ||
316 | *_ucsra = 0; | ||
317 | baud_setting = (F_CPU / 8 / baud - 1) / 2; | ||
318 | } | ||
319 | |||
320 | if ((baud_setting > 4095) && use_u2x) | ||
321 | { | ||
322 | use_u2x = false; | ||
323 | goto try_again; | ||
324 | } | ||
325 | |||
326 | // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) | ||
327 | *_ubrrh = baud_setting >> 8; | ||
328 | *_ubrrl = baud_setting; | ||
329 | |||
330 | sbi(*_ucsrb, _rxen); | ||
331 | sbi(*_ucsrb, _txen); | ||
332 | sbi(*_ucsrb, _rxcie); | ||
333 | cbi(*_ucsrb, _udrie); | ||
334 | } | ||
335 | |||
336 | void HardwareSerial::end() | ||
337 | { | ||
338 | // wait for transmission of outgoing data | ||
339 | while (_tx_buffer->head != _tx_buffer->tail) | ||
340 | ; | ||
341 | |||
342 | cbi(*_ucsrb, _rxen); | ||
343 | cbi(*_ucsrb, _txen); | ||
344 | cbi(*_ucsrb, _rxcie); | ||
345 | cbi(*_ucsrb, _udrie); | ||
346 | |||
347 | // clear any received data | ||
348 | _rx_buffer->head = _rx_buffer->tail; | ||
349 | } | ||
350 | |||
351 | int HardwareSerial::available(void) | ||
352 | { | ||
353 | return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE; | ||
354 | } | ||
355 | |||
356 | int HardwareSerial::peek(void) | ||
357 | { | ||
358 | if (_rx_buffer->head == _rx_buffer->tail) { | ||
359 | return -1; | ||
360 | } else { | ||
361 | return _rx_buffer->buffer[_rx_buffer->tail]; | ||
362 | } | ||
363 | } | ||
364 | |||
365 | int HardwareSerial::read(void) | ||
366 | { | ||
367 | // if the head isn't ahead of the tail, we don't have any characters | ||
368 | if (_rx_buffer->head == _rx_buffer->tail) { | ||
369 | return -1; | ||
370 | } else { | ||
371 | unsigned char c = _rx_buffer->buffer[_rx_buffer->tail]; | ||
372 | _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE; | ||
373 | return c; | ||
374 | } | ||
375 | } | ||
376 | |||
377 | void HardwareSerial::flush() | ||
378 | { | ||
379 | while (_tx_buffer->head != _tx_buffer->tail) | ||
380 | ; | ||
381 | } | ||
382 | |||
383 | size_t HardwareSerial::write(uint8_t c) | ||
384 | { | ||
385 | int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE; | ||
386 | |||
387 | // If the output buffer is full, there's nothing for it other than to | ||
388 | // wait for the interrupt handler to empty it a bit | ||
389 | // ???: return 0 here instead? | ||
390 | while (i == _tx_buffer->tail) | ||
391 | ; | ||
392 | |||
393 | _tx_buffer->buffer[_tx_buffer->head] = c; | ||
394 | _tx_buffer->head = i; | ||
395 | |||
396 | sbi(*_ucsrb, _udrie); | ||
397 | |||
398 | return 1; | ||
399 | } | ||
400 | |||
401 | HardwareSerial::operator bool() { | ||
402 | return true; | ||
403 | } | ||
404 | |||
405 | // Preinstantiate Objects ////////////////////////////////////////////////////// | ||
406 | |||
407 | #if defined(UBRRH) && defined(UBRRL) | ||
408 | HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X); | ||
409 | #elif defined(UBRR0H) && defined(UBRR0L) | ||
410 | HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRIE0, U2X0); | ||
411 | #elif defined(USBCON) | ||
412 | // do nothing - Serial object and buffers are initialized in CDC code | ||
413 | #else | ||
414 | #error no serial port defined (port 0) | ||
415 | #endif | ||
416 | |||
417 | #if defined(UBRR1H) | ||
418 | HardwareSerial Serial1(&rx_buffer1, &tx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRIE1, U2X1); | ||
419 | #endif | ||
420 | #if defined(UBRR2H) | ||
421 | HardwareSerial Serial2(&rx_buffer2, &tx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRIE2, U2X2); | ||
422 | #endif | ||
423 | #if defined(UBRR3H) | ||
424 | HardwareSerial Serial3(&rx_buffer3, &tx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); | ||
425 | #endif | ||
426 | |||
427 | #endif // whole file | ||
428 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.h new file mode 100644 index 000000000..bf4924c6d --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/HardwareSerial.h | |||
@@ -0,0 +1,81 @@ | |||
1 | /* | ||
2 | HardwareSerial.h - Hardware serial library for Wiring | ||
3 | Copyright (c) 2006 Nicholas Zambetti. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | |||
19 | Modified 28 September 2010 by Mark Sproul | ||
20 | */ | ||
21 | |||
22 | #ifndef HardwareSerial_h | ||
23 | #define HardwareSerial_h | ||
24 | |||
25 | #include <inttypes.h> | ||
26 | |||
27 | #include "Stream.h" | ||
28 | |||
29 | struct ring_buffer; | ||
30 | |||
31 | class HardwareSerial : public Stream | ||
32 | { | ||
33 | private: | ||
34 | ring_buffer *_rx_buffer; | ||
35 | ring_buffer *_tx_buffer; | ||
36 | volatile uint8_t *_ubrrh; | ||
37 | volatile uint8_t *_ubrrl; | ||
38 | volatile uint8_t *_ucsra; | ||
39 | volatile uint8_t *_ucsrb; | ||
40 | volatile uint8_t *_udr; | ||
41 | uint8_t _rxen; | ||
42 | uint8_t _txen; | ||
43 | uint8_t _rxcie; | ||
44 | uint8_t _udrie; | ||
45 | uint8_t _u2x; | ||
46 | public: | ||
47 | HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer, | ||
48 | volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, | ||
49 | volatile uint8_t *ucsra, volatile uint8_t *ucsrb, | ||
50 | volatile uint8_t *udr, | ||
51 | uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x); | ||
52 | void begin(unsigned long); | ||
53 | void end(); | ||
54 | virtual int available(void); | ||
55 | virtual int peek(void); | ||
56 | virtual int read(void); | ||
57 | virtual void flush(void); | ||
58 | virtual size_t write(uint8_t); | ||
59 | using Print::write; // pull in write(str) and write(buf, size) from Print | ||
60 | operator bool(); | ||
61 | }; | ||
62 | |||
63 | #if defined(UBRRH) || defined(UBRR0H) | ||
64 | extern HardwareSerial Serial; | ||
65 | #elif defined(USBCON) | ||
66 | #include "USBAPI.h" | ||
67 | // extern HardwareSerial Serial_; | ||
68 | #endif | ||
69 | #if defined(UBRR1H) | ||
70 | extern HardwareSerial Serial1; | ||
71 | #endif | ||
72 | #if defined(UBRR2H) | ||
73 | extern HardwareSerial Serial2; | ||
74 | #endif | ||
75 | #if defined(UBRR3H) | ||
76 | extern HardwareSerial Serial3; | ||
77 | #endif | ||
78 | |||
79 | extern void serialEventRun(void) __attribute__((weak)); | ||
80 | |||
81 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.cpp new file mode 100644 index 000000000..fe3deb77a --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.cpp | |||
@@ -0,0 +1,56 @@ | |||
1 | |||
2 | #include <Arduino.h> | ||
3 | #include <IPAddress.h> | ||
4 | |||
5 | IPAddress::IPAddress() | ||
6 | { | ||
7 | memset(_address, 0, sizeof(_address)); | ||
8 | } | ||
9 | |||
10 | IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) | ||
11 | { | ||
12 | _address[0] = first_octet; | ||
13 | _address[1] = second_octet; | ||
14 | _address[2] = third_octet; | ||
15 | _address[3] = fourth_octet; | ||
16 | } | ||
17 | |||
18 | IPAddress::IPAddress(uint32_t address) | ||
19 | { | ||
20 | memcpy(_address, &address, sizeof(_address)); | ||
21 | } | ||
22 | |||
23 | IPAddress::IPAddress(const uint8_t *address) | ||
24 | { | ||
25 | memcpy(_address, address, sizeof(_address)); | ||
26 | } | ||
27 | |||
28 | IPAddress& IPAddress::operator=(const uint8_t *address) | ||
29 | { | ||
30 | memcpy(_address, address, sizeof(_address)); | ||
31 | return *this; | ||
32 | } | ||
33 | |||
34 | IPAddress& IPAddress::operator=(uint32_t address) | ||
35 | { | ||
36 | memcpy(_address, (const uint8_t *)&address, sizeof(_address)); | ||
37 | return *this; | ||
38 | } | ||
39 | |||
40 | bool IPAddress::operator==(const uint8_t* addr) | ||
41 | { | ||
42 | return memcmp(addr, _address, sizeof(_address)) == 0; | ||
43 | } | ||
44 | |||
45 | size_t IPAddress::printTo(Print& p) const | ||
46 | { | ||
47 | size_t n = 0; | ||
48 | for (int i =0; i < 3; i++) | ||
49 | { | ||
50 | n += p.print(_address[i], DEC); | ||
51 | n += p.print('.'); | ||
52 | } | ||
53 | n += p.print(_address[3], DEC); | ||
54 | return n; | ||
55 | } | ||
56 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.h new file mode 100644 index 000000000..2585aec0e --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/IPAddress.h | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * | ||
3 | * MIT License: | ||
4 | * Copyright (c) 2011 Adrian McEwen | ||
5 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
6 | * of this software and associated documentation files (the "Software"), to deal | ||
7 | * in the Software without restriction, including without limitation the rights | ||
8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
9 | * copies of the Software, and to permit persons to whom the Software is | ||
10 | * furnished to do so, subject to the following conditions: | ||
11 | * | ||
12 | * The above copyright notice and this permission notice shall be included in | ||
13 | * all copies or substantial portions of the Software. | ||
14 | * | ||
15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
21 | * THE SOFTWARE. | ||
22 | * | ||
23 | * adrianm@mcqn.com 1/1/2011 | ||
24 | */ | ||
25 | |||
26 | #ifndef IPAddress_h | ||
27 | #define IPAddress_h | ||
28 | |||
29 | #include <Printable.h> | ||
30 | |||
31 | // A class to make it easier to handle and pass around IP addresses | ||
32 | |||
33 | class IPAddress : public Printable { | ||
34 | private: | ||
35 | uint8_t _address[4]; // IPv4 address | ||
36 | // Access the raw byte array containing the address. Because this returns a pointer | ||
37 | // to the internal structure rather than a copy of the address this function should only | ||
38 | // be used when you know that the usage of the returned uint8_t* will be transient and not | ||
39 | // stored. | ||
40 | uint8_t* raw_address() { return _address; }; | ||
41 | |||
42 | public: | ||
43 | // Constructors | ||
44 | IPAddress(); | ||
45 | IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet); | ||
46 | IPAddress(uint32_t address); | ||
47 | IPAddress(const uint8_t *address); | ||
48 | |||
49 | // Overloaded cast operator to allow IPAddress objects to be used where a pointer | ||
50 | // to a four-byte uint8_t array is expected | ||
51 | operator uint32_t() { return *((uint32_t*)_address); }; | ||
52 | bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); }; | ||
53 | bool operator==(const uint8_t* addr); | ||
54 | |||
55 | // Overloaded index operator to allow getting and setting individual octets of the address | ||
56 | uint8_t operator[](int index) const { return _address[index]; }; | ||
57 | uint8_t& operator[](int index) { return _address[index]; }; | ||
58 | |||
59 | // Overloaded copy operators to allow initialisation of IPAddress objects from other types | ||
60 | IPAddress& operator=(const uint8_t *address); | ||
61 | IPAddress& operator=(uint32_t address); | ||
62 | |||
63 | virtual size_t printTo(Print& p) const; | ||
64 | |||
65 | friend class EthernetClass; | ||
66 | friend class UDP; | ||
67 | friend class Client; | ||
68 | friend class Server; | ||
69 | friend class DhcpClass; | ||
70 | friend class DNSClient; | ||
71 | }; | ||
72 | |||
73 | const IPAddress INADDR_NONE(0,0,0,0); | ||
74 | |||
75 | |||
76 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Platform.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Platform.h new file mode 100644 index 000000000..8b8f74277 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Platform.h | |||
@@ -0,0 +1,23 @@ | |||
1 | |||
2 | #ifndef __PLATFORM_H__ | ||
3 | #define __PLATFORM_H__ | ||
4 | |||
5 | #include <inttypes.h> | ||
6 | #include <avr/pgmspace.h> | ||
7 | #include <avr/eeprom.h> | ||
8 | #include <avr/interrupt.h> | ||
9 | #include <util/delay.h> | ||
10 | |||
11 | typedef unsigned char u8; | ||
12 | typedef unsigned short u16; | ||
13 | typedef unsigned long u32; | ||
14 | |||
15 | #include "Arduino.h" | ||
16 | |||
17 | #if defined(USBCON) | ||
18 | #include "USBDesc.h" | ||
19 | #include "USBCore.h" | ||
20 | #include "USBAPI.h" | ||
21 | #endif /* if defined(USBCON) */ | ||
22 | |||
23 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.cpp new file mode 100644 index 000000000..e541a6ce7 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.cpp | |||
@@ -0,0 +1,263 @@ | |||
1 | /* | ||
2 | Print.cpp - Base class that provides print() and println() | ||
3 | Copyright (c) 2008 David A. Mellis. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | |||
19 | Modified 23 November 2006 by David A. Mellis | ||
20 | */ | ||
21 | |||
22 | #include <stdlib.h> | ||
23 | #include <stdio.h> | ||
24 | #include <string.h> | ||
25 | #include <math.h> | ||
26 | #include "Arduino.h" | ||
27 | |||
28 | #include "Print.h" | ||
29 | |||
30 | // Public Methods ////////////////////////////////////////////////////////////// | ||
31 | |||
32 | /* default implementation: may be overridden */ | ||
33 | size_t Print::write(const uint8_t *buffer, size_t size) | ||
34 | { | ||
35 | size_t n = 0; | ||
36 | while (size--) { | ||
37 | n += write(*buffer++); | ||
38 | } | ||
39 | return n; | ||
40 | } | ||
41 | |||
42 | size_t Print::print(const __FlashStringHelper *ifsh) | ||
43 | { | ||
44 | const char PROGMEM *p = (const char PROGMEM *)ifsh; | ||
45 | size_t n = 0; | ||
46 | while (1) { | ||
47 | unsigned char c = pgm_read_byte(p++); | ||
48 | if (c == 0) break; | ||
49 | n += write(c); | ||
50 | } | ||
51 | return n; | ||
52 | } | ||
53 | |||
54 | size_t Print::print(const String &s) | ||
55 | { | ||
56 | size_t n = 0; | ||
57 | for (uint16_t i = 0; i < s.length(); i++) { | ||
58 | n += write(s[i]); | ||
59 | } | ||
60 | return n; | ||
61 | } | ||
62 | |||
63 | size_t Print::print(const char str[]) | ||
64 | { | ||
65 | return write(str); | ||
66 | } | ||
67 | |||
68 | size_t Print::print(char c) | ||
69 | { | ||
70 | return write(c); | ||
71 | } | ||
72 | |||
73 | size_t Print::print(unsigned char b, int base) | ||
74 | { | ||
75 | return print((unsigned long) b, base); | ||
76 | } | ||
77 | |||
78 | size_t Print::print(int n, int base) | ||
79 | { | ||
80 | return print((long) n, base); | ||
81 | } | ||
82 | |||
83 | size_t Print::print(unsigned int n, int base) | ||
84 | { | ||
85 | return print((unsigned long) n, base); | ||
86 | } | ||
87 | |||
88 | size_t Print::print(long n, int base) | ||
89 | { | ||
90 | if (base == 0) { | ||
91 | return write(n); | ||
92 | } else if (base == 10) { | ||
93 | if (n < 0) { | ||
94 | int t = print('-'); | ||
95 | n = -n; | ||
96 | return printNumber(n, 10) + t; | ||
97 | } | ||
98 | return printNumber(n, 10); | ||
99 | } else { | ||
100 | return printNumber(n, base); | ||
101 | } | ||
102 | } | ||
103 | |||
104 | size_t Print::print(unsigned long n, int base) | ||
105 | { | ||
106 | if (base == 0) return write(n); | ||
107 | else return printNumber(n, base); | ||
108 | } | ||
109 | |||
110 | size_t Print::print(double n, int digits) | ||
111 | { | ||
112 | return printFloat(n, digits); | ||
113 | } | ||
114 | |||
115 | size_t Print::println(const __FlashStringHelper *ifsh) | ||
116 | { | ||
117 | size_t n = print(ifsh); | ||
118 | n += println(); | ||
119 | return n; | ||
120 | } | ||
121 | |||
122 | size_t Print::print(const Printable& x) | ||
123 | { | ||
124 | return x.printTo(*this); | ||
125 | } | ||
126 | |||
127 | size_t Print::println(void) | ||
128 | { | ||
129 | size_t n = print('\r'); | ||
130 | n += print('\n'); | ||
131 | return n; | ||
132 | } | ||
133 | |||
134 | size_t Print::println(const String &s) | ||
135 | { | ||
136 | size_t n = print(s); | ||
137 | n += println(); | ||
138 | return n; | ||
139 | } | ||
140 | |||
141 | size_t Print::println(const char c[]) | ||
142 | { | ||
143 | size_t n = print(c); | ||
144 | n += println(); | ||
145 | return n; | ||
146 | } | ||
147 | |||
148 | size_t Print::println(char c) | ||
149 | { | ||
150 | size_t n = print(c); | ||
151 | n += println(); | ||
152 | return n; | ||
153 | } | ||
154 | |||
155 | size_t Print::println(unsigned char b, int base) | ||
156 | { | ||
157 | size_t n = print(b, base); | ||
158 | n += println(); | ||
159 | return n; | ||
160 | } | ||
161 | |||
162 | size_t Print::println(int num, int base) | ||
163 | { | ||
164 | size_t n = print(num, base); | ||
165 | n += println(); | ||
166 | return n; | ||
167 | } | ||
168 | |||
169 | size_t Print::println(unsigned int num, int base) | ||
170 | { | ||
171 | size_t n = print(num, base); | ||
172 | n += println(); | ||
173 | return n; | ||
174 | } | ||
175 | |||
176 | size_t Print::println(long num, int base) | ||
177 | { | ||
178 | size_t n = print(num, base); | ||
179 | n += println(); | ||
180 | return n; | ||
181 | } | ||
182 | |||
183 | size_t Print::println(unsigned long num, int base) | ||
184 | { | ||
185 | size_t n = print(num, base); | ||
186 | n += println(); | ||
187 | return n; | ||
188 | } | ||
189 | |||
190 | size_t Print::println(double num, int digits) | ||
191 | { | ||
192 | size_t n = print(num, digits); | ||
193 | n += println(); | ||
194 | return n; | ||
195 | } | ||
196 | |||
197 | size_t Print::println(const Printable& x) | ||
198 | { | ||
199 | size_t n = print(x); | ||
200 | n += println(); | ||
201 | return n; | ||
202 | } | ||
203 | |||
204 | // Private Methods ///////////////////////////////////////////////////////////// | ||
205 | |||
206 | size_t Print::printNumber(unsigned long n, uint8_t base) { | ||
207 | char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. | ||
208 | char *str = &buf[sizeof(buf) - 1]; | ||
209 | |||
210 | *str = '\0'; | ||
211 | |||
212 | // prevent crash if called with base == 1 | ||
213 | if (base < 2) base = 10; | ||
214 | |||
215 | do { | ||
216 | unsigned long m = n; | ||
217 | n /= base; | ||
218 | char c = m - base * n; | ||
219 | *--str = c < 10 ? c + '0' : c + 'A' - 10; | ||
220 | } while(n); | ||
221 | |||
222 | return write(str); | ||
223 | } | ||
224 | |||
225 | size_t Print::printFloat(double number, uint8_t digits) | ||
226 | { | ||
227 | size_t n = 0; | ||
228 | |||
229 | // Handle negative numbers | ||
230 | if (number < 0.0) | ||
231 | { | ||
232 | n += print('-'); | ||
233 | number = -number; | ||
234 | } | ||
235 | |||
236 | // Round correctly so that print(1.999, 2) prints as "2.00" | ||
237 | double rounding = 0.5; | ||
238 | for (uint8_t i=0; i<digits; ++i) | ||
239 | rounding /= 10.0; | ||
240 | |||
241 | number += rounding; | ||
242 | |||
243 | // Extract the integer part of the number and print it | ||
244 | unsigned long int_part = (unsigned long)number; | ||
245 | double remainder = number - (double)int_part; | ||
246 | n += print(int_part); | ||
247 | |||
248 | // Print the decimal point, but only if there are digits beyond | ||
249 | if (digits > 0) { | ||
250 | n += print("."); | ||
251 | } | ||
252 | |||
253 | // Extract digits from the remainder one at a time | ||
254 | while (digits-- > 0) | ||
255 | { | ||
256 | remainder *= 10.0; | ||
257 | int toPrint = int(remainder); | ||
258 | n += print(toPrint); | ||
259 | remainder -= toPrint; | ||
260 | } | ||
261 | |||
262 | return n; | ||
263 | } | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.h new file mode 100644 index 000000000..1af6b723f --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Print.h | |||
@@ -0,0 +1,78 @@ | |||
1 | /* | ||
2 | Print.h - Base class that provides print() and println() | ||
3 | Copyright (c) 2008 David A. Mellis. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | */ | ||
19 | |||
20 | #ifndef Print_h | ||
21 | #define Print_h | ||
22 | |||
23 | #include <inttypes.h> | ||
24 | #include <stdio.h> // for size_t | ||
25 | |||
26 | #include "WString.h" | ||
27 | #include "Printable.h" | ||
28 | |||
29 | #define DEC 10 | ||
30 | #define HEX 16 | ||
31 | #define OCT 8 | ||
32 | #define BIN 2 | ||
33 | |||
34 | class Print | ||
35 | { | ||
36 | private: | ||
37 | int write_error; | ||
38 | size_t printNumber(unsigned long, uint8_t); | ||
39 | size_t printFloat(double, uint8_t); | ||
40 | protected: | ||
41 | void setWriteError(int err = 1) { write_error = err; } | ||
42 | public: | ||
43 | Print() : write_error(0) {} | ||
44 | |||
45 | int getWriteError() { return write_error; } | ||
46 | void clearWriteError() { setWriteError(0); } | ||
47 | |||
48 | virtual size_t write(uint8_t) = 0; | ||
49 | size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); } | ||
50 | virtual size_t write(const uint8_t *buffer, size_t size); | ||
51 | |||
52 | size_t print(const __FlashStringHelper *); | ||
53 | size_t print(const String &); | ||
54 | size_t print(const char[]); | ||
55 | size_t print(char); | ||
56 | size_t print(unsigned char, int = DEC); | ||
57 | size_t print(int, int = DEC); | ||
58 | size_t print(unsigned int, int = DEC); | ||
59 | size_t print(long, int = DEC); | ||
60 | size_t print(unsigned long, int = DEC); | ||
61 | size_t print(double, int = 2); | ||
62 | size_t print(const Printable&); | ||
63 | |||
64 | size_t println(const __FlashStringHelper *); | ||
65 | size_t println(const String &s); | ||
66 | size_t println(const char[]); | ||
67 | size_t println(char); | ||
68 | size_t println(unsigned char, int = DEC); | ||
69 | size_t println(int, int = DEC); | ||
70 | size_t println(unsigned int, int = DEC); | ||
71 | size_t println(long, int = DEC); | ||
72 | size_t println(unsigned long, int = DEC); | ||
73 | size_t println(double, int = 2); | ||
74 | size_t println(const Printable&); | ||
75 | size_t println(void); | ||
76 | }; | ||
77 | |||
78 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Printable.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Printable.h new file mode 100644 index 000000000..d03c9af62 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Printable.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | Printable.h - Interface class that allows printing of complex types | ||
3 | Copyright (c) 2011 Adrian McEwen. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | */ | ||
19 | |||
20 | #ifndef Printable_h | ||
21 | #define Printable_h | ||
22 | |||
23 | #include <new.h> | ||
24 | |||
25 | class Print; | ||
26 | |||
27 | /** The Printable class provides a way for new classes to allow themselves to be printed. | ||
28 | By deriving from Printable and implementing the printTo method, it will then be possible | ||
29 | for users to print out instances of this class by passing them into the usual | ||
30 | Print::print and Print::println methods. | ||
31 | */ | ||
32 | |||
33 | class Printable | ||
34 | { | ||
35 | public: | ||
36 | virtual size_t printTo(Print& p) const = 0; | ||
37 | }; | ||
38 | |||
39 | #endif | ||
40 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Server.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Server.h new file mode 100644 index 000000000..9674c7626 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Server.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef server_h | ||
2 | #define server_h | ||
3 | |||
4 | class Server : public Print { | ||
5 | public: | ||
6 | virtual void begin() =0; | ||
7 | }; | ||
8 | |||
9 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.cpp new file mode 100644 index 000000000..aafb7fcf9 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.cpp | |||
@@ -0,0 +1,270 @@ | |||
1 | /* | ||
2 | Stream.cpp - adds parsing methods to Stream class | ||
3 | Copyright (c) 2008 David A. Mellis. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | |||
19 | Created July 2011 | ||
20 | parsing functions based on TextFinder library by Michael Margolis | ||
21 | */ | ||
22 | |||
23 | #include "Arduino.h" | ||
24 | #include "Stream.h" | ||
25 | |||
26 | #define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait | ||
27 | #define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field | ||
28 | |||
29 | // private method to read stream with timeout | ||
30 | int Stream::timedRead() | ||
31 | { | ||
32 | int c; | ||
33 | _startMillis = millis(); | ||
34 | do { | ||
35 | c = read(); | ||
36 | if (c >= 0) return c; | ||
37 | } while(millis() - _startMillis < _timeout); | ||
38 | return -1; // -1 indicates timeout | ||
39 | } | ||
40 | |||
41 | // private method to peek stream with timeout | ||
42 | int Stream::timedPeek() | ||
43 | { | ||
44 | int c; | ||
45 | _startMillis = millis(); | ||
46 | do { | ||
47 | c = peek(); | ||
48 | if (c >= 0) return c; | ||
49 | } while(millis() - _startMillis < _timeout); | ||
50 | return -1; // -1 indicates timeout | ||
51 | } | ||
52 | |||
53 | // returns peek of the next digit in the stream or -1 if timeout | ||
54 | // discards non-numeric characters | ||
55 | int Stream::peekNextDigit() | ||
56 | { | ||
57 | int c; | ||
58 | while (1) { | ||
59 | c = timedPeek(); | ||
60 | if (c < 0) return c; // timeout | ||
61 | if (c == '-') return c; | ||
62 | if (c >= '0' && c <= '9') return c; | ||
63 | read(); // discard non-numeric | ||
64 | } | ||
65 | } | ||
66 | |||
67 | // Public Methods | ||
68 | ////////////////////////////////////////////////////////////// | ||
69 | |||
70 | void Stream::setTimeout(unsigned long timeout) // sets the maximum number of milliseconds to wait | ||
71 | { | ||
72 | _timeout = timeout; | ||
73 | } | ||
74 | |||
75 | // find returns true if the target string is found | ||
76 | bool Stream::find(char *target) | ||
77 | { | ||
78 | return findUntil(target, NULL); | ||
79 | } | ||
80 | |||
81 | // reads data from the stream until the target string of given length is found | ||
82 | // returns true if target string is found, false if timed out | ||
83 | bool Stream::find(char *target, size_t length) | ||
84 | { | ||
85 | return findUntil(target, length, NULL, 0); | ||
86 | } | ||
87 | |||
88 | // as find but search ends if the terminator string is found | ||
89 | bool Stream::findUntil(char *target, char *terminator) | ||
90 | { | ||
91 | return findUntil(target, strlen(target), terminator, strlen(terminator)); | ||
92 | } | ||
93 | |||
94 | // reads data from the stream until the target string of the given length is found | ||
95 | // search terminated if the terminator string is found | ||
96 | // returns true if target string is found, false if terminated or timed out | ||
97 | bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t termLen) | ||
98 | { | ||
99 | size_t index = 0; // maximum target string length is 64k bytes! | ||
100 | size_t termIndex = 0; | ||
101 | int c; | ||
102 | |||
103 | if( *target == 0) | ||
104 | return true; // return true if target is a null string | ||
105 | while( (c = timedRead()) > 0){ | ||
106 | |||
107 | if(c != target[index]) | ||
108 | index = 0; // reset index if any char does not match | ||
109 | |||
110 | if( c == target[index]){ | ||
111 | //////Serial.print("found "); Serial.write(c); Serial.print("index now"); Serial.println(index+1); | ||
112 | if(++index >= targetLen){ // return true if all chars in the target match | ||
113 | return true; | ||
114 | } | ||
115 | } | ||
116 | |||
117 | if(termLen > 0 && c == terminator[termIndex]){ | ||
118 | if(++termIndex >= termLen) | ||
119 | return false; // return false if terminate string found before target string | ||
120 | } | ||
121 | else | ||
122 | termIndex = 0; | ||
123 | } | ||
124 | return false; | ||
125 | } | ||
126 | |||
127 | |||
128 | // returns the first valid (long) integer value from the current position. | ||
129 | // initial characters that are not digits (or the minus sign) are skipped | ||
130 | // function is terminated by the first character that is not a digit. | ||
131 | long Stream::parseInt() | ||
132 | { | ||
133 | return parseInt(NO_SKIP_CHAR); // terminate on first non-digit character (or timeout) | ||
134 | } | ||
135 | |||
136 | // as above but a given skipChar is ignored | ||
137 | // this allows format characters (typically commas) in values to be ignored | ||
138 | long Stream::parseInt(char skipChar) | ||
139 | { | ||
140 | boolean isNegative = false; | ||
141 | long value = 0; | ||
142 | int c; | ||
143 | |||
144 | c = peekNextDigit(); | ||
145 | // ignore non numeric leading characters | ||
146 | if(c < 0) | ||
147 | return 0; // zero returned if timeout | ||
148 | |||
149 | do{ | ||
150 | if(c == skipChar) | ||
151 | ; // ignore this charactor | ||
152 | else if(c == '-') | ||
153 | isNegative = true; | ||
154 | else if(c >= '0' && c <= '9') // is c a digit? | ||
155 | value = value * 10 + c - '0'; | ||
156 | read(); // consume the character we got with peek | ||
157 | c = timedPeek(); | ||
158 | } | ||
159 | while( (c >= '0' && c <= '9') || c == skipChar ); | ||
160 | |||
161 | if(isNegative) | ||
162 | value = -value; | ||
163 | return value; | ||
164 | } | ||
165 | |||
166 | |||
167 | // as parseInt but returns a floating point value | ||
168 | float Stream::parseFloat() | ||
169 | { | ||
170 | return parseFloat(NO_SKIP_CHAR); | ||
171 | } | ||
172 | |||
173 | // as above but the given skipChar is ignored | ||
174 | // this allows format characters (typically commas) in values to be ignored | ||
175 | float Stream::parseFloat(char skipChar){ | ||
176 | boolean isNegative = false; | ||
177 | boolean isFraction = false; | ||
178 | long value = 0; | ||
179 | char c; | ||
180 | float fraction = 1.0; | ||
181 | |||
182 | c = peekNextDigit(); | ||
183 | // ignore non numeric leading characters | ||
184 | if(c < 0) | ||
185 | return 0; // zero returned if timeout | ||
186 | |||
187 | do{ | ||
188 | if(c == skipChar) | ||
189 | ; // ignore | ||
190 | else if(c == '-') | ||
191 | isNegative = true; | ||
192 | else if (c == '.') | ||
193 | isFraction = true; | ||
194 | else if(c >= '0' && c <= '9') { // is c a digit? | ||
195 | value = value * 10 + c - '0'; | ||
196 | if(isFraction) | ||
197 | fraction *= 0.1; | ||
198 | } | ||
199 | read(); // consume the character we got with peek | ||
200 | c = timedPeek(); | ||
201 | } | ||
202 | while( (c >= '0' && c <= '9') || c == '.' || c == skipChar ); | ||
203 | |||
204 | if(isNegative) | ||
205 | value = -value; | ||
206 | if(isFraction) | ||
207 | return value * fraction; | ||
208 | else | ||
209 | return value; | ||
210 | } | ||
211 | |||
212 | // read characters from stream into buffer | ||
213 | // terminates if length characters have been read, or timeout (see setTimeout) | ||
214 | // returns the number of characters placed in the buffer | ||
215 | // the buffer is NOT null terminated. | ||
216 | // | ||
217 | size_t Stream::readBytes(char *buffer, size_t length) | ||
218 | { | ||
219 | size_t count = 0; | ||
220 | while (count < length) { | ||
221 | int c = timedRead(); | ||
222 | if (c < 0) break; | ||
223 | *buffer++ = (char)c; | ||
224 | count++; | ||
225 | } | ||
226 | return count; | ||
227 | } | ||
228 | |||
229 | |||
230 | // as readBytes with terminator character | ||
231 | // terminates if length characters have been read, timeout, or if the terminator character detected | ||
232 | // returns the number of characters placed in the buffer (0 means no valid data found) | ||
233 | |||
234 | size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length) | ||
235 | { | ||
236 | if (length < 1) return 0; | ||
237 | size_t index = 0; | ||
238 | while (index < length) { | ||
239 | int c = timedRead(); | ||
240 | if (c < 0 || c == terminator) break; | ||
241 | *buffer++ = (char)c; | ||
242 | index++; | ||
243 | } | ||
244 | return index; // return number of characters, not including null terminator | ||
245 | } | ||
246 | |||
247 | String Stream::readString() | ||
248 | { | ||
249 | String ret; | ||
250 | int c = timedRead(); | ||
251 | while (c >= 0) | ||
252 | { | ||
253 | ret += (char)c; | ||
254 | c = timedRead(); | ||
255 | } | ||
256 | return ret; | ||
257 | } | ||
258 | |||
259 | String Stream::readStringUntil(char terminator) | ||
260 | { | ||
261 | String ret; | ||
262 | int c = timedRead(); | ||
263 | while (c >= 0 && c != terminator) | ||
264 | { | ||
265 | ret += (char)c; | ||
266 | c = timedRead(); | ||
267 | } | ||
268 | return ret; | ||
269 | } | ||
270 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.h new file mode 100644 index 000000000..58bbf752f --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Stream.h | |||
@@ -0,0 +1,96 @@ | |||
1 | /* | ||
2 | Stream.h - base class for character-based streams. | ||
3 | Copyright (c) 2010 David A. Mellis. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | |||
19 | parsing functions based on TextFinder library by Michael Margolis | ||
20 | */ | ||
21 | |||
22 | #ifndef Stream_h | ||
23 | #define Stream_h | ||
24 | |||
25 | #include <inttypes.h> | ||
26 | #include "Print.h" | ||
27 | |||
28 | // compatability macros for testing | ||
29 | /* | ||
30 | #define getInt() parseInt() | ||
31 | #define getInt(skipChar) parseInt(skipchar) | ||
32 | #define getFloat() parseFloat() | ||
33 | #define getFloat(skipChar) parseFloat(skipChar) | ||
34 | #define getString( pre_string, post_string, buffer, length) | ||
35 | readBytesBetween( pre_string, terminator, buffer, length) | ||
36 | */ | ||
37 | |||
38 | class Stream : public Print | ||
39 | { | ||
40 | private: | ||
41 | unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read | ||
42 | unsigned long _startMillis; // used for timeout measurement | ||
43 | int timedRead(); // private method to read stream with timeout | ||
44 | int timedPeek(); // private method to peek stream with timeout | ||
45 | int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout | ||
46 | |||
47 | public: | ||
48 | virtual int available() = 0; | ||
49 | virtual int read() = 0; | ||
50 | virtual int peek() = 0; | ||
51 | virtual void flush() = 0; | ||
52 | |||
53 | Stream() {_timeout=1000;} | ||
54 | |||
55 | // parsing methods | ||
56 | |||
57 | void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second | ||
58 | |||
59 | bool find(char *target); // reads data from the stream until the target string is found | ||
60 | // returns true if target string is found, false if timed out (see setTimeout) | ||
61 | |||
62 | bool find(char *target, size_t length); // reads data from the stream until the target string of given length is found | ||
63 | // returns true if target string is found, false if timed out | ||
64 | |||
65 | bool findUntil(char *target, char *terminator); // as find but search ends if the terminator string is found | ||
66 | |||
67 | bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen); // as above but search ends if the terminate string is found | ||
68 | |||
69 | |||
70 | long parseInt(); // returns the first valid (long) integer value from the current position. | ||
71 | // initial characters that are not digits (or the minus sign) are skipped | ||
72 | // integer is terminated by the first character that is not a digit. | ||
73 | |||
74 | float parseFloat(); // float version of parseInt | ||
75 | |||
76 | size_t readBytes( char *buffer, size_t length); // read chars from stream into buffer | ||
77 | // terminates if length characters have been read or timeout (see setTimeout) | ||
78 | // returns the number of characters placed in the buffer (0 means no valid data found) | ||
79 | |||
80 | size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character | ||
81 | // terminates if length characters have been read, timeout, or if the terminator character detected | ||
82 | // returns the number of characters placed in the buffer (0 means no valid data found) | ||
83 | |||
84 | // Arduino String functions to be added here | ||
85 | String readString(); | ||
86 | String readStringUntil(char terminator); | ||
87 | |||
88 | protected: | ||
89 | long parseInt(char skipChar); // as above but the given skipChar is ignored | ||
90 | // as above but the given skipChar is ignored | ||
91 | // this allows format characters (typically commas) in values to be ignored | ||
92 | |||
93 | float parseFloat(char skipChar); // as above but the given skipChar is ignored | ||
94 | }; | ||
95 | |||
96 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Tone.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Tone.cpp new file mode 100644 index 000000000..20eed3f48 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Tone.cpp | |||
@@ -0,0 +1,601 @@ | |||
1 | /* Tone.cpp | ||
2 | |||
3 | A Tone Generator Library | ||
4 | |||
5 | Written by Brett Hagman | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General Public | ||
18 | License along with this library; if not, write to the Free Software | ||
19 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | |||
21 | Version Modified By Date Comments | ||
22 | ------- ----------- -------- -------- | ||
23 | 0001 B Hagman 09/08/02 Initial coding | ||
24 | 0002 B Hagman 09/08/18 Multiple pins | ||
25 | 0003 B Hagman 09/08/18 Moved initialization from constructor to begin() | ||
26 | 0004 B Hagman 09/09/26 Fixed problems with ATmega8 | ||
27 | 0005 B Hagman 09/11/23 Scanned prescalars for best fit on 8 bit timers | ||
28 | 09/11/25 Changed pin toggle method to XOR | ||
29 | 09/11/25 Fixed timer0 from being excluded | ||
30 | 0006 D Mellis 09/12/29 Replaced objects with functions | ||
31 | 0007 M Sproul 10/08/29 Changed #ifdefs from cpu to register | ||
32 | *************************************************/ | ||
33 | |||
34 | #include <avr/interrupt.h> | ||
35 | #include <avr/pgmspace.h> | ||
36 | #include "Arduino.h" | ||
37 | #include "pins_arduino.h" | ||
38 | |||
39 | #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) | ||
40 | #define TCCR2A TCCR2 | ||
41 | #define TCCR2B TCCR2 | ||
42 | #define COM2A1 COM21 | ||
43 | #define COM2A0 COM20 | ||
44 | #define OCR2A OCR2 | ||
45 | #define TIMSK2 TIMSK | ||
46 | #define OCIE2A OCIE2 | ||
47 | #define TIMER2_COMPA_vect TIMER2_COMP_vect | ||
48 | #define TIMSK1 TIMSK | ||
49 | #endif | ||
50 | |||
51 | // timerx_toggle_count: | ||
52 | // > 0 - duration specified | ||
53 | // = 0 - stopped | ||
54 | // < 0 - infinitely (until stop() method called, or new play() called) | ||
55 | |||
56 | #if !defined(__AVR_ATmega8__) | ||
57 | volatile long timer0_toggle_count; | ||
58 | volatile uint8_t *timer0_pin_port; | ||
59 | volatile uint8_t timer0_pin_mask; | ||
60 | #endif | ||
61 | |||
62 | volatile long timer1_toggle_count; | ||
63 | volatile uint8_t *timer1_pin_port; | ||
64 | volatile uint8_t timer1_pin_mask; | ||
65 | volatile long timer2_toggle_count; | ||
66 | volatile uint8_t *timer2_pin_port; | ||
67 | volatile uint8_t timer2_pin_mask; | ||
68 | |||
69 | #if defined(TIMSK3) | ||
70 | volatile long timer3_toggle_count; | ||
71 | volatile uint8_t *timer3_pin_port; | ||
72 | volatile uint8_t timer3_pin_mask; | ||
73 | #endif | ||
74 | |||
75 | #if defined(TIMSK4) | ||
76 | volatile long timer4_toggle_count; | ||
77 | volatile uint8_t *timer4_pin_port; | ||
78 | volatile uint8_t timer4_pin_mask; | ||
79 | #endif | ||
80 | |||
81 | #if defined(TIMSK5) | ||
82 | volatile long timer5_toggle_count; | ||
83 | volatile uint8_t *timer5_pin_port; | ||
84 | volatile uint8_t timer5_pin_mask; | ||
85 | #endif | ||
86 | |||
87 | |||
88 | // MLS: This does not make sense, the 3 options are the same | ||
89 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) | ||
90 | |||
91 | #define AVAILABLE_TONE_PINS 1 | ||
92 | |||
93 | const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 3, 4, 5, 1, 0 */ }; | ||
94 | static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255, 255, 255, 255 */ }; | ||
95 | |||
96 | #elif defined(__AVR_ATmega8__) | ||
97 | |||
98 | #define AVAILABLE_TONE_PINS 1 | ||
99 | |||
100 | const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1 */ }; | ||
101 | static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255 */ }; | ||
102 | |||
103 | #else | ||
104 | |||
105 | #define AVAILABLE_TONE_PINS 1 | ||
106 | |||
107 | // Leave timer 0 to last. | ||
108 | const uint8_t PROGMEM tone_pin_to_timer_PGM[] = { 2 /*, 1, 0 */ }; | ||
109 | static uint8_t tone_pins[AVAILABLE_TONE_PINS] = { 255 /*, 255, 255 */ }; | ||
110 | |||
111 | #endif | ||
112 | |||
113 | |||
114 | |||
115 | static int8_t toneBegin(uint8_t _pin) | ||
116 | { | ||
117 | int8_t _timer = -1; | ||
118 | |||
119 | // if we're already using the pin, the timer should be configured. | ||
120 | for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { | ||
121 | if (tone_pins[i] == _pin) { | ||
122 | return pgm_read_byte(tone_pin_to_timer_PGM + i); | ||
123 | } | ||
124 | } | ||
125 | |||
126 | // search for an unused timer. | ||
127 | for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { | ||
128 | if (tone_pins[i] == 255) { | ||
129 | tone_pins[i] = _pin; | ||
130 | _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); | ||
131 | break; | ||
132 | } | ||
133 | } | ||
134 | |||
135 | if (_timer != -1) | ||
136 | { | ||
137 | // Set timer specific stuff | ||
138 | // All timers in CTC mode | ||
139 | // 8 bit timers will require changing prescalar values, | ||
140 | // whereas 16 bit timers are set to either ck/1 or ck/64 prescalar | ||
141 | switch (_timer) | ||
142 | { | ||
143 | #if defined(TCCR0A) && defined(TCCR0B) | ||
144 | case 0: | ||
145 | // 8 bit timer | ||
146 | TCCR0A = 0; | ||
147 | TCCR0B = 0; | ||
148 | bitWrite(TCCR0A, WGM01, 1); | ||
149 | bitWrite(TCCR0B, CS00, 1); | ||
150 | timer0_pin_port = portOutputRegister(digitalPinToPort(_pin)); | ||
151 | timer0_pin_mask = digitalPinToBitMask(_pin); | ||
152 | break; | ||
153 | #endif | ||
154 | |||
155 | #if defined(TCCR1A) && defined(TCCR1B) && defined(WGM12) | ||
156 | case 1: | ||
157 | // 16 bit timer | ||
158 | TCCR1A = 0; | ||
159 | TCCR1B = 0; | ||
160 | bitWrite(TCCR1B, WGM12, 1); | ||
161 | bitWrite(TCCR1B, CS10, 1); | ||
162 | timer1_pin_port = portOutputRegister(digitalPinToPort(_pin)); | ||
163 | timer1_pin_mask = digitalPinToBitMask(_pin); | ||
164 | break; | ||
165 | #endif | ||
166 | |||
167 | #if defined(TCCR2A) && defined(TCCR2B) | ||
168 | case 2: | ||
169 | // 8 bit timer | ||
170 | TCCR2A = 0; | ||
171 | TCCR2B = 0; | ||
172 | bitWrite(TCCR2A, WGM21, 1); | ||
173 | bitWrite(TCCR2B, CS20, 1); | ||
174 | timer2_pin_port = portOutputRegister(digitalPinToPort(_pin)); | ||
175 | timer2_pin_mask = digitalPinToBitMask(_pin); | ||
176 | break; | ||
177 | #endif | ||
178 | |||
179 | #if defined(TCCR3A) && defined(TCCR3B) && defined(TIMSK3) | ||
180 | case 3: | ||
181 | // 16 bit timer | ||
182 | TCCR3A = 0; | ||
183 | TCCR3B = 0; | ||
184 | bitWrite(TCCR3B, WGM32, 1); | ||
185 | bitWrite(TCCR3B, CS30, 1); | ||
186 | timer3_pin_port = portOutputRegister(digitalPinToPort(_pin)); | ||
187 | timer3_pin_mask = digitalPinToBitMask(_pin); | ||
188 | break; | ||
189 | #endif | ||
190 | |||
191 | #if defined(TCCR4A) && defined(TCCR4B) && defined(TIMSK4) | ||
192 | case 4: | ||
193 | // 16 bit timer | ||
194 | TCCR4A = 0; | ||
195 | TCCR4B = 0; | ||
196 | #if defined(WGM42) | ||
197 | bitWrite(TCCR4B, WGM42, 1); | ||
198 | #elif defined(CS43) | ||
199 | #warning this may not be correct | ||
200 | // atmega32u4 | ||
201 | bitWrite(TCCR4B, CS43, 1); | ||
202 | #endif | ||
203 | bitWrite(TCCR4B, CS40, 1); | ||
204 | timer4_pin_port = portOutputRegister(digitalPinToPort(_pin)); | ||
205 | timer4_pin_mask = digitalPinToBitMask(_pin); | ||
206 | break; | ||
207 | #endif | ||
208 | |||
209 | #if defined(TCCR5A) && defined(TCCR5B) && defined(TIMSK5) | ||
210 | case 5: | ||
211 | // 16 bit timer | ||
212 | TCCR5A = 0; | ||
213 | TCCR5B = 0; | ||
214 | bitWrite(TCCR5B, WGM52, 1); | ||
215 | bitWrite(TCCR5B, CS50, 1); | ||
216 | timer5_pin_port = portOutputRegister(digitalPinToPort(_pin)); | ||
217 | timer5_pin_mask = digitalPinToBitMask(_pin); | ||
218 | break; | ||
219 | #endif | ||
220 | } | ||
221 | } | ||
222 | |||
223 | return _timer; | ||
224 | } | ||
225 | |||
226 | |||
227 | |||
228 | // frequency (in hertz) and duration (in milliseconds). | ||
229 | |||
230 | void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) | ||
231 | { | ||
232 | uint8_t prescalarbits = 0b001; | ||
233 | long toggle_count = 0; | ||
234 | uint32_t ocr = 0; | ||
235 | int8_t _timer; | ||
236 | |||
237 | _timer = toneBegin(_pin); | ||
238 | |||
239 | if (_timer >= 0) | ||
240 | { | ||
241 | // Set the pinMode as OUTPUT | ||
242 | pinMode(_pin, OUTPUT); | ||
243 | |||
244 | // if we are using an 8 bit timer, scan through prescalars to find the best fit | ||
245 | if (_timer == 0 || _timer == 2) | ||
246 | { | ||
247 | ocr = F_CPU / frequency / 2 - 1; | ||
248 | prescalarbits = 0b001; // ck/1: same for both timers | ||
249 | if (ocr > 255) | ||
250 | { | ||
251 | ocr = F_CPU / frequency / 2 / 8 - 1; | ||
252 | prescalarbits = 0b010; // ck/8: same for both timers | ||
253 | |||
254 | if (_timer == 2 && ocr > 255) | ||
255 | { | ||
256 | ocr = F_CPU / frequency / 2 / 32 - 1; | ||
257 | prescalarbits = 0b011; | ||
258 | } | ||
259 | |||
260 | if (ocr > 255) | ||
261 | { | ||
262 | ocr = F_CPU / frequency / 2 / 64 - 1; | ||
263 | prescalarbits = _timer == 0 ? 0b011 : 0b100; | ||
264 | |||
265 | if (_timer == 2 && ocr > 255) | ||
266 | { | ||
267 | ocr = F_CPU / frequency / 2 / 128 - 1; | ||
268 | prescalarbits = 0b101; | ||
269 | } | ||
270 | |||
271 | if (ocr > 255) | ||
272 | { | ||
273 | ocr = F_CPU / frequency / 2 / 256 - 1; | ||
274 | prescalarbits = _timer == 0 ? 0b100 : 0b110; | ||
275 | if (ocr > 255) | ||
276 | { | ||
277 | // can't do any better than /1024 | ||
278 | ocr = F_CPU / frequency / 2 / 1024 - 1; | ||
279 | prescalarbits = _timer == 0 ? 0b101 : 0b111; | ||
280 | } | ||
281 | } | ||
282 | } | ||
283 | } | ||
284 | |||
285 | #if defined(TCCR0B) | ||
286 | if (_timer == 0) | ||
287 | { | ||
288 | TCCR0B = prescalarbits; | ||
289 | } | ||
290 | else | ||
291 | #endif | ||
292 | #if defined(TCCR2B) | ||
293 | { | ||
294 | TCCR2B = prescalarbits; | ||
295 | } | ||
296 | #else | ||
297 | { | ||
298 | // dummy place holder to make the above ifdefs work | ||
299 | } | ||
300 | #endif | ||
301 | } | ||
302 | else | ||
303 | { | ||
304 | // two choices for the 16 bit timers: ck/1 or ck/64 | ||
305 | ocr = F_CPU / frequency / 2 - 1; | ||
306 | |||
307 | prescalarbits = 0b001; | ||
308 | if (ocr > 0xffff) | ||
309 | { | ||
310 | ocr = F_CPU / frequency / 2 / 64 - 1; | ||
311 | prescalarbits = 0b011; | ||
312 | } | ||
313 | |||
314 | if (_timer == 1) | ||
315 | { | ||
316 | #if defined(TCCR1B) | ||
317 | TCCR1B = (TCCR1B & 0b11111000) | prescalarbits; | ||
318 | #endif | ||
319 | } | ||
320 | #if defined(TCCR3B) | ||
321 | else if (_timer == 3) | ||
322 | TCCR3B = (TCCR3B & 0b11111000) | prescalarbits; | ||
323 | #endif | ||
324 | #if defined(TCCR4B) | ||
325 | else if (_timer == 4) | ||
326 | TCCR4B = (TCCR4B & 0b11111000) | prescalarbits; | ||
327 | #endif | ||
328 | #if defined(TCCR5B) | ||
329 | else if (_timer == 5) | ||
330 | TCCR5B = (TCCR5B & 0b11111000) | prescalarbits; | ||
331 | #endif | ||
332 | |||
333 | } | ||
334 | |||
335 | |||
336 | // Calculate the toggle count | ||
337 | if (duration > 0) | ||
338 | { | ||
339 | toggle_count = 2 * frequency * duration / 1000; | ||
340 | } | ||
341 | else | ||
342 | { | ||
343 | toggle_count = -1; | ||
344 | } | ||
345 | |||
346 | // Set the OCR for the given timer, | ||
347 | // set the toggle count, | ||
348 | // then turn on the interrupts | ||
349 | switch (_timer) | ||
350 | { | ||
351 | |||
352 | #if defined(OCR0A) && defined(TIMSK0) && defined(OCIE0A) | ||
353 | case 0: | ||
354 | OCR0A = ocr; | ||
355 | timer0_toggle_count = toggle_count; | ||
356 | bitWrite(TIMSK0, OCIE0A, 1); | ||
357 | break; | ||
358 | #endif | ||
359 | |||
360 | case 1: | ||
361 | #if defined(OCR1A) && defined(TIMSK1) && defined(OCIE1A) | ||
362 | OCR1A = ocr; | ||
363 | timer1_toggle_count = toggle_count; | ||
364 | bitWrite(TIMSK1, OCIE1A, 1); | ||
365 | #elif defined(OCR1A) && defined(TIMSK) && defined(OCIE1A) | ||
366 | // this combination is for at least the ATmega32 | ||
367 | OCR1A = ocr; | ||
368 | timer1_toggle_count = toggle_count; | ||
369 | bitWrite(TIMSK, OCIE1A, 1); | ||
370 | #endif | ||
371 | break; | ||
372 | |||
373 | #if defined(OCR2A) && defined(TIMSK2) && defined(OCIE2A) | ||
374 | case 2: | ||
375 | OCR2A = ocr; | ||
376 | timer2_toggle_count = toggle_count; | ||
377 | bitWrite(TIMSK2, OCIE2A, 1); | ||
378 | break; | ||
379 | #endif | ||
380 | |||
381 | #if defined(TIMSK3) | ||
382 | case 3: | ||
383 | OCR3A = ocr; | ||
384 | timer3_toggle_count = toggle_count; | ||
385 | bitWrite(TIMSK3, OCIE3A, 1); | ||
386 | break; | ||
387 | #endif | ||
388 | |||
389 | #if defined(TIMSK4) | ||
390 | case 4: | ||
391 | OCR4A = ocr; | ||
392 | timer4_toggle_count = toggle_count; | ||
393 | bitWrite(TIMSK4, OCIE4A, 1); | ||
394 | break; | ||
395 | #endif | ||
396 | |||
397 | #if defined(OCR5A) && defined(TIMSK5) && defined(OCIE5A) | ||
398 | case 5: | ||
399 | OCR5A = ocr; | ||
400 | timer5_toggle_count = toggle_count; | ||
401 | bitWrite(TIMSK5, OCIE5A, 1); | ||
402 | break; | ||
403 | #endif | ||
404 | |||
405 | } | ||
406 | } | ||
407 | } | ||
408 | |||
409 | |||
410 | // XXX: this function only works properly for timer 2 (the only one we use | ||
411 | // currently). for the others, it should end the tone, but won't restore | ||
412 | // proper PWM functionality for the timer. | ||
413 | void disableTimer(uint8_t _timer) | ||
414 | { | ||
415 | switch (_timer) | ||
416 | { | ||
417 | case 0: | ||
418 | #if defined(TIMSK0) | ||
419 | TIMSK0 = 0; | ||
420 | #elif defined(TIMSK) | ||
421 | TIMSK = 0; // atmega32 | ||
422 | #endif | ||
423 | break; | ||
424 | |||
425 | #if defined(TIMSK1) && defined(OCIE1A) | ||
426 | case 1: | ||
427 | bitWrite(TIMSK1, OCIE1A, 0); | ||
428 | break; | ||
429 | #endif | ||
430 | |||
431 | case 2: | ||
432 | #if defined(TIMSK2) && defined(OCIE2A) | ||
433 | bitWrite(TIMSK2, OCIE2A, 0); // disable interrupt | ||
434 | #endif | ||
435 | #if defined(TCCR2A) && defined(WGM20) | ||
436 | TCCR2A = (1 << WGM20); | ||
437 | #endif | ||
438 | #if defined(TCCR2B) && defined(CS22) | ||
439 | TCCR2B = (TCCR2B & 0b11111000) | (1 << CS22); | ||
440 | #endif | ||
441 | #if defined(OCR2A) | ||
442 | OCR2A = 0; | ||
443 | #endif | ||
444 | break; | ||
445 | |||
446 | #if defined(TIMSK3) | ||
447 | case 3: | ||
448 | TIMSK3 = 0; | ||
449 | break; | ||
450 | #endif | ||
451 | |||
452 | #if defined(TIMSK4) | ||
453 | case 4: | ||
454 | TIMSK4 = 0; | ||
455 | break; | ||
456 | #endif | ||
457 | |||
458 | #if defined(TIMSK5) | ||
459 | case 5: | ||
460 | TIMSK5 = 0; | ||
461 | break; | ||
462 | #endif | ||
463 | } | ||
464 | } | ||
465 | |||
466 | |||
467 | void noTone(uint8_t _pin) | ||
468 | { | ||
469 | int8_t _timer = -1; | ||
470 | |||
471 | for (int i = 0; i < AVAILABLE_TONE_PINS; i++) { | ||
472 | if (tone_pins[i] == _pin) { | ||
473 | _timer = pgm_read_byte(tone_pin_to_timer_PGM + i); | ||
474 | tone_pins[i] = 255; | ||
475 | } | ||
476 | } | ||
477 | |||
478 | disableTimer(_timer); | ||
479 | |||
480 | digitalWrite(_pin, 0); | ||
481 | } | ||
482 | |||
483 | #if 0 | ||
484 | #if !defined(__AVR_ATmega8__) | ||
485 | ISR(TIMER0_COMPA_vect) | ||
486 | { | ||
487 | if (timer0_toggle_count != 0) | ||
488 | { | ||
489 | // toggle the pin | ||
490 | *timer0_pin_port ^= timer0_pin_mask; | ||
491 | |||
492 | if (timer0_toggle_count > 0) | ||
493 | timer0_toggle_count--; | ||
494 | } | ||
495 | else | ||
496 | { | ||
497 | disableTimer(0); | ||
498 | *timer0_pin_port &= ~(timer0_pin_mask); // keep pin low after stop | ||
499 | } | ||
500 | } | ||
501 | #endif | ||
502 | |||
503 | |||
504 | ISR(TIMER1_COMPA_vect) | ||
505 | { | ||
506 | if (timer1_toggle_count != 0) | ||
507 | { | ||
508 | // toggle the pin | ||
509 | *timer1_pin_port ^= timer1_pin_mask; | ||
510 | |||
511 | if (timer1_toggle_count > 0) | ||
512 | timer1_toggle_count--; | ||
513 | } | ||
514 | else | ||
515 | { | ||
516 | disableTimer(1); | ||
517 | *timer1_pin_port &= ~(timer1_pin_mask); // keep pin low after stop | ||
518 | } | ||
519 | } | ||
520 | #endif | ||
521 | |||
522 | |||
523 | ISR(TIMER2_COMPA_vect) | ||
524 | { | ||
525 | |||
526 | if (timer2_toggle_count != 0) | ||
527 | { | ||
528 | // toggle the pin | ||
529 | *timer2_pin_port ^= timer2_pin_mask; | ||
530 | |||
531 | if (timer2_toggle_count > 0) | ||
532 | timer2_toggle_count--; | ||
533 | } | ||
534 | else | ||
535 | { | ||
536 | // need to call noTone() so that the tone_pins[] entry is reset, so the | ||
537 | // timer gets initialized next time we call tone(). | ||
538 | // XXX: this assumes timer 2 is always the first one used. | ||
539 | noTone(tone_pins[0]); | ||
540 | // disableTimer(2); | ||
541 | // *timer2_pin_port &= ~(timer2_pin_mask); // keep pin low after stop | ||
542 | } | ||
543 | } | ||
544 | |||
545 | |||
546 | |||
547 | //#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) | ||
548 | #if 0 | ||
549 | |||
550 | ISR(TIMER3_COMPA_vect) | ||
551 | { | ||
552 | if (timer3_toggle_count != 0) | ||
553 | { | ||
554 | // toggle the pin | ||
555 | *timer3_pin_port ^= timer3_pin_mask; | ||
556 | |||
557 | if (timer3_toggle_count > 0) | ||
558 | timer3_toggle_count--; | ||
559 | } | ||
560 | else | ||
561 | { | ||
562 | disableTimer(3); | ||
563 | *timer3_pin_port &= ~(timer3_pin_mask); // keep pin low after stop | ||
564 | } | ||
565 | } | ||
566 | |||
567 | ISR(TIMER4_COMPA_vect) | ||
568 | { | ||
569 | if (timer4_toggle_count != 0) | ||
570 | { | ||
571 | // toggle the pin | ||
572 | *timer4_pin_port ^= timer4_pin_mask; | ||
573 | |||
574 | if (timer4_toggle_count > 0) | ||
575 | timer4_toggle_count--; | ||
576 | } | ||
577 | else | ||
578 | { | ||
579 | disableTimer(4); | ||
580 | *timer4_pin_port &= ~(timer4_pin_mask); // keep pin low after stop | ||
581 | } | ||
582 | } | ||
583 | |||
584 | ISR(TIMER5_COMPA_vect) | ||
585 | { | ||
586 | if (timer5_toggle_count != 0) | ||
587 | { | ||
588 | // toggle the pin | ||
589 | *timer5_pin_port ^= timer5_pin_mask; | ||
590 | |||
591 | if (timer5_toggle_count > 0) | ||
592 | timer5_toggle_count--; | ||
593 | } | ||
594 | else | ||
595 | { | ||
596 | disableTimer(5); | ||
597 | *timer5_pin_port &= ~(timer5_pin_mask); // keep pin low after stop | ||
598 | } | ||
599 | } | ||
600 | |||
601 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBAPI.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBAPI.h new file mode 100644 index 000000000..d5abdb690 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBAPI.h | |||
@@ -0,0 +1,195 @@ | |||
1 | |||
2 | |||
3 | #ifndef __USBAPI__ | ||
4 | #define __USBAPI__ | ||
5 | |||
6 | #if defined(USBCON) | ||
7 | |||
8 | //================================================================================ | ||
9 | //================================================================================ | ||
10 | // USB | ||
11 | |||
12 | class USBDevice_ | ||
13 | { | ||
14 | public: | ||
15 | USBDevice_(); | ||
16 | bool configured(); | ||
17 | |||
18 | void attach(); | ||
19 | void detach(); // Serial port goes down too... | ||
20 | void poll(); | ||
21 | }; | ||
22 | extern USBDevice_ USBDevice; | ||
23 | |||
24 | //================================================================================ | ||
25 | //================================================================================ | ||
26 | // Serial over CDC (Serial1 is the physical port) | ||
27 | |||
28 | class Serial_ : public Stream | ||
29 | { | ||
30 | private: | ||
31 | ring_buffer *_cdc_rx_buffer; | ||
32 | public: | ||
33 | void begin(uint16_t baud_count); | ||
34 | void end(void); | ||
35 | |||
36 | virtual int available(void); | ||
37 | virtual void accept(void); | ||
38 | virtual int peek(void); | ||
39 | virtual int read(void); | ||
40 | virtual void flush(void); | ||
41 | virtual size_t write(uint8_t); | ||
42 | operator bool(); | ||
43 | }; | ||
44 | extern Serial_ Serial; | ||
45 | |||
46 | //================================================================================ | ||
47 | //================================================================================ | ||
48 | // Mouse | ||
49 | |||
50 | #define MOUSE_LEFT 1 | ||
51 | #define MOUSE_RIGHT 2 | ||
52 | #define MOUSE_MIDDLE 4 | ||
53 | #define MOUSE_ALL (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE) | ||
54 | |||
55 | class Mouse_ | ||
56 | { | ||
57 | private: | ||
58 | uint8_t _buttons; | ||
59 | void buttons(uint8_t b); | ||
60 | public: | ||
61 | Mouse_(void); | ||
62 | void begin(void); | ||
63 | void end(void); | ||
64 | void click(uint8_t b = MOUSE_LEFT); | ||
65 | void move(signed char x, signed char y, signed char wheel = 0); | ||
66 | void press(uint8_t b = MOUSE_LEFT); // press LEFT by default | ||
67 | void release(uint8_t b = MOUSE_LEFT); // release LEFT by default | ||
68 | bool isPressed(uint8_t b = MOUSE_LEFT); // check LEFT by default | ||
69 | }; | ||
70 | extern Mouse_ Mouse; | ||
71 | |||
72 | //================================================================================ | ||
73 | //================================================================================ | ||
74 | // Keyboard | ||
75 | |||
76 | #define KEY_LEFT_CTRL 0x80 | ||
77 | #define KEY_LEFT_SHIFT 0x81 | ||
78 | #define KEY_LEFT_ALT 0x82 | ||
79 | #define KEY_LEFT_GUI 0x83 | ||
80 | #define KEY_RIGHT_CTRL 0x84 | ||
81 | #define KEY_RIGHT_SHIFT 0x85 | ||
82 | #define KEY_RIGHT_ALT 0x86 | ||
83 | #define KEY_RIGHT_GUI 0x87 | ||
84 | |||
85 | #define KEY_UP_ARROW 0xDA | ||
86 | #define KEY_DOWN_ARROW 0xD9 | ||
87 | #define KEY_LEFT_ARROW 0xD8 | ||
88 | #define KEY_RIGHT_ARROW 0xD7 | ||
89 | #define KEY_BACKSPACE 0xB2 | ||
90 | #define KEY_TAB 0xB3 | ||
91 | #define KEY_RETURN 0xB0 | ||
92 | #define KEY_ESC 0xB1 | ||
93 | #define KEY_INSERT 0xD1 | ||
94 | #define KEY_DELETE 0xD4 | ||
95 | #define KEY_PAGE_UP 0xD3 | ||
96 | #define KEY_PAGE_DOWN 0xD6 | ||
97 | #define KEY_HOME 0xD2 | ||
98 | #define KEY_END 0xD5 | ||
99 | #define KEY_CAPS_LOCK 0xC1 | ||
100 | #define KEY_F1 0xC2 | ||
101 | #define KEY_F2 0xC3 | ||
102 | #define KEY_F3 0xC4 | ||
103 | #define KEY_F4 0xC5 | ||
104 | #define KEY_F5 0xC6 | ||
105 | #define KEY_F6 0xC7 | ||
106 | #define KEY_F7 0xC8 | ||
107 | #define KEY_F8 0xC9 | ||
108 | #define KEY_F9 0xCA | ||
109 | #define KEY_F10 0xCB | ||
110 | #define KEY_F11 0xCC | ||
111 | #define KEY_F12 0xCD | ||
112 | |||
113 | // Low level key report: up to 6 keys and shift, ctrl etc at once | ||
114 | typedef struct | ||
115 | { | ||
116 | uint8_t modifiers; | ||
117 | uint8_t reserved; | ||
118 | uint8_t keys[6]; | ||
119 | } KeyReport; | ||
120 | |||
121 | class Keyboard_ : public Print | ||
122 | { | ||
123 | private: | ||
124 | KeyReport _keyReport; | ||
125 | void sendReport(KeyReport* keys); | ||
126 | public: | ||
127 | Keyboard_(void); | ||
128 | void begin(void); | ||
129 | void end(void); | ||
130 | virtual size_t write(uint8_t k); | ||
131 | virtual size_t press(uint8_t k); | ||
132 | virtual size_t release(uint8_t k); | ||
133 | virtual void releaseAll(void); | ||
134 | }; | ||
135 | extern Keyboard_ Keyboard; | ||
136 | |||
137 | //================================================================================ | ||
138 | //================================================================================ | ||
139 | // Low level API | ||
140 | |||
141 | typedef struct | ||
142 | { | ||
143 | uint8_t bmRequestType; | ||
144 | uint8_t bRequest; | ||
145 | uint8_t wValueL; | ||
146 | uint8_t wValueH; | ||
147 | uint16_t wIndex; | ||
148 | uint16_t wLength; | ||
149 | } Setup; | ||
150 | |||
151 | //================================================================================ | ||
152 | //================================================================================ | ||
153 | // HID 'Driver' | ||
154 | |||
155 | int HID_GetInterface(uint8_t* interfaceNum); | ||
156 | int HID_GetDescriptor(int i); | ||
157 | bool HID_Setup(Setup& setup); | ||
158 | void HID_SendReport(uint8_t id, const void* data, int len); | ||
159 | |||
160 | //================================================================================ | ||
161 | //================================================================================ | ||
162 | // MSC 'Driver' | ||
163 | |||
164 | int MSC_GetInterface(uint8_t* interfaceNum); | ||
165 | int MSC_GetDescriptor(int i); | ||
166 | bool MSC_Setup(Setup& setup); | ||
167 | bool MSC_Data(uint8_t rx,uint8_t tx); | ||
168 | |||
169 | //================================================================================ | ||
170 | //================================================================================ | ||
171 | // CSC 'Driver' | ||
172 | |||
173 | int CDC_GetInterface(uint8_t* interfaceNum); | ||
174 | int CDC_GetDescriptor(int i); | ||
175 | bool CDC_Setup(Setup& setup); | ||
176 | |||
177 | //================================================================================ | ||
178 | //================================================================================ | ||
179 | |||
180 | #define TRANSFER_PGM 0x80 | ||
181 | #define TRANSFER_RELEASE 0x40 | ||
182 | #define TRANSFER_ZERO 0x20 | ||
183 | |||
184 | int USB_SendControl(uint8_t flags, const void* d, int len); | ||
185 | int USB_RecvControl(void* d, int len); | ||
186 | |||
187 | uint8_t USB_Available(uint8_t ep); | ||
188 | int USB_Send(uint8_t ep, const void* data, int len); // blocking | ||
189 | int USB_Recv(uint8_t ep, void* data, int len); // non-blocking | ||
190 | int USB_Recv(uint8_t ep); // non-blocking | ||
191 | void USB_Flush(uint8_t ep); | ||
192 | |||
193 | #endif | ||
194 | |||
195 | #endif /* if defined(USBCON) */ \ No newline at end of file | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.cpp new file mode 100644 index 000000000..6766be61a --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.cpp | |||
@@ -0,0 +1,672 @@ | |||
1 | |||
2 | |||
3 | /* Copyright (c) 2010, Peter Barrett | ||
4 | ** | ||
5 | ** Permission to use, copy, modify, and/or distribute this software for | ||
6 | ** any purpose with or without fee is hereby granted, provided that the | ||
7 | ** above copyright notice and this permission notice appear in all copies. | ||
8 | ** | ||
9 | ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||
10 | ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||
11 | ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR | ||
12 | ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES | ||
13 | ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||
14 | ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | ||
15 | ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||
16 | ** SOFTWARE. | ||
17 | */ | ||
18 | |||
19 | #include "Platform.h" | ||
20 | #include "USBAPI.h" | ||
21 | #include "USBDesc.h" | ||
22 | |||
23 | #if defined(USBCON) | ||
24 | |||
25 | #define EP_TYPE_CONTROL 0x00 | ||
26 | #define EP_TYPE_BULK_IN 0x81 | ||
27 | #define EP_TYPE_BULK_OUT 0x80 | ||
28 | #define EP_TYPE_INTERRUPT_IN 0xC1 | ||
29 | #define EP_TYPE_INTERRUPT_OUT 0xC0 | ||
30 | #define EP_TYPE_ISOCHRONOUS_IN 0x41 | ||
31 | #define EP_TYPE_ISOCHRONOUS_OUT 0x40 | ||
32 | |||
33 | /** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ | ||
34 | #define TX_RX_LED_PULSE_MS 100 | ||
35 | volatile u8 TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ | ||
36 | volatile u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ | ||
37 | |||
38 | //================================================================== | ||
39 | //================================================================== | ||
40 | |||
41 | extern const u16 STRING_LANGUAGE[] PROGMEM; | ||
42 | extern const u16 STRING_IPRODUCT[] PROGMEM; | ||
43 | extern const u16 STRING_IMANUFACTURER[] PROGMEM; | ||
44 | extern const DeviceDescriptor USB_DeviceDescriptor PROGMEM; | ||
45 | extern const DeviceDescriptor USB_DeviceDescriptorA PROGMEM; | ||
46 | |||
47 | const u16 STRING_LANGUAGE[2] = { | ||
48 | (3<<8) | (2+2), | ||
49 | 0x0409 // English | ||
50 | }; | ||
51 | |||
52 | const u16 STRING_IPRODUCT[17] = { | ||
53 | (3<<8) | (2+2*16), | ||
54 | #if USB_PID == 0x8036 | ||
55 | 'A','r','d','u','i','n','o',' ','L','e','o','n','a','r','d','o' | ||
56 | #else | ||
57 | 'U','S','B',' ','I','O',' ','B','o','a','r','d',' ',' ',' ',' ' | ||
58 | #endif | ||
59 | }; | ||
60 | |||
61 | const u16 STRING_IMANUFACTURER[12] = { | ||
62 | (3<<8) | (2+2*11), | ||
63 | #if USB_VID == 0x2341 | ||
64 | 'A','r','d','u','i','n','o',' ','L','L','C' | ||
65 | #else | ||
66 | 'U','n','k','n','o','w','n',' ',' ',' ',' ' | ||
67 | #endif | ||
68 | }; | ||
69 | |||
70 | #ifdef CDC_ENABLED | ||
71 | #define DEVICE_CLASS 0x02 | ||
72 | #else | ||
73 | #define DEVICE_CLASS 0x00 | ||
74 | #endif | ||
75 | |||
76 | // DEVICE DESCRIPTOR | ||
77 | const DeviceDescriptor USB_DeviceDescriptor = | ||
78 | D_DEVICE(0x00,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1); | ||
79 | |||
80 | const DeviceDescriptor USB_DeviceDescriptorA = | ||
81 | D_DEVICE(DEVICE_CLASS,0x00,0x00,64,USB_VID,USB_PID,0x100,IMANUFACTURER,IPRODUCT,0,1); | ||
82 | |||
83 | //================================================================== | ||
84 | //================================================================== | ||
85 | |||
86 | volatile u8 _usbConfiguration = 0; | ||
87 | |||
88 | static inline void WaitIN(void) | ||
89 | { | ||
90 | while (!(UEINTX & (1<<TXINI))); | ||
91 | } | ||
92 | |||
93 | static inline void ClearIN(void) | ||
94 | { | ||
95 | UEINTX = ~(1<<TXINI); | ||
96 | } | ||
97 | |||
98 | static inline void WaitOUT(void) | ||
99 | { | ||
100 | while (!(UEINTX & (1<<RXOUTI))) | ||
101 | ; | ||
102 | } | ||
103 | |||
104 | static inline u8 WaitForINOrOUT() | ||
105 | { | ||
106 | while (!(UEINTX & ((1<<TXINI)|(1<<RXOUTI)))) | ||
107 | ; | ||
108 | return (UEINTX & (1<<RXOUTI)) == 0; | ||
109 | } | ||
110 | |||
111 | static inline void ClearOUT(void) | ||
112 | { | ||
113 | UEINTX = ~(1<<RXOUTI); | ||
114 | } | ||
115 | |||
116 | void Recv(volatile u8* data, u8 count) | ||
117 | { | ||
118 | while (count--) | ||
119 | *data++ = UEDATX; | ||
120 | |||
121 | RXLED1; // light the RX LED | ||
122 | RxLEDPulse = TX_RX_LED_PULSE_MS; | ||
123 | } | ||
124 | |||
125 | static inline u8 Recv8() | ||
126 | { | ||
127 | RXLED1; // light the RX LED | ||
128 | RxLEDPulse = TX_RX_LED_PULSE_MS; | ||
129 | |||
130 | return UEDATX; | ||
131 | } | ||
132 | |||
133 | static inline void Send8(u8 d) | ||
134 | { | ||
135 | UEDATX = d; | ||
136 | } | ||
137 | |||
138 | static inline void SetEP(u8 ep) | ||
139 | { | ||
140 | UENUM = ep; | ||
141 | } | ||
142 | |||
143 | static inline u8 FifoByteCount() | ||
144 | { | ||
145 | return UEBCLX; | ||
146 | } | ||
147 | |||
148 | static inline u8 ReceivedSetupInt() | ||
149 | { | ||
150 | return UEINTX & (1<<RXSTPI); | ||
151 | } | ||
152 | |||
153 | static inline void ClearSetupInt() | ||
154 | { | ||
155 | UEINTX = ~((1<<RXSTPI) | (1<<RXOUTI) | (1<<TXINI)); | ||
156 | } | ||
157 | |||
158 | static inline void Stall() | ||
159 | { | ||
160 | UECONX = (1<<STALLRQ) | (1<<EPEN); | ||
161 | } | ||
162 | |||
163 | static inline u8 ReadWriteAllowed() | ||
164 | { | ||
165 | return UEINTX & (1<<RWAL); | ||
166 | } | ||
167 | |||
168 | static inline u8 Stalled() | ||
169 | { | ||
170 | return UEINTX & (1<<STALLEDI); | ||
171 | } | ||
172 | |||
173 | static inline u8 FifoFree() | ||
174 | { | ||
175 | return UEINTX & (1<<FIFOCON); | ||
176 | } | ||
177 | |||
178 | static inline void ReleaseRX() | ||
179 | { | ||
180 | UEINTX = 0x6B; // FIFOCON=0 NAKINI=1 RWAL=1 NAKOUTI=0 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=1 | ||
181 | } | ||
182 | |||
183 | static inline void ReleaseTX() | ||
184 | { | ||
185 | UEINTX = 0x3A; // FIFOCON=0 NAKINI=0 RWAL=1 NAKOUTI=1 RXSTPI=1 RXOUTI=0 STALLEDI=1 TXINI=0 | ||
186 | } | ||
187 | |||
188 | static inline u8 FrameNumber() | ||
189 | { | ||
190 | return UDFNUML; | ||
191 | } | ||
192 | |||
193 | //================================================================== | ||
194 | //================================================================== | ||
195 | |||
196 | u8 USBGetConfiguration(void) | ||
197 | { | ||
198 | return _usbConfiguration; | ||
199 | } | ||
200 | |||
201 | #define USB_RECV_TIMEOUT | ||
202 | class LockEP | ||
203 | { | ||
204 | u8 _sreg; | ||
205 | public: | ||
206 | LockEP(u8 ep) : _sreg(SREG) | ||
207 | { | ||
208 | cli(); | ||
209 | SetEP(ep & 7); | ||
210 | } | ||
211 | ~LockEP() | ||
212 | { | ||
213 | SREG = _sreg; | ||
214 | } | ||
215 | }; | ||
216 | |||
217 | // Number of bytes, assumes a rx endpoint | ||
218 | u8 USB_Available(u8 ep) | ||
219 | { | ||
220 | LockEP lock(ep); | ||
221 | return FifoByteCount(); | ||
222 | } | ||
223 | |||
224 | // Non Blocking receive | ||
225 | // Return number of bytes read | ||
226 | int USB_Recv(u8 ep, void* d, int len) | ||
227 | { | ||
228 | if (!_usbConfiguration || len < 0) | ||
229 | return -1; | ||
230 | |||
231 | LockEP lock(ep); | ||
232 | u8 n = FifoByteCount(); | ||
233 | len = min(n,len); | ||
234 | n = len; | ||
235 | u8* dst = (u8*)d; | ||
236 | while (n--) | ||
237 | *dst++ = Recv8(); | ||
238 | if (len && !FifoByteCount()) // release empty buffer | ||
239 | ReleaseRX(); | ||
240 | |||
241 | return len; | ||
242 | } | ||
243 | |||
244 | // Recv 1 byte if ready | ||
245 | int USB_Recv(u8 ep) | ||
246 | { | ||
247 | u8 c; | ||
248 | if (USB_Recv(ep,&c,1) != 1) | ||
249 | return -1; | ||
250 | return c; | ||
251 | } | ||
252 | |||
253 | // Space in send EP | ||
254 | u8 USB_SendSpace(u8 ep) | ||
255 | { | ||
256 | LockEP lock(ep); | ||
257 | if (!ReadWriteAllowed()) | ||
258 | return 0; | ||
259 | return 64 - FifoByteCount(); | ||
260 | } | ||
261 | |||
262 | // Blocking Send of data to an endpoint | ||
263 | int USB_Send(u8 ep, const void* d, int len) | ||
264 | { | ||
265 | if (!_usbConfiguration) | ||
266 | return -1; | ||
267 | |||
268 | int r = len; | ||
269 | const u8* data = (const u8*)d; | ||
270 | u8 zero = ep & TRANSFER_ZERO; | ||
271 | u8 timeout = 250; // 250ms timeout on send? TODO | ||
272 | while (len) | ||
273 | { | ||
274 | u8 n = USB_SendSpace(ep); | ||
275 | if (n == 0) | ||
276 | { | ||
277 | if (!(--timeout)) | ||
278 | return -1; | ||
279 | delay(1); | ||
280 | continue; | ||
281 | } | ||
282 | |||
283 | if (n > len) | ||
284 | n = len; | ||
285 | len -= n; | ||
286 | { | ||
287 | LockEP lock(ep); | ||
288 | if (ep & TRANSFER_ZERO) | ||
289 | { | ||
290 | while (n--) | ||
291 | Send8(0); | ||
292 | } | ||
293 | else if (ep & TRANSFER_PGM) | ||
294 | { | ||
295 | while (n--) | ||
296 | Send8(pgm_read_byte(data++)); | ||
297 | } | ||
298 | else | ||
299 | { | ||
300 | while (n--) | ||
301 | Send8(*data++); | ||
302 | } | ||
303 | if (!ReadWriteAllowed() || ((len == 0) && (ep & TRANSFER_RELEASE))) // Release full buffer | ||
304 | ReleaseTX(); | ||
305 | } | ||
306 | } | ||
307 | TXLED1; // light the TX LED | ||
308 | TxLEDPulse = TX_RX_LED_PULSE_MS; | ||
309 | return r; | ||
310 | } | ||
311 | |||
312 | extern const u8 _initEndpoints[] PROGMEM; | ||
313 | const u8 _initEndpoints[] = | ||
314 | { | ||
315 | 0, | ||
316 | |||
317 | #ifdef CDC_ENABLED | ||
318 | EP_TYPE_INTERRUPT_IN, // CDC_ENDPOINT_ACM | ||
319 | EP_TYPE_BULK_OUT, // CDC_ENDPOINT_OUT | ||
320 | EP_TYPE_BULK_IN, // CDC_ENDPOINT_IN | ||
321 | #endif | ||
322 | |||
323 | #ifdef HID_ENABLED | ||
324 | EP_TYPE_INTERRUPT_IN // HID_ENDPOINT_INT | ||
325 | #endif | ||
326 | }; | ||
327 | |||
328 | #define EP_SINGLE_64 0x32 // EP0 | ||
329 | #define EP_DOUBLE_64 0x36 // Other endpoints | ||
330 | |||
331 | static | ||
332 | void InitEP(u8 index, u8 type, u8 size) | ||
333 | { | ||
334 | UENUM = index; | ||
335 | UECONX = 1; | ||
336 | UECFG0X = type; | ||
337 | UECFG1X = size; | ||
338 | } | ||
339 | |||
340 | static | ||
341 | void InitEndpoints() | ||
342 | { | ||
343 | for (u8 i = 1; i < sizeof(_initEndpoints); i++) | ||
344 | { | ||
345 | UENUM = i; | ||
346 | UECONX = 1; | ||
347 | UECFG0X = pgm_read_byte(_initEndpoints+i); | ||
348 | UECFG1X = EP_DOUBLE_64; | ||
349 | } | ||
350 | UERST = 0x7E; // And reset them | ||
351 | UERST = 0; | ||
352 | } | ||
353 | |||
354 | // Handle CLASS_INTERFACE requests | ||
355 | static | ||
356 | bool ClassInterfaceRequest(Setup& setup) | ||
357 | { | ||
358 | u8 i = setup.wIndex; | ||
359 | |||
360 | #ifdef CDC_ENABLED | ||
361 | if (CDC_ACM_INTERFACE == i) | ||
362 | return CDC_Setup(setup); | ||
363 | #endif | ||
364 | |||
365 | #ifdef HID_ENABLED | ||
366 | if (HID_INTERFACE == i) | ||
367 | return HID_Setup(setup); | ||
368 | #endif | ||
369 | return false; | ||
370 | } | ||
371 | |||
372 | int _cmark; | ||
373 | int _cend; | ||
374 | void InitControl(int end) | ||
375 | { | ||
376 | SetEP(0); | ||
377 | _cmark = 0; | ||
378 | _cend = end; | ||
379 | } | ||
380 | |||
381 | static | ||
382 | bool SendControl(u8 d) | ||
383 | { | ||
384 | if (_cmark < _cend) | ||
385 | { | ||
386 | if (!WaitForINOrOUT()) | ||
387 | return false; | ||
388 | Send8(d); | ||
389 | if (!((_cmark + 1) & 0x3F)) | ||
390 | ClearIN(); // Fifo is full, release this packet | ||
391 | } | ||
392 | _cmark++; | ||
393 | return true; | ||
394 | }; | ||
395 | |||
396 | // Clipped by _cmark/_cend | ||
397 | int USB_SendControl(u8 flags, const void* d, int len) | ||
398 | { | ||
399 | int sent = len; | ||
400 | const u8* data = (const u8*)d; | ||
401 | bool pgm = flags & TRANSFER_PGM; | ||
402 | while (len--) | ||
403 | { | ||
404 | u8 c = pgm ? pgm_read_byte(data++) : *data++; | ||
405 | if (!SendControl(c)) | ||
406 | return -1; | ||
407 | } | ||
408 | return sent; | ||
409 | } | ||
410 | |||
411 | // Does not timeout or cross fifo boundaries | ||
412 | // Will only work for transfers <= 64 bytes | ||
413 | // TODO | ||
414 | int USB_RecvControl(void* d, int len) | ||
415 | { | ||
416 | WaitOUT(); | ||
417 | Recv((u8*)d,len); | ||
418 | ClearOUT(); | ||
419 | return len; | ||
420 | } | ||
421 | |||
422 | int SendInterfaces() | ||
423 | { | ||
424 | int total = 0; | ||
425 | u8 interfaces = 0; | ||
426 | |||
427 | #ifdef CDC_ENABLED | ||
428 | total = CDC_GetInterface(&interfaces); | ||
429 | #endif | ||
430 | |||
431 | #ifdef HID_ENABLED | ||
432 | total += HID_GetInterface(&interfaces); | ||
433 | #endif | ||
434 | |||
435 | return interfaces; | ||
436 | } | ||
437 | |||
438 | // Construct a dynamic configuration descriptor | ||
439 | // This really needs dynamic endpoint allocation etc | ||
440 | // TODO | ||
441 | static | ||
442 | bool SendConfiguration(int maxlen) | ||
443 | { | ||
444 | // Count and measure interfaces | ||
445 | InitControl(0); | ||
446 | int interfaces = SendInterfaces(); | ||
447 | ConfigDescriptor config = D_CONFIG(_cmark + sizeof(ConfigDescriptor),interfaces); | ||
448 | |||
449 | // Now send them | ||
450 | InitControl(maxlen); | ||
451 | USB_SendControl(0,&config,sizeof(ConfigDescriptor)); | ||
452 | SendInterfaces(); | ||
453 | return true; | ||
454 | } | ||
455 | |||
456 | u8 _cdcComposite = 0; | ||
457 | |||
458 | static | ||
459 | bool SendDescriptor(Setup& setup) | ||
460 | { | ||
461 | u8 t = setup.wValueH; | ||
462 | if (USB_CONFIGURATION_DESCRIPTOR_TYPE == t) | ||
463 | return SendConfiguration(setup.wLength); | ||
464 | |||
465 | InitControl(setup.wLength); | ||
466 | #ifdef HID_ENABLED | ||
467 | if (HID_REPORT_DESCRIPTOR_TYPE == t) | ||
468 | return HID_GetDescriptor(t); | ||
469 | #endif | ||
470 | |||
471 | u8 desc_length = 0; | ||
472 | const u8* desc_addr = 0; | ||
473 | if (USB_DEVICE_DESCRIPTOR_TYPE == t) | ||
474 | { | ||
475 | if (setup.wLength == 8) | ||
476 | _cdcComposite = 1; | ||
477 | desc_addr = _cdcComposite ? (const u8*)&USB_DeviceDescriptorA : (const u8*)&USB_DeviceDescriptor; | ||
478 | } | ||
479 | else if (USB_STRING_DESCRIPTOR_TYPE == t) | ||
480 | { | ||
481 | if (setup.wValueL == 0) | ||
482 | desc_addr = (const u8*)&STRING_LANGUAGE; | ||
483 | else if (setup.wValueL == IPRODUCT) | ||
484 | desc_addr = (const u8*)&STRING_IPRODUCT; | ||
485 | else if (setup.wValueL == IMANUFACTURER) | ||
486 | desc_addr = (const u8*)&STRING_IMANUFACTURER; | ||
487 | else | ||
488 | return false; | ||
489 | } | ||
490 | |||
491 | if (desc_addr == 0) | ||
492 | return false; | ||
493 | if (desc_length == 0) | ||
494 | desc_length = pgm_read_byte(desc_addr); | ||
495 | |||
496 | USB_SendControl(TRANSFER_PGM,desc_addr,desc_length); | ||
497 | return true; | ||
498 | } | ||
499 | |||
500 | // Endpoint 0 interrupt | ||
501 | ISR(USB_COM_vect) | ||
502 | { | ||
503 | SetEP(0); | ||
504 | if (!ReceivedSetupInt()) | ||
505 | return; | ||
506 | |||
507 | Setup setup; | ||
508 | Recv((u8*)&setup,8); | ||
509 | ClearSetupInt(); | ||
510 | |||
511 | u8 requestType = setup.bmRequestType; | ||
512 | if (requestType & REQUEST_DEVICETOHOST) | ||
513 | WaitIN(); | ||
514 | else | ||
515 | ClearIN(); | ||
516 | |||
517 | bool ok = true; | ||
518 | if (REQUEST_STANDARD == (requestType & REQUEST_TYPE)) | ||
519 | { | ||
520 | // Standard Requests | ||
521 | u8 r = setup.bRequest; | ||
522 | if (GET_STATUS == r) | ||
523 | { | ||
524 | Send8(0); // TODO | ||
525 | Send8(0); | ||
526 | } | ||
527 | else if (CLEAR_FEATURE == r) | ||
528 | { | ||
529 | } | ||
530 | else if (SET_FEATURE == r) | ||
531 | { | ||
532 | } | ||
533 | else if (SET_ADDRESS == r) | ||
534 | { | ||
535 | WaitIN(); | ||
536 | UDADDR = setup.wValueL | (1<<ADDEN); | ||
537 | } | ||
538 | else if (GET_DESCRIPTOR == r) | ||
539 | { | ||
540 | ok = SendDescriptor(setup); | ||
541 | } | ||
542 | else if (SET_DESCRIPTOR == r) | ||
543 | { | ||
544 | ok = false; | ||
545 | } | ||
546 | else if (GET_CONFIGURATION == r) | ||
547 | { | ||
548 | Send8(1); | ||
549 | } | ||
550 | else if (SET_CONFIGURATION == r) | ||
551 | { | ||
552 | if (REQUEST_DEVICE == (requestType & REQUEST_RECIPIENT)) | ||
553 | { | ||
554 | InitEndpoints(); | ||
555 | _usbConfiguration = setup.wValueL; | ||
556 | } else | ||
557 | ok = false; | ||
558 | } | ||
559 | else if (GET_INTERFACE == r) | ||
560 | { | ||
561 | } | ||
562 | else if (SET_INTERFACE == r) | ||
563 | { | ||
564 | } | ||
565 | } | ||
566 | else | ||
567 | { | ||
568 | InitControl(setup.wLength); // Max length of transfer | ||
569 | ok = ClassInterfaceRequest(setup); | ||
570 | } | ||
571 | |||
572 | if (ok) | ||
573 | ClearIN(); | ||
574 | else | ||
575 | { | ||
576 | Stall(); | ||
577 | } | ||
578 | } | ||
579 | |||
580 | void USB_Flush(u8 ep) | ||
581 | { | ||
582 | SetEP(ep); | ||
583 | if (FifoByteCount()) | ||
584 | ReleaseTX(); | ||
585 | } | ||
586 | |||
587 | // General interrupt | ||
588 | ISR(USB_GEN_vect) | ||
589 | { | ||
590 | u8 udint = UDINT; | ||
591 | UDINT = 0; | ||
592 | |||
593 | // End of Reset | ||
594 | if (udint & (1<<EORSTI)) | ||
595 | { | ||
596 | InitEP(0,EP_TYPE_CONTROL,EP_SINGLE_64); // init ep0 | ||
597 | _usbConfiguration = 0; // not configured yet | ||
598 | UEIENX = 1 << RXSTPE; // Enable interrupts for ep0 | ||
599 | } | ||
600 | |||
601 | // Start of Frame - happens every millisecond so we use it for TX and RX LED one-shot timing, too | ||
602 | if (udint & (1<<SOFI)) | ||
603 | { | ||
604 | #ifdef CDC_ENABLED | ||
605 | USB_Flush(CDC_TX); // Send a tx frame if found | ||
606 | while (USB_Available(CDC_RX)) // Handle received bytes (if any) | ||
607 | Serial.accept(); | ||
608 | #endif | ||
609 | |||
610 | // check whether the one-shot period has elapsed. if so, turn off the LED | ||
611 | if (TxLEDPulse && !(--TxLEDPulse)) | ||
612 | TXLED0; | ||
613 | if (RxLEDPulse && !(--RxLEDPulse)) | ||
614 | RXLED0; | ||
615 | } | ||
616 | } | ||
617 | |||
618 | // VBUS or counting frames | ||
619 | // Any frame counting? | ||
620 | u8 USBConnected() | ||
621 | { | ||
622 | u8 f = UDFNUML; | ||
623 | delay(3); | ||
624 | return f != UDFNUML; | ||
625 | } | ||
626 | |||
627 | //======================================================================= | ||
628 | //======================================================================= | ||
629 | |||
630 | USBDevice_ USBDevice; | ||
631 | |||
632 | USBDevice_::USBDevice_() | ||
633 | { | ||
634 | } | ||
635 | |||
636 | void USBDevice_::attach() | ||
637 | { | ||
638 | _usbConfiguration = 0; | ||
639 | UHWCON = 0x01; // power internal reg | ||
640 | USBCON = (1<<USBE)|(1<<FRZCLK); // clock frozen, usb enabled | ||
641 | PLLCSR = 0x12; // Need 16 MHz xtal | ||
642 | while (!(PLLCSR & (1<<PLOCK))) // wait for lock pll | ||
643 | ; | ||
644 | |||
645 | // Some tests on specific versions of macosx (10.7.3), reported some | ||
646 | // strange behaviuors when the board is reset using the serial | ||
647 | // port touch at 1200 bps. This delay fixes this behaviour. | ||
648 | delay(1); | ||
649 | |||
650 | USBCON = ((1<<USBE)|(1<<OTGPADE)); // start USB clock | ||
651 | UDIEN = (1<<EORSTE)|(1<<SOFE); // Enable interrupts for EOR (End of Reset) and SOF (start of frame) | ||
652 | UDCON = 0; // enable attach resistor | ||
653 | |||
654 | TX_RX_LED_INIT; | ||
655 | } | ||
656 | |||
657 | void USBDevice_::detach() | ||
658 | { | ||
659 | } | ||
660 | |||
661 | // Check for interrupts | ||
662 | // TODO: VBUS detection | ||
663 | bool USBDevice_::configured() | ||
664 | { | ||
665 | return _usbConfiguration; | ||
666 | } | ||
667 | |||
668 | void USBDevice_::poll() | ||
669 | { | ||
670 | } | ||
671 | |||
672 | #endif /* if defined(USBCON) */ | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h new file mode 100644 index 000000000..8d1380689 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h | |||
@@ -0,0 +1,303 @@ | |||
1 | |||
2 | // Copyright (c) 2010, Peter Barrett | ||
3 | /* | ||
4 | ** Permission to use, copy, modify, and/or distribute this software for | ||
5 | ** any purpose with or without fee is hereby granted, provided that the | ||
6 | ** above copyright notice and this permission notice appear in all copies. | ||
7 | ** | ||
8 | ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||
9 | ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||
10 | ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR | ||
11 | ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES | ||
12 | ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||
13 | ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | ||
14 | ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||
15 | ** SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #ifndef __USBCORE_H__ | ||
19 | #define __USBCORE_H__ | ||
20 | |||
21 | // Standard requests | ||
22 | #define GET_STATUS 0 | ||
23 | #define CLEAR_FEATURE 1 | ||
24 | #define SET_FEATURE 3 | ||
25 | #define SET_ADDRESS 5 | ||
26 | #define GET_DESCRIPTOR 6 | ||
27 | #define SET_DESCRIPTOR 7 | ||
28 | #define GET_CONFIGURATION 8 | ||
29 | #define SET_CONFIGURATION 9 | ||
30 | #define GET_INTERFACE 10 | ||
31 | #define SET_INTERFACE 11 | ||
32 | |||
33 | |||
34 | // bmRequestType | ||
35 | #define REQUEST_HOSTTODEVICE 0x00 | ||
36 | #define REQUEST_DEVICETOHOST 0x80 | ||
37 | #define REQUEST_DIRECTION 0x80 | ||
38 | |||
39 | #define REQUEST_STANDARD 0x00 | ||
40 | #define REQUEST_CLASS 0x20 | ||
41 | #define REQUEST_VENDOR 0x40 | ||
42 | #define REQUEST_TYPE 0x60 | ||
43 | |||
44 | #define REQUEST_DEVICE 0x00 | ||
45 | #define REQUEST_INTERFACE 0x01 | ||
46 | #define REQUEST_ENDPOINT 0x02 | ||
47 | #define REQUEST_OTHER 0x03 | ||
48 | #define REQUEST_RECIPIENT 0x03 | ||
49 | |||
50 | #define REQUEST_DEVICETOHOST_CLASS_INTERFACE (REQUEST_DEVICETOHOST + REQUEST_CLASS + REQUEST_INTERFACE) | ||
51 | #define REQUEST_HOSTTODEVICE_CLASS_INTERFACE (REQUEST_HOSTTODEVICE + REQUEST_CLASS + REQUEST_INTERFACE) | ||
52 | |||
53 | // Class requests | ||
54 | |||
55 | #define CDC_SET_LINE_CODING 0x20 | ||
56 | #define CDC_GET_LINE_CODING 0x21 | ||
57 | #define CDC_SET_CONTROL_LINE_STATE 0x22 | ||
58 | |||
59 | #define MSC_RESET 0xFF | ||
60 | #define MSC_GET_MAX_LUN 0xFE | ||
61 | |||
62 | #define HID_GET_REPORT 0x01 | ||
63 | #define HID_GET_IDLE 0x02 | ||
64 | #define HID_GET_PROTOCOL 0x03 | ||
65 | #define HID_SET_REPORT 0x09 | ||
66 | #define HID_SET_IDLE 0x0A | ||
67 | #define HID_SET_PROTOCOL 0x0B | ||
68 | |||
69 | // Descriptors | ||
70 | |||
71 | #define USB_DEVICE_DESC_SIZE 18 | ||
72 | #define USB_CONFIGUARTION_DESC_SIZE 9 | ||
73 | #define USB_INTERFACE_DESC_SIZE 9 | ||
74 | #define USB_ENDPOINT_DESC_SIZE 7 | ||
75 | |||
76 | #define USB_DEVICE_DESCRIPTOR_TYPE 1 | ||
77 | #define USB_CONFIGURATION_DESCRIPTOR_TYPE 2 | ||
78 | #define USB_STRING_DESCRIPTOR_TYPE 3 | ||
79 | #define USB_INTERFACE_DESCRIPTOR_TYPE 4 | ||
80 | #define USB_ENDPOINT_DESCRIPTOR_TYPE 5 | ||
81 | |||
82 | #define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 | ||
83 | #define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 | ||
84 | #define USB_DEVICE_CLASS_STORAGE 0x08 | ||
85 | #define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF | ||
86 | |||
87 | #define USB_CONFIG_POWERED_MASK 0x40 | ||
88 | #define USB_CONFIG_BUS_POWERED 0x80 | ||
89 | #define USB_CONFIG_SELF_POWERED 0xC0 | ||
90 | #define USB_CONFIG_REMOTE_WAKEUP 0x20 | ||
91 | |||
92 | // bMaxPower in Configuration Descriptor | ||
93 | #define USB_CONFIG_POWER_MA(mA) ((mA)/2) | ||
94 | |||
95 | // bEndpointAddress in Endpoint Descriptor | ||
96 | #define USB_ENDPOINT_DIRECTION_MASK 0x80 | ||
97 | #define USB_ENDPOINT_OUT(addr) ((addr) | 0x00) | ||
98 | #define USB_ENDPOINT_IN(addr) ((addr) | 0x80) | ||
99 | |||
100 | #define USB_ENDPOINT_TYPE_MASK 0x03 | ||
101 | #define USB_ENDPOINT_TYPE_CONTROL 0x00 | ||
102 | #define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 | ||
103 | #define USB_ENDPOINT_TYPE_BULK 0x02 | ||
104 | #define USB_ENDPOINT_TYPE_INTERRUPT 0x03 | ||
105 | |||
106 | #define TOBYTES(x) ((x) & 0xFF),(((x) >> 8) & 0xFF) | ||
107 | |||
108 | #define CDC_V1_10 0x0110 | ||
109 | #define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 | ||
110 | |||
111 | #define CDC_CALL_MANAGEMENT 0x01 | ||
112 | #define CDC_ABSTRACT_CONTROL_MODEL 0x02 | ||
113 | #define CDC_HEADER 0x00 | ||
114 | #define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 | ||
115 | #define CDC_UNION 0x06 | ||
116 | #define CDC_CS_INTERFACE 0x24 | ||
117 | #define CDC_CS_ENDPOINT 0x25 | ||
118 | #define CDC_DATA_INTERFACE_CLASS 0x0A | ||
119 | |||
120 | #define MSC_SUBCLASS_SCSI 0x06 | ||
121 | #define MSC_PROTOCOL_BULK_ONLY 0x50 | ||
122 | |||
123 | #define HID_HID_DESCRIPTOR_TYPE 0x21 | ||
124 | #define HID_REPORT_DESCRIPTOR_TYPE 0x22 | ||
125 | #define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23 | ||
126 | |||
127 | |||
128 | // Device | ||
129 | typedef struct { | ||
130 | u8 len; // 18 | ||
131 | u8 dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE | ||
132 | u16 usbVersion; // 0x200 | ||
133 | u8 deviceClass; | ||
134 | u8 deviceSubClass; | ||
135 | u8 deviceProtocol; | ||
136 | u8 packetSize0; // Packet 0 | ||
137 | u16 idVendor; | ||
138 | u16 idProduct; | ||
139 | u16 deviceVersion; // 0x100 | ||
140 | u8 iManufacturer; | ||
141 | u8 iProduct; | ||
142 | u8 iSerialNumber; | ||
143 | u8 bNumConfigurations; | ||
144 | } DeviceDescriptor; | ||
145 | |||
146 | // Config | ||
147 | typedef struct { | ||
148 | u8 len; // 9 | ||
149 | u8 dtype; // 2 | ||
150 | u16 clen; // total length | ||
151 | u8 numInterfaces; | ||
152 | u8 config; | ||
153 | u8 iconfig; | ||
154 | u8 attributes; | ||
155 | u8 maxPower; | ||
156 | } ConfigDescriptor; | ||
157 | |||
158 | // String | ||
159 | |||
160 | // Interface | ||
161 | typedef struct | ||
162 | { | ||
163 | u8 len; // 9 | ||
164 | u8 dtype; // 4 | ||
165 | u8 number; | ||
166 | u8 alternate; | ||
167 | u8 numEndpoints; | ||
168 | u8 interfaceClass; | ||
169 | u8 interfaceSubClass; | ||
170 | u8 protocol; | ||
171 | u8 iInterface; | ||
172 | } InterfaceDescriptor; | ||
173 | |||
174 | // Endpoint | ||
175 | typedef struct | ||
176 | { | ||
177 | u8 len; // 7 | ||
178 | u8 dtype; // 5 | ||
179 | u8 addr; | ||
180 | u8 attr; | ||
181 | u16 packetSize; | ||
182 | u8 interval; | ||
183 | } EndpointDescriptor; | ||
184 | |||
185 | // Interface Association Descriptor | ||
186 | // Used to bind 2 interfaces together in CDC compostite device | ||
187 | typedef struct | ||
188 | { | ||
189 | u8 len; // 8 | ||
190 | u8 dtype; // 11 | ||
191 | u8 firstInterface; | ||
192 | u8 interfaceCount; | ||
193 | u8 functionClass; | ||
194 | u8 funtionSubClass; | ||
195 | u8 functionProtocol; | ||
196 | u8 iInterface; | ||
197 | } IADDescriptor; | ||
198 | |||
199 | // CDC CS interface descriptor | ||
200 | typedef struct | ||
201 | { | ||
202 | u8 len; // 5 | ||
203 | u8 dtype; // 0x24 | ||
204 | u8 subtype; | ||
205 | u8 d0; | ||
206 | u8 d1; | ||
207 | } CDCCSInterfaceDescriptor; | ||
208 | |||
209 | typedef struct | ||
210 | { | ||
211 | u8 len; // 4 | ||
212 | u8 dtype; // 0x24 | ||
213 | u8 subtype; | ||
214 | u8 d0; | ||
215 | } CDCCSInterfaceDescriptor4; | ||
216 | |||
217 | typedef struct | ||
218 | { | ||
219 | u8 len; | ||
220 | u8 dtype; // 0x24 | ||
221 | u8 subtype; // 1 | ||
222 | u8 bmCapabilities; | ||
223 | u8 bDataInterface; | ||
224 | } CMFunctionalDescriptor; | ||
225 | |||
226 | typedef struct | ||
227 | { | ||
228 | u8 len; | ||
229 | u8 dtype; // 0x24 | ||
230 | u8 subtype; // 1 | ||
231 | u8 bmCapabilities; | ||
232 | } ACMFunctionalDescriptor; | ||
233 | |||
234 | typedef struct | ||
235 | { | ||
236 | // IAD | ||
237 | IADDescriptor iad; // Only needed on compound device | ||
238 | |||
239 | // Control | ||
240 | InterfaceDescriptor cif; // | ||
241 | CDCCSInterfaceDescriptor header; | ||
242 | CMFunctionalDescriptor callManagement; // Call Management | ||
243 | ACMFunctionalDescriptor controlManagement; // ACM | ||
244 | CDCCSInterfaceDescriptor functionalDescriptor; // CDC_UNION | ||
245 | EndpointDescriptor cifin; | ||
246 | |||
247 | // Data | ||
248 | InterfaceDescriptor dif; | ||
249 | EndpointDescriptor in; | ||
250 | EndpointDescriptor out; | ||
251 | } CDCDescriptor; | ||
252 | |||
253 | typedef struct | ||
254 | { | ||
255 | InterfaceDescriptor msc; | ||
256 | EndpointDescriptor in; | ||
257 | EndpointDescriptor out; | ||
258 | } MSCDescriptor; | ||
259 | |||
260 | typedef struct | ||
261 | { | ||
262 | u8 len; // 9 | ||
263 | u8 dtype; // 0x21 | ||
264 | u8 addr; | ||
265 | u8 versionL; // 0x101 | ||
266 | u8 versionH; // 0x101 | ||
267 | u8 country; | ||
268 | u8 desctype; // 0x22 report | ||
269 | u8 descLenL; | ||
270 | u8 descLenH; | ||
271 | } HIDDescDescriptor; | ||
272 | |||
273 | typedef struct | ||
274 | { | ||
275 | InterfaceDescriptor hid; | ||
276 | HIDDescDescriptor desc; | ||
277 | EndpointDescriptor in; | ||
278 | } HIDDescriptor; | ||
279 | |||
280 | |||
281 | #define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \ | ||
282 | { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs } | ||
283 | |||
284 | #define D_CONFIG(_totalLength,_interfaces) \ | ||
285 | { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(500) } | ||
286 | |||
287 | #define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \ | ||
288 | { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 } | ||
289 | |||
290 | #define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \ | ||
291 | { 7, 5, _addr,_attr,_packetSize, _interval } | ||
292 | |||
293 | #define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \ | ||
294 | { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 } | ||
295 | |||
296 | #define D_HIDREPORT(_descriptorLength) \ | ||
297 | { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 } | ||
298 | |||
299 | #define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 } | ||
300 | #define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 } | ||
301 | |||
302 | |||
303 | #endif \ No newline at end of file | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h new file mode 100644 index 000000000..229a638c5 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBDesc.h | |||
@@ -0,0 +1,63 @@ | |||
1 | |||
2 | |||
3 | /* Copyright (c) 2011, Peter Barrett | ||
4 | ** | ||
5 | ** Permission to use, copy, modify, and/or distribute this software for | ||
6 | ** any purpose with or without fee is hereby granted, provided that the | ||
7 | ** above copyright notice and this permission notice appear in all copies. | ||
8 | ** | ||
9 | ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||
10 | ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||
11 | ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR | ||
12 | ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES | ||
13 | ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | ||
14 | ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | ||
15 | ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | ||
16 | ** SOFTWARE. | ||
17 | */ | ||
18 | |||
19 | //#define CDC_ENABLED | ||
20 | //#define HID_ENABLED | ||
21 | |||
22 | |||
23 | #ifdef CDC_ENABLED | ||
24 | #define CDC_INTERFACE_COUNT 2 | ||
25 | #define CDC_ENPOINT_COUNT 3 | ||
26 | #else | ||
27 | #define CDC_INTERFACE_COUNT 0 | ||
28 | #define CDC_ENPOINT_COUNT 0 | ||
29 | #endif | ||
30 | |||
31 | #ifdef HID_ENABLED | ||
32 | #define HID_INTERFACE_COUNT 1 | ||
33 | #define HID_ENPOINT_COUNT 1 | ||
34 | #else | ||
35 | #define HID_INTERFACE_COUNT 0 | ||
36 | #define HID_ENPOINT_COUNT 0 | ||
37 | #endif | ||
38 | |||
39 | #define CDC_ACM_INTERFACE 0 // CDC ACM | ||
40 | #define CDC_DATA_INTERFACE 1 // CDC Data | ||
41 | #define CDC_FIRST_ENDPOINT 1 | ||
42 | #define CDC_ENDPOINT_ACM (CDC_FIRST_ENDPOINT) // CDC First | ||
43 | #define CDC_ENDPOINT_OUT (CDC_FIRST_ENDPOINT+1) | ||
44 | #define CDC_ENDPOINT_IN (CDC_FIRST_ENDPOINT+2) | ||
45 | |||
46 | #define HID_INTERFACE (CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT) // HID Interface | ||
47 | #define HID_FIRST_ENDPOINT (CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT) | ||
48 | #define HID_ENDPOINT_INT (HID_FIRST_ENDPOINT) | ||
49 | |||
50 | #define INTERFACE_COUNT (MSC_INTERFACE + MSC_INTERFACE_COUNT) | ||
51 | |||
52 | #ifdef CDC_ENABLED | ||
53 | #define CDC_RX CDC_ENDPOINT_OUT | ||
54 | #define CDC_TX CDC_ENDPOINT_IN | ||
55 | #endif | ||
56 | |||
57 | #ifdef HID_ENABLED | ||
58 | #define HID_TX HID_ENDPOINT_INT | ||
59 | #endif | ||
60 | |||
61 | #define IMANUFACTURER 1 | ||
62 | #define IPRODUCT 2 | ||
63 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/Udp.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Udp.h new file mode 100644 index 000000000..dc5644b9d --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/Udp.h | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * Udp.cpp: Library to send/receive UDP packets. | ||
3 | * | ||
4 | * NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these) | ||
5 | * 1) UDP does not guarantee the order in which assembled UDP packets are received. This | ||
6 | * might not happen often in practice, but in larger network topologies, a UDP | ||
7 | * packet can be received out of sequence. | ||
8 | * 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being | ||
9 | * aware of it. Again, this may not be a concern in practice on small local networks. | ||
10 | * For more information, see http://www.cafeaulait.org/course/week12/35.html | ||
11 | * | ||
12 | * MIT License: | ||
13 | * Copyright (c) 2008 Bjoern Hartmann | ||
14 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
15 | * of this software and associated documentation files (the "Software"), to deal | ||
16 | * in the Software without restriction, including without limitation the rights | ||
17 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
18 | * copies of the Software, and to permit persons to whom the Software is | ||
19 | * furnished to do so, subject to the following conditions: | ||
20 | * | ||
21 | * The above copyright notice and this permission notice shall be included in | ||
22 | * all copies or substantial portions of the Software. | ||
23 | * | ||
24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
25 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
26 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
27 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
28 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
29 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
30 | * THE SOFTWARE. | ||
31 | * | ||
32 | * bjoern@cs.stanford.edu 12/30/2008 | ||
33 | */ | ||
34 | |||
35 | #ifndef udp_h | ||
36 | #define udp_h | ||
37 | |||
38 | #include <Stream.h> | ||
39 | #include <IPAddress.h> | ||
40 | |||
41 | class UDP : public Stream { | ||
42 | |||
43 | public: | ||
44 | virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use | ||
45 | virtual void stop() =0; // Finish with the UDP socket | ||
46 | |||
47 | // Sending UDP packets | ||
48 | |||
49 | // Start building up a packet to send to the remote host specific in ip and port | ||
50 | // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port | ||
51 | virtual int beginPacket(IPAddress ip, uint16_t port) =0; | ||
52 | // Start building up a packet to send to the remote host specific in host and port | ||
53 | // Returns 1 if successful, 0 if there was a problem resolving the hostname or port | ||
54 | virtual int beginPacket(const char *host, uint16_t port) =0; | ||
55 | // Finish off this packet and send it | ||
56 | // Returns 1 if the packet was sent successfully, 0 if there was an error | ||
57 | virtual int endPacket() =0; | ||
58 | // Write a single byte into the packet | ||
59 | virtual size_t write(uint8_t) =0; | ||
60 | // Write size bytes from buffer into the packet | ||
61 | virtual size_t write(const uint8_t *buffer, size_t size) =0; | ||
62 | |||
63 | // Start processing the next available incoming packet | ||
64 | // Returns the size of the packet in bytes, or 0 if no packets are available | ||
65 | virtual int parsePacket() =0; | ||
66 | // Number of bytes remaining in the current packet | ||
67 | virtual int available() =0; | ||
68 | // Read a single byte from the current packet | ||
69 | virtual int read() =0; | ||
70 | // Read up to len bytes from the current packet and place them into buffer | ||
71 | // Returns the number of bytes read, or 0 if none are available | ||
72 | virtual int read(unsigned char* buffer, size_t len) =0; | ||
73 | // Read up to len characters from the current packet and place them into buffer | ||
74 | // Returns the number of characters read, or 0 if none are available | ||
75 | virtual int read(char* buffer, size_t len) =0; | ||
76 | // Return the next byte from the current packet without moving on to the next byte | ||
77 | virtual int peek() =0; | ||
78 | virtual void flush() =0; // Finish reading the current packet | ||
79 | |||
80 | // Return the IP address of the host who sent the current incoming packet | ||
81 | virtual IPAddress remoteIP() =0; | ||
82 | // Return the port of the host who sent the current incoming packet | ||
83 | virtual uint16_t remotePort() =0; | ||
84 | protected: | ||
85 | uint8_t* rawIPAddress(IPAddress& addr) { return addr.raw_address(); }; | ||
86 | }; | ||
87 | |||
88 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WCharacter.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WCharacter.h new file mode 100644 index 000000000..79733b50a --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WCharacter.h | |||
@@ -0,0 +1,168 @@ | |||
1 | /* | ||
2 | WCharacter.h - Character utility functions for Wiring & Arduino | ||
3 | Copyright (c) 2010 Hernando Barragan. All right 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 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | */ | ||
19 | |||
20 | #ifndef Character_h | ||
21 | #define Character_h | ||
22 | |||
23 | #include <ctype.h> | ||
24 | |||
25 | // WCharacter.h prototypes | ||
26 | inline boolean isAlphaNumeric(int c) __attribute__((always_inline)); | ||
27 | inline boolean isAlpha(int c) __attribute__((always_inline)); | ||
28 | inline boolean isAscii(int c) __attribute__((always_inline)); | ||
29 | inline boolean isWhitespace(int c) __attribute__((always_inline)); | ||
30 | inline boolean isControl(int c) __attribute__((always_inline)); | ||
31 | inline boolean isDigit(int c) __attribute__((always_inline)); | ||
32 | inline boolean isGraph(int c) __attribute__((always_inline)); | ||
33 | inline boolean isLowerCase(int c) __attribute__((always_inline)); | ||
34 | inline boolean isPrintable(int c) __attribute__((always_inline)); | ||
35 | inline boolean isPunct(int c) __attribute__((always_inline)); | ||
36 | inline boolean isSpace(int c) __attribute__((always_inline)); | ||
37 | inline boolean isUpperCase(int c) __attribute__((always_inline)); | ||
38 | inline boolean isHexadecimalDigit(int c) __attribute__((always_inline)); | ||
39 | inline int toAscii(int c) __attribute__((always_inline)); | ||
40 | inline int toLowerCase(int c) __attribute__((always_inline)); | ||
41 | inline int toUpperCase(int c)__attribute__((always_inline)); | ||
42 | |||
43 | |||
44 | // Checks for an alphanumeric character. | ||
45 | // It is equivalent to (isalpha(c) || isdigit(c)). | ||
46 | inline boolean isAlphaNumeric(int c) | ||
47 | { | ||
48 | return ( isalnum(c) == 0 ? false : true); | ||
49 | } | ||
50 | |||
51 | |||
52 | // Checks for an alphabetic character. | ||
53 | // It is equivalent to (isupper(c) || islower(c)). | ||
54 | inline boolean isAlpha(int c) | ||
55 | { | ||
56 | return ( isalpha(c) == 0 ? false : true); | ||
57 | } | ||
58 | |||
59 | |||
60 | // Checks whether c is a 7-bit unsigned char value | ||
61 | // that fits into the ASCII character set. | ||
62 | inline boolean isAscii(int c) | ||
63 | { | ||
64 | return ( isascii (c) == 0 ? false : true); | ||
65 | } | ||
66 | |||
67 | |||
68 | // Checks for a blank character, that is, a space or a tab. | ||
69 | inline boolean isWhitespace(int c) | ||
70 | { | ||
71 | return ( isblank (c) == 0 ? false : true); | ||
72 | } | ||
73 | |||
74 | |||
75 | // Checks for a control character. | ||
76 | inline boolean isControl(int c) | ||
77 | { | ||
78 | return ( iscntrl (c) == 0 ? false : true); | ||
79 | } | ||
80 | |||
81 | |||
82 | // Checks for a digit (0 through 9). | ||
83 | inline boolean isDigit(int c) | ||
84 | { | ||
85 | return ( isdigit (c) == 0 ? false : true); | ||
86 | } | ||
87 | |||
88 | |||
89 | // Checks for any printable character except space. | ||
90 | inline boolean isGraph(int c) | ||
91 | { | ||
92 | return ( isgraph (c) == 0 ? false : true); | ||
93 | } | ||
94 | |||
95 | |||
96 | // Checks for a lower-case character. | ||
97 | inline boolean isLowerCase(int c) | ||
98 | { | ||
99 | return (islower (c) == 0 ? false : true); | ||
100 | } | ||
101 | |||
102 | |||
103 | // Checks for any printable character including space. | ||
104 | inline boolean isPrintable(int c) | ||
105 | { | ||
106 | return ( isprint (c) == 0 ? false : true); | ||
107 | } | ||
108 | |||
109 | |||
110 | // Checks for any printable character which is not a space | ||
111 | // or an alphanumeric character. | ||
112 | inline boolean isPunct(int c) | ||
113 | { | ||
114 | return ( ispunct (c) == 0 ? false : true); | ||
115 | } | ||
116 | |||
117 | |||
118 | // Checks for white-space characters. For the avr-libc library, | ||
119 | // these are: space, formfeed ('\f'), newline ('\n'), carriage | ||
120 | // return ('\r'), horizontal tab ('\t'), and vertical tab ('\v'). | ||
121 | inline boolean isSpace(int c) | ||
122 | { | ||
123 | return ( isspace (c) == 0 ? false : true); | ||
124 | } | ||
125 | |||
126 | |||
127 | // Checks for an uppercase letter. | ||
128 | inline boolean isUpperCase(int c) | ||
129 | { | ||
130 | return ( isupper (c) == 0 ? false : true); | ||
131 | } | ||
132 | |||
133 | |||
134 | // Checks for a hexadecimal digits, i.e. one of 0 1 2 3 4 5 6 7 | ||
135 | // 8 9 a b c d e f A B C D E F. | ||
136 | inline boolean isHexadecimalDigit(int c) | ||
137 | { | ||
138 | return ( isxdigit (c) == 0 ? false : true); | ||
139 | } | ||
140 | |||
141 | |||
142 | // Converts c to a 7-bit unsigned char value that fits into the | ||
143 | // ASCII character set, by clearing the high-order bits. | ||
144 | inline int toAscii(int c) | ||
145 | { | ||
146 | return toascii (c); | ||
147 | } | ||
148 | |||
149 | |||
150 | // Warning: | ||
151 | // Many people will be unhappy if you use this function. | ||
152 | // This function will convert accented letters into random | ||
153 | // characters. | ||
154 | |||
155 | // Converts the letter c to lower case, if possible. | ||
156 | inline int toLowerCase(int c) | ||
157 | { | ||
158 | return tolower (c); | ||
159 | } | ||
160 | |||
161 | |||
162 | // Converts the letter c to upper case, if possible. | ||
163 | inline int toUpperCase(int c) | ||
164 | { | ||
165 | return toupper (c); | ||
166 | } | ||
167 | |||
168 | #endif \ No newline at end of file | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WInterrupts.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WInterrupts.c new file mode 100644 index 000000000..8f3ec847f --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WInterrupts.c | |||
@@ -0,0 +1,298 @@ | |||
1 | /* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ | ||
2 | |||
3 | /* | ||
4 | Part of the Wiring project - http://wiring.uniandes.edu.co | ||
5 | |||
6 | Copyright (c) 2004-05 Hernando Barragan | ||
7 | |||
8 | This library is free software; you can redistribute it and/or | ||
9 | modify it under the terms of the GNU Lesser General Public | ||
10 | License as published by the Free Software Foundation; either | ||
11 | version 2.1 of the License, or (at your option) any later version. | ||
12 | |||
13 | This library is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | Lesser General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU Lesser General | ||
19 | Public License along with this library; if not, write to the | ||
20 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
21 | Boston, MA 02111-1307 USA | ||
22 | |||
23 | Modified 24 November 2006 by David A. Mellis | ||
24 | Modified 1 August 2010 by Mark Sproul | ||
25 | */ | ||
26 | |||
27 | #include <inttypes.h> | ||
28 | #include <avr/io.h> | ||
29 | #include <avr/interrupt.h> | ||
30 | #include <avr/pgmspace.h> | ||
31 | #include <stdio.h> | ||
32 | |||
33 | #include "wiring_private.h" | ||
34 | |||
35 | static volatile voidFuncPtr intFunc[EXTERNAL_NUM_INTERRUPTS]; | ||
36 | // volatile static voidFuncPtr twiIntFunc; | ||
37 | |||
38 | void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode) { | ||
39 | if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { | ||
40 | intFunc[interruptNum] = userFunc; | ||
41 | |||
42 | // Configure the interrupt mode (trigger on low input, any change, rising | ||
43 | // edge, or falling edge). The mode constants were chosen to correspond | ||
44 | // to the configuration bits in the hardware register, so we simply shift | ||
45 | // the mode into place. | ||
46 | |||
47 | // Enable the interrupt. | ||
48 | |||
49 | switch (interruptNum) { | ||
50 | #if defined(__AVR_ATmega32U4__) | ||
51 | // I hate doing this, but the register assignment differs between the 1280/2560 | ||
52 | // and the 32U4. Since avrlib defines registers PCMSK1 and PCMSK2 that aren't | ||
53 | // even present on the 32U4 this is the only way to distinguish between them. | ||
54 | case 0: | ||
55 | EICRA = (EICRA & ~((1<<ISC00) | (1<<ISC01))) | (mode << ISC00); | ||
56 | EIMSK |= (1<<INT0); | ||
57 | break; | ||
58 | case 1: | ||
59 | EICRA = (EICRA & ~((1<<ISC10) | (1<<ISC11))) | (mode << ISC10); | ||
60 | EIMSK |= (1<<INT1); | ||
61 | break; | ||
62 | #elif defined(EICRA) && defined(EICRB) && defined(EIMSK) | ||
63 | case 2: | ||
64 | EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); | ||
65 | EIMSK |= (1 << INT0); | ||
66 | break; | ||
67 | case 3: | ||
68 | EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); | ||
69 | EIMSK |= (1 << INT1); | ||
70 | break; | ||
71 | case 4: | ||
72 | EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); | ||
73 | EIMSK |= (1 << INT2); | ||
74 | break; | ||
75 | case 5: | ||
76 | EICRA = (EICRA & ~((1 << ISC30) | (1 << ISC31))) | (mode << ISC30); | ||
77 | EIMSK |= (1 << INT3); | ||
78 | break; | ||
79 | case 0: | ||
80 | EICRB = (EICRB & ~((1 << ISC40) | (1 << ISC41))) | (mode << ISC40); | ||
81 | EIMSK |= (1 << INT4); | ||
82 | break; | ||
83 | case 1: | ||
84 | EICRB = (EICRB & ~((1 << ISC50) | (1 << ISC51))) | (mode << ISC50); | ||
85 | EIMSK |= (1 << INT5); | ||
86 | break; | ||
87 | case 6: | ||
88 | EICRB = (EICRB & ~((1 << ISC60) | (1 << ISC61))) | (mode << ISC60); | ||
89 | EIMSK |= (1 << INT6); | ||
90 | break; | ||
91 | case 7: | ||
92 | EICRB = (EICRB & ~((1 << ISC70) | (1 << ISC71))) | (mode << ISC70); | ||
93 | EIMSK |= (1 << INT7); | ||
94 | break; | ||
95 | #else | ||
96 | case 0: | ||
97 | #if defined(EICRA) && defined(ISC00) && defined(EIMSK) | ||
98 | EICRA = (EICRA & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); | ||
99 | EIMSK |= (1 << INT0); | ||
100 | #elif defined(MCUCR) && defined(ISC00) && defined(GICR) | ||
101 | MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); | ||
102 | GICR |= (1 << INT0); | ||
103 | #elif defined(MCUCR) && defined(ISC00) && defined(GIMSK) | ||
104 | MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); | ||
105 | GIMSK |= (1 << INT0); | ||
106 | #else | ||
107 | #error attachInterrupt not finished for this CPU (case 0) | ||
108 | #endif | ||
109 | break; | ||
110 | |||
111 | case 1: | ||
112 | #if defined(EICRA) && defined(ISC10) && defined(ISC11) && defined(EIMSK) | ||
113 | EICRA = (EICRA & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); | ||
114 | EIMSK |= (1 << INT1); | ||
115 | #elif defined(MCUCR) && defined(ISC10) && defined(ISC11) && defined(GICR) | ||
116 | MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); | ||
117 | GICR |= (1 << INT1); | ||
118 | #elif defined(MCUCR) && defined(ISC10) && defined(GIMSK) && defined(GIMSK) | ||
119 | MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); | ||
120 | GIMSK |= (1 << INT1); | ||
121 | #else | ||
122 | #warning attachInterrupt may need some more work for this cpu (case 1) | ||
123 | #endif | ||
124 | break; | ||
125 | |||
126 | case 2: | ||
127 | #if defined(EICRA) && defined(ISC20) && defined(ISC21) && defined(EIMSK) | ||
128 | EICRA = (EICRA & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); | ||
129 | EIMSK |= (1 << INT2); | ||
130 | #elif defined(MCUCR) && defined(ISC20) && defined(ISC21) && defined(GICR) | ||
131 | MCUCR = (MCUCR & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); | ||
132 | GICR |= (1 << INT2); | ||
133 | #elif defined(MCUCR) && defined(ISC20) && defined(GIMSK) && defined(GIMSK) | ||
134 | MCUCR = (MCUCR & ~((1 << ISC20) | (1 << ISC21))) | (mode << ISC20); | ||
135 | GIMSK |= (1 << INT2); | ||
136 | #endif | ||
137 | break; | ||
138 | #endif | ||
139 | } | ||
140 | } | ||
141 | } | ||
142 | |||
143 | void detachInterrupt(uint8_t interruptNum) { | ||
144 | if(interruptNum < EXTERNAL_NUM_INTERRUPTS) { | ||
145 | // Disable the interrupt. (We can't assume that interruptNum is equal | ||
146 | // to the number of the EIMSK bit to clear, as this isn't true on the | ||
147 | // ATmega8. There, INT0 is 6 and INT1 is 7.) | ||
148 | switch (interruptNum) { | ||
149 | #if defined(__AVR_ATmega32U4__) | ||
150 | case 0: | ||
151 | EIMSK &= ~(1<<INT0); | ||
152 | break; | ||
153 | case 1: | ||
154 | EIMSK &= ~(1<<INT1); | ||
155 | break; | ||
156 | #elif defined(EICRA) && defined(EICRB) && defined(EIMSK) | ||
157 | case 2: | ||
158 | EIMSK &= ~(1 << INT0); | ||
159 | break; | ||
160 | case 3: | ||
161 | EIMSK &= ~(1 << INT1); | ||
162 | break; | ||
163 | case 4: | ||
164 | EIMSK &= ~(1 << INT2); | ||
165 | break; | ||
166 | case 5: | ||
167 | EIMSK &= ~(1 << INT3); | ||
168 | break; | ||
169 | case 0: | ||
170 | EIMSK &= ~(1 << INT4); | ||
171 | break; | ||
172 | case 1: | ||
173 | EIMSK &= ~(1 << INT5); | ||
174 | break; | ||
175 | case 6: | ||
176 | EIMSK &= ~(1 << INT6); | ||
177 | break; | ||
178 | case 7: | ||
179 | EIMSK &= ~(1 << INT7); | ||
180 | break; | ||
181 | #else | ||
182 | case 0: | ||
183 | #if defined(EIMSK) && defined(INT0) | ||
184 | EIMSK &= ~(1 << INT0); | ||
185 | #elif defined(GICR) && defined(ISC00) | ||
186 | GICR &= ~(1 << INT0); // atmega32 | ||
187 | #elif defined(GIMSK) && defined(INT0) | ||
188 | GIMSK &= ~(1 << INT0); | ||
189 | #else | ||
190 | #error detachInterrupt not finished for this cpu | ||
191 | #endif | ||
192 | break; | ||
193 | |||
194 | case 1: | ||
195 | #if defined(EIMSK) && defined(INT1) | ||
196 | EIMSK &= ~(1 << INT1); | ||
197 | #elif defined(GICR) && defined(INT1) | ||
198 | GICR &= ~(1 << INT1); // atmega32 | ||
199 | #elif defined(GIMSK) && defined(INT1) | ||
200 | GIMSK &= ~(1 << INT1); | ||
201 | #else | ||
202 | #warning detachInterrupt may need some more work for this cpu (case 1) | ||
203 | #endif | ||
204 | break; | ||
205 | #endif | ||
206 | } | ||
207 | |||
208 | intFunc[interruptNum] = 0; | ||
209 | } | ||
210 | } | ||
211 | |||
212 | /* | ||
213 | void attachInterruptTwi(void (*userFunc)(void) ) { | ||
214 | twiIntFunc = userFunc; | ||
215 | } | ||
216 | */ | ||
217 | |||
218 | #if defined(__AVR_ATmega32U4__) | ||
219 | SIGNAL(INT0_vect) { | ||
220 | if(intFunc[EXTERNAL_INT_0]) | ||
221 | intFunc[EXTERNAL_INT_0](); | ||
222 | } | ||
223 | |||
224 | SIGNAL(INT1_vect) { | ||
225 | if(intFunc[EXTERNAL_INT_1]) | ||
226 | intFunc[EXTERNAL_INT_1](); | ||
227 | } | ||
228 | |||
229 | #elif defined(EICRA) && defined(EICRB) | ||
230 | |||
231 | SIGNAL(INT0_vect) { | ||
232 | if(intFunc[EXTERNAL_INT_2]) | ||
233 | intFunc[EXTERNAL_INT_2](); | ||
234 | } | ||
235 | |||
236 | SIGNAL(INT1_vect) { | ||
237 | if(intFunc[EXTERNAL_INT_3]) | ||
238 | intFunc[EXTERNAL_INT_3](); | ||
239 | } | ||
240 | |||
241 | SIGNAL(INT2_vect) { | ||
242 | if(intFunc[EXTERNAL_INT_4]) | ||
243 | intFunc[EXTERNAL_INT_4](); | ||
244 | } | ||
245 | |||
246 | SIGNAL(INT3_vect) { | ||
247 | if(intFunc[EXTERNAL_INT_5]) | ||
248 | intFunc[EXTERNAL_INT_5](); | ||
249 | } | ||
250 | |||
251 | SIGNAL(INT4_vect) { | ||
252 | if(intFunc[EXTERNAL_INT_0]) | ||
253 | intFunc[EXTERNAL_INT_0](); | ||
254 | } | ||
255 | |||
256 | SIGNAL(INT5_vect) { | ||
257 | if(intFunc[EXTERNAL_INT_1]) | ||
258 | intFunc[EXTERNAL_INT_1](); | ||
259 | } | ||
260 | |||
261 | SIGNAL(INT6_vect) { | ||
262 | if(intFunc[EXTERNAL_INT_6]) | ||
263 | intFunc[EXTERNAL_INT_6](); | ||
264 | } | ||
265 | |||
266 | SIGNAL(INT7_vect) { | ||
267 | if(intFunc[EXTERNAL_INT_7]) | ||
268 | intFunc[EXTERNAL_INT_7](); | ||
269 | } | ||
270 | |||
271 | #else | ||
272 | |||
273 | SIGNAL(INT0_vect) { | ||
274 | if(intFunc[EXTERNAL_INT_0]) | ||
275 | intFunc[EXTERNAL_INT_0](); | ||
276 | } | ||
277 | |||
278 | SIGNAL(INT1_vect) { | ||
279 | if(intFunc[EXTERNAL_INT_1]) | ||
280 | intFunc[EXTERNAL_INT_1](); | ||
281 | } | ||
282 | |||
283 | #if defined(EICRA) && defined(ISC20) | ||
284 | SIGNAL(INT2_vect) { | ||
285 | if(intFunc[EXTERNAL_INT_2]) | ||
286 | intFunc[EXTERNAL_INT_2](); | ||
287 | } | ||
288 | #endif | ||
289 | |||
290 | #endif | ||
291 | |||
292 | /* | ||
293 | SIGNAL(SIG_2WIRE_SERIAL) { | ||
294 | if(twiIntFunc) | ||
295 | twiIntFunc(); | ||
296 | } | ||
297 | */ | ||
298 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WMath.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WMath.cpp new file mode 100644 index 000000000..2120c4cc1 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WMath.cpp | |||
@@ -0,0 +1,60 @@ | |||
1 | /* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ | ||
2 | |||
3 | /* | ||
4 | Part of the Wiring project - http://wiring.org.co | ||
5 | Copyright (c) 2004-06 Hernando Barragan | ||
6 | Modified 13 August 2006, David A. Mellis for Arduino - http://www.arduino.cc/ | ||
7 | |||
8 | This library is free software; you can redistribute it and/or | ||
9 | modify it under the terms of the GNU Lesser General Public | ||
10 | License as published by the Free Software Foundation; either | ||
11 | version 2.1 of the License, or (at your option) any later version. | ||
12 | |||
13 | This library is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | Lesser General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU Lesser General | ||
19 | Public License along with this library; if not, write to the | ||
20 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
21 | Boston, MA 02111-1307 USA | ||
22 | |||
23 | $Id$ | ||
24 | */ | ||
25 | |||
26 | extern "C" { | ||
27 | #include "stdlib.h" | ||
28 | } | ||
29 | |||
30 | void randomSeed(unsigned int seed) | ||
31 | { | ||
32 | if (seed != 0) { | ||
33 | srandom(seed); | ||
34 | } | ||
35 | } | ||
36 | |||
37 | long random(long howbig) | ||
38 | { | ||
39 | if (howbig == 0) { | ||
40 | return 0; | ||
41 | } | ||
42 | return random() % howbig; | ||
43 | } | ||
44 | |||
45 | long random(long howsmall, long howbig) | ||
46 | { | ||
47 | if (howsmall >= howbig) { | ||
48 | return howsmall; | ||
49 | } | ||
50 | long diff = howbig - howsmall; | ||
51 | return random(diff) + howsmall; | ||
52 | } | ||
53 | |||
54 | long map(long x, long in_min, long in_max, long out_min, long out_max) | ||
55 | { | ||
56 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; | ||
57 | } | ||
58 | |||
59 | unsigned int makeWord(unsigned int w) { return w; } | ||
60 | unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; } \ No newline at end of file | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.cpp new file mode 100644 index 000000000..c6839fc0d --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.cpp | |||
@@ -0,0 +1,645 @@ | |||
1 | /* | ||
2 | WString.cpp - String library for Wiring & Arduino | ||
3 | ...mostly rewritten by Paul Stoffregen... | ||
4 | Copyright (c) 2009-10 Hernando Barragan. All rights reserved. | ||
5 | Copyright 2011, Paul Stoffregen, paul@pjrc.com | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General Public | ||
18 | License along with this library; if not, write to the Free Software | ||
19 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | #include "WString.h" | ||
23 | |||
24 | |||
25 | /*********************************************/ | ||
26 | /* Constructors */ | ||
27 | /*********************************************/ | ||
28 | |||
29 | String::String(const char *cstr) | ||
30 | { | ||
31 | init(); | ||
32 | if (cstr) copy(cstr, strlen(cstr)); | ||
33 | } | ||
34 | |||
35 | String::String(const String &value) | ||
36 | { | ||
37 | init(); | ||
38 | *this = value; | ||
39 | } | ||
40 | |||
41 | #ifdef __GXX_EXPERIMENTAL_CXX0X__ | ||
42 | String::String(String &&rval) | ||
43 | { | ||
44 | init(); | ||
45 | move(rval); | ||
46 | } | ||
47 | String::String(StringSumHelper &&rval) | ||
48 | { | ||
49 | init(); | ||
50 | move(rval); | ||
51 | } | ||
52 | #endif | ||
53 | |||
54 | String::String(char c) | ||
55 | { | ||
56 | init(); | ||
57 | char buf[2]; | ||
58 | buf[0] = c; | ||
59 | buf[1] = 0; | ||
60 | *this = buf; | ||
61 | } | ||
62 | |||
63 | String::String(unsigned char value, unsigned char base) | ||
64 | { | ||
65 | init(); | ||
66 | char buf[9]; | ||
67 | utoa(value, buf, base); | ||
68 | *this = buf; | ||
69 | } | ||
70 | |||
71 | String::String(int value, unsigned char base) | ||
72 | { | ||
73 | init(); | ||
74 | char buf[18]; | ||
75 | itoa(value, buf, base); | ||
76 | *this = buf; | ||
77 | } | ||
78 | |||
79 | String::String(unsigned int value, unsigned char base) | ||
80 | { | ||
81 | init(); | ||
82 | char buf[17]; | ||
83 | utoa(value, buf, base); | ||
84 | *this = buf; | ||
85 | } | ||
86 | |||
87 | String::String(long value, unsigned char base) | ||
88 | { | ||
89 | init(); | ||
90 | char buf[34]; | ||
91 | ltoa(value, buf, base); | ||
92 | *this = buf; | ||
93 | } | ||
94 | |||
95 | String::String(unsigned long value, unsigned char base) | ||
96 | { | ||
97 | init(); | ||
98 | char buf[33]; | ||
99 | ultoa(value, buf, base); | ||
100 | *this = buf; | ||
101 | } | ||
102 | |||
103 | String::~String() | ||
104 | { | ||
105 | free(buffer); | ||
106 | } | ||
107 | |||
108 | /*********************************************/ | ||
109 | /* Memory Management */ | ||
110 | /*********************************************/ | ||
111 | |||
112 | inline void String::init(void) | ||
113 | { | ||
114 | buffer = NULL; | ||
115 | capacity = 0; | ||
116 | len = 0; | ||
117 | flags = 0; | ||
118 | } | ||
119 | |||
120 | void String::invalidate(void) | ||
121 | { | ||
122 | if (buffer) free(buffer); | ||
123 | buffer = NULL; | ||
124 | capacity = len = 0; | ||
125 | } | ||
126 | |||
127 | unsigned char String::reserve(unsigned int size) | ||
128 | { | ||
129 | if (buffer && capacity >= size) return 1; | ||
130 | if (changeBuffer(size)) { | ||
131 | if (len == 0) buffer[0] = 0; | ||
132 | return 1; | ||
133 | } | ||
134 | return 0; | ||
135 | } | ||
136 | |||
137 | unsigned char String::changeBuffer(unsigned int maxStrLen) | ||
138 | { | ||
139 | char *newbuffer = (char *)realloc(buffer, maxStrLen + 1); | ||
140 | if (newbuffer) { | ||
141 | buffer = newbuffer; | ||
142 | capacity = maxStrLen; | ||
143 | return 1; | ||
144 | } | ||
145 | return 0; | ||
146 | } | ||
147 | |||
148 | /*********************************************/ | ||
149 | /* Copy and Move */ | ||
150 | /*********************************************/ | ||
151 | |||
152 | String & String::copy(const char *cstr, unsigned int length) | ||
153 | { | ||
154 | if (!reserve(length)) { | ||
155 | invalidate(); | ||
156 | return *this; | ||
157 | } | ||
158 | len = length; | ||
159 | strcpy(buffer, cstr); | ||
160 | return *this; | ||
161 | } | ||
162 | |||
163 | #ifdef __GXX_EXPERIMENTAL_CXX0X__ | ||
164 | void String::move(String &rhs) | ||
165 | { | ||
166 | if (buffer) { | ||
167 | if (capacity >= rhs.len) { | ||
168 | strcpy(buffer, rhs.buffer); | ||
169 | len = rhs.len; | ||
170 | rhs.len = 0; | ||
171 | return; | ||
172 | } else { | ||
173 | free(buffer); | ||
174 | } | ||
175 | } | ||
176 | buffer = rhs.buffer; | ||
177 | capacity = rhs.capacity; | ||
178 | len = rhs.len; | ||
179 | rhs.buffer = NULL; | ||
180 | rhs.capacity = 0; | ||
181 | rhs.len = 0; | ||
182 | } | ||
183 | #endif | ||
184 | |||
185 | String & String::operator = (const String &rhs) | ||
186 | { | ||
187 | if (this == &rhs) return *this; | ||
188 | |||
189 | if (rhs.buffer) copy(rhs.buffer, rhs.len); | ||
190 | else invalidate(); | ||
191 | |||
192 | return *this; | ||
193 | } | ||
194 | |||
195 | #ifdef __GXX_EXPERIMENTAL_CXX0X__ | ||
196 | String & String::operator = (String &&rval) | ||
197 | { | ||
198 | if (this != &rval) move(rval); | ||
199 | return *this; | ||
200 | } | ||
201 | |||
202 | String & String::operator = (StringSumHelper &&rval) | ||
203 | { | ||
204 | if (this != &rval) move(rval); | ||
205 | return *this; | ||
206 | } | ||
207 | #endif | ||
208 | |||
209 | String & String::operator = (const char *cstr) | ||
210 | { | ||
211 | if (cstr) copy(cstr, strlen(cstr)); | ||
212 | else invalidate(); | ||
213 | |||
214 | return *this; | ||
215 | } | ||
216 | |||
217 | /*********************************************/ | ||
218 | /* concat */ | ||
219 | /*********************************************/ | ||
220 | |||
221 | unsigned char String::concat(const String &s) | ||
222 | { | ||
223 | return concat(s.buffer, s.len); | ||
224 | } | ||
225 | |||
226 | unsigned char String::concat(const char *cstr, unsigned int length) | ||
227 | { | ||
228 | unsigned int newlen = len + length; | ||
229 | if (!cstr) return 0; | ||
230 | if (length == 0) return 1; | ||
231 | if (!reserve(newlen)) return 0; | ||
232 | strcpy(buffer + len, cstr); | ||
233 | len = newlen; | ||
234 | return 1; | ||
235 | } | ||
236 | |||
237 | unsigned char String::concat(const char *cstr) | ||
238 | { | ||
239 | if (!cstr) return 0; | ||
240 | return concat(cstr, strlen(cstr)); | ||
241 | } | ||
242 | |||
243 | unsigned char String::concat(char c) | ||
244 | { | ||
245 | char buf[2]; | ||
246 | buf[0] = c; | ||
247 | buf[1] = 0; | ||
248 | return concat(buf, 1); | ||
249 | } | ||
250 | |||
251 | unsigned char String::concat(unsigned char num) | ||
252 | { | ||
253 | char buf[4]; | ||
254 | itoa(num, buf, 10); | ||
255 | return concat(buf, strlen(buf)); | ||
256 | } | ||
257 | |||
258 | unsigned char String::concat(int num) | ||
259 | { | ||
260 | char buf[7]; | ||
261 | itoa(num, buf, 10); | ||
262 | return concat(buf, strlen(buf)); | ||
263 | } | ||
264 | |||
265 | unsigned char String::concat(unsigned int num) | ||
266 | { | ||
267 | char buf[6]; | ||
268 | utoa(num, buf, 10); | ||
269 | return concat(buf, strlen(buf)); | ||
270 | } | ||
271 | |||
272 | unsigned char String::concat(long num) | ||
273 | { | ||
274 | char buf[12]; | ||
275 | ltoa(num, buf, 10); | ||
276 | return concat(buf, strlen(buf)); | ||
277 | } | ||
278 | |||
279 | unsigned char String::concat(unsigned long num) | ||
280 | { | ||
281 | char buf[11]; | ||
282 | ultoa(num, buf, 10); | ||
283 | return concat(buf, strlen(buf)); | ||
284 | } | ||
285 | |||
286 | /*********************************************/ | ||
287 | /* Concatenate */ | ||
288 | /*********************************************/ | ||
289 | |||
290 | StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs) | ||
291 | { | ||
292 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
293 | if (!a.concat(rhs.buffer, rhs.len)) a.invalidate(); | ||
294 | return a; | ||
295 | } | ||
296 | |||
297 | StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr) | ||
298 | { | ||
299 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
300 | if (!cstr || !a.concat(cstr, strlen(cstr))) a.invalidate(); | ||
301 | return a; | ||
302 | } | ||
303 | |||
304 | StringSumHelper & operator + (const StringSumHelper &lhs, char c) | ||
305 | { | ||
306 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
307 | if (!a.concat(c)) a.invalidate(); | ||
308 | return a; | ||
309 | } | ||
310 | |||
311 | StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num) | ||
312 | { | ||
313 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
314 | if (!a.concat(num)) a.invalidate(); | ||
315 | return a; | ||
316 | } | ||
317 | |||
318 | StringSumHelper & operator + (const StringSumHelper &lhs, int num) | ||
319 | { | ||
320 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
321 | if (!a.concat(num)) a.invalidate(); | ||
322 | return a; | ||
323 | } | ||
324 | |||
325 | StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num) | ||
326 | { | ||
327 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
328 | if (!a.concat(num)) a.invalidate(); | ||
329 | return a; | ||
330 | } | ||
331 | |||
332 | StringSumHelper & operator + (const StringSumHelper &lhs, long num) | ||
333 | { | ||
334 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
335 | if (!a.concat(num)) a.invalidate(); | ||
336 | return a; | ||
337 | } | ||
338 | |||
339 | StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num) | ||
340 | { | ||
341 | StringSumHelper &a = const_cast<StringSumHelper&>(lhs); | ||
342 | if (!a.concat(num)) a.invalidate(); | ||
343 | return a; | ||
344 | } | ||
345 | |||
346 | /*********************************************/ | ||
347 | /* Comparison */ | ||
348 | /*********************************************/ | ||
349 | |||
350 | int String::compareTo(const String &s) const | ||
351 | { | ||
352 | if (!buffer || !s.buffer) { | ||
353 | if (s.buffer && s.len > 0) return 0 - *(unsigned char *)s.buffer; | ||
354 | if (buffer && len > 0) return *(unsigned char *)buffer; | ||
355 | return 0; | ||
356 | } | ||
357 | return strcmp(buffer, s.buffer); | ||
358 | } | ||
359 | |||
360 | unsigned char String::equals(const String &s2) const | ||
361 | { | ||
362 | return (len == s2.len && compareTo(s2) == 0); | ||
363 | } | ||
364 | |||
365 | unsigned char String::equals(const char *cstr) const | ||
366 | { | ||
367 | if (len == 0) return (cstr == NULL || *cstr == 0); | ||
368 | if (cstr == NULL) return buffer[0] == 0; | ||
369 | return strcmp(buffer, cstr) == 0; | ||
370 | } | ||
371 | |||
372 | unsigned char String::operator<(const String &rhs) const | ||
373 | { | ||
374 | return compareTo(rhs) < 0; | ||
375 | } | ||
376 | |||
377 | unsigned char String::operator>(const String &rhs) const | ||
378 | { | ||
379 | return compareTo(rhs) > 0; | ||
380 | } | ||
381 | |||
382 | unsigned char String::operator<=(const String &rhs) const | ||
383 | { | ||
384 | return compareTo(rhs) <= 0; | ||
385 | } | ||
386 | |||
387 | unsigned char String::operator>=(const String &rhs) const | ||
388 | { | ||
389 | return compareTo(rhs) >= 0; | ||
390 | } | ||
391 | |||
392 | unsigned char String::equalsIgnoreCase( const String &s2 ) const | ||
393 | { | ||
394 | if (this == &s2) return 1; | ||
395 | if (len != s2.len) return 0; | ||
396 | if (len == 0) return 1; | ||
397 | const char *p1 = buffer; | ||
398 | const char *p2 = s2.buffer; | ||
399 | while (*p1) { | ||
400 | if (tolower(*p1++) != tolower(*p2++)) return 0; | ||
401 | } | ||
402 | return 1; | ||
403 | } | ||
404 | |||
405 | unsigned char String::startsWith( const String &s2 ) const | ||
406 | { | ||
407 | if (len < s2.len) return 0; | ||
408 | return startsWith(s2, 0); | ||
409 | } | ||
410 | |||
411 | unsigned char String::startsWith( const String &s2, unsigned int offset ) const | ||
412 | { | ||
413 | if (offset > len - s2.len || !buffer || !s2.buffer) return 0; | ||
414 | return strncmp( &buffer[offset], s2.buffer, s2.len ) == 0; | ||
415 | } | ||
416 | |||
417 | unsigned char String::endsWith( const String &s2 ) const | ||
418 | { | ||
419 | if ( len < s2.len || !buffer || !s2.buffer) return 0; | ||
420 | return strcmp(&buffer[len - s2.len], s2.buffer) == 0; | ||
421 | } | ||
422 | |||
423 | /*********************************************/ | ||
424 | /* Character Access */ | ||
425 | /*********************************************/ | ||
426 | |||
427 | char String::charAt(unsigned int loc) const | ||
428 | { | ||
429 | return operator[](loc); | ||
430 | } | ||
431 | |||
432 | void String::setCharAt(unsigned int loc, char c) | ||
433 | { | ||
434 | if (loc < len) buffer[loc] = c; | ||
435 | } | ||
436 | |||
437 | char & String::operator[](unsigned int index) | ||
438 | { | ||
439 | static char dummy_writable_char; | ||
440 | if (index >= len || !buffer) { | ||
441 | dummy_writable_char = 0; | ||
442 | return dummy_writable_char; | ||
443 | } | ||
444 | return buffer[index]; | ||
445 | } | ||
446 | |||
447 | char String::operator[]( unsigned int index ) const | ||
448 | { | ||
449 | if (index >= len || !buffer) return 0; | ||
450 | return buffer[index]; | ||
451 | } | ||
452 | |||
453 | void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const | ||
454 | { | ||
455 | if (!bufsize || !buf) return; | ||
456 | if (index >= len) { | ||
457 | buf[0] = 0; | ||
458 | return; | ||
459 | } | ||
460 | unsigned int n = bufsize - 1; | ||
461 | if (n > len - index) n = len - index; | ||
462 | strncpy((char *)buf, buffer + index, n); | ||
463 | buf[n] = 0; | ||
464 | } | ||
465 | |||
466 | /*********************************************/ | ||
467 | /* Search */ | ||
468 | /*********************************************/ | ||
469 | |||
470 | int String::indexOf(char c) const | ||
471 | { | ||
472 | return indexOf(c, 0); | ||
473 | } | ||
474 | |||
475 | int String::indexOf( char ch, unsigned int fromIndex ) const | ||
476 | { | ||
477 | if (fromIndex >= len) return -1; | ||
478 | const char* temp = strchr(buffer + fromIndex, ch); | ||
479 | if (temp == NULL) return -1; | ||
480 | return temp - buffer; | ||
481 | } | ||
482 | |||
483 | int String::indexOf(const String &s2) const | ||
484 | { | ||
485 | return indexOf(s2, 0); | ||
486 | } | ||
487 | |||
488 | int String::indexOf(const String &s2, unsigned int fromIndex) const | ||
489 | { | ||
490 | if (fromIndex >= len) return -1; | ||
491 | const char *found = strstr(buffer + fromIndex, s2.buffer); | ||
492 | if (found == NULL) return -1; | ||
493 | return found - buffer; | ||
494 | } | ||
495 | |||
496 | int String::lastIndexOf( char theChar ) const | ||
497 | { | ||
498 | return lastIndexOf(theChar, len - 1); | ||
499 | } | ||
500 | |||
501 | int String::lastIndexOf(char ch, unsigned int fromIndex) const | ||
502 | { | ||
503 | if (fromIndex >= len) return -1; | ||
504 | char tempchar = buffer[fromIndex + 1]; | ||
505 | buffer[fromIndex + 1] = '\0'; | ||
506 | char* temp = strrchr( buffer, ch ); | ||
507 | buffer[fromIndex + 1] = tempchar; | ||
508 | if (temp == NULL) return -1; | ||
509 | return temp - buffer; | ||
510 | } | ||
511 | |||
512 | int String::lastIndexOf(const String &s2) const | ||
513 | { | ||
514 | return lastIndexOf(s2, len - s2.len); | ||
515 | } | ||
516 | |||
517 | int String::lastIndexOf(const String &s2, unsigned int fromIndex) const | ||
518 | { | ||
519 | if (s2.len == 0 || len == 0 || s2.len > len) return -1; | ||
520 | if (fromIndex >= len) fromIndex = len - 1; | ||
521 | int found = -1; | ||
522 | for (char *p = buffer; p <= buffer + fromIndex; p++) { | ||
523 | p = strstr(p, s2.buffer); | ||
524 | if (!p) break; | ||
525 | if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer; | ||
526 | } | ||
527 | return found; | ||
528 | } | ||
529 | |||
530 | String String::substring( unsigned int left ) const | ||
531 | { | ||
532 | return substring(left, len); | ||
533 | } | ||
534 | |||
535 | String String::substring(unsigned int left, unsigned int right) const | ||
536 | { | ||
537 | if (left > right) { | ||
538 | unsigned int temp = right; | ||
539 | right = left; | ||
540 | left = temp; | ||
541 | } | ||
542 | String out; | ||
543 | if (left > len) return out; | ||
544 | if (right > len) right = len; | ||
545 | char temp = buffer[right]; // save the replaced character | ||
546 | buffer[right] = '\0'; | ||
547 | out = buffer + left; // pointer arithmetic | ||
548 | buffer[right] = temp; //restore character | ||
549 | return out; | ||
550 | } | ||
551 | |||
552 | /*********************************************/ | ||
553 | /* Modification */ | ||
554 | /*********************************************/ | ||
555 | |||
556 | void String::replace(char find, char replace) | ||
557 | { | ||
558 | if (!buffer) return; | ||
559 | for (char *p = buffer; *p; p++) { | ||
560 | if (*p == find) *p = replace; | ||
561 | } | ||
562 | } | ||
563 | |||
564 | void String::replace(const String& find, const String& replace) | ||
565 | { | ||
566 | if (len == 0 || find.len == 0) return; | ||
567 | int diff = replace.len - find.len; | ||
568 | char *readFrom = buffer; | ||
569 | char *foundAt; | ||
570 | if (diff == 0) { | ||
571 | while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { | ||
572 | memcpy(foundAt, replace.buffer, replace.len); | ||
573 | readFrom = foundAt + replace.len; | ||
574 | } | ||
575 | } else if (diff < 0) { | ||
576 | char *writeTo = buffer; | ||
577 | while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { | ||
578 | unsigned int n = foundAt - readFrom; | ||
579 | memcpy(writeTo, readFrom, n); | ||
580 | writeTo += n; | ||
581 | memcpy(writeTo, replace.buffer, replace.len); | ||
582 | writeTo += replace.len; | ||
583 | readFrom = foundAt + find.len; | ||
584 | len += diff; | ||
585 | } | ||
586 | strcpy(writeTo, readFrom); | ||
587 | } else { | ||
588 | unsigned int size = len; // compute size needed for result | ||
589 | while ((foundAt = strstr(readFrom, find.buffer)) != NULL) { | ||
590 | readFrom = foundAt + find.len; | ||
591 | size += diff; | ||
592 | } | ||
593 | if (size == len) return; | ||
594 | if (size > capacity && !changeBuffer(size)) return; // XXX: tell user! | ||
595 | int index = len - 1; | ||
596 | while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) { | ||
597 | readFrom = buffer + index + find.len; | ||
598 | memmove(readFrom + diff, readFrom, len - (readFrom - buffer)); | ||
599 | len += diff; | ||
600 | buffer[len] = 0; | ||
601 | memcpy(buffer + index, replace.buffer, replace.len); | ||
602 | index--; | ||
603 | } | ||
604 | } | ||
605 | } | ||
606 | |||
607 | void String::toLowerCase(void) | ||
608 | { | ||
609 | if (!buffer) return; | ||
610 | for (char *p = buffer; *p; p++) { | ||
611 | *p = tolower(*p); | ||
612 | } | ||
613 | } | ||
614 | |||
615 | void String::toUpperCase(void) | ||
616 | { | ||
617 | if (!buffer) return; | ||
618 | for (char *p = buffer; *p; p++) { | ||
619 | *p = toupper(*p); | ||
620 | } | ||
621 | } | ||
622 | |||
623 | void String::trim(void) | ||
624 | { | ||
625 | if (!buffer || len == 0) return; | ||
626 | char *begin = buffer; | ||
627 | while (isspace(*begin)) begin++; | ||
628 | char *end = buffer + len - 1; | ||
629 | while (isspace(*end) && end >= begin) end--; | ||
630 | len = end + 1 - begin; | ||
631 | if (begin > buffer) memcpy(buffer, begin, len); | ||
632 | buffer[len] = 0; | ||
633 | } | ||
634 | |||
635 | /*********************************************/ | ||
636 | /* Parsing / Conversion */ | ||
637 | /*********************************************/ | ||
638 | |||
639 | long String::toInt(void) const | ||
640 | { | ||
641 | if (buffer) return atol(buffer); | ||
642 | return 0; | ||
643 | } | ||
644 | |||
645 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.h new file mode 100644 index 000000000..d76d2a33d --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/WString.h | |||
@@ -0,0 +1,205 @@ | |||
1 | /* | ||
2 | WString.h - String library for Wiring & Arduino | ||
3 | ...mostly rewritten by Paul Stoffregen... | ||
4 | Copyright (c) 2009-10 Hernando Barragan. All right reserved. | ||
5 | Copyright 2011, Paul Stoffregen, paul@pjrc.com | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General Public | ||
18 | License along with this library; if not, write to the Free Software | ||
19 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | #ifndef String_class_h | ||
23 | #define String_class_h | ||
24 | #ifdef __cplusplus | ||
25 | |||
26 | #include <stdlib.h> | ||
27 | #include <string.h> | ||
28 | #include <ctype.h> | ||
29 | #include <avr/pgmspace.h> | ||
30 | |||
31 | // When compiling programs with this class, the following gcc parameters | ||
32 | // dramatically increase performance and memory (RAM) efficiency, typically | ||
33 | // with little or no increase in code size. | ||
34 | // -felide-constructors | ||
35 | // -std=c++0x | ||
36 | |||
37 | class __FlashStringHelper; | ||
38 | #define F(string_literal) (reinterpret_cast<__FlashStringHelper *>(PSTR(string_literal))) | ||
39 | |||
40 | // An inherited class for holding the result of a concatenation. These | ||
41 | // result objects are assumed to be writable by subsequent concatenations. | ||
42 | class StringSumHelper; | ||
43 | |||
44 | // The string class | ||
45 | class String | ||
46 | { | ||
47 | // use a function pointer to allow for "if (s)" without the | ||
48 | // complications of an operator bool(). for more information, see: | ||
49 | // http://www.artima.com/cppsource/safebool.html | ||
50 | typedef void (String::*StringIfHelperType)() const; | ||
51 | void StringIfHelper() const {} | ||
52 | |||
53 | public: | ||
54 | // constructors | ||
55 | // creates a copy of the initial value. | ||
56 | // if the initial value is null or invalid, or if memory allocation | ||
57 | // fails, the string will be marked as invalid (i.e. "if (s)" will | ||
58 | // be false). | ||
59 | String(const char *cstr = ""); | ||
60 | String(const String &str); | ||
61 | #ifdef __GXX_EXPERIMENTAL_CXX0X__ | ||
62 | String(String &&rval); | ||
63 | String(StringSumHelper &&rval); | ||
64 | #endif | ||
65 | explicit String(char c); | ||
66 | explicit String(unsigned char, unsigned char base=10); | ||
67 | explicit String(int, unsigned char base=10); | ||
68 | explicit String(unsigned int, unsigned char base=10); | ||
69 | explicit String(long, unsigned char base=10); | ||
70 | explicit String(unsigned long, unsigned char base=10); | ||
71 | ~String(void); | ||
72 | |||
73 | // memory management | ||
74 | // return true on success, false on failure (in which case, the string | ||
75 | // is left unchanged). reserve(0), if successful, will validate an | ||
76 | // invalid string (i.e., "if (s)" will be true afterwards) | ||
77 | unsigned char reserve(unsigned int size); | ||
78 | inline unsigned int length(void) const {return len;} | ||
79 | |||
80 | // creates a copy of the assigned value. if the value is null or | ||
81 | // invalid, or if the memory allocation fails, the string will be | ||
82 | // marked as invalid ("if (s)" will be false). | ||
83 | String & operator = (const String &rhs); | ||
84 | String & operator = (const char *cstr); | ||
85 | #ifdef __GXX_EXPERIMENTAL_CXX0X__ | ||
86 | String & operator = (String &&rval); | ||
87 | String & operator = (StringSumHelper &&rval); | ||
88 | #endif | ||
89 | |||
90 | // concatenate (works w/ built-in types) | ||
91 | |||
92 | // returns true on success, false on failure (in which case, the string | ||
93 | // is left unchanged). if the argument is null or invalid, the | ||
94 | // concatenation is considered unsucessful. | ||
95 | unsigned char concat(const String &str); | ||
96 | unsigned char concat(const char *cstr); | ||
97 | unsigned char concat(char c); | ||
98 | unsigned char concat(unsigned char c); | ||
99 | unsigned char concat(int num); | ||
100 | unsigned char concat(unsigned int num); | ||
101 | unsigned char concat(long num); | ||
102 | unsigned char concat(unsigned long num); | ||
103 | |||
104 | // if there's not enough memory for the concatenated value, the string | ||
105 | // will be left unchanged (but this isn't signalled in any way) | ||
106 | String & operator += (const String &rhs) {concat(rhs); return (*this);} | ||
107 | String & operator += (const char *cstr) {concat(cstr); return (*this);} | ||
108 | String & operator += (char c) {concat(c); return (*this);} | ||
109 | String & operator += (unsigned char num) {concat(num); return (*this);} | ||
110 | String & operator += (int num) {concat(num); return (*this);} | ||
111 | String & operator += (unsigned int num) {concat(num); return (*this);} | ||
112 | String & operator += (long num) {concat(num); return (*this);} | ||
113 | String & operator += (unsigned long num) {concat(num); return (*this);} | ||
114 | |||
115 | friend StringSumHelper & operator + (const StringSumHelper &lhs, const String &rhs); | ||
116 | friend StringSumHelper & operator + (const StringSumHelper &lhs, const char *cstr); | ||
117 | friend StringSumHelper & operator + (const StringSumHelper &lhs, char c); | ||
118 | friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned char num); | ||
119 | friend StringSumHelper & operator + (const StringSumHelper &lhs, int num); | ||
120 | friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned int num); | ||
121 | friend StringSumHelper & operator + (const StringSumHelper &lhs, long num); | ||
122 | friend StringSumHelper & operator + (const StringSumHelper &lhs, unsigned long num); | ||
123 | |||
124 | // comparison (only works w/ Strings and "strings") | ||
125 | operator StringIfHelperType() const { return buffer ? &String::StringIfHelper : 0; } | ||
126 | int compareTo(const String &s) const; | ||
127 | unsigned char equals(const String &s) const; | ||
128 | unsigned char equals(const char *cstr) const; | ||
129 | unsigned char operator == (const String &rhs) const {return equals(rhs);} | ||
130 | unsigned char operator == (const char *cstr) const {return equals(cstr);} | ||
131 | unsigned char operator != (const String &rhs) const {return !equals(rhs);} | ||
132 | unsigned char operator != (const char *cstr) const {return !equals(cstr);} | ||
133 | unsigned char operator < (const String &rhs) const; | ||
134 | unsigned char operator > (const String &rhs) const; | ||
135 | unsigned char operator <= (const String &rhs) const; | ||
136 | unsigned char operator >= (const String &rhs) const; | ||
137 | unsigned char equalsIgnoreCase(const String &s) const; | ||
138 | unsigned char startsWith( const String &prefix) const; | ||
139 | unsigned char startsWith(const String &prefix, unsigned int offset) const; | ||
140 | unsigned char endsWith(const String &suffix) const; | ||
141 | |||
142 | // character acccess | ||
143 | char charAt(unsigned int index) const; | ||
144 | void setCharAt(unsigned int index, char c); | ||
145 | char operator [] (unsigned int index) const; | ||
146 | char& operator [] (unsigned int index); | ||
147 | void getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index=0) const; | ||
148 | void toCharArray(char *buf, unsigned int bufsize, unsigned int index=0) const | ||
149 | {getBytes((unsigned char *)buf, bufsize, index);} | ||
150 | |||
151 | // search | ||
152 | int indexOf( char ch ) const; | ||
153 | int indexOf( char ch, unsigned int fromIndex ) const; | ||
154 | int indexOf( const String &str ) const; | ||
155 | int indexOf( const String &str, unsigned int fromIndex ) const; | ||
156 | int lastIndexOf( char ch ) const; | ||
157 | int lastIndexOf( char ch, unsigned int fromIndex ) const; | ||
158 | int lastIndexOf( const String &str ) const; | ||
159 | int lastIndexOf( const String &str, unsigned int fromIndex ) const; | ||
160 | String substring( unsigned int beginIndex ) const; | ||
161 | String substring( unsigned int beginIndex, unsigned int endIndex ) const; | ||
162 | |||
163 | // modification | ||
164 | void replace(char find, char replace); | ||
165 | void replace(const String& find, const String& replace); | ||
166 | void toLowerCase(void); | ||
167 | void toUpperCase(void); | ||
168 | void trim(void); | ||
169 | |||
170 | // parsing/conversion | ||
171 | long toInt(void) const; | ||
172 | |||
173 | protected: | ||
174 | char *buffer; // the actual char array | ||
175 | unsigned int capacity; // the array length minus one (for the '\0') | ||
176 | unsigned int len; // the String length (not counting the '\0') | ||
177 | unsigned char flags; // unused, for future features | ||
178 | protected: | ||
179 | void init(void); | ||
180 | void invalidate(void); | ||
181 | unsigned char changeBuffer(unsigned int maxStrLen); | ||
182 | unsigned char concat(const char *cstr, unsigned int length); | ||
183 | |||
184 | // copy and move | ||
185 | String & copy(const char *cstr, unsigned int length); | ||
186 | #ifdef __GXX_EXPERIMENTAL_CXX0X__ | ||
187 | void move(String &rhs); | ||
188 | #endif | ||
189 | }; | ||
190 | |||
191 | class StringSumHelper : public String | ||
192 | { | ||
193 | public: | ||
194 | StringSumHelper(const String &s) : String(s) {} | ||
195 | StringSumHelper(const char *p) : String(p) {} | ||
196 | StringSumHelper(char c) : String(c) {} | ||
197 | StringSumHelper(unsigned char num) : String(num) {} | ||
198 | StringSumHelper(int num) : String(num) {} | ||
199 | StringSumHelper(unsigned int num) : String(num) {} | ||
200 | StringSumHelper(long num) : String(num) {} | ||
201 | StringSumHelper(unsigned long num) : String(num) {} | ||
202 | }; | ||
203 | |||
204 | #endif // __cplusplus | ||
205 | #endif // String_class_h | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/binary.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/binary.h new file mode 100644 index 000000000..af1498033 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/binary.h | |||
@@ -0,0 +1,515 @@ | |||
1 | #ifndef Binary_h | ||
2 | #define Binary_h | ||
3 | |||
4 | #define B0 0 | ||
5 | #define B00 0 | ||
6 | #define B000 0 | ||
7 | #define B0000 0 | ||
8 | #define B00000 0 | ||
9 | #define B000000 0 | ||
10 | #define B0000000 0 | ||
11 | #define B00000000 0 | ||
12 | #define B1 1 | ||
13 | #define B01 1 | ||
14 | #define B001 1 | ||
15 | #define B0001 1 | ||
16 | #define B00001 1 | ||
17 | #define B000001 1 | ||
18 | #define B0000001 1 | ||
19 | #define B00000001 1 | ||
20 | #define B10 2 | ||
21 | #define B010 2 | ||
22 | #define B0010 2 | ||
23 | #define B00010 2 | ||
24 | #define B000010 2 | ||
25 | #define B0000010 2 | ||
26 | #define B00000010 2 | ||
27 | #define B11 3 | ||
28 | #define B011 3 | ||
29 | #define B0011 3 | ||
30 | #define B00011 3 | ||
31 | #define B000011 3 | ||
32 | #define B0000011 3 | ||
33 | #define B00000011 3 | ||
34 | #define B100 4 | ||
35 | #define B0100 4 | ||
36 | #define B00100 4 | ||
37 | #define B000100 4 | ||
38 | #define B0000100 4 | ||
39 | #define B00000100 4 | ||
40 | #define B101 5 | ||
41 | #define B0101 5 | ||
42 | #define B00101 5 | ||
43 | #define B000101 5 | ||
44 | #define B0000101 5 | ||
45 | #define B00000101 5 | ||
46 | #define B110 6 | ||
47 | #define B0110 6 | ||
48 | #define B00110 6 | ||
49 | #define B000110 6 | ||
50 | #define B0000110 6 | ||
51 | #define B00000110 6 | ||
52 | #define B111 7 | ||
53 | #define B0111 7 | ||
54 | #define B00111 7 | ||
55 | #define B000111 7 | ||
56 | #define B0000111 7 | ||
57 | #define B00000111 7 | ||
58 | #define B1000 8 | ||
59 | #define B01000 8 | ||
60 | #define B001000 8 | ||
61 | #define B0001000 8 | ||
62 | #define B00001000 8 | ||
63 | #define B1001 9 | ||
64 | #define B01001 9 | ||
65 | #define B001001 9 | ||
66 | #define B0001001 9 | ||
67 | #define B00001001 9 | ||
68 | #define B1010 10 | ||
69 | #define B01010 10 | ||
70 | #define B001010 10 | ||
71 | #define B0001010 10 | ||
72 | #define B00001010 10 | ||
73 | #define B1011 11 | ||
74 | #define B01011 11 | ||
75 | #define B001011 11 | ||
76 | #define B0001011 11 | ||
77 | #define B00001011 11 | ||
78 | #define B1100 12 | ||
79 | #define B01100 12 | ||
80 | #define B001100 12 | ||
81 | #define B0001100 12 | ||
82 | #define B00001100 12 | ||
83 | #define B1101 13 | ||
84 | #define B01101 13 | ||
85 | #define B001101 13 | ||
86 | #define B0001101 13 | ||
87 | #define B00001101 13 | ||
88 | #define B1110 14 | ||
89 | #define B01110 14 | ||
90 | #define B001110 14 | ||
91 | #define B0001110 14 | ||
92 | #define B00001110 14 | ||
93 | #define B1111 15 | ||
94 | #define B01111 15 | ||
95 | #define B001111 15 | ||
96 | #define B0001111 15 | ||
97 | #define B00001111 15 | ||
98 | #define B10000 16 | ||
99 | #define B010000 16 | ||
100 | #define B0010000 16 | ||
101 | #define B00010000 16 | ||
102 | #define B10001 17 | ||
103 | #define B010001 17 | ||
104 | #define B0010001 17 | ||
105 | #define B00010001 17 | ||
106 | #define B10010 18 | ||
107 | #define B010010 18 | ||
108 | #define B0010010 18 | ||
109 | #define B00010010 18 | ||
110 | #define B10011 19 | ||
111 | #define B010011 19 | ||
112 | #define B0010011 19 | ||
113 | #define B00010011 19 | ||
114 | #define B10100 20 | ||
115 | #define B010100 20 | ||
116 | #define B0010100 20 | ||
117 | #define B00010100 20 | ||
118 | #define B10101 21 | ||
119 | #define B010101 21 | ||
120 | #define B0010101 21 | ||
121 | #define B00010101 21 | ||
122 | #define B10110 22 | ||
123 | #define B010110 22 | ||
124 | #define B0010110 22 | ||
125 | #define B00010110 22 | ||
126 | #define B10111 23 | ||
127 | #define B010111 23 | ||
128 | #define B0010111 23 | ||
129 | #define B00010111 23 | ||
130 | #define B11000 24 | ||
131 | #define B011000 24 | ||
132 | #define B0011000 24 | ||
133 | #define B00011000 24 | ||
134 | #define B11001 25 | ||
135 | #define B011001 25 | ||
136 | #define B0011001 25 | ||
137 | #define B00011001 25 | ||
138 | #define B11010 26 | ||
139 | #define B011010 26 | ||
140 | #define B0011010 26 | ||
141 | #define B00011010 26 | ||
142 | #define B11011 27 | ||
143 | #define B011011 27 | ||
144 | #define B0011011 27 | ||
145 | #define B00011011 27 | ||
146 | #define B11100 28 | ||
147 | #define B011100 28 | ||
148 | #define B0011100 28 | ||
149 | #define B00011100 28 | ||
150 | #define B11101 29 | ||
151 | #define B011101 29 | ||
152 | #define B0011101 29 | ||
153 | #define B00011101 29 | ||
154 | #define B11110 30 | ||
155 | #define B011110 30 | ||
156 | #define B0011110 30 | ||
157 | #define B00011110 30 | ||
158 | #define B11111 31 | ||
159 | #define B011111 31 | ||
160 | #define B0011111 31 | ||
161 | #define B00011111 31 | ||
162 | #define B100000 32 | ||
163 | #define B0100000 32 | ||
164 | #define B00100000 32 | ||
165 | #define B100001 33 | ||
166 | #define B0100001 33 | ||
167 | #define B00100001 33 | ||
168 | #define B100010 34 | ||
169 | #define B0100010 34 | ||
170 | #define B00100010 34 | ||
171 | #define B100011 35 | ||
172 | #define B0100011 35 | ||
173 | #define B00100011 35 | ||
174 | #define B100100 36 | ||
175 | #define B0100100 36 | ||
176 | #define B00100100 36 | ||
177 | #define B100101 37 | ||
178 | #define B0100101 37 | ||
179 | #define B00100101 37 | ||
180 | #define B100110 38 | ||
181 | #define B0100110 38 | ||
182 | #define B00100110 38 | ||
183 | #define B100111 39 | ||
184 | #define B0100111 39 | ||
185 | #define B00100111 39 | ||
186 | #define B101000 40 | ||
187 | #define B0101000 40 | ||
188 | #define B00101000 40 | ||
189 | #define B101001 41 | ||
190 | #define B0101001 41 | ||
191 | #define B00101001 41 | ||
192 | #define B101010 42 | ||
193 | #define B0101010 42 | ||
194 | #define B00101010 42 | ||
195 | #define B101011 43 | ||
196 | #define B0101011 43 | ||
197 | #define B00101011 43 | ||
198 | #define B101100 44 | ||
199 | #define B0101100 44 | ||
200 | #define B00101100 44 | ||
201 | #define B101101 45 | ||
202 | #define B0101101 45 | ||
203 | #define B00101101 45 | ||
204 | #define B101110 46 | ||
205 | #define B0101110 46 | ||
206 | #define B00101110 46 | ||
207 | #define B101111 47 | ||
208 | #define B0101111 47 | ||
209 | #define B00101111 47 | ||
210 | #define B110000 48 | ||
211 | #define B0110000 48 | ||
212 | #define B00110000 48 | ||
213 | #define B110001 49 | ||
214 | #define B0110001 49 | ||
215 | #define B00110001 49 | ||
216 | #define B110010 50 | ||
217 | #define B0110010 50 | ||
218 | #define B00110010 50 | ||
219 | #define B110011 51 | ||
220 | #define B0110011 51 | ||
221 | #define B00110011 51 | ||
222 | #define B110100 52 | ||
223 | #define B0110100 52 | ||
224 | #define B00110100 52 | ||
225 | #define B110101 53 | ||
226 | #define B0110101 53 | ||
227 | #define B00110101 53 | ||
228 | #define B110110 54 | ||
229 | #define B0110110 54 | ||
230 | #define B00110110 54 | ||
231 | #define B110111 55 | ||
232 | #define B0110111 55 | ||
233 | #define B00110111 55 | ||
234 | #define B111000 56 | ||
235 | #define B0111000 56 | ||
236 | #define B00111000 56 | ||
237 | #define B111001 57 | ||
238 | #define B0111001 57 | ||
239 | #define B00111001 57 | ||
240 | #define B111010 58 | ||
241 | #define B0111010 58 | ||
242 | #define B00111010 58 | ||
243 | #define B111011 59 | ||
244 | #define B0111011 59 | ||
245 | #define B00111011 59 | ||
246 | #define B111100 60 | ||
247 | #define B0111100 60 | ||
248 | #define B00111100 60 | ||
249 | #define B111101 61 | ||
250 | #define B0111101 61 | ||
251 | #define B00111101 61 | ||
252 | #define B111110 62 | ||
253 | #define B0111110 62 | ||
254 | #define B00111110 62 | ||
255 | #define B111111 63 | ||
256 | #define B0111111 63 | ||
257 | #define B00111111 63 | ||
258 | #define B1000000 64 | ||
259 | #define B01000000 64 | ||
260 | #define B1000001 65 | ||
261 | #define B01000001 65 | ||
262 | #define B1000010 66 | ||
263 | #define B01000010 66 | ||
264 | #define B1000011 67 | ||
265 | #define B01000011 67 | ||
266 | #define B1000100 68 | ||
267 | #define B01000100 68 | ||
268 | #define B1000101 69 | ||
269 | #define B01000101 69 | ||
270 | #define B1000110 70 | ||
271 | #define B01000110 70 | ||
272 | #define B1000111 71 | ||
273 | #define B01000111 71 | ||
274 | #define B1001000 72 | ||
275 | #define B01001000 72 | ||
276 | #define B1001001 73 | ||
277 | #define B01001001 73 | ||
278 | #define B1001010 74 | ||
279 | #define B01001010 74 | ||
280 | #define B1001011 75 | ||
281 | #define B01001011 75 | ||
282 | #define B1001100 76 | ||
283 | #define B01001100 76 | ||
284 | #define B1001101 77 | ||
285 | #define B01001101 77 | ||
286 | #define B1001110 78 | ||
287 | #define B01001110 78 | ||
288 | #define B1001111 79 | ||
289 | #define B01001111 79 | ||
290 | #define B1010000 80 | ||
291 | #define B01010000 80 | ||
292 | #define B1010001 81 | ||
293 | #define B01010001 81 | ||
294 | #define B1010010 82 | ||
295 | #define B01010010 82 | ||
296 | #define B1010011 83 | ||
297 | #define B01010011 83 | ||
298 | #define B1010100 84 | ||
299 | #define B01010100 84 | ||
300 | #define B1010101 85 | ||
301 | #define B01010101 85 | ||
302 | #define B1010110 86 | ||
303 | #define B01010110 86 | ||
304 | #define B1010111 87 | ||
305 | #define B01010111 87 | ||
306 | #define B1011000 88 | ||
307 | #define B01011000 88 | ||
308 | #define B1011001 89 | ||
309 | #define B01011001 89 | ||
310 | #define B1011010 90 | ||
311 | #define B01011010 90 | ||
312 | #define B1011011 91 | ||
313 | #define B01011011 91 | ||
314 | #define B1011100 92 | ||
315 | #define B01011100 92 | ||
316 | #define B1011101 93 | ||
317 | #define B01011101 93 | ||
318 | #define B1011110 94 | ||
319 | #define B01011110 94 | ||
320 | #define B1011111 95 | ||
321 | #define B01011111 95 | ||
322 | #define B1100000 96 | ||
323 | #define B01100000 96 | ||
324 | #define B1100001 97 | ||
325 | #define B01100001 97 | ||
326 | #define B1100010 98 | ||
327 | #define B01100010 98 | ||
328 | #define B1100011 99 | ||
329 | #define B01100011 99 | ||
330 | #define B1100100 100 | ||
331 | #define B01100100 100 | ||
332 | #define B1100101 101 | ||
333 | #define B01100101 101 | ||
334 | #define B1100110 102 | ||
335 | #define B01100110 102 | ||
336 | #define B1100111 103 | ||
337 | #define B01100111 103 | ||
338 | #define B1101000 104 | ||
339 | #define B01101000 104 | ||
340 | #define B1101001 105 | ||
341 | #define B01101001 105 | ||
342 | #define B1101010 106 | ||
343 | #define B01101010 106 | ||
344 | #define B1101011 107 | ||
345 | #define B01101011 107 | ||
346 | #define B1101100 108 | ||
347 | #define B01101100 108 | ||
348 | #define B1101101 109 | ||
349 | #define B01101101 109 | ||
350 | #define B1101110 110 | ||
351 | #define B01101110 110 | ||
352 | #define B1101111 111 | ||
353 | #define B01101111 111 | ||
354 | #define B1110000 112 | ||
355 | #define B01110000 112 | ||
356 | #define B1110001 113 | ||
357 | #define B01110001 113 | ||
358 | #define B1110010 114 | ||
359 | #define B01110010 114 | ||
360 | #define B1110011 115 | ||
361 | #define B01110011 115 | ||
362 | #define B1110100 116 | ||
363 | #define B01110100 116 | ||
364 | #define B1110101 117 | ||
365 | #define B01110101 117 | ||
366 | #define B1110110 118 | ||
367 | #define B01110110 118 | ||
368 | #define B1110111 119 | ||
369 | #define B01110111 119 | ||
370 | #define B1111000 120 | ||
371 | #define B01111000 120 | ||
372 | #define B1111001 121 | ||
373 | #define B01111001 121 | ||
374 | #define B1111010 122 | ||
375 | #define B01111010 122 | ||
376 | #define B1111011 123 | ||
377 | #define B01111011 123 | ||
378 | #define B1111100 124 | ||
379 | #define B01111100 124 | ||
380 | #define B1111101 125 | ||
381 | #define B01111101 125 | ||
382 | #define B1111110 126 | ||
383 | #define B01111110 126 | ||
384 | #define B1111111 127 | ||
385 | #define B01111111 127 | ||
386 | #define B10000000 128 | ||
387 | #define B10000001 129 | ||
388 | #define B10000010 130 | ||
389 | #define B10000011 131 | ||
390 | #define B10000100 132 | ||
391 | #define B10000101 133 | ||
392 | #define B10000110 134 | ||
393 | #define B10000111 135 | ||
394 | #define B10001000 136 | ||
395 | #define B10001001 137 | ||
396 | #define B10001010 138 | ||
397 | #define B10001011 139 | ||
398 | #define B10001100 140 | ||
399 | #define B10001101 141 | ||
400 | #define B10001110 142 | ||
401 | #define B10001111 143 | ||
402 | #define B10010000 144 | ||
403 | #define B10010001 145 | ||
404 | #define B10010010 146 | ||
405 | #define B10010011 147 | ||
406 | #define B10010100 148 | ||
407 | #define B10010101 149 | ||
408 | #define B10010110 150 | ||
409 | #define B10010111 151 | ||
410 | #define B10011000 152 | ||
411 | #define B10011001 153 | ||
412 | #define B10011010 154 | ||
413 | #define B10011011 155 | ||
414 | #define B10011100 156 | ||
415 | #define B10011101 157 | ||
416 | #define B10011110 158 | ||
417 | #define B10011111 159 | ||
418 | #define B10100000 160 | ||
419 | #define B10100001 161 | ||
420 | #define B10100010 162 | ||
421 | #define B10100011 163 | ||
422 | #define B10100100 164 | ||
423 | #define B10100101 165 | ||
424 | #define B10100110 166 | ||
425 | #define B10100111 167 | ||
426 | #define B10101000 168 | ||
427 | #define B10101001 169 | ||
428 | #define B10101010 170 | ||
429 | #define B10101011 171 | ||
430 | #define B10101100 172 | ||
431 | #define B10101101 173 | ||
432 | #define B10101110 174 | ||
433 | #define B10101111 175 | ||
434 | #define B10110000 176 | ||
435 | #define B10110001 177 | ||
436 | #define B10110010 178 | ||
437 | #define B10110011 179 | ||
438 | #define B10110100 180 | ||
439 | #define B10110101 181 | ||
440 | #define B10110110 182 | ||
441 | #define B10110111 183 | ||
442 | #define B10111000 184 | ||
443 | #define B10111001 185 | ||
444 | #define B10111010 186 | ||
445 | #define B10111011 187 | ||
446 | #define B10111100 188 | ||
447 | #define B10111101 189 | ||
448 | #define B10111110 190 | ||
449 | #define B10111111 191 | ||
450 | #define B11000000 192 | ||
451 | #define B11000001 193 | ||
452 | #define B11000010 194 | ||
453 | #define B11000011 195 | ||
454 | #define B11000100 196 | ||
455 | #define B11000101 197 | ||
456 | #define B11000110 198 | ||
457 | #define B11000111 199 | ||
458 | #define B11001000 200 | ||
459 | #define B11001001 201 | ||
460 | #define B11001010 202 | ||
461 | #define B11001011 203 | ||
462 | #define B11001100 204 | ||
463 | #define B11001101 205 | ||
464 | #define B11001110 206 | ||
465 | #define B11001111 207 | ||
466 | #define B11010000 208 | ||
467 | #define B11010001 209 | ||
468 | #define B11010010 210 | ||
469 | #define B11010011 211 | ||
470 | #define B11010100 212 | ||
471 | #define B11010101 213 | ||
472 | #define B11010110 214 | ||
473 | #define B11010111 215 | ||
474 | #define B11011000 216 | ||
475 | #define B11011001 217 | ||
476 | #define B11011010 218 | ||
477 | #define B11011011 219 | ||
478 | #define B11011100 220 | ||
479 | #define B11011101 221 | ||
480 | #define B11011110 222 | ||
481 | #define B11011111 223 | ||
482 | #define B11100000 224 | ||
483 | #define B11100001 225 | ||
484 | #define B11100010 226 | ||
485 | #define B11100011 227 | ||
486 | #define B11100100 228 | ||
487 | #define B11100101 229 | ||
488 | #define B11100110 230 | ||
489 | #define B11100111 231 | ||
490 | #define B11101000 232 | ||
491 | #define B11101001 233 | ||
492 | #define B11101010 234 | ||
493 | #define B11101011 235 | ||
494 | #define B11101100 236 | ||
495 | #define B11101101 237 | ||
496 | #define B11101110 238 | ||
497 | #define B11101111 239 | ||
498 | #define B11110000 240 | ||
499 | #define B11110001 241 | ||
500 | #define B11110010 242 | ||
501 | #define B11110011 243 | ||
502 | #define B11110100 244 | ||
503 | #define B11110101 245 | ||
504 | #define B11110110 246 | ||
505 | #define B11110111 247 | ||
506 | #define B11111000 248 | ||
507 | #define B11111001 249 | ||
508 | #define B11111010 250 | ||
509 | #define B11111011 251 | ||
510 | #define B11111100 252 | ||
511 | #define B11111101 253 | ||
512 | #define B11111110 254 | ||
513 | #define B11111111 255 | ||
514 | |||
515 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/main.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/main.cpp new file mode 100644 index 000000000..3d4e079d2 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/main.cpp | |||
@@ -0,0 +1,20 @@ | |||
1 | #include <Arduino.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | init(); | ||
6 | |||
7 | #if defined(USBCON) | ||
8 | USBDevice.attach(); | ||
9 | #endif | ||
10 | |||
11 | setup(); | ||
12 | |||
13 | for (;;) { | ||
14 | loop(); | ||
15 | if (serialEventRun) serialEventRun(); | ||
16 | } | ||
17 | |||
18 | return 0; | ||
19 | } | ||
20 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.cpp b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.cpp new file mode 100644 index 000000000..0f6d4220e --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.cpp | |||
@@ -0,0 +1,18 @@ | |||
1 | #include <new.h> | ||
2 | |||
3 | void * operator new(size_t size) | ||
4 | { | ||
5 | return malloc(size); | ||
6 | } | ||
7 | |||
8 | void operator delete(void * ptr) | ||
9 | { | ||
10 | free(ptr); | ||
11 | } | ||
12 | |||
13 | int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);}; | ||
14 | void __cxa_guard_release (__guard *g) {*(char *)g = 1;}; | ||
15 | void __cxa_guard_abort (__guard *) {}; | ||
16 | |||
17 | void __cxa_pure_virtual(void) {}; | ||
18 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.h new file mode 100644 index 000000000..cd940ce8b --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/new.h | |||
@@ -0,0 +1,22 @@ | |||
1 | /* Header to define new/delete operators as they aren't provided by avr-gcc by default | ||
2 | Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453 | ||
3 | */ | ||
4 | |||
5 | #ifndef NEW_H | ||
6 | #define NEW_H | ||
7 | |||
8 | #include <stdlib.h> | ||
9 | |||
10 | void * operator new(size_t size); | ||
11 | void operator delete(void * ptr); | ||
12 | |||
13 | __extension__ typedef int __guard __attribute__((mode (__DI__))); | ||
14 | |||
15 | extern "C" int __cxa_guard_acquire(__guard *); | ||
16 | extern "C" void __cxa_guard_release (__guard *); | ||
17 | extern "C" void __cxa_guard_abort (__guard *); | ||
18 | |||
19 | extern "C" void __cxa_pure_virtual(void); | ||
20 | |||
21 | #endif | ||
22 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c new file mode 100644 index 000000000..b1a4ce4b0 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring.c | |||
@@ -0,0 +1,326 @@ | |||
1 | /* | ||
2 | wiring.c - Partial implementation of the Wiring API for the ATmega8. | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2005-2006 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id$ | ||
23 | */ | ||
24 | |||
25 | #include "wiring_private.h" | ||
26 | |||
27 | // the prescaler is set so that timer0 ticks every 64 clock cycles, and the | ||
28 | // the overflow handler is called every 256 ticks. | ||
29 | #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) | ||
30 | |||
31 | // the whole number of milliseconds per timer0 overflow | ||
32 | #define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) | ||
33 | |||
34 | // the fractional number of milliseconds per timer0 overflow. we shift right | ||
35 | // by three to fit these numbers into a byte. (for the clock speeds we care | ||
36 | // about - 8 and 16 MHz - this doesn't lose precision.) | ||
37 | #define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) | ||
38 | #define FRACT_MAX (1000 >> 3) | ||
39 | |||
40 | volatile unsigned long timer0_overflow_count = 0; | ||
41 | volatile unsigned long timer0_millis = 0; | ||
42 | static unsigned char timer0_fract = 0; | ||
43 | |||
44 | #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) | ||
45 | SIGNAL(TIM0_OVF_vect) | ||
46 | #else | ||
47 | SIGNAL(TIMER0_OVF_vect) | ||
48 | #endif | ||
49 | { | ||
50 | // copy these to local variables so they can be stored in registers | ||
51 | // (volatile variables must be read from memory on every access) | ||
52 | unsigned long m = timer0_millis; | ||
53 | unsigned char f = timer0_fract; | ||
54 | |||
55 | m += MILLIS_INC; | ||
56 | f += FRACT_INC; | ||
57 | if (f >= FRACT_MAX) { | ||
58 | f -= FRACT_MAX; | ||
59 | m += 1; | ||
60 | } | ||
61 | |||
62 | timer0_fract = f; | ||
63 | timer0_millis = m; | ||
64 | timer0_overflow_count++; | ||
65 | } | ||
66 | |||
67 | unsigned long millis() | ||
68 | { | ||
69 | unsigned long m; | ||
70 | uint8_t oldSREG = SREG; | ||
71 | |||
72 | // disable interrupts while we read timer0_millis or we might get an | ||
73 | // inconsistent value (e.g. in the middle of a write to timer0_millis) | ||
74 | cli(); | ||
75 | m = timer0_millis; | ||
76 | SREG = oldSREG; | ||
77 | |||
78 | return m; | ||
79 | } | ||
80 | |||
81 | unsigned long micros() { | ||
82 | unsigned long m; | ||
83 | uint8_t oldSREG = SREG, t; | ||
84 | |||
85 | cli(); | ||
86 | m = timer0_overflow_count; | ||
87 | #if defined(TCNT0) | ||
88 | t = TCNT0; | ||
89 | #elif defined(TCNT0L) | ||
90 | t = TCNT0L; | ||
91 | #else | ||
92 | #error TIMER 0 not defined | ||
93 | #endif | ||
94 | |||
95 | |||
96 | #ifdef TIFR0 | ||
97 | if ((TIFR0 & _BV(TOV0)) && (t < 255)) | ||
98 | m++; | ||
99 | #else | ||
100 | if ((TIFR & _BV(TOV0)) && (t < 255)) | ||
101 | m++; | ||
102 | #endif | ||
103 | |||
104 | SREG = oldSREG; | ||
105 | |||
106 | return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); | ||
107 | } | ||
108 | |||
109 | void delay(unsigned long ms) | ||
110 | { | ||
111 | //PORTB &= ~(1<<0); | ||
112 | uint16_t start = (uint16_t)micros(); | ||
113 | |||
114 | while (ms > 0) { | ||
115 | if (((uint16_t)micros() - start) >= 1000) { | ||
116 | ms--; | ||
117 | start += 1000; | ||
118 | } | ||
119 | } | ||
120 | //PORTB |= (1<<0); | ||
121 | } | ||
122 | |||
123 | /* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock. */ | ||
124 | void delayMicroseconds(unsigned int us) | ||
125 | { | ||
126 | // calling avrlib's delay_us() function with low values (e.g. 1 or | ||
127 | // 2 microseconds) gives delays longer than desired. | ||
128 | //delay_us(us); | ||
129 | #if F_CPU >= 20000000L | ||
130 | // for the 20 MHz clock on rare Arduino boards | ||
131 | |||
132 | // for a one-microsecond delay, simply wait 2 cycle and return. The overhead | ||
133 | // of the function call yields a delay of exactly a one microsecond. | ||
134 | __asm__ __volatile__ ( | ||
135 | "nop" "\n\t" | ||
136 | "nop"); //just waiting 2 cycle | ||
137 | if (--us == 0) | ||
138 | return; | ||
139 | |||
140 | // the following loop takes a 1/5 of a microsecond (4 cycles) | ||
141 | // per iteration, so execute it five times for each microsecond of | ||
142 | // delay requested. | ||
143 | us = (us<<2) + us; // x5 us | ||
144 | |||
145 | // account for the time taken in the preceeding commands. | ||
146 | us -= 2; | ||
147 | |||
148 | #elif F_CPU >= 16000000L | ||
149 | // for the 16 MHz clock on most Arduino boards | ||
150 | |||
151 | // for a one-microsecond delay, simply return. the overhead | ||
152 | // of the function call yields a delay of approximately 1 1/8 us. | ||
153 | if (--us == 0) | ||
154 | return; | ||
155 | |||
156 | // the following loop takes a quarter of a microsecond (4 cycles) | ||
157 | // per iteration, so execute it four times for each microsecond of | ||
158 | // delay requested. | ||
159 | us <<= 2; | ||
160 | |||
161 | // account for the time taken in the preceeding commands. | ||
162 | us -= 2; | ||
163 | #else | ||
164 | // for the 8 MHz internal clock on the ATmega168 | ||
165 | |||
166 | // for a one- or two-microsecond delay, simply return. the overhead of | ||
167 | // the function calls takes more than two microseconds. can't just | ||
168 | // subtract two, since us is unsigned; we'd overflow. | ||
169 | if (--us == 0) | ||
170 | return; | ||
171 | if (--us == 0) | ||
172 | return; | ||
173 | |||
174 | // the following loop takes half of a microsecond (4 cycles) | ||
175 | // per iteration, so execute it twice for each microsecond of | ||
176 | // delay requested. | ||
177 | us <<= 1; | ||
178 | |||
179 | // partially compensate for the time taken by the preceeding commands. | ||
180 | // we can't subtract any more than this or we'd overflow w/ small delays. | ||
181 | us--; | ||
182 | #endif | ||
183 | |||
184 | // busy wait | ||
185 | __asm__ __volatile__ ( | ||
186 | "1: sbiw %0,1" "\n\t" // 2 cycles | ||
187 | "brne 1b" : "=w" (us) : "0" (us) // 2 cycles | ||
188 | ); | ||
189 | } | ||
190 | |||
191 | void init() | ||
192 | { | ||
193 | // this needs to be called before setup() or some functions won't | ||
194 | // work there | ||
195 | sei(); | ||
196 | |||
197 | // on the ATmega168, timer 0 is also used for fast hardware pwm | ||
198 | // (using phase-correct PWM would mean that timer 0 overflowed half as often | ||
199 | // resulting in different millis() behavior on the ATmega8 and ATmega168) | ||
200 | #if defined(TCCR0A) && defined(WGM01) | ||
201 | sbi(TCCR0A, WGM01); | ||
202 | sbi(TCCR0A, WGM00); | ||
203 | #endif | ||
204 | |||
205 | // set timer 0 prescale factor to 64 | ||
206 | #if defined(__AVR_ATmega128__) | ||
207 | // CPU specific: different values for the ATmega128 | ||
208 | sbi(TCCR0, CS02); | ||
209 | #elif defined(TCCR0) && defined(CS01) && defined(CS00) | ||
210 | // this combination is for the standard atmega8 | ||
211 | sbi(TCCR0, CS01); | ||
212 | sbi(TCCR0, CS00); | ||
213 | #elif defined(TCCR0B) && defined(CS01) && defined(CS00) | ||
214 | // this combination is for the standard 168/328/1280/2560 | ||
215 | sbi(TCCR0B, CS01); | ||
216 | sbi(TCCR0B, CS00); | ||
217 | #elif defined(TCCR0A) && defined(CS01) && defined(CS00) | ||
218 | // this combination is for the __AVR_ATmega645__ series | ||
219 | sbi(TCCR0A, CS01); | ||
220 | sbi(TCCR0A, CS00); | ||
221 | #else | ||
222 | #error Timer 0 prescale factor 64 not set correctly | ||
223 | #endif | ||
224 | |||
225 | // enable timer 0 overflow interrupt | ||
226 | #if defined(TIMSK) && defined(TOIE0) | ||
227 | sbi(TIMSK, TOIE0); | ||
228 | #elif defined(TIMSK0) && defined(TOIE0) | ||
229 | sbi(TIMSK0, TOIE0); | ||
230 | #else | ||
231 | #error Timer 0 overflow interrupt not set correctly | ||
232 | #endif | ||
233 | |||
234 | // timers 1 and 2 are used for phase-correct hardware pwm | ||
235 | // this is better for motors as it ensures an even waveform | ||
236 | // note, however, that fast pwm mode can achieve a frequency of up | ||
237 | // 8 MHz (with a 16 MHz clock) at 50% duty cycle | ||
238 | |||
239 | #if defined(TCCR1B) && defined(CS11) && defined(CS10) | ||
240 | TCCR1B = 0; | ||
241 | |||
242 | // set timer 1 prescale factor to 64 | ||
243 | sbi(TCCR1B, CS11); | ||
244 | #if F_CPU >= 8000000L | ||
245 | sbi(TCCR1B, CS10); | ||
246 | #endif | ||
247 | #elif defined(TCCR1) && defined(CS11) && defined(CS10) | ||
248 | sbi(TCCR1, CS11); | ||
249 | #if F_CPU >= 8000000L | ||
250 | sbi(TCCR1, CS10); | ||
251 | #endif | ||
252 | #endif | ||
253 | // put timer 1 in 8-bit phase correct pwm mode | ||
254 | #if defined(TCCR1A) && defined(WGM10) | ||
255 | sbi(TCCR1A, WGM10); | ||
256 | #elif defined(TCCR1) | ||
257 | #warning this needs to be finished | ||
258 | #endif | ||
259 | |||
260 | // set timer 2 prescale factor to 64 | ||
261 | #if defined(TCCR2) && defined(CS22) | ||
262 | sbi(TCCR2, CS22); | ||
263 | #elif defined(TCCR2B) && defined(CS22) | ||
264 | sbi(TCCR2B, CS22); | ||
265 | #else | ||
266 | #warning Timer 2 not finished (may not be present on this CPU) | ||
267 | #endif | ||
268 | |||
269 | // configure timer 2 for phase correct pwm (8-bit) | ||
270 | #if defined(TCCR2) && defined(WGM20) | ||
271 | sbi(TCCR2, WGM20); | ||
272 | #elif defined(TCCR2A) && defined(WGM20) | ||
273 | sbi(TCCR2A, WGM20); | ||
274 | #else | ||
275 | #warning Timer 2 not finished (may not be present on this CPU) | ||
276 | #endif | ||
277 | |||
278 | #if defined(TCCR3B) && defined(CS31) && defined(WGM30) | ||
279 | sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64 | ||
280 | sbi(TCCR3B, CS30); | ||
281 | sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode | ||
282 | #endif | ||
283 | |||
284 | #if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */ | ||
285 | sbi(TCCR4B, CS42); // set timer4 prescale factor to 64 | ||
286 | sbi(TCCR4B, CS41); | ||
287 | sbi(TCCR4B, CS40); | ||
288 | sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode | ||
289 | sbi(TCCR4A, PWM4A); // enable PWM mode for comparator OCR4A | ||
290 | sbi(TCCR4C, PWM4D); // enable PWM mode for comparator OCR4D | ||
291 | #else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */ | ||
292 | #if defined(TCCR4B) && defined(CS41) && defined(WGM40) | ||
293 | sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 | ||
294 | sbi(TCCR4B, CS40); | ||
295 | sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode | ||
296 | #endif | ||
297 | #endif /* end timer4 block for ATMEGA1280/2560 and similar */ | ||
298 | |||
299 | #if defined(TCCR5B) && defined(CS51) && defined(WGM50) | ||
300 | sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 | ||
301 | sbi(TCCR5B, CS50); | ||
302 | sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode | ||
303 | #endif | ||
304 | |||
305 | #if defined(ADCSRA) | ||
306 | // set a2d prescale factor to 128 | ||
307 | // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. | ||
308 | // XXX: this will not work properly for other clock speeds, and | ||
309 | // this code should use F_CPU to determine the prescale factor. | ||
310 | sbi(ADCSRA, ADPS2); | ||
311 | sbi(ADCSRA, ADPS1); | ||
312 | sbi(ADCSRA, ADPS0); | ||
313 | |||
314 | // enable a2d conversions | ||
315 | sbi(ADCSRA, ADEN); | ||
316 | #endif | ||
317 | |||
318 | // the bootloader connects pins 0 and 1 to the USART; disconnect them | ||
319 | // here so they can be used as normal digital i/o; they will be | ||
320 | // reconnected in Serial.begin() | ||
321 | #if defined(UCSRB) | ||
322 | UCSRB = 0; | ||
323 | #elif defined(UCSR0B) | ||
324 | UCSR0B = 0; | ||
325 | #endif | ||
326 | } | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_analog.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_analog.c new file mode 100644 index 000000000..0e9881f6a --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_analog.c | |||
@@ -0,0 +1,282 @@ | |||
1 | /* | ||
2 | wiring_analog.c - analog input and output | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2005-2006 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | Modified 28 September 2010 by Mark Sproul | ||
23 | |||
24 | $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ | ||
25 | */ | ||
26 | |||
27 | #include "wiring_private.h" | ||
28 | #include "pins_arduino.h" | ||
29 | |||
30 | uint8_t analog_reference = DEFAULT; | ||
31 | |||
32 | void analogReference(uint8_t mode) | ||
33 | { | ||
34 | // can't actually set the register here because the default setting | ||
35 | // will connect AVCC and the AREF pin, which would cause a short if | ||
36 | // there's something connected to AREF. | ||
37 | analog_reference = mode; | ||
38 | } | ||
39 | |||
40 | int analogRead(uint8_t pin) | ||
41 | { | ||
42 | uint8_t low, high; | ||
43 | |||
44 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) | ||
45 | if (pin >= 54) pin -= 54; // allow for channel or pin numbers | ||
46 | #elif defined(__AVR_ATmega32U4__) | ||
47 | if (pin >= 18) pin -= 18; // allow for channel or pin numbers | ||
48 | #elif defined(__AVR_ATmega1284__) | ||
49 | if (pin >= 24) pin -= 24; // allow for channel or pin numbers | ||
50 | #else | ||
51 | if (pin >= 14) pin -= 14; // allow for channel or pin numbers | ||
52 | #endif | ||
53 | |||
54 | #if defined(__AVR_ATmega32U4__) | ||
55 | pin = analogPinToChannel(pin); | ||
56 | ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); | ||
57 | #elif defined(ADCSRB) && defined(MUX5) | ||
58 | // the MUX5 bit of ADCSRB selects whether we're reading from channels | ||
59 | // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). | ||
60 | ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); | ||
61 | #endif | ||
62 | |||
63 | // set the analog reference (high two bits of ADMUX) and select the | ||
64 | // channel (low 4 bits). this also sets ADLAR (left-adjust result) | ||
65 | // to 0 (the default). | ||
66 | #if defined(ADMUX) | ||
67 | ADMUX = (analog_reference << 6) | (pin & 0x07); | ||
68 | #endif | ||
69 | |||
70 | // without a delay, we seem to read from the wrong channel | ||
71 | //delay(1); | ||
72 | |||
73 | #if defined(ADCSRA) && defined(ADCL) | ||
74 | // start the conversion | ||
75 | sbi(ADCSRA, ADSC); | ||
76 | |||
77 | // ADSC is cleared when the conversion finishes | ||
78 | while (bit_is_set(ADCSRA, ADSC)); | ||
79 | |||
80 | // we have to read ADCL first; doing so locks both ADCL | ||
81 | // and ADCH until ADCH is read. reading ADCL second would | ||
82 | // cause the results of each conversion to be discarded, | ||
83 | // as ADCL and ADCH would be locked when it completed. | ||
84 | low = ADCL; | ||
85 | high = ADCH; | ||
86 | #else | ||
87 | // we dont have an ADC, return 0 | ||
88 | low = 0; | ||
89 | high = 0; | ||
90 | #endif | ||
91 | |||
92 | // combine the two bytes | ||
93 | return (high << 8) | low; | ||
94 | } | ||
95 | |||
96 | // Right now, PWM output only works on the pins with | ||
97 | // hardware support. These are defined in the appropriate | ||
98 | // pins_*.c file. For the rest of the pins, we default | ||
99 | // to digital output. | ||
100 | void analogWrite(uint8_t pin, int val) | ||
101 | { | ||
102 | // We need to make sure the PWM output is enabled for those pins | ||
103 | // that support it, as we turn it off when digitally reading or | ||
104 | // writing with them. Also, make sure the pin is in output mode | ||
105 | // for consistenty with Wiring, which doesn't require a pinMode | ||
106 | // call for the analog output pins. | ||
107 | pinMode(pin, OUTPUT); | ||
108 | if (val == 0) | ||
109 | { | ||
110 | digitalWrite(pin, LOW); | ||
111 | } | ||
112 | else if (val == 255) | ||
113 | { | ||
114 | digitalWrite(pin, HIGH); | ||
115 | } | ||
116 | else | ||
117 | { | ||
118 | switch(digitalPinToTimer(pin)) | ||
119 | { | ||
120 | // XXX fix needed for atmega8 | ||
121 | #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__) | ||
122 | case TIMER0A: | ||
123 | // connect pwm to pin on timer 0 | ||
124 | sbi(TCCR0, COM00); | ||
125 | OCR0 = val; // set pwm duty | ||
126 | break; | ||
127 | #endif | ||
128 | |||
129 | #if defined(TCCR0A) && defined(COM0A1) | ||
130 | case TIMER0A: | ||
131 | // connect pwm to pin on timer 0, channel A | ||
132 | sbi(TCCR0A, COM0A1); | ||
133 | OCR0A = val; // set pwm duty | ||
134 | break; | ||
135 | #endif | ||
136 | |||
137 | #if defined(TCCR0A) && defined(COM0B1) | ||
138 | case TIMER0B: | ||
139 | // connect pwm to pin on timer 0, channel B | ||
140 | sbi(TCCR0A, COM0B1); | ||
141 | OCR0B = val; // set pwm duty | ||
142 | break; | ||
143 | #endif | ||
144 | |||
145 | #if defined(TCCR1A) && defined(COM1A1) | ||
146 | case TIMER1A: | ||
147 | // connect pwm to pin on timer 1, channel A | ||
148 | sbi(TCCR1A, COM1A1); | ||
149 | OCR1A = val; // set pwm duty | ||
150 | break; | ||
151 | #endif | ||
152 | |||
153 | #if defined(TCCR1A) && defined(COM1B1) | ||
154 | case TIMER1B: | ||
155 | // connect pwm to pin on timer 1, channel B | ||
156 | sbi(TCCR1A, COM1B1); | ||
157 | OCR1B = val; // set pwm duty | ||
158 | break; | ||
159 | #endif | ||
160 | |||
161 | #if defined(TCCR2) && defined(COM21) | ||
162 | case TIMER2: | ||
163 | // connect pwm to pin on timer 2 | ||
164 | sbi(TCCR2, COM21); | ||
165 | OCR2 = val; // set pwm duty | ||
166 | break; | ||
167 | #endif | ||
168 | |||
169 | #if defined(TCCR2A) && defined(COM2A1) | ||
170 | case TIMER2A: | ||
171 | // connect pwm to pin on timer 2, channel A | ||
172 | sbi(TCCR2A, COM2A1); | ||
173 | OCR2A = val; // set pwm duty | ||
174 | break; | ||
175 | #endif | ||
176 | |||
177 | #if defined(TCCR2A) && defined(COM2B1) | ||
178 | case TIMER2B: | ||
179 | // connect pwm to pin on timer 2, channel B | ||
180 | sbi(TCCR2A, COM2B1); | ||
181 | OCR2B = val; // set pwm duty | ||
182 | break; | ||
183 | #endif | ||
184 | |||
185 | #if defined(TCCR3A) && defined(COM3A1) | ||
186 | case TIMER3A: | ||
187 | // connect pwm to pin on timer 3, channel A | ||
188 | sbi(TCCR3A, COM3A1); | ||
189 | OCR3A = val; // set pwm duty | ||
190 | break; | ||
191 | #endif | ||
192 | |||
193 | #if defined(TCCR3A) && defined(COM3B1) | ||
194 | case TIMER3B: | ||
195 | // connect pwm to pin on timer 3, channel B | ||
196 | sbi(TCCR3A, COM3B1); | ||
197 | OCR3B = val; // set pwm duty | ||
198 | break; | ||
199 | #endif | ||
200 | |||
201 | #if defined(TCCR3A) && defined(COM3C1) | ||
202 | case TIMER3C: | ||
203 | // connect pwm to pin on timer 3, channel C | ||
204 | sbi(TCCR3A, COM3C1); | ||
205 | OCR3C = val; // set pwm duty | ||
206 | break; | ||
207 | #endif | ||
208 | |||
209 | #if defined(TCCR4A) | ||
210 | case TIMER4A: | ||
211 | //connect pwm to pin on timer 4, channel A | ||
212 | sbi(TCCR4A, COM4A1); | ||
213 | #if defined(COM4A0) // only used on 32U4 | ||
214 | cbi(TCCR4A, COM4A0); | ||
215 | #endif | ||
216 | OCR4A = val; // set pwm duty | ||
217 | break; | ||
218 | #endif | ||
219 | |||
220 | #if defined(TCCR4A) && defined(COM4B1) | ||
221 | case TIMER4B: | ||
222 | // connect pwm to pin on timer 4, channel B | ||
223 | sbi(TCCR4A, COM4B1); | ||
224 | OCR4B = val; // set pwm duty | ||
225 | break; | ||
226 | #endif | ||
227 | |||
228 | #if defined(TCCR4A) && defined(COM4C1) | ||
229 | case TIMER4C: | ||
230 | // connect pwm to pin on timer 4, channel C | ||
231 | sbi(TCCR4A, COM4C1); | ||
232 | OCR4C = val; // set pwm duty | ||
233 | break; | ||
234 | #endif | ||
235 | |||
236 | #if defined(TCCR4C) && defined(COM4D1) | ||
237 | case TIMER4D: | ||
238 | // connect pwm to pin on timer 4, channel D | ||
239 | sbi(TCCR4C, COM4D1); | ||
240 | #if defined(COM4D0) // only used on 32U4 | ||
241 | cbi(TCCR4C, COM4D0); | ||
242 | #endif | ||
243 | OCR4D = val; // set pwm duty | ||
244 | break; | ||
245 | #endif | ||
246 | |||
247 | |||
248 | #if defined(TCCR5A) && defined(COM5A1) | ||
249 | case TIMER5A: | ||
250 | // connect pwm to pin on timer 5, channel A | ||
251 | sbi(TCCR5A, COM5A1); | ||
252 | OCR5A = val; // set pwm duty | ||
253 | break; | ||
254 | #endif | ||
255 | |||
256 | #if defined(TCCR5A) && defined(COM5B1) | ||
257 | case TIMER5B: | ||
258 | // connect pwm to pin on timer 5, channel B | ||
259 | sbi(TCCR5A, COM5B1); | ||
260 | OCR5B = val; // set pwm duty | ||
261 | break; | ||
262 | #endif | ||
263 | |||
264 | #if defined(TCCR5A) && defined(COM5C1) | ||
265 | case TIMER5C: | ||
266 | // connect pwm to pin on timer 5, channel C | ||
267 | sbi(TCCR5A, COM5C1); | ||
268 | OCR5C = val; // set pwm duty | ||
269 | break; | ||
270 | #endif | ||
271 | |||
272 | case NOT_ON_TIMER: | ||
273 | default: | ||
274 | if (val < 128) { | ||
275 | digitalWrite(pin, LOW); | ||
276 | } else { | ||
277 | digitalWrite(pin, HIGH); | ||
278 | } | ||
279 | } | ||
280 | } | ||
281 | } | ||
282 | |||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_digital.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_digital.c new file mode 100644 index 000000000..be323b1df --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_digital.c | |||
@@ -0,0 +1,178 @@ | |||
1 | /* | ||
2 | wiring_digital.c - digital input and output functions | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2005-2006 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | Modified 28 September 2010 by Mark Sproul | ||
23 | |||
24 | $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ | ||
25 | */ | ||
26 | |||
27 | #define ARDUINO_MAIN | ||
28 | #include "wiring_private.h" | ||
29 | #include "pins_arduino.h" | ||
30 | |||
31 | void pinMode(uint8_t pin, uint8_t mode) | ||
32 | { | ||
33 | uint8_t bit = digitalPinToBitMask(pin); | ||
34 | uint8_t port = digitalPinToPort(pin); | ||
35 | volatile uint8_t *reg, *out; | ||
36 | |||
37 | if (port == NOT_A_PIN) return; | ||
38 | |||
39 | // JWS: can I let the optimizer do this? | ||
40 | reg = portModeRegister(port); | ||
41 | out = portOutputRegister(port); | ||
42 | |||
43 | if (mode == INPUT) { | ||
44 | uint8_t oldSREG = SREG; | ||
45 | cli(); | ||
46 | *reg &= ~bit; | ||
47 | *out &= ~bit; | ||
48 | SREG = oldSREG; | ||
49 | } else if (mode == INPUT_PULLUP) { | ||
50 | uint8_t oldSREG = SREG; | ||
51 | cli(); | ||
52 | *reg &= ~bit; | ||
53 | *out |= bit; | ||
54 | SREG = oldSREG; | ||
55 | } else { | ||
56 | uint8_t oldSREG = SREG; | ||
57 | cli(); | ||
58 | *reg |= bit; | ||
59 | SREG = oldSREG; | ||
60 | } | ||
61 | } | ||
62 | |||
63 | // Forcing this inline keeps the callers from having to push their own stuff | ||
64 | // on the stack. It is a good performance win and only takes 1 more byte per | ||
65 | // user than calling. (It will take more bytes on the 168.) | ||
66 | // | ||
67 | // But shouldn't this be moved into pinMode? Seems silly to check and do on | ||
68 | // each digitalread or write. | ||
69 | // | ||
70 | // Mark Sproul: | ||
71 | // - Removed inline. Save 170 bytes on atmega1280 | ||
72 | // - changed to a switch statment; added 32 bytes but much easier to read and maintain. | ||
73 | // - Added more #ifdefs, now compiles for atmega645 | ||
74 | // | ||
75 | //static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); | ||
76 | //static inline void turnOffPWM(uint8_t timer) | ||
77 | static void turnOffPWM(uint8_t timer) | ||
78 | { | ||
79 | switch (timer) | ||
80 | { | ||
81 | #if defined(TCCR1A) && defined(COM1A1) | ||
82 | case TIMER1A: cbi(TCCR1A, COM1A1); break; | ||
83 | #endif | ||
84 | #if defined(TCCR1A) && defined(COM1B1) | ||
85 | case TIMER1B: cbi(TCCR1A, COM1B1); break; | ||
86 | #endif | ||
87 | |||
88 | #if defined(TCCR2) && defined(COM21) | ||
89 | case TIMER2: cbi(TCCR2, COM21); break; | ||
90 | #endif | ||
91 | |||
92 | #if defined(TCCR0A) && defined(COM0A1) | ||
93 | case TIMER0A: cbi(TCCR0A, COM0A1); break; | ||
94 | #endif | ||
95 | |||
96 | #if defined(TIMER0B) && defined(COM0B1) | ||
97 | case TIMER0B: cbi(TCCR0A, COM0B1); break; | ||
98 | #endif | ||
99 | #if defined(TCCR2A) && defined(COM2A1) | ||
100 | case TIMER2A: cbi(TCCR2A, COM2A1); break; | ||
101 | #endif | ||
102 | #if defined(TCCR2A) && defined(COM2B1) | ||
103 | case TIMER2B: cbi(TCCR2A, COM2B1); break; | ||
104 | #endif | ||
105 | |||
106 | #if defined(TCCR3A) && defined(COM3A1) | ||
107 | case TIMER3A: cbi(TCCR3A, COM3A1); break; | ||
108 | #endif | ||
109 | #if defined(TCCR3A) && defined(COM3B1) | ||
110 | case TIMER3B: cbi(TCCR3A, COM3B1); break; | ||
111 | #endif | ||
112 | #if defined(TCCR3A) && defined(COM3C1) | ||
113 | case TIMER3C: cbi(TCCR3A, COM3C1); break; | ||
114 | #endif | ||
115 | |||
116 | #if defined(TCCR4A) && defined(COM4A1) | ||
117 | case TIMER4A: cbi(TCCR4A, COM4A1); break; | ||
118 | #endif | ||
119 | #if defined(TCCR4A) && defined(COM4B1) | ||
120 | case TIMER4B: cbi(TCCR4A, COM4B1); break; | ||
121 | #endif | ||
122 | #if defined(TCCR4A) && defined(COM4C1) | ||
123 | case TIMER4C: cbi(TCCR4A, COM4C1); break; | ||
124 | #endif | ||
125 | #if defined(TCCR4C) && defined(COM4D1) | ||
126 | case TIMER4D: cbi(TCCR4C, COM4D1); break; | ||
127 | #endif | ||
128 | |||
129 | #if defined(TCCR5A) | ||
130 | case TIMER5A: cbi(TCCR5A, COM5A1); break; | ||
131 | case TIMER5B: cbi(TCCR5A, COM5B1); break; | ||
132 | case TIMER5C: cbi(TCCR5A, COM5C1); break; | ||
133 | #endif | ||
134 | } | ||
135 | } | ||
136 | |||
137 | void digitalWrite(uint8_t pin, uint8_t val) | ||
138 | { | ||
139 | uint8_t timer = digitalPinToTimer(pin); | ||
140 | uint8_t bit = digitalPinToBitMask(pin); | ||
141 | uint8_t port = digitalPinToPort(pin); | ||
142 | volatile uint8_t *out; | ||
143 | |||
144 | if (port == NOT_A_PIN) return; | ||
145 | |||
146 | // If the pin that support PWM output, we need to turn it off | ||
147 | // before doing a digital write. | ||
148 | if (timer != NOT_ON_TIMER) turnOffPWM(timer); | ||
149 | |||
150 | out = portOutputRegister(port); | ||
151 | |||
152 | uint8_t oldSREG = SREG; | ||
153 | cli(); | ||
154 | |||
155 | if (val == LOW) { | ||
156 | *out &= ~bit; | ||
157 | } else { | ||
158 | *out |= bit; | ||
159 | } | ||
160 | |||
161 | SREG = oldSREG; | ||
162 | } | ||
163 | |||
164 | int digitalRead(uint8_t pin) | ||
165 | { | ||
166 | uint8_t timer = digitalPinToTimer(pin); | ||
167 | uint8_t bit = digitalPinToBitMask(pin); | ||
168 | uint8_t port = digitalPinToPort(pin); | ||
169 | |||
170 | if (port == NOT_A_PIN) return LOW; | ||
171 | |||
172 | // If the pin that support PWM output, we need to turn it off | ||
173 | // before getting a digital reading. | ||
174 | if (timer != NOT_ON_TIMER) turnOffPWM(timer); | ||
175 | |||
176 | if (*portInputRegister(port) & bit) return HIGH; | ||
177 | return LOW; | ||
178 | } | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_private.h b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_private.h new file mode 100644 index 000000000..f0ceb0cc4 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_private.h | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | wiring_private.h - Internal header file. | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2005-2006 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id: wiring.h 239 2007-01-12 17:58:39Z mellis $ | ||
23 | */ | ||
24 | |||
25 | #ifndef WiringPrivate_h | ||
26 | #define WiringPrivate_h | ||
27 | |||
28 | #include <avr/io.h> | ||
29 | #include <avr/interrupt.h> | ||
30 | #include <stdio.h> | ||
31 | #include <stdarg.h> | ||
32 | |||
33 | #include "Arduino.h" | ||
34 | |||
35 | #ifdef __cplusplus | ||
36 | extern "C"{ | ||
37 | #endif | ||
38 | |||
39 | #ifndef cbi | ||
40 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) | ||
41 | #endif | ||
42 | #ifndef sbi | ||
43 | #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) | ||
44 | #endif | ||
45 | |||
46 | #define EXTERNAL_INT_0 0 | ||
47 | #define EXTERNAL_INT_1 1 | ||
48 | #define EXTERNAL_INT_2 2 | ||
49 | #define EXTERNAL_INT_3 3 | ||
50 | #define EXTERNAL_INT_4 4 | ||
51 | #define EXTERNAL_INT_5 5 | ||
52 | #define EXTERNAL_INT_6 6 | ||
53 | #define EXTERNAL_INT_7 7 | ||
54 | |||
55 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) | ||
56 | #define EXTERNAL_NUM_INTERRUPTS 8 | ||
57 | #elif defined(__AVR_ATmega1284P__) | ||
58 | #define EXTERNAL_NUM_INTERRUPTS 3 | ||
59 | #else | ||
60 | #define EXTERNAL_NUM_INTERRUPTS 2 | ||
61 | #endif | ||
62 | |||
63 | typedef void (*voidFuncPtr)(void); | ||
64 | |||
65 | #ifdef __cplusplus | ||
66 | } // extern "C" | ||
67 | #endif | ||
68 | |||
69 | #endif | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_pulse.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_pulse.c new file mode 100644 index 000000000..0d968865d --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_pulse.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | wiring_pulse.c - pulseIn() function | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2005-2006 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ | ||
23 | */ | ||
24 | |||
25 | #include "wiring_private.h" | ||
26 | #include "pins_arduino.h" | ||
27 | |||
28 | /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH | ||
29 | * or LOW, the type of pulse to measure. Works on pulses from 2-3 microseconds | ||
30 | * to 3 minutes in length, but must be called at least a few dozen microseconds | ||
31 | * before the start of the pulse. */ | ||
32 | unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout) | ||
33 | { | ||
34 | // cache the port and bit of the pin in order to speed up the | ||
35 | // pulse width measuring loop and achieve finer resolution. calling | ||
36 | // digitalRead() instead yields much coarser resolution. | ||
37 | uint8_t bit = digitalPinToBitMask(pin); | ||
38 | uint8_t port = digitalPinToPort(pin); | ||
39 | uint8_t stateMask = (state ? bit : 0); | ||
40 | unsigned long width = 0; // keep initialization out of time critical area | ||
41 | |||
42 | // convert the timeout from microseconds to a number of times through | ||
43 | // the initial loop; it takes 16 clock cycles per iteration. | ||
44 | unsigned long numloops = 0; | ||
45 | unsigned long maxloops = microsecondsToClockCycles(timeout) / 16; | ||
46 | |||
47 | // wait for any previous pulse to end | ||
48 | while ((*portInputRegister(port) & bit) == stateMask) | ||
49 | if (numloops++ == maxloops) | ||
50 | return 0; | ||
51 | |||
52 | // wait for the pulse to start | ||
53 | while ((*portInputRegister(port) & bit) != stateMask) | ||
54 | if (numloops++ == maxloops) | ||
55 | return 0; | ||
56 | |||
57 | // wait for the pulse to stop | ||
58 | while ((*portInputRegister(port) & bit) == stateMask) { | ||
59 | if (numloops++ == maxloops) | ||
60 | return 0; | ||
61 | width++; | ||
62 | } | ||
63 | |||
64 | // convert the reading to microseconds. The loop has been determined | ||
65 | // to be 20 clock cycles long and have about 16 clocks between the edge | ||
66 | // and the start of the loop. There will be some error introduced by | ||
67 | // the interrupt handlers. | ||
68 | return clockCyclesToMicroseconds(width * 21 + 16); | ||
69 | } | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_shift.c b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_shift.c new file mode 100644 index 000000000..cfe786758 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/cores/arduino/wiring_shift.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | wiring_shift.c - shiftOut() function | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2005-2006 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ | ||
23 | */ | ||
24 | |||
25 | #include "wiring_private.h" | ||
26 | |||
27 | uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) { | ||
28 | uint8_t value = 0; | ||
29 | uint8_t i; | ||
30 | |||
31 | for (i = 0; i < 8; ++i) { | ||
32 | digitalWrite(clockPin, HIGH); | ||
33 | if (bitOrder == LSBFIRST) | ||
34 | value |= digitalRead(dataPin) << i; | ||
35 | else | ||
36 | value |= digitalRead(dataPin) << (7 - i); | ||
37 | digitalWrite(clockPin, LOW); | ||
38 | } | ||
39 | return value; | ||
40 | } | ||
41 | |||
42 | void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) | ||
43 | { | ||
44 | uint8_t i; | ||
45 | |||
46 | for (i = 0; i < 8; i++) { | ||
47 | if (bitOrder == LSBFIRST) | ||
48 | digitalWrite(dataPin, !!(val & (1 << i))); | ||
49 | else | ||
50 | digitalWrite(dataPin, !!(val & (1 << (7 - i)))); | ||
51 | |||
52 | digitalWrite(clockPin, HIGH); | ||
53 | digitalWrite(clockPin, LOW); | ||
54 | } | ||
55 | } | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/eightanaloginputs/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/eightanaloginputs/pins_arduino.h new file mode 100644 index 000000000..52b37efc4 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/variants/eightanaloginputs/pins_arduino.h | |||
@@ -0,0 +1,27 @@ | |||
1 | /* | ||
2 | pins_arduino.h - Pin definition functions for Arduino | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2007 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ | ||
23 | */ | ||
24 | |||
25 | #include "../standard/pins_arduino.h" | ||
26 | #undef NUM_ANALOG_INPUTS | ||
27 | #define NUM_ANALOG_INPUTS 8 | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/leonardo/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/leonardo/pins_arduino.h new file mode 100644 index 000000000..9f770d6ce --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/variants/leonardo/pins_arduino.h | |||
@@ -0,0 +1,256 @@ | |||
1 | /* | ||
2 | pins_arduino.h - Pin definition functions for Arduino | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2007 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ | ||
23 | */ | ||
24 | |||
25 | #ifndef Pins_Arduino_h | ||
26 | #define Pins_Arduino_h | ||
27 | |||
28 | #include <avr/pgmspace.h> | ||
29 | |||
30 | #define TX_RX_LED_INIT DDRD |= (1<<5), DDRB |= (1<<0) | ||
31 | #define TXLED0 PORTD |= (1<<5) | ||
32 | #define TXLED1 PORTD &= ~(1<<5) | ||
33 | #define RXLED0 PORTB |= (1<<0) | ||
34 | #define RXLED1 PORTB &= ~(1<<0) | ||
35 | |||
36 | static const uint8_t SDA = 2; | ||
37 | static const uint8_t SCL = 3; | ||
38 | |||
39 | // Map SPI port to 'new' pins D14..D17 | ||
40 | static const uint8_t SS = 17; | ||
41 | static const uint8_t MOSI = 16; | ||
42 | static const uint8_t MISO = 14; | ||
43 | static const uint8_t SCK = 15; | ||
44 | |||
45 | // Mapping of analog pins as digital I/O | ||
46 | // A6-A11 share with digital pins | ||
47 | static const uint8_t A0 = 18; | ||
48 | static const uint8_t A1 = 19; | ||
49 | static const uint8_t A2 = 20; | ||
50 | static const uint8_t A3 = 21; | ||
51 | static const uint8_t A4 = 22; | ||
52 | static const uint8_t A5 = 23; | ||
53 | static const uint8_t A6 = 24; // D4 | ||
54 | static const uint8_t A7 = 25; // D6 | ||
55 | static const uint8_t A8 = 26; // D8 | ||
56 | static const uint8_t A9 = 27; // D9 | ||
57 | static const uint8_t A10 = 28; // D10 | ||
58 | static const uint8_t A11 = 29; // D12 | ||
59 | |||
60 | #define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0)) | ||
61 | #define digitalPinToPCICRbit(p) 0 | ||
62 | #define digitalPinToPCMSK(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCMSK0) : ((uint8_t *)0)) | ||
63 | #define digitalPinToPCMSKbit(p) ( ((p) >= 8 && (p) <= 11) ? (p) - 4 : ((p) == 14 ? 3 : ((p) == 15 ? 1 : ((p) == 16 ? 2 : ((p) == 17 ? 0 : (p - A8 + 4)))))) | ||
64 | |||
65 | // __AVR_ATmega32U4__ has an unusual mapping of pins to channels | ||
66 | extern const uint8_t PROGMEM analog_pin_to_channel_PGM[]; | ||
67 | #define analogPinToChannel(P) ( pgm_read_byte( analog_pin_to_channel_PGM + (P) ) ) | ||
68 | |||
69 | #ifdef ARDUINO_MAIN | ||
70 | |||
71 | // On the Arduino board, digital pins are also used | ||
72 | // for the analog output (software PWM). Analog input | ||
73 | // pins are a separate set. | ||
74 | |||
75 | // ATMEL ATMEGA32U4 / ARDUINO LEONARDO | ||
76 | // | ||
77 | // D0 PD2 RXD1/INT2 | ||
78 | // D1 PD3 TXD1/INT3 | ||
79 | // D2 PD1 SDA SDA/INT1 | ||
80 | // D3# PD0 PWM8/SCL OC0B/SCL/INT0 | ||
81 | // D4 A6 PD4 ADC8 | ||
82 | // D5# PC6 ??? OC3A/#OC4A | ||
83 | // D6# A7 PD7 FastPWM #OC4D/ADC10 | ||
84 | // D7 PE6 INT6/AIN0 | ||
85 | // | ||
86 | // D8 A8 PB4 ADC11/PCINT4 | ||
87 | // D9# A9 PB5 PWM16 OC1A/#OC4B/ADC12/PCINT5 | ||
88 | // D10# A10 PB6 PWM16 OC1B/0c4B/ADC13/PCINT6 | ||
89 | // D11# PB7 PWM8/16 0C0A/OC1C/#RTS/PCINT7 | ||
90 | // D12 A11 PD6 T1/#OC4D/ADC9 | ||
91 | // D13# PC7 PWM10 CLK0/OC4A | ||
92 | // | ||
93 | // A0 D18 PF7 ADC7 | ||
94 | // A1 D19 PF6 ADC6 | ||
95 | // A2 D20 PF5 ADC5 | ||
96 | // A3 D21 PF4 ADC4 | ||
97 | // A4 D22 PF1 ADC1 | ||
98 | // A5 D23 PF0 ADC0 | ||
99 | // | ||
100 | // New pins D14..D17 to map SPI port to digital pins | ||
101 | // | ||
102 | // MISO D14 PB3 MISO,PCINT3 | ||
103 | // SCK D15 PB1 SCK,PCINT1 | ||
104 | // MOSI D16 PB2 MOSI,PCINT2 | ||
105 | // SS D17 PB0 RXLED,SS/PCINT0 | ||
106 | // | ||
107 | // TXLED PD5 | ||
108 | // RXLED PB0 | ||
109 | // HWB PE2 HWB | ||
110 | |||
111 | // these arrays map port names (e.g. port B) to the | ||
112 | // appropriate addresses for various functions (e.g. reading | ||
113 | // and writing) | ||
114 | const uint16_t PROGMEM port_to_mode_PGM[] = { | ||
115 | NOT_A_PORT, | ||
116 | NOT_A_PORT, | ||
117 | (uint16_t) &DDRB, | ||
118 | (uint16_t) &DDRC, | ||
119 | (uint16_t) &DDRD, | ||
120 | (uint16_t) &DDRE, | ||
121 | (uint16_t) &DDRF, | ||
122 | }; | ||
123 | |||
124 | const uint16_t PROGMEM port_to_output_PGM[] = { | ||
125 | NOT_A_PORT, | ||
126 | NOT_A_PORT, | ||
127 | (uint16_t) &PORTB, | ||
128 | (uint16_t) &PORTC, | ||
129 | (uint16_t) &PORTD, | ||
130 | (uint16_t) &PORTE, | ||
131 | (uint16_t) &PORTF, | ||
132 | }; | ||
133 | |||
134 | const uint16_t PROGMEM port_to_input_PGM[] = { | ||
135 | NOT_A_PORT, | ||
136 | NOT_A_PORT, | ||
137 | (uint16_t) &PINB, | ||
138 | (uint16_t) &PINC, | ||
139 | (uint16_t) &PIND, | ||
140 | (uint16_t) &PINE, | ||
141 | (uint16_t) &PINF, | ||
142 | }; | ||
143 | |||
144 | const uint8_t PROGMEM digital_pin_to_port_PGM[30] = { | ||
145 | PD, // D0 - PD2 | ||
146 | PD, // D1 - PD3 | ||
147 | PD, // D2 - PD1 | ||
148 | PD, // D3 - PD0 | ||
149 | PD, // D4 - PD4 | ||
150 | PC, // D5 - PC6 | ||
151 | PD, // D6 - PD7 | ||
152 | PE, // D7 - PE6 | ||
153 | |||
154 | PB, // D8 - PB4 | ||
155 | PB, // D9 - PB5 | ||
156 | PB, // D10 - PB6 | ||
157 | PB, // D11 - PB7 | ||
158 | PD, // D12 - PD6 | ||
159 | PC, // D13 - PC7 | ||
160 | |||
161 | PB, // D14 - MISO - PB3 | ||
162 | PB, // D15 - SCK - PB1 | ||
163 | PB, // D16 - MOSI - PB2 | ||
164 | PB, // D17 - SS - PB0 | ||
165 | |||
166 | PF, // D18 - A0 - PF7 | ||
167 | PF, // D19 - A1 - PF6 | ||
168 | PF, // D20 - A2 - PF5 | ||
169 | PF, // D21 - A3 - PF4 | ||
170 | PF, // D22 - A4 - PF1 | ||
171 | PF, // D23 - A5 - PF0 | ||
172 | |||
173 | PD, // D24 / D4 - A6 - PD4 | ||
174 | PD, // D25 / D6 - A7 - PD7 | ||
175 | PB, // D26 / D8 - A8 - PB4 | ||
176 | PB, // D27 / D9 - A9 - PB5 | ||
177 | PB, // D28 / D10 - A10 - PB6 | ||
178 | PD, // D29 / D12 - A11 - PD6 | ||
179 | }; | ||
180 | |||
181 | const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[30] = { | ||
182 | _BV(2), // D0 - PD2 | ||
183 | _BV(3), // D1 - PD3 | ||
184 | _BV(1), // D2 - PD1 | ||
185 | _BV(0), // D3 - PD0 | ||
186 | _BV(4), // D4 - PD4 | ||
187 | _BV(6), // D5 - PC6 | ||
188 | _BV(7), // D6 - PD7 | ||
189 | _BV(6), // D7 - PE6 | ||
190 | |||
191 | _BV(4), // D8 - PB4 | ||
192 | _BV(5), // D9 - PB5 | ||
193 | _BV(6), // D10 - PB6 | ||
194 | _BV(7), // D11 - PB7 | ||
195 | _BV(6), // D12 - PD6 | ||
196 | _BV(7), // D13 - PC7 | ||
197 | |||
198 | _BV(3), // D14 - MISO - PB3 | ||
199 | _BV(1), // D15 - SCK - PB1 | ||
200 | _BV(2), // D16 - MOSI - PB2 | ||
201 | _BV(0), // D17 - SS - PB0 | ||
202 | |||
203 | _BV(7), // D18 - A0 - PF7 | ||
204 | _BV(6), // D19 - A1 - PF6 | ||
205 | _BV(5), // D20 - A2 - PF5 | ||
206 | _BV(4), // D21 - A3 - PF4 | ||
207 | _BV(1), // D22 - A4 - PF1 | ||
208 | _BV(0), // D23 - A5 - PF0 | ||
209 | |||
210 | _BV(4), // D24 / D4 - A6 - PD4 | ||
211 | _BV(7), // D25 / D6 - A7 - PD7 | ||
212 | _BV(4), // D26 / D8 - A8 - PB4 | ||
213 | _BV(5), // D27 / D9 - A9 - PB5 | ||
214 | _BV(6), // D28 / D10 - A10 - PB6 | ||
215 | _BV(6), // D29 / D12 - A11 - PD6 | ||
216 | }; | ||
217 | |||
218 | const uint8_t PROGMEM digital_pin_to_timer_PGM[16] = { | ||
219 | NOT_ON_TIMER, | ||
220 | NOT_ON_TIMER, | ||
221 | NOT_ON_TIMER, | ||
222 | TIMER0B, /* 3 */ | ||
223 | NOT_ON_TIMER, | ||
224 | TIMER3A, /* 5 */ | ||
225 | TIMER4D, /* 6 */ | ||
226 | NOT_ON_TIMER, | ||
227 | |||
228 | NOT_ON_TIMER, | ||
229 | TIMER1A, /* 9 */ | ||
230 | TIMER1B, /* 10 */ | ||
231 | TIMER0A, /* 11 */ | ||
232 | |||
233 | NOT_ON_TIMER, | ||
234 | TIMER4A, /* 13 */ | ||
235 | |||
236 | NOT_ON_TIMER, | ||
237 | NOT_ON_TIMER, | ||
238 | }; | ||
239 | |||
240 | const uint8_t PROGMEM analog_pin_to_channel_PGM[12] = { | ||
241 | 7, // A0 PF7 ADC7 | ||
242 | 6, // A1 PF6 ADC6 | ||
243 | 5, // A2 PF5 ADC5 | ||
244 | 4, // A3 PF4 ADC4 | ||
245 | 1, // A4 PF1 ADC1 | ||
246 | 0, // A5 PF0 ADC0 | ||
247 | 8, // A6 D4 PD4 ADC8 | ||
248 | 10, // A7 D6 PD7 ADC10 | ||
249 | 11, // A8 D8 PB4 ADC11 | ||
250 | 12, // A9 D9 PB5 ADC12 | ||
251 | 13, // A10 D10 PB6 ADC13 | ||
252 | 9 // A11 D12 PD6 ADC9 | ||
253 | }; | ||
254 | |||
255 | #endif /* ARDUINO_MAIN */ | ||
256 | #endif /* Pins_Arduino_h */ | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/mega/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/mega/pins_arduino.h new file mode 100644 index 000000000..5a9b4cb09 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/variants/mega/pins_arduino.h | |||
@@ -0,0 +1,363 @@ | |||
1 | /* | ||
2 | pins_arduino.h - Pin definition functions for Arduino | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2007 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ | ||
23 | */ | ||
24 | |||
25 | #ifndef Pins_Arduino_h | ||
26 | #define Pins_Arduino_h | ||
27 | |||
28 | #include <avr/pgmspace.h> | ||
29 | |||
30 | #define NUM_DIGITAL_PINS 70 | ||
31 | #define NUM_ANALOG_INPUTS 16 | ||
32 | #define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1) | ||
33 | #define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46)) | ||
34 | |||
35 | static const uint8_t SS = 53; | ||
36 | static const uint8_t MOSI = 51; | ||
37 | static const uint8_t MISO = 50; | ||
38 | static const uint8_t SCK = 52; | ||
39 | |||
40 | static const uint8_t SDA = 20; | ||
41 | static const uint8_t SCL = 21; | ||
42 | static const uint8_t LED_BUILTIN = 13; | ||
43 | |||
44 | static const uint8_t A0 = 54; | ||
45 | static const uint8_t A1 = 55; | ||
46 | static const uint8_t A2 = 56; | ||
47 | static const uint8_t A3 = 57; | ||
48 | static const uint8_t A4 = 58; | ||
49 | static const uint8_t A5 = 59; | ||
50 | static const uint8_t A6 = 60; | ||
51 | static const uint8_t A7 = 61; | ||
52 | static const uint8_t A8 = 62; | ||
53 | static const uint8_t A9 = 63; | ||
54 | static const uint8_t A10 = 64; | ||
55 | static const uint8_t A11 = 65; | ||
56 | static const uint8_t A12 = 66; | ||
57 | static const uint8_t A13 = 67; | ||
58 | static const uint8_t A14 = 68; | ||
59 | static const uint8_t A15 = 69; | ||
60 | |||
61 | // A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) | ||
62 | // Only pins available for RECEIVE (TRANSMIT can be on any pin): | ||
63 | // (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me) | ||
64 | // Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 | ||
65 | |||
66 | #define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \ | ||
67 | (((p) >= 50) && ((p) <= 53)) || \ | ||
68 | (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) ) | ||
69 | |||
70 | #define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \ | ||
71 | ( (((p) >= 62) && ((p) <= 69)) ? 2 : \ | ||
72 | 0 ) ) | ||
73 | |||
74 | #define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \ | ||
75 | ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \ | ||
76 | ((uint8_t *)0) ) ) | ||
77 | |||
78 | #define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \ | ||
79 | ( ((p) == 50) ? 3 : \ | ||
80 | ( ((p) == 51) ? 2 : \ | ||
81 | ( ((p) == 52) ? 1 : \ | ||
82 | ( ((p) == 53) ? 0 : \ | ||
83 | ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \ | ||
84 | 0 ) ) ) ) ) ) | ||
85 | |||
86 | #ifdef ARDUINO_MAIN | ||
87 | |||
88 | const uint16_t PROGMEM port_to_mode_PGM[] = { | ||
89 | NOT_A_PORT, | ||
90 | (uint16_t) &DDRA, | ||
91 | (uint16_t) &DDRB, | ||
92 | (uint16_t) &DDRC, | ||
93 | (uint16_t) &DDRD, | ||
94 | (uint16_t) &DDRE, | ||
95 | (uint16_t) &DDRF, | ||
96 | (uint16_t) &DDRG, | ||
97 | (uint16_t) &DDRH, | ||
98 | NOT_A_PORT, | ||
99 | (uint16_t) &DDRJ, | ||
100 | (uint16_t) &DDRK, | ||
101 | (uint16_t) &DDRL, | ||
102 | }; | ||
103 | |||
104 | const uint16_t PROGMEM port_to_output_PGM[] = { | ||
105 | NOT_A_PORT, | ||
106 | (uint16_t) &PORTA, | ||
107 | (uint16_t) &PORTB, | ||
108 | (uint16_t) &PORTC, | ||
109 | (uint16_t) &PORTD, | ||
110 | (uint16_t) &PORTE, | ||
111 | (uint16_t) &PORTF, | ||
112 | (uint16_t) &PORTG, | ||
113 | (uint16_t) &PORTH, | ||
114 | NOT_A_PORT, | ||
115 | (uint16_t) &PORTJ, | ||
116 | (uint16_t) &PORTK, | ||
117 | (uint16_t) &PORTL, | ||
118 | }; | ||
119 | |||
120 | const uint16_t PROGMEM port_to_input_PGM[] = { | ||
121 | NOT_A_PIN, | ||
122 | (uint16_t) &PINA, | ||
123 | (uint16_t) &PINB, | ||
124 | (uint16_t) &PINC, | ||
125 | (uint16_t) &PIND, | ||
126 | (uint16_t) &PINE, | ||
127 | (uint16_t) &PINF, | ||
128 | (uint16_t) &PING, | ||
129 | (uint16_t) &PINH, | ||
130 | NOT_A_PIN, | ||
131 | (uint16_t) &PINJ, | ||
132 | (uint16_t) &PINK, | ||
133 | (uint16_t) &PINL, | ||
134 | }; | ||
135 | |||
136 | const uint8_t PROGMEM digital_pin_to_port_PGM[] = { | ||
137 | // PORTLIST | ||
138 | // ------------------------------------------- | ||
139 | PE , // PE 0 ** 0 ** USART0_RX | ||
140 | PE , // PE 1 ** 1 ** USART0_TX | ||
141 | PE , // PE 4 ** 2 ** PWM2 | ||
142 | PE , // PE 5 ** 3 ** PWM3 | ||
143 | PG , // PG 5 ** 4 ** PWM4 | ||
144 | PE , // PE 3 ** 5 ** PWM5 | ||
145 | PH , // PH 3 ** 6 ** PWM6 | ||
146 | PH , // PH 4 ** 7 ** PWM7 | ||
147 | PH , // PH 5 ** 8 ** PWM8 | ||
148 | PH , // PH 6 ** 9 ** PWM9 | ||
149 | PB , // PB 4 ** 10 ** PWM10 | ||
150 | PB , // PB 5 ** 11 ** PWM11 | ||
151 | PB , // PB 6 ** 12 ** PWM12 | ||
152 | PB , // PB 7 ** 13 ** PWM13 | ||
153 | PJ , // PJ 1 ** 14 ** USART3_TX | ||
154 | PJ , // PJ 0 ** 15 ** USART3_RX | ||
155 | PH , // PH 1 ** 16 ** USART2_TX | ||
156 | PH , // PH 0 ** 17 ** USART2_RX | ||
157 | PD , // PD 3 ** 18 ** USART1_TX | ||
158 | PD , // PD 2 ** 19 ** USART1_RX | ||
159 | PD , // PD 1 ** 20 ** I2C_SDA | ||
160 | PD , // PD 0 ** 21 ** I2C_SCL | ||
161 | PA , // PA 0 ** 22 ** D22 | ||
162 | PA , // PA 1 ** 23 ** D23 | ||
163 | PA , // PA 2 ** 24 ** D24 | ||
164 | PA , // PA 3 ** 25 ** D25 | ||
165 | PA , // PA 4 ** 26 ** D26 | ||
166 | PA , // PA 5 ** 27 ** D27 | ||
167 | PA , // PA 6 ** 28 ** D28 | ||
168 | PA , // PA 7 ** 29 ** D29 | ||
169 | PC , // PC 7 ** 30 ** D30 | ||
170 | PC , // PC 6 ** 31 ** D31 | ||
171 | PC , // PC 5 ** 32 ** D32 | ||
172 | PC , // PC 4 ** 33 ** D33 | ||
173 | PC , // PC 3 ** 34 ** D34 | ||
174 | PC , // PC 2 ** 35 ** D35 | ||
175 | PC , // PC 1 ** 36 ** D36 | ||
176 | PC , // PC 0 ** 37 ** D37 | ||
177 | PD , // PD 7 ** 38 ** D38 | ||
178 | PG , // PG 2 ** 39 ** D39 | ||
179 | PG , // PG 1 ** 40 ** D40 | ||
180 | PG , // PG 0 ** 41 ** D41 | ||
181 | PL , // PL 7 ** 42 ** D42 | ||
182 | PL , // PL 6 ** 43 ** D43 | ||
183 | PL , // PL 5 ** 44 ** D44 | ||
184 | PL , // PL 4 ** 45 ** D45 | ||
185 | PL , // PL 3 ** 46 ** D46 | ||
186 | PL , // PL 2 ** 47 ** D47 | ||
187 | PL , // PL 1 ** 48 ** D48 | ||
188 | PL , // PL 0 ** 49 ** D49 | ||
189 | PB , // PB 3 ** 50 ** SPI_MISO | ||
190 | PB , // PB 2 ** 51 ** SPI_MOSI | ||
191 | PB , // PB 1 ** 52 ** SPI_SCK | ||
192 | PB , // PB 0 ** 53 ** SPI_SS | ||
193 | PF , // PF 0 ** 54 ** A0 | ||
194 | PF , // PF 1 ** 55 ** A1 | ||
195 | PF , // PF 2 ** 56 ** A2 | ||
196 | PF , // PF 3 ** 57 ** A3 | ||
197 | PF , // PF 4 ** 58 ** A4 | ||
198 | PF , // PF 5 ** 59 ** A5 | ||
199 | PF , // PF 6 ** 60 ** A6 | ||
200 | PF , // PF 7 ** 61 ** A7 | ||
201 | PK , // PK 0 ** 62 ** A8 | ||
202 | PK , // PK 1 ** 63 ** A9 | ||
203 | PK , // PK 2 ** 64 ** A10 | ||
204 | PK , // PK 3 ** 65 ** A11 | ||
205 | PK , // PK 4 ** 66 ** A12 | ||
206 | PK , // PK 5 ** 67 ** A13 | ||
207 | PK , // PK 6 ** 68 ** A14 | ||
208 | PK , // PK 7 ** 69 ** A15 | ||
209 | }; | ||
210 | |||
211 | const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { | ||
212 | // PIN IN PORT | ||
213 | // ------------------------------------------- | ||
214 | _BV( 0 ) , // PE 0 ** 0 ** USART0_RX | ||
215 | _BV( 1 ) , // PE 1 ** 1 ** USART0_TX | ||
216 | _BV( 4 ) , // PE 4 ** 2 ** PWM2 | ||
217 | _BV( 5 ) , // PE 5 ** 3 ** PWM3 | ||
218 | _BV( 5 ) , // PG 5 ** 4 ** PWM4 | ||
219 | _BV( 3 ) , // PE 3 ** 5 ** PWM5 | ||
220 | _BV( 3 ) , // PH 3 ** 6 ** PWM6 | ||
221 | _BV( 4 ) , // PH 4 ** 7 ** PWM7 | ||
222 | _BV( 5 ) , // PH 5 ** 8 ** PWM8 | ||
223 | _BV( 6 ) , // PH 6 ** 9 ** PWM9 | ||
224 | _BV( 4 ) , // PB 4 ** 10 ** PWM10 | ||
225 | _BV( 5 ) , // PB 5 ** 11 ** PWM11 | ||
226 | _BV( 6 ) , // PB 6 ** 12 ** PWM12 | ||
227 | _BV( 7 ) , // PB 7 ** 13 ** PWM13 | ||
228 | _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX | ||
229 | _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX | ||
230 | _BV( 1 ) , // PH 1 ** 16 ** USART2_TX | ||
231 | _BV( 0 ) , // PH 0 ** 17 ** USART2_RX | ||
232 | _BV( 3 ) , // PD 3 ** 18 ** USART1_TX | ||
233 | _BV( 2 ) , // PD 2 ** 19 ** USART1_RX | ||
234 | _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA | ||
235 | _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL | ||
236 | _BV( 0 ) , // PA 0 ** 22 ** D22 | ||
237 | _BV( 1 ) , // PA 1 ** 23 ** D23 | ||
238 | _BV( 2 ) , // PA 2 ** 24 ** D24 | ||
239 | _BV( 3 ) , // PA 3 ** 25 ** D25 | ||
240 | _BV( 4 ) , // PA 4 ** 26 ** D26 | ||
241 | _BV( 5 ) , // PA 5 ** 27 ** D27 | ||
242 | _BV( 6 ) , // PA 6 ** 28 ** D28 | ||
243 | _BV( 7 ) , // PA 7 ** 29 ** D29 | ||
244 | _BV( 7 ) , // PC 7 ** 30 ** D30 | ||
245 | _BV( 6 ) , // PC 6 ** 31 ** D31 | ||
246 | _BV( 5 ) , // PC 5 ** 32 ** D32 | ||
247 | _BV( 4 ) , // PC 4 ** 33 ** D33 | ||
248 | _BV( 3 ) , // PC 3 ** 34 ** D34 | ||
249 | _BV( 2 ) , // PC 2 ** 35 ** D35 | ||
250 | _BV( 1 ) , // PC 1 ** 36 ** D36 | ||
251 | _BV( 0 ) , // PC 0 ** 37 ** D37 | ||
252 | _BV( 7 ) , // PD 7 ** 38 ** D38 | ||
253 | _BV( 2 ) , // PG 2 ** 39 ** D39 | ||
254 | _BV( 1 ) , // PG 1 ** 40 ** D40 | ||
255 | _BV( 0 ) , // PG 0 ** 41 ** D41 | ||
256 | _BV( 7 ) , // PL 7 ** 42 ** D42 | ||
257 | _BV( 6 ) , // PL 6 ** 43 ** D43 | ||
258 | _BV( 5 ) , // PL 5 ** 44 ** D44 | ||
259 | _BV( 4 ) , // PL 4 ** 45 ** D45 | ||
260 | _BV( 3 ) , // PL 3 ** 46 ** D46 | ||
261 | _BV( 2 ) , // PL 2 ** 47 ** D47 | ||
262 | _BV( 1 ) , // PL 1 ** 48 ** D48 | ||
263 | _BV( 0 ) , // PL 0 ** 49 ** D49 | ||
264 | _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO | ||
265 | _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI | ||
266 | _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK | ||
267 | _BV( 0 ) , // PB 0 ** 53 ** SPI_SS | ||
268 | _BV( 0 ) , // PF 0 ** 54 ** A0 | ||
269 | _BV( 1 ) , // PF 1 ** 55 ** A1 | ||
270 | _BV( 2 ) , // PF 2 ** 56 ** A2 | ||
271 | _BV( 3 ) , // PF 3 ** 57 ** A3 | ||
272 | _BV( 4 ) , // PF 4 ** 58 ** A4 | ||
273 | _BV( 5 ) , // PF 5 ** 59 ** A5 | ||
274 | _BV( 6 ) , // PF 6 ** 60 ** A6 | ||
275 | _BV( 7 ) , // PF 7 ** 61 ** A7 | ||
276 | _BV( 0 ) , // PK 0 ** 62 ** A8 | ||
277 | _BV( 1 ) , // PK 1 ** 63 ** A9 | ||
278 | _BV( 2 ) , // PK 2 ** 64 ** A10 | ||
279 | _BV( 3 ) , // PK 3 ** 65 ** A11 | ||
280 | _BV( 4 ) , // PK 4 ** 66 ** A12 | ||
281 | _BV( 5 ) , // PK 5 ** 67 ** A13 | ||
282 | _BV( 6 ) , // PK 6 ** 68 ** A14 | ||
283 | _BV( 7 ) , // PK 7 ** 69 ** A15 | ||
284 | }; | ||
285 | |||
286 | const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { | ||
287 | // TIMERS | ||
288 | // ------------------------------------------- | ||
289 | NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX | ||
290 | NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX | ||
291 | TIMER3B , // PE 4 ** 2 ** PWM2 | ||
292 | TIMER3C , // PE 5 ** 3 ** PWM3 | ||
293 | TIMER0B , // PG 5 ** 4 ** PWM4 | ||
294 | TIMER3A , // PE 3 ** 5 ** PWM5 | ||
295 | TIMER4A , // PH 3 ** 6 ** PWM6 | ||
296 | TIMER4B , // PH 4 ** 7 ** PWM7 | ||
297 | TIMER4C , // PH 5 ** 8 ** PWM8 | ||
298 | TIMER2B , // PH 6 ** 9 ** PWM9 | ||
299 | TIMER2A , // PB 4 ** 10 ** PWM10 | ||
300 | TIMER1A , // PB 5 ** 11 ** PWM11 | ||
301 | TIMER1B , // PB 6 ** 12 ** PWM12 | ||
302 | TIMER0A , // PB 7 ** 13 ** PWM13 | ||
303 | NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX | ||
304 | NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX | ||
305 | NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX | ||
306 | NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX | ||
307 | NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX | ||
308 | NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX | ||
309 | NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA | ||
310 | NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL | ||
311 | NOT_ON_TIMER , // PA 0 ** 22 ** D22 | ||
312 | NOT_ON_TIMER , // PA 1 ** 23 ** D23 | ||
313 | NOT_ON_TIMER , // PA 2 ** 24 ** D24 | ||
314 | NOT_ON_TIMER , // PA 3 ** 25 ** D25 | ||
315 | NOT_ON_TIMER , // PA 4 ** 26 ** D26 | ||
316 | NOT_ON_TIMER , // PA 5 ** 27 ** D27 | ||
317 | NOT_ON_TIMER , // PA 6 ** 28 ** D28 | ||
318 | NOT_ON_TIMER , // PA 7 ** 29 ** D29 | ||
319 | NOT_ON_TIMER , // PC 7 ** 30 ** D30 | ||
320 | NOT_ON_TIMER , // PC 6 ** 31 ** D31 | ||
321 | NOT_ON_TIMER , // PC 5 ** 32 ** D32 | ||
322 | NOT_ON_TIMER , // PC 4 ** 33 ** D33 | ||
323 | NOT_ON_TIMER , // PC 3 ** 34 ** D34 | ||
324 | NOT_ON_TIMER , // PC 2 ** 35 ** D35 | ||
325 | NOT_ON_TIMER , // PC 1 ** 36 ** D36 | ||
326 | NOT_ON_TIMER , // PC 0 ** 37 ** D37 | ||
327 | NOT_ON_TIMER , // PD 7 ** 38 ** D38 | ||
328 | NOT_ON_TIMER , // PG 2 ** 39 ** D39 | ||
329 | NOT_ON_TIMER , // PG 1 ** 40 ** D40 | ||
330 | NOT_ON_TIMER , // PG 0 ** 41 ** D41 | ||
331 | NOT_ON_TIMER , // PL 7 ** 42 ** D42 | ||
332 | NOT_ON_TIMER , // PL 6 ** 43 ** D43 | ||
333 | TIMER5C , // PL 5 ** 44 ** D44 | ||
334 | TIMER5B , // PL 4 ** 45 ** D45 | ||
335 | TIMER5A , // PL 3 ** 46 ** D46 | ||
336 | NOT_ON_TIMER , // PL 2 ** 47 ** D47 | ||
337 | NOT_ON_TIMER , // PL 1 ** 48 ** D48 | ||
338 | NOT_ON_TIMER , // PL 0 ** 49 ** D49 | ||
339 | NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO | ||
340 | NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI | ||
341 | NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK | ||
342 | NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS | ||
343 | NOT_ON_TIMER , // PF 0 ** 54 ** A0 | ||
344 | NOT_ON_TIMER , // PF 1 ** 55 ** A1 | ||
345 | NOT_ON_TIMER , // PF 2 ** 56 ** A2 | ||
346 | NOT_ON_TIMER , // PF 3 ** 57 ** A3 | ||
347 | NOT_ON_TIMER , // PF 4 ** 58 ** A4 | ||
348 | NOT_ON_TIMER , // PF 5 ** 59 ** A5 | ||
349 | NOT_ON_TIMER , // PF 6 ** 60 ** A6 | ||
350 | NOT_ON_TIMER , // PF 7 ** 61 ** A7 | ||
351 | NOT_ON_TIMER , // PK 0 ** 62 ** A8 | ||
352 | NOT_ON_TIMER , // PK 1 ** 63 ** A9 | ||
353 | NOT_ON_TIMER , // PK 2 ** 64 ** A10 | ||
354 | NOT_ON_TIMER , // PK 3 ** 65 ** A11 | ||
355 | NOT_ON_TIMER , // PK 4 ** 66 ** A12 | ||
356 | NOT_ON_TIMER , // PK 5 ** 67 ** A13 | ||
357 | NOT_ON_TIMER , // PK 6 ** 68 ** A14 | ||
358 | NOT_ON_TIMER , // PK 7 ** 69 ** A15 | ||
359 | }; | ||
360 | |||
361 | #endif | ||
362 | |||
363 | #endif \ No newline at end of file | ||
diff --git a/protocol/usb_hid/arduino-1.0.1/variants/standard/pins_arduino.h b/protocol/usb_hid/arduino-1.0.1/variants/standard/pins_arduino.h new file mode 100644 index 000000000..30b426630 --- /dev/null +++ b/protocol/usb_hid/arduino-1.0.1/variants/standard/pins_arduino.h | |||
@@ -0,0 +1,218 @@ | |||
1 | /* | ||
2 | pins_arduino.h - Pin definition functions for Arduino | ||
3 | Part of Arduino - http://www.arduino.cc/ | ||
4 | |||
5 | Copyright (c) 2007 David A. Mellis | ||
6 | |||
7 | This library is free software; you can redistribute it and/or | ||
8 | modify it under the terms of the GNU Lesser General Public | ||
9 | License as published by the Free Software Foundation; either | ||
10 | version 2.1 of the License, or (at your option) any later version. | ||
11 | |||
12 | This library is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | Lesser General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU Lesser General | ||
18 | Public License along with this library; if not, write to the | ||
19 | Free Software Foundation, Inc., 59 Temple Place, Suite 330, | ||
20 | Boston, MA 02111-1307 USA | ||
21 | |||
22 | $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ | ||
23 | */ | ||
24 | |||
25 | #ifndef Pins_Arduino_h | ||
26 | #define Pins_Arduino_h | ||
27 | |||
28 | #include <avr/pgmspace.h> | ||
29 | |||
30 | #define NUM_DIGITAL_PINS 20 | ||
31 | #define NUM_ANALOG_INPUTS 6 | ||
32 | #define analogInputToDigitalPin(p) ((p < 6) ? (p) + 14 : -1) | ||
33 | |||
34 | #if defined(__AVR_ATmega8__) | ||
35 | #define digitalPinHasPWM(p) ((p) == 9 || (p) == 10 || (p) == 11) | ||
36 | #else | ||
37 | #define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11) | ||
38 | #endif | ||
39 | |||
40 | static const uint8_t SS = 10; | ||
41 | static const uint8_t MOSI = 11; | ||
42 | static const uint8_t MISO = 12; | ||
43 | static const uint8_t SCK = 13; | ||
44 | |||
45 | static const uint8_t SDA = 18; | ||
46 | static const uint8_t SCL = 19; | ||
47 | static const uint8_t LED_BUILTIN = 13; | ||
48 | |||
49 | static const uint8_t A0 = 14; | ||
50 | static const uint8_t A1 = 15; | ||
51 | static const uint8_t A2 = 16; | ||
52 | static const uint8_t A3 = 17; | ||
53 | static const uint8_t A4 = 18; | ||
54 | static const uint8_t A5 = 19; | ||
55 | static const uint8_t A6 = 20; | ||
56 | static const uint8_t A7 = 21; | ||
57 | |||
58 | #define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0)) | ||
59 | #define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1)) | ||
60 | #define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0)))) | ||
61 | #define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14))) | ||
62 | |||
63 | #ifdef ARDUINO_MAIN | ||
64 | |||
65 | // On the Arduino board, digital pins are also used | ||
66 | // for the analog output (software PWM). Analog input | ||
67 | // pins are a separate set. | ||
68 | |||
69 | // ATMEL ATMEGA8 & 168 / ARDUINO | ||
70 | // | ||
71 | // +-\/-+ | ||
72 | // PC6 1| |28 PC5 (AI 5) | ||
73 | // (D 0) PD0 2| |27 PC4 (AI 4) | ||
74 | // (D 1) PD1 3| |26 PC3 (AI 3) | ||
75 | // (D 2) PD2 4| |25 PC2 (AI 2) | ||
76 | // PWM+ (D 3) PD3 5| |24 PC1 (AI 1) | ||
77 | // (D 4) PD4 6| |23 PC0 (AI 0) | ||
78 | // VCC 7| |22 GND | ||
79 | // GND 8| |21 AREF | ||
80 | // PB6 9| |20 AVCC | ||
81 | // PB7 10| |19 PB5 (D 13) | ||
82 | // PWM+ (D 5) PD5 11| |18 PB4 (D 12) | ||
83 | // PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM | ||
84 | // (D 7) PD7 13| |16 PB2 (D 10) PWM | ||
85 | // (D 8) PB0 14| |15 PB1 (D 9) PWM | ||
86 | // +----+ | ||
87 | // | ||
88 | // (PWM+ indicates the additional PWM pins on the ATmega168.) | ||
89 | |||
90 | // ATMEL ATMEGA1280 / ARDUINO | ||
91 | // | ||
92 | // 0-7 PE0-PE7 works | ||
93 | // 8-13 PB0-PB5 works | ||
94 | // 14-21 PA0-PA7 works | ||
95 | // 22-29 PH0-PH7 works | ||
96 | // 30-35 PG5-PG0 works | ||
97 | // 36-43 PC7-PC0 works | ||
98 | // 44-51 PJ7-PJ0 works | ||
99 | // 52-59 PL7-PL0 works | ||
100 | // 60-67 PD7-PD0 works | ||
101 | // A0-A7 PF0-PF7 | ||
102 | // A8-A15 PK0-PK7 | ||
103 | |||
104 | |||
105 | // these arrays map port names (e.g. port B) to the | ||
106 | // appropriate addresses for various functions (e.g. reading | ||
107 | // and writing) | ||
108 | const uint16_t PROGMEM port_to_mode_PGM[] = { | ||
109 | NOT_A_PORT, | ||
110 | NOT_A_PORT, | ||
111 | (uint16_t) &DDRB, | ||
112 | (uint16_t) &DDRC, | ||
113 | (uint16_t) &DDRD, | ||
114 | }; | ||
115 | |||
116 | const uint16_t PROGMEM port_to_output_PGM[] = { | ||
117 | NOT_A_PORT, | ||
118 | NOT_A_PORT, | ||
119 | (uint16_t) &PORTB, | ||
120 | (uint16_t) &PORTC, | ||
121 | (uint16_t) &PORTD, | ||
122 | }; | ||
123 | |||
124 | const uint16_t PROGMEM port_to_input_PGM[] = { | ||
125 | NOT_A_PORT, | ||
126 | NOT_A_PORT, | ||
127 | (uint16_t) &PINB, | ||
128 | (uint16_t) &PINC, | ||
129 | (uint16_t) &PIND, | ||
130 | }; | ||
131 | |||
132 | const uint8_t PROGMEM digital_pin_to_port_PGM[] = { | ||
133 | PD, /* 0 */ | ||
134 | PD, | ||
135 | PD, | ||
136 | PD, | ||
137 | PD, | ||
138 | PD, | ||
139 | PD, | ||
140 | PD, | ||
141 | PB, /* 8 */ | ||
142 | PB, | ||
143 | PB, | ||
144 | PB, | ||
145 | PB, | ||
146 | PB, | ||
147 | PC, /* 14 */ | ||
148 | PC, | ||
149 | PC, | ||
150 | PC, | ||
151 | PC, | ||
152 | PC, | ||
153 | }; | ||
154 | |||
155 | const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { | ||
156 | _BV(0), /* 0, port D */ | ||
157 | _BV(1), | ||
158 | _BV(2), | ||
159 | _BV(3), | ||
160 | _BV(4), | ||
161 | _BV(5), | ||
162 | _BV(6), | ||
163 | _BV(7), | ||
164 | _BV(0), /* 8, port B */ | ||
165 | _BV(1), | ||
166 | _BV(2), | ||
167 | _BV(3), | ||
168 | _BV(4), | ||
169 | _BV(5), | ||
170 | _BV(0), /* 14, port C */ | ||
171 | _BV(1), | ||
172 | _BV(2), | ||
173 | _BV(3), | ||
174 | _BV(4), | ||
175 | _BV(5), | ||
176 | }; | ||
177 | |||
178 | const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { | ||
179 | NOT_ON_TIMER, /* 0 - port D */ | ||
180 | NOT_ON_TIMER, | ||
181 | NOT_ON_TIMER, | ||
182 | // on the ATmega168, digital pin 3 has hardware pwm | ||
183 | #if defined(__AVR_ATmega8__) | ||
184 | NOT_ON_TIMER, | ||
185 | #else | ||
186 | TIMER2B, | ||
187 | #endif | ||
188 | NOT_ON_TIMER, | ||
189 | // on the ATmega168, digital pins 5 and 6 have hardware pwm | ||
190 | #if defined(__AVR_ATmega8__) | ||
191 | NOT_ON_TIMER, | ||
192 | NOT_ON_TIMER, | ||
193 | #else | ||
194 | TIMER0B, | ||
195 | TIMER0A, | ||
196 | #endif | ||
197 | NOT_ON_TIMER, | ||
198 | NOT_ON_TIMER, /* 8 - port B */ | ||
199 | TIMER1A, | ||
200 | TIMER1B, | ||
201 | #if defined(__AVR_ATmega8__) | ||
202 | TIMER2, | ||
203 | #else | ||
204 | TIMER2A, | ||
205 | #endif | ||
206 | NOT_ON_TIMER, | ||
207 | NOT_ON_TIMER, | ||
208 | NOT_ON_TIMER, | ||
209 | NOT_ON_TIMER, /* 14 - port C */ | ||
210 | NOT_ON_TIMER, | ||
211 | NOT_ON_TIMER, | ||
212 | NOT_ON_TIMER, | ||
213 | NOT_ON_TIMER, | ||
214 | }; | ||
215 | |||
216 | #endif | ||
217 | |||
218 | #endif | ||