Subversion Repositories NaviCtrl

Rev

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

Rev 88 Rev 92
1
/*#######################################################################################*/
1
/*#######################################################################################*/
2
/* !!! THIS IS NOT FREE SOFTWARE !!!                                                     */
2
/* !!! THIS IS NOT FREE SOFTWARE !!!                                                     */
3
/*#######################################################################################*/
3
/*#######################################################################################*/
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5
// + Copyright (c) 2008 Ingo Busker, Holger Buss
5
// + Copyright (c) 2008 Ingo Busker, Holger Buss
6
// + Nur für den privaten Gebrauch
6
// + Nur für den privaten Gebrauch
7
// + FOR NON COMMERCIAL USE ONLY
7
// + FOR NON COMMERCIAL USE ONLY
8
// + www.MikroKopter.com
8
// + www.MikroKopter.com
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
10
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
11
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
11
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
12
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
12
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
13
// + bzgl. der Nutzungsbedingungen aufzunehmen.
13
// + bzgl. der Nutzungsbedingungen aufzunehmen.
14
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
14
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
15
// + Verkauf von Luftbildaufnahmen, usw.
15
// + Verkauf von Luftbildaufnahmen, usw.
16
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
16
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
17
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
18
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
18
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
20
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
20
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
21
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
21
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
22
// + eindeutig als Ursprung verlinkt werden
22
// + eindeutig als Ursprung verlinkt werden
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
24
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
25
// + Benutzung auf eigene Gefahr
25
// + Benutzung auf eigene Gefahr
26
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
26
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
27
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
28
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
28
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
29
// + mit unserer Zustimmung zulässig
29
// + mit unserer Zustimmung zulässig
30
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
31
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
32
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
32
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
33
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
33
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
34
// + this list of conditions and the following disclaimer.
34
// + this list of conditions and the following disclaimer.
35
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
35
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
36
// +     from this software without specific prior written permission.
36
// +     from this software without specific prior written permission.
37
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
37
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
38
// +     for non-commercial use (directly or indirectly)
38
// +     for non-commercial use (directly or indirectly)
39
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
39
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
40
// +     with our written permission
40
// +     with our written permission
41
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
41
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
42
// +     clearly linked as origin
42
// +     clearly linked as origin
43
// +   * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
43
// +   * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
44
//
44
//
45
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
45
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
46
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
48
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
49
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
49
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
50
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
51
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
52
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
53
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
54
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
// +  POSSIBILITY OF SUCH DAMAGE.
55
// +  POSSIBILITY OF SUCH DAMAGE.
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57
#include <stdio.h>
57
#include <stdio.h>
58
#include "91x_lib.h"
58
#include "91x_lib.h"
59
#include "main.h"
59
#include "main.h"
60
#include "timer.h"
60
#include "timer.h"
61
#include "uart1.h"
61
#include "uart1.h"
62
#include "kml.h"
62
#include "kml.h"
63
#include "gpx.h"
63
#include "gpx.h"
64
#include "ssc.h"
64
#include "ssc.h"
65
#include "settings.h"
65
#include "settings.h"
-
 
66
 
-
 
67
 
-
 
68
#define LOG_FLUSH_INTERVAL 20000 // 20s
66
 
69
 
67
typedef enum
70
typedef enum
68
{
71
{
69
        LOGFILE_IDLE,
72
        LOGFILE_IDLE,
70
        LOGFILE_START,
73
        LOGFILE_START,
71
        LOGFILE_CLOSED,
74
        LOGFILE_CLOSED,
72
        LOGFILE_OPENED,
75
        LOGFILE_OPENED,
73
        LOGFILE_ERROR
76
        LOGFILE_ERROR
74
} logfilestate_t;
77
} logfilestate_t;
75
 
78
 
76
// logger handler prototypes
79
// logger handler prototypes
77
logfilestate_t Logging_KML(u32 LogDelay);
80
logfilestate_t Logging_KML(u32 LogDelay);
78
logfilestate_t Logging_GPX(u32 LogDelay);
81
logfilestate_t Logging_GPX(u32 LogDelay);
79
 
