G60 G60
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Escribir sobre DataRef  (Leído 11112 veces)
0 Usuarios y 1 Visitante están viendo este tema.
12 Octubre, 2011, 23:27:49
pabsandoval
Usuario Ocasional
***
Desconectado Desconectado

Mensajes: 36




En línea
Escribir sobre DataRef

Hola a todos!
Necesito crear un plugin para controlar la velocidad y dirección del viento en X-plane... El problema es que soy un principiante en el tema y se me ha vuelto algo complicado. Según entiendo, debería utilizar la función "XPLMSetDataf" para escribir sobre un DataRef como por ejemplo Wind_Speed[0]... Pero no lo he logrado implementar con éxito. Sería de gran ayuda si alguien pudiera crear un pequeño código que escriba sobre un DataRef y lo publica Sonrisa... Por ejemplo, que el plugin haga que la velocidad del viento sea de 5 nudos. Eso me ayudaría a entender como debo crear el código... Hasta el momento estoy utlizando Visual C++ 2008 Express...

Cualquier ayuda o sugerencia sirve. Gracias.
Saludos

13 Octubre, 2011, 00:22:37 #1
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Re: Escribir sobre DataRef

Vi tu post en el foro de la ORG...  Pero la verdad me es mas facil contestar en Español.

Si no tienes conocimientos en C la forma mas Facil es GIZMO.

Que es GIZMO
Mas informacion aqui :
http://www.x-plane.es/modules/smf/index.php?topic=5534.0

Si sabes cuales son las DATAREF que quieres cambiar dime cuales son.

Las Dataref las Puedes buscar aqui : http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html

Y las Buscas en Weather  sim/weather/

No es mas facil que en la opcion de Weather de  X plane cambiar esos datos directamente ? y te evitas el hacer un Plug In ?

Te tocaría desactivar las Opciones de Real Wether ( que no descargue ni actualice por internet el weather)

Es tan facil en GIZMO como esto : ( no esta revisado el codigo, puede contener errores solo lo pongo como guia de lo que hay que hacer)

Solo creas un directorio en el avion que se llame scripts y con un editor de Texto creas este arechivo llamado init.lua
Código:
function main()
WindSpeed = 10 -- Wind Speed que quieres escribir en la DATAREF
end

function OnDraw_Windows()

dr_sim_Windspeed = xp.getDataref("wind_speed_kt[0]") 

- Aqui no estoy muy seguro por que también esta
wind_speed_kt[1]
wind_speed_kt[2]
wind_direction_degt[0]
wind_direction_degt[1]
wind_direction_degt[2]


get_dr_sim_Windspeed = xp.getFloat(dr_sim_Windspeed )

-- The direction the wind is blowing from in degrees from true 0rth c lockwise. from 0 to 360

xp.setFloat(dr_sim_Windspeed ,WindSpeed) -- escribo la DATAREF con el Windspeed que declaro en main, en este caso 10 knots

o mas facil solo hago

xp.setFloat(dr_sim_Windspeed ,10)

--muestro en la pantalla la DATA REF para verificar
width,height = gfx.getScreenSize()
gfx.setColor(0,0,0,0)
gfx.drawString(string.format("Win Speed : %0.2f",get_dr_sim_Windspeed),10, height-400 ) -- Muestro con dos decimales.
end


Se debe ver asi como esta Tabla pero solo con la informacion del Wind Speed


Hay otra Herramienta que se instala mas fácilmente que se llama DATAREF EDITOR es un Plug in y con  esta cambias en pantalla las DATAREF que necesites, creo que esta opción es mas Fácil para ti.

Descargalo aquí :
http://www.xsquawkbox.net/xpsdk/mediawiki/File:DataRefEditor_11-07.zip

Instalación :
http://www.xsquawkbox.net/xpsdk/mediawiki/DataRefEditor

Carlos
« Última modificación: 13 Octubre, 2011, 00:33:03 por CarlosGarcia »

13 Octubre, 2011, 00:53:10 #2
pabsandoval
Usuario Ocasional
***
Desconectado Desconectado

Mensajes: 36




En línea
Re: Escribir sobre DataRef

