Subversion Repositories NaviCtrl

Rev

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

Rev 345 Rev 349
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 / NON-COMMERCIAL USE ONLY
6
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
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 oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
28
// + Die Portierung oder Nutzung 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 the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
43
// +   * porting the sources to other systems or using the software on other systems (except 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 <stdarg.h>
58
#include <stdarg.h>
59
#include <string.h>
59
#include <string.h>
60
 
60
 
61
#include "91x_lib.h"
61
#include "91x_lib.h"
62
#include "main.h"
62
#include "main.h"
63
#include "config.h"
63
#include "config.h"
64
#include "menu.h"
64
#include "menu.h"
65
#include "GPS.h"
65
#include "GPS.h"
66
#include "i2c.h"
66
#include "i2c.h"
67
#include "uart0.h"
67
#include "uart0.h"
68
#include "uart1.h"
68
#include "uart1.h"
69
#include "uart2.h"
69
#include "uart2.h"
70
#include "timer1.h"
70
#include "timer1.h"
71
#include "timer2.h"
71
#include "timer2.h"
72
#include "analog.h"
72
#include "analog.h"
73
#include "compass.h"
73
#include "compass.h"
74
#include "waypoints.h"
74
#include "waypoints.h"
75
#include "mkprotocol.h"
75
#include "mkprotocol.h"
76
#include "params.h"
76
#include "params.h"
77
#include "fifo.h"
77
#include "fifo.h"
78
#include "debug.h"
78
#include "debug.h"
-
 
79
#include "ftphelper.h"
79
 
80
 
80
#define FALSE   0
81
#define FALSE   0
81
#define TRUE    1
82
#define TRUE    1
82
 
83
 
83
#define ABO_TIMEOUT 4000 // disable abo after 4 seconds
84
#define ABO_TIMEOUT 4000 // disable abo after 4 seconds
84
u32 UART1_AboTimeOut = 0;
85
u32 UART1_AboTimeOut = 0;
85
 
86
 
86
u8 UART1_Request_VersionInfo    = FALSE;
87
u8 UART1_Request_VersionInfo    = FALSE;
87
u8 UART1_Request_ExternalControl= FALSE;
88
u8 UART1_Request_ExternalControl= FALSE;
88
u8 UART1_Request_Display                = FALSE;
89
u8 UART1_Request_Display                = FALSE;
89
u8 UART1_Request_Display1               = FALSE;
90
u8 UART1_Request_Display1               = FALSE;
90
u8 UART1_Request_DebugData              = FALSE;
91
u8 UART1_Request_DebugData              = FALSE;
91
u8 UART1_Request_DebugLabel             = 255;
92
u8 UART1_Request_DebugLabel             = 255;
92
u8 UART1_Request_NaviData               = FALSE;
93
u8 UART1_Request_NaviData               = FALSE;
93
u8 UART1_Request_ErrorMessage   = FALSE;
94
u8 UART1_Request_ErrorMessage   = FALSE;
94
u8 UART1_Request_WritePoint             = 0xFF;
95
u8 UART1_Request_WritePoint             = 0xFF;
95
u8 UART1_Request_ReadPoint              = 0;
96
u8 UART1_Request_ReadPoint              = 0;
96
u8 UART1_Request_Data3D             = FALSE;
97
u8 UART1_Request_Data3D             = FALSE;
97
u8 UART1_Request_Echo               = FALSE;
98
u8 UART1_Request_Echo               = FALSE;
98
u8 UART1_Request_ParameterId    = 0;
99
u8 UART1_Request_ParameterId    = 0;
99
u8 UART1_Request_Parameter              = FALSE;
100
u8 UART1_Request_Parameter              = FALSE;
100
u8 UART1_DisplayKeys                    = 0;
101
u8 UART1_DisplayKeys                    = 0;
101
u8 UART1_DisplayLine                    = 0;
102
u8 UART1_DisplayLine                    = 0;
102
u8 UART1_ConfirmFrame                   = 0;
103
u8 UART1_ConfirmFrame                   = 0;
-
 
104
u8 UART1_Request_FTP                    = FALSE;
-
 
105
 
103
 
106
 
104
UART_TypeDef *DebugUART = UART1;
107
UART_TypeDef *DebugUART = UART1;
105
 
108
 
106
#ifdef FOLLOW_ME
109
#ifdef FOLLOW_ME
107
#define FOLLOW_ME_INTERVAL 200 // 5 Hz
110
#define FOLLOW_ME_INTERVAL 200 // 5 Hz
108
u32 UART1_FollowMe_Timer        = 0;
111
u32 UART1_FollowMe_Timer        = 0;
109
Point_t FollowMe;
112
Point_t FollowMe;
110
#endif
113
#endif
111
 
114
 
112
// the primary rx fifo
115
// the primary rx fifo
113
#define UART1_RX_FIFO_LEN 512
116
#define UART1_RX_FIFO_LEN 512
114
u8 UART1_rxfifobuffer[UART1_RX_FIFO_LEN];
117
u8 UART1_rxfifobuffer[UART1_RX_FIFO_LEN];
115
fifo_t UART1_rx_fifo;
118
fifo_t UART1_rx_fifo;
116
 
119
 
117
// the rx buffer
120
// the rx buffer
118
#define UART1_RX_BUFFER_LEN  150
121
#define UART1_RX_BUFFER_LEN  150
119
u8 UART1_rbuffer[UART1_RX_BUFFER_LEN];
122
u8 UART1_rbuffer[UART1_RX_BUFFER_LEN];
120
Buffer_t UART1_rx_buffer;
123
Buffer_t UART1_rx_buffer;
121
 
124
 
122
// the tx buffer
125
// the tx buffer
123
#define UART1_TX_BUFFER_LEN  150
126
#define UART1_TX_BUFFER_LEN  1024
124
u8 UART1_tbuffer[UART1_TX_BUFFER_LEN];
127
u8 UART1_tbuffer[UART1_TX_BUFFER_LEN];
125
Buffer_t UART1_tx_buffer;
128
Buffer_t UART1_tx_buffer;
126
 
129
 
127
volatile u8 SerialLinkOkay = 0;
130
volatile u8 SerialLinkOkay = 0;
128
 
131
 
129
u8 text[200];
132
u8 text[200];
130
 
133
 
131
const u8 ANALOG_LABEL[32][16] =
134
const u8 ANALOG_LABEL[32][16] =
132
{
135
{
133
   //1234567890123456
136
   //1234567890123456
134
        "AngleNick       ", //0
137
        "AngleNick       ", //0
135
        "AngleRoll       ",
138
        "AngleRoll       ",
136
        "AccNick         ",
139
        "AccNick         ",
137
        "AccRoll         ",
140
        "AccRoll         ",
138
        "OperatingRadius ",
141
        "OperatingRadius ",
139
        "FC-Flags        ", //5
142
        "FC-Flags        ", //5
140
        "NC-Flags        ",
143
        "NC-Flags        ",
141
        "NickServo       ",
144
        "NickServo       ",
142
        "RollServo       ",
145
        "RollServo       ",
143
        "GPS Data        ",
146
        "GPS Data        ",
144
        "CompassHeading  ", //10
147
        "CompassHeading  ", //10
145
        "GyroHeading     ",
148
        "GyroHeading     ",
146
        "SPI Error       ",
149
        "SPI Error       ",
147
        "SPI Okay        ",
150
        "SPI Okay        ",
148
        "I2C Error       ",
151
        "I2C Error       ",
149
        "I2C Okay        ", //15
152
        "I2C Okay        ", //15
150
        "16              ",
153
        "16              ",
151
        "17              ",
154
        "17              ",
152
        "18              ",
155
        "18              ",
153
        "19 SD-Card-time ",
156
        "19 SD-Card-time ",
154
        "EarthMagnet [%] ", //20
157
        "EarthMagnet [%] ", //20
155
        "Z_Speed         ",
158
        "Z_Speed         ",
156
        "N_Speed         ",
159
        "N_Speed         ",
157
        "E_Speed         ",
160
        "E_Speed         ",
158
        "Magnet X        ",
161
        "Magnet X        ",
159
        "Magnet Y        ", //25
162
        "Magnet Y        ", //25
160
        "Magnet Z        ",
163
        "Magnet Z        ",
161
        "Distance N      ",
164
        "Distance N      ",
162
        "Distance E      ",
165
        "Distance E      ",
163
        "GPS_Nick        ",
166
        "GPS_Nick        ",
164
        "GPS_Roll        ", //30
167
        "GPS_Roll        ", //30
165
        "Used_Sats       "
168
        "Used_Sats       "
166
};
169
};
167
 