82
 
80
typedef struct
83
typedef struct
81
{
84
{
82
        u32 KML_Interval;  // the kml-log interval (0 = off)
85
        u32 KML_Interval;  // the kml-log interval (0 = off)
83
        u32 GPX_Interval;  // the gpx-log interval (0 = off)
86
        u32 GPX_Interval;  // the gpx-log interval (0 = off)
84
} LogCfg_t;
87
} LogCfg_t;
85
 
88
 
86
LogCfg_t LogCfg = {500 , 1000};
89
LogCfg_t LogCfg = {500 , 0};
87
 
90
 
88
 
91
 
89
//----------------------------------------------------------------------------------------------------
92
//----------------------------------------------------------------------------------------------------
90
s8* GenerateKMLLogFileName(void)
93
s8* GenerateKMLLogFileName(void)
91
{
94
{
92
        static u16 filenum = 0; // file name counter
95
        static u16 filenum = 0; // file name counter
93
        static s8 filename[35];
96
        static s8 filename[35];
94
        static DateTime_t LastTime = {0,0,0,0,0,0,0,0};
97
        static DateTime_t LastTime = {0,0,0,0,0,0,0,0};
95
 
98
 
96
        if(SystemTime.Valid)
99
        if(SystemTime.Valid)
97
        {
100
        {
98
                // if the day has been changed
101
                // if the day has been changed
99
                if((LastTime.Year != SystemTime.Year) || (LastTime.Month != SystemTime.Month) || (LastTime.Day != SystemTime.Day))
102
                if((LastTime.Year != SystemTime.Year) || (LastTime.Month != SystemTime.Month) || (LastTime.Day != SystemTime.Day))
100
                {
103
                {
101
                        LastTime.Year = SystemTime.Year;
104
                        LastTime.Year = SystemTime.Year;
102
                        LastTime.Month = SystemTime.Month;
105
                        LastTime.Month = SystemTime.Month;
103
                        LastTime.Day = SystemTime.Day;
106
                        LastTime.Day = SystemTime.Day;
104
                        LastTime.Valid = 1;
107
                        LastTime.Valid = 1;
105
                        filenum = 0; // reset file counter
108
                        filenum = 0; // reset file counter
106
                }
109
                }
107
                sprintf(filename, "LOG/%04i%02i%02i/KML/GPS%05i.KML", SystemTime.Year, SystemTime.Month, SystemTime.Day, filenum);
110
                sprintf(filename, "LOG/%04i%02i%02i/KML/GPS%05i.KML", SystemTime.Year, SystemTime.Month, SystemTime.Day, filenum);
108
                filenum++;
111
                filenum++;
109
                return filename;
112
                return filename;
110
        }
113
        }
111
        else return NULL;
114
        else return NULL;
112
}
115
}
113
 
116
 
114
//----------------------------------------------------------------------------------------------------
117
//----------------------------------------------------------------------------------------------------
115
s8* GenerateGPXLogFileName(void)
118
s8* GenerateGPXLogFileName(void)
116
{
119
{
117
        static u16 filenum = 0; // file name counter
120
        static u16 filenum = 0; // file name counter
118
        static s8 filename[35];
121
        static s8 filename[35];
119
        static DateTime_t LastTime = {0,0,0,0,0,0,0,0};
122
        static DateTime_t LastTime = {0,0,0,0,0,0,0,0};
120
 
123
 
121
        if(SystemTime.Valid)
124
        if(SystemTime.Valid)
122
        {
125
        {
123
                // if the day has been changed
126
                // if the day has been changed
124
                if((LastTime.Year != SystemTime.Year) || (LastTime.Month != SystemTime.Month) || (LastTime.Day != SystemTime.Day))
127
                if((LastTime.Year != SystemTime.Year) || (LastTime.Month != SystemTime.Month) || (LastTime.Day != SystemTime.Day))
125
                {
128
                {
126
                        LastTime.Year = SystemTime.Year;
129
                        LastTime.Year = SystemTime.Year;
127
                        LastTime.Month = SystemTime.Month;
130
                        LastTime.Month = SystemTime.Month;
128
                        LastTime.Day = SystemTime.Day;
131
                        LastTime.Day = SystemTime.Day;
129
                        LastTime.Valid = 1;
132
                        LastTime.Valid = 1;
130
                        filenum = 0; // reset file counter
133
                        filenum = 0; // reset file counter
131
                }
134
                }
132
                sprintf(filename, "LOG/%04i%02i%02i/GPX/GPS%05i.GPX", SystemTime.Year, SystemTime.Month, SystemTime.Day, filenum);
135
                sprintf(filename, "LOG/%04i%02i%02i/GPX/GPS%05i.GPX", SystemTime.Year, SystemTime.Month, SystemTime.Day, filenum);
133
                filenum++;
136
                filenum++;
134
                return filename;
137
                return filename;
135
        }
138
        }
136
        else return NULL;
139
        else return NULL;
137
}
140
}
138
 
