summaryrefslogtreecommitdiffstats
path: root/Sensors.c
blob: ffbdb960796fd2d68f0da443d6afc2d38a9f8043 (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
#include "qfixSoccerBoard.h"
#include "Global.h"
#include "Sensors.h"


void Sensor::update() {
  m_board->analog(m_port);
  m_board->analog(m_port);
  m_wert = m_board->analog(m_port);
}



void Sensors::update() {
  m_lsLinks->update();
  m_lsMitte->update();
  m_lsRechts->update();
  
  m_dsL->update();
  m_dsVL->update();
  m_dsV->update();
  m_dsVR->update();
  m_dsR->update();
}

bool Sensors::kalibrieren() {
  int links = m_lsLinks->getWert();
  int mitte = m_lsMitte->getWert();
  int rechts = m_lsRechts->getWert();
  
  int weiss = (rechts + links) / 2;
  int diff = mitte - weiss;
  
  
  if(links > mitte || rechts > mitte) return false;
  
  if(diff < KALI_MINDIFF) return false;
  if(abs(rechts - links) > KALI_WEISSMAXDIFF) return false;
  
  if(!m_kalibriert) {
    m_gw_sg = mitte - diff/8;
    m_gw_gw = weiss + diff/8;
    m_gw_ws = weiss - diff/8;
    m_gw_sw = weiss + diff/2;
    
    m_kalibriert = true;
  }
  else {
    m_gw_sg = m_gw_sg/2 + mitte/2 - diff/16;
    m_gw_gw = m_gw_gw/2 + weiss/2 + diff/16;
    m_gw_ws = m_gw_ws/2 + weiss/2 - diff/16;
    m_gw_sw = m_gw_sw/2 + weiss/2 + diff/4;
  }
  
  return true;
}

void Sensors::auswerten() {
  // Linie
  m_liniePos = int(SW_SCHWARZ(m_lsRechts)) - int(SW_SCHWARZ(m_lsLinks)); //Linie links oder rechts -> -1 oder 1, beides oder keines -> 0
  m_liniePos *= (1+int(SW_WEISS(m_lsMitte))); //Kurvenstärke bestimmen
  
  if((!m_liniePos) && SW_WEISS(m_lsMitte)) //alles weiß?
    m_liniePos = LINIE_WEISS;
  
  if(SW_SCHWARZ(m_lsLinks) && SW_SCHWARZ(m_lsRechts)) // beide äußeren schwarz? -> fehler
    m_liniePos = LINIE_FEHLER;
  
  
  // Opfer
  if(m_sLinks) m_sLinks--;
  if(m_sMitte) m_sMitte--;
  if(m_sRechts) m_sRechts--;
  
  if(m_gLinks) m_gLinks--;
  if(m_gMitte) m_gMitte--;
  if(m_gRechts) m_gRechts--;
  
  if(C_SILBER(m_lsLinks)) m_sLinks = OPFER_TIMEOUT;
  if(C_SILBER(m_lsMitte)) m_sMitte = OPFER_TIMEOUT;
  if(C_SILBER(m_lsRechts)) m_sRechts = OPFER_TIMEOUT;
  
  if(C_GRUEN(m_lsLinks)) m_gLinks = OPFER_TIMEOUT;
  if(C_GRUEN(m_lsMitte)) m_gMitte = OPFER_TIMEOUT;
  if(C_GRUEN(m_lsRechts)) m_gRechts = OPFER_TIMEOUT;
}