170
 
168
DebugOut_t DebugOut;
171
DebugOut_t DebugOut;
169
ExternControl_t ExternControl;
172
ExternControl_t ExternControl;
170
UART_VersionInfo_t UART_VersionInfo;
173
UART_VersionInfo_t UART_VersionInfo;
171
NaviData_t NaviData;
174
NaviData_t NaviData;
172
Data3D_t Data3D;
175
Data3D_t Data3D;
173
u16 Echo; // 2 bytes recieved will be sent back as echo
176
u16 Echo; // 2 bytes recieved will be sent back as echo
174
 
177
 
175
u32 UART1_DebugData_Timer = 0;
178
u32 UART1_DebugData_Timer = 0;
176
u32 UART1_DebugData_Interval = 0;       // in ms
179
u32 UART1_DebugData_Interval = 0;       // in ms
177
u32 UART1_NaviData_Timer = 0;
180
u32 UART1_NaviData_Timer = 0;
178
u32 UART1_NaviData_Interval = 0;        // in ms
181
u32 UART1_NaviData_Interval = 0;        // in ms
179
u32 UART1_Data3D_Timer = 0;
182
u32 UART1_Data3D_Timer = 0;
180
u32 UART1_Data3D_Interval = 0;          // in ms
183
u32 UART1_Data3D_Interval = 0;          // in ms
181
u32 UART1_Display_Timer = 0;
184
u32 UART1_Display_Timer = 0;
182
u32 UART1_Display_Interval = 0;         // in ms
185
u32 UART1_Display_Interval = 0;         // in ms
183
 
186
 
184
/********************************************************/
187
/********************************************************/
185
/*            Initialization the UART1                  */
188
/*            Initialization the UART1                  */
186
/********************************************************/
189
/********************************************************/
187
void UART1_Init (void)
190
void UART1_Init (void)
188
{
191
{
189
        GPIO_InitTypeDef GPIO_InitStructure;
192
        GPIO_InitTypeDef GPIO_InitStructure;
190
        UART_InitTypeDef UART_InitStructure;
193
        UART_InitTypeDef UART_InitStructure;
191
 
194
 
192
        // initialize txd buffer
195
        // initialize txd buffer
193
        Buffer_Init(&UART1_tx_buffer, UART1_tbuffer, UART1_TX_BUFFER_LEN);
196
        Buffer_Init(&UART1_tx_buffer, UART1_tbuffer, UART1_TX_BUFFER_LEN);
194
 
197
 
195
        // initialize rxd buffer
198
        // initialize rxd buffer
196
        Buffer_Init(&UART1_rx_buffer, UART1_rbuffer, UART1_RX_BUFFER_LEN);
199
        Buffer_Init(&UART1_rx_buffer, UART1_rbuffer, UART1_RX_BUFFER_LEN);
197
 
200
 
198
        // initialize the rx fifo, block UART IRQ geting a byte from fifo
201
        // initialize the rx fifo, block UART IRQ geting a byte from fifo
199
        fifo_init(&UART1_rx_fifo, UART1_rxfifobuffer, UART1_RX_FIFO_LEN, NO_ITLine, UART1_ITLine);
202
        fifo_init(&UART1_rx_fifo, UART1_rxfifobuffer, UART1_RX_FIFO_LEN, NO_ITLine, UART1_ITLine);
200
 
203
 
201
        SCU_APBPeriphClockConfig(__UART1, ENABLE);  // Enable the UART1 Clock
204
        SCU_APBPeriphClockConfig(__UART1, ENABLE);  // Enable the UART1 Clock
202
        SCU_APBPeriphClockConfig(__GPIO3, ENABLE);  // Enable the GPIO3 Clock
205
        SCU_APBPeriphClockConfig(__GPIO3, ENABLE);  // Enable the GPIO3 Clock
203
 
206
 
204
        /*Configure UART1_Rx pin GPIO3.2*/
207
        /*Configure UART1_Rx pin GPIO3.2*/
205
        GPIO_StructInit(&GPIO_InitStructure);
208
        GPIO_StructInit(&GPIO_InitStructure);
206
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinInput;
209
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinInput;
207
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_2;
210
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_2;
208
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
211
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
209
        GPIO_InitStructure.GPIO_IPInputConnected =      GPIO_IPInputConnected_Enable;
212
        GPIO_InitStructure.GPIO_IPInputConnected =      GPIO_IPInputConnected_Enable;
210
        GPIO_InitStructure.GPIO_Alternate =     GPIO_InputAlt1; // UART1_RxD
213
        GPIO_InitStructure.GPIO_Alternate =     GPIO_InputAlt1; // UART1_RxD
211
        GPIO_Init(GPIO3, &GPIO_InitStructure);
214
        GPIO_Init(GPIO3, &GPIO_InitStructure);
212
 
215
 
213
        /*Configure UART1_Tx pin GPIO3.3*/
216
        /*Configure UART1_Tx pin GPIO3.3*/
214
        GPIO_StructInit(&GPIO_InitStructure);
217
        GPIO_StructInit(&GPIO_InitStructure);
215
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinOutput;
218
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinOutput;
216
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_3;
219
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_3;
217
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
220
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
218
        GPIO_InitStructure.GPIO_Alternate =     GPIO_OutputAlt2; // UART1_TX
221
        GPIO_InitStructure.GPIO_Alternate =     GPIO_OutputAlt2; // UART1_TX
219
        GPIO_Init(GPIO3, &GPIO_InitStructure);
222
        GPIO_Init(GPIO3, &GPIO_InitStructure);
220
 
223
 
221
        /* UART1 configured as follow:
224
        /* UART1 configured as follow:
222
        - Word Length = 8 Bits
225
        - Word Length = 8 Bits
223
        - One Stop Bit
226
        - One Stop Bit
224
        - No parity
227
        - No parity
225
        - BaudRate = 57600 baud
228
        - BaudRate = 57600 baud
226
        - Hardware flow control Disabled
229
        - Hardware flow control Disabled
227
        - Receive and transmit enabled
230
        - Receive and transmit enabled
228
        - Receive and transmit FIFOs are Disabled
231
        - Receive and transmit FIFOs are Disabled
229
        */
232
        */
230
        UART_StructInit(&UART_InitStructure);
233
        UART_StructInit(&UART_InitStructure);
231
        UART_InitStructure.UART_WordLength =                    UART_WordLength_8D;
234
        UART_InitStructure.UART_WordLength =                    UART_WordLength_8D;
232
        UART_InitStructure.UART_StopBits =                              UART_StopBits_1;
235
        UART_InitStructure.UART_StopBits =                              UART_StopBits_1;
233
        UART_InitStructure.UART_Parity =                                UART_Parity_No ;
236
        UART_InitStructure.UART_Parity =                                UART_Parity_No ;
234
        UART_InitStructure.UART_BaudRate =                              UART1_BAUD_RATE;
237
        UART_InitStructure.UART_BaudRate =                              UART1_BAUD_RATE;
235
        UART_InitStructure. UART_HardwareFlowControl =  UART_HardwareFlowControl_None;
238
        UART_InitStructure. UART_HardwareFlowControl =  UART_HardwareFlowControl_None;
236
        UART_InitStructure.UART_Mode =                                  UART_Mode_Tx_Rx;
239
        UART_InitStructure.UART_Mode =                                  UART_Mode_Tx_Rx;
237
        UART_InitStructure.UART_FIFO =                                  UART_FIFO_Enable;
240
        UART_InitStructure.UART_FIFO =                                  UART_FIFO_Enable;
238
        UART_InitStructure.UART_TxFIFOLevel =                   UART_FIFOLevel_1_2;
241
        UART_InitStructure.UART_TxFIFOLevel =                   UART_FIFOLevel_1_2;
239
        UART_InitStructure.UART_RxFIFOLevel =                   UART_FIFOLevel_1_2;
242
        UART_InitStructure.UART_RxFIFOLevel =                   UART_FIFOLevel_1_2;
240
 
243
 
241
        UART_DeInit(UART1); // reset uart 1     to default
244
        UART_DeInit(UART1); // reset uart 1     to default
242
        UART_Init(UART1, &UART_InitStructure); // initialize uart 1
245
        UART_Init(UART1, &UART_InitStructure); // initialize uart 1
243
        // enable uart 1 interrupts selective
246
        // enable uart 1 interrupts selective
244
        UART_ITConfig(UART1, UART_IT_Receive | UART_IT_ReceiveTimeOut, ENABLE);
247
        UART_ITConfig(UART1, UART_IT_Receive | UART_IT_ReceiveTimeOut, ENABLE);
245
        UART_Cmd(UART1, ENABLE); // enable uart 1
248
        UART_Cmd(UART1, ENABLE); // enable uart 1
246
        // configure the uart 1 interupt line
249
        // configure the uart 1 interupt line
247
        VIC_Config(UART1_ITLine, VIC_IRQ, PRIORITY_UART1);
250
        VIC_Config(UART1_ITLine, VIC_IRQ, PRIORITY_UART1);
248
        // enable the uart 1 IRQ
251
        // enable the uart 1 IRQ
249
        VIC_ITCmd(UART1_ITLine, ENABLE);
252
        VIC_ITCmd(UART1_ITLine, ENABLE);
250
 
253
 
251
        // initialize the debug timer
254
        // initialize the debug timer
252
        UART1_DebugData_Timer = SetDelay(UART1_DebugData_Interval);
255
        UART1_DebugData_Timer = SetDelay(UART1_DebugData_Interval);
253
        UART1_NaviData_Timer = SetDelay(UART1_NaviData_Interval)+500;
256
        UART1_NaviData_Timer = SetDelay(UART1_NaviData_Interval)+500;
254
 
257
 
255
        // Fill Version Info Structure
258
        // Fill Version Info Structure
256
        UART_VersionInfo.SWMajor = VERSION_MAJOR;
259
        UART_VersionInfo.SWMajor = VERSION_MAJOR;
257
        UART_VersionInfo.SWMinor = VERSION_MINOR;
260
        UART_VersionInfo.SWMinor = VERSION_MINOR;
258
        UART_VersionInfo.SWPatch = VERSION_PATCH;
261
        UART_VersionInfo.SWPatch = VERSION_PATCH;
259
        UART_VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR;
262
        UART_VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR;
260
        UART_VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR;
263
        UART_VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR;
261
 
264
 
262
        NaviData.Version = NAVIDATA_VERSION;
265
        NaviData.Version = NAVIDATA_VERSION;
263
 
266
 
264
        UART1_PutString("\r\n UART1 init...ok");
267
        UART1_PutString("\r\n UART1 init...ok");
265
}
268
}
266
 
269
 
267
 
270
 
268
/****************************************************************/
271
/****************************************************************/
269
/*               USART1 receiver ISR                            */
272
/*               USART1 receiver ISR                            */
270
/****************************************************************/
273
/****************************************************************/
271
void UART1_IRQHandler(void)
274
void UART1_IRQHandler(void)
272
{
275
{
273
        static u8 abortState = 0;
276
        static u8 abortState = 0;
274
        u8 c;
277
        u8 c;
275
 
278
 
276
        IENABLE;
279
        IENABLE;
277
 
280
 
278
        if((UART_GetITStatus(UART1, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART1, UART_IT_ReceiveTimeOut) != RESET) )
281
        if((UART_GetITStatus(UART1, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART1, UART_IT_ReceiveTimeOut) != RESET) )
279
        {
282
        {
280
                // clear the pending bits!
283
                // clear the pending bits!
281
                UART_ClearITPendingBit(UART1, UART_IT_Receive);
284
                UART_ClearITPendingBit(UART1, UART_IT_Receive);
282
                UART_ClearITPendingBit(UART1, UART_IT_ReceiveTimeOut);
285
                UART_ClearITPendingBit(UART1, UART_IT_ReceiveTimeOut);
283
                // if debug UART is not UART1
286
                // if debug UART is not UART1
284
                if (DebugUART != UART1)
287
                if (DebugUART != UART1)
285
                {       // forward received data to the debug UART tx buffer
288
                {       // forward received data to the debug UART tx buffer
286
                        while(UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
289
                        while(UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
287
                        {
290
                        {
288
                                // move the byte from the rx buffer of UART1 to the tx buffer of DebugUART
291
                                // move the byte from the rx buffer of UART1 to the tx buffer of DebugUART
289
                                c = UART_ReceiveData(UART1);
292
                                c = UART_ReceiveData(UART1);
290
 
293
 
291
                                // check for abort condition (ESC ESC 0x55 0xAA 0x00)
294
                                // check for abort condition (ESC ESC 0x55 0xAA 0x00)
292
                                switch (abortState)
295
                                switch (abortState)
293
                                {
296
                                {
294
                                        case 0:
297
                                        case 0:
295
                                                if (c == 27) abortState++;
298
                                                if (c == 27) abortState++;
296
                                                break;
299
                                                break;
297
                                        case 1:
300
                                        case 1:
298
                                                if (c == 27) abortState++;
301
                                                if (c == 27) abortState++;
299
                                                else abortState = 0;
302
                                                else abortState = 0;
300
                                        break;
303
                                        break;
301
                                        case 2:
304
                                        case 2:
302
                                                if (c == 0x55) abortState++;
305
                                                if (c == 0x55) abortState++;
303
                                                else abortState = 0;
306
                                                else abortState = 0;
304
                                                break;
307
                                                break;
305
                                        case 3:
308
                                        case 3:
306
                                                if (c == 0xAA) abortState++;
309
                                                if (c == 0xAA) abortState++;
307
                                                else abortState = 0;
310
                                                else abortState = 0;
308
                                                break;
311
                                                break;
309
                                        case 4:
312
                                        case 4:
310
                                                if (c == 0x00)
313
                                                if (c == 0x00)
311
                                                {
314
                                                {
312
                                                        if(DebugUART == UART0)
315
                                                        if(DebugUART == UART0)
313
                                                        {
316
                                                        {
314
                                                                UART0_Connect_to_MKGPS(UART0_BAUD_RATE);
317
                                                                UART0_Connect_to_MKGPS(UART0_BAUD_RATE);
315
                                                                TIMER2_Init(); // enbable servo outputs
318
                                                                TIMER2_Init(); // enbable servo outputs
316
                                                                fifo_purge(&UART1_rx_fifo); // flush the whole fifo init buffer
319
                                                                fifo_purge(&UART1_rx_fifo); // flush the whole fifo init buffer
317
                                                        }
320
                                                        }
318
                                                        DebugUART = UART1;
321
                                                        DebugUART = UART1;
319
                                                }
322
                                                }
320
                                                abortState = 0;
323
                                                abortState = 0;
321
                                                break;
324
                                                break;
322
                                } // end switch abort state
325
                                } // end switch abort state
323
                                // if the Debug uart is not UART1, redirect input to the Debug UART
326
                                // if the Debug uart is not UART1, redirect input to the Debug UART
324
                                if (DebugUART != UART1)
327
                                if (DebugUART != UART1)
325
                                {
328
                                {
326
                                        // wait for space in the tx buffer of the DebugUART
329
                                        // wait for space in the tx buffer of the DebugUART
327
                                        while(UART_GetFlagStatus(DebugUART, UART_FLAG_TxFIFOFull) == SET) {};
330
                                        while(UART_GetFlagStatus(DebugUART, UART_FLAG_TxFIFOFull) == SET) {};
328
                                        // move byte to the tx fifo of the debug uart
331
                                        // move byte to the tx fifo of the debug uart
329
                                        UART_SendData(DebugUART, c);
332
                                        UART_SendData(DebugUART, c);
330
                                }
333
                                }
331
                        }
334
                        }
332
                }
335
                }
333
                else  // DebugUART == UART1 (normal operation)
336
                else  // DebugUART == UART1 (normal operation)
334
                {
337
                {
335
                        while(UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
338
                        while(UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
336
                        { // some byes in the hardware fifo
339
                        { // some byes in the hardware fifo
337
                            // get byte from hardware fifo
340
                            // get byte from hardware fifo
338
                        c = UART_ReceiveData(UART1);
341
                        c = UART_ReceiveData(UART1);
339
                                // put into the software fifo
342
                                // put into the software fifo
340
                                if(!fifo_put(&UART1_rx_fifo, c))
343
                                if(!fifo_put(&UART1_rx_fifo, c))
341
                                {       // fifo overflow
344
                                {       // fifo overflow
342
                                        //fifo_purge(&UART1_rx_fifo); // flush the whole buffer
345
                                        //fifo_purge(&UART1_rx_fifo); // flush the whole buffer
343
                                }
346
                                }
344
                        } // EOF while some byes in the hardware fifo
347
                        } // EOF while some byes in the hardware fifo
345
                } // eof DebugUart = UART1
348
                } // eof DebugUart = UART1
346
        }
349
        }
347
 
350
 
348
        IDISABLE;
351
        IDISABLE;
349
}
352
}
350
 
353
 
351
/**************************************************************/
354
/**************************************************************/
352
/* Process incomming data from debug uart                     */
355
/* Process incomming data from debug uart                     */
353
/**************************************************************/
356
/**************************************************************/
354
void UART1_ProcessRxData(void)
357
void UART1_ProcessRxData(void)
355
{
358
{
356
        // return on forwarding uart  or unlocked rx buffer
359
        // return on forwarding uart  or unlocked rx buffer
357
        if(DebugUART != UART1) return;
360
        if(DebugUART != UART1) return;
358
 
361
 
359
        u8 c;
362
        u8 c;
360
        // if rx buffer is not locked
363
        // if rx buffer is not locked
361
        if(UART1_rx_buffer.Locked == FALSE)
364
        if(UART1_rx_buffer.Locked == FALSE)
362
        {
365
        {
363
                //collect data from primary rx fifo
366
                //collect data from primary rx fifo
364
                while(fifo_get(&UART1_rx_fifo, &c))
367
                while(fifo_get(&UART1_rx_fifo, &c))
365
                {
368
                {
366
                        // break if complete frame is collected
369
                        // break if complete frame is collected
367
                        if(MKProtocol_CollectSerialFrame(&UART1_rx_buffer, c)) break;
370
                        if(MKProtocol_CollectSerialFrame(&UART1_rx_buffer, c)) break;
368
                }
371
                }
369
        }
372
        }
370
        if(UART1_rx_buffer.Locked == FALSE) return;
373
        if(UART1_rx_buffer.Locked == FALSE) return;
371
 
374
 
372
        Point_t * pPoint = NULL;
375
        Point_t * pPoint = NULL;
373
        SerialMsg_t SerialMsg;
376
        SerialMsg_t SerialMsg;
374
 
377
 
375
        // analyze header first
378
        // analyze header first
376
        MKProtocol_DecodeSerialFrameHeader(&UART1_rx_buffer, &SerialMsg);
379
        MKProtocol_DecodeSerialFrameHeader(&UART1_rx_buffer, &SerialMsg);
377
        if( SerialMsg.Address == FC_ADDRESS )
380
        if( SerialMsg.Address == FC_ADDRESS )
378
        {
381
        {
379
                switch(SerialMsg.CmdID)
382
                switch(SerialMsg.CmdID)
380
                {
383
                {
381
//                      case 'v': // version
384
//                      case 'v': // version
382
                        case 'y': // serial poti values
385
                        case 'y': // serial poti values
383
                        case 'b': // extern control
386
                        case 'b': // extern control
384
                                Buffer_Copy(&UART1_rx_buffer, &UART2_tx_buffer); //forward to FC
387
                                Buffer_Copy(&UART1_rx_buffer, &UART2_tx_buffer); //forward to FC
385
                                Buffer_Clear(&UART1_rx_buffer); // free rc buffer for next frame
388
                                Buffer_Clear(&UART1_rx_buffer); // free rc buffer for next frame
386
                                return; //end process rx data
389
                                return; //end process rx data
387
                        break;
390
                        break;
388
                }
391
                }
389
        }
392
        }
390
 
393
 
391
        MKProtocol_DecodeSerialFrameData(&UART1_rx_buffer, &SerialMsg); // decode serial frame in rxd buffer
394
        MKProtocol_DecodeSerialFrameData(&UART1_rx_buffer, &SerialMsg); // decode serial frame in rxd buffer
392
    if(SerialMsg.CmdID != 'z') SerialLinkOkay = 250;      // reset SerialTimeout, but not in case of the "ping"
395
    if(SerialMsg.CmdID != 'z') SerialLinkOkay = 250;      // reset SerialTimeout, but not in case of the "ping"
393
        switch(SerialMsg.Address) // check for Slave Address
396
        switch(SerialMsg.Address) // check for Slave Address
394
        {
397
        {
395
                case NC_ADDRESS:  // own Slave Address
398
                case NC_ADDRESS:  // own Slave Address
396
                switch(SerialMsg.CmdID)
399
                switch(SerialMsg.CmdID)
397
                {
400
                {
-
 
401
                       
-
 
402
                        case 'f': // ftp command
-
 
403
                                UART1_Request_FTP = SerialMsg.pData[0];
-
 
404
 
-
 
405
                                //if (UART1_Request_FTP == FTP_CMD_SET_CWD || UART1_Request_FTP == FTP_CMD_GET_FILE) 
-
 
406
                                memcpy(&FTP_data, &SerialMsg.pData[1], sizeof(FTP_data)); // copy ftp parameter
-
 
407
                        break;
-
 
408
 
398
                        case 'z': // connection checker
409
                        case 'z': // connection checker
399
                                memcpy(&Echo, SerialMsg.pData, sizeof(Echo)); // copy echo pattern
410
                                memcpy(&Echo, SerialMsg.pData, sizeof(Echo)); // copy echo pattern
400
                                UART1_Request_Echo = TRUE;
411
                                UART1_Request_Echo = TRUE;
401
                                break;
412
                                break;
402
 
413
 
403
                        case 'e': // request for the text of the error status
414
                        case 'e': // request for the text of the error status
404
                                UART1_Request_ErrorMessage = TRUE;
415
                                UART1_Request_ErrorMessage = TRUE;
405
                                break;
416
                                break;
406
 
417
 
407
                        case 's'://  new target position
418
                        case 's'://  new target position
408
                                pPoint = (Point_t*)SerialMsg.pData;
419
                                pPoint = (Point_t*)SerialMsg.pData;
409
                                if(pPoint->Position.Status == NEWDATA)
420
                                if(pPoint->Position.Status == NEWDATA)
410
                                {
421
                                {
411
                                        //if(!(FC.StatusFlags & FC_STATUS_FLY)) PointList_Clear(); // flush the list
422
                                        //if(!(FC.StatusFlags & FC_STATUS_FLY)) PointList_Clear(); // flush the list
412
                                        //pPoint->Index = 1; // must be one after empty list
423
                                        //pPoint->Index = 1; // must be one after empty list
413
                                        PointList_SetAt(pPoint);
424
                                        PointList_SetAt(pPoint);
414
                                        if(FC.StatusFlags & FC_STATUS_FLY) PointList_WPActive(TRUE);
425
                                        if(FC.StatusFlags & FC_STATUS_FLY) PointList_WPActive(TRUE);
415
                                        GPS_pWaypoint = PointList_WPBegin(); // updates POI index
426
                                        GPS_pWaypoint = PointList_WPBegin(); // updates POI index
416
                                        if(GPS_pWaypoint != NULL) // if new WP exist
427
                                        if(GPS_pWaypoint != NULL) // if new WP exist
417
                                        {   // update WP hold time stamp immediately!
428
                                        {   // update WP hold time stamp immediately!
418
/*                                              if(GPS_pWaypoint->Heading > 0 && GPS_pWaypoint->Heading <= 360)
429
/*                                              if(GPS_pWaypoint->Heading > 0 && GPS_pWaypoint->Heading <= 360)
419
                                                {
430
                                                {
420
                                                 CAM_Orientation.Azimuth = GPS_pWaypoint->Heading;
431
                                                 CAM_Orientation.Azimuth = GPS_pWaypoint->Heading;
421
                                                 CAM_Orientation.UpdateMask |= CAM_UPDATE_AZIMUTH;
432
                                                 CAM_Orientation.UpdateMask |= CAM_UPDATE_AZIMUTH;
422
                                                }
433
                                                }
423
*/
434
*/
424
                                        }
435
                                        }
425
                                        BeepTime = 50;
436
                                        BeepTime = 50;
426
                                }
437
                                }
427
                                break;
438
                                break;
428
 
439
 
429
                        case 'u': // redirect debug uart
440
                        case 'u': // redirect debug uart
430
                                switch(SerialMsg.pData[0])
441
                                switch(SerialMsg.pData[0])
431
                                {
442
                                {
432
                                        case UART_FLIGHTCTRL:
443
                                        case UART_FLIGHTCTRL:
433
                                                UART2_Init();                           // initialize UART2 to FC pins
444
                                                UART2_Init();                           // initialize UART2 to FC pins
434
                                                fifo_purge(&UART1_rx_fifo);
445
                                                fifo_purge(&UART1_rx_fifo);
435
                                                TIMER2_Deinit();                        // reduce irq load
446
                                                TIMER2_Deinit();                        // reduce irq load
436
                                                DebugUART = UART2;
447
                                                DebugUART = UART2;
437
                                                break;
448
                                                break;
438
                                        case UART_MK3MAG:
449
                                        case UART_MK3MAG:
439
                                                if(FC.StatusFlags & FC_STATUS_MOTOR_RUN) break; // not if the motors are running
450
                                                if(FC.StatusFlags & FC_STATUS_MOTOR_RUN) break; // not if the motors are running
440
                                                UART0_Connect_to_MK3MAG();      // mux UART0 to MK3MAG pins
451
                                                UART0_Connect_to_MK3MAG();      // mux UART0 to MK3MAG pins
441
                                                GPSData.Status = INVALID;
452
                                                GPSData.Status = INVALID;
442
                                                fifo_purge(&UART1_rx_fifo);
453
                                                fifo_purge(&UART1_rx_fifo);
443
                                                DebugUART = UART0;
454
                                                DebugUART = UART0;
444
                                                break;
455
                                                break;
445
                                        case UART_MKGPS:
456
                                        case UART_MKGPS:
446
                                                if(FC.StatusFlags & FC_STATUS_MOTOR_RUN) break; // not if the motors are running
457
                                                if(FC.StatusFlags & FC_STATUS_MOTOR_RUN) break; // not if the motors are running
447
                                                TIMER2_Deinit();                        // disable servo outputs to reduce irq load
458
                                                TIMER2_Deinit();                        // disable servo outputs to reduce irq load
448
                                                UART0_Connect_to_MKGPS(UART0_BAUD_RATE);        // connect UART0 to MKGPS pins
459
                                                UART0_Connect_to_MKGPS(UART0_BAUD_RATE);        // connect UART0 to MKGPS pins
449
                                                GPSData.Status = INVALID;
460
                                                GPSData.Status = INVALID;
450
                                                fifo_purge(&UART1_rx_fifo);
461
                                                fifo_purge(&UART1_rx_fifo);
451
                                                DebugUART = UART0;
462
                                                DebugUART = UART0;
452
                                                break;
463
                                                break;
453
                                        default:
464
                                        default:
454
                                                break;
465
                                                break;
455
                                }
466
                                }
456
                                break;
467
                                break;
457
 
468
 
458
                        case 'w'://  Set point in list at index
469
                        case 'w'://  Set point in list at index
459
                                {
470
                                {
460
                                        pPoint = (Point_t*)SerialMsg.pData;
471
                                        pPoint = (Point_t*)SerialMsg.pData;
461
 
472
 
462
                                        if((pPoint->Position.Status == INVALID) && (pPoint->Index == 0))
473
                                        if((pPoint->Position.Status == INVALID) && (pPoint->Index == 0))
463
                                        {
474
                                        {
464
                                                PointList_Clear();
475
                                                PointList_Clear();
465
                                                GPS_pWaypoint = PointList_WPBegin();
476
                                                GPS_pWaypoint = PointList_WPBegin();
466
                                                UART1_Request_WritePoint = 0; // return new point count
477
                                                UART1_Request_WritePoint = 0; // return new point count
467
                                        }
478
                                        }
468
                                        else
479
                                        else
469
                                        {  // update WP in list at index
480
                                        {  // update WP in list at index
470
                                                UART1_Request_WritePoint = PointList_SetAt(pPoint);
481
                                                UART1_Request_WritePoint = PointList_SetAt(pPoint);
471
                                                if(FC.StatusFlags & FC_STATUS_FLY) PointList_WPActive(TRUE);
482
                                                if(FC.StatusFlags & FC_STATUS_FLY) PointList_WPActive(TRUE);
472
                                                if(UART1_Request_WritePoint == pPoint->Index)
483
                                                if(UART1_Request_WritePoint == pPoint->Index)
473
                                                {
484
                                                {
474
                                                        BeepTime = 500;
485
                                                        BeepTime = 500;
475
                                                }
486
                                                }
476
                                        }
487
                                        }
477
                                }
488
                                }
478
                                break;
489
                                break;
479
 
490
 
480
                        case 'x'://  Read Waypoint from List
491
                        case 'x'://  Read Waypoint from List
481
                                UART1_Request_ReadPoint = SerialMsg.pData[0];
492
                                UART1_Request_ReadPoint = SerialMsg.pData[0];
482
                                break;
493
                                break;
483
 
494
 
484
                        case 'j':// Set/Get NC-Parameter
495
                        case 'j':// Set/Get NC-Parameter
485
                                switch(SerialMsg.pData[0])
496
                                switch(SerialMsg.pData[0])
486
                                {
497
                                {
487
                                        case 0: // get
498
                                        case 0: // get
488
                                        break;
499
                                        break;
489
 
500
 
490
                                        case 1: // set
501
                                        case 1: // set
491
                                        {
502
                                        {
492
                                                s16 value;
503
                                                s16 value;
493
                                                value = SerialMsg.pData[2] + (s16)SerialMsg.pData[3] * 0x0100;
504
                                                value = SerialMsg.pData[2] + (s16)SerialMsg.pData[3] * 0x0100;
494
                                                NCParams_SetValue(SerialMsg.pData[1], &value);
505
                                                NCParams_SetValue(SerialMsg.pData[1], &value);
495
                                        }
506
                                        }
496
                                        break;
507
                                        break;
497
 
508
 
498
                                        default:
509
                                        default:
499
                                        break;
510
                                        break;
500
                                }
511
                                }
501
                                UART1_Request_ParameterId = SerialMsg.pData[1];
512
                                UART1_Request_ParameterId = SerialMsg.pData[1];
502
                                UART1_Request_Parameter = TRUE;
513
                                UART1_Request_Parameter = TRUE;
503
                                break;
514
                                break;
504
                        default:
515
                        default:
505
                                // unsupported command recieved
516
                                // unsupported command recieved
506
                                break;
517
                                break;
507
                } // case NC_ADDRESS
518
                } // case NC_ADDRESS
508
                // "break;" is missing here to fall thru to the common commands
519
                // "break;" is missing here to fall thru to the common commands
509
 
520
 
510
                default:  // and any other Slave Address
521
                default:  // and any other Slave Address
511
 
522
 
512
                switch(SerialMsg.CmdID) // check CmdID
523
                switch(SerialMsg.CmdID) // check CmdID
513
                {
524
                {
514
                        case 'a':// request for the labels of the analog debug outputs
525
                        case 'a':// request for the labels of the analog debug outputs
515
                                UART1_Request_DebugLabel = SerialMsg.pData[0];
526
                                UART1_Request_DebugLabel = SerialMsg.pData[0];
516
                                if(UART1_Request_DebugLabel > 31) UART1_Request_DebugLabel = 31;
527
                                if(UART1_Request_DebugLabel > 31) UART1_Request_DebugLabel = 31;
517
                                break;
528
                                break;
518
                        /*
529
                        /*
519
                        case 'b': // submit extern control
530
                        case 'b': // submit extern control
520
                                memcpy(&ExternControl, SerialMsg.pData, sizeof(ExternControl));
531
                                memcpy(&ExternControl, SerialMsg.pData, sizeof(ExternControl));
521
                                UART1_ConfirmFrame = ExternControl.Frame;
532
                                UART1_ConfirmFrame = ExternControl.Frame;
522
                                break;
533
                                break;
523
                        */
534
                        */
524
                        case 'd': // request for debug data;
535
                        case 'd': // request for debug data;
525
                                UART1_DebugData_Interval = (u32) SerialMsg.pData[0] * 10;
536
                                UART1_DebugData_Interval = (u32) SerialMsg.pData[0] * 10;
526
                                if(UART1_DebugData_Interval > 0) UART1_Request_DebugData = TRUE;
537
                                if(UART1_DebugData_Interval > 0) UART1_Request_DebugData = TRUE;
527
                                UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
538
                                UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
528
                                break;
539
                                break;
529
 
540
 
530
                        case 'c': // request for 3D data;
541
                        case 'c': // request for 3D data;
531
                                UART1_Data3D_Interval = (u32) SerialMsg.pData[0] * 10;
542
                                UART1_Data3D_Interval = (u32) SerialMsg.pData[0] * 10;
532
                                if(UART1_Data3D_Interval > 0) UART1_Request_Data3D = TRUE;
543
                                if(UART1_Data3D_Interval > 0) UART1_Request_Data3D = TRUE;
533
                                UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
544
                                UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
534
                                break;
545
                                break;
535
 
546
 
536
                        case 'h':// reqest for display line
547
                        case 'h':// reqest for display line
537
                                if((SerialMsg.pData[0]& 0x80) == 0x00)// old format
548
                                if((SerialMsg.pData[0]& 0x80) == 0x00)// old format
538
                                {
549
                                {
539
                                        UART1_DisplayLine = 2;
550
                                        UART1_DisplayLine = 2;
540
                                        UART1_Display_Interval = 0;
551
                                        UART1_Display_Interval = 0;
541
                                }
552
                                }
542
                                else
553
                                else
543
                                {
554
                                {
544
                                        UART1_DisplayKeys |= ~SerialMsg.pData[0];
555
                                        UART1_DisplayKeys |= ~SerialMsg.pData[0];
545
                                        UART1_Display_Interval = (u32) SerialMsg.pData[1] * 10;
556
                                        UART1_Display_Interval = (u32) SerialMsg.pData[1] * 10;
546
                                        UART1_DisplayLine = 4;
557
                                        UART1_DisplayLine = 4;
547
                                        UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
558
                                        UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
548
                                }
559
                                }
549
                                UART1_Request_Display = TRUE;
560
                                UART1_Request_Display = TRUE;
550
                                break;
561
                                break;
551
 
562
 
552
                        case 'l':// reqest for display columns
563
                        case 'l':// reqest for display columns
553
                                MenuItem = SerialMsg.pData[0];
564
                                MenuItem = SerialMsg.pData[0];
554
                                UART1_Request_Display1 = TRUE;
565
                                UART1_Request_Display1 = TRUE;
555
                                break;
566
                                break;
556
 
567
 
557
                        case 'o': // request for navigation information
568
                        case 'o': // request for navigation information
558
                                UART1_NaviData_Interval = (u32) SerialMsg.pData[0] * 10;
569
                                UART1_NaviData_Interval = (u32) SerialMsg.pData[0] * 10;
559
                                if(UART1_NaviData_Interval > 0) UART1_Request_NaviData = TRUE;
570
                                if(UART1_NaviData_Interval > 0) UART1_Request_NaviData = TRUE;
560
                                UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
571
                                UART1_AboTimeOut = SetDelay(ABO_TIMEOUT);
561
                                break;
572
                                break;
562
 
573
 
563
                        case 'v': // request for version info
574
                        case 'v': // request for version info
564
                                UART1_Request_VersionInfo = TRUE;
575
                                UART1_Request_VersionInfo = TRUE;
565
                                break;
576
                                break;
566
                        default:
577
                        default:
567
                                // unsupported command recieved
578
                                // unsupported command recieved
568
                                break;
579
                                break;
569
                }
580
                }
570
                break; // default:
581
                break; // default:
571
        }
582
        }
572
        Buffer_Clear(&UART1_rx_buffer); // free rc buffer for next frame
583
        Buffer_Clear(&UART1_rx_buffer); // free rc buffer for next frame
573
}
584
}
574
 
585
 
575
 
586
 
576
/*****************************************************/
587
/*****************************************************/
577
/*                   Send a character                */
588
/*                   Send a character                */
578
/*****************************************************/
589
/*****************************************************/
579
s16 UART1_Putchar(char c)
590
s16 UART1_Putchar(char c)
580
{
591
{
581
        if (c == '\n') UART1_Putchar('\r');
592
        if (c == '\n') UART1_Putchar('\r');
582
        // wait until txd fifo is not full
593
        // wait until txd fifo is not full
583
        while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
594
        while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
584
        // transmit byte
595
        // transmit byte
585
        UART_SendData(UART1, c);
596
        UART_SendData(UART1, c);
586
        #ifdef FOLLOW_ME
597
        #ifdef FOLLOW_ME
587
        if(TransmitAlsoToFC) UART_SendData(UART2, c);
598
        if(TransmitAlsoToFC) UART_SendData(UART2, c);
588
        #endif
599
        #endif
589
        return (0);
600
        return (0);
590
}
601
}
591
 
602
 
592
/*****************************************************/
603
/*****************************************************/
593
/*       Send a string to the debug uart              */
604
/*       Send a string to the debug uart              */
594
/*****************************************************/
605
/*****************************************************/
595
void UART1_PutString(u8 *s)
606
void UART1_PutString(u8 *s)
596
{
607
{
597
        if(s == NULL) return;
608
        if(s == NULL) return;
598
        while (*s != '\0' && DebugUART == UART1)
609
        while (*s != '\0' && DebugUART == UART1)
599
        {
610
        {
600
                UART1_Putchar(*s);
611
                UART1_Putchar(*s);
601
                s ++;
612
                s ++;
602
        }
613
        }
603
}
614
}
604
 
615
 
605
 
616
 
606
/**************************************************************/
617
/**************************************************************/
607
/*         Transmit tx buffer via debug uart                  */
618
/*         Transmit tx buffer via debug uart                  */
608
/**************************************************************/
619
/**************************************************************/
609
void UART1_Transmit(void)
620
void UART1_Transmit(void)
610
{
621
{
611
        u8 tmp_tx;
622
        u8 tmp_tx;
612
        if(DebugUART != UART1) return;
623
        if(DebugUART != UART1) return;
613
        // if something has to be send and the txd fifo is not full
624
        // if something has to be send and the txd fifo is not full
614
        if(UART1_tx_buffer.Locked == TRUE)
625
        if(UART1_tx_buffer.Locked == TRUE)
615
        {
626
        {
616
                // while there is some space in the tx fifo
627
                // while there is some space in the tx fifo
617
                while(UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != SET)
628
                while(UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != SET)
618
                {
629
                {
619
                        tmp_tx = UART1_tx_buffer.pData[UART1_tx_buffer.Position++]; // read next byte from txd buffer
630
                        tmp_tx = UART1_tx_buffer.pData[UART1_tx_buffer.Position++]; // read next byte from txd buffer
620
                        UART_SendData(UART1, tmp_tx); // put character to txd fifo
631
                        UART_SendData(UART1, tmp_tx); // put character to txd fifo
621
                        #ifdef FOLLOW_ME
632
                        #ifdef FOLLOW_ME
622
                        if(TransmitAlsoToFC)
633
                        if(TransmitAlsoToFC)
623
                        {
634
                        {
624
                                UART_SendData(UART2, tmp_tx); // put character to txd fifo
635
                                UART_SendData(UART2, tmp_tx); // put character to txd fifo
625
                        }
636
                        }
626
                        #endif
637
                        #endif
627
                        // if terminating character or end of txd buffer reached
638
                        // if terminating character or end of txd buffer reached
628
                        if((tmp_tx == '\r') || (UART1_tx_buffer.Position == UART1_tx_buffer.DataBytes))
639
                        if((tmp_tx == '\r') || (UART1_tx_buffer.Position == UART1_tx_buffer.DataBytes))
629
                        {
640
                        {
630
                                Buffer_Clear(&UART1_tx_buffer); // clear txd buffer
641
                                Buffer_Clear(&UART1_tx_buffer); // clear txd buffer
631
                                #ifdef FOLLOW_ME
642
                                #ifdef FOLLOW_ME
632
                                TransmitAlsoToFC = 0;
643
                                TransmitAlsoToFC = 0;
633
                                #endif
644
                                #endif
634
                                break; // end while loop
645
                                break; // end while loop
635
                        }
646
                        }
636
                }
647
                }
637
        }
648
        }
638
}
649
}
639
 
650
 
640
/**************************************************************/
651
/**************************************************************/
641
/* Send the answers to incomming commands at the debug uart   */
652
/* Send the answers to incomming commands at the debug uart   */
642
/**************************************************************/
653
/**************************************************************/
643
void UART1_TransmitTxData(void)
654
void UART1_TransmitTxData(void)
644
{
655
{
645
        if(DebugUART != UART1) return;
656
        if(DebugUART != UART1) return;
646
 
657
 
647
        if(CheckDelay(UART1_AboTimeOut))
658
        if(CheckDelay(UART1_AboTimeOut))
648
        {
659
        {
649
                UART1_DebugData_Interval = 0;
660
                UART1_DebugData_Interval = 0;
650
                UART1_NaviData_Interval = 0;
661
                UART1_NaviData_Interval = 0;
651
                UART1_Data3D_Interval = 0;
662
                UART1_Data3D_Interval = 0;
652
                UART1_Display_Interval = 0;
663
                UART1_Display_Interval = 0;
653
        }
664
        }
654
 
665
 
655
        UART1_Transmit(); // output pending bytes in tx buffer
666
        UART1_Transmit(); // output pending bytes in tx buffer
656
        if((UART1_tx_buffer.Locked == TRUE)) return;
667
        if((UART1_tx_buffer.Locked == TRUE)) return;
657
 
668
 
658
        if(UART1_Request_Parameter && (UART1_tx_buffer.Locked == FALSE))
669
        if(UART1_Request_Parameter && (UART1_tx_buffer.Locked == FALSE))
659
        {
670
        {
660
                s16 ParamValue;
671
                s16 ParamValue;
661
                NCParams_GetValue(UART1_Request_ParameterId, &ParamValue);
672
                NCParams_GetValue(UART1_Request_ParameterId, &ParamValue);
662
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'J', NC_ADDRESS, 2, &UART1_Request_ParameterId, sizeof(UART1_Request_ParameterId), &ParamValue, sizeof(ParamValue)); // answer the param request
673
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'J', NC_ADDRESS, 2, &UART1_Request_ParameterId, sizeof(UART1_Request_ParameterId), &ParamValue, sizeof(ParamValue)); // answer the param request
663
                UART1_Request_Parameter = FALSE;
674
                UART1_Request_Parameter = FALSE;
664
        }
675
        }
665
        else if(UART1_Request_Echo && (UART1_tx_buffer.Locked == FALSE))
676
        else if(UART1_Request_Echo && (UART1_tx_buffer.Locked == FALSE))
666
        {
677
        {
667
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'Z', NC_ADDRESS, 1, &Echo, sizeof(Echo)); // answer the echo request
678
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'Z', NC_ADDRESS, 1, &Echo, sizeof(Echo)); // answer the echo request
668
                Echo = 0; // reset echo value
679
                Echo = 0; // reset echo value
669
                UART1_Request_Echo = FALSE;
680
                UART1_Request_Echo = FALSE;
670
        }
681
        }
-
 
682
        else if(UART1_Request_FTP && (UART1_tx_buffer.Locked == FALSE))
-
 
683
        {
-
 
684
                CheckFTPCommand(UART1_Request_FTP);
-
 
685
                UART1_Request_FTP = FALSE;
-
 
686
        }
671
        else if((UART1_Request_WritePoint!= 0xFF) && (UART1_tx_buffer.Locked == FALSE))
687
        else if((UART1_Request_WritePoint!= 0xFF) && (UART1_tx_buffer.Locked == FALSE))
672
        {
688
        {
673
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'W', NC_ADDRESS, 1, &UART1_Request_WritePoint, sizeof(UART1_Request_WritePoint));
689
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'W', NC_ADDRESS, 1, &UART1_Request_WritePoint, sizeof(UART1_Request_WritePoint));
674
                UART1_Request_WritePoint = 0xFF;
690
                UART1_Request_WritePoint = 0xFF;
675
        }
691
        }
676
        else if((UART1_Request_ReadPoint) && (UART1_tx_buffer.Locked == FALSE))
692
        else if((UART1_Request_ReadPoint) && (UART1_tx_buffer.Locked == FALSE))
677
        {
693
        {
678
                u8 PointCount = PointList_GetCount();
694
                u8 PointCount = PointList_GetCount();
679
                if (UART1_Request_ReadPoint <= PointCount)
695
                if (UART1_Request_ReadPoint <= PointCount)
680
                {
696
                {
681
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'X', NC_ADDRESS, 3, &PointCount, 1, &UART1_Request_ReadPoint, 1, PointList_GetAt(UART1_Request_ReadPoint), sizeof(Point_t));
697
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'X', NC_ADDRESS, 3, &PointCount, 1, &UART1_Request_ReadPoint, 1, PointList_GetAt(UART1_Request_ReadPoint), sizeof(Point_t));
682
                }
698
                }
683
                else
699
                else
684
                {
700
                {
685
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer,'X', NC_ADDRESS, 1, &PointCount, sizeof(PointCount));
701
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer,'X', NC_ADDRESS, 1, &PointCount, sizeof(PointCount));
686
                }
702
                }
687
                UART1_Request_ReadPoint = 0;
703
                UART1_Request_ReadPoint = 0;
