Foro x-plane.es

Foro General => Zona de consultas => Mensaje iniciado por: Dragun en 29 Abril, 2011, 17:54:09



Título: Crear Datarefs..... como???
Publicado por: Dragun en 29 Abril, 2011, 17:54:09
La pregunta es simple , pero se que es complicada .... Como se pueden crear Datarefs??? , en q lenguaje tengo q programar ..estc


Muchas gracias a todos


Título: Re: Crear Datarefs..... como???
Publicado por: jorduran en 29 Abril, 2011, 19:00:08
Quizas aqui encuentres la solución

http://wiki.x-plane.com/Main_Page (http://wiki.x-plane.com/Main_Page)


Título: Re: Crear Datarefs..... como???
Publicado por: bokepacha en 29 Abril, 2011, 19:12:17
El foro de complementos no es para dudas, por favor usad el correcto.

Muevo el post.


Título: Re: Crear Datarefs..... como???
Publicado por: kha29096335 en 29 Abril, 2011, 19:41:26
La pregunta es simple , pero se que es complicada .... Como se pueden crear Datarefs??? , en q lenguaje tengo q programar ..estc


Muchas gracias a todos

Así, en C++, la parte de registrarlo en DatarefEditor es opcional:

Código:
#include <stdio.h>
#include <string.h>
#include "XPLMPlugin.h"
#include "XPLMProcessing.h"
#include "XPLMDataAccess.h"

enum boolean {false = 0, true =1};

//Constants for custom DataRef registration on DataRef Editor plugin
long const MSG_ADD_DATAREF = 0x01000000; //Message to DataRef Editor to add a custom DataRef reference
long const NO_PLUGIN_ID = -1; //Return value when a plugin is not found by ID


//Global vars
boolean acf_first_three_gears_down_DatarefEditor_Published = false; //Is our custom DataRef yet published on DataRef Editor?
long first_three_gears_down = 0; //Internal variable to keep the value of our custom DataRef
XPLMDataRef acf_gear_deploy_dataref = NULL; //X-Plane DataRef reference ID
XPLMDataRef Accesor1 = NULL; //Handle to the Data Accessor for our custom DataRef

//Prototyping
//Main flight loop call back
float MyFlightLoopCallback(
float   inElapsedSinceLastCall,    
                        float   inElapsedTimeSinceLastFlightLoop,    
                        int     inCounter,    
                        void * inRefcon);

int fn_first_three_gears_down(void * inRefcon);


PLUGIN_API int XPluginStart(
char * outName,
char * outSig,
char * outDesc)
{
strcpy(outName, "Test3");
strcpy(outSig, "Kha29096335.examples.test3");
strcpy(outDesc, "The plugin creates a custom dataref");

//Flag for custom DataRef published in DatarefEditor - We need to publish our custom DataRef only one time, this flag is used to check if the DataRef is yet registered to avoid more than one registration at each loopback call
acf_first_three_gears_down_DatarefEditor_Published = false;

//Internal variable default value - This variable will keep the value for our custom DataRef - The default value is defined at variable declaration too
first_three_gears_down = 0;

acf_gear_deploy_dataref = XPLMFindDataRef("sim/aircraft/parts/acf_gear_deploy");
XPLMRegisterFlightLoopCallback(MyFlightLoopCallback, 1, 0);

return 1;
}


PLUGIN_API int XPluginEnable(void)
{
//Registration of the custom DataRef functions for curso04/aircraft/parts/acf_first_three_gears_down
//When our plugin is loaded, it needs register all custom DataRefs in X-Plane (one accessor for each custom DataRef)
Accesor1 = XPLMRegisterDataAccessor("curso04/aircraft/parts/acf_first_three_gears_down", xplmType_Int, 0, fn_first_three_gears_down, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0);
return 1;
}

PLUGIN_API void XPluginDisable(void)
{
//Unregistration of the custom DataRef
//When our plugin is unloaded, we need unregister all customs DataRefs because they will be unavailable
XPLMUnregisterDataAccessor(Accesor1);
}

PLUGIN_API void XPluginStop(void)
{
// The Callback function is unregistered and the window destroyed
XPLMUnregisterFlightLoopCallback(MyFlightLoopCallback,NULL);
}

float MyFlightLoopCallback(
                                   float                inElapsedSinceLastCall,    
                                   float                inElapsedTimeSinceLastFlightLoop,    
                                   int                  inCounter,    
                                   void *               inRefcon)
{
long PluginID = XPLM_NO_PLUGIN_ID;
float acf_gear_deploy_values[]={-1,-1,-1};
boolean all_down_flag = false;
int i = 0;

//Publication on the DatarefEditor plugin for testing purposes
//We will register our custom DataRef in DatarefEditor if it is not register yet (checking the flag)
if(acf_first_three_gears_down_DatarefEditor_Published == false)
{
//We look for the DatarefEditor's internal id to send the 'register DataRef' message to him
PluginID = XPLMFindPluginBySignature("xplanesdk.examples.DataRefEditor");
//If the id for DatarefEditor is found, we send the message
if (PluginID != XPLM_NO_PLUGIN_ID)
{
XPLMSendMessageToPlugin(PluginID, MSG_ADD_DATAREF, "curso04/aircraft/parts/acf_first_three_gears_down");
//We set the status of the DataRef to 'published in DatarefEditor'
acf_first_three_gears_down_DatarefEditor_Published = true;
}
}

//Sets the custom DataRef based on first tree gears status
XPLMGetDatavf(acf_gear_deploy_dataref, acf_gear_deploy_values, 0, 3);
all_down_flag = true;
//if(sizeof(acf_gear_deploy_values) / sizeof(*acf_gear_deploy_values) > 3)
if(acf_gear_deploy_values[0] != -1)
{
for (i=0;i<3;i++)
{
if (acf_gear_deploy_values[i] < 1.0)
{
all_down_flag = false;
}
}
if (all_down_flag == true)
first_three_gears_down = 1;
else
first_three_gears_down = 0;
}
return 1.0;
}

