User Tools

Site Tools


code:new_target_type

This is an old revision of the document!


How to add a new target type

RTS2 targets used for scheduling are represented by subclass of Target class. If you would like to introduce a new target type, you must:

- introduce its type identifier among types listed in types table. This table contains character identifiing type and short type description.

- add its description to src/utils/rts2target.h file. Find defines starting with TYPE_, and add your own type, together with characted which represents it. This define is of course not required, but it is highly recommended.

- create table which will hold target extended parameters. This table must include reference to tar_id from targets as primary key.

- create its class as subclass of Target class in src/utils directory. You might choose to create a new file with this subclass, or add its definition to existing file. It is recommended to start a new file. You must add this file to src/utilsdb/Makefile.am - please look at this file for rts2targetgrb string to see where it must be added.

- in subclass load method, you can add any additional select statements which will load from database additional fields. For an example, look to rts2targetgrb.ec for ::load method implementation. You can of course use any ECPG statements. Please consult ECPG documentation for details.

- add this target type to Target *createTarget (int _tar_id, struct ln_lnlat_posn *_obs) in src/utilsdb/target.ec.

There is an example. Lets suppose we would like to add target for observing earth low orbit satelites. This target will have seven extra parameters - six for description of the orbit, seventh for date of orbit update. We start with adding type to types table, using pgsql console:

stars=# INSERT INTO types VALUES ('b', 'Earth orbit satelites');
INSERT 0 1
stars=#

Then add type define to sr/utils/rts2target.h:

// master plan target
#define TYPE_PLAN               'p'
 
// target type for
#define TYPE_ORBIT              'b'

Now add table orbits for additional parameters:

stars=# INSERT INTO types VALUES ('b', 'Earth orbit satelites');
INSERT 0 1
stars=#

Then add type define to sr/utils/rts2target.h:

// master plan target
#define TYPE_PLAN               'p'
 
// target type for
#define TYPE_ORBIT              'b'

Now add table orbits for additional parameters:

stars=# CREATE TABLE orbits (tar_id INTEGER REFERENCES targets (tar_id), p1 float8 NOT NULL, p2 float8 NOT NULL, p3 float8 NOT NULL, p4 float8 NOT NULL, p5 float8 NOT NULL, p6 float8 NOT NULL, p7 TIMESTAMP NOT NULL);

Now we will create in src/utilsdb files rts2targetorbit.h and rts2targetorbit.cpp and add them to Makefile.am in this directory:

inst_HEADERS = sqlerror.h rts2devicedb.h target.h rts2appdb.h rts2sqlcolumn.h rts2obs.h rts2obsset.h \
        .....
                        rts2imgsetstat.h rts2targetell.h rts2user.h rts2userset.h account.h accountset.h rts2targetorbit.h
 
EXTRA_DIST = sqlerror.ec rts2devicedb.ec target.ec sub_targets.ec rts2appdb.ec airmasscale.ec rts2sqlcolumn.ec rts2obs.ec \
        .....
                        rts2user.ec rts2userset.ec account.ec accountset.ec rts2targetorbit.ec
 
CLEANFILES = sqlerror.cpp rts2devicedb.cpp target.cpp sub_targets.cpp rts2appdb.cpp airmasscale.cpp rts2sqlcolumn.cpp rts2obs.cpp \
        .....
                        rts2user.cpp rts2userset.cpp account.cpp accountset.cpp rts2targetorbit.cpp
 
nodist_librts2blockdb_a_SOURCES = sqlerror.cpp rts2devicedb.cpp target.cpp sub_targets.cpp rts2appdb.cpp rts2sqlcolumn.cpp rts2obs.cpp \
        .....
                        rts2imgsetstat.cpp rts2targetell.cpp rts2user.cpp rts2userset.cpp account.cpp accountset.cpp rts2targetorbit.cpp

After you are done, you can fill rts2targetorbit.h and rts2targetorbit.cpp file.There is rts2targetorbit.h:

#include "target.h"
 
class Rts2TargetOrbit {
        private:
                double p1;
                double p2;
                double p3;
                double p4;
                double p5;
                double p6;
                time_t p7;
        public:
                Rts2TargetOrbit (int _tar_id, struct ln_lnlat_posn *_obs);
                Rts2TargetOrbit ();
 
                virtual int getRST (struct ln_rts_time *rst, double jd, double horizon);
                virtual int load ();
};

and there is rts2targetorbit.cpp:

#include "rts2targetorbit.h"
 
Rts2TargetOrbit (int _tar_id, struct ln_lnlat_posn *_obs)
:Target (_tar_id, _obs)
{
        p1 = p2 = p3 = p4 = p5 = p6 = nan ("f");
        p7 = 0;
}
 
int
Rts2TargetOrbit::getRST (struct ln_rts_time *rst, double jd, double horizon)
{
 
}
 
int
Rts2TargetOrbit::load ()
{
        EXEC SQL BEGIN DECLARE SECTION;
        double d_p1;
        double d_p2;
        double d_p3;
        double d_p4;
        double d_p5;
        double d_p6;
        int d_p7;
        int d_tar_id = getTargetID ();
        EXEC SQL END DECLARE SECTION;
 
        EXEC SQL SELECT
                p1,
                p2,
                p3,
                p4,
                p5,
                p6,
                EXTRACT (EPOCH FROM p7)
        INTO
                :d_p1,
                :d_p2,
                :d_p3,
                :d_p4,
                :d_p5,
                :d_p6,
                :d_p7
        FROM
                orbits
        WHERE
                tar_id = :d_tar_id;
 
        if (sqlca.sqlcode)
        {
                logMsgDb ("TargetOrbit::load", MESSAGE_ERROR);
                return -1;
        }
        p1 = d_p1;
        p2 = d_p2;
        p3 = d_p3;
        p4 = d_p4;
        p5 = d_p5;
        p6 = d_p6;
        p7 = d_p7;
 
        return Target::load ();
}

And finally add new target type to createTarget method:

Target *createTarget (int _tar_id, struct ln_lnlat_posn *_obs)
{
        EXEC SQL BEGIN DECLARE SECTION;
        int db_tar_id = _tar_id;
        char db_type_id;
        EXEC SQL END DECLARE SECTION;
.....
                case TYPE_PLANET:
                        retTarget = new TargetPlanet (_tar_id, _obs);
                        break;
                case TYPE_ORBIT:
                        retTarget = new Rts2TargetOrbit (_tar_id, _obs);
                default:
                        retTarget = new ConstTarget (_tar_id, _obs);
                        break;
.....
}
code/new_target_type.1233005974.txt.gz · Last modified: 2009/01/26 00:00 (external edit)