Subversion Repositories HomeAutomation

Rev

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

  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"
  26. #include "control/Node.h"
  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);
  42.     this->ExportFunction("NodeExport_GetNodeInformation",Node::Export_GetNodeInformation);
  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. {
  71.     v8::Locker lock;
  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. {
  85.     v8::Locker lock;
  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. {
  103.     v8::Locker lock;
  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. {
  122.     v8::Locker lock;
  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. }
  138.  
  139. Value Node::Export_GetNodeInformation(const v8::Arguments& args)
  140. {
  141.     v8::Locker lock;
  142.     v8::Context::Scope context_scope(vm::Manager::Instance()->GetContext());
  143.    
  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.  
  178. }; // namespace plugin
  179. }; // namespace vm
  180. }; // namespace atom
  181.