Subversion Repositories FlightCtrl

Rev

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

Rev 108 Rev 143
Line -... Line 1...
-
 
1
/*
-
 
2
This program (files gps.c and gps.h) is free software; you can redistribute it and/or modify
-
 
3
it under the terms of the GNU General Public License as published by the Free Software Foundation;
-
 
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;
-
 
6
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-
 
7
GNU General Public License for more details. You should have received a copy of the GNU General Public License
-
 
8
along with this program. If not, see <http://www.gnu.org/licenses/>.
-
 
9
 
-
 
10
Please note: All the other files for the project "Mikrokopter" by H.Buss are under the licencse published by www.mikrokopter.de
-
 
11
*/
1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
13
Peter Muehlenbrock
2
// + Copyright (c) 04.2007 Holger Buss
14
Auswertung der Daten vom GPS im ublox Format
3
// + only for non-profit use
15
Regelung fuer GPS noch nicht implementiert
4
// + www.MikroKopter.com
16
Stand 10.9.2007
5
// + see the File "License.txt" for further Informations
-
 
6
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
18
*/
7
#include "main.h"
19
#include "main.h"
Line -... Line 20...
-
 
20
 
-
 
21
// Defines fuer ublox Messageformat um Auswertung zu steuern
-
 
22
#define                 UBLOX_IDLE      0
-
 
23
#define                 UBLOX_SYNC1     1
-
 
24
#define                 UBLOX_SYNC2     2
-
 
25
#define                 UBLOX_CLASS     3
-
 
26
#define                 UBLOX_ID        4
-
 
27
#define                 UBLOX_LEN1      5
-
 
28
#define                 UBLOX_LEN2      6
-
 
29
#define                 UBLOX_CKA       7
-
 
30
#define                 UBLOX_CKB       8
-
 
31
#define                 UBLOX_PAYLOAD   9
-
 
32
 
-
 
33
// ublox Protokoll Identifier 
-
 
34
#define                 UBLOX_NAV_POSUTM                0x08
-
 
35
#define                 UBLOX_NAV_STATUS                0x03
-
 
36
#define                 UBLOX_NAV_VELED                 0x12
-
 
37
#define                 UBLOX_NAV_CLASS                 0x01
-
 
38
#define                 UBLOX_SYNCH1_CHAR               0xB5
-
 
39
#define                 UBLOX_SYNCH2_CHAR               0x62
8
 
40
 
9
signed int GPS_Nick = 0;
41
signed int GPS_Nick = 0;
-
 
42
signed int GPS_Roll = 0;
10
signed int GPS_Roll = 0;
43
static uint8_t ublox_msg_state = UBLOX_IDLE;
11
long GpsAktuell_X = 0;
44
static uint8_t  chk_a =0; //Checksum
-
 
45
static uint8_t  chk_b =0;
12
long GpsAktuell_Y = 0;
46
 
-
 
47
static unsigned int rx_len;
-
 
48
unsigned int cnt0,cnt1,cnt2; //******Provisorisch
-
 
49
static unsigned int ptr_payload_data_end;
-
 
50
 
13
long GpsZiel_X = 0;
51
static uint8_t *ptr_payload_data;
-
 
52
static uint8_t *ptr_pac_status;
-
 
53
 
-
 
54
 
-
 
55
NAV_POSUTM_t actual_pos;    // Aktuelle Nav Daten werden hier im ublox Format abgelegt
-
 
56
NAV_STATUS_t actual_status; // Aktueller Nav Status
-
 
57
NAV_VELNED_t actual_speed;  // Aktueller Geschwindigkeits und Richtungsdaten
-
 
58
 
14
long GpsZiel_Y = 0;
59
GPS_POSITION_t gps_act_position;  // Alle wichtigen Daten zusammengefasst
15
 
60
 
16
void GPS_Neutral(void)
61
void GPS_Neutral(void) // Initialisierung
-
 
62
{
-
 
63
        ublox_msg_state = UBLOX_IDLE;
17
{
64
        actual_pos.status= 0;
18
 GpsZiel_X = GpsAktuell_X;
65
        actual_speed.status= 0;
19
 GpsZiel_Y = GpsAktuell_Y;
66
        actual_status.status= 0;
Line 20... Line 67...
20
}
67
}
21
 
68
 
-
 
69
void Get_GPS_data(void)  // Daten aus aktuellen ublox Messages extrahieren 
-
 
70
{
-
 
71
        if (actual_pos.status == 0) return; //damit es schnell geht, wenn nix zu tun ist
-
 
72
        if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0))
-
 
73
        {
-
 
74
                cnt1++; //**** noch Rausschmeissen
-
 
75
                if ((actual_status.gpsfix_type & 0x0f) >=2) // nur wenn Daten aktuell sind
-
 
76
                {
-
 
77
                        gps_act_position.utm_east       = actual_pos.utm_east/10;
-
 
78
                        gps_act_position.utm_north      = actual_pos.utm_north/10;
-
 
79
                        gps_act_position.utm_alt        = actual_pos.utm_alt/10;
-
 
80
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
-
 
81
                        gps_act_position.speed_gnd      = actual_speed.speed_gnd/10;
-
 
82
                        gps_act_position.heading        = actual_speed.heading/100000;
22
void GPS_BerechneZielrichtung(void)
83
                        gps_act_position.status         = 1;
-
 
84
                }
23
{
85
                        actual_pos.status               = 0;
-
 
86
                        actual_status.status    = 0;
24
 GPS_Nick = 0;
87
                        actual_speed.status     = 0;
Line -... Line 88...
-
 
88
        }              
-
 
89
}
-
 
