Subversion Repositories FlightCtrl

Rev

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

Rev 159 Rev 160
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
Regelung fuer GPS noch nicht implementiert
15
Regelung fuer GPS noch nicht implementiert
16
Stand 16.9.2007
16
Stand 16.9.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
 
57
 
58
static uint8_t *ptr_payload_data;
58
static uint8_t *ptr_payload_data;
59
static uint8_t *ptr_pac_status;
59
static uint8_t *ptr_pac_status;
60
 
60
 
61
short int Get_GPS_data(void);
61
short int Get_GPS_data(void);
62
 
62
 
63
NAV_POSUTM_t actual_pos;    // Aktuelle Nav Daten werden hier im ublox Format abgelegt
63
NAV_POSUTM_t actual_pos;    // Aktuelle Nav Daten werden hier im ublox Format abgelegt
64
NAV_STATUS_t actual_status; // Aktueller Nav Status
64
NAV_STATUS_t actual_status; // Aktueller Nav Status
65
NAV_VELNED_t actual_speed;  // Aktueller Geschwindigkeits und Richtungsdaten
65
NAV_VELNED_t actual_speed;  // Aktueller Geschwindigkeits und Richtungsdaten
66
 
66
 
67
GPS_ABS_POSITION_t              gps_act_position;               // Alle wichtigen Daten zusammengefasst
67
GPS_ABS_POSITION_t              gps_act_position;               // Alle wichtigen Daten zusammengefasst
68
GPS_ABS_POSITION_t              gps_home_position;      // Die Startposition, beim Kalibrieren ermittelt
68
GPS_ABS_POSITION_t              gps_home_position;      // Die Startposition, beim Kalibrieren ermittelt
69
GPS_REL_POSITION_t              gps_rel_act_position;   // Die aktuelle relative Position bezogen auf Home Position
69
GPS_REL_POSITION_t              gps_rel_act_position;   // Die aktuelle relative Position bezogen auf Home Position
70
GPS_REL_POSITION_t              gps_rel_hold_position;  // Die gespeicherte Sollposition fuer GPS_ Hold Mode
70
GPS_REL_POSITION_t              gps_rel_hold_position;  // Die gespeicherte Sollposition fuer GPS_ Hold Mode
71
 
71
 
72
// Initialisierung
72
// Initialisierung
73
void GPS_Neutral(void)
73
void GPS_Neutral(void)
74
{
74
{
75
        short int n;
-
 
76
        ublox_msg_state                         =       UBLOX_IDLE;
75
        ublox_msg_state                         =       UBLOX_IDLE;
77
        gps_state                                       =       GPS_CRTL_IDLE;
76
        gps_state                                       =       GPS_CRTL_IDLE;
78
        actual_pos.status                       =       0;
77
        actual_pos.status                       =       0;
79
        actual_speed.status                     =       0;
78
        actual_speed.status                     =       0;
80
        actual_status.status            =       0;
79
        actual_status.status            =       0;
81
        gps_home_position.status        =       0; // Noch keine gueltige Home Position
80
        gps_home_position.status        =       0; // Noch keine gueltige Home Position
82
        gps_act_position.status         =       0;
81
        gps_act_position.status         =       0;
83
        gps_rel_act_position.status     =       0;     
82
        gps_rel_act_position.status     =       0;     
84
        GPS_Nick                                        =       0;
83
        GPS_Nick                                        =       0;
85
        GPS_Roll                                        =       0;
84
        GPS_Roll                                        =       0;
86
        gps_updte_flag                          =       0;
85
        gps_updte_flag                          =       0;
87
        gps_int_x                                       =       0;
86
        gps_int_x                                       =       0;
88
        gps_int_y                                       =       0;
87
        gps_int_y                                       =       0;
89
 
88
 
90
}
89
}
91
 
90
 
