root / trunk / code / projects / traffic_navigation / highways.c @ 1992
History | View | Annotate | Download (1.97 KB)
1 | 1876 | markwill | #include "highways.h" |
---|---|---|---|
2 | 1966 | alevkoy | #include "../linefollowing/lineDrive.h" |
3 | 1876 | markwill | #include <dragonfly_lib.h> |
4 | 1890 | markwill | |
5 | 1966 | alevkoy | static int changeLanes(void); // declared here to preserve static status |
6 | |||
7 | 1902 | markwill | int counti =0; |
8 | long averagei = 0; |
||
9 | int states = 0; |
||
10 | 1877 | markwill | int canMerge = 1; |
11 | 1899 | markwill | |
12 | 1890 | markwill | void highwayStart(){
|
13 | canMerge = 1;
|
||
14 | } |
||
15 | 1966 | alevkoy | |
16 | static int changeLanes() |
||
17 | { |
||
18 | 1899 | markwill | if(counti<10000){ |
19 | counti++; |
||
20 | motor_r_set(FORWARD,232);
|
||
21 | motor_l_set(FORWARD,200);
|
||
22 | return 0; |
||
23 | } |
||
24 | int colours[5]; |
||
25 | updateLine(colours); |
||
26 | int pos = lineLocate(colours);
|
||
27 | if(pos >= 3 || pos <= -3){ |
||
28 | motor_r_set(FORWARD,187);
|
||
29 | motor_l_set(FORWARD,190);
|
||
30 | return 0; |
||
31 | } |
||
32 | counti = 0;
|
||
33 | return 1; |
||
34 | } |
||
35 | 1966 | alevkoy | |
36 | 1890 | markwill | int highwayFSM(){
|
37 | 1877 | markwill | switch(states){
|
38 | |||
39 | case 0: // Normal Drive |
||
40 | 1890 | markwill | { |
41 | 1899 | markwill | int theCode = doDrive(205); |
42 | 1900 | markwill | if(theCode != NORMAL && theCode >= 0) |
43 | 1890 | markwill | return theCode;
|
44 | 1900 | markwill | int range = range_read_distance(IR3);
|
45 | 1877 | markwill | usb_puti(range); |
46 | usb_puts(" : ");
|
||
47 | usb_puti(averagei); |
||
48 | usb_puts("\r\n");
|
||
49 | 1969 | azl | #ifdef ORB_HIGHWAY
|
50 | 1899 | markwill | orb1_set_color(CYAN); |
51 | 1969 | azl | #endif
|
52 | 1877 | markwill | if(range == -1){ |
53 | 1900 | markwill | range = PASS_DISTANCE+50;
|
54 | 1877 | markwill | } |
55 | counti ++; |
||
56 | averagei += range; |
||
57 | if(counti>= COUNT_MAX){
|
||
58 | if(averagei / COUNT_MAX < PASS_DISTANCE && canMerge)
|
||
59 | states = 1;
|
||
60 | averagei = 0;
|
||
61 | counti = 0;
|
||
62 | } |
||
63 | break;
|
||
64 | 1890 | markwill | } |
65 | case 1: |
||
66 | 1877 | markwill | states = 2;
|
67 | canMerge = 0;
|
||
68 | 1890 | markwill | case 2: |
69 | 1899 | markwill | if(changeLanes()){
|
70 | states = 0;
|
||
71 | 1969 | azl | #ifdef ORB_HIGHWAY
|
72 | 1899 | markwill | orb1_set_color(GREEN); |
73 | 1969 | azl | #endif
|
74 | 1899 | markwill | } |
75 | 1969 | azl | #ifdef ORB_HIGHWAY
|
76 | 1899 | markwill | else orb1_set_color(YELLOW);
|
77 | 1969 | azl | #endif
|
78 | 1877 | markwill | break;
|
79 | } |
||
80 | 1890 | markwill | return 0; |
81 | 1877 | markwill | } |
82 | |||
83 | /*
|
||
84 | 1876 | markwill | void driveHighway( void ){
|
85 | doDrive(200);
|
||
86 | int range = range_read_distance(IR2);
|
||
87 | usb_puti(range);
|
||
88 | usb_puts(" : ");
|
||
89 | usb_puti(average);
|
||
90 | usb_puts("\r\n");
|
||
91 | if(range == -1){
|
||
92 | return;
|
||
93 | }
|
||
94 | |||
95 | count ++;
|
||
96 | average += range;
|
||
97 | if(count >= COUNT_MAX){
|
||
98 | if(state[0] != MERGELEFT){
|
||
99 | 1969 | azl | #ifdef ORB_HIGHWAY
|
100 | 1876 | markwill | orb1_set_color(ORANGE);
|
101 | 1969 | azl | #endif
|
102 | 1876 | markwill | if(average / COUNT_MAX < PASS_DISTANCE){
|
103 | merge(ILEFT);
|
||
104 | usb_puts("MERGE \r\n");
|
||
105 | }
|
||
106 | }
|
||
107 | 1877 | markwill | |
108 | 1876 | markwill | count =0;
|
109 | average = 0;
|
||
110 | }
|
||
111 | 1969 | azl | #ifdef ORB_HIGHWAY
|
112 | 1876 | markwill | //else orb1_set_color(GREEN);
|
113 | 1969 | azl | #endif
|
114 | 1876 | markwill | }
|
115 | 1877 | markwill | */ |