Sophie

Sophie

distrib > Fedora > 16 > i386 > by-pkgid > 4bc66056a634db26a1f4d0845dc41ca6 > files > 15446

mrpt-doc-0.9.5-0.1.20110925svn2670.fc16.i686.rpm

/* +---------------------------------------------------------------------------+
   |          The Mobile Robot Programming Toolkit (MRPT) C++ library          |
   |                                                                           |
   |                       http://www.mrpt.org/                                |
   |                                                                           |
   |   Copyright (C) 2005-2011  University of Malaga                           |
   |                                                                           |
   |    This software was written by the Machine Perception and Intelligent    |
   |      Robotics Lab, University of Malaga (Spain).                          |
   |    Contact: Jose-Luis Blanco  <jlblanco@ctima.uma.es>                     |
   |                                                                           |
   |  This file is part of the MRPT project.                                   |
   |                                                                           |
   |     MRPT 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 3 of the License, or     |
   |     (at your option) any later version.                                   |
   |                                                                           |
   |   MRPT 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 MRPT.  If not, see <http://www.gnu.org/licenses/>.         |
   |                                                                           |
   +---------------------------------------------------------------------------+ */

#include <mrpt/hwdrivers/CBoardENoses.h>
#include <mrpt/base.h>
#include <mrpt/slam.h>
#include <mrpt/gui.h>


using namespace mrpt;
using namespace mrpt::hwdrivers;
using namespace mrpt::system;
using namespace mrpt::slam;
using namespace mrpt::utils;
using namespace std;
using namespace mrpt::gui;

//Global VARs

bool firstTime =true;
std::map<int, string> colors;
std::map<int, CDisplayWindowPlots*> Win_map;

float Hbaselines[] ={3.5, 1.44, 0.877, 0.71, 0.20, 0.18};
float Vbaselines[] ={30,45,300};
std::map<float, std::vector<float> > Baseline_map;
std::map<float, std::vector<float> > Vertical_lines_map;


//FUNCTIONS
void myOnMenu(int menuID,float x,float y, void*param)
{
	cout << "Menu: " << menuID << endl << " x=" << x << " y="<< y << endl;
}

/** Destroy the windows created.
*/
void clear_memory()
{
	for( map< int, CDisplayWindowPlots* >::iterator iter = Win_map.begin(); iter != Win_map.end(); ++iter )
	{
		delete iter->second;
		iter->second = NULL;
	}
}


void add_VLines()
{
	std::vector <float> Vline;
	for (float inc=0; inc<=5; inc+=0.05)
	{
		Vline.push_back(inc);
		//Vertical lines.
		for (size_t i=0; i<sizeof(Vbaselines)/4; i++)
		{
			Vertical_lines_map[Vbaselines[i]].push_back(Vbaselines[i]);
			//plot it
			char sensor_name [50];
			sprintf(sensor_name,"%f",Vbaselines[i]);
			string name(sensor_name);
			Win_map[1]->plot(Vertical_lines_map[Vbaselines[i]],Vline,"k.1", sensor_name);
		}
	}
}

/** Plot each sensor reading over time
*/
void plot_diff_windows(std::map<int, vector<float> > &sensors, bool together)
{
	//Create windows if first time.
	try
	{
		if (together)	//All sensor on same window
		{
			if (firstTime)
			{
				//Create windows
				firstTime=false;
				Win_map[0] = new CDisplayWindowPlots("Temperature :");
				Win_map[0]->resize(800,900);
				Win_map[0]->axis(-15,1800,-5,50,false);
				Win_map[0]->axis_equal(false);
				Win_map[0]->setPos(0,0);

				Win_map[1] = new CDisplayWindowPlots("Sensor Readings :");
				Win_map[1]->resize(800,900);
				Win_map[1]->axis(-5,300,-1,6,false);
				Win_map[1]->axis_equal(false);
				Win_map[1]->setPos(810,0);

				//Create color palet
				colors[0x2600]="r-3";
				colors[0x2611]="b-3";
				colors[0x2620]="m-3";
				colors[0x2442]="g-3";
				colors[0x6810]="k-3";
				colors[0x5135]="r-2";
				colors[0x5521]="b-2";
				colors[0x5042]="m-2";

				colors[0x3]="g.0";
				colors[0x41]="g.0";
				colors[0x549]="g.0";
				colors[0x1]="g.0";

				add_VLines();

			}
			// Plot
			for( map<int, std::vector<float> >::iterator iter = sensors.begin(); iter != sensors.end(); ++iter )
			{
				if (iter->first == 0xFFFF){ //Temperature
					Win_map[0]->plot(sensors[0x0000], iter->second,"b-3");
				}
				else if (iter->first != (0x0000) ){	//Is not Time
					Win_map[1]->plot(sensors[0x0000], iter->second,colors[iter->first], format("%i",int(iter->first)) );
				}
			}

		}
		else	//Eah sensor has his own window
		{
			if (firstTime)
			{
				firstTime=false;
				int posx=0;
				int posy=0;
				for( map<int, std::vector<float> >::iterator iter = sensors.begin(); iter != sensors.end(); ++iter )
				{
					if (iter->first != (0x0000) ){	//Is not Time
						Win_map[iter->first] = new CDisplayWindowPlots( format("Sensor: %i",int(iter->first)) );
						Win_map[iter->first]->resize(800,100);
						Win_map[iter->first]->axis(-1,240,-1,6,false);
						Win_map[iter->first]->axis_equal(false);
						Win_map[iter->first]->setPos(posx*810,posy*160);
						if(posy==5){posx++; posy=0;}
						else{posy++;}
					}
				}
			}

			for( map<int, std::vector<float> >::iterator iter = sensors.begin(); iter != sensors.end(); ++iter )
			{
				if (iter->first != (0x0000) ){	//Is not Time
					Win_map[iter->first]->plot(sensors[0x0000], sensors[iter->first],"b-3");
				}
			}
		}//End-if(together)

	}
	catch(std::exception &e)
	{
		cerr << e.what() << endl;
	}

}
//ADD_BASELINE
/**
	If configured, add to the plot window different lines as references.
*/



