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 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
/*
INDI Developers Manual
Tutorial #5 - Snooping
Rain Detector
Refer to README, which contains instruction on how to build this driver, and use it
with an INDI-compatible client.
*/
/** \file raindetector.cpp
\brief Construct a rain detector device that the user may operate to raise a rain alert. This rain light property defined by this driver is \e snooped by the Dome driver
then takes whatever appropiate action to protect the dome.
\author Jasem Mutlaq
*/
#include <memory>
#include "raindetector.h"
std::auto_ptr<RainDetector> rainDetector(0);
void ISInit()
{
static int isInit =0;
if (isInit == 1)
return;
isInit = 1;
if(rainDetector.get() == 0) rainDetector.reset(new RainDetector());
}
void ISGetProperties(const char *dev)
{
ISInit();
rainDetector->ISGetProperties(dev);
}
void ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int num)
{
ISInit();
rainDetector->ISNewSwitch(dev, name, states, names, num);
}
void ISNewText( const char *dev, const char *name, char *texts[], char *names[], int num)
{
ISInit();
rainDetector->ISNewText(dev, name, texts, names, num);
}
void ISNewNumber(const char *dev, const char *name, double values[], char *names[], int num)
{
ISInit();
rainDetector->ISNewNumber(dev, name, values, names, num);
}
void ISNewBLOB (const char *dev, const char *name, int sizes[], int blobsizes[], char *blobs[], char *formats[], char *names[], int n)
{
INDI_UNUSED(dev);
INDI_UNUSED(name);
INDI_UNUSED(sizes);
INDI_UNUSED(blobsizes);
INDI_UNUSED(blobs);
INDI_UNUSED(formats);
INDI_UNUSED(names);
INDI_UNUSED(n);
}
void ISSnoopDevice (XMLEle *root)
{
ISInit();
rainDetector->ISSnoopDevice(root);
}
RainDetector::RainDetector()
{
}
/**************************************************************************************
** Client is asking us to establish connection to the device
***************************************************************************************/
bool RainDetector::Connect()
{
IDMessage(getDeviceName(), "Rain Detector connected successfully!");
return true;
}
/**************************************************************************************
** Client is asking us to terminate connection to the device
***************************************************************************************/
bool RainDetector::Disconnect()
{
IDMessage(getDeviceName(), "Rain Detector disconnected successfully!");
return true;
}
/**************************************************************************************
** INDI is asking us for our default device name
***************************************************************************************/
const char * RainDetector::getDefaultName()
{
return "Rain Detector";
}
/**************************************************************************************
** INDI is asking us to init our properties.
***************************************************************************************/
bool RainDetector::initProperties()
{
// Must init parent properties first!
INDI::DefaultDevice::initProperties();
IUFillLight(&RainL[0], "Status", "", IPS_IDLE);
IUFillLightVector(&RainLP, RainL, 1, getDeviceName(), "Rain Alert", "", MAIN_CONTROL_TAB, IPS_IDLE);
IUFillSwitch(&RainS[0], "On", "", ISS_OFF);
IUFillSwitch(&RainS[1], "Off", "", ISS_OFF);
IUFillSwitchVector(&RainSP, RainS, 2, getDeviceName(), "Control Rain", "", MAIN_CONTROL_TAB, IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
return true;
}
/********************************************************************************************
** INDI is asking us to update the properties because there is a change in CONNECTION status
** This fucntion is called whenever the device is connected or disconnected.
*********************************************************************************************/
bool RainDetector::updateProperties()
{
// Call parent update properties first
INDI::DefaultDevice::updateProperties();
if (isConnected())
{
defineLight(&RainLP);
defineSwitch(&RainSP);
}
else
// We're disconnected
{
deleteProperty(RainLP.name);
deleteProperty(RainSP.name);
}
return true;
}
/********************************************************************************************
** Client is asking us to update a switch
*********************************************************************************************/
bool RainDetector::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
{
if (!strcmp(dev, getDeviceName()))
{
if (!strcmp(name, RainSP.name))
{
IUUpdateSwitch(&RainSP, states, names, n);
if (RainS[0].s == ISS_ON)
{
RainL[0].s = IPS_ALERT;
RainLP.s = IPS_ALERT;
IDSetLight(&RainLP, "Alert! Alert! Rain detected!");
}
else
{
RainL[0].s = IPS_IDLE;
RainLP.s = IPS_OK;
IDSetLight(&RainLP, "Rain threat passed. The skies are clear.");
}
RainSP.s = IPS_OK;
IDSetSwitch(&RainSP, NULL);
return true;
}
}
return INDI::DefaultDevice::ISNewSwitch(dev, name, states, names, n);
}
|