Fix for Linux builds

This commit is contained in:
Jason Watkins
2015-05-01 09:01:21 -07:00
parent 8ed6b39779
commit 796fd0f7aa
9 changed files with 414 additions and 392 deletions

View File

@@ -11,43 +11,8 @@
namespace XPC
{
std::unordered_map<std::string, MessageHandlers::ConnectionInfo> MessageHandlers::connections;
std::unordered_map<std::string, MessageHandler> MessageHandlers::handlers(
{
// Common messages
{ "CONN", MessageHandlers::HandleConn },
{ "CTRL", MessageHandlers::HandleCtrl },
{ "DATA", MessageHandlers::HandleData },
{ "DREF", MessageHandlers::HandleDref },
{ "GETD", MessageHandlers::HandleGetD },
{ "POSI", MessageHandlers::HandlePosi },
{ "SIMU", MessageHandlers::HandleSimu },
{ "TEXT", MessageHandlers::HandleText },
{ "WYPT", MessageHandlers::HandleWypt },
// Not implemented messages
{ "VIEW", MessageHandlers::HandleUnknown },
// X-Plane data messages
{ "DSEL", MessageHandlers::HandleXPlaneData },
{ "USEL", MessageHandlers::HandleXPlaneData },
{ "DCOC", MessageHandlers::HandleXPlaneData },
{ "UCOC", MessageHandlers::HandleXPlaneData },
{ "MOUS", MessageHandlers::HandleXPlaneData },
{ "CHAR", MessageHandlers::HandleXPlaneData },
{ "MENU", MessageHandlers::HandleXPlaneData },
{ "SOUN", MessageHandlers::HandleXPlaneData },
{ "FAIL", MessageHandlers::HandleXPlaneData },
{ "RECO", MessageHandlers::HandleXPlaneData },
{ "PAPT", MessageHandlers::HandleXPlaneData },
{ "VEHN", MessageHandlers::HandleXPlaneData },
{ "VEH1", MessageHandlers::HandleXPlaneData },
{ "VEHA", MessageHandlers::HandleXPlaneData },
{ "GSET", MessageHandlers::HandleXPlaneData },
{ "OBJN", MessageHandlers::HandleXPlaneData },
{ "OBJL", MessageHandlers::HandleXPlaneData },
{ "GSET", MessageHandlers::HandleXPlaneData },
{ "ISET", MessageHandlers::HandleXPlaneData },
{ "BOAT", MessageHandlers::HandleXPlaneData },
});
std::map<std::string, MessageHandlers::ConnectionInfo> MessageHandlers::connections;
std::map<std::string, MessageHandler> MessageHandlers::handlers;
std::string MessageHandlers::connectionKey;
MessageHandlers::ConnectionInfo MessageHandlers::connection;
@@ -60,6 +25,43 @@ namespace XPC
void MessageHandlers::HandleMessage(Message& msg)
{
if (handlers.size() == 0)
{
// Common messages
handlers.insert(std::make_pair("CONN", MessageHandlers::HandleConn));
handlers.insert(std::make_pair("CTRL", MessageHandlers::HandleCtrl));
handlers.insert(std::make_pair("DATA", MessageHandlers::HandleData));
handlers.insert(std::make_pair("DREF", MessageHandlers::HandleDref));
handlers.insert(std::make_pair("GETD", MessageHandlers::HandleGetD));
handlers.insert(std::make_pair("POSI", MessageHandlers::HandlePosi));
handlers.insert(std::make_pair("SIMU", MessageHandlers::HandleSimu));
handlers.insert(std::make_pair("TEXT", MessageHandlers::HandleText));
handlers.insert(std::make_pair("WYPT", MessageHandlers::HandleWypt));
// Not implemented messages
handlers.insert(std::make_pair("VIEW", MessageHandlers::HandleUnknown));
// X-Plane data messages
handlers.insert(std::make_pair("DSEL", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("USEL", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("DCOC", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("UCOC", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("MOUS", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("CHAR", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("MENU", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("SOUN", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("FAIL", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("RECO", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("PAPT", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("VEHN", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("VEH1", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("VEHA", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("GSET", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("OBJN", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("OBJL", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("GSET", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("ISET", MessageHandlers::HandleXPlaneData));
handlers.insert(std::make_pair("BOAT", MessageHandlers::HandleXPlaneData));
}
// Make sure we really have a message to handle.
std::string head = msg.GetHead();
if (head == "")
@@ -74,18 +76,16 @@ namespace XPC
#if LOG_VERBOSITY > 4
Log::FormatLine("[MSGH] Handling message from %s", connectionKey.c_str());
#endif
auto conn = connections.find(connectionKey);
std::map<std::string, ConnectionInfo>::iterator conn = connections.find(connectionKey);
if (conn == connections.end()) // New connection
{
connection = MessageHandlers::ConnectionInfo
{
// If this is a new connection, that means we just added an elment
// to connections. As long as we never remove elements, the size of
// connections will serve as a unique id.
static_cast<unsigned char>(connections.size()),
sourceaddr,
0
};
connection = MessageHandlers::ConnectionInfo();
// If this is a new connection, that means we just added an elment
// to connections. As long as we never remove elements, the size of
// connections will serve as a unique id.
connection.id = static_cast<unsigned char>(connections.size());
connection.addr = sourceaddr;
connection.getdCount = 0;
connections[connectionKey] = connection;
#if LOG_VERBOSITY > 2
Log::FormatLine("[MSGH] New connection. ID=%u, Remote=%s", connection.id, connectionKey.c_str());
@@ -102,7 +102,7 @@ namespace XPC
// Check if there is a handler for this message type. If so, execute
// that handler. Otherwise, execute the unknown message handler.
auto iter = handlers.find(head);
std::map<std::string, MessageHandler>::iterator iter = handlers.find(head);
if (iter != handlers.end())
{
MessageHandler handler = (*iter).second;
@@ -197,11 +197,11 @@ namespace XPC
thrArray[i] = thr;
}
DataManager::Set(DREF::YokePitch, pitch, aircraft);
DataManager::Set(DREF::YokeRoll, roll, aircraft);
DataManager::Set(DREF::YokeHeading, yaw, aircraft);
DataManager::Set(DREF::ThrottleSet, thrArray, 8, aircraft);
DataManager::Set(DREF::ThrottleActual, thrArray, 8, aircraft);
DataManager::Set(DREF_YokePitch, pitch, aircraft);
DataManager::Set(DREF_YokeRoll, roll, aircraft);
DataManager::Set(DREF_YokeHeading, yaw, aircraft);
DataManager::Set(DREF_ThrottleSet, thrArray, 8, aircraft);
DataManager::Set(DREF_ThrottleActual, thrArray, 8, aircraft);
if (aircraft == 0)
{
DataManager::Set("sim/flightmodel/engine/ENGN_thro_override", thrArray, 1);
@@ -212,7 +212,7 @@ namespace XPC
}
if (flaps < -999.5 || flaps > -997.5)
{
DataManager::Set(DREF::FlapSetting, flaps, aircraft);
DataManager::Set(DREF_FlapSetting, flaps, aircraft);
}
}
@@ -269,9 +269,9 @@ namespace XPC
{
case 3: // Velocity
{
float theta = DataManager::GetFloat(DREF::Pitch);
float alpha = savedAlpha != -998 ? savedAlpha : DataManager::GetFloat(DREF::AngleOfAttack);
float hpath = savedHPath != -998 ? savedHPath : DataManager::GetFloat(DREF::HPath);
float theta = DataManager::GetFloat(DREF_Pitch);
float alpha = savedAlpha != -998 ? savedAlpha : DataManager::GetFloat(DREF_AngleOfAttack);
float hpath = savedHPath != -998 ? savedHPath : DataManager::GetFloat(DREF_HPath);
if (alpha != alpha || hpath != hpath)
{
#if LOG_VERBOSITY > 0
@@ -286,21 +286,19 @@ namespace XPC
float v = values[i][ind[j]];
if (v != -998)
{
DataManager::Set(DREF::LocalVX, v*cos((theta - alpha)*deg2rad)*sin(hpath*deg2rad));
DataManager::Set(DREF::LocalVY, v*sin((theta - alpha)*deg2rad));
DataManager::Set(DREF::LocalVZ, -v*cos((theta - alpha)*deg2rad)*cos(hpath*deg2rad));
DataManager::Set(DREF_LocalVX, v*cos((theta - alpha)*deg2rad)*sin(hpath*deg2rad));
DataManager::Set(DREF_LocalVY, v*sin((theta - alpha)*deg2rad));
DataManager::Set(DREF_LocalVZ, -v*cos((theta - alpha)*deg2rad)*cos(hpath*deg2rad));
}
}
break;
}
case 17: // Orientation
{
float orient[3]
{
values[i][1],
values[i][2],
values[i][3]
};
float orient[3];
orient[0] = values[i][1];
orient[1] = values[i][2];
orient[2] = values[i][3];
DataManager::SetOrientation(orient);
break;
}
@@ -325,12 +323,10 @@ namespace XPC
}
case 20: // Position
{
float pos[3]
{
values[i][2],
values[i][3],
values[i][4]
};
float pos[3];
pos[0] = values[i][2];
pos[1] = values[i][3];
pos[2] = values[i][4];
DataManager::SetPosition(pos);
break;
}
@@ -348,7 +344,7 @@ namespace XPC
{
thr[j] = values[i][1];
}
DataManager::Set(DREF::ThrottleSet, thr, 8);
DataManager::Set(DREF_ThrottleSet, thr, 8);
break;
}
default: // Non-Special dataRefs
@@ -368,7 +364,7 @@ namespace XPC
}
DREF dref = XPData[dataRef][j];
if (dref == DREF::None)
if (dref == DREF_None)
{
// TODO: Send single line instead!
HandleXPlaneData(msg);
@@ -477,11 +473,11 @@ namespace XPC
{
// Enable AI for the aircraft we are setting
float ai[20];
std::size_t result = DataManager::GetFloatArray(DREF::PauseAI, ai, 20);
std::size_t result = DataManager::GetFloatArray(DREF_PauseAI, ai, 20);
if (result == 20) // Only set values if they were retrieved successfully.
{
ai[aircraft] = 1;
DataManager::Set(DREF::PauseAI, ai, 0, 20);
DataManager::Set(DREF_PauseAI, ai, 0, 20);
}
}
@@ -508,7 +504,7 @@ namespace XPC
{
value[i] = buffer[5];
}
DataManager::Set(DREF::Pause, value, 20);
DataManager::Set(DREF_Pause, value, 20);
#if LOG_VERBOSITY > 2
if (buffer[5] == 0)