BallTrackingHead_Sensor.cc

Go to the documentation of this file.
00001 //
00002 // Copyright 2002 Sony Corporation 
00003 //
00004 // Permission to use, copy, modify, and redistribute this software for
00005 // non-commercial use is hereby granted.
00006 //
00007 // This software is provided "as is" without warranty of any kind,
00008 // either expressed or implied, including but not limited to the
00009 // implied warranties of fitness for a particular purpose.
00010 //
00011 
00012 #include <OPENR/OSyslog.h>
00013 #include "BallTrackingHead.h"
00014 
00015 void
00016 BallTrackingHead::NotifySensor(const ONotifyEvent& event)
00017 {
00018     RCRegion* rgn = event.RCData(0);
00019 
00020     if (initSensorIndex == false) {
00021         OSensorFrameVectorData* sv = (OSensorFrameVectorData*)rgn->Base();
00022         InitSensorIndex(sv);
00023         initSensorIndex = true;
00024     }
00025 
00026     if (sensorRegions.size() == NUM_SENSOR_VECTOR) {
00027         sensorRegions.front()->RemoveReference();
00028         sensorRegions.pop_front();
00029     }
00030     rgn->AddReference();
00031     sensorRegions.push_back(rgn);
00032 
00033     observer[event.ObsIndex()]->AssertReady();
00034 }
00035 
00036 void
00037 BallTrackingHead::InitSensorIndex(OSensorFrameVectorData* sensorVec)
00038 {
00039     // jointID[] is already initialized in BallTrackingHead::OpenPrimitives().
00040     for (int i = 0; i < NUM_JOINTS; i++) {
00041         for (int j = 0; j < sensorVec->vectorInfo.numData; j++) {
00042             OSensorFrameInfo* info = sensorVec->GetInfo(j);
00043             if (info->primitiveID == jointID[i]) {
00044                 sensoridx[i] = j;
00045                 OSYSDEBUG(("[%2d] %s\n", sensoridx[i], JOINT_LOCATOR[i]));
00046                 break;
00047             }
00048         }
00049     }
00050 }
00051 
00052 void
00053 BallTrackingHead::GetPanTiltAngle(longword frameNum, double* pan, double* tilt)
00054 {
00055     list<RCRegion*>::iterator iter = sensorRegions.begin();
00056     list<RCRegion*>::iterator last = sensorRegions.end();
00057     OSensorFrameVectorData* sv;
00058     OSensorFrameInfo* info;
00059     OSensorFrameData* data;
00060 
00061     while (iter != last) {
00062 
00063         sv = (OSensorFrameVectorData*)(*iter)->Base();
00064         info = sv->GetInfo(sensoridx[PAN_INDEX]);
00065         longword fn = info->frameNumber;
00066 
00067         for (int i = 0; i < info->numFrames; i++) {
00068 
00069             if (fn == frameNum) {
00070 
00071                 data = sv->GetData(sensoridx[PAN_INDEX]);
00072                 *pan = degrees((double)data->frame[i].value / 1000000.0);
00073 
00074                 data = sv->GetData(sensoridx[TILT_INDEX]);
00075                 *tilt = degrees((double)data->frame[i].value / 1000000.0);
00076 
00077                 return;
00078             }
00079 
00080             fn++;
00081             if (fn > oframeMAX_NUMBER) fn = 1;
00082         }
00083         
00084         ++iter;
00085     }
00086 
00087     //
00088     // If sensor data at frameNum is not found, return latest sensor data.
00089     //
00090     RCRegion* rgn = sensorRegions.back();
00091     sv = (OSensorFrameVectorData*)rgn->Base();
00092     info = sv->GetInfo(sensoridx[PAN_INDEX]);
00093 
00094     data = sv->GetData(sensoridx[PAN_INDEX]);
00095     *pan = degrees((double)data->frame[info->numFrames-1].value / 1000000.0);
00096 
00097     data = sv->GetData(sensoridx[TILT_INDEX]);
00098     *tilt = degrees((double)data->frame[info->numFrames-1].value / 1000000.0);
00099 }

Generated on Sun Dec 2 23:04:28 2007 for openSDK by  doxygen 1.3.9.1