Subversion Repositories NaviCtrl

Rev

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

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