Subversion Repositories HomeAutomation

Rev

Rev 1642 | Rev 1646 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1642 Rev 1644
Line 1... Line 1...
1
 
1
 
2
var modules = new Array();
2
Require("plugin/storage.js");
3
 
3
 
4
function RequireModule(name)
4
function Module_CreateAliasGroupAutoComplete(args)
5
{
5
{
-
 
6
    // args[0] == command name
-
 
7
    var arg_index = args.length - 2;
-
 
8
   
-
 
9
    if (arg_index == 0)
-
 
10
    {
-
 
11
        return Module_GetAliasNames();
-
 
12
    }
-
 
13
    else if (arg_index == 1)
-
 
14
    {
-
 
15
        return [ "Dimmer230", "irTransmit" ];
-
 
16
    }
-
 
17
    else if (arg_index >= 2)
-
 
18
    {
-
 
19
        return Module_GetAliasNames([ args[2] ])
-
 
20
    }
-
 
21
   
-
 
22
    return [];
-
 
23
}
-
 
24
 
-
 
25
function Module_CreateAliasGroup(alias_group_name, module_type, alias_name1, alias_name2)
-
 
26
{
-
 
27
    if (arguments.length < 3)
-
 
28
    {
-
 
29
        throw("Not enought parameters given");
-
 
30
    }
-
 
31
   
-
 
32
    alias_group_name = arguments[0];
-
 
33
    module_type = arguments[1];
-
 
34
    var aliases = [];
-
 
35
   
-
 
36
    for (var n = 2; n < arguments.length; n++)
-
 
37
    {
-
 
38
        if (arguments[n].length > 0)
-
 
39
        {
-
 
40
            var aliases_data = Module_ResolveAlias(arguments[n]);
-
 
41
            aliases.push(arguments[n]);
-
 
42
        }
-
 
43
    }
-
 
44
   
-
 
45
    if (aliases.length == 0)
-
 
46
    {
-
 
47
        throw("No valid aliases were found, aborting creation of group alias");
-
 
48
    }
-
 
49
   
-
 
50
    var alias_data = {
-
 
51
        "group"       : true,
-
 
52
        "name"        : alias_group_name,
-
 
53
        "module_name" : module_type,
-
 
54
        "aliases"     : aliases
-
 
55
    };
-
 
56
   
-
 
57
    return Storage_SetParameter("alias", alias_group_name, JSON.stringify(alias_data));
-
 
58
}
-
 
59
Console_RegisterCommand(Module_CreateAliasGroup, Module_CreateAliasGroupAutoComplete);
-
 
60
 
-
 
61
function Module_ResolveAlias(alias_name, filter_module_names)
-
 
62
{
-
 
63
    var aliases_data = {};
-
 
64
    var alias_data_string = Storage_GetParameter("alias", alias_name);
-
 
65
   
-
 
66
    if (alias_data_string)
-
 
67
    {
-
 
68
        var alias_data = eval("(" + alias_data_string + ")");
-
 
69
       
-
 
70
        if (alias_data["group"])
-
 
71
        {
-
 
72
            for (var n in alias_data["aliases"])
-
 
73
            {
-
 
74
                var aliases_data_sub = Module_ResolveAlias(alias_data["aliases"][n]);
-
 
75
               
-
 
76
                for (var name in aliases_data_sub)
-
 
77
                {
-
 
78
                    aliases_data[name] = aliases_data_sub[name];
-
 
79
                }
-
 
80
            }
-
 
81
        }
-
 
82
        else
-
 
83
        {
-
 
84
            if (in_array(filter_module_names, alias_data["module_name"]))
-
 
85
            {
-
 
86
                aliases_data[alias_name] = alias_data;
-
 
87
            }
-
 
88
        }
-
 
89
    }
-
 
90
   
-
 
91
    return aliases_data;
-
 
92
}
-
 
93
 
-
 
94
function Module_LookupAliases(match_filter)
-
 
95
{
-
 
96
    var aliases_data_filtered = {};
-
 
97
    var aliases_data = Storage_GetParameters("alias");
-
 
98
   
-
 
99
    for (var name in aliases_data)
-
 
100
    {
-
 
101
        var alias_data = eval("(" + aliases_data[name] + ")");
-
 
102
       
-
 
103
        var valid = true;
-
 
104
       
-
 
105
        for (var key in match_filter)
-
 
106
        {
-
 
107
            if (alias_data[key] != match_filter[key])
-
 
108
            {
-
 
109
                valid = false;
-
 
110
                break;
-
 
111
            }
-
 
112
        }
-
 
113
       
-
 
114
        if (valid)
-
 
115
        {
-
 
116
            aliases_data_filtered[name] = alias_data;
-
 
117
        }
-
 
118
    }
-
 
119
   
-
 
120
    return aliases_data_filtered;
-
 
121
}
-
 
122
 
-
 
123
function Module_GetAliasNames(filter_module_names)
-
 
124
{
-
 
125
    var aliases_name_filtered = [];
-
 
126
    var aliases_data = Storage_GetParameters("alias");
-
 
127
   
-
 
128
    for (var name in aliases_data)
-
 
129
    {
-
 
130
        var alias_data = eval("(" + aliases_data[name] + ")");
-
 
131
       
-
 
132
        if (!filter_module_names || in_array(filter_module_names, alias_data["module_name"]))
-
 
133
        {
-
 
134
            aliases_name_filtered.push(name)
-
 
135
        }
-
 
136
    }
-
 
137
   
-
 
138
    return aliases_name_filtered;
-
 
139
}
-
 
140
 
-
 
141
function Module_GetAvailableIds(filter_module_names)
-
 
142
{
-
 
143
    var result_list = [];
-
 
144
    var available_modules = ModuleExport_GetAvailableModules();
-
 
145
   
-
 
146
    for (var n in available_modules)
-
 
147
    {
-
 
148
        var id_parts = available_modules[n].split(":", 2);
-
 
149
       
-
 
150
        if (in_array(filter_module_names, id_parts[0]))
-
 
151
        {
-
 
152
            result_list.push(id_parts[1]);
-
 
153
        }
-
 
154
    }
-
 
155
   
-
 
156
    return result_list;
-
 
157
}
-
 
158
 
-
 
159
function Module_SendMessage(module_name, module_id, command, variables)
-
 
160
{
-
 
161
    var args = [];
-
 
162
   
-
 
163
    args.push(module_name + ":" + module_id);
-
 
164
    args.push(command);
-
 
165
   
-
 
166
    var length = 0;
-
 
167
    for (var key in variables)
-
 
168
    {
-
 
169
        length++;
-
 
170
    }
-
 
171
   
-
 
172
    Log("length=" + length);
-
 
173
   
6
    GetModule(name);
174
    args.push(length);
-
 
175
   
-
 
176
    for (var key in variables)
-
 
177
    {
-
 
178
        args.push(key);
-
 
179
        args.push(variables[key]);
-
 
180
    }
-
 
181
   
-
 
182
    return ModuleExport_SendMessage.apply(null, Array.prototype.slice.call(args, 0));
-
 
183
}
-
 
184
 
-
 
185
var Module_MessageAliasLookupFunctions = {};
-
 
186
var Module_OnChangeFunctions = {};
-
 
187
var Module_OnMessageFunctions = {};
-
 
188
 
-
 
189
function Module_RegisterMessageAliasLookup(module_name, callback)
-
 
190
{
-
 
191
    Module_MessageAliasLookupFunctions[module_name] = callback;
-
 
192
}
-
 
193
 
-
 
194
function Module_RegisterToOnChange(alias_name, callback)
-
 
195
{
-
 
196
    if (!Module_OnChangeFunctions[alias_name])
-
 
197
    {
-
 
198
        Module_OnChangeFunctions[alias_name] = [];
-
 
199
    }
-
 
200
   
-
 
201
    Module_OnChangeFunctions[alias_name].push(callback);
-
 
202
}
-
 
203
 
-
 
204
function Module_RegisterToOnMessage(alias_name, callback)
-
 
205
{
-
 
206
    if (!Module_OnMessageFunctions[alias_name])
-
 
207
    {
-
 
208
        Module_OnMessageFunctions[alias_name] = [];
-
 
209
    }
-
 
210
   
-
 
211
    Module_OnMessageFunctions[alias_name].push(callback);
-
 
212
}
-
 
213
 
-
 
214
function Module_OnMessage(full_id, command, variables)
-
 
215
{
-
 
216
    var id_parts = full_id.split(":", 2);
-
 
217
    var aliases_data = {};
-
 
218
   
-
 
219
    if (Module_MessageAliasLookupFunctions[id_parts[0]])
-
 
220
    {
-
 
221
        aliases_data = Module_MessageAliasLookupFunctions[id_parts[0]](id_parts[1], command, variables);
7
}
222
    }
8
 
223
   
9
function GetModule(name)
224
    for (var alias_name in alias_data)
10
{
225
    {
11
    if (typeof modules[name] == 'undefined')
226
        if (Module_OnMessageFunctions[alias_name])
12
    {
227
        {
13
        LoadScript("module/" + name + ".js");
-
 
14
       
-
 
15
        if (eval("typeof " + name + " != 'function'"))
228
            for (var n in Module_OnMessageFunctions[alias_name])
16
        {
229
            {
17
            Log("Failed to load " + name + " module.");
230
                Module_OnMessageFunctions[alias_name][n](alias_name, command, variables);
18
            return;
-
 
19
        }
231
            }
20
       
232
        }
21
        modules[name] = eval("(new " + name + "('" + name + "'))");
-
 
22
    }
233
    }
23
   
-
 
24
    return modules[name];
-
 
25
}
234
}
26
 