141
 
139
 
142
 
140
 
143
 
141
//----------------------------------------------------------------------------------------------------
144
//----------------------------------------------------------------------------------------------------
142
// logs the current gps position to a kml file
145
// logs the current gps position to a kml file
143
logfilestate_t Logging_KML(u32 LogDelay)
146
logfilestate_t Logging_KML(u32 LogDelay)
144
{
147
{
145
        static  logfilestate_t logfilestate = LOGFILE_IDLE; // the current logfilestate
148
        static  logfilestate_t logfilestate = LOGFILE_IDLE; // the current logfilestate
146
        static  s8* logfilename = NULL;                                         // the pointer to the logfilename
149
        static  s8* logfilename = NULL;                                         // the pointer to the logfilename
147
        static  u32 logtimer = 0;                                               // the log update timer
150
        static  u32 logtimer = 0, flushtimer = 0;               // the log update timer
148
        static  KML_Document_t logfile;                                         // the logfilehandle
151
        static  KML_Document_t logfile;                                         // the logfilehandle
149
 
152
 
150
        // initialize if LogDelay os zero
153
        // initialize if LogDelay os zero
151
        if(!LogDelay)
154
        if(!LogDelay)
152
        {
155
        {
153
                switch(logfilestate)
156
                switch(logfilestate)
154
                {
157
                {
155
                        case LOGFILE_OPENED:
158
                        case LOGFILE_OPENED:
156
                                KML_DocumentClose(&logfile); // try to close it
159
                                KML_DocumentClose(&logfile); // try to close it
157
                                break;
160
                                break;
158
                        default:
161
                        default:
159
                                break;
162
                                break;
160
                }
163
                }
161
                logfilestate = LOGFILE_IDLE;
164
                logfilestate = LOGFILE_IDLE;
162
                logfilename = NULL;
165
                logfilename = NULL;
163
                KML_DocumentInit(&logfile);
166
                KML_DocumentInit(&logfile);
164
                logtimer = SetDelay(0); // set logtimer to now
167
                logtimer = SetDelay(0); // set logtimer to now
165
                return logfilestate;
168
                return logfilestate;
166
        }
169
        }
167
        // no init
170
        // no init
168
        if(CheckDelay(logtimer))
171
        if(CheckDelay(logtimer))
169
        {
172
        {
170
                logtimer = SetDelay(LogDelay);  // standard interval
173
                logtimer = SetDelay(LogDelay);  // standard interval
171
 
174
 
172
                if(FC.MKFlags & MKFLAG_MOTOR_RUN)
175
                if(FC.MKFlags & MKFLAG_MOTOR_RUN)
173
                {
176
                {
174
                        switch(logfilestate)
177
                        switch(logfilestate)
175
                        {
178
                        {
176
                                case LOGFILE_IDLE:
179
                                case LOGFILE_IDLE:
177
                                case LOGFILE_CLOSED:
180
                                case LOGFILE_CLOSED:
178
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D) && (FC.MKFlags & MKFLAG_FLY))
181
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D) && (FC.MKFlags & MKFLAG_FLY))
179
                                        {
182
                                        {
180
                                                logfilestate = LOGFILE_START;
183
                                                logfilestate = LOGFILE_START;
181
                                        }
184
                                        }
182
                                        break;
185
                                        break;
183
                                case LOGFILE_START:
186
                                case LOGFILE_START:
184
                                        // find unused logfile name
187
                                        // find unused logfile name
185
                                        do
188
                                        do
186
                                        {        // try to generate a new logfile name
189
                                        {        // try to generate a new logfile name
187
                                                 logfilename = GenerateKMLLogFileName();
190
                                                 logfilename = GenerateKMLLogFileName();
188
                                        }while((logfilename != NULL) && fexist_(logfilename));
191
                                        }while((logfilename != NULL) && fexist_(logfilename));
189
                                        // if logfilename exist
192
                                        // if logfilename exist
190
                                        if(logfilename != NULL)
193
                                        if(logfilename != NULL)
191
                                        {
194
                                        {
192
                                                // try to create the log file
195
                                                // try to create the log file
193
                                                if(KML_DocumentOpen(logfilename, &logfile))
196
                                                if(KML_DocumentOpen(logfilename, &logfile))
194
                                                {
197
                                                {
-
 
198
                                                        flushtimer = SetDelay(LOG_FLUSH_INTERVAL);
195
                                                        logfilestate = LOGFILE_OPENED; // goto next step
199
                                                        logfilestate = LOGFILE_OPENED; // goto next step
196
                                                        SerialPutString("\r\nOpening kml-file:");
200
                                                        SerialPutString("\r\nOpening kml-file:");
197
                                                        SerialPutString(logfilename);
201
                                                        SerialPutString(logfilename);
198
                                                        SerialPutString("\r\n");
202
                                                        SerialPutString("\r\n");
199
                                                }
203
                                                }
200
                                                else // could not be openend
204
                                                else // could not be openend
201
                                                {
205
                                                {
202
                                                        logfilestate = LOGFILE_ERROR;
206
                                                        logfilestate = LOGFILE_ERROR;
203
                                                        SerialPutString("\r\nError opening kml-file: ");
207
                                                        SerialPutString("\r\nError opening kml-file: ");
204
                                                        SerialPutString(logfilename);
208
                                                        SerialPutString(logfilename);
205
                                                        SerialPutString("\r\n");
209
                                                        SerialPutString("\r\n");
206
                                                        logtimer = SetDelay(10);  // try again in open logfile in 10 mili sec
210
                                                        logtimer = SetDelay(10);  // try again in open logfile in 10 mili sec
207
                                                }
211
                                                }
208
                                        }
212
                                        }
209
                                        else
213
                                        else
210
                                        {
214
                                        {
211
                                                logfilestate = LOGFILE_ERROR;
215
                                                logfilestate = LOGFILE_ERROR;
212
                                                SerialPutString("\r\nError getting free kml-file name\r\n");
216
                                                SerialPutString("\r\nError getting free kml-file name\r\n");
213
                                        }
217
                                        }
214
                                        // else retry in next loop
218
                                        // else retry in next loop
215
                                        break;
219
                                        break;
216
                                case LOGFILE_OPENED:
220
                                case LOGFILE_OPENED:
217
                                        // append new gps log data
221
                                        // append new gps log data
218
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D))
222
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D))
219
                                        {
223
                                        {
220
                                                if(!KML_LoggGPSCoordinates(&logfile))
224
                                                if(!KML_LoggGPSCoordinates(&logfile))
221
                                                {       // error logging data
225
                                                {       // error logging data
222
                                                        SerialPutString("\r\nError logging to kml-file\r\n");
226
                                                        SerialPutString("\r\nError logging to kml-file\r\n");
223
                                                        KML_DocumentClose(&logfile);
227
                                                        KML_DocumentClose(&logfile);
224
                                                        logfilestate = LOGFILE_ERROR;
228
                                                        logfilestate = LOGFILE_ERROR;
225
                                                }
229
                                                }
-
 
230
                                                else // sucessfully logged
-
 
231
                                                {
-
 
232
                                                        if(CheckDelay(flushtimer))
-
 
233
                                                        {
226
                                                //else DebugOut.Analog[26]++;   // count SD-Logs
234
                                                                flushtimer = SetDelay(LOG_FLUSH_INTERVAL);
-
 
235
                                                                fflush_(logfile.file);
-
 
236
                                                        }
-
 
237
                                                }
-
 
238
 
227
                                        }
239
                                        }
