1 package nl
.ru
.des
.sensors
;
3 import java
.util
.HashSet
;
6 import lejos
.hardware
.Button
;
7 import lejos
.hardware
.sensor
.EV3GyroSensor
;
8 import lejos
.robotics
.SampleProvider
;
9 import lejos
.utility
.Delay
;
10 import nl
.ru
.des
.LCDPrinter
;
12 public class SensorCollector
implements MessageHandler
{
13 public static final int DELAY
= 200;
15 private float DANGER_DISTANCE_FRONT
= 0.175f
;
16 private float DANGER_DISTANCE_BACK
= 0.035f
;
17 private float DANGER_LIGHT
= 0.40f
;
19 private Set
<String
> variables
;
22 private EV3GyroSensor gyroSensor
;
23 private SampleProvider ultra
, leftLight
, rightLight
, gyro
;
24 private float[] ultraSamples
, leftLightSamples
, rightLightSamples
, gyroSamples
;
25 private long ultraTime
, leftLightTime
, rightLightTime
, gyroTime
;
29 private boolean leftTouch
, rightTouch
;
30 private float frontUltra
;
32 public SensorCollector(SampleProvider ultra
,
33 SampleProvider leftLight
,
34 SampleProvider rightLight
,
37 this.leftLight
= leftLight
;
38 this.rightLight
= rightLight
;
39 this.gyroSensor
= gyro
;
40 this.gyro
= gyro
.getAngleMode();
41 ultraSamples
= new float[ultra
.sampleSize()];
42 gyroSamples
= new float[gyro
.sampleSize()];
43 leftLightSamples
= new float[leftLight
.sampleSize()];
44 rightLightSamples
= new float[rightLight
.sampleSize()];
46 ultraTime
= System
.currentTimeMillis();
47 leftLightTime
= System
.currentTimeMillis();
48 rightLightTime
= System
.currentTimeMillis();
49 gyroTime
= System
.currentTimeMillis();
54 frontUltra
= Float
.MAX_VALUE
;
55 variables
= new HashSet
<String
>();
59 public void calibrate() {
60 LCDPrinter
.print("Put left light on Blue");
61 Button
.waitForAnyEvent();
63 DANGER_LIGHT
= leftLightSamples
[0];
64 LCDPrinter
.print("Light limit: " + Float
.toString(DANGER_LIGHT
));
67 LCDPrinter
.print("Put left light on Black");
68 Button
.waitForAnyEvent();
70 DANGER_LIGHT
= (leftLightSamples
[0]+DANGER_LIGHT
)/2.0f
;
71 LCDPrinter
.print("Light limit: " + Float
.toString(DANGER_LIGHT
));
74 LCDPrinter
.print("Place back ultra safe");
75 Button
.waitForAnyEvent();
77 DANGER_DISTANCE_BACK
= ultraSamples
[0] + 0.05f
;
78 LCDPrinter
.print("Back ultra limit: " + Float
.toString(DANGER_DISTANCE_BACK
));
81 LCDPrinter
.print("Place front ultra in danger");
82 Button
.waitForAnyEvent();
83 DANGER_DISTANCE_FRONT
= frontUltra
;
84 LCDPrinter
.print("Calibration done");
85 LCDPrinter
.print("Front ultra limit: " + Float
.toString(DANGER_DISTANCE_FRONT
));
89 public boolean backDistance(){
90 if(System
.currentTimeMillis()-ultraTime
>DELAY
){
91 ultra
.fetchSample(ultraSamples
, 0);
92 ultraTime
= System
.currentTimeMillis();
94 return ultraSamples
[0]>DANGER_DISTANCE_BACK
;
97 public boolean leftLight(){
98 if(System
.currentTimeMillis()-leftLightTime
>DELAY
){
99 leftLight
.fetchSample(leftLightSamples
, 0);
100 leftLightTime
= System
.currentTimeMillis();
102 return leftLightSamples
[0]>DANGER_LIGHT
;
105 public boolean rightLight(){
106 if(System
.currentTimeMillis()-rightLightTime
>DELAY
){
107 rightLight
.fetchSample(rightLightSamples
, 0);
108 rightLightTime
= System
.currentTimeMillis();
110 return rightLightSamples
[0]>DANGER_LIGHT
;
114 if(System
.currentTimeMillis()-gyroTime
>DELAY
){
115 gyro
.fetchSample(gyroSamples
, 0);
116 gyroTime
= System
.currentTimeMillis();
118 return gyroSamples
[0];
121 public void resetGyro(){
130 public boolean collected(String var
){
131 return variables
.contains(var
);
134 public void saveVar(String var
) {
142 public boolean leftTouch(){
146 public boolean rightTouch(){
150 public boolean frontDistance(){
151 return frontUltra
<DANGER_DISTANCE_FRONT
;
155 public void handleMessage(String m
) {
156 String s
= m
.substring(1);
157 switch(RemoteSensors
.RemoteSensorEnum
.values()[Integer
.valueOf(Character
.toString(m
.charAt(0)))]){
159 color
= Integer
.valueOf(s
);
162 leftTouch
= Integer
.valueOf(s
)==1;
165 rightTouch
= Integer
.valueOf(s
)==1;
168 frontUltra
= Float
.valueOf(s
);