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