Added plugin support for drawing messages to screen.
- Either a single string will be drawn to screen, or nothing will be drawn. - Intelligently registers and unregisters drawing callback to minimize overhead when no message is being displayed. - Currently does not support newline characters (\r or \n). Newlines will cause text to be drawn overlapped.
This commit is contained in:
@@ -68,6 +68,7 @@
|
|||||||
//#include "XPLMPlanes.h"
|
//#include "XPLMPlanes.h"
|
||||||
#include "XPLMProcessing.h"
|
#include "XPLMProcessing.h"
|
||||||
#include "XPLMGraphics.h"
|
#include "XPLMGraphics.h"
|
||||||
|
#include "xpcDrawing.h"
|
||||||
#include "xpcPluginTools.h"
|
#include "xpcPluginTools.h"
|
||||||
|
|
||||||
#ifdef _WIN32 /* WIN32 SYSTEM */
|
#ifdef _WIN32 /* WIN32 SYSTEM */
|
||||||
@@ -124,6 +125,7 @@ int handleGETD(char *buf);
|
|||||||
int handleDREF(char *buf);
|
int handleDREF(char *buf);
|
||||||
int handleVIEW();
|
int handleVIEW();
|
||||||
int handleDATA(char *buf, int buflen);
|
int handleDATA(char *buf, int buflen);
|
||||||
|
int handleTEXT(char *buf, int len);
|
||||||
short handleInput(struct XPCMessage * theMessage);
|
short handleInput(struct XPCMessage * theMessage);
|
||||||
|
|
||||||
char setPOSI(short aircraft, float pos[3]);
|
char setPOSI(short aircraft, float pos[3]);
|
||||||
@@ -189,6 +191,8 @@ PLUGIN_API void XPluginDisable(void)
|
|||||||
closeUDP(recSocket);
|
closeUDP(recSocket);
|
||||||
closeUDP(sendSocket);
|
closeUDP(sendSocket);
|
||||||
updateLog(logmsg,strlen(logmsg));
|
updateLog(logmsg,strlen(logmsg));
|
||||||
|
|
||||||
|
XPCClearMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
PLUGIN_API int XPluginEnable(void)
|
PLUGIN_API int XPluginEnable(void)
|
||||||
@@ -369,6 +373,10 @@ short handleInput(struct XPCMessage * theMessage)
|
|||||||
{
|
{
|
||||||
handleDATA(theMessage->msg, theMessage->msglen);
|
handleDATA(theMessage->msg, theMessage->msglen);
|
||||||
}
|
}
|
||||||
|
else if (strncmp(theMessage->head, "TEXT", 4) == 0) // Header = TEXT (Screen message)
|
||||||
|
{
|
||||||
|
handleTEXT(theMessage->msg, theMessage->msglen);
|
||||||
|
}
|
||||||
else if ((strncmp(theMessage->head,"DSEL",4)==0) || (strncmp(theMessage->head,"USEL",4)==0)) // Header = DSEL/USEL (Select UDP Send)
|
else if ((strncmp(theMessage->head,"DSEL",4)==0) || (strncmp(theMessage->head,"USEL",4)==0)) // Header = DSEL/USEL (Select UDP Send)
|
||||||
{
|
{
|
||||||
sendBUF(theMessage->msg,theMessage->msglen); // Send to UDP
|
sendBUF(theMessage->msg,theMessage->msglen); // Send to UDP
|
||||||
@@ -409,9 +417,9 @@ short handleInput(struct XPCMessage * theMessage)
|
|||||||
{
|
{
|
||||||
sendBUF(theMessage->msg,theMessage->msglen); // Send to UDP
|
sendBUF(theMessage->msg,theMessage->msglen); // Send to UDP
|
||||||
}
|
}
|
||||||
else if (strncmp(theMessage->head,"BOAT",4)==0)
|
else if (strncmp(theMessage->head, "BOAT", 4) == 0)
|
||||||
{
|
{
|
||||||
sendBUF(theMessage->msg,theMessage->msglen); // Send to UDP
|
sendBUF(theMessage->msg, theMessage->msglen); // Send to UDP
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ //unrecognized header
|
{ //unrecognized header
|
||||||
@@ -491,6 +499,31 @@ int handleSIMU(char buf[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int handleTEXT(char *buf, int len)
|
||||||
|
{
|
||||||
|
char msg[256] = { 0 };
|
||||||
|
if (len < 14)
|
||||||
|
{
|
||||||
|
updateLog("[TEXT] ERROR: Length less than 14 bytes", 39);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int msgLen = buf[13];
|
||||||
|
if (msgLen == 0)
|
||||||
|
{
|
||||||
|
updateLog("[TEXT] Text cleared", 19);
|
||||||
|
XPCClearMessage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
updateLog("[TEXT] Text set", 15);
|
||||||
|
int x = *((int*)(buf + 5));
|
||||||
|
int y = *((int*)(buf + 9));
|
||||||
|
strncpy(msg, buf + 14, msgLen);
|
||||||
|
XPCSetMessage(x, y, msg);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
char setDREF(XPLMDataRef theDREF, float floatarray[], short arrayStart, short arraySize)
|
char setDREF(XPLMDataRef theDREF, float floatarray[], short arrayStart, short arraySize)
|
||||||
{
|
{
|
||||||
XPLMDataTypeID dataType;
|
XPLMDataTypeID dataType;
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
73
xpcPlugin/xpcDrawing.cpp
Normal file
73
xpcPlugin/xpcDrawing.cpp
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#include "xpcDrawing.h"
|
||||||
|
#include "XPLMDisplay.h"
|
||||||
|
#include "XPLMGraphics.h"
|
||||||
|
|
||||||
|
//Internal Memory
|
||||||
|
static int msgEnabled = 0;
|
||||||
|
static int msgX = -1;
|
||||||
|
static int msgY = -1;
|
||||||
|
static char* msgVal = NULL;
|
||||||
|
static float rgb[4] = { 0.5F, 1.0F, 0.5F };
|
||||||
|
|
||||||
|
//Internal Functions
|
||||||
|
static int MessageDrawCallback(XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon)
|
||||||
|
{
|
||||||
|
if (msgVal)
|
||||||
|
{
|
||||||
|
XPLMDrawString(rgb, msgX, msgY, msgVal, NULL, xplmFont_Basic);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Public Functions
|
||||||
|
void XPCClearMessage()
|
||||||
|
{
|
||||||
|
if (msgVal != NULL)
|
||||||
|
{
|
||||||
|
free(msgVal);
|
||||||
|
}
|
||||||
|
msgVal = NULL;
|
||||||
|
if (msgEnabled)
|
||||||
|
{
|
||||||
|
XPLMUnregisterDrawCallback(MessageDrawCallback, xplm_Phase_LastCockpit, 0, NULL);
|
||||||
|
msgEnabled = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void XPCSetMessage(int x, int y, char* msg)
|
||||||
|
{
|
||||||
|
//Determine size of message and clear instead if the message string
|
||||||
|
//is empty.
|
||||||
|
size_t len = strlen(msg);
|
||||||
|
if (len == 0)
|
||||||
|
{
|
||||||
|
XPCClearMessage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Try to size msgVal to fit the new message. If we fail for any
|
||||||
|
//reason, clear the message and bail.
|
||||||
|
if (msgVal != NULL)
|
||||||
|
{
|
||||||
|
msgVal = (char*)realloc(msgVal, len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msgVal = (char*)malloc(len);
|
||||||
|
}
|
||||||
|
if (!msgVal)
|
||||||
|
{
|
||||||
|
XPCClearMessage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set the message, location, and enable drawing if necessary.
|
||||||
|
strcpy(msgVal, msg);
|
||||||
|
msgX = x < 0 ? 10 : x;
|
||||||
|
msgY = y < 0 ? 600 : y;
|
||||||
|
if (!msgEnabled)
|
||||||
|
{
|
||||||
|
XPLMRegisterDrawCallback(MessageDrawCallback, xplm_Phase_LastCockpit, 0, NULL);
|
||||||
|
msgEnabled = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
8
xpcPlugin/xpcDrawing.h
Normal file
8
xpcPlugin/xpcDrawing.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef xpcDrawing_h
|
||||||
|
#define xpcDrawing_h
|
||||||
|
|
||||||
|
void XPCClearMessage();
|
||||||
|
|
||||||
|
void XPCSetMessage(int x, int y, char* msg);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -97,10 +97,12 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\C\src\xplaneConnect.h" />
|
<ClInclude Include="..\..\C\src\xplaneConnect.h" />
|
||||||
|
<ClInclude Include="..\xpcDrawing.h" />
|
||||||
<ClInclude Include="..\xpcPluginTools.h" />
|
<ClInclude Include="..\xpcPluginTools.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\C\src\xplaneConnect.c" />
|
<ClCompile Include="..\..\C\src\xplaneConnect.c" />
|
||||||
|
<ClCompile Include="..\xpcDrawing.cpp" />
|
||||||
<ClCompile Include="..\XPCPlugin.cpp" />
|
<ClCompile Include="..\XPCPlugin.cpp" />
|
||||||
<ClCompile Include="..\xpcPluginTools.cpp" />
|
<ClCompile Include="..\xpcPluginTools.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -21,6 +21,9 @@
|
|||||||
<ClInclude Include="..\xpcPluginTools.h">
|
<ClInclude Include="..\xpcPluginTools.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\xpcDrawing.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\C\src\xplaneConnect.c">
|
<ClCompile Include="..\..\C\src\xplaneConnect.c">
|
||||||
@@ -32,6 +35,9 @@
|
|||||||
<ClCompile Include="..\xpcPluginTools.cpp">
|
<ClCompile Include="..\xpcPluginTools.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\xpcDrawing.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Library Include="..\SDK\Libraries\Win\XPLM.lib">
|
<Library Include="..\SDK\Libraries\Win\XPLM.lib">
|
||||||
|
|||||||
Reference in New Issue
Block a user