diff options
Diffstat (limited to 'tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex')
| -rw-r--r-- | tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.cpp | 52 | ||||
| -rw-r--r-- | tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.h | 82 | 
2 files changed, 134 insertions, 0 deletions
| diff --git a/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.cpp b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.cpp new file mode 100644 index 0000000000..7594e40473 --- /dev/null +++ b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.cpp @@ -0,0 +1,52 @@ +/* mbed Microcontroller Library - SerialHalfDuplex + * Copyright (c) 2010-2011 ARM Limited. All rights reserved. + */ +#include "SerialHalfDuplex.h" + +#if DEVICE_SERIAL + +#include "pinmap.h" +#include "serial_api.h" + +namespace mbed { + +SerialHalfDuplex::SerialHalfDuplex(PinName tx, PinName rx) +    : Serial(tx, rx) { + +    gpio_init(&gpio, tx, PIN_INPUT); +    gpio_mode(&gpio, PullNone); // no pull +} + +// To transmit a byte in half duplex mode: +// 1. Disable interrupts, so we don't trigger on loopback byte +// 2. Set tx pin to UART out +// 3. Transmit byte as normal +// 4. Read back byte from looped back tx pin - this both confirms that the +//    transmit has occurred, and also clears the byte from the buffer. +// 5. Return pin to input mode +// 6. Re-enable interrupts +int SerialHalfDuplex::_putc(int c) { +    int retc; + +    // TODO: We should not disable all interrupts +    __disable_irq(); + +    serial_pinout_tx(gpio.pin); + +    Serial::_putc(c); +    retc = Serial::getc();       // reading also clears any interrupt + +    pin_function(gpio.pin, 0); + +    __enable_irq(); + +    return retc; +} + +int SerialHalfDuplex::_getc(void) { +    return Serial::_getc(); +} + +} // End namespace + +#endif diff --git a/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.h b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.h new file mode 100644 index 0000000000..0ba13d38e5 --- /dev/null +++ b/tool/mbed/mbed-sdk/libraries/tests/libs/SerialHalfDuplex/SerialHalfDuplex.h @@ -0,0 +1,82 @@ +/* mbed Microcontroller Library - SerialHalfDuplex + * Copyright (c) 2010-2011 ARM Limited. All rights reserved. + */ +#ifndef MBED_SERIALHALFDUPLEX_H +#define MBED_SERIALHALFDUPLEX_H + +#include "platform.h" + +#if DEVICE_SERIAL + +#include "Serial.h" +#include "gpio_api.h" + +namespace mbed { + +/** A serial port (UART) for communication with other devices using + * Half-Duplex, allowing transmit and receive on a single + * shared transmit and receive line. Only one end should be transmitting + * at a time. + * + * Both the tx and rx pin should be defined, and wired together. + * This is in addition to them being wired to the other serial + * device to allow both read and write functions to operate. + * + *  For Simplex and Full-Duplex Serial communication, see Serial() + * + *  Example: + * @code + * // Send a byte to a second HalfDuplex device, and read the response + * + * #include "mbed.h" + * + * // p9 and p10 should be wired together to form "a" + * // p28 and p27 should be wired together to form "b" + * // p9/p10 should be wired to p28/p27 as the Half Duplex connection + * + * SerialHalfDuplex a(p9, p10); + * SerialHalfDuplex b(p28, p27); + * + * void b_rx() { // second device response + *     b.putc(b.getc() + 4); + * } + * + * int main() { + *     b.attach(&b_rx); + *     for (int c = 'A'; c < 'Z'; c++) { + *         a.putc(c); + *         printf("sent [%c]\n", c); + *         wait(0.5);   // b should respond + *         if (a.readable()) { + *             printf("received [%c]\n", a.getc()); + *         } + *     } + * } + * @endcode + */ +class SerialHalfDuplex : public Serial { + +public: +    /** Create a half-duplex serial port, connected to the specified transmit +     * and receive pins. +     * +     * These pins should be wired together, as well as to the target device +     * +     *  @param tx Transmit pin +     *  @param rx Receive pin +     */ +    SerialHalfDuplex(PinName tx, PinName rx); + +protected: +    gpio_object gpio; + +    virtual int _putc(int c); +    virtual int _getc(void); + +}; // End class SerialHalfDuplex + +} // End namespace + +#endif + +#endif | 
