3 INDI Interface
for Finger Lakes Instruments Filter Wheels
4 Copyright (C) 2005 Gaetano Vocca (yagvoc-web AT yahoo DOT it)
5 Based on fli_ccd by Jasem Mutlaq (mutlaqja AT ikarustech DOT com)
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT
ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License
for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with
this library;
if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34 #include <sys/types.h>
35 #include <sys/socket.h>
36 #include <netinet/in.h>
63 #define mydev "FLI Wheel"
65 #define MAIN_GROUP "Main Control"
67 #define LAST_FILTER 14
68 #define FIRST_FILTER 0
70 #define currentFilter FilterN[0].value
72 #define POLLMS_OVERRIDE 1000
73 #define LIBVERSIZ 1024
75 #define PIPEBUFSIZ 8192
91 static flidev_t fli_dev;
92 static cam_t *FLIWheel;
93 static int portSwitchIndex;
94 static int simulation;
95 static int targetFilter;
97 long int Domains[] = { FLIDOMAIN_USB, FLIDOMAIN_SERIAL, FLIDOMAIN_PARALLEL_PORT, FLIDOMAIN_INET };
102 static ISwitch PowerS[] = { {
"CONNECT",
"Connect",
ISS_OFF, 0, 0 }, {
"DISCONNECT",
"Disconnect",
ISS_ON, 0, 0 } };
108 {
"Serial",
"",
ISS_OFF, 0, 0 },
109 {
"Parallel",
"",
ISS_OFF, 0, 0 },
110 {
"INet",
"",
ISS_OFF, 0, 0 } };
123 static int isInit = 0;
149 if (dev !=
nullptr && strcmp(
mydev, dev))
158 void ISNewBLOB(
const char *dev,
const char *name,
int sizes[],
int blobsizes[],
char *blobs[],
char *formats[],
159 char *names[],
int n)
178 if (dev !=
nullptr && strcmp(dev,
mydev))
184 if (!strcmp(name, PortSP.
name))
197 if (!strcmp(name, PowerSP.
name))
206 void ISNewText(
const char *dev,
const char *name,
char *texts[],
char *names[],
int n)
211 if (dev !=
nullptr && strcmp(
mydev, dev))
222 void ISNewNumber(
const char *dev,
const char *name,
double values[],
char *names[],
int n)
231 if (dev !=
nullptr && strcmp(dev,
mydev))
236 if (!strcmp(FilterNP.
name, name))
240 targetFilter = values[0];
242 IDSetNumber(&FilterNP,
"Setting current filter to slot %d", targetFilter);
243 IDLog(
"Setting current filter to slot %d\n", targetFilter);
255 targetFilter = values[0];
262 IDSetNumber(&FilterNP,
"Unknown error. %s is not a member of %s property.", names[0], name);
266 if (targetFilter < FIRST_FILTER || targetFilter > FLIWheel->
filter_count - 1)
274 IDSetNumber(&FilterNP,
"Setting current filter to slot %d", targetFilter);
275 IDLog(
"Setting current filter to slot %d\n", targetFilter);
277 if ((err = FLISetFilterPos(fli_dev, targetFilter)))
280 IDSetNumber(&FilterNP,
"FLISetFilterPos() failed. %s.", strerror((
int)-err));
281 IDLog(
"FLISetFilterPos() failed. %s.", strerror((
int)-err));
286 if ((err = FLIGetFilterPos(fli_dev, &newFilter)))
289 IDSetNumber(&FilterNP,
"FLIGetFilterPos() failed. %s.", strerror((
int)-err));
290 IDLog(
"FLIGetFilterPos() failed. %s.\n", strerror((
int)-err));
294 if (newFilter == targetFilter)
299 IDSetNumber(&FilterNP,
"Filter set to slot #%d", targetFilter);
313 if ((err = FLIGetModel(fli_dev, buff, 2048)))
315 IDMessage(
mydev,
"FLIGetModel() failed. %s.", strerror((
int)-err));
316 IDLog(
"FLIGetModel() failed. %s.\n", strerror((
int)-err));
321 if ((FLIWheel->
model = malloc(
sizeof(
char) * 2048)) == NULL)
324 IDLog(
"malloc() failed.");
328 strcpy(FLIWheel->
model, buff);
331 if ((err = FLIGetHWRevision(fli_dev, &FLIWheel->
HWRevision)))
333 IDMessage(
mydev,
"FLIGetHWRevision() failed. %s.", strerror((
int)-err));
334 IDLog(
"FLIGetHWRevision() failed. %s.\n", strerror((
int)-err));
339 if ((err = FLIGetFWRevision(fli_dev, &FLIWheel->
FWRevision)))
341 IDMessage(
mydev,
"FLIGetFWRevision() failed. %s.", strerror((
int)-err));
342 IDLog(
"FLIGetFWRevision() failed. %s.\n", strerror((
int)-err));
346 if ((err = FLIGetFilterCount(fli_dev, &FLIWheel->
filter_count)))
348 IDMessage(
mydev,
"FLIGetFilterCount() failed. %s.", strerror((
int)-err));
349 IDLog(
"FLIGetFilterCount() failed. %s.\n", strerror((
int)-err));
361 IDLog(
"Exiting getBasicData()\n");
379 IDMessage(
mydev,
"FLIGetFilterPos() failed. %s.", strerror((
int)-err));
380 IDLog(
"FLIGetFilterPos() failed. %s.\n", strerror((
int)-err));
395 static int simMTC = 5;
455 for (i = 0; i < sp->
nsp; i++)
472 if (!strcmp(sp->
label,
""))
492 if (!strcmp(np->
label,
""))
512 if (!strcmp(tp->
label,
""))
541 IDSetSwitch(&PowerSP,
"Simulation Wheel is online.");
542 IDLog(
"Simulation Wheel is online.\n");
546 IDLog(
"Current portSwitch is %d\n", portSwitchIndex);
547 IDLog(
"Attempting to find the device in domain %ld\n",
Domains[portSwitchIndex]);
554 IDSetSwitch(&PowerSP,
"Error: no wheels were detected.");
555 IDLog(
"Error: no wheels were detected.\n");
559 if ((err = FLIOpen(&fli_dev, FLIWheel->
name, FLIWheel->
domain | FLIDEVICE_FILTERWHEEL)))
564 IDSetSwitch(&PowerSP,
"Error: FLIOpen() failed. %s.", strerror((
int)-err));
565 IDLog(
"Error: FLIOpen() failed. %s.\n", strerror((
int)-err));
573 IDSetSwitch(&PowerSP,
"Wheel is online. Retrieving basic data.");
574 IDLog(
"Wheel is online. Retrieving basic data.\n");
600 if ((err = FLIClose(fli_dev)))
603 IDSetSwitch(&PowerSP,
"Error: FLIClose() failed. %s.", strerror((
int)-err));
604 IDLog(
"Error: FLIClose() failed. %s.\n", strerror((
int)-err));
618 return ((PowerS[0].s ==
ISS_ON) ? 1 : 0);
626 IDLog(
"In find Camera, the domain is %ld\n", domain);
628 if ((err = FLIList(domain | FLIDEVICE_FILTERWHEEL, &devlist)))
630 IDLog(
"FLIList() failed. %s\n", strerror((
int)-err));
634 if (devlist != NULL && devlist[0] != NULL)
638 IDLog(
"Trying to allocate memory to FLIWheel\n");
639 if ((FLIWheel = malloc(
sizeof(
cam_t))) == NULL)
641 IDLog(
"malloc() failed.\n");
645 for (i = 0; devlist[i] != NULL; i++)
649 for (j = 0; devlist[i][j] !=
'\0'; j++)
650 if (devlist[i][j] ==
';')
652 devlist[i][j] =
'\0';
657 FLIWheel->
domain = domain;
662 case FLIDOMAIN_PARALLEL_PORT:
663 FLIWheel->
dname = strdup(
"parallel port");
667 FLIWheel->
dname = strdup(
"USB");
670 case FLIDOMAIN_SERIAL:
671 FLIWheel->
dname = strdup(
"serial");
675 FLIWheel->
dname = strdup(
"inet");
679 FLIWheel->
dname = strdup(
"Unknown domain");
682 IDLog(
"Domain set OK\n");
684 FLIWheel->
name = strdup(devlist[0]);
686 if ((err = FLIFreeList(devlist)))
688 IDLog(
"FLIFreeList() failed. %s.\n", strerror((
int)-err));
695 if ((err = FLIFreeList(devlist)))
697 IDLog(
"FLIFreeList() failed. %s.\n", strerror((
int)-err));
704 IDLog(
"Findcam() finished successfully.\n");
int IEAddTimer(int millisecs, IE_TCF *fp, void *p)
Register a new single-shot timer function, fp, to be called with ud as argument after ms.
Public interface to INDI's eventloop mechanism.
int findwheel(flidomain_t domain)
int manageDefaults(char errmsg[])
void ISNewBLOB(const char *dev, const char *name, int sizes[], int blobsizes[], char *blobs[], char *formats[], char *names[], int n)
Update data of an existing blob vector property.
void handleExposure(void *)
void ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n)
Update the value of an existing switch vector property.
void ISNewText(const char *dev, const char *name, char *texts[], char *names[], int n)
Update the value of an existing text vector property.
int checkPowerS(ISwitchVectorProperty *sp)
void ISGetProperties(const char *dev)
Get Device Properties.
int checkPowerN(INumberVectorProperty *np)
int getOnSwitch(ISwitchVectorProperty *sp)
void ISSnoopDevice(XMLEle *root)
Function defined by Drivers that is called when another Driver it is snooping (by having previously c...
void ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n)
int isFilterConnected(void)
int checkPowerT(ITextVectorProperty *tp)
#define NARRAY(a)
Handy macro to find the number of elements in array a[]. Must be used with actual array,...
void IDLog(const char *fmt,...)
Implementations for common driver routines.
INumber * IUFindNumber(const INumberVectorProperty *nvp, const char *name)
Find an INumber member in a number text property.
void IUResetSwitch(ISwitchVectorProperty *svp)
Reset all switches in a switch vector property to OFF.
Interface to the reference INDI C API device implementation on the Device Driver side.
int IUUpdateSwitch(ISwitchVectorProperty *svp, ISState *states, char *names[], int n)
Update all switches in a switch vector property.
void IDSetNumber(const INumberVectorProperty *nvp, const char *fmt,...)
void IDSetSwitch(const ISwitchVectorProperty *svp, const char *fmt,...)
void IDMessage(const char *dev, const char *fmt,...)
void IUUpdateMinMax(const INumberVectorProperty *nvp)
Function to update the min and max elements of a number in the client.
void IDDefNumber(const INumberVectorProperty *nvp, const char *fmt,...)
void IDSetText(const ITextVectorProperty *tvp, const char *fmt,...)
void IDDefSwitch(const ISwitchVectorProperty *svp, const char *fmt,...)
Namespace to encapsulate INDI client, drivers, and mediator classes.
Number vector property descriptor.
Switch vector property descriptor.
Text vector property descriptor.