adapted to Keil uVision

Dependents:   RT_CAN

Fork of MODSERIAL by Andy K

Files at this revision

API Documentation at this revision

Comitter:
JavierGC
Date:
Sun May 05 16:35:49 2013 +0000
Parent:
25:ae0408ebdd68
Commit message:
JGCtoGdT

Changed in this revision

INIT.cpp Show diff for this revision Revisions of this file
MODSERIAL_INIT.cpp Show annotated file Show diff for this revision Revisions of this file
example1.cpp Show diff for this revision Revisions of this file
example2.cpp Show diff for this revision Revisions of this file
example3a.cpp Show diff for this revision Revisions of this file
example3b.cpp Show diff for this revision Revisions of this file
example_dma.cpp Show diff for this revision Revisions of this file
--- a/INIT.cpp	Tue Jan 08 18:01:03 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
-    Copyright (c) 2010 Andy Kirkham
- 
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
- 
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
- 
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-*/
-
-#include "MODSERIAL.h"
-#include "MACROS.h"
-
-
-namespace AjK {
-
-void
-MODSERIAL::init( int txSize, int rxSize, PinName rx )
-{
-    disableIrq();
-    
-    callbackInfo.setSerial(this);
-
-#ifdef __LPC11UXX_H__
-
-    _base = LPC_USART;
-    
-#else    
-    switch( _serial.index ) {
-        case 0: _base = LPC_UART0; break;
-        case 1: _base = LPC_UART1; break;
-        case 2: _base = LPC_UART2; break;
-        case 3: _base = LPC_UART3; break;
-        default: _base = NULL;      break;
-    }
-#endif
-    
-    dmaSendChannel  = -1;
-    moddma_p        = (void *)NULL;
-    
-    if ( _base != NULL ) {
-        buffer_size[RxIrq]     = rxSize;
-        buffer[RxIrq]          = rxSize > 0 ? (char *)malloc(buffer_size[RxIrq]) : (char *)NULL;
-        buffer_in[RxIrq]       = 0;
-        buffer_out[RxIrq]      = 0;
-        buffer_count[RxIrq]    = 0;
-        buffer_overflow[RxIrq] = 0;
-        Serial::attach( this, &MODSERIAL::isr_rx, Serial::RxIrq );        
-        
-        buffer_size[TxIrq]     = txSize;
-        buffer[TxIrq]          = txSize > 0 ? (char *)malloc(buffer_size[TxIrq]) : (char *)NULL;
-        buffer_in[TxIrq]       = 0;
-        buffer_out[TxIrq]      = 0;
-        buffer_count[TxIrq]    = 0;
-        buffer_overflow[TxIrq] = 0;
-        Serial::attach( this, &MODSERIAL::isr_tx, Serial::TxIrq );
-    }
-    else {
-        error("MODSERIAL must have a defined UART to function.");
-    }
-    
-    _FCR = MODSERIAL_FIFO_ENABLE | MODSERIAL_FIFO_RX_RESET | MODSERIAL_FIFO_TX_RESET;
-    
-    auto_detect_char = 0;
-    
-    enableIrq();
-}
-
-}; // namespace AjK ends
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MODSERIAL_INIT.cpp	Sun May 05 16:35:49 2013 +0000
@@ -0,0 +1,81 @@
+/*
+    Copyright (c) 2010 Andy Kirkham
+ 
+    Permission is hereby granted, free of charge, to any person obtaining a copy
+    of this software and associated documentation files (the "Software"), to deal
+    in the Software without restriction, including without limitation the rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+ 
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+ 
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+*/
+
+#include "MODSERIAL.h"
+#include "MACROS.h"
+
+
+namespace AjK {
+
+void
+MODSERIAL::init( int txSize, int rxSize, PinName rx )
+{
+    disableIrq();
+    
+    callbackInfo.setSerial(this);
+
+#ifdef __LPC11UXX_H__
+
+    _base = LPC_USART;
+    
+#else    
+    switch( _serial.index ) {
+        case 0: _base = LPC_UART0; break;
+        case 1: _base = LPC_UART1; break;
+        case 2: _base = LPC_UART2; break;
+        case 3: _base = LPC_UART3; break;
+        default: _base = NULL;      break;
+    }
+#endif
+    
+    dmaSendChannel  = -1;
+    moddma_p        = (void *)NULL;
+    
+    if ( _base != NULL ) {
+        buffer_size[RxIrq]     = rxSize;
+        buffer[RxIrq]          = rxSize > 0 ? (char *)malloc(buffer_size[RxIrq]) : (char *)NULL;
+        buffer_in[RxIrq]       = 0;
+        buffer_out[RxIrq]      = 0;
+        buffer_count[RxIrq]    = 0;
+        buffer_overflow[RxIrq] = 0;
+        Serial::attach( this, &MODSERIAL::isr_rx, Serial::RxIrq );        
+        
+        buffer_size[TxIrq]     = txSize;
+        buffer[TxIrq]          = txSize > 0 ? (char *)malloc(buffer_size[TxIrq]) : (char *)NULL;
+        buffer_in[TxIrq]       = 0;
+        buffer_out[TxIrq]      = 0;
+        buffer_count[TxIrq]    = 0;
+        buffer_overflow[TxIrq] = 0;
+        Serial::attach( this, &MODSERIAL::isr_tx, Serial::TxIrq );
+    }
+    else {
+        error("MODSERIAL must have a defined UART to function.");
+    }
+    
+    _FCR = MODSERIAL_FIFO_ENABLE | MODSERIAL_FIFO_RX_RESET | MODSERIAL_FIFO_TX_RESET;
+    
+    auto_detect_char = 0;
+    
+    enableIrq();
+}
+
+}; // namespace AjK ends
--- a/example1.cpp	Tue Jan 08 18:01:03 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-#ifdef COMPILE_EXAMPLE1_CODE_MODSERIAL
-
-/*
- * To run this test program, link p9 to p10 so the Serial loops
- * back and receives characters it sends.
- */
- 
-#include "mbed.h"
-#include "MODSERIAL.h"
-
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-DigitalOut led4(LED4);
-
-MODSERIAL pc(USBTX, USBRX);
-
-/*
- * As experiement, you can define MODSERIAL as show here and see what
- * effects it has on the LEDs.
- *
- * MODSERIAL uart(TX_PIN, RX_PIN, 512);
- *   With this, the 512 characters sent can straight into the buffer
- *   vary quickly. This means LED1 is only on briefly as the TX buffer
- *   fills.
- *
- * MODSERIAL uart(TX_PIN, RX_PIN, 32);
- *   With this, the buffer is smaller than the default 256 bytes and
- *   therefore LED1 stays on much longer while the system waits for
- *   room in the TX buffer.
- */
-MODSERIAL uart(TX_PIN, RX_PIN);
-
-// This function is called when a character goes from the TX buffer
-// to the Uart THR FIFO register.
-void txCallback(MODSERIAL_IRQ_INFO *q) {
-    led2 = !led2;
-}
-
-// This function is called when TX buffer goes empty
-void txEmpty(MODSERIAL_IRQ_INFO *q) {
-    led2 = 0;
-    pc.puts(" Done. ");
-}
-
-// This function is called when a character goes into the RX buffer.
-void rxCallback(MODSERIAL_IRQ_INFO *q) {
-    led3 = !led3;
-    pc.putc(uart.getc());
-}
-
-int main() {
-    int c = 'A';
-    
-    // Ensure the baud rate for the PC "USB" serial is much
-    // higher than "uart" baud rate below.
-    pc.baud(PC_BAUD);
-    
-    // Use a deliberatly slow baud to fill up the TX buffer
-    uart.baud(1200);
-    
-    uart.attach(&txCallback, MODSERIAL::TxIrq);
-    uart.attach(&rxCallback, MODSERIAL::RxIrq);
-    uart.attach(&txEmpty,    MODSERIAL::TxEmpty);
-    
-    // Loop sending characters. We send 512
-    // which is twice the default TX/RX buffer size.
-    
-    led1 = 1; // Show start of sending with LED1.
-    
-    for (int loop = 0; loop < 512; loop++) {
-        uart.printf("%c", c);        
-        c++;
-        if (c > 'Z') c = 'A';
-    }
-    
-    led1 = 0; // Show the end of sending by switching off LED1.
-    
-    // End program. Flash LED4. Notice how LED 2 and 3 continue
-    // to flash for a short period while the interrupt system 
-    // continues to send the characters left in the TX buffer.
-    
-    while(1) {
-        led4 = !led4;
-        wait(0.25);
-    }
-}
-
-/*
- * Notes. Here is the sort of output you can expect on your PC/Mac/Linux host
- * machine that is connected to the "pc" USB serial port.
- *
- * ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUV
- * WXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQR
- * STUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN
- * OPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJ
- * KLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
- * GHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB
- * CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ Done. R
- *
- * Of interest is that last "R" character after the system has said "Done."
- * This comes from the fact that the TxEmpty callback is made when the TX buffer
- * becomes empty. MODSERIAL makes use of the fact that the Uarts built into the 
- * LPC17xx device use a 16 byte FIFO on both RX and TX channels. This means that
- * when the TxEmpty callback is made, the TX buffer is empty, but that just means
- * the "last few characters" were written to the TX FIFO. So although the TX
- * buffer has gone empty, the Uart's transmit system is still sending any remaining
- * characters from it's TX FIFO. If you want to be truely sure all the characters
- * you have sent have left the Mbed then call txIsBusy(); This function will
- * return true if characters are still being sent. If it returns false after
- * the Tx buffer is empty then all your characters have been sent.
- *
- * In a similar way, when characters are received into the RX FIFO, the entire
- * FIFO contents is moved to the RX buffer, assuming there is room left in the
- * RX buffer. If there is not, any remaining characters are left in the RX FIFO
- * and will be moved to the RX buffer on the next interrupt or when the running 
- * program removes a character(s) from the RX buffer with the getc() method.
- */
- 
-#endif
--- a/example2.cpp	Tue Jan 08 18:01:03 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,167 +0,0 @@
-/*
-    Copyright (c) 2011 Andy Kirkham
- 
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
- 
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
- 
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-    
-    @file          example2.cpp 
-    @purpose       Demos a simple messaging system.
-    @version       see ChangeLog.c
-    @date          Jan 2011
-    @author        Andy Kirkham
-*/
-
-/*
-    This example demostrates a simple "messaging" system. You can use it with
-    a terminal program to test it out or write a cusom C#/C++/VB/etc program
-    to read and write messages to or from the Mbed. The default baud rate in
-    this example is 115200.
-    
-    In this example, the LEDs are controlled and pins p21 to p24 are set as
-    InterruptIn and send messages out when their value changes.
-    
-    To use, hook up the MBed USB and open your fav terminal. All messages
-    end with the \n character, don't forget to hit carriage return!. 
-    As an example:-
-        
-        to switch on LED1 send LED1:1\n, off is LED1:0\n and toggle is LED1:2\n
-        to switch on LED2 send LED2:1\n, off is LED2:0\n and toggle is LED2:2\n
-        to switch on LED3 send LED3:1\n, off is LED3:0\n and toggle is LED3:2\n
-        to switch on LED4 send LED4:1\n, off is LED4:0\n and toggle is LED4:2\n
-        
-    When a pin change on p21 to p24 happens, a message is sent. As an example
-    when p21 goes low PIN21:0\n is sent, when goes high PIN21:1\n is sent.
-    
-    Note, the InterruptIn pins p21 to p24 are setup to have pullups. This means
-    they are high. To activate them use a wire to short the pin to 0volts.
-    
-    If you find that p21 to p24 sent a lot of on/off/on/off then it's probably
-    due to "bounce". If you are connecting a mechanical switch to a pin you
-    may prefer to use the PinDetect library rather than using InterruptIn.
-    @see http://mbed.org/users/AjK/libraries/PinDetect/latest
-    
-    One point you may notice. Incoming messages are processed via main()'s
-    while(1) loop whereas pin changes have their messages directly sent.
-    The reason for this is when MODSERIAL makes callbacks to your application
-    it is in "interrupt context". And one thing you want to avoid is spending
-    lots of CPU time in that context. So, the callback moves the message from
-    the input buffer to a local holding buffer and it then sets a bool flag
-    which tells main()'s while(1) loop to process that buffer. This means the 
-    time spent doing the real incoming message handing is within your program
-    and not within MODSERIAL's interrupt context. So you may ask, why not do
-    the same for out going messages? Well, because MODSERIAL output buffers
-    all your sent content then sending chars is very fast. MODSERIAL handles
-    all the nitty gritty bits for you. You can just send. This example uses
-    puts() to send the message. If you can, always try and use sprintf()+puts()
-    rathe than printf(), printf() is known to often screw things up when used
-    within an interrupt context. Better still, just use puts() and do away
-    with any of the crappy ?printf() calls if possible. But I found the code
-    below to work fine even at 115200baud.
-    
-*/
-
-
-#ifdef COMPILE_EXAMPLE1_CODE_MODSERIAL
-
-#include "mbed.h"
-#include "MODSERIAL.h"
-
-#define MESSAGE_BUFFER_SIZE 32
-
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-DigitalOut led4(LED4);
-
-InterruptIn P21(p21);
-InterruptIn P22(p22);
-InterruptIn P23(p23);
-InterruptIn P24(p24);
-
-MODSERIAL messageSystem(USBTX, USBRX);
-
-char messageBufferIncoming[MESSAGE_BUFFER_SIZE];
-char messageBufferOutgoing[MESSAGE_BUFFER_SIZE];
-bool messageReceived;
-
-void messageReceive(MODSERIAL_IRQ_INFO *q) {
-    MODSERIAL *sys = q->serial;
-    sys->move(messageBufferIncoming, MESSAGE_BUFFER_SIZE);
-    messageReceived = true;
-    return 0;
-}
-
-void messageProcess(void) {
-         if (!strncmp(messageBufferIncoming, "LED1:1", sizeof("LED1:1")-1)) led1 = 1;
-    else if (!strncmp(messageBufferIncoming, "LED1:0", sizeof("LED1:0")-1)) led1 = 0;
-    else if (!strncmp(messageBufferIncoming, "LED1:2", sizeof("LED1:2")-1)) led1 = !led1;
-    
-    else if (!strncmp(messageBufferIncoming, "LED2:1", sizeof("LED2:1")-1)) led2 = 1;
-    else if (!strncmp(messageBufferIncoming, "LED2:0", sizeof("LED2:0")-1)) led2 = 0;
-    else if (!strncmp(messageBufferIncoming, "LED2:2", sizeof("LED2:2")-1)) led2 = !led2;
-    
-    else if (!strncmp(messageBufferIncoming, "LED3:1", sizeof("LED3:1")-1)) led3 = 1;
-    else if (!strncmp(messageBufferIncoming, "LED3:0", sizeof("LED3:0")-1)) led3 = 0;
-    else if (!strncmp(messageBufferIncoming, "LED3:2", sizeof("LED3:2")-1)) led3 = !led3;
-    
-    else if (!strncmp(messageBufferIncoming, "LED4:1", sizeof("LED4:1")-1)) led4 = 1;
-    else if (!strncmp(messageBufferIncoming, "LED4:0", sizeof("LED4:0")-1)) led4 = 0;
-    else if (!strncmp(messageBufferIncoming, "LED4:2", sizeof("LED4:2")-1)) led4 = !led4;
-    
-    messageReceived = false;
-}
-
-#define PIN_MESSAGE_SEND(x,y) \
-    sprintf(messageBufferOutgoing,"PIN%02d:%d\n",x,y);\
-    messageSystem.puts(messageBufferOutgoing);
-
-void pin21Rise(void) { PIN_MESSAGE_SEND(21, 1); }
-void pin21Fall(void) { PIN_MESSAGE_SEND(21, 0); }
-void pin22Rise(void) { PIN_MESSAGE_SEND(22, 1); }
-void pin22Fall(void) { PIN_MESSAGE_SEND(22, 0); }
-void pin23Rise(void) { PIN_MESSAGE_SEND(23, 1); }
-void pin23Fall(void) { PIN_MESSAGE_SEND(23, 0); }
-void pin24Rise(void) { PIN_MESSAGE_SEND(24, 1); }
-void pin24Fall(void) { PIN_MESSAGE_SEND(24, 0); }
-
-int main() {
-
-    messageReceived = false;
-    messageSystem.baud(115200);
-    messageSystem.attach(&messageReceive, MODSERIAL::RxAutoDetect);
-    messageSystem.autoDetectChar('\n'); 
-
-    // Enable pullup resistors on pins.
-    P21.mode(PullUp); P22.mode(PullUp); P23.mode(PullUp); P24.mode(PullUp);
-    
-    // Fix Mbed library bug, see http://mbed.org/forum/bugs-suggestions/topic/1498
-    LPC_GPIOINT->IO2IntClr = (1UL << 5) | (1UL << 4) | (1UL << 3) | (1UL << 2); 
-    
-    // Attach InterruptIn pin callbacks.
-    P21.rise(&pin21Rise); P21.fall(&pin21Fall);
-    P22.rise(&pin22Rise); P22.fall(&pin22Fall);
-    P23.rise(&pin23Rise); P23.fall(&pin23Fall);
-    P24.rise(&pin24Rise); P24.fall(&pin24Fall);
-    
-    while(1) {
-        // Process incoming messages.
-        if (messageReceived) messageProcess();
-    }
-}
-
-#endif
--- a/example3a.cpp	Tue Jan 08 18:01:03 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
-    Copyright (c) 2011 Andy Kirkham
- 
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
- 
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
- 
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-    
-    @file          example3.cpp 
-    @purpose       Demos a simple filter.
-    @version       see ChangeLog.c
-    @author        Andy Kirkham
-*/
-
-/*
-    This example shows how to use the new callback system. In the old system
-    Mbed's FunctionPointer[1] type was used to store abd make calls to callbacks.
-    However, that limits the callback function prototype to void func(void);
-    which means we cannot pass parameters.
-    
-    This latest version of MODSERIAL now uses its own callback object. This allows
-    the passing of a pointer to a class that holds information about the MODSERIAL
-    object making the callback. As of version 1.18 one critcal piece of information
-    is passed, a pointer to the MODSERIAL object. This allows callbacks to use the
-    MODSERIAL functions and data.
-        
-    Additionally, since MODSERIAL and the callback parameter class MODSERIAL_IRQ_INFO
-    are friends, MODSERIAL_IRQ_INFO can access the protected functions of MODSERIAL.
-    This is used to ensure functions that can only be called during a callback
-    can be invoked from a callback. 
-    
-    [1] http://mbed.org/projects/libraries/svn/mbed/trunk/FunctionPointer.h    
-*/
-
-#ifdef COMPILE_EXAMPLE3_CODE_MODSERIAL
-
-#include "mbed.h"
-#include "MODSERIAL.h"
-
-DigitalOut led1(LED1);
-
-MODSERIAL pc(USBTX, USBRX);
-
-// The following callback is defined in example3b.cpp
-//! @see example3b.cpp
-void rxCallback(MODSERIAL_IRQ_INFO *info);
-
-int main() {
-    
-    int life_counter = 0;
-    
-    pc.baud(115200);
-    
-    pc.attach(&rxCallback, MODSERIAL::RxIrq);
-
-    while(1) {
-        // Echo back any chars we get except 'A' which is filtered by the rxCallback.
-        if (pc.readable()) {
-            pc.putc(pc.getc());
-        }
-        
-        // Toggle LED1 every so often to show we are alive.
-        if (life_counter++ == 1000000) {
-            life_counter = 0;
-            led1 = !led1;
-        }
-    }
-}
-
-#endif
--- a/example3b.cpp	Tue Jan 08 18:01:03 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/*
-    Copyright (c) 2011 Andy Kirkham
- 
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
- 
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
- 
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-    
-    @file          example3b.cpp 
-    @purpose       Demos a simple filter.
-    @version       see ChangeLog.c
-    @author        Andy Kirkham
-*/
-
-/*
-    This example shows how to use the new callback system. In the old system
-    Mbed's FunctionPointer[1] type was used to store abd make calls to callbacks.
-    However, that limits the callback function prototype to void func(void);
-    which means we cannot pass parameters.
-    
-    This latest version of MODSERIAL now uses its own callback object. This allows
-    the passing of a pointer to a class that holds information about the MODSERIAL
-    object making the callback. As of version 1.18 one critcal piece of information
-    is passed, a pointer to the MODSERIAL object. This allows callbacks to use the
-    MODSERIAL functions and data.
-        
-    Additionally, since MODSERIAL and the callback parameter class MODSERIAL_IRQ_INFO
-    are friends, MODSERIAL_IRQ_INFO can access the protected functions of MODSERIAL.
-    This is used to ensure functions that can only be called during a callback
-    can be invoked from a callback. 
-    
-    [1] http://mbed.org/projects/libraries/svn/mbed/trunk/FunctionPointer.h    
-*/
-
-
-#ifdef COMPILE_EXAMPLE3_CODE_MODSERIAL
-
-#include "mbed.h"
-#include "MODSERIAL.h"
-
-void rxCallback(MODSERIAL_IRQ_INFO *info) {
-
-    // Get the pointer to our MODSERIAL object that invoked this callback.
-    MODSERIAL *pc = info->serial;
-    
-    // info->serial points at the MODSERIAL instance so we can use it to call
-    // any of the public MODSERIAL functions that are normally available. So
-    // there's now no need to use the global version (pc in our case) inside
-    // callback functions.    
-    char c = pc->rxGetLastChar(); // Where local pc variable is a pointer to the global MODSERIAL pc object.
-    
-    // The following is rather daft but demos the point.
-    // Don't allow the letter "A" go into the RX buffer.
-    // Basically acts as a filter to remove the letter "A" 
-    // if it goes into the RX buffer.
-    if (c == 'A') {
-        // Note, we call the MODSERIAL_IRQ_INFO::rxDiscardLastChar() public function which
-        // is permitted access to the protected version of MODSERIAL::rxDiscardLastChar()
-        // within MODSERIAL (because they are friends). This ensures rxDiscardLastChar()
-        // can only be called within an rxCallback function. 
-        info->rxDiscardLastChar(); 
-    }
-}
-
-#endif
--- a/example_dma.cpp	Tue Jan 08 18:01:03 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-#ifdef COMPILE_EXAMPLE_CODE_MODSERIAL_MODDMA
-
-/*
- * To run this test program, link p9 to p10 so the Serial loops
- * back and receives characters it sends.
- */
- 
-#include "mbed.h"
-
-/* Note, this example requires that you also import into the Mbed
-   compiler the MODDMA project as well as MODSERIAL
-   http://mbed.org/users/AjK/libraries/MODDMA/latest 
-   MODDMA.h MUST come before MODSERIAL.h */
-#include "MODDMA.h"     // <--- Declare first
-#include "MODSERIAL.h"  // Flollowed by MODSERIAL
-
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-DigitalOut led3(LED3);
-DigitalOut led4(LED4);
-
-MODSERIAL pc(USBTX, USBRX);
-
-/*
- * As experiement, you can define MODSERIAL as show here and see what
- * effects it has on the LEDs.
- *
- * MODSERIAL uart(TX_PIN, RX_PIN, 512);
- *   With this, the 512 characters sent can straight into the buffer
- *   vary quickly. This means LED1 is only on briefly as the TX buffer
- *   fills.
- *
- * MODSERIAL uart(TX_PIN, RX_PIN, 32);
- *   With this, the buffer is smaller than the default 256 bytes and
- *   therefore LED1 stays on much longer while the system waits for
- *   room in the TX buffer.
- */
-MODSERIAL uart(TX_PIN, RX_PIN);
-
-MODDMA dma;
-
-// This function is called when a character goes from the TX buffer
-// to the Uart THR FIFO register.
-void txCallback(void) {
-    led2 = !led2;
-}
-
-// This function is called when TX buffer goes empty
-void txEmpty(void) {
-    led2 = 0;
-    pc.puts(" Done. ");
-}
-
-void dmaComplete(void) {
-    led1 = 1;
-}
-
-// This function is called when a character goes into the RX buffer.
-void rxCallback(void) {
-    led3 = !led3;
-    pc.putc(uart.getc());
-}
-
-int main() {
-    char s1[] = " *DMA* *DMA* *DMA* *DMA* *DMA* *DMA* *DMA* ";
-    int c = 'A';
-    
-    // Tell MODSERIAL where the MODDMA controller is.
-    pc.MODDMA( &dma );
-    
-    // Ensure the baud rate for the PC "USB" serial is much
-    // higher than "uart" baud rate below.
-    pc.baud( PC_BAUD );
-    
-    // Use a deliberatly slow baud to fill up the TX buffer
-    uart.baud(1200);
-    
-    uart.attach( &txCallback, MODSERIAL::TxIrq );
-    uart.attach( &rxCallback, MODSERIAL::RxIrq );
-    uart.attach( &txEmpty,    MODSERIAL::TxEmpty );
-    
-    // Loop sending characters. We send 512
-    // which is twice the default TX/RX buffer size.
-    
-    led1 = 0;
-    
-    // Send the buffer s using DMA channel 7
-    pc.attach_dmaSendComplete( &dmaComplete );
-    pc.dmaSend( s1, sizeof(s1), MODDMA::Channel_7 );
-    
-    for (int loop = 0; loop < 512; loop++) {
-        uart.printf("%c", c);        
-        c++;
-        if (c > 'Z') c = 'A';
-    }
-    
-    led1 = 0; // Show the end of sending by switching off LED1.
-    
-    // End program. Flash LED4. Notice how LED 2 and 3 continue
-    // to flash for a short period while the interrupt system 
-    // continues to send the characters left in the TX buffer.
-    
-    while(1) {
-        led4 = !led4;
-        wait(0.25);
-    }
-}
-
-/*
- * Notes. Here is the sort of output you can expect on your PC/Mac/Linux host
- * machine that is connected to the "pc" USB serial port.
- *
- *  *DMA* *DMA* *DMA* *DMA* *DMA* *DMA* *DMA* ABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
- * FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA
- * BCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW
- * XYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRS
- * TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNO
- * PQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJK
- * LMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
- * HIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQ Done. R
- *
- * Note how the DMA blocks the TX buffer sending under standard interrupt control.
- * Not until the DMA transfer is complete will "normal" buffered TX sending resume.
- *
- * Of interest is that last "R" character after the system has said "Done."
- * This comes from the fact that the TxEmpty callback is made when the TX buffer
- * becomes empty. MODSERIAL makes use of the fact that the Uarts built into the 
- * LPC17xx device use a 16 byte FIFO on both RX and TX channels. This means that
- * when the TxEmpty callback is made, the TX buffer is empty, but that just means
- * the "last few characters" were written to the TX FIFO. So although the TX
- * buffer has gone empty, the Uart's transmit system is still sending any remaining
- * characters from it's TX FIFO. If you want to be truely sure all the characters
- * you have sent have left the Mbed then call txIsBusy(); This function will
- * return true if characters are still being sent. If it returns false after
- * the Tx buffer is empty then all your characters have been sent.
- *
- * In a similar way, when characters are received into the RX FIFO, the entire
- * FIFO contents is moved to the RX buffer, assuming there is room left in the
- * RX buffer. If there is not, any remaining characters are left in the RX FIFO
- * and will be moved to the RX buffer on the next interrupt or when the running 
- * program removes a character(s) from the RX buffer with the getc() method.
- */
- 
-#endif