688
        }
704
        }
689
        else if((UART1_Request_DebugLabel != 0xFF) && (UART1_tx_buffer.Locked == FALSE))
705
        else if((UART1_Request_DebugLabel != 0xFF) && (UART1_tx_buffer.Locked == FALSE))
690
        {
706
        {
691
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'A', NC_ADDRESS, 2, &UART1_Request_DebugLabel, sizeof(UART1_Request_DebugLabel), (u8 *) ANALOG_LABEL[UART1_Request_DebugLabel], 16);
707
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'A', NC_ADDRESS, 2, &UART1_Request_DebugLabel, sizeof(UART1_Request_DebugLabel), (u8 *) ANALOG_LABEL[UART1_Request_DebugLabel], 16);
692
                UART1_Request_DebugLabel = 0xFF;
708
                UART1_Request_DebugLabel = 0xFF;
693
        }
709
        }
694
        else if(( ((UART1_NaviData_Interval > 0) && CheckDelay(UART1_NaviData_Timer) ) || UART1_Request_NaviData) && (UART1_tx_buffer.Locked == FALSE))
710
        else if(( ((UART1_NaviData_Interval > 0) && CheckDelay(UART1_NaviData_Timer) ) || UART1_Request_NaviData) && (UART1_tx_buffer.Locked == FALSE))
