Revision: 7075
http://playerstage.svn.sourceforge.net/playerstage/?rev=7075&view=rev
Author: thjc
Date: 2008-10-07 10:42:15 +0000 (Tue, 07 Oct 2008)
Log Message:
-----------
Merging changes from 2-1 to trunk
6987 P2-1 fixed up colour setting in graphics3d example
6989 P2-1 applied [ 2082498 ] fixed Geometry-Request
6990 P2-1 [ 2074625 ] serialstream fix for osx
6991 P2-1 aplpied [ 2046418 ] roomba driver: stall notification
6992 P2-1 applied [ 2016923 ] Error checking and better timeouts
in SICK LMS200
6993 P2-1 Applied [ 1998688 ] camerav4l patch
6994 P2-1 Applied [ 1957498 ] Fixes for segfaults on the
InsideM300 RFID driver
6996 P2-1 added headers suggested by [ 2020265 ] gcc 4.3
compatibility
Modified Paths:
--------------
code/player/trunk/client_libs/libplayerc++/playerc++.h
code/player/trunk/examples/libplayerc++/clientgraphics3d.cc
code/player/trunk/server/drivers/actarray/amtecM5.cc
code/player/trunk/server/drivers/camera/v4l/camerav4l.cc
code/player/trunk/server/drivers/laser/lms400_cola.h
code/player/trunk/server/drivers/laser/sicklms200.cc
code/player/trunk/server/drivers/mixed/irobot/roomba/roomba_driver.cc
code/player/trunk/server/drivers/mixed/mricp/src/geometry2D.cpp
code/player/trunk/server/drivers/opaque/serialstream.cc
code/player/trunk/server/drivers/rfid/insideM300.cc
Property Changed:
----------------
code/player/trunk/
Property changes on: code/player/trunk
___________________________________________________________________
Modified: svn:mergeinfo
-
/code/player/branches/release-2-1-patches:6672-6673,6738,6834,6886,6905,6930,6936,6946,6951,6955,6975,6979-6981,6985
/code/player/trunk:6985
+
/code/player/branches/release-2-1-patches:6672-6673,6738,6834,6886,6905,6930,6936,6946,6951,6955,6975,6979-6981,6985,6987-6996
/code/player/trunk:6985
Modified: code/player/trunk/client_libs/libplayerc++/playerc++.h
===================================================================
--- code/player/trunk/client_libs/libplayerc++/playerc++.h 2008-10-07
10:27:52 UTC (rev 7074)
+++ code/player/trunk/client_libs/libplayerc++/playerc++.h 2008-10-07
10:42:15 UTC (rev 7075)
@@ -53,6 +53,7 @@
#include <string>
#include <list>
#include <vector>
+#include <cstring>
#include "libplayerc/playerc.h"
#include "libplayerc++/utility.h"
Modified: code/player/trunk/examples/libplayerc++/clientgraphics3d.cc
===================================================================
--- code/player/trunk/examples/libplayerc++/clientgraphics3d.cc 2008-10-07
10:27:52 UTC (rev 7074)
+++ code/player/trunk/examples/libplayerc++/clientgraphics3d.cc 2008-10-07
10:42:15 UTC (rev 7075)
@@ -57,7 +57,8 @@
for( r=3; r>0; r-=0.1 )
{
col.blue = (int)(r * 255.0 /3);
- col.red = (int)((255.0 - r * 255.0)/3);
+ col.red = 255 - col.blue;
+ gp.Color( col );
player_point_3d_t pts[4];
pts[0].px = -r;
Modified: code/player/trunk/server/drivers/actarray/amtecM5.cc
===================================================================
--- code/player/trunk/server/drivers/actarray/amtecM5.cc 2008-10-07
10:27:52 UTC (rev 7074)
+++ code/player/trunk/server/drivers/actarray/amtecM5.cc 2008-10-07
10:42:15 UTC (rev 7075)
@@ -600,14 +600,14 @@
pclDevice->getConfig(idModuleList[i],&configword);
uint8_t hasbrakes=0;
- if (configword && CONFIGID_MOD_BRAKE_PRESENT) {
+ if (configword & CONFIGID_MOD_BRAKE_PRESENT) {
hasbrakes=1;
} else {
hasbrakes=0;
}
uint8_t type=0;
- if (configword && CONFIGID_MOD_LINEAR) {
+ if (configword & CONFIGID_MOD_LINEAR) {
type=PLAYER_ACTARRAY_TYPE_LINEAR;
} else {
type=PLAYER_ACTARRAY_TYPE_ROTARY;
Modified: code/player/trunk/server/drivers/camera/v4l/camerav4l.cc
===================================================================
--- code/player/trunk/server/drivers/camera/v4l/camerav4l.cc 2008-10-07
10:27:52 UTC (rev 7074)
+++ code/player/trunk/server/drivers/camera/v4l/camerav4l.cc 2008-10-07
10:42:15 UTC (rev 7075)
@@ -174,7 +174,8 @@
#include <errno.h>
#include <string.h>
#include <math.h>
-#include <stdlib.h> // for atoi(3)
+#include <stddef.h>
+#include <stdlib.h> // for malloc() and free()
#include <unistd.h>
#include <time.h>
@@ -220,6 +221,10 @@
// Pixel depth
private: int depth;
+ // Format
+
+ private: uint32_t format;
+
// Camera palette
private: const char *palette;
@@ -263,16 +268,13 @@
private: time_t publish_time;
- // Data to send to server
- private: player_camera_data_t data;
-
};
// Initialization function
Driver* CameraV4L_Init( ConfigFile* cf, int section)
{
- return ((Driver*) (new CameraV4L( cf, section)));
+ return (reinterpret_cast<Driver *>(new CameraV4L( cf, section)));
}
@@ -373,28 +375,28 @@
{
fg_set_format(this->fg, VIDEO_PALETTE_GREY);
this->frame = frame_new(this->width, this->height, VIDEO_PALETTE_GREY );
- this->data.format = PLAYER_CAMERA_FORMAT_MONO8;
+ this->format = PLAYER_CAMERA_FORMAT_MONO8;
this->depth = 8;
}
else if (strcasecmp(this->palette, "RGB565") == 0)
{
fg_set_format(this->fg, VIDEO_PALETTE_RGB565 );
this->frame = frame_new(this->width, this->height, VIDEO_PALETTE_RGB565 );
- this->data.format = PLAYER_CAMERA_FORMAT_RGB565;
+ this->format = PLAYER_CAMERA_FORMAT_RGB565;
this->depth = 16;
}
else if (strcasecmp(this->palette, "RGB888") == 0)
{
fg_set_format(this->fg, VIDEO_PALETTE_RGB24 );
this->frame = frame_new(this->width, this->height, VIDEO_PALETTE_RGB24 );
- this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
+ this->format = PLAYER_CAMERA_FORMAT_RGB888;
this->depth = 24;
}
else if (strcasecmp(this->palette, "RGB32") == 0)
{
fg_set_format(this->fg, VIDEO_PALETTE_RGB32 );
this->frame = frame_new(this->width, this->height, VIDEO_PALETTE_RGB32 );
- this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
+ this->format = PLAYER_CAMERA_FORMAT_RGB888;
this->depth = 32;
}
else if (strcasecmp(this->palette, "YUV420P") == 0)
@@ -403,25 +405,23 @@
// 1.6.2 and earlier
fg_set_format(this->fg, VIDEO_PALETTE_YUV420P);
this->frame = frame_new(this->width, this->height, VIDEO_PALETTE_YUV420P );
- this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
+ this->format = PLAYER_CAMERA_FORMAT_RGB888;
this->depth = 24;
this->rgb_converted_frame = frame_new(this->width,
this->height, VIDEO_PALETTE_RGB24 );
- // this->data.format = PLAYER_CAMERA_FORMAT_MONO8;
- // this->depth = 8;
}
else if (strcasecmp(this->palette, "YUV420P_GREY") == 0)
{
fg_set_format(this->fg, VIDEO_PALETTE_YUV420P);
this->frame = frame_new(this->width, this->height, VIDEO_PALETTE_YUV420P );
- this->data.format = PLAYER_CAMERA_FORMAT_MONO8;
+ this->format = PLAYER_CAMERA_FORMAT_MONO8;
this->depth = 8;
}
else if (strcasecmp(this->palette, "JPEG") == 0)
{
fg_set_format(this->fg, VIDEO_PALETTE_JPEG );
this->frame = frame_new(this->width, this->height, VIDEO_PALETTE_JPEG );
- this->data.format = PLAYER_CAMERA_FORMAT_RGB888;
+ this->format = PLAYER_CAMERA_FORMAT_RGB888;
this->depth = 24;
}
else
@@ -450,7 +450,7 @@
// Free resources
frame_release(this->frame);
if ((this->frame->format == VIDEO_PALETTE_YUV420P)&&
- (this->data.format == PLAYER_CAMERA_FORMAT_RGB888))
+ (this->format == PLAYER_CAMERA_FORMAT_RGB888))
frame_release(this->rgb_converted_frame);
fg_close(this->fg);
return 0;
@@ -510,7 +510,7 @@
//printf("click %d\n", frameno);
snprintf(filename, sizeof(filename), "click-%04d.ppm", frameno++);
if ((this->frame->format == VIDEO_PALETTE_YUV420P)&&
- (this->data.format == PLAYER_CAMERA_FORMAT_RGB888))
+ (this->format == PLAYER_CAMERA_FORMAT_RGB888))
{
frame_save(this->rgb_converted_frame, filename);
//printf("saved converted frame\n");
@@ -528,12 +528,12 @@
void * data)
{
assert(hdr);
- assert(data);
/* We currently don't support any messages, but if we do...
if(Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ,
PLAYER_CAMERA_REQ_GET_GEOM, this->device_addr))
{
+ assert(data);
assert(hdr->size == sizeof(player_position2d_data_t));
ProcessGetGeom(hdr, *reinterpret_cast<player_camera_data_t *> (data));
return(0);
@@ -544,60 +544,96 @@
return -1;
}
+#define IS_JPEG(ptr) ((((ptr)[0]) == 0xff) && (((ptr)[1]) == 0xd8))
+
////////////////////////////////////////////////////////////////////////////////
// Update the device data (the data going back to the client).
void CameraV4L::RefreshData()
{
int i;
- size_t image_count;
unsigned char * ptr1, * ptr2;
+ player_camera_data_t * data = reinterpret_cast<player_camera_data_t
*>(malloc(sizeof(player_camera_data_t)));
- // Compute size of image
- image_count = this->width * this->height * this->depth / 8;
+ if (!data)
+ {
+ PLAYER_ERROR("Out of memory!");
+ return;
+ }
// Set the image properties
- this->data.width = this->width;
- this->data.height = this->height;
- this->data.bpp = this->depth;
- this->data.image_count = image_count;
- this->data.image = new unsigned char [image_count];
- this->data.compression = PLAYER_CAMERA_COMPRESS_RAW;
+ data->width = this->width;
+ data->height = this->height;
+ data->bpp = this->depth;
+ data->format = this->format;
+ data->fdiv = 0;
+ data->image_count = 0;
+ data->image = NULL;
+ data->compression = PLAYER_CAMERA_COMPRESS_RAW;
if (have_ov519)
{
- this->data.image_count = (*(unsigned short *)(frame->data))*8;
- assert(data.image_count > 0);
- assert(data.image_count <= ((size_t)(this->frame->size)));
- this->data.compression = PLAYER_CAMERA_COMPRESS_JPEG;
- memcpy(data.image, &(((char*)frame->data)[2]), data.image_count);
+ data->image_count = (*(reinterpret_cast<unsigned short *>(frame->data))) *
8;
+ assert(data->image_count > 0);
+ assert(data->image_count <= static_cast<size_t>(this->frame->size));
+ data->image = reinterpret_cast<uint8_t *>(malloc(data->image_count));
+ if (!(data->image))
+ {
+ PLAYER_ERROR("Out of memory!");
+ free(data);
+ return;
+ }
+ data->compression = PLAYER_CAMERA_COMPRESS_JPEG;
+ memcpy(data->image, &((reinterpret_cast<char *>(frame->data))[2]),
data->image_count);
}
else if (this->fg->picture.palette == VIDEO_PALETTE_JPEG)
{
- this->data.compression = PLAYER_CAMERA_COMPRESS_JPEG;
memcpy(&i, this->frame->data, sizeof(int));
- data.image_count = i;
- assert(data.image_count > 0);
- assert(data.image_count <= ((size_t)(this->frame->size)));
- memcpy(data.image, ((unsigned char *)(this->frame->data)) + sizeof(int),
data.image_count);
+ data->image_count = i;
+ assert(data->image_count > 1);
+ assert(data->image_count <= static_cast<size_t>(this->frame->size));
+ if (!(IS_JPEG((reinterpret_cast<unsigned char *>(this->frame->data)) +
sizeof(int))))
+ {
+ PLAYER_ERROR("Not an JPEG image...");
+ free(data);
+ return;
+ }
+ data->image = reinterpret_cast<uint8_t *>(malloc(data->image_count));
+ if (!(data->image))
+ {
+ PLAYER_ERROR("Out of memory!");
+ free(data);
+ return;
+ }
+ data->compression = PLAYER_CAMERA_COMPRESS_JPEG;
+ memcpy(data->image, (reinterpret_cast<unsigned char *>(this->frame->data))
+ sizeof(int), data->image_count);
}
else
{
+ data->image_count = this->width * this->height * this->depth / 8;
+ assert(data->image_count > 0);
+ data->image = reinterpret_cast<uint8_t *>(malloc(data->image_count));
+ if (!(data->image))
+ {
+ PLAYER_ERROR("Out of memory!");
+ free(data);
+ return;
+ }
// Copy the image pixels
if ((this->frame->format == VIDEO_PALETTE_YUV420P) &&
- (this->data.format == PLAYER_CAMERA_FORMAT_RGB888))
+ (this->format == PLAYER_CAMERA_FORMAT_RGB888))
{// do conversion to RGB (which is bgr at the moment for some reason?)
- assert(data.image_count <= (size_t)
this->rgb_converted_frame->size);
+ assert(data->image_count <=
static_cast<size_t>(this->rgb_converted_frame->size));
ccvt_420p_bgr24(this->width, this->height,
- (unsigned char*) this->frame->data,
- (unsigned char*) this->rgb_converted_frame->data);
- ptr1 = (unsigned char *)this->rgb_converted_frame->data;
+ reinterpret_cast<unsigned char *>(this->frame->data),
+ reinterpret_cast<unsigned char
*>(this->rgb_converted_frame->data));
+ ptr1 = reinterpret_cast<unsigned char
*>(this->rgb_converted_frame->data);
}
else
{
- assert(data.image_count <= (size_t) this->frame->size);
- ptr1 = (unsigned char *)this->frame->data;
+ assert(data->image_count <=
static_cast<size_t>(this->frame->size));
+ ptr1 = reinterpret_cast<unsigned char *>(this->frame->data);
}
- ptr2 = this->data.image;
+ ptr2 = reinterpret_cast<unsigned char *>(data->image);
switch (this->depth)
{
case 24:
@@ -622,7 +658,7 @@
}
break;
default:
- memcpy(ptr2, ptr1, data.image_count);
+ memcpy(ptr2, ptr1, data->image_count);
}
}
@@ -630,17 +666,19 @@
{
if ((time(NULL) - (this->publish_time)) < (this->publish_interval))
{
- this->data.width = 0;
- this->data.height = 0;
- this->data.bpp = 0;
- this->data.image_count = 0;
+ data->width = 0;
+ data->height = 0;
+ data->bpp = 0;
+ data->image_count = 0;
+ free(data->image);
+ data->image = NULL;
} else this->publish_time = time(NULL);
}
Publish(this->device_addr,
PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE,
- reinterpret_cast<void*>(&this->data));
- delete [] this->data.image;
+ reinterpret_cast<void *>(data), 0, NULL, false);
+ // copy = false, don't dispose anything here!
return;
}
Modified: code/player/trunk/server/drivers/laser/lms400_cola.h
===================================================================
--- code/player/trunk/server/drivers/laser/lms400_cola.h 2008-10-07
10:27:52 UTC (rev 7074)
+++ code/player/trunk/server/drivers/laser/lms400_cola.h 2008-10-07
10:42:15 UTC (rev 7075)
@@ -12,6 +12,7 @@
#include <vector>
#include <netinet/in.h>
#include <libplayercore/player.h>
+#include <iostream>
#define BUF_SIZE 1024
Modified: code/player/trunk/server/drivers/laser/sicklms200.cc
===================================================================
--- code/player/trunk/server/drivers/laser/sicklms200.cc 2008-10-07
10:27:52 UTC (rev 7074)
+++ code/player/trunk/server/drivers/laser/sicklms200.cc 2008-10-07
10:42:15 UTC (rev 7075)
@@ -1660,43 +1660,6 @@
if(timeout_header == -1)
timeout_header = timeout;
- // If the timeout is infinite,
- // go to blocking io
- //
- if (timeout < 0)
- {
- //PLAYER_MSG0(2, "using blocking io");
- int flags = ::fcntl(this->laser_fd, F_GETFL);
- if (flags < 0)
- {
- PLAYER_ERROR("unable to get device flags");
- return 0;
- }
- if (::fcntl(this->laser_fd, F_SETFL, flags & (~O_NONBLOCK)) < 0)
- {
- PLAYER_ERROR("unable to set device flags");
- return 0;
- }
- }
- //
- // Otherwise, use non-blocking io
- //
- else
- {
- //PLAYER_MSG0(2, "using non-blocking io");
- int flags = ::fcntl(this->laser_fd, F_GETFL);
- if (flags < 0)
- {
- PLAYER_ERROR("unable to get device flags");
- return 0;
- }
- if (::fcntl(this->laser_fd, F_SETFL, flags | O_NONBLOCK) < 0)
- {
- PLAYER_ERROR("unable to set device flags");
- return 0;
- }
- }
-
int64_t start_time = GetTime();
int64_t stop_time = start_time + timeout;
int64_t stop_time_header = start_time + timeout_header;
@@ -1713,10 +1676,42 @@
while (true)
{
if (timeout >= 0)
- usleep(1000);
+ {
+ fd_set rfds, efds;
+ FD_ZERO(&rfds);
+ FD_SET(this->laser_fd, &rfds);
+ FD_ZERO(&efds);
+ FD_SET(this->laser_fd, &efds);
+ int64_t delay = stop_time_header - GetTime();
+ if (delay < 0) delay = 0;
+ struct timeval tv;
+ tv.tv_usec = (delay % 1000) * 1000;
+ tv.tv_sec = delay / 1000;
+ int retval = ::select(this->laser_fd + 1, &rfds, 0, &efds, &tv);
+ if (retval < 0)
+ {
+ PLAYER_ERROR("error on select (1)");
+ return 0;
+ }
+ if (!retval)
+ {
+ PLAYER_MSG0(2, "timeout on select (1)");
+ return 0;
+ }
+ }
//printf("reading %d\n", timeout); fflush(stdout);
bytes = ::read(this->laser_fd, header + sizeof(header) - 1, 1);
+ if (bytes < 0)
+ {
+ PLAYER_ERROR("error on read (1)");
+ return 0;
+ }
+ if (!bytes)
+ {
+ PLAYER_MSG0(2, "eof on read (1)");
+ return 0;
+ }
//printf("bytes read %d\n", bytes); fflush(stdout);
if (header[0] == STX && header[1] == 0x80)
@@ -1727,12 +1722,6 @@
break;
}
memmove(header, header + 1, sizeof(header) - 1);
- if (timeout >= 0 && GetTime() >= stop_time_header)
- {
- //PLAYER_MSG2(2, "%Ld %Ld", GetTime(), stop_time);
- PLAYER_MSG0(2, "timeout on read (1)");
- return 0;
- }
}
// Determine data length
@@ -1754,13 +1743,41 @@
while (bytes < len)
{
if (timeout >= 0)
- usleep(1000);
- bytes += ::read(this->laser_fd, data + bytes, len - bytes);
- if (timeout >= 0 && GetTime() >= stop_time)
{
- //PLAYER_MSG2(2, "%Ld %Ld", GetTime(), stop_time);
- RETURN_ERROR(0, "timeout on read (3)");
+ fd_set rfds, efds;
+ FD_ZERO(&rfds);
+ FD_SET(this->laser_fd, &rfds);
+ FD_ZERO(&efds);
+ FD_SET(this->laser_fd, &efds);
+ int64_t delay = stop_time - GetTime();
+ if (delay < 0) delay = 0;
+ struct timeval tv;
+ tv.tv_usec = (delay % 1000) * 1000;
+ tv.tv_sec = delay / 1000;
+ int retval = ::select(this->laser_fd + 1, &rfds, 0, &efds, &tv);
+ if (retval < 0)
+ {
+ PLAYER_ERROR("error on select (3)");
+ return 0;
+ }
+ if (!retval)
+ {
+ PLAYER_MSG0(2, "timeout on select (3)");
+ return 0;
+ }
}
+ int retval = ::read(this->laser_fd, data + bytes, len - bytes);
+ if (retval < 0)
+ {
+ PLAYER_ERROR("error on read (3)");
+ return 0;
+ }
+ if (!retval)
+ {
+ PLAYER_MSG0(2, "eof on read (3)");
+ return 0;
+ }
+ bytes += retval;
}
// Read in footer
@@ -1769,13 +1786,41 @@
while (bytes < 3)
{
if (timeout >= 0)
- usleep(1000);
- bytes += ::read(this->laser_fd, footer + bytes, 3 - bytes);
- if (timeout >= 0 && GetTime() >= stop_time)
{
- //PLAYER_MSG2(2, "%Ld %Ld", GetTime(), stop_time);
- RETURN_ERROR(0, "timeout on read (4)");
+ fd_set rfds, efds;
+ FD_ZERO(&rfds);
+ FD_SET(this->laser_fd, &rfds);
+ FD_ZERO(&efds);
+ FD_SET(this->laser_fd, &efds);
+ int64_t delay = stop_time - GetTime();
+ if (delay < 0) delay = 0;
+ struct timeval tv;
+ tv.tv_usec = (delay % 1000) * 1000;
+ tv.tv_sec = delay / 1000;
+ int retval = ::select(this->laser_fd + 1, &rfds, 0, &efds, &tv);
+ if (retval < 0)
+ {
+ PLAYER_ERROR("error on select (4)");
+ return 0;
+ }
+ if (!retval)
+ {
+ PLAYER_MSG0(2, "timeout on select (4)");
+ return 0;
+ }
}
+ int retval = ::read(this->laser_fd, footer + bytes, 3 - bytes);
+ if (retval < 0)
+ {
+ PLAYER_ERROR("error on read (4)");
+ return 0;
+ }
+ if (!retval)
+ {
+ PLAYER_MSG0(2, "eof on read (4)");
+ return 0;
+ }
+ bytes += retval;
}
// Construct entire packet
Modified: code/player/trunk/server/drivers/mixed/irobot/roomba/roomba_driver.cc
===================================================================
--- code/player/trunk/server/drivers/mixed/irobot/roomba/roomba_driver.cc
2008-10-07 10:27:52 UTC (rev 7074)
+++ code/player/trunk/server/drivers/mixed/irobot/roomba/roomba_driver.cc
2008-10-07 10:42:15 UTC (rev 7075)
@@ -325,6 +325,7 @@
posdata.pos.px = this->roomba_dev->ox;
posdata.pos.py = this->roomba_dev->oy;
posdata.pos.pa = this->roomba_dev->oa;
+ posdata.stall = static_cast<uint8_t>(this->bumplocked);
this->Publish(this->position_addr,
PLAYER_MSGTYPE_DATA, PLAYER_POSITION2D_DATA_STATE,
Modified: code/player/trunk/server/drivers/mixed/mricp/src/geometry2D.cpp
===================================================================
--- code/player/trunk/server/drivers/mixed/mricp/src/geometry2D.cpp
2008-10-07 10:27:52 UTC (rev 7074)
+++ code/player/trunk/server/drivers/mixed/mricp/src/geometry2D.cpp
2008-10-07 10:42:15 UTC (rev 7075)
@@ -6,6 +6,7 @@
#include <cmath>
#include <cassert>
#include <stdio.h>
+#include <iostream>
using namespace std;
Modified: code/player/trunk/server/drivers/opaque/serialstream.cc
===================================================================
--- code/player/trunk/server/drivers/opaque/serialstream.cc 2008-10-07
10:27:52 UTC (rev 7074)
+++ code/player/trunk/server/drivers/opaque/serialstream.cc 2008-10-07
10:42:15 UTC (rev 7075)
@@ -61,6 +61,9 @@
- buffer_size (integer
- The size of the buffer to be used when reading, this is the maximum that
can be read in one read command
- Default 4096
+
+- parity
+ - The parity that you want. Vaid vaules are "none" (default), "even", "odd"
@par Example
@@ -390,7 +393,9 @@
}
// save the current io settings
- tcgetattr(opaque_fd, &oldtio);
+ if (tcgetattr(opaque_fd, &oldtio) < 0) {
+ PLAYER_WARN("Failed to get old tty attributes");
+ }
// set up new settings
UpdateFlags();
@@ -416,7 +421,13 @@
// set up new settings
struct termios newtio;
memset(&newtio, 0,sizeof(newtio));
- newtio.c_cflag = CS8 | CREAD;
+
+ if(tcgetattr( this->opaque_fd, &newtio ) < 0 )
+ PLAYER_WARN("Failed to get old tty attribltes");
+
+ newtio.c_cc[VMIN] = 0;
+ newtio.c_cc[VTIME] = 0;
+ newtio.c_cflag = CS8 | CREAD;
newtio.c_iflag = INPCK;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
@@ -428,8 +439,9 @@
newtio.c_cflag |= PARENB | PARODD;
else
PLAYER_WARN("Invalid parity. Defaulting to none.");
-
- tcsetattr(opaque_fd, TCSANOW, &newtio);
+
+ if(tcsetattr(opaque_fd, TCSANOW, &newtio) < 0)
+ PLAYER_ERROR("Failed to set new tty device attributes");
tcflush(opaque_fd, TCIOFLUSH);
}
Modified: code/player/trunk/server/drivers/rfid/insideM300.cc
===================================================================
--- code/player/trunk/server/drivers/rfid/insideM300.cc 2008-10-07 10:27:52 UTC
(rev 7074)
+++ code/player/trunk/server/drivers/rfid/insideM300.cc 2008-10-07 10:42:15 UTC
(rev 7075)
@@ -22,6 +22,7 @@
Author: Radu Bogdan Rusu
Date: 25 Jan 2006
CVS: $Id$
+ Fixes by Alexis Maldonado <maldonad //at// cs.tum.edu>. April/2008.
*/
/** @ingroup drivers */
@@ -225,7 +226,6 @@
// Destructor.
InsideM300::~InsideM300()
{
- free(Data.tags);
}
////////////////////////////////////////////////////////////////////////////////
@@ -380,6 +380,14 @@
tcsetattr (this->fd, TCSANOW, &this->initial_options);
close (this->fd);
+ for (unsigned int i=0; i != allocated_tags; ++i) {
+ delete [] Data.tags[i].guid;
+ }
+
+ free(Data.tags);
+ Data.tags=NULL;
+ allocated_tags=0;
+
PLAYER_MSG0 (1, "> InsideM300 driver shutting down... [done]");
return (0);
}
@@ -459,7 +467,7 @@
// RefreshData function
void InsideM300::RefreshData ()
{
- memset (&this->Data, 0, sizeof (player_rfid_data_t));
+ memset (&this->Data, 0, sizeof (Data));
// Get the time at which we started reading
// This will be a pretty good estimate of when the phenomena occured
@@ -680,10 +688,12 @@
if (this->Data.tags_count >=
this->allocated_tags)
{
this->allocated_tags =
this->Data.tags_count+1;
- this->Data.tags =
(player_rfid_tag_t*)realloc(this->Data.tags,sizeof(this->Data.tags[0])*this->allocated_tags);
+ this->Data.tags =
(player_rfid_tag_t*)realloc(this->Data.tags,sizeof(player_rfid_tag_t)*this->allocated_tags);
+
this->Data.tags[this->Data.tags_count].guid_count = 8;
+
this->Data.tags[this->Data.tags_count].guid=new char[8];
+
}
this->Data.tags[this->Data.tags_count].type =
chipAnswer[1];
-
this->Data.tags[this->Data.tags_count].guid_count = 8;
int j;
for (j = 0; j < 8; j++)
this->Data.tags[this->Data.tags_count].guid[j] =
@@ -760,10 +770,11 @@
if (this->Data.tags_count >= this->allocated_tags)
{
this->allocated_tags = this->Data.tags_count+1;
- this->Data.tags =
(player_rfid_tag_t*)realloc(this->Data.tags,sizeof(this->Data.tags[0])*this->allocated_tags);
+ this->Data.tags =
(player_rfid_tag_t*)realloc(this->Data.tags,sizeof(player_rfid_tag_t)*this->allocated_tags);
+
this->Data.tags[this->Data.tags_count].guid_count = 8;
+ this->Data.tags[this->Data.tags_count].guid=new
char[8];
}
this->Data.tags[this->Data.tags_count].type =
chipAnswer[1];
- this->Data.tags[this->Data.tags_count].guid_count = 8;
int j;
for (j = 0; j < 8; j++)
this->Data.tags[this->Data.tags_count].guid[j]
= chipAnswer [9-j];
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit