Subversion Repositories FlightCtrl

Rev

Rev 194 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 194 Rev 197
1
/*
1
/*
2
This program (files gps.c and gps.h) is free software; you can redistribute it and/or modify
2
This program (files gps.c and gps.h) is free software; you can redistribute it and/or modify
3
it under the terms of the GNU General Public License as published by the Free Software Foundation;
3
it under the terms of the GNU General Public License as published by the Free Software Foundation;
4
either version 3 of the License, or (at your option) any later version.  
4
either version 3 of the License, or (at your option) any later version.  
5
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
5
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
6
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7
GNU General Public License for more details. You should have received a copy of the GNU General Public License
7
GNU General Public License for more details. You should have received a copy of the GNU General Public License
8
along with this program. If not, see <http://www.gnu.org/licenses/>.
8
along with this program. If not, see <http://www.gnu.org/licenses/>.
9
 
9
 
10
Please note: All the other files for the project "Mikrokopter" by H.Buss are under the license (license_buss.txt) published by www.mikrokopter.de
10
Please note: All the other files for the project "Mikrokopter" by H.Buss are under the license (license_buss.txt) published by www.mikrokopter.de
11
*/
11
*/
12
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13
Peter Muehlenbrock
13
Peter Muehlenbrock
14
Auswertung der Daten vom GPS im ublox Format
14
Auswertung der Daten vom GPS im ublox Format
15
Hold Modus mit PID Regler
15
Hold Modus mit PID Regler
16
Stand 29.9.2007
16
Stand 2.10.2007
17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
18
*/
18
*/
19
#include "main.h"
19
#include "main.h"
20
//#include "gps.h"
20
//#include "gps.h"
21
 
21
 
22
// Defines fuer ublox Messageformat um Auswertung zu steuern
22
// Defines fuer ublox Messageformat um Auswertung zu steuern
23
#define                 UBLOX_IDLE              0
23
#define                 UBLOX_IDLE              0
24
#define                 UBLOX_SYNC1             1
24
#define                 UBLOX_SYNC1             1
25
#define                 UBLOX_SYNC2             2
25
#define                 UBLOX_SYNC2             2
26
#define                 UBLOX_CLASS             3
26
#define                 UBLOX_CLASS             3
27
#define                 UBLOX_ID                4
27
#define                 UBLOX_ID                4
28
#define                 UBLOX_LEN1              5
28
#define                 UBLOX_LEN1              5
29
#define                 UBLOX_LEN2              6
29
#define                 UBLOX_LEN2              6
30
#define                 UBLOX_CKA               7
30
#define                 UBLOX_CKA               7
31
#define                 UBLOX_CKB               8
31
#define                 UBLOX_CKB               8
32
#define                 UBLOX_PAYLOAD   9
32
#define                 UBLOX_PAYLOAD   9
33
 
33
 
34
// ublox Protokoll Identifier 
34
// ublox Protokoll Identifier 
35
#define                 UBLOX_NAV_POSUTM                0x08
35
#define                 UBLOX_NAV_POSUTM                0x08
36
#define                 UBLOX_NAV_STATUS                0x03
36
#define                 UBLOX_NAV_STATUS                0x03
37
#define                 UBLOX_NAV_VELED                 0x12
37
#define                 UBLOX_NAV_VELED                 0x12
38
#define                 UBLOX_NAV_CLASS                 0x01
38
#define                 UBLOX_NAV_CLASS                 0x01
39
#define                 UBLOX_SYNCH1_CHAR               0xB5
39
#define                 UBLOX_SYNCH1_CHAR               0xB5
40
#define                 UBLOX_SYNCH2_CHAR               0x62
40
#define                 UBLOX_SYNCH2_CHAR               0x62
41
 
41
 
42
signed int GPS_Nick = 0;
42
signed int GPS_Nick = 0;
43
signed int GPS_Roll = 0;
43
signed int GPS_Roll = 0;
44
short int ublox_msg_state = UBLOX_IDLE;
44
short int ublox_msg_state = UBLOX_IDLE;
45
static uint8_t  chk_a =0; //Checksum
45
static uint8_t  chk_a =0; //Checksum
46
static uint8_t  chk_b =0;
46
static uint8_t  chk_b =0;
47
short int gps_state;
47
short int gps_state;
48
short int  gps_updte_flag;
48
short int  gps_updte_flag;
49
signed int GPS_hdng_abs_2trgt; //Winkel zum Ziel bezogen auf Nordpol
49
signed int GPS_hdng_abs_2trgt; //Winkel zum Ziel bezogen auf Nordpol
50
signed int GPS_hdng_rel_2trgt; //Winkel zum Ziel bezogen auf Nordachse des Kopters
50
signed int GPS_hdng_rel_2trgt; //Winkel zum Ziel bezogen auf Nordachse des Kopters
51
signed int GPS_dist_2trgt; //vorzeichenlose Distanz zum Ziel 
51
signed int GPS_dist_2trgt; //vorzeichenlose Distanz zum Ziel 
52
signed int gps_int_x,gps_int_y,gps_reg_x,gps_reg_y;                            
52
signed int gps_int_x,gps_int_y,gps_reg_x,gps_reg_y;                            
53
signed int ;
53
signed int ;
54
static unsigned int rx_len;
54
static unsigned int rx_len;
55
unsigned int cnt0,cnt1,cnt2; //******Provisorisch
55
unsigned int cnt0,cnt1,cnt2; //******Provisorisch
56
static unsigned int ptr_payload_data_end;
56
static unsigned int ptr_payload_data_end;
57
unsigned int gps_alive_cnt; // Wird bei jedem gueltigen GPS Telegramm hochgezaehlt
57
unsigned int gps_alive_cnt; // Wird bei jedem gueltigen GPS Telegramm hochgezaehlt
58
 
