Proyecto ABInBev para la tarjeta Guaria 1/2.

Committer:
fmanzano_dtk
Date:
Thu Jul 07 16:17:25 2022 +0000
Revision:
19:5580a9a54ad5
Parent:
1:9e821e640117
Sincronizacion;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fmanzano_dtk 1:9e821e640117 1 /**
fmanzano_dtk 1:9e821e640117 2 * @file BufferedSerial.cpp
fmanzano_dtk 1:9e821e640117 3 * @brief Software Buffer - Extends mbed Serial functionallity adding irq driven TX and RX
fmanzano_dtk 1:9e821e640117 4 * @author sam grove
fmanzano_dtk 1:9e821e640117 5 * @version 1.0
fmanzano_dtk 1:9e821e640117 6 * @see
fmanzano_dtk 1:9e821e640117 7 *
fmanzano_dtk 1:9e821e640117 8 * Copyright (c) 2013
fmanzano_dtk 1:9e821e640117 9 *
fmanzano_dtk 1:9e821e640117 10 * Licensed under the Apache License, Version 2.0 (the "License");
fmanzano_dtk 1:9e821e640117 11 * you may not use this file except in compliance with the License.
fmanzano_dtk 1:9e821e640117 12 * You may obtain a copy of the License at
fmanzano_dtk 1:9e821e640117 13 *
fmanzano_dtk 1:9e821e640117 14 * http://www.apache.org/licenses/LICENSE-2.0
fmanzano_dtk 1:9e821e640117 15 *
fmanzano_dtk 1:9e821e640117 16 * Unless required by applicable law or agreed to in writing, software
fmanzano_dtk 1:9e821e640117 17 * distributed under the License is distributed on an "AS IS" BASIS,
fmanzano_dtk 1:9e821e640117 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
fmanzano_dtk 1:9e821e640117 19 * See the License for the specific language governing permissions and
fmanzano_dtk 1:9e821e640117 20 * limitations under the License.
fmanzano_dtk 1:9e821e640117 21 */
fmanzano_dtk 1:9e821e640117 22
fmanzano_dtk 1:9e821e640117 23 #include "BufferedSerial.h"
fmanzano_dtk 1:9e821e640117 24 #include <stdarg.h>
fmanzano_dtk 1:9e821e640117 25
fmanzano_dtk 1:9e821e640117 26 BufferedSerial::BufferedSerial(PinName tx, PinName rx, uint32_t buf_size, uint32_t tx_multiple, const char* name)
fmanzano_dtk 1:9e821e640117 27 : RawSerial(tx, rx) , _rxbuf(buf_size), _txbuf((uint32_t)(tx_multiple*buf_size))
fmanzano_dtk 1:9e821e640117 28 {
fmanzano_dtk 1:9e821e640117 29 RawSerial::attach(callback(this, &BufferedSerial::rxIrq), Serial::RxIrq);
fmanzano_dtk 1:9e821e640117 30 this->_buf_size = buf_size;
fmanzano_dtk 1:9e821e640117 31 this->_tx_multiple = tx_multiple;
fmanzano_dtk 1:9e821e640117 32 return;
fmanzano_dtk 1:9e821e640117 33 }
fmanzano_dtk 1:9e821e640117 34
fmanzano_dtk 1:9e821e640117 35 BufferedSerial::~BufferedSerial(void)
fmanzano_dtk 1:9e821e640117 36 {
fmanzano_dtk 1:9e821e640117 37 RawSerial::attach(NULL, RawSerial::RxIrq);
fmanzano_dtk 1:9e821e640117 38 RawSerial::attach(NULL, RawSerial::TxIrq);
fmanzano_dtk 1:9e821e640117 39
fmanzano_dtk 1:9e821e640117 40 return;
fmanzano_dtk 1:9e821e640117 41 }
fmanzano_dtk 1:9e821e640117 42
fmanzano_dtk 1:9e821e640117 43 int BufferedSerial::readable(void)
fmanzano_dtk 1:9e821e640117 44 {
fmanzano_dtk 1:9e821e640117 45 return _rxbuf.available(); // note: look if things are in the buffer
fmanzano_dtk 1:9e821e640117 46 }
fmanzano_dtk 1:9e821e640117 47
fmanzano_dtk 1:9e821e640117 48 int BufferedSerial::writeable(void)
fmanzano_dtk 1:9e821e640117 49 {
fmanzano_dtk 1:9e821e640117 50 return 1; // buffer allows overwriting by design, always true
fmanzano_dtk 1:9e821e640117 51 }
fmanzano_dtk 1:9e821e640117 52
fmanzano_dtk 1:9e821e640117 53 int BufferedSerial::getc(void)
fmanzano_dtk 1:9e821e640117 54 {
fmanzano_dtk 1:9e821e640117 55 return _rxbuf;
fmanzano_dtk 1:9e821e640117 56 }
fmanzano_dtk 1:9e821e640117 57
fmanzano_dtk 1:9e821e640117 58 int BufferedSerial::putc(int c)
fmanzano_dtk 1:9e821e640117 59 {
fmanzano_dtk 1:9e821e640117 60 _txbuf = (char)c;
fmanzano_dtk 1:9e821e640117 61 BufferedSerial::prime();
fmanzano_dtk 1:9e821e640117 62
fmanzano_dtk 1:9e821e640117 63 return c;
fmanzano_dtk 1:9e821e640117 64 }
fmanzano_dtk 1:9e821e640117 65
fmanzano_dtk 1:9e821e640117 66 int BufferedSerial::puts(const char *s)
fmanzano_dtk 1:9e821e640117 67 {
fmanzano_dtk 1:9e821e640117 68 if (s != NULL) {
fmanzano_dtk 1:9e821e640117 69 const char* ptr = s;
fmanzano_dtk 1:9e821e640117 70
fmanzano_dtk 1:9e821e640117 71 while(*(ptr) != 0) {
fmanzano_dtk 1:9e821e640117 72 _txbuf = *(ptr++);
fmanzano_dtk 1:9e821e640117 73 }
fmanzano_dtk 1:9e821e640117 74 _txbuf = '\n'; // done per puts definition
fmanzano_dtk 1:9e821e640117 75 BufferedSerial::prime();
fmanzano_dtk 1:9e821e640117 76
fmanzano_dtk 1:9e821e640117 77 return (ptr - s) + 1;
fmanzano_dtk 1:9e821e640117 78 }
fmanzano_dtk 1:9e821e640117 79 return 0;
fmanzano_dtk 1:9e821e640117 80 }
fmanzano_dtk 1:9e821e640117 81
fmanzano_dtk 1:9e821e640117 82 int BufferedSerial::printf(const char* format, ...)
fmanzano_dtk 1:9e821e640117 83 {
fmanzano_dtk 1:9e821e640117 84 char buffer[this->_buf_size];
fmanzano_dtk 1:9e821e640117 85 memset(buffer,0,this->_buf_size);
fmanzano_dtk 1:9e821e640117 86 int r = 0;
fmanzano_dtk 1:9e821e640117 87
fmanzano_dtk 1:9e821e640117 88 va_list arg;
fmanzano_dtk 1:9e821e640117 89 va_start(arg, format);
fmanzano_dtk 1:9e821e640117 90 r = vsprintf(buffer, format, arg);
fmanzano_dtk 1:9e821e640117 91 // this may not hit the heap but should alert the user anyways
fmanzano_dtk 1:9e821e640117 92 if(r > this->_buf_size) {
fmanzano_dtk 1:9e821e640117 93 error("%s %d buffer overwrite (max_buf_size: %d exceeded: %d)!\r\n", __FILE__, __LINE__,this->_buf_size,r);
fmanzano_dtk 1:9e821e640117 94 va_end(arg);
fmanzano_dtk 1:9e821e640117 95 return 0;
fmanzano_dtk 1:9e821e640117 96 }
fmanzano_dtk 1:9e821e640117 97 va_end(arg);
fmanzano_dtk 1:9e821e640117 98 r = BufferedSerial::write(buffer, r);
fmanzano_dtk 1:9e821e640117 99
fmanzano_dtk 1:9e821e640117 100 return r;
fmanzano_dtk 1:9e821e640117 101 }
fmanzano_dtk 1:9e821e640117 102
fmanzano_dtk 1:9e821e640117 103 ssize_t BufferedSerial::write(const void *s, size_t length)
fmanzano_dtk 1:9e821e640117 104 {
fmanzano_dtk 1:9e821e640117 105 if (s != NULL && length > 0) {
fmanzano_dtk 1:9e821e640117 106 const char* ptr = (const char*)s;
fmanzano_dtk 1:9e821e640117 107 const char* end = ptr + length;
fmanzano_dtk 1:9e821e640117 108
fmanzano_dtk 1:9e821e640117 109 while (ptr != end) {
fmanzano_dtk 1:9e821e640117 110 _txbuf = *(ptr++);
fmanzano_dtk 1:9e821e640117 111 }
fmanzano_dtk 1:9e821e640117 112 BufferedSerial::prime();
fmanzano_dtk 1:9e821e640117 113
fmanzano_dtk 1:9e821e640117 114 return ptr - (const char*)s;
fmanzano_dtk 1:9e821e640117 115 }
fmanzano_dtk 1:9e821e640117 116 return 0;
fmanzano_dtk 1:9e821e640117 117 }
fmanzano_dtk 1:9e821e640117 118
fmanzano_dtk 1:9e821e640117 119
fmanzano_dtk 1:9e821e640117 120 void BufferedSerial::rxIrq(void)
fmanzano_dtk 1:9e821e640117 121 {
fmanzano_dtk 1:9e821e640117 122 // read from the peripheral and make sure something is available
fmanzano_dtk 1:9e821e640117 123 if(serial_readable(&_serial)) {
fmanzano_dtk 1:9e821e640117 124 _rxbuf = serial_getc(&_serial); // if so load them into a buffer
fmanzano_dtk 1:9e821e640117 125 }
fmanzano_dtk 1:9e821e640117 126
fmanzano_dtk 1:9e821e640117 127 return;
fmanzano_dtk 1:9e821e640117 128 }
fmanzano_dtk 1:9e821e640117 129
fmanzano_dtk 1:9e821e640117 130 void BufferedSerial::txIrq(void)
fmanzano_dtk 1:9e821e640117 131 {
fmanzano_dtk 1:9e821e640117 132 // see if there is room in the hardware fifo and if something is in the software fifo
fmanzano_dtk 1:9e821e640117 133 while(serial_writable(&_serial)) {
fmanzano_dtk 1:9e821e640117 134 if(_txbuf.available()) {
fmanzano_dtk 1:9e821e640117 135 serial_putc(&_serial, (int)_txbuf.get());
fmanzano_dtk 1:9e821e640117 136 } else {
fmanzano_dtk 1:9e821e640117 137 // disable the TX interrupt when there is nothing left to send
fmanzano_dtk 1:9e821e640117 138 RawSerial::attach(NULL, RawSerial::TxIrq);
fmanzano_dtk 1:9e821e640117 139 break;
fmanzano_dtk 1:9e821e640117 140 }
fmanzano_dtk 1:9e821e640117 141 }
fmanzano_dtk 1:9e821e640117 142
fmanzano_dtk 1:9e821e640117 143 return;
fmanzano_dtk 1:9e821e640117 144 }
fmanzano_dtk 1:9e821e640117 145
fmanzano_dtk 1:9e821e640117 146 void BufferedSerial::prime(void)
fmanzano_dtk 1:9e821e640117 147 {
fmanzano_dtk 1:9e821e640117 148 // if already busy then the irq will pick this up
fmanzano_dtk 1:9e821e640117 149 if(serial_writable(&_serial)) {
fmanzano_dtk 1:9e821e640117 150 RawSerial::attach(NULL, RawSerial::TxIrq); // make sure not to cause contention in the irq
fmanzano_dtk 1:9e821e640117 151 BufferedSerial::txIrq(); // only write to hardware in one place
fmanzano_dtk 1:9e821e640117 152 RawSerial::attach(callback(this, &BufferedSerial::txIrq), RawSerial::TxIrq);
fmanzano_dtk 1:9e821e640117 153 }
fmanzano_dtk 1:9e821e640117 154
fmanzano_dtk 1:9e821e640117 155 return;
fmanzano_dtk 1:9e821e640117 156 }