int fn_first_three_gears_down(void * inRefcon)
{
return first_three_gears_down;
}


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 29 Abril, 2011, 22:20:28
Madre mia , no me entero, kha29096335 por donde podria empezar para conseguir crear las datarefs, me refiero a conocimientos claro, .....esto va ser un gran dolor de cabeza ......


Título: Re: Crear Datarefs..... como???
Publicado por: awall86 en 30 Abril, 2011, 00:16:34
Kha, hoy tu me estas enseñando mas, que todo un año de facultad...

Ya que estamos, abusamos.. (en el buen sentido de la palabra). Los Datarefs creados desde plugin son accesibles desde otros plugins, es decir se publican para ser consultados y/o modificados por otro/s plugins. Mis preguntas son:

Es posible referenciarse a un dataref publicado desde un plugin desde Planemaker?. Es posible crear un switch desde planemaker que modifique el valor de este dataref?

Si es así, las posibilidades se me multiplican exponencialmente.

Un saludo y gracias


Título: Re: Crear Datarefs..... como???
Publicado por: kha29096335 en 30 Abril, 2011, 00:41:10
Madre mia , no me entero, kha29096335 por donde podria empezar para conseguir crear las datarefs, me refiero a conocimientos claro, .....esto va ser un gran dolor de cabeza ......

Pues no te quedará más remedio que aprender C su estructura y demás, no en demasiada profundidad pero si como para comprender un programa sencillo escrito. Luego con la wikipedia de X-Plane, tras conocer C ya es más sencillo, ahí te explican para qué es cada función, aunque a veces tienes que echar mano de la imaginación que solo la experiencia te puede dar.

Ánimo que no es tan complicado. No vamos a decir que es un paseo por el parque, pero tampoco es mecánica cuántica.


Título: Re: Crear Datarefs..... como???
Publicado por: kha29096335 en 30 Abril, 2011, 00:46:22
Es posible referenciarse a un dataref publicado desde un plugin desde Planemaker?. Es posible crear un switch desde planemaker que modifique el valor de este dataref?

Si, por supuesto, cualquier DataRef publicado mediante la API de X-Plane funcionará también en la cabina 2D y 3D si referencias instrumentos y animaciones a él, y por extensión, en principio, en todo aquello que se pueda gobernar dediante un DataRef.

También puedes crear custom commands, en lugar de DataRefs, que son acciones en lugar de valores, de forma que al pulsar un botón en la cabina, una función de tu plugin sea llamada y ejecutada, y ahí ya puedes hacer misa. INcluso puedes sobre-escribir la acción de un command ya existente en X-Plane y hacer que despues de la ejecución de tu rutina, X-Plane pase a ejecutar la acción por defecto de ese command o no lo haga. Las posibilidades son infinitas.


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 30 Abril, 2011, 09:14:13
Madre mia , no me entero, kha29096335 por donde podria empezar para conseguir crear las datarefs, me refiero a conocimientos claro, .....esto va ser un gran dolor de cabeza ......

Pues no te quedará más remedio que aprender C su estructura y demás, no en demasiada profundidad pero si como para comprender un programa sencillo escrito. Luego con la wikipedia de X-Plane, tras conocer C ya es más sencillo, ahí te explican para qué es cada función, aunque a veces tienes que echar mano de la imaginación que solo la experiencia te puede dar.

Ánimo que no es tan complicado. No vamos a decir que es un paseo por el parque, pero tampoco es mecánica cuántica.
Pues nda me pondre a ello ,muchas gracias por la ayuda tan transparente.

Q me resultaria mas facil , c++ o vb6, para futuras intenciones tambien, o en si el c++ es como el Pascal al Delphy , una base para aprender y comprender mejor

He  encontrado esto para intentar comprender la extructura de C , cual me recomiendas ..??

