Revision: 8043
http://playerstage.svn.sourceforge.net/playerstage/?rev=8043&view=rev
Author: gbiggs
Date: 2009-07-16 21:31:57 +0000 (Thu, 16 Jul 2009)
Log Message:
-----------
Removed duplicate driver
Modified Paths:
--------------
code/player/trunk/server/drivers/imu/CMakeLists.txt
Removed Paths:
-------------
code/player/trunk/server/drivers/imu/rt3xxx.cc
Modified: code/player/trunk/server/drivers/imu/CMakeLists.txt
===================================================================
--- code/player/trunk/server/drivers/imu/CMakeLists.txt 2009-07-16 19:50:26 UTC
(rev 8042)
+++ code/player/trunk/server/drivers/imu/CMakeLists.txt 2009-07-16 21:31:57 UTC
(rev 8043)
@@ -4,5 +4,3 @@
PLAYERDRIVER_REQUIRE_HEADER (nimu build_nimu usb.h)
PLAYERDRIVER_ADD_DRIVER (nimu build_nimu LINKFLAGS "-lusb" SOURCES nimu.cpp
nimuplayer.cpp)
-PLAYERDRIVER_OPTION (rt3xxx build_re3xxx ON)
-PLAYERDRIVER_ADD_DRIVER (rt3xxx build_rt3xxx SOURCES rt3xxx.cc)
Deleted: code/player/trunk/server/drivers/imu/rt3xxx.cc
===================================================================
--- code/player/trunk/server/drivers/imu/rt3xxx.cc 2009-07-16 19:50:26 UTC
(rev 8042)
+++ code/player/trunk/server/drivers/imu/rt3xxx.cc 2009-07-16 21:31:57 UTC
(rev 8043)
@@ -1,429 +0,0 @@
-/*
- * Player - One Hell of a Robot Server
- * Copyright (C) 2003
- * Brian Gerkey
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
- /** @ingroup drivers */
-/** @{ */
-/** @defgroup driver_rt3xxx rt3xxx
- * @brief Driver for the RT3XXX
-
-Provides a gps interface to an RT3xxx inertial navigation
-unit. It may work for other units as it only receives data
-and does not communicate with the unit.
-
-...@par Compile-time dependencies
-
-- None.
-
-...@par Provides
-
-- @ref interface_gps
-
-...@par Requires
-
-- None.
-
-...@par Configuration requests
-
-- None.
-
-...@par Configuration file options
-
-- None.
-
-...@par Example
-
-...@verbatim
-driver
-(
- name "rt3xxx"
- provides ["gps:0"]
-)
-...@endverbatim
-
-...@author Mike Roddewig [email protected]
-
-*/
-/** @} */
-
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <math.h>
-
-#include <libplayercore/playercore.h>
-
-#define RT_PORT 3000 // The port the rt is broadcasting on.
-
-#define MAXBUFLEN 128
-
-// Message levels
-
-#define MESSAGE_ERROR 0
-#define MESSAGE_INFO 1
-#define MESSAGE_DEBUG 2
-
-
-
-////////////////////////////////////////////////////////////////////////////////
-// The class for the driver
-class rt3xxx : public ThreadedDriver
-{
- public:
- rt3xxx(ConfigFile* cf, int section);
-
- // This method will be invoked on each incoming message
- virtual int ProcessMessage(QueuePointer &resp_queue,
- player_msghdr * hdr,
- void * data);
- virtual int MainSetup();
- virtual void MainQuit();
-
- private:
- int sockfd;
- char buf[MAXBUFLEN];
- player_gps_data_t gps_data;
- player_devaddr_t gps_addr;
- double lat_long_scale_factor;
- double rt_heading_scale_factor;
-
- // Main function for device thread.
- virtual void Main();
-
- int ProcessPacket();
-
- void PublishGPSData();
-};
-
-// A factory creation function, declared outside of the class so that it
-// can be invoked without any object context (alternatively, you can
-// declare it static in the class). In this function, we create and return
-// (as a generic Driver*) a pointer to a new instance of this driver.
-Driver*
-rt3xxx_Init(ConfigFile* cf, int section)
-{
- // Create and return a new instance of this driver
- return((Driver*)(new rt3xxx(cf, section)));
-}
-
-// A driver registration function, again declared outside of the class so
-// that it can be invoked without object context. In this function, we add
-// the driver into the given driver table, indicating which interface the
-// driver can support and how to create a driver instance.
-void rt3xxx_register(DriverTable* table)
-{
- table->AddDriver("rt3xxx", rt3xxx_Init);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Constructor. Retrieve options from the configuration file and do any
-// pre-Setup() setup.
-rt3xxx::rt3xxx(ConfigFile* cf, int section) : ThreadedDriver(cf, section) {
- memset (&this->gps_addr, 0, sizeof (player_devaddr_t));
-
- // Check the config file to see if we are providing a GPS interface.
- if (cf->ReadDeviceAddr(&(this->gps_addr), section, "provides",
- PLAYER_GPS_CODE, -1, NULL) == 0) {
- if (this->AddInterface(this->gps_addr) != 0) {
- PLAYER_ERROR("Error adding GPS interface.");
- SetError(-1);
- return;
- }
- }
-
- return;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Set up the device. Return 0 if things go well, and -1 otherwise.
-int rt3xxx::MainSetup()
-{
- struct sockaddr_in address;
- int broadcast = 1;
-
- PLAYER_MSG0(MESSAGE_INFO, "rt3xxx setting up.");
-
- sockfd = socket(PF_INET, SOCK_DGRAM, 0);
-
- if (sockfd == -1) {
- PLAYER_ERROR("rt3xxx: failed to get socket.");
- return -1;
- }
-
- address.sin_family = AF_INET;
- address.sin_addr.s_addr = INADDR_ANY;
- address.sin_port = htons(RT_PORT);
-
- if (bind(sockfd, (struct sockaddr *) &address, sizeof(address)) == -1) {
- PLAYER_ERROR("rt3xxx: failed to bind socket.");
- return -1;
- }
-
- if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast,
sizeof(int)) == -1) {
- PLAYER_ERROR("rt3xxx: failed to set broadcast flag.");
- return -1;
- }
-
- this->lat_long_scale_factor = pow(10.0, 7.0);
- this->rt_heading_scale_factor = pow(10.0, -6.0);
-
- PLAYER_MSG0(MESSAGE_INFO, "rt3xxx driver ready.");
-
- return(0);
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// Shutdown the device
-void rt3xxx::MainQuit()
-{
- PLAYER_MSG0(MESSAGE_INFO, "Shutting rt3xxx driver down.");
-
- close(this->sockfd);
-
- PLAYER_MSG0(MESSAGE_INFO, "rt3xxx driver has been shutdown.");
-
- return;
-}
-
-int rt3xxx::ProcessMessage(QueuePointer & resp_queue,
- player_msghdr
* hdr,
- void * data)
-{
- // Process messages here. Send a response if necessary, using Publish().
- // If you handle the message successfully, return 0. Otherwise,
- // return -1, and a NACK will be sent for you, if a response is required.
- return(-1);
-}
-
-int rt3xxx::ProcessPacket() {
- int numbytes;
-
- char nav_status;
- double latitude;
- double * latitude_pointer;
- double longitude;
- double * longitude_pointer;
- float altitude;
- float * altitude_pointer;
- unsigned char num_satellites;
- unsigned char position_mode;
- unsigned char velocity_mode;
- static long gps_time_minutes; // The GPS time in minutes is not
transmitted
- // with every
packet so it needs to persist over
- // multiple
function calls.
- double heading;
- unsigned char hdop;
- unsigned char pdop;
-
-
- numbytes = recv(sockfd, &buf, MAXBUFLEN-1 , 0);
-
- if (numbytes == -1) {
- return -1;
- }
- else if (numbytes != 72) {
- // We got a packet, but it's something weird. We'll discard it
- // rather than take our chances.
-
- PLAYER_MSG0(MESSAGE_DEBUG, "Received packet of the wrong
size.");
-
- return -2;
- }
- else {
- // So far, so good. Process the packet. There are certainly lots
- // of interesting tidbits that the RT reports, but so far we
only
- // use the data supported by the GPS interface.
-
- if (((unsigned char) buf[numbytes-1]) != 0xE7) {
- // We expect the last (?) character to be the "sync"
character
- // of 0xE7. The documentation specifies that the sync
character
- // should be the first byte of the packet but in
reality it appears
- // to be the last. Huh.
-
- PLAYER_MSG0(MESSAGE_DEBUG, "Failed to locate the sync
character.");
-
- return -3;
- }
-
- nav_status = buf[20];
-
- switch (nav_status) {
- case 0x00:
- // All quantities in the packet are invalid?!
Time to quit.
-
- PLAYER_MSG0(MESSAGE_DEBUG, "Init state: 0. All
quantities invalid.");
-
- return 0;
- case 0x01:
- // IMU measurements only. No position data.
Time to quit.
-
- PLAYER_MSG0(MESSAGE_DEBUG, "Init state: 1. IMU
measurements only.");
-
- return 0;
- case 0x02:
- // Initialization mode. No position data
(though the time
- // is valid). Time to quit, heh.
-
- PLAYER_MSG0(MESSAGE_DEBUG, "Init state: 2.
Initialization mode.");
-
- return 0;
- case 0x03:
- // The RT is acquiring lock. Apparently this
mode lasts a
- // max of 10 seconds, so we can wait (can
you?). Time to
- // quit.
-
- PLAYER_MSG0(MESSAGE_DEBUG, "Init state: 3.
Acquiring lock.");
-
- return 0;
- case 0x04:
- // Locked and loaded. Let's get our data!
-
- this->gps_data.time_sec = (uint32_t)
gps_time_minutes * 60;
- this->gps_data.time_usec = buf[0];
- this->gps_data.time_usec += buf[1] << 8;
-
- // Retrieve the lat/long data. It's a real pity
that the RT
- // does not provide position in UTM
coordinates, as every
- // true navigation geek knows that UTM is the
superior
- // coordinate system ;).
-
- // I don't like it, but it appears we have to
be tricky in
- // order to load this double into memory. We
declare a
- // pointer and set it to start at the location
of the double
- // in the buffer.
-
- latitude_pointer = (double *) &buf[22];
- latitude = *latitude_pointer;
-
- longitude_pointer = (double *) &buf[30];
- longitude = *longitude_pointer;
-
- altitude_pointer = (float *) &buf[38];
- altitude = *altitude_pointer;
-
- heading = (double) buf[51];
- heading += (double) (buf[52] << 8);
- heading += (double) (buf[53] << 16);
-
- // Convert the RT units to Player units.
-
- // Lat/long to degrees (the RT reports in
radians).
-
- latitude = latitude * (180.0/M_PI);
- longitude = longitude * (180.0/M_PI);
-
- // Apply a scaling of 10^7 (why not a power of
two Player?).
- latitude = latitude *
this->lat_long_scale_factor;
- longitude = longitude *
this->lat_long_scale_factor;
-
- this->gps_data.latitude = (int32_t) latitude;
- this->gps_data.longitude = (int32_t) longitude;
-
- // Player wants altitude in millimeters.
-
- this->gps_data.altitude = (int32_t) (altitude *
1000);
-
- // Convert heading to radians and then to
degrees.
-
- heading = heading *
this->rt_heading_scale_factor; // Convert to radians in units of one radian.
- heading += M_PI;
- heading = heading * (180.0/M_PI); // Convert to
degrees.
-
- if (buf[61] == 0) {
- // The status information contains data
we're interested
- // in.
-
- gps_time_minutes = buf[62];
- gps_time_minutes += buf[63] << 8;
- gps_time_minutes += buf[64] << 16;
- gps_time_minutes += buf[65] << 24;
-
- num_satellites = buf[66];
- position_mode = buf[67];
- velocity_mode = buf[68];
-
- this->gps_data.num_sats = (uint32_t)
num_satellites;
-
- if (position_mode < 2) {
- // Invalid.
-
- this->gps_data.quality = 0;
- }
- else if (position_mode < 7) {
- // No SBAS.
-
- this->gps_data.quality = 1;
- }
- else {
- // Some form of augmentation
system is present.
-
- this->gps_data.quality = 2;
- }
- }
- else if (buf[61] == 48) {
- hdop = buf[64];
- pdop = buf[65];
-
- this->gps_data.hdop = (uint32_t) (hdop
* 10);
- }
-
- return 0;
- }
- }
-
- return 0;
-}
-
-
-
-////////////////////////////////////////////////////////////////////////////////
-// Main function for device thread
-void rt3xxx::Main()
-{
- // The main loop; interact with the device here
- for(;;)
- {
- ProcessPacket();
-
- // Publish the received data.
- rt3xxx::PublishGPSData();
- }
-}
-
-void rt3xxx::PublishGPSData() {
- this->Publish(
- this->gps_addr,
- PLAYER_MSGTYPE_DATA,
- PLAYER_GPS_DATA_STATE,
- (void *) &this->gps_data,
- sizeof(player_gps_data_t),
- NULL
- );
-}
-
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge
This is your chance to win up to $100,000 in prizes! For a limited time,
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit