Engines: minor updates to engines and starter

This commit is contained in:
Sidi Liang 2020-02-15 11:14:49 +08:00
parent 37935e073a
commit a6dfee8fdd
No known key found for this signature in database
GPG Key ID: 79F0A6B20B72F42F
7 changed files with 100 additions and 91 deletions

View File

Before

Width:  |  Height:  |  Size: 239 B

After

Width:  |  Height:  |  Size: 239 B

View File

Before

Width:  |  Height:  |  Size: 239 B

After

Width:  |  Height:  |  Size: 239 B

View File

@ -12,7 +12,7 @@
<repeatable>false</repeatable>
<binding>
<command>nasal</command>
<script>engine.startEngine()</script>
<script>engine.toggleEngine(engine.engine_1)</script>
</binding>
</action>
</animation>

View File

@ -283,15 +283,15 @@
<!-- Engine Starter -->
<model>
<path>Aircraft/followme_e-tron/Models/Starter/starter.xml</path>
<offsets>
<model>
<path>Aircraft/followme_e-tron/Models/Instruments/starter/starter.xml</path>
<offsets>
<x-m>1.299</x-m>
<y-m>-0.19</y-m>
<z-m>0.90</z-m>
<pitch-deg>18.0</pitch-deg>
</offsets>
</model>
</model>
<!-- STEERINGWHEEL -->

View File

