int main(int argc, char *argv[])
{
	DEB_GLOBAL_FUNCT();

	DebParams::setModuleFlags(DebParams::AllFlags);
	DebParams::setTypeFlags(DebParams::AllFlags);
	DebParams::setFormatFlags(DebParams::AllFlags);

	Camera *m_camera;
	Interface *m_interface;
	CtControl* m_control;

	int nbCards = 1;
	int maxFrames = 16384;
	string baseIPaddress= "192.168.0.1";
	int basePort = -1;
	string baseMACaddress = "02.00.00.00.00.00";
	int nbChans = 6;
	bool createModule = 1;
	string modname = "gm";
	int debug = 2;
	int cardIndex = 0;
	bool noUDP = 0;
       	string directoryName = "/home/xspress3/esrf/xspress3.8chan/settings";

	try {

		m_camera = new Camera(nbCards, maxFrames, baseIPaddress, basePort, baseMACaddress, nbChans,
				createModule, modname, debug, cardIndex, noUDP, directoryName);
		m_interface = new Interface(*m_camera);
		m_control = new CtControl(m_interface);

		// Setup user timing controls
		int nframes = 3;
		double m_exp_time = 5.0;

		// setup fileformat and data saving info
		CtSaving* saving = m_control->saving();
		saving->setDirectory("/home/xspress3/esrf/gmdata");
		saving->setFormat(CtSaving::HDF5);
	 	saving->setPrefix("xsp3_");
		saving->setSuffix(".hdf");
		saving->setSavingMode(CtSaving::Manual);
		saving->setManagedMode(CtSaving::Hardware);
		saving->setFramesPerFile(nframes);
		saving->setOverwritePolicy(CtSaving::Overwrite);

		// do acquisition
		m_camera->setCard(0);
		m_camera->setDataSource(-1, Camera::PlaybackStream0);
		m_camera->loadPlayback("/home/xspress3/esrf/Lima/camera/xspress3/test/Zr_mca15_pass0.d16", 0, 0);
		m_camera->setRunMode(true);
		m_camera->setUseDtc(false);
		//		m_camera->setDeadtimeCalculationEnergy(10000);
		//		m_camera->setDeadtimeCorrectionParameters(-1,2.5304E-9,2.2534E-7, 2.5304E-9,2.2534E-7, true, false);

		m_control->acquisition()->setAcqNbFrames(nframes);
		m_control->acquisition()->setAcqExpoTime(m_exp_time);
		m_camera->setTiming(0, 0, 0, 100);
		m_control->prepareAcq();
		m_control->startAcq();

	        struct timespec delay, remain;
		delay.tv_sec = (int)floor(m_exp_time/10.0);
		delay.tv_nsec = (int)(1E9*(m_exp_time/10.0-floor(m_exp_time/10.0)));
		DEB_TRACE() << "acq thread will sleep for " << m_exp_time/10.0 << " second";
		while (m_camera->isAcqRunning()) {
			delay.tv_sec = (int)floor(m_exp_time/10.0);
			delay.tv_nsec = (int)(1E9*(m_exp_time/10.0-floor(m_exp_time/10.0)));
			DEB_TRACE() << "sleep for " << m_exp_time/10.0 << " second";
			nanosleep(&delay, &remain);
		}
		DEB_TRACE() << "Finished collection 1";

		nframes = 2;
		m_exp_time = 1.0;

		long num;
		saving->getNextNumber(num);
		saving->setNextNumber(++num);
		m_control->acquisition()->setAcqNbFrames(nframes);
		m_control->acquisition()->setAcqExpoTime(m_exp_time);
		m_camera->setTiming(0, 0, 0, 100);
		m_control->prepareAcq();
		m_control->startAcq();

		delay.tv_sec = (int)floor(m_exp_time/10.0);
		delay.tv_nsec = (int)(1E9*(m_exp_time/10.0-floor(m_exp_time/10.0)));
		DEB_TRACE() << "acq thread will sleep for " << m_exp_time/10.0 << " second";
		while (m_camera->isAcqRunning()) {
			delay.tv_sec = (int)floor(m_exp_time/10.0);
			delay.tv_nsec = (int)(1E9*(m_exp_time/10.0-floor(m_exp_time/10.0)));
			DEB_TRACE()<< "sleep for " << m_exp_time/10.0 << " second";
			nanosleep(&delay, &remain);
		}

		DEB_TRACE() << "Finished collection 2";

	} catch (Exception& ex) {
		DEB_ERROR() << "LIMA Exception: " << ex;
	} catch (...) {
		DEB_ERROR() << "Unkown exception!";
	}
	return 0;
}