Subversion Repositories NaviCtrl

Rev

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

Rev 153 Rev 154
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 512
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 fifo and rxd buffer not locked
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
                        } // some byes in the fifo and rxd buffer not locked
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
                        }
332
                } // eof DebugUart = UART1
340
                } // eof DebugUart = UART1
333
        }
341
        }
334
}
342
}
335
 
343
 
336
/**************************************************************/
344
/**************************************************************/
337
/* Process incomming data from debug uart                     */
345
/* Process incomming data from debug uart                     */
338
/**************************************************************/
346
/**************************************************************/
339
void UART1_ProcessRxData(void)
347
void UART1_ProcessRxData(void)
340
{
348
{
341
        u8 c;
-
 
342
 
-
 
343
        // return on forwarding uart
349
        // return on forwarding uart  or unlocked rx buffer
344
        if(DebugUART != UART1) return;
-
 
345
       
-
 
346
        // collect data from primary rx fifo
-
 
347
        while(fifo_get(&UART1_rx_fifo, &c))
-
 
348
        {       // break if complete frame is collected
-
 
349
                if(MKProtocol_CollectSerialFrame(&UART1_rx_buffer, c)) break;
-
 
350
        }
-
 
351
        // if data in the rxd buffer are not locked immediately return
-
 
352
        if(UART1_rx_buffer.Locked == FALSE) return;
350
        if((DebugUART != UART1) || (UART1_rx_buffer.Locked == FALSE)) return;
353
       
351
       
354
        Waypoint_t * pWaypoint = NULL;
352
        Waypoint_t * pWaypoint = NULL;
355
        SerialMsg_t SerialMsg;
353
        SerialMsg_t SerialMsg;
356
 
354
 
357
        MKProtocol_DecodeSerialFrame(&UART1_rx_buffer, &SerialMsg); // decode serial frame in rxd buffer
355
        MKProtocol_DecodeSerialFrame(&UART1_rx_buffer, &SerialMsg); // decode serial frame in rxd buffer
358
    if(*(SerialMsg.pCmdID) != 'z') SerialLinkOkay = 250;          // reset SerialTimeout, but not in case of the "ping"
356
    if(*(SerialMsg.pCmdID) != 'z') SerialLinkOkay = 250;          // reset SerialTimeout, but not in case of the "ping"
359
        switch(*(SerialMsg.pAddress)) // check for Slave Address
357
        switch(*(SerialMsg.pAddress)) // check for Slave Address
360
        {
358
        {
361
                case NC_ADDRESS:  // own Slave Address
359
                case NC_ADDRESS:  // own Slave Address
362
                switch(*(SerialMsg.pCmdID))
360
                switch(*(SerialMsg.pCmdID))
363
                {
361
                {
364
                        case 'z': // connection checker
362
                        case 'z': // connection checker
365
                                memcpy(&Echo, SerialMsg.pData, sizeof(Echo)); // copy echo pattern
363
                                memcpy(&Echo, SerialMsg.pData, sizeof(Echo)); // copy echo pattern
366
                                UART1_Request_Echo = TRUE;
364
                                UART1_Request_Echo = TRUE;
367
                                break;
365
                                break;
368
 
366
 
369
                        case 'e': // request for the text of the error status
367
                        case 'e': // request for the text of the error status
370
                                UART1_Request_ErrorMessage = TRUE;
368
                                UART1_Request_ErrorMessage = TRUE;
371
                                break;
369
                                break;
372
 
370
 
373
                        case 's'://  new target position
371
                        case 's'://  new target position
374
                                pWaypoint = (Waypoint_t*)SerialMsg.pData;
372
                                pWaypoint = (Waypoint_t*)SerialMsg.pData;
375
                                BeepTime = 300;
373
                                BeepTime = 300;
376
                                if(pWaypoint->Position.Status == NEWDATA)
374
                                if(pWaypoint->Position.Status == NEWDATA)
377
                                {
375
                                {
378
                                        WPList_Clear(); // empty WPList
376
                                        WPList_Clear(); // empty WPList
379
                                        WPList_Append(pWaypoint);
377
                                        WPList_Append(pWaypoint);
380
                                        GPS_pWaypoint = WPList_Begin();
378
                                        GPS_pWaypoint = WPList_Begin();
381
                                }
379
                                }
382
                                break;
380
                                break;
383
 
381
 
384
                        case 'u': // redirect debug uart
382
                        case 'u': // redirect debug uart
385
                                switch(SerialMsg.pData[0])
383
                                switch(SerialMsg.pData[0])
386
                                {
384
                                {
387
                                        case UART_FLIGHTCTRL:
385
                                        case UART_FLIGHTCTRL:
388
                                                UART2_Init();                           // initialize UART2 to FC pins
386
                                                UART2_Init();                           // initialize UART2 to FC pins
389
                                                fifo_purge(&UART1_rx_fifo);
387
                                                fifo_purge(&UART1_rx_fifo);
390
                                                DebugUART = UART2;
388
                                                DebugUART = UART2;
391
                                                break;
389
                                                break;
392
                                        case UART_MK3MAG:
390
                                        case UART_MK3MAG:
393
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
391
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
394
                                                UART0_Connect_to_MK3MAG();      // mux UART0 to MK3MAG pins
392
                                                UART0_Connect_to_MK3MAG();      // mux UART0 to MK3MAG pins
395
                                                GPSData.Status = INVALID;
393
                                                GPSData.Status = INVALID;
396
                                                fifo_purge(&UART1_rx_fifo);
394
                                                fifo_purge(&UART1_rx_fifo);
397
                                                DebugUART = UART0;
395
                                                DebugUART = UART0;
398
                                                break;
396
                                                break;
399
                                        case UART_MKGPS:
397
                                        case UART_MKGPS:
400
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
398
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
401
                                                TIMER2_Deinit();
399
                                                TIMER2_Deinit();
402
                                                UART0_Connect_to_MKGPS();       // connect UART0 to MKGPS pins
400
                                                UART0_Connect_to_MKGPS();       // connect UART0 to MKGPS pins
403
                                                GPSData.Status = INVALID;
401
                                                GPSData.Status = INVALID;
404
                                                fifo_purge(&UART1_rx_fifo);
402
                                                fifo_purge(&UART1_rx_fifo);
405
                                                DebugUART = UART0;
403
                                                DebugUART = UART0;
406
                                                break;
404
                                                break;
407
                                        default:
405
                                        default:
408
                                                break;
406
                                                break;
409
                                }
407
                                }
410
                                break;
408
                                break;
411
 
409
 
412
                        case 'w'://  Append Waypoint to List
410
                        case 'w'://  Append Waypoint to List
413
                                pWaypoint = (Waypoint_t*)SerialMsg.pData;
411
                                pWaypoint = (Waypoint_t*)SerialMsg.pData;
414
                                if(pWaypoint->Position.Status == INVALID)
412
                                if(pWaypoint->Position.Status == INVALID)
415
                                {  // clear WP List
413
                                {  // clear WP List
416
                                        WPList_Clear();
414
                                        WPList_Clear();
417
                                        GPS_pWaypoint = WPList_Begin();
415
                                        GPS_pWaypoint = WPList_Begin();
418
                                        //UART1_PutString("\r\nClear WP List\r\n");
416
                                        //UART1_PutString("\r\nClear WP List\r\n");
419
                                }
417
                                }
420
                                else if (pWaypoint->Position.Status == NEWDATA)
418
                                else if (pWaypoint->Position.Status == NEWDATA)
421
                                {  // app current WP to the list
419
                                {  // app current WP to the list
422
                                        WPList_Append(pWaypoint);
420
                                        WPList_Append(pWaypoint);
423
                                        BeepTime = 500;
421
                                        BeepTime = 500;
424
                                        //UART1_PutString("\r\nAdd WP to List\r\n");
422
                                        //UART1_PutString("\r\nAdd WP to List\r\n");
425
                                }
423
                                }
426
                                UART1_Request_NewWaypoint = TRUE;
424
                                UART1_Request_NewWaypoint = TRUE;
427
                                break;
425
                                break;
428
 
426
 
429
                        case 'x'://  Read Waypoint from List
427
                        case 'x'://  Read Waypoint from List
430
                                UART1_Request_ReadWaypoint = SerialMsg.pData[0];
428
                                UART1_Request_ReadWaypoint = SerialMsg.pData[0];
431
                                break;
429
                                break;
432
 
430
 
433
                        default:
431
                        default:
434
                                // unsupported command recieved
432
                                // unsupported command recieved
435
                                break;
433
                                break;
436
                } // case NC_ADDRESS
434
                } // case NC_ADDRESS
437
                // "break;" is missing here to fall thru to the common commands
435
                // "break;" is missing here to fall thru to the common commands
438
 
436
 
439
                default:  // and any other Slave Address
437
                default:  // and any other Slave Address
440
 
438
 
441
                switch(*(SerialMsg.pCmdID)) // check CmdID
439
                switch(*(SerialMsg.pCmdID)) // check CmdID
442
                {
440
                {
443
                        case 'a':// request for the labels of the analog debug outputs
441
                        case 'a':// request for the labels of the analog debug outputs
444
                                UART1_Request_DebugLabel = SerialMsg.pData[0];
442
                                UART1_Request_DebugLabel = SerialMsg.pData[0];
445
                                if(UART1_Request_DebugLabel > 31) UART1_Request_DebugLabel = 31;
443
                                if(UART1_Request_DebugLabel > 31) UART1_Request_DebugLabel = 31;
446
                                break;
444
                                break;
447
 
445
 
448
                        case 'b': // submit extern control
446
                        case 'b': // submit extern control
449
                                memcpy(&ExternControl, SerialMsg.pData, sizeof(ExternControl));
447
                                memcpy(&ExternControl, SerialMsg.pData, sizeof(ExternControl));
450
                                UART1_ConfirmFrame = ExternControl.Frame;
448
                                UART1_ConfirmFrame = ExternControl.Frame;
451
                                break;
449
                                break;
452
 
450
 
453
                        case 'd': // request for debug data;
451
                        case 'd': // request for debug data;
454
                                UART1_DebugData_Interval = (u32) SerialMsg.pData[0] * 10;
452
                                UART1_DebugData_Interval = (u32) SerialMsg.pData[0] * 10;
455
                                if(UART1_DebugData_Interval > 0) UART1_Request_DebugData = TRUE;
453
                                if(UART1_DebugData_Interval > 0) UART1_Request_DebugData = TRUE;
456
                                break;
454
                                break;
457
 
455
 
458
                        case 'c': // request for 3D data;
456
                        case 'c': // request for 3D data;
459
                                UART1_Data3D_Interval = (u32) SerialMsg.pData[0] * 10;
457
                                UART1_Data3D_Interval = (u32) SerialMsg.pData[0] * 10;
460
                                if(UART1_Data3D_Interval > 0) UART1_Request_Data3D = TRUE;
458
                                if(UART1_Data3D_Interval > 0) UART1_Request_Data3D = TRUE;
461
                                break;
459
                                break;
462
 
460
 
463
                        case 'g':// request for external control data
461
                        case 'g':// request for external control data
464
                                UART1_Request_ExternalControl = TRUE;
462
                                UART1_Request_ExternalControl = TRUE;
465
                                break;
463
                                break;
466
 
464
 
467
                        case 'h':// reqest for display line
465
                        case 'h':// reqest for display line
468
                                RemoteKeys |= SerialMsg.pData[0];
466
                                RemoteKeys |= SerialMsg.pData[0];
469
                                if(RemoteKeys != 0) UART1_DisplayLine = 0;
467
                                if(RemoteKeys != 0) UART1_DisplayLine = 0;
470
                                UART1_Request_Display = TRUE;
468
                                UART1_Request_Display = TRUE;
471
                                break;
469
                                break;
472
 
470
 
473
                        case 'l':// reqest for display columns
471
                        case 'l':// reqest for display columns
474
                                MenuItem = SerialMsg.pData[0];
472
                                MenuItem = SerialMsg.pData[0];
475
                                UART1_Request_Display1 = TRUE;
473
                                UART1_Request_Display1 = TRUE;
476
                                break;
474
                                break;
477
 
475
 
478
                        case 'o': // request for navigation information
476
                        case 'o': // request for navigation information
479
                                UART1_NaviData_Interval = (u32) SerialMsg.pData[0] * 10;
477
                                UART1_NaviData_Interval = (u32) SerialMsg.pData[0] * 10;
480
                                if(UART1_NaviData_Interval > 0) UART1_Request_NaviData = TRUE;
478
                                if(UART1_NaviData_Interval > 0) UART1_Request_NaviData = TRUE;
481
                                break;
479
                                break;
482
 
480
 
483
                        case 'v': // request for version info
481
                        case 'v': // request for version info
484
                                UART1_Request_VersionInfo = TRUE;
482
                                UART1_Request_VersionInfo = TRUE;
485
                                break;
483
                                break;
486
                        default:
484
                        default:
487
                                // unsupported command recieved
485
                                // unsupported command recieved
488
                                break;
486
                                break;
489
                }
487
                }
490
                break; // default:
488
                break; // default:
491
        }
489
        }
492
        Buffer_Clear(&UART1_rx_buffer); // free rc buffer for next frame
490
        Buffer_Clear(&UART1_rx_buffer); // free rc buffer for next frame
493
}
491
}
494
 
