diff --git a/Models/plate/texture/SAD00818.png b/Models/plate/texture/SAD00818.png new file mode 100644 index 0000000..58eec1d Binary files /dev/null and b/Models/plate/texture/SAD00818.png differ diff --git a/Models/screen.jpeg b/Models/screen.jpeg index dbcbacd..6bfcfe6 100644 Binary files a/Models/screen.jpeg and b/Models/screen.jpeg differ diff --git a/Models/screen_2.jpeg b/Models/screen_2.jpeg index 6bfcfe6..dbcbacd 100644 Binary files a/Models/screen_2.jpeg and b/Models/screen_2.jpeg differ diff --git a/Nasal/auto_speed.nas b/Nasal/auto_speed.nas index bf5a18f..2bf562d 100644 --- a/Nasal/auto_speed.nas +++ b/Nasal/auto_speed.nas @@ -6,9 +6,11 @@ var mode = 1;#//1:Hold 2:Auto Speed var leftBrakes = props.getNode("/controls/gear/brake-left",1); var rightBrakes = props.getNode("/controls/gear/brake-right",1); var throttleNode = props.getNode("/controls/engines/engine/throttle",1); +var lastDeltaSpeed = 0; var autoSpeedMainLoop = func(){ if(leftBrakes.getValue() == 1 or rightBrakes.getValue() == 1 or throttleNode.getValue() == 1){ #//Stop if full brakes or full throttle are manually applied + throttleNode.setValue(0); stopAutoSpeed(); } var currentSpeed = props.getNode("/", 1).getValue("sim/multiplay/generic/float[15]"); @@ -16,7 +18,7 @@ var autoSpeedMainLoop = func(){ var throttle = 0; var brakes = 0; #//range from 0 to 1; if(deltaSpeed > 0){ - throttle = deltaSpeed/targetSpeed - 0.05; #// Max throttle 0.95 + throttle = (deltaSpeed / targetSpeed) - 0.05; #// Max throttle 0.95 }else if(deltaSpeed <= -1.852){ throttle = 0; brakes = ((0 - deltaSpeed) / targetSpeed) - 0.2; #// Max brake 0.8 @@ -26,6 +28,7 @@ var autoSpeedMainLoop = func(){ throttleNode.setValue(throttle); leftBrakes.setValue(brakes); rightBrakes.setValue(brakes); + lastDeltaSpeed = deltaSpeed; } var autoSpeedTimer = maketimer(0.05,autoSpeedMainLoop); diff --git a/Nasal/electrical.nas b/Nasal/electrical.nas index 4a479bb..7783f3f 100644 --- a/Nasal/electrical.nas +++ b/Nasal/electrical.nas @@ -285,6 +285,8 @@ var CurrentSource = { me.electromotiveForce = me.ratedElectromotiveForce; } }, + + #//Usage: followme.circuit_1.parallelConnection[0].units[0].resetRemainingToFull(); resetRemainingToFull: func(){ me.remaining = me.electricalCapacity; }, diff --git a/gui/dialogs/config.nas b/gui/dialogs/config.nas index a74e63a..359de10 100644 --- a/gui/dialogs/config.nas +++ b/gui/dialogs/config.nas @@ -270,11 +270,11 @@ var BatteryWidget = { #//}else{ #// m._nLevelPct = props.globals.initNode("/systems/electrical/battery-charge-percent-back",0.0,"DOUBLE"); #//} - m._nLevelPct = props.globals.initNode("/systems/electrical/e-tron/battery-remaining-percent",0.0,"DOUBLE"); + m._nLevelPct = props.getNode("/systems/electrical/e-tron/battery-remaining-percent"); - m._fraction = m._nLevelPct.getValue(); - m._capacity = 100; #100 kWh (per pack) + m._fraction = followme.circuit_1.parallelConnection[0].units[0].getRemainingPercentageFloat(); + m._capacity = 80; #80 kWh (per pack) m._cFrame = m._group.getElementById(m._name~"_Frame"); m._cFrameV = m._group.getElementById(m._name~"_Frame_Vis"); @@ -282,8 +282,8 @@ var BatteryWidget = { m._cDataLevel = m._group.getElementById(m._name~"_Data_Level"); m._cDataAbs = m._group.getElementById(m._name~"_Data_Abs"); - m._cDataLevel.setText(sprintf("%3d",m._fraction*100)~" %"); - m._cDataAbs.setText(sprintf("%3.1f",m._fraction*m._capacity)~" kWh"); + m._cDataLevel.setText(sprintf("%3d",m._fraction)~" %"); + m._cDataAbs.setText(sprintf("%3.1f",m._fraction*m._capacity*0.01)~" kWh"); m._left = m._cFrame.get("coord[0]"); m._right = m._cFrame.get("coord[2]"); @@ -291,7 +291,7 @@ var BatteryWidget = { return m; }, setListeners : func(instance) { - append(me._listeners, setlistener(me._nLevelPct,func(n){me._onChargeLevelChange(n);},1,0) ); + append(me._listeners, setlistener(me._nLevelPct,func(){me._onChargeLevelChange();},1,0) ); me._cFrameV.addEventListener("drag",func(e){me._onChargeInputChange(e);}); me._cLevel.addEventListener("drag",func(e){me._onChargeInputChange(e);}); @@ -304,11 +304,11 @@ var BatteryWidget = { deinit : func(){ me.removeListeners(); }, - _onChargeLevelChange : func(n){ - me._fraction = n.getValue(); - - me._cDataLevel.setText(sprintf("%3d",me._fraction*100)~" %"); - me._cDataAbs.setText(sprintf("%3.1f",me._fraction*me._capacity)~" kWh"); + _onChargeLevelChange : func(){ + me._fraction = followme.circuit_1.parallelConnection[0].units[0].getRemainingPercentageFloat(); + + me._cDataLevel.setText(sprintf("%3d",me._fraction)~" %"); + me._cDataAbs.setText(sprintf("%3.1f",me._fraction*me._capacity*0.01)~" kWh"); me._cLevel.set("coord[2]", me._left + (me._width * me._fraction)); @@ -321,223 +321,19 @@ var BatteryWidget = { newFraction = me._fraction + (e.deltaX/me._width); } newFraction = clamp(newFraction,0.0,1.0); - me._nLevelPct.setValue(newFraction); + followme.circuit_1.parallelConnection[0].units[0].remaining = newFraction * m._capacity; }, }; -var WeightWidget = { - new: func(dialog,canvasGroup,name,widgets){ - var m = {parents:[WeightWidget,SvgWidget.new(dialog,canvasGroup,name)]}; - m._class = "WeightWidget"; - m._widget = {}; - - foreach(w;keys(widgets)){ - if(widgets[w] != nil){ - if(widgets[w]._class == "PayloadWidget"){ - m._widget[w] = widgets[w]; - } - } - } - - m._cWeightGrossKg = m._group.getElementById("Weight_Gross_Kg"); - m._cWeightGrossLbs = m._group.getElementById("Weight_Gross_Lbs"); - m._cWeightWarning = m._group.getElementById("Weight_Warning"); - m._cWeightPilotKg = m._group.getElementById("Weight_Pilot_Kg"); - m._cWeightPilotLbs = m._group.getElementById("Weight_Pilot_Lbs"); - m._cWeightCopilotKg = m._group.getElementById("Weight_Copilot_Kg"); - m._cWeightCopilotLbs = m._group.getElementById("Weight_Copilot_Lbs"); - m._cWeightBaggageKg = m._group.getElementById("Weight_Baggage_Kg"); - m._cWeightBaggageLbs = m._group.getElementById("Weight_Baggage_Lbs"); - - m._cCenterGravityX = m._group.getElementById("Center_Gravity_X"); - m._cCenterGravityXWarning = m._group.getElementById("Center_Gravity_Warn"); - - m._nCGx = props.globals.initNode("/fdm/jsbsim/inertia/cg-x-mm-rp",0.0,"DOUBLE"); #calculated CG distance to reference point, set via system in Systems/dialogs.xml - m._nGross = props.globals.initNode("/fdm/jsbsim/inertia/weight-lbs"); - m._nPilot = props.globals.initNode("/payload/weight[0]/weight-lb"); - m._nCopilot = props.globals.initNode("/payload/weight[1]/weight-lb"); - m._nBaggage = props.globals.initNode("/payload/weight[2]/weight-lb"); - m._nTakeoff = props.globals.initNode("/limits/mtow-lbs"); - - - m._cgX = 0; - m._pilot = 0; - m._copilot = 0; - m._baggage = 0; - m._gross = 0; - m._takeoff = 0; - - m._takeoff = m._nTakeoff.getValue(); - - return m; - }, - setListeners : func(instance) { - append(me._listeners, setlistener(batteryPayload._nGrossWeight,func(n){me._onGrossWeightChange(n);},1,0) ); - append(me._listeners, setlistener(me._nCGx,func(n){me._onCGChange(n);},1,0) ); - - }, - init : func(instance=me){ - me.setListeners(instance); - }, - deinit : func(){ - me.removeListeners(); - }, - _onGrossWeightChange : func(n){ - - me._gross = me._nGross.getValue(); - me._cWeightGrossKg.setText(sprintf("%5d",me._gross/KG2LB)); - me._cWeightGrossLbs.setText(sprintf("%4d",me._gross)); - - me._pilot = me._nPilot.getValue(); - me._cWeightPilotKg.setText(sprintf("%5d",me._pilot/KG2LB)); - me._cWeightPilotLbs.setText(sprintf("%4d",me._pilot)); - - me._copilot = me._nCopilot.getValue(); - me._cWeightCopilotKg.setText(sprintf("%5d",me._copilot/KG2LB)); - me._cWeightCopilotLbs.setText(sprintf("%4d",me._copilot)); - - me._baggage = me._nBaggage.getValue(); - me._cWeightBaggageKg.setText(sprintf("%5d",me._baggage/KG2LB)); - me._cWeightBaggageLbs.setText(sprintf("%4d",me._baggage)); - - - if (me._gross > me._takeoff){ - me._cWeightWarning.show(); - me._cWeightGrossKg.setColor(COLOR["Red"]); - me._cWeightGrossLbs.setColor(COLOR["Red"]); - }else{ - me._cWeightWarning.hide(); - me._cWeightGrossKg.setColor(COLOR["Black"]); - me._cWeightGrossLbs.setColor(COLOR["Black"]); - } - - - }, - _onCGChange : func(n){ - - me._cgX = me._nCGx.getValue(); - - me._cCenterGravityX.setTranslation((me._cgX-200),0); - - if(me._cgX>195 and me._cgX<368){ - me._cCenterGravityXWarning.hide(); - }else{ - me._cCenterGravityXWarning.show(); - } - - }, - - - -}; - -var PayloadWidget = { - new: func(dialog,canvasGroup,name,index){ - var m = {parents:[PayloadWidget,SvgWidget.new(dialog,canvasGroup,name)]}; - m._class = "PayloadWidget"; - m._index = index; - - #debug.dump(m._listCategoryKeys); - - m._nRoot = props.globals.getNode("/payload/weight["~m._index~"]"); - m._nLable = m._nRoot.initNode("name","","STRING"); - - ### HACK : listener on /payload/weight[0]/weight-lb not working - ### two props one for fdm(weight-lb) one for dialog(nt-weight-lb) listener - m._nWeightFdm = m._nRoot.initNode("weight-lb",0.0,"DOUBLE"); - m._weight = m._nWeightFdm.getValue(); # lbs - m._nWeight = m._nRoot.initNode("nt-weight-lb",m._weight,"DOUBLE"); - - m._nCapacity = m._nRoot.initNode("max-lb",0.0,"DOUBLE"); - - m._capacity = m._nCapacity.getValue(); - m._fraction = m._weight / m._capacity; - - m._cFrame = m._group.getElementById(m._name~"_Frame"); - m._cFrame_Pick = m._group.getElementById(m._name~"_Frame_Pick"); - m._cLevel = m._group.getElementById(m._name~"_Level"); - m._cLBS = m._group.getElementById(m._name~"_Lbs"); - m._cKG = m._group.getElementById(m._name~"_Kg"); - - m._cLBS.setText(sprintf("%3.0f",m._weight)); - m._cKG.setText(sprintf("%3.0f",m._weight)); - - - m._left = m._cFrame.get("coord[0]"); - m._right = m._cFrame.get("coord[2]"); - m._width = m._right - m._left; - - return m; - }, - setListeners : func(instance) { - ### FIXME : use one property remove the HACK - append(me._listeners, setlistener(me._nWeight,func(n){me._onWeightChange(n);},1,0) ); - - me._cFrame_Pick.addEventListener("drag",func(e){me._onInputChange(e);}); - me._cLevel.addEventListener("drag",func(e){me._onInputChange(e);}); - me._cFrame_Pick.addEventListener("wheel",func(e){me._onInputChange(e);}); - me._cLevel.addEventListener("wheel",func(e){me._onInputChange(e);}); - - - - }, - init : func(instance=me){ - me.setListeners(instance); - }, - deinit : func(){ - me.removeListeners(); - }, - setWeight : func(weight){ - me._weight = weight; - - ### HACK : set two props - me._nWeight.setValue(me._weight); - me._nWeightFdm.setValue(me._weight); - - }, - _onWeightChange : func(n){ - me._weight = me._nWeight.getValue(); - #print("PayloadWidget._onWeightChange() ... "~me._weight); - - me._fraction = me._weight / me._capacity; - - me._cLBS.setText(sprintf("%3.0f",me._weight)); - me._cKG.setText(sprintf("%3.0f",me._weight/KG2LB)); - - me._cLevel.set("coord[2]", me._left + (me._width * me._fraction)); - }, - _onInputChange : func(e){ - var newFraction =0; - if(e.type == "wheel"){ - newFraction = me._fraction + (e.deltaY/me._width); - }else{ - newFraction = me._fraction + (e.deltaX/me._width); - } - newFraction = clamp(newFraction,0.0,1.0); - me._weight = me._capacity * newFraction; - - me.setWeight(me._weight); - - }, -}; - - var BatteryPayloadClass = { new : func(){ var m = {parents:[BatteryPayloadClass]}; - m._nRoot = props.globals.initNode("/alphaelectro/dialog/config"); - - m._nGrossWeight = props.globals.initNode("/fdm/jsbsim/inertia/nt-weight-lbs",0.0,"DOUBLE"); #listener on weight-lbs not possible, set via system in Systems/fuelpayload.xml + m._nRoot = props.globals.initNode("/e-tron/dialog/config"); m._name = "Battery and Systems"; m._title = "Battery and Systems Settings"; - m._fdmdata = { - grosswgt : "/fdm/jsbsim/inertia/weight-lbs", - payload : "/payload", - cg : "/fdm/jsbsim/inertia/cg-x-in", - }; m._listeners = []; @@ -623,9 +419,7 @@ var BatteryPayloadClass = { canvas.parsesvg(me._group, "Aircraft/followme_e-tron/gui/dialogs/config.svg",{"font-mapper": font_mapper}); - - me._widget.Front = BatteryWidget.new(me,me._group,"Front"); - me._widget.Rear = BatteryWidget.new(me,me._group,"Rear"); + me._widget.Front = BatteryWidget.new(me,me._group,"Front"); diff --git a/gui/dialogs/config.svg b/gui/dialogs/config.svg index 15286d9..c9d8762 100644 --- a/gui/dialogs/config.svg +++ b/gui/dialogs/config.svg @@ -26,8 +26,8 @@ inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:zoom="1" - inkscape:cx="211.03013" - inkscape:cy="253.07054" + inkscape:cx="351.03013" + inkscape:cy="293.07054" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -109,13 +109,13 @@ Follow Me EV Batteries and Systems - - - - - - Center of Gravity - 100 - 200 - 300 - 400 - (mm behind leading edge) - - out of permitted range! - - - Gross Weight - - Empty Weight - Battery Pack Front - Battery Pack Rear - Pilot - Copilot - Baggage - - Gross Weight - 379 kg - 836 lbs - 53 kg - 53 kg - 000 kg - 000 kg - 00 kg - 000 kg - 117 lbs - 117 lbs - 000 lbs - 000 lbs - 000 lbs - 0000 lbs - MTOW - 550 kg - 1213 lbs - Gross weight exceeds MTOW! -