1 // fgjs.cxx -- assign joystick axes to flightgear properties
3 // Written by Tony Peden, started May 2001
5 // Copyright (C) 2001 Tony Peden (apeden@earthlink.net)
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include <simgear/compiler.h>
31 SG_USING_STD(fstream);
37 string axes_humannames[8] = { "elevator", "ailerons", "rudder", "throttle",
38 "mixture","propller pitch", "lateral view",
42 string axes_propnames[8]={ "/controls/flight/elevator","/controls/flight/aileron",
43 "/controls/flight/rudder","/controls/engines/engine/throttle",
44 "/controls/engines/engine/mixture","/controls/engines/engine/pitch",
45 "/sim/views/axes/lat","/sim/views/axes/long"
48 bool half_range[8]={ false,false,false,true,true,true,false,false };
51 string button_humannames[6]= { "apply left brake",
52 "apply right brake", "step flaps up",
53 "step flaps down","apply nose-up trim",
54 "apply nose-down trim"
57 string button_propnames[6]={ "/controls/gear/brake-left",
58 "/controls/gear/brake-right",
59 "/controls/flight/flaps",
60 "/controls/flight/flaps",
61 "/controls/flight/elevator-trim",
62 "/controls/flight/elevator-trim"
66 float button_step[6]={ 1.0, 1.0, 0.34, -0.34, 0.001, -0.001 };
68 string button_repeat[6]={ "false", "false", "false", "false",
72 void waitForButton(jsSuper *jss, int wait_ms) {
74 float axes[_JS_MAX_AXES];
76 ulMilliSecondSleep(wait_ms);
80 jss->getJoystick()->read ( &b, axes ) ;
81 } while( jss->nextJoystick());
83 ulMilliSecondSleep(1);
86 ulMilliSecondSleep(wait_ms);
89 void writeAxisProperties(fstream &fs, int control,int joystick, int axis) {
92 snprintf(jsDesc,80,"--prop:/input/joysticks/js[%d]/axis[%d]/binding",joystick,axis);
93 fs << jsDesc << "/command=property-scale" << endl;
94 fs << jsDesc << "/property=" << axes_propnames[control] << endl;
96 fs << jsDesc << "/dead-band=0.02" << endl;
98 if( half_range[control] == true) {
99 fs << jsDesc << "/offset=-1.0" << endl;
100 fs << jsDesc << "/factor=-0.5" << endl;
102 fs << jsDesc << "/offset=0.0" << endl;
103 fs << jsDesc << "/factor=1.0" << endl;
108 void writeButtonProperties(fstream &fs, int property,int joystick, int button) {
111 snprintf(jsDesc,80,"--prop:/input/joysticks/js[%d]/button[%d]/binding",joystick,button);
113 fs << jsDesc << "/repeatable=" << button_repeat[property] << endl;
114 fs << jsDesc << "/command=property-adjust" << endl;
115 fs << jsDesc << "/property=" << button_propnames[property] << endl;
116 fs << jsDesc << "/step=" << button_step[property] << endl;
124 jsSuper *jss=new jsSuper();
125 jsInput *jsi=new jsInput(jss);
126 jsi->displayValues(false);
131 cout << "Found " << jss->getNumJoysticks() << " joystick(s)" << endl;
133 if(jss->getNumJoysticks() <= 0) {
134 cout << "Can't find any joysticks ..." << endl;
138 jss->firstJoystick();
140 cout << "Joystick " << jss->getCurrentJoystickId() << " has "
141 << jss->getJoystick()->getNumAxes() << " axes" << endl;
142 } while( jss->nextJoystick() );
144 fstream fs("fgfsrc.js",ios::out);
147 for(control=0;control<=7;control++) {
148 cout << "Move the control you wish to use for " << axes_humannames[control]
153 if(jsi->getInputAxis() != -1) {
154 cout << endl << "Assigned axis " << jsi->getInputAxis()
155 << " on joystick " << jsi->getInputJoystick()
156 << " to control " << axes_humannames[control]
159 writeAxisProperties( fs, control, jsi->getInputJoystick(),
160 jsi->getInputAxis() );
162 cout << "Skipping Axis" << endl;
165 cout << "Press any button for next control" << endl;
167 waitForButton(jss,500);
171 for(control=0;control<=5;control++) {
172 cout << "Press the button you wish to use to "
173 << button_humannames[control]
177 if(jsi->getInputButton() != -1) {
179 cout << endl << "Assigned button " << jsi->getInputButton()
180 << " on joystick " << jsi->getInputJoystick()
181 << " to control " << button_humannames[control]
184 writeButtonProperties( fs, control, jsi->getInputJoystick(),
185 jsi->getInputButton() );
187 cout << "Skipping..." << endl;
190 cout << "Press any button for next axis" << endl;
192 waitForButton(jss,500);
200 cout << "Your joystick settings are in the file fgfsrc.js" << endl;
201 cout << "Check and edit as desired (especially important if you are"
202 << " using a hat switch" << endl;
203 cout << "as this program will, most likely, not get those right). ";
205 cout << "Once you are happy, " << endl
206 << "append its contents to your .fgfsrc or system.fgfsrc" << endl;