1 package nl
.ru
.des
.sensors
;
3 import java
.util
.Arrays
;
4 import java
.util
.HashSet
;
7 import lejos
.hardware
.sensor
.EV3GyroSensor
;
8 import lejos
.robotics
.SampleProvider
;
10 public class SensorCollector
implements MessageHandler
{
11 public static final int DELAY
= 200;
13 private static final float DANGER_DISTANCE_FRONT
= 0.175f
;
14 private static final float DANGER_DISTANCE_BACK
= 0.035f
;
15 private static final float DANGER_LIGHT
= 0.40f
;
17 private Set
<Integer
> collectedColors
;
20 private EV3GyroSensor gyroSensor
;
21 private SampleProvider ultra
, leftLight
, rightLight
, gyro
;
22 private float[] ultraSamples
, leftLightSamples
, rightLightSamples
, gyroSamples
;
23 private long ultraTime
, leftLightTime
, rightLightTime
, gyroTime
;
27 private boolean leftTouch
, rightTouch
;
28 private float frontUltra
;
30 public SensorCollector(SampleProvider ultra
,
31 SampleProvider leftLight
,
32 SampleProvider rightLight
,
35 this.leftLight
= leftLight
;
36 this.rightLight
= rightLight
;
37 this.gyroSensor
= gyro
;
38 this.gyro
= gyro
.getAngleMode();
39 ultraSamples
= new float[ultra
.sampleSize()];
40 gyroSamples
= new float[gyro
.sampleSize()];
41 leftLightSamples
= new float[leftLight
.sampleSize()];
42 rightLightSamples
= new float[rightLight
.sampleSize()];
43 ultraTime
= System
.currentTimeMillis();
44 leftLightTime
= System
.currentTimeMillis();
45 rightLightTime
= System
.currentTimeMillis();
46 gyroTime
= System
.currentTimeMillis();
51 frontUltra
= Float
.MAX_VALUE
;
52 collectedColors
= new HashSet
<Integer
>();
56 public boolean backDistance(){
57 if(System
.currentTimeMillis()-ultraTime
>DELAY
){
58 ultra
.fetchSample(ultraSamples
, 0);
59 ultraTime
= System
.currentTimeMillis();
61 return ultraSamples
[0]>DANGER_DISTANCE_BACK
;
64 public boolean leftLight(){
65 if(System
.currentTimeMillis()-leftLightTime
>DELAY
){
66 leftLight
.fetchSample(leftLightSamples
, 0);
67 leftLightTime
= System
.currentTimeMillis();
69 return leftLightSamples
[0]>DANGER_LIGHT
;
72 public boolean rightLight(){
73 if(System
.currentTimeMillis()-rightLightTime
>DELAY
){
74 rightLight
.fetchSample(rightLightSamples
, 0);
75 rightLightTime
= System
.currentTimeMillis();
77 return rightLightSamples
[0]>DANGER_LIGHT
;
81 if(System
.currentTimeMillis()-gyroTime
>DELAY
){
82 gyro
.fetchSample(gyroSamples
, 0);
83 gyroTime
= System
.currentTimeMillis();
85 return gyroSamples
[0];
88 public void resetGyro(){
93 public void resetColors(){
94 collectedColors
.clear();
97 public boolean collected(int[] colors
){
98 return collectedColors
.containsAll(Arrays
.asList(colors
));
105 public boolean leftTouch(){
109 public boolean rightTouch(){
113 public boolean frontDistance(){
114 return frontUltra
<DANGER_DISTANCE_FRONT
;
118 public void handleMessage(String m
) {
119 String s
= m
.substring(1);
120 switch(RemoteSensors
.RemoteSensorEnum
.values()[Integer
.valueOf(Character
.toString(m
.charAt(0)))]){
122 color
= Integer
.valueOf(s
);
123 collectedColors
.add(color
);
126 leftTouch
= Integer
.valueOf(s
)==1;
129 rightTouch
= Integer
.valueOf(s
)==1;
132 frontUltra
= Float
.valueOf(s
);