-
Notifications
You must be signed in to change notification settings - Fork 2
/
ParentIOHelper.php
115 lines (109 loc) · 3.34 KB
/
ParentIOHelper.php
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
<?php
/**
* @addtogroup generic
* @{
*
* @package generic
* @file ParentIOHelper.php
* @author Michael Tröger <micha@nall-chan.net>
* @copyright 2018 Michael Tröger
* @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC BY-NC-SA 4.0
* @version 5.0
*/
/**
* Trait mit Hilfsfunktionen für den Datenaustausch.
* @property integer $ParentID
*/
trait InstanceStatus
{
/**
* Interne Funktion des SDK.
* Alle Events des Parent werden hier verarbeitet und entkoppelt über RequestAction an IOChangeState übergeben.
* @access public
*/
protected function MessageSink($TimeStamp, $SenderID, $Message, $Data)
{
switch ($Message) {
case IM_CHANGESETTINGS:
if ($SenderID != $this->ParentID) {
return;
}
// no break
case FM_CONNECT:
$this->RegisterParent();
if ($this->HasActiveParent()) {
$State = IS_ACTIVE;
} else {
$State = IS_INACTIVE;
}
break;
case FM_DISCONNECT:
$this->RegisterParent();
$State = IS_INACTIVE;
break;
case IM_CHANGESTATUS:
if ($SenderID != $this->ParentID) {
return;
}
$State = $Data[0];
break;
default:
return;
}
IPS_RunScriptText('IPS_RequestAction(' . $this->InstanceID . ',"IOChangeState",' . $State . ');');
}
/**
* Interne Funktion des SDK.
* Empfängt über RequestAction die Events vom Parent und führt IOChangeState aus.
*
* @access public
* @return bool True wenn $Ident verarbeitet wurde.
*/
protected function RequestAction($Ident, $Value)
{
if ($Ident != 'IOChangeState') {
return false;
}
$this->IOChangeState($Value);
return true;
}
/**
* Ermittelt den Parent und verwaltet die Einträge des Parent im MessageSink
* Ermöglicht es das Statusänderungen des Parent empfangen werden können.
*
* @access protected
* @return int ID des Parent.
*/
protected function RegisterParent()
{
$OldParentId = $this->ParentID;
$ParentId = @IPS_GetInstance($this->InstanceID)['ConnectionID'];
if ($ParentId <> $OldParentId) {
if ($OldParentId > 0) {
$this->UnregisterMessage($OldParentId, IM_CHANGESETTINGS);
$this->UnregisterMessage($OldParentId, IM_CHANGESTATUS);
}
if ($ParentId > 0) {
$this->RegisterMessage($ParentId, IM_CHANGESETTINGS);
$this->RegisterMessage($ParentId, IM_CHANGESTATUS);
} else {
$ParentId = 0;
}
$this->ParentID = $ParentId;
}
return $ParentId;
}
/**
* Interne Funktion des SDK.
* Erweitert die SDK funktion um die Prüfung ob überhaupt ein Parent verbunden ist.
* @return bool True wenn Parent-Kette vorhanden und aktiv ist.
*/
protected function HasActiveParent()
{
if ($this->ParentID > 0) {
return parent::HasActiveParent();
}
return false;
}
}
/* @} */