92
// Home Position sichern falls Daten verfuegbar sind. 
91
// Home Position sichern falls Daten verfuegbar sind. 
93
void GPS_Save_Home(void)
92
void GPS_Save_Home(void)
94
{
93
{
95
        short int n;
94
        short int n;
96
        n = Get_GPS_data();
95
        n = Get_GPS_data();
97
        if (n == 0)   // Gueltige  und aktuelle Daten ?   
96
        if (n == 0)   // Gueltige  und aktuelle Daten ?   
98
        {
97
        {
99
                // Neue GPS Daten liegen vor
98
                // Neue GPS Daten liegen vor
100
                gps_home_position.utm_east      = gps_act_position.utm_east;   
99
                gps_home_position.utm_east      = gps_act_position.utm_east;   
101
                gps_home_position.utm_north     = gps_act_position.utm_north;  
100
                gps_home_position.utm_north     = gps_act_position.utm_north;  
102
                gps_home_position.utm_alt       = gps_act_position.utm_alt;
101
                gps_home_position.utm_alt       = gps_act_position.utm_alt;
103
                gps_home_position.status        = 1; // Home Position gueltig                   
102
                gps_home_position.status        = 1; // Home Position gueltig                   
104
        }
103
        }
105
}
104
}
106
 
105
 
107
// Relative Position zur Home Position bestimmen
106
// Relative Position zur Home Position bestimmen
108
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
107
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
109
short int Get_Rel_Position(void)
108
short int Get_Rel_Position(void)
110
{
109
{
111
        short int n = 0;
110
        short int n = 0;
112
        n = Get_GPS_data();
111
        n = Get_GPS_data();
113
        if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind
112
        if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind
114
        if  (gps_home_position.status > 0) //Nur wenn Home Position vorliegt
113
        if  (gps_home_position.status > 0) //Nur wenn Home Position vorliegt
115
        {
114
        {
116
                gps_rel_act_position.utm_east   = (int)  (gps_act_position.utm_east - gps_home_position.utm_east);
115
                gps_rel_act_position.utm_east   = (int)  (gps_act_position.utm_east - gps_home_position.utm_east);
117
                gps_rel_act_position.utm_north  = (int)  (gps_act_position.utm_north - gps_home_position.utm_north);
116
                gps_rel_act_position.utm_north  = (int)  (gps_act_position.utm_north - gps_home_position.utm_north);
118
                gps_rel_act_position.status     = 1; // gueltige Positionsdaten
117
                gps_rel_act_position.status     = 1; // gueltige Positionsdaten
119
                n = 0;
118
                n = 0;
120
                gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen.
119
                gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen.
121
        }
120
        }
122
        else
121
        else
123
        {
122
        {
124
                n = 2; //keine gueltigen Daten vorhanden
123
                n = 2; //keine gueltigen Daten vorhanden
125
                gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist.
124
                gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist.
126
        }      
125
        }      
127
        return (n);
126
        return (n);
128
}
127
}
129
 
128
 
130
// Daten aus aktuellen ublox Messages extrahieren 
129
// Daten aus aktuellen ublox Messages extrahieren 
131
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
130
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
132
short int Get_GPS_data(void)
131
short int Get_GPS_data(void)
133
{
132
{
134
        short int n = 1;
133
        short int n = 1;
135
 
134
 
136
        if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist
135
        if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist
137
        if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0))
136
        if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0))
138
        {
137
        {
139
                cnt1++; //**** noch Rausschmeissen
138
                cnt1++; //**** noch Rausschmeissen
140
                if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind
139
                if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind
141
                {
140
                {
142
                        gps_act_position.utm_east       = actual_pos.utm_east/10;
141
                        gps_act_position.utm_east       = actual_pos.utm_east/10;
143
                        gps_act_position.utm_north      = actual_pos.utm_north/10;
142
                        gps_act_position.utm_north      = actual_pos.utm_north/10;
144
                        gps_act_position.utm_alt        = actual_pos.utm_alt/10;
143
                        gps_act_position.utm_alt        = actual_pos.utm_alt/10;
145
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
144
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
146
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
145
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
147
                        gps_act_position.heading        = actual_speed.heading/100000;
146
                        gps_act_position.heading        = actual_speed.heading/100000;
148
                        gps_act_position.status         = 1;
147
                        gps_act_position.status         = 1;
149
                        n                                                       = 0; //Daten gueltig
148
                        n                                                       = 0; //Daten gueltig
150
                }
149
                }
151
                else
150
                else
152
                {
151
                {
153
                        gps_act_position.status = 0; //Keine gueltigen Daten
152
                        gps_act_position.status = 0; //Keine gueltigen Daten
154
                        n                                               = 2;
153
                        n                                               = 2;
155
                }
154
                }
156
                actual_pos.status               = 0; //neue ublox Messages anfordern
155
                actual_pos.status               = 0; //neue ublox Messages anfordern
157
                actual_status.status    = 0;
156
                actual_status.status    = 0;
158
                actual_speed.status     = 0;
157
                actual_speed.status     = 0;
159
        }      
158
        }      
