forked SoftSerial
Fork of SoftSerial by
Revision 6:517082212c00, committed 2014-04-27
- Comitter:
- Sissors
- Date:
- Sun Apr 27 08:33:17 2014 +0000
- Parent:
- 5:acfd0329f648
- Child:
- 7:7de3e1019e23
- Commit message:
- Added custom ticker lib to allow for baudrate up to 57600
Changed in this revision
--- a/SoftSerial.cpp Sat Apr 26 20:55:02 2014 +0000
+++ b/SoftSerial.cpp Sun Apr 27 08:33:17 2014 +0000
@@ -7,11 +7,13 @@
tx_en = true;
tx->write(1);
tx_bit = -1;
+ txticker.attach(this, &SoftSerial::tx_handler);
}
if (RX != NC) {
rx = new InterruptIn(RX);
rx_en = true;
out_valid = false;
+ rxticker.attach(this, &SoftSerial::rx_handler);
rx->fall(this, &SoftSerial::rx_gpio_irq_handler);
}
--- a/SoftSerial.h Sat Apr 26 20:55:02 2014 +0000
+++ b/SoftSerial.h Sun Apr 27 08:33:17 2014 +0000
@@ -2,7 +2,7 @@
#define SOFTSERIAL_H
#include "mbed.h"
-
+#include "SoftSerial_Ticker.h"
/** A software serial implementation
*
*/
@@ -103,13 +103,12 @@
volatile int out_buffer;
volatile bool out_valid;
bool rx_error;
- Timeout rxout;
- Ticker rxticker;
+ FlexTicker rxticker;
//tx
void tx_handler(void);
void prepare_tx(int c);
- Timeout txout;
+ FlexTicker txticker;
int _char;
volatile int tx_bit;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SoftSerial_Ticker.h Sun Apr 27 08:33:17 2014 +0000
@@ -0,0 +1,38 @@
+//A modified version of the regular ticker/timeout libraries to allow us to do timeout without losing accuracy
+
+#ifndef FLEXTICKER_H
+#define FLEXTICKER_H
+
+#include "mbed.h"
+
+class FlexTicker: public TimerEvent {
+ public:
+ template<typename T>
+ void attach(T* tptr, void (T::*mptr)(void)) {
+ _function.attach(tptr, mptr);
+ }
+
+ /** Detach the function
+ */
+ void detach() {
+ remove();
+ }
+
+ void setNext(int delay) {
+ insert(event.timestamp + delay);
+ }
+
+ void prime(void) {
+ event.timestamp = us_ticker_read();
+ }
+
+protected:
+ virtual void handler() {
+ _function.call();
+ }
+
+ unsigned int _delay;
+ FunctionPointer _function;
+};
+
+#endif
\ No newline at end of file
--- a/SoftSerial_rx.cpp Sat Apr 26 20:55:02 2014 +0000
+++ b/SoftSerial_rx.cpp Sun Apr 27 08:33:17 2014 +0000
@@ -12,16 +12,15 @@
//Start receiving byte
void SoftSerial::rx_gpio_irq_handler(void) {
- rxout.attach_us(this, &SoftSerial::rx_handler, bit_period + (bit_period >> 1)); //Start reading first data byte
+ rxticker.prime();
+ rxticker.setNext(bit_period + (bit_period >> 1));
rx->fall(NULL);
rx_bit = 0;
rx_error = false;
};
void SoftSerial::rx_handler(void) {
- if (!rx_bit)
- rxticker.attach_us(this, &SoftSerial::rx_handler, bit_period);
-
+ rxticker.setNext(bit_period);
rx_bit++;
//Receive data
--- a/SoftSerial_tx.cpp Sat Apr 26 20:55:02 2014 +0000
+++ b/SoftSerial_tx.cpp Sun Apr 27 08:33:17 2014 +0000
@@ -5,6 +5,7 @@
while(!writeable());
prepare_tx(c);
tx_bit = 0;
+ txticker.prime();
tx_handler();
return 0;
}
@@ -38,7 +39,7 @@
tx_bit++;
}
- txout.attach_us(this, &SoftSerial::tx_handler, count);
+ txticker.setNext(count);
}
void SoftSerial::prepare_tx(int c)
