Statistics
| Branch: | Tag: | Revision:

amiro-os / devices / DiWheelDrive / userthread.hpp @ a0033dcb

History | View | Annotate | Download (3.348 KB)

1 58fe0e0b Thomas Schöpping
#ifndef AMIRO_USERTHREAD_H_
2
#define AMIRO_USERTHREAD_H_
3
4
#include <ch.hpp>
5
#include <amiroosconf.h>
6 181f2892 galberding
#include <amiro/Color.h>
7 05d54823 galberding
8 181f2892 galberding
9
// Speed when driving towards the docking station
10
#define CHARGING_SPEED 5
11 61544eee galberding
#define DETECTION_SPEED 10
12
#define DIST_THRESH 100
13
#define RELEASE_COUNT 200
14 181f2892 galberding
// Thresh to determain how much update steps should pass while alining
15 61544eee galberding
#define MAX_CORRECTION_STEPS 300
16 181f2892 galberding
// Thresh for wheel proxy sensors, when summed values fall below the state changes
17
#define PROXY_WHEEL_THRESH 18000
18 e2002d0e galberding
// Thresh for detecting obsticles
19 61544eee galberding
#define PROXY_RING_THRESH 15000
20 27d4e1fa galberding
21 fbcb25cc galberding
#define PUSH_BACK_COUNT 5
22 181f2892 galberding
// Thresh for how long (update steps) the front sensors are allowed to detect white
23 61544eee galberding
#define WHITE_COUNT_THRESH 150
24 181f2892 galberding
// Rotation around 180 degrees in microradian
25
#define ROTATION_180 3141592
26
// Rotation around -20 degrees in microradian
27
#define ROTATION_20 -349065
28
#define ROTATION_DURATION 10000
29
30 61544eee galberding
#define RING_PROX_FRONT_THRESH 18000
31
#define PROX_MAX_VAL 65430
32 58fe0e0b Thomas Schöpping
33 27d4e1fa galberding
// Threshold for failing to dock
34
#define DOCKING_ERROR_THRESH 4
35
36 58fe0e0b Thomas Schöpping
namespace amiro {
37
38 181f2892 galberding
39 58fe0e0b Thomas Schöpping
class UserThread : public chibios_rt::BaseStaticThread<USER_THREAD_STACK_SIZE>
40
{
41 181f2892 galberding
42
  // Messages which can be received and trigger state changes
43
  public:
44
    enum msg_content{
45
      STOP, 
46
      START,
47
      EDGE_LEFT,
48
      EDGE_RIGHT,
49
      FUZZY,
50
      DOCK,
51
      UNDOCK,
52
      CHARGE
53
    };
54
55
    // States of user thread state machine
56 27d4e1fa galberding
    enum states : uint8_t{
57
      IDLE                = 0,
58
      FOLLOW_LINE         = 1,
59
      DETECT_STATION      = 2,
60
      REVERSE             = 3,
61
      PUSH_BACK           = 4,
62
      CHECK_POSITIONING   = 5,
63
      CHECK_VOLTAGE       = 6,
64
      CHARGING            = 7,
65
      RELEASE             = 8,
66
      RELEASE_TO_CORRECT  = 9,
67
      CORRECT_POSITIONING = 10,
68 fbcb25cc galberding
      ERROR               = 11,
69
      TURN                =12
70 181f2892 galberding
    };
71
72 27d4e1fa galberding
  struct ut_counter{
73
      int whiteCount = 0;
74
      int proxyCount = 0;
75 fbcb25cc galberding
      // int correctionCount = 0;
76 27d4e1fa galberding
      int errorCount = 0;
77 fbcb25cc galberding
      int idleCount = 0;
78
      int stepCount = 0;
79 27d4e1fa galberding
  };
80 181f2892 galberding
81 27d4e1fa galberding
  // static const struct ut_counter emptyUtCount;
82
  ut_counter utCount;
83 181f2892 galberding
84 58fe0e0b Thomas Schöpping
  explicit UserThread();
85
86
  virtual ~UserThread();
87
88
  virtual msg_t main();
89 181f2892 galberding
90
private:
91
  void setRpmSpeed(const int (&rpmSpeed)[2]);
92 c9fa414d galberding
  void setRpmSpeedFuzzy(const int (&rpmSpeed)[2]);
93 181f2892 galberding
  void lightOneLed(Color color, int idx);
94
  void lightAllLeds(Color color);
95
  /**
96
   * Uses light ring indicate the state of charge.
97
   */
98
  void showChargingState();
99
  void checkForMotion();
100
  bool checkPinVoltage();
101
  bool checkPinEnabled();
102 c9fa414d galberding
  int getProxyRingSum();
103 fbcb25cc galberding
  
104
  /**
105
   * Returns true when front sensors reaching high values
106
   * and all others are low. This indicates that the loading station is ahead.
107
   * If other sensores are blocked too, indicates that someone grabs the robot.
108
   */
109
  bool checkFrontalObject();
110 c9fa414d galberding
111 fbcb25cc galberding
  states utState = states::IDLE;
112
  states newState = states::IDLE;
113
  bool continue_on_obstacle = true;
114 181f2892 galberding
  /**
115
   * Check if current position changes when the wheel are deactivated.
116
   * 
117
   * When AMiRo drives towards the loading station, it stops when a specific marker is reached.
118
   * In order to validate that the AMiRo is correctly positioned in the loading station
119
   * the wheels are turned off. When the position remains the same the docking procedure
120
   * was successful (return 1) otherwise a correction is needed (return 0). 
121
   */
122
  int checkDockingSuccess();
123 58fe0e0b Thomas Schöpping
};
124
125
} // end of namespace amiro
126
127
#endif // AMIRO_USERTHREAD_H_