160
        return (n);    
159
        return (n);    
161
}
160
}
162
 
161
 
163
 
162
 
164
/*
163
/*
165
Daten vom GPS im ublox MSG Format auswerten
164
Daten vom GPS im ublox MSG Format auswerten
166
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen
165
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen
167
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein
166
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein
168
*/
167
*/
169
void Get_Ublox_Msg(uint8_t rx)
168
void Get_Ublox_Msg(uint8_t rx)
170
{
169
{
171
 
170
 
172
        switch (ublox_msg_state)
171
        switch (ublox_msg_state)
173
        {
172
        {
174
 
173
 
175
                case UBLOX_IDLE: // Zuerst Synchcharacters pruefen
174
                case UBLOX_IDLE: // Zuerst Synchcharacters pruefen
176
                        if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1;
175
                        if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1;
177
                        else ublox_msg_state = UBLOX_IDLE;
176
                        else ublox_msg_state = UBLOX_IDLE;
178
                        break;
177
                        break;
179
 
178
 
180
                case UBLOX_SYNC1:
179
                case UBLOX_SYNC1:
181
 
180
 
182
                        if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2;
181
                        if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2;
183
                        else ublox_msg_state = UBLOX_IDLE;
182
                        else ublox_msg_state = UBLOX_IDLE;
184
                        chk_a = 0,chk_b = 0;
183
                        chk_a = 0,chk_b = 0;
185
                        break;
184
                        break;
186
 
185
 
187
                case UBLOX_SYNC2:
186
                case UBLOX_SYNC2:
188
                        if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS;      
187
                        if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS;      
189
                        else ublox_msg_state = UBLOX_IDLE;
188
                        else ublox_msg_state = UBLOX_IDLE;
190
                        break;
189
                        break;
191
 
190
 
192
                case UBLOX_CLASS: // Nur NAV Meldungen auswerten
191
                case UBLOX_CLASS: // Nur NAV Meldungen auswerten
193
                        switch (rx)
192
                        switch (rx)
194
                        {
193
                        {
195
                                case UBLOX_NAV_POSUTM:
194
                                case UBLOX_NAV_POSUTM:
196
                                        ptr_pac_status  =       &actual_pos.status;
195
                                        ptr_pac_status  =       &actual_pos.status;
197
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden
196
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden
198
                                        else
197
                                        else
199
                                        {
198
                                        {
200
                                                ptr_payload_data                = &actual_pos;
199
                                                ptr_payload_data                = &actual_pos;
201
                                                ptr_payload_data_end    = &actual_pos.status;
200
                                                ptr_payload_data_end    = &actual_pos.status;
202
                                                ublox_msg_state                 = UBLOX_LEN1;
201
                                                ublox_msg_state                 = UBLOX_LEN1;
203
                                        }
202
                                        }
204
                                        break;
203
                                        break;
205
 
204
 
206
                                case UBLOX_NAV_STATUS:
205
                                case UBLOX_NAV_STATUS:
207
                                        ptr_pac_status  =       &actual_status.status;
206
                                        ptr_pac_status  =       &actual_status.status;
208
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
207
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
209
                                        else
208
                                        else
210
                                        {
209
                                        {
211
                                                ptr_payload_data                = &actual_status;
210
                                                ptr_payload_data                = &actual_status;
212
                                                ptr_payload_data_end    = &actual_status.status;
211
                                                ptr_payload_data_end    = &actual_status.status;
213
                                                ublox_msg_state                 = UBLOX_LEN1;
212
                                                ublox_msg_state                 = UBLOX_LEN1;
214
                                        }
213
                                        }
215
                                        break;
214
                                        break;
216
 
215
 
217
                                case UBLOX_NAV_VELED:
216
                                case UBLOX_NAV_VELED:
218
                                        ptr_pac_status          =       &actual_speed.status;
217
                                        ptr_pac_status          =       &actual_speed.status;
219
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
218
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
220
                                        else
219
                                        else
221
                                        {
220
                                        {
222
                                                ptr_payload_data                = &actual_speed;
221
                                                ptr_payload_data                = &actual_speed;
223
                                                ptr_payload_data_end    = &actual_speed.status;
222
                                                ptr_payload_data_end    = &actual_speed.status;
224
                                                ublox_msg_state                 = UBLOX_LEN1;
223
                                                ublox_msg_state                 = UBLOX_LEN1;
225
                                        }
224
                                        }
226
                                        break;
225
                                        break;
227
 
226
 
228
                                default:
227
                                default:
229
                                        ublox_msg_state = UBLOX_IDLE;
228
                                        ublox_msg_state = UBLOX_IDLE;
230
                                        break; 
229
                                        break; 
231
                        }
230
                        }
232
                        chk_a   = UBLOX_NAV_CLASS + rx;
231
                        chk_a   = UBLOX_NAV_CLASS + rx;
233
                        chk_b   = UBLOX_NAV_CLASS + chk_a;                     
232
                        chk_b   = UBLOX_NAV_CLASS + chk_a;                     
234
                        break;
233
                        break;
235
 
234
 
236
                case UBLOX_LEN1: // Laenge auswerten
235
                case UBLOX_LEN1: // Laenge auswerten
237
                        rx_len  = rx;
236
                        rx_len  = rx;
238
                        chk_a   += rx;
237
                        chk_a   += rx;
239
                        chk_b   += chk_a;              
238
                        chk_b   += chk_a;              
240
                        ublox_msg_state = UBLOX_LEN2;
239
                        ublox_msg_state = UBLOX_LEN2;
241
                        break;
240
                        break;
242
 
241
 
243
 
242
 
244
                case UBLOX_LEN2: // Laenge auswerten
243
                case UBLOX_LEN2: // Laenge auswerten
245
                        rx_len = rx_len + (rx *256); // Laenge ermitteln
244
                        rx_len = rx_len + (rx *256); // Laenge ermitteln
246
                        chk_a   += rx;
245
                        chk_a   += rx;
247
                        chk_b   += chk_a;      
246
                        chk_b   += chk_a;      
248
                        ublox_msg_state = UBLOX_PAYLOAD;
247
                        ublox_msg_state = UBLOX_PAYLOAD;
249
                        break;
248
                        break;
250
 
249
 
251
                case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen
250
                case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen
252
                        if (rx_len > 0)
251
                        if (rx_len > 0)
253
                        {
252
                        {
254
                                *ptr_payload_data = rx;
253
                                *ptr_payload_data = rx;
255
                                chk_a   += rx;
254
                                chk_a   += rx;
256
                                chk_b   += chk_a;
255
                                chk_b   += chk_a;
257
                                --rx_len;      
256
                                --rx_len;      
258
                                if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end))                          
257
                                if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end))                          
259
                                {
258
                                {
260
                                        ptr_payload_data++;
259
                                        ptr_payload_data++;
261
                                        ublox_msg_state = UBLOX_PAYLOAD;
260
                                        ublox_msg_state = UBLOX_PAYLOAD;
262
                            }
261
                            }
263
                                else ublox_msg_state = UBLOX_CKA;
262
                                else ublox_msg_state = UBLOX_CKA;
264
                        }      
263
                        }      