492
 
495
 
493
 
496
/*****************************************************/
494
/*****************************************************/
497
/*                   Send a character                */
495
/*                   Send a character                */
498
/*****************************************************/
496
/*****************************************************/
499
s16 UART1_Putchar(char c)
497
s16 UART1_Putchar(char c)
500
{
498
{
501
        if (c == '\n') UART1_Putchar('\r');
499
        if (c == '\n') UART1_Putchar('\r');
502
        // wait until txd fifo is not full
500
        // wait until txd fifo is not full
503
        while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
501
        while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
504
        // transmit byte
502
        // transmit byte
505
        UART_SendData(UART1, c);
503
        UART_SendData(UART1, c);
506
        return (0);
504
        return (0);
507
}
505
}
508
 
506
 
509
/*****************************************************/
507
/*****************************************************/
510
/*       Send a string to the debug uart              */
508
/*       Send a string to the debug uart              */
511
/*****************************************************/
509
/*****************************************************/
512
void UART1_PutString(u8 *s)
510
void UART1_PutString(u8 *s)
513
{
511
{
514
        if(s == NULL) return;
512
        if(s == NULL) return;
515
        while (*s != '\0' && DebugUART == UART1)
513
        while (*s != '\0' && DebugUART == UART1)
516
        {
514
        {
517
                UART1_Putchar(*s);
515
                UART1_Putchar(*s);
518
                s ++;
516
                s ++;
519
        }
517
        }
520
}
518
}
521
 
