adding additional features

Committer:
sam_grove
Date:
Wed Jun 26 20:35:10 2013 +0000
Revision:
0:2d90573426d7
add dynamic connection and terminal status feedback to the embedded application

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:2d90573426d7 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
sam_grove 0:2d90573426d7 2 *
sam_grove 0:2d90573426d7 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sam_grove 0:2d90573426d7 4 * and associated documentation files (the "Software"), to deal in the Software without
sam_grove 0:2d90573426d7 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
sam_grove 0:2d90573426d7 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
sam_grove 0:2d90573426d7 7 * Software is furnished to do so, subject to the following conditions:
sam_grove 0:2d90573426d7 8 *
sam_grove 0:2d90573426d7 9 * The above copyright notice and this permission notice shall be included in all copies or
sam_grove 0:2d90573426d7 10 * substantial portions of the Software.
sam_grove 0:2d90573426d7 11 *
sam_grove 0:2d90573426d7 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sam_grove 0:2d90573426d7 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sam_grove 0:2d90573426d7 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sam_grove 0:2d90573426d7 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sam_grove 0:2d90573426d7 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sam_grove 0:2d90573426d7 17 */
sam_grove 0:2d90573426d7 18
sam_grove 0:2d90573426d7 19 #include "stdint.h"
sam_grove 0:2d90573426d7 20 #include "USBSerial.h"
sam_grove 0:2d90573426d7 21 #include <stdarg.h>
sam_grove 0:2d90573426d7 22
sam_grove 0:2d90573426d7 23 USBSerial::USBSerial( uint16_t vendor_id, uint16_t product_id, uint16_t product_release )
sam_grove 0:2d90573426d7 24 : USBCDC( vendor_id, product_id, product_release )
sam_grove 0:2d90573426d7 25 , buf( 128 )
sam_grove 0:2d90573426d7 26 #ifdef USB_ERRATA_WORKAROUND
sam_grove 0:2d90573426d7 27 , _connect( P0_6 )
sam_grove 0:2d90573426d7 28 , _vbus( P0_3 )
sam_grove 0:2d90573426d7 29 #endif
sam_grove 0:2d90573426d7 30 {
sam_grove 0:2d90573426d7 31 #ifdef USB_ERRATA_WORKAROUND
sam_grove 0:2d90573426d7 32 _connect = 1;
sam_grove 0:2d90573426d7 33 #endif
sam_grove 0:2d90573426d7 34 return;
sam_grove 0:2d90573426d7 35 }
sam_grove 0:2d90573426d7 36
sam_grove 0:2d90573426d7 37 int USBSerial::_putc( int c )
sam_grove 0:2d90573426d7 38 {
sam_grove 0:2d90573426d7 39 send( ( uint8_t * )&c, 1 );
sam_grove 0:2d90573426d7 40 return 1;
sam_grove 0:2d90573426d7 41 }
sam_grove 0:2d90573426d7 42
sam_grove 0:2d90573426d7 43 int USBSerial::_getc()
sam_grove 0:2d90573426d7 44 {
sam_grove 0:2d90573426d7 45 uint8_t c;
sam_grove 0:2d90573426d7 46
sam_grove 0:2d90573426d7 47 while ( buf.isEmpty() );
sam_grove 0:2d90573426d7 48
sam_grove 0:2d90573426d7 49 buf.dequeue( &c );
sam_grove 0:2d90573426d7 50 return c;
sam_grove 0:2d90573426d7 51 }
sam_grove 0:2d90573426d7 52
sam_grove 0:2d90573426d7 53 void USBSerial::flush( void )
sam_grove 0:2d90573426d7 54 {
sam_grove 0:2d90573426d7 55 while( available() )
sam_grove 0:2d90573426d7 56 {
sam_grove 0:2d90573426d7 57 _getc();
sam_grove 0:2d90573426d7 58 }
sam_grove 0:2d90573426d7 59
sam_grove 0:2d90573426d7 60 return;
sam_grove 0:2d90573426d7 61 }
sam_grove 0:2d90573426d7 62
sam_grove 0:2d90573426d7 63 void USBSerial::printf( const char *format, ... )
sam_grove 0:2d90573426d7 64 {
sam_grove 0:2d90573426d7 65 static char buf[128];
sam_grove 0:2d90573426d7 66 uint32_t len = 0;
sam_grove 0:2d90573426d7 67 va_list arg;
sam_grove 0:2d90573426d7 68
sam_grove 0:2d90573426d7 69 if ( strlen( format ) < 64 )
sam_grove 0:2d90573426d7 70 {
sam_grove 0:2d90573426d7 71 va_start( arg, format );
sam_grove 0:2d90573426d7 72 vsprintf( buf, format, arg );
sam_grove 0:2d90573426d7 73 va_end( arg );
sam_grove 0:2d90573426d7 74 // write to the peripheral
sam_grove 0:2d90573426d7 75 len = strlen( buf );
sam_grove 0:2d90573426d7 76 send( ( uint8_t * )buf, len );
sam_grove 0:2d90573426d7 77 // and erase the buffer conents
sam_grove 0:2d90573426d7 78 memset( buf, 0, len );
sam_grove 0:2d90573426d7 79 }
sam_grove 0:2d90573426d7 80
sam_grove 0:2d90573426d7 81 return;
sam_grove 0:2d90573426d7 82 }
sam_grove 0:2d90573426d7 83
sam_grove 0:2d90573426d7 84 bool USBSerial::writeBlock( uint8_t *buf, uint16_t size )
sam_grove 0:2d90573426d7 85 {
sam_grove 0:2d90573426d7 86 if( size > MAX_PACKET_SIZE_EPBULK )
sam_grove 0:2d90573426d7 87 {
sam_grove 0:2d90573426d7 88 return false;
sam_grove 0:2d90573426d7 89 }
sam_grove 0:2d90573426d7 90
sam_grove 0:2d90573426d7 91 if( !send( buf, size ) )
sam_grove 0:2d90573426d7 92 {
sam_grove 0:2d90573426d7 93 return false;
sam_grove 0:2d90573426d7 94 }
sam_grove 0:2d90573426d7 95
sam_grove 0:2d90573426d7 96 return true;
sam_grove 0:2d90573426d7 97 }
sam_grove 0:2d90573426d7 98
sam_grove 0:2d90573426d7 99 bool USBSerial::writeBlock( const char *buf )
sam_grove 0:2d90573426d7 100 {
sam_grove 0:2d90573426d7 101 uint16_t cnt = 0;
sam_grove 0:2d90573426d7 102
sam_grove 0:2d90573426d7 103 while( buf[cnt++] != 0 );
sam_grove 0:2d90573426d7 104
sam_grove 0:2d90573426d7 105 return writeBlock( ( uint8_t * )buf, cnt );
sam_grove 0:2d90573426d7 106 }
sam_grove 0:2d90573426d7 107
sam_grove 0:2d90573426d7 108 bool USBSerial::EP2_OUT_callback()
sam_grove 0:2d90573426d7 109 {
sam_grove 0:2d90573426d7 110 uint8_t c[65];
sam_grove 0:2d90573426d7 111 uint32_t size = 0;
sam_grove 0:2d90573426d7 112 //we read the packet received and put it on the circular buffer
sam_grove 0:2d90573426d7 113 readEP( c, &size );
sam_grove 0:2d90573426d7 114
sam_grove 0:2d90573426d7 115 for ( int i = 0; i < size; i++ )
sam_grove 0:2d90573426d7 116 {
sam_grove 0:2d90573426d7 117 buf.queue( c[i] );
sam_grove 0:2d90573426d7 118 }
sam_grove 0:2d90573426d7 119
sam_grove 0:2d90573426d7 120 //call a potential handler
sam_grove 0:2d90573426d7 121 rx.call();
sam_grove 0:2d90573426d7 122 // We reactivate the endpoint to receive next characters
sam_grove 0:2d90573426d7 123 readStart( EPBULK_OUT, MAX_PACKET_SIZE_EPBULK );
sam_grove 0:2d90573426d7 124 return true;
sam_grove 0:2d90573426d7 125 }
sam_grove 0:2d90573426d7 126
sam_grove 0:2d90573426d7 127 uint8_t USBSerial::available()
sam_grove 0:2d90573426d7 128 {
sam_grove 0:2d90573426d7 129 return buf.available();
sam_grove 0:2d90573426d7 130 }
sam_grove 0:2d90573426d7 131
sam_grove 0:2d90573426d7 132 #ifdef USB_ERRATA_WORKAROUND
sam_grove 0:2d90573426d7 133 void USBSerial::connect( void )
sam_grove 0:2d90573426d7 134 {
sam_grove 0:2d90573426d7 135 _connect = 0;
sam_grove 0:2d90573426d7 136 USBHAL::connect();
sam_grove 0:2d90573426d7 137 return;
sam_grove 0:2d90573426d7 138 }
sam_grove 0:2d90573426d7 139 void USBSerial::disconnect( void )
sam_grove 0:2d90573426d7 140 {
sam_grove 0:2d90573426d7 141 _connect = 1;
sam_grove 0:2d90573426d7 142 USBHAL::disconnect();
sam_grove 0:2d90573426d7 143 return;
sam_grove 0:2d90573426d7 144 }
sam_grove 0:2d90573426d7 145 bool USBSerial::vbusDetected( void )
sam_grove 0:2d90573426d7 146 {
sam_grove 0:2d90573426d7 147 return _vbus;
sam_grove 0:2d90573426d7 148 }
sam_grove 0:2d90573426d7 149 #endif
sam_grove 0:2d90573426d7 150
sam_grove 0:2d90573426d7 151