Subversion Repositories NaviCtrl

Rev

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

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