228
                                        break;
240
                                        break;
229
 
241
 
230
                                case LOGFILE_ERROR:
242
                                case LOGFILE_ERROR:
231
                                        break;
243
                                        break;
232
 
244
 
233
                                default:
245
                                default:
234
                                        logfilestate = LOGFILE_IDLE;
246
                                        logfilestate = LOGFILE_IDLE;
235
                                        break;
247
                                        break;
236
                        }
248
                        }
237
                } // EOF model is flying
249
                } // EOF motors are not running
238
                else // model is not flying
250
                else // model is not flying
239
                {   // close log file if opened
251
                {   // close log file if opened
240
                        if(logfilestate == LOGFILE_OPENED)
252
                        if(logfilestate == LOGFILE_OPENED)
241
                        {
253
                        {
242
                                if(KML_DocumentClose(&logfile))
254
                                if(KML_DocumentClose(&logfile))
243
                                {
255
                                {
244
                                        SerialPutString("\r\nClosing kml-file\r\n");
256
                                        SerialPutString("\r\nClosing kml-file\r\n");
245
                                        logfilestate = LOGFILE_CLOSED;
257
                                        logfilestate = LOGFILE_CLOSED;
246
                                }
258
                                }
247
                                else  // could not be closed
259
                                else  // could not be closed
248
                                {
260
                                {
-
 
261
                                        SerialPutString("\r\nError closing kml-file\r\n");
249
                                        logfilestate =  LOGFILE_ERROR;
262
                                        logfilestate =  LOGFILE_ERROR;
250
                                }
263
                                }
251
                        }
264
                        }
252
                } //EOF model is not flying
265
                } //EOF motors are not running
