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 "XPLMProcessing.h"
|
||||
#include "XPLMGraphics.h"
|
||||
#include "xpcDrawing.h"
|
||||
#include "xpcPluginTools.h"
|
||||
|
||||
#ifdef _WIN32 /* WIN32 SYSTEM */
|
||||
@@ -124,6 +125,7 @@ int handleGETD(char *buf);
|
||||
int handleDREF(char *buf);
|
||||
int handleVIEW();
|
||||
int handleDATA(char *buf, int buflen);
|
||||
int handleTEXT(char *buf, int len);
|
||||
short handleInput(struct XPCMessage * theMessage);
|
||||
|
||||
char setPOSI(short aircraft, float pos[3]);
|
||||
@@ -189,6 +191,8 @@ PLUGIN_API void XPluginDisable(void)
|
||||
closeUDP(recSocket);
|
||||
closeUDP(sendSocket);
|
||||
updateLog(logmsg,strlen(logmsg));
|
||||
|
||||
XPCClearMessage();
|
||||
}
|
||||
|
||||
PLUGIN_API int XPluginEnable(void)
|
||||
@@ -369,6 +373,10 @@ short handleInput(struct XPCMessage * theMessage)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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
|
||||
}
|
||||
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
|
||||
{ //unrecognized header
|
||||
@@ -491,6 +499,31 @@ int handleSIMU(char buf[])
|
||||
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)
|
||||
{
|
||||
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>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\C\src\xplaneConnect.h" />
|
||||
<ClInclude Include="..\xpcDrawing.h" />
|
||||
<ClInclude Include="..\xpcPluginTools.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\C\src\xplaneConnect.c" />
|
||||
<ClCompile Include="..\xpcDrawing.cpp" />
|
||||
<ClCompile Include="..\XPCPlugin.cpp" />
|
||||
<ClCompile Include="..\xpcPluginTools.cpp" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -21,6 +21,9 @@
|
||||
<ClInclude Include="..\xpcPluginTools.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\xpcDrawing.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\C\src\xplaneConnect.c">
|
||||
@@ -32,6 +35,9 @@
|
||||
<ClCompile Include="..\xpcPluginTools.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\xpcDrawing.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Library Include="..\SDK\Libraries\Win\XPLM.lib">
|
||||
|
||||
Reference in New Issue
Block a user