Subversion Repositories FlightCtrl

Rev

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

Rev 621 Rev 622
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 Lesser General Public License as published by the Free Software Foundation;
3
it under the terms of the GNU Lesser 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 and GNU Lesser General Public License for more details.
7
GNU General Public License and GNU Lesser General Public License for more details.
8
You should have received a copy of GNU General Public License (License_GPL.txt)  and
8
You should have received a copy of GNU General Public License (License_GPL.txt)  and
9
GNU Lesser General Public License (License_LGPL.txt) along with this program.
9
GNU Lesser General Public License (License_LGPL.txt) along with this program.
10
If not, see <http://www.gnu.org/licenses/>.
10
If not, see <http://www.gnu.org/licenses/>.
11
 
11
 
12
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
12
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
13
*/
13
*/
14
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
14
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15
Peter Muehlenbrock
15
Peter Muehlenbrock
16
Auswertung der Daten vom GPS im ublox Format
16
Auswertung der Daten vom GPS im ublox Format
17
Hold Modus mit PID Regler
17
Hold Modus mit PID Regler
18
Rückstuerz zur Basis Funktion
18
Rückstuerz zur Basis Funktion
19
Stand 24.10.2007
19
Stand 24.10.2007
20
Anederung: 24.10. Altitude in relativer Position jetzt auch drin
20
Anederung: 24.10. Altitude in relativer Position jetzt auch drin
21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22
*/
22
*/
23
#include "main.h"
23
#include "main.h"
24
#include "math.h"
24
#include "math.h"
25
//#include "gps.h"
25
//#include "gps.h"
26
 
26
 
27
// Defines fuer ublox Messageformat um Auswertung zu steuern
27
// Defines fuer ublox Messageformat um Auswertung zu steuern
28
#define                 UBLOX_IDLE              0
28
#define                 UBLOX_IDLE              0
29
#define                 UBLOX_SYNC1             1
29
#define                 UBLOX_SYNC1             1
30
#define                 UBLOX_SYNC2             2
30
#define                 UBLOX_SYNC2             2
31
#define                 UBLOX_CLASS             3
31
#define                 UBLOX_CLASS             3
32
#define                 UBLOX_ID                4
32
#define                 UBLOX_ID                4
33
#define                 UBLOX_LEN1              5
33
#define                 UBLOX_LEN1              5
34
#define                 UBLOX_LEN2              6
34
#define                 UBLOX_LEN2              6
35
#define                 UBLOX_CKA               7
35
#define                 UBLOX_CKA               7
36
#define                 UBLOX_CKB               8
36
#define                 UBLOX_CKB               8
37
#define                 UBLOX_PAYLOAD   9
37
#define                 UBLOX_PAYLOAD   9
38
 
38
 
39
// ublox Protokoll Identifier 
39
// ublox Protokoll Identifier 
40
#define                 UBLOX_NAV_POSUTM                0x08
40
#define                 UBLOX_NAV_POSUTM                0x08
41
#define                 UBLOX_NAV_STATUS                0x03
41
#define                 UBLOX_NAV_STATUS                0x03
42
#define                 UBLOX_NAV_VELED                 0x12
42
#define                 UBLOX_NAV_VELED                 0x12
43
#define                 UBLOX_NAV_CLASS                 0x01
43
#define                 UBLOX_NAV_CLASS                 0x01
44
#define                 UBLOX_SYNCH1_CHAR               0xB5
44
#define                 UBLOX_SYNCH1_CHAR               0xB5
45
#define                 UBLOX_SYNCH2_CHAR               0x62
45
#define                 UBLOX_SYNCH2_CHAR               0x62
46
 
46
 
47
signed int                      GPS_Nick = 0;
47
signed int                      GPS_Nick = 0;
48
signed int                      GPS_Roll = 0;
48
signed int                      GPS_Roll = 0;
49
short int                       ublox_msg_state = UBLOX_IDLE;
49
short int                       ublox_msg_state = UBLOX_IDLE;
50
static                          uint8_t chk_a =0; //Checksum
50
static                          uint8_t chk_a =0; //Checksum
51
static                          uint8_t chk_b =0;
51
static                          uint8_t chk_b =0;
52
short int                       gps_state,gps_sub_state; //Zustaende der Statemachine
52
short int                       gps_state,gps_sub_state; //Zustaende der Statemachine
53
short int                       gps_updte_flag;
53
short int                       gps_updte_flag;
54
static signed int       GPS_hdng_abs_2trgt; //Winkel zum Ziel bezogen auf Nordpol
54
static signed int       GPS_hdng_abs_2trgt; //Winkel zum Ziel bezogen auf Nordpol
55
static signed int       GPS_hdng_rel_2trgt; //Winkel zum Ziel bezogen auf Nordachse des Kopters
55
static signed int       GPS_hdng_rel_2trgt; //Winkel zum Ziel bezogen auf Nordachse des Kopters
56
static signed int       GPS_dist_2trgt; //vorzeichenlose Distanz zum Ziel 
56
static signed int       GPS_dist_2trgt; //vorzeichenlose Distanz zum Ziel 
57
static signed int       gps_int_x,gps_int_y,gps_reg_x,gps_reg_y;                               
57
static signed int       gps_int_x,gps_int_y,gps_reg_x,gps_reg_y;                               
58
static unsigned int rx_len;
58
static unsigned int rx_len;
59
static unsigned int ptr_payload_data_end;
59
static unsigned int ptr_payload_data_end;
60
unsigned int            gps_alive_cnt; // Wird bei jedem gueltigen GPS Telegramm hochgezaehlt
60
unsigned int            gps_alive_cnt; // Wird bei jedem gueltigen GPS Telegramm hochgezaehlt
61
static signed int       hdng_2home,dist_2home; //Richtung und Entfernung zur home Position 
61
static signed int       hdng_2home,dist_2home; //Richtung und Entfernung zur home Position 
62
static signed           gps_tick; //wird bei jedem Update durch das GPS Modul hochgezaehlt 
62
static signed           gps_tick; //wird bei jedem Update durch das GPS Modul hochgezaehlt 
63
static                          short int hold_fast,hold_reset_int; //Flags fuer Hold Regler
63
static                          short int hold_fast,hold_reset_int; //Flags fuer Hold Regler
64
static                          uint8_t *ptr_payload_data;
64
static                          uint8_t *ptr_payload_data;
65
static                          uint8_t *ptr_pac_status;
65
static                          uint8_t *ptr_pac_status;
66
static long int         dist_flown;
66
static long int         dist_flown;
67
static unsigned int int_ovfl_cnt; // Zaehler fuer Overflows des Integrators
67
static unsigned int int_ovfl_cnt; // Zaehler fuer Overflows des Integrators
68
 
68
 
69
 
69
 
70
short int Get_GPS_data(void);
70
short int Get_GPS_data(void);
71
 
71
 
72
NAV_POSUTM_t actual_pos;    // Aktuelle Nav Daten werden hier im ublox Format abgelegt
72
NAV_POSUTM_t actual_pos;    // Aktuelle Nav Daten werden hier im ublox Format abgelegt
73
NAV_STATUS_t actual_status; // Aktueller Nav Status
73
NAV_STATUS_t actual_status; // Aktueller Nav Status
74
NAV_VELNED_t actual_speed;  // Aktueller Geschwindigkeits und Richtungsdaten
74
NAV_VELNED_t actual_speed;  // Aktueller Geschwindigkeits und Richtungsdaten
75
 
75
 
76
GPS_ABS_POSITION_t              gps_act_position;               // Alle wichtigen Daten zusammengefasst
76
GPS_ABS_POSITION_t              gps_act_position;               // Alle wichtigen Daten zusammengefasst
77
GPS_ABS_POSITION_t              gps_home_position;      // Die Startposition, beim Kalibrieren ermittelt
77
GPS_ABS_POSITION_t              gps_home_position;      // Die Startposition, beim Kalibrieren ermittelt
78
GPS_REL_POSITION_t              gps_rel_act_position;   // Die aktuelle relative Position bezogen auf Home Position
78
GPS_REL_POSITION_t              gps_rel_act_position;   // Die aktuelle relative Position bezogen auf Home Position
79
GPS_REL_POSITION_t              gps_rel_hold_position;  // Die gespeicherte Sollposition fuer GPS_ Hold Mode
79
GPS_REL_POSITION_t              gps_rel_hold_position;  // Die gespeicherte Sollposition fuer GPS_ Hold Mode
80
GPS_REL_POSITION_t              gps_rel_start_position; // Die gespeicherte Ausgangsposition fuer GPS_ Home Mode
80
GPS_REL_POSITION_t              gps_rel_start_position; // Die gespeicherte Ausgangsposition fuer GPS_ Home Mode
81
 
81
 