253
        } // EOF Check LogTimer
266
        } // EOF Check LogTimer
254
 
267
 
255
        return logfilestate;
268
        return logfilestate;
256
}
269
}
257
 
270
 
258
//----------------------------------------------------------------------------------------------------
271
//----------------------------------------------------------------------------------------------------
259
// logs gps and state info to a gpx file
272
// logs gps and state info to a gpx file
260
logfilestate_t Logging_GPX(u32 LogDelay)
273
logfilestate_t Logging_GPX(u32 LogDelay)
261
{
274
{
262
        static  logfilestate_t logfilestate = LOGFILE_IDLE; // the current logfilestate
275
        static  logfilestate_t logfilestate = LOGFILE_IDLE; // the current logfilestate
263
        static  s8* logfilename = NULL;                                         // the pointer to the logfilename
276
        static  s8* logfilename = NULL;                                         // the pointer to the logfilename
264
        static  u32 logtimer = 0;                                               // the log update timer
277
        static  u32 logtimer = 0, flushtimer = 0;               // the log update timer
265
        static  GPX_Document_t logfile;                                         // the logfilehandle
278
        static  GPX_Document_t logfile;                                         // the logfilehandle
266
 
279
 
267
        // initialize if LogDelay os zero
280
        // initialize if LogDelay os zero
268
        if(!LogDelay)
281
        if(!LogDelay)
269
        {
282
        {
270
                switch(logfilestate)
283
                switch(logfilestate)
271
                {
284
                {
272
                        case LOGFILE_OPENED:
285
                        case LOGFILE_OPENED:
273
                                GPX_DocumentClose(&logfile); // try to close it
286
                                GPX_DocumentClose(&logfile); // try to close it
274
                                break;
287
                                break;
275
                        default:
288
                        default:
276
                                break;
289
                                break;
277
                }
290
                }
278
                logfilestate = LOGFILE_IDLE;
291
                logfilestate = LOGFILE_IDLE;
279
                logfilename = NULL;
292
                logfilename = NULL;
280
                GPX_DocumentInit(&logfile);
293
                GPX_DocumentInit(&logfile);
281
                logtimer = SetDelay(0); // set logtimer to now
294
                logtimer = SetDelay(0); // set logtimer to now
282
                return logfilestate;
295
                return logfilestate;
283
        }
296
        }
284
        // no init
297
        // no init
285
        if(CheckDelay(logtimer))
298
        if(CheckDelay(logtimer))
286
        {
299
        {
287
                logtimer = SetDelay(LogDelay);  // standard interval
300
                logtimer = SetDelay(LogDelay);  // standard interval
288
 
301
 
289
                if(FC.MKFlags & MKFLAG_MOTOR_RUN)
302
                if(FC.MKFlags & MKFLAG_MOTOR_RUN)
290
                {
303
                {
291
                        switch(logfilestate)
304
                        switch(logfilestate)
292
                        {
305
                        {
293
                                case LOGFILE_IDLE:
306
                                case LOGFILE_IDLE:
294
                                case LOGFILE_CLOSED:
307
                                case LOGFILE_CLOSED:
295
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D) && (FC.MKFlags & MKFLAG_FLY))
308
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D) && (FC.MKFlags & MKFLAG_FLY))
296
                                        {
309
                                        {
297
                                                logfilestate = LOGFILE_START;
310
                                                logfilestate = LOGFILE_START;
298
                                        }
311
                                        }
299
                                        break;
312
                                        break;
300
                                case LOGFILE_START:
313
                                case LOGFILE_START:
301
                                        // find unused logfile name
314
                                        // find unused logfile name
302
                                        do
315
                                        do
303
                                        {        // try to generate a new logfile name
316
                                        {        // try to generate a new logfile name
304
                                                 logfilename = GenerateGPXLogFileName();
317
                                                 logfilename = GenerateGPXLogFileName();
305
                                        }while((logfilename != NULL) && fexist_(logfilename));
318
                                        }while((logfilename != NULL) && fexist_(logfilename));
306
                                        // if logfilename exist
319
                                        // if logfilename exist
307
                                        if(logfilename != NULL)
320
                                        if(logfilename != NULL)
308
                                        {
321
                                        {
309
                                                // try to create the log file
322
                                                // try to create the log file
310
                                                if(GPX_DocumentOpen(logfilename, &logfile))
323
                                                if(GPX_DocumentOpen(logfilename, &logfile))
311
                                                {
324
                                                {
-
 
325
                                                        flushtimer = SetDelay(LOG_FLUSH_INTERVAL);
312
                                                        logfilestate = LOGFILE_OPENED; // goto next step
326
                                                        logfilestate = LOGFILE_OPENED; // goto next step
313
                                                        SerialPutString("\r\nOpening gpx-file:");
327
                                                        SerialPutString("\r\nOpening gpx-file:");
314
                                                        SerialPutString(logfilename);
328
                                                        SerialPutString(logfilename);
315
                                                        SerialPutString("\r\n");
329
                                                        SerialPutString("\r\n");
316
                                                }
330
                                                }
317
                                                else // could not be openend
331
                                                else // could not be openend
318
                                                {
332
                                                {
319
                                                        logfilestate = LOGFILE_ERROR;
333
                                                        logfilestate = LOGFILE_ERROR;
320
                                                        SerialPutString("\r\nError opening gpx-file: ");
334
                                                        SerialPutString("\r\nError opening gpx-file: ");
321
                                                        SerialPutString(logfilename);
335
                                                        SerialPutString(logfilename);
322
                                                        SerialPutString("\r\n");
336
                                                        SerialPutString("\r\n");
323
                                                        logtimer = SetDelay(10);  // try again in open logfile in 10 mili sec
337
                                                        logtimer = SetDelay(10);  // try again in open logfile in 10 mili sec
324
                                                }
338
                                                }
325
                                        }
339
                                        }
326
                                        else
340
                                        else
327
                                        {
341
                                        {
328
                                                logfilestate = LOGFILE_ERROR;
342
                                                logfilestate = LOGFILE_ERROR;
329
                                                SerialPutString("\r\nError getting free gpx-file name\r\n");
343
                                                SerialPutString("\r\nError getting free gpx-file name\r\n");
330
                                        }
344
                                        }
331
                                        // else retry in next loop
345
                                        // else retry in next loop
332
                                        break;
346
                                        break;
333
                                case LOGFILE_OPENED:
347
                                case LOGFILE_OPENED:
334
                                        // append new gps log data
348
                                        // append new gps log data
335
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D))
349
                                        if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D))
