Subversion Repositories NaviCtrl

Rev

Rev 278 | Rev 283 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 278 Rev 280
Line 59... Line 59...
59
#include "91x_lib.h"
59
#include "91x_lib.h"
60
#include "waypoints.h"
60
#include "waypoints.h"
61
#include "uart1.h"
61
#include "uart1.h"
Line 62... Line 62...
62
 
62
 
63
// the waypoints list
63
// the waypoints list
Line 64... Line 64...
64
#define WPLISTLEN 31
64
#define MAX_LIST_LEN 31
65
 
65
 
66
Waypoint_t WPList[WPLISTLEN];
66
Point_t PointList[MAX_LIST_LEN];
-
 
67
u8 WPIndex = 0;         // list index of GPS point representig the current WP, can be maximal WPCount
67
u8 WPIndex = 0;         // list index of GPS point representig the current WP, can be maximal WPNumber
68
u8 POIIndex = 0;        // list index of GPS Point representing the current POI, can be maximal WPCount
Line -... Line 69...
-
 
69
u8 WPCount = 0;         // number of waypoints
-
 
70
u8 PointCount = 0;              // number of wp in the list can be maximal equal to MAX_LIST_LEN
68
u8 POIIndex = 0;        // list index of GPS Point representing the current POI, can be maximal WPNumber
71
 
69
u8 WPNumber = 0;        // number of wp in the list can be maximal equal to WPLISTLEN
72
u8 WPActive = TRUE;
70
 
73
 
71
u8 WPList_Init(void)
74
u8 PointList_Init(void)
Line 72... Line 75...
72
{
75
{
73
        return WPList_Clear();
76
        return PointList_Clear();
74
}
77
}
75
 
78
 
76
u8 WPList_Clear(void)
79
u8 PointList_Clear(void)
-
 
80
{
77
{
81
        u8 i;
-
 
82
        WPIndex = 0;    // real list position are 1 ,2, 3 ...
78
        u8 i;
83
        POIIndex = 0;   // real list position are 1 ,2, 3 ...
79
        WPIndex = 0;    // real list position are 1 ,2, 3 ...
84
        WPCount = 0;    // no waypoints
80
        POIIndex = 0;   // real list position are 1 ,2, 3 ...
85
        PointCount = 0; // no contents
81
        WPNumber = 0;   // no contents
86
        WPActive = TRUE;
82
        NaviData.WaypointNumber = WPNumber;
87
        NaviData.WaypointNumber = WPCount;
83
        NaviData.WaypointIndex = WPIndex;
88
        NaviData.WaypointIndex = 0;
84
 
89
 
85
        for(i = 0; i < WPLISTLEN; i++)
90
        for(i = 0; i < MAX_LIST_LEN; i++)
86
        {
91
        {
87
                WPList[i].Position.Status = INVALID;
92
                PointList[i].Position.Status = INVALID;
88
                WPList[i].Position.Latitude = 0;
93
                PointList[i].Position.Latitude = 0;
89
                WPList[i].Position.Longitude = 0;
94
                PointList[i].Position.Longitude = 0;
90
                WPList[i].Position.Altitude = 0;
95
                PointList[i].Position.Altitude = 0;
91
                WPList[i].Heading = 361;                // invalid value
96
                PointList[i].Heading = 361;             // invalid value
92
                WPList[i].ToleranceRadius = 0;  // in meters, if the MK is within that range around the target, then the next target is triggered
97
                PointList[i].ToleranceRadius = 0;       // in meters, if the MK is within that range around the target, then the next target is triggered
93
                WPList[i].HoldTime = 0;                 // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
98
                PointList[i].HoldTime = 0;                      // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
94
                WPList[i].Event_Flag = 0;               // future implementation
99
                PointList[i].Event_Flag = 0;            // future implementation
Line 95... Line 100...
95
                WPList[i].Type = POINT_TYPE_WP;
100
                PointList[i].Type = POINT_TYPE_INVALID;
96
        }
101
        }
97
        return TRUE;           
102
        return TRUE;           
98
}
103
}
Line 99... Line 104...
99
 
