33#include < SimConnect.h>
44#include < MSFS\Legacy\gauges.h>
55#include < vector>
6+ #include < list>
67#include < string>
78#include < sstream>
89#include < iostream>
910#include < fstream>
1011#include " Module.h"
1112
1213HANDLE g_hSimConnect;
13- const char * version = " 0.5 .0" ;
14+ const char * version = " 0.6 .0" ;
1415
1516const char * ClientName = " MobiFlightWasmModule" ;
1617const char * MobiFlightEventPrefix = " MobiFlight." ;
@@ -33,6 +34,10 @@ uint16_t SimVarOffset = 1000;
3334// For each registered client can 10000 data definition ids are reserved
3435uint16_t ClientDataDefinitionIdSimVarsRange = 10000 ;
3536
37+ // Maximum number of variables that are read from sim per frame, Default: 30
38+ // Can be set to different value via config command
39+ uint16_t MOBIFLIGHT_MAX_VARS_PER_FRAME = 30 ;
40+
3641// data struct for dynamically registered SimVars
3742struct SimVar {
3843 int ID;
@@ -58,6 +63,10 @@ struct Client {
5863 // This is an optimization to be able to re-use already defined data definition IDs & request IDs
5964 // after resetting registered SimVars
6065 uint16_t MaxClientDataDefinition = 0 ;
66+ // Runtime Rolling CLient Data reading Index
67+ // std::vector<SimVar>::iterator RollingClientDataReadIndex;
68+ uint16_t RollingClientDataReadIndex;
69+
6170};
6271
6372// The list of currently registered clients
@@ -272,6 +281,8 @@ void RegisterSimVar(const std::string code, Client* client) {
272281void ClearSimVars (Client* client) {
273282 client->SimVars .clear ();
274283 fprintf (stderr, " MobiFlight: Cleared SimVar tracking." );
284+ // client->RollingClientDataReadIndex = client->SimVars.begin();
285+ client->RollingClientDataReadIndex = 0 ;
275286}
276287
277288// Read a single SimVar and send the current value to SimConnect Clients
@@ -293,8 +304,14 @@ void ReadSimVar(SimVar &simVar, Client* client) {
293304void ReadSimVars () {
294305 for (auto & client : RegisteredClients) {
295306 std::vector<SimVar>* SimVars = &(client->SimVars );
296- for (auto & value : *SimVars) {
297- ReadSimVar (value, client);
307+
308+ int maxVarsPerFrame = SimVars->size () < MOBIFLIGHT_MAX_VARS_PER_FRAME ? SimVars->size () : MOBIFLIGHT_MAX_VARS_PER_FRAME;
309+
310+ for (int i=0 ; i < maxVarsPerFrame; ++i) {
311+ ReadSimVar (SimVars->at (client->RollingClientDataReadIndex ), client);
312+ client->RollingClientDataReadIndex ++;
313+ if (client->RollingClientDataReadIndex >= SimVars->size ())
314+ client->RollingClientDataReadIndex = 0 ;
298315 }
299316 }
300317}
@@ -379,6 +396,8 @@ Client* RegisterNewClient(const std::string clientName) {
379396 newClient->DataDefinitionIDStringResponse = 2 * newClient->ID ; // 500 Clients possible until offset 1000 is reached
380397 newClient->DataDefinitionIDStringCommand = newClient->DataDefinitionIDStringResponse + 1 ;
381398 newClient->SimVars = std::vector<SimVar>();
399+ // newClient->RollingClientDataReadIndex = newClient->SimVars.begin();
400+ newClient->RollingClientDataReadIndex = 0 ;
382401 newClient->DataDefinitionIdSimVarsStart = SimVarOffset + (newClient->ID * ClientDataDefinitionIdSimVarsRange);
383402
384403 RegisteredClients.push_back (newClient);
@@ -525,6 +544,14 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
525544 SendNewClientResponse (client, newClient);
526545 fprintf (stderr, " MobiFlight: Received Client to register: %s.\n " , str.c_str ());
527546 }
547+
548+ if (m_str.get ()->find (" MF.Config.MAX_VARS_PER_FRAME.Set." ) != std::string::npos) {
549+ std::string prefix = " MF.Config.MAX_VARS_PER_FRAME.Set." ;
550+ str = m_str.get ()->substr (prefix.length ());
551+ uint16_t value = static_cast <uint16_t >(std::stoi (str));
552+ MOBIFLIGHT_MAX_VARS_PER_FRAME = value;
553+ fprintf (stderr, " MobiFlight: Set MF.Config.MAX_VARS_PER_FRAME to %u.\n " , value);
554+ }
528555 break ;
529556 }
530557
0 commit comments