Subversion Repositories NaviCtrl

Rev

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

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