82
// Initialisierung
82
// Initialisierung
83
void GPS_Neutral(void)
83
void GPS_Neutral(void)
84
{
84
{
85
        ublox_msg_state                         =       UBLOX_IDLE;
85
        ublox_msg_state                         =       UBLOX_IDLE;
86
        gps_state                                       =       GPS_CRTL_IDLE;
86
        gps_state                                       =       GPS_CRTL_IDLE;
87
        gps_sub_state                           =       GPS_CRTL_IDLE;
87
        gps_sub_state                           =       GPS_CRTL_IDLE;
88
        actual_pos.status                       =       0;
88
        actual_pos.status                       =       0;
89
        actual_speed.status                     =       0;
89
        actual_speed.status                     =       0;
90
        actual_status.status            =       0;
90
        actual_status.status            =       0;
91
        gps_home_position.status        =       0; // Noch keine gueltige Home Position
91
        gps_home_position.status        =       0; // Noch keine gueltige Home Position
92
        gps_act_position.status         =       0;
92
        gps_act_position.status         =       0;
93
        gps_rel_act_position.status     =       0;     
93
        gps_rel_act_position.status     =       0;     
94
        GPS_Nick                                        =       0;
94
        GPS_Nick                                        =       0;
95
        GPS_Roll                                        =       0;
95
        GPS_Roll                                        =       0;
96
        gps_updte_flag                          =       0;
96
        gps_updte_flag                          =       0;
97
        gps_int_x                                       =       0;
97
        gps_int_x                                       =       0;
98
        gps_int_y                                       =       0;
98
        gps_int_y                                       =       0;
99
        gps_alive_cnt                           =       0;
99
        gps_alive_cnt                           =       0;
100
}
100
}
101
 
101
 
102
// Home Position sichern falls Daten verfuegbar sind. 
102
// Home Position sichern falls Daten verfuegbar sind. 
103
void GPS_Save_Home(void)
103
void GPS_Save_Home(void)
104
{
104
{
105
        short int n;
105
        short int n;
106
        n = Get_GPS_data();
106
        n = Get_GPS_data();
107
        if (n == 0)   // Gueltige  und aktuelle Daten ?   
107
        if (n == 0)   // Gueltige  und aktuelle Daten ?   
108
        {
108
        {
109
                // Neue GPS Daten liegen vor
109
                // Neue GPS Daten liegen vor
110
                gps_home_position.utm_east      = gps_act_position.utm_east;   
110
                gps_home_position.utm_east      = gps_act_position.utm_east;   
111
                gps_home_position.utm_north     = gps_act_position.utm_north;  
111
                gps_home_position.utm_north     = gps_act_position.utm_north;  
112
                gps_home_position.utm_alt       = gps_act_position.utm_alt;
112
                gps_home_position.utm_alt       = gps_act_position.utm_alt;
113
                gps_home_position.status        = 1; // Home Position gueltig                   
113
                gps_home_position.status        = 1; // Home Position gueltig                   
114
        }
114
        }
115
}
115
}
116
 
116
 
117
// Relative Position zur Home Position bestimmen
117
// Relative Position zur Home Position bestimmen
118
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
118
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
119
short int Get_Rel_Position(void)
119
short int Get_Rel_Position(void)
120
{
120
{
121
        short int n = 0;
121
        short int n = 0;
122
        n = Get_GPS_data();
122
        n = Get_GPS_data();
123
        if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind
123
        if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind
124
        if (gps_alive_cnt < 1000) gps_alive_cnt += 600; // Timeoutzaehler. Wird in Motorregler Routine ueberwacht und dekrementiert
124
        if (gps_alive_cnt < 1000) gps_alive_cnt += 600; // Timeoutzaehler. Wird in Motorregler Routine ueberwacht und dekrementiert
125
        if  (gps_home_position.status > 0) //Nur wenn Home Position vorliegt
125
        if  (gps_home_position.status > 0) //Nur wenn Home Position vorliegt
126
        {
126
        {
127
                gps_rel_act_position.utm_east   = (int)  (gps_act_position.utm_east - gps_home_position.utm_east);
127
                gps_rel_act_position.utm_east   = (int)  (gps_act_position.utm_east - gps_home_position.utm_east);
128
                gps_rel_act_position.utm_north  = (int)  (gps_act_position.utm_north - gps_home_position.utm_north);
128
                gps_rel_act_position.utm_north  = (int)  (gps_act_position.utm_north - gps_home_position.utm_north);
129
                gps_rel_act_position.utm_alt    = (int)  (gps_act_position.utm_alt - gps_home_position.utm_alt);
129
                gps_rel_act_position.utm_alt    = (int)  (gps_act_position.utm_alt - gps_home_position.utm_alt);
130
                gps_rel_act_position.status     = 1; // gueltige Positionsdaten
130
                gps_rel_act_position.status     = 1; // gueltige Positionsdaten
131
                n = 0;
131
                n = 0;
132
                gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen.
132
                gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen.
133
        }
133
        }
134
        else
134
        else
135
        {
135
        {
136
                n = 2; //keine gueltigen Daten vorhanden
136
                n = 2; //keine gueltigen Daten vorhanden
137
                gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist.
137
                gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist.
138
        }      
138
        }      
139
        return (n);
139
        return (n);
140
}
140
}
141
 
141
 
142
// Daten aus aktuellen ublox Messages extrahieren 
142
// Daten aus aktuellen ublox Messages extrahieren 
143
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
143
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig
144
short int Get_GPS_data(void)
144
short int Get_GPS_data(void)
145
{
145
{
146
        short int n = 1;
146
        short int n = 1;
147
 
147
 
148
        if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist
148
        if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist
149
        if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0))
149
        if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0))
150
        {
150
        {
151
                if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind
151
                if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind
152
                {
152
                {
153
                        actual_status.status            = 0;
153
                        actual_status.status            = 0;
154
                        gps_act_position.utm_east       = actual_pos.utm_east/10;
154
                        gps_act_position.utm_east       = actual_pos.utm_east/10;
155
                        gps_act_position.utm_north      = actual_pos.utm_north/10;
155
                        gps_act_position.utm_north      = actual_pos.utm_north/10;
156
                        gps_act_position.utm_alt        = actual_pos.utm_alt/10;
156
                        gps_act_position.utm_alt        = actual_pos.utm_alt/10;
157
                        actual_pos.status                       = 0; //neue ublox Messages anfordern
157
                        actual_pos.status                       = 0; //neue ublox Messages anfordern
158
//                      gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
158
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd;
159
//                      gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
159
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd;
160
//                      gps_act_position.heading        = actual_speed.heading/100000;
160
                        gps_act_position.heading        = actual_speed.heading/100000;
161
                        actual_speed.status             = 0;
161
                        actual_speed.status             = 0;
162
                        gps_act_position.status         = 1;
162
                        gps_act_position.status         = 1;
163
                        n                                                       = 0; //Daten gueltig
163
                        n                                                       = 0; //Daten gueltig
164
                }
164
                }
165
                else
165
                else
166
                {
166
                {
167
                        gps_act_position.status         = 0; //Keine gueltigen Daten
167
                        gps_act_position.status         = 0; //Keine gueltigen Daten
168
                        actual_speed.status             = 0;
168
                        actual_speed.status             = 0;
169
                        actual_status.status            = 0;
169
                        actual_status.status            = 0;
170
                        actual_pos.status                       = 0; //neue ublox Messages anfordern
170
                        actual_pos.status                       = 0; //neue ublox Messages anfordern
171
                        n                                                       = 2;
171
                        n                                                       = 2;
172
                }
172
                }
173
        }      
173
        }      
174
        return (n);    
174
        return (n);    
175
}
175
}
176
 
176
 
