Subversion Repositories NaviCtrl

Rev

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

Rev 54 Rev 61
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 "ramfunc.h"
62
#include "ramfunc.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 "timer.h"
70
#include "timer.h"
71
#include "usb.h"
71
#include "usb.h"
72
#include "main.h"
72
#include "main.h"
73
#include "waypoints.h"
73
#include "waypoints.h"
74
#include "GPS.h"
74
#include "GPS.h"
75
 
75
 
76
// slave addresses
76
// slave addresses
77
#define FC_ADDRESS 1
77
#define FC_ADDRESS 1
78
#define NC_ADDRESS 2
78
#define NC_ADDRESS 2
79
#define MK3MAG_ADDRESS 3
79
#define MK3MAG_ADDRESS 3
80
 
80
 
81
#define FALSE   0
81
#define FALSE   0
82
#define TRUE    1
82
#define TRUE    1
83
 
83
 
84
u8 Request_SendFollowMe         = FALSE;
84
u8 Request_SendFollowMe         = FALSE;
85
u8 Request_VerInfo                      = FALSE;
85
u8 Request_VerInfo                      = FALSE;
86
u8 Request_ExternalControl      = FALSE;
86
u8 Request_ExternalControl      = FALSE;
87
u8 Request_Display                      = FALSE;
87
u8 Request_Display                      = FALSE;
88
u8 Request_Display1             = FALSE;
88
u8 Request_Display1             = FALSE;
89
u8 Request_DebugData            = FALSE;
89
u8 Request_DebugData            = FALSE;
90
u8 Request_DebugLabel           = 255;
90
u8 Request_DebugLabel           = 255;
91
u8 Request_ChannelOnly          = FALSE;
91
u8 Request_ChannelOnly          = FALSE;
92
u8 Request_NaviData                     = FALSE;
92
u8 Request_NaviData                     = FALSE;
93
u8 Request_ErrorMessage     = FALSE;
93
u8 Request_ErrorMessage     = FALSE;
94
u8 Request_NewWaypoint          = FALSE;
94
u8 Request_NewWaypoint          = FALSE;
-
 
95
u8 Request_3DData                    = FALSE;
95
 
96
 
96
u8 DisplayLine = 0;
97
u8 DisplayLine = 0;
97
 
98
 
98
UART_TypeDef *DebugUART = UART1;
99
UART_TypeDef *DebugUART = UART1;
99
 
100
 
100
volatile u8 txd_buffer[TXD_BUFFER_LEN];
101
volatile u8 txd_buffer[TXD_BUFFER_LEN];
101
volatile u8 rxd_buffer_locked = FALSE;
102
volatile u8 rxd_buffer_locked = FALSE;
102
volatile u8 rxd_buffer[RXD_BUFFER_LEN];
103
volatile u8 rxd_buffer[RXD_BUFFER_LEN];
103
volatile u8 txd_complete = TRUE;
104
volatile u8 txd_complete = TRUE;
104
volatile u8 ReceivedBytes = 0;
105
volatile u8 ReceivedBytes = 0;
105
volatile u8 CntCrcError = 0;
106
volatile u8 CntCrcError = 0;
106
volatile u8 *pRxData = NULL;
107
volatile u8 *pRxData = NULL;
107
volatile u8  RxDataLen = 0;
108
volatile u8  RxDataLen = 0;
108
 
109
 
109
u8 text[100];
110
u8 text[100];
110
 
111
 
111
u8 PcAccess = 100;
112
u8 PcAccess = 100;
112
u8 MotorTest[4] = {0,0,0,0};
113
u8 MotorTest[4] = {0,0,0,0};
113
u8 ConfirmFrame = 0;
114
u8 ConfirmFrame = 0;
114
 
115
 
115
DebugOut_t DebugOut;
116
DebugOut_t DebugOut;
116
ExternControl_t ExternControl;
117
ExternControl_t ExternControl;
117
UART_VersionInfo_t UART_VersionInfo;
118
UART_VersionInfo_t UART_VersionInfo;
118
NaviData_t NaviData;
119
NaviData_t NaviData;
119
Waypoint_t FollowMe;
120
Waypoint_t FollowMe;
-
 
121
Data3D_t Data3D;
120
 
122
 
121
u32 DebugData_Timer;
123
u32 DebugData_Timer;
122
u32 DebugData_Interval = 1000; // in ms
124
u32 DebugData_Interval = 1000; // in ms
123
u32 NaviData_Timer;
125
u32 NaviData_Timer;
124
u32 NaviData_Interval = 1000; // in ms
126
u32 NaviData_Interval = 1000; // in ms
125
 
-
 
126
 
-
 
-
 
127
u32 Data3D_Timer = 0;
-
 
128
u32 Intervall3D = 0;
127
 
129
 
128
static u16 ptr_txd_buffer = 0;
130
static u16 ptr_txd_buffer = 0;
129
 
131
 
130
const u8 ANALOG_LABEL[32][16] =
132
const u8 ANALOG_LABEL[32][16] =
131
{
133
{
132
        //1234567890123456
134
        //1234567890123456
133
        "AngleNick       ", //0
135
        "AngleNick       ", //0
134
        "AngleRoll       ",
136
        "AngleRoll       ",
135
        "AccNick         ",
137
        "AccNick         ",
136
        "AccRoll         ",
138
        "AccRoll         ",
137
        "                ",
139
        "                ",
138
        "                ", //5
140
        "                ", //5
139
        "                ",
141
        "                ",
140
        "                ",
142
        "                ",
141
        "                ",
143
        "                ",
142
        "                ",
-
 
143
        "                ", //10
-
 
144
        "GPS Data        ",
144
        "GPS Data        ",
-
 
145
        "CompassHeading  ", //10
-
 
146
        "GyroHeading     ",
145
        "SPI Error       ",
147
        "SPI Error       ",
146
        "SPI Okay        ",
148
        "SPI Okay        ",
147
        "I2C Error       ",
149
        "I2C Error       ",
148
        "I2C Okay        ", //15
150
        "I2C Okay        ", //15
149
        "                ",//    "FC_Kalman_K     ",
151
        "                ",//    "FC_Kalman_K     ",
150
        "ACC_Speed_N     ",
152
        "ACC_Speed_N     ",
151
        "ACC_Speed_E     ",
153
        "ACC_Speed_E     ",
152
        "                ",//    "GPS ACC         ",
154
        "                ",//    "GPS ACC         ",
153
        "                ",//    "MAXDrift        ", //20
155
        "                ",//    "MAXDrift        ", //20
154
        "N_Speed         ",
156
        "N_Speed         ",
155
        "E_Speed         ",
157
        "E_Speed         ",
156
        "                ",//    "KalmDist_N      ",
158
        "                ",//    "KalmDist_N      ",
157
        "                ",//    "KalmDist_E      ",
159
        "                ",//    "KalmDist_E      ",
158
        "GyroHeading     ",//25
160
        "                ",//25
159
        "CompassHeading  ",
161
        "                ",
160
        "Distance N      ",
162
        "Distance N      ",
161
        "Distance E      ",
163
        "Distance E      ",
162
        "GPS_Nick        ",
164
        "GPS_Nick        ",
163
        "GPS_Roll        ", //30
165
        "GPS_Roll        ", //30
164
        "Used_Sats       "
166
        "Used_Sats       "
165
};
167
};
166
 