Gracias por tu ayuda... Pero lo que pasa es es algo más complejo.
En realidad lo que deseo es crear un campo de velocidades de viento en cierto lugar del mundo no demasiado grande. Entonces mi idea es crear un plugin, el cual lea la posición del avión y, según esa información, obtenga desde un archivo de texto la velocidad y dirección del viento en esa localización. Luego, lo anterior se debería escribir sobre los Dataref correspondientes.
Como ves, no es tan simple mi problema y el "Dataref editor" no me sirve para solucionarlo (creo)... Pero quiero ir paso a paso, soy un principiante y en primer lugar deseo aprender a escribir sobre un Dataref...

Sobre el lenguaje de programación: Algo he tratado de entender C++ estos días basándome en los ejemplos de la web SDK, pero no he logrado mi objetivo...

13 Octubre, 2011, 01:05:48 #3
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Re: Escribir sobre DataRef

Si se puede hacer pero para eso tambien tendrias que manejar como X plane maneja los datos de los sectores ( como tu llamas un lugar en el mundo)

La posición del avión es muy fácil, puedes lograr tener la Latitud, la longitud y la altura en Metros sobre el Nivel del mar sin ningún problema.

Lo que seria un poco mas complejo es coordinar que con la latitud y la longitud entonces se le asigne la velocidad y dirección del viento, que por cierto tiene un tercer componente que no estas teniendo en cuenta que es la altura, puedes simular diferentes velocidades y direcciones de viento de acuerdo a la altura que se encuentre el ACF.  La verdad esto ya se sale de mis conocimientos básicos.

De todas te aconsejo GIZMO es mucho mas  fácil que C++

Puedes ver al API de gizmo aquí :
http://dl.dropbox.com/u/948813/Gizmo_API.htm

Comienza con lo fácil que es cambiar la velocidad y la dirección del viento y después se le va agregando mas...

QUOTE
", según esa información, obtenga desde un archivo de texto la velocidad y dirección del viento en esa localización."

Es necesario hacerlo de esta Forma ?.

Se podria crear unos condicionales que serian de esta forma :

Si el ACF se encuentra entre la LON xxx y LON yyy y LAT zzz y LAT vvv entonces la Velocidad del viento es 10 Knots y la dirección es 60 grados.

De esta forma se limitamos un espacio geográfico que va a tener unas condiciones de Viento ( velocidad y dirección) ya establecidos

Se usarian de la API de Gizmo

acf.getLat() -- Returns: latitude of aircraft as decimal number.
acf.getLon() -- Returns: longitude of aircraft as decimal number.
o esta que es mas completa :
acf.getPosition() -- Returns: lat,lon,alt_msl

Carlos
« Última modificación: 13 Octubre, 2011, 01:15:34 por CarlosGarcia »

13 Octubre, 2011, 01:22:27 #4
pabsandoval
Usuario Ocasional
***
Desconectado Desconectado

Mensajes: 36




En línea
Re: Escribir sobre DataRef

Mi idea era que funcione tal como funciona el "DATAREF EDITOR" en el sentido de que al escribir sobre el dataref de la velocidad, implica un cambio en la velocidad en todo el entorno, no solamente en el punto donde se encuentre la aeronave, por lo cual (si tengo razón) no habría problemas con el manejo de los datos por "sectores" que utiliza X-plane.

Por otra parte, entiendo que debería ser relativamente fácil poder escribir una velocidad "plana", es decir, con magnitud en ambos ejes horizontales, pero la velocidad vertical aún no entiendo muy bien como podría controlarla... Se me ocurre "jugar" con los razones de cambio de la temperatura. Si tienes alguna sugerencia, será bienvenida...

Por ahora partiré informándome sobre GIZMO y tratándo de desarrollar algunos plugin básicos...

Se agradece tu ayuda CarlosGarcia  Sonrisa

13 Octubre, 2011, 01:25:39 #5
pabsandoval
Usuario Ocasional
***
Desconectado Desconectado

Mensajes: 36




En línea
Re: Escribir sobre DataRef

 Sonrisa
Disculpa... esa velocidad de 10 nudos dada en un inicio era solamente un ejemplo. La idea es que cada punto sobre el espacio de trabajo tenga asociada una velocidad y una dirección; a eso se debe todo el problema. Si deseara programar una velocidad constante podría utilizar el "DATAREF EDITOR"