336
                                        {
350
                                        {
337
                                                if(!GPX_LoggGPSCoordinates(&logfile))
351
                                                if(!GPX_LoggGPSCoordinates(&logfile))
338
                                                {       // error logging data
352
                                                {       // error logging data
339
                                                        SerialPutString("\r\nError logging to gpx-file\r\n");
353
                                                        SerialPutString("\r\nError logging to gpx-file\r\n");
340
                                                        GPX_DocumentClose(&logfile);
354
                                                        GPX_DocumentClose(&logfile);
341
                                                        logfilestate = LOGFILE_ERROR;
355
                                                        logfilestate = LOGFILE_ERROR;
342
                                                }
356
                                                }
-
 
357
                                                else // successful log
-
 
358
                                                {
-
 
359
                                                        if(CheckDelay(flushtimer))
-
 
360
                                                        {
-
 
361
                                                                flushtimer = SetDelay(LOG_FLUSH_INTERVAL);
-
 
362
                                                                fflush_(logfile.file);
-
 
363
                                                        }
-
 
364
                                                }
343
                                        }
365
                                        }
344
                                        break;
366
                                        break;
345
 
367
 
346
                                case LOGFILE_ERROR:
368
                                case LOGFILE_ERROR:
347
                                        break;
369
                                        break;
