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
|
#strict 2
#include SN7I
local interval, timer, setupUser, repeats, repeatCount;
func Init()
{
interval = 35;
}
func ControlThrow(object caller)
{
Toggle();
return ClearCom(caller);
}
func ControlThrowDouble() { return ControlThrow(...); }
func Triggers() { return [["$Timeout$"]];}
func Setup(object caller, int &menuIndex)
{
setupUser = caller;
AddMenuItem(Format("$Interval$", interval), "SetTimerEntry", GetID(), caller, 0, menuIndex++, 0, C4MN_Add_ForceNoDesc);
AddMenuItem(Format("$Repeats$", (repeats && Format("%d", repeats)) || "$InfRepeats$"), "SetRepeatsEntry", GetID(), caller, 0, menuIndex++, 0, C4MN_Add_ForceNoDesc);
AddMenuItem((!timer && "$Start$") || "$Stop$", "ToggleActive", GetID(), caller, 0, menuIndex++, 0, C4MN_Add_ForceNoDesc);
AddMenuItem("$Test$", "Timeout", GetID(), caller, 0, menuIndex++, 0, C4MN_Add_ForceNoDesc);
return true;
}
func SetTimerEntry(id id, int menuIndex, bool right)
{
interval = Max(1, interval - (right * 2 - 1));
_Setup(setupUser);
SelectMenuItem(menuIndex, setupUser);
if(timer)
{
RemoveTimer(timer);
timer = 0;
timer = AddTimer("Timeout", interval);
}
}
func SetRepeatsEntry(id id, int menuIndex, bool right)
{
repeats = Max(0, repeats - (right * 2 - 1));
_Setup(setupUser);
SelectMenuItem(menuIndex, setupUser);
}
func ToggleActive(id id, int menuIndex, bool right)
{
Toggle();
_Setup(setupUser);
SelectMenuItem(menuIndex, setupUser);
}
func Toggle()
{
if(timer)
{
Stop();
}
else
{
Start();
}
}
func Stop()
{
if(timer)
{
RemoveTimer(timer);
timer = 0;
SetAction("Idle");
}
}
func Start()
{
if(!timer)
{
timer = AddTimer("Timeout", interval);
SetAction("On");
repeatCount = 0;
}
}
func Timeout(sym, int menuIndex)
{
Trigger(0, this);
if(GetType(sym) == C4V_C4ID)
{
_Setup(setupUser);
SelectMenuItem(menuIndex, setupUser);
}
else if(!sym && repeats && ++repeatCount >= repeats)
{
Stop();
}
}
func SingleShot()
{
ScheduleCall(this, "Timeout", interval);
}
func SensorCallbacks()
{
return [["$SingleShot$", "SingleShot"], ["$Start$", "Start"], ["$Stop$", "Stop"]];
}
|