summaryrefslogtreecommitdiffstats
path: root/Sensors.h
blob: 54e3d4bc3e43ee70762ef82d30dab77046bb17c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#ifndef _ROBOCUP_SENSORS_H_
#define _ROBOCUP_SENSORS_H_

#include "qfixSoccerBoard.h"

#define SENSOR_PORT_LINIE_LINKS		0
#define SENSOR_PORT_LINIE_MITTE		1
#define SENSOR_PORT_LINIE_RECHTS	2

#define SENSOR_PORT_D_L		3
#define SENSOR_PORT_D_VL	4
#define SENSOR_PORT_D_V		5
#define SENSOR_PORT_D_VR	6
#define SENSOR_PORT_D_R		7

#define LINIE_WEISS 70
#define LINIE_FEHLER 71

#define SW_SCHWARZ(sensor) (sensor->getWert() > m_gw_sw)
#define SW_WEISS(sensor) (sensor->getWert() <= m_gw_sw)

#define C_SCHWARZ(sensor) (sensor->getWert() > m_gw_sg)
#define C_GRUEN(sensor) (sensor->getWert() > m_gw_gw && sensor->getWert() <= m_gw_sg)
#define C_WEISS(sensor) (sensor->getWert() > m_gw_ws && sensor->getWert() <= m_gw_gw)
#define C_SILBER(sensor) (sensor->getWert() <= m_gw_ws)


class Sensor {
 private:
  SoccerBoard *m_board;
  int m_port;
  int m_wert;
  
 public:
  Sensor(SoccerBoard *board, int port) {
    m_board = board;
    m_port = port;
  }
  
  void update();

  int getWert() {
    return m_wert;
  }
};


class Sensors {
 private:
  SoccerBoard *m_board;
  
  bool m_kalibriert;

  Sensor *m_lsLinks, *m_lsMitte, *m_lsRechts;
  int m_sLinks, m_sMitte, m_sRechts;
  int m_gLinks, m_gMitte, m_gRechts;
  int m_liniePos;
  
  int m_gw_sg;          // Grenzwert schwarz/grün
  int m_gw_gw;          // Grenzwert grün/weiß
  int m_gw_ws;          // Grenzwert weiß/silber
  int m_gw_sw;          // Grenzwert schwarz/weiß
  
  Sensor *m_dsL, *m_dsVL, *m_dsV, *m_dsVR, *m_dsR;
 public:
  Sensors(SoccerBoard *board) {
    m_board = board;
    
    m_kalibriert = false;
  
    m_lsLinks = new Sensor(board, SENSOR_PORT_LINIE_LINKS);
    m_lsMitte = new Sensor(board, SENSOR_PORT_LINIE_MITTE);
    m_lsRechts = new Sensor(board, SENSOR_PORT_LINIE_RECHTS);
    
    m_dsL = new Sensor(board, SENSOR_PORT_D_L);
    m_dsVL = new Sensor(board, SENSOR_PORT_D_VL);
    m_dsV = new Sensor(board, SENSOR_PORT_D_V);
    m_dsVR = new Sensor(board, SENSOR_PORT_D_VR);
    m_dsR = new Sensor(board, SENSOR_PORT_D_R);
    
    m_sLinks = m_sMitte = m_sRechts = 0;
    m_gLinks = m_gMitte = m_gRechts = 0;

    m_liniePos = 0;
  }

  ~Sensors() {
    delete m_lsLinks;
    delete m_lsMitte;
    delete m_lsRechts;
    
    delete m_dsL;
    delete m_dsVL;
    delete m_dsV;
    delete m_dsVR;
    delete m_dsR;
  }
  
  int getLinie() {return m_liniePos;}
  bool getOpfer() {
    return /*(m_sLinks && m_sMitte && m_sRechts) || */(m_gLinks && m_gMitte && m_gRechts);
  }  
  
  bool hindernisL() {
    return (m_dsL->getWert() > HINDERNIS_ERKENNUNGSWERT_SEITL);
  }
  
  bool hindernisVL() {
    return (m_dsVL->getWert() > HINDERNIS_ERKENNUNGSWERT);
  }
  
  bool hindernisV() {
    return (m_dsV->getWert() > HINDERNIS_ERKENNUNGSWERT);
  }
  
  bool hindernisVR() {
    return (m_dsVR->getWert() > HINDERNIS_ERKENNUNGSWERT);
  }
  
  bool hindernisR() {
    return m_dsR->getWert();
  }
  
  int getDsL() {
    return m_dsL->getWert();
  }
  
  int getDsVL() {
    return m_dsVL->getWert();
  }
  
  int getDsV() {
    return m_dsV->getWert();
  }
  
  int getDsVR() {
    return m_dsVR->getWert();
  }
  
  int getDsR() {
    return m_dsR->getWert();
  }
  
  void update();
  void auswerten();
  bool kalibrieren();
};

#endif