Subversion Repositories NaviCtrl

Rev

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

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