Implemented finding park space
[des2015.git] / dsl / runtime / src / nl / ru / des / sensors / SensorCollector.java
1 package nl.ru.des.sensors;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 import lejos.hardware.sensor.EV3GyroSensor;
7 import lejos.robotics.SampleProvider;
8
9 public class SensorCollector implements MessageHandler{
10 public static final int DELAY = 200;
11
12 private static final float DANGER_DISTANCE_FRONT = 0.175f;
13 private static final float DANGER_DISTANCE_BACK = 0.035f;
14 private static final float DANGER_LIGHT = 0.40f;
15
16 private Set<String> variables;
17
18 //Local sensors
19 private EV3GyroSensor gyroSensor;
20 private SampleProvider ultra, leftLight, rightLight, gyro;
21 private float[] ultraSamples, leftLightSamples, rightLightSamples, gyroSamples;
22 private long ultraTime, leftLightTime, rightLightTime, gyroTime;
23
24 //Remote sensors
25 private int color;
26 private boolean leftTouch, rightTouch;
27 private float frontUltra;
28
29 public SensorCollector(SampleProvider ultra,
30 SampleProvider leftLight,
31 SampleProvider rightLight,
32 EV3GyroSensor gyro){
33 this.ultra = ultra;
34 this.leftLight = leftLight;
35 this.rightLight = rightLight;
36 this.gyroSensor = gyro;
37 this.gyro = gyro.getAngleMode();
38 ultraSamples = new float[ultra.sampleSize()];
39 gyroSamples = new float[gyro.sampleSize()];
40 leftLightSamples = new float[leftLight.sampleSize()];
41 rightLightSamples = new float[rightLight.sampleSize()];
42 ultraTime = System.currentTimeMillis();
43 leftLightTime = System.currentTimeMillis();
44 rightLightTime = System.currentTimeMillis();
45 gyroTime = System.currentTimeMillis();
46
47 color = -1;
48 leftTouch = false;
49 rightTouch = false;
50 frontUltra = Float.MAX_VALUE;
51 variables = new HashSet<String>();
52 }
53
54 //Local sensors
55 public boolean backDistance(){
56 if(System.currentTimeMillis()-ultraTime>DELAY){
57 ultra.fetchSample(ultraSamples, 0);
58 ultraTime = System.currentTimeMillis();
59 }
60 return ultraSamples[0]>DANGER_DISTANCE_BACK;
61 }
62
63 public boolean leftLight(){
64 if(System.currentTimeMillis()-leftLightTime>DELAY){
65 leftLight.fetchSample(leftLightSamples, 0);
66 leftLightTime = System.currentTimeMillis();
67 }
68 return leftLightSamples[0]>DANGER_LIGHT;
69 }
70
71 public boolean rightLight(){
72 if(System.currentTimeMillis()-rightLightTime>DELAY){
73 rightLight.fetchSample(rightLightSamples, 0);
74 rightLightTime = System.currentTimeMillis();
75 }
76 return rightLightSamples[0]>DANGER_LIGHT;
77 }
78
79 public float gyro(){
80 if(System.currentTimeMillis()-gyroTime>DELAY){
81 gyro.fetchSample(gyroSamples, 0);
82 gyroTime = System.currentTimeMillis();
83 }
84 return gyroSamples[0];
85 }
86
87 public void resetGyro(){
88 gyroSensor.reset();
89 }
90
91 //Remote sensors
92 public void reset(){
93 variables.clear();
94 }
95
96 public boolean collected(String var){
97 return variables.contains(var);
98 }
99
100 public void saveVar(String var) {
101 variables.add(var);
102 }
103
104 public int color(){
105 return color;
106 }
107
108 public boolean leftTouch(){
109 return leftTouch;
110 }
111
112 public boolean rightTouch(){
113 return rightTouch;
114 }
115
116 public boolean frontDistance(){
117 return frontUltra<DANGER_DISTANCE_FRONT;
118 }
119
120 @Override
121 public void handleMessage(String m) {
122 String s = m.substring(1);
123 switch(RemoteSensors.RemoteSensorEnum.values()[Integer.valueOf(Character.toString(m.charAt(0)))]){
124 case COLOR:
125 color = Integer.valueOf(s);
126 break;
127 case LEFT:
128 leftTouch = Integer.valueOf(s)==1;
129 break;
130 case RIGHT:
131 rightTouch = Integer.valueOf(s)==1;
132 break;
133 case ULTRA:
134 frontUltra = Float.valueOf(s);
135 break;
136 }
137 }
138 }