177
/*
177
/*
178
Daten vom GPS im ublox MSG Format auswerten
178
Daten vom GPS im ublox MSG Format auswerten
179
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen
179
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen
180
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein
180
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein
181
*/
181
*/
182
void Get_Ublox_Msg(uint8_t rx)
182
void Get_Ublox_Msg(uint8_t rx)
183
{
183
{
184
        switch (ublox_msg_state)
184
        switch (ublox_msg_state)
185
        {
185
        {
186
 
186
 
187
                case UBLOX_IDLE: // Zuerst Synchcharacters pruefen
187
                case UBLOX_IDLE: // Zuerst Synchcharacters pruefen
188
                        if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1;
188
                        if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1;
189
                        else ublox_msg_state = UBLOX_IDLE;
189
                        else ublox_msg_state = UBLOX_IDLE;
190
                        break;
190
                        break;
191
 
191
 
192
                case UBLOX_SYNC1:
192
                case UBLOX_SYNC1:
193
 
193
 
194
                        if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2;
194
                        if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2;
195
                        else ublox_msg_state = UBLOX_IDLE;
195
                        else ublox_msg_state = UBLOX_IDLE;
196
                        chk_a = 0,chk_b = 0;
196
                        chk_a = 0,chk_b = 0;
197
                        break;
197
                        break;
198
 
198
 
199
                case UBLOX_SYNC2:
199
                case UBLOX_SYNC2:
200
                        if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS;      
200
                        if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS;      
201
                        else ublox_msg_state = UBLOX_IDLE;
201
                        else ublox_msg_state = UBLOX_IDLE;
202
                        break;
202
                        break;
203
 
203
 
204
                case UBLOX_CLASS: // Nur NAV Meldungen auswerten
204
                case UBLOX_CLASS: // Nur NAV Meldungen auswerten
205
                        switch (rx)
205
                        switch (rx)
206
                        {
206
                        {
207
                                case UBLOX_NAV_POSUTM:
207
                                case UBLOX_NAV_POSUTM:
208
                                        ptr_pac_status  =       &actual_pos.status;
208
                                        ptr_pac_status  =       &actual_pos.status;
209
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden
209
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden
210
                                        else
210
                                        else
211
                                        {
211
                                        {
212
                                                ptr_payload_data                = &actual_pos;
212
                                                ptr_payload_data                = &actual_pos;
213
                                                ptr_payload_data_end    = &actual_pos.status;
213
                                                ptr_payload_data_end    = &actual_pos.status;
214
                                                ublox_msg_state                 = UBLOX_LEN1;
214
                                                ublox_msg_state                 = UBLOX_LEN1;
215
                                        }
215
                                        }
216
                                        break;
216
                                        break;
217
 
217
 
218
                                case UBLOX_NAV_STATUS:
218
                                case UBLOX_NAV_STATUS:
219
                                        ptr_pac_status  =       &actual_status.status;
219
                                        ptr_pac_status  =       &actual_status.status;
220
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
220
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
221
                                        else
221
                                        else
222
                                        {
222
                                        {
223
                                                ptr_payload_data                = &actual_status;
223
                                                ptr_payload_data                = &actual_status;
224
                                                ptr_payload_data_end    = &actual_status.status;
224
                                                ptr_payload_data_end    = &actual_status.status;
225
                                                ublox_msg_state                 = UBLOX_LEN1;
225
                                                ublox_msg_state                 = UBLOX_LEN1;
226
                                        }
226
                                        }
227
                                        break;
227
                                        break;
228
 
228
 
229
                                case UBLOX_NAV_VELED:
229
                                case UBLOX_NAV_VELED:
230
                                        ptr_pac_status          =       &actual_speed.status;
230
                                        ptr_pac_status          =       &actual_speed.status;
231
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
231
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
232
                                        else
232
                                        else
233
                                        {
233
                                        {
234
                                                ptr_payload_data                = &actual_speed;
234
                                                ptr_payload_data                = &actual_speed;
235
                                                ptr_payload_data_end    = &actual_speed.status;
235
                                                ptr_payload_data_end    = &actual_speed.status;
236
                                                ublox_msg_state                 = UBLOX_LEN1;
236
                                                ublox_msg_state                 = UBLOX_LEN1;
237
                                        }
237
                                        }
238
                                        break;
238
                                        break;
239
 
239
 
240
                                default:
240
                                default:
241
                                        ublox_msg_state = UBLOX_IDLE;
241
                                        ublox_msg_state = UBLOX_IDLE;
242
                                        break; 
242
                                        break; 
243
                        }
243
                        }
244
                        chk_a   = UBLOX_NAV_CLASS + rx;
244
                        chk_a   = UBLOX_NAV_CLASS + rx;
245
                        chk_b   = UBLOX_NAV_CLASS + chk_a;                     
245
                        chk_b   = UBLOX_NAV_CLASS + chk_a;                     
246
                        break;
246
                        break;
247
 
247
 
248
                case UBLOX_LEN1: // Laenge auswerten
248
                case UBLOX_LEN1: // Laenge auswerten
249
                        rx_len  = rx;
249
                        rx_len  = rx;
250
                        chk_a   += rx;
250
                        chk_a   += rx;
251
                        chk_b   += chk_a;              
251
                        chk_b   += chk_a;              
252
                        ublox_msg_state = UBLOX_LEN2;
252
                        ublox_msg_state = UBLOX_LEN2;
253
                        break;
253
                        break;
254
 
254
 
255
 
255
 
256
                case UBLOX_LEN2: // Laenge auswerten
256
                case UBLOX_LEN2: // Laenge auswerten
257
                        rx_len = rx_len + (rx *256); // Laenge ermitteln
257
                        rx_len = rx_len + (rx *256); // Laenge ermitteln
258
                        chk_a   += rx;
258
                        chk_a   += rx;
259
                        chk_b   += chk_a;      
259
                        chk_b   += chk_a;      
260
                        ublox_msg_state = UBLOX_PAYLOAD;
260
                        ublox_msg_state = UBLOX_PAYLOAD;
261
                        break;
261
                        break;
262
 
262
 
263
                case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen
263
                case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen
264
                        if (rx_len > 0)
264
                        if (rx_len > 0)
265
                        {
265
                        {
266
                                *ptr_payload_data = rx;
266
                                *ptr_payload_data = rx;
267
                                chk_a   += rx;
267
                                chk_a   += rx;
268
                                chk_b   += chk_a;
268
                                chk_b   += chk_a;
269
                                --rx_len;      
269
                                --rx_len;      
270
                                if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end))                          
270
                                if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end))                          
271
                                {
271
                                {
272
                                        ptr_payload_data++;
272
                                        ptr_payload_data++;
273
                                        ublox_msg_state = UBLOX_PAYLOAD;
273
                                        ublox_msg_state = UBLOX_PAYLOAD;
274
                            }
274
                            }
275
                                else ublox_msg_state = UBLOX_CKA;
275
                                else ublox_msg_state = UBLOX_CKA;
276
                        }      
276
                        }      
277
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
277
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
278
                        break;
278
                        break;
279
 
279
 
280
                case UBLOX_CKA: // Checksum pruefen
280
                case UBLOX_CKA: // Checksum pruefen
281
                        if (rx == chk_a) ublox_msg_state = UBLOX_CKB;                          
281
                        if (rx == chk_a) ublox_msg_state = UBLOX_CKB;                          
282
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
282
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
283
                        break;
283
                        break;
284
 
284
 
285
                case UBLOX_CKB: // Checksum pruefen
285
                case UBLOX_CKB: // Checksum pruefen
286
                        if (rx == chk_b) *ptr_pac_status = 1; // Paket ok
286
                        if (rx == chk_b) *ptr_pac_status = 1; // Paket ok
287
                        ublox_msg_state    = UBLOX_IDLE;
287
                        ublox_msg_state    = UBLOX_IDLE;
288
                        break;
288
                        break;
289
 
289
 
290
                default:
290
                default:
291
                        ublox_msg_state = UBLOX_IDLE;          
291
                        ublox_msg_state = UBLOX_IDLE;          
292
                        break;
292
                        break;
293
        }
293
        }
294
}
294
}
295
       
295
       