695
        {
711
        {
696
                NaviData.Errorcode = ErrorCode;
712
                NaviData.Errorcode = ErrorCode;
697
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));
713
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));
698
                UART1_NaviData_Timer = SetDelay(UART1_NaviData_Interval);
714
                UART1_NaviData_Timer = SetDelay(UART1_NaviData_Interval);
699
                UART1_Request_NaviData = FALSE;
715
                UART1_Request_NaviData = FALSE;
700
        }
716
        }
701
        else if( (( (UART1_DebugData_Interval > 0) && CheckDelay(UART1_DebugData_Timer)) || UART1_Request_DebugData) && (UART1_tx_buffer.Locked == FALSE))
717
        else if( (( (UART1_DebugData_Interval > 0) && CheckDelay(UART1_DebugData_Timer)) || UART1_Request_DebugData) && (UART1_tx_buffer.Locked == FALSE))
702
        {
718
        {
703
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'D', NC_ADDRESS, 1,(u8 *)&DebugOut, sizeof(DebugOut));
719
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'D', NC_ADDRESS, 1,(u8 *)&DebugOut, sizeof(DebugOut));
704
                UART1_DebugData_Timer = SetDelay(UART1_DebugData_Interval);
720
                UART1_DebugData_Timer = SetDelay(UART1_DebugData_Interval);