168
 
167
 
169
 
168
/********************************************************/
170
/********************************************************/
169
/*            Initialization the UART1                  */
171
/*            Initialization the UART1                  */
170
/********************************************************/
172
/********************************************************/
171
void UART1_Init (void)
173
void UART1_Init (void)
172
{
174
{
173
        GPIO_InitTypeDef GPIO_InitStructure;
175
        GPIO_InitTypeDef GPIO_InitStructure;
174
        UART_InitTypeDef UART_InitStructure;
176
        UART_InitTypeDef UART_InitStructure;
175
 
177
 
176
        SCU_APBPeriphClockConfig(__UART1, ENABLE);  // Enable the UART1 Clock
178
        SCU_APBPeriphClockConfig(__UART1, ENABLE);  // Enable the UART1 Clock
177
        SCU_APBPeriphClockConfig(__GPIO3, ENABLE);  // Enable the GPIO3 Clock
179
        SCU_APBPeriphClockConfig(__GPIO3, ENABLE);  // Enable the GPIO3 Clock
178
 
180
 
179
        /*Configure UART1_Rx pin GPIO3.2*/
181
        /*Configure UART1_Rx pin GPIO3.2*/
180
        GPIO_StructInit(&GPIO_InitStructure);
182
        GPIO_StructInit(&GPIO_InitStructure);
181
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinInput;
183
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinInput;
182
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_2;
184
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_2;
183
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
185
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
184
        GPIO_InitStructure.GPIO_IPConnected =   GPIO_IPConnected_Enable;
186
        GPIO_InitStructure.GPIO_IPConnected =   GPIO_IPConnected_Enable;
185
        GPIO_InitStructure.GPIO_Alternate =     GPIO_InputAlt1; // UART1_RxD
187
        GPIO_InitStructure.GPIO_Alternate =     GPIO_InputAlt1; // UART1_RxD
186
        GPIO_Init(GPIO3, &GPIO_InitStructure);
188
        GPIO_Init(GPIO3, &GPIO_InitStructure);
187
 
189
 
188
        /*Configure UART1_Tx pin GPIO3.3*/
190
        /*Configure UART1_Tx pin GPIO3.3*/
189
        GPIO_StructInit(&GPIO_InitStructure);
191
        GPIO_StructInit(&GPIO_InitStructure);
190
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinOutput;
192
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinOutput;
191
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_3;
193
        GPIO_InitStructure.GPIO_Pin =                   GPIO_Pin_3;
192
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
194
        GPIO_InitStructure.GPIO_Type =                  GPIO_Type_PushPull;
193
        GPIO_InitStructure.GPIO_Alternate =     GPIO_OutputAlt2; // UART1_TX
195
        GPIO_InitStructure.GPIO_Alternate =     GPIO_OutputAlt2; // UART1_TX
194
        GPIO_Init(GPIO3, &GPIO_InitStructure);
196
        GPIO_Init(GPIO3, &GPIO_InitStructure);
195
 
197
 
196
        /* UART1 configured as follow:
198
        /* UART1 configured as follow:
197
        - Word Length = 8 Bits
199
        - Word Length = 8 Bits
198
        - One Stop Bit
200
        - One Stop Bit
199
        - No parity
201
        - No parity
200
        - BaudRate = 57600 baud
202
        - BaudRate = 57600 baud
201
        - Hardware flow control Disabled
203
        - Hardware flow control Disabled
202
        - Receive and transmit enabled
204
        - Receive and transmit enabled
203
        - Receive and transmit FIFOs are Disabled
205
        - Receive and transmit FIFOs are Disabled
204
        */
206
        */
205
        UART_StructInit(&UART_InitStructure);
207
        UART_StructInit(&UART_InitStructure);
206
        UART_InitStructure.UART_WordLength =                    UART_WordLength_8D;
208
        UART_InitStructure.UART_WordLength =                    UART_WordLength_8D;
207
        UART_InitStructure.UART_StopBits =                              UART_StopBits_1;
209
        UART_InitStructure.UART_StopBits =                              UART_StopBits_1;
208
        UART_InitStructure.UART_Parity =                                UART_Parity_No ;
210
        UART_InitStructure.UART_Parity =                                UART_Parity_No ;
209
        UART_InitStructure.UART_BaudRate =                              BAUD_RATE;
211
        UART_InitStructure.UART_BaudRate =                              BAUD_RATE;
210
        UART_InitStructure. UART_HardwareFlowControl =  UART_HardwareFlowControl_None;
212
        UART_InitStructure. UART_HardwareFlowControl =  UART_HardwareFlowControl_None;
211
        UART_InitStructure.UART_Mode =                                  UART_Mode_Tx_Rx;
213
        UART_InitStructure.UART_Mode =                                  UART_Mode_Tx_Rx;
212
        UART_InitStructure.UART_FIFO =                                  UART_FIFO_Enable;
214
        UART_InitStructure.UART_FIFO =                                  UART_FIFO_Enable;
213
        UART_InitStructure.UART_TxFIFOLevel =                   UART_FIFOLevel_1_2;
215
        UART_InitStructure.UART_TxFIFOLevel =                   UART_FIFOLevel_1_2;
214
        UART_InitStructure.UART_RxFIFOLevel =                   UART_FIFOLevel_1_2;
216
        UART_InitStructure.UART_RxFIFOLevel =                   UART_FIFOLevel_1_2;
215
 
217
 
216
        UART_DeInit(UART1); // reset uart 1     to default
218
        UART_DeInit(UART1); // reset uart 1     to default
217
        UART_Init(UART1, &UART_InitStructure); // initialize uart 1
219
        UART_Init(UART1, &UART_InitStructure); // initialize uart 1
218
        // enable uart 1 interrupts selective
220
        // enable uart 1 interrupts selective
219
        UART_ITConfig(UART1, UART_IT_Receive | UART_IT_ReceiveTimeOut, ENABLE);
221
        UART_ITConfig(UART1, UART_IT_Receive | UART_IT_ReceiveTimeOut, ENABLE);
220
        UART_Cmd(UART1, ENABLE); // enable uart 1
222
        UART_Cmd(UART1, ENABLE); // enable uart 1
221
        // configure the uart 1 interupt line as an IRQ with priority 4 (0 is highest)
223
        // configure the uart 1 interupt line as an IRQ with priority 4 (0 is highest)
222
        VIC_Config(UART1_ITLine, VIC_IRQ, 4);
224
        VIC_Config(UART1_ITLine, VIC_IRQ, 4);
223
        // enable the uart 1 IRQ
225
        // enable the uart 1 IRQ
224
        VIC_ITCmd(UART1_ITLine, ENABLE);
226
        VIC_ITCmd(UART1_ITLine, ENABLE);
225
        // initialize the debug timer
227
        // initialize the debug timer
226
        DebugData_Timer = SetDelay(DebugData_Interval);
228
        DebugData_Timer = SetDelay(DebugData_Interval);
227
        NaviData_Timer = SetDelay(NaviData_Interval)+500;
229
        NaviData_Timer = SetDelay(NaviData_Interval)+500;
228
        // unlock rxd_buffer
230
        // unlock rxd_buffer
229
        rxd_buffer_locked = FALSE;
231
        rxd_buffer_locked = FALSE;
230
        pRxData = NULL;
232
        pRxData = NULL;
231
        RxDataLen = 0;
233
        RxDataLen = 0;
232
        // no bytes to send
234
        // no bytes to send
233
        txd_complete = TRUE;
235
        txd_complete = TRUE;
234
        // Fill Version Info Structure
236
        // Fill Version Info Structure
235
        UART_VersionInfo.SWMajor = VERSION_MAJOR;
237
        UART_VersionInfo.SWMajor = VERSION_MAJOR;
236
        UART_VersionInfo.SWMinor = VERSION_MINOR;
238
        UART_VersionInfo.SWMinor = VERSION_MINOR;
237
        UART_VersionInfo.SWPatch = VERSION_PATCH;
239
        UART_VersionInfo.SWPatch = VERSION_PATCH;
238
        UART_VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR;
240
        UART_VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR;
239
        UART_VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR;
241
        UART_VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR;
240
 
242
 
241
        SerialPutString("\r\nUART1 init...ok");
243
        SerialPutString("\r\nUART1 init...ok");
242
}
244
}
243
 
