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
|