13 Octubre, 2011, 01:30:33 #6
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Re: Escribir sobre DataRef

Pienso que lo mejor es primero documentarse con la información de como se manejan las DATAREF del Weather y de esta forma saber que es lo que hay que manipular.  Lastimosamente las DATAREF se encuentran muy mal documentadas y muchas veces toca a prueba y error...

Como estas DATAREF
shear_direction_degt[0]
shear_speed_kt[0]
turbulence[0]
thermal_percent
thermal_rate_ms
thermal_altitude_msl_m
wind_direction_degt -- The effective direction of the wind at the plane's location.
wind_speed_kt -- The effective speed of the wind at the plane's location.

En pocas palabras hay que buscar un meteorólogo ..... Giñar

Carlos

13 Octubre, 2011, 01:32:50 #7
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Re: Escribir sobre DataRef

La idea es que cada punto sobre el espacio de trabajo tenga asociada una velocidad y una dirección; a eso se debe todo el problema. "

Aquí no entendi bien..... ?

Cuando llamas Espacio de Trabajo le Llamamos a entre la Latitud xxx y la latitud zzz y la longitud xxx y la longitud zzz ? es decir limitamos esa área geográfica ?


13 Octubre, 2011, 01:44:26 #8
pabsandoval
Usuario Ocasional
***
Desconectado Desconectado

Mensajes: 36




En línea
Re: Escribir sobre DataRef

Creo entender relativamente bien los datarefs relativos al clima y, en caso de que algo no lo entienda bien, tengo a quien preguntar  Sonrisa

Llamo "espacio de trabajo" al lugar del cual tendré información de los vientos. Y claro, tal como tu dices, me quiero limitar a una zona geográfica determinada, pero no me importa lo que pase fuera de ella. Si el avión saliera del sector delimitado, el plugin se quedaría sin información del viento y en ese caso me gustaría darle un valor por defecto. También es importante decir que la información del viento también debe ir asociada a una altura, es decir, para un conjunto (lat, long, alt) el plugin debe devolver las condiciones del viento.  Se entiende?

14 Octubre, 2011, 08:49:14 #9
kha29096335
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 664



En línea
Re: Escribir sobre DataRef

Hola, a ver si puedo ayudar un poco.

Necesitaras establecer un área, es decir, tu espacio de trabajo debería estar delimitado por un cubo, de modo que cuando las coordenadas del avión estén dentro de ese cubo las condiciones meteorologicas a medida tengan efecto. Esto lo puedes realizar de dos formas, estableciendo coordenadas minimas y maximas del cubo e ir comparando las coordenadas del avión con esos maximos / minimos para saber si está dentro o bien de una segunda forma, dando un punto que será el centro de tu área y calculando la distancia desde la posición actual del avión a ese punto, cuando la distancia sea menor de X millas, que se active la metereologia a medida.

Yo te recomiendo la segunda opción. A cada ciclo de la simulación calculas la raiz cuadrada de los cuadrados de las diferencias entre la posición del avión (en X, Y y Z), aunque en realidad no necesitas Z, y ese punto central, eso te da el módulo de su vector, es decir, la distancia 3D entre el punto y el avión. Con esto puedes incluso tener en un archivo una lista de puntos con distintas condiciones (e incluso distancias) de modo que a cada ciclo te recorres esos valores y calculas las distancias a cada punto, cuando sea menor que la indicada para un punto concreto, el avión está en el area y encontes puedes establecer las condiciones de viento que le correspondan. Como verás así puedes tener N áreas distintas con C condiciones que serán efectivas a D distancias.

Cuidado que DataRefs escoges como posición del avión, pues unos te daran la posición en coordenadas OpenGL (del sistema gráfico) y otros las posiciones reales en longitud, latitud y altura. Mucho ojo, dado que las coordenadas en OpenGL no te van a servir para nada.

Los DataRefs que te darán la posición real del ACF son estos:

sim/flightmodel/position/latitude
sim/flightmodel/position/longitude
sim/flightmodel/position/elevation


Para cambiar las condiciones, primero en la inicialización del plugin guardate cual es el estado del Real Weather, si esta configurado X-Plane para usar el archivo que se baja de Internet con las condiciones atmosféricas o no. El DataRef que creo debes usar es este:

