Rev 261 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
41 | ingob | 1 | /*#######################################################################################*/ |
2 | /* !!! THIS IS NOT FREE SOFTWARE !!! */ |
||
3 | /*#######################################################################################*/ |
||
4 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
5 | // + Copyright (c) 2008 Ingo Busker, Holger Buss |
||
171 | ingob | 6 | // + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
41 | ingob | 7 | // + FOR NON COMMERCIAL USE ONLY |
8 | // + www.MikroKopter.com |
||
9 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
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. |
||
12 | // + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
||
13 | // + bzgl. der Nutzungsbedingungen aufzunehmen. |
||
14 | // + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
||
15 | // + Verkauf von Luftbildaufnahmen, usw. |
||
16 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
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 |
||
19 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
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" |
||
22 | // + eindeutig als Ursprung verlinkt werden |
||
23 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
24 | // + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
||
25 | // + Benutzung auf eigene Gefahr |
||
26 | // + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
||
27 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
171 | ingob | 28 | // + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
41 | ingob | 29 | // + mit unserer Zustimmung zulässig |
30 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
31 | // + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
||
32 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
33 | // + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
||
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 |
||
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 |
||
38 | // + for non-commercial use (directly or indirectly) |
||
39 | // + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
||
40 | // + with our written permission |
||
41 | // + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
||
42 | // + clearly linked as origin |
||
171 | ingob | 43 | // + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
41 | ingob | 44 | // |
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 |
||
47 | // + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||
48 | // + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
||
49 | // + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||
50 | // + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||
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 |
||
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 |
||
55 | // + POSSIBILITY OF SUCH DAMAGE. |
||
56 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
110 | killagreg | 57 | #include <stdio.h> |
58 | #include <stdarg.h> |
||
116 | killagreg | 59 | #include <string.h> |
41 | ingob | 60 | #include "91x_lib.h" |
136 | killagreg | 61 | #include "config.h" |
110 | killagreg | 62 | #include "main.h" |
49 | ingob | 63 | #include "uart0.h" |
41 | ingob | 64 | #include "uart1.h" |
119 | killagreg | 65 | #include "timer1.h" |
41 | ingob | 66 | #include "ubx.h" |
110 | killagreg | 67 | #include "mkprotocol.h" |
41 | ingob | 68 | |
116 | killagreg | 69 | |
41 | ingob | 70 | //------------------------------------------------------------------------------------ |
71 | // global variables |
||
72 | |||
116 | killagreg | 73 | MKOSD_VersionInfo_t MKOSD_VersionInfo; |
74 | |||
41 | ingob | 75 | // UART0 MUXER |
76 | UART0_MuxerState_t UART0_Muxer = UART0_UNDEF; |
||
110 | killagreg | 77 | u16 Uart0Baudrate = UART0_BAUD_RATE; |
78 | u16 Uart0MK3MagBaudrate = UART0_BAUD_RATE; |
||
41 | ingob | 79 | |
110 | killagreg | 80 | // the tx buffer |
247 | killagreg | 81 | #define UART0_TX_BUFFER_LEN 150 |
110 | killagreg | 82 | u8 UART0_tbuffer[UART0_TX_BUFFER_LEN]; |
83 | Buffer_t UART0_tx_buffer; |
||
49 | ingob | 84 | |
110 | killagreg | 85 | // the rx buffer |
247 | killagreg | 86 | #define UART0_RX_BUFFER_LEN 150 |
110 | killagreg | 87 | u8 UART0_rbuffer[UART0_RX_BUFFER_LEN]; |
88 | Buffer_t UART0_rx_buffer; |
||
89 | |||
116 | killagreg | 90 | u8 UART0_Request_VersionInfo = FALSE; |
91 | u8 UART0_Request_NaviData = FALSE; |
||
117 | killagreg | 92 | u8 UART0_Request_ErrorMessage = FALSE; |
116 | killagreg | 93 | u32 UART0_NaviData_Timer; |
94 | u32 UART0_NaviData_Interval = 0; // in ms |
||
110 | killagreg | 95 | |
41 | ingob | 96 | //------------------------------------------------------------------------------------ |
97 | // functions |
||
98 | |||
99 | /********************************************************/ |
||
245 | killagreg | 100 | /* Configure uart 0 */ |
101 | /********************************************************/ |
||
102 | void UART0_Configure(u16 Baudrate) |
||
103 | { |
||
104 | UART_InitTypeDef UART_InitStructure; |
||
105 | |||
106 | SCU_APBPeriphClockConfig(__UART0, ENABLE); // Enable the UART0 Clock |
||
107 | |||
108 | /* UART0 configured as follow: |
||
109 | - Word Length = 8 Bits |
||
110 | - One Stop Bit |
||
111 | - No parity |
||
112 | - BaudRate taken from function argument |
||
113 | - Hardware flow control Disabled |
||
114 | - Receive and transmit enabled |
||
115 | - Receive and transmit FIFOs are Disabled |
||
116 | */ |
||
117 | UART_StructInit(&UART_InitStructure); |
||
118 | UART_InitStructure.UART_WordLength = UART_WordLength_8D; |
||
119 | UART_InitStructure.UART_StopBits = UART_StopBits_1; |
||
120 | UART_InitStructure.UART_Parity = UART_Parity_No ; |
||
121 | UART_InitStructure.UART_BaudRate = Baudrate; |
||
122 | UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None; |
||
123 | UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx; |
||
124 | UART_InitStructure.UART_FIFO = UART_FIFO_Enable; |
||
125 | UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2; |
||
126 | UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2; |
||
127 | |||
128 | UART_DeInit(UART0); // reset uart 0 to default |
||
129 | UART_Init(UART0, &UART_InitStructure); // initialize uart 0 |
||
130 | |||
131 | // enable uart 0 interrupts selective |
||
132 | UART_ITConfig(UART0, UART_IT_Receive | UART_IT_ReceiveTimeOut /*| UART_IT_FrameError*/, ENABLE); |
||
133 | UART_Cmd(UART0, ENABLE); // enable uart 0 |
||
134 | // configure the uart 0 interupt line |
||
135 | VIC_Config(UART0_ITLine, VIC_IRQ, PRIORITY_UART0); |
||
136 | // enable the uart 0 IRQ |
||
137 | VIC_ITCmd(UART0_ITLine, ENABLE); |
||
138 | } |
||
139 | |||
140 | /********************************************************/ |
||
41 | ingob | 141 | /* Connect RXD & TXD to GPS */ |
142 | /********************************************************/ |
||
245 | killagreg | 143 | void UART0_Connect_to_MKGPS(u16 Baudrate) |
41 | ingob | 144 | { |
145 | GPIO_InitTypeDef GPIO_InitStructure; |
||
146 | |||
147 | UART0_Muxer = UART0_UNDEF; |
||
148 | |||
149 | SCU_APBPeriphClockConfig(__GPIO6, ENABLE); // Enable the GPIO6 Clock |
||
150 | // unmap UART0 from Compass |
||
151 | // set port pin 5.1 (serial data from compass) to input and disconnect from IP |
||
152 | GPIO_StructInit(&GPIO_InitStructure); |
||
153 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
||
154 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; |
||
155 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
||
196 | killagreg | 156 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Disable; |
41 | ingob | 157 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
158 | GPIO_Init(GPIO5, &GPIO_InitStructure); |
||
159 | // set port pin 5.0 (serial data to compass) to input |
||
160 | GPIO_StructInit(&GPIO_InitStructure); |
||
161 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
||
162 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; |
||
163 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
||
196 | killagreg | 164 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Disable; |
41 | ingob | 165 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
166 | GPIO_Init(GPIO5, &GPIO_InitStructure); |
||
167 | // map UART0 to GPS |
||
168 | // set port pin 6.6 (serial data from gps) to input and connect to IP |
||
169 | GPIO_StructInit(&GPIO_InitStructure); |
||
170 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
||
171 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; |
||
172 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
||
196 | killagreg | 173 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Enable; |
41 | ingob | 174 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; //UART0_RxD |
175 | GPIO_Init(GPIO6, &GPIO_InitStructure); |
||
176 | // set port pin 6.7 (serial data to gps) to output |
||
177 | GPIO_StructInit(&GPIO_InitStructure); |
||
178 | GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; |
||
179 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; |
||
180 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
||
196 | killagreg | 181 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Enable; |
41 | ingob | 182 | GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3; //UART0_TX |
183 | GPIO_Init(GPIO6, &GPIO_InitStructure); |
||
245 | killagreg | 184 | // configure the UART0 |
185 | UART0_Configure(Baudrate); |
||
41 | ingob | 186 | |
187 | UART0_Muxer = UART0_MKGPS; |
||
188 | } |
||
189 | |||
190 | /********************************************************/ |
||
191 | /* Connect RXD & TXD to MK3MAG */ |
||
192 | /********************************************************/ |
||
193 | void UART0_Connect_to_MK3MAG(void) |
||
194 | { |
||
245 | killagreg | 195 | u16 Baudrate; |
196 | |||
41 | ingob | 197 | GPIO_InitTypeDef GPIO_InitStructure; |
198 | |||
199 | UART0_Muxer = UART0_UNDEF; |
||
200 | |||
201 | SCU_APBPeriphClockConfig(__GPIO5, ENABLE); |
||
202 | // unmap UART0 from GPS |
||
203 | // set port pin 6.6 (serial data from gps) to input and disconnect from IP |
||
204 | GPIO_StructInit(&GPIO_InitStructure); |
||
205 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
||
206 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; |
||
207 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
||
196 | killagreg | 208 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Disable; |
41 | ingob | 209 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
210 | GPIO_Init(GPIO6, &GPIO_InitStructure); |
||
211 | // set port pin 6.7 (serial data to gps) to input |
||
212 | GPIO_StructInit(&GPIO_InitStructure); |
||
213 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
||
214 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; |
||
215 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
||
196 | killagreg | 216 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Disable; |
41 | ingob | 217 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; |
218 | GPIO_Init(GPIO6, &GPIO_InitStructure); |
||
219 | |||
220 | // map UART0 to Compass |
||
221 | // set port pin 5.1 (serial data from compass) to input and connect to IP |
||
222 | GPIO_StructInit(&GPIO_InitStructure); |
||
223 | GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; |
||
224 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; |
||
225 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; |
||
196 | killagreg | 226 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Enable; |
41 | ingob | 227 | GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; //UART0_RxD |
228 | GPIO_Init(GPIO5, &GPIO_InitStructure); |
||
229 | // set port pin 5.0 (serial data to compass) to output |
||
230 | GPIO_StructInit(&GPIO_InitStructure); |
||
231 | GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; |
||
232 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; |
||
233 | GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; |
||
196 | killagreg | 234 | GPIO_InitStructure.GPIO_IPInputConnected = GPIO_IPInputConnected_Enable; |
41 | ingob | 235 | GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3; //UART0_TX |
236 | GPIO_Init(GPIO5, &GPIO_InitStructure); |
||
245 | killagreg | 237 | Baudrate = UART0_BAUD_RATE + ((UART0_BAUD_RATE * 2)/100); // MK3Mag baudrate is a little bit higher... |
238 | UART0_Configure(Baudrate); |
||
41 | ingob | 239 | UART0_Muxer = UART0_MK3MAG; |
240 | } |
||
241 | |||
242 | /********************************************************/ |
||
243 | /* Initialize UART0 */ |
||
244 | /********************************************************/ |
||
245 | void UART0_Init(void) |
||
246 | { |
||
110 | killagreg | 247 | UART1_PutString("\r\n UART0 init..."); |
41 | ingob | 248 | |
245 | killagreg | 249 | UART0_Connect_to_MKGPS(UART0_BAUD_RATE); |
41 | ingob | 250 | |
110 | killagreg | 251 | // initialize txd buffer |
112 | killagreg | 252 | Buffer_Init(&UART0_tx_buffer, UART0_tbuffer, UART0_TX_BUFFER_LEN); |
110 | killagreg | 253 | |
254 | // initialize rxd buffer |
||
112 | killagreg | 255 | Buffer_Init(&UART0_rx_buffer, UART0_rbuffer, UART0_RX_BUFFER_LEN); |
49 | ingob | 256 | |
110 | killagreg | 257 | UART1_PutString("ok"); |
49 | ingob | 258 | } |
259 | |||
41 | ingob | 260 | /********************************************************/ |
261 | /* UART0 Interrupt Handler */ |
||
262 | /********************************************************/ |
||
263 | void UART0_IRQHandler(void) |
||
264 | { |
||
265 | u8 c; |
||
136 | killagreg | 266 | // if receive irq (FIFO is over trigger level) or receive timeout irq (FIFO is not empty for longer times) has occured |
41 | ingob | 267 | if((UART_GetITStatus(UART0, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART0, UART_IT_ReceiveTimeOut) != RESET) ) |
268 | { |
||
269 | UART_ClearITPendingBit(UART0, UART_IT_Receive); // clear receive interrupt flag |
||
270 | UART_ClearITPendingBit(UART0, UART_IT_ReceiveTimeOut); // clear receive timeout interrupt flag |
||
271 | |||
272 | // if debug UART is UART0 |
||
273 | if (DebugUART == UART0) |
||
274 | { // forward received data to the UART1 tx buffer |
||
275 | while(UART_GetFlagStatus(UART0, UART_FLAG_RxFIFOEmpty) != SET) |
||
276 | { |
||
277 | // wait for space in the tx buffer of the UART1 |
||
278 | while(UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) == SET) {}; |
||
279 | // move the byte from the rx buffer of UART0 to the tx buffer of UART1 |
||
280 | UART_SendData(UART1, UART_ReceiveData(UART0)); |
||
281 | } |
||
282 | } |
||
283 | else // UART0 is not the DebugUART (normal operation) |
||
284 | { |
||
285 | // repeat until no byte is in the RxFIFO |
||
286 | while (UART_GetFlagStatus(UART0, UART_FLAG_RxFIFOEmpty) != SET) |
||
287 | { |
||
288 | c = UART_ReceiveData(UART0); // get byte from rx fifo |
||
289 | switch(UART0_Muxer) |
||
290 | { |
||
291 | case UART0_MKGPS: |
||
245 | killagreg | 292 | UBX_RxParser(c); // if connected to GPS forward byte to ubx parser |
110 | killagreg | 293 | MKProtocol_CollectSerialFrame(&UART0_rx_buffer, c); // ckeck for MK-Frames also |
41 | ingob | 294 | break; |
295 | case UART0_MK3MAG: |
||
296 | // ignore any byte send from MK3MAG |
||
297 | break; |
||
298 | case UART0_UNDEF: |
||
299 | default: |
||
300 | // ignore the byte from unknown source |
||
301 | break; |
||
302 | } // eof switch(UART0_Muxer) |
||
303 | } // eof while |
||
304 | } // eof UART0 is not the DebugUART |
||
305 | } // eof receive irq or receive timeout irq |
||
306 | } |
||
110 | killagreg | 307 | |
308 | /**************************************************************/ |
||
309 | /* Process incomming data from debug uart */ |
||
310 | /**************************************************************/ |
||
311 | void UART0_ProcessRxData(void) |
||
312 | { |
||
313 | SerialMsg_t SerialMsg; |
||
314 | // if data in the rxd buffer are not locked immediately return |
||
315 | if((UART0_rx_buffer.Locked == FALSE) || (DebugUART == UART0) ) return; |
||
316 | |||
190 | killagreg | 317 | MKProtocol_DecodeSerialFrameHeader(&UART0_rx_buffer, &SerialMsg); // decode serial frame in rxd buffer |
318 | MKProtocol_DecodeSerialFrameData(&UART0_rx_buffer, &SerialMsg); // decode serial frame in rxd buffer |
||
319 | |||
320 | switch(SerialMsg.Address) // check for Slave Address |
||
110 | killagreg | 321 | { |
116 | killagreg | 322 | case MKOSD_ADDRESS: // answers from the MKOSD |
190 | killagreg | 323 | switch(SerialMsg.CmdID) |
116 | killagreg | 324 | { |
325 | case 'V': |
||
326 | memcpy(&MKOSD_VersionInfo, SerialMsg.pData, sizeof(MKOSD_VersionInfo)); // copy echo pattern |
||
327 | break; |
||
328 | default: |
||
329 | break; |
||
330 | } // case MKOSD_ADDRESS |
||
331 | break; |
||
332 | |||
110 | killagreg | 333 | case NC_ADDRESS: // own Slave Address |
190 | killagreg | 334 | switch(SerialMsg.CmdID) |
116 | killagreg | 335 | { |
117 | killagreg | 336 | case 'e': // request for the text of the error status |
337 | UART0_Request_ErrorMessage = TRUE; |
||
338 | break; |
||
339 | case 'o': // request for navigation information |
||
340 | UART0_NaviData_Interval = (u32) SerialMsg.pData[0] * 10; |
||
341 | if(UART0_NaviData_Interval > 0) UART0_Request_NaviData = TRUE; |
||
342 | break; |
||
116 | killagreg | 343 | default: |
344 | break; |
||
345 | } // case NC_ADDRESS |
||
346 | // "break;" is missing here to fall thru to the common commands |
||
110 | killagreg | 347 | |
348 | default: // and any other Slave Address |
||
190 | killagreg | 349 | switch(SerialMsg.CmdID) // check CmdID |
116 | killagreg | 350 | { |
351 | case 'v': // request for version info |
||
352 | UART0_Request_VersionInfo = TRUE; |
||
353 | break; |
||
354 | default: |
||
355 | // unsupported command recieved |
||
356 | break; |
||
357 | } |
||
358 | break; // default: |
||
110 | killagreg | 359 | } |
112 | killagreg | 360 | Buffer_Clear(&UART0_rx_buffer); |
110 | killagreg | 361 | } |
362 | |||
363 | /**************************************************************/ |
||
364 | /* Transmit tx buffer via uart0 */ |
||
365 | /**************************************************************/ |
||
366 | void UART0_Transmit(void) |
||
367 | { |
||
368 | u8 tmp_tx; |
||
195 | killagreg | 369 | |
370 | IENABLE; |
||
371 | |||
110 | killagreg | 372 | if(DebugUART == UART0) return; // no data output if debug uart is rederected to UART0 |
373 | // if something has to be send and the txd fifo is not full |
||
374 | if((UART0_tx_buffer.Locked == TRUE) && (UART_GetFlagStatus(UART0, UART_FLAG_TxFIFOFull) == RESET)) |
||
375 | { |
||
376 | tmp_tx = UART0_tx_buffer.pData[UART0_tx_buffer.Position++]; // read next byte from txd buffer |
||
377 | UART_SendData(UART0, tmp_tx); // put character to txd fifo |
||
378 | // if terminating character or end of txd buffer reached |
||
379 | if((tmp_tx == '\r') || (UART0_tx_buffer.Position == UART0_tx_buffer.Size)) |
||
380 | { |
||
112 | killagreg | 381 | Buffer_Clear(&UART0_tx_buffer); |
110 | killagreg | 382 | } |
383 | } |
||
195 | killagreg | 384 | |
385 | IDISABLE; |
||
110 | killagreg | 386 | } |
387 | |||
388 | |||
389 | /**************************************************************/ |
||
390 | /* Send the answers to incomming commands at the uart0 */ |
||
391 | /**************************************************************/ |
||
392 | void UART0_TransmitTxData(void) |
||
393 | { |
||
394 | if(DebugUART == UART0) return; |
||
395 | UART0_Transmit(); // output pending bytes in tx buffer |
||
396 | if(UART0_tx_buffer.Locked == TRUE) return; |
||
397 | |||
151 | killagreg | 398 | else if(UART0_Request_ErrorMessage && (UART0_tx_buffer.Locked == FALSE)) |
117 | killagreg | 399 | { |
400 | MKProtocol_CreateSerialFrame(&UART0_tx_buffer, 'E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG)); |
||
401 | UART0_Request_ErrorMessage = FALSE; |
||
402 | } |
||
151 | killagreg | 403 | else if(UART0_Request_VersionInfo && (UART0_tx_buffer.Locked == FALSE)) |
116 | killagreg | 404 | { |
405 | MKProtocol_CreateSerialFrame(&UART0_tx_buffer, 'V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo)); |
||
406 | UART0_Request_VersionInfo = FALSE; |
||
407 | } |
||
151 | killagreg | 408 | else if(( ((UART0_NaviData_Interval >0) && CheckDelay(UART0_NaviData_Timer) ) || UART0_Request_NaviData) && (UART0_tx_buffer.Locked == FALSE)) |
110 | killagreg | 409 | { |
410 | NaviData.Errorcode = ErrorCode; |
||
411 | MKProtocol_CreateSerialFrame(&UART0_tx_buffer, 'O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData)); |
||
412 | UART0_NaviData_Timer = SetDelay(UART0_NaviData_Interval); |
||
413 | UART0_Request_NaviData = FALSE; |
||
414 | } |
||
415 | UART0_Transmit(); // output pending bytes in tx buffer |
||
416 | } |
||
116 | killagreg | 417 | |
418 | |||
419 | /**************************************************************/ |
||
420 | /* Get the version of the MKOSD */ |
||
421 | /**************************************************************/ |
||
247 | killagreg | 422 | u8 UART0_GetMKOSDVersion(void) |
116 | killagreg | 423 | { |
424 | u32 timeout; |
||
425 | u8 msg[64]; |
||
247 | killagreg | 426 | u8 retval = 0; |
116 | killagreg | 427 | |
428 | MKOSD_VersionInfo.SWMajor = 0xFF; |
||
429 | MKOSD_VersionInfo.SWMinor = 0xFF; |
||
430 | MKOSD_VersionInfo.SWPatch = 0xFF; |
||
431 | |||
245 | killagreg | 432 | if(UART0_Muxer != UART0_MKGPS) UART0_Connect_to_MKGPS(UART0_BAUD_RATE); |
116 | killagreg | 433 | while(UART0_tx_buffer.Locked == TRUE) UART0_Transmit(); // output pending bytes in tx buffer; |
434 | |||
435 | MKProtocol_CreateSerialFrame(&UART0_tx_buffer, 'v', MKOSD_ADDRESS, 0); // request for version info |
||
436 | while(UART0_tx_buffer.Locked == TRUE) UART0_Transmit(); // output pending bytes in tx buffer; |
||
437 | |||
438 | timeout = SetDelay(500); |
||
439 | do |
||
440 | { |
||
441 | UART0_ProcessRxData(); |
||
442 | if(MKOSD_VersionInfo.SWMajor != 0xFF) break; |
||
443 | }while(!CheckDelay(timeout)); |
||
444 | |||
445 | if(MKOSD_VersionInfo.SWMajor != 0xFF) |
||
446 | { |
||
447 | sprintf(msg, "\n\r MK-OSD V%d.%d%c", MKOSD_VersionInfo.SWMajor, MKOSD_VersionInfo.SWMinor, 'a'+MKOSD_VersionInfo.SWPatch); |
||
448 | UART1_PutString(msg); |
||
247 | killagreg | 449 | retval = 1; |
116 | killagreg | 450 | } |
247 | killagreg | 451 | //else UART1_PutString("\n\r No version information from MK-OSD."); |
452 | return(retval); |
||
116 | killagreg | 453 | } |
245 | killagreg | 454 | |
455 | /**************************************************************/ |
||
247 | killagreg | 456 | /* Send a message to the UBLOX device */ |
245 | killagreg | 457 | /**************************************************************/ |
247 | killagreg | 458 | u8 UART0_UBXSendMsg(u8* pData, u16 Len) |
245 | killagreg | 459 | { |
460 | u8 retval = 0; |
||
461 | // check for connection to GPS |
||
462 | if(UART0_Muxer != UART0_MKGPS) return(retval); |
||
463 | while(UART0_tx_buffer.Locked == TRUE) UART0_Transmit(); // output pending bytes in tx buffer; |
||
247 | killagreg | 464 | UBX_CreateMsg(&UART0_tx_buffer, pData, Len); // build ubx message frame |
245 | killagreg | 465 | while(UART0_tx_buffer.Locked == TRUE) UART0_Transmit(); // output pending bytes in tx buffer; |
247 | killagreg | 466 | return(1); |
467 | } |
||
468 | |||
469 | /**************************************************************/ |
||
470 | /* Send a configuration message to the UBLOX device */ |
||
471 | /**************************************************************/ |
||
472 | u8 UART0_UBXSendCFGMsg(u8* pData, u16 Len) |
||
473 | { |
||
474 | u32 timeout; |
||
475 | u8 retval = 0; |
||
476 | // if data are not a CFG MSG |
||
477 | if(pData[0]!= UBX_CLASS_CFG) return(retval); |
||
478 | // prepare rx msg filter |
||
479 | UbxMsg.Hdr.Class = UBX_CLASS_ACK; |
||
480 | UbxMsg.Hdr.Id = 0xFF; |
||
481 | UbxMsg.Hdr.Length = 0; |
||
482 | UbxMsg.ClassMask = 0xFF; |
||
483 | UbxMsg.IdMask = 0x00; |
||
484 | UbxMsg.Status = INVALID; |
||
485 | UART0_UBXSendMsg(pData, Len); |
||
486 | // check for acknowledge msg |
||
487 | timeout = SetDelay(100); |
||
245 | killagreg | 488 | do |
489 | { |
||
247 | killagreg | 490 | if(UbxMsg.Status == NEWDATA) break; |
245 | killagreg | 491 | }while(!CheckDelay(timeout)); |
247 | killagreg | 492 | if(UbxMsg.Status == NEWDATA) |
493 | { // 2 bytes payload |
||
494 | if((UbxMsg.Data[0] == pData[0]) && (UbxMsg.Data[1] == pData[1]) && (UbxMsg.Hdr.Length == 2)) retval = UbxMsg.Hdr.Id; |
||
495 | } |
||
496 | UbxMsg.Status = INVALID; |
||
497 | return(retval); |
||
498 | } |
||
499 | |||
500 | /**************************************************************/ |
||
501 | /* Get Version Info from UBX Module */ |
||
502 | /**************************************************************/ |
||
503 | u8 UART0_GetUBXVersion(void) |
||
504 | { |
||
505 | u32 timeout; |
||
506 | u8 retval = 0xFF; |
||
507 | u8 ubxmsg[]={0x0A, 0x04, 0x00, 0x00}; //MON-VER |
||
508 | // prepare rx msg filter |
||
509 | UbxMsg.Hdr.Class = 0x0A; |
||
510 | UbxMsg.Hdr.Id = 0x04; |
||
511 | UbxMsg.Hdr.Length = 0; |
||
512 | UbxMsg.ClassMask = 0xFF; |
||
513 | UbxMsg.IdMask = 0xFF; |
||
514 | UbxMsg.Status = INVALID; |
||
515 | UART0_UBXSendMsg(ubxmsg, sizeof(ubxmsg)); |
||
516 | // check for answer |
||
517 | timeout = SetDelay(100); |
||
518 | do |
||
245 | killagreg | 519 | { |
247 | killagreg | 520 | if(UbxMsg.Status == NEWDATA) break; |
521 | }while(!CheckDelay(timeout)); |
||
522 | if((UbxMsg.Hdr.Length >= 40) && (UbxMsg.Status == NEWDATA)) |
||
523 | { |
||
524 | UbxMsg.Data[4] = 0; //Only the fisrt 4 chsracters |
||
525 | UbxMsg.Data[39] = 0; |
||
526 | UART1_PutString(" V"); |
||
527 | UART1_PutString((u8*)&UbxMsg.Data); |
||
528 | UART1_PutString(" HW:"); |
||
529 | UART1_PutString((u8*)&UbxMsg.Data[30]); |
||
530 | retval = UbxMsg.Data[0]-'0'; // major sw version |
||
245 | killagreg | 531 | } |
247 | killagreg | 532 | UbxMsg.Status = INVALID; |
245 | killagreg | 533 | return(retval); |
534 | } |