From ef7cc925c4b3178fd59976ff8ec1a3db93963af6 Mon Sep 17 00:00:00 2001 From: fireclawthefox Date: Thu, 21 Jul 2016 23:09:09 +0200 Subject: [PATCH] Add data graph node for devices Add the new inputDeviceNode class to be used in the data graph Add config variable for low batery level --- panda/src/device/config_device.cxx | 3 + panda/src/device/config_device.h | 2 + panda/src/device/inputDeviceNode.cxx | 71 ++++++++++++++++++++++++ panda/src/device/inputDeviceNode.h | 66 ++++++++++++++++++++++ panda/src/device/p3device_composite1.cxx | 1 + 5 files changed, 143 insertions(+) create mode 100644 panda/src/device/inputDeviceNode.cxx create mode 100644 panda/src/device/inputDeviceNode.h diff --git a/panda/src/device/config_device.cxx b/panda/src/device/config_device.cxx index fdb9ab8c52..dc0c458f8c 100644 --- a/panda/src/device/config_device.cxx +++ b/panda/src/device/config_device.cxx @@ -36,6 +36,9 @@ NotifyCategoryDef(device, ""); ConfigVariableBool asynchronous_clients ("asynchronous-clients", true); +ConfigVariableInt low_battery_level +("low-battery-level", 15); + ConfigureFn(config_device) { init_libdevice(); } diff --git a/panda/src/device/config_device.h b/panda/src/device/config_device.h index 8a7b6542a7..a0e6aa8341 100644 --- a/panda/src/device/config_device.h +++ b/panda/src/device/config_device.h @@ -17,10 +17,12 @@ #include "pandabase.h" #include "notifyCategoryProxy.h" #include "configVariableBool.h" +#include "configVariableInt.h" NotifyCategoryDecl(device, EXPCL_PANDA_DEVICE, EXPTP_PANDA_DEVICE); extern ConfigVariableBool asynchronous_clients; +extern ConfigVariableInt low_battery_level; extern EXPCL_PANDA_DEVICE void init_libdevice(); diff --git a/panda/src/device/inputDeviceNode.cxx b/panda/src/device/inputDeviceNode.cxx new file mode 100644 index 0000000000..662b2dbac8 --- /dev/null +++ b/panda/src/device/inputDeviceNode.cxx @@ -0,0 +1,71 @@ +/** + * PANDA 3D SOFTWARE + * Copyright (c) Carnegie Mellon University. All rights reserved. + * + * All use of this software is subject to the terms of the revised BSD + * license. You should have received a copy of this license along + * with this source code in a file named "LICENSE." + * + * @file InputDeviceNode.cxx + * @author fireclaw + * @date 2016-07-14 + */ + +#include "config_device.h" +#include "inputDeviceNode.h" +#include "dataNodeTransmit.h" +#include "inputDeviceManager.h" + +TypeHandle InputDeviceNode::_type_handle; + +InputDeviceNode:: +InputDeviceNode(InputDevice *device, const string &name) : + DataNode(name), + _device(device) +{ + _button_events_output = define_output("button_events", ButtonEventList::get_class_type()); + _low_battery_event_output = define_output("low_battery_level_event", EventStoreInt::get_class_type()); +} + +/** + * Redirects the class to get the data from a different device. + */ +void InputDeviceNode:: +set_device(InputDevice *device) { + _device = device; +} + +/** + * Returns the associated device. + */ +PT(InputDevice) InputDeviceNode:: +get_device() const { + return _device; +} + +/** + * The virtual implementation of transmit_data(). This function receives an + * array of input parameters and should generate an array of output + * parameters. The input parameters may be accessed with the index numbers + * returned by the define_input() calls that were made earlier (presumably in + * the constructor); likewise, the output parameters should be set with the + * index numbers returned by the define_output() calls. + */ +void InputDeviceNode:: +do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &, + DataNodeTransmit &output) { + // get all button events of the device and forward them to the data graph + if (_device->has_button_event()) { + PT(ButtonEventList) bel = _device->get_button_events(); + output.set_data(_button_events_output, EventParameter(bel)); + } + + // calculate the battery level in percent and set a warning if the level is to low + if (_device->has_battery()) { + short bl = _device->get_battery_level(); + short bl_percent = bl / (_device->get_max_battery_level() / (short)100); + if (bl_percent <= low_battery_level) { + output.set_data(_low_battery_event_output, EventParameter(1)); + } + } +} diff --git a/panda/src/device/inputDeviceNode.h b/panda/src/device/inputDeviceNode.h new file mode 100644 index 0000000000..a8e6baef57 --- /dev/null +++ b/panda/src/device/inputDeviceNode.h @@ -0,0 +1,66 @@ +/** + * PANDA 3D SOFTWARE + * Copyright (c) Carnegie Mellon University. All rights reserved. + * + * All use of this software is subject to the terms of the revised BSD + * license. You should have received a copy of this license along + * with this source code in a file named "LICENSE." + * + * @file InputDeviceNode.h + * @author fireclaw + * @date 2016-07-14 + */ + +#ifndef INPUTDEVICENODE_H +#define INPUTDEVICENODE_H + +#include "pandabase.h" + +#include "dataNode.h" +#include "inputDeviceManager.h" +#include "linmath_events.h" + +/** + * Reads the controler data sent from the InputDeviceManager, and + * transmits it down the data graph. + * + * + */ +class EXPCL_PANDA_DEVICE InputDeviceNode : public DataNode { +PUBLISHED: + InputDeviceNode(InputDevice *device, const string &name); + void set_device(InputDevice *device); + PT(InputDevice) get_device() const; + +protected: + // Inherited from DataNode + virtual void do_transmit_data(DataGraphTraverser *trav, + const DataNodeTransmit &input, + DataNodeTransmit &output); + +private: + // outputs + int _button_events_output; + int _low_battery_event_output; + + PT(InputDevice) _device; + +public: + static TypeHandle get_class_type() { + return _type_handle; + } + static void init_type() { + DataNode::init_type(); + register_type(_type_handle, "InputDeviceNode", + DataNode::get_class_type()); + } + virtual TypeHandle get_type() const { + return get_class_type(); + } + virtual TypeHandle force_init_type() {init_type(); return get_class_type();} + +private: + static TypeHandle _type_handle; +}; + +#endif // INPUTDEVICENODE_H diff --git a/panda/src/device/p3device_composite1.cxx b/panda/src/device/p3device_composite1.cxx index 2e541a6f47..90c0b54133 100644 --- a/panda/src/device/p3device_composite1.cxx +++ b/panda/src/device/p3device_composite1.cxx @@ -10,3 +10,4 @@ #include "inputDeviceManager.cxx" #include "inputDeviceSet.cxx" #include "linuxJoystickDevice.cxx" +#include "inputDeviceNode.cxx"