sim/weather/use_real_weather_bool

Luego, como ya he comentado, a cada ciclo de la simulación (no del dibujado de ventanas, objetos, etc, si no de la propia simulación, que es otro tipo de ciclo) compruebas las distancias a centro del área, cuando el avión no esté dentro de ninguna de tus áreas, establece el sim/weather/use_real_weather_bool al valor que te guardaste en la inicialización y establece la dirección y velocidad del viento a 0 o a unas constantes que tu hayas creido conveniente. Esto hará que cuando dejes la zona con las condiciones personalizadas el simulador funcione como esta configurado normalmente. Cuando detectes que el avión está en la zona pon sim/weather/use_real_weather_bool a FALSE, para desactivar la metereología en tiempo real bajada de Internet y establece la dirección y velocidad del viento con estos DataRefs:


sim/weather/wind_direction_degt
sim/weather/wind_speed_kt

Estos DataRefs siempre ponen la dirección y velocidad en la posición en la que está el avión, luego si deseas distintas velocidades del viento por alturas, entonces, lo tendrás que controlar tu en este caso, comparando la altitud del avión y estableciendo la velocidad del viento acorde a ella.

Si no quieres tener que controlar tu la altura, pero deseas que el viento sea distinto por rangos de altitud, entonces usa éstos:


sim/weather/wind_direction_degt[0]
sim/weather/wind_direction_degt[1]
sim/weather/wind_direction_degt[2]

sim/weather/wind_speed_kt[0]
sim/weather/wind_speed_kt[1]
sim/weather/wind_speed_kt[2]

wind_altitude_msl_m[0]
wind_altitude_msl_m[1]
wind_altitude_msl_m[2]

Son 3 de cada porque X-Plane distinque 3 rangos de altura, los DataRefs wind_altitude_msl_m es para indicarle a X-Plane a qué altitud se encuentra cada uno de estos 3 rangos.

Habras visto que cuando te comente lo de calcular la distancia dije que no necesitabas Z (la altura), esto es así porque si usas el método que no tiene en cuenta los rangos de altitud para establecer las condiciones, tu mismo deberás usar la altura para poner distintas velocidades de viento, pero solo para eso, no para calcular cuando el avión está en la zona, a no ser que quieras que sea el mismo viento a todas altitudes, en cuyo caso no necesitaras Z para nada.
Si usas el segundo método de establecer las velocidades por rangos, tampoco necesitas saber la altura del avión,
dado que X-Plane ya pondrá el viento acorde a la altura que éste tenga, y según las tres capas de viento que has definido.

Aqui te pongo una porción de código en C en el que leo parámetros de un archivo desde un plugin que hice hace tiempo por encargo

