@@ -30,13 +30,23 @@ public class EMAddPointsUnit : GleUnit
30
30
[ PortLabelHidden ]
31
31
public ControlInput InputTrigger ;
32
32
33
+ [ DoNotSerialize ]
34
+ public ValueInput blockPoints { get ; private set ; }
35
+
36
+ [ DoNotSerialize ]
37
+ public ValueInput positions { get ; private set ; }
38
+
33
39
[ DoNotSerialize ]
34
40
public ValueInput duration { get ; private set ; }
35
41
36
42
[ DoNotSerialize ]
37
43
[ PortLabel ( "Unscaled" ) ]
38
44
public ValueInput unscaledTime { get ; private set ; }
39
45
46
+ [ DoNotSerialize ]
47
+ [ PortLabelHidden ]
48
+ public ControlOutput OutputTrigger ;
49
+
40
50
[ DoNotSerialize ]
41
51
public ControlOutput started ;
42
52
@@ -53,17 +63,21 @@ public class EMAddPointsUnit : GleUnit
53
63
[ PortLabel ( "Point Value" ) ]
54
64
public ValueOutput OutputPointValue { get ; private set ; }
55
65
56
- private Bool running = false ;
66
+ private static string VARIABLE_EM_SCORE_MOTOR = "EM_SCORE_MOTOR" ;
57
67
58
68
protected override void Definition ( )
59
69
{
60
70
InputTrigger = ControlInputCoroutine ( nameof ( InputTrigger ) , Process ) ;
61
71
62
72
pointValue = ValueInput ( nameof ( pointValue ) , 0 ) ;
63
73
64
- duration = ValueInput ( nameof ( duration ) , .750f ) ;
74
+ blockPoints = ValueInput ( nameof ( blockPoints ) , true ) ;
75
+ positions = ValueInput ( nameof ( positions ) , 6 ) ;
76
+ duration = ValueInput ( nameof ( duration ) , 750 ) ;
65
77
unscaledTime = ValueInput ( nameof ( unscaledTime ) , false ) ;
66
78
79
+ OutputTrigger = ControlOutput ( nameof ( OutputTrigger ) ) ;
80
+
67
81
started = ControlOutput ( nameof ( started ) ) ;
68
82
stopped = ControlOutput ( nameof ( stopped ) ) ;
69
83
@@ -74,22 +88,17 @@ protected override void Definition()
74
88
75
89
private IEnumerator Process ( Flow flow )
76
90
{
77
- if ( running ) {
78
- var points = flow . GetValue < int > ( pointValue ) ;
91
+ var running = false ;
79
92
80
- Debug . Log ( $ "Score motor is already running. Ignoring { points } point(s).") ;
81
-
82
- yield return null ;
93
+ if ( Variables . Application . IsDefined ( VARIABLE_EM_SCORE_MOTOR ) ) {
94
+ running = Variables . Application . Get < bool > ( VARIABLE_EM_SCORE_MOTOR ) ;
83
95
}
84
- else {
85
- Debug . Log ( "Starting score motor" ) ;
86
-
87
- yield return started ;
88
96
89
- running = true ;
97
+ yield return OutputTrigger ;
90
98
91
- var points = flow . GetValue < int > ( pointValue ) ;
99
+ var points = flow . GetValue < int > ( pointValue ) ;
92
100
101
+ if ( points > 0 ) {
93
102
var pulses =
94
103
( points % 100000 == 0 ) ? points / 100000 :
95
104
( points % 10000 == 0 ) ? points / 10000 :
@@ -98,34 +107,57 @@ private IEnumerator Process(Flow flow)
98
107
( points % 10 == 0 ) ? points / 10 :
99
108
points ;
100
109
101
- var pointsPerPulse = points / pulses ;
110
+ if ( pulses == 1 ) {
111
+ if ( ! running || ( running && ! flow . GetValue < bool > ( blockPoints ) ) ) {
112
+ Debug . Log ( $ "Single pulse triggering with { points } points") ;
102
113
103
- var seconds = flow . GetValue < float > ( duration ) / 6 ;
104
- var realtime = flow . GetValue < bool > ( unscaledTime ) ;
114
+ flow . SetValue ( OutputPointValue , points ) ;
105
115
106
- for ( int loop = 0 ; loop < 6 ; loop ++ ) {
107
- var outputPoints = loop < pulses ? pointsPerPulse : 0 ;
116
+ yield return pulse ;
117
+ }
118
+ }
119
+ else if ( running )
120
+ {
121
+ Debug . Log ( $ "Score motor is already running.") ;
122
+ }
123
+ else {
124
+ Debug . Log ( "Starting score motor" ) ;
108
125
109
- Debug . Log ( $ "Pulse { loop + 1 } of 6 - waiting { seconds } and triggering with { outputPoints } points") ;
126
+ Variables . Application . Set ( VARIABLE_EM_SCORE_MOTOR , true ) ;
127
+
128
+ yield return started ;
110
129
111
- if ( realtime ) {
112
- yield return new WaitForSecondsRealtime ( seconds ) ;
113
- }
114
- else {
115
- yield return new WaitForSeconds ( seconds ) ;
116
- }
130
+ var motorPositions = flow . GetValue < int > ( positions ) ;
131
+
132
+ var delay = ( flow . GetValue < float > ( duration ) / 1000f ) / motorPositions ;
133
+ var realtime = flow . GetValue < bool > ( unscaledTime ) ;
134
+
135
+ var pointsPerPulse = points / pulses ;
117
136
118
- flow . SetValue ( OutputPointValue , outputPoints ) ;
137
+ for ( int loop = 0 ; loop < motorPositions ; loop ++ ) {
138
+ var outputPoints = loop < pulses ? pointsPerPulse : 0 ;
119
139
120
- yield return pulse ;
121
- }
140
+ Debug . Log ( $ "Pulse { loop + 1 } of { motorPositions } - waiting { delay } ms and triggering with { outputPoints } points") ;
141
+
142
+ if ( realtime ) {
143
+ yield return new WaitForSecondsRealtime ( delay ) ;
144
+ }
145
+ else {
146
+ yield return new WaitForSeconds ( delay ) ;
147
+ }
148
+
149
+ flow . SetValue ( OutputPointValue , outputPoints ) ;
150
+
151
+ yield return pulse ;
152
+ }
122
153
123
- Debug . Log ( "Stopping score motor" ) ;
154
+ Debug . Log ( "Stopping score motor" ) ;
124
155
125
- running = false ;
156
+ Variables . Application . Set ( VARIABLE_EM_SCORE_MOTOR , false ) ;
126
157
127
- yield return stopped ;
128
- }
158
+ yield return stopped ;
159
+ }
160
+ }
129
161
}
130
162
}
131
163
}
0 commit comments