Revision: 6930 http://playerstage.svn.sourceforge.net/playerstage/?rev=6930&view=rev Author: thjc Date: 2008-07-27 02:59:19 +0000 (Sun, 27 Jul 2008)
Log Message: ----------- fix for Cmucam2 which was not matching command messages correctly, and incorrectly acking commands Modified Paths: -------------- code/player/branches/release-2-1-patches/server/drivers/mixed/cmucam2/cmucam2.cc Modified: code/player/branches/release-2-1-patches/server/drivers/mixed/cmucam2/cmucam2.cc =================================================================== --- code/player/branches/release-2-1-patches/server/drivers/mixed/cmucam2/cmucam2.cc 2008-07-25 23:17:00 UTC (rev 6929) +++ code/player/branches/release-2-1-patches/server/drivers/mixed/cmucam2/cmucam2.cc 2008-07-27 02:59:19 UTC (rev 6930) @@ -30,8 +30,8 @@ The cmucam2 driver connects over a serial port to a CMUCam2. Presents a @ref interface_blobfinder interface and a @ref interface_ptz -interface and can track multiple color blobs (plus an additional [EMAIL PROTECTED] interface_camera for getting image data). Color tracking parameters are +interface and can track multiple color blobs (plus an additional [EMAIL PROTECTED] interface_camera for getting image data). Color tracking parameters are defined in Player's config file (see below for an example). @@ -75,9 +75,9 @@ - Default: 1 - Set bloborcamera to 1 if you want the blobfinder/ptz active, or set it to 2 if you want camera/ptz active. (this will be changed in the future) - [EMAIL PROTECTED] Example [EMAIL PROTECTED] Example + @verbatim driver ( @@ -89,7 +89,7 @@ # values must be between 40 and 240 (!) color0 [ red_min red_max blue_min blue_max green_min green_max] ) # values must be between 40 and 240 (!) - color1 [ red_min red_max blue_min blue_max green_min green_max] ) + color1 [ red_min red_max blue_min blue_max green_min green_max] ) ) @endverbatim @@ -117,7 +117,7 @@ #define MAX_CHANNELS 32 -class Cmucam2:public Driver +class Cmucam2:public Driver { private: @@ -138,7 +138,7 @@ // PTZ interface (provides) player_devaddr_t ptz_id; player_ptz_data_t ptz_data; - + // Camera interface (provides) player_devaddr_t cam_id; player_camera_data_t cam_data; @@ -157,18 +157,18 @@ public: - // constructor + // constructor // Cmucam2( ConfigFile* cf, int section); ~Cmucam2(); - // Process incoming messages from clients - virtual int ProcessMessage(QueuePointer & resp_queue, - player_msghdr * hdr, + // Process incoming messages from clients + virtual int ProcessMessage(QueuePointer & resp_queue, + player_msghdr * hdr, void * data); virtual void Main(); - + int Setup(); int Shutdown(); }; @@ -182,7 +182,7 @@ //////////////////////////////////////////////////////////////////////////////// // a driver registration function -void +void Cmucam2_Register(DriverTable* table) { table->AddDriver("cmucam2", Cmucam2_Init); @@ -194,11 +194,11 @@ memset (&this->blobfinder_id, 0, sizeof (player_devaddr_t)); memset (&this->ptz_id, 0, sizeof (player_devaddr_t)); memset (&this->cam_id, 0, sizeof (player_devaddr_t)); - + BlobORCamera = cf->ReadInt (section, "bloborcamera", 1); if ((BlobORCamera != 1) && (BlobORCamera != 2)) BlobORCamera = 1; - + // Outgoing blobfinder interface if(cf->ReadDeviceAddr(&(this->blobfinder_id), section, "provides", PLAYER_BLOBFINDER_CODE, -1, NULL) == 0) @@ -209,7 +209,7 @@ return; } } - + // Outgoing camera interface if(cf->ReadDeviceAddr(&(this->cam_id), section, "provides", PLAYER_CAMERA_CODE, -1, NULL) == 0) @@ -220,7 +220,7 @@ return; } } - + // Outgoing ptz interface if(cf->ReadDeviceAddr(&(this->ptz_id), section, "provides", PLAYER_PTZ_CODE, -1, NULL) == 0) @@ -240,7 +240,7 @@ color = new color_config[num_of_blobs]; for (int i = 0; i < num_of_blobs; i++) { - sprintf (variable, "color%d", i); + sprintf (variable, "color%d", i); color[i].rmin = (int)cf->ReadTupleFloat (section, variable, 0, 16); color[i].rmax = (int)cf->ReadTupleFloat (section, variable, 1, 16); color[i].gmin = (int)cf->ReadTupleFloat (section, variable, 2, 16); @@ -260,7 +260,7 @@ pan_position = 0; tilt_position = 0; - + if(!(this->devicepath = (char*)cf->ReadString(section, "devicepath", NULL))) { PLAYER_ERROR("must specify devicepath"); @@ -283,7 +283,7 @@ if(fd<0) // if not successful, stop { printf("Camera connection failed!\n"); - return -1; + return -1; } auto_servoing(fd, 0); @@ -304,16 +304,16 @@ } //////////////////////////////////////////////////////////////////////////////// -int Cmucam2::ProcessMessage (QueuePointer & resp_queue, +int Cmucam2::ProcessMessage (QueuePointer & resp_queue, player_msghdr * hdr, void * data) { assert(hdr); assert(data); - if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD, 0, ptz_id)) + if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_CMD, PLAYER_PTZ_CMD_STATE, ptz_id)) { - player_ptz_cmd_t & command = + player_ptz_cmd_t & command = *reinterpret_cast<player_ptz_cmd_t * > (data); if(pan_position != (short)ntohs((unsigned short)(command.pan))) @@ -331,13 +331,10 @@ set_servo_position(fd, 1, -1*tilt_position); } - Publish (this->ptz_id, resp_queue, - PLAYER_MSGTYPE_RESP_ACK, - hdr->subtype); return 0; - } + } -// if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, +// if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, // PLAYER_PTZ_REQ_AUTOSERVO, ptz_id)) // { // player_ptz_req_control_mode *servo = (player_ptz_req_control_mode*)data; @@ -346,14 +343,14 @@ // PLAYER_MSG0 (1, "Auto servoing is enabled."); // else // PLAYER_MSG0 (1, "Auto servoing is disabled."); -// +// // Publish (this->ptz_id, resp_queue, // PLAYER_MSGTYPE_RESP_ACK, // PLAYER_PTZ_REQ_AUTOSERVO); // return PLAYER_MSGTYPE_RESP_ACK; // } - if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, + if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, PLAYER_BLOBFINDER_REQ_SET_COLOR, blobfinder_id)) { player_blobfinder_color_config_t color_config; @@ -365,8 +362,8 @@ color[0].gmax = color_config.gmax; color[0].bmin = color_config.bmin; color[0].bmax = color_config.bmax; - - PLAYER_MSG6 (1, + + PLAYER_MSG6 (1, "Cmucam2_blobfinder received new tracking color: [%d,%d,%d,%d,%d,%d]", color[0].rmin, color[0].rmax, color[0].gmin, color[0].gmax, @@ -377,13 +374,13 @@ PLAYER_BLOBFINDER_REQ_SET_COLOR); return PLAYER_MSGTYPE_RESP_ACK; } - - if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, + + if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ, PLAYER_BLOBFINDER_REQ_SET_IMAGER_PARAMS, blobfinder_id)) { player_blobfinder_imager_config player_ic; player_ic = *((player_blobfinder_imager_config*)data); - + stop_tracking (fd); imager_config ic; @@ -399,13 +396,13 @@ color_config cc; track_blob (fd, cc); - + Publish (this->blobfinder_id, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_BLOBFINDER_REQ_SET_IMAGER_PARAMS); return PLAYER_MSGTYPE_RESP_ACK; } - + return -1; } @@ -470,10 +467,10 @@ } blobfinder_data.blobs_count = blobs_observed; - + /* got the data. now fill it in */ - Publish (this->blobfinder_id, PLAYER_MSGTYPE_DATA, - PLAYER_BLOBFINDER_DATA_BLOBS, &blobfinder_data, + Publish (this->blobfinder_id, PLAYER_MSGTYPE_DATA, + PLAYER_BLOBFINDER_DATA_BLOBS, &blobfinder_data, sizeof (player_blobfinder_data), NULL); delete [] blobfinder_data.blobs; return; @@ -484,21 +481,21 @@ { memset (&this->ptz_data, 0, sizeof (this->ptz_data)); - ptz_data.zoom = 45; // cmucam does not have these + ptz_data.zoom = 45; // cmucam does not have these ptz_data.panspeed = 0; ptz_data.tiltspeed = 0; ptz_data.zoom = ptz_data.zoom; ptz_data.panspeed = ptz_data.panspeed; ptz_data.tiltspeed = ptz_data.tiltspeed; - + ptz_data.pan = -1*get_servo_position (fd, 0); ptz_data.tilt = -1*get_servo_position (fd, 1); ptz_data.pan = ptz_data.pan; - ptz_data.tilt = ptz_data.tilt; + ptz_data.tilt = ptz_data.tilt; - Publish (this->ptz_id, PLAYER_MSGTYPE_DATA, PLAYER_PTZ_DATA_STATE, + Publish (this->ptz_id, PLAYER_MSGTYPE_DATA, PLAYER_PTZ_DATA_STATE, &ptz_data, sizeof (player_ptz_data_t), NULL); - + return; } @@ -509,7 +506,7 @@ camera_packet = (packet_f*)malloc(sizeof(packet_f)); assert(camera_packet); - + memset (&this->cam_data, 0, sizeof (this->cam_data)); memset (camera_packet, 0, sizeof (packet_f)); @@ -522,12 +519,12 @@ get_image (camera_packet, &cam_data); free(camera_packet); - Publish (this->cam_id, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, + Publish (this->cam_id, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, &cam_data, sizeof (player_camera_data_t), NULL); return; } -/************************************************************************** +/************************************************************************** *** GET BLOB *** **************************************************************************/ /* Description: This function uses CMUcam's T packet for tracking to get @@ -537,15 +534,15 @@ Returns: The Player format for blob information */ -void Cmucam2::get_blob (packet_t cam_packet, +void Cmucam2::get_blob (packet_t cam_packet, player_blobfinder_blob_t *blob, color_config range) { // a descriptive color for the blob - unsigned char red = (range.rmin + range.rmax)/2; + unsigned char red = (range.rmin + range.rmax)/2; unsigned char green = (range.gmin + range.gmax)/2; unsigned char blue = (range.bmin + range.bmax)/2; - + (*blob).color = red << 16 + green << 8 + blue; // the number of pixels in the blob (*blob).area = cam_packet.blob_area; @@ -555,13 +552,13 @@ (*blob).left = 2*cam_packet.left_x; // highest and lowest y-value for top and bottom (*blob).right = 2*cam_packet.right_x; - (*blob).top = (cam_packet.left_y > cam_packet.right_y) ? + (*blob).top = (cam_packet.left_y > cam_packet.right_y) ? cam_packet.left_y : cam_packet.right_y; - (*blob).bottom = (cam_packet.left_y <= cam_packet.right_y) ? + (*blob).bottom = (cam_packet.left_y <= cam_packet.right_y) ? cam_packet.left_y : cam_packet.right_y; } -/************************************************************************** +/************************************************************************** *** GET IMAGE *** **************************************************************************/ /* Description: This function uses CMUcam's F packet to get an image @@ -569,12 +566,12 @@ Returns: The Player format for image data */ -void Cmucam2::get_image (packet_f* cam_packet, +void Cmucam2::get_image (packet_f* cam_packet, player_camera_data_t *cam_data) { int x = 0; int y = 0; - + (*cam_data).width = cam_packet->xsize; (*cam_data).height = cam_packet->ysize; (*cam_data).bpp = 24; @@ -592,7 +589,7 @@ int blue = cam_packet->rows[y].rgb[x].b; (*cam_data).image[y * (*cam_data).width * 2 + x * 2] = (red + green + blue); - (*cam_data).image[y * (*cam_data).width * 2 + x * 2 + 1] + (*cam_data).image[y * (*cam_data).width * 2 + x * 2 + 1] = (red + green + blue); } } 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 Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit