Subversion Repositories NaviCtrl

Rev

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

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