Subversion Repositories NaviCtrl

Rev

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

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