control messaging system, keyboard and gamepad inputs

This commit is contained in:
tmj-fstate
2017-04-07 00:36:07 +02:00
parent 886f0dad0f
commit e6f488ed6f
20 changed files with 2237 additions and 151 deletions

300
command.cpp Normal file
View File

@@ -0,0 +1,300 @@
/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
#include "stdafx.h"
#include "command.h"
#include "globals.h"
#include "logs.h"
#include "timer.h"
namespace simulation {
command_queue Commands;
}
// posts specified command for specified recipient
void
command_queue::push( command_data const &Command, std::size_t const Recipient ) {
auto lookup = m_commands.emplace( Recipient, commanddata_sequence() );
// recipient stack was either located or created, so we can add to it quite safely
lookup.first->second.emplace( Command );
}
// retrieves oldest posted command for specified recipient, if any. returns: true on retrieval, false if there's nothing to retrieve
bool
command_queue::pop( command_data &Command, std::size_t const Recipient ) {
auto lookup = m_commands.find( Recipient );
if( lookup == m_commands.end() ) {
// no command stack for this recipient, so no commands
return false;
}
auto &commands = lookup->second;
if( true == commands.empty() ) {
return false;
}
// we have command stack with command(s) on it, retrieve and pop the first one
Command = commands.front();
commands.pop();
return true;
}
command_relay::command_relay() {
m_targets = commandtarget_map{
{ user_command::mastercontrollerincrease, command_target::vehicle },
{ user_command::mastercontrollerincreasefast, command_target::vehicle },
{ user_command::mastercontrollerdecrease, command_target::vehicle },
{ user_command::mastercontrollerdecreasefast, command_target::vehicle },
{ user_command::secondcontrollerincrease, command_target::vehicle },
{ user_command::secondcontrollerincreasefast, command_target::vehicle },
{ user_command::secondcontrollerdecrease, command_target::vehicle },
{ user_command::secondcontrollerdecreasefast, command_target::vehicle },
{ user_command::independentbrakeincrease, command_target::vehicle },
{ user_command::independentbrakeincreasefast, command_target::vehicle },
{ user_command::independentbrakedecrease, command_target::vehicle },
{ user_command::independentbrakedecreasefast, command_target::vehicle },
{ user_command::independentbrakebailoff, command_target::vehicle },
{ user_command::trainbrakeincrease, command_target::vehicle },
{ user_command::trainbrakedecrease, command_target::vehicle },
{ user_command::trainbrakecharging, command_target::vehicle },
{ user_command::trainbrakerelease, command_target::vehicle },
{ user_command::trainbrakefirstservice, command_target::vehicle },
{ user_command::trainbrakeservice, command_target::vehicle },
{ user_command::trainbrakefullservice, command_target::vehicle },
{ user_command::trainbrakeemergency, command_target::vehicle },
/*
const int k_AntiSlipping = 21;
const int k_Sand = 22;
const int k_Main = 23;
*/
{ user_command::reverserincrease, command_target::vehicle },
{ user_command::reverserdecrease, command_target::vehicle },
/*
const int k_Fuse = 26;
const int k_Compressor = 27;
const int k_Converter = 28;
const int k_MaxCurrent = 29;
const int k_CurrentAutoRelay = 30;
const int k_BrakeProfile = 31;
const int k_Czuwak = 32;
const int k_Horn = 33;
const int k_Horn2 = 34;
const int k_FailedEngineCutOff = 35;
*/
{ user_command::viewturn, command_target::entity },
{ user_command::movevector, command_target::entity },
{ user_command::moveleft, command_target::entity },
{ user_command::moveright, command_target::entity },
{ user_command::moveforward, command_target::entity },
{ user_command::moveback, command_target::entity },
{ user_command::moveup, command_target::entity },
{ user_command::movedown, command_target::entity },
{ user_command::moveleftfast, command_target::entity },
{ user_command::moverightfast, command_target::entity },
{ user_command::moveforwardfast, command_target::entity },
{ user_command::movebackfast, command_target::entity },
{ user_command::moveupfast, command_target::entity },
{ user_command::movedownfast, command_target::entity }
/*
{ user_command::moveleftfastest, command_target::entity },
{ user_command::moverightfastest, command_target::entity },
{ user_command::moveforwardfastest, command_target::entity },
{ user_command::movebackfastest, command_target::entity },
{ user_command::moveupfastest, command_target::entity },
{ user_command::movedownfastest, command_target::entity }
*/
/*
const int k_CabForward = 42;
const int k_CabBackward = 43;
const int k_Couple = 44;
const int k_DeCouple = 45;
const int k_ProgramQuit = 46;
// const int k_ProgramPause= 47;
const int k_ProgramHelp = 48;
const int k_OpenLeft = 49;
const int k_OpenRight = 50;
const int k_CloseLeft = 51;
const int k_CloseRight = 52;
const int k_DepartureSignal = 53;
const int k_PantFrontUp = 54;
const int k_PantRearUp = 55;
const int k_PantFrontDown = 56;
const int k_PantRearDown = 57;
const int k_Heating = 58;
// const int k_FreeFlyMode= 59;
const int k_LeftSign = 60;
const int k_UpperSign = 61;
const int k_RightSign = 62;
const int k_SmallCompressor = 63;
const int k_StLinOff = 64;
const int k_CurrentNext = 65;
const int k_Univ1 = 66;
const int k_Univ2 = 67;
const int k_Univ3 = 68;
const int k_Univ4 = 69;
const int k_EndSign = 70;
const int k_Active = 71;
const int k_Battery = 72;
const int k_WalkMode = 73;
int const k_DimHeadlights = 74;
*/
};
#ifdef _DEBUG
m_commandnames = {
"mastercontrollerincrease",
"mastercontrollerincreasefast",
"mastercontrollerdecrease",
"mastercontrollerdecreasefast",
"secondcontrollerincrease",
"secondcontrollerincreasefast",
"secondcontrollerdecrease",
"secondcontrollerdecreasefast",
"independentbrakeincrease",
"independentbrakeincreasefast",
"independentbrakedecrease",
"independentbrakedecreasefast",
"independentbrakebailoff",
"trainbrakeincrease",
"trainbrakedecrease",
"trainbrakecharging",
"trainbrakerelease",
"trainbrakefirstservice",
"trainbrakeservice",
"trainbrakefullservice",
"trainbrakeemergency",
/*
const int k_AntiSlipping = 21;
const int k_Sand = 22;
const int k_Main = 23;
*/
"reverserincrease",
"reverserdecrease",
/*
const int k_Fuse = 26;
const int k_Compressor = 27;
const int k_Converter = 28;
const int k_MaxCurrent = 29;
const int k_CurrentAutoRelay = 30;
const int k_BrakeProfile = 31;
const int k_Czuwak = 32;
const int k_Horn = 33;
const int k_Horn2 = 34;
const int k_FailedEngineCutOff = 35;
*/
"", //"viewturn",
"", //"movevector",
"", //"moveleft",
"", //"moveright",
"", //"moveforward",
"", //"moveback",
"", //"moveup",
"", //"movedown",
"", //"moveleftfast",
"", //"moverightfast",
"", //"moveforwardfast",
"", //"movebackfast",
"", //"moveupfast",
"" //"movedownfast"
/*
"moveleftfastest",
"moverightfastest",
"moveforwardfastest",
"movebackfastest",
"moveupfastest",
"movedownfastest"
*/
/*
const int k_CabForward = 42;
const int k_CabBackward = 43;
const int k_Couple = 44;
const int k_DeCouple = 45;
const int k_ProgramQuit = 46;
// const int k_ProgramPause= 47;
const int k_ProgramHelp = 48;
const int k_OpenLeft = 49;
const int k_OpenRight = 50;
const int k_CloseLeft = 51;
const int k_CloseRight = 52;
const int k_DepartureSignal = 53;
const int k_PantFrontUp = 54;
const int k_PantRearUp = 55;
const int k_PantFrontDown = 56;
const int k_PantRearDown = 57;
const int k_Heating = 58;
// const int k_FreeFlyMode= 59;
const int k_LeftSign = 60;
const int k_UpperSign = 61;
const int k_RightSign = 62;
const int k_SmallCompressor = 63;
const int k_StLinOff = 64;
const int k_CurrentNext = 65;
const int k_Univ1 = 66;
const int k_Univ2 = 67;
const int k_Univ3 = 68;
const int k_Univ4 = 69;
const int k_EndSign = 70;
const int k_Active = 71;
const int k_Battery = 72;
const int k_WalkMode = 73;
int const k_DimHeadlights = 74;
*/
};
#endif
}
void
command_relay::post( user_command const Command, std::uint64_t const Param1, std::uint64_t const Param2, int const Action, std::uint16_t const Recipient ) const {
auto const &lookup = m_targets.find( Command );
if( lookup == m_targets.end() ) {
// shouldn't be really needed but, eh
return;
}
if( ( lookup->second == command_target::vehicle )
&& ( true == FreeFlyModeFlag ) ) {
// don't pass vehicle commands if the user isn't in one
return;
}
simulation::Commands.push(
command_data{
Command,
Action,
Param1,
Param2,
Timer::GetDeltaTime() },
static_cast<std::size_t>( lookup->second ) | Recipient );
#ifdef _DEBUG
if( Action != GLFW_RELEASE ) {
// key was pressed or is still held
auto const &commandname = m_commandnames.at( static_cast<std::size_t>( Command ) );
if( false == commandname.empty() ) {
WriteLog( "Command issued: " + commandname );
}
}
/*
else {
// key was released (but we don't log this)
WriteLog( "Key released: " + m_commandnames.at( static_cast<std::size_t>( Command ) ) );
}
*/
#endif
}
//---------------------------------------------------------------------------