Statistics
| Branch: | Tag: | Revision:

amiro-os / devices / DiWheelDrive / amiro_map.cpp @ a07a7a1c

History | View | Annotate | Download (1.395 KB)

1 e1f1c4b5 galberding
#include "amiro_map.hpp"
2 a07a7a1c galberding
#include <cstdint>
3 e1f1c4b5 galberding
4
5 b8b3a9c9 galberding
void AmiroMap::initialize(uint8_t (&config)[MAX_NODES][NODE_ATTRIBUTES]){
6 e1f1c4b5 galberding
7 b8b3a9c9 galberding
  // Clear old values in case the map is initialized again
8 a07a7a1c galberding
  uint8_t visitTable[MAX_NODES];
9 b8b3a9c9 galberding
  this->current = 0;
10
  this->next = 0;
11
  this->valid = false;
12 e1f1c4b5 galberding
13 b8b3a9c9 galberding
  // convert proto map to internal representation
14 e1f1c4b5 galberding
  for (int i=0; i<MAX_NODES; i++){
15 b8b3a9c9 galberding
    if(config[i][2] == 0xff && i != 0){
16 e1f1c4b5 galberding
      break;
17 b8b3a9c9 galberding
    } else if (config[i][2] == 0xff && i == 0) {
18
      this->valid = false;
19
      return;
20 e1f1c4b5 galberding
    }
21
22 b8b3a9c9 galberding
    //look for start node (default is Node 0)
23
    if (config[i][2] == 1 ) {
24
      this->current= i;
25
    }
26 e1f1c4b5 galberding
27 b8b3a9c9 galberding
    this->nodeList[i].id = i;
28
    this->nodeList[i].left = config[i][0];
29
    this->nodeList[i].right = config[i][1];
30
    this->nodeList[i].flag = config[i][2];
31
    this->nodeCount++;
32
  }
33 e1f1c4b5 galberding
34 b8b3a9c9 galberding
  // TODO make validity check
35 a07a7a1c galberding
  bool all_visited = true;
36
  for (int j=0; j<nodeCount; j++) {
37
    visitNode(j);
38
    for (int k = 0; k < nodeCount; k++) {
39
      if (nodeList[k].visited == 1) {
40
        nodeList[k].visited = 0;
41
      } else {
42
        this->valid = false;
43
        return;
44
      }
45
    }
46
  }
47 e1f1c4b5 galberding
48 a07a7a1c galberding
  this->valid = true;
49
}
50 e1f1c4b5 galberding
51 a07a7a1c galberding
void AmiroMap::visitNode(uint8_t id){
52
  if (this->nodeList[id].visited > 0){
53
    return;
54
  }else{
55
    nodeList[id].visited++;
56
    visitNode(this->nodeList[id].left);
57
    visitNode(this->nodeList[id].right);
58
  }
59 e1f1c4b5 galberding
}
60
61 a07a7a1c galberding
62 b8b3a9c9 galberding
void AmiroMap::update(bool left, bool right, LineFollowStrategy strategy) {
63 e1f1c4b5 galberding
64
}