58
 
59
static uint8_t *ptr_payload_data;
59
static uint8_t *ptr_payload_data;
60
static uint8_t *ptr_pac_status;
60
static uint8_t *ptr_pac_status;
61
 
61
 
62
short int Get_GPS_data(void);
62
short int Get_GPS_data(void);
63
 
63
 
64
NAV_POSUTM_t actual_pos;    // Aktuelle Nav Daten werden hier im ublox Format abgelegt
64
NAV_POSUTM_t actual_pos;    // Aktuelle Nav Daten werden hier im ublox Format abgelegt
65
NAV_STATUS_t actual_status; // Aktueller Nav Status
65
NAV_STATUS_t actual_status; // Aktueller Nav Status
66
NAV_VELNED_t actual_speed;  // Aktueller Geschwindigkeits und Richtungsdaten
66
NAV_VELNED_t actual_speed;  // Aktueller Geschwindigkeits und Richtungsdaten
67
 
67
 
68
GPS_ABS_POSITION_t              gps_act_position;               // Alle wichtigen Daten zusammengefasst
68
GPS_ABS_POSITION_t              gps_act_position;               // Alle wichtigen Daten zusammengefasst
69
GPS_ABS_POSITION_t              gps_home_position;      // Die Startposition, beim Kalibrieren ermittelt
69
GPS_ABS_POSITION_t              gps_home_position;      // Die Startposition, beim Kalibrieren ermittelt
70
GPS_REL_POSITION_t              gps_rel_act_position;   // Die aktuelle relative Position bezogen auf Home Position
70
GPS_REL_POSITION_t              gps_rel_act_position;   // Die aktuelle relative Position bezogen auf Home Position
71
GPS_REL_POSITION_t              gps_rel_hold_position;  // Die gespeicherte Sollposition fuer GPS_ Hold Mode
71
GPS_REL_POSITION_t              gps_rel_hold_position;  // Die gespeicherte Sollposition fuer GPS_ Hold Mode
72
 
72
 
73
// Initialisierung
73
// Initialisierung
74
void GPS_Neutral(void)
74
void GPS_Neutral(void)
75
{
75
{
76
        ublox_msg_state                         =       UBLOX_IDLE;
76
        ublox_msg_state                         =       UBLOX_IDLE;
77
        gps_state                                       =       GPS_CRTL_IDLE;
77
        gps_state                                       =       GPS_CRTL_IDLE;
78
        actual_pos.status                       =       0;
78
        actual_pos.status                       =       0;
79
        actual_speed.status                     =       0;
79
        actual_speed.status                     =       0;
80
        actual_status.status            =       0;
80
        actual_status.status            =       0;
81
        gps_home_position.status        =       0; // Noch keine gueltige Home Position
81
        gps_home_position.status        =       0; // Noch keine gueltige Home Position
82
        gps_act_position.status         =       0;
82
        gps_act_position.status         =       0;
83
        gps_rel_act_position.status     =       0;     
83
        gps_rel_act_position.status     =       0;     
84
        GPS_Nick                                        =       0;
84
        GPS_Nick                                        =       0;
85
        GPS_Roll                                        =       0;
85
        GPS_Roll                                        =       0;
86
        gps_updte_flag                          =       0;
86
        gps_updte_flag                          =       0;
87
        gps_int_x                                       =       0;
87
        gps_int_x                                       =       0;
88
        gps_int_y                                       =       0;
88
        gps_int_y                                       =       0;
89
        gps_alive_cnt                           =       0;
89
        gps_alive_cnt                           =       0;
90
 
90
 
91
}
91
}
92
 
92
 
93
// Home Position sichern falls Daten verfuegbar sind. 
93
// Home Position sichern falls Daten verfuegbar sind. 
94
void GPS_Save_Home(void)
94
void GPS_Save_Home(void)
95
{
95
{
96
        short int n;
96
        short int n;
97
        n = Get_GPS_data();
97
        n = Get_GPS_data();
98
        if (n == 0)   // Gueltige  und aktuelle Daten ?   
98
        if (n == 0)   // Gueltige  und aktuelle Daten ?   
99
        {
99
        {
100
                // Neue GPS Daten liegen vor
100
                // Neue GPS Daten liegen vor
101
                gps_home_position.utm_east      = gps_act_position.utm_east;   
101
                gps_home_position.utm_east      = gps_act_position.utm_east;   
102
                gps_home_position.utm_north     = gps_act_position.utm_north;  
102
                gps_home_position.utm_north     = gps_act_position.utm_north;  
103
                gps_home_position.utm_alt       = gps_act_position.utm_alt;
103
                gps_home_position.utm_alt       = gps_act_position.utm_alt;
104
                gps_home_position.status        = 1; // Home Position gueltig                   
104
                gps_home_position.status        = 1; // Home Position gueltig                   
105
        }
105
        }
106
}
106
}
107
 
107
 