void add_baseline(std::vector<float> time)
{
	try
	{
		//Horizontal lines.
		for (size_t i=0; i<sizeof(Hbaselines)/4; i++)
		{
			Baseline_map[Hbaselines[i]].push_back(Hbaselines[i]);
			//plot it
			char sensor_name [10];
			sprintf(sensor_name,"%f",Hbaselines[i]);
			string name(sensor_name);
			Win_map[1]->plot(time, Baseline_map[Hbaselines[i]], "k.1", sensor_name);
		}
	}
	catch(std::exception &e)
	{
		cerr << e.what() << endl;
	}

}


int main()
{
	try
	{
		CBoardENoses			eNoses;
		std::string				firmVers;
		CObservationGasSensors	obs;
		FILE					*f_log = os::fopen(format("./log_%s.txt", fileNameStripInvalidChars(mrpt::system::dateTimeLocalToString(now())).c_str() ),"wt");
		TTimeStamp				timStart = mrpt::system::getCurrentTime();
		std::map<int, std::vector<float> > Sensor_array;
		bool together = true;	//True -> Shows all sensor on same window. False -> Each sensor has his own window

		/*
		// Load configuration:
		ASSERT_( mrpt::system::fileExists("_CONFIG_eNoses.ini") );
		CConfigFile conf("_CONFIG_eNoses.ini");
		eNoses.loadConfig( conf, "eNoses" );

		if (!eNoses.queryFirmwareVersion( firmVers ) )
		{
			printf("Error!!\n");
			return -1;
		}
		else
			std::cout << "FIRMWARE VERSION: " << firmVers << std::endl;
		*/



		while ( !mrpt::system::os::kbhit() )
		{
			if (! eNoses.getObservation( obs ) )	//NEW OBSERVATION
			{
				cout << "- Could not retrieve an observation from the eNoses..." << endl;
			}
			else
			{
				//Push_back timeStamp (seconds)
				Sensor_array[0x0000].push_back( mrpt::system::timeDifference(timStart,obs.timestamp) );
				if (f_log) fprintf(f_log,"%f ", mrpt::system::timeDifference(timStart,obs.timestamp) );

				for (size_t i=0;i<obs.m_readings.size();i++)
				{
					//Push_back Temperature
					Sensor_array[0xFFFF].push_back( obs.m_readings[i].temperature );
					if (f_log) fprintf(f_log,"%f ", obs.m_readings[i].temperature );

					//E-Nose Sensor's Data
					for (size_t j=0;j<obs.m_readings[i].sensorTypes.size();j++)
					{

						if ( j<(obs.m_readings[i].sensorTypes.size() -1) ){	//Not the las item
							if( (obs.m_readings[i].sensorTypes[j]==obs.m_readings[i].sensorTypes[j+1]) ){
								Sensor_array[ obs.m_readings[i].sensorTypes[j] ].push_back(obs.m_readings[i].readingsVoltage[j+1]-obs.m_readings[i].readingsVoltage[j]);
								if (f_log) fprintf(f_log,"%f ",obs.m_readings[i].readingsVoltage[j+1]-obs.m_readings[i].readingsVoltage[j] );
								j++;	//skip the next sensor as it has been used already.
							}else{
								Sensor_array[ obs.m_readings[i].sensorTypes[j] ].push_back( obs.m_readings[i].readingsVoltage[j] );
								if (f_log) fprintf(f_log,"%f ",obs.m_readings[i].readingsVoltage[j]);	//To file
							}
						}else{
								Sensor_array[ obs.m_readings[i].sensorTypes[j] ].push_back( obs.m_readings[i].readingsVoltage[j] );
								if (f_log) fprintf(f_log,"%f ",obs.m_readings[i].readingsVoltage[j]);	//To file
						}
					}
				}
				if (f_log) fprintf(f_log,"\n");


				//Plotting information
				plot_diff_windows(Sensor_array,together);

				//Generate the Baseline
				add_baseline(Sensor_array[0x0000]);
			} //end-if getObs

			mrpt::system::sleep(40);
		}//end-While

		clear_memory();
		if (f_log) os::fclose(f_log);
	}
	catch(std::exception &e)
	{
		cerr << e.what() << endl;
		return -1;
	}

	return 0;
}