705
                UART1_Request_DebugData = FALSE;
721
                UART1_Request_DebugData = FALSE;
706
        }
722
        }
707
        else if((( (UART1_Data3D_Interval > 0) && CheckDelay(UART1_Data3D_Timer) ) || UART1_Request_Data3D) && (UART1_tx_buffer.Locked == FALSE))
723
        else if((( (UART1_Data3D_Interval > 0) && CheckDelay(UART1_Data3D_Timer) ) || UART1_Request_Data3D) && (UART1_tx_buffer.Locked == FALSE))
708
        {
724
        {
709
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'C', NC_ADDRESS, 1,(u8 *)&Data3D, sizeof(Data3D));
725
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'C', NC_ADDRESS, 1,(u8 *)&Data3D, sizeof(Data3D));
710
                UART1_Data3D_Timer = SetDelay(UART1_Data3D_Interval);
726
                UART1_Data3D_Timer = SetDelay(UART1_Data3D_Interval);
711
                UART1_Request_Data3D = FALSE;
727
                UART1_Request_Data3D = FALSE;
712
        }
728
        }
713
        /*
729
        /*
714
        else if(UART1_ConfirmFrame && (UART1_tx_buffer.Locked == FALSE))
730
        else if(UART1_ConfirmFrame && (UART1_tx_buffer.Locked == FALSE))
715
        {
731
        {
716
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'B', NC_ADDRESS, 1, &UART1_ConfirmFrame, sizeof(UART1_ConfirmFrame));
732
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'B', NC_ADDRESS, 1, &UART1_ConfirmFrame, sizeof(UART1_ConfirmFrame));
717
                UART1_ConfirmFrame = 0;
733
                UART1_ConfirmFrame = 0;
718
        }
734
        }
719
        */
735
        */
720
        /*
736
        /*
721
        else if(UART1_Request_ExternalControl && (UART1_tx_buffer.Locked == FALSE))
737
        else if(UART1_Request_ExternalControl && (UART1_tx_buffer.Locked == FALSE))
722
        {
738
        {
723
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'G', NC_ADDRESS, 1, (u8 *)&ExternControl, sizeof(ExternControl));
739
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'G', NC_ADDRESS, 1, (u8 *)&ExternControl, sizeof(ExternControl));
724
                UART1_Request_ExternalControl = FALSE;
740
                UART1_Request_ExternalControl = FALSE;
725
        }
741
        }
726
        */