108
// Relative Position zur Home Position bestimmen
108
// Relative Position zur Home Position bestimmen
109
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
109
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
110
short int Get_Rel_Position(void)
110
short int Get_Rel_Position(void)
111
{
111
{
112
        short int n = 0;
112
        short int n = 0;
113
        n = Get_GPS_data();
113
        n = Get_GPS_data();
114
        if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind
114
        if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind
115
        if (gps_alive_cnt < 400) gps_alive_cnt += 300; // Timeoutzaehler. Wird in MotorreglerRoutine ueberwacht und dekrementiert
115
        if (gps_alive_cnt < 400) gps_alive_cnt += 300; // Timeoutzaehler. Wird in MotorreglerRoutine ueberwacht und dekrementiert
116
        if  (gps_home_position.status > 0) //Nur wenn Home Position vorliegt
116
        if  (gps_home_position.status > 0) //Nur wenn Home Position vorliegt
117
        {
117
        {
118
                gps_rel_act_position.utm_east   = (int)  (gps_act_position.utm_east - gps_home_position.utm_east);
118
                gps_rel_act_position.utm_east   = (int)  (gps_act_position.utm_east - gps_home_position.utm_east);
119
                gps_rel_act_position.utm_north  = (int)  (gps_act_position.utm_north - gps_home_position.utm_north);
119
                gps_rel_act_position.utm_north  = (int)  (gps_act_position.utm_north - gps_home_position.utm_north);
120
                gps_rel_act_position.status     = 1; // gueltige Positionsdaten
120
                gps_rel_act_position.status     = 1; // gueltige Positionsdaten
121
                n = 0;
121
                n = 0;
122
                gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen.
122
                gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen.
123
        }
123
        }
124
        else
124
        else
125
        {
125
        {
126
                n = 2; //keine gueltigen Daten vorhanden
126
                n = 2; //keine gueltigen Daten vorhanden
127
                gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist.
127
                gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist.
128
        }      
128
        }      
129
        return (n);
129
        return (n);
130
}
130
}
131
 
131
 
132
// Daten aus aktuellen ublox Messages extrahieren 
132
// Daten aus aktuellen ublox Messages extrahieren 
133
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
133
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
134
short int Get_GPS_data(void)
134
short int Get_GPS_data(void)
135
{
135
{
136
        short int n = 1;
136
        short int n = 1;
137
 
137
 
138
        if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist
138
        if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist
139
        if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0))
139
        if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0))
140
        {
140
        {
141
                cnt1++; //**** noch Rausschmeissen
141
                cnt1++; //**** noch Rausschmeissen
142
                if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind
142
                if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind
143
                {
143
                {
144
                        gps_act_position.utm_east       = actual_pos.utm_east/10;
144
                        gps_act_position.utm_east       = actual_pos.utm_east/10;
145
                        gps_act_position.utm_north      = actual_pos.utm_north/10;
145
                        gps_act_position.utm_north      = actual_pos.utm_north/10;
146
                        gps_act_position.utm_alt        = actual_pos.utm_alt/10;
146
                        gps_act_position.utm_alt        = actual_pos.utm_alt/10;
147
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
147
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
148
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
148
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
149
                        gps_act_position.heading        = actual_speed.heading/100000;
149
                        gps_act_position.heading        = actual_speed.heading/100000;
150
                        gps_act_position.status         = 1;
150
                        gps_act_position.status         = 1;
151
                        n                                                       = 0; //Daten gueltig
151
                        n                                                       = 0; //Daten gueltig
152
                }
152
                }
153
                else
153
                else
154
                {
154
                {
155
                        gps_act_position.status = 0; //Keine gueltigen Daten
155
                        gps_act_position.status = 0; //Keine gueltigen Daten
156
                        n                                               = 2;
156
                        n                                               = 2;
157
                }
157
                }
158
                actual_pos.status               = 0; //neue ublox Messages anfordern
158
                actual_pos.status               = 0; //neue ublox Messages anfordern
159
                actual_status.status    = 0;
159
                actual_status.status    = 0;
160
                actual_speed.status     = 0;
160
                actual_speed.status     = 0;
161
        }      
161
        }      
162
        return (n);    
162
        return (n);    
163
}
163
}
164
 
164
 
165
 
165
 
