X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInput%2FFGJoystickInput.cxx;h=b15649cda3b334589e90c4b84495d68ea80e9fbd;hb=5151f7f5e0ba7c7e6688bdfbc4cea365196e1ed3;hp=049ae7c2f1c6f84a8aa76eddcdcb34838cc0a55e;hpb=ae6218ff102b8638a7ce584484748472d347fdd9;p=flightgear.git diff --git a/src/Input/FGJoystickInput.cxx b/src/Input/FGJoystickInput.cxx index 049ae7c2f..b15649cda 100644 --- a/src/Input/FGJoystickInput.cxx +++ b/src/Input/FGJoystickInput.cxx @@ -52,7 +52,6 @@ FGJoystickInput::axis::~axis () FGJoystickInput::joystick::joystick () : jsnum(0), - js(0), naxes(0), nbuttons(0), axes(0), @@ -61,17 +60,20 @@ FGJoystickInput::joystick::joystick () { } +void FGJoystickInput::joystick::clearAxesAndButtons() +{ + delete[] axes; + delete[] buttons; + axes = NULL; + buttons = NULL; + naxes = 0; + nbuttons = 0; +} + FGJoystickInput::joystick::~joystick () { - // delete js? no, since js == this - and we're in the destructor already. - delete[] axes; - delete[] buttons; jsnum = 0; - js = NULL; - naxes = 0; - nbuttons = 0; - axes = NULL; - buttons = NULL; + clearAxesAndButtons(); } @@ -90,12 +92,13 @@ void FGJoystickInput::_remove(bool all) for (int i = 0; i < MAX_JOYSTICKS; i++) { + joystick* joy = &joysticks[i]; // do not remove predefined joysticks info on reinit - if (all || (!bindings[i].predefined)) + if (all || (!joy->predefined)) js_nodes->removeChild("js", i, false); - if (bindings[i].js) - delete bindings[i].js; - bindings[i].js = NULL; + + joy->plibJS.reset(); + joy->clearAxesAndButtons(); } } @@ -110,8 +113,8 @@ void FGJoystickInput::init() for (int i = 0; i < MAX_JOYSTICKS; i++) { jsJoystick * js = new jsJoystick(i); - bindings[i].js = js; - + joysticks[i].plibJS.reset(js); + if (js->notWorking()) { SG_LOG(SG_INPUT, SG_DEBUG, "Joystick " << i << " not found"); continue; @@ -124,17 +127,17 @@ void FGJoystickInput::init() SG_LOG(SG_INPUT, SG_INFO, "Using existing bindings for joystick " << i); } else { - bindings[i].predefined = false; + joysticks[i].predefined = false; SG_LOG(SG_INPUT, SG_INFO, "Looking for bindings for joystick \"" << name << '"'); SGPropertyNode_ptr named; if (configMap.hasConfiguration(name)) { named = configMap.configurationForDeviceName(name); - string source = named->getStringValue("source", "user defined"); + std::string source = named->getStringValue("source", "user defined"); SG_LOG(SG_INPUT, SG_INFO, "... found joystick: " << source); } else if ((named = configMap.configurationForDeviceName("default"))) { - string source = named->getStringValue("source", "user defined"); + std::string source = named->getStringValue("source", "user defined"); SG_LOG(SG_INPUT, SG_INFO, "No config found for joystick \"" << name << "\"\nUsing default: \"" << source << '"'); @@ -163,7 +166,7 @@ void FGJoystickInput::postinit() for (int i = 0; i < MAX_JOYSTICKS; i++) { SGPropertyNode_ptr js_node = js_nodes->getChild("js", i); - jsJoystick *js = bindings[i].js; + jsJoystick *js = joysticks[i].plibJS.get(); if (!js_node || js->notWorking()) continue; @@ -178,8 +181,8 @@ void FGJoystickInput::postinit() int naxes = js->getNumAxes(); if (naxes > MAX_JOYSTICK_AXES) naxes = MAX_JOYSTICK_AXES; - bindings[i].naxes = naxes; - bindings[i].nbuttons = nbuttons; + joysticks[i].naxes = naxes; + joysticks[i].nbuttons = nbuttons; SG_LOG(SG_INPUT, SG_DEBUG, "Initializing joystick " << i); @@ -194,15 +197,15 @@ void FGJoystickInput::postinit() js->getCenter(center); // Allocate axes and buttons - bindings[i].axes = new axis[naxes]; - bindings[i].buttons = new FGButton[nbuttons]; + joysticks[i].axes = new axis[naxes]; + joysticks[i].buttons = new FGButton[nbuttons]; // // Initialize nasal groups. // std::ostringstream str; str << "__js" << i; - string module = str.str(); + std::string module = str.str(); nasalsys->createModule(module.c_str(), module.c_str(), "", 0); PropertyList nasal = js_node->getChildren("nasal"); @@ -243,7 +246,7 @@ void FGJoystickInput::postinit() SG_LOG(SG_INPUT, SG_DEBUG, "Dropping bindings for axis " << n_axis); continue; } - axis &a = bindings[i].axes[n_axis]; + axis &a = joysticks[i].axes[n_axis]; js->setDeadBand(n_axis, axis_node->getDoubleValue("dead-band", 0.0)); @@ -284,7 +287,7 @@ void FGJoystickInput::postinit() buf << (unsigned)n_but; SG_LOG(SG_INPUT, SG_DEBUG, "Initializing button " << buf.str()); - FGButton &b = bindings[i].buttons[n_but]; + FGButton &b = joysticks[i].buttons[n_but]; b.init(button_node, buf.str(), module ); // get interval-sec property b.interval_sec = button_node->getDoubleValue("interval-sec",0.0); @@ -297,69 +300,74 @@ void FGJoystickInput::postinit() } } -void FGJoystickInput::update( double dt ) +void FGJoystickInput::updateJoystick(int index, FGJoystickInput::joystick* joy, double dt) { float axis_values[MAX_JOYSTICK_AXES]; int modifiers = fgGetKeyModifiers(); int buttons; - - for (int i = 0; i < MAX_JOYSTICKS; i++) { - - jsJoystick * js = bindings[i].js; - if (js == 0 || js->notWorking()) - continue; - - js->read(&buttons, axis_values); - if (js->notWorking()) // If js is disconnected - continue; - - // Update device status - SGPropertyNode_ptr status = status_node->getChild("joystick", i, true); - for (int j = 0; j < MAX_JOYSTICK_AXES; j++) { - status->getChild("axis", j, true)->setFloatValue(axis_values[j]); + + jsJoystick * js = joy->plibJS.get(); + if (js == 0 || js->notWorking()) + return; + + js->read(&buttons, axis_values); + if (js->notWorking()) // If js is disconnected + return; + + // Update device status + SGPropertyNode_ptr status = status_node->getChild("joystick", index, true); + for (int j = 0; j < MAX_JOYSTICK_AXES; j++) { + status->getChild("axis", j, true)->setFloatValue(axis_values[j]); + } + + for (int j = 0; j < MAX_JOYSTICK_BUTTONS; j++) { + status->getChild("button", j, true)->setBoolValue((buttons & (1u << j)) > 0 ); + } + + // Fire bindings for the axes. + for (int j = 0; j < joy->naxes; j++) { + axis &a = joy->axes[j]; + + // Do nothing if the axis position + // is unchanged; only a change in + // position fires the bindings. + // But only if there are bindings + if (fabs(axis_values[j] - a.last_value) > a.tolerance + && a.bindings[KEYMOD_NONE].size() > 0 ) { + a.last_value = axis_values[j]; + for (unsigned int k = 0; k < a.bindings[KEYMOD_NONE].size(); k++) + a.bindings[KEYMOD_NONE][k]->fire(axis_values[j]); } - for (int j = 0; j < MAX_JOYSTICK_BUTTONS; j++) { - status->getChild("button", j, true)->setBoolValue((buttons & (1u << j)) > 0 ); + // do we have to emulate axis buttons? + a.last_dt += dt; + if(a.last_dt >= a.interval_sec) { + if (a.low.bindings[modifiers].size()) + joy->axes[j].low.update( modifiers, axis_values[j] < a.low_threshold ); + + if (a.high.bindings[modifiers].size()) + joy->axes[j].high.update( modifiers, axis_values[j] > a.high_threshold ); + + a.last_dt -= a.interval_sec; } - - // Fire bindings for the axes. - for (int j = 0; j < bindings[i].naxes; j++) { - axis &a = bindings[i].axes[j]; - - // Do nothing if the axis position - // is unchanged; only a change in - // position fires the bindings. - // But only if there are bindings - if (fabs(axis_values[j] - a.last_value) > a.tolerance - && a.bindings[KEYMOD_NONE].size() > 0 ) { - a.last_value = axis_values[j]; - for (unsigned int k = 0; k < a.bindings[KEYMOD_NONE].size(); k++) - a.bindings[KEYMOD_NONE][k]->fire(axis_values[j]); - } - - // do we have to emulate axis buttons? - a.last_dt += dt; - if(a.last_dt >= a.interval_sec) { - if (a.low.bindings[modifiers].size()) - bindings[i].axes[j].low.update( modifiers, axis_values[j] < a.low_threshold ); - - if (a.high.bindings[modifiers].size()) - bindings[i].axes[j].high.update( modifiers, axis_values[j] > a.high_threshold ); - - a.last_dt -= a.interval_sec; - } + } // of axes iteration + + // Fire bindings for the buttons. + for (int j = 0; j < joy->nbuttons; j++) { + FGButton &b = joy->buttons[j]; + b.last_dt += dt; + if(b.last_dt >= b.interval_sec) { + joy->buttons[j].update( modifiers, (buttons & (1u << j)) > 0 ); + b.last_dt -= b.interval_sec; } + } // of butotns iterations - // Fire bindings for the buttons. - for (int j = 0; j < bindings[i].nbuttons; j++) { - FGButton &b = bindings[i].buttons[j]; - b.last_dt += dt; - if(b.last_dt >= b.interval_sec) { - bindings[i].buttons[j].update( modifiers, (buttons & (1u << j)) > 0 ); - b.last_dt -= b.interval_sec; - } - } +} + +void FGJoystickInput::update( double dt ) +{ + for (int i = 0; i < MAX_JOYSTICKS; i++) { + updateJoystick(i, &joysticks[i], dt); } }