235
 
27
function Module_OnChange(full_id, available)
236
function Module_OnChange(full_id, available)
28
{
237
{
29
    var parts = full_id.split(":", 2);
238
    var id_parts = full_id.split(":", 2);
-
 
239
   
-
 
240
    var aliases_data = Module_LookupAliases({
-
 
241
        "module_name" : id_parts[0],
-
 
242
        "module_id"   : id_parts[1],
-
 
243
    });
30
   
244
   
31
    if (global_legacy)
245
    for (var alias_name in alias_data)
32
    {
246
    {
33
        legacyOnState(full_id, parts[1], parts[0], available);
-
 
34
        return;
-
 
35
    }
-
 
36
   
-
 
37
    var module = GetModule(parts[0]);
-
 
38
   
-
 
39
    if (module)
-
 
40
    {
-
 
41
        module.SetStatus(parts[1], available);
247
        if (Module_OnChangeFunctions[alias_name])
42
    }
-
 
43
}
-
 
44
 
-
 
45
function Module_OnMessage()
-
 
46
{
-
 
47
    var full_id = arguments[0];
-
 
48
    var command = arguments[1];
-
 
49
    var variables = arguments[2];
-
 
50
   
-
 
51
    var parts = full_id.split(":", 2);
-
 
52
   
-
 
53
    if (global_legacy)
-
 
54
    {
248
        {
55
        legacyOnMessage(full_id, parts[1], parts[0], command, variables);
-
 
56
        return;
-
 
57
    }
-
 
58
   
-
 
59
    var module = GetModule(parts[0]);
-
 
60
   
-
 
61
    if (module)
-
 
62
    {
-
 
63
        module.ReceiveMessage(parts[1], command, variables);
-
 
64
    }
-
 
65
    else
-
 
66
    {
-
 
67
        //Log("No one to receive this message, ignoring...");
-
 
68
    }
-
 
69
}
-
 
70
 
-
 
71
function SendModuleMessage(full_id, command, variables)
-
 
72
{
-
 
73
    var args = new Array();
-
 
74
   
-
 
75
    args[args.length] = full_id;
-
 
76
    args[args.length] = command;
-
 
77
    args[args.length] = variables.length;
-
 
78
   
-
 
79
    for (var i = 0; i < variables.length; i++)
-
 
80
    {
-
 
81
        var obj = variables[i];
-
 
82
       
-
 
83
        for (var key in obj)
-
 
84
        {
-
 
85
            args[args.length] = key;
-
 
86
            args[args.length] = obj[key];
-
 
87
        }
-
 
88
    }
-
 
89
   
-
 
90
    Module_SendMessage.apply(null, Array.prototype.slice.call(args, 0));
-
 
91
}
-
 
92
 
-
 
93
 
-
 
94
function Module(name)
-
 
95
{
-
 
96
    this.name_ = name;
-
 
97
    this.ids_ = new Array();
-
 
98
   
-
 
99
    this.EventBase();
-
 
100
}
-
 
101
 
-
 
102
Extend(Module, EventBase);
-
 
103
 
-
 
104
Module.prototype.name_;
-
 
105
Module.prototype.ids_;
-
 
106
 
-
 
107
Module.prototype.SetStatus = function(id, available)
-
 
108
{
-
 
109
    if (typeof this.ids_[id] == 'undefined')
-
 
110
    {
-
 
111
        this.ids_[id] = available;
-
 
112
        this.EventBase.prototype.Trigger.call(this, "onStatusChange", id, available);
-
 
113
    }
-
 
114
    else if (this.ids[id] != available)
-
 
115
    {
-
 
116
        this.EventBase.prototype.Trigger.call(this, "onStatusChange", id, available);
-
 
117
    }
-
 
118
}
-
 
119
 
-
 
120
Module.prototype.ReceiveMessage = function(id, command, variables)
-
 
121
{
-
 
122
    //Log("received " + command);
-
 
123
}
-
 
124
 
-
 
125
Module.prototype.GetAvailableIds = function()
-
 
126
{
-
 
127
    var ids = new Array();
-
 
128
   
-
 
129
    for (var id in this.ids_)
-
 
130
    {
-
 
131
        if (this.ids_[id] && typeof this.ids_[id] != 'function')
-
 
132
        {
-
 
133
            ids[ids.length] = id;
-
 
134
        }
-
 
135
    }
-
 
136
   
-
 
137
    return ids;
-
 
138
}
-
 
139
 
-
 
140
Module.prototype.GetAvailableNames = function()
-
 
141
{
-
 
142
    var result = new Array();
-
 
143
    var available_ids = this.GetAvailableIds();
-
 
144
   
-
 
145
    var module_aliases = getaliases();
-
 
146
   
-
 
147
    for (var alias in module_aliases)
-
 
148
    {
-
 
149
        if (module_aliases[alias]["is_group"])
-
 
150
        {
-
 
151
            for (var n = 0; n < module_aliases[alias]["aliases"].length; n++)
249
            for (var n in Module_OnChangeFunctions[alias_name])
152
            {
250
            {
153
                var group_alias = module_aliases[alias]["aliases"][n];
251
                Module_OnChangeFunctions[alias_name][n](alias_name, available);
154
 
-
 
155
                if (module_aliases[group_alias]["module_name"] == this.name_ && ArrayContains(available_ids, module_aliases[group_alias]["module_id"]))
-
 
156
                {
-
 
157
                    result.push(alias);
-
 
158
                    break;
-
 
159
                }
-
 
160
            }
-
 
161
        }
-
 
162
        else
-
 
163
        {
-
 
164
            if (module_aliases[alias]["module_name"] == this.name_ && ArrayContains(available_ids, module_aliases[alias]["module_id"]))
-
 
165
            {
-
 
166
                result.push(alias);
-
 
167
            }
252
            }
168
        }
253
        }
169
    }
254
    }
170
   
-
 
171
    return result;
-
 
172
}
-
 
173
 
-
 
174
Module.prototype.IsAvailable = function(id)
-
 
175
{
-
 
176
    if (typeof this.ids_[id] == 'undefined' || this.ids_[id] == false)
-
 
177
    {
-
 
178
        return false;
-
 
179
    }
-
 
180
   
-
 
181
    return true;
-
 
182
}
-
 
183
 
-
 
184
Module.prototype.SendMessage = function(id, command, variables)
-
 
185
{
-
 
186
    if (this.IsAvailable(id))
-
 
187
    {
-
 
188
        SendModuleMessage(this.name_ + ":" + id, command, variables);
-
 
189
    }
-
 
190
}
-
 
191
 
-
 
192
 
-
 
193
// Console Commands
-
 
194
 
-
 
195
function modulelist()
-
 
196
{
-
 
197
    var result = "";
-
 
198
   
-
 
199
    for (var name in modules)
-
 
200
    {
-
 
201
        result += name + ":  " + modules[name].GetAvailableIds().toString() + "\n";
-
 
202
    }
-
 
203
   
-
 
204
    return result;
-
 
205
}
-
 
206
 
-
 
207
RegisterConsoleCommand(modulelist);
-
 
208
 
-
 
209
function programnode(node_id, is_bios, filename)
-
 
210
{
-
 
211
    Log("is_bios = " + is_bios);
-
 
212
    return Module_ProgramNode(node_id, is_bios == 1 ? true : false, filename) ? "OK" : "Error";
-
 
213
}
255
}
214
 
-
 
215
RegisterConsoleCommand(programnode);
-
 
216
 
-