245
 
244
 
246
 
245
/****************************************************************/
247
/****************************************************************/
246
/*               USART1 receiver ISR                            */
248
/*               USART1 receiver ISR                            */
247
/****************************************************************/
249
/****************************************************************/
248
void UART1_IRQHandler(void)
250
void UART1_IRQHandler(void)
249
{
251
{
250
        static u16 crc;
252
        static u16 crc;
251
        static u8 ptr_rxd_buffer = 0;
253
        static u8 ptr_rxd_buffer = 0;
252
        static u8 crc1, crc2;
254
        static u8 crc1, crc2;
253
        static u8 abortState = 0;
255
        static u8 abortState = 0;
254
        u8 c;
256
        u8 c;
255
 
257
 
256
        if((UART_GetITStatus(UART1, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART1, UART_IT_ReceiveTimeOut) != RESET) )
258
        if((UART_GetITStatus(UART1, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART1, UART_IT_ReceiveTimeOut) != RESET) )
257
        {
259
        {
258
                // clear the pending bits
260
                // clear the pending bits
259
                UART_ClearITPendingBit(UART1, UART_IT_Receive);
261
                UART_ClearITPendingBit(UART1, UART_IT_Receive);
260
                UART_ClearITPendingBit(UART1, UART_IT_ReceiveTimeOut);
262
                UART_ClearITPendingBit(UART1, UART_IT_ReceiveTimeOut);
261
                // if debug UART is not UART1
263
                // if debug UART is not UART1
262
                if (DebugUART != UART1)
264
                if (DebugUART != UART1)
263
                {       // forward received data to the debug UART tx buffer
265
                {       // forward received data to the debug UART tx buffer
264
                        while(UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
266
                        while(UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
265
                        {
267
                        {
266
                                // wait for space in the tx buffer of the DebugUART
268
                                // wait for space in the tx buffer of the DebugUART
267
                                while(UART_GetFlagStatus(DebugUART, UART_FLAG_TxFIFOFull) == SET) {};
269
                                while(UART_GetFlagStatus(DebugUART, UART_FLAG_TxFIFOFull) == SET) {};
268
                                // move the byte from the rx buffer of UART1 to the tx buffer of DebugUART
270
                                // move the byte from the rx buffer of UART1 to the tx buffer of DebugUART
269
                                c = UART_ReceiveData(UART1);
271
                                c = UART_ReceiveData(UART1);
270
 
272
 
271
                                // check for abort condition (ESC ESC 0x55 0xAA 0x00)
273
                                // check for abort condition (ESC ESC 0x55 0xAA 0x00)
272
                                switch (abortState)
274
                                switch (abortState)
273
                                {
275
                                {
274
                                  case 0: if (c == 27) abortState++;
276
                                  case 0: if (c == 27) abortState++;
275
                                                break;
277
                                                break;
276
                                  case 1: if (c == 27) abortState++; else abortState = 0;
278
                                  case 1: if (c == 27) abortState++; else abortState = 0;
277
                                        break;
279
                                        break;
278
                                  case 2: if (c == 0x55) abortState++; else abortState = 0;
280
                                  case 2: if (c == 0x55) abortState++; else abortState = 0;
279
                                                break;
281
                                                break;
280
                                  case 3: if (c == 0xAA) abortState++; else abortState = 0;
282
                                  case 3: if (c == 0xAA) abortState++; else abortState = 0;
281
                                                break;
283
                                                break;
282
                                  case 4: if (c == 0x00)
284
                                  case 4: if (c == 0x00)
283
                                           {
285
                                           {
284
                                                    DebugUART = UART1;
286
                                                    DebugUART = UART1;
285
                                                        UART0_Connect_to_MKGPS();
287
                                                        UART0_Connect_to_MKGPS();
286
                                                   }
288
                                                   }
287
                                          abortState = 0;
289
                                          abortState = 0;
288
                                                break;
290
                                                break;
289
                                }
291
                                }
290
 
292
 
291
                                if (DebugUART != UART1) UART_SendData(DebugUART, c);
293
                                if (DebugUART != UART1) UART_SendData(DebugUART, c);
292
                        }
294
                        }
293
                }
295
                }
294
                else  // DebugUART == UART1 (normal operation)
296
                else  // DebugUART == UART1 (normal operation)
295
                {
297
                {
296
                        while ((UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET) && (!rxd_buffer_locked))
298
                        while ((UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET) && (!rxd_buffer_locked))
297
                        { // some byes in the fifo and rxd buffer not locked
299
                        { // some byes in the fifo and rxd buffer not locked
298
                            // get byte from fifo
300
                            // get byte from fifo
299
                        c = UART_ReceiveData(UART1);
301
                        c = UART_ReceiveData(UART1);
300
                                if((ptr_rxd_buffer == 0) && (c == '#')) // if rxd buffer is empty and syncronisation character is received
302
                                if((ptr_rxd_buffer == 0) && (c == '#')) // if rxd buffer is empty and syncronisation character is received
301
                                {
303
                                {
302
                                        rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
304
                                        rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
303
                                        crc = c; // init crc
305
                                        crc = c; // init crc
304
                                }
306
                                }
305
                                #if 0
307
                                #if 0
306
                                else if (ptr_rxd_buffer == 1) // handle address
308
                                else if (ptr_rxd_buffer == 1) // handle address
307
                                {
309
                                {
308
                                        rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
310
                                        rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
309
                                        crc += c; // update crc
311
                                        crc += c; // update crc
310
                                }
312
                                }
311
                                #endif
313
                                #endif
312
                                else if (ptr_rxd_buffer < RXD_BUFFER_LEN) // rxd buffer not full
314
                                else if (ptr_rxd_buffer < RXD_BUFFER_LEN) // rxd buffer not full
313
                                {
315
                                {
314
                                        if (c != '\r') // no termination character received
316
                                        if (c != '\r') // no termination character received
315
                                        {
317
                                        {
316
                                                rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
318
                                                rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
317
                                                crc += c; // update crc
319
                                                crc += c; // update crc
318
                                        }
320
                                        }
319
                                        else // termination character received
321
                                        else // termination character received
320
                                        {
322
                                        {
321
                                                // the last 2 bytes are no subject for checksum calculation
323
                                                // the last 2 bytes are no subject for checksum calculation
322
                                                // they are the checksum itself
324
                                                // they are the checksum itself
323
                                                crc -= rxd_buffer[ptr_rxd_buffer-2];
325
                                                crc -= rxd_buffer[ptr_rxd_buffer-2];
324
                                                crc -= rxd_buffer[ptr_rxd_buffer-1];
326
                                                crc -= rxd_buffer[ptr_rxd_buffer-1];
325
                                                // calculate checksum from transmitted data
327
                                                // calculate checksum from transmitted data
326
                                                crc %= 4096;
328
                                                crc %= 4096;
327
                                                crc1 = '=' + crc / 64;
329
                                                crc1 = '=' + crc / 64;
328
                                                crc2 = '=' + crc % 64;
330
                                                crc2 = '=' + crc % 64;
329
                                                // compare checksum to transmitted checksum bytes
331
                                                // compare checksum to transmitted checksum bytes
330
                                                if((crc1 == rxd_buffer[ptr_rxd_buffer-2]) && (crc2 == rxd_buffer[ptr_rxd_buffer-1]))
332
                                                if((crc1 == rxd_buffer[ptr_rxd_buffer-2]) && (crc2 == rxd_buffer[ptr_rxd_buffer-1]))
331
                                                {   // checksum valid
333
                                                {   // checksum valid
332
                                                        rxd_buffer_locked = TRUE;               // lock the rxd buffer
334
                                                        rxd_buffer_locked = TRUE;               // lock the rxd buffer
333
                                                        ReceivedBytes = ptr_rxd_buffer + 1;     // store number of received bytes
335
                                                        ReceivedBytes = ptr_rxd_buffer + 1;     // store number of received bytes
334
                                                        rxd_buffer[ptr_rxd_buffer] = '\r';      // set termination character
336
                                                        rxd_buffer[ptr_rxd_buffer] = '\r';      // set termination character
335
                                                        // if 2nd byte is an 'R' start bootloader
337
                                                        // if 2nd byte is an 'R' start bootloader
336
                                                        if(rxd_buffer[2] == 'R')
338
                                                        if(rxd_buffer[2] == 'R')
337
                                                        {
339
                                                        {
338
                                                                PowerOff();
340
                                                                PowerOff();
339
                                                                VIC_DeInit();
341
                                                                VIC_DeInit();
340
                                                                Execute_Bootloader(); // Reset-Commando - Bootloader starten
342
                                                                Execute_Bootloader(); // Reset-Commando - Bootloader starten
341
                                                        }
343
                                                        }
342
                                                } // eof checksum valid
344
                                                } // eof checksum valid
343
                                                else
345
                                                else
344
                                                {       // checksum invalid
346
                                                {       // checksum invalid
345
                                                        rxd_buffer_locked = FALSE; // unlock rxd buffer
347
                                                        rxd_buffer_locked = FALSE; // unlock rxd buffer
346
                                                }  // eof checksum invalid
348
                                                }  // eof checksum invalid
347
                                                ptr_rxd_buffer = 0; // reset rxd buffer pointer
349
                                                ptr_rxd_buffer = 0; // reset rxd buffer pointer
348
                                        } // eof termination character received
350
                                        } // eof termination character received
349
                                } // rxd buffer not full
351
                                } // rxd buffer not full
350
                                else // rxd buffer overrun
352
                                else // rxd buffer overrun
351
                                {
353
                                {
352
                                        ptr_rxd_buffer = 0; // reset rxd buffer pointer
354
                                        ptr_rxd_buffer = 0; // reset rxd buffer pointer
353
                                        rxd_buffer_locked = FALSE; // unlock rxd buffer
355
                                        rxd_buffer_locked = FALSE; // unlock rxd buffer
354
                                } // eof rxd buffer overrrun
356
                                } // eof rxd buffer overrrun
355
                        } // some byes in the fifo and rxd buffer not locked
357
                        } // some byes in the fifo and rxd buffer not locked
356
                } // eof DebugUart = UART1
358
                } // eof DebugUart = UART1
357
        }
359
        }
358
}
360
}
359
 
361
 
360
/**************************************************************/
362
/**************************************************************/
361
/*         Transmit tx buffer via debug uart                  */
363
/*         Transmit tx buffer via debug uart                  */
362
/**************************************************************/
364
/**************************************************************/
363
void UART1_Transmit(void)
365
void UART1_Transmit(void)
364
{
366
{
365
        u8 tmp_tx;
367
        u8 tmp_tx;
366
        // if something has to be send and the txd fifo is not full
368
        // if something has to be send and the txd fifo is not full
367
        if((!txd_complete) && (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) == RESET))
369
        if((!txd_complete) && (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) == RESET))
368
        {
370
        {
369
                tmp_tx = txd_buffer[ptr_txd_buffer]; // read byte from txd buffer
371
                tmp_tx = txd_buffer[ptr_txd_buffer]; // read byte from txd buffer
370
                // if terminating character or end of txd buffer reached
372
                // if terminating character or end of txd buffer reached
371
                if((tmp_tx == '\r') || (ptr_txd_buffer == TXD_BUFFER_LEN))
373
                if((tmp_tx == '\r') || (ptr_txd_buffer == TXD_BUFFER_LEN))
372
                {
374
                {
373
                        ptr_txd_buffer = 0;     // reset txd buffer pointer
375
                        ptr_txd_buffer = 0;     // reset txd buffer pointer
374
                        txd_complete = TRUE;// set complete flag
376
                        txd_complete = TRUE;// set complete flag
375
                }
377
                }
376
                UART_SendData(UART1, tmp_tx); // put character to txd fifo
378
                UART_SendData(UART1, tmp_tx); // put character to txd fifo
377
                // set pointer to next byte
379
                // set pointer to next byte
378
                ptr_txd_buffer++;
380
                ptr_txd_buffer++;
379
        }
381
        }
380
}
382
}
381
 
