damaris-backends/core/job.h
2014-06-26 11:10:51 +00:00

219 lines
4.1 KiB
C++

/* **************************************************************************
Author: Achim Gaedke
Created: June 2004
****************************************************************************/
#ifndef JOB_H
#define JOB_H
#include <xercesc/dom/DOMNamedNodeMap.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <unistd.h>
#include <string>
#include <sstream>
#include <map>
#include <cstdio>
#include <math.h>
#include "core/result.h"
#include "core/states.h"
#include "core/constants.h"
#ifndef SIZETPRINTFLETTER
# ifndef __LP64__
# define SIZETPRINTFLETTER "u"
# else
# define SIZETPRINTFLETTER "lu"
# endif
#endif
class core;
/**
\defgroup jobs Jobs
\brief jobs to control core and make experiments
the file format for a job file is simple xml: the element name of the root section is also the name of the job.
\verbinclude experiment_job.xml
*/
//@{
/**
\brief exception for job related things
*/
class job_exception: public std::string {
public:
job_exception(const std::string& s): std::string(s){}
};
/**
\brief base class for a job that comes from input
two groups of classe are available:
- core control jobs
- experiment jobs
*/
class job {
public:
size_t job_no;
job(const size_t n): job_no(n) {
}
size_t no() const {
return job_no;
}
virtual int print() const{
printf("job no %" SIZETPRINTFLETTER "\n", job_no);
return 0;
}
virtual ~job() {}
};
/**
base class for core control
*/
class control: public job {
public:
control(size_t n):job(n) {}
virtual result* do_it(core* c)=0;
};
/**
end main loop
*/
class quit_job: public control {
public:
quit_job(const size_t n): control(n) {}
virtual result* do_it(core* c);
};
/**
just do nothing...
*/
class do_nothing_job: public control {
public:
do_nothing_job(const size_t n): control(n) {}
virtual result* do_it(core*) {
/* of course nothing to do...*/
return new result(job_no);
}
};
/**
wait a specified time period
*/
class wait_job: public control {
public:
double sec;
wait_job(const size_t n): control(n) {
sec=0;
}
wait_job(const size_t n, const XERCES_CPP_NAMESPACE_QUALIFIER DOMNamedNodeMap* attrs);
wait_job(const size_t n, double sec_to_wait): control(n) {
sec=sec_to_wait;
}
virtual result* do_it(core* c);
};
/**
infinite pause until a signal comes
*/
class pause_job: public control {
public:
pause_job(const size_t n): control(n) {}
virtual result* do_it(core* c);
};
/**
restarts the cores job queue
*/
class restart_job: public control {
public:
restart_job(const size_t n): control(n) {}
virtual result* do_it(core* c);
};
class hardware;
/**
base class for experiments
*/
class experiment: public job {
private:
state_atom* state_factory(const XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* element);
char* get_parameter(const XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* element, ...);
public:
/// holds the experiments states
state* experiment_states;
/// contains teh description of this experiment
std::string description;
/// initialise the experiment data
experiment(size_t n, XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* exp_data=NULL );
virtual result* do_it(hardware* hw);
virtual ~experiment() {
if (experiment_states!=NULL) delete experiment_states;
}
};
class configuration_device_section {
public:
std::string name;
std::map<std::string,std::string> attributes;
std::string data;
void print(FILE* f=stdout) const;
};
/**
a configuration job changes the instrument to another state, something like:
* temperature,
* sample position (lateral, axial),
* shim, tuning
these configuration changes generally do not occurr during a pulse sequence and are not very frequent.
*/
class configuration: public job {
public:
/*
suitable data model for each device
*/
std::list<configuration_device_section> configuration_changes;
public:
configuration(size_t n, XERCES_CPP_NAMESPACE_QUALIFIER DOMElement* conf_data=NULL );
void print(FILE* f=stdout) const;
result* do_it(hardware* hw);
};
//@}
#endif