Subversion Repositories NaviCtrl

Rev

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

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