383
 
382
/**************************************************************/
384
/**************************************************************/
383
/* Add CRC and initiate transmission via debug uart           */
385
/* Add CRC and initiate transmission via debug uart           */
384
/**************************************************************/
386
/**************************************************************/
385
void AddCRC(u16 datalen)
387
void AddCRC(u16 datalen)
386
{
388
{
387
        u16 tmpCRC = 0, i;
389
        u16 tmpCRC = 0, i;
388
        for(i = 0; i < datalen; i++)
390
        for(i = 0; i < datalen; i++)
389
        {
391
        {
390
                tmpCRC += txd_buffer[i];
392
                tmpCRC += txd_buffer[i];
391
        }
393
        }
392
        tmpCRC %= 4096;
394
        tmpCRC %= 4096;
393
        txd_buffer[i++] = '=' + tmpCRC / 64;
395
        txd_buffer[i++] = '=' + tmpCRC / 64;
394
        txd_buffer[i++] = '=' + tmpCRC % 64;
396
        txd_buffer[i++] = '=' + tmpCRC % 64;
395
        txd_buffer[i++] = '\r';
397
        txd_buffer[i++] = '\r';
396
 
398
 
397
        ptr_txd_buffer = 0;
399
        ptr_txd_buffer = 0;
398
        txd_complete = FALSE;
400
        txd_complete = FALSE;
399
        UART_SendData(UART1, txd_buffer[ptr_txd_buffer++]);     // send first byte, to be continued in the txd irq
401
        UART_SendData(UART1, txd_buffer[ptr_txd_buffer++]);     // send first byte, to be continued in the txd irq
400
}
402
}
401
 
