Andriy Makukha / Mbed 2 deprecated football_project_wo_output

Dependencies:   mbed

Fork of football_project by MZJ

Revision:
8:d5d055be2bb8
Parent:
7:205ef63d311a
Child:
9:95dc84e9fb7f
diff -r 205ef63d311a -r d5d055be2bb8 io/MySerial.cpp
--- a/io/MySerial.cpp	Fri Apr 17 22:12:43 2015 +0000
+++ b/io/MySerial.cpp	Sat Apr 18 22:14:18 2015 +0000
@@ -14,14 +14,15 @@
 {
     void pin_mode( PinName, PinMode );
 
-    void UART0_My_IRQHandler();  // Rename to UART0_IRQHandler once serial_api.c excludes in lib rebuild.
+    void UART0_IRQHandler();  // Make sure UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+                              // TODO Maybe move all serial_api.c workarounds into serial_api.c
 }
 
 extern int stdio_uart_inited;
 extern serial_t stdio_uart;
 
 // Our versions of serial_api.c's...
-// (serial_free(), etc. in serial_api.c won't work wehn we use our own copy.)
+// (serial_free(), etc. in serial_api.c won't work when use our own copy.)  TODO Maybe make one in serial_api.c accessible.
 #define UART_NUM    1
 static uint32_t serial_irq_ids[UART_NUM] = {0};
 static uart_irq_handler irq_handler;
@@ -34,15 +35,16 @@
                             PinName rts, PinName cts ) : _my_serial(), _my_baud( 9600 )
 {
     my_serial_init( &_my_serial, tx, rx, rts, cts, _my_baud );
-    serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this );  // serial_api.c only calls handler for Tx & Rx.
+//    serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this );  // serial_api.c only calls handler for Tx & Rx.
 
-    // Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-//    my_serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this );
+    // Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+    my_serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this );
 
-    // For cts         -- Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-//    attach( this, &MySerialBase::cts_handler, (Serial::IrqType)CtsIrq );
-    // For uart errors -- Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-//    attach( this, &MySerialBase::error_handler, (Serial::IrqType)ErrIrq );
+    // For uart errors -- Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+    attach( this, &MySerialBase::error_handler, (Serial::IrqType)ErrIrq );
+    // For cts         -- Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+    attach( this, &MySerialBase::ncts_handler, (Serial::IrqType)NctsIrq );
+    attach( this, &MySerialBase::cts_handler, (Serial::IrqType)CtsIrq );
 }
 void MySerialBase::baud( int baudrate )
 {
@@ -134,14 +136,15 @@
     }
 }
 
-//  Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
+//  Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
 void MySerialBase::my_serial_irq_handler( serial_t *obj, uart_irq_handler handler, uint32_t id )
 {
     irq_handler                = handler;
     serial_irq_ids[obj->index] = id;
 }
+//
 
-// Replacement for serial_irq_set() in serial_api.c so we can eventually grab uart errors.
+// Replacement for serial_irq_set() in serial_api.c so we can grab uart errors.
 void MySerialBase::my_serial_irq_set( serial_t *obj, IrqType irq, uint32_t enable )
 {
     IRQn_Type irq_n = (IRQn_Type)0;
@@ -158,51 +161,48 @@
         switch( irq )
         {
           case RxIrq:
-            obj->uart->INTEN |= (UART_INTENSET_RXDRDY_Msk);
+            obj->uart->INTENSET = UART_INTENSET_RXDRDY_Msk;
             break;
           case TxIrq:
-            obj->uart->INTEN |= (UART_INTENSET_TXDRDY_Msk);
+            obj->uart->INTENSET = UART_INTENSET_TXDRDY_Msk;
             break;
           case ErrIrq:
-            obj->uart->INTEN |= (UART_INTENSET_ERROR_Msk);
+            obj->uart->INTENSET = UART_INTENSET_ERROR_Msk;
             break;
           case CtsIrq:
-            obj->uart->INTEN |= (UART_INTENCLR_CTS_Msk);
+            obj->uart->INTENSET = UART_INTENSET_CTS_Msk;
             break;
           case NctsIrq:
-            obj->uart->INTEN |= (UART_INTENCLR_NCTS_Msk);
+            obj->uart->INTENSET = UART_INTENSET_NCTS_Msk;
             break;
           case RxtoIrq:
-            obj->uart->INTEN |= (UART_INTENCLR_RXTO_Msk);
+            obj->uart->INTENSET = UART_INTENSET_RXTO_Msk;
             break;
         }
         NVIC_SetPriority( irq_n, 3 );
         NVIC_EnableIRQ( irq_n );
 
     } else