166
/*
166
/*
167
Daten vom GPS im ublox MSG Format auswerten
167
Daten vom GPS im ublox MSG Format auswerten
168
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen
168
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen
169
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein
169
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein
170
*/
170
*/
171
void Get_Ublox_Msg(uint8_t rx)
171
void Get_Ublox_Msg(uint8_t rx)
172
{
172
{
173
 
173
 
174
        switch (ublox_msg_state)
174
        switch (ublox_msg_state)
175
        {
175
        {
176
 
176
 
177
                case UBLOX_IDLE: // Zuerst Synchcharacters pruefen
177
                case UBLOX_IDLE: // Zuerst Synchcharacters pruefen
178
                        if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1;
178
                        if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1;
179
                        else ublox_msg_state = UBLOX_IDLE;
179
                        else ublox_msg_state = UBLOX_IDLE;
180
                        break;
180
                        break;
181
 
181
 
182
                case UBLOX_SYNC1:
182
                case UBLOX_SYNC1:
183
 
183
 
184
                        if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2;
184
                        if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2;
185
                        else ublox_msg_state = UBLOX_IDLE;
185
                        else ublox_msg_state = UBLOX_IDLE;
186
                        chk_a = 0,chk_b = 0;
186
                        chk_a = 0,chk_b = 0;
187
                        break;
187
                        break;
188
 
188
 
189
                case UBLOX_SYNC2:
189
                case UBLOX_SYNC2:
190
                        if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS;      
190
                        if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS;      
191
                        else ublox_msg_state = UBLOX_IDLE;
191
                        else ublox_msg_state = UBLOX_IDLE;
192
                        break;
192
                        break;
193
 
193
 
194
                case UBLOX_CLASS: // Nur NAV Meldungen auswerten
194
                case UBLOX_CLASS: // Nur NAV Meldungen auswerten
195
                        switch (rx)
195
                        switch (rx)
196
                        {
196
                        {
197
                                case UBLOX_NAV_POSUTM:
197
                                case UBLOX_NAV_POSUTM:
198
                                        ptr_pac_status  =       &actual_pos.status;
198
                                        ptr_pac_status  =       &actual_pos.status;
199
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden
199
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden
200
                                        else
200
                                        else
201
                                        {
201
                                        {
202
                                                ptr_payload_data                = &actual_pos;
202
                                                ptr_payload_data                = &actual_pos;
203
                                                ptr_payload_data_end    = &actual_pos.status;
203
                                                ptr_payload_data_end    = &actual_pos.status;
204
                                                ublox_msg_state                 = UBLOX_LEN1;
204
                                                ublox_msg_state                 = UBLOX_LEN1;
205
                                        }
205
                                        }
206
                                        break;
206
                                        break;
207
 
207
 
208
                                case UBLOX_NAV_STATUS:
208
                                case UBLOX_NAV_STATUS:
209
                                        ptr_pac_status  =       &actual_status.status;
209
                                        ptr_pac_status  =       &actual_status.status;
210
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
210
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
211
                                        else
211
                                        else
212
                                        {
212
                                        {
213
                                                ptr_payload_data                = &actual_status;
213
                                                ptr_payload_data                = &actual_status;
214
                                                ptr_payload_data_end    = &actual_status.status;
214
                                                ptr_payload_data_end    = &actual_status.status;
215
                                                ublox_msg_state                 = UBLOX_LEN1;
215
                                                ublox_msg_state                 = UBLOX_LEN1;
216
                                        }
216
                                        }
217
                                        break;
217
                                        break;
218
 
218
 
219
                                case UBLOX_NAV_VELED:
219
                                case UBLOX_NAV_VELED:
220
                                        ptr_pac_status          =       &actual_speed.status;
220
                                        ptr_pac_status          =       &actual_speed.status;
221
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
221
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
222
                                        else
222
                                        else
223
                                        {
223
                                        {
224
                                                ptr_payload_data                = &actual_speed;
224
                                                ptr_payload_data                = &actual_speed;
225
                                                ptr_payload_data_end    = &actual_speed.status;
225
                                                ptr_payload_data_end    = &actual_speed.status;
226
                                                ublox_msg_state                 = UBLOX_LEN1;
226
                                                ublox_msg_state                 = UBLOX_LEN1;
227
                                        }
227
                                        }
228
                                        break;
228
                                        break;
229
 
229
 
230
                                default:
230
                                default:
231
                                        ublox_msg_state = UBLOX_IDLE;
231
                                        ublox_msg_state = UBLOX_IDLE;
232
                                        break; 
232
                                        break; 
233
                        }
233
                        }
234
                        chk_a   = UBLOX_NAV_CLASS + rx;
234
                        chk_a   = UBLOX_NAV_CLASS + rx;
235
                        chk_b   = UBLOX_NAV_CLASS + chk_a;                     
235
                        chk_b   = UBLOX_NAV_CLASS + chk_a;                     
236
                        break;
236
                        break;
237
 
237
 
238
                case UBLOX_LEN1: // Laenge auswerten
238
                case UBLOX_LEN1: // Laenge auswerten
239
                        rx_len  = rx;
239
                        rx_len  = rx;
240
                        chk_a   += rx;
240
                        chk_a   += rx;
241
                        chk_b   += chk_a;              
241
                        chk_b   += chk_a;              
242
                        ublox_msg_state = UBLOX_LEN2;
242
                        ublox_msg_state = UBLOX_LEN2;
243
                        break;
243
                        break;
244
 
244
 
245
 
245
 
246
                case UBLOX_LEN2: // Laenge auswerten
246
                case UBLOX_LEN2: // Laenge auswerten
247
                        rx_len = rx_len + (rx *256); // Laenge ermitteln
247
                        rx_len = rx_len + (rx *256); // Laenge ermitteln
248
                        chk_a   += rx;
248
                        chk_a   += rx;
249
                        chk_b   += chk_a;      
249
                        chk_b   += chk_a;      
250
                        ublox_msg_state = UBLOX_PAYLOAD;
250
                        ublox_msg_state = UBLOX_PAYLOAD;
251
                        break;
251
                        break;
252
 
252
 
253
                case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen
253
                case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen
254
                        if (rx_len > 0)
254
                        if (rx_len > 0)
255
                        {
255
                        {
256
                                *ptr_payload_data = rx;
256
                                *ptr_payload_data = rx;
257
                                chk_a   += rx;
257
                                chk_a   += rx;
258
                                chk_b   += chk_a;
258
                                chk_b   += chk_a;
259
                                --rx_len;      
259
                                --rx_len;      
260
                                if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end))                          
260
                                if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end))                          
261
                                {
261
                                {
262
                                        ptr_payload_data++;
262
                                        ptr_payload_data++;
263
                                        ublox_msg_state = UBLOX_PAYLOAD;
263
                                        ublox_msg_state = UBLOX_PAYLOAD;
264
                            }
264
                            }
265
                                else ublox_msg_state = UBLOX_CKA;
265
                                else ublox_msg_state = UBLOX_CKA;
266
                        }      
266
                        }      