742
        */
727
        else if( (( (UART1_Display_Interval > 0) && CheckDelay(UART1_Display_Timer)) || UART1_Request_Display) && (UART1_tx_buffer.Locked == FALSE))
743
        else if( (( (UART1_Display_Interval > 0) && CheckDelay(UART1_Display_Timer)) || UART1_Request_Display) && (UART1_tx_buffer.Locked == FALSE))
728
        {
744
        {
729
                if(UART1_DisplayLine > 3)
745
                if(UART1_DisplayLine > 3)
730
                {
746
                {
731
                        Menu_Update(UART1_DisplayKeys);
747
                        Menu_Update(UART1_DisplayKeys);
732
                        UART1_DisplayKeys = 0;
748
                        UART1_DisplayKeys = 0;
733
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'H', NC_ADDRESS, 1, (u8*)DisplayBuff, sizeof(DisplayBuff));
749
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'H', NC_ADDRESS, 1, (u8*)DisplayBuff, sizeof(DisplayBuff));
734
                }
750
                }
735
                else
751
                else
736
                {
752
                {
737
                        UART1_DisplayLine = 2;
753
                        UART1_DisplayLine = 2;
738
                        sprintf(text,"!!! incompatible !!!");
754
                        sprintf(text,"!!! incompatible !!!");
739
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'H', NC_ADDRESS, 2, &UART1_DisplayLine, sizeof(UART1_DisplayLine), (u8*)&text, 20);
755
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'H', NC_ADDRESS, 2, &UART1_DisplayLine, sizeof(UART1_DisplayLine), (u8*)&text, 20);
740
                        if(UART1_DisplayLine++ > 3) UART1_DisplayLine = 0;
756
                        if(UART1_DisplayLine++ > 3) UART1_DisplayLine = 0;
741
                }
757
                }
742
                UART1_Display_Timer = SetDelay(UART1_Display_Interval);
758
                UART1_Display_Timer = SetDelay(UART1_Display_Interval);
743
                UART1_Request_Display = FALSE;
759
                UART1_Request_Display = FALSE;
744
        }
760
        }
745
        else if(UART1_Request_Display1 && (UART1_tx_buffer.Locked == FALSE))
761
        else if(UART1_Request_Display1 && (UART1_tx_buffer.Locked == FALSE))
746
        {
762
        {
747
                Menu_Update(0);
763
                Menu_Update(0);
748
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'L', NC_ADDRESS, 3, (u8*)&MenuItem, sizeof(MenuItem), (u8*)&MaxMenuItem, sizeof(MaxMenuItem),(u8*)DisplayBuff, sizeof(DisplayBuff));
764
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'L', NC_ADDRESS, 3, (u8*)&MenuItem, sizeof(MenuItem), (u8*)&MaxMenuItem, sizeof(MaxMenuItem),(u8*)DisplayBuff, sizeof(DisplayBuff));
749
                UART1_Request_Display1 = FALSE;
765
                UART1_Request_Display1 = FALSE;
750
        }
766
        }
751
        else if(UART1_Request_VersionInfo && (UART1_tx_buffer.Locked == FALSE))
767
        else if(UART1_Request_VersionInfo && (UART1_tx_buffer.Locked == FALSE))
752
        {
768
        {
753
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo));
769
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo));
754
                UART1_Request_VersionInfo = FALSE;
770
                UART1_Request_VersionInfo = FALSE;
755
        }
771
        }
756
        else if(UART1_Request_ErrorMessage && (UART1_tx_buffer.Locked == FALSE))
772
        else if(UART1_Request_ErrorMessage && (UART1_tx_buffer.Locked == FALSE))
757
        {
773
        {
758
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG));
774
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG));
759
                UART1_Request_ErrorMessage = FALSE;
775
                UART1_Request_ErrorMessage = FALSE;
760
        }
776
        }
761
#ifdef FOLLOW_ME
777
#ifdef FOLLOW_ME
762
        else if(CheckDelay(UART1_FollowMe_Timer) && (UART1_tx_buffer.Locked == FALSE))
778
        else if(CheckDelay(UART1_FollowMe_Timer) && (UART1_tx_buffer.Locked == FALSE))
763
        {
779
        {
764
                if((GPSData.Status != INVALID) && (GPSData.SatFix == SATFIX_3D) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.NumOfSats >= 4))
780
                if((GPSData.Status != INVALID) && (GPSData.SatFix == SATFIX_3D) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.NumOfSats >= 4))
765
                {
781
                {
766
                        TransmitAlsoToFC = 1;
782
                        TransmitAlsoToFC = 1;
767
                        // update FollowMe content
783
                        // update FollowMe content
768
                        FollowMe.Position.Longitude     = GPSData.Position.Longitude;
784
                        FollowMe.Position.Longitude     = GPSData.Position.Longitude;
769
                        FollowMe.Position.Latitude      = GPSData.Position.Latitude;
785
                        FollowMe.Position.Latitude      = GPSData.Position.Latitude;
770
                        FollowMe.Position.Status = NEWDATA;
786
                        FollowMe.Position.Status = NEWDATA;
771
                        FollowMe.Position.Altitude = 1;
787
                        FollowMe.Position.Altitude = 1;
772
                        // 0  -> no Orientation
788
                        // 0  -> no Orientation
773
                        // 1-360 -> CompassCourse Setpoint
789
                        // 1-360 -> CompassCourse Setpoint
774
                        // -1 -> points to  WP1 -> itself
790
                        // -1 -> points to  WP1 -> itself
775
                FollowMe.Heading = -1;
791
                FollowMe.Heading = -1;
776
                        FollowMe.ToleranceRadius = 1;
792
                        FollowMe.ToleranceRadius = 1;
777
                        FollowMe.HoldTime = 60;
793
                        FollowMe.HoldTime = 60;
778
                        FollowMe.Event_Flag = 1;
794
                        FollowMe.Event_Flag = 1;
779
                        FollowMe.Index = 1; // 0 = Delete List, 1 place at first entry in the list
795
                        FollowMe.Index = 1; // 0 = Delete List, 1 place at first entry in the list
780
                        FollowMe.Type = POINT_TYPE_WP;
796
                        FollowMe.Type = POINT_TYPE_WP;
781
                        FollowMe.WP_EventChannelValue = 100;  // set servo value
797
                        FollowMe.WP_EventChannelValue = 100;  // set servo value
782
                        FollowMe.AltitudeRate = 0;                        // do not change height
798
                        FollowMe.AltitudeRate = 0;                        // do not change height
783
                        FollowMe.reserve[0] = 0;                // reserve
799
                        FollowMe.reserve[0] = 0;                // reserve
784
                        FollowMe.reserve[1] = 0;                // reserve
800
                        FollowMe.reserve[1] = 0;                // reserve
785
                        FollowMe.reserve[2] = 0;                // reserve
801
                        FollowMe.reserve[2] = 0;                // reserve
786
                        FollowMe.reserve[3] = 0;                // reserve
802
                        FollowMe.reserve[3] = 0;                // reserve
787
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 's', NC_ADDRESS, 1, (u8 *)&FollowMe, sizeof(FollowMe));
803
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 's', NC_ADDRESS, 1, (u8 *)&FollowMe, sizeof(FollowMe));
788
                }
804
                }
789
                UART1_FollowMe_Timer = SetDelay(FOLLOW_ME_INTERVAL); // set new update time
805
                UART1_FollowMe_Timer = SetDelay(FOLLOW_ME_INTERVAL); // set new update time
790
        }
806
        }
791
#endif
807
#endif
792
#ifdef DEBUG                                                                                                                    // only include functions if DEBUG is defined
808
#ifdef DEBUG                                                                                                                    // only include functions if DEBUG is defined
793
        else if(SendDebugOutput && (UART1_tx_buffer.Locked == FALSE))
809
        else if(SendDebugOutput && (UART1_tx_buffer.Locked == FALSE))
794
        {
810
        {
795
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer,'0', NC_ADDRESS, 1, (u8 *) &tDebug, sizeof(tDebug));
811
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer,'0', NC_ADDRESS, 1, (u8 *) &tDebug, sizeof(tDebug));
796
                SendDebugOutput = 0;
812
                SendDebugOutput = 0;
797
        }
813
        }
798
#endif
814
#endif
799
        UART1_Transmit(); // output pending bytes in tx buffer
815
        UART1_Transmit(); // output pending bytes in tx buffer
800
}
816
}
801
 
817
 
802
 
818