-      { // disable
-          // masked writes to INTENSET dont disable and masked writes to
-          //  INTENCLR seemed to clear the entire register, not bits.
-          //  Added INTEN to memory map and seems to allow set and clearing of specific bits as desired
+      { // Disable
           switch( irq )
           {
             case RxIrq:
-              obj->uart->INTEN &= ~(UART_INTENCLR_RXDRDY_Msk);
+              obj->uart->INTENCLR = UART_INTENCLR_RXDRDY_Msk;
               break;
             case TxIrq:
-              obj->uart->INTEN &= ~(UART_INTENCLR_TXDRDY_Msk);
+              obj->uart->INTENCLR = UART_INTENCLR_TXDRDY_Msk;
               break;
             case ErrIrq:
-              obj->uart->INTEN &= ~(UART_INTENCLR_ERROR_Msk);
+              obj->uart->INTENCLR = UART_INTENCLR_ERROR_Msk;
               break;
             case CtsIrq:
-              obj->uart->INTEN &= ~(UART_INTENCLR_CTS_Msk);
+              obj->uart->INTENCLR = UART_INTENCLR_CTS_Msk;
               break;
             case NctsIrq:
-              obj->uart->INTEN &= ~(UART_INTENCLR_NCTS_Msk);
+              obj->uart->INTENCLR = UART_INTENCLR_NCTS_Msk;
               break;
             case RxtoIrq:
-              obj->uart->INTEN &= ~(UART_INTENCLR_RXTO_Msk);
+              obj->uart->INTENCLR = UART_INTENCLR_RXTO_Msk;
               break;
           }
 
@@ -218,10 +218,10 @@
     handler->_my_irq[irq_type].call();
 }
 
-// Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
 void MySerialBase::error_handler()
 {
-    puts( "\r\nUART ERR!  " );
+    // Apparently handler will be continuously called until [error] condition is gone even though cleared.
 
     if( (UART_ERRORSRC_OVERRUN_Present << UART_ERRORSRC_OVERRUN_Pos) == (UART_ERRORSRC_OVERRUN_Msk & _my_serial.uart->ERRORSRC) )
     {
@@ -229,12 +229,50 @@
 
         // Clear the error
         _my_serial.uart->ERRORSRC = (UART_ERRORSRC_OVERRUN_Clear << UART_ERRORSRC_OVERRUN_Pos);
-    }
+
+    } else if( (UART_ERRORSRC_PARITY_Present << UART_ERRORSRC_PARITY_Pos) == (UART_ERRORSRC_PARITY_Msk & _my_serial.uart->ERRORSRC) )
+      {
+          puts( "\r\n[ERR: PARITY]\r\n" );
+
+          // Clear the error
+          _my_serial.uart->ERRORSRC = (UART_ERRORSRC_PARITY_Clear << UART_ERRORSRC_PARITY_Pos);
+
+      } else if( (UART_ERRORSRC_FRAMING_Present << UART_ERRORSRC_FRAMING_Pos) == (UART_ERRORSRC_FRAMING_Msk & _my_serial.uart->ERRORSRC) )
+        {
+            puts( "\r\n[ERR: FRAMING]\r\n" );
+
+            // Clear the error
+            _my_serial.uart->ERRORSRC = (UART_ERRORSRC_FRAMING_Clear << UART_ERRORSRC_FRAMING_Pos);
+
+        } else if( (UART_ERRORSRC_BREAK_Present << UART_ERRORSRC_BREAK_Pos) == (UART_ERRORSRC_BREAK_Msk & _my_serial.uart->ERRORSRC) )
+          {
+              puts( "\r\n[ERR: BREAK]\r\n" );
+
+              // Clear the error
+              _my_serial.uart->ERRORSRC = (UART_ERRORSRC_BREAK_Clear << UART_ERRORSRC_BREAK_Pos);
+
+          } else
+            {
+                // Clear the error interrupt...
+                _my_serial.uart->EVENTS_ERROR = 0;
+            }
 }
 
-// Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
 void MySerialBase::cts_handler()
 {
+    // Clear interrupt.
+    _my_serial.uart->EVENTS_CTS = 0;
+
+//    puts( "\r\n[CTS: Clear]\r\n" );
+}
+
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+void MySerialBase::ncts_handler()
+{
+    // Attempt to clear interrupt.
+    _my_serial.uart->EVENTS_NCTS = 0;
+
     puts( "\r\n[CTS: High]\r\n" );
 }
 
@@ -247,6 +285,7 @@
     serial_putc( &_my_serial, c );
     return  c;
 }
+
 void MySerialBase::send_break()
  {
   // Wait for 1.5 frames before clearing the break condition
@@ -314,13 +353,12 @@
     return  len;
 }
 
-//  Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-
+//  Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
 #ifdef __cplusplus
 extern "C"
 {
 #endif
-void UART0_My_IRQHandler()  // Rename to UART0_IRQHandler once serial_api.c excludes in lib rebuild.
+void UART0_IRQHandler()
 {
     MySerial::IrqType irq_type;
 
@@ -361,6 +399,6 @@
 #ifdef __cplusplus
 }
 #endif
-
+//
 
 /* EOF */