296
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe
296
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe
297
short int GPS_CRTL(short int cmd)
297
short int GPS_CRTL(short int cmd)
298
{
298
{
299
        static unsigned int cnt;                                                //Zaehler fuer diverse Verzoegerungen 
299
        static unsigned int cnt;                                                //Zaehler fuer diverse Verzoegerungen 
300
        static signed int       dist_north,dist_east;           // Distanz zur Sollpoistion
300
        static signed int       dist_north,dist_east;           // Distanz zur Sollpoistion
301
        static signed int       diff_east,diff_north;           // Differenzierer  (Differenz zum  vorhergehenden x bzw. y  Wert)
301
        static signed int       diff_east,diff_north;           // Differenzierer  (Differenz zum  vorhergehenden x bzw. y  Wert)
302
        static signed int       diff_east_f,diff_north_f;       // Differenzierer, gefiltert
302
        static signed int       diff_east_f,diff_north_f;       // Differenzierer, gefiltert
303
        signed int                      n,n1;
303
        signed int                      n,n1;
304
        static signed int       gps_g2t_act_v; // Aktuelle Geschwindigkeitsvorgabe fuer Home Funktion
304
        static signed int       gps_g2t_act_v; // Aktuelle Geschwindigkeitsvorgabe fuer Home Funktion
305
        long signed int         dev;
305
        long signed int         dev;
306
        signed int                      dist_frm_start_east,dist_frm_start_north;
306
        signed int                      dist_frm_start_east,dist_frm_start_north;
307
        int                             diff_v_east,diff_v_north; //Verstaerkungsfaktoren fuer Differenzierer
307
        int                             diff_v_east,diff_v_north; //Verstaerkungsfaktoren fuer Differenzierer
308
        static signed int       int_east,int_north;     //Integrierer 
308
        static signed int       int_east,int_north;     //Integrierer 
-
 
309
        int                             speed_east,speed_north; //Aktuelle Geschwindigkeit 
-
 
310
        signed long             int_east1,int_north1;
309
//      signed long             dist;
311
//      signed long             dist;
310
 
312
 
311
        switch (cmd)
313
        switch (cmd)
312
        {
314
        {
313
 
315
 
314
                case GPS_CMD_REQ_HOME: // Es soll zum Startpunkt zurueckgeflogen werden. 
316
                case GPS_CMD_REQ_HOME: // Es soll zum Startpunkt zurueckgeflogen werden. 
315
                        if ((gps_state != GPS_CRTL_HOLD_ACTIVE) && (gps_state != GPS_CRTL_HOME_ACTIVE))
317
                        if ((gps_state != GPS_CRTL_HOLD_ACTIVE) && (gps_state != GPS_CRTL_HOME_ACTIVE))
316
                        {
318
                        {
317
                                cnt++;
319
                                cnt++;
318
                                if (cnt > 200) // erst nach Verzoegerung 
320
                                if (cnt > 200) // erst nach Verzoegerung 
319
                                {
321
                                {
320
                                        // Erst mal initialisieren
322
                                        // Erst mal initialisieren
321
                                        cnt                             = 0;
323
                                        cnt                             = 0;
322
                                        gps_tick                = 0;                                   
324
                                        gps_tick                = 0;                                   
323
                                        hold_fast               = 0;
325
                                        hold_fast               = 0;
324
                                        hold_reset_int  = 0; // Integrator enablen
326
                                        hold_reset_int  = 0; // Integrator enablen
325
                                        int_east                = 0, int_north  = 0;
327
                                        int_east                = 0, int_north  = 0;
326
                                        gps_reg_x               = 0, gps_reg_y  = 0;
328
                                        gps_reg_x               = 0, gps_reg_y  = 0;
327
                                        dist_east               = 0, dist_north = 0;
329
                                        dist_east               = 0, dist_north = 0;
328
                                        diff_east_f             = 0, diff_north_f= 0;
330
                                        diff_east_f             = 0, diff_north_f= 0;
329
                                        diff_east               = 0, diff_north  = 0;  
331
                                        diff_east               = 0, diff_north  = 0;  
330
                                        dist_flown              = 0;
332
                                        dist_flown              = 0;
331
                                        gps_g2t_act_v   = 0;
333
                                        gps_g2t_act_v   = 0;
332
                                        gps_sub_state   = GPS_CRTL_IDLE;
334
                                        gps_sub_state   = GPS_CRTL_IDLE;
333
                                        // aktuelle positionsdaten abspeichern
335
                                        // aktuelle positionsdaten abspeichern
334
                                        if (gps_rel_act_position.status > 0)
336
                                        if (gps_rel_act_position.status > 0)
335
                                        {
337
                                        {
336
                                                gps_rel_start_position.utm_east = gps_rel_act_position.utm_east;
338
                                                gps_rel_start_position.utm_east = gps_rel_act_position.utm_east;
337
                                                gps_rel_start_position.utm_north= gps_rel_act_position.utm_north;
339
                                                gps_rel_start_position.utm_north= gps_rel_act_position.utm_north;
338
                                                gps_rel_start_position.status   = 1; // gueltige Positionsdaten 
340
                                                gps_rel_start_position.status   = 1; // gueltige Positionsdaten 
339
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
341
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
340
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
342
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
341
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
343
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
342
                                                //Richtung zur Home Position bezogen auf Nordpol bestimmen
344
                                                //Richtung zur Home Position bezogen auf Nordpol bestimmen
343
                                                hdng_2home = arctan_i(-gps_rel_start_position.utm_east,-gps_rel_start_position.utm_north);
345
                                                hdng_2home = arctan_i(-gps_rel_start_position.utm_east,-gps_rel_start_position.utm_north);
344
                                                // in Winkel 0...360 Grad umrechnen
346
                                                // in Winkel 0...360 Grad umrechnen
345
                                                if (( gps_rel_start_position.utm_east < 0)) hdng_2home = ( 90-hdng_2home);
347
                                                if (( gps_rel_start_position.utm_east < 0)) hdng_2home = ( 90-hdng_2home);
346
                                                else  hdng_2home = (270 - hdng_2home);
348
                                                else  hdng_2home = (270 - hdng_2home);
347
                                                dist_2home = (int) get_dist(gps_rel_start_position.utm_east,gps_rel_start_position.utm_north,hdng_2home); //Entfernung zur Home Position bestimmen
349
                                                dist_2home = (int) get_dist(gps_rel_start_position.utm_east,gps_rel_start_position.utm_north,hdng_2home); //Entfernung zur Home Position bestimmen
348
                                                gps_state       = GPS_CRTL_HOME_ACTIVE;
350
                                                gps_state       = GPS_CRTL_HOME_ACTIVE;
349
                                                return (GPS_STST_OK);                          
351
                                                return (GPS_STST_OK);                          
350
                                        }
352
                                        }
351
                                        else
353
                                        else
352
                                        {
354
                                        {
353
                                                gps_rel_start_position.status   =       0;  //Keine Daten verfuegbar
355
                                                gps_rel_start_position.status   =       0;  //Keine Daten verfuegbar
354
                                                gps_state                                               = GPS_CRTL_IDLE;
356
                                                gps_state                                               = GPS_CRTL_IDLE;
355
                                                return(GPS_STST_ERR); // Keine Daten da
357
                                                return(GPS_STST_ERR); // Keine Daten da
356
                                        }
358
                                        }
357
                                }
359
                                }
358
                                else return(GPS_STST_PEND); // noch warten
360
                                else return(GPS_STST_PEND); // noch warten
359
                        }
361
                        }
360
                   break;
362
                   break;
361
// ******************************
363
// ******************************
362
 
364
 
363
                case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden.
365
                case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden.
364
                        if (gps_state != GPS_CRTL_HOLD_ACTIVE)
366
                        if (gps_state != GPS_CRTL_HOLD_ACTIVE)
365
                        {
367
                        {
366
                                cnt++;
368
                                cnt++;
367
                                if (cnt > 500) // erst nach Verzoegerung 
369
                                if (cnt > 500) // erst nach Verzoegerung 
368
                                {
370
                                {
369
                                        cnt     =       0;
371
                                        cnt     =       0;
370
                                        // aktuelle positionsdaten abspeichern
372
                                        // aktuelle positionsdaten abspeichern
371
                                        if (gps_rel_act_position.status > 0)
373
                                        if (gps_rel_act_position.status > 0)
372
                                        {
374
                                        {
373
                                                hold_fast               = 0;
375
                                                hold_fast               = 0;
374
                                                hold_reset_int  = 0; // Integrator enablen
376
                                                hold_reset_int  = 0; // Integrator enablen
375
                                                int_east        = 0, int_north  = 0;
377
                                                int_east        = 0, int_north  = 0;
376
                                                gps_reg_x       = 0, gps_reg_y  = 0;
378
                                                gps_reg_x       = 0, gps_reg_y  = 0;
377
                                                dist_east       = 0, dist_north = 0;
379
                                                dist_east       = 0, dist_north = 0;
378
                                                diff_east_f     = 0, diff_north_f= 0;
380
                                                diff_east_f     = 0, diff_north_f= 0;
379
                                                diff_east       = 0, diff_north  = 0;
381
                                                diff_east       = 0, diff_north  = 0;
-
 
382
                                                speed_east      = 0; speed_north= 0;
380
                                                int_ovfl_cnt = 0;
383
                                                int_ovfl_cnt = 0;
381
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
384
                                                gps_rel_hold_position.utm_east  = gps_rel_act_position.utm_east;
382
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
385
                                                gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north;
383
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
386
                                                gps_rel_hold_position.status    = 1; // gueltige Positionsdaten 
384
                                                gps_state                                               = GPS_CRTL_HOLD_ACTIVE;
387
                                                gps_state                                               = GPS_CRTL_HOLD_ACTIVE;
385
                                                return (GPS_STST_OK);                          
388
                                                return (GPS_STST_OK);                          
386
                                        }
389
                                        }
387
                                        else
390
                                        else
388
                                        {
391
                                        {
389
                                                gps_rel_hold_position.status    =       0;  //Keine Daten verfuegbar
392
                                                gps_rel_hold_position.status    =       0;  //Keine Daten verfuegbar
390
                                                gps_state                                               = GPS_CRTL_IDLE;
393
                                                gps_state                                               = GPS_CRTL_IDLE;
391
                                                return(GPS_STST_ERR); // Keine Daten da
394
                                                return(GPS_STST_ERR); // Keine Daten da
392
                                        }
395
                                        }
393
                                }
396
                                }
394
                                else return(GPS_STST_PEND); // noch warten
397
                                else return(GPS_STST_PEND); // noch warten
395
                        }
398
                        }
396
                        break;
399
                        break;
397
 
400
 
398
                case GPS_CMD_STOP: // Lageregelung beenden
401
                case GPS_CMD_STOP: // Lageregelung beenden
399
                        cnt                             =       0;
402
                        cnt                             =       0;
400
                        GPS_Nick                =       0;
403
                        GPS_Nick                =       0;
401
                        GPS_Roll                =       0;
404
                        GPS_Roll                =       0;
402
                        gps_int_x               =       0;
405
                        gps_int_x               =       0;
403
                        gps_int_y               =       0;
406
                        gps_int_y               =       0;
404
                        gps_sub_state   =       GPS_CRTL_IDLE;
407
                        gps_sub_state   =       GPS_CRTL_IDLE;
405
                        gps_state               =       GPS_CRTL_IDLE;
408
                        gps_state               =       GPS_CRTL_IDLE;
406
                        return (GPS_STST_OK);
409
                        return (GPS_STST_OK);
407
                        break;
410
                        break;
408
 
411
 
409
                default:
412
                default:
410
                        return (GPS_STST_ERR);
413
                        return (GPS_STST_ERR);
411
                        break;
414
                        break;
412
        }
415
        }
413
 
416
 
414
        switch (gps_state)
417
        switch (gps_state)
415
        {      
418
        {      
416
                case GPS_CRTL_IDLE:
419
                case GPS_CRTL_IDLE:
417
                        cnt             =       0;
420
                        cnt             =       0;
418
                        return (GPS_STST_OK);
421
                        return (GPS_STST_OK);
419
                        break;
422
                        break;
420
 
423
 
421
                case GPS_CRTL_HOME_ACTIVE: // Rueckflug zur Basis
424
                case GPS_CRTL_HOME_ACTIVE: // Rueckflug zur Basis
422
                //Der Sollwert des Lagereglers wird der Homeposition angenaehert
425
                //Der Sollwert des Lagereglers wird der Homeposition angenaehert
423
                        if (gps_rel_start_position.status >0)
426
                        if (gps_rel_start_position.status >0)
424
                        {
427
                        {
425
                                if ((gps_updte_flag > 0) && (gps_sub_state !=GPS_HOME_FINISHED)) // nur wenn neue GPS Daten vorliegen und nicht schon alles fertig ist
428
                                if ((gps_updte_flag > 0) && (gps_sub_state !=GPS_HOME_FINISHED)) // nur wenn neue GPS Daten vorliegen und nicht schon alles fertig ist
426
                                {
429
                                {
427
                                        gps_tick++;
430
                                        gps_tick++;
428
                                        int d1,d2,d3;
431
                                        int d1,d2,d3;
429
                                        d1      = abs (gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east );
432
                                        d1      = abs (gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east );
430
                                        d2      = abs (gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north );
433
                                        d2      = abs (gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north );
431
                                        d3      = (dist_2home - (int)dist_flown); // Restdistanz zum Ziel       
434
                                        d3      = (dist_2home - (int)dist_flown); // Restdistanz zum Ziel       
432
       
435
       
433
                                        if (d3 > GPS_G2T_DIST_MAX_STOP) // Schneller Rueckflug, noch weit weg vom Ziel
436
                                        if (d3 > GPS_G2T_DIST_MAX_STOP) // Schneller Rueckflug, noch weit weg vom Ziel
434
                                        {
437
                                        {
435
                                                if ((d1 < GPS_G2T_FAST_TOL)  && (d2 < GPS_G2T_FAST_TOL)) //nur weiter wenn Lage innerhalb der Toleranz
438
                                                if ((d1 < GPS_G2T_FAST_TOL)  && (d2 < GPS_G2T_FAST_TOL)) //nur weiter wenn Lage innerhalb der Toleranz
436
                                                {
439
                                                {
437
                                                        if (gps_g2t_act_v < GPS_G2T_V_MAX) gps_g2t_act_v++;    //Geschwindigkeit langsam erhoehen
440
                                                        if (gps_g2t_act_v < GPS_G2T_V_MAX) gps_g2t_act_v++;    //Geschwindigkeit langsam erhoehen
438
                                                        dist_flown              +=(long)gps_g2t_act_v; // Vorgabe der Strecke anhand der Geschwindigkeit
441
                                                        dist_flown              +=(long)gps_g2t_act_v; // Vorgabe der Strecke anhand der Geschwindigkeit
439
                                                        gps_sub_state   = GPS_HOME_FAST_IN_TOL;
442
                                                        gps_sub_state   = GPS_HOME_FAST_IN_TOL;
440
                                                }
443
                                                }
441
                                                else    //Den Lageregler in Ruhe arbeiten lassen weil ausserhalb der Toleranz
444
                                                else    //Den Lageregler in Ruhe arbeiten lassen weil ausserhalb der Toleranz
442
                                                {
445
                                                {
443
                                                        if (gps_g2t_act_v > 1) gps_g2t_act_v--; // Geschwindigkeit reduzieren
446
                                                        if (gps_g2t_act_v > 1) gps_g2t_act_v--; // Geschwindigkeit reduzieren
444
                                                        dist_flown++;                                                   //Auch ausserhalb der Toleranz langsam erhoehen
447
                                                        dist_flown++;                                                   //Auch ausserhalb der Toleranz langsam erhoehen
445
                                                        gps_sub_state   = GPS_HOME_FAST_OUTOF_TOL;
448
                                                        gps_sub_state   = GPS_HOME_FAST_OUTOF_TOL;
446
                                                }
449
                                                }
447
                                                hold_reset_int                                  = 0; // Integrator einsschalten  
450
                                                hold_reset_int                                  = 0; // Integrator einsschalten  
448
                                                hold_fast                                               = 1; // Regler fuer schnellen Flug
451
                                                hold_fast                                               = 1; // Regler fuer schnellen Flug
449
                                                dist_frm_start_east                             = (int)((dist_flown * (long)sin_i(hdng_2home))/1000);
452
                                                dist_frm_start_east                             = (int)((dist_flown * (long)sin_i(hdng_2home))/1000);
450
                                                dist_frm_start_north                    = (int)((dist_flown * (long)cos_i(hdng_2home))/1000);
453
                                                dist_frm_start_north                    = (int)((dist_flown * (long)cos_i(hdng_2home))/1000);
451
                                                gps_rel_hold_position.utm_east  = gps_rel_start_position.utm_east  + dist_frm_start_east; //naechster Zielpunkt
454
                                                gps_rel_hold_position.utm_east  = gps_rel_start_position.utm_east  + dist_frm_start_east; //naechster Zielpunkt
452
                                                gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt
455
                                                gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt
453
                                        }
456
                                        }
454
                                        else if (d3 > GPS_G2T_DIST_HOLD)   //Das Ziel naehert sich, deswegen abbremsen
457
                                        else if (d3 > GPS_G2T_DIST_HOLD)   //Das Ziel naehert sich, deswegen abbremsen
455
                                        {
458
                                        {
456
                                                if ((d1 < GPS_G2T_NRML_TOL)  && (d2 < GPS_G2T_NRML_TOL))  
459
                                                if ((d1 < GPS_G2T_NRML_TOL)  && (d2 < GPS_G2T_NRML_TOL))  
457
                                                {
460
                                                {
458
                                                        dist_flown              +=      GPS_G2T_V_RAMP_DWN; // Vorgabe der Strecke anhand der Geschwindigkeit
461
                                                        dist_flown              +=      GPS_G2T_V_RAMP_DWN; // Vorgabe der Strecke anhand der Geschwindigkeit
459
                                                        gps_sub_state   =       GPS_HOME_RMPDWN_IN_TOL;
462
                                                        gps_sub_state   =       GPS_HOME_RMPDWN_IN_TOL;
460
                                                }
463
                                                }
461
                                                else
464
                                                else
462
                                                {
465
                                                {
463
                                                        dist_flown++; //Auch ausserhalb der Toleranz langsam erhoehen
466
                                                        dist_flown++; //Auch ausserhalb der Toleranz langsam erhoehen
464
                                                        gps_sub_state   = GPS_HOME_RMPDWN_OUTOF_TOL;
467
                                                        gps_sub_state   = GPS_HOME_RMPDWN_OUTOF_TOL;
465
                                                }                                      
468
                                                }                                      
466
                                                hold_reset_int                                  = 0; // Integrator ausschalten            
469
                                                hold_reset_int                                  = 0; // Integrator ausschalten            
467
                                                hold_fast                                               = 1; // Wieder normal regeln
470
                                                hold_fast                                               = 1; // Wieder normal regeln
468
                                                dist_frm_start_east                             = (int)((dist_flown * (long)sin_i(hdng_2home))/1000);
471
                                                dist_frm_start_east                             = (int)((dist_flown * (long)sin_i(hdng_2home))/1000);
469
                                                dist_frm_start_north                    = (int)((dist_flown * (long)cos_i(hdng_2home))/1000);
472
                                                dist_frm_start_north                    = (int)((dist_flown * (long)cos_i(hdng_2home))/1000);
470
                                                gps_rel_hold_position.utm_east  = gps_rel_start_position.utm_east  + dist_frm_start_east; //naechster Zielpunkt
473
                                                gps_rel_hold_position.utm_east  = gps_rel_start_position.utm_east  + dist_frm_start_east; //naechster Zielpunkt
471
                                                gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt
474
                                                gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt
472
                                        }                                                      
475
                                        }                                                      
473
                                        else  //Soll-Ziel fast erreicht, Jetzt noch Reste ausgleichen, weil Zielpunkt nicht exakt bestimmt werden konnte (Fehler in Winkelfkt) 
476
                                        else  //Soll-Ziel fast erreicht, Jetzt noch Reste ausgleichen, weil Zielpunkt nicht exakt bestimmt werden konnte (Fehler in Winkelfkt) 
474
                                        {
477
                                        {
475
                                                if ((d1 < GPS_G2T_NRML_TOL)  && (d2 < GPS_G2T_NRML_TOL)) // Jetzt bis zum Zielpunkt regeln
478
                                                if ((d1 < GPS_G2T_NRML_TOL)  && (d2 < GPS_G2T_NRML_TOL)) // Jetzt bis zum Zielpunkt regeln
476
                                                {
479
                                                {
477
                                                        gps_sub_state   = GPS_HOME_IN_TOL;
480
                                                        gps_sub_state   = GPS_HOME_IN_TOL;
478
                                                        hold_fast               = 0; // Wieder normal regeln
481
                                                        hold_fast               = 0; // Wieder normal regeln
479
                                                        hold_reset_int  = 0; // Integrator wieder aktivieren              
482
                                                        hold_reset_int  = 0; // Integrator wieder aktivieren              
480
                                                        if (gps_rel_hold_position.utm_east >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_east -= GPS_G2T_V_MIN;
483
                                                        if (gps_rel_hold_position.utm_east >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_east -= GPS_G2T_V_MIN;
481
                                                        else if (gps_rel_hold_position.utm_east <= -GPS_G2T_V_MIN ) gps_rel_hold_position.utm_east += GPS_G2T_V_MIN;
484
                                                        else if (gps_rel_hold_position.utm_east <= -GPS_G2T_V_MIN ) gps_rel_hold_position.utm_east += GPS_G2T_V_MIN;
482
                                                        if (gps_rel_hold_position.utm_north >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_north -= GPS_G2T_V_MIN;
485
                                                        if (gps_rel_hold_position.utm_north >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_north -= GPS_G2T_V_MIN;
483
                                                        else if (gps_rel_hold_position.utm_north <= - GPS_G2T_V_MIN ) gps_rel_hold_position.utm_north += GPS_G2T_V_MIN;
486
                                                        else if (gps_rel_hold_position.utm_north <= - GPS_G2T_V_MIN ) gps_rel_hold_position.utm_north += GPS_G2T_V_MIN;
484
                                                        if ((abs(gps_rel_hold_position.utm_east) <= GPS_G2T_V_MIN) && (abs(gps_rel_hold_position.utm_north) <=GPS_G2T_V_MIN))
487
                                                        if ((abs(gps_rel_hold_position.utm_east) <= GPS_G2T_V_MIN) && (abs(gps_rel_hold_position.utm_north) <=GPS_G2T_V_MIN))
485
                                                        {
488
                                                        {
486
                                                                gps_rel_hold_position.utm_east  = 0;
489
                                                                gps_rel_hold_position.utm_east  = 0;
487
                                                                gps_rel_hold_position.utm_north = 0;
490
                                                                gps_rel_hold_position.utm_north = 0;
488
                                                                gps_sub_state                                   = GPS_HOME_FINISHED;
491
                                                                gps_sub_state                                   = GPS_HOME_FINISHED;
489
                                                        }
492
                                                        }
490
                                                }
493
                                                }
491
                                                else gps_sub_state      = GPS_HOME_OUTOF_TOL;
494
                                                else gps_sub_state      = GPS_HOME_OUTOF_TOL;
492
                                        }                                      
495
                                        }                                      
493
                                }
496
                                }
494
                                gps_state = GPS_CRTL_HOLD_ACTIVE; //Zwischensprung
497
                                gps_state = GPS_CRTL_HOLD_ACTIVE; //Zwischensprung
495
                                return (GPS_STST_OK);                                  
498
                                return (GPS_STST_OK);                                  
496
                        }
499
                        }
497
                        else  // Keine GPS Daten verfuegbar, deswegen Abbruch
500
                        else  // Keine GPS Daten verfuegbar, deswegen Abbruch
498
                        {
501
                        {
499
                                gps_state       =       GPS_CRTL_IDLE; 
502
                                gps_state       =       GPS_CRTL_IDLE; 
500
                                return (GPS_STST_ERR);
503
                                return (GPS_STST_ERR);
501
                        }
504
                        }
502
                        break;
505
                        break;
503
 
506
 
504
 
507
 
505
                case GPS_CRTL_HOLD_ACTIVE:  // Hier werden die Daten fuer Nick und Roll errechnet
508
                case GPS_CRTL_HOLD_ACTIVE:  // Hier werden die Daten fuer Nick und Roll errechnet
506
                        if (gps_updte_flag >0)  // nur wenn neue GPS Daten vorliegen
509
                        if (gps_updte_flag >0)  // nur wenn neue GPS Daten vorliegen
507
                        {
510
                        {
508
                                gps_updte_flag = 0;
-
 
509
                                // ab hier wird geregelt
511
                                // ab hier wird geregelt
510
                                diff_east       = dist_east;      //Alten Wert fuer Differenzierer schon mal addieren
512
                                diff_east       = dist_east;      //Alten Wert fuer Differenzierer schon mal addieren
511
                                diff_north      = dist_north;
513
                                diff_north      = dist_north;
512
                                dist_east       = gps_rel_hold_position.utm_east  - gps_rel_act_position.utm_east;
514
                                dist_east       = gps_rel_hold_position.utm_east  - gps_rel_act_position.utm_east;
513
                                dist_north      = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north;
515
                                dist_north      = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north;
514
                                int_east        += dist_east;
516
                                int_east        += dist_east;
515
                                int_north   += dist_north;
517
                                int_north   += dist_north;
516
                                diff_east       -= dist_east;   // Differenz zur vorhergehenden East Position
518
                                diff_east       -= dist_east;   // Differenz zur vorhergehenden East Position
517
                                diff_north      -= dist_north;  // Differenz zur vorhergehenden North Position
519
                                diff_north      -= dist_north;  // Differenz zur vorhergehenden North Position
-
 
520
                                speed_east      =  (int) actual_speed.speed_e;
-
 
521
                                speed_north     =  (int) actual_speed.speed_n;
-
 
522
                                gps_updte_flag = 0;  // Neue Werte koennen vom GPS geholt werden
518
 
523
 
-
 
524
                                debug_gp_2      = speed_east;  // zum Debuggen
-
 
525
                                debug_gp_3      = speed_north; // zum Debuggen
-
 
526
                               
519
                                if (hold_fast > 0) // wegen Sollpositionsspruengen im Fast Mode Differenzierer daempfen
527
                                if (hold_fast > 0) // wegen Sollpositionsspruengen im Fast Mode Differenzierer daempfen
520
                                {
528
                                {
521
                                        diff_east_f             = (((diff_east_f  *2)/3) + ((diff_east *1*10)/3)); //Differenzierer filtern     
529
                                        diff_east_f             = (((diff_east_f  *2)/3) + ((diff_east *1*10)/3)); //Differenzierer filtern     
522
                                        diff_north_f    = (((diff_north_f *2)/3) + ((diff_north*1*10)/3)); //Differenzierer filtern
530
                                        diff_north_f    = (((diff_north_f *2)/3) + ((diff_north*1*10)/3)); //Differenzierer filtern
523
                                }      
531
                                }      
524
                                else // schwache Filterung
532
                                else // schwache Filterung
525
                                {
533
                                {
526
                                        diff_east_f             = (((diff_east_f  * 1)/4) + ((diff_east *3*10)/4)); //Differenzierer filtern    
534
                                        diff_east_f             = (((diff_east_f  * 2)/4) + ((diff_east *2*10)/4)); //Differenzierer filtern    
527
                                        diff_north_f    = (((diff_north_f * 1)/4) + ((diff_north*3*10)/4)); //Differenzierer filtern
535
                                        diff_north_f    = (((diff_north_f * 2)/4) + ((diff_north*2*10)/4)); //Differenzierer filtern
528
                                }
536
                                }
-
 
537
 
-
 
538
                                // Differenz aus Distanz durch eche geschwindigkeit aus VELNED Msg ersetzten
-
 
539
                                diff_east_f     = -speed_east;
-
 
540
                                diff_north_f = speed_north;
529
 
541
 
530
                                #define GPSINT_MAX 3000 // Neues Verfahren ab  30.12.2007  bei Integratoroverflow
542
                                #define GPSINT_MAX 3000 // Neues Verfahren ab  30.12.2007  bei Integratoroverflow
531
                                if ((abs(int_east) > GPSINT_MAX) || (abs(int_north)> GPSINT_MAX))
543
                                if ((abs(int_east) > GPSINT_MAX) || (abs(int_north)> GPSINT_MAX))
532
                                {
544
                                {
533
                                        if (int_ovfl_cnt < 40) int_ovfl_cnt += 1; // Zahl der Overflows zaehlen
545
                                        if (int_ovfl_cnt < 40) int_ovfl_cnt += 1; // Zahl der Overflows zaehlen
534
//                                      int_east        -= dist_east; auf alten Wert halten
546
//                                      int_east        -= dist_east; auf alten Wert halten
535
//                                      int_north   -= dist_north;                                      
547
//                                      int_north   -= dist_north;                                      
536
                                }
548
                                }
537
                                if (int_ovfl_cnt > 0) //bei Overflow Wert Integratorwert reduzieren 
549
                                if (int_ovfl_cnt > 0) //bei Overflow Wert Integratorwert reduzieren 
538
                                {
550
                                {
539
                                        int_ovfl_cnt    -= 1;
551
                                        int_ovfl_cnt    -= 1;
540
                                        int_east                = (int_east*7)/8; // Wert reduzieren
552
                                        int_east                = (int_east*7)/8; // Wert reduzieren
541
                                        int_north       = (int_north*7)/8;                                     
553
                                        int_north       = (int_north*7)/8;                                     
542
                                }
554
                                }
543
 
555
 
544
                                if (hold_reset_int > 0)  //Im Schnellen Mode Integrator abschalten
556
                                if (hold_reset_int > 0)  //Im Schnellen Mode Integrator abschalten
545
                                {
557
                                {
546
                                        int_east        = 0;   
558
                                        int_east        = 0;   
547
                                        int_north       = 0;                                   
559
                                        int_north       = 0;                                   
548
                                }
560
                                }
549
 
-
 
550
                                // Variable Verstarkung fuer Differenzierer ermitteln. Je weiter vom Ziel wir entfernt sind
-
 
551
                                // desto groesser wird der Faktor. Es gibt aber einen Maximalwert. Bei 0 ist die Verstaerkung immer 1
-
 
552
                                signed long int_east1,int_north1;
-
 
553
 
561
 
554
//                              int phi;
562
//                              int phi;
555
//                              phi  = arctan_i(abs(dist_north),abs(dist_east)); 
563
//                              phi  = arctan_i(abs(dist_north),abs(dist_east)); 
556
//                              dist = get_dist(dist_east,dist_north,phi); //Zunaechst Entfernung zum Ziel ermitteln
564
//                              dist = get_dist(dist_east,dist_north,phi); //Zunaechst Entfernung zum Ziel ermitteln
557
 
565
 
558
                                if (hold_fast == 0)  // je Nach Modus andere Verstaerkungskurve fuer Differenzierer
566
                                if (hold_fast == 0)  // je Nach Modus andere Verstaerkungskurve fuer Differenzierer
559
                                {
567
                                {
560
//                                      diff_v = (int)((dist * (GPS_DIFF_NRML_MAX_V - 10)) / GPS_DIFF_NRML_MAX_D) +10; //Verstaerkung * 10
568
//                                      diff_v = (int)((dist * (GPS_DIFF_NRML_MAX_V - 10)) / GPS_DIFF_NRML_MAX_D) +10; //Verstaerkung * 10
561
//                                      if (diff_v > GPS_DIFF_NRML_MAX_V) diff_v = GPS_DIFF_NRML_MAX_V; //begrenzen
569
//                                      if (diff_v > GPS_DIFF_NRML_MAX_V) diff_v = GPS_DIFF_NRML_MAX_V; //begrenzen
562
//                                      diff_v = GPS_DIFF_NRML_MAX_V ; //variable Versterkung raus 31.12.2007
570
//                                      diff_v = GPS_DIFF_NRML_MAX_V ; //variable Versterkung raus 31.12.2007
563
                                }
571
                                }
564
                                else
572
                                else
565
                                {
573
                                {
566
//                                      diff_v = (int)((dist * (GPS_DIFF_FAST_MAX_V - 10)) / GPS_DIFF_FAST_MAX_D) +10; //Verstaerkung * 10
574
//                                      diff_v = (int)((dist * (GPS_DIFF_FAST_MAX_V - 10)) / GPS_DIFF_FAST_MAX_D) +10; //Verstaerkung * 10
567
//                                      if (diff_v > GPS_DIFF_FAST_MAX_V) diff_v = GPS_DIFF_FAST_MAX_V; //begrenzen
575
//                                      if (diff_v > GPS_DIFF_FAST_MAX_V) diff_v = GPS_DIFF_FAST_MAX_V; //begrenzen
568
//                                      diff_v = GPS_DIFF_FAST_MAX_V ; //variable Versterkung raus 31.12.2007
576
//                                      diff_v = GPS_DIFF_FAST_MAX_V ; //variable Versterkung raus 31.12.2007
569
                                }
577
                                }
570
                                diff_v_east  = (((abs(diff_east_f)) *(DIFF_Y_MAX-1))/DIFF_X_MAX) +10;
578
                                diff_v_east  = (((abs(diff_east_f)) *(DIFF_Y_MAX-1))/DIFF_X_MAX) +10;
571
                                diff_v_north = (((abs(diff_north_f))*(DIFF_Y_MAX-1))/DIFF_X_MAX) +10;
579
                                diff_v_north = (((abs(diff_north_f))*(DIFF_Y_MAX-1))/DIFF_X_MAX) +10;
572
                                if (diff_v_east  > (DIFF_Y_MAX *10)) diff_v_east  = DIFF_Y_MAX *10; // Begrenzung
580
                                if (diff_v_east  > (DIFF_Y_MAX *10)) diff_v_east  = DIFF_Y_MAX *10; // Begrenzung
573
                                if (diff_v_north > (DIFF_Y_MAX *10)) diff_v_north = DIFF_Y_MAX *10; // Begrenzung
581
                                if (diff_v_north > (DIFF_Y_MAX *10)) diff_v_north = DIFF_Y_MAX *10; // Begrenzung
574
                                diff_v_east             *=      2;
582
//                              diff_v_east             *=      2;
575
                                diff_v_north    *=      2;
583
//                              diff_v_north    *=      2;
576
 
584
 
577
//                              debug_gp_2      = diff_v_east;  // zum Debuggen
585
//                              debug_gp_2      = diff_v_east;  // zum Debuggen
578
//                              debug_gp_3      = diff_v_north; // zum Debuggen
586
//                              debug_gp_3      = diff_v_north; // zum Debuggen
579
//                              debug_gp_4      = diff_east_f;  // zum Debuggen
587
//                              debug_gp_4      = diff_east_f;  // zum Debuggen
580
//                              debug_gp_5      = diff_north_f; // zum Debuggen
588
//                              debug_gp_5      = diff_north_f; // zum Debuggen
581
 
589
 
582
                                int diff_p;  //Vom Modus abhaengige zusaetzliche Verstaerkung
590
                                int diff_p;  //Vom Modus abhaengige zusaetzliche Verstaerkung
583
                                if (hold_fast > 0) diff_p = GPS_PROP_FAST_V;
591
                                if (hold_fast > 0) diff_p = GPS_PROP_FAST_V;
584
                                else diff_p = GPS_PROP_NRML_V;
592
                                else diff_p = GPS_PROP_NRML_V;
585
 
593
 
586
                                //I Werte begrenzen
594
                                //I Werte begrenzen
587
                                #define INT1_MAX (GPS_NICKROLL_MAX * GPS_V)/2 //ab 30.12.2007 auf Halben Maximalen Nick/Rollwert begrenzen
595
                                #define INT1_MAX (GPS_NICKROLL_MAX * GPS_V)/2 //ab 30.12.2007 auf Halben Maximalen Nick/Rollwert begrenzen
588
                                int_east1  =  ((((long)int_east)   * Parameter_UserParam2)/32)/GPS_USR_PAR_FKT;
596
                                int_east1  =  ((((long)int_east)   * Parameter_UserParam2)/32)/GPS_USR_PAR_FKT;
589
                                int_north1 =  ((((long)int_north)  * Parameter_UserParam2)/32)/GPS_USR_PAR_FKT;  //Fehler behoben am 17.12.2007 vorher int_north= 
597
                                int_north1 =  ((((long)int_north)  * Parameter_UserParam2)/32)/GPS_USR_PAR_FKT;  //Fehler behoben am 17.12.2007 vorher int_north= 
590
                                if (int_east1 > INT1_MAX) int_east1 =  INT1_MAX; //begrenzen
598
                                if (int_east1 > INT1_MAX) int_east1 =  INT1_MAX; //begrenzen
591
                                else if (int_east1 < -INT1_MAX) int_east1 =  -INT1_MAX;
599
                                else if (int_east1 < -INT1_MAX) int_east1 =  -INT1_MAX;
592
                                if (int_north1 > INT1_MAX) int_north1 =  INT1_MAX; //begrenzen
600
                                if (int_north1 > INT1_MAX) int_north1 =  INT1_MAX; //begrenzen
593
                                else if (int_north1 < -INT1_MAX) int_north1 =  -INT1_MAX;
601
                                else if (int_north1 < -INT1_MAX) int_north1 =  -INT1_MAX;
594
 
602
 
595
                                //PID Regler Werte aufsummieren
603
                                //PID Regler Werte aufsummieren
596
                                gps_reg_x = ((int)int_east1  + ((dist_east  * (Parameter_UserParam1/GPS_USR_PAR_FKT) * diff_p)/(8*2))+ ((diff_east_f  * diff_v_east * (Parameter_UserParam3/GPS_USR_PAR_FKT))/100));  // I + P +D  Anteil X Achse
604
                                gps_reg_x = ((int)int_east1  + ((dist_east  * (Parameter_UserParam1/GPS_USR_PAR_FKT) * diff_p)/(8*2))+ ((diff_east_f  * diff_v_east * (Parameter_UserParam3/GPS_USR_PAR_FKT))/100));  // I + P +D  Anteil X Achse
597
                                gps_reg_y = ((int)int_north1 + ((dist_north * (Parameter_UserParam1/GPS_USR_PAR_FKT) * diff_p)/(8*2))+ ((diff_north_f * diff_v_north * (Parameter_UserParam3/GPS_USR_PAR_FKT))/100));  // I + P +D  Anteil Y Achse
605
                                gps_reg_y = ((int)int_north1 + ((dist_north * (Parameter_UserParam1/GPS_USR_PAR_FKT) * diff_p)/(8*2))+ ((diff_north_f * diff_v_north * (Parameter_UserParam3/GPS_USR_PAR_FKT))/100));  // I + P +D  Anteil Y Achse
598
                                debug_gp_0      = gps_reg_x;  // zum Debuggen
606
                                debug_gp_0      = gps_reg_x;  // zum Debuggen
599
                                debug_gp_1      = gps_reg_y; // zum Debuggen
607
                                debug_gp_1      = gps_reg_y; // zum Debuggen
600
 
608
 
601
                                //Ziel-Richtung bezogen auf Nordpol bestimmen
609
                                //Ziel-Richtung bezogen auf Nordpol bestimmen
602
                                GPS_hdng_abs_2trgt = arctan_i(gps_reg_x,gps_reg_y);
610
                                GPS_hdng_abs_2trgt = arctan_i(gps_reg_x,gps_reg_y);
603
 
611
 
604
                                // in Winkel 0...360 Grad umrechnen
612
                                // in Winkel 0...360 Grad umrechnen
605
                                if ((gps_reg_x >= 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt);
613
                                if ((gps_reg_x >= 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt);
606
                                else  GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt);
614
                                else  GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt);
607
 
615
 
608
                                // Relative Richtung in bezug auf Nordachse des Kopters errechen
616
                                // Relative Richtung in bezug auf Nordachse des Kopters errechen
609
                                n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT;
617
                                n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT;
610
                                GPS_hdng_rel_2trgt      =       GPS_hdng_abs_2trgt - n;
618
                                GPS_hdng_rel_2trgt      =       GPS_hdng_abs_2trgt - n;
611
                                if      ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180)) GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360;
619
                                if      ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180)) GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360;
612
                                else if (GPS_hdng_rel_2trgt >180)  GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt;
620
                                else if (GPS_hdng_rel_2trgt >180)  GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt;
613
                                else if (GPS_hdng_rel_2trgt <-180)  GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt;
621
                                else if (GPS_hdng_rel_2trgt <-180)  GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt;
614
                               
622
                               
615
                                // Regelabweichung aus x,y zu Ziel in Distanz umrechnen 
623
                                // Regelabweichung aus x,y zu Ziel in Distanz umrechnen 
616
                                if (abs(gps_reg_x) > abs(gps_reg_y) )
624
                                if (abs(gps_reg_x) > abs(gps_reg_y) )
617
                                {
625
                                {
618
                                        dev = (long)gps_reg_x; //Groesseren Wert wegen besserer Genauigkeit nehmen
626
                                        dev = (long)gps_reg_x; //Groesseren Wert wegen besserer Genauigkeit nehmen
619
                                        dev = abs((dev *1000) / (long) sin_i(GPS_hdng_abs_2trgt));
627
                                        dev = abs((dev *1000) / (long) sin_i(GPS_hdng_abs_2trgt));
620
                                }
628
                                }
621
                                else
629
                                else
622
                                {
630
                                {
623
                                        dev = (long)gps_reg_y;
631
                                        dev = (long)gps_reg_y;
624
                                        dev = abs((dev *1000) / (long) cos_i(GPS_hdng_abs_2trgt));
632
                                        dev = abs((dev *1000) / (long) cos_i(GPS_hdng_abs_2trgt));
625
                                }
633
                                }
626
                                GPS_dist_2trgt  = (int) dev;
634
                                GPS_dist_2trgt  = (int) dev;
627
                                // Winkel und Distanz in Nick und Rollgroessen umrechnen
635
                                // Winkel und Distanz in Nick und Rollgroessen umrechnen
628
                                n  = (int) +( (dev * (long) sin_i(GPS_hdng_rel_2trgt))/1000); //Rollwert bestimmen
636
                                n  = (int) +( (dev * (long) sin_i(GPS_hdng_rel_2trgt))/1000); //Rollwert bestimmen
629
                                n1 = (int) -( (dev * (long) cos_i(GPS_hdng_rel_2trgt))/1000); //Nickwert bestimmen
637
                                n1 = (int) -( (dev * (long) cos_i(GPS_hdng_rel_2trgt))/1000); //Nickwert bestimmen
630
 
638
 
631
//                              GPS_Roll = (int) +( (dev * (long) sin_i(GPS_hdng_rel_2trgt))/1000); 
639
//                              GPS_Roll = (int) +( (dev * (long) sin_i(GPS_hdng_rel_2trgt))/1000); 
632
//                              GPS_Nick = (int) -( (dev * (long) cos_i(GPS_hdng_rel_2trgt))/1000);
640
//                              GPS_Nick = (int) -( (dev * (long) cos_i(GPS_hdng_rel_2trgt))/1000);
633
                                       
641
                                       
634
                                if (n > (GPS_NICKROLL_MAX * GPS_V)) n = (GPS_NICKROLL_MAX * GPS_V);
642
                                if (n > (GPS_NICKROLL_MAX * GPS_V)) n = (GPS_NICKROLL_MAX * GPS_V);
635
                                else if (n < -(GPS_NICKROLL_MAX * GPS_V)) n = -(GPS_NICKROLL_MAX * GPS_V);
643
                                else if (n < -(GPS_NICKROLL_MAX * GPS_V)) n = -(GPS_NICKROLL_MAX * GPS_V);
636
                                if (n1 > (GPS_NICKROLL_MAX * GPS_V)) n1 = (GPS_NICKROLL_MAX * GPS_V);
644
                                if (n1 > (GPS_NICKROLL_MAX * GPS_V)) n1 = (GPS_NICKROLL_MAX * GPS_V);
637
                                else if (n1 < -(GPS_NICKROLL_MAX * GPS_V)) n1 = -(GPS_NICKROLL_MAX * GPS_V);
645
                                else if (n1 < -(GPS_NICKROLL_MAX * GPS_V)) n1 = -(GPS_NICKROLL_MAX * GPS_V);
638
                                n  = n/GPS_V;
646
                                n  = n/GPS_V;
639
                                n1 = n1/GPS_V;
647
                                n1 = n1/GPS_V;
640
                                //Kleine Werte verstaerken, Grosse abschwaechen
648
                                //Kleine Werte verstaerken, Grosse abschwaechen
641
/*                              n                       = sin_i((GPS_Roll*90)/(GPS_NICKROLL_MAX * GPS_V));
649
/*                              n                       = sin_i((GPS_Roll*90)/(GPS_NICKROLL_MAX * GPS_V));
642
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
650
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
643
                                GPS_Roll        = (int) n_l;
651
                                GPS_Roll        = (int) n_l;
644
                                n                       = sin_i((GPS_Nick*90)/(GPS_NICKROLL_MAX * GPS_V));
652
                                n                       = sin_i((GPS_Nick*90)/(GPS_NICKROLL_MAX * GPS_V));
645
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
653
                                n_l                     = ((long) GPS_NICKROLL_MAX  * (long) n)/1000;
646
                                GPS_Nick        = (int) n_l;
654
                                GPS_Nick        = (int) n_l;
647
*/                               
655
*/                               
648
 
656
 
649
                                if ((abs(dist_east) > GPS_DIST_MAX) || (abs(dist_north) > GPS_DIST_MAX))  // bei zu grossem Abstand abbrechen
657
                                if ((abs(dist_east) > GPS_DIST_MAX) || (abs(dist_north) > GPS_DIST_MAX))  // bei zu grossem Abstand abbrechen
650
                                {
658
                                {
651
                                        GPS_Roll        = 0;
659
                                        GPS_Roll        = 0;
652
                                        GPS_Nick        = 0;
660
                                        GPS_Nick        = 0;
653
                                        gps_state       = GPS_CRTL_IDLE;
661
                                        gps_state       = GPS_CRTL_IDLE;
654
                                        return (GPS_STST_ERR); 
662
                                        return (GPS_STST_ERR); 
655
                                        break;                                 
663
                                        break;                                 
656
                                }
664
                                }
657
                                else
665
                                else
658
                                {
666
                                {
659
                                        GPS_Roll = n;
667
                                        GPS_Roll = n;
660
                                        GPS_Nick = n1;
668
                                        GPS_Nick = n1;
661
                                        if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen
669
                                        if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen
662
                                        return (GPS_STST_OK);
670
                                        return (GPS_STST_OK);
663
                                }
671
                                }
664
                        }
672
                        }
665
                        else
673
                        else
666
                        {
674
                        {
667
                                if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen
675
                                if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen
668
                                return (GPS_STST_OK);
676
                                return (GPS_STST_OK);
669
                        }
677
                        }
670
                        break;
678
                        break;
671
 
679
 
672
                default:
680
                default:
673
                        gps_state = GPS_CRTL_IDLE;
681
                        gps_state = GPS_CRTL_IDLE;
674
                        return (GPS_STST_ERR);
682
                        return (GPS_STST_ERR);
675
                        break;
683
                        break;
676
        }      
684
        }      
677
        return (GPS_STST_ERR);
685
        return (GPS_STST_ERR);
678
                       
686
                       
679
}
687
}
680
 
688
 
681
 
689