1/* 2 Copyright (c) 2013 Arduino LLC. All right reserved. 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 This library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with this library; if not, write to the Free Software 16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17*/ 18 19#include <Console.h> 20 21// Default constructor uses global Bridge instance 22ConsoleClass::ConsoleClass() : 23bridge(Bridge),inBuffered(0),inReadPos(0),inBuffer(NULL), 24autoFlush(true) 25{ 26// Empty 27} 28 29// Constructor with a user provided BridgeClass instance 30ConsoleClass::ConsoleClass(BridgeClass &_b) : 31bridge(_b),inBuffered(0),inReadPos(0),inBuffer(NULL), 32autoFlush(true) 33{ 34// Empty 35} 36 37ConsoleClass::~ConsoleClass() { 38end(); 39} 40 41size_tConsoleClass::write(uint8_t c) { 42if(autoFlush) { 43uint8_t tmp[] = {'P', c }; 44 bridge.transfer(tmp,2); 45}else{ 46 outBuffer[outBuffered++] = c; 47if(outBuffered == outBufferSize) 48flush(); 49} 50return1; 51} 52 53size_tConsoleClass::write(const uint8_t*buff,size_t size) { 54if(autoFlush) { 55uint8_t tmp[] = {'P'}; 56 bridge.transfer(tmp,1, buff, size, NULL,0); 57}else{ 58size_t sent = size; 59while(sent >0) { 60 outBuffer[outBuffered++] = *buff++; 61 sent--; 62if(outBuffered == outBufferSize) 63flush(); 64} 65} 66return size; 67} 68 69voidConsoleClass::flush() { 70if(autoFlush) 71return; 72 73 bridge.transfer(outBuffer, outBuffered); 74 outBuffered =1; 75} 76 77voidConsoleClass::noBuffer() { 78if(autoFlush) 79return; 80delete[] outBuffer; 81 autoFlush =true; 82} 83 84voidConsoleClass::buffer(uint8_t size) { 85noBuffer(); 86if(size ==0) 87return; 88 outBuffer =newuint8_t[size +1]; 89 outBuffer[0] ='P';// WRITE tag 90 outBufferSize = size +1; 91 outBuffered =1; 92 autoFlush =false; 93} 94 95boolConsoleClass::connected() { 96uint8_t tmp ='a'; 97 bridge.transfer(&tmp,1, &tmp,1); 98return tmp ==1; 99} 100 101intConsoleClass::available() { 102// Look if there is new data available 103doBuffer(); 104return inBuffered; 105} 106 107intConsoleClass::read() { 108doBuffer(); 109if(inBuffered ==0) 110return-1;// no chars available 111else{ 112 inBuffered--; 113return inBuffer[inReadPos++]; 114} 115} 116 117intConsoleClass::peek() { 118doBuffer(); 119if(inBuffered ==0) 120return-1;// no chars available 121else 122return inBuffer[inReadPos]; 123} 124 125voidConsoleClass::doBuffer() { 126// If there are already char in buffer exit 127if(inBuffered >0) 128return; 129 130// Try to buffer up to 32 characters 131 inReadPos =0; 132uint8_t tmp[] = {'p', BUFFER_SIZE }; 133 inBuffered = bridge.transfer(tmp,2, inBuffer, BUFFER_SIZE); 134} 135 136voidConsoleClass::begin() { 137 bridge.begin(); 138end(); 139 inBuffer =newuint8_t[BUFFER_SIZE]; 140} 141 142voidConsoleClass::end() { 143noBuffer(); 144if(inBuffer) { 145delete[] inBuffer; 146 inBuffer = NULL; 147} 148} 149 150ConsoleClass Console;