#include <Transport.h>
Public Types | |
enum | counterTypes { GARBLE_BYTES, INVALID_MSG, IGNORED_ACK, QUEUE_FULL, NUM_COUNTERS } |
Public Member Functions | |
int | close () |
void | configure (const char *device, int retries) |
void | flush (std::list< Message * > *queue=0) |
void | flush (enum MessageTypes type, std::list< Message * > *queue=0) |
Message * | getAck () |
unsigned long | getCounter (enum counterTypes counter) |
roch_driver::RawData | getdata () |
bool | isConfigured () |
void | poll () |
Message * | popNext () |
Message * | popNext (enum MessageTypes type) |
void | printCounters (std::ostream &stream=std::cout) |
void | send (Message *m) |
Message * | sendRequest (Message *m) |
Message * | waitNext (double timeout=0.0) |
Message * | waitNext (enum MessageTypes type, double timeout=0.0) |
Static Public Member Functions | |
static Transport & | instance () |
Public Attributes | |
int | counter_number |
Static Public Attributes | |
static const char * | counter_names [NUM_COUNTERS] |
Protected Member Functions | |
Transport () | |
~Transport () | |
Private Member Functions | |
int | closeComm () |
void | enqueueMessage (Message *msg) |
int | openComm (const char *device) |
void | resetCounters () |
Message * | rxMessage () |
Private Attributes | |
bool | configured |
unsigned long | counters [NUM_COUNTERS] |
int | retries |
roch_driver | rochDriver |
std::list< Message * > | rx_queue |
void * | serial |
Static Private Attributes | |
static const size_t | MAX_QUEUE_LEN = 10000 |
static const int | RETRY_DELAY_MS = 200 |
Definition at line 89 of file Transport.h.
Definition at line 92 of file Transport.h.
sawyer::Transport::Transport | ( | ) | [protected] |
Constructs an unconfigured transport instance.
Definition at line 138 of file Transport.cpp.
sawyer::Transport::~Transport | ( | ) | [protected] |
Definition at line 149 of file Transport.cpp.
int sawyer::Transport::close | ( | ) |
Close this Transport.
Definition at line 192 of file Transport.cpp.
int sawyer::Transport::closeComm | ( | ) | [private] |
Closes the associated serial port
Definition at line 227 of file Transport.cpp.
void sawyer::Transport::configure | ( | const char * | device, |
int | retries | ||
) |
Configure this Transport for communication. If this Transport is already configured, it will be closed and reconfigured. The RX buffer and Message queue will be flushed. Counters will be reset.
device | The device to communicate over. (Currently, must be serial) |
retries | Number of times to resend an unacknowledged message. |
TransportException | if configuration fails |
Definition at line 164 of file Transport.cpp.
void sawyer::Transport::enqueueMessage | ( | Message * | msg | ) | [private] |
Add a Message to the Message queue. Checks Message validity, and drops invalid messages. Trims queue down to size if it gets too big.
msg | The message to enqueue. |
Definition at line 350 of file Transport.cpp.
void sawyer::Transport::flush | ( | std::list< Message * > * | queue = 0 | ) |
void sawyer::Transport::flush | ( | enum MessageTypes | type, |
std::list< Message * > * | queue = 0 |
||
) |
Read data until an ack message is found. Any data messages received by this function will be queued.
Definition at line 315 of file Transport.cpp.
unsigned long sawyer::Transport::getCounter | ( | enum counterTypes | counter | ) | [inline] |
Definition at line 162 of file Transport.h.
roch_driver::RawData sawyer::Transport::getdata | ( | ) | [inline] |
Definition at line 103 of file Transport.h.
Transport & sawyer::Transport::instance | ( | ) | [static] |
Transport singleton instance accessor.
Definition at line 129 of file Transport.cpp.
bool sawyer::Transport::isConfigured | ( | ) | [inline] |
Definition at line 138 of file Transport.h.
int sawyer::Transport::openComm | ( | const char * | device | ) | [private] |
Opens a serial port with the default configuration (115200 bps, 8-N-1), using the device specified in the constructor
Definition at line 208 of file Transport.cpp.
void sawyer::Transport::poll | ( | ) |
Public function which makes sure buffered messages are still being read into the internal buffer. A compromise between forcing a thread-based implementation and blocking on results. This could be placed into a separate thread, but will need to be wrapped for thread safety
Definition at line 379 of file Transport.cpp.
Removes the oldest Message from the Message queue and returns it. All data waiting in the input buffer will be read and queued.
Definition at line 558 of file Transport.cpp.
Message * sawyer::Transport::popNext | ( | enum MessageTypes | type | ) |
Finds the oldest message of a specific type in the Message queue, removes it, and returns it. Older messages of the wrong type will be left in the queue. All data waiting in the input buffer will be read and queued.
Definition at line 581 of file Transport.cpp.
void sawyer::Transport::printCounters | ( | std::ostream & | stream = std::cout | ) |
Prints a nice list of counter values
Definition at line 741 of file Transport.cpp.
void sawyer::Transport::resetCounters | ( | ) | [private] |
Wipes out counters
Definition at line 767 of file Transport.cpp.
Message * sawyer::Transport::rxMessage | ( | ) | [private] |
Non-blocking message receive function. !!! Absolutely not reentrant !!! !!! Keeps internal static state !!!
Definition at line 242 of file Transport.cpp.
void sawyer::Transport::send | ( | Message * | m | ) |
Send a message. Waits for the firmware to acknowlge and resends the packet a few timew if not acknowledged.
m | The message to send |
Transport::Exception | if never acknowledged. |
Definition at line 408 of file Transport.cpp.
Message * sawyer::Transport::sendRequest | ( | Message * | m | ) |
Send a Request message. Waits for the firmware to acknowlge and resends the packet a few timew if not acknowledged.
m | The message to send |
Transport::Exception | if never acknowledged. |
Definition at line 485 of file Transport.cpp.
Message * sawyer::Transport::waitNext | ( | double | timeout = 0.0 | ) |
Fetch a message, blocking if there are no messages currently available.
timeout | Maximum time to block, in seconds. Actual resolution is system dependent A timeout of 0.0 indicates no timeout. |
Definition at line 607 of file Transport.cpp.
Message * sawyer::Transport::waitNext | ( | enum MessageTypes | type, |
double | timeout = 0.0 |
||
) |
Fetch a particular type of message, blocking if one isn't available.
type | The type of message to fetch |
timeout | Maximum time to block, in seconds. Actual resolution is system dependent A timeout of 0.0 indicates no timeout. |
Definition at line 639 of file Transport.cpp.
bool sawyer::Transport::configured [private] |
Definition at line 105 of file Transport.h.
const char * sawyer::Transport::counter_names [static] |
{ "Garbled bytes", "Invalid messages", "Ignored acknowledgment", "Message queue overflow" }
Definition at line 100 of file Transport.h.
Definition at line 101 of file Transport.h.
unsigned long sawyer::Transport::counters[NUM_COUNTERS] [private] |
Definition at line 114 of file Transport.h.
const size_t sawyer::Transport::MAX_QUEUE_LEN = 10000 [static, private] |
Definition at line 112 of file Transport.h.
int sawyer::Transport::retries [private] |
Definition at line 107 of file Transport.h.
const int sawyer::Transport::RETRY_DELAY_MS = 200 [static, private] |
Definition at line 109 of file Transport.h.
roch_driver sawyer::Transport::rochDriver [private] |
Definition at line 108 of file Transport.h.
std::list<Message *> sawyer::Transport::rx_queue [private] |
Definition at line 111 of file Transport.h.
void* sawyer::Transport::serial [private] |
Definition at line 106 of file Transport.h.