267
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
267
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
268
                        break;
268
                        break;
269
 
269
 
270
                case UBLOX_CKA: // Checksum pruefen
270
                case UBLOX_CKA: // Checksum pruefen
271
                        if (rx == chk_a) ublox_msg_state = UBLOX_CKB;                          
271
                        if (rx == chk_a) ublox_msg_state = UBLOX_CKB;                          
272
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
272
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
273
                        break;
273
                        break;
274
 
274
 
275
                case UBLOX_CKB: // Checksum pruefen
275
                case UBLOX_CKB: // Checksum pruefen
276
                        if (rx == chk_b) *ptr_pac_status = 1; // Paket ok
276
                        if (rx == chk_b) *ptr_pac_status = 1; // Paket ok
277
                        ublox_msg_state    = UBLOX_IDLE;
277
                        ublox_msg_state    = UBLOX_IDLE;
278
                        break;
278
                        break;
279
 
279
 
280
                default:
280
                default:
281
                        ublox_msg_state = UBLOX_IDLE;          
281
                        ublox_msg_state = UBLOX_IDLE;          
282
                        break;
282
                        break;
283
        }
283
        }
284
}
284
}
285
       
285
       
286
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe
286
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe
287
short int GPS_CRTL(short int cmd)
287
short int GPS_CRTL(short int cmd)
288
{
288
{
289
        static unsigned int cnt;                                //Zaehler fuer diverse Verzoegerungen 
289
        static unsigned int cnt;                                //Zaehler fuer diverse Verzoegerungen 
290
        static signed int int_east,int_north;   //Integrierer 
290
        static signed int int_east,int_north;   //Integrierer 
291
        static signed int dist_north,dist_east;
291
        static signed int dist_north,dist_east;
292
        static signed int diff_east,diff_north;         // Differenzierer  (Differenz zum  vorhergehenden x bzw. y  Wert)
292
        static signed int diff_east,diff_north;         // Differenzierer  (Differenz zum  vorhergehenden x bzw. y  Wert)
293
        static signed int diff_east_f,diff_north_f; // Differenzierer,  gefiltert
293
        static signed int diff_east_f,diff_north_f; // Differenzierer,  gefiltert
294
        signed int n;
294
        signed int n,diff_v;
295
        long signed int dist,d,n_l;
295
        long signed int dev,n_l;
296
        switch (cmd)
296
        switch (cmd)
297
        {
297
        {
298
 
298
 
299
                case GPS_CMD_REQ_HOME: // Es soll zum Startpunkt zurueckgeflogen werden. 
299
                case GPS_CMD_REQ_HOME: // Es soll zum Startpunkt zurueckgeflogen werden. 
300
                // Noch einiges zu ueberlegen und zu tun
300
                // Noch einiges zu ueberlegen und zu tun
301
                   return(GPS_STST_PEND); // noch warten
301
                   return(GPS_STST_PEND); // noch warten
302
                   break;
302
                   break;
303
// ******************************
303
// ******************************
304
 
304
 
305
                case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden.
305
                case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden.
306
                        if (gps_state != GPS_CRTL_HOLD_ACTIVE)
306
                        if (gps_state != GPS_CRTL_HOLD_ACTIVE)
307
                        {
307
                        {
308
                                cnt++;
308
                                cnt++;
309
                                if (cnt > 500) // erst nach Verzoegerung 
309
                                if (cnt > 500) // erst nach Verzoegerung 
310
                                {
310
                                {
311
                                        cnt     =       0;
311
                                        cnt     =       0;
312
                                        // aktuelle positionsdaten abespeichern
312
                                        // aktuelle positionsdaten abespeichern
313
                                        if (gps_rel_act_position.status > 0)
313
                                        if (gps_rel_act_position.status > 0)
314
                                        {
314
                                        {
315
                                                int_east                = 0;
315
                                                int_east                = 0;
316
                                                int_north               = 0;
316
                                                int_north               = 0;
317
                                                gps_reg_x               = 0;
317
                                                gps_reg_x               = 0;
318
                                                gps_reg_y               = 0;
318
                                                gps_reg_y               = 0;
319
                                                dist_east               = 0;
319
                                                dist_east               = 0;
320
                                                dist_north              = 0;
320
                                                dist_north              = 0;
321
                                                diff_east_f             = 0;
321
                                                diff_east_f             = 0;
322
                                                diff_north_f    = 0;
322
                                                diff_north_f    = 0;
323
                                                diff_east               = 0;
323
                                                diff_east               = 0;
324
                                                diff_north              = 0;
324
                                                diff_north              = 0;
325
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
325
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
326
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
326
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
327
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
327
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
328
                                                gps_state                                               = GPS_CRTL_HOLD_ACTIVE;
328
                                                gps_state                                               = GPS_CRTL_HOLD_ACTIVE;
329
                                                return (GPS_STST_OK);                          
329
                                                return (GPS_STST_OK);                          
330
                                        }
330
                                        }
331
                                        else
331
                                        else
332
                                        {
332
                                        {
333
                                                gps_rel_hold_position.status    =       0;  //Keine Daten verfuegbar
333
                                                gps_rel_hold_position.status    =       0;  //Keine Daten verfuegbar
334
                                                gps_state                                               = GPS_CRTL_IDLE;
334
                                                gps_state                                               = GPS_CRTL_IDLE;
335
                                                return(GPS_STST_ERR); // Keine Daten da
335
                                                return(GPS_STST_ERR); // Keine Daten da
336
                                        }
336
                                        }
337
                                }
337
                                }
338
                                else return(GPS_STST_PEND); // noch warten
338
                                else return(GPS_STST_PEND); // noch warten
339
                        }
339
                        }
340
                        break;
340
                        break;
341
 
341
 
342
                case GPS_CMD_STOP: // Lageregelung beenden
342
                case GPS_CMD_STOP: // Lageregelung beenden
343
                        cnt                             =       0;
343
                        cnt                             =       0;
344
                        GPS_Nick                =       0;
344
                        GPS_Nick                =       0;
345
                        GPS_Roll                =       0;
345
                        GPS_Roll                =       0;
346
                        gps_int_x               =       0;
346
                        gps_int_x               =       0;
347
                        gps_int_y               =       0;
347
                        gps_int_y               =       0;
348
                        gps_state       =       GPS_CRTL_IDLE;
348
                        gps_state       =       GPS_CRTL_IDLE;
349
                        return (GPS_STST_OK);
349
                        return (GPS_STST_OK);
350
                        break;
350
                        break;
351
 
351
 
352
                default:
352
                default:
353
                        return (GPS_STST_ERR);
353
                        return (GPS_STST_ERR);
354
                        break;
354
                        break;
355
        }
355
        }
356
 
356
 
357
        switch (gps_state)
357
        switch (gps_state)
358
        {      
358
        {      
359
                case GPS_CRTL_IDLE:
359
                case GPS_CRTL_IDLE:
360
                        cnt             =       0;
360
                        cnt             =       0;
361
                        return (GPS_STST_OK);
361
                        return (GPS_STST_OK);
362
                        break;
362
                        break;
363
 
363
 
364
                case GPS_CRTL_HOLD_ACTIVE:    // Hier werden die Daten fuer Nick und Roll errechnet
364
                case GPS_CRTL_HOLD_ACTIVE:    // Hier werden die Daten fuer Nick und Roll errechnet
365
                        if (gps_updte_flag == 1)  //nur wenn neue GPS Daten vorliegen
365
                        if (gps_updte_flag == 1)  //nur wenn neue GPS Daten vorliegen
366
                        {
366
                        {
367
                                gps_updte_flag = 0;
367
                                gps_updte_flag = 0;
368
                                // ab hier wird geregelt
368
                                // ab hier wird geregelt
369
                                diff_east       = -dist_east;     //Alten Wert fuer Differenzier schon mal abziehen
369
                                diff_east       = -dist_east;     //Alten Wert fuer Differenzier schon mal abziehen
370
                                diff_north      = -dist_north;
370
                                diff_north      = -dist_north;
371
                                dist_east       = gps_rel_hold_position.utm_east  - gps_rel_act_position.utm_east;
371
                                dist_east       = gps_rel_hold_position.utm_east  - gps_rel_act_position.utm_east;
372
                                dist_north      = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north;
372
                                dist_north      = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north;
373
                                int_east        += dist_east;
373
                                int_east        += dist_east;
374
                                int_north   += dist_north;
374
                                int_north   += dist_north;
375
                                diff_east       += dist_east;   // Differenz zur vorhergehenden East Position
375
                                diff_east       += dist_east;   // Differenz zur vorhergehenden East Position
376
                                diff_north      += dist_north;  // Differenz zur vorhergehenden North Position
376
                                diff_north      += dist_north;  // Differenz zur vorhergehenden North Position
377
 
377
 
378
                                diff_east_f             = ((diff_east_f )/4) + (diff_east*3/4); //Differenzierer filtern        
378
                                diff_east_f             = ((diff_east_f )/4) + (diff_east*3/4); //Differenzierer filtern        
379
                                diff_north_f    = ((diff_north_f)/4) + (diff_north*3/4); //Differenzierer filtern       
379
                                diff_north_f    = ((diff_north_f)/4) + (diff_north*3/4); //Differenzierer filtern       
380
 
380
 
381
                                #define GPSINT_MAX 2048 //neuer Wert ab 1.10.2007 Begrenzung 
381
                                #define GPSINT_MAX 2048 //neuer Wert ab 1.10.2007 Begrenzung 
382
                                if ((abs(int_east) > GPSINT_MAX) || (abs(int_north)> GPSINT_MAX)) //Bei zu hohem Wert Integrator auf Wert halten
382
                                if ((abs(int_east) > GPSINT_MAX) || (abs(int_north)> GPSINT_MAX)) //Bei zu hohem Wert Integrator auf Wert halten
383
                                {
383
                                {
384
                                        int_east        -= dist_east;
384
                                        int_east        -= dist_east;
385
                                        int_north   -= dist_north;                                     
385
                                        int_north   -= dist_north;                                     
386
                                }
386
                                }
-
 
387
                                //Variable Verstarkung fuer Differenzierer ermitteln. Je weiter vom Ziel wir entfernt sind
387
                                // P-Anteil Kleine Werte verstaerken, grosse abschwaechen
388
                                // desto groesser wird der Faktor. Es gibt aber einen Maximalwert. bei 0 ist die Verstaerkung 1
388
                                #define GPS_DIST_P_MAX 200 //maximal 20m
389
                                #define GPS_DIFF_MAX_V 20 //maximale Verstaerkung * 10
389
                                int dist_east_p,dist_north_p;
390
                                #define GPS_DIFF_MAX_D 40 //Entfernung bei der maximale Verstaerkung erreicht wird in (dm)
390
                                dist_east_p      = dist_east;
391
                                signed long dist;
391
                                dist_north_p = dist_north;
392
                                int phi;
392
                                if (dist_east > GPS_DIST_P_MAX) dist_east_p = GPS_DIST_P_MAX; // P-Anteil begrenzen
393
                                phi = arctan_i(abs(dist_north),abs(dist_east));
393
                                else if (dist_east < - GPS_DIST_P_MAX) dist_east_p = -GPS_DIST_P_MAX;
394
                                if (abs(dist_east) > abs(dist_north) ) //Zunaechst Entfernung zum Ziel ermitteln
-
 
395
                                {
394
                                if (dist_north > GPS_DIST_P_MAX) dist_north_p = GPS_DIST_P_MAX; // P-Anteil begrenzen
396
                                        dist = (long)dist_east; //Groesseren Wert wegen besserer Genauigkeit nehmen
395
                                else if (dist_north < - GPS_DIST_P_MAX) dist_north_p = -GPS_DIST_P_MAX;        
397
                                        dist = abs((dist *1000) / (long) sin_i(phi));
-
 
398
                                }
-
 
399
                                else
396
                                               
400
                                {
397
                                n                               = sin_i((dist_east_p*90)/(GPS_DIST_P_MAX));
401
                                        dist = (long)dist_north;
398
                                d                               = (GPS_DIST_P_MAX * (long)n) /1000;    
402
                                        dist = abs((dist *1000) / (long) cos_i(phi));
399
                                dist_east_p             = (int) d;
403
                                }
400
                                n                               = sin_i((dist_north_p*90)/(GPS_DIST_P_MAX));
404
                                diff_v = (int)((dist * (GPS_DIFF_MAX_V - 10)) / GPS_DIFF_MAX_D) +10; //Verstaerkung * 10
401
                                d                               = (GPS_DIST_P_MAX * (long)n) /1000;    
405
                                if (diff_v > GPS_DIFF_MAX_V) diff_v = GPS_DIFF_MAX_V;
402
                                dist_north_p    = (int) d;
-
 
403
 
406
 
404
                                //PID Regler Werte aufsummieren
407
                                //PID Regler Werte aufsummieren
405
                                gps_reg_x = ((int_east  * Parameter_UserParam2)/32) + ((dist_east_p   * Parameter_UserParam1)/8)+ ((diff_east_f  * Parameter_UserParam3));  // I + P +D  Anteil X Achse
408
                                gps_reg_x = ((int_east  * Parameter_UserParam2)/32) + ((dist_east  * Parameter_UserParam1)/8)+ ((diff_east_f  * diff_v * Parameter_UserParam3)/10);  // I + P +D  Anteil X Achse
406
                                gps_reg_y = ((int_north * Parameter_UserParam2)/32) + ((dist_north_p  * Parameter_UserParam1)/8)+ ((diff_north_f * Parameter_UserParam3));  // I + P +D  Anteil Y Achse
409
                                gps_reg_y = ((int_north * Parameter_UserParam2)/32) + ((dist_north * Parameter_UserParam1)/8)+ ((diff_north_f * diff_v * Parameter_UserParam3)/10);  // I + P +D  Anteil Y Achse
407
 
410
 
408
                                //Ziel-Richtung bezogen auf Nordpol bestimmen
411
                                //Ziel-Richtung bezogen auf Nordpol bestimmen
409
                                GPS_hdng_abs_2trgt = arctan_i(gps_reg_x,gps_reg_y);
412
                                GPS_hdng_abs_2trgt = arctan_i(gps_reg_x,gps_reg_y);
410
 
413
 
411
                                // in Winkel 0...360 Grad umrechnen
414
                                // in Winkel 0...360 Grad umrechnen
412
                                if ((gps_reg_x >= 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt);
415
                                if ((gps_reg_x >= 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt);
413
                                else  GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt);
416
                                else  GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt);
414
 
417
 
415
                                // Relative Richtung in bezug auf Nordachse des Kopters errechen
418
                                // Relative Richtung in bezug auf Nordachse des Kopters errechen
416
                                n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT;
419
                                n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT;
417
                                GPS_hdng_rel_2trgt      =       GPS_hdng_abs_2trgt - n;
420
                                GPS_hdng_rel_2trgt      =       GPS_hdng_abs_2trgt - n;
418
                                if      ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180)) GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360;
421
                                if      ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180)) GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360;
419
                                else if (GPS_hdng_rel_2trgt >180)  GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt;
422
                                else if (GPS_hdng_rel_2trgt >180)  GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt;
420
                                else if (GPS_hdng_rel_2trgt <-180)  GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt;
423
                                else if (GPS_hdng_rel_2trgt <-180)  GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt;
421
                               
424
                               
422
                                // Regelabweichung aus x,y zu Ziel in Distanz umrechnen 
425
                                // Regelabweichung aus x,y zu Ziel in Distanz umrechnen 
423
                                if (abs(gps_reg_x) > abs(gps_reg_y) )
426
                                if (abs(gps_reg_x) > abs(gps_reg_y) )
424
                                {
427
                                {
425
                                        dist = (long)gps_reg_x; //Groesseren Wert wegen besserer Genauigkeit nehmen
428
                                        dev = (long)gps_reg_x; //Groesseren Wert wegen besserer Genauigkeit nehmen
426
                                        dist = abs((dist *1000) / (long) sin_i(GPS_hdng_abs_2trgt));
429
                                        dev = abs((dev *1000) / (long) sin_i(GPS_hdng_abs_2trgt));
427
                                }
430
                                }
428
                                else
431
                                else
429
                                {
432
                                {
430
                                        dist = (long)gps_reg_y;
433
                                        dev = (long)gps_reg_y;
431
                                        dist = abs((dist *1000) / (long) cos_i(GPS_hdng_abs_2trgt));
434
                                        dev = abs((dev *1000) / (long) cos_i(GPS_hdng_abs_2trgt));
432
                                }
435
                                }
433
                                GPS_dist_2trgt  = (int) dist;
436
                                GPS_dist_2trgt  = (int) dev;
434
                                // Winkel und Distanz in Nick und Rollgroessen umrechnen
437
                                // Winkel und Distanz in Nick und Rollgroessen umrechnen
435
                                GPS_Roll = (int) +( (dist * (long) sin_i(GPS_hdng_rel_2trgt))/1000);
438
                                GPS_Roll = (int) +( (dev * (long) sin_i(GPS_hdng_rel_2trgt))/1000);
436
                                GPS_Nick = (int) -( (dist * (long) cos_i(GPS_hdng_rel_2trgt))/1000);
439
                                GPS_Nick = (int) -( (dev * (long) cos_i(GPS_hdng_rel_2trgt))/1000);
437
                                       
440
                                       
438
                                #define GPS_V 8 // auf Maximalwert normieren. Teilerfaktor ist 8
441
                                #define GPS_V 8 // auf Maximalwert normieren. Teilerfaktor ist 8
439
                                if (GPS_Roll > (GPS_NICKROLL_MAX * GPS_V)) GPS_Roll = (GPS_NICKROLL_MAX * GPS_V);
442
                                if (GPS_Roll > (GPS_NICKROLL_MAX * GPS_V)) GPS_Roll = (GPS_NICKROLL_MAX * GPS_V);
440
                                else if (GPS_Roll < -(GPS_NICKROLL_MAX * GPS_V)) GPS_Roll = -(GPS_NICKROLL_MAX * GPS_V);
443
                                else if (GPS_Roll < -(GPS_NICKROLL_MAX * GPS_V)) GPS_Roll = -(GPS_NICKROLL_MAX * GPS_V);
441
                                if (GPS_Nick > (GPS_NICKROLL_MAX * GPS_V)) GPS_Nick = (GPS_NICKROLL_MAX * GPS_V);
444
                                if (GPS_Nick > (GPS_NICKROLL_MAX * GPS_V)) GPS_Nick = (GPS_NICKROLL_MAX * GPS_V);
442
                                else if (GPS_Nick < -(GPS_NICKROLL_MAX * GPS_V)) GPS_Nick = -(GPS_NICKROLL_MAX * GPS_V);
445
                                else if (GPS_Nick < -(GPS_NICKROLL_MAX * GPS_V)) GPS_Nick = -(GPS_NICKROLL_MAX * GPS_V);
443
 
446
 
444
                                //Kleine Werte verstaerken, Grosse abschwaechen
447
                                //Kleine Werte verstaerken, Grosse abschwaechen
445
                                n                       = sin_i((GPS_Roll*90)/(GPS_NICKROLL_MAX * GPS_V));
448
                                n                       = sin_i((GPS_Roll*90)/(GPS_NICKROLL_MAX * GPS_V));
446
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
449
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
447
                                GPS_Roll        = (int) n_l;
450
                                GPS_Roll        = (int) n_l;
448
                                n                       = sin_i((GPS_Nick*90)/(GPS_NICKROLL_MAX * GPS_V));
451
                                n                       = sin_i((GPS_Nick*90)/(GPS_NICKROLL_MAX * GPS_V));
449
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
452
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
450
                                GPS_Nick        = (int) n_l;
453
                                GPS_Nick        = (int) n_l;
451
                                 
454
                                 
452
                                if ((abs(dist_east) > GPS_DIST_MAX) || (abs(dist_north) > GPS_DIST_MAX))  // bei zu grossem Abstand abbrechen
455
                                if ((abs(dist_east) > GPS_DIST_MAX) || (abs(dist_north) > GPS_DIST_MAX))  // bei zu grossem Abstand abbrechen
453
                                {
456
                                {
454
                                        GPS_Roll        = 0;
457
                                        GPS_Roll        = 0;
455
                                        GPS_Nick        = 0;
458
                                        GPS_Nick        = 0;
456
                                        gps_state       = GPS_CRTL_IDLE;
459
                                        gps_state       = GPS_CRTL_IDLE;
457
                                        return (GPS_STST_ERR); 
460
                                        return (GPS_STST_ERR); 
458
                                        break;                                 
461
                                        break;                                 
459
                                }
462
                                }
460
                        }
463
                        }
461
                        else return (GPS_STST_OK);
464
                        else return (GPS_STST_OK);
462
                        break;
465
                        break;
463
 
466
 
464
                default:
467
                default:
465
                        gps_state       = GPS_CRTL_IDLE;
468
                        gps_state       = GPS_CRTL_IDLE;
466
                        return (GPS_STST_ERR);
469
                        return (GPS_STST_ERR);
467
                        break;
470
                        break;
468
        }      
471
        }      
469
        return (GPS_STST_ERR);
472
        return (GPS_STST_ERR);
470
                       
473
                       
471
}
474
}
472
 
475
 
473
 
476