adding additional features
USBSerial.cpp
- Committer:
- sam_grove
- Date:
- 2013-06-26
- Revision:
- 0:2d90573426d7
File content as of revision 0:2d90573426d7:
/* Copyright (c) 2010-2011 mbed.org, MIT License * * 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 "stdint.h" #include "USBSerial.h" #include <stdarg.h> USBSerial::USBSerial( uint16_t vendor_id, uint16_t product_id, uint16_t product_release ) : USBCDC( vendor_id, product_id, product_release ) , buf( 128 ) #ifdef USB_ERRATA_WORKAROUND , _connect( P0_6 ) , _vbus( P0_3 ) #endif { #ifdef USB_ERRATA_WORKAROUND _connect = 1; #endif return; } int USBSerial::_putc( int c ) { send( ( uint8_t * )&c, 1 ); return 1; } int USBSerial::_getc() { uint8_t c; while ( buf.isEmpty() ); buf.dequeue( &c ); return c; } void USBSerial::flush( void ) { while( available() ) { _getc(); } return; } void USBSerial::printf( const char *format, ... ) { static char buf[128]; uint32_t len = 0; va_list arg; if ( strlen( format ) < 64 ) { va_start( arg, format ); vsprintf( buf, format, arg ); va_end( arg ); // write to the peripheral len = strlen( buf ); send( ( uint8_t * )buf, len ); // and erase the buffer conents memset( buf, 0, len ); } return; } bool USBSerial::writeBlock( uint8_t *buf, uint16_t size ) { if( size > MAX_PACKET_SIZE_EPBULK ) { return false; } if( !send( buf, size ) ) { return false; } return true; } bool USBSerial::writeBlock( const char *buf ) { uint16_t cnt = 0; while( buf[cnt++] != 0 ); return writeBlock( ( uint8_t * )buf, cnt ); } bool USBSerial::EP2_OUT_callback() { uint8_t c[65]; uint32_t size = 0; //we read the packet received and put it on the circular buffer readEP( c, &size ); for ( int i = 0; i < size; i++ ) { buf.queue( c[i] ); } //call a potential handler rx.call(); // We reactivate the endpoint to receive next characters readStart( EPBULK_OUT, MAX_PACKET_SIZE_EPBULK ); return true; } uint8_t USBSerial::available() { return buf.available(); } #ifdef USB_ERRATA_WORKAROUND void USBSerial::connect( void ) { _connect = 0; USBHAL::connect(); return; } void USBSerial::disconnect( void ) { _connect = 1; USBHAL::disconnect(); return; } bool USBSerial::vbusDetected( void ) { return _vbus; } #endif