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
|
/*
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 "raindetector.h"
#include <memory>
#include <cstring>
std::unique_ptr<RainDetector> rainDetector(new 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();
mRainLight[0].fill("Status", "", IPS_IDLE);
mRainLight.fill(getDeviceName(), "Rain Alert", "", MAIN_CONTROL_TAB, IPS_IDLE);
mRainSwitch[0].fill("On", "");
mRainSwitch[1].fill("Off", "");
mRainSwitch.fill(getDeviceName(), "Control Rain", "", MAIN_CONTROL_TAB, IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
mRainSwitch.onUpdate([this]()
{
if (mRainSwitch[0].getState() == ISS_ON)
{
mRainLight[0].setState(IPS_ALERT);
mRainLight.setState(IPS_ALERT);
mRainLight.apply("Alert! Alert! Rain detected!");
}
else
{
mRainLight[0].setState(IPS_IDLE);
mRainLight.setState(IPS_OK);
mRainLight.apply("Rain threat passed. The skies are clear.");
}
mRainSwitch.setState(IPS_OK);
mRainSwitch.apply();
});
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())
{
defineProperty(mRainLight);
defineProperty(mRainSwitch);
}
else
// We're disconnected
{
deleteProperty(mRainLight);
deleteProperty(mRainSwitch);
}
return true;
}
|