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
|
--[[
Copyright (C) 2016 "IoT.bzh"
Author Fulup Ar Foll <fulup@iot.bzh>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Following function are called when a control activate a label with
labeller api -> APi=label VERB=dispatch
arguments are
- source (0) when requesting the label (-1) when releasing
- label comme from config given with 'control' in onload-middlename-xxxxx.json
- control is the argument part of the query as providing by control requesting the label.
--]]
_CurrentHalVolume={}
local function Apply_Hal_Control(source, label, adjustment)
local HAL = _Global_Context["registry"]
-- check we really got some data
if (adjustment == nil) then
AFB:error ("--* (Hoops) Control should provide volume adjustment")
return 1
end
-- loop on each HAL save current volume and push adjustment
for key,hal in pairs(_Global_Context["registry"]) do
printf ("--- HAL=%s", Dump_Table(hal))
-- action set loop on active HAL and get current volume
-- if label respond then do volume adjustment
if (source == 0) then
-- get current volume for each HAL
local err,result= AFB:servsync(hal["api"],"ctlget", {["label"]=label})
-- if no error save current volume and set adjustment
if (err ~= nil) then
local response= result["response"]
printf ("--- Response %s=%s", hal["api"], Dump_Table(response))
if (response == nil) then
printf ("--- Fail to Activate '%s'='%s' result=%s", hal["api"], label, Dump_Table(result))
return 1 -- unhappy
end
-- save response in global space
_CurrentHalVolume [hal["api"]] = response
-- finally set the new value
local query= {
["tag"]= response["tag"],
["val"]= adjustment
}
-- best effort to set adjustment value
AFB:servsync(hal["api"],"ctlset",query)
end
else -- when label is release reverse action at preempt time
if (_CurrentHalVolume [hal["api"]] ~= nil) then
printf("--- Restoring initial volume HAL=%s Control=%s", hal["api"], _CurrentHalVolume [hal["api"]])
AFB:servsync(hal["api"],"ctlset", _CurrentHalVolume [hal["api"]])
end
end
end
return 0 -- happy end
end
-- Simple Happy(granted) Control
function _Temporarily_Control(source, control, client)
printf ("[--> _Temporarily_Control -->] source=%d control=%s client=%s", source, Dump_Table(control), Dump_Table(client))
-- Init should have been properly done
if (_Global_Context["registry"] == nil) then
AFB:error ("--* (Hoops) No Hal in _Global_Context=%s", Dump_Table(_Global_Context))
return 1
end
-- make sure label as valid
if (control["ctl"] == nil or control["val"] == nil) then
AFB:error ("--* Action Ignore no/invalid control=%s", Dump_Table(control))
return 1 -- unhappy
end
if (source == 0) then
AFB:info("-- Adjust %s=%d", control["ctl"], control["val"])
local error=Apply_Hal_Control(source, control["ctl"], control["val"])
if (error == nil) then
return 1 -- unhappy
end
AFB:notice ("[<-- _Temporarily_Control Granted<--]")
else
Apply_Hal_Control(source, control["ctl"],0)
AFB:notice ("[<-- _Temporarily_Control Restore--]")
end
return 0 -- happy return
end
|