519
 
522
 
520
 
523
/**************************************************************/
521
/**************************************************************/
524
/*         Transmit tx buffer via debug uart                  */
522
/*         Transmit tx buffer via debug uart                  */
525
/**************************************************************/
523
/**************************************************************/
526
void UART1_Transmit(void)
524
void UART1_Transmit(void)
527
{
525
{
528
        u8 tmp_tx;
526
        u8 tmp_tx;
529
        if(DebugUART != UART1) return;
527
        if(DebugUART != UART1) return;
530
        // if something has to be send and the txd fifo is not full
528
        // if something has to be send and the txd fifo is not full
531
        if(UART1_tx_buffer.Locked == TRUE)
529
        if(UART1_tx_buffer.Locked == TRUE)
532
        {
530
        {
533
                // while there is some space in the tx fifo
531
                // while there is some space in the tx fifo
534
                while(UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != SET)
532
                while(UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != SET)
535
                {
533
                {
536
                        tmp_tx = UART1_tx_buffer.pData[UART1_tx_buffer.Position++]; // read next byte from txd buffer
534
                        tmp_tx = UART1_tx_buffer.pData[UART1_tx_buffer.Position++]; // read next byte from txd buffer
537
                        UART_SendData(UART1, tmp_tx); // put character to txd fifo
535
                        UART_SendData(UART1, tmp_tx); // put character to txd fifo
538
                        // if terminating character or end of txd buffer reached
536
                        // if terminating character or end of txd buffer reached
539
                        if((tmp_tx == '\r') || (UART1_tx_buffer.Position == UART1_tx_buffer.DataBytes))
537
                        if((tmp_tx == '\r') || (UART1_tx_buffer.Position == UART1_tx_buffer.DataBytes))
540
                        {
538
                        {
541
                                Buffer_Clear(&UART1_tx_buffer); // clear txd buffer
539
                                Buffer_Clear(&UART1_tx_buffer); // clear txd buffer
542
                                break; // end while loop
540
                                break; // end while loop
543
                        }
541
                        }
544
                }
542
                }
545
        }
543
        }
546
}
544
}
547
 
545
 
548
/**************************************************************/
546
/**************************************************************/
549
/* Send the answers to incomming commands at the debug uart   */
547
/* Send the answers to incomming commands at the debug uart   */
550
/**************************************************************/
548
/**************************************************************/
551
void UART1_TransmitTxData(void)
549
void UART1_TransmitTxData(void)
552
{
550
{
553
        if(DebugUART != UART1) return;
551
        if(DebugUART != UART1) return;
554
        UART1_Transmit(); // output pending bytes in tx buffer
552
        UART1_Transmit(); // output pending bytes in tx buffer
555
        if((UART1_tx_buffer.Locked == TRUE)) return;
553
        if((UART1_tx_buffer.Locked == TRUE)) return;
556
 
554
 
557
        if(UART1_Request_Echo && (UART1_tx_buffer.Locked == FALSE))
555
        if(UART1_Request_Echo && (UART1_tx_buffer.Locked == FALSE))
558
        {
556
        {
559
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'Z', NC_ADDRESS, 1, &Echo, sizeof(Echo)); // answer the echo request
557
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'Z', NC_ADDRESS, 1, &Echo, sizeof(Echo)); // answer the echo request
560
                Echo = 0; // reset echo value
558
                Echo = 0; // reset echo value
561
                UART1_Request_Echo = FALSE;
559
                UART1_Request_Echo = FALSE;
562
        }
560
        }
-
 
561
        else if(UART1_Request_NewWaypoint && (UART1_tx_buffer.Locked == FALSE))
-
 
562
        {
-
 
563
                u8 WPNumber = WPList_GetCount();
-
 
564
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'W', NC_ADDRESS, 1, &WPNumber, sizeof(WPNumber));
-
 
565
                UART1_Request_NewWaypoint = FALSE;
-
 
566
        }
-
 
567
        else if((UART1_Request_ReadWaypoint != 0xFF) && (UART1_tx_buffer.Locked == FALSE))
-
 
568
        {
-
 
569
                u8 WPNumber = WPList_GetCount();
-
 
570
                if (UART1_Request_ReadWaypoint < WPNumber)
-
 
571
                {
-
 
572
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'X', NC_ADDRESS, 3, &WPNumber, 1, &UART1_Request_ReadWaypoint, 1, WPList_GetAt(UART1_Request_ReadWaypoint), sizeof(Waypoint_t));
-
 
573
                }
-
 
574
                else
-
 
575
                {
-
 
576
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer,'X', NC_ADDRESS, 1, &WPNumber, sizeof(WPNumber));
-
 
577
                }
-
 
578
                UART1_Request_ReadWaypoint = 0xFF;
-
 
579
        }
-
 
580
        else if((UART1_Request_DebugLabel != 0xFF) && (UART1_tx_buffer.Locked == FALSE))
-
 
581
        {
-
 
582
                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;
-
 
584
        }
563
        else if(( ((UART1_NaviData_Interval > 0) && CheckDelay(UART1_NaviData_Timer) ) || UART1_Request_NaviData) && (UART1_tx_buffer.Locked == FALSE))
585
        else if(( ((UART1_NaviData_Interval > 0) && CheckDelay(UART1_NaviData_Timer) ) || UART1_Request_NaviData) && (UART1_tx_buffer.Locked == FALSE))
564
        {
586
        {
565
                NaviData.Errorcode = ErrorCode;
587
                NaviData.Errorcode = ErrorCode;
566
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));
588
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));
567
                UART1_NaviData_Timer = SetDelay(UART1_NaviData_Interval);
589
                UART1_NaviData_Timer = SetDelay(UART1_NaviData_Interval);
568
                UART1_Request_NaviData = FALSE;
590
                UART1_Request_NaviData = FALSE;
569
        }
591
        }
570
        else if( (( (UART1_DebugData_Interval > 0) && CheckDelay(UART1_DebugData_Timer)) || UART1_Request_DebugData) && (UART1_tx_buffer.Locked == FALSE))
592
        else if( (( (UART1_DebugData_Interval > 0) && CheckDelay(UART1_DebugData_Timer)) || UART1_Request_DebugData) && (UART1_tx_buffer.Locked == FALSE))
571
        {
593
        {
572
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'D', NC_ADDRESS, 1,(u8 *)&DebugOut, sizeof(DebugOut));
594
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'D', NC_ADDRESS, 1,(u8 *)&DebugOut, sizeof(DebugOut));
573
                UART1_DebugData_Timer = SetDelay(UART1_DebugData_Interval);
595
                UART1_DebugData_Timer = SetDelay(UART1_DebugData_Interval);
574
                UART1_Request_DebugData = FALSE;
596
                UART1_Request_DebugData = FALSE;
575
        }
597
        }
576
        else if((( (UART1_Data3D_Interval > 0) && CheckDelay(UART1_Data3D_Timer) ) || UART1_Request_Data3D) && (UART1_tx_buffer.Locked == FALSE))