@ -4,17 +4,17 @@ var Engine = {
#//Class for any electric engine
#//mTorque: Max torque, mPower: Max Power, rpmAtMPower: RPM at max power
#//For this vehicle: maxPower: 375kW
new: func(mTorque, mPower, rpmAtMPower) {
return { parents:[Engine, followme.Appliance.new()], maxTorque: mTorque, ratedPower:mPower, rpmAtMaxPower:rpmAtMPower };
return { parents:[Engine, followme.Appliance.new()], maxTorque: mTorque, ratedPower:mPower, rpmAtMaxPower:rpmAtMPower };
},
resistance: 0.1, #//No datasource, based on guess
runningState: 0,
engineSwitch: followme.Switch.new(0),
isRunning: func(){
return me.runningState;
},
@ -33,7 +33,7 @@ var Engine = {
getDirection: func(){
return me.direction;
},
gear: 9.73,
setGear: func(g){
me.gear = g;
@ -41,45 +41,45 @@ var Engine = {
getGear: func(){
return me.gear;
},
rotor_moi: 2.3,
wheel_moi: 0.9,
wheel_radius: 0.31,#//M
rpm: 0,
maxTorque: 460, #Nm
rpmAtMaxPower: 6150, #rpm
angularSpeed: 0, #rad/s
torque: 0, #Nm
outputForce: 0, #N
debugMode: 0,
rpm_calculate: func(angularAcceleration){
var rpm = me.rpm;
#//var rps = rpm / 60;
var angularSpeed = rpm * 0.10471975; #//rps * 2 * 3.1415926
var friction_lbs = props.getNode("/",1).getValue("fdm/jsbsim/forces/fbx-gear-lbs");
var friction = 4.4492 * friction_lbs * 0.25;#//0.25: single wheel
var angularDecelaeration = friction * me.wheel_radius * (1/me.wheel_moi); #//frictionTorque = friction * wheel_radius, angularDecelaeration = frictionTorque/wheel_moi;
var angularDecelaeration = friction * me.wheel_radius * (1/me.wheel_moi); #//frictionTorque = friction * wheel_radius, angularDecelaeration = frictionTorque/wheel_moi;
#print(angularAcceleration);
#print("de"~angularDecelaeration);
angularDecelaeration = math.abs(angularDecelaeration) * me.getDirection() * -1;
var totalAcceleration = angularAcceleration + angularDecelaeration;
if(me.getDirection() == 1){
if(angularSpeed + totalAcceleration * 0.1 > 10){
angularSpeed = angularSpeed + totalAcceleration * 0.1;
@ -94,23 +94,23 @@ var Engine = {
angularSpeed = angularSpeed + angularAcceleration * 0.1;
}
}
#//rps = angularSpeed / 6.2831853;
rpm = angularSpeed * 9.5492966; #//rps * 60
me.rpm = rpm;
props.getNode("/",1).setValue("/controls/engines/engine/rpma",rpm);
me.angularSpeed = angularSpeed;
return rpm;
},
update_engine: func(){
var throttle = props.getNode("/",1).getValue("/controls/engines/engine/throttle");
var direction = me.getDirection();
var mode = props.getNode("/",1).getValue("/controls/mode");
var volt = me.voltage;
if(!volt){
me.rpm = 0;
props.getNode("/",1).setValue("/controls/engines/engine/rpma", 0);
@ -120,14 +120,14 @@ var Engine = {
throttle = throttle * mode;
#print("throttle:" ~throttle);
var cmdRpm = throttle * me.rpmAtMaxPower;
#print("cmdRpm: "~cmdRpm);
var cmdPower = throttle * me.ratedPower;
#print("cmdPower: "~cmdPower);
me.activePower_kW = math.abs(me.rpm * me.torque / 9549);
if(math.abs(me.rpm) < cmdRpm){
#print("me.rpm < cmdRpm");
me.torque = throttle * me.maxTorque * direction;
@ -144,22 +144,22 @@ var Engine = {
me.rpm = me.rpm_calculate(angularAcceleration);
me.torque = direction * math.abs((9549 * me.activePower_kW) / me.rpm);
}
var force = (1/me.wheel_radius) * me.torque * me.gear;#//unit: N
me.outputForce = force;
if(me.debugMode){
me.debugPrint();
}
outputForce(me.outputForce * N2LBS);
},
engineTimer: nil,
startEngine: func(){
if(me.engineTimer == nil) me.engineTimer = maketimer(0.1, func me.update_engine());
me.engineSwitch.switchConnect();
@ -171,7 +171,7 @@ var Engine = {
me.engineTimer.start();
return 1;
},
stopEngine: func(){
me.rpm = 0;
me.torque = 0;
@ -182,14 +182,14 @@ var Engine = {
props.getNode("/",1).setValue("/controls/engines/engine/started",0);
me.engineTimer.stop();
},
debugPrint: func(){
print("rpm: "~me.rpm);
print("torque: "~me.torque);
print("power: "~me.activePower_kW);
print("______________________________________________");
},
};
@ -206,19 +206,19 @@ var outputForce = func(force){
}else{
props.getNode("/",1).setValue("/fdm/jsbsim/external_reactions/FL/magnitude", 0);
}
if(props.getNode("/",1).getValue("/fdm/jsbsim/gear/unit[1]/compression-ft") > 0){
props.getNode("/",1).setValue("/fdm/jsbsim/external_reactions/FR/magnitude", force/4);
}else{
props.getNode("/",1).setValue("/fdm/jsbsim/external_reactions/FR/magnitude", 0);
}
if(props.getNode("/",1).getValue("/fdm/jsbsim/gear/unit[2]/compression-ft") > 0){
props.getNode("/",1).setValue("/fdm/jsbsim/external_reactions/BL/magnitude", force/4);
}else{
props.getNode("/",1).setValue("/fdm/jsbsim/external_reactions/BL/magnitude", 0);
}
if(props.getNode("/",1).getValue("/fdm/jsbsim/gear/unit[3]/compression-ft") > 0){
props.getNode("/",1).setValue("/fdm/jsbsim/external_reactions/BR/magnitude", force/4);
}else{
@ -227,28 +227,37 @@ var outputForce = func(force){
}
props.getNode("systems/welcome-message", 1).setValue(3);
var startEngine = func(){
var startEngine = func(my_engine){
if(!props.getNode("/controls/is-recharging").getValue()){
if(props.getNode("systems/welcome-message", 1).getValue() == 1){
props.getNode("/sim/messages/copilot", 1).setValue("Beijing di san tsui jiao tong wei ti xing nin, Dao lu tsian wan tiao, ann tsuan di yi tiao, xing che bull gui fun, tsin ren liang hang lei");
}else if(props.getNode("systems/welcome-message", 1).getValue() == 2){
props.getNode("/sim/messages/copilot", 1).setValue("This is a reminder from The Third District Traffic Commission of Beijing. There are thousands of roads, and the safety is the first. If you drive recklessly, your loved ones will be filled with tears.");
}else if(props.getNode("systems/welcome-message", 1).getValue() == 3){
props.getNode("/sim/messages/copilot", 1).setValue("Ben chea yee xeao do. This vehicle is disinfected.");
}
var signal = engine_1.startEngine();
var signal = my_engine.startEngine();
if(signal){
print("Engine started");
if(props.getNode("systems/welcome-message", 1).getValue() == 1){
props.getNode("/sim/messages/copilot", 1).setValue("Beijing di san tsui jiao tong wei ti xing nin, Dao lu tsian wan tiao, ann tsuan di yi tiao, xing che bull gui fun, tsin ren liang hang lei");
}else if(props.getNode("systems/welcome-message", 1).getValue() == 2){
props.getNode("/sim/messages/copilot", 1).setValue("This is a reminder from The Third District Traffic Commission of Beijing. There are thousands of roads, and the safety is the first. If you drive recklessly, your loved ones will be filled with tears.");
}else if(props.getNode("systems/welcome-message", 1).getValue() == 3){
props.getNode("/sim/messages/copilot", 1).setValue("Ben chea yee xeao do. This vehicle is disinfected.");
}
}else{
print("Engine start failed");
}
}else if(followme.chargeTimer.isRunning){
#screen.log.write("Battery is recharging, cannot start engine.", 0, 0.584, 1);
setprop("/sim/sound/voices/pilot", "Battery is recharging, cannot start engine.");
}
}
var stopEngine = func(){
engine_1.stopEngine();
var stopEngine = func(my_engine){
my_engine.stopEngine();
print("Engine stopped");
}
}
var toggleEngine = func(my_engine){
if(my_engine.runningState == 0){
startEngine(my_engine);
}else{
stopEngine(my_engine);
}
}

View File

@ -29,13 +29,13 @@
</button>
</group>
<hrule/>
<group>
<layout>vbox</layout>
<padding>6</padding>
<button>
<halign>left</halign>
<legend>Enable Performance Mode</legend>
@ -46,7 +46,7 @@
<not>
<property>/sim/freeze/replay-state</property>
</not>
</and>
</enable>
<binding>
@ -55,7 +55,7 @@
<value>1</value>
</binding>
</button>
<button>
<halign>left</halign>
<legend>Enable Comfort Mode</legend>
@ -66,7 +66,7 @@
<not>
<property>/sim/freeze/replay-state</property>
</not>
</and>
</enable>
<binding>
@ -75,7 +75,7 @@
<value>0.65</value>
</binding>
</button>
<button>
<halign>left</halign>
<legend>Enable Low Power Mode</legend>
@ -86,7 +86,7 @@
<not>
<property>/sim/freeze/replay-state</property>
</not>
</and>
</enable>
<binding>
@ -95,8 +95,8 @@
<value>0.4</value>
</binding>
</button>
</group>
<text>
<label>Advanced Steering</label>
@ -116,7 +116,7 @@
<not>
<property>/sim/freeze/replay-state</property>
</not>
</and>
</enable>
<binding>
@ -133,7 +133,7 @@
<not>
<property>/sim/freeze/replay-state</property>
</not>
</and>
</enable>
<binding>
@ -141,9 +141,9 @@
</binding>
</button>
</group>
<hrule/>
<group>
<layout>vbox</layout>
<padding>6</padding>
@ -261,7 +261,7 @@
</binding>
</button>
</group>
<hrule/>
<text><label>Configuration</label></text>
<group>
@ -281,7 +281,7 @@
<value>0</value>
</binding>
</button>
<button>
<halign>left</halign>
<legend>Type O</legend>
@ -322,7 +322,7 @@
</binding>
</combo>
</group>
<group>
<layout>vbox</layout>
<text><label>Battery gauge type</label></text>
@ -345,7 +345,7 @@
</binding>
</combo>
</group>
</group>
<group>
<layout>vbox</layout>
@ -470,10 +470,10 @@
<script>followme.circuit_1.parallelConnection[0].units[0].resetRemainingToFull()</script>
</binding>
</button>
</group>
<hrule/>
<group>
@ -490,7 +490,7 @@
</enable>
<binding>
<command>nasal</command>
<script>engine.startEngine()</script>
<script>engine.startEngine(engine.engine_1)</script>
</binding>
</button>
<button>
@ -503,11 +503,11 @@
</enable>
<binding>
<command>nasal</command>
<script>engine.stopEngine()</script>
<script>engine.stopEngine(engine.engine_1)</script>
</binding>
</button>
</group>
<hrule/>
</PropertyList>