403
 
402
 
404
 
403
 
405
 
404
/**************************************************************/
406
/**************************************************************/
405
/* Code output data                                           */
407
/* Code output data                                           */
406
/**************************************************************/
408
/**************************************************************/
407
void SendOutData(u8 cmd, u8 Address, u8 numofbuffers , ...) //u8 *data, u8 len, ....
409
void SendOutData(u8 cmd, u8 Address, u8 numofbuffers , ...) //u8 *data, u8 len, ....
408
{
410
{
409
        va_list ap;
411
        va_list ap;
410
 
412
 
411
        u16 pt = 0;
413
        u16 pt = 0;
412
        u8 a,b,c;
414
        u8 a,b,c;
413
        u8 ptr = 0;
415
        u8 ptr = 0;
414
 
416
 
415
        u8* pdata = NULL;
417
        u8* pdata = NULL;
416
        int len = 0;
418
        int len = 0;
417
 
419
 
418
        txd_buffer[pt++] = '#';                         // Start character
420
        txd_buffer[pt++] = '#';                         // Start character
419
        txd_buffer[pt++] = 'a' + Address;       // Address (a=0; b=1,...)
421
        txd_buffer[pt++] = 'a' + Address;       // Address (a=0; b=1,...)
420
        txd_buffer[pt++] = cmd;                         // Command
422
        txd_buffer[pt++] = cmd;                         // Command
421
 
423
 
422
        va_start(ap, numofbuffers);
424
        va_start(ap, numofbuffers);
423
        if(numofbuffers)
425
        if(numofbuffers)
424
        {
426
        {
425
                pdata = va_arg(ap, u8*);
427
                pdata = va_arg(ap, u8*);
426
                len = va_arg(ap, int);
428
                len = va_arg(ap, int);
427
                ptr = 0;
429
                ptr = 0;
428
                numofbuffers--;
430
                numofbuffers--;
429
        }
431
        }
430
        while(len)
432
        while(len)
431
        {
433
        {
432
                if(len)
434
                if(len)
433
                {
435
                {
434
                        a = pdata[ptr++];
436
                        a = pdata[ptr++];
435
                        len--;
437
                        len--;
436
                        if((!len) && numofbuffers) // try to jump to next buffer
438
                        if((!len) && numofbuffers) // try to jump to next buffer
437
                        {
439
                        {
438
                                pdata = va_arg(ap, u8*);
440
                                pdata = va_arg(ap, u8*);
439
                                len = va_arg(ap, int);
441
                                len = va_arg(ap, int);
440
                                ptr = 0;
442
                                ptr = 0;
441
                                numofbuffers--;
443
                                numofbuffers--;
442
                        }
444
                        }
443
                }
445
                }
444
                else a = 0;
446
                else a = 0;
445
                if(len)
447
                if(len)
446
                {
448
                {
447
                        b = pdata[ptr++];
449
                        b = pdata[ptr++];
448
                        len--;
450
                        len--;
449
                        if((!len) && numofbuffers) // try to jump to next buffer
451
                        if((!len) && numofbuffers) // try to jump to next buffer
450
                        {
452
                        {
451
                                pdata = va_arg(ap, u8*);
453
                                pdata = va_arg(ap, u8*);
452
                                len = va_arg(ap, int);
454
                                len = va_arg(ap, int);
453
                                ptr = 0;
455
                                ptr = 0;
454
                                numofbuffers--;
456
                                numofbuffers--;
455
                        }
457
                        }
456
                }
458
                }
457
                else b = 0;
459
                else b = 0;
458
                if(len)
460
                if(len)
459
                {
461
                {
460
                        c = pdata[ptr++];
462
                        c = pdata[ptr++];
461
                        len--;
463
                        len--;
462
                        if((!len) && numofbuffers) // try to jump to next buffer
464
                        if((!len) && numofbuffers) // try to jump to next buffer
463
                        {
465
                        {
464
                                pdata = va_arg(ap, u8*);
466
                                pdata = va_arg(ap, u8*);
465
                                len = va_arg(ap, int);
467
                                len = va_arg(ap, int);
466
                                ptr = 0;
468
                                ptr = 0;
467
                                numofbuffers--;
469
                                numofbuffers--;
468
                        }
470
                        }
469
                }
471
                }
470
                else c = 0;
472
                else c = 0;
471
                txd_buffer[pt++] = '=' + (a >> 2);
473
                txd_buffer[pt++] = '=' + (a >> 2);
472
                txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
474
                txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
473
                txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
475
                txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
474
                txd_buffer[pt++] = '=' + ( c & 0x3f);
476
                txd_buffer[pt++] = '=' + ( c & 0x3f);
475
        }
477
        }
476
        va_end(ap);
478
        va_end(ap);
477
        AddCRC(pt);     // add checksum after data block and initates the transmission
479
        AddCRC(pt);     // add checksum after data block and initates the transmission
478
}
480
}
479
 
481
 
480
 
482
 
481
/**************************************************************/
483
/**************************************************************/
482
/* Decode data                                                */
484
/* Decode data                                                */
483
/**************************************************************/
485
/**************************************************************/
484
void Decode64(void)
486
void Decode64(void)
485
{
487
{
486
        u8 a,b,c,d;
488
        u8 a,b,c,d;
487
        u8 x,y,z;
489
        u8 x,y,z;
488
        u8 ptrIn = 3; // start with first data byte in rx buffer
490
        u8 ptrIn = 3; // start with first data byte in rx buffer
489
        u8 ptrOut = 3;
491
        u8 ptrOut = 3;
490
        u8 len = ReceivedBytes - 6;      // must be a multiple of 4 (3 bytes at begin and 3 bytes at end are no payload )
492
        u8 len = ReceivedBytes - 6;      // must be a multiple of 4 (3 bytes at begin and 3 bytes at end are no payload )
491
        while(len)
493
        while(len)
492
        {
494
        {
493
                a = rxd_buffer[ptrIn++] - '=';
495
                a = rxd_buffer[ptrIn++] - '=';
494
                b = rxd_buffer[ptrIn++] - '=';
496
                b = rxd_buffer[ptrIn++] - '=';
495
                c = rxd_buffer[ptrIn++] - '=';
497
                c = rxd_buffer[ptrIn++] - '=';
496
                d = rxd_buffer[ptrIn++] - '=';
498
                d = rxd_buffer[ptrIn++] - '=';
497
                //if(ptrIn > ReceivedBytes - 3) break;
499
                //if(ptrIn > ReceivedBytes - 3) break;
498
 
500
 
499
                x = (a << 2) | (b >> 4);
501
                x = (a << 2) | (b >> 4);
500
                y = ((b & 0x0f) << 4) | (c >> 2);
502
                y = ((b & 0x0f) << 4) | (c >> 2);
501
                z = ((c & 0x03) << 6) | d;
503
                z = ((c & 0x03) << 6) | d;
502
 
504
 
503
                if(len--) rxd_buffer[ptrOut++] = x; else break;
505
                if(len--) rxd_buffer[ptrOut++] = x; else break;
504
                if(len--) rxd_buffer[ptrOut++] = y; else break;
506
                if(len--) rxd_buffer[ptrOut++] = y; else break;
505
                if(len--) rxd_buffer[ptrOut++] = z; else break;
507
                if(len--) rxd_buffer[ptrOut++] = z; else break;
506
        }
508
        }
507
        pRxData = &rxd_buffer[3];
509
        pRxData = &rxd_buffer[3];
508
        RxDataLen = ptrOut - 3;
510
        RxDataLen = ptrOut - 3;
509
}
511
}
510
 