348
 
370
 
349
                                default:
371
                                default:
350
                                        logfilestate = LOGFILE_IDLE;
372
                                        logfilestate = LOGFILE_IDLE;
351
                                        break;
373
                                        break;
352
                        }
374
                        }
353
                } // EOF model is flying
375
                } // EOF model is flying
354
                else // model is not flying
376
                else // model is not flying
355
                {   // close log file if opened
377
                {   // close log file if opened
356
                        if(logfilestate == LOGFILE_OPENED)
378
                        if(logfilestate == LOGFILE_OPENED)
357
                        {
379
                        {
358
                                if(GPX_DocumentClose(&logfile))
380
                                if(GPX_DocumentClose(&logfile))
359
                                {
381
                                {
360
                                        SerialPutString("\r\nClosing gpx-file\r\n");
382
                                        SerialPutString("\r\nClosing gpx-file\r\n");
361
                                        logfilestate = LOGFILE_CLOSED;
383
                                        logfilestate = LOGFILE_CLOSED;
362
                                }
384
                                }
363
                                else  // could not be closed
385
                                else  // could not be closed
364
                                {
386
                                {
-
 
387
                                        SerialPutString("\r\nError closing gpx-file\r\n");
365
                                        logfilestate =  LOGFILE_ERROR;
388
                                        logfilestate =  LOGFILE_ERROR;
366
                                }
389
                                }
367
                        }
390
                        }
368
                } //EOF model is not flying
391
                } //EOF model is not flying
369
        } // EOF Check LogTimer
392
        } // EOF Check LogTimer
370
 
393
 
371
        return logfilestate;
394
        return logfilestate;
372
}
395
}
373
 
396
 