http://c.conclase.net/ (http://c.conclase.net/)
http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf (http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf)  ( este creo q ya lo recomendastes en otro post ?

Tambien estos de VB6 , a simple vista lo veo mas facil

http://www.tecnun.es/asignaturas/Informat1/AyudaInf/aprendainf/VisualBasic6/vbasic60.pdf (http://www.tecnun.es/asignaturas/Informat1/AyudaInf/aprendainf/VisualBasic6/vbasic60.pdf)

O recomiendame algo con lo q pueda aprender....otra cosa, q compilador se usa, puedo usar VB6 ?

pd:Tengo conocimientos de pascal y estoy con delphy ahora mismo....


Título: Re: Crear Datarefs..... como???
Publicado por: awall86 en 30 Abril, 2011, 10:30:16
Es posible referenciarse a un dataref publicado desde un plugin desde Planemaker?. Es posible crear un switch desde planemaker que modifique el valor de este dataref?

Si, por supuesto, cualquier DataRef publicado mediante la API de X-Plane funcionará también en la cabina 2D y 3D si referencias instrumentos y animaciones a él, y por extensión, en principio, en todo aquello que se pueda gobernar dediante un DataRef.

También puedes crear custom commands, en lugar de DataRefs, que son acciones en lugar de valores, de forma que al pulsar un botón en la cabina, una función de tu plugin sea llamada y ejecutada, y ahí ya puedes hacer misa. INcluso puedes sobre-escribir la acción de un command ya existente en X-Plane y hacer que despues de la ejecución de tu rutina, X-Plane pase a ejecutar la acción por defecto de ese command o no lo haga. Las posibilidades son infinitas.


Madre mia !!!! Se acaba de abrir un espectro de posibilidades enorme. Caballero, es usted una verdadera enciclopedia viviente. Muchas gracias por la información.

A partir de este punto los sistemas del C-130 solo están limitados por mi propia limitación.

Animo Dragun, que asusta mas de lo que realmente es. Todo empieza con un "Hello World", y a partir de ahi ya no puedes parar.... ;D ;D

Saludos


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 30 Abril, 2011, 12:19:01
Jejeje....' hola mundo' esa es la base,por eso pregunto tanto la documentacion oportuna, por q se q es primordial, aprender y entender la base....despues ya mejoraremos conocimientos pero la base es importantisima...


Título: Re: Crear Datarefs..... como???
Publicado por: kha29096335 en 30 Abril, 2011, 13:42:28
Pues nda me pondre a ello ,muchas gracias por la ayuda tan transparente.

Q me resultaria mas facil , c++ o vb6, para futuras intenciones tambien, o en si el c++ es como el Pascal al Delphy , una base para aprender y comprender mejor

He  encontrado esto para intentar comprender la extructura de C , cual me recomiendas ..??

http://c.conclase.net/ (http://c.conclase.net/)
http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf (http://mat21.etsii.upm.es/ayudainf/aprendainf/Cpp/manualcpp.pdf)  ( este creo q ya lo recomendastes en otro post ?

Tambien estos de VB6 , a simple vista lo veo mas facil

http://www.tecnun.es/asignaturas/Informat1/AyudaInf/aprendainf/VisualBasic6/vbasic60.pdf (http://www.tecnun.es/asignaturas/Informat1/AyudaInf/aprendainf/VisualBasic6/vbasic60.pdf)

O recomiendame algo con lo q pueda aprender....otra cosa, q compilador se usa, puedo usar VB6 ?

pd:Tengo conocimientos de pascal y estoy con delphy ahora mismo....

Más fácil, de calle, VB6, pero no te lo aconsejo, no al menos si lo quieres orientar a la creación de plugins para X-Plane. Aprende C, ANSI C, para ser exactos, y luego ve ampliando a C++ que ya introduce conceptos de programación orientada a objetos.

El VB6 lo bueno que tiene es que es muy directo, es extramádamente sencillo crear una pantalla con cuatro controles y es una programación bastante asistida, no automática, pero bastante asistida. El problema con él es la dificultad de "conectarlo" con APIs de terceros, porque normalmente todos los interfaces de casi cualquier API que nombres, han sido pensadas para ser accedidas desde C. Luego para el propósito de desarrollar plugins y demás, céntrate en C que no te merece la pena VB6 para ese propósito. Por otra parte, VB6 está ya anticuado, y su equivalente actual es Visual Basic .Net, el C, por contra partida, nunca se va a quedar "viejo".

Mi consejo pues, y que seguro que me lo agradecerás dentro de unos meses / años, aprende C y C++, por ese orden.

En cuanto a los manuales, el PDF ese parece bastante asequible y te explica lo básico, pero no puede recomendarse específicamente una documentación sobre otra porque lo más habitual es que sean complementarias, de modo que lo que te explican en un sitio, quizá no te venga en otro y viceversa, de modo que como Internet es infinita, o casi, lo mejor es que te hagas con cuanta más información mejor, te leas un manual, apliques a la práctica lo que allí se expone y luego pases a otro manual distinto y hagas lo propio. Ten en cuenta no se trata de un camino que se pueda recorrer en una semana, aunque tu ya tienes cierta ventaja al conocer otros lenguajes de programación. Los conocimientos de Pascal te vendrán bien para C, te lo aseguro.

Como compilador, yo he usado Visual Studio C++ de Microsoft, de pago, pero recientemente me voy a pasar a MinGW y Codeblocks, que estos son gratuitos y se podrá hacer exactamente lo mismo. MinGW es el compilador de GCC para Windows (mi sistema operativo mayoritario) y Codeblocks es un IDE para C / C++ que se integra perfectamente con MinGW.

Tienes las mismas versiones para Linux, si prefieres ese S.O. y supongo que en Apple también habrá sus equivalencias.


Título: Re: Crear Datarefs..... como???
Publicado por: kha29096335 en 30 Abril, 2011, 13:48:30
Madre mia !!!! Se acaba de abrir un espectro de posibilidades enorme. Caballero, es usted una verdadera enciclopedia viviente. Muchas gracias por la información.

A partir de este punto los sistemas del C-130 solo están limitados por mi propia limitación.

Animo Dragun, que asusta mas de lo que realmente es. Todo empieza con un "Hello World", y a partir de ahi ya no puedes parar.... ;D ;D

Saludos


Muchas de nada, y por mucho que lo piense es mucho más lo que me falta por aprender que lo que ya sé, y solo en este tema. Como decía aquél. "Solo sé que no sé nada". Podría aprender muchísimo de vosotros.

Las posibilidades son infinitas, y si sabes programar con la API de OpenGL con soltura, ya ni te digo lo que puedes hacer.

Estoy deseando ver como evolucionan tus desarrollos con todo esto y tu talento. Gracias awall.

Para cualquier cosa que necesitéis, ya sabéis donde estoy.


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 30 Abril, 2011, 14:54:20
ok , tenia q preguntarte por Ansi C , q no sabia q era, puedo entender q seria la base? si es asi voy a haver lo siguiente ...

ANSI C (879 KB, Actualizado el 27-04-04)
C++ (Básico) (658 KB, Actualizado el 1-06-04)
C++ (Avanzado) (720 KB, Actualizado el 1-06-04)
(todo en este link http://www.tecnun.es/recursos/labmat0.html (http://www.tecnun.es/recursos/labmat0.html))

Muchas gracias por la info, lo bueno es q nos vamos a liar a estudiar con un amigo ...eso sera bueno seguro.....muchas gracias por las aclaraciones ....se valora tu info...muchisima


Título: Re: Crear Datarefs..... como???
Publicado por: awall86 en 30 Abril, 2011, 17:59:20
Dragun, empieza por aqui: http://www.xsquawkbox.net/xpsdk/mediawiki/Category:Documentation (http://www.xsquawkbox.net/xpsdk/mediawiki/Category:Documentation)

Esta pagina no te enseñará a programar en C, pero si como aplicarlo a la creación de un plugin.
La mejor forma de aprender es buscar ejemplos y analizarlos tratando de entender la logica que encierran. Yo hasta hace un par de meses no había hecho una sola linea e C, y actualmente mi plugin, ya maneja varios sistemas del avión. Todo es cuestión de investigación y paciencia.

Como dice la frase: "La necesidad es la madre de la inventiva..."

Al igual que Kha, pero a un menor nivel de conocimientos  ;D, si puedo serte de ayuda en algo, no tienes mas que pedirlo.

Un saludo


Título: Re: Crear Datarefs..... como???
Publicado por: awall86 en 10 Mayo, 2011, 23:28:14
Para quienes quieran dar los primeros pasos en el tema de crear dataref via plugin, como comentaba Dragun, aqui les dejo un codigo que he probado según la sugerencia de Kha, que ha dado la primera "cátedra" al respecto.

Para empezar lo ideal es leerse este post de Philipp, famoso por muchos motivos en el ambiente de X-plane, pero por sobre todo por ser parte del equipo de desarrollo del mejor avión que existe para X-Plane: el CRJ200 de Japo.El post es este:

http://forums.x-plane.org/index.php?showtopic=48012 (http://forums.x-plane.org/index.php?showtopic=48012)

El código de abajo, una vez compilado crea un dataref en X-Plane (En mi caso lo llamé C130/aircarft/parts/Mydataref) y permite asociarlo en planemaker  a un anunciador, y/o un switch para cambiar su valor. También puede verse su valor a traves del DatarefEditor de Sandy Barbour ya que al cargarse el plugin se publica como un dataref mas.

Yo los pasos que he dado para iniciarme en el tema (Y sigo "iniciado", ya que recién estoy empezando, y NO SOY programador), es leerme el post mencionado, montar mi entorno de desarrollo básico, bajar el SDK, bajar ejemplos, y analizarlos, y pasar muchas horas de silla, probando, equivocándome, corrigiendo, y volviendo a probar. El google es un herramienta espectacular para salirse de apuros en estos casos.

A la primera no nos va a salir un FMC completito en OpenGL, pero todo es cuestión de paciencia investigación y trabajo. Nadie nació sabiendo, y lo mejor es empezar de abajo.



Código:
#include <stdio.h>
#include <string.h>
#include "XPLMPlugin.h"
#include "XPLMDisplay.h"
#include "XPLMGraphics.h"
#include "XPLMProcessing.h"
#include "XPLMDataAccess.h"
#include "XPLMUtilities.h"

//Constants for custom DataRef registration on DataRef Editor plugin
long const MSG_ADD_DATAREF = 0x01000000; //Message to DataRef Editor to add a custom DataRef reference
long const NO_PLUGIN_ID = -1; //Return value when a plugin is not found by ID

int Mydataref_DatarefEditor_Published = 0; //Is our custom DataRef yet published on DataRef Editor?
long Mydataref = 0; //Internal variable to keep the value of our custom DataRef
XPLMDataRef Accesor1 = NULL; //Handle to the Data Accessor for our custom DataRef


static float MyFlightLoopCallback(
                                   float                inElapsedSinceLastCall,    
                                   float                inElapsedTimeSinceLastFlightLoop,    
                                   int                  inCounter,    
                                   void *               inRefcon);    

int fn_Mydataref_Status(void * inRefcon);
void fn_Mydataref_Write(void * inRefcon, int Invalue);

/*
 * XPluginStart
 *
 * Our start routine registers our window and does any other initialization we
 * must do.
 *
 */
PLUGIN_API int XPluginStart(
char * outName,
char * outSig,
char * outDesc)
{
strcpy(outName, "Prueba");
strcpy(outSig, "AlcalaSim.Plugins.Prueba");
strcpy(outDesc, "Prueba Publicacion Dataref");


XPLMRegisterFlightLoopCallback(
MyFlightLoopCallback, /* Callback */
1.0, /* Interval */
NULL); /* refcon not used. */

return 1;
}

/*
 * XPluginStop
 *
 * Our cleanup routine deallocates our window.
 *
 */
PLUGIN_API void XPluginStop(void)
{
XPLMUnregisterFlightLoopCallback(MyFlightLoopCallback, NULL);
}

/*
 * XPluginDisable
 *
 * We do not need to do anything when we are disabled, but we must provide the handler.
 *
 */
PLUGIN_API void XPluginDisable(void)
{
}

/*
 * XPluginEnable.
 *
 * We don't do any enable-specific initialization, but we must return 1 to indicate
 * that we may be enabled at this time.
 *
 */
PLUGIN_API int XPluginEnable(void)
{
//Registration of the custom DataRef functions for C130/aircraft/parts/Mydataref
//When our plugin is loaded, it needs register all custom DataRefs in X-Plane (one accessor for each custom DataRef)
Accesor1 = XPLMRegisterDataAccessor("C130/aircraft/parts/Mydataref", xplmType_Int, 1, fn_Mydataref_Status, fn_Mydataref_Write, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0);

return 1;
}

/*
 * XPluginReceiveMessage
 *
 * We don't have to do anything in our receive message handler, but we must provide one.
 *
 */
PLUGIN_API void XPluginReceiveMessage(
XPLMPluginID inFromWho,
long inMessage,
void * inParam)
{
}

float MyFlightLoopCallback(
                                   float                inElapsedSinceLastCall,    
                                   float                inElapsedTimeSinceLastFlightLoop,    
                                   int                  inCounter,    
                                   void *               inRefcon)
{
long PluginID = XPLM_NO_PLUGIN_ID;

//Publication on the DatarefEditor plugin for testing purposes
//We will register our custom DataRef in DatarefEditor if it is not register yet (checking the flag)
if(Mydataref_DatarefEditor_Published == 0)
{
//We look for the DatarefEditor's internal id to send the 'register DataRef' message to him
PluginID = XPLMFindPluginBySignature("xplanesdk.examples.DataRefEditor");
//If the id for DatarefEditor is found, we send the message
if (PluginID != XPLM_NO_PLUGIN_ID)
{
XPLMSendMessageToPlugin(PluginID, MSG_ADD_DATAREF,(void*)"C130/aircraft/parts/Mydataref");
//We set the status of the DataRef to 'published in DatarefEditor'
Mydataref_DatarefEditor_Published = 1;
}
}




/* Return 1.0 to indicate that we want to be called again in 1 second. */
return -1.0;
}                                  

int fn_Mydataref_Status(void * inRefcon)
{
return Mydataref;
}
void fn_Mydataref_Write(void * inRefcon, int InValue)
{
  Mydataref = InValue;
}



Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 11 Mayo, 2011, 00:03:40
Buenisimo ese link, no lo conocia , mucha info....muchas gracias y felicidades por tus avances :)


Título: Re: Crear Datarefs..... como???
Publicado por: cescll en 11 Mayo, 2011, 00:43:51
Genial el enlace. Para aquellos a los que el C o Pascal les provoque sudores fríos recordar que existe una interfaz  para Python de esta misma  API escrita por Sandy Barbour:
http://www.xpluginsdk.org/python_interface.htm (http://www.xpluginsdk.org/python_interface.htm) 


Título: Re: Crear Datarefs..... como???
Publicado por: jvaldunciel en 11 Mayo, 2011, 10:27:27
Yo intenté crear unos custom command ( esenciales para poder asignar un par de botones de joystick a una accion que, con el ratón se puede hacer, pero no se puede asignar a ningún botón) con python y fuí incapaz, en c++ no tuve problemas.

Existe otra opción más que no he probado, Gizmo, que es un interfaz para x-plane, para hacer plugins en lua. Otro lenguaje interpretado tipo python

La ventaja de los lenguajes interpretados es que los plugins son multiplataforma, sin ningún trabajo adicional por parte de desarrollador. No hay que compilar en otros S.O. para que funcione en ellos.


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 11 Mayo, 2011, 15:10:12
Yo intenté crear unos custom command ( esenciales para poder asignar un par de botones de joystick a una accion que, con el ratón se puede hacer, pero no se puede asignar a ningún botón) con python y fuí incapaz, en c++ no tuve problemas.

Existe otra opción más que no he probado, Gizmo, que es un interfaz para x-plane, para hacer plugins en lua. Otro lenguaje interpretado tipo python

La ventaja de los lenguajes interpretados es que los plugins son multiplataforma, sin ningún trabajo adicional por parte de desarrollador. No hay que compilar en otros S.O. para que funcione en ellos.
Para eso mirate esta utilidad '(Key and) Button2DataRef 1.4.1' del org http://forums.x-plane.org/index.php?app=downloads&showfile=13340 (http://forums.x-plane.org/index.php?app=downloads&showfile=13340)

Yo estoy haber si saco el tema de las datarefs en C , creo q es lo mas facil a largo plazo claro  :-X


Título: Re: Crear Datarefs..... como???
Publicado por: cescll en 11 Mayo, 2011, 23:23:50
Por mi parte, estoy terminando un plugin sencillito en python (básicamente leer y escribir datarefs). En cuanto tenga algo enseñable lo subo, por si pudiera servir de ayuda o inspiración a alguien.

Saludos


Título: Re: Crear Datarefs..... como???
Publicado por: CarlosGarcia en 01 Junio, 2011, 01:18:44
Al momento la forma mas facil de hacer un PLUGIN para los no programadores es GIZMO.

Este es un ejemplo que he logrado mas o menos hacer despues de 8 dias utilizando GIZMO, no soy programador solo tengo algo de experiencia en PHP y nada mas.

Calcular basado en el peso del avion las velocidades de despegue V1 V2 VR, que el script manipule las luces de acuerdo a la fase del vuelo, PARK, TAXI, TAKE OFF, ON FLY y LANDING, y de igual forma manipule los FLAPS, y las velocidades hasta dejar el avion a una altura de 11.000 pies de ahi para delante el piloto continua con el vuelo, cuando el avion esta proximo a Aterrizar, y estas en el LOC y GS (APP) entonces basado en el peso actual del Avion pone los FLAPS y ajusta las Velocidades hasta lograr la velocidad Vref para el aterrizaje.

Una vez este cercano a la pista el avion disminuya la velocidad vertical hasta un punto que se realize un aterrizaje muy suave ( ESTA ETAPA AUN NO LA HE LOGRADO) lo maximo que hago es de 200 - 300 Ft/min y algunas veces antes de tocar la pista el avion hace una especie de TOGA, y vuelve a estar en al aire. Tengo que trabajar mas en esta parte.

Si hay alguien interesado en trabajar conmigo pues me comenta.... Al momento tengo unas 400 lineas de codigo para el 757-200 de X plane free. Claro que se puede ajustar a otros tipos de aviones.

Código:

init.lua
dofile("main.lua")

main.lua
dofile("draw.lua")
dofile("manipulation.lua")
dofile("dataref.lua")
function main()
OnDraw_Windows()
takeoff_stuff()
end

manipulation.lua
function takeoff_stuff() --1 On, 0 Off
xp.setInt(dref_nav_lights,1) --Luces de Navegacion
xp.setInt(dref_land_lights,1) --Luces de  Aterrizaje
xp.setInt(dref_taxi_lights,1) --Luces de  Taxi
xp.setInt(dref_strobe_lights,1) --Luces de  Strobe
xp.setInt(dref_smoking,1) --Luces de  No fumar
xp.setInt(dref_TransP,2) --Luces de  Transponder Modo Stand By
xp.setInt(dref_belts,1) --Cinturon de seguridad
xp.setInt(dref_beacon_lights,1) --Luces de Faros
end

dataref.lua
VSI = xp.getDataref("sim/cockpit2/gauges/indicators/vvi_fpm_pilot") --displayed, not actual !!!
IAS = xp.getDataref("sim/cockpit2/gauges/indicators/airspeed_kts_pilot")  --displayed, not actual !!!
ALT = xp.getDataref("sim/flightmodel/position/elevation")  --actual meters, MSL
ALTG = xp.getDataref("sim/flightmodel/position/y_agl")  --actual meters, AGL
dref_nav_lights = xp.getDataref("sim/cockpit/electrical/nav_lights_on")
dref_land_lights  = xp.getDataref("sim/cockpit/electrical/landing_lights_on")
dref_taxi_lights  = xp.getDataref("sim/cockpit/electrical/taxi_light_on")
dref_strobe_lights  = xp.getDataref("sim/cockpit/electrical/strobe_lights_on")
dref_beacon_lights  = xp.getDataref("sim/cockpit/electrical/beacon_lights_on")
dref_belts  = xp.getDataref("sim/cockpit/switches/fasten_seat_belts")
dref_smoking  = xp.getDataref("sim/cockpit/switches/no_smoking")
dref_APU  = xp.getDataref("sim/cockpit2/electrical/APU_generator_on")
dref_Pheat  = xp.getDataref("sim/cockpit/switches/pitot_heat_on")
dref_PAice  = xp.getDataref("sim/cockpit/switches/anti_ice_on")
dref_PWh  = xp.getDataref("sim/cockpit/switches/anti_ice_window_heat")  
dref_PSh  = xp.getDataref("sim/cockpit/switches/anti_ice_surf_heat")
dref_PIh  = xp.getDataref("sim/cockpit/switches/anti_ice_inlet_heat")
dref_TransP = xp.getDataref("sim/cockpit/radios/transponder_mode")
dref_Gear_up = xp.getDataref("sim/multiplayer/controls/gear_request") -- 0 UP, 1 Down
dr_sim_flap_request = xp.getDataref("sim/flightmodel/controls/flaprqst")
TEMP =  xp.getDataref("sim/weather/temperature_ambient_c")
get_TEMP = xp.getFloat(TEMP)
SPEED = xp.getDataref("sim/cockpit/autopilot/airspeed")
ALTITUDE = xp.getDataref(" sim/cockpit2/gauges/indicators/altitude_ft_pilot")

draw.lua
function OnDraw_Windows()
ALTG= xp.getDataref("sim/flightmodel/position/y_agl")
get_ALTG=xp.getFloat(ALTG) --actual meters, AGL
get_ALTG_ft = get_ALTG*3.28 --I use the float value returned by xp.getFloat() to work on
IAS = xp.getDataref("sim/cockpit2/gauges/indicators/airspeed_kts_pilot")  --displayed, not actual !!!
get_IAS=xp.getFloat(IAS)
VSI = xp.getDataref("sim/cockpit2/gauges/indicators/vvi_fpm_pilot") --displayed, not actual !!!
get_VSI=xp.getFloat(VSI)
thro=xp.getDataref("sim/flightmodel/engine/ENGN_thro")
get_thro=xp.getFloatV(thro,1,4)
appr=xp.getDataref("sim/cockpit2/autopilot/approach_status")
get_appr=xp.getInt(appr)
dr_sim_total_weight = xp.getDataref("sim/flightmodel/weight/m_total")
g_total_weight =  xp.getFloat(dr_sim_total_weight)  * 2.20462262
width,height = gfx.getScreenSize()
gfx.setColor(0,0,0,0)
-- Condicional para que muestre en que fase del vuelo esta el avion
if (PhaseOfFlight == 0) then
   Phase = "Park"
elseif (PhaseOfFlight == 1) then
Phase = "Take Off"
elseif (PhaseOfFlight == 2) then
    Phase = "Fly"
elseif (PhaseOfFlight == 3) then
    Phase = "Landing"
end
-- Fin del Condicional de Fase de Vuelo

-- Condicional para ver si el avion captura el LOC y GS
if (get_appr == 0 ) then
apprn = "Off"
elseif (get_appr == 1 ) then
apprn = "Armed"
elseif (get_appr == 2 ) then
apprn = "Captured"
end
-- Hasta Aqui el condiconal del LOC y GS

-- Aqui que escriba en la pantalla
gfx.drawString(string.format("Peso Total Lbs: %0.0f",g_total_weight),10, height-100 )
gfx.drawString(string.format("IAS Knots: %0.0f",get_IAS),10, height-90 )
gfx.drawString(string.format("Acelerador: %0.2f",get_thro),10, height-80 )
gfx.drawString(string.format("Altura Ft: %0.0f",get_ALTG_ft),10, height-70 )
gfx.drawString(string.format("Velocidad Vertical Ft/min: %0.0f",get_VSI),10, height-60 )
gfx.drawString(string.format("Fase del Vuelo: "..Phase),10, height-50 )
gfx.drawString(string.format("Approach: "..apprn),10, height-40 )

end --end on OnDraw



Título: Re: Crear Datarefs..... como???
Publicado por: kha29096335 en 01 Junio, 2011, 08:43:27
Particularmente no me gusta usar frameworks para la programación, X-Plane ya es lo suficientemente cargante para el micro como para poner otra capa más a la hora de ejecutar la programación de los plugins. Es más cómodo, sí, en eso estamos de acuerdo, porque todos esos framework lo que hacen es abstraer las llamadas a las funciones del SDK a otro nivel más sencillo y te liberan en muchos casos de conocer la estructura necesaria para el uso del SDK, es decir, te liberan de tener que crear las definiciones (Prototyping) y muchas de las convenciones de llamada, pero hay que tener en cuenta que por cada capa de abstracción que se añade se agrega también un fase más en el proceso de ejecución, la interpretación del código de alto nivel.

Python, por ejemplo es un lenguaje interpretado, el equipo debe traducir al vuelo las instrucciones de Python a funciones implementadas dentro del núcleo de Python. Esa traducción cuesta muchos ciclos de máquina que se podrían aprovechar para que nuestro plugin se ejecutase con mayor celeridad. Lo mismo ocurre con Gizmo, que por lo que veo está basado en Lua, es flexible y cómodo, pero no tan eficiente como un binario resultado de la compilación de C, porque no hay cosa más eficiente que el código máquina puro, Lua no es un interprete puro, compila a bytecode en el momento del inicio de la ejecución, pero la misma se realiza dentro de una máquina virtual Lua, es decir, parecido a como funciona Java, el cual no se distingue por su celeridad, precisamente.

Cada cual que escoja lo que quiera, pero donde esté el código nativo, que se quite todo lo demás.

Por otro lado, nadie te salva de tener que aprender las idiosincrasias de cada lenguaje e intérprete, y la verdad, puestos a tener que aprender algo, es preferible aprender lo más general y aplicable a cuantos más ámbitos mejor.

Otra de las cosas por las que tiendo a favorecer a C sobre otros lenguajes es que, si huimos de él, por lo estricto, podemos adoptar malas prácticas de programación, que a la larga pueden derivar en que nuestro código no sea eficiente o que el número de bugs sea mayor de lo deseable. Es mejor aprender en un entorno verdaderamente estricto, que no te deje pasar una, más tarde se agradece y, a la larga, el cociente bugs/lineas de código se consigue mantener al mínimo.


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 01 Junio, 2011, 10:49:50
Maginifica explicacion Kha .....claro y transpparente ....yo sigo por C , poco a poco .....


Título: Re: Crear Datarefs..... como???
Publicado por: CarlosGarcia en 01 Junio, 2011, 12:48:48
Hola kha29096335

Estoy de acuerdo contigo.

Pero en mi caso yo no soy programador, y cada vez que he tratado de entender la POO ( programacion orientada a Objetos) me toca tener un frasco de aspirinas al lado, y lo que estoy haciendo solo es por aprender y no lo hago de forma profesional. Es decir mi script es por pura diversión.

Lo que he probado en mi equipo bastante obsoleto de hace usos 2 o tres años, (dual core de 2.2 con 3 Gb RAM y grafica Radeon 9500 GT) y el impacto de correr GIZMO es casi que nulo a lo sumo un FPS.

Hasta donde tengo entendido proyectos PROFESIONALES como el Saab 340A, Dash 8 Q400 , el Trojan T 28 de XPFR  que saldrá en los próximos días a la venta (junio 10 al 30 ) tienen programados PLUG IN en GIZMO...  Yo tengo contacto con ARNO54 the XP FR y el me comenta que el impacto es casi imperceptible en el Trojan y que se le ha facilitado mucho el desarrollo del proyecto. Y que le hubiera encantado usarlo en B 17.

Mirandolo desde este punto de vista, y si hay proyectos tipo PROFESIONAL usándolos entonces Yo, un simple Aficionado NOOB por que no podría usarlo para mis proyectos caseros....

De todas formas como te dije Inicialmete Tienes toda la razón ...  De pronto para mi es facilidad o comodidad o flojera ... Mira lo que he podido lograr en 8 días. Sera que alguien en 8 días con C puede hacer esto ?

Gracias

Carlos


Título: Re: Crear Datarefs..... como???
Publicado por: jvaldunciel en 01 Junio, 2011, 13:31:29
La ventaja del interfaz para phython o el Gizmo es que tu plugin es multiplataforma sin tener que andar compilando en los distintos SO.

No siempre tienes a tu disposición un Mac, un PC Windows y un PC Linux para hacerlo. Sobretodo, si lo haces por amor al arte, sin fines económicos.


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 01 Junio, 2011, 13:40:13
Al momento la forma mas facil de hacer un PLUGIN para los no programadores es GIZMO.

Este es un ejemplo que he logrado mas o menos hacer despues de 8 dias utilizando GIZMO, no soy programador solo tengo algo de experiencia en PHP y nada mas.

Calcular basado en el peso del avion las velocidades de despegue V1 V2 VR, que el script manipule las luces de acuerdo a la fase del vuelo, PARK, TAXI, TAKE OFF, ON FLY y LANDING, y de igual forma manipule los FLAPS, y las velocidades hasta dejar el avion a una altura de 11.000 pies de ahi para delante el piloto continua con el vuelo, cuando el avion esta proximo a Aterrizar, y estas en el LOC y GS (APP) entonces basado en el peso actual del Avion pone los FLAPS y ajusta las Velocidades hasta lograr la velocidad Vref para el aterrizaje.

Una vez este cercano a la pista el avion disminuya la velocidad vertical hasta un punto que se realize un aterrizaje muy suave ( ESTA ETAPA AUN NO LA HE LOGRADO) lo maximo que hago es de 200 - 300 Ft/min y algunas veces antes de tocar la pista el avion hace una especie de TOGA, y vuelve a estar en al aire. Tengo que trabajar mas en esta parte.

Si hay alguien interesado en trabajar conmigo pues me comenta.... Al momento tengo unas 400 lineas de codigo para el 757-200 de X plane free. Claro que se puede ajustar a otros tipos de aviones.

Código:

init.lua
dofile("main.lua")

main.lua
dofile("draw.lua")
dofile("manipulation.lua")
dofile("dataref.lua")
function main()
OnDraw_Windows()
takeoff_stuff()
end

manipulation.lua
function takeoff_stuff() --1 On, 0 Off
xp.setInt(dref_nav_lights,1) --Luces de Navegacion
xp.setInt(dref_land_lights,1) --Luces de  Aterrizaje
xp.setInt(dref_taxi_lights,1) --Luces de  Taxi
xp.setInt(dref_strobe_lights,1) --Luces de  Strobe
xp.setInt(dref_smoking,1) --Luces de  No fumar
xp.setInt(dref_TransP,2) --Luces de  Transponder Modo Stand By
xp.setInt(dref_belts,1) --Cinturon de seguridad
xp.setInt(dref_beacon_lights,1) --Luces de Faros
end

dataref.lua
VSI = xp.getDataref("sim/cockpit2/gauges/indicators/vvi_fpm_pilot") --displayed, not actual !!!
IAS = xp.getDataref("sim/cockpit2/gauges/indicators/airspeed_kts_pilot")  --displayed, not actual !!!
ALT = xp.getDataref("sim/flightmodel/position/elevation")  --actual meters, MSL
ALTG = xp.getDataref("sim/flightmodel/position/y_agl")  --actual meters, AGL
dref_nav_lights = xp.getDataref("sim/cockpit/electrical/nav_lights_on")
dref_land_lights  = xp.getDataref("sim/cockpit/electrical/landing_lights_on")
dref_taxi_lights  = xp.getDataref("sim/cockpit/electrical/taxi_light_on")
dref_strobe_lights  = xp.getDataref("sim/cockpit/electrical/strobe_lights_on")
dref_beacon_lights  = xp.getDataref("sim/cockpit/electrical/beacon_lights_on")
dref_belts  = xp.getDataref("sim/cockpit/switches/fasten_seat_belts")
dref_smoking  = xp.getDataref("sim/cockpit/switches/no_smoking")
dref_APU  = xp.getDataref("sim/cockpit2/electrical/APU_generator_on")
dref_Pheat  = xp.getDataref("sim/cockpit/switches/pitot_heat_on")
dref_PAice  = xp.getDataref("sim/cockpit/switches/anti_ice_on")
dref_PWh  = xp.getDataref("sim/cockpit/switches/anti_ice_window_heat")  
dref_PSh  = xp.getDataref("sim/cockpit/switches/anti_ice_surf_heat")
dref_PIh  = xp.getDataref("sim/cockpit/switches/anti_ice_inlet_heat")
dref_TransP = xp.getDataref("sim/cockpit/radios/transponder_mode")
dref_Gear_up = xp.getDataref("sim/multiplayer/controls/gear_request") -- 0 UP, 1 Down
dr_sim_flap_request = xp.getDataref("sim/flightmodel/controls/flaprqst")
TEMP =  xp.getDataref("sim/weather/temperature_ambient_c")
get_TEMP = xp.getFloat(TEMP)
SPEED = xp.getDataref("sim/cockpit/autopilot/airspeed")
ALTITUDE = xp.getDataref(" sim/cockpit2/gauges/indicators/altitude_ft_pilot")

draw.lua
function OnDraw_Windows()
ALTG= xp.getDataref("sim/flightmodel/position/y_agl")
get_ALTG=xp.getFloat(ALTG) --actual meters, AGL
get_ALTG_ft = get_ALTG*3.28 --I use the float value returned by xp.getFloat() to work on
IAS = xp.getDataref("sim/cockpit2/gauges/indicators/airspeed_kts_pilot")  --displayed, not actual !!!
get_IAS=xp.getFloat(IAS)
VSI = xp.getDataref("sim/cockpit2/gauges/indicators/vvi_fpm_pilot") --displayed, not actual !!!
get_VSI=xp.getFloat(VSI)
thro=xp.getDataref("sim/flightmodel/engine/ENGN_thro")
get_thro=xp.getFloatV(thro,1,4)
appr=xp.getDataref("sim/cockpit2/autopilot/approach_status")
get_appr=xp.getInt(appr)
dr_sim_total_weight = xp.getDataref("sim/flightmodel/weight/m_total")
g_total_weight =  xp.getFloat(dr_sim_total_weight)  * 2.20462262
width,height = gfx.getScreenSize()
gfx.setColor(0,0,0,0)
-- Condicional para que muestre en que fase del vuelo esta el avion
if (PhaseOfFlight == 0) then
   Phase = "Park"
elseif (PhaseOfFlight == 1) then
Phase = "Take Off"
elseif (PhaseOfFlight == 2) then
    Phase = "Fly"
elseif (PhaseOfFlight == 3) then
    Phase = "Landing"
end
-- Fin del Condicional de Fase de Vuelo

-- Condicional para ver si el avion captura el LOC y GS
if (get_appr == 0 ) then
apprn = "Off"
elseif (get_appr == 1 ) then
apprn = "Armed"
elseif (get_appr == 2 ) then
apprn = "Captured"
end
-- Hasta Aqui el condiconal del LOC y GS

-- Aqui que escriba en la pantalla
gfx.drawString(string.format("Peso Total Lbs: %0.0f",g_total_weight),10, height-100 )
gfx.drawString(string.format("IAS Knots: %0.0f",get_IAS),10, height-90 )
gfx.drawString(string.format("Acelerador: %0.2f",get_thro),10, height-80 )
gfx.drawString(string.format("Altura Ft: %0.0f",get_ALTG_ft),10, height-70 )
gfx.drawString(string.format("Velocidad Vertical Ft/min: %0.0f",get_VSI),10, height-60 )
gfx.drawString(string.format("Fase del Vuelo: "..Phase),10, height-50 )
gfx.drawString(string.format("Approach: "..apprn),10, height-40 )

end --end on OnDraw



Puedes dar mas datos, donde leer sobre el tema, compilador etc ...para poder valorarlo un poco mas ? ....


Título: Re: Crear Datarefs..... como???
Publicado por: CarlosGarcia en 01 Junio, 2011, 14:11:27
Hola Dragun

Esta es la pagina .

http://www.x-plugins.com/home (http://www.x-plugins.com/home)

y este es el foro.

http://forums.x-pilot.com/index.php?board=108.0 (http://forums.x-pilot.com/index.php?board=108.0)

Y este es el SDK

https://github.com/benrussell/Gizmo-SDK (https://github.com/benrussell/Gizmo-SDK)


Título: Re: Crear Datarefs..... como???
Publicado por: Dragun en 02 Junio, 2011, 09:19:56
Muchas gracias por la info ,le echare un vistazo al tema ....