ppovb5fc7/gazebo/plugins/KeyboardGUIPlugin.cc

106 lines
3.1 KiB
C++

/*
* Copyright (C) 2016 Open Source Robotics Foundation
*
* 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.
*
*/
#ifdef _WIN32
// Ensure that Winsock2.h is included before Windows.h, which can get
// pulled in by anybody (e.g., Boost).
#include <Winsock2.h>
#endif
#include <gazebo/transport/Node.hh>
#include "KeyboardGUIPlugin.hh"
namespace gazebo
{
/// \brief Private data for the KeyboardGUIPlugin class
class KeyboardGUIPluginPrivate
{
/// \brief Pointer to a node for communication.
public: transport::NodePtr gzNode;
/// \brief keyboard publisher.
public: transport::PublisherPtr keyboardPub;
};
}
using namespace gazebo;
// Register this plugin with the simulator
GZ_REGISTER_GUI_PLUGIN(KeyboardGUIPlugin)
/////////////////////////////////////////////////
KeyboardGUIPlugin::KeyboardGUIPlugin()
: GUIPlugin(), dataPtr(new KeyboardGUIPluginPrivate)
{
gazebo::gui::MainWindow *mainWindow = gazebo::gui::get_main_window();
if (!mainWindow)
{
gzerr << "Couldn't get main window, keyboard events won't be filtered."
<< std::endl;
return;
}
mainWindow->installEventFilter(this);
// Make this invisible
this->move(0, 0);
this->resize(0, 0);
// Initialize transport.
this->dataPtr->gzNode = transport::NodePtr(new transport::Node());
this->dataPtr->gzNode->Init();
this->dataPtr->keyboardPub =
this->dataPtr->gzNode->Advertise<msgs::Any>("~/keyboard/keypress");
}
/////////////////////////////////////////////////
KeyboardGUIPlugin::~KeyboardGUIPlugin()
{
this->dataPtr->keyboardPub.reset();
this->dataPtr->gzNode->Fini();
}
/////////////////////////////////////////////////
void KeyboardGUIPlugin::OnKeyPress(const gazebo::common::KeyEvent &_event)
{
msgs::Any msg;
msg.set_type(msgs::Any_ValueType_INT32);
msg.set_int_value(_event.key);
this->dataPtr->keyboardPub->Publish(msg);
}
/////////////////////////////////////////////////
bool KeyboardGUIPlugin::eventFilter(QObject *_obj, QEvent *_event)
{
// Check if there was a keypress in a child
if (_event->type() == QEvent::ShortcutOverride)
{
QKeyEvent *qtKeyEvent = dynamic_cast<QKeyEvent *>(_event);
gazebo::common::KeyEvent gazeboKeyEvent;
gazeboKeyEvent.text = qtKeyEvent->text().toStdString();
// QKeyEvent::key() does not distiguish between lowercase and uppercase.
// Need to use QKeyEvent::text() to get the unicode character.
// Special keys (shift, ctrl) will have an empty text field.
gazeboKeyEvent.key = !gazeboKeyEvent.text.empty() ? gazeboKeyEvent.text[0] :
qtKeyEvent->key();
this->OnKeyPress(gazeboKeyEvent);
}
return QObject::eventFilter(_obj, _event);
}