]> git.mxchange.org Git - flightgear.git/blob - src/Input/fgjs.cxx
Fix the nmea and garmin output to a) fake a GSA sentence, b) fix a y2k bug
[flightgear.git] / src / Input / fgjs.cxx
1 // fgjs.cxx -- assign joystick axes to flightgear properties
2 //
3 // Written by Tony Peden, started May 2001
4 //
5 // Copyright (C) 2001  Tony Peden (apeden@earthlink.net)
6 //
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.
11 //
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.
16 //
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.
20
21 #include <simgear/compiler.h>
22
23 #include <math.h>
24
25 #include STL_IOSTREAM
26 #include STL_FSTREAM
27 #include STL_STRING
28
29 #include <jsinput.h>
30
31 SG_USING_STD(fstream);
32 SG_USING_STD(cout);
33 SG_USING_STD(endl);
34 SG_USING_STD(ios);
35 SG_USING_STD(string);
36
37 string axes_humannames[8] = { "elevator", "ailerons", "rudder", "throttle", 
38                               "mixture","propller pitch", "lateral view", 
39                               "longitudinal view" 
40                             };
41
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" 
46                          };
47                       
48 bool half_range[8]={ false,false,false,true,true,true,false,false };
49
50
51 string button_humannames[7]= { "apply all brakes", "apply left brake", 
52                                "apply right brake", "step flaps up", 
53                                "step flaps down","apply nose-up trim",
54                                "apply nose-down trim"
55                              }; 
56
57 string button_propnames[7]={ "/controls/gear/wheel[-1]/brake", "/controls/gear/wheel[0]/brake",
58                              "/controls/gear/wheel[1]/brake", "/controls/flight/flaps",
59                              "/controls/flight/flaps","/controls/flight/elevator-trim",
60                              "/controls/flight/elevator-trim" 
61                            };                                                   
62  
63
64 float button_step[7]={ 1.0, 1.0, 1.0, 0.34, -0.34, 0.001, -0.001 };
65
66 string button_repeat[7]={ "false", "false", "false", "false", "false", 
67                           "true", "true" };
68
69
70 void waitForButton(jsSuper *jss, int wait_ms) {
71       int b,lastb;
72       float axes[_JS_MAX_AXES];
73       b=0;
74       ulMilliSecondSleep(wait_ms);
75       do {
76         lastb=b;
77         do {
78           jss->getJoystick()->read ( &b, axes ) ;
79         } while( jss->nextJoystick()); 
80         
81         ulMilliSecondSleep(1); 
82  
83       }while( lastb == b ); 
84       ulMilliSecondSleep(wait_ms);
85 }
86
87 void writeAxisProperties(fstream &fs, int control,int joystick, int axis) {
88      
89      char jsDesc[80];
90      snprintf(jsDesc,80,"--prop:/input/joysticks/js[%d]/axis[%d]/binding",joystick,axis);
91      fs << jsDesc  << "/command=property-scale" << endl; 
92      fs << jsDesc  << "/property=" << axes_propnames[control] << endl; 
93      
94      fs << jsDesc << "/dead-band=0.02"  << endl; 
95      
96      if( half_range[control] == true) {
97        fs << jsDesc << "/offset=-1.0" << endl; 
98        fs << jsDesc << "/factor=-0.5" << endl;
99      } else {
100        fs << jsDesc << "/offset=0.0" << endl; 
101        fs << jsDesc << "/factor=1.0" << endl;
102      }
103      fs << endl;
104
105
106 void writeButtonProperties(fstream &fs, int property,int joystick, int button) {
107      
108      char jsDesc[80];
109      snprintf(jsDesc,80,"--prop:/input/joysticks/js[%d]/button[%d]/binding",joystick,button);
110      
111      fs << jsDesc << "/repeatable=" << button_repeat[property] << endl;
112      fs << jsDesc << "/command=property-adjust" << endl; 
113      fs << jsDesc << "/property=" << button_propnames[property] << endl;
114      fs << jsDesc << "/step=" << button_step[property] << endl; 
115      fs << endl; 
116 }    
117
118         
119
120       
121 int main(void) {
122   jsSuper *jss=new jsSuper();
123   jsInput *jsi=new jsInput(jss);
124   jsi->displayValues(false);
125   // int i;
126   int control=0;
127   
128   
129   cout << "Found " << jss->getNumJoysticks() << " joystick(s)" << endl;
130   
131   if(jss->getNumJoysticks() <= 0) { 
132     cout << "Can't find any joysticks ..." << endl;
133     exit(1);
134   }  
135   
136   jss->firstJoystick();
137   do {
138     cout << "Joystick " << jss->getCurrentJoystickId() << " has "
139          << jss->getJoystick()->getNumAxes() << " axes" << endl;
140   } while( jss->nextJoystick() ); 
141   
142   fstream fs("fgfsrc.js",ios::out);
143
144   
145   for(control=0;control<=7;control++) {
146       cout << "Move the control you wish to use for " << axes_humannames[control]
147            << endl;
148       fflush( stdout );
149       jsi->getInput();
150       
151       if(jsi->getInputAxis() != -1) {
152          cout << endl << "Assigned axis " << jsi->getInputAxis() 
153               << " on joystick " << jsi->getInputJoystick() 
154               << " to control " << axes_humannames[control]
155               << endl;
156       
157           writeAxisProperties( fs, control, jsi->getInputJoystick(), 
158                                jsi->getInputAxis() ); 
159       } else {
160           cout << "Skipping Axis" << endl;
161       }           
162       
163       cout << "Press any button for next control" << endl;
164       
165       waitForButton(jss,500);
166       cout << endl;
167   }
168   
169   for(control=0;control<=6;control++) {
170       cout << "Press the button you wish to use to " 
171            << button_humannames[control]
172            << endl;
173       fflush( stdout );
174       jsi->getInput();
175       if(jsi->getInputButton() != -1) {
176          
177          cout << endl << "Assigned button " << jsi->getInputButton() 
178               << " on joystick " << jsi->getInputJoystick() 
179               << " to control " << button_humannames[control]
180               << endl;
181       
182           writeButtonProperties( fs, control, jsi->getInputJoystick(), 
183                                jsi->getInputButton() ); 
184       } else {
185           cout << "Skipping..." << endl;
186       }           
187       
188       cout << "Press any button for next axis" << endl;
189       
190       waitForButton(jss,500);
191       cout << endl;
192   }
193  
194
195   delete jsi;
196   delete jss;
197       
198   cout << "Your joystick settings are in the file fgfsrc.js" << endl;
199   cout << "Check and edit as desired (especially important if you are"
200          << " using a hat switch" << endl;
201   cout << "as this program will, most likely, not get those right).  ";        
202   
203   cout << "Once you are happy, " << endl 
204        << "append its contents to your .fgfsrc or system.fgfsrc" << endl;     
205      
206   return 1;
207 }