Voici une lib qui fonctionne sous windows. Je voudrais la faire fonctionner sous Linux. Je n'y connais pas grand chose en programmation, mais je pense que le problème de compatibilité viens des headers qui sont différents selon le système d'exploitation. Les fonctions liées aux .h de windows ne sont pas nombreuses, donc je crois que ca ne ne devrait pas être très difficile pour des expérimentés (la lib "ne fait que" 500 lignes). Cela permettrait de faire avancer considérablement mon projet.
A tous ceux qui aiment les défis, ou qui voudrait me donner un coup de main je vous remercie.
/***************************************************************************
This library is a test for the version 3.0 input device API for
CVF-based products
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*#include <windows.h>*/ /* <-- header windows */
/*#include <mmsystem.h>*/ /* <-- header windows */
/***************************************************************************
this routine is used to initialize the input device - it is called each time
the user toggles the "Use 6D input device" toggle.
**************************************************************************/
int
udi_device_initialize(void)
{
init_transpos(3);
/* we only have one "tracker" */
int
udi_num_trackers(void)
{
return(1);
}
/***************************************************************************
return the direction and 'up' vectors for a tracker
**************************************************************************/
int
udi_tracker_pos(int tracker, float pos[3])
{
update_tracker();
memcpy(pos,_pos,sizeof(_pos));
return(1);
}
/* Button interface */
int
udi_num_buttons(void)
{
if (_which == -1) return(0);
return(_nbuttons);
}
int
udi_button_status(int button, int *status)
{
*status = 0;
if (_which == -1) return(1);
if (button >= _nbuttons) return(1);
if ((_info.dwButtons & _btnmask[button]) == _btnmask[button]) *status = 1;
return(1);
}
int
udi_num_valuators(void)
{
if (_which == -1) return(0);
return(_nvaluators);
}
int
udi_valuator_value(int valuator, float *val)
{
*val = 0.0;
if (valuator >= _nvaluators) return(1);
/* if there is a btnmask, then the btn bits must match */
if (_valmask[valuator]) {
if ((_info.dwButtons & _valmask[valuator]) != _valbtn[valuator])
{
return(1);
}
}
*val = get_info_axis(_valmap[valuator]);
return(1);
}
/*
* Call this routine periodically to update the output values...
* In the future, this could be called by a thread...
*/
static void
update_tracker(void)
{
float rot[3] = {0.,0.,0.};
float trans[3] = {0.,0.,0.};
float mat[4][4];
float xv[3] = {1.,0.,0.};
float yv[3] = {0.,1.,0.};
float p[3];
int i;
if (_which == -1) return;
/* update the cache */
_info.dwSize = sizeof(_info);
_info.dwFlags = JOY_RETURNALL;
if (joyGetPosEx(_which, &_info) != JOYERR_NOERROR ) return;
/* check for "reset" */
i = 0;
if (_info.dwButtons == _reset[0]) i |= 3;
if (_info.dwButtons == _reset[1]) i |= 1;
if (_info.dwButtons == _reset[2]) i |= 2;
init_transpos(i);
/* convert cursor axes to -scale,scale */
static float
check_axis(int axis, int btnmask, int btnvalue, float scale)
{
float v = 0.0;
if (axis < 0) return(v);
/* if there is a btnmask, then all the btn bits must be set */
if (btnmask) {
if ((_info.dwButtons & btnmask) != btnvalue) return(v);
}
/* grab the axis (-1,1) and rescale */
v = get_info_axis(axis)*scale;
return(v);
}
/* pick the value and the bounds */
switch(axis) {
case 0:
val = _info.dwXpos; min = _dev.wXmin; max = _dev.wXmax;
break;
case 1:
val = _info.dwYpos; min = _dev.wYmin; max = _dev.wYmax;
break;
case 2:
val = _info.dwZpos; min = _dev.wZmin; max = _dev.wZmax;
break;
case 3:
val = _info.dwRpos; min = _dev.wRmin; max = _dev.wRmax;
break;
case 4:
val = _info.dwUpos; min = _dev.wUmin; max = _dev.wUmax;
break;
case 5:
val = _info.dwVpos; min = _dev.wVmin; max = _dev.wVmax;
break;
default:
val = 0.0; min = -1.0; max = 1.0;
break;
}
/* normalize */
d = max - min;
if (d == 0.0) d = 1.0;
f = (val - min)/(d);
val = f*2.0 - 1.0;
return -1 to 1
return(val);
}
mamiemando
Messages postés33591Date d'inscriptionjeudi 12 mai 2005StatutModérateurDernière intervention20 mars 20257 834 23 août 2007 à 19:55
Oui c'est la bonne démarche.
Les headers suivants ne sont pas standards non plus :
#include <cvf_dl_init.h>
#include <cvf_udi_dso.h>
A moins que ce soit des headers développés par tes soins, il faudrait que tu commentes ces headers en plus des headers windowsiens et que tu regardes quels fonctions vont te manquer sous linux. Ensuite il faudra soit trouver un équivalent sous linux, soit les adapter sous linux.
Tu peux spécifier dans ton code des sections spécifiques à windows et spécifiques à linux (cf #define), en particulier pour les #include.
Exemple
#ifdef WIN32
//... code windows
#endif
#ifdef LINUX
// ... code linux
#endif
Pour compiler sous linux il faudra rajouter l'option -DLINUX. Exemple :
ok merci pour l'info, je vais me mettre au boulot!
Forum Programmation
Trouvez des réponses à vos questions sur les langages, les frameworks et les astuces de codage. Échangez avec d'autres développeurs passionnés pour améliorer vos compétences en programmation et rester au fait des dernières tendances du secteur.