512
 
511
/**************************************************************/
513
/**************************************************************/
512
/* Process incomming data from debug uart                     */
514
/* Process incomming data from debug uart                     */
513
/**************************************************************/
515
/**************************************************************/
514
void UART1_ProcessRxData(void)
516
void UART1_ProcessRxData(void)
515
{
517
{
516
        // if data in the rxd buffer are not locked immediately return
518
        // if data in the rxd buffer are not locked immediately return
517
        if((!rxd_buffer_locked) || (DebugUART != UART1) ) return;
519
        if((!rxd_buffer_locked) || (DebugUART != UART1) ) return;
518
        Waypoint_t * pWaypoint = NULL;
520
        Waypoint_t * pWaypoint = NULL;
519
 
521
 
520
 
522
 
521
 
523
 
522
        PcAccess = 255;
524
        PcAccess = 255;
523
        Decode64(); // decode data block in rxd buffer
525
        Decode64(); // decode data block in rxd buffer
524
        switch(rxd_buffer[1] - 'a') // check for Slave Address
526
        switch(rxd_buffer[1] - 'a') // check for Slave Address
525
        {
527
        {
526
                case NC_ADDRESS:  // own Slave Address
528
                case NC_ADDRESS:  // own Slave Address
527
 
529
 
528
                switch(rxd_buffer[2])
530
                switch(rxd_buffer[2])
529
                {
531
                {
530
                        case 'e': // request for the text of the error status
532
                        case 'e': // request for the text of the error status
531
                                Request_ErrorMessage = TRUE;
533
                                Request_ErrorMessage = TRUE;
532
                                break;
534
                                break;
533
 
535
 
534
                        case 'o': // request for navigation information
536
                        case 'o': // request for navigation information
535
                                NaviData_Interval = (u32) pRxData[0] * 10;
537
                                NaviData_Interval = (u32) pRxData[0] * 10;
536
                                if(NaviData_Interval > 0) Request_NaviData = TRUE;
538
                                if(NaviData_Interval > 0) Request_NaviData = TRUE;
537
                                break;
539
                                break;
538
 
540
 
539
                        case 's'://  new target position
541
                        case 's'://  new target position
540
                                pWaypoint = (Waypoint_t*)&pRxData[0];
542
                                pWaypoint = (Waypoint_t*)&pRxData[0];
541
                                BeepTime = 300;
543
                                BeepTime = 300;
542
                                if(pWaypoint->Position.Status == NEWDATA)
544
                                if(pWaypoint->Position.Status == NEWDATA)
543
                                {
545
                                {
544
                                        WPList_Clear(); // empty WPList
546
                                        WPList_Clear(); // empty WPList
545
                                        WPList_Append(pWaypoint);
547
                                        WPList_Append(pWaypoint);
546
                                        GPS_pWaypoint = WPList_Begin();
548
                                        GPS_pWaypoint = WPList_Begin();
547
                                }
549
                                }
548
                                break;
550
                                break;
549
 
551
 
550
                        case 'u': // redirect debug uart
552
                        case 'u': // redirect debug uart
551
                                switch(pRxData[0])
553
                                switch(pRxData[0])
552
                                {
554
                                {
553
                                        case UART_FLIGHTCTRL:
555
                                        case UART_FLIGHTCTRL:
554
                                                UART2_Init();                           // initialize UART2 to FC pins
556
                                                UART2_Init();                           // initialize UART2 to FC pins
555
                                                DebugUART = UART2;
557
                                                DebugUART = UART2;
556
                                                break;
558
                                                break;
557
                                        case UART_MK3MAG:
559
                                        case UART_MK3MAG:
558
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
560
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
559
                                                UART0_Connect_to_MK3MAG();      // mux UART0 to MK3MAG pins
561
                                                UART0_Connect_to_MK3MAG();      // mux UART0 to MK3MAG pins
560
                                                GPSData.Status = INVALID;
562
                                                GPSData.Status = INVALID;
561
                                                DebugUART = UART0;
563
                                                DebugUART = UART0;
562
                                                break;
564
                                                break;
563
                                        case UART_MKGPS:
565
                                        case UART_MKGPS:
564
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
566
                                                if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
565
                                                UART0_Connect_to_MKGPS();       // connect UART0 to MKGPS pins
567
                                                UART0_Connect_to_MKGPS();       // connect UART0 to MKGPS pins
566
                                                GPSData.Status = INVALID;
568
                                                GPSData.Status = INVALID;
567
                                                DebugUART = UART0;
569
                                                DebugUART = UART0;
568
                                                break;
570
                                                break;
569
                                }
571
                                }
570
                                break;
572
                                break;
571
 
573
 
572
                        case 'w'://  new PCPosition for GPSTargetList
574
                        case 'w'://  new PCPosition for GPSTargetList
573
                                pWaypoint = (Waypoint_t*)&pRxData[0];
575
                                pWaypoint = (Waypoint_t*)&pRxData[0];
574
                                if(pWaypoint->Position.Status == INVALID)
576
                                if(pWaypoint->Position.Status == INVALID)
575
                                {  // clear WP List
577
                                {  // clear WP List
576
                                        WPList_Clear();
578
                                        WPList_Clear();
577
                                        GPS_pWaypoint = WPList_Begin();
579
                                        GPS_pWaypoint = WPList_Begin();
578
                                        //SerialPutString("\r\nClear WP List\r\n");
580
                                        //SerialPutString("\r\nClear WP List\r\n");
579
                                }
581
                                }
580
                                else if (pWaypoint->Position.Status == NEWDATA)
582
                                else if (pWaypoint->Position.Status == NEWDATA)
581
                                {  // app current WP to the list
583
                                {  // app current WP to the list
582
                                        WPList_Append(pWaypoint);
584
                                        WPList_Append(pWaypoint);
583
                                        BeepTime = 500;
585
                                        BeepTime = 500;
584
                                        //SerialPutString("\r\nAdd WP to List\r\n");
586
                                        //SerialPutString("\r\nAdd WP to List\r\n");
585
                                }
587
                                }
586
                                Request_NewWaypoint = TRUE;
588
                                Request_NewWaypoint = TRUE;
587
                                break;
589
                                break;
588
 
590
 
589
                        default:
591
                        default:
590
                                // unsupported command recieved
592
                                // unsupported command recieved
591
                                break;
593
                                break;
592
                } // case NC_ADDRESS
594
                } // case NC_ADDRESS
593
 
595
 
594
 
596
 
595
                default:  // and any other Slave Address
597
                default:  // and any other Slave Address
596
 
598
 
597
                switch(rxd_buffer[2]) // check CmdID
599
                switch(rxd_buffer[2]) // check CmdID
598
                {
600
                {
599
                        case 'a':// request for the labels of the analog debug outputs
601
                        case 'a':// request for the labels of the analog debug outputs
600
                                Request_DebugLabel = pRxData[0];
602
                                Request_DebugLabel = pRxData[0];
601
                                if(Request_DebugLabel > 31) Request_DebugLabel = 31;
603
                                if(Request_DebugLabel > 31) Request_DebugLabel = 31;
602
                                break;
604
                                break;
603
 
605
 
604
                        case 'b': // submit extern control
606
                        case 'b': // submit extern control
605
                                memcpy(&ExternControl, (u8*)&pRxData[0], sizeof(ExternControl));
607
                                memcpy(&ExternControl, (u8*)&pRxData[0], sizeof(ExternControl));
606
                                ConfirmFrame = ExternControl.Frame;
608
                                ConfirmFrame = ExternControl.Frame;
607
                                break;
609
                                break;
-
 
610
 
-
 
611
                        case 'c': // request for debug data;
-
 
612
                                Intervall3D = (u32) pRxData[0] * 10;
-
 
613
                                if(Intervall3D > 0) Request_3DData = TRUE;
-
 
614
                                break;
608
 
615
 
609
                        case 'd': // request for debug data;
616
                        case 'd': // request for debug data;
610
                                DebugData_Interval = (u32) pRxData[0] * 10;
617
                                DebugData_Interval = (u32) pRxData[0] * 10;
611
                                if(DebugData_Interval > 0) Request_DebugData = TRUE;
618
                                if(DebugData_Interval > 0) Request_DebugData = TRUE;
612
                                break;
619
                                break;
613
 
620
 
614
                        case 'g':// request for external control data
621
                        case 'g':// request for external control data
615
                                Request_ExternalControl = TRUE;
622
                                Request_ExternalControl = TRUE;
616
                                break;
623
                                break;
617
 
624
 
618
                        case 'h':// reqest for display line
625
                        case 'h':// reqest for display line
619
                                RemoteKeys |= pRxData[0];
626
                                RemoteKeys |= pRxData[0];
620
                                if(RemoteKeys != 0) DisplayLine = 0;
627
                                if(RemoteKeys != 0) DisplayLine = 0;
621
                                Request_Display = TRUE;
628
                                Request_Display = TRUE;
622
                                break;
629
                                break;
623
 
630
 
624
                        case 'l':// reqest for display columns
631
                        case 'l':// reqest for display columns
625
                                MenuItem = pRxData[0];
632
                                MenuItem = pRxData[0];
626
                                Request_Display1 = TRUE;
633
                                Request_Display1 = TRUE;
627
                                break;
634
                                break;
628
                        case 'v': // request for version info
635
                        case 'v': // request for version info
629
                                Request_VerInfo = TRUE;
636
                                Request_VerInfo = TRUE;
630
                                break;
637
                                break;
631
                        default:
638
                        default:
632
                                // unsupported command recieved
639
                                // unsupported command recieved
633
                                break;
640
                                break;
634
                }
641
                }
635
                break; // default:
642
                break; // default:
636
        }
643
        }
637
        // unlock the rxd buffer after processing
644
        // unlock the rxd buffer after processing
638
        pRxData = NULL;
645
        pRxData = NULL;
639
        RxDataLen = 0;
646
        RxDataLen = 0;
640
        rxd_buffer_locked = FALSE;
647
        rxd_buffer_locked = FALSE;
641
}
648
}
642
 