598
        else if((( (UART1_Data3D_Interval > 0) && CheckDelay(UART1_Data3D_Timer) ) || UART1_Request_Data3D) && (UART1_tx_buffer.Locked == FALSE))
577
        {
599
        {
578
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'C', NC_ADDRESS, 1,(u8 *)&Data3D, sizeof(Data3D));
600
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'C', NC_ADDRESS, 1,(u8 *)&Data3D, sizeof(Data3D));
579
                UART1_Data3D_Timer = SetDelay(UART1_Data3D_Interval);
601
                UART1_Data3D_Timer = SetDelay(UART1_Data3D_Interval);
580
                UART1_Request_Data3D = FALSE;
602
                UART1_Request_Data3D = FALSE;
581
        }
603
        }
582
        else if((UART1_Request_DebugLabel != 0xFF) && (UART1_tx_buffer.Locked == FALSE))
-
 
583
        {
-
 
584
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'A', NC_ADDRESS, 2, &UART1_Request_DebugLabel, sizeof(UART1_Request_DebugLabel), (u8 *) ANALOG_LABEL[UART1_Request_DebugLabel], 16);
-
 
585
                UART1_Request_DebugLabel = 0xFF;
-
 
586
        }
-
 
587
        else if(UART1_ConfirmFrame && (UART1_tx_buffer.Locked == FALSE))
604
        else if(UART1_ConfirmFrame && (UART1_tx_buffer.Locked == FALSE))
588
        {
605
        {
589
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'B', NC_ADDRESS, 1, &UART1_ConfirmFrame, sizeof(UART1_ConfirmFrame));
606
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'B', NC_ADDRESS, 1, &UART1_ConfirmFrame, sizeof(UART1_ConfirmFrame));
590
                UART1_ConfirmFrame = 0;
607
                UART1_ConfirmFrame = 0;
591
        }
608
        }
592
        else if(UART1_Request_ExternalControl && (UART1_tx_buffer.Locked == FALSE))
609
        else if(UART1_Request_ExternalControl && (UART1_tx_buffer.Locked == FALSE))
593
        {
610
        {
594
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'G', NC_ADDRESS, 1, (u8 *)&ExternControl, sizeof(ExternControl));
611
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'G', NC_ADDRESS, 1, (u8 *)&ExternControl, sizeof(ExternControl));
595
                UART1_Request_ExternalControl = FALSE;
612
                UART1_Request_ExternalControl = FALSE;
596
        }
613
        }
597
        else if(UART1_Request_Display && (UART1_tx_buffer.Locked == FALSE))
614
        else if(UART1_Request_Display && (UART1_tx_buffer.Locked == FALSE))
598
        {
615
        {
599
                LCD_PrintMenu();
616
                LCD_PrintMenu();
600
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'H', NC_ADDRESS, 2, &UART1_DisplayLine, sizeof(UART1_DisplayLine), (u8*)&DisplayBuff[UART1_DisplayLine * 20], 20);
617
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'H', NC_ADDRESS, 2, &UART1_DisplayLine, sizeof(UART1_DisplayLine), (u8*)&DisplayBuff[UART1_DisplayLine * 20], 20);
601
                UART1_DisplayLine++;
618
                UART1_DisplayLine++;
602
                if(UART1_DisplayLine >= 4) UART1_DisplayLine = 0;
619
                if(UART1_DisplayLine >= 4) UART1_DisplayLine = 0;
603
                UART1_Request_Display = FALSE;
620
                UART1_Request_Display = FALSE;
604
        }
621
        }
605
        else if(UART1_Request_Display1 && (UART1_tx_buffer.Locked == FALSE))
622
        else if(UART1_Request_Display1 && (UART1_tx_buffer.Locked == FALSE))
606
        {
623
        {
607
                LCD_PrintMenu();
624
                LCD_PrintMenu();
608
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'L', NC_ADDRESS, 3, (u8*)&MenuItem, sizeof(MenuItem), (u8*)&MaxMenuItem, sizeof(MaxMenuItem),(u8*)DisplayBuff, sizeof(DisplayBuff));
625
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'L', NC_ADDRESS, 3, (u8*)&MenuItem, sizeof(MenuItem), (u8*)&MaxMenuItem, sizeof(MaxMenuItem),(u8*)DisplayBuff, sizeof(DisplayBuff));
609
                UART1_Request_Display1 = FALSE;