104
 
100
u8 WPList_GetCount(void)
105
u8 PointList_GetCount(void)
101
{
106
{
102
        return WPNumber; // number of points in the list
107
        return PointCount; // number of points in the list
103
}
108
}
104
 
109
 
105
u8 WPList_Append(Waypoint_t* pwp)
110
u8 PointList_Append(Point_t* pPoint)
-
 
111
{
106
{
112
        if((PointCount < MAX_LIST_LEN) && (pPoint->Index == (PointCount + 1)) ) // there is still some space in the list and index points to next
107
        if((WPNumber < WPLISTLEN) && (pwp->Index == (WPNumber + 1)) ) // there is still some space in the list and index points to next
113
        {
108
        {
114
                memcpy(&PointList[PointCount], pPoint, sizeof(Point_t)); // copy data to list entry                                                                             // increment list length
109
                memcpy(&WPList[WPNumber], pwp, sizeof(Waypoint_t)); // copy wp data to list entry                                                                               // increment list length
115
                if(PointList[PointCount].Type == POINT_TYPE_WP) WPCount++;
110
                WPNumber++;
116
                NaviData.WaypointNumber = WPCount;
111
                NaviData.WaypointNumber = WPNumber;
117
                PointCount++;
112
                if(WPNumber == 1) // only for the first entry
118
                if(PointCount == 1) // only for the first entry
113
                {
119
                {
114
                        // update POI index
120
                        // update POI index
Line 115... Line 121...
115
                        switch(WPList[WPIndex-1].Type)
121
                        switch(PointList[WPIndex-1].Type)
116
                        {
122
                        {
Line 132... Line 138...
132
        }
138
        }
133
        else return FALSE;
139
        else return FALSE;
134
}
140
}
Line 135... Line 141...
135
 
141
 
136
// returns the pointer to the first waypoint within the list
142
// returns the pointer to the first waypoint within the list
137
Waypoint_t* WPList_Begin(void)
143
Point_t* PointList_WPBegin(void)
138
{
144
{
139
        u8 i;
145
        u8 i;
140
        WPIndex = 0; // set list position invalid
146
        WPIndex = 0; // set list position invalid
Line 141... Line 147...
141
        POIIndex = 0; // set invalid POI
147
        POIIndex = 0; // set invalid POI
142
 
-
 
Line -... Line 148...
-
 
148
 
-
 
149
        if(WPActive == FALSE) return(NULL);
143
        if(WPNumber > 0)
150
 
144
        {
151
        if(PointCount > 0)
145
 
152
        {
146
                // search for first wp in list
153
                // search for first wp in list
147
                for(i = 0; i < WPNumber; i++)
154
                for(i = 0; i <PointCount; i++)
148
                {
155
                {
149
                        if((WPList[i].Type == POINT_TYPE_WP) && (WPList[i].Position.Status != INVALID))
156
                        if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID))
150
                        {
157
                        {
151
                                WPIndex = i + 1;
158
                                WPIndex = i + 1;
152
                                break;
159
                                break;
153
                        }
160
                        }
154
                }
161
                }
155
                if(WPIndex) // found a WP in the list
162
                if(WPIndex) // found a WP in the list
156
                {
163
                {
157
                        NaviData.WaypointIndex = WPIndex;
164
                        NaviData.WaypointIndex = 1;
158
                        // update index to POI
165
                        // update index to POI
159
                        if(WPList[WPIndex-1].Heading < 0) POIIndex = (u8)(-WPList[WPIndex-1].Heading);
166
                        if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
160
                        else POIIndex = 0;     
167
                        else POIIndex = 0;     
161
                        return(&(WPList[WPIndex-1])); // if list is not empty return pointer to first waypoint in the list              
168
                        return(&(PointList[WPIndex-1])); // if list is not empty return pointer to first waypoint in the list           
162
                }
169
                }
163
                else // some points in the list but no WP found
170
                else // some points in the list but no WP found
164
                {
171
                {
165
                        NaviData.WaypointIndex = WPIndex;
172
                        NaviData.WaypointIndex = 0;
166
                        //Check for an existing POI
173
                        //Check for an existing POI
167
                        for(i = 0; i < WPNumber; i++)
174
                        for(i = 0; i < PointCount; i++)
168
                        {
175
                        {
169
                                if((WPList[i].Type == POINT_TYPE_POI) && (WPList[i].Position.Status != INVALID))
176
                                if((PointList[i].Type == POINT_TYPE_POI) && (PointList[i].Position.Status != INVALID))
170
                                {
177
                                {
171
                                        POIIndex = i + 1;
178
                                        POIIndex = i + 1;
Line 176... Line 183...
176
                }
183
                }
177
        }
184
        }
178
        else // no point in the list
185
        else // no point in the list
179
        {
186
        {
180
                POIIndex = 0;
187
                POIIndex = 0;
181
                NaviData.WaypointIndex = WPIndex;
188
                NaviData.WaypointIndex = 0;
182
                return NULL;   
189
                return NULL;   
183
        }
190
        }
184
}
191
}
Line 185... Line 192...
185
 
192
 
186
// returns the last waypoint
193
// returns the last waypoint
187
Waypoint_t* WPList_End(void)
194
Point_t* PointList_WPEnd(void)
Line 188... Line 195...
188
{
195
{
189
       
196
       
190
        u8 i;
197
        u8 i;
-
 
198
        WPIndex = 0; // set list position invalid
Line 191... Line 199...
191
        WPIndex = 0; // set list position invalid
199
        POIIndex = 0; // set invalid
192
        POIIndex = 0; // set invalid
200
        if(WPActive == FALSE) return(NULL);
193
 
201
 
194
        if(WPNumber > 0)
202
        if(PointCount > 0)
195
        {
203
        {
196
                // search backward!
204
                // search backward!
197
                for(i = 1; i <= WPNumber; i++)
205
                for(i = 1; i <= PointCount; i++)
198
                {
206
                {
199
                        if((WPList[WPNumber - i].Type == POINT_TYPE_WP) && (WPList[WPNumber - i].Position.Status != INVALID))
207
                        if((PointList[PointCount - i].Type == POINT_TYPE_WP) && (PointList[PointCount - i].Position.Status != INVALID))
200
                        {      
208
                        {      
201
                                WPIndex = WPNumber - i + 1;
209
                                WPIndex = PointCount - i + 1;
202
                                break;
210
                                break;
203
                        }
211
                        }
204
                }
212
                }
205
                if(WPIndex) // found a WP within the list
213
                if(WPIndex) // found a WP within the list
206
                {
214
                {
207
                        NaviData.WaypointIndex = WPIndex;
215
                        NaviData.WaypointIndex = WPCount;
208
                        if(WPList[WPIndex-1].Heading < 0) POIIndex = (u8)(-WPList[WPIndex-1].Heading);
216
                        if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
209
                        else POIIndex = 0;     
217
                        else POIIndex = 0;     
210
                        return(&(WPList[WPIndex-1]));
218
                        return(&(PointList[WPIndex-1]));
211
                }
219
                }
212
                else // list contains some points but no WP in the list
220
                else // list contains some points but no WP in the list
213
                {
221
                {
214
                        // search backward for a POI!
222
                        // search backward for a POI!
215
                        for(i = 1; i <= WPNumber; i++)
223
                        for(i = 1; i <= PointCount; i++)
216
                        {
224
                        {
217
                                if((WPList[WPNumber - i].Type == POINT_TYPE_POI) && (WPList[WPNumber - i].Position.Status != INVALID))
225
                                if((PointList[PointCount - i].Type == POINT_TYPE_POI) && (PointList[PointCount - i].Position.Status != INVALID))
218
                                {      
226
                                {      
219
                                        POIIndex = WPNumber - i + 1;
227
                                        POIIndex = PointCount - i + 1;
220
                                        break;
228
                                        break;
221
                                }
229
                                }
222
                        }
230
                        }
223
                        NaviData.WaypointIndex = WPIndex;
231
                        NaviData.WaypointIndex = 0;
224
                        return NULL;   
232
                        return NULL;   
225
                }
233
                }
226
        }
234
        }
227
        else // no point in the list
235
        else // no point in the list
228
        {
236
        {
229
                        POIIndex = 0;
237
                POIIndex = 0;
230
                        NaviData.WaypointIndex = WPIndex;
238
                NaviData.WaypointIndex = 0;
Line 231... Line 239...
231
                        return NULL;
239
                return NULL;
232
        }
240
        }
233
}
241
}
234
 
242
 
-
 
243
// returns a pointer to the next waypoint or NULL if the end of the list has been reached
Line 235... Line 244...
235
// returns a pointer to the next waypoint or NULL if the end of the list has been reached
244
Point_t* PointList_WPNext(void)
236
Waypoint_t* WPList_Next(void)
245
{
237
{
246
        u8 wp_found = 0;
238
        u8 wp_found = 0;
247
        if(WPActive == FALSE) return(NULL);
239
               
248
               
240
        if(WPIndex < WPNumber) // if there is a next entry in the list
249
        if(WPIndex < PointCount) // if there is a next entry in the list
241
        {
250
        {
242
                u8 i;
251
                u8 i;
243
                for(i = WPIndex; i < WPNumber; i++)     // start search for next at next list entry
252
                for(i = WPIndex; i < PointCount; i++)   // start search for next at next list entry
244
                {
253
                {
245
                        if((WPList[i].Type == POINT_TYPE_WP) && (WPList[i].Position.Status != INVALID)) // jump over POIs
254
                        if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID)) // jump over POIs
246
                        {
255
                        {
247
                                wp_found = i+1;
256
                                wp_found = i+1;
248
                                break;
257
                                break;
249
                        }
258
                        }
250
                }
259
                }
251
        }
260
        }
252
        if(wp_found)
261
        if(wp_found)
253
        {
262
        {
254
                WPIndex = wp_found; // update list position
263
                WPIndex = wp_found; // update list position
255
                NaviData.WaypointIndex = WPIndex;
264
                NaviData.WaypointIndex++;
256
                if(WPList[WPIndex-1].Heading < 0) POIIndex = (u8)(-WPList[WPIndex-1].Heading);
265
                if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
257
                else POIIndex = 0;
266
                else POIIndex = 0;
258
                return(&(WPList[WPIndex-1]));   // return pointer to this waypoint
267
                return(&(PointList[WPIndex-1]));        // return pointer to this waypoint
259
        }
268
        }
260
        else
269
        else
261
        {
270
        {  // no next wp found
-
 
271
                NaviData.WaypointIndex = 0;    
-
 
272
                POIIndex = 0;
-
 
273
                return(NULL);
-
 
274
        }
-
 
275
}      
-
 
276
 
Line 262... Line 277...
262
                NaviData.WaypointIndex = WPIndex;      
277
void PointList_WPActive(u8 set)
263
                POIIndex = 0;
278
{
264
                return(NULL);
279
        if(set) WPActive = TRUE;
265
        }
280
        else WPActive = FALSE;
266
}      
281
}
Line 267... Line 282...
267
 
282
 
268
Waypoint_t* WPList_GetAt(u8 index)
283
Point_t* PointList_GetAt(u8 index)
269
{
284
{
270
        if((index > 0) && (index <= WPNumber)) return(&(WPList[index-1]));      // return pointer to this waypoint
285
        if((index > 0) && (index <= PointCount)) return(&(PointList[index-1])); // return pointer to this waypoint