X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FYASim%2FControlMap.cpp;h=e5d3ba19171239fde39ef2cc138411fe908c70bc;hb=c8b8722a14d29e2b4153c39ad4cef0c44a562afd;hp=25a7db746db816381c88882f314e5a9c8879da45;hpb=f0e6716953604730579a5e45f785fd063737dce4;p=flightgear.git diff --git a/src/FDM/YASim/ControlMap.cpp b/src/FDM/YASim/ControlMap.cpp index 25a7db746..e5d3ba191 100644 --- a/src/FDM/YASim/ControlMap.cpp +++ b/src/FDM/YASim/ControlMap.cpp @@ -63,6 +63,7 @@ void ControlMap::addMapping(int input, int type, void* object, int options) out = new OutRec(); out->type = type; out->object = object; + out->oldL = out->oldR = out->time = 0; _outputs.add(out); } @@ -73,10 +74,8 @@ void ControlMap::addMapping(int input, int type, void* object, int options) map->idx = out->maps.add(map); // The default ranges differ depending on type! - map->src1 = map->dst1 = 1; - map->src0 = map->dst0 = 0; - if(type==FLAP0 || type==FLAP1 || type==STEER) - map->src0 = map->dst0 = -1; + map->src1 = map->dst1 = rangeMax(type); + map->src0 = map->dst0 = rangeMin(type); // And add it to the approproate vectors. Vector* maps = (Vector*)_inputs.get(input); @@ -89,7 +88,7 @@ void ControlMap::reset() for(int i=0; i<_outputs.size(); i++) { OutRec* o = (OutRec*)_outputs.get(i); for(int j=0; jmaps.size(); j++) - ((MapRec*)o->maps.get(j))->val = 0; + ((MapRec*)(o->maps.get(j)))->val = 0; } } @@ -112,7 +111,32 @@ void ControlMap::setInput(int input, float val) } } -void ControlMap::applyControls() +int ControlMap::getOutputHandle(void* obj, int type) +{ + for(int i=0; i<_outputs.size(); i++) { + OutRec* o = (OutRec*)_outputs.get(i); + if(o->object == obj && o->type == type) + return i; + } + return 0; +} + +void ControlMap::setTransitionTime(int handle, float time) +{ + ((OutRec*)_outputs.get(handle))->time = time; +} + +float ControlMap::getOutput(int handle) +{ + return ((OutRec*)_outputs.get(handle))->oldL; +} + +float ControlMap::getOutputR(int handle) +{ + return ((OutRec*)_outputs.get(handle))->oldR; +} + +void ControlMap::applyControls(float dt) { int outrec; for(outrec=0; outrec<_outputs.size(); outrec++) { @@ -137,20 +161,42 @@ void ControlMap::applyControls() rval += val; } + // If there is a finite transition time, clamp the values to + // the maximum travel allowed in this dt. + if(o->time > 0) { + float dl = lval - o->oldL; + float dr = rval - o->oldR; + float adl = Math::abs(dl); + float adr = Math::abs(dr); + + float max = (dt/o->time) * (rangeMax(o->type) - rangeMin(o->type)); + if(adl > max) dl = dl*max/adl; + if(adr > max) dr = dr*max/adr; + + lval = o->oldL + dl; + rval = o->oldR + dr; + } + + o->oldL = lval; + o->oldR = rval; + void* obj = o->object; switch(o->type) { - case THROTTLE: ((Thruster*)obj)->setThrottle(lval); break; - case MIXTURE: ((Thruster*)obj)->setMixture(lval); break; - case ADVANCE: ((PropEngine*)obj)->setAdvance(lval); break; - case REHEAT: ((Jet*)obj)->setReheat(lval); break; - case VECTOR: ((Jet*)obj)->setRotation(lval); break; - case BRAKE: ((Gear*)obj)->setBrake(lval); break; - case STEER: ((Gear*)obj)->setRotation(lval); break; - case EXTEND: ((Gear*)obj)->setExtension(lval); break; - case SLAT: ((Wing*)obj)->setSlat(lval); break; - case FLAP0: ((Wing*)obj)->setFlap0(lval, rval); break; - case FLAP1: ((Wing*)obj)->setFlap1(lval, rval); break; - case SPOILER: ((Wing*)obj)->setSpoiler(lval, rval); break; + case THROTTLE: ((Thruster*)obj)->setThrottle(lval); break; + case MIXTURE: ((Thruster*)obj)->setMixture(lval); break; + case STARTER: ((Thruster*)obj)->setStarter(lval != 0.0); break; + case MAGNETOS: ((PropEngine*)obj)->setMagnetos((int)lval); break; + case ADVANCE: ((PropEngine*)obj)->setAdvance(lval); break; + case REHEAT: ((Jet*)obj)->setReheat(lval); break; + case VECTOR: ((Jet*)obj)->setRotation(lval); break; + case BRAKE: ((Gear*)obj)->setBrake(lval); break; + case STEER: ((Gear*)obj)->setRotation(lval); break; + case EXTEND: ((Gear*)obj)->setExtension(lval); break; + case CASTERING:((Gear*)obj)->setCastering(lval != 0); break; + case SLAT: ((Wing*)obj)->setSlat(lval); break; + case FLAP0: ((Wing*)obj)->setFlap0(lval, rval); break; + case FLAP1: ((Wing*)obj)->setFlap1(lval, rval); break; + case SPOILER: ((Wing*)obj)->setSpoiler(lval, rval); break; case BOOST: ((Thruster*)obj)->getPistonEngine()->setBoost(lval); break; @@ -158,4 +204,28 @@ void ControlMap::applyControls() } } -}; // namespace yasim +float ControlMap::rangeMin(int type) +{ + // The minimum of the range for each type of control + switch(type) { + case FLAP0: return -1; // [-1:1] + case FLAP1: return -1; + case STEER: return -1; + case MAGNETOS: return 0; // [0:3] + default: return 0; // [0:1] + } +} + +float ControlMap::rangeMax(int type) +{ + // The maximum of the range for each type of control + switch(type) { + case FLAP0: return 1; // [-1:1] + case FLAP1: return 1; + case STEER: return 1; + case MAGNETOS: return 3; // [0:3] + default: return 1; // [0:1] + } +} + +} // namespace yasim