Subversion Repositories HomeAutomation

Rev

Rev 1665 | Rev 1741 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
1657 runge 1
/*
2
 *
3
 *  Copyright (C) 2010  Mattias Runge
4
 *
5
 *  This program is free software; you can redistribute it and/or modify
6
 *  it under the terms of the GNU General Public License as published by
7
 *  the Free Software Foundation; either version 2 of the License, or
8
 *  (at your option) any later version.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License along
16
 *  with this program; if not, write to the Free Software Foundation, Inc.,
17
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
 *
19
 */
20
 
21
#include "Node.h"
22
 
23
#include <boost/lexical_cast.hpp>
24
 
25
#include "control/Manager.h"
1665 runge 26
#include "control/Node.h"
1657 runge 27
#include "vm/Manager.h"
28
 
29
namespace atom {
30
namespace vm {
31
namespace plugin {
32
 
33
logging::Logger Node::LOG("vm::plugin::node");
34
 
35
Node::Node(boost::asio::io_service& io_service) : Plugin(io_service)
36
{
37
    this->name_ = "node";
38
 
39
    this->ExportFunction("NodeExport_ResetNode",         Node::Export_ResetNode);
40
    this->ExportFunction("NodeExport_GetAvailableNodes", Node::Export_GetAvailableNodes);
41
    this->ExportFunction("NodeExport_ProgramNode",       Node::Export_ProgramNode);
1665 runge 42
    this->ExportFunction("NodeExport_GetNodeInformation",Node::Export_GetNodeInformation);
1657 runge 43
}
44
 
45
Node::~Node()
46
{
47
    this->tracker_.reset();
48
}
49
 
50
void Node::InitializeDone()
51
{
52
    Plugin::InitializeDone();
53
 
54
    this->ImportFunction("Node_OnChange");
55
 
56
    control::Manager::Instance()->ConnectSlotNode(control::Manager::SignalOnNodeChange::slot_type(&Node::SlotOnNodeChange, this, _1, _2).track(this->tracker_));
57
}
58
 
59
void Node::CallOutput(unsigned int request_id, std::string output)
60
{
61
    LOG.Info(output);
62
}
63
 
64
void Node::SlotOnNodeChange(control::Node::Id node_id, bool available)
65
{
66
    this->io_service_.post(boost::bind(&Node::SlotOnNodeChangeHandler, this, node_id, available));
67
}
68
 
69
void Node::SlotOnNodeChangeHandler(control::Node::Id node_id, bool available)
70
{
1740 runge 71
    v8::Locker lock;
1657 runge 72
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
73
 
74
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
75
 
76
    ArgumentListPointer arguments = ArgumentListPointer(new ArgumentList);
77
    arguments->push_back(v8::String::New(node_id.data()));
78
    arguments->push_back(v8::Boolean::New(available));
79
 
80
    this->Call(0, "Node_OnChange", arguments);
81
}
82
 
83
Value Node::Export_ResetNode(const v8::Arguments& args)
84
{
1740 runge 85
    v8::Locker lock;
1657 runge 86
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
87
 
88
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
89
 
90
    if (args.Length() < 1)
91
    {
92
        LOG.Error(std::string(__FUNCTION__) + ": To few arguments.");
93
        return v8::Boolean::New(false);
94
    }
95
 
96
    v8::String::AsciiValue node_id(args[0]);
97
 
98
    return v8::Boolean::New(control::Manager::Instance()->ResetNode(*node_id));
99
}
100
 
101
Value Node::Export_GetAvailableNodes(const v8::Arguments& args)
102
{
1740 runge 103
    v8::Locker lock;
1657 runge 104
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
105
 
106
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
107
 
108
    common::StringList available_nodes = control::Manager::Instance()->GetAvailableNodes();
109
 
110
    v8::Local<v8::Array> result = v8::Array::New(available_nodes.size());
111
 
112
    for (unsigned int n = 0; n < available_nodes.size(); n++)
113
    {
114
        result->Set(n, v8::String::New(available_nodes[n].data()));
115
    }
116
 
117
    return result;
118
}
119
 
120
Value Node::Export_ProgramNode(const v8::Arguments& args)
121
{
1740 runge 122
    v8::Locker lock;
1657 runge 123
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
124
 
125
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
126
 
127
    if (args.Length() < 3)
128
    {
129
        LOG.Error(std::string(__FUNCTION__) + ": To few arguments.");
130
        return v8::Boolean::New(false);
131
    }
132
 
133
    v8::String::AsciiValue node_id(args[0]);
134
    v8::String::AsciiValue filename(args[2]);
135
 
136
    return v8::Boolean::New(control::Manager::Instance()->ProgramNode(*node_id, args[1]->BooleanValue(), std::string(*filename)));
137
}
1665 runge 138
 
139
Value Node::Export_GetNodeInformation(const v8::Arguments& args)
140
{
1740 runge 141
    v8::Locker lock;
1665 runge 142
    v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
1657 runge 143
 
1665 runge 144
    //LOG.Debug(std::string(__FUNCTION__) + " called!");
145
 
146
    if (args.Length() < 1)
147
    {
148
        LOG.Error(std::string(__FUNCTION__) + ": To few arguments.");
149
        return v8::Boolean::New(false);
150
    }
151
 
152
    v8::String::AsciiValue node_id(args[0]);
153
 
154
    control::Node::Information information;
155
 
156
    try
157
    {
158
        information = control::Manager::Instance()->GetNodeInformation(*node_id);
159
    }
160
    catch (std::runtime_error& e)
161
    {
162
        LOG.Error(e.what());
163
        return v8::Undefined();
164
    }
165
 
166
    v8::Local<v8::Array> result = v8::Array::New(6);
167
 
168
    result->Set(v8::String::New("Id"),            args[0]);
169
    result->Set(v8::String::New("Valid"),         v8::Boolean::New(information.valid_));
170
    result->Set(v8::String::New("BiosVersion"),   v8::Uint32::New(information.bios_version_));
171
    result->Set(v8::String::New("DeviceType"),    v8::String::New(information.device_type_.data()));
172
    result->Set(v8::String::New("HasApplication"),v8::Boolean::New(information.has_application_));
173
    result->Set(v8::String::New("LastActive"),    v8::Uint32::New(information.last_active_));
174
 
175
    return result;
176
}
177
 
1657 runge 178
}; // namespace plugin
179
}; // namespace vm
180
}; // namespace atom