// My demo of wasm gauge
#include <MSFS/MSFS.h>
#include <MSFS/MSFS_Render.h>
#include <MSFS/Render/nanovg.h>
#include <MSFS/Legacy/gauges.h>
#include <map>
#include <cstring>
#include <string>
#include <sstream>
#include <fstream>
// Names for my variables
PCSTRINGZ custom_var_name = "var1";
PCSTRINGZ custom_var_name2 = "var2";
struct sGaugeVars
{
int iFont;
ID id_var_1;
ID id_var_2;
};
std::stringstream g_Log;
std::map<FsContext, sGaugeVars> g_GaugeVars;
std::map<FsContext, NVGcontext*> g_GaugeNVGcontext;
extern "C" MSFS_CALLBACK bool DemoGauge1_gauge_callback(FsContext ctx, int service_id, void* pData)
{
// local variables for debug view
ID a = 0, b = 0;
switch (service_id)
{
case PANEL_SERVICE_PRE_INSTALL:
{
sGaugeInstallData* p_install_data = (sGaugeInstallData*)pData;
g_GaugeVars[ctx].iFont = -1;
// Register variables names
g_GaugeVars[ctx].id_var_1 = register_named_variable(custom_var_name);
g_GaugeVars[ctx].id_var_2 = register_named_variable(custom_var_name2);
// Check received IDs in debugger's Local window
a = g_GaugeVars[ctx].id_var_1;
b = g_GaugeVars[ctx].id_var_2;
g_Log << "Registered variables: "
<< custom_var_name << " with ID: " << a << " "
<< custom_var_name2 << " with ID: " << b << std::endl;
return true;
}
break;
case PANEL_SERVICE_POST_INSTALL:
{
NVGparams params;
params.edgeAntiAlias = true;
params.userPtr = ctx;
g_GaugeNVGcontext[ctx] = nvgCreateInternal(¶ms);
NVGcontext* nvgctx = g_GaugeNVGcontext[ctx];
g_GaugeVars[ctx].iFont = nvgCreateFont(nvgctx, "serif", "./data/Roboto-Regular.ttf");
return true;
}
break;
case PANEL_SERVICE_PRE_INITIALIZE: break;
case PANEL_SERVICE_POST_INITIALIZE:
{
// set default values for variables
if (check_named_variable(custom_var_name) != -1 )
set_named_variable_value(g_GaugeVars[ctx].id_var_1, 0.);
if (check_named_variable(custom_var_name2) != -1)
set_named_variable_value(g_GaugeVars[ctx].id_var_2, 9999.);
}
break;
case PANEL_SERVICE_PRE_UPDATE:
{
// change variables values
set_named_variable_value(g_GaugeVars[ctx].id_var_1, get_named_variable_value(g_GaugeVars[ctx].id_var_1) + 0.1);
set_named_variable_value(g_GaugeVars[ctx].id_var_2, get_named_variable_value(g_GaugeVars[ctx].id_var_2) - 0.1);
}
break;
case PANEL_SERVICE_POST_UPDATE: break;
case PANEL_SERVICE_PRE_DRAW:
{
sGaugeDrawData* p_draw_data = (sGaugeDrawData*)pData;
float pxRatio = (float)p_draw_data->fbWidth / (float)p_draw_data->winWidth;
NVGcontext* nvgctx = g_GaugeNVGcontext[ctx];
nvgBeginFrame(nvgctx, p_draw_data->winWidth, p_draw_data->winHeight, pxRatio);
{
// Black background
nvgFillColor(nvgctx, nvgRGB(0, 0, 0));
nvgBeginPath(nvgctx);
nvgRect(nvgctx, 0, 0, p_draw_data->winWidth, p_draw_data->winHeight);
nvgFill(nvgctx);
/// Output variables values
if (g_GaugeVars[ctx].iFont != -1)
{
char str[50] = "";
nvgFontFaceId(nvgctx, g_GaugeVars[ctx].iFont);
nvgFontSize(nvgctx, 0.1f * p_draw_data->winHeight);
nvgTextAlign(nvgctx, NVG_ALIGN_LEFT | NVG_ALIGN_TOP);
nvgFillColor(nvgctx, nvgRGB(250, 250, 250));
sprintf(str, "var1 ID: %d Value: %5.1f", g_GaugeVars[ctx].id_var_1, get_named_variable_value(g_GaugeVars[ctx].id_var_1));
nvgText(nvgctx, 0, 0.2f * p_draw_data->winHeight, str, (const char*)NULL);
g_Log << str << " ";
sprintf(str, "var2 ID: %d Value: %5.1f", g_GaugeVars[ctx].id_var_2, get_named_variable_value(g_GaugeVars[ctx].id_var_2));
nvgText(nvgctx, 0, 0.4f * p_draw_data->winHeight, str, (const char*)NULL);
g_Log << str << std::endl;
}
}
nvgEndFrame(nvgctx);
return true;
}
break;
case PANEL_SERVICE_POST_DRAW: break;
case PANEL_SERVICE_PRE_KILL:
{
NVGcontext* nvgctx = g_GaugeNVGcontext[ctx];
nvgDeleteInternal(nvgctx);
g_GaugeNVGcontext.erase(ctx);
return true;
}
break;
case PANEL_SERVICE_POST_KILL:
{
// Save log to text file
// %LOCALAPPDATA%\Packages\Microsoft.FlightSimulator_8wekyb3d8bbwe\LocalState\packages\mycompany-aircraft-wasm-gauge\work\gauge_log.txt
std::ofstream out("\\work\\gauge_log.txt", std::ios::app);
if (out.is_open())
{
out << g_Log.rdbuf();
out.close();
}
g_GaugeVars.erase(ctx);
g_Log.clear();
return true;
}
break;
}
return false;
}