Código:
/**************************************************
* Project Name: Seamax Plugin                     *
* Version: 1.0                                    *
* Date: (dd/mm/yyyy): 03/08/2009                  *
* Programmer: kha29096335                         *
* Plane project: Seamax plane                     *
* Plane project developper: Javier Rollon         *
* Plane project web site: http://www.jrollon.com  *
* Compilation target: Windows                     *
**************************************************/
/**************************************************

//Global Constants declaration
const char * CfgFileName = "seamax.cfg";

//Global Variables declaration
int DelayForContinuousClickVar = 0;
int DelayForContinuousClickForFlapsVar = 0;

PLUGIN_API int XPluginStart(
char * outName,
char * outSig,
char * outDesc)
{
XPLMPluginID ourpluginID = 0;
char pluginname[255] = "";
char filepath[255] = "";
char signature[255] = "";
char description[255] = "";
char fullfilepath[255] = "";
ifstream cfgfile;//Variable input stream for read the config file
char fileline[255];//Buffer to read from config file
//char str[128];//Variable for debug to log purposes


strcpy(outName, "Seamax_custom_controls");
strcpy(outSig, "Carlos_Esteban.plugins.seamax");
strcpy(outDesc, "The plugin manages Seamax custom controls");

//Reading of configuration parameters from file seamax,cfg
//First we get our current plugin path (trough get plugin information)
ourpluginID = XPLMGetMyID();

//Debug to X-Plane log
//sprintf(str,"seamax.pluginID=%d\n", ourpluginID);
//XPLMDebugString(str);

XPLMGetPluginInfo(ourpluginID, pluginname, filepath, signature, description);

//Debug to X-Plane log
//sprintf(str,"seamax.filepath=%s\n", filepath);
//XPLMDebugString(str);

if(strcmp(filepath,"") != 0)
{
strncpy(fullfilepath, filepath, strlen(filepath)-7);
strcat(fullfilepath, CfgFileName);
cfgfile.open(fullfilepath, ifstream::in);
if (!cfgfile)
{
//Error in file aperture. The values are set to default values from constants
DelayForContinuousClickVar = DelayForContinuousClick;
DelayForContinuousClickForFlapsVar = DelayForContinuousClickForFlaps;
}
else
{
//Values from config file.
//First line delay for COM1 Stdby frequencies continous action
cfgfile.getline(fileline,sizeof(fileline));
DelayForContinuousClickVar = atoi(fileline);

//Second line delay for flaps deployment continous action
cfgfile.getline(fileline,sizeof(fileline));
DelayForContinuousClickForFlapsVar = atoi(fileline);

//The config file is closed
cfgfile.close();
}
}
else
{
//Error in path. The values are set to default values from constants
}
}

Usa esta porción de código como guía, no está completo, solo lo básico para que puedas empezar y orientarte un poco.

Creo por este mismo foro, en alguna parte está más completo el código de este plugin, podrías buscar para echarle un vistazo. Espero que todo esto te sea de alguna ayuda, un saludo.*/
« Última modificación: 14 Octubre, 2011, 14:04:34 por kha29096335 »

14 Octubre, 2011, 13:28:50 #10
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Re: Escribir sobre DataRef

Hola  kha29096335

Creo que estas dos DATAREF no se puden Modificar

sim/weather/
wind_direction_degt   float   660+   no   [0-359)   The effective direction of the wind at the plane's location.
wind_speed_kt           float   660+   no   kts >= 0   The effective speed of the wind at the plane's location.

I sigo pensando que es mas facil en GIZMO... ( cuestion de Gustos... )

De esta Forma como tu lo dices solo haces

Por ejemplo si quieres tener estas condiciones en el lugar geografico entre las Latitudes 80 y 100 y longitudes 10 y 20.

If acf.getLat() < 100 and  acf.getLat() > 80
  If acf.getLon() < 20 and acf.getLon() > 10

Then

sim/weather/wind_direction_degt[0] = 20
sim/weather/wind_direction_degt[1] = 15
sim/weather/wind_direction_degt[2] = 5
sim/weather/wind_spee_kt[0] = 45
sim/weather/wind_speed_kt[1] = 90
sim/weather/wind_speed_kt[2] = 50
wind_altitude_msl_m[0] = 500
wind_altitude_msl_m[1] = 1000
wind_altitude_msl_m[2] = 2000

end

Este es un codigo no revisado ... es una forma de ilustracion, tener en cuenta que acf.getLon() y acf.getLat()  estan expresados en decimal number.

Carlos

Si es posible : Publica los datos de un AREA, es decir la posicion geografica con los Valores de Velocidad y direccion del viento y lo pruebo en mi PC...




14 Octubre, 2011, 14:01:22 #11
kha29096335
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 664



En línea
Re: Escribir sobre DataRef

Hola  kha29096335

Creo que estas dos DATAREF no se puden Modificar

sim/weather/
wind_direction_degt   float   660+   no   [0-359)   The effective direction of the wind at the plane's location.
wind_speed_kt           float   660+   no   kts >= 0   The effective speed of the wind at the plane's location.

I sigo pensando que es mas facil en GIZMO... ( cuestion de Gustos... )


Ostras, pues llevas razón, esos dos son de solo lectura. Pues nada, solo puede hacerse por el método de establecerlo mediante las 3 capas.

Lo del Gizmo, a mi es que me roza bastante tener que instalar 20 cosas -estoy exagerando- para hacer un plugin mínimo, ya me entiendes. Me gusta lo minimalista, y en el ordenador, más aún. Ahí, lo justo, que cuantas mas cosas pones, mas se pueden romper.

Gracias por la puntualización.

Tags:
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

www.x-plane.es.
Página creada en 0.208 segundos con 19 queries.