649
 
643
 
650
 
644
/*****************************************************/
651
/*****************************************************/
645
/*                   Send a character                */
652
/*                   Send a character                */
646
/*****************************************************/
653
/*****************************************************/
647
s16 uart_putchar (char c)
654
s16 uart_putchar (char c)
648
{
655
{
649
        if (c == '\n') uart_putchar('\r');
656
        if (c == '\n') uart_putchar('\r');
650
        // wait until txd fifo is not full
657
        // wait until txd fifo is not full
651
        while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
658
        while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
652
        // transmit byte
659
        // transmit byte
653
        UART_SendData(UART1, c);
660
        UART_SendData(UART1, c);
654
        return (0);
661
        return (0);
655
}
662
}
656
 
663
 
657
/*****************************************************/
664
/*****************************************************/
658
/*       Send a string to the debug uart              */
665
/*       Send a string to the debug uart              */
659
/*****************************************************/
666
/*****************************************************/
660
void SerialPutString(u8 *s)
667
void SerialPutString(u8 *s)
661
{
668
{
662
        if(s == NULL) return;
669
        if(s == NULL) return;
663
        while (*s != '\0' && DebugUART == UART1)
670
        while (*s != '\0' && DebugUART == UART1)
664
        {
671
        {
665
                uart_putchar(*s);
672
                uart_putchar(*s);
666
                s ++;
673
                s ++;
667
        }
674
        }
668
}
675
}
669
 
676
 
670
 
677
 
671
 
678
 
