====== X-Plane SDK ====== * [[http://www.xsquawkbox.net/xpsdk/mediawiki/Main_Page|domácí stránka]] * [[http://aerosim.calpoly.edu/media/cms_page_media/18/doc.pdf|návod pro začátečníky]] * [[http://www.xsquawkbox.net/xpsdk/mediawiki/SimDataSimData|ukázkový příklad pro XPL menu a změnu dataref včetně Makefile]] * [[https://github.com/vranki/ExtPlane|ExtPlane]] pěkný plugin vytvářející wrapper pro datarefs * datarefs * proměnné, ke kterým lze přímo přistupovat * do některých lze i zapisovat. * [[http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html|seznam datarefs]] * commands * akce, které se typicky provádí při stisku klávesy * [[https://siminnovations.com/wiki/index.php?title=Xplane_commandrefs|seznam commands]] (jinak prý v ''/Resources/plugins/Commands.txt'') * plugin musí obsahovat 5 základních funkcí: * **XPluginStart** * volá se při zavádění pluginu, spouštění XPL. * pokud nevrátí hodnotu 1, tak se plugin do XPL správce modulů vůbec nenačte. * **XPluginStop** - asi opak start, ale kdy se volá? FIXME * **XPluginDisable** - při deaktivaci pluginu (XPL menu plugins) * **XPluginEnable** - při aktivaci pluginu (XPL menu plugins) * **XPluginReceiveMessage** - umožňuje reagovat na jakési zprávy z XPL FIXME PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc) { strcpy(outName, "LCDxpl"); strcpy(outSig, "bari2.eu"); strcpy(outDesc, "A plugin for X-Plane LCD."); return 1; } PLUGIN_API void XPluginStop(void) { } PLUGIN_API void XPluginDisable(void) { } PLUGIN_API int XPluginEnable(void) return 1; } PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFromWho, int inMessage, void *inParam) { } * následně může plugin vykonávat nějakou činnost * plugin beží ve stejném vlákně jako XPL. * pád pluginu shodí celý XPL. * nekončený loop pluginu zablokuje celý XPL (myslím FIXME) * aby plugin něco dělal, musí si zaregistrovat nějaký callback, například * kliknutí na menu * registrace vlastního command * registrace klávesové zkratky * periodické volání během letu (XPLMRegisterFlightLoopCallback) static float callback_rate = -1.0; // -X.0 call every 1 frame float FlightLoopCallback(float inElapsedSinceLastCall, float inElapsedTimeSinceLastFlightLoop, int inCounter, void* inRefcon); PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc) { .. XPLMRegisterFlightLoopCallback(FlightLoopCallback,callback_rate,NULL); .. } PLUGIN_API void XPluginStop(void) { .. XPLMUnregisterFlightLoopCallback(FlightLoopCallback, NULL); .. } float FlightLoopCallback(float inElapsedSinceLastCall, float inElapsedTimeSinceLastFlightLoop, int inCounter, void* inRefcon) { .. return callback_rate; }