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