Added end delay support, negative regression checks
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / ExtrudedGrain.java
1 package com.billkuker.rocketry.motorsim.grain;\r
2 \r
3 import java.beans.PropertyVetoException;\r
4 \r
5 import javax.measure.quantity.Length;\r
6 import javax.measure.unit.SI;\r
7 \r
8 import org.jscience.physics.amount.Amount;\r
9 \r
10 import com.billkuker.rocketry.motorsim.Grain;\r
11 import com.billkuker.rocketry.motorsim.MotorPart;\r
12 \r
13 public abstract class ExtrudedGrain extends MotorPart implements Grain {\r
14         private boolean foreEndInhibited = false;\r
15         private boolean aftEndInhibited = false;\r
16         private Amount<Length> length = Amount.valueOf(100, SI.MILLIMETER);\r
17         private Amount<Length> endLight = Amount.valueOf(0, SI.MILLIMETER);\r
18         \r
19         protected int numberOfBurningEnds(Amount<Length> regression){\r
20                 if ( regression.isLessThan(endLight) )\r
21                         return 0;\r
22                 return (foreEndInhibited?0:1) + (aftEndInhibited?0:1);\r
23         }\r
24         \r
25         protected Amount<Length> regressedLength(Amount<Length> regression){\r
26                 if ( regression.isLessThan(endLight) )\r
27                         return length;\r
28                 return length.minus(regression.minus(endLight).times(numberOfBurningEnds(regression)));\r
29         }\r
30 \r
31         public boolean isForeEndInhibited() {\r
32                 return foreEndInhibited;\r
33         }\r
34 \r
35         public void setForeEndInhibited(boolean foreEndInhibited)throws PropertyVetoException {\r
36                 fireVetoableChange("foreEndInhibited", this.foreEndInhibited, foreEndInhibited);\r
37                 boolean old = this.foreEndInhibited;\r
38                 this.foreEndInhibited = foreEndInhibited;\r
39                 firePropertyChange("foreEndInhibited", old, foreEndInhibited);\r
40         }\r
41 \r
42         public boolean isAftEndInhibited() {\r
43                 return aftEndInhibited;\r
44         }\r
45 \r
46         public void setAftEndInhibited(boolean aftEndInhibited) throws PropertyVetoException {\r
47                 fireVetoableChange("aftEndInhibited", this.aftEndInhibited, aftEndInhibited);\r
48                 boolean old = this.aftEndInhibited;\r
49                 this.aftEndInhibited = aftEndInhibited;\r
50                 firePropertyChange("aftEndInhibited", old, aftEndInhibited);\r
51         }\r
52 \r
53         public Amount<Length> getLength() {\r
54                 return length;\r
55         }\r
56 \r
57         public void setLength(Amount<Length> length) throws PropertyVetoException {\r
58                 fireVetoableChange("length", this.length, length);\r
59                 Amount<Length> old = this.length;\r
60                 this.length = length;\r
61                 firePropertyChange("length", old, length);\r
62         }\r
63 }\r