Subversion Repositories NaviCtrl

Rev

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

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