summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/indi/apogee_ppi.h
blob: bed27b023a39e5054784fddaa72e976ac0eb4d44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#if 0
    Apogee PPI
    INDI Interface for Apogee PPI
    Copyright (C) 2005 Jasem Mutlaq (mutlaqja AT ikarustech DOT com)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

#endif

#ifndef APOGEE_PPI_H
#define APOGEE_PPI_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <math.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>

#include "fitsrw.h"
#include "indidevapi.h"
#include "eventloop.h"
#include "indicom.h"
#include "apogee/CameraIO_Linux.h"

#define mydev           "Apogee PPI"

#define COMM_GROUP	"Communication"
#define EXPOSE_GROUP	"Expose"
#define IMAGE_GROUP	"Image Settings"
#define DATA_GROUP      "Data Channel"

#define POLLMS		1000		/* Polling time (ms) */
#define TEMP_THRESHOLD  .25		/* Differential temperature threshold (C)*/

#define MAX_PIXELS	4096
#define MAXHBIN 	8
#define MAXVBIN 	64
#define MIN_CCD_TEMP	-60
#define MAX_CCD_TEMP	40
#define MAXCOLUMNS 	16383
#define MAXROWS 	16383
#define MAXTOTALCOLUMNS 16383
#define MAXTOTALROWS 	16383

#define FILENAMESIZ	2048
#define LIBVERSIZ 	1024
#define PREFIXSIZ	64
#define PIPEBUFSIZ	8192
#define FRAME_ILEN	64

#define getBigEndian(p) ( ((p & 0xff) << 8) | (p  >> 8))

class ApogeeCam {
  
  public:
    
    ApogeeCam();
    ~ApogeeCam();
    
    /* INDI Functions that must be called from indidrivermain */
    void ISGetProperties (const char *dev);
    void ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n);
    void ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n);
    void ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n);
    void ISPoll();
    
  private:
    
    /* Structs */
    struct
    {
      short  width;
      short  height;
      int    frameType;
      int    expose;
      double temperature;
      int    binX, binY;
      unsigned short  *img;
    } APGFrame;
    
    enum { LIGHT_FRAME , BIAS_FRAME, DARK_FRAME, FLAT_FRAME };
    
    /* Switches */
    ISwitch PowerS[2];
    ISwitch *ApogeeModelS;
    ISwitch FrameTypeS[4];
    
    /* Numbers */
    INumber FrameN[4];
    INumber BinningN[2];
    INumber ExposeTimeN[1];
    INumber TemperatureN[1];
    INumber DataChannelN[1];
    
    /* BLOBs */
    IBLOB imageB;
    
    /* Switch vectors */
    ISwitchVectorProperty PowerSP;				/* Connection switch */
    ISwitchVectorProperty ApogeeModelSP;			/* Apogee Model */
    ISwitchVectorProperty FrameTypeSP;				/* Frame type */
    
    /* Number vectors */
    INumberVectorProperty FrameNP;				/* Frame specs */
    INumberVectorProperty BinningNP;				/* Binning */
    INumberVectorProperty ExposeTimeNP;				/* Exposure */
    INumberVectorProperty TemperatureNP;			/* Temperature control */
    
    
    /* BLOB vectors */
    IBLOBVectorProperty imageBP;				/* Data stream */
    
    /* Other */
    static int streamTimerID;					/* Stream ID */
    double targetTemp;						/* Target temperature */
    CCameraIO *cam;						/* Apogee Camera object */
    
    /* Functions */
    
    /* General */
    void initProperties();
    bool loadXMLModel();
    bool initCamera();
    
    /* CCD */
    void getBasicData(void);
    void handleExposure(void *);
    void connectCCD(void);
    void uploadFile(char * filename);
    int  writeFITS(char *filename, char errmsg[]);
    int  setImageArea(char errmsg[]);
    void grabImage(void);
    int  isCCDConnected(void);
    
    /* Power */
    int  checkPowerS(ISwitchVectorProperty *sp);
    int  checkPowerN(INumberVectorProperty *np);
    int  checkPowerT(ITextVectorProperty *tp);
    
    /* Helper functions */
    int  manageDefaults(char errmsg[]);
    int  getOnSwitch(ISwitchVectorProperty *sp);
    FITS_HDU_LIST * create_fits_header (FITS_FILE *ofp, uint width, uint height, uint bpp);
    unsigned short hextoi(char* instr);
    double min();
    double max();
    
};
    
#endif