374
//----------------------------------------------------------------------------------------------------
397
//----------------------------------------------------------------------------------------------------
375
// initialize logging
398
// initialize logging
376
void Logging_Init(void)
399
void Logging_Init(void)
377
{
400
{
378
        LogCfg.KML_Interval = 500; //default
401
        LogCfg.KML_Interval = 500; //default
379
        Settings_GetParamValue(PID_KML_LOGGING, (u16*)&LogCfg.KML_Interval); // overwrite by settings value
402
        Settings_GetParamValue(PID_KML_LOGGING, (u16*)&LogCfg.KML_Interval); // overwrite by settings value
380
        Logging_KML(0);
403
        Logging_KML(0); // initialize
381
        LogCfg.GPX_Interval = 0; //default
404
        LogCfg.GPX_Interval = 0; //default
382
        Settings_GetParamValue(PID_GPX_LOGGING, (u16*)&LogCfg.GPX_Interval); // overwrite by settings value
405
        Settings_GetParamValue(PID_GPX_LOGGING, (u16*)&LogCfg.GPX_Interval); // overwrite by settings value
383
        Logging_GPX(0);
406
        Logging_GPX(0); // initialize
384
}
407
}
385
 
408
 
386
//----------------------------------------------------------------------------------------------------
409
//----------------------------------------------------------------------------------------------------
387
// gobal logging handler
410
// gobal logging handler
388
void Logging_Update(void)
411
void Logging_Update(void)
389
{
412
{
390
        static u32 logtimer = 0;
413
        static u32 logtimer = 0;
391
        static logfilestate_t logstate = LOGFILE_IDLE;
414
        static logfilestate_t logstate = LOGFILE_IDLE;
392
 
415
 
393
 
416
 
394
        if(SD_SWITCH && CheckDelay(logtimer)) // a card is in slot
417
        if(SD_SWITCH) // a card is in slot
395
        {
-
 
396
                logtimer = SetDelay(10);  // faster makes no sense
-
 
397
                // call the logger handlers if no error has occured
-
 
398
                if(logstate != LOGFILE_ERROR) logstate = Logging_KML(LogCfg.KML_Interval);
-
 
399
                if(logstate != LOGFILE_ERROR) logstate = Logging_GPX(LogCfg.GPX_Interval);
-
 
400
 
-
 
401
                // a logging error has occured
418
        {
402
                if(logstate == LOGFILE_ERROR)
419
                if(CheckDelay(logtimer))
403
                {
420
                {
-
 
421
                        logtimer = SetDelay(10);  // faster makes no sense
-
 
422
                        // call the logger handlers if no error has occured
-
 
423
                        if(logstate != LOGFILE_ERROR) logstate = Logging_KML(LogCfg.KML_Interval);
-
 
424
                        if(logstate != LOGFILE_ERROR) logstate = Logging_GPX(LogCfg.GPX_Interval);
404
                        Logging_Init(); // initialize the logs
425
               
405
                        // try to initialize the Fat 16 filesystem
426
                        // a logging error has occured
-
 
427
                        if(logstate == LOGFILE_ERROR)
-
 
428
                        {
-
 
429
                                if(Fat16_IsValid()) // wait for reinizialization of fat16 from outside
406
                        if(0 == Fat16_Init())
430
                                {
407
                        {       // Fat 16 successfully initialized
431
                                        Logging_Init(); // initialize the logs
408
                                logstate = LOGFILE_IDLE;
432
                                        logstate = LOGFILE_IDLE;
409
                                logtimer = SetDelay(10);        // try again in open logfile in 10 mili sec
433
                                        logtimer = SetDelay(10);        // try next log in 10 mili sec
410
                        }
434
                                }
411
                        else
435
                                else
412
                        {   // retry in 5 seconds
436
                                {   // retry in 5 seconds
413
                                logtimer = SetDelay(5000);  // try again in 5 sec
437
                                        logtimer = SetDelay(5000);  // try again in 5 sec
414
                        }
438
                                }
415
                } //EOF logfile error
439
                        } //EOF logfile error
-
 
440
                }  // EOF CheckDelay
416
        }// EOF CheckDelay
441
        }// EOF Card in Slot
417
}
442
}
418
 
443