265
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
264
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
266
                        break;
265
                        break;
267
 
266
 
268
                case UBLOX_CKA: // Checksum pruefen
267
                case UBLOX_CKA: // Checksum pruefen
269
                        if (rx == chk_a) ublox_msg_state = UBLOX_CKB;                          
268
                        if (rx == chk_a) ublox_msg_state = UBLOX_CKB;                          
270
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
269
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
271
                        break;
270
                        break;
272
 
271
 
273
                case UBLOX_CKB: // Checksum pruefen
272
                case UBLOX_CKB: // Checksum pruefen
274
                        if (rx == chk_b) *ptr_pac_status = 1; // Paket ok
273
                        if (rx == chk_b) *ptr_pac_status = 1; // Paket ok
275
                        ublox_msg_state    = UBLOX_IDLE;
274
                        ublox_msg_state    = UBLOX_IDLE;
276
                        break;
275
                        break;
277
 
276
 
278
                default:
277
                default:
279
                        ublox_msg_state = UBLOX_IDLE;          
278
                        ublox_msg_state = UBLOX_IDLE;          
280
                        break;
279
                        break;
281
        }
280
        }
282
}
281
}
283
       
282
       
284
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe
283
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe
285
short int GPS_CRTL(short int cmd)
284
short int GPS_CRTL(short int cmd)
286
{
285
{
287
        static unsigned int cnt;        //Zaehler fuer diverse Verzoegerungen 
286
        static unsigned int cnt;        //Zaehler fuer diverse Verzoegerungen 
288
 
287
        int n;
-
 
288
        long int dist;
289
        switch (cmd)
289
        switch (cmd)
290
        {
290
        {
291
                case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden.
291
                case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden.
292
                        if (gps_state != GPS_CRTL_HOLD_ACTIVE)
292
                        if (gps_state != GPS_CRTL_HOLD_ACTIVE)
293
                        {
293
                        {
294
                                cnt++;
294
                                cnt++;
295
                                if (cnt > 300) // erst nach Verzoegerung 
295
                                if (cnt > 500) // erst nach Verzoegerung 
296
                                {
296
                                {
297
                                        cnt     =       0;
297
                                        cnt     =       0;
298
                                        // aktuelle positionsdaten abespeichern
298
                                        // aktuelle positionsdaten abespeichern
299
                                        if (gps_rel_act_position.status > 0)
299
                                        if (gps_rel_act_position.status > 0)
300
                                        {
300
                                        {
301
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
301
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
302
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
302
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
303
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
303
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
304
                                                gps_state                                               = GPS_CRTL_HOLD_ACTIVE;
304
                                                gps_state                                               = GPS_CRTL_HOLD_ACTIVE;
305
                                                return (GPS_STST_OK);                          
305
                                                return (GPS_STST_OK);                          
306
                                        }
306
                                        }
307
                                        else
307
                                        else
308
                                        {
308
                                        {
309
                                                gps_rel_hold_position.status    =       0;  //Keine Daten verfuegbar
309
                                                gps_rel_hold_position.status    =       0;  //Keine Daten verfuegbar
310
                                                gps_state                                               = GPS_CRTL_IDLE;
310
                                                gps_state                                               = GPS_CRTL_IDLE;
311
                                                return(GPS_STST_ERR); // Keine Daten da
311
                                                return(GPS_STST_ERR); // Keine Daten da
312
                                        }
312
                                        }
313
                                }
313
                                }
314
                                else return(GPS_STST_PEND); // noch warten
314
                                else return(GPS_STST_PEND); // noch warten
315
                        }
315
                        }
316
                        break;
316
                        break;
317
 
317
 
318
                case GPS_CMD_STOP_HOLD: // Lageregelung beenden
318
                case GPS_CMD_STOP_HOLD: // Lageregelung beenden
319
                        cnt                             =       0;
319
                        cnt                             =       0;
320
                        GPS_Nick                =       0;
320
                        GPS_Nick                =       0;
321
                        GPS_Roll                =       0;
321
                        GPS_Roll                =       0;
322
                        gps_state               =       GPS_CRTL_IDLE;
322
                        gps_state               =       GPS_CRTL_IDLE;
323
                        gps_int_x               =       0;
323
                        gps_int_x               =       0;
324
                        gps_int_y               =       0;
324
                        gps_int_y               =       0;
325
                        return (GPS_STST_OK);
325
                        return (GPS_STST_OK);
326
                        break;
326
                        break;
327
 
327
 
328
                default:
328
                default:
329
                        return (GPS_STST_ERR);
329
                        return (GPS_STST_ERR);
330
                        break;
330
                        break;
331
        }
331
        }
332
 
332
 
333
        switch (gps_state)
333
        switch (gps_state)
334
        {      
334
        {      
335
                case GPS_CRTL_IDLE:
335
                case GPS_CRTL_IDLE:
336
                        cnt             =       0;
336
                        cnt             =       0;
337
                        return (GPS_STST_OK);
337
                        return (GPS_STST_OK);
338
                        break;
338
                        break;
339
 
339
 
340
                case GPS_CRTL_HOLD_ACTIVE: // Hier werden die Daten fuer Nick und Roll errechnet
340
                case GPS_CRTL_HOLD_ACTIVE: // Hier werden die Daten fuer Nick und Roll errechnet
341
                        if (gps_updte_flag == 1)  //nur wenn neue GPS Daten vorliegen
341
                        if (gps_updte_flag == 1)  //nur wenn neue GPS Daten vorliegen
342
                        {
342
                        {
343
                                gps_updte_flag = 0;
343
                                gps_updte_flag = 0;
344
                                // ab hier wird geregelt
344
                                // ab hier wird geregelt
345
                                signed int dist_north,dist_east;
345
                                signed int dist_north,dist_east;
346
                                dist_east = gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east;
346
                                dist_east = gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east;
347
                                dist_north = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north;
347
                                dist_north = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north;
348
 
348
                               
349
                                //PI Regler
349
                                //PI Regler
350
                                gps_int_x       =       gps_int_x + (dist_east  * Parameter_UserParam1)/16; // Integrator
350
                                gps_int_x       =       gps_int_x + (dist_east  * Parameter_UserParam1)/16; // Integrator
351
                                gps_int_y       =       gps_int_y + (dist_north * Parameter_UserParam1)/16;
351
                                gps_int_y       =       gps_int_y + (dist_north * Parameter_UserParam1)/16;
352
                                if ((gps_int_x >= 4096) || (gps_int_y >= 4096) || (gps_int_x < - 4096) || (gps_int_y <= -4096))
352
                                if ((gps_int_x >= 4096) || (gps_int_y >= 4096) || (gps_int_x < - 4096) || (gps_int_y <= -4096))
353
                                {                      
353
                                {                      
354
                                        gps_int_x -= (dist_east  * Parameter_UserParam1)/16; // Integrator stoppen
354
                                        gps_int_x -= (dist_east  * Parameter_UserParam1)/16; // Integrator stoppen
355
                                        gps_int_y -= (dist_north  * Parameter_UserParam1)/16;
355
                                        gps_int_y -= (dist_north  * Parameter_UserParam1)/16;
356
                                }                              
356
                                }                              
357
                                gps_reg_x       =       gps_int_x + (dist_east  * Parameter_UserParam2)/16;  // P Anteil dazu
357
                                gps_reg_x       =       gps_int_x + (dist_east  * Parameter_UserParam2)/16;  // P Anteil dazu
358
                                gps_reg_y       =       gps_int_y + (dist_north  * Parameter_UserParam2)/16;  
358
                                gps_reg_y       =       gps_int_y + (dist_north  * Parameter_UserParam2)/16;  
359
 
359
 
360
                                //Richtung bezogen auf Nordpol bestimmen
360
                                //Richtung bezogen auf Nordpol bestimmen
361
                                GPS_hdng_abs_2trgt = arctan_i((long)gps_reg_x,(long)gps_reg_y);
361
                                GPS_hdng_abs_2trgt = arctan_i((long)gps_reg_x,(long)gps_reg_y);
362
 
362
 
363
                                //in Winkel 0..360 grad umrechnen
363
                                //in Winkel 0..360 grad umrechnen
364
                                if ((dist_east >= 0) && (dist_north < 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt);
364
                                if ((gps_reg_x >= 0) && (gps_reg_y < 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt);
365
                                else if ((dist_east <  0) ) GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt);
365
                                else if ((gps_reg_x <  0) ) GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt);
366
                                // Relative Richtung in bezug auf Nordachse des Kopters errechen
366
                                // Relative Richtung in bezug auf Nordachse des Kopters errechen
367
                                int n,m;
-
 
368
                                n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT;
367
                                n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT;
369
                                GPS_hdng_rel_2trgt      =       GPS_hdng_abs_2trgt - n;
368
                                GPS_hdng_rel_2trgt      =       GPS_hdng_abs_2trgt - n;
370
                                if      ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180))GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360;
369
                                if      ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180))GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360;
371
                                else if (GPS_hdng_rel_2trgt >180)  GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt;
370
                                else if (GPS_hdng_rel_2trgt >180)  GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt;
372
                                else if (GPS_hdng_rel_2trgt <-180)  GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt;
371
                                else if (GPS_hdng_rel_2trgt <-180)  GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt;
-
 
372
                               
-
 
373
                                // Regelabweichung aus x,y zu Ziel  in Distanz umrechnen
-
 
374
       
-
 
375
                                if (abs(gps_reg_x) > abs(gps_reg_y) )
-
 
376
                                {
-
 
377
                                        dist = (long)gps_reg_x; //Groesseren Wert wegen besserer genauigkeit nehmen
-
 
378
                                        dist = abs((dist *1000) / (long) cos_i(GPS_hdng_rel_2trgt));
-
 
379
                                }
-
 
380
                                else
-
 
381
                                {
-
 
382
                                        dist    = (long)gps_reg_y;
-
 
383
                                        dist = abs((dist *1000) / (long) sin_i(GPS_hdng_rel_2trgt));
-
 
384
                                }
373
                               
385
                                if (dist > 30000) dist = 30000;
-
 
386
                                GPS_dist_2trgt = (int )dist;
-
 
387
 
-
 
388
                                // Winkel und Distanz in Nick und Roll groessen umrechnen
-
 
389
                                long int a,b;
374
                                // Distanz zum Ziel ermitteln
390
                                GPS_Roll = (int) -((dist * sin_i(GPS_hdng_rel_2trgt))/(1000*4));
-
 
391
                                GPS_Nick = (int) -((dist * cos_i(GPS_hdng_rel_2trgt))/(1000*4));
-
 
392
 
-
 
393
                                if (GPS_Roll > GPS_ROLL_MAX) GPS_Roll = GPS_ROLL_MAX; //Auf Maxwerte begrenzen
-
 
394
                                else if (GPS_Roll <  -GPS_ROLL_MAX) GPS_Roll = - GPS_ROLL_MAX;
-
 
395
                                if (GPS_Nick > GPS_NICK_MAX) GPS_Nick = GPS_NICK_MAX;
-
 
396
                                else if (GPS_Nick <  -GPS_NICK_MAX) GPS_Nick = - GPS_NICK_MAX;
375
                                GPS_dist_2trgt = abs(dist_north) + abs(dist_east);//ACHTUNG: Noch Nicht korrekt
397
 
376
                                return (GPS_STST_OK);                  
398
                                return (GPS_STST_OK);                  
377
                        }
399
                        }
378
                        else return (GPS_STST_OK);
400
                        else return (GPS_STST_OK);
379
                        break;
401
                        break;
380
 
402
 
381
                default:
403
                default:
382
                        gps_state       = GPS_CRTL_IDLE;
404
                        gps_state       = GPS_CRTL_IDLE;
383
                        return (GPS_STST_ERR);
405
                        return (GPS_STST_ERR);
384
                        break;
406
                        break;
385
        }      
407
        }      
386
        return (GPS_STST_ERR);
408
        return (GPS_STST_ERR);
387
                       
409
                       
388
}
410
}
389
 
411
 
390
 
412