626
                UART1_Request_Display1 = FALSE;
610
        }
627
        }
611
        else if(UART1_Request_VersionInfo && (UART1_tx_buffer.Locked == FALSE))
628
        else if(UART1_Request_VersionInfo && (UART1_tx_buffer.Locked == FALSE))
612
        {
629
        {
613
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo));
630
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo));
614
                UART1_Request_VersionInfo = FALSE;
631
                UART1_Request_VersionInfo = FALSE;
615
        }
632
        }
616
        else if(UART1_Request_ErrorMessage && (UART1_tx_buffer.Locked == FALSE))
633
        else if(UART1_Request_ErrorMessage && (UART1_tx_buffer.Locked == FALSE))
617
        {
634
        {
618
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG));
635
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG));
619
                UART1_Request_ErrorMessage = FALSE;
636
                UART1_Request_ErrorMessage = FALSE;
620
        }
637
        }
621
        else if(UART1_Request_SendFollowMe && (UART1_tx_buffer.Locked == FALSE) && (GPSData.NumOfSats >= 4))              // sending for "Follow me"
638
        else if(UART1_Request_SendFollowMe && (UART1_tx_buffer.Locked == FALSE) && (GPSData.NumOfSats >= 4))              // sending for "Follow me"
622
        {
639
        {
623
                GPS_CopyPosition(&(GPSData.Position),&(FollowMe.Position));
640
                GPS_CopyPosition(&(GPSData.Position),&(FollowMe.Position));
624
                FollowMe.Position.Status = NEWDATA;
641
                FollowMe.Position.Status = NEWDATA;
625
                FollowMe.Heading = -1;
642
                FollowMe.Heading = -1;
626
                FollowMe.ToleranceRadius = 1;
643
                FollowMe.ToleranceRadius = 1;
627
                FollowMe.HoldTime = 60;
644
                FollowMe.HoldTime = 60;
628
                FollowMe.Event_Flag = 0;
645
                FollowMe.Event_Flag = 0;
629
                FollowMe.reserve[0] = 0;                // reserve
646
                FollowMe.reserve[0] = 0;                // reserve
630
                FollowMe.reserve[1] = 0;                // reserve
647
                FollowMe.reserve[1] = 0;                // reserve
631
                FollowMe.reserve[2] = 0;                // reserve
648
                FollowMe.reserve[2] = 0;                // reserve
632
                FollowMe.reserve[3] = 0;                // reserve
649
                FollowMe.reserve[3] = 0;                // reserve
633
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 's', NC_ADDRESS, 1, (u8 *)&FollowMe, sizeof(FollowMe));
650
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 's', NC_ADDRESS, 1, (u8 *)&FollowMe, sizeof(FollowMe));
634
                UART1_Request_SendFollowMe = FALSE;
651
                UART1_Request_SendFollowMe = FALSE;
635
        }
652
        }
636
        else if(UART1_Request_NewWaypoint && (UART1_tx_buffer.Locked == FALSE))
-
 
637
        {
-
 
638
                u8 WPNumber = WPList_GetCount();
-
 
639
                MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'W', NC_ADDRESS, 1, &WPNumber, sizeof(WPNumber));
-
 
640
                UART1_Request_NewWaypoint = FALSE;
-
 
641
        }
-
 
642
        else if((UART1_Request_ReadWaypoint != 0xFF) && (UART1_tx_buffer.Locked == FALSE))
-
 
643
        {
-
 
644
                u8 WPNumber = WPList_GetCount();
-
 
645
                if (UART1_Request_ReadWaypoint < WPNumber)
-
 
646
                {
-
 
647
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer, 'X', NC_ADDRESS, 3, &WPNumber, 1, &UART1_Request_ReadWaypoint, 1, WPList_GetAt(UART1_Request_ReadWaypoint), sizeof(Waypoint_t));
-
 
648
                }
-
 
649
                else
-
 
650
                {
-
 
651
                        MKProtocol_CreateSerialFrame(&UART1_tx_buffer,'X', NC_ADDRESS, 1, &WPNumber, sizeof(WPNumber));
-
 
652
                }
-
 
653
                UART1_Request_ReadWaypoint = 0xFF;
-
 
654
        }
-
 
655
        UART1_Transmit(); // output pending bytes in tx buffer
653
        UART1_Transmit(); // output pending bytes in tx buffer
656
}
654
}
657
 
655
 
658
 
656