File: raindetector.cpp

package info (click to toggle)
indi 1.9.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 13,668 kB
  • sloc: cpp: 186,148; ansic: 30,833; xml: 869; sh: 282; makefile: 11
file content (107 lines) | stat: -rw-r--r-- 3,614 bytes parent folder | download | duplicates (3)
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;
}