21#include <sys/select.h>
27#include "vrpn_atmellib.h"
28#include "vrpn_atmellib_errno.h"
38struct termios init_params;
60 ret = select( fd+1 , &rfds , 0 , 0 , &wait);
64 printf(
"Atmel not connected to the specified port.\n");
65 printf(
"Connect and try again.\n");
71 printf(
"Error while checking if Atmel is connected.\n");
72 printf(
"Error: %s (%i)\n", strerror(errno), errno );
77 printf(
"Atmel started.\n\n");
89 const char *port,
long baud,
95#ifdef VRPN_ATMEL_SERIAL_VRPN
99 fprintf(stderr,
"vrpn_Atmel: can't Open serial port\n");
105 if ( (fd=openPort(port, baud, &init_params)) == -1) {
107 fprintf(stderr,
"vrpn_Atmel: can't Open serial port\n");
113 if (! check_serial(fd) ) {
121 catch (...) {
return NULL; }
123 if ( (self->vrpn_Analog_Server::setNumChannels(channel_count) != channel_count)
124 || (self->vrpn_Analog_Output_Server::setNumChannels(channel_count) != channel_count) ) {
126 fprintf(stderr,
"vrpn_Atmel: the requested number of channels is not available\n");
130 fprintf(stderr,
"vrpn_Atmel::Create(): delete failed\n");
139 self->init_channel_mode(channel_mode);
168#ifdef VRPN_ATMEL_SERIAL_VRPN
171 closePort(serial_fd , &init_params);
207 if (handle_new_connection()) {
211 fprintf(stderr,
"vrpn_Atmel: mainloop()\n");
212 fprintf(stderr,
" new connection. status set to RUNNING\n");
218 fprintf(stderr,
"vrpn_Atmel: mainloop()\n");
219 fprintf(stderr,
" error handling new connection. status set to ERROR\n");
227 if ( ! mainloop_serial_io() ) {
229 fprintf(stderr,
"vrpn_Atmel: mainloop()\n");
230 fprintf(stderr,
" error while io operations ERROR\n");
244vrpn_Atmel::Check_Serial_Alive()
246 struct timeval look_time;
254 tcflush(serial_fd, TCIOFLUSH);
262 FD_SET( serial_fd, &rfds );
267 if ((select( (serial_fd+1) , &rfds , 0 , 0 , &look_time)) <= 0) {
269 fprintf(stderr,
"\nExiting...\n");
271 fprintf(stderr,
"vrpn_Atmel::Check_Serial_Alive: connection timed out after (sec,msec):");
273 fprintf(stderr,
"Killing Program!!!\n");
278#ifdef VRPN_ATMEL_VERBOSE
279 fprintf(stderr,
"Connection still available...\n");
290vrpn_Atmel::mainloop_serial_io()
296 if (!Check_Serial_Alive()) {
319 fprintf(stderr,
"vrpn_Atmel: mainloop_serial_io()\n");
320 fprintf(stderr,
" channel not writable\n");
330 fprintf(stderr,
"vrpn_Atmel: mainloop_serial_io()\n");
331 fprintf(stderr,
" value out of range\n");
339 if (setRegister(serial_fd, i, (
unsigned char)
o_channel[i])
340 != ATMELLIB_NOERROR) {
342 fprintf(stderr,
"vrpn_Atmel: mainloop_serial_io()\n");
343 fprintf(stderr,
" error writing down value, channel: %d\n",i);
351 fprintf(stderr,
"vrpn_Atmel: mainloop_serial_io()\n");
352 fprintf(stderr,
" written down value, channel: %d\n",i);
366 if ( (
channel[i] = getRegister(serial_fd, i)) < 0) {
368#ifdef VRPN_ATMEL_VERBOSE
369 fprintf(stderr,
"Channel read: i=%i val=%f\n",i,
channel[i]);
371 fprintf(stderr,
"vrpn_Atmel: mainloop_serial_io()\n");
372 fprintf(stderr,
" error reading out value. channel=%d\n",i);
396vrpn_Atmel::init_channel_mode(
int * channel_mode)
402 _channel_mode.push_back(channel_mode[i]);
408 val=getRegister(serial_fd , i);
412 fprintf(stderr,
"vrpn_Atmel: init_channel_mode()\n");
413 fprintf(stderr,
" error reading out value: %i\n", val);
423#ifdef VRPN_ATMEL_VERBOSE
424 fprintf(stderr,
"vrpn_Atmel: i=%d val=%d\n",i ,val);
444vrpn_Atmel::handle_new_connection()
449 printf(
"\nconnection received.\n\n");
vrpn_float64 o_channel[vrpn_CHANNEL_MAX]
vrpn_float64 channel[vrpn_CHANNEL_MAX]
virtual void report(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY, const struct timeval time=vrpn_ANALOG_NOW)
Send a report whether something has changed or not (for servers) Optionally, tell what time to stamp ...
void mainloop()
For this server, the user must normally call report() or report_changes() directly....
static vrpn_Atmel * Create(char *name, vrpn_Connection *c, const char *port="/dev/ttyS0/", long baud=9600, int channel_count=0, int *channel_mode=NULL)
vrpn_Connection * d_connection
Connection that this object talks to.
void server_mainloop(void)
Handles functions that all servers should provide in their mainloop() (ping/pong, for example) Should...
Generic connection class not specific to the transport mechanism.
virtual vrpn_bool connected(void) const
Returns vrpn_true if the connection has been established, vrpn_false if not (For a networkless connec...
virtual int mainloop(const struct timeval *timeout=NULL)=0
Call each time through program main loop to handle receiving any incoming messages and sending any pa...
#define VRPN_ATMEL_ALIVE_INTERVAL_SEC
#define VRPN_ATMEL_MODE_RO
#define VRPN_ATMEL_STATUS_RUNNING
#define VRPN_ATMEL_STATUS_ERROR
#define VRPN_ATMEL_ERROR_READING_IN
#define VRPN_ATMEL_ALIVE_TIME_LOOK_SEC
#define VRPN_ATMEL_MODE_WO
#define VRPN_ATMEL_CHANNEL_NOT_VALID
#define VRPN_ATMEL_ERROR_OUT_OF_RANGE
#define VRPN_ATMEL_ALIVE_TIME_LOOK_USEC
#define VRPN_ATMEL_ERROR_NOT_WRITABLE
#define VRPN_ATMEL_STATUS_WAITING_FOR_CONNECTION
#define VRPN_ATMEL_ERROR_WRITING_DOWN
#define VRPN_ATMEL_MODE_RW
int vrpn_close_commport(int comm)
int vrpn_open_commport(const char *portname, long baud, int charsize, vrpn_SER_PARITY parity, bool rts_flow)
Open a serial port, given its name and baud rate.
#define vrpn_gettimeofday