Subversion Repositories NaviCtrl

Rev

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

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