You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.4 KiB
146 lines
3.4 KiB
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: t -*- |
|
// |
|
// Interrupt-driven serial transmit/receive library. |
|
// |
|
// Copyright (c) 2010 Michael Smith. All rights reserved. |
|
// |
|
// Receive and baudrate calculations derived from the Arduino |
|
// HardwareSerial driver: |
|
// |
|
// Copyright (c) 2006 Nicholas Zambetti. All right reserved. |
|
// |
|
// Transmit algorithm inspired by work: |
|
// |
|
// Code Jose Julio and Jordi Munoz. DIYDrones.com |
|
// |
|
// This library is free software; you can redistribute it and/or |
|
// modify it under the terms of the GNU Lesser General Public |
|
// License as published by the Free Software Foundation; either |
|
// version 2.1 of the License, or (at your option) any later version. |
|
// |
|
// This library is distributed in the hope that it will be useful, |
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
// Lesser General Public License for more details. |
|
// |
|
// You should have received a copy of the GNU Lesser General Public |
|
// License along with this library; if not, write to the Free Software |
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
|
// |
|
|
|
|
|
//#include "../AP_Common/AP_Common.h" |
|
#include "FastSerial.h" |
|
#include "WProgram.h" |
|
#include <unistd.h> |
|
#include <pty.h> |
|
#include <fcntl.h> |
|
|
|
#if defined(UDR3) |
|
# define FS_MAX_PORTS 4 |
|
#elif defined(UDR2) |
|
# define FS_MAX_PORTS 3 |
|
#elif defined(UDR1) |
|
# define FS_MAX_PORTS 2 |
|
#else |
|
# define FS_MAX_PORTS 1 |
|
#endif |
|
|
|
FastSerial::Buffer __FastSerial__rxBuffer[FS_MAX_PORTS]; |
|
FastSerial::Buffer __FastSerial__txBuffer[FS_MAX_PORTS]; |
|
|
|
// Constructor ///////////////////////////////////////////////////////////////// |
|
|
|
FastSerial::FastSerial(const uint8_t portNumber, volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, |
|
volatile uint8_t *ucsra, volatile uint8_t *ucsrb, const uint8_t u2x, |
|
const uint8_t portEnableBits, const uint8_t portTxBits) : |
|
_ubrrh(ubrrh), |
|
_ubrrl(ubrrl), |
|
_ucsra(ucsra), |
|
_ucsrb(ucsrb), |
|
_u2x(portNumber), |
|
_portEnableBits(portEnableBits), |
|
_portTxBits(portTxBits), |
|
_rxBuffer(&__FastSerial__rxBuffer[portNumber]), |
|
_txBuffer(&__FastSerial__txBuffer[portNumber]) |
|
{ |
|
} |
|
|
|
// Public Methods ////////////////////////////////////////////////////////////// |
|
|
|
void FastSerial::begin(long baud) |
|
{ |
|
if (_u2x == 0) { |
|
unsigned v; |
|
v = fcntl(0, F_GETFL, 0); |
|
fcntl(0, F_SETFL, v | O_NONBLOCK); |
|
v = fcntl(1, F_GETFL, 0); |
|
fcntl(1, F_SETFL, v | O_NONBLOCK); |
|
} |
|
} |
|
|
|
void FastSerial::begin(long baud, unsigned int rxSpace, unsigned int txSpace) |
|
{ |
|
begin(baud); |
|
} |
|
|
|
void FastSerial::end() |
|
{ |
|
} |
|
|
|
int FastSerial::available(void) |
|
{ |
|
if (_u2x != 0) return 0; |
|
int num_ready; |
|
if (ioctl(0, FIONREAD, &num_ready) == 0) { |
|
return num_ready; |
|
} |
|
return 0; |
|
} |
|
|
|
int FastSerial::txspace(void) |
|
{ |
|
return 128; |
|
} |
|
|
|
int FastSerial::read(void) |
|
{ |
|
if (_u2x != 0) { |
|
return -1; |
|
} |
|
char c; |
|
if (fread(&c, 1, 1, stdin) != 1) { |
|
return -1; |
|
} |
|
return (int)c; |
|
} |
|
|
|
int FastSerial::peek(void) |
|
{ |
|
return -1; |
|
} |
|
|
|
void FastSerial::flush(void) |
|
{ |
|
} |
|
|
|
void FastSerial::write(uint8_t c) |
|
{ |
|
if (_u2x != 0) { |
|
return; |
|
} |
|
fwrite(&c, 1, 1, stdout); |
|
fflush(stdout); |
|
} |
|
|
|
// Buffer management /////////////////////////////////////////////////////////// |
|
|
|
bool FastSerial::_allocBuffer(Buffer *buffer, unsigned int size) |
|
{ |
|
return false; |
|
} |
|
|
|
void FastSerial::_freeBuffer(Buffer *buffer) |
|
{ |
|
} |
|
|
|
|