90
 
-
 
91
 
-
 
92
/*
-
 
93
Daten vom GPS im ublox MSG Format auswerten
-
 
94
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul  durch den UART IRQ aufgerufen
Line -... Line 95...
-
 
95
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein
-
 
96
*/
-
 
97
void Get_Ublox_Msg(uint8_t rx)
-
 
98
{
-
 
99
 
-
 
100
        switch (ublox_msg_state)
-
 
101
        {
-
 
102
 
-
 
103
                case UBLOX_IDLE: // Zuerst Synchcharacters pruefen
-
 
104
                        if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1;
-
 
105
                        else ublox_msg_state = UBLOX_IDLE;
-
 
106
                        break;
-
 
107
 
-
 
108
                case UBLOX_SYNC1:
-
 
109
 
-
 
110
                        if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2;
-
 
111
                        else ublox_msg_state = UBLOX_IDLE;
-
 
112
                        chk_a = 0,chk_b = 0;
-
 
113
                        break;
-
 
114
 
-
 
115
                case UBLOX_SYNC2:
-
 
116
                        if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS;      
-
 
117
                        else ublox_msg_state = UBLOX_IDLE;
-
 
118
                        break;
-
 
119
 
-
 
120
                case UBLOX_CLASS: // Nur NAV Meldungen auswerten
-
 
121
                        switch (rx)
-
 
122
                        {
-
 
123
                                case UBLOX_NAV_POSUTM:
-
 
124
                                        ptr_pac_status  =       &actual_pos.status;
-
 
125
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden
-
 
126
                                        else
-
 
127
                                        {
-
 
128
                                                ptr_payload_data                = &actual_pos;
-
 
129
                                                ptr_payload_data_end    = &actual_pos.status;
-
 
130
                                                ublox_msg_state                 = UBLOX_LEN1;
-
 
131
                                        }
-
 
132
                                        break;
-
 
133
 
-
 
134
                                case UBLOX_NAV_STATUS:
-
 
135
                                        ptr_pac_status  =       &actual_status.status;
-
 
136
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
-
 
137
                                        else
-
 
138
                                        {
-
 
139
                                                ptr_payload_data                = &actual_status;
-
 
140
                                                ptr_payload_data_end    = &actual_status.status;
-
 
141
                                                ublox_msg_state                 = UBLOX_LEN1;
-
 
142
                                        }
-
 
143
                                        break;
-
 
144
 
-
 
145
                                case UBLOX_NAV_VELED:
-
 
146
                                        ptr_pac_status  =       &actual_speed.status;
-
 
147
                                        if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE;
-
 
148
                                        else
-
 
149
                                        {
-
 
150
                                                ptr_payload_data                = &actual_speed;
-
 
151
                                                ptr_payload_data_end    = &actual_speed.status;
-
 
152
                                                ublox_msg_state                 = UBLOX_LEN1;
-
 
153
                                        }
-
 
154
                                        break;
-
 
155
 
-
 
156
                                default:
-
 
157
                                        ublox_msg_state = UBLOX_IDLE;
-
 
158
                                        break; 
-
 
159
                        }
-
 
160
                        chk_a   = UBLOX_NAV_CLASS + rx;
-
 
161
                        chk_b   = UBLOX_NAV_CLASS + chk_a;                     
-
 
162
                        break;
-
 
163
 
-
 
164
                case UBLOX_LEN1: // Laenge auswerten
-
 
165
                        rx_len  = rx;
-
 
166
                        chk_a   += rx;
-
 
167
                        chk_b   += chk_a;              
-
 
168
                        ublox_msg_state = UBLOX_LEN2;
-
 
169
                        break;
-
 
170
 
-
 
171
 
-
 
172
                case UBLOX_LEN2: // Laenge auswerten
-
 
173
                        rx_len = rx_len + (rx *256); // Laenge ermitteln
-
 
174
                        chk_a   += rx;
-
 
175
                        chk_b   += chk_a;      
-
 
176
                        ublox_msg_state = UBLOX_PAYLOAD;
-
 
177
                        break;
-
 
178
 
-
 
179
                case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen
-
 
180
                        if (rx_len > 0)
-
 
181
                        {
-
 
182
                                *ptr_payload_data = rx;
-
 
183
                                chk_a   += rx;
-
 
184
                                chk_b   += chk_a;
-
 
185
                                --rx_len;      
-
 
186
                                if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end))                          
-
 
187
                                {
-
 
188
                                        ptr_payload_data++;
-
 
189
                                        ublox_msg_state = UBLOX_PAYLOAD;
-
 
190
                            }
-
 
191
                                else ublox_msg_state = UBLOX_CKA;
-
 
192
                        }      
-
 
193
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
-
 
194
                        break;
-
 
195
 
-
 
196
                case UBLOX_CKA: // Checksum pruefen
-
 
197
                        if (rx == chk_a) ublox_msg_state = UBLOX_CKB;                          
-
 
198
                        else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler
-
 
199
                        break;
-
 
200
 
-
 
201
                case UBLOX_CKB: // Checksum pruefen
-
 
202
                        if (rx == chk_b) *ptr_pac_status = 1; // Paket ok
-
 
203
                        ublox_msg_state    = UBLOX_IDLE;
-
 
204
                        break;
-
 
205