Project

General

Profile

Statistics
| Branch: | Revision:

root / scout / libscout / src / behaviors / lineDrive.cpp @ 9295436d

History | View | Annotate | Download (3.08 KB)

1
/**
2
 * @file lineDrive.cpp
3
 *
4
 * Provides functions to implement line driving behavior.  This program extends
5
 * the behavior of the line-following program by following lines automatically
6
 * and implementing behaviors to deal with commands passed to lineDrive.
7
 *
8
 * Specific implementation for the colony scout robots in a warehouse behaviour
9
 * setting.
10
 * 
11
 * @author James Carroll(キヤロル)
12
 * Cannabalized from Dan Jacobs code.
13
 * @date 2-6-2012
14
 */
15

    
16
#include "lineDrive.h"
17

    
18
int state[5];       //! Stores a queue of sub-commands to be executed
19
int stateCounter;
20
int stateLength;
21

    
22
//! Whether lineDrive is currently paused. Set to 0 on initialization.
23
int stopped=1;
24

    
25

    
26
/**
27
 * Starts the line following procedure. Must be called before other
28
 * line-following functions will work.  This function essentially resets the
29
 * state of line-following.
30
 */
31
void lineDrive_init()
32
{
33
        lineFollow_init();
34
        for(int i=0; i<5; i++)state[i]=0;
35
        stateCounter=0;
36
        stateLength=0;
37
        stopped=0;
38
}
39

    
40

    
41
/**
42
 * Follows a line and executes whatever command is next on the queue.
43
 * @param speed The speed with which to drive along the line.
44
 */
45
int doDrive(int speed)
46
{
47
        if(stopped)
48
        {
49
                motors->set_sides(0,0,ABSOLUTE);
50
                return NORMAL;
51
        }
52

    
53

    
54
        int code;
55
        switch(state[0])
56
        {        
57
                case ISTRAIGHT:
58
                        code = lineFollow(speed);
59
                        if(code==INTERSECTION)
60
                        {
61
                                for(int i=0; i<4; i++) state[i]=state[i+1];
62
                                state[4]=0;
63
                                if(state[0]==0)stateCounter++;
64
                                break;
65
                        }
66
                        else if(code==NOBARCODE) return NORMAL;
67
                        return code;
68
        
69
        
70
                case ILEFT:
71
                        code = turnLeft();
72
                        if(code==0)
73
                        {
74
                                state[0]=0;
75
                                stateCounter++;
76
                        }
77
                        break;
78
        
79
                case IRIGHT:
80
                        code = turnRight();
81
                        if(code==0)
82
                        {
83
                                state[0]=0;
84
                                stateCounter++;
85
                        }
86
                        break;
87
        
88
        
89
                default:
90
                        return LOST;
91

    
92
        }
93

    
94
        if(stateCounter>=stateLength)
95
        {
96
                stateCounter=stateLength=0;
97
                return FINISHED;
98
        }
99
        return NORMAL;
100
}
101

    
102

    
103
/** Starts the line-drive process if paused. */
104
void start(void){
105
        stopped=0;
106
}
107

    
108
/** Pauses the line-drive process. Default is started. */
109
void stop(void){
110
        stopped=1;
111
}
112

    
113

    
114

    
115
/**
116
 * Executes an intersection turn where the intersection type is specified by the
117
 * parameters. 
118
 * @param type A valid defined intersection type
119
 * @param dir The direction to turn at the intersection
120
 */
121
int turn(int type, int dir)
122
{
123
        if(stateLength!=0)
124
                return ERROR;
125

    
126
        //turns that don't depend on what kind of road your on
127
        if(dir==ISTRAIGHT)
128
        {
129
                stateLength++;
130
                state[1]=ISTRAIGHT;
131
                return NORMAL;
132
        }
133
        if(dir==IUTURN)
134
            {
135
                stateLength+=2;
136
                state[1]=state[2]=ILEFT;
137
                return NORMAL;
138
            }
139

    
140
        if(type==ON_ROAD)
141
        {
142
                if(dir==IRIGHT){
143
                        stateLength++;
144
                        state[1] = IRIGHT;
145
                        return NORMAL;
146
                }
147
                if(dir==ILEFT){
148
                        stateLength += 2;
149
                        state[1] = ILEFT;
150
                        state[2] = ISTRAIGHT;
151
                        return NORMAL
152
                }
153
        }
154
        if(type==OFF_ROAD)
155
        {
156
                if(dir==IRIGHT){
157
                        stateLength++;
158
                        state[1]=IRIGHT;
159
                        return NORMAL;
160
                }
161
                if(dir==ILEFT){
162
                        stateLength+=2;
163
                        state[1]=ISTRAIGHT;
164
                        state[2]=ILEFT;
165
                }
166
        }
167

    
168
        //Should never get here
169
        return ERROR;
170
}
171