diff options
author | Zach Eveland <zeveland@blacklabel-development.com> | 2011-09-05 12:53:45 -0400 |
---|---|---|
committer | Zach Eveland <zeveland@blacklabel-development.com> | 2011-09-05 12:53:45 -0400 |
commit | 280f381265f8b8e339c92cbcb95d09cec1ec2f19 (patch) | |
tree | 157b6b2894b97287414d589f6699f22083b507f2 /cores/arduino/HardwareSerial.cpp | |
parent | 90ea0707e6e3fb251b3eaf6c8682f68dd44299e1 (diff) | |
parent | 560a510f6434efdfa0ebcfa9cd01093714e37f43 (diff) |
Merge branch 'new-extension' of https://github.com/arduino/Arduino into new-extension
Conflicts:
build/macosx/dist/tools-universal.zip
build/windows/avr_tools.zip
hardware/arduino/cores/arduino/HardwareSerial.cpp
Diffstat (limited to 'cores/arduino/HardwareSerial.cpp')
-rw-r--r-- | cores/arduino/HardwareSerial.cpp | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp index 48f5fd3..a31b266 100644 --- a/cores/arduino/HardwareSerial.cpp +++ b/cores/arduino/HardwareSerial.cpp @@ -95,6 +95,8 @@ inline void store_char(unsigned char c, ring_buffer *buffer) #else void serialEvent() __attribute__((weak)); void serialEvent() {} + volatile static unsigned char serialEvent_flag = 0; + #define serialEvent_implemented #if defined(USART_RX_vect) SIGNAL(USART_RX_vect) #elif defined(SIG_USART0_RECV) @@ -115,7 +117,7 @@ inline void store_char(unsigned char c, ring_buffer *buffer) #error UDR not defined #endif store_char(c, &rx_buffer); - serialEvent(); + serialEvent_flag = 1; } #endif #endif @@ -123,11 +125,13 @@ inline void store_char(unsigned char c, ring_buffer *buffer) #if defined(USART1_RX_vect) void serialEvent1() __attribute__((weak)); void serialEvent1() {} + volatile static unsigned char serialEvent1_flag = 0; + #define serialEvent1_implemented SIGNAL(USART1_RX_vect) { unsigned char c = UDR1; store_char(c, &rx_buffer1); - serialEvent1(); + serialEvent1_flag = 1; } #elif defined(SIG_USART1_RECV) #error SIG_USART1_RECV @@ -136,11 +140,13 @@ inline void store_char(unsigned char c, ring_buffer *buffer) #if defined(USART2_RX_vect) && defined(UDR2) void serialEvent2() __attribute__((weak)); void serialEvent2() {} + volatile static unsigned char serialEvent2_flag = 0; + #define serialEvent2_implemented SIGNAL(USART2_RX_vect) { unsigned char c = UDR2; store_char(c, &rx_buffer2); - serialEvent2(); + serialEvent2_flag = 1; } #elif defined(SIG_USART2_RECV) #error SIG_USART2_RECV @@ -149,19 +155,62 @@ inline void store_char(unsigned char c, ring_buffer *buffer) #if defined(USART3_RX_vect) && defined(UDR3) void serialEvent3() __attribute__((weak)); void serialEvent3() {} + volatile static unsigned char serialEvent3_flag = 0; + #define serialEvent3_implemented SIGNAL(USART3_RX_vect) { unsigned char c = UDR3; store_char(c, &rx_buffer3); - serialEvent3(); + serialEvent3_flag = 1; } #elif defined(SIG_USART3_RECV) #error SIG_USART3_RECV #endif +<<<<<<< HEAD #if !defined(USART0_UDRE_vect) && defined(USART1_UDRE_vect) // do nothing - on the 32u4 the first USART is USART1 #else +======= +void serialEventRun(void) +{ + unsigned char flag, oldSREG; +#ifdef serialEvent_implemented + oldSREG = SREG; + noInterrupts(); + flag = serialEvent_flag; + serialEvent_flag = 0; + SREG = oldSREG; + if (flag) serialEvent(); +#endif +#ifdef serialEvent1_implemented + oldSREG = SREG; + noInterrupts(); + flag = serialEvent1_flag; + serialEvent1_flag = 0; + SREG = oldSREG; + if (flag) serialEvent1(); +#endif +#ifdef serialEvent2_implemented + oldSREG = SREG; + noInterrupts(); + flag = serialEvent2_flag; + serialEvent2_flag = 0; + SREG = oldSREG; + if (flag) serialEvent2(); +#endif +#ifdef serialEvent3_implemented + oldSREG = SREG; + noInterrupts(); + flag = serialEvent3_flag; + serialEvent3_flag = 0; + SREG = oldSREG; + if (flag) serialEvent3(); +#endif +} + + +>>>>>>> 0c92f230b5202b241de875a3baff9dfd1cf7a618 #if !defined(UART0_UDRE_vect) && !defined(UART_UDRE_vect) && !defined(USART0_UDRE_vect) && !defined(USART_UDRE_vect) #error Don't know what the Data Register Empty vector is called for the first UART #else |