672
/**************************************************************/
679
/**************************************************************/
673
/* Send the answers to incomming commands at the debug uart   */
680
/* Send the answers to incomming commands at the debug uart   */
674
/**************************************************************/
681
/**************************************************************/
675
void UART1_TransmitTxData(void)
682
void UART1_TransmitTxData(void)
676
{
683
{
677
        if(!txd_complete || (DebugUART != UART1) ) return;
684
        if(!txd_complete || (DebugUART != UART1) ) return;
678
 
685
 
679
        if(Request_DebugLabel != 0xFF)
686
        if(Request_DebugLabel != 0xFF)
680
        {
687
        {
681
                SendOutData('A', NC_ADDRESS, 2, &Request_DebugLabel, sizeof(Request_DebugLabel), (u8 *) ANALOG_LABEL[Request_DebugLabel], 16);
688
                SendOutData('A', NC_ADDRESS, 2, &Request_DebugLabel, sizeof(Request_DebugLabel), (u8 *) ANALOG_LABEL[Request_DebugLabel], 16);
682
                Request_DebugLabel = 0xFF;
689
                Request_DebugLabel = 0xFF;
683
        }
690
        }
684
        if(ConfirmFrame && txd_complete)
691
        if(ConfirmFrame && txd_complete)
685
        {
692
        {
686
                SendOutData('B', NC_ADDRESS, 1, &ConfirmFrame, sizeof(ConfirmFrame));
693
                SendOutData('B', NC_ADDRESS, 1, &ConfirmFrame, sizeof(ConfirmFrame));
687
                ConfirmFrame = 0;
694
                ConfirmFrame = 0;
688
        }
695
        }
689
        if( ((DebugData_Interval>0 && CheckDelay(DebugData_Timer)) || Request_DebugData) && txd_complete)
696
        if( ((DebugData_Interval>0 && CheckDelay(DebugData_Timer)) || Request_DebugData) && txd_complete)
690
        {
697
        {
691
                SendOutData('D', NC_ADDRESS, 1,(u8 *)&DebugOut, sizeof(DebugOut));
698
                SendOutData('D', NC_ADDRESS, 1,(u8 *)&DebugOut, sizeof(DebugOut));
692
                DebugData_Timer = SetDelay(DebugData_Interval);
699
                DebugData_Timer = SetDelay(DebugData_Interval);
693
                Request_DebugData = FALSE;
700
                Request_DebugData = FALSE;
694
        }
701
        }
-
 
702
 
-
 
703
        if(((Intervall3D>0 && CheckDelay(Data3D_Timer)) || Request_3DData) && txd_complete)
-
 
704
        {
-
 
705
                SendOutData('C', NC_ADDRESS, 1,(u8 *)&Data3D, sizeof(Data3D));
-
 
706
                Data3D_Timer = SetDelay(Intervall3D);
-
 
707
                Request_3DData = FALSE;
-
 
708
        }
-
 
709
 
695
        if(Request_ExternalControl && txd_complete)
710
        if(Request_ExternalControl && txd_complete)
696
        {
711
        {
697
                SendOutData('G', NC_ADDRESS, 1, (u8 *)&ExternControl, sizeof(ExternControl));
712
                SendOutData('G', NC_ADDRESS, 1, (u8 *)&ExternControl, sizeof(ExternControl));
698
                Request_ExternalControl = FALSE;
713
                Request_ExternalControl = FALSE;
699
        }
714
        }
700
        if(Request_Display && txd_complete)
715
        if(Request_Display && txd_complete)
701
        {
716
        {
702
                LCD_PrintMenu();
717
                LCD_PrintMenu();
703
                SendOutData('H', NC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), (u8*)&DisplayBuff[DisplayLine * 20], 20);
718
                SendOutData('H', NC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), (u8*)&DisplayBuff[DisplayLine * 20], 20);
704
                DisplayLine++;
719
                DisplayLine++;
705
                if(DisplayLine >= 4) DisplayLine = 0;
720
                if(DisplayLine >= 4) DisplayLine = 0;
706
                Request_Display = FALSE;
721
                Request_Display = FALSE;
707
        }
722
        }
708
        if(Request_Display1 && txd_complete)
723
        if(Request_Display1 && txd_complete)
709
        {
724
        {
710
                LCD_PrintMenu();
725
                LCD_PrintMenu();
711
                SendOutData('L', NC_ADDRESS, 3, (u8*)&MenuItem, sizeof(MenuItem), (u8*)&MaxMenuItem, sizeof(MaxMenuItem),(u8*)DisplayBuff, sizeof(DisplayBuff));
726
                SendOutData('L', NC_ADDRESS, 3, (u8*)&MenuItem, sizeof(MenuItem), (u8*)&MaxMenuItem, sizeof(MaxMenuItem),(u8*)DisplayBuff, sizeof(DisplayBuff));
712
                Request_Display1 = FALSE;
727
                Request_Display1 = FALSE;
713
        }
728
        }
714
        if(Request_VerInfo && txd_complete)
729
        if(Request_VerInfo && txd_complete)
715
        {
730
        {
716
                SendOutData('V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo));
731
                SendOutData('V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo));
717
                Request_VerInfo = FALSE;
732
                Request_VerInfo = FALSE;
718
        }
733
        }
719
        if(( (NaviData_Interval && CheckDelay(NaviData_Timer) ) || Request_NaviData) && txd_complete)
734
        if(( (NaviData_Interval && CheckDelay(NaviData_Timer) ) || Request_NaviData) && txd_complete)
720
        {
735
        {
721
                NaviData.Errorcode = ErrorCode;
736
                NaviData.Errorcode = ErrorCode;
722
                SendOutData('O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));             
737
                SendOutData('O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));             
723
                if (DebugUART == UART1) SendOutData0('O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));      
738
                if (DebugUART == UART1) SendOutData0('O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));      
724
                NaviData_Timer = SetDelay(NaviData_Interval);
739
                NaviData_Timer = SetDelay(NaviData_Interval);
725
                Request_NaviData = FALSE;
740
                Request_NaviData = FALSE;
726
        }
741
        }
727
        if(Request_ErrorMessage && txd_complete)
742
        if(Request_ErrorMessage && txd_complete)
728
        {
743
        {
729
                SendOutData('E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG));
744
                SendOutData('E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG));
730
                Request_ErrorMessage = FALSE;
745
                Request_ErrorMessage = FALSE;
731
        }
746
        }
732
        if(Request_SendFollowMe && txd_complete && (GPSData.NumOfSats >= 4))              // sending for "Follow me"
747
        if(Request_SendFollowMe && txd_complete && (GPSData.NumOfSats >= 4))              // sending for "Follow me"
733
        {
748
        {
734
                GPS_CopyPosition(&(GPSData.Position),&(FollowMe.Position));
749
                GPS_CopyPosition(&(GPSData.Position),&(FollowMe.Position));
735
                FollowMe.Position.Status = NEWDATA;
750
                FollowMe.Position.Status = NEWDATA;
736
                FollowMe.Heading = -1;
751
                FollowMe.Heading = -1;
737
                FollowMe.ToleranceRadius = 1;
752
                FollowMe.ToleranceRadius = 1;
738
                FollowMe.HoldTime = 60;
753
                FollowMe.HoldTime = 60;
739
                FollowMe.Event_Flag = 0;
754
                FollowMe.Event_Flag = 0;
740
                FollowMe.reserve[0] = 0;                // reserve
755
                FollowMe.reserve[0] = 0;                // reserve
741
                FollowMe.reserve[1] = 0;                // reserve
756
                FollowMe.reserve[1] = 0;                // reserve
742
                FollowMe.reserve[2] = 0;                // reserve
757
                FollowMe.reserve[2] = 0;                // reserve
743
                FollowMe.reserve[3] = 0;                // reserve
758
                FollowMe.reserve[3] = 0;                // reserve
744
                SendOutData('s', NC_ADDRESS, 1, (u8 *)&FollowMe, sizeof(FollowMe));
759
                SendOutData('s', NC_ADDRESS, 1, (u8 *)&FollowMe, sizeof(FollowMe));
745
                Request_SendFollowMe = FALSE;
760
                Request_SendFollowMe = FALSE;
746
        }
761
        }
747
 
762
 
748
        if(Request_NewWaypoint && txd_complete)
763
        if(Request_NewWaypoint && txd_complete)
749
        {
764
        {
750
                u8 WPNumber = WPList_GetCount();
765
                u8 WPNumber = WPList_GetCount();
751
                SendOutData('W', NC_ADDRESS, 1, &WPNumber, sizeof(WPNumber));  
766
                SendOutData('W', NC_ADDRESS, 1, &WPNumber, sizeof(WPNumber));  
752
                Request_NewWaypoint = FALSE;
767
                Request_NewWaypoint = FALSE;
753
        }
768
        }
754
 
769
 
755
}
770
}
756
 
771
 
757
 
772