Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2624 → Rev 2623

/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW1_2.c
0,0 → 1,132
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.2 sebseb7
 
 
#ifndef HAL_HW1_2_C_
#define HAL_HW1_2_C_
 
 
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
 
#include "usart.h"
#include "uart1.h"
#include "lcd.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRC |= (1<<DDC0)|(1<<DDC1)|(1<<DDC6)|(1<<DDC5)|(1<<DDC7);
DDRD |= (1<<DDD7);
DDRB = 0xFF;
 
set_LED1();
 
set_D_LIGHT();
Timer0_Init ();
Timer1_Init (); // pwm
Timer2_Init (); // Displaybeleuchtung
LCD_Init (0);
BeepTime = 500;
BeepMuster = 0x0080;
 
// _delay_ms(250);
 
clr_LED1();
Display_on = 1;
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
// I2C_Init(1);
sei ();
 
ReadParameter ();
LCD_Init (1);
OCR2A =LCD_Helligkeit*2.55;
#ifdef HWVERSION1_2W
if (WiIsSet==false)
InitWi232(); /* wenn Wi232 nicht initialisiert ist, dann jetzt tun*/
else
{
discoverWi232(); /* Wi232 suchen*/
_delay_ms(1000);
}
#endif
}
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
PORTC &= ~(1<<PORTC0);
PORTC &= ~(1<<PORTC1);
PORTD &= ~(1<<PORTD7);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
PORTC |= (1<<PORTC0);
PORTC |= (1<<PORTC1);
PORTD |= (1<<PORTD7);
}
 
 
 
#endif
#endif /* HAL_HW3_2_C_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW1_2.h
0,0 → 1,99
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.2 sebseb7
 
 
/* Belegung der Ports*/
/*Hardware 1.2 sebseb7 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Displaybeleuchtung PD7 Pin 16 LED an +
Displaybeleuchtung PC0 Pin 10 LED an +
Displaybeleuchtung PC1 Pin 20 LED an +
Summer PC6 Pin 25 Summer an GND
Wi232 PC7 Pin 26 Wi232 CMD Pin
 
*/
 
 
 
 
 
#ifndef HAL_HW1_2_H_
#define HAL_HW1_2_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define set_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define clr_LED1() (PORTC |= (1 << PC3))
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define clr_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define set_BEEP() (PORTC |= (1 << PC6))
 
#define set_WI232CMD() (PORTC &= ~(1 << PC7))
#define clr_WI232CMD() (PORTC |= (1 << PC7))
 
 
#define KEY_PIN PINA
 
#define KEY_ENTER PA7
#define KEY_ESC PA6
#define KEY_PLUS PA5
#define KEY_MINUS PA4
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus*/
 
void InitHWPorts(void);
 
#endif /* HAL_HW1_2_H_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW1_3.c
0,0 → 1,137
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.3 sebseb7
// * USB,LED
 
 
#ifndef HAL_HW1_3_C_
#define HAL_HW1_3_C_
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
 
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRD |= (1<<DDD7)|(1<<DDD6);
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC6)|(1<<DDC5)|(1<<DDC7); /* Leds,Summer*/
 
DDRB = 0xFF;
set_LED1();
 
BeepTime = 500;
BeepMuster = 0x0080;
 
set_D_LIGHT();
clr_WI232CMD();
_delay_ms(250);
 
clr_LED1();
 
 
Display_on = 1;
 
LCD_Init (0);
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); /* USB*/
uart1_putc('R');
// I2C_Init(1);
 
Timer0_Init ();
Timer1_Init (); // pwm
Timer2_Init (); // Displaybeleuchtung
sei ();
 
ReadParameter ();
LCD_Init (1);
OCR2A =LCD_Helligkeit*2.55;
// InitWi232();
#ifdef HWVERSION1_3W
if (WiIsSet==false)
InitWi232(); /* wenn Wi232 nicht initialisiert ist, dann jetzt tun*/
else
{
discoverWi232(); /* Wi232 suchen*/
_delay_ms(1000);
}
#endif
 
}
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
PORTD &= ~(1<<PORTD6);
PORTC &= ~(1<<PORTC2);
PORTD &= ~(1<<PORTD7);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
PORTD |= (1<<PORTD6);
PORTD |= (1<<PORTD7);
PORTC |= (1<<PORTC2);
}
 
 
#endif
#endif /* HAL_HW1_3_C_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW1_3.h
0,0 → 1,108
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.3 sebseb7
// * USB,LED
 
 
/*Hardware 1.3.1 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Bootlader LED PC3 Pin 22 LED an GND
Summer PC6 Pin 25 Summer an GND
Displaybeleuchtung PD6 Pin 15 LED an +
Displaybeleuchtung PD7 Pin 16 LED an +
Displaybeleuchtung PC2 Pin 21 LED an +
Wi232 PC7 Pin 26 Wi232 CMD Pin
 
 
*/
 
 
 
 
#ifndef HAL_HW1_3_H_
#define HAL_HW1_3_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define clr_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define set_LED1() (PORTC |= (1 << PC3))
 
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define clr_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define set_BEEP() (PORTC |= (1 << PC6))
 
 
#define set_WI232CMD() (PORTC &= ~(1 << PC7))
#define clr_WI232CMD() (PORTC |= (1 << PC7))
 
 
#define KEY_PIN PINA
 
 
#define KEY_ENTER PA7
#define KEY_ESC PA6
#define KEY_PLUS PA5
#define KEY_MINUS PA4
 
 
 
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus*/
 
 
void InitHWPorts(void);
void Port_USB2FC(void);
 
#endif /* HAL_HW1_3_H_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW3_1.c
0,0 → 1,122
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V3.2 Cebra
// * USB,Wi232,LED
 
 
#ifndef HAL_HW3_2_C_
#define HAL_HW3_2_C_
 
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#ifdef HWVERSION3_1
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRD |= (1<<DDD7)|(1<<DDD6);
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC7); /* Leds,Summer*/
 
DDRB = 0xFF;
set_LED1();
set_LED2();
set_LED3();
set_LED4();
 
BeepTime = 500;
BeepMuster = 0x0080;
 
set_D_LIGHT();
clr_WI232CMD();
_delay_ms(250);
 
clr_LED1();
clr_LED2();
clr_LED3();
clr_LED4();
 
Display_on = 1;
 
LCD_Init ();
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); /* USB*/
uart1_putc('R');
I2C_Init(1);
 
Timer0_Init ();
Timer1_Init (); // pwm
// TIMER2_Init(); //PWM Displaybeleuchtung
 
sei ();
 
ReadParameter ();
LCD_Init ();
InitWi232();
 
}
 
 
 
 
#endif
#endif /* HAL_HW3_2_C_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW3_1.h
0,0 → 1,108
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V3.2 Cebra
// * USB,Wi232,LED
 
 
/* Hardware 3.1 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Wi.232 CMD PD6 Pin 15 aktiv low
Displaybeleuchtung PD7 Pin 16 LED an +
I2C PC0 Pin 19
I2C PC1 Pin 20
LED2 PC2 Pin 21 LED an +
LED1 PC3 Pin 22 LED an +
Summer PC6 Pin 25 Summer an +
LED3 PB1 Pin 41 LED an +
LED4 PB0 Pin 40 LED an +
 
*/
#ifndef HAL_HW3_2_H_
#define HAL_HW3_2_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define set_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define clr_LED1() (PORTC |= (1 << PC3))
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define set_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define clr_BEEP() (PORTC |= (1 << PC6))
 
 
#define set_D_LIGHT() (PORTD |= (1 << PD7)) // Displaybeleuchtung
#define clr_D_LIGHT() (PORTD &= ~(1 << PD7))
#define set_WI232CMD() (PORTD &= ~(1 << PD6))
#define clr_WI232CMD() (PORTD |= (1 << PD6))
 
 
#define KEY_PIN PINA
 
//#if defined HWVERSION1_2 || defined HWVERSION1_3 || defined HWVERSION3_2
//#define KEY_ENTER PA7
//#define KEY_ESC PA6
//#define KEY_PLUS PA5
//#define KEY_MINUS PA4
//#endif
 
/*in der Hardwareversion sind die Tasten im Layout verdreht*/
#define KEY_ENTER PA4
#define KEY_ESC PA5
#define KEY_PLUS PA6
#define KEY_MINUS PA7
 
 
 
void InitHWPorts(void);
 
#endif /* HAL_HW3_2_H_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW3_9.c
0,0 → 1,196
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef HAL_HW3_9_C_
#define HAL_HW3_9_C_
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdbool.h>
#include "main.h"
#if defined HWVERSION3_9
#include "messages.h"
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
#include "uart1.h"
#include "bluetooth.h"
#include "error.h"
#include "connect.h"
#include "lipo.h"
#include "setup.h"
 
 
volatile uint8_t USBBT;
volatile uint8_t U02SV2;
 
 
//--------------------------------------------------------------
void InitHWPorts(void) // Initialisierung der Hardware für die jeweilige Leiterplattenversion
 
{
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7); // Enable Pull Up for the 4 keys
DDRA &= ~(1<<DDA4); // Eingang: A4 auf Low setzen (Power On)
 
DDRB = 0xFF; // Alles Ausgänge
 
PORTC |= (1<<PORTC4)|(1<<PORTC7); // Enable Pull Up for LBO + Summer
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC5)|(1<<DDC6)|(1<<DDC7); // Ausgang: Led2,Rs232Switch,Summer
DDRC &= ~(1<<DDC4); // Eingang: LowBat LTC1308
set_BTOn(); // Erstmal USB dektivieren, damit beim versehentlichen Einschalten USB im PC ruhig bleibt
 
PORTD |= (1<<PORTD6); // Wi232-CMD auf High schalten
DDRD |= (1<<DDD4)|(1<<DDD5)|(1<<DDD6)|(1<<DDD7); // Ausgang: PiepserTest, Servo, Wi232-CMD und Beleuchtung
 
set_V_On(); // Spannung mit T3 halten
 
Timer0_Init (); // system
Timer1_Init (); // pwm
Timer2_Init (); // display
 
 
Display_on = 1;
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); // USB
I2C_Init(1);
 
 
sei ();
 
LCD_Init (0); // muss vor "ReadParameter" stehen
ReadParameter (); // Aktuelle Werte aus EEProm auslesen
 
if (DisplayLanguage > NUM_LANG) // Beim ersten Start Sprache abfragen
{ DisplayLanguage = 1;
DisplayLanguage = Edit_Language(DisplayLanguage,0,3,DISPLAY3);
WriteParameter();
}
 
 
OCR2A = LCD_Helligkeit * 2.55;
LCD_Init (1);
BeepTime = 200;
BeepMuster = 0x0080;
ADC_Init(); // ADC für Lipomessung
// Power On Delay
// lcd_printp_at (2,2,PSTR("Taste 1 Sekunde"), 0);
// lcd_printp_at (2,3,PSTR("lang festhalten."), 0);
 
lcd_puts_at(0, 2, strGet(BOOT1), 0);
lcd_puts_at(0, 3, strGet(BOOT2), 0);
 
_delay_ms(800);
 
if (PINA & (1<<PINA7)) // Spannung eingeschaltet lassen
clr_V_On();
 
_delay_ms(100);
BeepTime = 500;
BeepMuster = 0x0080;
get_key_press(KEY_ALL);
 
lcd_cls();
 
if ((UseWi == true) && (WiIsSet == false))
{
InitWi232(); // wenn Wi232 nicht initialisiert ist, dann jetzt tun
}
 
lcd_cls();
set_USBOn(); // USB erstmal wieder einschalten
if ((UseBT == true) && (BTIsSet == false))
{
bt_init();
set_USBOn();
}
 
lcd_cls();
 
if ((UseWi == true) && (U02SV2 == 0))
{
Change_Output(Uart02Wi); // Verbindung zu Wi232 herstellen
if (PKT_StartInfo == true)
{
// lcd_printp_at (0, 0, PSTR("Verbindung zum MK ist"), 0);
// lcd_printp_at (0, 1, PSTR("auf Wi232 eingestellt"), 0);
lcd_puts_at(0, 0, strGet(BOOT_WI1), 0);
lcd_puts_at(0, 1, strGet(BOOT_WI2), 0);
_delay_ms(2000);
}
}
else
{
Change_Output(Uart02FC); // Verbindung zu SV" (Kabel) herstellen
if (PKT_StartInfo == true)
{
// lcd_printp_at (0, 0, PSTR("Verbindung zum MK ist"), 0);
// lcd_printp_at (0, 1, PSTR("auf Kabel eingestellt"), 0);
lcd_puts_at(0, 0, strGet(BOOT_WI1), 0);
lcd_puts_at(0, 1, strGet(BOOT_SV), 0);
_delay_ms(2000);
}
}
 
lcd_cls();
 
}
 
 
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
// PWM einschalten
TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1);
TCCR2B |= (1 << CS20);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
// PWM ausschalten
TCCR2A = 0;
TCCR2B = 0;
}
 
#endif
#endif // HAL_HW3_9_C_
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/HAL_HW3_9.h
0,0 → 1,139
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef HAL_HW3_9_H_
#define HAL_HW3_9_H_
 
 
 
//#define PIEPSER_NERVT // Summer zu Testzwecken ganz Ausschalten
 
 
// Hardware 3.9 Portbelegung
#define KEY_PIN PINA // Port A als Input
 
#define Touch0 PA0 // Pin 37
#define Touch1 PA1 // Pin 36
#define Touch2 PA2 // Pin 35
#define Touch3 PA3 // Pin 34
#define Key1 PA4 // Pin 33
#define Key2 PA5 // Pin 32
#define Key3 PA6 // Pin 31
#define Key4 PA7 // Pin 30
 
#define USB2Wi PB0 // Pin 40 aktiv low > IC5
#define VoltageHold PB1 // Pin 41 High = Spannung T3 halten
#define Display_Reset PB2 // Pin 42
#define Display_A0 PB3 // Pin 43
#define Display_CS PB4 // Pin 44
#define Display_SI PB5 // Pin 1
#define LED1 PB6 // Pin 2 Low = LED1 (nicht benutzbar wegen SCL
#define Display_SCL PB7 // Pin 3
 
#define I2C_SCL PC0 // Pin 19 SCL
#define I2C_CDA PC1 // Pin 20 SDA
#define USB2FC PC2 // Pin 21 aktiv low > IC5
#define USB_BT PC3 // Pin 22 high = USB, Low = Bluetooth, LED2
#define LowBat PC4 // Pin 23 Low Bat Warning Lipo PKT,Input
#define Uart02Wi PC5 // Pin 24 aktiv Low > IC4
#define Uart02FC PC6 // Pin 25 aktiv Low > IC4
#define Summer PC7 // Pin 26 Low = Summer
 
#define Uart0RxD PD0 // Pin 9 über IC4 =Wi | SV2
#define Uart0TxD PD1 // Pin 10 über IC4 =Wi | SV2
#define Uart1RxD PD2 // Pin 11 direkt = USB, BTM, über IC5 = Wi | SV2
#define Uart1TxD PD3 // Pin 12 direkt = USB, BTM, über IC5 = Wi | SV2
#define PiepserTest PD4 // Pin 13 CTC für Piepser
#define Servo PD5 // Pin 14 PWM für Servo
#define Wi232_CMD PD6 // Pin 15 aktiv Low = Wi232 CMD
#define Displaybeleuchtung PD7 // Pin 16 High = Display-LED
 
#define KEY_ENTER Key1
#define KEY_ESC Key2
#define KEY_PLUS Key3
#define KEY_MINUS Key4
 
 
 
// |= schaltet Ausgang auf HIGH
// &= ~ schaltet Ausgang auf LOW
 
#define set_reset() (PORTB |= (1 << Display_Reset))
#define clr_reset() (PORTB &= ~(1 << Display_Reset))
 
#define set_A0() (PORTB |= (1 << Display_A0))
#define clr_A0() (PORTB &= ~(1 << Display_A0))
 
#define set_cs() (PORTB |= (1 << Display_CS))
#define clr_cs() (PORTB &= ~(1 << Display_CS))
 
#define set_si() (PORTB |= (1 << Display_SI))
#define clr_si() (PORTB &= ~(1 << Display_SI))
 
#define set_scl() (PORTB |= (1 << Display_SCL))
#define clr_scl() (PORTB &= ~(1 << Display_SCL))
 
#define set_BTOn() (PORTC &= ~(1 << USB_BT)) // Bluetooth ein
 
#define set_USBOn() (PORTC |= (1 << USB_BT)) // USB ein
 
#define clr_V_On() (PORTB &= ~(1 << VoltageHold)) // Spannung mit T3 halten
#define set_V_On() (PORTB |= (1 << VoltageHold))
 
#define set_USB2FC() (PORTC &= ~(1 << USB2FC)) // USB mit FC-Kabel verbinden
#define clr_USB2FC() (PORTC |= (1 << USB2FC))
 
#define set_USB2Wi() (PORTB &= ~(1 << USB2Wi)) // USB mit Wi232 verbinden
#define clr_USB2Wi() (PORTB |= (1 << USB2Wi))
 
#define set_Uart02FC() (PORTC &= ~(1 << Uart02FC)) // Uart0 mit FC-Kabel verbinden
#define clr_Uart02FC() (PORTC |= (1 << Uart02FC))
 
#define set_Uart02Wi() (PORTC &= ~(1 << Uart02Wi)) // Uart0 mit Wi232 verbinden
#define clr_Uart02Wi() (PORTC |= (1 << Uart02Wi))
 
#define set_BEEP() (PORTC &= ~(1 << Summer)) // Summer
#define clr_BEEP() (PORTC |= (1 << Summer))
 
#define set_WI232CMD() (PORTD &= ~(1 << Wi232_CMD)) // Wi232 Programmierpin
#define clr_WI232CMD() (PORTD |= (1 << Wi232_CMD))
 
 
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus */
void InitHWPorts(void);
 
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/Koptertool 3.9_1/GPL_PKT_V3_5_8a_FC086_HW3_9_atmega1284p.hex
0,0 → 1,5251
:100000000C9479240C94A1240C94A1240C94A12484
:100010000C94A1240C94A1240C94A1240C94A1244C
:100020000C94A1240C94A9810C94B4810C94A12467
:100030000C94A1240C94A1240C94A1240C94A1242C
:100040000C94D2820C94A1240C94A1240C94A1248D
:100050000C94A18A0C94A1240C94A1240C94A124A6
:100060000C94504C0C94A1240C9466860C94A124FE
:100070000C94C2890C94F2890C94A1240C94A124B0
:100080000C94A1240C94A1240C94A124502B542B47
:10009000582B5C2B602B752B792B7D2B812B272BE1
:1000A0003C2B402B442B482B4C2B382B852BA42B43
:1000B00005A84CCDB2D44EB93836A9020C50B9912E
:1000C0008688083CA6AAAA2ABE000000803F457880
:1000D0006974007374617274656E00756E64204D8E
:1000E000696B726F6B6F70746572746F6F6C0050B8
:1000F00043206D6974205553422076657262696EA3
:1001000064656E0057692E32333220746F20464387
:100110002000457869740050726F6772616D6D20C0
:100120007374617274656E0057692E3233320050F9
:1001300043206D6974205553422076657262696E62
:1001400064656E0057692E323332204B6F6E6669DC
:100150006775726174696F6E200057692E32333291
:10016000204E414B00576932333220496E69744545
:1001700072726F72202000576932333220496E69E3
:1001800074206F6B2E2E2E2E005769323332204989
:100190006E69744572726F722020002E002E002E40
:1001A000002E002E002E002E002E002E002E002EDF
:1001B000002E002E002E002E002E002E002E002ECF
:1001C00000496E697420576932333220776169744F
:1001D0002E2E2E2E0056657273696F6E3A006F6B6D
:1001E000202020202020202020202020202020200F
:1001F00020200052414D2073657420746F203537E4
:1002000036303020202020004572726F72207365D6
:10021000742052414D2020202020006F6B20202090
:100220002020202020202020202020202020004EC0
:10023000562D52414D2073657420746F203537362A
:100240003030004572726F7220736574204E562DE7
:1002500052414D0057692E32333220666F756E64FD
:1002600020323430300057692E32333220666F75B9
:100270006E642035373630300057692E32333220E5
:1002800053797461786572726F72202020006E6FEE
:100290002057692E32333220666F756E64090077FD
:1002A000697468203234303020426175640920203E
:1002B0002000776974682035373630302042617508
:1002C0006409007365617263682057692E323332A6
:1002D000204D6F64756C003030313200496E71759D
:1002E00069727920456E64000D0A00496E71756966
:1002F000727920526573756C74733A0D0A00455219
:10030000524F520D0A004F4B0D0A000D004154533D
:10031000310041544E3D004154523100415452305D
:100320000041544F31004154463F004154443D0088
:10033000415444300041544800415441004154006C
:100340004154453100415451300041544530004141
:100350005451310041544C340041545A30004154FE
:10036000503D002E0054696D65206F75742C4661F8
:10037000696C20746F20636F6E6E65637421004337
:100380004F4E4E45435400444953434F4E4E454310
:1003900054000D0A00425420696E697469616C69E9
:1003A00073696572656E2E2E004576616C75617499
:1003B000696F6E20283836384D487A29202000523F
:1003C0006164696F74726F6E69782057692E323379
:1003D00032445453004B6162656C20616E736368F4
:1003E0006C69657373656E2E202000504B54206538
:1003F000696E2067656B7265757A7465732020205D
:10040000005A7769736368656E204D4B2D555342D2
:1004100020756E642020004D4B2D55534220616E97
:1004200020504320616E7363686C2E200046432089
:100430003E204D4B2D555342203E2042544D2D32EF
:1004400032320042544D2D323232204B6F6E66698B
:10045000677572696572656E004552524F523A2057
:100460006E6F2064617461003F004643004E43009C
:100470004E43004643004552524F523A206E6F2081
:100480006461746100416E616C6F67204E616D65DF
:10049000733A200052656164696E67004665686C56
:1004A00065723A204B65696E6520446174656E0023
:1004B000464300204E6176692D4374726C20446976
:1004C00073706C6179202020004E430020466C69D7
:1004D0006768742D4374726C20446973706C617921
:1004E000200020200020446973706C617920202056
:1004F0002020202020202020202000464300204EC5
:100500006176692D4374726C20446973706C6179F3
:10051000202020004E430020466C696768742D43FC
:1005200074726C20446973706C6179200020200023
:1005300020446973706C61792020202020202020C5
:10054000202020202000464300204E6176692D4364
:1005500074726C20446973706C6179202020000DE6
:100560000A002E002E004F4B004E6575205374611B
:100570007274656E206D6974202020202020005048
:100580004B54204365627261200031323334005392
:1005900074616E64617264776572746520676573F7
:1005A00065747A740077657264656E2061756600A3
:1005B00020454550524F4D20506172616D65746504
:1005C0007220202020000000000000007815141583
:1005D0007800205554557800384544453800304956
:1005E000484930003C4140413C00384140217800BE
:1005F0007E1515150A000000000000000000000034
:1006000000000000000000000000000000001038A2
:100610005410101E000000000000101010101010E8
:100620001010107C101000000000000008140000E2
:1006300014081008040408100810202010080008EE
:100640001422410000412214080004027F02040029
:1006500010207F201000103854101010101010546B
:10066000381010181C1C1810081838381808000802
:100670001C3E7F00007F3E1C080006090909060099
:1006800006497D49060000000000000000002F0020
:100690000000000700070000147F147F1400242AC4
:1006A0006B2A120023130864620036495522500059
:1006B000000503000000001C224100000041221C34
:1006C000000014083E08140008083E080800005006
:1006D0003000000008080808080000606000000002
:1006E0002010080402003E5149453E0000427F4070
:1006F00000004261514946002141454B3100181428
:10070000127F10002745454539003C4A49493000D1
:10071000030171090700364949493600064949294C
:100720001E00003636000000005636000000081497
:100730002241000014141414140000412214080073
:10074000020151090600324979413E007E11111122
:100750007E007F49494936003E41414122007F41A8
:1007600041221C007F49494941007F0909090100D4
:100770003E4149497A007F0808087F0000417F41D7
:1007800000002040413F01007F08142241007F40CB
:10079000404040007F020C027F007F0408107F0071
:1007A0003E4141413E007F09090906003E41512179
:1007B0005E007F0919294600464949493100010177
:1007C0007F0101003F4040403F001F2040201F00AC
:1007D0003F4038403F006314081463000708700866
:1007E00007006151494543007F4141000000020478
:1007F000081020000041417F0000040201020400B3
:100800004040404040000001020400002054545485
:1008100078007F4844443800384444442000384439
:1008200044487F00385454541800087E09010200DF
:100830000C5252523E007F080404780000447D4070
:1008400000002040443D00007F102844000000418B
:100850007F4000007C04180478007C0804047800C1
:100860003844444438007C14141408000814141844
:100870007C007C0804040800485454542000043FC1
:10088000444020003C4040207C001C2040201C00B4
:100890003C4038403C004428102844000C50505044
:1008A0003C004464544C4400000836410000000001
:1008B0007F00000000413608000008082A1C0800DC
:1008C000081C2A0808006D002E002E006B6D2F6892
:1008D000002E00636D002020006F6B00200044009C
:1008E0006E6F0032440033440020002D0078005821
:1008F000004F00416C742020202020203A20004C22
:1009000061742020202020203A20004C6F6E672048
:10091000202020203A20005370656564202020208C
:100920003A200050444F5020202020203A200041FF
:1009300063637572616379203A20005361742020EB
:10094000202020203A2000466978205479706520C4
:100950003A20004E7572206D6974204E43202100AC
:10096000201A202020201B20202020204578697478
:100970000020203031323334353637383941424364
:100980004445460D0A00302E3836780045455072F1
:100990006F6D5265762E3A00454550726F6D526507
:1009A000762E3A002E003F002E002E004F5344209A
:1009B00020202020202020202020202020004F53F5
:1009C0004420202020202020202020202020200023
:1009D0004F53442020202020202020202020202091
:1009E00020004F53442020202020202020202020A1
:1009F000202020003344204C6167652020202020E7
:100A0000202020202000334420616E67656C6573D0
:100A100020202020202020003344206C6F6361744C
:100A2000696F6E202020202020003344206C6F63EB
:100A30006174696520202020202020004D4B204437
:100A40006973706C617920202020202020004D4B9C
:100A500020446973706C61792020202020202000C0
:100A60004D4B20446973706C617920202020202038
:100A700020004D4B20446973706C61792020202048
:100A800020202000506172616D6574657220202005
:100A9000202020201D00506172616D6574657220F8
:100AA0002020202020201D00506172616D6574653A
:100AB00072202020202020201D00506172616D6571
:100AC000746572732020202020201D00446562750B
:100AD000672044617461202020202020200044658C
:100AE000627567204461746120202020202020004E
:100AF00044656275672044617461202020202020B5
:100B000020004465627567204461746120202020C4
:100B10002020200047505320496E666F202020205F
:100B200020202020200047505320496E666F20204F
:100B3000202020202020200047505320496E666F3F
:100B40002020202020202020200047505320496EC4
:100B5000666F20202020202020202000504B542091
:100B6000546F6F6C73202020202020201D00504BDC
:100B70005420546F6F6C73202020202020201D00F3
:100B8000504B5420546F6F6C732020202020202065
:100B90001D00504B5420546F6F6C73202020202078
:100BA00020201D004D4B20446973706C617920201A
:100BB0002020202020004D4B20446973706C617907
:100BC00020202020202020004D4B20446973706C91
:100BD000617920202020202020004D4B2044697383
:100BE000706C6179202020202020200050617261EB
:100BF0006D65746572202020202020201D0050612A
:100C000072616D65746572202020202020201D00F7
:100C1000506172616D657465722020202020202053
:100C20001D00506172616D65746572202020202066
:100C300020201D0044656275672044617461202096
:100C40002020202020004465627567204461746183
:100C50002020202020202000446562756720446108
:100C600074612020202020202000446562756720C8
:100C7000446174612020202020202000504B54200B
:100C8000546F6F6C73202020202020201D00504BBB
:100C90005420546F6F6C73202020202020201D00D2
:100CA000504B5420546F6F6C732020202020202044
:100CB0001D00504B5420546F6F6C73202020202057
:100CC00020201D00424C2D4374726C2E20546573FD
:100CD000746572200000424C2D4374726C2E2054B7
:100CE0006573746572200000424C2D4374726C2E43
:100CF00020546573746572200000424C2D43747259
:100D00006C2E2054657374657220000053657276F2
:100D10006F20546573746572202020202000536575
:100D200072766F2054657374657220202020200035
:100D3000536572766F20546573746572202020208D
:100D40002000536572766F2054657374657220209D
:100D500020202000504320425420203E204B6F7022
:100D6000746572202000504320425420203E204BC6
:100D70006F70746572202000504320425420203E42
:100D8000204B6F7074657220200050432042542025
:100D9000203E204B6F707465722020005043205518
:100DA0005342203E204B6F707465722020005043E8
:100DB00020555342203E204B6F70746572202000F6
:100DC000504320555342203E204B6F707465722073
:100DD0002000504320555342203E204B6F707465D5
:100DE00072202000504B54205365747570202020D1
:100DF000202020201D00504B542053657475702016
:100E00002020202020201D00504B54205365747555
:100E100070202020202020201D00504B542053659E
:100E2000747570202020202020201D00504B54205D
:100E300056657273696F6E20202020202000504B71
:100E4000542056657273696F6E2020202020200088
:100E5000504B542056657273696F6E2020202020FD
:100E60002000504B54205665727369652020202065
:100E70002020200020202020202020202020202092
:100E80002020202020202020200028432920474EF9
:100E9000552047504C204C6963656E7365202000D7
:100EA000202020204E4F2057415252414E5459206D
:100EB0002020202020002020202020202020202052
:100EC00020202020202020202020200032303038F8
:100ED0002054686F6D6173204B61697365722020C7
:100EE0002000323030392D32303130205065746579
:100EF00072204D61636B20003230313020536562C7
:100F000061737469616E20426F65686D20003230D4
:100F10003131204368722E204272616E64746E65B6
:100F2000722026002020202020486172616C6420FD
:100F3000426F6E676172747A200020001200130005
:100F4000120013002000456E646500206E6963681E
:100F500074206DF6676C6963682100204D69742008
:100F600064696573657220486172647761726500B7
:100F70002D55666C6173683A773A46494C452E6840
:100F800065783A6120002D50636F6D3F202D6231EE
:100F90003135323030202020202020002D706D315E
:100FA00032383470202D6361767231303920202040
:100FB0002000537461727420617672647564652ECA
:100FC000657865202020200020504B542055706407
:100FD0006174652020202020202020202000302E39
:100FE00038367800504B542D546F6F6C2046432098
:100FF0000013001200302E38367800504B542D5418
:101000006F6F6C20464320001D002000456E646514
:10101000005374617465203A0056657273696F6E8F
:101020003A0054656D70657261747572653A00437B
:10103000757272656E74202020203A0053657450DA
:101040006F696E742020203A001D00200020001DD2
:1010500000416C6C00416C6C001D001A201B005696
:10106000616C75653A20202030004D6F746F723AC4
:10107000202020310020424C2D4374726C20546596
:101080007374202020202020202000456E646520DD
:10109000436865636B0054656D7020203A004D61B4
:1010A0007850574D203A00437572726E743A005270
:1010B0006561644D6F643A005374617465203A0051
:1010C000536574506F694C3A00536574506F693AB8
:1010D0000056657273696F6E3A00466F756E6420D4
:1010E000424C2D4374726C3A00537563686520421C
:1010F0004C2D4374726C006D617820416C7469747E
:101100007564653A006D61782053706565642020D0
:10111000203A006D61782044697374616E63653AAA
:10112000006D696E20566F6C74616765203A006DC2
:1011300061782054696D65202020203A006D617827
:101140002043757272656E74203A0055736564436E
:10115000617061636974793A00F710051113112108
:10116000112F113D114B110E0F0E4E0E0F0E4F0E83
:101170000F0E530E0F0E570E0F0E4E0E0F0E4F0E7C
:101180000F0E530E0F0E570E0F0E4E0E0F0E4F0E6C
:101190000F0E530E0F0E574E4500452000534500CD
:1011A0005320005357005720004E57004E20009701
:1011B000119A119D11A011A311A611A911AC112E04
:1011C000002E004B3A00523A004E3A00456E642021
:1011D00020496E666F006D4168005043002020007A
:1011E0001F00680046726565202020202020200016
:1011F000506F732E20486F6C64202000436F6D6920
:101200006E6720486F6D650053617473006B6D2FBE
:1012100068004F6E6C792077697468204E432021F6
:10122000002E002E006D4168006B6D2F68004B6131
:101230006EE46C652020202020202020004368617F
:101240006E6E656C202020202020200043616E619E
:1012500075782020202020202020004B616E6161C5
:101260006C2020202020202020004B6F6E666967B4
:1012700075726174696F6E20006D61696E20202047
:101280002020202020202000436F6E6669672020E8
:1012900020202020202000436F6E666967757261F0
:1012A000746965202000537469636B20202020201E
:1012B0002020202000737469636B202020202020D0
:1012C000202020004D616E636865202020202020B2
:1012D000202000537469636B2020202020202020D0
:1012E00020004C6F6F70696E672020202020202026
:1012F000004C6F6F70696E67202020202020200036
:101300004C6F6F70696E6720202020202020004CD9
:101310006F6F70696E67202020202020200048F623
:1013200068652020202020202020202000416C748F
:10133000697475646520202020202000416C746948
:101340007475646520202020202000486F6F67742A
:10135000652020202020202020004B616D657261D7
:1013600020202020202020200043616D6572612014
:10137000202020202020200043616D657261202004
:101380002020202020200043616D657261202020F4
:101390002020202020004E6176694374726C20204A
:1013A00020202020004E6176694374726C2020203A
:1013B000202020004E6176694374726C202020202A
:1013C0002020004E6176694374726C20202020201A
:1013D000200041757367E46E67652020202020207F
:1013E000004F757470757473202020202020200019
:1013F000536F7274696573202020202020200055CF
:10140000697467616E67656E202020202000566534
:1014100072736368696564656E65732000446976FC
:1014200065727320202020202020200044697665EA
:1014300072732020202020202020004469766572CD
:1014400073656E202020202020004779726F2020B5
:101450002020202020202020004779726F2020208B
:1014600020202020202020004779726F202020207B
:10147000202020202020004779726F20202020206B
:1014800020202020200042656E75747A657220202D
:10149000202020200055736572202020202020204D
:1014A00020202000506172616D6574726573202088
:1014B0002020004765627275696B657220202020CC
:1014C0002000416368736B6F70706C756E672020CD
:1014D00000436F75706C20417865732020202000D8
:1014E000436F75706C204178657320202020004B7D
:1014F0006F7070656C696E672041737320004D6971
:101500007865722D536574757020202000436F6ECE
:10151000666967204D69782020202000436F6E6641
:101520006967204D69782020202000436F6E66692E
:10153000672E204D697865722000456173792053CC
:10154000657475702020202000436F6E66696720E7
:101550004561737920202000436F6E6669672045DE
:1015600061737920202000436F6E6669672E2065C5
:1015700061737920200047617320202020202020E3
:1015800020202020005468726F74746C6520202025
:101590002020200047617A202020202020202020A9
:1015A00020200047617320202020202020202020A0
:1015B0002000476965722020202020202020202044
:1015C0000047696572202020202020202020200054
:1015D0004C616365742020202020202020200047BB
:1015E00069657220202020202020202020004E69C4
:1015F000636B20202020202020202020004E6963C3
:101600006B202020202020202020200054616E67A5
:1016100061676520202020202020004E69636B2018
:1016200020202020202020202000526F6C6C2020C1
:10163000202020202020202000526F6C6C202020B1
:101640002020202020202000526F756C69732020FC
:1016500020202020202000526F6C6C202020202091
:10166000202020202000506F74692031202020206D
:101670002020202000506F7469203120202020205D
:1016800020202000506F746920312020202020204D
:10169000202000506F74692031202020202020203D
:1016A0002000506F7469203220202020202020202C
:1016B00000506F746920322020202020202020003C
:1016C000506F7469203220202020202020200050DC
:1016D0006F74692032202020202020202000506FAD
:1016E00074692033202020202020202000506F7497
:1016F000692033202020202020202000506F746992
:101700002033202020202020202000506F746920CA
:1017100033202020202020202000506F74692034A6
:10172000202020202020202000506F7469203420A9
:101730002020202020202000506F74692034202099
:1017400020202020202000506F7469203420202089
:10175000202020202000506F746920352020202078
:101760002020202000506F74692035202020202068
:1017700020202000506F7469203520202020202058
:10178000202000506F746920352020202020202048
:101790002000506F74692036202020202020202037
:1017A00000506F7469203620202020202020200047
:1017B000506F7469203620202020202020200050E7
:1017C0006F74692036202020202020202000506FB8
:1017D00074692037202020202020202000506F74A2
:1017E000692037202020202020202000506F74699D
:1017F0002037202020202020202000506F746920D6
:1018000037202020202020202000506F74692038AD
:10181000202020202020202000506F7469203820B4
:101820002020202020202000506F746920382020A4
:1018300020202020202000506F7469203820202094
:101840002020202020004D6F746F72205369636840
:101850002E536368004D6F742E5361666574792052
:1018600053772E004D6F742E536166657479205343
:10187000772E004D6F742E7361662E736368616BF3
:101880002E004572772E205369672E2050722E202D
:1018900000456E682E205369672E436865636B00B0
:1018A00052656365702052656E666F7263650055A0
:1018B0006974672E5369672E436865636B00456DD5
:1018C0007066E46E6765722054797020005265631B
:1018D0006569766572205479706520005479706569
:1018E00020526563657074657572004F6E74766121
:1018F0006E672E2054797065200048F668656E7218
:101900006567656C65722020004374726C20416CC1
:1019100074697475646520004374726C20416C7442
:10192000697475646520004374726C20486F6F673A
:1019300074652020200047505320202020202020A4
:10194000202020200047505320202020202020202D
:10195000202020004750532020202020202020201D
:10196000202000475053202020202020202020200D
:1019700020004B6F6D706173732020202020202089
:1019800000436F6D706173732020202020202000A1
:10199000436F6D7061732020202020202020004B99
:1019A0006F6D7061732020202020202020004B6F5D
:1019B0006D704665737420417573722E00436F6DB0
:1019C000704F7269656E742E466978004D61696E5C
:1019D0007469656E204361702020004B6F6D7061EB
:1019E000732076617374202020004572772E205377
:1019F00069672E2050722E200053656E732E52633D
:101A00007653696756616C004374726C2052656E40
:101A10002052656365700045787452656320536990
:101A2000676E61616C004163687328652E296B6F76
:101A300070706C2E004178697320436F7570696E09
:101A4000672020004465636F75706C616765204195
:101A50007865004173206B6F7070656C696E6720EC
:101A6000200044726568726174656E626567722EEB
:101A700000526F7452617465206C696D69742E0038
:101A80004C696D6974205669742E20526F7400522F
:101A90006F7452617465206C696D69742E004865BD
:101AA0006164696E6720486F6C642020004E696332
:101AB0006B2F526F6C6C2020202020004F726965C4
:101AC0006E742E20466978652020004B6F65727316
:101AD000207661737420202020004E69636B2F52A2
:101AE0006F6C6C2050202020004E69636B2F526F6A
:101AF0006C6C205020202000526F756C2F54616E4A
:101B0000672050202020004E69636B2F526F6C6C51
:101B10002050202020004E69636B2F526F6C6C2088
:101B200044202020004E69636B2F526F6C6C204460
:101B300020202000526F756C2F54616E6720442066
:101B40002020004E69636B2F526F6C6C2044202064
:101B5000200047696572205020202020202020206E
:101B6000004769657220502020202020202020007E
:101B70004C616365742050202020202020200047E5
:101B800069657220502020202020202020004578E8
:101B90007465726E65204B6F6E74722E004578749A
:101BA00065726E204374726C202020004374726C46
:101BB0002045787465726E652020004578746572E2
:101BC0006E20436F6E74726F6C004C6F6F70696E35
:101BD00067206F62656E2020004C6F6F70696E67C2
:101BE00020757020202020004C6F6F70696E672078
:101BF0004176616E7420004C6F6F70696E67206F64
:101C00006D686F6F67004C6F6F70696E6720756EDF
:101C100074656E20004C6F6F70696E6720646F771B
:101C20006E2020004C6F6F70696E67204172726980
:101C30006572004C6F6F70696E672062656E6564D7
:101C40002E004C6F6F70696E67206C696E6B73202D
:101C5000004C6F6F70696E67206C656674202000A1
:101C60004C6F6F70696E6720476175636865004CE3
:101C70006F6F70696E67206C696E6B7320004C6FBC
:101C80006F70696E6720726563687473004C6F6F64
:101C900070696E6720726967687420004C6F6F709E
:101CA000696E672044726F697465004C6F6F70696C
:101CB0006E672072656368747300476173204C69B6
:101CC0006D69742020202020005468726F74746C39
:101CD00065204C696D6974004C696D6974652047B5
:101CE000617A2020202000476173204C696D69656E
:101CF000742020202000416E7370726563687363E6
:101D000068772E2000536575696C205265706F6E80
:101D100073652000536575696C205265706F6E7332
:101D20006520004472656D70656C776161726465F1
:101D30002000487973746572657365202020202027
:101D400000487973746572657369732020202000E0
:101D50004879737465726573697320202020004888
:101D60007973746572657365202020202000556D9D
:101D70006B656872702E204E69636B20004E69633C
:101D80006B20496E7665727320202000496E76655F
:101D9000727320526F756C697320004E69636B20FB
:101DA0006765696E766572742E00556D6B65687235
:101DB000702E20526F6C6C2000526F6C6C20496E3C
:101DC0007665727320202000496E76657273205408
:101DD000616E6761676500526F6C6C206765696E44
:101DE000766572742E0048F668656E726567656C7C
:101DF000756E672000416C74697475646520437466
:101E0000726C20004374726C20416C746974756448
:101E1000652000486F6F67746520436F6E74726F42
:101E20006C004A3A484265672C4E3A566172696FB7
:101E300000593A4C696D482C4E3A566172696F00F0
:101E4000593A4C696D482C4E3A566172696F005987
:101E50003A4C696D482C4E3A566172696F00536373
:101E600068616C74657220662E20482E0053776975
:101E700074636820662E2048696768005377697428
:101E80006820486175746575722000536368616BE2
:101E90002E20486F6F6774652000616B7573742E18
:101EA00020566172696F20200061636F75737469D9
:101EB0006320566172696F00566172696F204163D9
:101EC0006F757374696300416B6F6573742E205670
:101ED0006172696F2000536F6C6C68F66865202032
:101EE0002020202000536574706F696E74202020BC
:101EF0002020200048617574657572204D6178203E
:101F0000202000476577656E73746520686F6F6782
:101F100074004D696E2E2047617320202020202000
:101F2000006D696E2E207468726F74746C65200089
:101F300047617A204D696E20202020202020004D0E
:101F4000696E696D61616C2067617320200048F6DD
:101F500068652050202020202020202000416C7423
:101F6000697475646520502020202000416C7469DC
:101F70007475646520502020202000486F6F6774BE
:101F8000652050202020202020004C75667464724B
:101F900075636B2044202020004261726F6D657470
:101FA00072696320442020005072657373696F6EFC
:101FB000204420202020004261726F6D6574722ED3
:101FC0002044202020005A2D41434320202020205F
:101FD0002020202000414343205A20202020202080
:101FE00020202000414343205A2020202020202070
:101FF000202000414343205A202020202020202060
:1020000020004D61782E2048F66865202020202091
:10201000004D61782E20486967682020202020002C
:102020004D61782E20486967682020202020004DCF
:1020300061782E20686F6F677465202020005665D8
:10204000727374E4726B756E672F5220006761695A
:102050006E2F726174652020202020004761696E18
:102060002F4672657175656E63650056657273748F
:102070002E2F72617465202020005363687765629B
:1020800065676173202B2F2D00686F6F7665722056
:1020900076617269612E200056617220566F6C2045
:1020A00053746174202000686F6F766572207661CA
:1020B0007269612E2000475053205A202020202092
:1020C0002020202000475053205A2020202020206C
:1020D00020202000475053205A202020202020205C
:1020E000202000475053205A20202020202020204C
:1020F0002000537469636B204E657574722E2050F6
:1021000000737469636B206E657574722E205000C5
:10211000506F73204E6575747265204D616E00734B
:102120007469636B206E657574722E2050004E6961
:10213000636B20532E20416E73742E20006E6963F2
:102140006B2073657276206374726C0041737365E3
:1021500072762054616E67616765006E69636B20FB
:1021600073657276206374726C004E69636B204BEA
:102170006F6D70656E732E20006E69636B20636FE8
:102180006D70656E732E2000436F6D702054616E0C
:10219000676167652020006E69636B20636F6D70F7
:1021A000656E732E20004E69636B20556D6B6568FC
:1021B00072656E20006E69636B20696E762E2064F6
:1021C00069722E00496E76657273657220526F7562
:1021D0006C20006E69636B20696E762E726963688D
:1021E0002E004E69636B20536572766F206D696EA9
:1021F000006E69636B20736572766F206D696E0087
:10220000536572766F204D696E2020202020006E6D
:1022100069636B20736572766F206D696E004E691D
:10222000636B20536572766F206D6178006E696311
:102230006B20736572766F206D61780053657276DE
:102240006F204D61782020202020006E69636B2074
:10225000736572766F206D617800526F6C6C2053DD
:102260002E20416E73742E2000726F6C6C2073658B
:102270007276206374726C004173736572762052BB
:102280006F756C69732000726F6C6C207365727669
:10229000206374726C00526F6C6C204B6F6D7065B4
:1022A0006E732E2000726F6C6C20636F6D70656EA4
:1022B000732E2000436F6D702054616E67616765F7
:1022C000202000726F6C6C20636F6D70656E732ED2
:1022D0002000526F6C6C20556D6B656872656E20C6
:1022E00000726F6C6C20696E762E206469722E000D
:1022F000496E7665727365722054616E6720007254
:102300006F6C6C206F6D6B6572656E202000526F74
:102310006C6C20536572766F206D696E00726F6C05
:102320006C20736572766F206D696E0053657276EE
:102330006F204D696E202020202000726F6C6C2071
:10234000736572766F206D696E00526F6C6C2053EE
:102350006572766F206D617800726F6C6C207365AA
:1023600072766F206D617800536572766F204D61D3
:1023700078202020202000726F6C6C2073657276AC
:102380006F206D617800416E73742E204765736312
:1023900068772E2000736572766F207265667265AD
:1023A00073682000546175782052656672657368A1
:1023B000202000536572766F2072656672657368BF
:1023C00020004D616E75656C6C65204765736368B0
:1023D000006D616E75656C6C2053706565642000DE
:1023E00056697465737365204D616E2E202000530D
:1023F0006E656C682E68616E646265642E00436170
:102400006D205269636874756E6720200043616DAA
:10241000204F7269656E74202020200043616D207A
:102420004F7269656E74202020200043616D6572D3
:10243000612072696368742E2000536572766F2084
:10244000332020202020202000536572766F203317
:102450002020202020202000536572766F2033201A
:1024600020202020202000536572766F203320200A
:10247000202020202000536572766F2034202020F9
:102480002020202000536572766F203420202020E9
:1024900020202000536572766F20342020202020D9
:1024A000202000536572766F2034202020202020C9
:1024B0002000536572766F203520202020202020B8
:1024C00000536572766F20352020202020202000C8
:1024D000536572766F203520202020202020005365
:1024E0006572766F20352020202020202000475064
:1024F00053202020202020202020202000656E61F5
:10250000626C65204750532020202000416374698D
:102510007665722047505320202000656E61626C02
:1025200065204750532020202000475053204D6FF6
:102530006475732053742E2000475053206D6F64D0
:102540006520636F6E747200446566204D6F64652C
:1025500020475053202000475053206D6F64652062
:10256000636F6E747200475053205665727374E443
:10257000726B2E2000475053204761696E20202047
:10258000202020004761696E2047505320202020E2
:1025900020200047505320766572737465726B2E4D
:1025A00020004750532053742E20536368772E2009
:1025B0000047505320737469636B20746872650020
:1025C000536575696C204D616E6368652020004716
:1025D00050532073742E206472656D702E004D6907
:1025E0006E2E205361742E2020202020004D696E15
:1025F0002E205361742E2020202020004E62726510
:10260000204D696E2E205361742E004D696E2E2070
:102610005361742E2020202020004750532D50203D
:102620002020202020202020004750532D50202003
:1026300020202020202020004750532D50202020F3
:10264000202020202020004750532D5020202020E3
:102650002020202020004750532D492020202020DA
:1026600020202020004750532D49202020202020CA
:10267000202020004750532D4920202020202020BA
:102680002020004750532D492020202020202020AA
:1026900020004750532D442020202020202020209F
:1026A000004750532D4420202020202020202000AF
:1026B0004750532D44202020202020202020004758
:1026C00050532D4420202020202020202000502066
:1026D0004C696D697420202020202020004C696DF9
:1026E0006974202050202020202020004C696D6932
:1026F00074652050202020202020004C696D6965E1
:102700007420205020202020200049204C696D6931
:102710007420202020202020004C696D6974202026
:1027200049202020202020004C696D6974652049D3
:10273000202020202020004C696D696574202049EC
:1027400020202020200044204C696D697420202026
:1027500020202020004C696D697420204420202016
:10276000202020004C696D697465204420202020C1
:102770002020004C696D69657420204420202020B1
:102780002000475053204163632020202020202038
:102790000047505320416363202020202020200048
:1027A000416363656C204750532020202020004760
:1027B00050532041636320202020202020004750D8
:1027C000532057696E646B6F72722E20004750530E
:1027D0002057696E6420436F72722E00436F7272CD
:1027E0006563742056656E7420200047505320574F
:1027F000696E6420436F72722E004272656D73774A
:1028000069726B756E672020005370656564206384
:102810006F6D70656E732E00436F6D70656E732003
:102820005669742020200052656D7765726B696E61
:10283000672020202000475053206D61782E2052C1
:1028400061642E2000475053206D61782E726164C0
:10285000697573005261796F6E20475053204D6146
:10286000782000475053206D61782E72616469753D
:1028700073004750532057696E6B656C204C692E6E
:102880000047505320616E676C2E6C696D6974004F
:102890004C696D697420416E676C20475053004746
:1028A000505320686F656B206C696D2E2000504876
:1028B000204C6F67696E2074696D65200050482058
:1028C0006C6F67696E2074696D65200054707320A9
:1028D0004D656D6F726973202020005048206C6F29
:1028E00067696E2074696A64200044796E616D695D
:1028F00063205048202020200044796E616D696378
:10290000205048202020200044796E616D696320AA
:102910005048202020200044796E616D69736368FF
:1029200065205048200043482048F6686520202054
:10293000202020200043482048696768202020206C
:10294000202020004348204869676820202020205C
:10295000202000434820486F6F67746520202020A6
:1029600020004C454431204269746D61736B6520D1
:10297000004F757431204269746D61736B202000C3
:102980004269746D61736B20533120202020005503
:102990006974673120426974706174722E0020205E
:1029A00020202054696D696E67202020004F7574C7
:1029B000312054696D696E6720202000486F726C69
:1029C0006F676520533120202020005569746731DE
:1029D0002054696D696E672020002020202020731C
:1029E0006F666F727420616E004163746976202097
:1029F00020202020202020004163746966202020B0
:102A000020202020202000446972656374206161C9
:102A10006E202020200020202020206E2E6D2E4DA4
:102A20006F746F72004163742E2077692E204D6F92
:102A3000746F72004163746966204175205265703D
:102A40006F7300416B742E206D6F746F7220756907
:102A500074004C454432204269746D61736B65208B
:102A6000004F757432204269746D61736B202000D1
:102A70004269746D61736B20533220202020005511
:102A80006974673220426974706174722E0020206C
:102A900020202054696D696E67202020004F7574D6
:102AA000322054696D696E6720202000486F726C77
:102AB0006F676520533220202020005569746732EB
:102AC0002054696D696E672020002020202020732B
:102AD0006F666F727420616E0041637469762020A6
:102AE00020202020202020004163746966202020BF
:102AF00020202020202000446972656374206161D9
:102B00006E202020200020202020206E2E6D2E4DB3
:102B10006F746F72004163742E2077692E204D6FA1
:102B2000746F72004163746966204175205265704C
:102B30006F7300416B742E206D6F746F7220756916
:102B400074004C45443120566D696E2E5761726E8B
:102B5000004F75743120756E646572766F6C740009
:102B6000416C20556E646572766F6C7461670055B8
:102B700069746731206F6E64657273702E004C4506
:102B8000443220566D696E2E5761726E004F757417
:102B90003220756E646572766F6C7400416C2055DE
:102BA0006E646572766F6C74616700556974673224
:102BB000206F6E64657273702E004D696E2E204713
:102BC0006173202020202020006D696E2E20746803
:102BD000726F74746C65200047617A204D696E2EA7
:102BE000202020202020006D696E696D61616C20BD
:102BF0006761732020004D61782E2047617320208B
:102C000020202020006D61782E207468726F74740B
:102C10006C65200047617A204D61782E20202020AD
:102C20002020006D6178696D61616C20676173209F
:102C300020004B6F6D706173737769726B756E678F
:102C400000636F6D70617373206566666563740001
:102C5000456666657420636F6D7061732020004B5C
:102C60006F6D7061732065666665637420004361F3
:102C70007265667265652053742E20200043617270
:102C80006566726565204374726C200043617265ED
:102C900066726565204374726C20004361726566DC
:102CA000726565204374726C2000546561636861CD
:102CB000626C65204361726500546561636861629E
:102CC0006C65204361726500546561636861626C84
:102CD00065204361726500546561636861626C657B
:102CE000204361726500556E7465727370616E6E1B
:102CF000756E672000756E646572766F6C746167BF
:102D000065202000536F75732054656E73696F6E74
:102D10002020004F6E6465727370616E6E696E671D
:102D20002000566F6C74205265666572656E7A205D
:102D300000566F6C74205265666572656E7A20006D
:102D400054656E73696F6E205265662020200052B4
:102D500065662E207370616E6E696E6720004E6F1F
:102D60007420476173205A656974202000456D65A1
:102D700072672E5468722E54696D650044757265D1
:102D800065207365636F75727320004E6F6F6420EA
:102D90006761732074696A6420004E6F7420476114
:102DA000732020202020202000456D6572672E545E
:102DB00068726F74746C650047617A206465207373
:102DC00065636F757273004E6F6F64206761732067
:102DD0002020202020004661696C732E204348206B
:102DE00054696D65004661696C732E204348205418
:102DF000696D65004661696C732E204348205469F3
:102E00006D65004661696C732E2043482054696AE1
:102E10006400436F6D70617373204572726F72202E
:102E200000436F6D70617373204572726F72200082
:102E3000436F6D70617373204572726F7220004B27
:102E40006F6D706173204572726F722020006B2E5F
:102E500053756D6D6572206F2053656E00436F6D05
:102E600070617373204572726F722000536F6E2011
:102E700041627320456D65747420004B6F6D706105
:102E800073204572726F722020004779726F205054
:102E90002020202020202020004779726F20502001
:102EA00020202020202020004779726F20502020F1
:102EB000202020202020004779726F2050202020E1
:102EC0002020202020004779726F204920202020D8
:102ED00020202020004779726F20492020202020C8
:102EE000202020004779726F2049202020202020B8
:102EF0002020004779726F204920202020202020A8
:102F000020004779726F204420202020202020209C
:102F1000004779726F2044202020202020202000AC
:102F20004779726F20442020202020202020004755
:102F300079726F2044202020202020202000476923
:102F4000657220502020202020202020004C61632A
:102F50006574205020202020202020004C616365D3
:102F600074205020202020202020004769657220F6
:102F70005020202020202020200047696572204911
:102F80002020202020202020004C616365742049EF
:102F900020202020202020004C61636574204920DF
:102FA0002020202020200047696572204920202011
:102FB00020202020200044796E616D69736368656C
:102FC0002053742E0064796E616D6963207374619F
:102FD00062692E00537461622044796E616D69717B
:102FE00075650044796E616D69732E20737461623A
:102FF0002E0044726568726174656E6265672E208A
:1030000000526F7452617465206C696D69742E0092
:103010004C696D69742044697420526F7461005466
:103020006F6572656E74616C206C696D2E00414332
:10303000432F4779726F2046616B2E200041434336
:103040002F4779726F204661637420004143432FFC
:103050004779726F204661637420004143432F47D4
:1030600079726F204661637420004143432F477992
:10307000726F204B6F6D702E00436F6D7020414357
:10308000432F4779726F2000436F6D702041434397
:103090002F4779726F2000436F6D70204143432F9B
:1030A0004779726F200048617570747265676C654E
:1030B00072204920004D61696E2049202020202087
:1030C00020202000526567756C205072696E632065
:1030D000492000486F6F6664726567656C2E2049F1
:1030E0002000447269666B6F6D70656E7361742E3B
:1030F00000647269667420436F6D70656E732E0094
:10310000436F6D70656E732044657269762000446C
:103110007269667420636F6D70656E732E004779F7
:10312000726F20737461622E202020200047797214
:103130006F2073746162696C697479004779726F8A
:103140002053746162696C697479004779726F20E9
:1031500073746162696C69742E004D6F746F7220B4
:10316000736D6F6F74682020004D6F746F722073E1
:103170006D6F6F74682020004D6F746F7220536DF7
:103180006F6F74682020004D6F746F7220736D6FC5
:103190006F7468202000506172616D6574657220E3
:1031A0003120202000506172616D6574657220319C
:1031B00020202000506172616D657465722031209D
:1031C000202000506172616D65746572203120208D
:1031D0002000506172616D6574657220322020207C
:1031E00000506172616D657465722032202020008C
:1031F000506172616D65746572203220202000502C
:103200006172616D6574657220322020200050610A
:1032100072616D65746572203320202000506172E8
:10322000616D6574657220332020200050617261E9
:103230006D65746572203320202000506172616DCD
:1032400065746572203320202000506172616D65C5
:10325000746572203420202000506172616D6574A5
:103260006572203420202000506172616D657465A4
:1032700072203420202000506172616D6574657287
:10328000203420202000506172616D6574657220C9
:103290003520202000506172616D657465722035A3
:1032A00020202000506172616D65746572203520A8
:1032B000202000506172616D657465722035202098
:1032C0002000506172616D65746572203620202087
:1032D00000506172616D6574657220362020200097
:1032E000506172616D657465722036202020005037
:1032F0006172616D65746572203620202000506116
:1033000072616D65746572203720202000506172F3
:10331000616D6574657220372020200050617261F4
:103320006D65746572203720202000506172616DD8
:1033300065746572203720202000506172616D65D0
:10334000746572203820202000506172616D6574B0
:103350006572203820202000506172616D657465AF
:1033600072203820202000506172616D6574657292
:103370002038202020004163687328652E296B6F58
:1033800070706C2E0028446529436F75706C204165
:103390007865730028446529436F75706C20417807
:1033A0006573004173206B6F7070656C696E672088
:1033B00020004769657220706F732E204B6F70700C
:1033C00000526574726F6163206C616365742000E4
:1033D000526574726F6163204C61636574200047AD
:1033E00069657220706F732E206B6F702E004E69AE
:1033F000636B2F526F6C6C204B6F70700052657452
:10340000726F20726F756C2F74616E0052657472EA
:103410006F20526F756C2F54616E004E69636B2F75
:10342000526F6C6C206B6F702E0047696572204B79
:103430006F7272656B74757200436F72726563743C
:10344000206C616365742000436F72726563742041
:103450004C6163657420004769657220636F727206
:103460006563746965004F7269656E74696572752C
:103470006E672020004F7269656E74696572756EA3
:10348000672020004F7269656E746174696F6E20E9
:1034900020200000000000000000000000000000EC
:1034A000000048F668656E726567656C756E67202A
:1034B00000416C746974756465204374726C2000FB
:1034C0004374726C20416C746974756465200048A3
:1034D0006F6F67746520436F6E74722E2000536F98
:1034E0006C6C68F6686520202020202000536574ED
:1034F000706F696E74202020202020004861757450
:10350000657572204D617820202000476577656ED3
:1035100073742E686F6F67746500537469636B20F2
:103520004E657574722E205000737469636B206E43
:10353000657574722E205000506F73204E6575743F
:103540007265204D616E00537469636B206E657502
:1035500074722E205000475053202020202020201D
:103560002020202000656E61626C6520475053204A
:1035700020202000416374697665722047505320F3
:10358000202000456E61626C65204750532020204A
:103590002000475053204D6F6475732053742E20C4
:1035A00000475053206D6F646520636F6E74720026
:1035B000446566206D6F64652047505320200047A6
:1035C0005053206D6F646520636F6E747200447990
:1035D0006E616D6963205048202020200044796E80
:1035E000616D6963205048202020200044796E617D
:1035F0006D6963205048202020200044796E616D61
:103600006963205048202020200043482048F66865
:10361000652020202020202000434820486967683A
:10362000202020202020200043482048696768206F
:1036300020202020202000434820686F6F67746599
:10364000202020202000436172656672656520534A
:10365000742E202000436172656672656520437494
:10366000726C2000436172656672656520437472F6
:103670006C20004361726566726565204374726CEC
:103680002000546561636861626C65204361726506
:1036900000546561636861626C6520436172650016
:1036A000546561636861626C6520436172650054B2
:1036B0006561636861626C652043617265004D6F8E
:1036C000746F7220536963682E536368004D6F7482
:1036D0002E5361666574792053772E004D6F742EDA
:1036E0005361666574792053772E004D6F742E7385
:1036F00061662E736368616B2E004F7269656E742C
:10370000696572756E672020004F7269656E74611D
:1037100074696F6E202020004F7269656E74696550
:1037200072756E672020004F7269656E74617469EE
:103730006520202020000000010C03010101000091
:10374000010C040404040000010C01030303000045
:10375000010C020202020003011905050505000320
:1037600001190606060600030119070707070003EB
:1037700001190808080800030119090909090003CB
:1037800001190A0A0A0A000301190B0B0B0B0003AB
:1037900001190C0C0C0C0000000C6300000000026E
:1037A00000046A0000000006000627010101010272
:1037B00000010D000000010200200D0101010102C5
:1037C00000080D010101010200100D0000000102BE
:1037D00000046A000000010200400D010101010225
:1037E00000800D000000010200040D000000020036
:1037F0000014170A0806020000141810100A02012B
:1038000000FF19060604020100FF60000000030229
:1038100000016800000003020002680000000302CB
:1038200000046800000003020008680000000301B3
:1038300000FF3B323232030000F73C5A5A5A030071
:1038400000F73D323232030000F7414E4E4E030086
:1038500000F7424E4E4E040200010D00000004022B
:1038600000016A000000040200020D0101010402CF
:1038700000026A010101040100FF10FFFFFF0400C4
:1038800000F70E1E1E1E040100FF110F0F0F040192
:1038900000FF0F1E1E1E040100FF130000000401A4
:1038A00000FF67969696040000F7120F0F0F0400B2
:1038B00000F714080808040100FF15404040040008
:1038C00000A016000000050100FF2D80808005008B
:1038D00000F72E32323205020001690000000500B7
:1038E00000F72F0F0F0F050000F730E6E6E60501A1
:1038F00000FF31808080050000F7325555550502E4
:10390000000269000000050000F733464646050046
:1039100000F734DCDCDC0500020835040404050093
:1039200000F7363C3C3C050500F737000000050178
:1039300000FF387D7D7D050100FF397D7D7D05011E
:1039400000FF3A7D7D7D060200200D010101060188
:1039500000FF50FEFEFE060100FF51646464060095
:1039600000F75A080808060000F75906060606017F
:1039700000FF525A5A5A060100FF535A5A5A06017A
:1039800000FF545A5A5A060100FF554B4B4B060193
:1039900000FF56555555060100FF574B4B4B06018E
:1039A00000FF58000000060100FF5B5A5A5A06014A
:1039B00000FF5C2A2A2A060100FF5DF5F5F50601E5
:1039C00000FF5E8C8C8C060000F75F050505060283
:1039D00000206A000000060000F7650000000704F0
:1039E00000FF4A5F5F5F070100FF4B1414140702DA
:1039F00000206800000007020010680101010704B0
:103A000000FF4CF3F3F3070100FF4D1414140702F9
:103A100000406800000007020080680101010704FF
:103A200000FF4EAAAAAA070400FF4FAAAAAA0800EC
:103A300000F71A080808080000F71BE6E6E6080188
:103A400000FF1D404040080100FF62000000080226
:103A500000406A000000080000F72421212108022C
:103A600000086A000000080000F7265A5A5A0800A9
:103A700000F7252D2D2D080000F766000000080234
:103A800000806A000000080200106A0000000901BE
:103A900000FF1E5A6464090100FF1F78787809014D
:103AA00000FF200A0A0A090100FF215A6464090183
:103AB00000FF22787878090100FF45464646090252
:103AC00000800D000000090000F71C1B1B1B0900F3
:103AD00000F743202020090100FF281010100900E2
:103AE00000F7440000000900001023060606090044
:103AF00000F7640000000A0100FF290000000A012D
:103B000000FF2A0000000A0100FF2B0000000A014C
:103B100000FF2C0000000A0100FF460000000A011F
:103B200000FF470000000A0100FF480000000A01F2
:103B300000FF490000000B0200400D0000000B01D7
:103B400000FF3E5A5A5A0B0100FF3F3737370B012F
:103B500000FF404646460C050017610000000D02BC
:103B600000010D0000000D0100FF10FFFFFF0D0020
:103B700000A0160000000D0200200D0101010D0142
:103B800000FF50FEFEFE0D0200206A0000000D0046
:103B900000F7650000000D0100FF620000000D024B
:103BA00000406A0000000D00000C630000000D05DD
:103BB00000176100000050504D20202020202020C0
:103BC000202020202020005370656B7472756D20BA
:103BD00020202020202020005370656B7472756DAA
:103BE0002048695265732020005370656B747275AC
:103BF0006D204C6F5265732020004A657469202047
:103C00002020202020202020202000414354204438
:103C1000534C20202020202020202000484F5454A6
:103C200020202020202020202020202000130012EF
:103C3000001300486F5400414354004A6574005318
:103C4000704C00537048005370650050504D005741
:103C5000504500530020204E0020204A00205000F4
:103C60001200130012002000120030003100201951
:103C700020202020301149202020456E646520201E
:103C8000204F4B005750450053005374642E0028BA
:103C9000312D5331322F57292028643A20202029F2
:103CA000001D00200020001D002A002A00506F0087
:103CB000506F2029005374642E0028302D32343781
:103CC0002D50382928643A506F2029005374642EEF
:103CD00000282020202D202020292028643A202080
:103CE0002029004B6F706965727420756E642041E5
:103CF0006B74697669657274005769726B6C69637D
:103D000068204B6F70696572656E3F00194F18002F
:103D10006D5300250020536572766F2054657374CF
:103D200065722020202020202020005665726269C4
:103D30006E64756E67207A756D204D4B00636F6EF3
:103D40006E656374696F6E20746F204D4B20002088
:103D5000636F6E6E6578696F6E2061204D4B200039
:103D60000041616E736C756974696E67206F7020B5
:103D70004D4B004D4B204C6F774261742057617260
:103D80006E756E67004D4B204C6F774261742077E3
:103D900061726E696E67004D4B204C6F77426174A3
:103DA00020417474656E7400004D4B204C6F774257
:103DB0006174207761617273636800416E7A65692E
:103DC00067652020202020202020201D00446973CA
:103DD000706C61792020202020202020201D00648C
:103DE0002761666669636861676520202020201D61
:103DF00000746F6E656E202020202020202020205F
:103E0000201D0057692E3233322020202020202010
:103E10002020201D0057692E323332202020202000
:103E200020202020201D0057692E323332202020F0
:103E3000202020202020201D0057692E32333220E0
:103E40002020202020202020201D0042544D2D32F3
:103E500032322020202020202020201D0042544DDE
:103E60002D3232322020202020202020201D004210
:103E7000544D2D3232322020202020202020201DA1
:103E80000042544D2D32323220202020202020208C
:103E9000201D00504B542D416B6B7520202020209D
:103EA0002020201D00504B542D416363752020209D
:103EB00020202020201D00504B542D41636375208D
:103EC000202020202020201D00504B542D416363D2
:103ED0007520202020202020201D00504B542055EC
:103EE00070646174652020202020202000504B54F5
:103EF000205570646174652020202020202000500F
:103F00004B54204D69736520E0206A6F7572202044
:103F100000504B542055706461746520202020208F
:103F2000202000446562756720504B5420202020DB
:103F30002020202000446562756720504B542020CB
:103F400020202020202000446562756720504B54BB
:103F5000202020202020202000446562756720500A
:103F60004B54202020202020202000454550726FF7
:103F70006D20526573657420202020200045455037
:103F8000726F6D20526573657420202020200045DB
:103F90004550726F6D2052E9696E697469616C6990
:103FA00000454550726F6D20526573657420202066
:103FB000202000496E666F73206265696D2053741E
:103FC0006172742000696E666F2061742073746181
:103FD00072747570202000496E666F722E207375A2
:103FE00072206C616E63657200496E666F722E207E
:103FF0006F2E646520737461727400537072616314
:10400000686520202020202020202020006C616E68
:104010006775616765202020202020202020004C2B
:10402000616E677565202020202020202020202020
:10403000007461616C20202020202020202020207E
:104040002020004C6963687420617573206E616381
:10405000682E2E2E006C69676874206F666620617A
:10406000667465722020004C756D69E87265206188
:104070007520626F75742020004C69636874656EEA
:104080002075697420766F6F72200048656C6C69CA
:10409000676B6569742020202020202000627269EF
:1040A0006768746E65737320202020202020006CC8
:1040B000756D696E6F736974E920202020202020BF
:1040C0000068656C64657268656964202020202042
:1040D0002020004B6F6E74726173742020202020AA
:1040E0002020202000636F6E747261737420202082
:1040F00020202020202000636F6E7472617374652D
:10410000202020202020202000636F6E74726173B5
:1041100074202020202020202020004E6F726D610E
:104120006C2F496E7665727320202020006E6F72AE
:104130006D616C2F696E7665727465642020004E27
:104140006F726D616C202F20696E76657273E92045
:10415000004E6F726D616C2F696E76657274656466
:104160002020004F7269656E74696572756E6720F4
:1041700020202020006F7269656E746174696F6E13
:10418000202020202020006F7269656E74617469A0
:104190006F6E202020202020006F7269656E746190
:1041A00074696520202020202020004D6F64756CEC
:1041B0002065696E6765626175743F20006D6F648C
:1041C000756C65206275696C7420696E3F20004DC6
:1041D0006F64756C6520696E7374616C6CE9202086
:1041E000006D6F64756C65206765EF6E7374616C4C
:1041F0006C3F0054582F5258204B616E616C202048
:10420000202020200054582F5258204368616E6EA1
:10421000656C202020200054582F5258204368619C
:104220006E6E656C202020200054582F5258204379
:1042300068616E6E656C20202020004E6574572EDC
:10424000204772757070652020202020004E657414
:10425000572E2047726F7570202020202020004E9E
:104260006574572E2047726F757020202020202003
:10427000004E6574572E2047726F757020202020E5
:104280002020004E6574572E204D6F64652020203D
:1042900020202020004E6574572E204D6F6465202D
:1042A000202020202020004E6574572E204D6F6462
:1042B0006520202020202020004E6574572E204DA0
:1042C0006F6465202020202020200054582054694D
:1042D0006D656F7574202020202020200054582008
:1042E00054696D656F7574202020202020200054B3
:1042F000582054696D656F7574202020202020207F
:104300000054582054696D656F757420202020205A
:104310002020005458204D545520202020202020BB
:1043200020202020005458204D54552020202020AB
:10433000202020202020005458204D54552020209B
:104340002020202020202020005458204D5455208B
:104350002020202020202020202000496E69746920
:10436000616C6973696572656E20202000696E69F1
:104370007469616C697A6520202020202020006902
:104380006E697469616C6973657220202020202039
:1043900000496E697469616C697A6520202020206B
:1043A0002020004B6F6E6669672E206D6974205067
:1043B0004320202000636F6E6669672E2077697442
:1043C00068202050432000436F6E6669672E20618D
:1043D000766563205043202000436F6E6669672E28
:1043E000206D6574205043202020004D6F64756C53
:1043F0002065696E6765626175743F20006D6F644A
:10440000756C65206275696C7420696E3F20004D83
:104410006F64756C6520696E7374616C6CE9202043
:10442000006D6F64756C65206765EF6E7374616C09
:104430006C3F004E616D6520202020202020202030
:1044400020202020006E616D65202020202020206B
:10445000202020202020004E6F6D202020202020B2
:104460002020202020202020004E61616D2020206F
:10447000202020202020202020200050696E202095
:104480002020202020202020202020200070696E65
:10449000202020202020202020202020202000500C
:1044A000696E202020202020202020202020202075
:1044B0000050696E20202020202020202020202055
:1044C000202000496E697469616C69736965726561
:1044D0006E20202000696E697469616C697A6520BC
:1044E00020202020202000696E697469616C697346
:1044F000657220202020202000496E697469616C5B
:10450000697A6520202020202020004B6F6E66698C
:10451000672E206D697420504320202000636F6E49
:104520006669672E20776974682020504320004315
:104530006F6E6669672E2061766563205043202088
:1045400000436F6E6669672E206D657420504320AE
:10455000202000504B542D416B6B757479702020D6
:104560002020202000504B542D41636375747970D6
:1045700020202020202000504B542D54797065209D
:10458000646520626174742E00504B542D62617416
:10459000746572696A207479706500504B542041CB
:1045A0006B6B75204D657373756E672000504B54AF
:1045B00020416363754D65617375726520200062EB
:1045C0006174742E206465206D657375726520209A
:1045D00000504B5420626174742E20206D65746904
:1045E0006E670013001200566F6C74004C69496FBF
:1045F000004C69506F004C69506F004C69496F0066
:10460000425420496E6974204572726F72004254A0
:1046100020496E6974206F6B0020426C7565746F61
:104620006F74682050696E202020202020200020F8
:10463000426C7565746F6F7468204E616D652020E3
:1046400020202020001300120020172020202020EE
:1046500016202020202019202020204F4B00202031
:104660002020202020202020202020430020001374
:104670000012002057692E32333220536574757052
:1046800020202020202020200013001200130012E0
:104690000020504B542D536574757020202020202D
:1046A0002020202020200025005769323332005777
:1046B00069323332002020206E69636874206DF601
:1046C000676C696368202020200020204D697420D9
:1046D000486172647761726520312E782020200055
:1046E00020204C49504F202021215761726E756E59
:1046F0006721212020004D6F746F72205465737400
:1047000065722020202020004D6F746F7220546548
:10471000737465722020202020004D6F746F72200A
:104720005465737465722020202020004D6F746FD3
:104730007220546573746572202020202000536518
:1047400072766F20546573746572202020202000DB
:10475000536572766F205465737465722020202033
:104760002000536572766F20546573746572202043
:1047700020202000536572766F2054657374657233
:10478000202020202000504320425420203E204B57
:104790006F70746572202000504320425420203EE8
:1047A000204B6F70746572202000504320425420CB
:1047B000203E204B6F7074657220200050432042D1
:1047C0005420203E204B6F707465722020005043AF
:1047D00020555342203E204B6F707465722020009C
:1047E000504320555342203E204B6F707465722019
:1047F0002000504320555342203E204B6F7074657B
:1048000072202000504320555342203E204B6F70B1
:10481000746572202000504B5420536574757020CD
:104820002020202020201D00504B542053657475FB
:1048300070202020202020201D00504B5420536544
:10484000747570202020202020201D00504B542003
:104850005365747570202020202020201D00504BAF
:10486000542056657273696F6E202020202020002E
:10487000504B542056657273696F6E2020202020A3
:104880002000504B542056657273696F6E202020B3
:1048900020202000504B542056657273696F6E20A3
:1048A000202020202000566F6C7400456E64650047
:1048B0001D00200020001D00504320555342203E83
:1048C000204B6F7074657200504320425420203E8C
:1048D000204B6F70746572001300120020504B540F
:1048E0002D546F6F6C73202020202020202020204A
:1048F000200014BE88E10FB6F894809360001092F7
:1049000060000FBE11241FBECFEFD0E4DEBFCDBFCD
:1049100012E2A0E0B1E0EAE4F6E201E00BBF02C07F
:1049200007900D92AE3BB107D9F710E3AEEBB2E2C0
:1049300001C01D92AD36B107E1F70E94234D0C94E2
:1049400023930C940000E0EBF0E080818368808387
:10495000E1EBF0E080818160808308951092B000E7
:104960001092B100089582B1806F82B90C988FEFD8
:1049700084B988B1806988B987B18C6E87B93C9851
:1049800043985E9A8AB1806F8AB9299A0E94BF8142
:104990000E947A810E94958181E08093EC2E84E1CF
:1049A00090E00E94E78B84E190E00E94208A81E001
:1049B0000E941286789480E00E948D3F0E94F53913
:1049C0008091B728853070F081E08093B72880917E
:1049D000B72860E043E02CE50E946B728093B72813
:1049E0000E94AC3860918A2870E0882777FD809516
:1049F000982F0E94EE8F23E333E343E250E40E94BA
:104A0000DB900E94C08F6093B30081E00E948D3FD5
:104A100088EC90E0909372238093712380E890E07B
:104A20009093B7228093B6220E94C14B84E090E01D
:104A30000E94AF54AC0180E062E020E00E945C4341
:104A400085E090E00E94AF54AC0180E063E020E09C
:104A50000E945C4380E49FE124EF31E0F90131974B
:104A6000F1F70197D9F70799299828EE33E044EF39
:104A700051E0CA010197F1F721503040D1F784EF9E
:104A800091E0909372238093712380E890E090935B
:104A9000B7228093B62280EF0E94FA810E944B3F9A
:104AA0008091B328813031F48091B628882311F4A5
:104AB0000E9457280E944B3F439A8091B028813032
:104AC00039F48091B528882319F40E94A72E439ABF
:104AD0000E944B3F8091B328813051F5809123246F
:104AE000882331F585E00E94C22F80918B28813088
:104AF00009F042C086E090E00E94AF54AC0180E033
:104B000060E020E00E945C4387E090E00E94AF54A8
:104B1000AC0180E061E020E00E945C4380E29EE422
:104B200024EF31E0F9013197F1F70197D9F724C06B
:104B300086E00E94C22F80918B288130E9F486E0C4
:104B400090E00E94AF54AC0180E060E020E00E9461
:104B50005C4388E090E00E94AF54AC0180E061E0EB
:104B600020E00E945C4380E29EE424EF31E0F90102
:104B70003197F1F70197D9F70E944B3F0895CF93F2
:104B8000DF93EA01DC0120E092E03EEF10C08C915F
:104B900087FF05C0FE01E90FF11D30839F5FFE0115
:104BA000E90FF11D8D918F7780839F5F2F5F26170F
:104BB00070F3FE01E90FF11D10828FEF8883925090
:104BC00099839E5F892F90E0DF91CF9108950F9395
:104BD0001F93CF93DF93182F062F8FEF0E94288CFF
:104BE00082E00E94288C812F0E94288C802F0E94B6
:104BF000288C10E0C4EFD1E00E948F8B90E028EE6B
:104C000033E0FE013197F1F721503040D1F70097A2
:104C100021F41F5F1A3081F705C0069719F420E0D0
:104C200030E01EC080E062E04AE551E020E00E94F2
:104C3000534388EE93E0909372238093712380E432
:104C400090E09093B7228093B62280E29EE424EF16
:104C500031E0F9013197F1F70197D9F72FEF30E003
:104C6000C901DF91CF911F910F91089584E190E0E8
:104C70000E94E78B84E190E00E94208A0E944B3FD3
:104C800080E060E044E051E020E00E94534380E097
:104C900061E04FEE50E020E00E94534380E062E08C
:104CA0004BED50E020E00E94534380E063E043ED91
:104CB00050E020E00E94534381E167E04EEC50E079
:104CC00020E00E9453430E943A8A90FF07C00E944E
:104CD0008F8B882329F00E94578A02C00E94288C5B
:104CE00080E10E94FA81882371F308958091BE22A9
:104CF000823041F487E092E00E94E78B87E092E007
:104D00000E94208A0E944B3F5E9880E060E044E46D
:104D100051E020E00E94534380E061E04FE251E027
:104D200020E00E94534380E062E048E251E020E04E
:104D30000E94534380E063E047E151E020E00E949D
:104D4000534381E167E042E151E020E00E94534398
:104D50000E943A8A90FF07C00E948F8B882329F017
:104D60000E94578A02C00E94288C80E10E94FA812A
:104D7000882371F35E9A08951F93CF93DF93182FC2
:104D80000E948F8B8FEF0E94288C82E00E94288CDB
:104D90008EEF0E94288C812F0E94288C84EF91E056
:104DA00024EF31E0F9013197F1F70197D9F710E0DD
:104DB000C4EFD1E00E948F8B482F50E028EE33E003
:104DC000FE013197F1F721503040D1F71F5F4115B7
:104DD000510519F41A3071F712C01A3081F04630BB
:104DE000510519F02FEF30E00CC060E00E949A45A9
:104DF0000E948F8B0E948F8B282F30E002C020E012
:104E000030E0C901DF91CF911F9108951F93182FB2
:104E100080E063E045E651E020E00E945343812FAB
:104E200060E00E949A451093BF2284EF91E0909336
:104E300072238093712380E490E09093B722809353
:104E4000B62288E893E124EF31E0F9013197F1F7D8
:104E50000197D9F71F910895CF93DF930E94D88CC3
:104E60005E9880ED97E024EF31E0F9013197F1F79A
:104E70000197D9F784E190E00E94E78B80E060E041
:104E800043EC52E020E00E94534380E061E042EBBB
:104E900052E020E00E94534388E790E00E94BC2645
:104EA000EC0181E08093BE22209709F587E092E033
:104EB0000E94E78B80E061E04FE952E020E00E9431
:104EC000534388E790E00E94BC26EC0182E0809387
:104ED000BE22209761F40E944B3F80E060E04EE8E4
:104EE00052E020E00E9453431092BE22DCC0CF3F2C
:104EF000D105F9F40E944B3F80E060E049E752E0C1
:104F000020E00E94534388EE93E0909372238093B5
:104F1000712380E490E09093B7228093B62280E2E0
:104F20009EE424EF31E0F9013197F1F70197D9F7C9
:104F300003C0209709F4B7C00E944B3F8091BE2266
:104F4000813039F480E060E046E652E020E00E94E3
:104F500053438091BE22823009F093C01092B6284C
:104F600080E060E044E552E020E00E94534383E0AB
:104F700064E00E94E725892BE9F080E061E043E4EA
:104F800052E020E00E94534388EE93E09093722316
:104F90008093712380E490E09093B7228093B622AF
:104FA00080E29EE424EF31E0F9013197F1F70197B7
:104FB000D9F720C080E197E224EF31E0F901319781
:104FC000F1F70197D9F780E061E04FE252E020E08D
:104FD0000E94534380E062E04BE152E020E00E94F7
:104FE000534380E29EE424EF31E0F9013197F1F779
:104FF0000197D9F78EE464E00E94E725892BE9F058
:1050000080E063E048E052E020E00E94534388EEF5
:1050100093E0909372238093712380E490E09093C7
:10502000B7228093B62280E29EE424EF31E0F901BA
:105030003197F1F70197D9F720C080E197E224EF8B
:1050400031E0F9013197F1F70197D9F780E061E09C
:1050500043EF51E020E00E94534380E062E04EEDD8
:1050600051E020E00E94534380E29EE424EF31E0CF
:10507000F9013197F1F70197D9F784E190E00E94A7
:10508000E78B80E061E045E10E94764380E061E0EB
:1050900045ED51E020E00E94534389E061E04C2F50
:1050A00020E00E9475455E9ADF91CF910895FF92AE
:1050B0000F931F9385E00E94C22F0E942C2780919E
:1050C000BE22882309F4B1C180E062E041EC51E0E6
:1050D00020E00E9453435E9880ED97E024EF31E09A
:1050E000F9013197F1F70197D9F70E94D88C84E143
:1050F00090E00E94E78B81E56EE70E94E725892B0F
:1051000011F410E008C080E064E04FEB51E020E0D3
:105110000E94534311E06091C32880E00E94E7257C
:10512000892B19F081E00E940627F12EF394812F3C
:1051300064E04DEB51E020E00E9453436091C328AE
:105140008BE40E94E725892B19F082E00E94062754
:105150000F2D0F5F8F2D64E04BEB51E020E00E949C
:1051600053436091C32881E00E94E725892B19F001
:1051700083E00E940627102F1F5F802F64E049EB19
:1051800051E020E00E9453436091C3288CE40E94C8
:10519000E725892B19F084E00E940627012F0F5F75
:1051A000812F64E047EB51E020E00E9453438DE003
:1051B00060E00E94E725892B19F085E00E94062710
:1051C000102F1F5F802F64E045EB51E020E00E942C
:1051D000534382E063E00E94E725892B19F086E0C3
:1051E0000E940627012F0F5F812F64E043EB51E0FF
:1051F00020E00E9453436091AF2885E00E94E7259C
:10520000892B19F087E00E940627102F1F5F802F3F
:1052100064E041EB51E020E00E9453436091AF28ED
:1052200080E50E94E725892B19F088E00E94062777
:10523000012F0F5F812F64E04FEA51E020E00E94D0
:1052400053436091B22889E00E94E725892B19F029
:1052500089E00E940627102F1F5F802F64E04DEA2F
:1052600051E020E00E9453436091B22884E50E94FF
:10527000E725892B19F08AE00E940627012F0F5F8E
:10528000812F64E04BEA51E020E00E94534360919B
:10529000BC2884E00E94E725892B19F08BE00E944E
:1052A0000627102F1F5F802F64E049EA51E020E0BD
:1052B0000E9453436091BC288FE40E94E725892B0C
:1052C00019F08CE00E940627012F0F5F812F64E008
:1052D00047EA51E020E00E94534388E061E00E94E9
:1052E000E725892B19F08DE00E940627102F1F5FFC
:1052F000802F64E045EA51E020E00E9453438BE0B8
:1053000061E00E94E725892B19F08EE00E940627B4
:10531000012F0F5F812F64E043EA51E020E00E94FB
:10532000534383E064E00E94E725892B19F08FE066
:105330000E940627102F1F5F802F64E041EA51E092
:1053400020E00E9453438EE464E00E94E725892B0D
:1053500019F080E10E940627012F0F5F812F64E082
:105360004FE951E020E00E9453436091B12886E06C
:105370000E94E725892B19F081E10E940627802FE2
:1053800064E04DE951E020E00E9453436091B12870
:1053900081E50E94E725892B19F082E10E9406270A
:1053A000802F8F5F64E04BE951E020E00E9453437F
:1053B0005E9A8091BF22882311F180E062E049E883
:1053C00051E020E00E9453438091BF2260E00E94A0
:1053D0009A4588EE93E0909372238093712380E442
:1053E00090E09093B7228093B62280E29EE424EF6F
:1053F00031E0F9013197F1F70197D9F709C080E061
:1054000062E047E751E020E00E9453430E94D0371A
:1054100084E190E00E94E78B80E29EE424EF31E09B
:10542000F9013197F1F70197D9F71F910F91FF908B
:10543000089520E030E048E853E105C0FA013197D3
:10544000F1F72F5F3F4F28173907C4F30895CF9323
:10545000DF93EC0140E020E030E0FE01E20FF31FBB
:10546000E40FF11D80818D3209F44F5FFB01E20FE3
:10547000F31FDE01A20FB31FA40FB11D8C91808317
:105480002F5F3F4F2E30310541F7DF91CF910895C7
:105490001BC00E943A8ABC01807022E080309207D3
:1054A000C9F022E08130920720F48050914041F40D
:1054B000089524E08030920769F08050984051F0C0
:1054C00087E293E20E94393B87E293E20E94093B24
:1054D0008823F9F208955F926F927F928F929F9244
:1054E000AF92BF92CF92DF92EF92FF920F931F93F2
:1054F000DF93CF930F92CDB7DEB7182F092F562E1B
:105500008091C0228F5F8093C022815061E043E68A
:1055100053E020E00E942343212F302FC9017C015A
:10552000CC2498E8A92E93E1B92E3E010894611C81
:10553000711C84EF882E81E0982E49C0F70180818C
:105540000E94578A892B09F445C080910001882365
:1055500041F484EF91E0F4013197F1F70197D9F725
:1055600032C0813011F0833021F4C5010197F1F789
:105570002AC0823041F5DD2423C00E94482AC5019B
:105580000197F1F70F5F1F4F0A3C110531F087E2D9
:1055900093E20E94003B882381F787E293E2B30104
:1055A0000E94153BF70190818981891761F0892F4D
:1055B0000E94578A892B71F0D394F3E0DF1619F01B
:1055C00000E010E0DFCFC3940894E11CF11CC51487
:1055D00008F4B4CF0F90CF91DF911F910F91FF90FE
:1055E000EF90DF90CF90BF90AF909F908F907F9083
:1055F0006F905F900895DF92EF92FF920F931F9349
:10560000DF93CF93CDB7DEB764970FB6F894DEBFC4
:105610000FBECDBFD82EF62EE72E88E893E124EFFB
:1056200031E0F9013197F1F70197D9F7ED2DF0E06D
:10563000E231F10508F0CEC0EA5BFF4F8E010F5F4B
:105640001F4FEE0FFF1F0590F491E02D0994C80144
:105650006EE573E00E945D92EEEBF8E2DE011596D6
:1056600081918D9388E2E23CF807D1F7198671C0E9
:10567000C80169E573E06BC0C80164E573E067C009
:10568000C8016FE473E063C0C8016AE473E05FC0FF
:10569000C80165E473E05BC0C80160E473E057C013
:1056A000C8016DE373E053C0C80169E373E04FC004
:1056B000C80165E373E04BC0C80160E373E047C015
:1056C000C8016BE273E00E945D92F8010190002036
:1056D000E9F731978F2D9E2D9C01D9018CE00D901B
:1056E00001928150E1F7198A34C0C80166E273E083
:1056F0002EC0C80161E273E02AC0C8016CE173E00A
:1057000026C0C80167E173E022C0C80162E173E00E
:105710000E945D928091E92E6FE778E29E012B5FF7
:105720003F4FE82FF0E0AF01460F571F06C0DB01E7
:105730008D91BD01D9018D939D0164177507B9F74E
:10574000EC0FFD1F158205C0C8016DE073E00E94DB
:105750005D928E010F5F1F4FC8016BE073E00E94E6
:1057600052920E94482A87E293E20E945A3BF80133
:1057700001900020E9F73197E01BF10BC8016E2F73
:105780000E946B2ABEE0DB1641F18DE0D81629F1AC
:1057900000E010E028E8E22E23E1F22E15C00E947E
:1057A000482A87E293E266E073E00E94B33B8823D5
:1057B000A1F487E293E26EEF72E00E94B33B88238C
:1057C00049F4C7010197F1F70F5F1F4FA7E0023DB2
:1057D0001A0729F720E030E002C021E030E0C901DB
:1057E00064960FB6F894DEBF0FBECDBFCF91DF91A8
:1057F0001F910F91FF90EF90DF9008951F931092EB
:10580000000110E080E060E070E00E94FB2A892B3C
:1058100019F41F5F1330B1F782E0809300011F91EC
:1058200008950F931F93CF93DF93C0E0D0E008E873
:1058300013E105C00E94482AC8010197F1F721969B
:10584000C433D105B9F787E293E262E973E00E94BD
:10585000B33BDF91CF911F910F910895EF92FF928B
:105860000F931F93CF93DF938C01C0E0D0E038E813
:10587000E32E33E1F32E3FC00E94482A87E293E2F1
:1058800067E873E00E94B33B8823E9F487E293E280
:105890006FE773E00E94B33B882369F088EE93E0E2
:1058A00024EF31E0F9013197F1F70197D9F781E061
:1058B0008093000126C087E293E265E673E00E94D0
:1058C000B33B882331F00E94112C0E94FE2B82E012
:1058D000EFCF98010115110511F021E030E080E0D3
:1058E00090E005C0C7010197F1F781E090E08217D1
:1058F0009307C4F321960C171D0708F0BDCF8091C4
:105900000001DF91CF911F910F91FF90EF900895CB
:10591000CF92DF92EF92FF920F931F93DF93CF937B
:105920000F92CDB7DEB788E893E124EF31E0F901BB
:105930003197F1F70197D9F780E090E00E942E2C83
:10594000823089F110E00BE26E010894C11CD11C79
:1059500044EFE42E41E0F42E0983C60161E00E9489
:105960006B2A88E99AE3F7013197F1F70197D9F7A4
:105970001F5F143089F782E060E070E00E94FB2A2C
:10598000892BC1F00E94FE2B83E060E070E00E9452
:10599000FB2A892B79F00E94FE2B80E197E20E947E
:1059A0002E2C823039F487E293E20E945A3B21E0A8
:1059B00030E002C020E030E0C9010F90CF91DF91CC
:1059C0001F910F91FF90EF90DF90CF900895CF93AC
:1059D000DF93EC0180E090E00E942E2C813021F1D9
:1059E0000E94FE2B86E0BE010E94FB2A892BE1F07B
:1059F0000E94FE2B84E0BE010E94FB2A892BA1F0AD
:105A00000E94FE2B81E060E070E00E94FB2A892B5F
:105A100059F080E69AEE0E942E2C20E030E0813092
:105A200029F421E030E002C020E030E0C901DF913C
:105A3000CF9108950F931F93DF93CF930F92CDB71C
:105A4000DEB78C01698380E090E00E942E2C8230CA
:105A500019F420E030E013C0CE01019661E00E940D
:105A60006B2AC80169810E946B2A80E090E00E9445
:105A70002E2C20E030E0813011F421E030E0C9012B
:105A80000F90CF91DF911F910F9108951F93182FC1
:105A900080E090E00E942E2C813019F420E030E06C
:105AA0002CC080910101181731F1112389F487E08E
:105AB00060E070E00E94FB2A892BA9F0109201019E
:105AC0000E94FE2B86E060E070E00E94FB2A0BC083
:105AD000113049F488E060E070E00E94FB2A892BD5
:105AE00011F0109301010E94FE2B20E030E0809124
:105AF0000101181711F421E030E0C9011F91089548
:105B00008F929F92AF92BF92CF92DF92EF92FF92CD
:105B10000F931F93DF93CF93CDB7DEB7CF5FD04006
:105B20000FB6F894DEBF0FBECDBFD82EB92E0E949F
:105B3000FE2B80E00E94462D892B09F47EC085E073
:105B400060E070E00E94FB2A892B09F476C000E235
:105B50001EE4E8E8EE2EE3E1FE2E0E94482A015002
:105B60001040C7010197F1F701151105B1F787E260
:105B700093E26BEE72E00E94B33B882371F300E086
:105B800010E078E8E72E73E1F72E0E94482AC7015B
:105B90000197F1F70F5F1F4F8AEE00361807A9F73C
:105BA000ED2CFB2CDD244E010894811C911C66E138
:105BB000A62EB12CAC0EBD1E5CE0C52E36C087E211
:105BC00093E2B8010E94153B0F5F1F4F87E293E2FB
:105BD00068EE72E00E94AE3B882389F3F8011082E0
:105BE0008981882311F1C4016CED72E00E947292E8
:105BF000892B49F087E293E20E945A3B0E94FE2BD8
:105C000021E030E01CC087ED92E0B50144E050E0B7
:105C10000E946492892B49F0DC9CB00111246E0D26
:105C20007F1DC5010E94272AD39487E293E20E9438
:105C3000003B882311F48401C9CF20E030E0C90182
:105C4000C150DF4F0FB6F894DEBF0FBECDBFCF916E
:105C5000DF911F910F91FF90EF90DF90CF90BF9059
:105C6000AF909F908F9008956F927F928F929F92A6
:105C7000AF92BF92CF92DF92EF92FF920F931F935A
:105C8000DF93CF930F92CDB7DEB75C01C62E7A01BA
:105C90001982DD2400E010E03E010894611C711CB3
:105CA000F8E88F2EF3E19F2E36C0DC1419F421E0C2
:105CB00030E03CC00E94482A87E293E20E94003B09
:105CC000882331F580E090E00E942E2C813061F530
:105CD00087E293E20E94003B8823D1F489818823E4
:105CE00079F487E293E2B3010E94153B89818C1518
:105CF00011F019820DC080ED97E0E80EF91E08C082
:105D0000B5016D0D711D87E293E20E94153BD3949E
:105D1000C4010197F1F70F5F1F4F0330110521F008
:105D2000E114F10409F0C1CF20E030E0C9010F9087
:105D3000CF91DF911F910F91FF90EF90DF90CF9067
:105D4000BF90AF909F908F907F906F9008951F931A
:105D5000CF93DF931092C02243980E944B3F80E084
:105D600060E045E953E020E00E94234380ED97E0A6
:105D700024EF31E0F9013197F1F70197D9F7E8E81D
:105D8000F8E29AE08081803219F09093E92E04C005
:105D9000915031979923B1F784E190E00E94208AD5
:105DA00087E293E263EC72E244E650E00E94F63A46
:105DB00088EE93E024EF31E0F9013197F1F7019794
:105DC000D9F70E94482A87E293E20E945A3B80E07A
:105DD00060E070E00E94FB2A83E0809300018EE087
:105DE00060E070E00E94FB2A8DE060E070E00E94BD
:105DF000FB2A80E060E070E00E94FB2A892B09F01A
:105E00004EC080E490E00E94208A88EE93E024EF68
:105E100031E0F9013197F1F70197D9F780E060E0BF
:105E200070E00E94FB2A8DE060E070E00E94FB2A97
:105E30008EE060E070E00E94FB2A80E060E070E0AD
:105E40000E94FB2A892B09F494C080E060E070E096
:105E50000E94FB2A892B19F58CC0CA010197F1F722
:105E600021503040D1F780E060E070E00E94FB2AD2
:105E70008DE060E070E00E94FB2A8EE060E070E060
:105E80000E94FB2A80E060E070E00E94FB2A80E034
:105E900060E070E00E94FB2A892B09F462C082E076
:105EA000809300018AE060E070E00E94FB2AEC0130
:105EB00084E190E00E94208A88EE93E024EF31E0B4
:105EC000F9013197F1F70197D9F783E060E070E0CD
:105ED0000E94FB2A892B19F010E0CD2B09F411E068
:105EE00088E060E070E00E94FB2A892B09F411E051
:105EF00089E060E070E00E94FB2A892B09F411E040
:105F000080E160E070E00E94FB2A892B09F411E037
:105F100088EB9BE024EF31E0F9013197F1F701972D
:105F2000D9F781E160E070E00E94FB2A892B09F437
:105F300011E08CE060E070E00E94FB2A83E0809337
:105F400000018BE060E070E00E94FB2A81E080931A
:105F50000101439A112331F40E94C63721E030E059
:105F600003C0439A20E030E0C901DF91CF911F9137
:105F7000089581E890E00E94208A28EE33E044EF03
:105F800051E06BCF429A289A469A459A823051F056
:105F9000833018F48823F9F008958530C1F08630F5
:105FA00071F517C08091C9008F7E8093C9008091E0
:105FB000C900877F8093C9008091C9008F77809343
:105FC000C900529853985A985B98429808954598FA
:105FD0000895469808958091C9008F7E8093C900E6
:105FE0008091C900877F8093C9008091C9008F7715
:105FF0008093C900529853985A985B9828980895AE
:106000000E944B3F87E490E00E94AF54AC0180E0D7
:1060100060E022E00E945C4385E490E00E94AF547F
:10602000AC0180E061E022E00E945C4384E490E007
:106030000E94AF54AC0180E063E020E00E945C432A
:1060400080E064E04FEB53E020E00E94234380E0D7
:1060500065E049EA53E020E00E94234388E490E0B1
:106060000E94AF54AC0180E066E020E00E945C43F7
:106070008AE290E00E94AF54AC018CE067E020E03F
:106080000E945C4380E00E94C22F5E9880E20E94E2
:10609000FA818823D9F380EF0E94FA815E9A809179
:1060A0002324813011F486E001C085E00E94C22FD4
:1060B00008950E944B3F8DE390E00E94AF54AC01E5
:1060C00080E060E022E00E945C4385E490E00E9472
:1060D000AF54AC0180E061E022E00E945C4384E4C4
:1060E00090E00E94AF54AC0180E063E020E00E94A9
:1060F0005C4382E490E00E94AF54AC0180E064E035
:1061000020E00E945C4386E490E00E94AF54AC0122
:1061100080E065E020E00E945C438AE290E00E941B
:10612000AF54AC018CE067E020E00E945C4380E06B
:106130000E94C22F80E20E94FA818823D9F380EF67
:106140000E94FA8180912324813011F486E001C0FD
:1061500085E00E94C22F08950E944B3F8DE390E09E
:106160000E94AF54AC0180E060E022E00E945C43FA
:1061700083E490E00E94AF54AC0180E061E020E055
:106180000E945C4384E490E00E94AF54AC0180E044
:1061900063E020E00E945C4380E490E00E94AF5402
:1061A000AC0180E064E020E00E945C4386E490E083
:1061B0000E94AF54AC0180E065E020E00E945C43A7
:1061C0008AE290E00E94AF54AC018CE067E020E0EE
:1061D0000E945C4382E00E94C22F80E20E94FA810A
:1061E0008823D9F380EF0E94FA81809123248130A3
:1061F00011F486E001C085E00E94C22F08950E943C
:106200004B3F80E060E043E454E022E00E942343FF
:1062100080E061E04DE254E022E00E94234380E010
:1062200063E047E154E020E00E94234380E064E023
:1062300041E054E020E00E94234380E065E04BEE23
:1062400053E020E00E94234380E066E045ED53E008
:1062500020E00E9423438AE290E00E94AF54AC0108
:106260008CE067E020E00E945C43439882E00E945B
:10627000C22F80E20E94FA818823D9F380EF0E9426
:10628000FA8180912324813011F486E001C085E0F9
:106290000E94C22F439A08950E944B3F8DE390E0E5
:1062A0000E94AF54AC0180E060E022E00E945C43B9
:1062B00081E490E00E94AF54AC0180E061E022E014
:1062C0000E945C438FE390E00E94AF54AC0180E0F9
:1062D00063E020E00E945C4382E490E00E94AF54BF
:1062E000AC0180E064E020E00E945C4386E490E042
:1062F0000E94AF54AC0180E065E020E00E945C4366
:106300008AE290E00E94AF54AC018CE067E020E0AC
:106310000E945C43439880E00E94C22F80E20E946A
:10632000FA818823D9F380EF0E94FA818091232497
:10633000813011F486E001C085E00E94C22F439AAB
:1063400008950E944B3F8091B028813009F053C0DE
:106350008DE390E00E94AF54AC0180E060E022E069
:106360000E945C438EE390E00E94AF54AC0180E059
:1063700061E020E00E945C438FE390E00E94AF5414
:10638000AC0180E063E020E00E945C4380E490E0A8
:106390000E94AF54AC0180E064E020E00E945C43C6
:1063A00086E490E00E94AF54AC0180E065E020E01C
:1063B0000E945C438AE290E00E94AF54AC018CE002
:1063C00067E020E00E945C43439882E00E94C22F75
:1063D00080E20E94FA818823D9F380EF0E94FA813B
:1063E00080912324813011F486E001C085E00E9471
:1063F000C22F439A08958BE390E00E94AF54AC0102
:1064000080E061E020E00E945C438CE390E00E9429
:10641000AF54AC0180E061E020E00E945C4386E381
:1064200090E00E94AF54AC0180E062E020E00E9466
:106430005C4387E390E00E94AF54AC0180E063E0EE
:1064400020E00E945C4388E390E00E94AF54AC01DE
:1064500080E064E020E00E945C4389E190E00E94DB
:10646000AF54AC018CE067E020E00E945C4380E226
:106470000E94FA818823D9F380EF0E94FA8108955F
:106480004F925F926F927F928F929F92AF92BF9244
:10649000CF92DF92EF92FF920F931F93DF93CF93F0
:1064A0000F92CDB7DEB7E0914723F0E0E25DFC4DFF
:1064B000808189830E944B3F80E063E044E954E09F
:1064C00020E00E94234380E064E045E854E020E0BF
:1064D0000E94234381E48093452380ED97E024EFDD
:1064E00031E0F9013197F1F70197D9F71092D223F2
:1064F00084E190E09093EE2E8093ED2E00E0F1E6A3
:106500004F2E552453943E010894611C711CE1E008
:106510008E2E912C74E1C72ED12C64EFA62E61E053
:10652000B62E11E150E2E52E52E0F52EAFC02DB7A8
:106530003EB7275030400FB6F8943EBF0FBE2DBF78
:10654000EDB7FEB73196ADB7BEB711964C9211823A
:10655000528274826382968285820E94E58C2DB776
:106560003EB7295F3F4F0FB6F8943EBF0FBE2DBF19
:106570008091D223882331F48091ED2E9091EE2EDC
:10658000892BB1F78091ED2E9091EE2E892B09F495
:1065900062C00E944A8C4981E091D423F091D523B6
:1065A0008081481709F049C08EE064E050E022E0A5
:1065B00030E000E00E940948E091D423F091D52317
:1065C0008191819FD00111248091472390E0019710
:1065D0009C012E9DC0012F9D900D3E9D900D11247C
:1065E000A80FB91FAA5CBB4D80E101900D928150AC
:1065F000E1F7E091D423F091D523208130E0809120
:10660000472390E00197F90144E0EE0FFF1F4A9500
:10661000E1F7E20FF31FDC01AE9DC001AF9D900DCD
:10662000BE9D900D1124E80FF91FEA5CFB4D108A06
:1066300089818F5F898300E007C088EE93E0F501D0
:106640003197F1F70197D9F7D092EE2EC092ED2E47
:106650001092D2231BC00F5FD092EE2EC092ED2E6F
:106660000233A0F080E062E046E754E020E00E94C0
:10667000234384E690E09093EE2E8093ED2E80915C
:10668000ED2E9091EE2E892BD1F704C089818032B6
:1066900008F44DCFE0914723F0E0E25DFC4D8981A5
:1066A00080830F90CF91DF911F910F91FF90EF901A
:1066B000DF90CF90BF90AF909F908F907F906F9022
:1066C0005F904F9008952F923F924F925F926F92FA
:1066D0007F928F929F92AF92BF92CF92DF92EF9272
:1066E000FF920F931F93DF93CF930F92CDB7DEB737
:1066F0000E944B3F88EC90E09093EE2E8093ED2E1D
:10670000E0914723F0E0E25DFC4D8081803210F49F
:106710000E9440328091ED2E9091EE2E892B09F44B
:10672000B6C284E4809345231092D22388EC90E093
:106730009093EE2E8093ED2E8AE089832DB73EB79D
:10674000275030400FB6F8943EBF0FBE2DBFEDB7B7
:10675000FEB7319684E6ADB7BEB711968C93118221
:1067600081E08283CE0101969483838381E090E06F
:10677000968385830E94E58C8CE291E09093F02EC5
:106780008093EF2EFF2400E010E02DB73EB7295F85
:106790003F4F0FB6F8943EBF0FBE2DBF40E2C42E50
:1067A00042E0D42E8091472390E001978C9DA00178
:1067B0008D9D500D9C9D500D1124400F511F4A5C22
:1067C0005B4D80E06F2D20E00E94F242F3940F5E5B
:1067D0001F4F37E0F31631F7FF2438EC832E912C4E
:1067E00024E6E22E1E010894211C311C91E0492E62
:1067F000512C80E2682E82E0782E8091D22388236B
:1068000009F48CC00E944A8CA090D423B090D52368
:1068100082E090E00E94AF54AC0180E067E020E0AD
:106820000E945C434F2D4F5F85E067E00E940A465F
:10683000809147238130B1F0823001F583E067E039
:1068400043E754E020E00E94234383E167E040E710
:1068500054E020E00E94234387E0F89E6001112469
:1068600010E011C083E067E04DE654E020E00E94B4
:10687000234383E167E04AE654E0EBCF83E167E03E
:1068800048E654E0E6CFF601E10FF11D3196EE0F38
:10689000FF1FEA0DFB1D4081518198ED413F5907D3
:1068A00014F426E015C0ACEF49315A0774F0BFEF7D
:1068B0004D395B0764F023E0473E520714F423E0B0
:1068C00007C037E24F30530714F025E001C024E041
:1068D00085E1821B612F30E000E00E949E4784E04A
:1068E000F81691F4143080F080E064E045E10E94F5
:1068F000764380E065E045E10E94764380E066E013
:1069000045E10E94764317E01F5F173008F4BBCFC4
:106910009092EE2E8092ED2E1092D2238091EF2E47
:106920009091F02E892B31F59AE09983ADB7BEB7DF
:1069300017970FB6F894BEBF0FBEADBFEDB7FEB749
:1069400031961196EC921182B1E0B28334822382A7
:10695000568245820E94E58C2CE231E03093F02E85
:106960002093EF2E8DB79EB707960FB6F8949EBF73
:106970000FBE8DBF80E80E94FA81882309F446C0CB
:10698000FA9494E09F1510F414E0F12E0E944B3F0E
:10699000A7E0FA9E6001112400E0C601800F911D5E
:1069A000AC01B4E0440F551FBA95E1F7480F591FE9
:1069B0008091472390E001979C01269DC001279D6F
:1069C000900D369D900D1124480F591F4A5C5B4D68
:1069D00080E0602F20E00E94F24234E0F31691F450
:1069E000043080F080E064E045E10E94764380E07E
:1069F00065E045E10E94764380E066E045E10E9463
:106A0000764307E00F5F073040F24AC080E40E94FF
:106A1000FA81882309F444C0F39484E08F1508F4C4
:106A2000FF240E944B3F97E0F99E6001112400E093
:106A3000C601800F911DAC01A4E0440F551FAA951B
:106A4000E1F7480F591F8091472390E00197DC013F
:106A5000A69DC001A79D900DB69D900D1124480FD5
:106A6000591F4A5C5B4D80E0602F20E00E94F2429B
:106A7000B4E0FB1691F4043080F080E064E045E17E
:106A80000E94764380E065E045E10E94764380E025
:106A900066E045E10E94764307E00F5F073040F271
:106AA00010914623113009F09BC080E10E94FA81C9
:106AB000882309F495C019822DB73EB7275030407E
:106AC0000FB6F8943EBF0FBE2DBFEDB7FEB731969F
:106AD000ADB7BEB71196EC92118212833482238235
:106AE000568245820E94E58C80ED97E02DB73EB737
:106AF000295F3F4F0FB6F8943EBF0FBE2DBFE4EFA6
:106B0000F1E03197F1F70197D1F780914723813078
:106B100019F40E94628E02C00E94A58C9092EE2E03
:106B20008092ED2E80ED97E0E4EFF1E03197F1F700
:106B30000197D1F7E0914723F0E0E25DFC4D8081C1
:106B4000803210F40E94403284E4809345231092F6
:106B5000D2239092EE2E8092ED2E3AE039838DB7BB
:106B60009EB707970FB6F8949EBF0FBE8DBFEDB7C7
:106B7000FEB73196ADB7BEB71196EC921182B1E077
:106B8000B28334822382568245820E94E58C2DB7DF
:106B90003EB7295F3F4F0FB6F8943EBF0FBE2DBFE3
:106BA0000E944B3FFF2400E010E08091472390E0DB
:106BB0000197869DA001879D500D969D500D112433
:106BC000400F511F4A5C5B4D80E06F2D20E00E941A
:106BD000F242F3940F5E1F4F37E0F31631F7FF24B4
:106BE00080E20E94FA81882339F48091ED2E909101
:106BF000EE2E892B09F001CE80EF0E94FA811982D6
:106C00008DB79EB707970FB6F8949EBF0FBE8DBF86
:106C1000EDB7FEB7319684E6ADB7BEB711968C934B
:106C2000118281E08283CE0101969483838381E087
:106C300090E0968385830E94E58C10924523109204
:106C4000D2238091ED2E9091EE2E2DB73EB7295F85
:106C50003F4F0FB6F8943EBF0FBE2DBF892BA9F44E
:106C60000E944B3F80E062E049E554E020E00E9452
:106C7000234384E690E09093EE2E8093ED2E809156
:106C8000ED2E9091EE2E892BD1F70E94A58C0F90BE
:106C9000CF91DF911F910F91FF90EF90DF90CF90F8
:106CA000BF90AF909F908F907F906F905F904F902C
:106CB0003F902F9008953F924F925F926F927F92F4
:106CC0008F929F92AF92BF92CF92DF92EF92FF92FC
:106CD0000F931F93DF93CF930F92CDB7DEB788E466
:106CE000809345230E944B3F82E090E00E94AF5486
:106CF000AC0180E067E020E00E945C438091472384
:106D0000813061F480E060E049E455E022E00E94D7
:106D1000234383E167E046E455E01BC080914623AE
:106D2000823061F480E060E040E355E022E00E94C0
:106D3000234383E167E04DE255E00BC080E060E073
:106D400047E155E022E00E94234383E167E044E10C
:106D500055E020E00E9423431092D22384EF91E07B
:106D60009093EE2E8093ED2E8CEF898310E058E601
:106D7000452E332433944E010894811C911C41E02C
:106D8000A42EB12C55245A9434EFC32E31E0D32EC7
:106D900024EFE22E21E0F22E9EEF692E0DEF8CEF14
:106DA000782E2DB73EB7275030400FB6F8943EBF2F
:106DB0000FBE2DBFEDB7FEB73196ADB7BEB711967A
:106DC0004C921182328294828382B682A5820E9482
:106DD000E58C598284EC99E02DB73EB7295F3F4F8F
:106DE0000FB6F8943EBF0FBE2DBFF6013197F1F7F5
:106DF0000197D9F78091D2238823E9F10E944A8C28
:106E000080914623882341F510915F2F11561093EE
:106E10004623113081F460E04EEF54E022E00E94FE
:106E2000234383E167E04BEF54E020E00E942343DB
:106E30001093472311C080E060E045EE54E022E06B
:106E40000E94234383E167E042EE54E020E00E9489
:106E5000234382E0809347231092B12F80E062E0C9
:106E600041E65FE20E94C3421092D223F092EE2EDE
:106E7000E092ED2E11E080E80E94FA81882331F43F
:106E800080E862E00E945382882311F0698239C051
:106E900080E40E94FA81882331F480E462E00E9459
:106EA0005382882311F009832CC0809146238130BE
:106EB00041F580E10E94FA81882319F180914723EE
:106EC000813071F40E94628E80E060E04CEC54E00E
:106ED00022E00E94234383E167E049EC54E00DC0C7
:106EE0000E94A58C80E060E043EB54E022E00E9429
:106EF000234383E167E040EB54E020E00E9423431A
:106F0000798280E20E94FA81882339F48091ED2E03
:106F10009091EE2E892B09F044CF80EF0E94FA81E8
:106F2000109245231092D2238091ED2E9091EE2E57
:106F3000892BB9F4112311F00E944B3F80E062E0ED
:106F40004CE954E020E00E94234384E690E09093D3
:106F5000EE2E8093ED2E8091ED2E9091EE2E892BCA
:106F6000D1F70E94A58C0F90CF91DF911F910F91C7
:106F7000FF90EF90DF90CF90BF90AF909F908F9059
:106F80007F906F905F904F903F90089581E0809345
:106F9000B5286091B52882E190E00E94F8920895AA
:106FA00081E08093B6286091B62881E190E00E944C
:106FB000F8920895EF92FF920F931F93CF93DF9370
:106FC0001092C9281092CA281092CB281092CC286F
:106FD0001092C5281092C6281092C7281092C8286F
:106FE0001092CD281092CE281092CF281092D0283F
:106FF00089E691E09093D3288093D22880E090E0B6
:10700000FC01E457F74D128201968F319105C1F7CB
:10701000C0E0D0E084E695E060E00E94FB428E0193
:1070200095E0000F111F9A95E1F70C1B1D0BC8018D
:1070300080529F4F6C2F0E94F892C80183519F4F3E
:1070400060E00E94F892B8016B517F4F89EC98E2A2
:1070500044E050E00E94EE92B8016F517F4F85EC02
:1070600098E244E050E00E94EE92B80167517F4FF1
:107070008DEC98E244E050E00E94EE92B80162513B
:107080007F4F82ED98E242E050E00E94EE92C8010C
:1070900080519F4F60E00E94F892C8018F509F4F2F
:1070A00060E00E94F892C8018C509F4F6FEF0E94E1
:1070B000F892C8018E509F4F60E00E94F892C8017C
:1070C0008A509F4F60E00E94F8922196C733D10505
:1070D00009F0A0CFC0E0D0E083E2E82EF12C82E6F8
:1070E00095E060E00E94FB42CE9D8001CF9D100D97
:1070F000DE9D100D1124C8018F5C9F4F6C2F0E94E4
:10710000F892C8018E5C9F4F60E00E94F892C8011F
:107110008D5A9F4F60E00E94F892C8018E5A9F4F8F
:1071200060E00E94F8920D5C1F4F8EE898E2B80173
:107130004FE150E00E94EE922196C530D10579F6DC
:107140008FE595E060E00E94FB42DF91CF911F91B7
:107150000F91FF90EF90089580E090E060913524CA
:107160000E94F8926091E42881E090E00E94F892F9
:107170006091B72882E090E00E94F8926091C32865
:1071800083E090E00E94F8926091B12884E090E062
:107190000E94F8926091BC2885E090E00E94F892ED
:1071A0006091AF2886E090E00E94F8926091B2284A
:1071B00087E090E00E94F89260917A2888E090E061
:1071C0000E94F89260917E2889E090E00E94F892F7
:1071D0006091E3288AE090E00E94F89260918A280A
:1071E0008BE090E00E94F892609134248CE090E073
:1071F0000E94F892609123248DE090E00E94F89222
:107200006091BD288EE090E00E94F8926091B328D2
:107210008FE090E00E94F8926091B02880E190E0C9
:107220000E94F8926091B62881E190E00E94F89265
:107230006091B52882E190E00E94F8926091B428B4
:1072400083E190E00E94F89260918B2884E190E0C5
:107250000E94F89260917C2870917D2885E190E0F1
:107260000E940E9360917B2887E190E00E94F89243
:107270008EEB98E261E270E044E050E00E94EE9212
:107280008FE798E266E270E04AE050E00E94EE92FA
:1072900008950E944B3F80E060E040EB55E022E023
:1072A0000E94234380E061E045EA55E020E00E942F
:1072B000234380E062E04FE855E020E00E94234352
:1072C00089E8809335241092E4288EEF8093B728C4
:1072D00091E09093C32882E48093B1289093BC28D6
:1072E00080E18093AF2880E48093B22810927A28BE
:1072F00010927E2884E18093E32884E680938A2894
:1073000010923424109223241092BD289093B32815
:107310009093B0281092B6281092B5281092B428F5
:1073200090938B2890937B2880E797E190937D281A
:1073300080937C288EEB98E26AE875E00E945D926B
:107340008EEB98E261E270E044E050E00E94EE9241
:107350008FE798E26FE775E00E945D928FE798E211
:1073600066E270E04AE050E00E94EE926091B6283A
:1073700081E190E00E94F8926091B52882E190E06E
:107380000E94F89280E290E068E50E94F8920E94E4
:10739000AC380E94DA3780E066E049E655E020E04C
:1073A0000E94234382E167E046E655E020E00E9428
:1073B000234388EC90E0909372238093712380E8BC
:1073C00090E09093B7228093B62280E10E940482DD
:1073D0008823D9F388E893E124EF31E0F90131976C
:1073E000F1F70197D9F72998089580E290E00E947B
:1073F000DA92883509F0B5C080E090E00E94DA9218
:107400008093352481E090E00E94DA928093E42812
:1074100082E090E00E94DA928093B72883E090E0C7
:107420000E94DA928093C32884E090E00E94DA926E
:107430008093B12885E090E00E94DA928093BC2886
:1074400086E090E00E94DA928093AF2887E090E097
:107450000E94DA928093B22888E090E00E94DA924B
:1074600080937A2889E090E00E94DA9280937E28C7
:107470008AE090E00E94DA928093E3288BE090E02B
:107480000E94DA9280938A288CE090E00E94DA923F
:10749000809334248DE090E00E94DA92809323243C
:1074A0008EE090E00E94DA928093BD288FE090E019
:1074B0000E94DA928093B32880E190E00E94DA92F1
:1074C0008093B02881E190E00E94DA928093B62800
:1074D00082E190E00E94DA928093B52883E190E007
:1074E0000E94DA928093B42884E190E00E94DA92BC
:1074F00080938B2885E190E00E94E89290937D280C
:1075000080937C2887E190E00E94DA9280937B2828
:107510008EEB98E261E270E044E050E00E94CA9293
:107520008FE798E266E270E04AE050E00E94CA927B
:1075300088E190E00E94E292609376287093772829
:1075400080937828909379288CE190E00E94E292D1
:107550006093B8287093B9288093BA289093BB2879
:1075600008950E944939089588E190E00E94E292CE
:107570006093762870937728809378289093792861
:107580008CE190E00E94E2926093B8287093B92851
:107590008093BA289093BB280895AF92BF92CF9260
:1075A000DF92EF92FF920F931F937B018C015901A1
:1075B0006A0188E190E0B801A7010E9406938CE17E
:1075C00090E0B601A5010E9406931F910F91FF90D4
:1075D000EF90DF90CF90BF90AF900895FC01849121
:1075E00001C0849131968823E1F70895FC01558309
:1075F00044837783668313821282118210820895F6
:10760000FC0120E080819181892B09F421E0822F07
:107610000895FC0140E02481358180819181281703
:10762000390709F441E0842F0895CF93DF93EC01EB
:10763000DB0188819981892B11F480E017C0EE81EC
:10764000FF818A819B81E80FF91F80818C938A8159
:107650009B816C817D8101960E94EE919B838A8340
:107660008881998101979983888381E0DF91CF9107
:107670000895CF93DF93EC01462F6C817D812881A3
:1076800039816217730711F480E011C08A819B81F0
:10769000820F931F0E94EE91EE81FF81E80FF91F88
:1076A00040838881998101969983888381E0DF9165
:1076B000CF910895FC01118210821382128281E021
:1076C0000895CF92DF92EF92FF920F931F93CF9383
:1076D000DF93EC016B017A0100E010E019C0C801F2
:1076E0008E0D9F1D8217930778F58A819B818E0DE1
:1076F0009F1D6C817D81800F911F0E94EE91EE8114
:10770000FF81E80FF91F80818417F1F40F5F1F4F8D
:10771000F601E00FF11F4491288139814423F9F6E5
:107720008A819B818E0D9F1D6C817D81800F911FB1
:107730000E94EE919B838A832E193F09201B310BF7
:107740003983288381E001C080E0DF91CF911F91D0
:107750000F91FF90EF90DF90CF90089540E050E0C0
:107760000E94613B0895EF92FF920F931F93CF9376
:10777000DF938C017B01C0E0D0E00AC0C801B701F3
:10778000AE010E94613B882311F081E008C0219680
:10779000F80180819181C817D90780F380E0DF91DB
:1077A000CF911F910F91FF90EF900895FC01808180
:1077B0008093E12981818093E22982818093E3296A
:1077C00093819093E4296091E1297091E2290895D1
:1077D00090913123980F9093312380913223890F18
:1077E000809332230895CF92DF92EF92FF920F930E
:1077F0001F93CF93DF9380E80E94FA81882329F4B6
:1078000080913623823009F041C080913623813047
:10781000D1F10E944B3F80E060E047E459E020E076
:107820000E94234380E061E04BE359E020E00E94A6
:10783000234380E062E04FE259E020E00E942343CE
:1078400080E063E043E259E020E00E94234380E0CF
:1078500064E047E159E020E00E94234380E065E0D6
:107860004BE059E020E00E94234380E066E04FEFC8
:1078700058E020E00E94234380E067E043EF58E0B7
:1078800020E00E94234381E08093362380913323BC
:10789000813009F05EC080913423803309F059C0F3
:1078A00080913623882309F054C0C090E928CEEE99
:1078B000D8E2EE244BC080E1E81609F44AC087E024
:1078C0008E1510F010E001C01BE04881812F6E2D55
:1078D00050E023E030E000E00E9409484B81812F16
:1078E0008C5F6E2D50E022E030E00E9409488981D3
:1078F000282F30E0C90183709070039731F4812FF5
:10790000895F6E2D41EF58E01CC020FF06C0812F1B
:10791000895F6E2D4FEE58E014C09A81953030F09B
:10792000812F895F6E2D4DEE58E00BC0812F895F4E
:10793000923020F06E2D4BEE58E003C06E2D49EED4
:1079400058E020E00E942343E3942C96EC1408F4C2
:10795000B2CF80913623813009F06FC180913323FB
:10796000813009F084C080913423863009F07FC0D3
:107970008091EF28823049F0823060F0853050F4F9
:107980008BE060E046EE58E009C08BE060E043EE3B
:1079900058E004C08BE060E040EE58E020E00E9438
:1079A00023438091F0288370833029F481E160E0E3
:1079B0004EED58E004C081E160E04CED58E020E07D
:1079C0000E9423438091F02880FF05C08EE060E094
:1079D00049ED58E004C08EE060E046ED58E020E05C
:1079E0000E9423438BE061E0409114290E940A46E3
:1079F0008DEF98E20E94D63B9B01AC018BE062E0E8
:107A0000A90125E030E000E00E94094881E162E040
:107A100043ED58E020E00E942343E09012298FEFCD
:107A2000E89E7001112480911129E80EF11CC70114
:107A300064E670E00E94EE91AB018BE063E022E02F
:107A400030E00E9409488DE063E041ED58E020E01D
:107A50000E942343C70164E670E00E94EE91AC01EE
:107A60008EE063E022E030E001E00E94094880916E
:107A70003323813019F5809134238231F9F489EF71
:107A800098E20E94D63B20E13EE040E050E00E94B8
:107A9000C39120EA36E841E050E00E9415928BE065
:107AA00064E0A90123E030E000E00E9409488FE093
:107AB00064E04CEC58E020E00E94234380913323A3
:107AC000813009F0BAC080913423823009F0B5C00A
:107AD00089EE98E20E94D63B6B017C0120E836E9F2
:107AE00048E950E00E9415928AE065E0A90122E091
:107AF00030E000E00E9409488CE065E04AEC58E084
:107B000020E00E942343C701B60128EE33E040E0A5
:107B100050E00E941592CA01B90120E137E240E02D
:107B200050E00E9415929B01AC018DE065E0A90137
:107B300024E030E001E00E940948C701B6012AE0D4
:107B400030E040E050E00E941592CA01B90124E6FD
:107B500030E040E050E00E9415929B01AC0181E1D1
:107B600065E0A90122E030E00E9409488DEE98E22C
:107B70000E94D63B6B017C0120E836E948E950E0E1
:107B80000E9415928AE066E0A90122E030E000E060
:107B90000E9409488CE066E048EC58E020E00E9432
:107BA0002343C701B60128EE33E040E050E00E94D5
:107BB0001592CA01B90120E137E240E050E00E948D
:107BC00015929B01AC018DE066E0A90124E030E054
:107BD00001E00E940948C701B6012AE030E040E018
:107BE00050E00E941592CA01B90124E630E040E05D
:107BF00050E00E9415929B01AC0181E166E0A90171
:107C000022E030E00E94094885EF98E20E94D63BCE
:107C100028EE33E040E050E00E9415928BE067E0F0
:107C2000A90124E030E000E00E94094880E167E01B
:107C300046EC58E020E00E942343DF91CF911F9152
:107C40000F91FF90EF90DF90CF900895AF92BF9289
:107C5000CF92DF92EF92FF920F931F93DF93CF9318
:107C60000F92CDB7DEB70E944B3F82E08093362360
:107C7000809146238230A1F480E063E043E559E03F
:107C800020E00E94234384E690E09093EE2E8093C0
:107C9000ED2E8091ED2E9091EE2E892BD1F7E1C043
:107CA00080914723813011F00E94A58C0E94DF8DC6
:107CB00088EC90E09093EE2E8093ED2E198210E0E8
:107CC000FF24EE245E010894A11CB11C88ECC82E90
:107CD000D12CC5010E94B98B882309F4ACC0D09285
:107CE000EE2EC092ED2E143009F45DC0153050F424
:107CF000113031F1113098F0123049F1133009F0A0
:107D00009AC038C0163009F46BC0163008F45BC056
:107D1000173009F480C0183009F08DC080C0898107
:107D2000853B09F088C010923523109234231092BD
:107D3000332310923123109232230F2D11E07FC094
:107D40008981823609F079C00F2D12E078C029812F
:107D5000213009F072C0909131239F5F90933123BD
:107D600080913223890F80933223209333230F2D68
:107D700013E065C08981803339F0863029F0823183
:107D800019F0823009F059C0809334239091312347
:107D9000980F9093312380913223890F809332235F
:107DA0000F2D14E04CC009810B3F08F046C09091A4
:107DB0003123900F9093312380913223890F809348
:107DC000322315E03CC089818823B9F59091312395
:107DD00080913223890F809332230F2D16E02FC01C
:107DE0000F2D0150209135238981E22FF0E0EB51D6
:107DF000F74D808390913123980F90933123809198
:107E00003223890F809332232F5F20933523002361
:107E1000B1F417E014C0E9800F2D18E010C0809174
:107E20003123E81651F4998180913223981729F46F
:107E30000E94F33B02C00F2D02C00F2D10E080E224
:107E40000E94FA81882341F48091ED2E9091EE2ECC
:107E5000892B11F0F02E3DCF80EF0E94FA810E9415
:107E6000A58C0F90CF91DF911F910F91FF90EF9014
:107E7000DF90CF90BF90AF9008952C988EBD0DB439
:107E800007FEFDCF2C9A08952C988EBD0DB407FEE9
:107E9000FDCF2C9A08951F93CF93DF9380E090E05D
:107EA000FC01EA51F64D1082019624E080309207E1
:107EB000B9F710EB2B98812F0E943D3F80E10E9483
:107EC0003D3F80917A280E943D3F2B9AC0E0D0E050
:107ED00080E00E943D3F2196C038D105C9F71F5F61
:107EE000183B41F71092692E10926A2EDF91CF91C4
:107EF0001F91089588E893E10197F1F7089520E034
:107F000030E048E853E105C0FA013197F1F72F5FFF
:107F10003F4F28173907C0F308951F93182F109269
:107F2000692E10926A2E8CE58CBD81E08DBD2C9A55
:107F30002A9880E090E028E833E1F9013197F1F7E1
:107F400001968A309105C9F72A9A2C982B9880E4DB
:107F50000E943D3F1130A1F480917A28882329F4B2
:107F600081EA0E943D3F80EC04C080EA0E943D3FD0
:107F700088EC0E943D3F80917E28882349F406C00A
:107F800081EA0E943D3F80EC0E943D3F86EA01C0AD
:107F900087EA0E943D3F82EA0E943D3F8FE20E94B5
:107FA0003D3F88EF0E943D3F80E00E943D3F87E2D9
:107FB0000E943D3F113031F481E80E943D3F8091A5
:107FC000E32804C081E80E943D3F86E10E943D3FD6
:107FD0008CEA0E943D3F80E00E943D3F8FEA0E9474
:107FE0003D3F1130A1F460918A2870E0882777FD29
:107FF0008095982F0E94EE8F23E333E343E250E411
:108000000E94DB900E94C08F6093B30003C08FEF8B
:108010008093B3000E944B3F1F910895FF920F93EE
:108020001F938C01F62E2B98880F892F881F990B90
:10803000919580550E943D3F80917A280F77080FD7
:10804000802F82958F70805F0E943D3F802F8F70C0
:108050000E943D3F2B9A8F2D0E943D3F1F910F9113
:10806000FF900895CF93DF93C0E0D0E0FE01EA597E
:10807000F54D8081FE01EA51F64D80836081CE018D
:108080000E940E40219683E0C038D80779F7FE01A0
:10809000EA51F64D1082CE0160E00E940E4021961A
:1080A00084E0C030D80799F7DF91CF9108950F93FE
:1080B0001F93CF93DF93082F10E01695102F002702
:1080C000179507951370C0E0D0E0CE01800F911F87
:1080D000DC01AA51B64D2C91FE01E951F24D2083ED
:1080E0006C910E940E402196CE37D10571F7DF9139
:1080F000CF911F910F9108950F931F93CF93DF930B
:10810000082F10E01695102F00271795079513706C
:10811000C0E0D0E0CE01800F911FFE01E951F24D89
:108120002081FC01EA51F64D208360810E940E40BF
:108130002196CE37D10571F7DF91CF911F910F9125
:10814000089580916A2E8F5F80936A2E883028F080
:108150000E94324087E080936A2E0895982F87FD11
:108160003AC06034C0F5862F869586958695282F6F
:1081700030E03695322F222737952795290F311D6C
:10818000677081E090E0582F01C0550F6A95EAF7BB
:10819000652F3370413061F0413018F04230A1F466
:1081A0000DC0F901EA51F64D8081609586230BC020
:1081B000F901EA51F64D8081852B05C0F901EA519C
:1081C000F64D808185278083F901EA51F64D608163
:1081D000C9010E940E4008952F923F924F925F92E4
:1081E0006F927F928F929F92AF92BF92CF92DF92C7
:1081F000EF92FF920F931F93DF93CF93CDB7DEB72C
:1082000029970FB6F894DEBF0FBECDBF8E83A62E82
:108210000F83482E5524662E7724842F90E09D836B
:108220008C8384199509E22FF0E0FB83EA83AF0188
:108230004619570997FF04C022242A94322C06C0FD
:108240009C01009711F021E030E0190157FF04C0B4
:1082500088248A94982C07C09A014115510511F081
:1082600021E030E049016C0197FF04C0D094C19433
:10827000D108D3947A0157FF04C0F094E194F10837
:10828000F3948E816A2D4F810E94AE40EC14FD0460
:10829000A4F5C60162E070E00E9402922227332713
:1082A000261B370B39872887A22CB22CB40C00E090
:1082B00010E03E81432E552417C0488559854E0D48
:1082C0005F1D598748871416150634F4680C791C0D
:1082D0004C195D09598748878B2D662D4F810E9467
:1082E000AE40020D131DBA0CC801840D951DEC8122
:1082F000FD818E179F0709F733C0C70162E070E068
:108300000E94029222273327261B370B39872887A2
:108310008982B82CB60C00E010E06A2C772418C0D3
:10832000488559854C0D5D1D5987488714161506DB
:1083300034F4420C531C4E195F0959874887842D29
:108340006B2D4F810E94AE40080D191D5981B50E4D
:10835000C801860D971DEA81FB818E179F0701F7E3
:1083600029960FB6F894DEBF0FBECDBFCF91DF9137
:108370001F910F91FF90EF90DF90CF90BF90AF9043
:108380009F908F907F906F905F904F903F902F9035
:108390000895BF92CF92DF92EF92FF920F931F93B7
:1083A000CF93DF93182FB02E87FD1FE7603408F0BE
:1083B0006FE3C42EDD24862F90E0820F911DC10E45
:1083C000D11C21E8C216D10418F0E0E8CE2ED12C41
:1083D0007C0181E4E816F10418F070E4E72EF12C3A
:1083E000C62FD0E008C0812F6C2F4C2D2C2F0B2DC9
:1083F0000E94EC402196EC16FD06A8F7DF91CF9184
:108400001F910F91FF90EF90DF90CF90BF90089554
:10841000CF92DF92FF920F931F93CF93DF93C82EDB
:10842000D62E142FF22E82E0281779F470E0B3E0F4
:10843000660F771FBA95E1F786E0C89E802D11245C
:1084400045E027E001E00E94C9411F3DE1F0103EF8
:1084500038F4163D81F01C3D91F0143CA9F407C09E
:10846000163F59F01C3F69F0143E71F402C011E050
:108470000BC012E009C013E007C014E005C015E00E
:1084800003C016E001C01EE1CD2DD0E0D695DC2F53
:10849000CC27D795C79526E0C29EC0011124C80FEE
:1084A000D91FD3701F77129F9001112489010A539D
:1084B0001A4FFCECCF2EF5E0DF2EC20ED31EF801D2
:1084C0009491F2E0FF16D1F0FF1530F0FF2059F043
:1084D00081E0F81629F50CC0E3E0FE16A9F0F4E0FF
:1084E000FF16F1F416C0FE01EA51F64D908318C054
:1084F000FE01EA51F64D8081892B11C0FE01EA513F
:10850000F64D808189270BC0FE01EA51F64D80812E
:1085100005C0FE01EA51F64D808190958923808344
:10852000FE01EA51F64D6081CE010E940E400F5FC0
:108530001F4F21960C151D0509F0C1CFDF91CF917A
:108540001F910F91FF90DF90CF900895CF93DF930D
:10855000EC0113C08091692E60916A2E20E00E9488
:1085600008428091692E8F5F8093692E843120F0BC
:108570001092692E0E94A14021964881442351F710
:10858000DF91CF9108958093692E60936A2ECA017E
:108590000E94A64208951F93CF93DF93EC01162FFC
:1085A0001AC04A30A9F04D3019F41092692E12C049
:1085B0008091692E60916A2E212F0E94084280913D
:1085C000692E8F5F8093692E863120F01092692E7C
:1085D0000E94A14021964881442319F7DF91CF9151
:1085E0001F9108958093692E60936A2ECA01622FAD
:1085F0000E94CB4208951F93CF93DF93EC01162F77
:108600001AC04A30A9F04D3019F41092692E12C0E8
:108610008091692E60916A2E212F0E9408428091DC
:10862000692E8F5F8093692E863120F01092692E1B
:108630000E94A1402196FE014491442311F7DF914D
:10864000CF911F9108958093692E60936A2ECA017D
:10865000622F0E94FB4208951F93CF93DF93EC019A
:10866000162F19C04A3019F04D3021F411C00E9464
:10867000A14010C08091692E60916A2E212F0E9426
:1086800008428091692E8F5F8093692E863110F0A9
:108690001092692E2196FE014491442319F7DF912F
:1086A000CF911F9108958093692E60936A2ECA011D
:1086B000622F0E942C430895FF920F931F93CF9334
:1086C000DF93182FF62EEA01022F07C02196812F83
:1086D0006F2D202F0E9408421F5F48814423B1F76D
:1086E000DF91CF911F910F91FF9008950F931F93EA
:1086F000282F8093692E60936A2E90E0840F911D3D
:10870000469714F045E1421B042F020F122F08C0B8
:10871000812F60916A2E40E220E00E9408421F5F94
:108720001017B0F31F910F910895DF92EF92FF920F
:108730000F931F93CF93DF93F82ED02E87FF02C0A5
:108740001FE7F12E162F603408F01FE350E0C12F11
:10875000D0E0C20FD11D4F0D511D4138510510F011
:1087600040E850E0E42E8F2D612F212F0D2D0E9427
:10877000EC40C134D10510F0C0E4D0E08E2D612F63
:108780004E2D2C2F0D2D0E94EC408E2D6C2F4F2D39
:108790002C2F0E94EC408F2D6C2F4F2D212F0E94EB
:1087A000EC40DF91CF911F910F91FF90EF90DF9000
:1087B00008952F923F924F925F926F927F928F9285
:1087C0009F92AF92BF92CF92DF92EF92FF920F9360
:1087D0001F93CF93DF93682E762E8A01C22EC1E0BD
:1087E000D0E0C41BD50BCA01880F991F2224332463
:1087F000281A390A642F670D862D4C2D0E94AE4031
:10880000672D601B862D4C2D0E94AE40802F860D5B
:10881000672D4C2D0E94AE40862D801B672D4C2D60
:108820000E94AE404801AA24BB2403E0402E512CF4
:108830004DC0D7FD09C008948108910882E090E0FE
:10884000280E391EC20DD31D0894A11CB11CC40DE5
:10885000D51DDA2CD60C182D170D8D2D612F4C2D12
:108860000E94AE40E62CEA188E2D612F4C2D0E94FE
:10887000AE40172D18198D2D612F4C2D0E94AE4042
:108880008E2D612F4C2D0E94AE40E82CE60C1A2D47
:10889000170D8E2D612F4C2D0E94AE40962D9819EC
:1088A000092F892F612F4C2D0E94AE40172D1A19C8
:1088B0008E2D612F4C2D0E94AE40802F612F4C2DAC
:1088C0000E94AE4082E090E0480E591EA814B90400
:1088D0000CF4AFCFDF91CF911F910F91FF90EF90EC
:1088E000DF90CF90BF90AF909F908F907F906F90D0
:1088F0005F904F903F902F9008952F923F924F920C
:108900005F927F928F929F92AF92BF92CF92DF92AF
:10891000EF92FF920F931F93CF93DF93782EC62E83
:108920007A01C1E0D0E0C41BD50BCA01880F991FA2
:1089300022243324281A390A6E2D6C0D2C2D2E1961
:10894000872D472D01E00E94EC40472D4E198E2DBA
:10895000870D6C2D2C2D0E94EC404701AA24BB24CE
:1089600033E0432E512C3AC0D7FD09C0089481084A
:10897000910882E090E0280E391EC20DD31D0894A4
:10898000A11CB11CC40DD51DEA2CE70CD72CDA189C
:10899000282D2C0D8E2D622F4D2D01E00E94EC40D4
:1089A0002C2D28198E2D622F4D2D0E94EC40E82C85
:1089B000E70C972D9819192F2A2D2C0D8E2D622F2B
:1089C000492F0E94EC402C2D2A198E2D622F412F09
:1089D0000E94EC4082E090E0480E591EA814B904B1
:1089E0001CF2DF91CF911F910F91FF90EF90DF90DC
:1089F000CF90BF90AF909F908F907F905F904F905F
:108A00003F902F900895CF92DF92EF92FF920F93B5
:108A10001F93CF93DF93082F0E944B3F81E799E08C
:108A200060E00E94FB421092692E87E080936A2EDC
:108A300080E699E060E00E942C4382E080936A2EF9
:108A400010E07801EE0CFF1CEE0CFF1C0F5F1F4FB7
:108A50006801CC0CDD1CCC0CDD1C015010400295D3
:108A6000000F000F007C12E02EC08AE0E816F1042F
:108A70001CF44E2D405D02C04E2D495C80E060919B
:108A80006A2E20E00E9408421093692EC0E0D0E0D8
:108A9000402F4C0F8091692E60916A2E20E00E9439
:108AA00008428091692E8F5F8093692E2196C03194
:108AB000D10571F780916A2E8F5F80936A2E08949A
:108AC000E11CF11C005FEC14FD047CF2DF91CF91FE
:108AD0001F910F91FF90EF90DF90CF9008958A3013
:108AE00010F4805D0895895C08950F931F93142FEF
:108AF000022F60936A2E8F5F8093692E815042957A
:108B00004F704A3010F4405D01C0495C202F0E9434
:108B100008428091692E60916A2E412F4F704A3031
:108B200010F4405D01C0495C202F0E9408421F9153
:108B30000F9108950F931F93082F162F8091692E80
:108B40008F5F8093692E815060916A2E402F4295ED
:108B50004F704A3010F4405D01C0495C212F0E94E3
:108B600008428091692E8F5F8093692E81506091B9
:108B70006A2E402F4F704A3010F4405D01C0495CAE
:108B8000212F0E9408428091692E8F5F8093692E69
:108B9000815060916A2E40E2212F0E9408421F916D
:108BA0000F910895FF920F931F93CF93DF93F82EA9
:108BB00014E620E0C0E0D0E08F2D612F0E94E2910A
:108BC000082F882321F4222311F4113071F48091AD
:108BD000692E8F5F8093692E8150402F405D609198
:108BE0006A2E20E00E94084221E0812F6AE00E9464
:108BF000E291982F2196C330D10531F0019F802D4D
:108C00001124F81A192FD8CFDF91CF911F910F910E
:108C1000FF9008958093692E60936A2E842F0E949E
:108C2000D2450895BF92CF92DF92EF92FF920F93B9
:108C30001F93CF93DF93082FB62E7A0114E6C0E07E
:108C4000D0E0C701612F70E00E94EE91C62E812F07
:108C50008A508A3048F4D02ED394802F6B2D4EE268
:108C600020E00E9408420D2D4C2D405D802F6B2D81
:108C700020E00E940842812F6AE00E94E291282FA2
:108C80002196C330D10541F00F5FC19EC001112470
:108C9000E81AF90A122FD5CFDF91CF911F910F91CA
:108CA000FF90EF90DF90CF90BF9008957F928F92CA
:108CB0009F92AF92BF92CF92DF92EF92FF920F936B
:108CC0001F93DF93CF93CDB7DEB727970FB6F894F6
:108CD000DEBF0FBECDBF882EC62ECA017901702E11
:108CE0008E010F5F1F4FB8014AE050E00E9493923F
:108CF000F80101900020E9F731979E2E901A092D76
:108D000010E0E016F1062CF0DD245701A01AB10A9C
:108D10001EC010E007C0822F6C2D4AE220E00E94A6
:108D200008421F5F212F280D812F90E08E159F058F
:108D300094F34CC0772021F08F2D6C2D40E303C0BD
:108D40008F2D6C2D40E220E00E940842D394FD2C30
:108D5000F80C8D2D90E08A159B0564F3FE01E00F61
:108D6000F11F0081108281E0981619F48F2D815037
:108D70000EC082E0981689F489818D3271F48F2DAE
:108D800081506C2D4DE220E00E9408428F2D6C2D09
:108D900040E320E00E94084209C0F092692EC09290
:108DA0006A2ECE01019660E00E94CB42192D11502F
:108DB0001F0D812F6C2D4EE220E00E940842812F72
:108DC0008F5F6C2D402F20E00E94084227960FB63F
:108DD000F894DEBF0FBECDBFCF91DF911F910F91F1
:108DE000FF90EF90DF90CF90BF90AF909F908F90CB
:108DF0007F9008957F928F929F92AF92BF92CF9271
:108E0000DF92EF92FF920F931F93DF93CF93CDB733
:108E1000DEB727970FB6F894DEBF0FBECDBF882E02
:108E2000C62ECA017901702E8E010F5F1F4FB80147
:108E30004AE050E00E949392F80101900020E9F787
:108E400031979E2E901A092D10E0E016F1062CF0B5
:108E5000DD245701A01AB10A1EC010E007C0822FFE
:108E60006C2D4AE220E00E9408421F5F212F280D4E
:108E7000812F90E08E159F0594F34CC0772021F050
:108E80008F2D6C2D40E303C08F2D6C2D40E220E030
:108E90000E940842D394FD2CF80C8D2D90E08A1589
:108EA0009B0564F3FE01E00FF11F0081108281E059
:108EB000981619F48F2D81500EC082E0981689F40F
:108EC00089818D3271F48F2D81506C2D4DE220E01F
:108ED0000E9408428F2D6C2D40E320E00E94084242
:108EE00009C0F092692EC0926A2ECE01019660E010
:108EF0000E94CB42192D11501F0D812F6C2D4EE277
:108F000020E00E940842812F8F5F6C2D402F20E0CF
:108F10000E94084227960FB6F894DEBF0FBECDBF61
:108F2000CF91DF911F910F91FF90EF90DF90CF9045
:108F3000BF90AF909F908F907F900895BF92CF92F7
:108F4000DF92EF92FF920F931F93DF93CF93CDB7F2
:108F5000DEB727970FB6F894DEBF0FBECDBFC82E81
:108F6000D62ECA017901B02E8E010F5F1F4FB801B6
:108F70004AE050E00E949392F80101900020E9F746
:108F80003197E01B2E2F30E0E216F30624F000E0CC
:108F9000E21AF30A1EC000E007C0822F6D2D4AE2DC
:108FA00020E00E9408420F5F202F2C0D802F90E0C0
:108FB0008E159F0594F31DC0BB2021F0822F6D2DCF
:108FC00040E303C0822F6D2D40E220E00E94084262
:108FD0000F5F202F2C0D802F90E08E159F0564F3DE
:108FE0002093692ED0926A2ECE01019660E00E94F5
:108FF000CB4227960FB6F894DEBF0FBECDBFCF9100
:10900000DF911F910F91FF90EF90DF90CF90BF9075
:109010000895BF92CF92DF92EF92FF920F931F932A
:10902000DF93CF93CDB7DEB727970FB6F894DEBFA7
:109030000FBECDBFC82ED62ECA017901B02E8E012B
:109040000F5F1F4FB8014AE050E00E94B492F80150
:1090500001900020E9F73197E01B2E2F30E0E21657
:10906000F30624F000E0E21AF30A1EC000E007C095
:10907000822F6D2D4AE220E00E9408420F5F202FD0
:109080002C0D802F90E08E159F0594F31DC0BB2002
:1090900021F0822F6D2D40E303C0822F6D2D40E221
:1090A00020E00E9408420F5F202F2C0D802F90E0BF
:1090B0008E159F0564F32093692ED0926A2ECE01FF
:1090C000019660E00E94CB4227960FB6F894DEBF6F
:1090D0000FBECDBFCF91DF911F910F91FF90EF9009
:1090E000DF90CF90BF9008957F928F929F92AF9222
:1090F000BF92CF92DF92EF92FF920F931F93162FA2
:1091000069017A01782E739457FF0BC0C094D094F4
:10911000E094F0940894C11CD11CE11CF11C4DE2B8
:1091200001C040E220E00E940842C701B60120E8E9
:1091300036E948E950E00E943792872D612FA90156
:1091400023E030E001E00E940948872D8D5F612F08
:109150004EE220E00E940842C701B60120E836E94D
:1091600048E950E00E9437926B017C01C701B601CB
:1091700028EE33E040E050E00E9437924901872D0D
:109180008C5F612FA90124E030E00E940948AA24E5
:10919000BB24C501B40128E13CEF4FEF5FEF0E9413
:1091A000C391C60ED71EE81EF91E872D885F612F5A
:1091B000A60123E030E00E940948872D855F612FDA
:1091C0004EE120E00E9408421F910F91FF90EF9026
:1091D000DF90CF90BF90AF909F908F907F90089539
:1091E000BF92CF92DF92EF92FF920F931F93182FAF
:1091F000B62E6A01CA016CE370E00E94EE917B0119
:10920000812F6B2DA70122E030E000E00E94094889
:10921000812F8E5F6B2D4AE320E00E9408428CE391
:1092200090E09C01E29EC001E39E900DF29E900DA5
:109230001124C81AD90A812F8D5F6B2DA60122E057
:1092400030E001E00E9409481F910F91FF90EF90DC
:10925000DF90CF90BF9008952F923F924F925F92F0
:109260006F927F928F929F92AF92BF92CF92DF9236
:10927000EF92FF920F931F93DF93CF93CDB7DEB79B
:109280002F970FB6F894DEBF0FBECDBF8C876D87CA
:109290006A0159010B87449F9001459F300D549FEF
:1092A000300D11243E832D83AA9CC001AB9C900DF0
:1092B000BA9C900D11249C838B83A29E4001A39E97
:1092C000900CB29E900C1124BC0168197909882772
:1092D00077FD8095982F0E94EE8F7B018C01ED81A8
:1092E000FE81BF01882777FD8095982F0E94EE8F21
:1092F00020E030E040E85EE30E94DB909B01AC019F
:10930000C801B7010E94E88E0E943E910E94BB8F67
:109310002B019401220F331F3A8329836D856A0D37
:109320008C854B850E94AE406D856A198C854B8576
:109330000E94AE408C858C0D6D854B850E94AE40A1
:109340008C858C196D854B850E94AE408D819E81E8
:10935000880F991FEE27FF27E81BF90BFA87E9878B
:109360002B813C81220F331F38872F8349018B814A
:109370009C81880E991E222433246624772438C0C9
:1093800057FC0DC00894A108B108E981FA8129852C
:109390003A85E20FF31FFA83E9834E1A5F0A0894B5
:1093A000611C711C8F819885280E391E480C591C30
:1093B0000C85060DED84EA0C802F6E2D4B850E94E6
:1093C000AE40FD84FA18802F6F2D4B850E94AE4071
:1093D0001C851619812F6E2D4B850E94AE40812F62
:1093E0006F2D4B850E94AE40EF81F8858E0E9F1E3B
:1093F00029813A81221633061CF2B301882777FDB2
:109400008095982F0E94EE8F20E030E040E05FE3EF
:109410000E94E88E7B018C0165010894C108D10887
:10942000EB81FC81BF01882777FD8095982F0E94F2
:10943000EE8FA80197010E94DB90A80197010E947E
:10944000DB907B018C01CC9CC001CD9C900DDC9C01
:10945000900D11242D813E81829FB001839F700D5C
:10946000929F700D1124882777FD8095982F0E9478
:10947000EE8F9B01AC01C801B7010E94E88E7B0111
:109480008C018B819C81ED81FE818E9FB0018F9F2D
:10949000700D9E9F700D1124882777FD8095982F61
:1094A0000E94EE8F9B01AC01C801B7010E94E78EBC
:1094B0000E943E910E94BB8F5B01460149845A8401
:1094C00050944194510853942D813E8189859A8509
:1094D000281B390BE981FA812E1B3F0B3F872E8712
:1094E00035C01A141B044CF00894611C711C2F81A8
:1094F0003885220E331EA20CB31C8E859F85A80EC4
:10950000B91E0C85060DED84E80C802F6E2D4B8561
:109510000E94AE40FD84F818802F6F2D4B850E946D
:10952000AE401C851619812F6E2D4B850E94AE40D2
:10953000812F6F2D4B850E94AE40089481089108C1
:10954000EE85FF85E40DF51DFF87EE87C4010196CA
:109550001816190634F22F960FB6F894DEBF0FBE18
:10956000CDBFCF91DF911F910F91FF90EF90DF90D2
:10957000CF90BF90AF909F908F907F906F905F90B3
:109580004F903F902F9008950F93FA01022F4D5F57
:109590005F4F9F010E942C490F9108952F923F9297
:1095A0004F925F926F927F928F929F92AF92BF92F3
:1095B000CF92DF92EF92FF920F931F93DF93CF939F
:1095C0000F92CDB7DEB7382E262E4983422EB80132
:1095D0000E2D80E090E00E94EC8F2BED3FE049E4FF
:1095E00050E40E94DB9020E030E044E353E40E942A
:1095F000538F6B017C01C7010E94508F4B015C01AE
:10960000552466247724C301B2010E94EC8F9B018C
:10961000AC01C501B4010E94DB900E943E914B0158
:109620005C01B601C7010E945E916B017C0129813A
:10963000622F70E080E090E00E94EC8F9B01AC0113
:10964000C701B6010E94DB900E943E910E94C08F2C
:10965000132D160FC501B4010E94C08F222D261BA9
:10966000832D622D412F0E94EC400F90CF91DF910E
:109670001F910F91FF90EF90DF90CF90BF90AF9030
:109680009F908F907F906F905F904F903F902F9022
:109690000895EF920F931F93942FF901E02E4D5FE1
:1096A000292F8F010E94CE4A1F910F91EF900895AC
:1096B0002F923F924F925F926F927F928F929F92E2
:1096C000AF92BF92CF92DF92EF92FF920F931F93D0
:1096D000382E262E442E40E050E0CA01B9010E94E7
:1096E000EC8F2BED3FE049E450E40E94DB9020E05A
:1096F00030E044E353E40E94538F6B017C01C701C7
:109700000E94508F4B015C01552466247724C301CD
:10971000B2010E94EC8F2B013C01C501B401A301F1
:1097200092010E94DB900E943E914B015C01B601C8
:10973000C7010E945E91A30192010E94DB900E94EA
:109740003E910E94C08F132D160FC501B4010E94D7
:10975000C08F222D261B832D622D412F0E94EC40AD
:109760001F910F91FF90EF90DF90CF90BF90AF903F
:109770009F908F907F906F905F904F903F902F9031
:109780000895ECE7F0E080E480838081807E816052
:1097900080838FEE80937A000895CF92DF92EF92CC
:1097A000FF920F931F93F89460917C2870917D280D
:1097B00080E090E00E94EC8F209137233091382395
:1097C0004091392350913A230E94E88E2FE832ECE1
:1097D00045E75FE30E94DB906B017C010E94BB8F39
:1097E000DC01CB0160E470E00E9402928C01909356
:1097F000402380933F23C701B60120E030E040E8DA
:109800005CE30E94DB90609337237093382380934E
:10981000392390933A230032110574F020E030E0B0
:1098200040E85FE30E94E88E60933723709338230B
:109830008093392390933A23609137237091382392
:109840008091392390913A2320E030E040EF50E4BA
:109850000E94538F60933B2370933C2380933D235E
:1098600090933E230E94C08F7093442360934323C0
:10987000109242231092412380E090E0A0E0B0E0FB
:109880008093372390933823A0933923B0933A23BE
:1098900078941F910F91FF90EF90DF90CF900895F3
:1098A0001F920F920FB60F920BB60F9211242F93A7
:1098B0003F934F935F936F937F938F939F93AF9358
:1098C000BF93EF93FF93609178007091790080E0EF
:1098D00090E00E94EC8F9B01AC0160913723709166
:1098E00038238091392390913A230E94E88E609327
:1098F0003723709338238093392390933A238091B0
:1099000041239091422301969093422380934123D7
:109910008050904114F00E94CD4BFF91EF91BF9188
:10992000AF919F918F917F916F915F914F913F91F7
:109930002F910F900BBE0F900FBE0F901F90189598
:109940000F93CF93DF9387E662E041E023E001E0ED
:109950000E949543809143239091442380549140E9
:1099600038F489E662E043E123E000E00E94C94167
:1099700080917B28813019F0C0E0D0E02BC088E6D0
:1099800060E047E127E001E00E94954320914323F6
:109990003091442381E0243A380718F0C3E1D0E045
:1099A00002C0C0E0D0E0C9018154914083369105E6
:1099B00040F4C9018054914065E070E00E94EE914E
:1099C000EB018C2F43E14C1B855962E023E000E062
:1099D0000E94C94180917B28882341F588E660E098
:1099E00046E127E001E00E94954320914323309116
:1099F000442381E02A39380710F0C2E1D0E0C901E0
:109A0000815491408935910540F4C90180549140B9
:109A100065E070E00E94EE91EB018C2F42E14C1B5F
:109A2000855962E023E000E00E94C941209739F0A7
:109A30008AE662E04C2F23E001E00E94C941DF91F9
:109A4000CF910F910895DF92EF92FF920F931F93A2
:109A5000CF93DF930E94B3241092462310924723A2
:109A600080918B28813009F03DC00E944B3F89E0F6
:109A700090E00E94AF54AC0180E060E020E00E94E2
:109A80005C438AE090E00E94AF54AC0180E061E06A
:109A900020E00E945C438BE090E00E94AF54AC0158
:109AA00080E063E020E00E945C4383E190E00E945C
:109AB000AF54AC0180E064E020E00E945C438EE0A3
:109AC00090E00E94AF54AC0180E065E020E00E948D
:109AD0005C4388E99AE324EF31E0F9013197F1F72B
:109AE0000197D9F70E94B43A80917628909177280F
:109AF000A0917828B09179280097A105B10509F4C3
:109B000037C18091B8289091B928A091BA28B09116
:109B1000BB280097A105B10509F42AC184E190E0B2
:109B20000E94AF54AC0180E064E022E00E945C43FC
:109B300085E190E00E94AF54AC0180E065E023E055
:109B40000E945C4386E190E00E94AF54AC0180E04B
:109B500067E020E00E945C4360917628709177284E
:109B6000809178289091792820E836E948E950E0FA
:109B70000E94159281E066E0A90122E030E000E059
:109B80000E94094883E066E04AEA59E020E00E942A
:109B9000234360917628709177288091782890915E
:109BA000792828EE33E040E050E00E941592CA0187
:109BB000B90120E137E240E050E00E9415929B019C
:109BC000AC0184E066E0A90124E030E001E00E94FD
:109BD0000948609176287091772880917828909133
:109BE00079282AE030E040E050E00E941592CA0156
:109BF000B90124E630E040E050E00E9415929B015C
:109C0000AC0188E066E0A90122E030E00E9409484A
:109C10006091B8287091B9288091BA289091BB289A
:109C200020E836E948E950E00E9415928CE066E0B1
:109C3000A90122E030E000E00E9409488EE066E0E1
:109C400048EA59E020E00E9423436091B8287091CF
:109C5000B9288091BA289091BB2828EE33E040E0E3
:109C600050E00E941592CA01B90120E137E240E0BC
:109C700050E00E9415929B01AC018FE066E0A901C3
:109C800024E030E001E00E9409486091B82870911A
:109C9000B9288091BA289091BB282AE030E040E0B2
:109CA00050E00E941592CA01B90124E630E040E07C
:109CB00050E00E9415929B01AC0183E166E0A9018E
:109CC00022E030E00E94094880E80E94FA8188235F
:109CD000A9F160E070E080E090E020E030E040E05A
:109CE00050E00E94CD3A80E060E240E828E000E0E9
:109CF0000E94C94180E068E240E828E00E94C94132
:109D000087E190E00E94AF54AC0180E065E020E084
:109D10000E945C4380E066E045E10E94764380E07B
:109D200067E045E10E94764380E197E224EF31E06D
:109D3000F9013197F1F70197D9F71AC080E10E9434
:109D4000FA81882309F4C0CF80E064E045E10E94F5
:109D5000764380E065E045E10E94764380E066E07E
:109D600045E10E94764380E067E045E10E9476434A
:109D70008BE10E94288C8BE10E94288C85E50E9453
:109D8000288C8AEA0E94288C80E00E94288C86E534
:109D90008093452310E096E7D92E84E1E82EF12C3C
:109DA000CAE5D0E00E944B3F88E190E00E94AF54AA
:109DB000AC0180E064E020E00E945C4389E190E037
:109DC0000E94AF54AC018CE067E020E00E945C434D
:109DD00002E33BC000D00F92EDB7FEB73196ADB7AE
:109DE000BEB71196DC92118212820E94E58CF0922D
:109DF000EE2EE092ED2E0F900F900F908091ED2EB1
:109E00009091EE2E892BD1F7153148F4812F66E021
:109E100046EA59E020E00E9423431F5F06C080E02D
:109E200066E045E10E94764310E080E20E94FA81FC
:109E3000882351F080EF0E94FA811092BD28109281
:109E400046230E949452F9CF01508091D223882357
:109E500021F4002309F0BECF02C00023A9F48DE154
:109E600090E00E94AF54AC0180E065E020E00E94E9
:109E70005C43D093EE2EC093ED2E8091ED2E909109
:109E8000EE2E892BD1F78ECF0E944A8C8091D4235D
:109E90009091D52390936C2E80936B2E80918B287C
:109EA0008130B1F40E944B3F8EE190E00E94AF54AC
:109EB000AC0180E060E020E00E945C438FE190E034
:109EC0000E94AF54AC0180E061E020E00E945C435E
:109ED00080915F2F823681F480918B28813051F4FC
:109EE00080E290E00E94AF54AC0180E061E020E0AD
:109EF0000E945C4382E013C080915F2F833699F407
:109F000080918B28813051F481E290E00E94AF541F
:109F1000AC0180E061E020E00E945C4381E080933E
:109F200046238093472380918B28813099F582E2E4
:109F300090E00E94AF54AC0180E062E020E00E941B
:109F40005C43E0916B2EF0916C2E80810E94D24593
:109F500084EA99E060E00E94FB42E0916B2EF09170
:109F60006C2E81810E94D245E0916B2EF0916C2E77
:109F700044814F598091692E60916A2E20E00E94A1
:109F8000084288E99AE324EF31E0F9013197F1F7CB
:109F90000197D9F70E94628E8FEF0E94D863E091FB
:109FA0006D2EF0916E2E8081883509F468C00E9474
:109FB0004B3F80E060E048E959E020E00E94234305
:109FC00088E50E94D24583E290E00E94AF54AC0144
:109FD00080E061E020E00E945C4380E061E04CE8CA
:109FE00059E020E00E942343E0916D2EF0916E2E07
:109FF00080810E94D24584E290E00E94AF54AC017F
:10A0000080E062E020E00E945C4385E290E00E94F4
:10A01000AF54AC0180E063E020E00E945C4386E244
:10A0200090E00E94AF54AC0180E064E020E00E9428
:10A030005C4386E899E060E00E94FB4287E290E0A2
:10A040000E94AF54AC0180E065E020E00E945C43D8
:10A05000109246238CED95E09093722380937123A8
:10A0600080E490E09093B7228093B62280E49CE94C
:10A0700024EF31E0F9013197F1F70197D9F7109208
:10A0800045231092D22382E390E09093EE2E8093AA
:10A09000ED2E8091ED2E9091EE2E892BD1F70E941E
:10A0A0009452FDCF0F931F93982F062F142F842FB8
:10A0B000692F4AE050E120E00E942343812F602F66
:10A0C00048E050E120E00E9423431F910F91089542
:10A0D0008F929F92AF92BF92DF92EF92FF920F9377
:10A0E0001F93CF93DF930E944B3F8AE090E00E9442
:10A0F000AF54AC0180E061E022E00E945C4380E06C
:10A1000090E00E94AF54AC0180E067E020E00E9444
:10A110005C43DD2486E1882E912CED2CFF24E89C05
:10A120008001E99C100DF89C100D11240C58114F62
:10A13000C0E0D0E05701CE018E0D9F1D099744F479
:10A14000CE018D5F682F80E0A80120E00E942343AC
:10A1500021960A5E1F4FC330D10569F7DD2009F053
:10A1600057C080E062E044E45FE020E00E942343C7
:10A1700080E066E042E45FE00BC080E062E040E443
:10A180005FE020E00E94234380E066E04EE35FE072
:10A1900020E00E94234396E0A916B10474F080E009
:10A1A00062E04CE35FE020E00E94234380E066E051
:10A1B0004AE35FE020E00E94234380E40E94FA81AA
:10A1C000882329F086E0A816B1040CF4D39480E823
:10A1D0000E94FA81882311F0D110DA9480E20E9463
:10A1E000FA81882331F480E10E94FA81882309F4FE
:10A1F00094CF80EF0E94FA81DF91CF911F910F9150
:10A20000FF90EF90DF90BF90AF909F908F90089558
:10A2100096E0A916B1041CF6B0CF0E944B3F80E037
:10A2200062E04BE55FE020E00E94234380E063E0D2
:10A230004BE45FE020E00E9423438CE067E046E4CB
:10A240005FE020E00E94234380E20E94FA8188239D
:10A25000D9F380EF0E94FA8108950E944B3F80E07D
:10A2600060E048EC5FE022E00E9423438DE290E052
:10A270000E94AF54AC0180E061E020E00E945C43AA
:10A280008EE290E00E94AF54AC0180E062E020E0FA
:10A290000E945C4380E063E042EB5FE020E00E94CC
:10A2A000234380E064E04CE95FE020E00E94234328
:10A2B00080E065E046E85FE020E00E94234380E024
:10A2C00066E040E75FE020E00E9423438FE290E0F9
:10A2D0000E94AF54AC0180E067E020E00E945C4344
:10A2E00080E20E94FA81882321F080EF0E94FA81A7
:10A2F000089580E10E94FA81882391F32CE088E19F
:10A3000090E00FB6F894A895809360000FBE20935C
:10A310006000FFCFBF92CF92DF92EF92FF920F9338
:10A320001F93D82EE62E142FB22EC02E842F642F0A
:10A3300041E00E945250012FF12E80E40E94FA81E8
:10A34000182F80E461E00E945382182B51F00E1503
:10A3500010F40F5F06C081E0C81611F40EEF24C0A0
:10A360000E2D80E80E94FA81182F80E861E00E949B
:10A370005382182B51F0D01610F4015006C081E022
:10A38000B81611F40DEF10C00D2D0F1529F08F2DFB
:10A39000602F41E00E94525080E30E94FA81F02E2B
:10A3A000882359F285FD0FEF802F1F910F91FF90A9
:10A3B000EF90DF90CF90BF900895CF92DF92EF9211
:10A3C000FF920F931F93C82ED62EE42E122F822FAA
:10A3D000622F0E945250012FF12E80E40E94FA81D8
:10A3E000182F80E461E00E945382182B29F00D158C
:10A3F00010F00D2D01C00F5F80E80E94FA81182F28
:10A4000080E861E00E945382182B29F0C01610F0FA
:10A410000C2D01C001500F1529F08F2D602F4E2DEE
:10A420000E94525080E30E94FA81F02E8823A9F204
:10A4300085FD0FEF802F1F910F91FF90EF90DF9020
:10A44000CF900895BF92CF92DF92EF92FF920F9339
:10A450001F93D82EE62E142FB22EC02E842F642FD9
:10A4600041E00E945250012FF12E80E40E94FA81B7
:10A47000182F80E461E00E945382182B51F00E15D2
:10A4800010F40F5F06C081E0C81611F40EEF43C050
:10A490000E2D80E80E94FA81182F80E861E00E946A
:10A4A0005382182B51F0D01610F4015006C081E0F1
:10A4B000B81611F40DEF2FC00D2D80E20E94158209
:10A4C000882329F080EF0E94FA810AEF24C080E1FE
:10A4D0000E941582882329F080EF0E94FA810BEFF9
:10A4E0001AC080E20E940482882329F080EF0E9433
:10A4F000FA810CEF10C00F1529F08F2D602F41E06D
:10A500000E9452500E94A04C80E10E940482F02ED2
:10A51000882309F4AACF802F1F910F91FF90EF900D
:10A52000DF90CF90BF9008952F923F924F925F920D
:10A530006F927F928F929F92AF92BF92CF92DF9253
:10A54000EF92FF920F931F93DF93CF9300D000D031
:10A550000F92CDB7DEB720914623298380EF0E946A
:10A56000FA81772466243324AA24A39462E1262E58
:10A5700001C0A02E8091BD28813011F48093462324
:10A580008091BD28882319F4398130934623809126
:10A590004623882319F456E0652E09C0813019F44A
:10A5A00047E0642E04C0823011F434E0632E0E9430
:10A5B0004B3F80E060E04BEF5FE022E00E942343EE
:10A5C0008CE060E045EF5FE022E00E94234380E002
:10A5D00090E00E94AF54AC0180E067E020E00E9470
:10A5E0005C4389E290E00E94AF54AC018CE067E0EC
:10A5F00020E00E945C43462C5524C20101979B83B6
:10A600008A83772039F081E061E043EF5FE020E06A
:10A610000E942343E72CFF2428E430E0E29EF0016F
:10A62000E39EF00DF29EF00D1124FD83EC8300E01B
:10A6300010E0BB24B394670148018E0C9F1C841466
:10A64000950474F580914623813061F44091B728D8
:10A65000429DA00111248C819D81480F591F4455B2
:10A66000564F19C0823061F44091B728429DA00135
:10A670001124EC81FD814E0F5F1F4C55544F0BC0D0
:10A680004091B728429DA00111242C813D81420FA9
:10A69000531F4C53534F83E06B2D20E00E94234304
:10A6A000053061F48A819B81881699063CF481E02B
:10A6B00066E041EF5FE020E00E9423430E94A04C4F
:10A6C0000F5F1F4FB394EC81FD81E85BFF4FFD836B
:10A6D000EC83F7E0BF1609F0AFCF332071F4772099
:10A6E000C9F46F1629F481E065E04A2D20E016C018
:10A6F00081E0662D4A2D20E00BC026E030E0C20E3E
:10A70000D31EC414D50434F082E066E04A2D21E063
:10A7100000E005C082E065E04A2D21E001E00E94F2
:10A720002252082F8E3F31F473943324339425E062
:10A73000A22E67CF8D3F29F47A94332492E0A92E7C
:10A7400060CF8C3F09F048C00E944B3F8BE290E005
:10A750000E94AF54AC0180E062E020E00E945C43C4
:10A760008CE290E00E94AF54AC018CE067E020E006
:10A770000E945C4380E10E94FA818111299880E265
:10A780000E9404828823B1F380EF0E94FA810E9424
:10A790004B3F80E060E044EE5FE022E00E94234314
:10A7A0008CE060E04EED5FE022E00E94234380E019
:10A7B00090E00E94AF54AC0180E067E020E00E948E
:10A7C0005C4389E290E00E94AF54AC018CE067E00A
:10A7D00020E00E945C4315CF8B3F19F40E94A984AE
:10A7E000A6C08A3F19F40E94C154A1C0809146239B
:10A7F0008130A9F5E02EFF24E70CF11C31E0E316CF
:10A80000F10419F40E94B85C16C082E0E816F10465
:10A8100021F483E00E94B85C15C093E0E916F104CE
:10A8200019F40E945B3615C0E4E0EE16F10419F449
:10A830000E94A26E14C0F5E0EF16F10419F40E9414
:10A8400063330DC026E0E216F10419F40E94263E9F
:10A8500006C037E0E316F10411F40E9424858091CC
:10A8600046238230D1F4802F90E0870D911D8130F6
:10A87000910519F40E945B3610C08230910519F4DD
:10A880000E94A26E0AC08330910519F40E946333BE
:10A8900004C0049711F40E942485809146238823E4
:10A8A00009F067CEE02EFF24E70CF11C81E0E816EA
:10A8B000F10421F482E00E94185606C092E0E916E5
:10A8C000F10411F40E94D66F80912324882371F43F
:10A8D000E3E0EE16F10419F40E944C3120C0F4E0DC
:10A8E000EF16F104A9F40E94593019C08091232475
:10A8F000813071F423E0E216F10419F40E94A131D1
:10A900000EC034E0E316F10419F40E94AC3007C025
:10A9100085E0E816F10419F40E9433802ACE96E00F
:10A92000E916F10409F025CE0E94685022CE0F905E
:10A930000F900F900F900F90CF91DF911F910F917B
:10A94000FF90EF90DF90CF90BF90AF909F908F904F
:10A950007F906F905F904F903F902F90089520913F
:10A96000B728FC01EE0FFF1FEE0FFF1FE80FF91FC6
:10A97000E20FF11DEE0FFF1FED52F34E808191812A
:10A9800008950E944B3F8CE067E04CE050E120E0EE
:10A990000E942343E091B728F0E0EE0FFF1FE15F34
:10A9A000F24E4081518181E062E020E00E945C43F0
:10A9B00080E20E94FA81882369F380EF0E94FA8185
:10A9C0000895882351F4EFEFFEE2608311823896F8
:10A9D0008FE2EF35F807C9F710C0E82FF0E03197A4
:10A9E00093E0EE0FFF1F9A95E1F7DF01A250B14D02
:10A9F00011966C93E050F14D108280918023882352
:10AA000019F010928023089510927E2310927C23D7
:10AA1000809183238E7F8093832385EA8093BC007B
:10AA20000895EF92FF920F931F93CF93DF930E94AD
:10AA30004B3F109282231092242489EE90E160E033
:10AA40000E94FB4280918323826080938323109233
:10AA50007F2380E060E00E94E15481E090E00E946A
:10AA6000CF81EC018091832380FD05C0CE010E943F
:10AA7000D9818823B9F381E090E00E94CF817C01E5
:10AA8000CEEFDEE210E0812F60E00E94E154809181
:10AA9000832380FD05C0C7010E94D9818823B9F3B3
:10AAA0008B8187FF7AC080E061E04AED50E120E0D1
:10AAB0000E94234382E161E0412F20E00E9475451E
:10AAC00080E062E041ED50E120E00E94234388E015
:10AAD00062E0488120E00E9475458BE062E049EC2D
:10AAE00050E120E00E94234382E162E0498120E0BE
:10AAF0000E94754580E063E040EC50E120E00E9458
:10AB0000234388E063E04A8120E00E9475458BE0A2
:10AB100063E048EB50E120E00E94234382E163E0E0
:10AB20004B8120E00E94754580E064E04FEA50E1EF
:10AB300020E00E94234388E064E04C8120E00E94F2
:10AB400075458BE064E047EA50E120E00E94234332
:10AB500082E164E04D8120E00E94754580E065E07F
:10AB60004EE950E120E00E94234388E065E04E81F9
:10AB700020E00E9475458BE065E046E950E120E069
:10AB80000E9423434F81552747FD509582E165E0A0
:10AB900023E030E001E00E9409481F5F28961C3046
:10ABA00009F071CFDF91CF911F910F91FF90EF903E
:10ABB0000895CF93DF93E82FA2E1B0E380E1ED01A8
:10ABC00019928A95E9F7EE2339F4CD0170E040E15E
:10ABD00050E00E948C9204C0F0E0EF5EFF4C608376
:10ABE0008DB79EB707970FB6F8949EBF0FBE8DBF67
:10ABF000EDB7FEB7319684E7ADB7BEB711968C932B
:10AC000081E08183828382E190E39483838380E186
:10AC100090E0968385830E94E58CCDB7DEB72796BA
:10AC20000FB6F894DEBF0FBECDBFDF91CF91089570
:10AC3000BF92CF92DF92EF92FF920F931F93DF9319
:10AC4000CF93CDB7DEB727970FB6F894DEBF0FBE10
:10AC5000CDBF182F0E944B3F81E08093702E8093D0
:10AC6000722E1092712E1130B9F40E9411558BE0A2
:10AC700067E04BE850E120E00E94234380E20E941D
:10AC8000FA81882321F080EF0E94FA813FC380E19E
:10AC90000E94FA81882359F30E944B3F85E790E197
:10ACA00062E00E94FB4282E062E04AE650E120E07E
:10ACB0000E94234382E063E04FE550E120E00E94E0
:10ACC000234388E068E240E026E001E00E94C941B9
:10ACD00082E090E00E94AF54AC0180E067E020E0A9
:10ACE0000E945C4382E167E04BE550E120E00E9476
:10ACF000234380E062E049E550E120E00E942343E5
:10AD0000113029F483E592E20E94748A0CC012305B
:10AD100051F480914623813031F480914723813072
:10AD200011F40E94628EEAE0CE2ED12C70E7B72E8D
:10AD30007E010894E11CF11C8091702E882361F53E
:10AD400080E40E94FA81882331F480E463E00E9469
:10AD50005382882309F14091712E4E3FE8F44F5FF2
:10AD60004093712E89E063E050E023E030E000E0A2
:10AD70000E940948123081F48091712E8B9DC00190
:10AD800011246FEF70E00E940292462F88E068E283
:10AD900026E001E00E94C9418091702E882309F0CD
:10ADA0003FC080E80E94FA81882331F480E863E0A4
:10ADB0000E9453828823A1F18091712E882381F112
:10ADC000123079F48B9DC00111246FEF70E00E9466
:10ADD0000292862F885F68E240E026E000E00E9451
:10ADE000C9414091712E41504093712E89E063E03A
:10ADF00050E023E030E000E00E940948123081F486
:10AE00008091712E8B9DC00111246FEF70E00E9424
:10AE10000292462F88E068E226E001E00E94C941E4
:10AE20008091702E8130D1F480E40E94FA818823D1
:10AE300031F480E461E00E945382882379F04091EC
:10AE4000722E403158F44F5F4093722E89E062E0D9
:10AE500050E023E030E000E00E9409488091702E2D
:10AE6000813039F580E80E94FA81882331F480E846
:10AE700061E00E9453828823E1F04091722E4423C6
:10AE8000C1F041504093722E442341F089E062E0CA
:10AE900050E023E030E000E00E9409488091722EEB
:10AEA000882339F489E062E045E550E120E00E9422
:10AEB000234380E10E94FA81882309F478C011308D
:10AEC00009F050C08091712E882309F44BC0109274
:10AED000722E1092712E88E068E240E026E001E0D8
:10AEE0000E94C94180E065E045E10E9476434091BF
:10AEF000722E442341F089E062E050E023E030E02C
:10AF000000E00E9409488091722E882339F489E07C
:10AF100062E041E550E120E00E9423434091712E20
:10AF200089E063E050E023E030E000E00E9409485F
:10AF30008091722E6091712E0E94E15481E090E028
:10AF40000E94CF819093EE2E8093ED2E80918323EB
:10AF500080FD08C08091ED2E9091EE2E0E94D98147
:10AF60008823A1F38091702E882389F462E04FE456
:10AF700050E120E00E94234380E063E04DE450E193
:10AF800020E00E94234381E08093702E10C080E077
:10AF900062E04BE450E120E00E94234380E063E064
:10AFA00049E450E120E00E9423431092702E1130BA
:10AFB00009F097C18091722E6091712E0E94E15428
:10AFC00081E090E00E94CF819093EE2E8093ED2E51
:10AFD00080E063E04CE350E120E00E942343E091F5
:10AFE000722EF0E063E0EE0FFF1F6A95E1F7EA5082
:10AFF000F14D41818DE063E050E023E030E000E07E
:10B000000E94094880E064E04FE250E120E00E94A5
:10B010002343E091722EF0E053E0EE0FFF1F5A95AC
:10B02000E1F7EA50F14D8DE064E0458120E00E94B7
:10B030007545E091722EF0E043E0EE0FFF1F4A9558
:10B04000E1F7EA50F14D45818DE064E050E023E006
:10B0500030E00E94094880E065E042E250E120E0F3
:10B060000E942343E091722EF0E033E0EE0FFF1FC9
:10B070003A95E1F7EA50F14D4781552747FD509544
:10B080008DE065E023E030E00E94094880E066E062
:10B0900049E150E120E00E942343E091722EF0E06C
:10B0A00023E0EE0FFF1F2A95E1F7EA50F14D88E00B
:10B0B00066E0408120E00E9475458BE066E041E15A
:10B0C00050E120E00E942343E091722EF0E093E0F3
:10B0D000EE0FFF1F9A95E1F7EA50F14D82E166E02D
:10B0E000438120E00E9475458091722E282F30E028
:10B0F00021503040F90183E0EE0FFF1F8A95E1F700
:10B10000E250F14D8181882309F4DEC0C114D104DD
:10B1100009F0D7C0C901B7014AE050E00E949392FC
:10B12000C7010E94748A87EA92E20E94748AE091C1
:10B13000722EF0E003E0EE0FFF1F0A95E1F7EA50F0
:10B14000F14D808190E0B7014AE050E00E94939277
:10B15000C7010E94748A87EA92E20E94748AE09191
:10B16000722EF0E0B3E0EE0FFF1FBA95E1F7EA5060
:10B17000F14D818190E0B7014AE050E00E94939246
:10B18000C7010E94748A87EA92E20E94748AE09161
:10B19000722EF0E0A3E0EE0FFF1FAA95E1F7E85052
:10B1A000F14D808190E0B7014AE050E00E94939217
:10B1B000C7010E94748A87EA92E20E94748AE09131
:10B1C000722EF0E073E0EE0FFF1F7A95E1F7EA5080
:10B1D000F14D838190E0B7014AE050E00E949392E4
:10B1E000C7010E94748A87EA92E20E94748AE09101
:10B1F000722EF0E063E0EE0FFF1F6A95E1F7E65074
:10B20000F14D808190E0B7014AE050E00E949392B6
:10B21000C7010E94748A87EA92E20E94748AE091D0
:10B22000722EF0E053E0EE0FFF1F5A95E1F7EA505F
:10B23000F14D858190E0B7014AE050E00E94939281
:10B24000C7010E94748A87EA92E20E94748AE091A0
:10B25000722EF0E043E0EE0FFF1F4A95E1F7EA504F
:10B26000F14D868190E0B7014AE050E00E94939250
:10B27000C7010E94748A87EA92E20E94748AE09170
:10B28000722EF0E033E0EE0FFF1F3A95E1F7EA503F
:10B29000F14D8781992787FD9095B7014AE050E0ED
:10B2A0000E949392C7010E94748A89EA92E20E94E6
:10B2B000748A8BEA92E20E94748A28ECC22ED12C06
:10B2C00003C00894C108D1088091832380FD0FC07A
:10B2D0008091ED2E9091EE2E0E94D9818823A1F3CA
:10B2E00006C08091722E6091712E0E94D95580E225
:10B2F0000E94FA81882309F41FCD80EF0E94FA8111
:10B30000123021F480E060E00E94D95527960FB6F4
:10B31000F894DEBF0FBECDBFCF91DF911F910F918B
:10B32000FF90EF90DF90CF90BF9008959C014897D9
:10B330008C9710F480E00895C901845490408D9753
:10B3400010F481E00895C901815790408D9710F461
:10B3500082E00895C9018E5990408D9710F483E0E2
:10B360000895C9018B5C90408D9710F484E0089596
:10B37000C901885F90408D9710F485E008952552AB
:10B3800031402D32310510F087E0089586E00895B0
:10B39000EF92FF920F931F93CF93DF93282F062FE7
:10B3A000CA0166E170E00E94EE916D5E70E0EB0113
:10B3B000CD59DE4E8CE6E82E81E1F82EE60EF71E22
:10B3C000122F1F5FFE014491822F602F20E00E9408
:10B3D00008422196212FCE15DF0591F7DF91CF91FD
:10B3E0001F910F91FF90EF900895CF92DF92EF920F
:10B3F000FF920F931F93CF93DF930E944B3F85E102
:10B4000090E00E94AF54AC0180E060E022E00E9436
:10B410005C4389E190E00E94AF54AC018CE067E0AE
:10B4200020E00E945C43C3E7DEE210E0C880D980E0
:10B43000EA80FB801F5FC701B60120E836E948E9D2
:10B4400050E00E94159281E0612FA90122E030E0D6
:10B4500000E00E94094883E0612F43E252E120E0CE
:10B460000E942343C701B60128EE33E040E050E0DC
:10B470000E941592CA01B90120E137E240E050E094
:10B480000E9415929B01AC0184E0612FA90124E088
:10B4900030E001E00E940948C701B6012AE030E02F
:10B4A00040E050E00E941592CA01B90124E630E064
:10B4B00040E050E00E9415929B01AC0188E0612FB2
:10B4C000A90122E030E00E940948CC80DD80EE80B6
:10B4D000FF80C701B60120E836E948E950E00E9444
:10B4E00015928CE0612FA90122E030E000E00E947B
:10B4F00009488EE0612F41E252E120E00E9423439F
:10B50000C701B60128EE33E040E050E00E941592FA
:10B51000CA01B90120E137E240E050E00E941592F3
:10B520009B01AC018FE0612FA90124E030E001E034
:10B530000E940948C701B6012AE030E040E050E02F
:10B540000E941592CA01B90124E630E040E050E0C3
:10B550000E9415929B01AC0183E1612FA90122E0B9
:10B5600030E00E9409482D96163009F05FCF05C0E3
:10B570001093EE2E0093ED2E02C008EC10E080E256
:10B580000E94FA818823A1F380EF0E94FA810E9431
:10B590004B3FDF91CF911F910F91FF90EF90DF9084
:10B5A000CF9008950F93CF93DF930E944B3F89E193
:10B5B00090E00E94AF54AC018CE067E020E00E9474
:10B5C0005C4380E060E047EF50E120E00E942343CD
:10B5D0006091492370914A23882777FD8095982FA1
:10B5E0000E94EE8F20E030E040EA51E40E94538F49
:10B5F0000E94BB8F9B01AC018DE060E0A90124E0BB
:10B6000030E000E00E949E4781E160E04DE620E0EE
:10B610000E94084280E061E045E051E120E00E94A4
:10B62000234320914B2330914C2340E050E0CA014A
:10B63000B901E3E0660F771F881F991FEA95D1F7DC
:10B64000620F731F841F951F2AEF30E040E050E027
:10B650000E9415928EE061E0A90123E030E00E9493
:10B66000094881E161E049E252E120E00E94234380
:10B6700080E062E043E151E120E00E9423438091B9
:10B680004D2390914E236AE070E00E940292AB013C
:10B690008EE062E023E030E00E94094881E162E050
:10B6A0004DE620E00E94084280E063E04FE251E175
:10B6B00020E00E94234340914F23509150238DE07E
:10B6C00063E00E94F04880E064E041E251E120E064
:10B6D0000E9423434091AD228DE064E050E023E0DE
:10B6E00030E00E94FA4681E164E046E520E00E94F5
:10B6F000084280E065E04DE351E120E00E942343F1
:10B7000040915123509152238DE065E023E030E0D9
:10B710000E94FA4681E165E041E420E00E9408428F
:10B7200080E066E04BE451E120E00E942343409139
:10B730005323509154238DE066E024E030E00E94D2
:10B74000094881E166E045E252E120E00E9423439E
:10B75000C8ECD0E004C0D093EE2EC093ED2E80E272
:10B760000E94FA818823B9F3809157238B7F8093BD
:10B77000572380EF0E94FA810E944B3FDF91CF91C7
:10B780000F910895AF92BF92CF92DF92EF92FF9206
:10B790000F931F93DF93CF930F92CDB7DEB7D82EC1
:10B7A000E62EF42E922F5801822F8695162F181B05
:10B7B0008D2D612F01E099830E949543CD2CC39478
:10B7C0001F5F4F2D4250998192508C2D612F292F50
:10B7D00000E00E94C941FD0C8D2D6E2D4F2D2E2DA8
:10B7E00001E00E94EC401A141B040CF050C0C5018B
:10B7F00065E070E00E9402926130710561F0623094
:10B800007105B9F02E2D21508D2D8C5F4D2D4A5F85
:10B81000672B29F553C02E2D21508D2D8C5F622F63
:10B8200096E0D90E4D2D01E00E94EC40EDEFEE0EBA
:10B8300057C02E2D21504D2D4A5F8D2D8C5F622FCC
:10B8400001E00E94EC40FDEFEF0E8D2D8D5F6E2D1F
:10B8500044E021E00E94C9418EEFE80E5BC0622FF8
:10B8600001E00E94EC409DEFE90E8D2D8D5F6E2D65
:10B8700044E021E00E94C941EEEFEE0E8D2D8E5F77
:10B880006E2D46E021E00E94C941EA945FC0A114F8
:10B89000B10409F461C0C5016BEF7FEF0E94029211
:10B8A0006130710581F062307105F9F08D2D8C5F8A
:10B8B0004D2D4A5F2E2D2F5F672B89F5622F01E0FA
:10B8C0000E94EC4049C02E2D2F5F8D2D8C5F622F82
:10B8D000F6E0DF0E4D2D01E00E94EC4082E0E80E24
:10B8E0008D2D83506E2D44E034C02E2D2F5F4D2DB5
:10B8F0004A5F8D2D8C5F622F01E00E94EC4092E048
:10B90000E90E8D2D8D5F6E2D44E021E00E94C9412E
:10B91000E2E0EE0E8D2D8E5F6E2D46E01AC0622F96
:10B9200001E00E94EC40F2E0EF0E8D2D8D5F6E2D58
:10B9300044E021E00E94C94182E0E80E8D2D8E5F37
:10B940006E2D46E021E00E94C941E3948C2D6E2DBE
:10B9500048E021E00E94C9410F90CF91DF911F91F3
:10B960000F91FF90EF90DF90CF90BF90AF90089530
:10B970004F925F926F927F928F929F92AF92BF92FF
:10B98000CF92DF92EF92FF920F931F93DF93CF93AB
:10B99000CDB7DEB72E970FB6F894DEBF0FBECDBF82
:10B9A000682E10924A231092492310924C23109231
:10B9B0004B2310924E2310924D238FEF8093AD2294
:10B9C0001092502310924F2380915823882311F412
:10B9D0000E944B3F809146238230A1F480E063E0D7
:10B9E00042E152E120E00E94234384E690E09093FC
:10B9F000EE2E8093ED2E8091ED2E9091EE2E892BE0
:10BA0000D1F728C60E94A58C8FE480934523198224
:10BA10002DB73EB7275030400FB6F8943EBF0FBE4B
:10BA20002DBFEDB7FEB7319684E6ADB7BEB7119620
:10BA30008C931182DD24D394D2828E010F5F1F4F2D
:10BA40001483038381E0E82EF12CF682E5820E94C4
:10BA5000E58C8AE08983EDB7FEB731968FE6ADB706
:10BA6000BEB711968C9382E08183D28214830383C4
:10BA7000F682E5820E94E58C88EC90E09093EE2EB1
:10BA80008093ED2E8CE291E09093F02E8093EF2E38
:10BA9000FF249924CC24DD24772488242DB73EB7B5
:10BAA000295F3F4F0FB6F8943EBF0FBE2DBF502EFB
:10BAB000412E8091D223882309F46EC488EC90E053
:10BAC0009093EE2E8093ED2E0E944A8C8091D42389
:10BAD0009091D5239093CF2E8093CE2E8091582392
:10BAE000813011F40E944B3F10925823E091CE2EEA
:10BAF000F091CF2EE580F68007811085218132817B
:10BB0000438154818091772E9091782EA091792E47
:10BB1000B0917A2EE816F9060A071B0709F455C0FA
:10BB20008091732E9091742EA091752EB091762EE7
:10BB3000281739074A075B0709F447C0E1ECFEE222
:10BB4000DF011D978DE00D9001928150E1F7E4EB4C
:10BB5000FEE2DF011D978DE00D9001928150E1F72B
:10BB6000E7EAFEE2DF011D978DE00D900192815022
:10BB7000E1F7EAE9FEE2DF011D978DE00D90019209
:10BB80008150E1F7EDE8FEE2DF011D978DE00D90B9
:10BB900001928150E1F7E0E8FEE2DF011D978DE0C0
:10BBA0000D9001928150E1F7EE82FF82088719879C
:10BBB0002A833B834C835D83A3E7BEE2FE0132967A
:10BBC0008DE001900D928150E1F731E0631609F0AC
:10BBD0008CC2E091CE2EF091CF2EED5BFF4F808195
:10BBE0000091572380FF04C004600093572314C0C2
:10BBF00010E00470107080E10E94FA8190E0802BC8
:10BC0000912B892B11F00E94D25A80E40E94FA8174
:10BC1000882311F00E94F55986E190E063E270E01C
:10BC200040E150E021E00E94C44AE091CE2EF09124
:10BC3000CF2E22AD33AD40E050E0CA01B901B3E0F0
:10BC4000660F771F881F991FBA95D1F7620F731F70
:10BC5000841F951F2AEF30E040E050E00E941592CB
:10BC600081E060E0A90123E030E000E00E940948A3
:10BC700084E060E04DE052E120E00E942343E09147
:10BC8000CE2EF091CF2E46AD57AD8EE060E023E092
:10BC900030E00E94094881E160E04EE120E00E942E
:10BCA0000842E091CE2EF091CF2E86AD97AD0E9446
:10BCB0009659E82FF0E0EE0FFF1FE155FE4E45913B
:10BCC000549182E160E020E00E942343E091CE2E77
:10BCD000F091CF2E46AD57AD8CE061E00E94C8597F
:10BCE000E091CE2EF091CF2E63A974A9882777FD1D
:10BCF0008095982F0E94EE8F7B018C0120E030E030
:10BD000048E453E40E94D790181654F0C801B701D4
:10BD100020E030E048E453EC0E944C8F8823ACF4E0
:10BD2000C801B70120E030E040EA51E40E94538F9F
:10BD30000E94BB8F9B01AC0180E061E0A90124E07F
:10BD400030E000E00E949E4714C0C801B70120E027
:10BD500030E040E05FE30E94DB900E94BB8F9B01DC
:10BD6000AC0180E061E0A90123E030E000E00E9446
:10BD7000564684E061E04DE620E00E940842E091F2
:10BD8000CE2EF091CF2E05A916A986E367E04AE0F2
:10BD90002EE00E94C25BE091CE2EF091CF2E86A5C0
:10BDA00097A588599E4F26AD37AD821B930B68E649
:10BDB00071E00E940292182FF92E86E163E24FE0B3
:10BDC000960100E00E94494B86E163E24FE0212F9B
:10BDD0003F2D01E00E94494B87E063E0412F5F2D3A
:10BDE00023E030E000E00E9409488AE063E04EE191
:10BDF00020E00E940842E091CE2EF091CF2E84A543
:10BE000095A56AE070E00E94EE91AB0187E062E0E8
:10BE100023E030E00E9409488AE062E04DE620E03D
:10BE20000E9408428BE064E048E052E120E00E947A
:10BE30002343E091CE2EF091CF2E42A988E064E01A
:10BE400050E022E030E00E940948E091CE2EF091CF
:10BE5000CF2EEC5BFF4F808186FF04C083E164E05E
:10BE60004DE403C083E164E048E520E00E9408421D
:10BE7000E091CE2EF091CF2EEC5BFF4F808182FFC0
:10BE800005C088E065E04CEF51E10BC081FF05C0C3
:10BE900088E065E040EF51E104C088E065E044EEF1
:10BEA00051E120E00E942343E091CE2EF091CF2E6D
:10BEB00047A950AD87E066E00E94F0488CE066E05C
:10BEC00042EE51E120E00E942343E091CE2EF0911A
:10BED000CF2EEE5BFF4F40818FE066E050E023E025
:10BEE00030E000E00E94094882E166E040EE51E166
:10BEF00020E00E942343E091CE2EF091CF2EEC5B08
:10BF0000FF4F808184FF05C083E166E04DED51E184
:10BF100004C083E166E04AED51E120E00E94534312
:10BF2000E091CE2EF091CF2E41AD80E067E050E061
:10BF300023E030E000E00E94FA4684E067E046E556
:10BF400020E00E940842E091CE2EF091CF2E91ADDC
:10BF500080913524981760F488EB9BE090937223CE
:10BF60008093712380E290E09093B7228093B62271
:10BF7000E091CE2EF091CF2EE25BFF4F40815181B8
:10BF800087E067E023E030E000E00E94FA468BE0C3
:10BF900067E041E420E00E940842E091CE2EF0915B
:10BFA000CF2EE05BFF4F408151818EE067E024E0BF
:10BFB00030E00E94094882E167E046ED51E120E06F
:10BFC0000E942343E091CE2EF091CF2EED5BFF4FE8
:10BFD0008081E354F04080FF73C023A934A980918D
:10BFE000492390914A238217930724F430934A23DC
:10BFF00020934923E091CE2EF091CF2E22AD33AD88
:10C0000080914B2390914C238217930720F4309317
:10C010004C2320934B23E091CE2EF091CF2E24A5DC
:10C0200035A580914D2390914E238217930720F4DC
:10C0300030934E2320934D23E091CE2EF091CF2EBE
:10C0400091AD8091AD22981710F49093AD22E091BC
:10C05000CE2EF091CF2E27A930AD80914F23909115
:10C0600050238217930720F43093502320934F23BB
:10C07000E091CE2EF091CF2EE25BFF4F0190F08148
:10C08000E02D80915123909152238E179F0720F429
:10C09000F0935223E0935123E091CE2EF091CF2ED6
:10C0A000E05BFF4F0190F081E02D80915323909150
:10C0B00054238E179F0720F4F0935423E0935323C7
:10C0C000E091CE2EF091CF2EEE5BFF4F8081E254B7
:10C0D000F0408093AF2281AD8093AE221092D223A4
:10C0E000212F3F2DC9016C011EC183E0681609F0A4
:10C0F0001AC1E091CE2EF091CF2E86A597A5885932
:10C100009E4F26AD37AD821B930B68E671E00E940F
:10C110000292B82EA92E0E944B3F80E060E240E8D8
:10C1200020E201E00E94EC4080E460E040E420E492
:10C130000E94EC408CE067E04CEC51E120E00E9472
:10C1400023438EE36BE042E42BE00E94EC4086E167
:10C150006EE146E122E20E94EC408AE66EE14AE6A8
:10C1600022E20E94EC408EE365E342E425E30E9474
:10C17000EC40901609F07EC082E261E144E22FE0DB
:10C180000E94EC408CE56FE04EE521E10E94EC401E
:10C1900082E26FE244E221E30E94EC408CE561E33D
:10C1A0004EE52FE20E94EC4087E790E00E94AF54FA
:10C1B000AC0189E060E020E00E945C4389E790E008
:10C1C0000E94AF54AC0180E063E020E00E945C4339
:10C1D0008AE790E00E94AF54AC0184E163E020E084
:10C1E0000E945C4388E790E00E94AF54AC0189E074
:10C1F00067E020E00E945C4380E060E049EC51E1B0
:10C2000020E00E942343E091CE2EF091CF2EE05CFF
:10C21000FF4F4081552747FD509582E060E023E0C5
:10C2200030E000E00E949E4780E067E046EC51E18C
:10C2300020E00E942343E091CE2EF091CF2EEF5BC1
:10C24000FF4F4081552747FD509582E067E023E08E
:10C2500030E00E949E478FE060E043EC51E120E037
:10C260000E94234382E160E04B2D5A2D23E030E011
:10C270000E949E4780E10E94FA81882329F09394CE
:10C2800091E0991508F49924E091CE2EF091CF2EEB
:10C29000E05CFF4F8191992787FD909562E070E007
:10C2A0000E9402927B01F094E194F108F394A0E2E1
:10C2B000EA0E10E48081181B882D90E0672D70E055
:10C2C0004AE050E020E00E94C44A882D672D49E0F2
:10C2D000960100E00E94494B812F90E06E2D70E0A6
:10C2E0004AE050E021E00E94C44A812F6E2D49E0CF
:10C2F0002B2D3A2D01E00E94494BE091CE2EF0917A
:10C30000CF2EEE5BFF4F8081E254F0408093AF224E
:10C3100081AD8093AE221092D2232B2D3A2DC901EC
:10C320006C017E2C812E8091EF2E9091F02E892B26
:10C3300019F0FF24F39430C08AE089832DB73EB70B
:10C34000275030400FB6F8943EBF0FBE2DBFEDB75B
:10C35000FEB731968FE6ADB7BEB711968C9382E0EB
:10C36000818381E082835382448281E090E09683DE
:10C3700085830E94E58C8CE291E09093F02E80936F
:10C38000EF2EFF24F3942DB73EB7295F3F4F0FB632
:10C39000F8943EBF0FBE2DBF80E20E94FA81882331
:10C3A00039F48091ED2E9091EE2E892B09F081CBFE
:10C3B00080EF0E94FA8119828DB79EB707970FB65A
:10C3C000F8949EBF0FBE8DBFEDB7FEB731968FE6D6
:10C3D000ADB7BEB711968C9382E0818311E01283D2
:10C3E000CE0101969483838381E090E096838583D8
:10C3F0000E94E58C109245231092D2238091ED2E5D
:10C400009091EE2E2DB73EB7295F3F4F0FB6F894AF
:10C410003EBF0FBE2DBF892B09F01CC1FF2009F4C0
:10C4200019C110927223109271238FEF9FEF909396
:10C43000B7228093B6220E944B3F6091732E709179
:10C44000742E8091752E9091762E2091772E3091BA
:10C45000782E4091792E50917A2E0E94CD3A8BE71A
:10C4600090E00E94AF54AC0180E060E022E00E94C6
:10C470005C438CE790E00E94AF54AC0180E062E046
:10C4800020E00E945C438DE790E00E94AF54AC0135
:10C4900080E063E020E00E945C438AE190E00E943B
:10C4A000AF54AC0183E167E020E00E945C4385E18A
:10C4B00090E00E94AF54AC0180E065E020E00E9473
:10C4C0005C4389E190E00E94AF54AC018CE067E0EE
:10C4D00020E00E945C438CED95E090937223809362
:10C4E000712380E490E09093B7228093B62210935A
:10C4F0005823C090732ED090742EE090752EF0903B
:10C50000762EC701B60120E836E948E950E00E94DE
:10C51000159281E066E0A90122E030E000E00E948F
:10C52000094883E066E041EC51E120E00E942343AA
:10C53000C701B60128EE33E040E050E00E941592BA
:10C54000CA01B90120E137E240E050E00E941592B3
:10C550009B01AC0184E066E0A90124E030E001E049
:10C560000E940948C701B6012AE030E040E050E0EF
:10C570000E941592CA01B90124E630E040E050E083
:10C580000E9415929B01AC0188E066E0A90122E0BF
:10C5900030E00E940948C090772ED090782EE0902D
:10C5A000792EF0907A2EC701B60120E836E948E9E5
:10C5B00050E00E9415928CE066E0A90122E030E094
:10C5C00000E00E9409488EE066E04FEB51E120E078
:10C5D0000E942343C701B60128EE33E040E050E05B
:10C5E0000E941592CA01B90120E137E240E050E013
:10C5F0000E9415929B01AC018FE066E0A90124E046
:10C6000030E001E00E940948C701B6012AE030E0AD
:10C6100040E050E00E941592CA01B90124E630E0E2
:10C6200040E050E00E9415929B01AC0183E166E07E
:10C63000A90122E030E00E94094880E10E94FA81CD
:10C640008823D9F388EC90E09093EE2E8093ED2E22
:10C650000E944B3F2E960FB6F894DEBF0FBECDBFA3
:10C66000CF91DF911F910F91FF90EF90DF90CF90CE
:10C67000BF90AF909F908F907F906F905F904F9002
:10C6800008956F927F928F929F92AF92BF92CF92B6
:10C69000DF92EF92FF920F931F93DF93CF930F924E
:10C6A000CDB7DEB7898383E5809345231092D223EB
:10C6B00012E333E7632E7724739402E04E0108946B
:10C6C000811C911C21E0A22EB12C98E7C92ED12CFF
:10C6D00084E1E82EF12C32C08DB79EB70B970FB6D0
:10C6E000F8949EBF0FBE8DBFEDB7FEB73196ADB7C4
:10C6F000BEB711966C927182028394828382B68255
:10C70000A58280916D2E90916E2E90878783D28620
:10C71000C1860E94E58CF092EE2EE092ED2E8DB750
:10C720009EB70B960FB6F8949EBF0FBE8DBF80913B
:10C73000ED2E9091EE2E892BD1F711508091D223BE
:10C74000882319F4112341F60AC0112341F00E94F5
:10C750004A8CE091D423F091D523808117C08BE7D8
:10C7600090E00E94AF54AC0180E062E020E00E94C3
:10C770005C4384E690E09093EE2E8093ED2E8091C2
:10C78000ED2E9091EE2E892BD1F78FEF8983898141
:10C790000F90CF91DF911F910F91FF90EF90DF905D
:10C7A000CF90BF90AF909F908F907F906F900895A3
:10C7B0009F92AF92BF92CF92DF92EF92FF920F9330
:10C7C0001F93DF93CF930F92CDB7DEB7898381E5B7
:10C7D000809345231092D22312E361E7962E01E065
:10C7E0005E010894A11CB11C51E0C52ED12C44E17E
:10C7F000E42EF12C2AC08DB79EB707970FB6F89498
:10C800009EBF0FBE8DBFEDB7FEB73196ADB7BEB7B9
:10C8100011969C9201830283B482A382D682C58240
:10C820000E94E58CF092EE2EE092ED2E8DB79EB731
:10C8300007960FB6F8949EBF0FBE8DBF8091ED2E68
:10C840009091EE2E892BD1F711508091D22388231D
:10C8500019F4112381F60FC0112369F00E944A8C4C
:10C86000E091D423F091D52381918983F0936E2EAA
:10C87000E0936D2E18C08BE790E00E94AF54AC019E
:10C8800080E062E020E00E945C4384E690E09093C8
:10C89000EE2E8093ED2E8091ED2E9091EE2E892B31
:10C8A000D1F78FEF898389810F90CF91DF911F910D
:10C8B0000F91FF90EF90DF90CF90BF90AF909F903F
:10C8C00008950F930E944B3F8CE890E00E94AF5474
:10C8D000AC0180E060E022E00E945C4380E090E0F8
:10C8E0000E94AF54AC0180E067E020E00E945C430E
:10C8F00081E01FC080915D230E94D863482F8F3F45
:10C90000C1F160915D2383E050E021E030E000E080
:10C910000E94094860915D2340916D2E50916E2ECA
:10C9200045595F4F85E020E00E94F24280915D23EF
:10C930008F5F80935D2380915D238630D8F284E8F9
:10C9400090E00E94AF54AC0183E066E020E00E94DA
:10C950005C438FEF0E94D863282F8F3F51F081E016
:10C9600066E041E00E94DD5180935D2380915D236C
:10C9700001C08FEF0F9108950F931F93CF93DF9313
:10C9800000E0CCE3D0E01FE00E944B3F8BE890E05A
:10C990000E94AF54AC0180E067E022E00E945C435B
:10C9A00080E090E00E94AF54AC0180E067E020E0BE
:10C9B0000E945C431092D02E80915923882339F035
:10C9C00081E061E04FE25CE320E00E9423431092AB
:10C9D000D02E38C0E62FF0E0809159239F01280F18
:10C9E000311D2E303105CCF4209159238091B72888
:10C9F0006F5FE20FF11DEC9FA001ED9F500DFC9FBA
:10CA0000500D1124819FC0011124480F591F425D10
:10CA10005D4E83E020E00E9423438091D02E85303C
:10CA200061F48091592390E008973CF481E066E03E
:10CA30004DE25CE320E00E9423438091D02E8F5F83
:10CA40008093D02E6091D02E663020F280915A23B0
:10CA5000882399F480915923882331F44091B0229E
:10CA600081E065E020E005C04091B02282E065E011
:10CA700021E001E00E948A51082F80915A238130E1
:10CA8000A9F48091592390E008973CF04091B0229E
:10CA900082E066E021E000E006C04091B02282E042
:10CAA00065E021E001E00E948A51082F0E3F51F419
:10CAB000809159238F5F8093592381E080935A237B
:10CAC00085E00AC00D3F59F480915923815080932D
:10CAD000592310925A2382E08093B02255CF0F3F02
:10CAE00029F00093B02280915923080F802FDF9105
:10CAF000CF911F910F9108955F926F927F928F92C5
:10CB00009F92AF92BF92CF92DF92EF92FF920F93DC
:10CB10001F93DF93CF93CDB7DEB764970FB6F8942A
:10CB2000DEBF0FBECDBFDD2440E0282F30E0215016
:10CB30003040BE016F5F7F4F15C0E42FF0E053E03F
:10CB4000EE0FFF1F5A95E1F7EA5CF84CE4918E2F47
:10CB500090E08217930729F4FB01ED0DF11D40834E
:10CB6000D3944F5F403948F34093D02E10E0ED2C22
:10CB7000FF245E010894A11CB11C2CE3522E9FE0FF
:10CB8000C92E612C81E0782E470108948108910814
:10CB90000E944B3F8AE890E00E94AF54AC0180E0D5
:10CBA00060E022E00E945C4380E090E00E94AF548D
:10CBB000AC0180E067E020E00E945C431092D02E40
:10CBC00080915B23882339F081E061E040E65CE3FB
:10CBD00020E00E9423431092D02E9EC1E62FF0E069
:10CBE00080915B239F01280F311D2E153F050CF00E
:10CBF0007CC120915B238091B7286F5FEA0DFB1DFC
:10CC0000E20FF11D4081459DA00111248C9DC001C2
:10CC10001124480F591F4A585A4E83E020E00E94C1
:10CC200023436091D02E262F30E080915B23D501E5
:10CC3000A20FB31FFD01E80FF11DE081F0E003E05A
:10CC4000EE0FFF1F0A95E1F7E95CF84C8491882309
:10CC500079F480915B23A80FB11DEC91F0E073E0B3
:10CC6000EE0FFF1F7A95E1F7E65CF84CE491ACC05B
:10CC7000813049F580915B23A80FB11DEC91F0E064
:10CC800053E0EE0FFF1F5A95E1F7E65CF84CE49194
:10CC9000A0916D2EB0916E2EAE0FB11D0C916F5FF5
:10CCA000083F08F45FC082E14DE55CE320E00E94AC
:10CCB00023436091D02E6F5FA301401B510984E193
:10CCC00021E030E00FC1823081F580915B23FD01CE
:10CCD000E80FF11DE081F0E043E0EE0FFF1F4A9501
:10CCE000E1F7E65CF84C249180915B23A80FB11D1D
:10CCF000EC91F0E033E0EE0FFF1F3A95E1F7E75CCF
:10CD0000F84C9491E0916D2EF0916E2EE20FF11D92
:10CD1000808198236F5F992321F082E149E55CE3EC
:10CD2000C7C082E145E55CE3C3C08330D1F58091A3
:10CD30005B23F501E80FF11DE20FF31FE081F0E046
:10CD400023E0EE0FFF1F2A95E1F7E65CF84CE49133
:10CD5000A0916D2EB0916E2EAE0FB11D0C910D30C5
:10CD600020F46F5F82E1402FBAC0093190F46F5F09
:10CD700082E143E55CE320E00E9423436091D02EF2
:10CD80006F5F402F50E04C50504083E122E030E094
:10CD9000A9C0093109F0A9C06F5F82E14FE45CE3EB
:10CDA00087C08430D1F480915B23F501E80FF11D39
:10CDB000E20FF31FE081F0E093E0EE0FFF1F9A9582
:10CDC000E1F7E65CF84CE4916F5FA0916D2EB091B5
:10CDD0006E2EAE0FB11D4C9181C08530F1F4809163
:10CDE0005B23F501E80FF11DE20FF31FE081F0E096
:10CDF00083E0EE0FFF1F8A95E1F7E65CF84CE491C3
:10CE00006F5FA0916D2EB0916E2EAE0FB11D4C9143
:10CE10004C9DA001112482E163C0863009F065C0F9
:10CE200020916D2E30916E2E80915B23FD01E80FD5
:10CE3000F11DE081F0E003E0EE0FFF1F0A95E1F73E
:10CE4000E65CF84CE491C9018E0F911DFC01E08174
:10CE5000EE2329F46F5F82E14BE45CE329C0E1300B
:10CE600029F46F5F82E147E45CE322C0E23029F4F9
:10CE70006F5F82E143E45CE31BC0E33029F46F5F42
:10CE800082E14FE35CE314C0E43029F46F5F82E198
:10CE90004BE35CE30DC0E53029F46F5F82E147E3CB
:10CEA0005CE306C06F5FE63039F482E143E35CE3A4
:10CEB00020E00E94234319C080915B23A80FB11D7D
:10CEC000EC91F0E073E0EE0FFF1F7A95E1F7E65C7E
:10CED000F84CE4912E0F311DF901408182E150E0C0
:10CEE00023E030E000E00E9409488091D02E853098
:10CEF00071F480915B2390E00596881599053CF4C8
:10CF000081E066E041E35CE320E00E9423438091FE
:10CF1000D02E8F5F8093D02E6091D02E663008F493
:10CF20005DCE80915C238823E9F480915B23882384
:10CF300081F4F6E0FD1530F44091B12281E065E026
:10CF400020E00CC04091B12281E06D2D20E000E096
:10CF500006C04091B12282E065E021E001E00E943C
:10CF60008A51182F80915C238130B9F480915B2322
:10CF700090E006968E159F053CF04091B12282E02C
:10CF800066E021E000E006C04091B12282E065E069
:10CF900021E001E00E948A51182F1E3F51F4809138
:10CFA0005B238F5F80935B2381E080935C2385E02C
:10CFB0000AC01D3F59F480915B23815080935B230D
:10CFC00010925C2382E08093B122E2CD1F3F59F0A2
:10CFD0001093B122E0915B23F0E03197E10FF11D56
:10CFE000EC0FFD1F1181812F64960FB6F894DEBF00
:10CFF0000FBECDBFCF91DF911F910F91FF90EF90AA
:10D00000DF90CF90BF90AF909F908F907F906F9068
:10D010005F9008952F923F924F925F926F927F920E
:10D020008F929F92AF92BF92CF92DF92EF92FF9238
:10D030000F931F93DF93CF9300D00F92CDB7DEB73E
:10D04000082F0E944B3FC02EDD247601A3E0EE0C9A
:10D05000FF1CAA95E1F7F701E95CF84C149189E807
:10D0600090E00E94AF54AC0180E060E022E00E94BA
:10D070005C4380E090E00E94AF54AC0180E067E048
:10D0800020E00E945C43163009F490C32091B72839
:10D090008CE390E0C89EA001C99E500DD89E500D13
:10D0A00011248FE0289F90011124420F531F4A58EA
:10D0B0005A4E80E062E020E00E942343112309F0F1
:10D0C000DAC084E064E041ED5CE320E00E942343A9
:10D0D0008CE066E04CEC5CE320E00E94234381E0BE
:10D0E00090E00E94AF54AC0180E067E020E00E9435
:10D0F0005C436701F701E85CF84C149129E337E3DE
:10D10000E20EF31EF701E490C6010496E6E38E2ECC
:10D11000E7E39E2E880E991EF4012491E0916D2E76
:10D12000F0916E2EE20FF11D608020915D23820F41
:10D13000911D8A5C984CFC01749085E064E0412F5D
:10D1400050E023E030E000E00E94094889E064E01C
:10D150004E2D50E023E030E00E94094881E164E078
:10D16000472D50E023E030E00E940948F62CCE2CF9
:10D17000DD24A12EBB2480E064E04F2D50E023E0AD
:10D1800030E000E00E9409484F2C5524C2019695DA
:10D19000982F882797958795B6010E940292462F6F
:10D1A00080E068E226E001E00E94C941F1E3FE155B
:10D1B000A8F480E40E94FA81182F80E463E00E94C2
:10D1C0005382182B21F04C145D040CF4F39480E886
:10D1D0000E94FA81182F80E863E014C080E40E9466
:10D1E000FA81182F80E462E00E945382182B21F00C
:10D1F0004C145D040CF4F39480E80E94FA81182F1B
:10D2000080E862E00E945382182BB1F08F2D90E0ED
:10D21000A816B9068CF401979695982F88279795AC
:10D220008795B6010E940292862F68E240E826E0C8
:10D2300000E00E94C941FA9480E20E94158288238E
:10D2400041F080E068E240E826E000E00E94C94149
:10D25000F72C80E10E940482882331F0F61409F44F
:10D26000CEC3F401849193C280E20E940482882399
:10D2700009F481CFC4C3113009F017C184E064E020
:10D280004AEB5CE320E00E9423438CE066E045EB40
:10D290005CE320E00E94234381E090E00E94AF54D1
:10D2A000AC0180E067E020E00E945C4353E0CC0CDE
:10D2B000DD1C5A95E1F7F601E85CF84C949029E3FF
:10D2C00037E3E20EF31EF7011491C601049636E32C
:10D2D000632E37E3732E680E791EF3012491E091DB
:10D2E0006D2EF0916E2EE20FF11D508020915D2386
:10D2F000820F911D8A5C984CFC01C490F7EFFC15DD
:10D3000080F481E164E040EB5CE320E00E94234391
:10D3100040E051E04C19510983E164E021E030E044
:10D3200006C081E164E04C2D50E023E030E000E0F5
:10D330000E940948D52CA12EBB24892C99242FEFBB
:10D34000222E312C2D2D30E03B832A8337EF3D15E3
:10D3500008F0EEC380E064E04DEA5CE320E00E9468
:10D360002343E12C91E0F92E8A819B81E81AF90A86
:10D3700082E064E0A70121E030E000E00E9409487B
:10D3800084E0EE0CFF1C8A95E1F780E068E24E2D08
:10D3900026E001E00E94C94180E40E94FA81182F32
:10D3A00080E461E00E945382182BA1F539C0EA8124
:10D3B000FB81EA15FB056CF4D394F8EFDF1649F412
:10D3C00080E068E240E826E000E00E94C941DD24F8
:10D3D000DA9480E80E94FA81182F80E863E00E94C6
:10D3E0005382182BE1F18D2D90E088169906BCF53B
:10D3F00001979695982F882797958795B5010E9454
:10D400000292862F68E240E826E000E00E94C941CF
:10D41000DA9425C02A813B81283F310509F0DA944E
:10D4200080E80E94FA81182F80E861E00E94538210
:10D43000182BA9F0C1018D1991098295807F68E2AE
:10D4400040E826E000E00E94C941D39441F480E026
:10D4500068E240E826E00E94C94117EFD12E80E241
:10D460000E941582882341F080E068E240E826E0CF
:10D4700000E00E94C941DC2C80E10E9404828823E4
:10D4800069F0D51409F4BBC2F3018491E0916D2ECB
:10D49000F0916E2EE80FF11DD082A7C280E20E94AB
:10D4A0000482882309F44ECFAAC2123009F09AC030
:10D4B0008BE690E00E94AF54AC0183E064E020E092
:10D4C0000E945C438CE690E00E94AF54AC0183E084
:10D4D00065E020E00E945C4380E090E00E94AF5451
:10D4E000AC0180E067E020E00E945C4329E337E381
:10D4F000E20EF31EF7010491C601B3E0880F991FF5
:10D50000BA95E1F70496A6E3CA2EA7E3DA2EC80E71
:10D51000D91EF6012491E0916D2EF0916E2EE20F4E
:10D52000F11DE08020915D23820F911D8A5C984C53
:10D53000FC014491413029F488E064E04BEA5CE36B
:10D5400006C0442339F488E065E049EA5CE320E062
:10D550000E9423431E2DF12EF02261F081E064E051
:10D5600047EA5CE320E00E94234381E065E045EA6E
:10D570005CE30BC081E064E043EA5CE320E00E94EE
:10D58000234381E065E041EA5CE320E00E9423431D
:10D5900080E80E94FA81882319F0FF2009F41027FF
:10D5A00080E40E94FA81882321F0812F802309F0F2
:10D5B000102780E10E94FA81882369F01E1509F482
:10D5C0001EC2F6018491E0916D2EF0916E2EE80F4F
:10D5D000F11D10830AC280E20E940482882309F4AC
:10D5E000BACF0DC2133009F0E1C084E064E04FE827
:10D5F0005CE320E00E9423438CE066E04AE85CE3C1
:10D6000020E00E94234381E090E00E94AF54AC01EF
:10D6100080E067E020E00E945C43F3E0CC0CDD1C7E
:10D62000FA95E1F7F601E85CF84C149129E337E349
:10D63000E20EF31EF7014490C601049676E3A72E8E
:10D6400077E3B72EA80EB91EF5012491E0916D2E57
:10D65000F0916E2EE20FF11D508020915D23820F1C
:10D66000911D8A5C984CFC01E49081E164E04E2DB0
:10D6700050E023E030E000E00E940948F52CC42C83
:10D68000DD2464EF662E6FEF762E6C0C7D1C812EF0
:10D6900099242F2C3324261437043CF480E064E0D2
:10D6A0004F2D50E023E030E011C02C143D048CF4E9
:10D6B00080E064E048E85CE320E00E942343A101AD
:10D6C0004C50504081E064E022E030E000E00E94F5
:10D6D0000948F41439F480E064E044E85CE320E0B5
:10D6E0000E942343C1019695982F88279795879587
:10D6F000B6010E940292462F80E068E226E001E037
:10D700000E94C94180E40E94FA81182F80E462E0FF
:10D710000E945382182B21F02C143D040CF4F39436
:10D7200080E80E94FA81182F80E862E00E9453820C
:10D73000182BB1F08F2D90E0881699068CF4019784
:10D740009695982F882797958795B6010E94029203
:10D75000862F68E240E826E000E00E94C941FA9482
:10D7600080E20E941582882341F080E068E240E870
:10D7700026E000E00E94C941FE2C80E10E94048264
:10D78000882369F0F51409F43AC1F5018491E09118
:10D790006D2EF0916E2EE80FF11DF08226C180E211
:10D7A0000E940482882309F474CF29C1143009F03F
:10D7B000A9C080E067E04EE65CE320E00E942343DE
:10D7C000F02FFD55F983F23050F48CE190E00E9487
:10D7D000AF54AC0185E066E020E00E945C43402E3F
:10D7E000552433E0440C551C3A95E1F72AE337E31E
:10D7F000420E531EF2018491E0916D2EF0916E2E37
:10D80000E80FF11DE0800E2DFF2428E0722E97E036
:10D81000892E912C81E0A82EB12C1092D02EC02EF2
:10D82000DD241CC0C601022E02C0959587950A947E
:10D83000E2F780FF06C0872D821B64E04CE65CE3C4
:10D8400005C0872D821B64E04AE65CE320E00E946D
:10D8500023438091D02E8F5F8093D02E2091D02EA5
:10D86000283000F31F2D1F5F812F65E048E65CE341
:10D8700020E00E94234380E80E94FA81882311F46B
:10D880001F2D0AC0812F65E046E65CE320E00E9480
:10D890002343183009F410E0F981F23050F480E4A9
:10D8A0000E941582882329F0002311F40AEA01C09E
:10D8B00000E080E40E940482882351F0C401811BAF
:10D8C0009109950102C0220F331F8A95E2F70227C2
:10D8D00080E10E940482882369F00E1509F48FC04C
:10D8E000F2018491E0916D2EF0916E2EE80FF11D02
:10D8F00000837BC080E20E940482882309F07FC0FD
:10D90000F12E8BCF153009F07EC081E090E00E94AF
:10D91000AF54AC0180E067E020E00E945C43802EC1
:10D92000992403E0880C991C0A95E1F72AE337E370
:10D93000820E931EF4018491E0916D2EF0916E2E73
:10D94000E80FF11DB08086E690E063E270E040E110
:10D9500050E021E00E94C44AFB2C1FE0A12E0AC027
:10D96000FE1439F086E663E24FE0960100E00E9483
:10D97000494BFE2CFA9C6001112486E663E24FE0DD
:10D98000960101E00E94494B80E40E94FA81182F21
:10D9900080E461E00E945382182B11F4EF2C06C042
:10D9A000EF2CE394F8E1EF1609F4EE2480E80E94EE
:10D9B000FA81182F80E861E00E945382182B29F029
:10D9C000EE2011F4B8E1EB2EEA9480E10E9404828B
:10D9D000882379F0EB1499F0F4018491E0916D2E95
:10D9E000F0916E2EE80FF11DE08281E080935E23BE
:10D9F00006C080E20E940482882309F4B1CF80EF40
:10DA00000E94FA81BBC0163009F0B8C0802E99245C
:10DA1000A3E0880C991CAA95E1F72AE337E3820E6C
:10DA2000931E80E090E00E94AF54AC0180E067E07C
:10DA300020E00E945C43BB247724AA24A39409C05D
:10DA4000BB2039F081E061E044E65CE320E00E9425
:10DA50002343EB2CFF248701F4E0000F111FFA95FC
:10DA6000E1F70E0D1F1D0A54144C44245524620185
:10DA7000CE0CDF1C37E0C316D1043CF4642D6F5F7D
:10DA800083E0A80120E00E94234385E0481659F472
:10DA900096E0C916D1043CF481E066E042E65CE31E
:10DAA00020E00E9423430894411C511C0F5E1F4F2D
:10DAB000E6E04E165104D9F6772039F4BB2069F41C
:10DAC00081E065E04A2D20E00CC0BB2031F082E00F
:10DAD00066E04A2D21E000E005C082E065E04A2DC5
:10DAE00021E001E00E942252982F8E3F31F4B3943E
:10DAF00077247394E5E0AE2EA3CF8D3F29F4BA943A
:10DB0000772472E0A72E9CCF8C3FC1F1883008F0BB
:10DB100097CFF4018491E0916D2EF0916E2EE80F75
:10DB2000F11DB90EBA94B08281E080935E2326C0C5
:10DB300080E064E04D2D50E023E030E000E00E9402
:10DB400009488A819B819695982F88279795879574
:10DB5000B5010E940292462F80E068E226E001E0D3
:10DB60000E94C94180E40E94FA81182F80E463E09A
:10DB70000E945382182B09F01ACC2BCC0F900F90D7
:10DB80000F90CF91DF911F910F91FF90EF90DF9059
:10DB9000CF90BF90AF909F908F907F906F905F904D
:10DBA0004F903F902F900895FF920F931F930E94E4
:10DBB0004B3F84E890E00E94AF54AC0180E061E00C
:10DBC00020E00E945C4385E890E00E94AF54AC01E5
:10DBD00080E063E020E00E945C4386E890E00E94E1
:10DBE000AF54AC0180E067E020E00E945C4313E0AA
:10DBF000B5E0FB2E85E063E0412F50E021E030E00E
:10DC000000E00E9409488EE063E04F2D50E021E0E3
:10DC100030E00E94094880E80E94FA81882321F0C0
:10DC20001F5F163009F411E080E40E94FA81882316
:10DC300031F0F39486E0F81611F4FF24F39480E1B8
:10DC40000E94FA81882309F470C080E065E049EF02
:10DC50005CE320E00E94234387E890E00E94AF54F9
:10DC6000AC0180E065E020E00E945C4383E090E04E
:10DC70000E94AF54AC018CE067E020E00E945C435E
:10DC800080E10E94FA818823C1F1812F0E94D8632C
:10DC90008117B9F48F2D0E9441638F1591F480E0B4
:10DCA00065E043EE5CE320E00E94234388E890E0D7
:10DCB0000E94AF54AC0180E065E020E00E945C432C
:10DCC0000FC08BE190E00E94AF54AC0180E065E0B2
:10DCD00020E00E945C4386E065E04EE00E947643CF
:10DCE00084E690E09093EE2E8093ED2E8091ED2EC1
:10DCF0009091EE2E892BD1F721C080E20E94FA810B
:10DD0000882309F4BDCF80EF0E94FA8180E065E0AE
:10DD100045E10E94764386E890E00E94AF54AC0152
:10DD200080E067E020E00E945C4380E20E94FA818C
:10DD3000882309F45FCF80EF0E94FA811F910F9131
:10DD4000FF9008950F931F930E94628E0E9461645A
:10DD500080935D2380915D238F3F09F424C18091DE
:10DD60005D23863019F40E94D46D1DC10E944B3F83
:10DD70008EE790E00E94AF54AC0180E060E022E0CA
:10DD80000E945C4340915D23405D89E060E022E0B9
:10DD90000E9408428FE790E00E94AF54AC0183E0FC
:10DDA00062E020E00E945C4380E890E00E94AF5473
:10DDB000AC0183E063E020E00E945C4380E090E0FF
:10DDC0000E94AF54AC0180E067E020E00E945C4319
:10DDD00082E063E042E020E000E00E948A518F3F51
:10DDE00009F4E1C0833009F03CC080915D230E94BA
:10DDF000D86380915D230E94416390915D238917D0
:10DE000091F480E062E045E10E94764380E063E0C7
:10DE100045E10E94764381E890E00E94AF54AC0156
:10DE20008BE060E011C080E062E045E10E94764353
:10DE300080E063E045E10E9476438BE190E00E9440
:10DE4000AF54AC0180E064E020E00E945C4380E2DB
:10DE50009EE424EF31E0F9013197F1F70197D9F70A
:10DE6000A2C080915D238F3F09F49DC080915D2306
:10DE70000E94D8638F3F09F496C0109259231092E4
:10DE80005A2381E08093B02210925E2311E00E9419
:10DE9000BC64082F8F3F71F010925B2310925C23BB
:10DEA0001093B122802F0E947C658F3F81F30E94E6
:10DEB0000A68F8CF80915E23813009F074C00E9417
:10DEC0004B3F82E890E00E94AF54AC0180E060E0FC
:10DED00022E00E945C4340915D23405D89E060E068
:10DEE00022E00E94084240915D2389E060E050E01A
:10DEF00021E030E000E00E9409488BE690E00E94BB
:10DF0000AF54AC0183E062E020E00E945C438CE609
:10DF100090E00E94AF54AC0183E063E020E00E94F7
:10DF20005C4380E090E00E94AF54AC0180E067E089
:10DF300020E00E945C4382E063E042E020E00E9437
:10DF40008A51823081F580915D230E9441639091D6
:10DF50005D23891791F483E890E00E94AF54AC01EF
:10DF600083E064E020E00E945C4381E890E00E944E
:10DF7000AF54AC0183E065E007C08BE190E00E9404
:10DF8000AF54AC0180E064E020E00E945C4384E692
:10DF900090E09093EE2E8093ED2E8091ED2E909157
:10DFA000EE2E892BD1F71F910F9108952F923F925A
:10DFB0004F925F926F927F928F929F92AF92BF9299
:10DFC000CF92DF92EF92FF920F931F93DF93CF9345
:10DFD000CDB7DEB728970FB6F894DEBF0FBECDBF22
:10DFE00084ED91E090938900809388000E944B3FDC
:10DFF00085E19DE362E00E94FB4287E065E043E14A
:10E000005DE320E00E94234380E165E040E15DE3C1
:10E0100020E00E94234382E090E00E94AF54AC01D4
:10E0200080E067E020E00E945C4382E167E04CE032
:10E030005DE320E00E94234383E067E148E728E0B6
:10E0400001E00E94954387E167E147E12FE10E94EB
:10E05000EC408BE267E14BE22FE10E94EC408DE364
:10E0600067E143E028E00E94C94183E567E143E5B9
:10E070002FE10E94EC4087E667E147E62FE10E942E
:10E08000EC4084E065E040E050E023E030E000E078
:10E090000E9409488CE065E046E950E023E030E06A
:10E0A0000E94124616E946E9442E512C38EC632EA4
:10E0B000712C20E8222E312C80E40E94FA818823E2
:10E0C00031F480E463E00E9453828823E1F1113E41
:10E0D000D0F51639F8F4B201611B7109882777FD74
:10E0E0008095982F0E94EE8F2DEC3CEC4CE45FEB7A
:10E0F0000E94DB9020E030E04CE752E40E94E88E82
:10E100000E94C08FDC01CB0168E141E026E000E025
:10E110000E94C9411F5F1B3469F0143659F01D3746
:10E1200049F0163939F01F3A29F0183C19F0113E20
:10E1300009F080C070927223609271233092B722EE
:10E140002092B62277C080E80E94FA81882339F4B1
:10E1500080E863E00E945382882309F44DC01C3498
:10E1600008F44AC0173958F1612F70E066597040C1
:10E17000882777FD8095982F0E94EE8F2DEC3CEC40
:10E180004CE45FE30E94DB905B016C0120E030E037
:10E190004CE752E40E94E88E0E94C08F6D837E831C
:10E1A0008F839887C601B5010E94C08F9B01AC0187
:10E1B0008D8168E1422F26E000E00E94C941412F95
:10E1C00041504B3461F0443651F04D3741F04639FF
:10E1D00031F04F3A21F0483C11F0413E41F4709249
:10E1E0007223609271233092B7222092B622142FAC
:10E1F0004B3400F51BE44AC080E10E94FA81882379
:10E2000009F4CAC084E068E146E726E000E00E9425
:10E21000C9418DE367E143E028E001E00E94C94184
:10E2200070927223609271233092B7222092B622AC
:10E2300016E902C0163950F1E12EFF248AE69FEF5D
:10E24000E80EF91EB701882777FD8095982F0E9468
:10E25000EE8F2DEC3CEC4CE45FE30E94DB900E94DF
:10E26000C08F9B01AC018FE368E1422F26E001E003
:10E270000E94C941EE0CFF1C84E065E0A70123E089
:10E2800030E000E00E9409488EE33EC04201811A5E
:10E290009108B401882777FD8095982F0E94EE8F12
:10E2A00069837A838B839C832DEC3CEC4CE45FEB9D
:10E2B0000E94DB9020E030E04CE752E40E94E88EC0
:10E2C0000E94C08F5B016C0169817A818B819C8186
:10E2D0002DEC3CEC4CE45FE30E94DB900E94C08F8D
:10E2E0009B01AC018A2D68E1422F26E001E00E94EB
:10E2F000C941880C991C84E065E0A40123E030E06A
:10E3000000E00E9409488DE367E142E028E001E077
:10E310000E94C9418CE065E0412F50E023E030E0ED
:10E3200000E00E94124683E067E143E02FE101E054
:10E330000E94EC4087E167E147E12FE10E94EC4059
:10E340008BE267E14BE22FE10E94EC4083E567E15D
:10E3500043E52FE10E94EC4087E667E147E62FE1C5
:10E360000E94EC408BE767E14BE72FE10E94EC4015
:10E37000612F70E0882777FD8095982F0E94EE8F9F
:10E3800020E030E048E450E40E94DB900E94C08F1F
:10E39000709389006093880080E20E94FA8188234C
:10E3A00009F48ACE80EF0E94FA8128960FB6F8947D
:10E3B000DEBF0FBECDBFCF91DF911F910F91FF90B8
:10E3C000EF90DF90CF90BF90AF909F908F907F9015
:10E3D0006F905F904F903F902F9008950E944B3F19
:10E3E00080E063E04AEC56E422E00E94234380E0B0
:10E3F00064E045EB56E422E00E94234380E197E28B
:10E4000024EF31E0F9013197F1F70197D9F7089539
:10E410001F93182F8093EA2E0E944B3F81E790E0D4
:10E420000E94AF54AC0180E062E020E00E945C43B7
:10E43000112319F0113069F405C08FE062E04BEF51
:10E4400055E404C08FE062E046EF55E420E00E940E
:10E45000234381E090E00E94AF54AC0180E067E08C
:10E4600020E00E945C4380E40E94FA81882351F0FE
:10E47000112341F48FE062E041EF55E420E00E9477
:10E48000234311E080E80E94FA81882351F0113083
:10E4900041F48FE062E04CEE55E420E00E9423431B
:10E4A00010E080E10E94FA81882321F081E08093CE
:10E4B0005F230CC080E20E94FA818823A1F280EFE2
:10E4C0000E94FA8110925F231091EA2E10937B280C
:10E4D000812F1F910895EF92FF920F931F93082FA2
:10E4E000E62EF42E122F8093EA2E0E944B3F812FAE
:10E4F00090E00E94AF54AC0180E062E020E00E9416
:10E500005C43013051F0013028F0023049F0033013
:10E51000A1F409C086E590E008C087E590E005C059
:10E5200088E590E002C089E590E00E94AF54AC011C
:10E530008AE062E020E00E945C4381E090E00E947B
:10E54000AF54AC0180E067E020E00E945C4311E042
:10E5500080E40E94FA81882309F10F15F8F41093E2
:10E560005F230F5F013051F0013028F0023049F095
:10E570000330A1F409C086E590E008C087E590E08B
:10E5800005C088E590E002C089E590E00E94AF54A4
:10E59000AC018AE062E020E00E945C4380E80E94D7
:10E5A000FA81882309F1E016F8F410935F230150F3
:10E5B000013051F0013028F0023049F00330A1F46D
:10E5C00009C086E590E008C087E590E005C088E5D1
:10E5D00090E002C089E590E00E94AF54AC018AE06F
:10E5E00062E020E00E945C4380E10E94FA8188237F
:10E5F00069F480E20E94FA81882309F4A9CF80EFB0
:10E600000E94FA8110925F230091EA2E802F1F91C1
:10E610000F91FF90EF9008950F931F93082F122FE3
:10E620008093EA2E0E944B3F812F90E00E94AF54CE
:10E63000AC0180E062E020E00E945C43002319F01E
:10E64000013071F403C08CE690E002C08BE690E0EC
:10E650000E94AF54AC0181E162E020E00E945C4383
:10E6600081E090E00E94AF54AC0180E067E020E0E0
:10E670000E945C4380E40E94FA81882369F00023B1
:10E6800059F48BE690E00E94AF54AC0181E162E066
:10E6900020E00E945C4301E080E80E94FA81882328
:10E6A00069F0013059F48CE690E00E94AF54AC015F
:10E6B00081E162E020E00E945C4300E080E10E9492
:10E6C000FA81882321F081E080935F230CC080E2EF
:10E6D0000E94FA81882371F280EF0E94FA811092E1
:10E6E0005F230091EA2E802F1F910F9108950F93C1
:10E6F0001F93082F122F8093EA2E0E944B3F812FE9
:10E7000090E00E94AF54AC0180E062E020E00E9403
:10E710005C43002319F0013071F403C089E290E0FA
:10E7200002C088E290E00E94AF54AC0181E162E057
:10E7300020E00E945C4381E090E00E94AF54AC0175
:10E7400080E067E020E00E945C4380E40E94FA8160
:10E75000882369F0002359F488E290E00E94AF54C6
:10E76000AC0181E162E020E00E945C4301E080E8CE
:10E770000E94FA81882369F0013059F489E290E01F
:10E780000E94AF54AC0181E162E020E00E945C4352
:10E7900000E080E10E94FA81882341F081E08093CB
:10E7A0005F2300938B280E94AC380EC080E20E9449
:10E7B000FA81882351F280EF0E94FA8110925F2340
:10E7C0000091EA2E00938B28802F1F910F910895BE
:10E7D0000F931F93182F8093EA2E0E944B3F85E6DC
:10E7E00090E00E94AF54AC0180E062E020E00E9423
:10E7F0005C43112319F0113071F403C080E590E0FF
:10E8000002C081E590E00E94AF54AC018FE062E06D
:10E8100020E00E945C4381E090E00E94AF54AC0194
:10E8200080E067E020E00E945C4301E080E40E9419
:10E83000FA81882379F0112369F400935F2381E53D
:10E8400090E00E94AF54AC018FE062E020E00E94B3
:10E850005C4311E080E80E94FA81882379F011304E
:10E8600069F410935F2380E590E00E94AF54AC01FF
:10E870008FE062E020E00E945C4310E080E10E94B3
:10E88000FA81882361F480E20E94FA81882371F280
:10E8900080EF0E94FA8110925F231091EA2E812F5F
:10E8A0001F910F910895DF92EF92FF920F931F93A4
:10E8B000F82ED62EE42E122F0E944B3F812F90E08F
:10E8C0000E94AF54AC0180E062E020E00E945C4313
:10E8D000F092EA2E80E162E04F2D50E023E030E03C
:10E8E00000E00E94094881E090E00E94AF54AC0132
:10E8F00080E067E020E00E945C4311E080E40E9439
:10E90000FA81882331F480E462E00E9453828823F4
:10E9100071F0FE1460F410935F23F39480E162E0E1
:10E920004F2D50E023E030E000E00E94094880E8ED
:10E930000E94FA81882331F480E862E00E945382C9
:10E94000882371F0DF1460F410935F23FA9480E160
:10E9500062E04F2D50E023E030E000E00E940948E3
:10E9600080E10E94FA81882361F480E20E94FA81AA
:10E97000882321F280EF0E94FA8110925F23F090A9
:10E98000EA2E8F2D1F910F91FF90EF90DF90089549
:10E99000CF92DF92EF92FF920F931F93CF93DF936B
:10E9A000EC016B017A010E944B3F82E790E00E94EC
:10E9B000AF54AC0180E062E020E00E945C4384E759
:10E9C00090E00E94AF54AC0180E065E020E00E943E
:10E9D0005C4385E790E00E94AF54AC0180E066E0C4
:10E9E00020E00E945C43D093D22EC093D12E80E1D0
:10E9F00062E0AE0124E030E000E00E94094881E0DE
:10EA000090E00E94AF54AC0180E067E020E00E94FB
:10EA10005C4386EF9FEFE80EF91E11E080E40E9450
:10EA2000FA81882331F480E462E00E9453828823D3
:10EA300091F0CE15DF0578F410935F232A96D093DA
:10EA40007D28C0937C2880E162E0AE0124E030E0C4
:10EA500000E00E94094880E80E94FA81882331F48E
:10EA600080E862E00E945382882391F0CC16DD0694
:10EA700078F410935F232A97D0937D28C0937C2845
:10EA800080E162E0AE0124E030E000E00E9409484D
:10EA900080E10E94FA81882339F50E94A04C4091C0
:10EAA00043235091442388E063E020E030E000E01D
:10EAB0000E94124683E063E047EE55E420E00E94A6
:10EAC000234380E20E94FA81882309F4A7CF80EFD4
:10EAD0000E94FA8110925F23C091D12ED091D22E44
:10EAE000D0937D28C0937C28CE01DF91CF911F91D8
:10EAF0000F91FF90EF90DF90CF9008956F927F92EB
:10EB00008F929F92AF92BF92CF92DF92EF92FF923D
:10EB10000F931F93CF93DF931092702E10925F2369
:10EB20000E944B3FBB249924AA24A39438E4632E6B
:10EB3000712C22E1822E01C0A02E0E944B3F80E763
:10EB400090E00E94AF54AC0180E060E022E00E94BF
:10EB50005C4380E090E00E94AF54AC0180E067E04D
:10EB600020E00E945C43BB2039F081E061E045EE8B
:10EB700055E420E00E942343CB2CDD24C69C800179
:10EB8000C79C100DD69C100D1124C0E0D0E07E0172
:10EB9000EC0CFD1C82E0E816F10484F44091B728E7
:10EBA000CE018F5F682F489DA0011124400F511F97
:10EBB0004D5A5A4B83E020E00E942343C53049F46C
:10EBC000EF2839F481E066E043EE55E420E00E944E
:10EBD00023432196085B1F4FC630D105C1F699200B
:10EBE00069F4BB2029F481E062E04A2D20E00AC0EC
:10EBF00082E065E04A2D21E001E005C082E066E0A8
:10EC00004A2D21E000E00E948A51082F8E3F31F406
:10EC1000B3949924939495E0A92EA5CF8D3F29F420
:10EC2000BA94992482E0A82E9ECF8F3F39F4809128
:10EC30005F23813059F50E94AC3828C090E08B0DDD
:10EC4000911D8130910549F480917B2860E041E07D
:10EC50000E94087280937B2811C0029709F06CCF44
:10EC600080917C2890917D2860E070E04FE057E231
:10EC70000E94C87490937D2880937C2880915F23A4
:10EC8000813009F059CF0E94AC3856CFDF91CF9137
:10EC90001F910F91FF90EF90DF90CF90BF90AF90BA
:10ECA0009F908F907F906F9008956F927F928F9238
:10ECB0009F92AF92BF92CF92DF92EF92FF920F930B
:10ECC0001F93CF93DF93F82EE92ED62EB42E890111
:10ECD0000E944B3F80E060E0A80122E00E942343B5
:10ECE0002F2D3E2DC901EC01B3EDEB2EBEE2FB2E24
:10ECF00001E0DD0CD39414C0102F1F5F802F63E060
:10ED0000488120E00E9408420E5F812F63E04DE6BB
:10ED100056E420E00E9423438991F70181937F010B
:10ED20000D1551F783E066E14AE02AE001E00E9418
:10ED3000954380E066E04EE556E420E00E942343E0
:10ED400080E067E049E456E420E00E94234311E0BC
:10ED5000FF24EE24E394A0E2CA2EF9E37F2EEAE535
:10ED60006E2E71E6A72E61E4962E50E3852E46E0C6
:10ED7000D42EF1E0BF1609F078C0ECEDFEE29AE087
:10ED80008081803219F09093E92E04C09150319720
:10ED90009923B1F780E40E94FA81882331F480E45A
:10EDA00062E00E945382882379F1AF2DB0E0FD012B
:10EDB000ED52F14D80818A3738F58F5F8083803244
:10EDC00008F4C082FD01ED52F14D808181528F30F7
:10EDD00008F48082FD01ED52F14D80818A53873025
:10EDE00008F49082FD01ED52F14D80818B55863003
:10EDF00008F4A082AD52B14D812F63E04C9120E028
:10EE00000E940842E0925F2380E80E94FA818823F2
:10EE100039F480E862E00E945382882309F45EC0DE
:10EE2000AF2DB0E0FD01ED52F14D8081813208F44B
:10EE300055C0815080838B55863008F46082FD0177
:10EE4000ED52F14D80818A53873008F47082FD01C4
:10EE5000ED52F14D808181528F3008F4C082AD5265
:10EE6000B14D812F63E04C9134C082E0B816B1F50A
:10EE700080E40E94FA81882331F480E461E00E94FA
:10EE80005382882381F0EF2DF0E0ED52F14D408167
:10EE9000493348F44F5F4083812F63E020E00E94B4
:10EEA0000842E0925F2380E80E94FA81882331F4CF
:10EEB00080E861E00E945382882381F0EF2DF0E02A
:10EEC000ED52F14D4081413348F041504083812F54
:10EED00063E020E00E940842E0925F2380E20E940B
:10EEE0001582882369F0EF2DF0E0ED52F14DC082DC
:10EEF000812F63E040E220E00E940842E0925F231D
:10EF000080E20E940482882379F1812F869590E027
:10EF10000997A4F01D9DC0011124835066E14AE0C9
:10EF20002AE000E00E94954383E066E14AE02AE09F
:10EF300001E00E94954311E0FF2416C01D9DC00111
:10EF40001124835066E14AE02AE000E00E949543E4
:10EF50001E5F1D9DC0011124835066E14AE02AE036
:10EF600001E00E949543F39480E10E94FA81882396
:10EF700009F4FFCE80EF0E94FA8181E0DF91CF910A
:10EF80001F910F91FF90EF90DF90CF90BF90AF90C7
:10EF90009F908F907F906F9008952F923F924F9205
:10EFA0005F926F927F928F929F92AF92BF92CF9219
:10EFB000DF92EF92FF920F931F93DF93CF93CDB722
:10EFC000DEB764970FB6F894DEBF0FBECDBF1092C8
:10EFD000702E10925F230E944B3F88245524992461
:10EFE000939408EE202E03E0302E3E010894611C1D
:10EFF000711C10E2412E01C09F2C0E944B3F8DE6F8
:10F0000090E00E94AF54AC0180E060E022E00E94FA
:10F010005C4380E090E00E94AF54AC0180E067E088
:10F0200020E00E945C43882039F081E061E047E401
:10F0300056E420E00E942343A82CBB2488E490E0FF
:10F04000A89E7001A99EF00CB89EF00C112400E05F
:10F0500010E06801CA0CDB1C95E0C916D10484F4E9
:10F060004091B728602F6F5F82E1489FA001112473
:10F070004E0D5F1D45515C4B83E020E00E94234311
:10F08000053059F494E0C916D1043CF481E066E0FF
:10F0900045E456E420E00E9423430F5F1F4F88E4BD
:10F0A00090E0E80EF91E0630110599F6552069F436
:10F0B000882029F481E065E0492D20E00AC082E043
:10F0C00065E0492D21E001E005C082E066E0492DC0
:10F0D00021E000E00E948A51F82E9EEF891721F46A
:10F0E0008394552453941CC08DEFF81619F48A9418
:10F0F000552416C09FEFF91609F4BBC010915F2389
:10F10000113071F48091B0280E94A72E892B19F03C
:10F110001093B52802C01092B5280E94AC38A9C03F
:10F120000F2D10E0080D111D0130110551F48091D3
:10F13000B02860E041E02DE60E940C738093B02877
:10F1400091C002301105E1F520E030E0F301E20F5B
:10F15000F31FD901A158B74D8C9180832F5F3F4F8A
:10F160002A30310599F71B86C3016AE041E02FE29E
:10F1700036E40E94557680915F23813009F04DC0BE
:10F1800000E00CC0E02FF0E0DF01AD52B14D8C91FA
:10F19000E158F74D80830E94AC380F5F1091E92E43
:10F1A000011780F31A3048F027CFE12FF0E0E15843
:10F1B000F74D40820E94AC381F5F1A30B0F31CCF6D
:10F1C0000330110551F58091BE2889838091BF28B5
:10F1D0008A838091C0288B838091C1288C831D8273
:10F1E000C30164E042E029E136E40E945576809153
:10F1F0005F23813091F400E010E0F801E254F74D14
:10F20000D801AD52B14D8C9180830E94AC380F5F14
:10F210001F4F0430110589F7EFCE0430110511F5A9
:10F220000E94A72E019751F480E063E04EE056E47F
:10F2300020E00E9423430E94C637DECE80E063E0D8
:10F2400040E056E420E00E9423431092B52830921B
:10F2500072232092712380E490E09093B7228093F0
:10F26000B622CACE0530110509F0C6CE0E94FF3085
:10F27000C3CE64960FB6F894DEBF0FBECDBFCF915C
:10F28000DF911F910F91FF90EF90DF90CF90BF9093
:10F29000AF909F908F907F906F905F904F903F9036
:10F2A0002F9008954F925F926F927F928F929F92CC
:10F2B000AF92BF92CF92DF92EF92FF920F931F9384
:10F2C000CF93DF931092702E10925F230E944B3FDA
:10F2D000AA247724BB24B39498E4492E512C82E1CC
:10F2E000682E01C0B12E0E944B3F80E060E043E7F2
:10F2F00056E422E00E94234380E090E00E94AF5455
:10F30000AC0180E067E020E00E945C43AA2039F075
:10F3100081E061E041E756E420E00E9423430A2DAA
:10F3200010E0049D7001059DF00C149DF00C11245B
:10F33000C0E0D0E048016E01C00ED11E88E0C816C2
:10F34000D10484F44091B728CE018F5F682F469D89
:10F35000A00111244E0D5F1D45555E4B83E020E05A
:10F360000E942343C53059F497E0C916D1043CF4F8
:10F3700081E066E04FE656E420E00E9423432196B8
:10F3800088E490E0E80EF91EC630D105A1F677209A
:10F3900039F4AA2079F481E065E04B2D20E00EC01D
:10F3A00092E08916910434F082E066E04B2D21E072
:10F3B00000E005C082E065E04B2D21E001E00E9405
:10F3C0008A51182F8E3F21F4A3947724739414C08C
:10F3D0008D3F19F4AA9477240FC08F3F09F467C0BA
:10F3E00080915F23813041F48091B328813011F402
:10F3F0000E9457280E94AC38C12FD0E0CA0DD11D01
:10F40000C130D10551F48091B32860E041E028E695
:10F410000E940C738093B32824C0C230D10551F4EC
:10F420008091C32860E045E024E60E9453748093F5
:10F43000C32824C0C330D10551F48091B12860E0C5
:10F440004FE724E60E9453748093B12824C0C4304F
:10F45000D10539F48091BC280E94E8738093BC28C0
:10F4600020C0C530D10551F48091AF2860E04FE74E
:10F4700026E60E9453748093AF2834CFC630D1055E
:10F4800051F48091B22860E04FE727E60E94537460
:10F490008093B22827CFC730D10519F40E9457288E
:10F4A00021CF289709F01ECF0E9400301BCFDF919B
:10F4B000CF911F910F91FF90EF90DF90CF90BF9071
:10F4C000AF909F908F907F906F905F904F90089536
:10F4D0000E944B3F80EF0E94FA8184E590E00E94F9
:10F4E000AF54AC0180E062E020E00E945C4385E51F
:10F4F00090E00E94AF54AC0180E063E020E00E9405
:10F500005C4383E590E00E94AF54AC018CE067E07F
:10F5100020E00E945C4380E10E94FA81882319F078
:10F520000E944939089580E20E94FA81882399F364
:10F5300080EF0E94FA810895BF92CF92DF92EF92FE
:10F54000FF920F931F93CF93DF93F82EB62EE42EE6
:10F55000122F8093EA2E682F70E0882777FD809520
:10F56000982F0E94EE8F23E333E343E250E40E949E
:10F57000DB900E94C08F6093B3000E944B3F812FAD
:10F5800090E00E94AF54AC0180E062E020E00E9475
:10F590005C4380E162E04F2D50E023E030E000E08A
:10F5A0000E94094881E162E047EA56E420E00E94B7
:10F5B000234381E090E00E94AF54AC0180E067E01B
:10F5C00020E00E945C4348ECC42ED12CC0E8D0E07F
:10F5D00080E162E04F2D50E023E030E000E00E9447
:10F5E00009488F2D90E09695982F882797958795B5
:10F5F00064E670E00E940292462F80E060E226E01E
:10F6000001E00E94C94180E40E94FA81882331F41C
:10F6100080E463E00E945382882309F1FE14F8F429
:10F62000F394FE1450F0D0927223C0927123D093C1
:10F63000B722C093B622FE2C12C06F2D70E088272F
:10F6400077FD8095982F0E94EE8F23E333E343E20A
:10F6500050E40E94DB900E94C08F6093B30080E86A
:10F660000E94FA81882331F480E863E00E9453828B
:10F67000882399F1BF1488F58F2D90E00197969516
:10F68000982F88279795879564E670E00E940292EC
:10F69000862F60E240E826E000E00E94C941FA942B
:10F6A000FB1449F4D0927223C0927123D093B722F5
:10F6B000C093B62212C06F2D70E0882777FD809529
:10F6C000982F0E94EE8F23E333E343E250E40E943D
:10F6D000DB900E94C08F6093B30080E10E94FA81AA
:10F6E0008823D1F081E080935F236F2D70E088271D
:10F6F00077FD8095982F0E94EE8F23E333E343E25A
:10F7000050E40E94DB900E94C08F6093B300F0929F
:10F710008A280E94AC3825C080E20E94FA818823A2
:10F7200009F456CF80EF0E94FA8110925F23109166
:10F73000EA2E612F70E0882777FD8095982F0E9430
:10F74000EE8F23E333E343E250E40E94DB900E9418
:10F75000C08F6093B30010938A280E94AC38F09059
:10F76000EA2E8F2DDF91CF911F910F91FF90EF9097
:10F77000DF90CF90BF900895BF92CF92DF92EF922B
:10F78000FF920F931F93CF93DF93F82EB62EE42EA4
:10F79000122F8093EA2E0E944B3F812F90E00E940F
:10F7A000AF54AC0180E062E020E00E945C4380E165
:10F7B00062E04F2D50E023E030E000E00E94094875
:10F7C00081E090E00E94AF54AC0180E067E020E06F
:10F7D0000E945C4378ECC72ED12CC0E8D0E080E1D9
:10F7E00062E04F2D50E023E030E000E00E94094845
:10F7F0004F2D50E0440F551F80E060E226E001E00D
:10F800000E94C94180E40E94FA81882331F480E497
:10F8100062E00E9453828823C9F0FE14B8F4F39486
:10F82000FE1450F0D0927223C0927123D093B7226D
:10F83000C093B622FE2C0AC0F8942B9881E80E944F
:10F840003D3F8F2D0E943D3F2B9A789480E80E9487
:10F85000FA81882331F480E862E00E945382882391
:10F8600009F1BF14F8F48F2D880F825060E240E850
:10F8700026E000E00E94C941FA94FB1449F4D092BA
:10F880007223C0927123D093B722C093B6220AC0CC
:10F89000F8942B9881E80E943D3F8F2D0E943D3FB8
:10F8A0002B9A789480E162E04F2D50E023E030E025
:10F8B00000E00E94094880E10E94FA81882341F01B
:10F8C00081E080935F23F092E3280E94AC381EC051
:10F8D00080E20E94FA81882309F481CF80EF0E94A0
:10F8E000FA81F8942B9881E80E943D3F8091EA2E9E
:10F8F0000E943D3F2B9A789410925F238091EA2ECC
:10F900008093E3280E94AC38F090EA2E8F2DDF918F
:10F91000CF911F910F91FF90EF90DF90CF90BF900C
:10F9200008950F931F93082F122F8093EA2E0E94A1
:10F930004B3F812F90E00E94AF54AC0180E062E029
:10F9400020E00E945C43002319F0043071F403C0EE
:10F9500081E590E002C082E590E00E94AF54AC01E6
:10F960008EE062E020E00E945C4381E090E00E9433
:10F97000AF54AC0180E067E020E00E945C4380E48B
:10F980000E94FA81882369F0002359F482E590E00F
:10F990000E94AF54AC018EE062E020E00E945C4324
:10F9A00004E080E80E94FA81882369F0043059F469
:10F9B00081E590E00E94AF54AC018EE062E020E06F
:10F9C0000E945C4300E080E10E94FA81882399F064
:10F9D00081E080935F23F8942B98002311F486EA4A
:10F9E00001C087EA0E943D3F2B9A789400937E28BD
:10F9F0000E94AC380FC080E20E94FA81882309F48B
:10FA0000BECF80EF0E94FA8110925F230091EA2E10
:10FA100000937E28802F1F910F9108950F931F93BD
:10FA2000082F122F8093EA2E0E944B3F812F90E0E7
:10FA30000E94AF54AC0180E062E020E00E945C4391
:10FA4000002319F0043071F403C081E590E002C096
:10FA500082E590E00E94AF54AC018EE062E020E0CD
:10FA60000E945C4381E090E00E94AF54AC0180E0D2
:10FA700067E020E00E945C4380E40E94FA818823D2
:10FA800069F0002359F482E590E00E94AF54AC0184
:10FA90008EE062E020E00E945C4304E080E80E9487
:10FAA000FA81882369F0043059F481E590E00E94DE
:10FAB000AF54AC018EE062E020E00E945C4300E0C5
:10FAC00080E10E94FA818823C9F081E080935F235E
:10FAD000F8942B98002329F481EA0E943D3F80ECA2
:10FAE00004C080EA0E943D3F88EC0E943D3F2B9A73
:10FAF00078940093E82E0E94AC380DC080E20E94FA
:10FB0000FA81882309F4B8CF80EF0E94FA8110921D
:10FB10005F230091EA2E802F1F910F9108956F921D
:10FB20007F928F929F92AF92BF92CF92DF92EF928D
:10FB3000FF920F931F93CF93DF930E944B3F10923E
:10FB4000702E10925F2310926023CC249924DD2420
:10FB5000D394B8E46B2E712CA2E18A2E01C0D12E71
:10FB60000E944B3F8AE590E00E94AF54AC0180E0D8
:10FB700060E022E00E945C4380E090E00E94AF548D
:10FB8000AC0180E067E020E00E945C43CC2039F0CB
:10FB900081E061E04BE856E420E00E942343AC2C76
:10FBA000BB24A69C8001A79C100DB69C100D1124AF
:10FBB000C0E0D0E07E01EA0CFB1C87E0E816F1040F
:10FBC00084F44091B728CE018F5F682F489DA00133
:10FBD0001124400F511F4D54504C83E020E00E94EF
:10FBE0002343C53059F496E0E916F1043CF481E072
:10FBF00066E049E856E420E00E9423432196085B32
:10FC00001F4FC630D105B1F6992039F4CC2069F4E4
:10FC100081E065E04D2D20E00CC0CC2031F082E089
:10FC200066E04D2D21E000E005C082E065E04D2D4D
:10FC300021E001E00E948A51182F8E3F31F4C394D5
:10FC400099249394F5E0DF2EA1CF8D3F29F4CA9437
:10FC50009924E2E0DE2E9ACF8F3F41F480915F231A
:10FC6000813009F080C00E94AC387DC0C82FD0E040
:10FC7000CC0DD11DC130D10551F480918B2860E0AD
:10FC800042E02BE50E94777380938B2826C0C23018
:10FC9000D10551F48091B72860E043E02CE50E9443
:10FCA0006B728093B72819C0C330D10551F480918D
:10FCB000E42860E04EEF2DE50E9453748093E42821
:10FCC0000CC0C430D10549F480918A2860E044E634
:10FCD0002EE50E949C7A80938A2890915F23913030
:10FCE00031F480916023882311F490936023C53010
:10FCF000D10549F48091E32860E04FE32FE50E94AD
:10FD0000BC7B8093E32890915F23913031F4809104
:10FD10006023882311F490936023C630D10551F4F9
:10FD200080917E2860E044E020E60E94917C8093F0
:10FD30007E280CC0279709F012CF8091E82E60E052
:10FD400044E021E60E940E7D8093E82E90915F238F
:10FD5000913009F004CF80916023882309F0FFCE11
:10FD600090936023FCCEDF91CF911F910F91FF9074
:10FD7000EF90DF90CF90BF90AF909F908F907F904B
:10FD80006F9008950F931F93182F8093EA2E0E946F
:10FD90004B3F81E390E00E94AF54AC0180E061E012
:10FDA00020E00E945C4382E390E00E94AF54AC01EB
:10FDB00080E062E020E00E945C438091B3288823C9
:10FDC00009F056C081E390E00E94AF54AC0180E09E
:10FDD00061E020E00E945C4383E390E00E94AF5426
:10FDE000AC0180E062E020E00E945C4384E390E0AC
:10FDF0000E94AF54AC0180E061E020E00E945C43CF
:10FE000085E390E00E94AF54AC0180E062E020E026
:10FE10000E945C4386E390E00E94AF54AC0180E016
:10FE200061E020E00E945C4387E390E00E94AF54D1
:10FE3000AC0180E062E020E00E945C4388E390E057
:10FE40000E94AF54AC0180E061E020E00E945C437E
:10FE500089E190E00E94AF54AC018CE067E020E0C3
:10FE60000E945C4380E20E94FA818823D9F37BC020
:10FE7000112319F0113099F408C08EE062E04FEAC6
:10FE800056E420E00E9423430AC08FE490E00E94E1
:10FE9000AF54AC018EE062E020E00E945C4381E060
:10FEA00090E00E94AF54AC0180E067E020E00E9447
:10FEB0005C430091B328013009F04FC080E40E94F8
:10FEC000FA81882391F0112381F400935F238FE45A
:10FED00090E00E94AF54AC018EE062E020E00E940E
:10FEE0005C4386E00E94C22F11E080E80E94FA8104
:10FEF000882379F0113069F410935F238EE062E07B
:10FF000049EA56E420E00E94234385E00E94C22F84
:10FF100010E080E10E94FA818823F9F089E390E003
:10FF20000E94AF54AC0180E064E020E00E945C439A
:10FF30008AE390E00E94AF54AC0180E065E020E0ED
:10FF40000E945C4380E067E042E10E94764380E1EA
:10FF50000E94FA818823D9F30DC080E20E94FA81C1
:10FF6000882309F4A6CF80EF0E94FA8110925F23C4
:10FF70001091EA2E812F1F910F910895DF92EF9239
:10FF8000FF920F931F93F82ED62EE42E122F8093FC
:10FF9000EA2E0E944B3F812F90E00E94AF54AC01AB
:10FFA00080E062E020E00E945C4380E162E04F2D4F
:10FFB00050E023E030E000E00E94FA4681E090E06B
:10FFC0000E94AF54AC0180E067E020E00E945C43F7
:10FFD00011E080E40E94FA81882331F480E463E038
:10FFE0000E945382882371F0FE1460F410935F2303
:10FFF000F39480E162E04F2D50E023E030E000E038
:020000021000EC
:100000000E94FA4680E80E94FA81882331F480E851
:1000100063E00E945382882371F0DF1460F4109330
:100020005F23FA9480E162E04F2D50E023E030E05E
:1000300000E00E94FA4680E10E94FA81882361F480
:1000400080E20E94FA81882321F280EF0E94FA81E7
:1000500010925F23F090EA2E8F2D1F910F91FF9049
:10006000EF90DF9008954F925F926F927F928F9200
:100070009F92AF92BF92CF92DF92EF92FF920F9337
:100080001F93CF93DF930E944B3F1092702E1092DC
:100090005F23AA247724BB24B39498E4492E512CDF
:1000A00082E1682E01C0B02E0E944B3F80E060E0EC
:1000B00041E956E422E00E94234380E090E00E9460
:1000C000AF54AC0180E067E020E00E945C43AA20CE
:1000D00039F081E061E04FE856E420E00E942343DC
:1000E0000A2D10E0049D7001059DF00C149DF00C8C
:1000F0001124C0E0D0E048016E01C00ED11E89E09D
:10010000C816D10484F44091B728CE018F5F682FC0
:10011000469DA00111244E0D5F1D455D524C83E0AC
:1001200020E00E942343C53059F498E0C916D10459
:100130003CF481E066E04DE856E420E00E94234371
:10014000219688E490E0E80EF91EC630D105A1F6AC
:10015000772039F4AA2079F481E065E04B2D20E086
:100160000EC093E08916910434F082E066E04B2DD6
:1001700021E000E005C082E065E04B2D21E001E0D8
:100180000E948A51082F8E3F31F4A39477247394F0
:1001900005E0B02E9CCF8D3F29F4AA94772412E07D
:1001A000B12E95CF8F3F41F480915F23813009F0CC
:1001B00090C00E94AC388DC0C82FD0E0CA0DD11DB0
:1001C000C130D10569F4809123240E94C27E8093BE
:1001D000232480915F23813081F4809361235AC06E
:1001E000C230D10551F48091352461E247EF26E712
:1001F0000E94BE7F809335244DC0C330D10519F4D1
:100200000E948F7D4DC0C430D105E1F48091B328A8
:100210008823A9F48091B32860E041E028E60E9499
:100220000C738093B32880915F23813099F580917E
:10023000B328813009F047C00E94572844C00E946B
:10024000527928C0C530D10529F58091B02888237E
:10025000F1F48091B02860E041E02DE60E940C733B
:100260008093B02880915F238130D1F41091B02821
:10027000113009F018CF0E94A72E892B19F0109386
:10028000B52802C01092B5280E94AC380CCF0E944D
:10029000CD7706C0C630D10519F40E947E7503CF14
:1002A000C730D10519F40E942D51FDCEC830D105BB
:1002B00051F48091BD2860E041E022E60E94537431
:1002C0008093BD28F0CE299709F0EDCE0E94687A80
:1002D000EACEDF91CF911F910F91FF90EF90DF90C9
:1002E000CF90BF90AF909F908F907F906F905F90D6
:1002F0004F900895E0E8F0E01082A1E8B0E01C9291
:1003000010926F008081826880838C918B618C93C6
:100310008AE698E1909387008093860086ED91E0CD
:1003200090938900809388000895579AE0EBF0E05D
:10033000808183688083E1EBF0E08081816080834D
:10034000E0E7F0E08081866080838FEF8093B300E8
:1003500008951F920F920FB60F9211245F9A0F907B
:100360000FBE0F901F9018951F920F920FB60F920D
:1003700011245F980F900FBE0F901F901895109248
:10038000EE2E1092ED2E82E084BD85E085BD83ECDB
:1003900087BDEEE6F0E08081826080830895209141
:1003A0007323309174232F5F3F4F280F391FC901EA
:1003B00008952091732330917423821B930B8070D6
:1003C0009078892F86950895209173233091742316
:1003D0002F5F3F4F280F391F809173239091742313
:1003E000A901481B590BCA0180709078892F869506
:1003F00099F308952FB7F894909163238923982750
:10040000909363232FBF08954FB7F8943FB7F894A4
:10041000209163239091622390958923822328273A
:10042000209363233FBF4FBF08952FB7F894909157
:10043000642389239827909364232FBF2FB7F894C0
:100440009091652389239827909365232FBF2FB719
:10045000F8949091632389239827909363232FBF67
:1004600008952FB7F8949091652389239827909346
:1004700065232FBF0895282F9FB7F8948091662396
:1004800028238227809366239FBF3FB7F8949091DB
:1004900065238091632380958227892398279093F1
:1004A00065233FBF08952FB7F89490916723892360
:1004B000982790936723609368232FBF08958091B6
:1004C0006F2390917023019799F488EE93E09093B5
:1004D00072238093712380E290E09093B7228093FF
:1004E000B62280E060E040EE56E422E00E94234322
:1004F0002091B2223091B32284E690E0A901489F76
:100500009001499F300D589F300D112480916F2329
:10051000909170238217930721F410927023109208
:100520006F2380916F2390917023009729F001969B
:100530009093702380936F23349B04C010926E239A
:1005400010926D23349917C080916D2390916E2382
:10055000019690936E2380936D230A9761F48091A6
:100560006F2390917023892B31F481E090E0909378
:10057000702380936F232091B4223091B52284E6BA
:1005800090E0A901489F9001499F300D589F300D80
:10059000112480916D2390916E238217930709F4A3
:1005A000299808951F920F920FB60F920BB60F92D3
:1005B00011242F933F934F935F936F937F938F9368
:1005C0009F93AF93BF93EF93FF933091622320B13A
:1005D0002095232780917B238223809580937B2302
:1005E00090917A239223982790937A232823292382
:1005F000922F932790936223922380916323892BD8
:10060000809363238091B428813001F580916B231E
:1006100090916C23019690936C2380936B2380912F
:100620006B2390916C23805E9E4281F488EC90E075
:10063000909372238093712380E890E09093B72287
:100640008093B62210926C2310926B2380917523B5
:100650008150809375238F5F89F489E0809375239F
:1006600080917323909174230196909374238093C7
:1006700073238091B8228F5F8093B822222389F060
:100680008091EC2E882311F40E94A32481E08093B2
:10069000EC2E10926A231092692310926C23109210
:1006A0006B238091E4288823D9F08091EC2E81304F
:1006B000B9F48091692390916A23019690936A23FB
:1006C000809369232091E42864E670E00E94EE9113
:1006D00030E06217730721F40E94AE241092EC2ED2
:1006E0000E945F8280917123909172230097D9F0CC
:1006F0008B30910530F00A97909372238093712389
:1007000004C010927223109271238091B6229091AE
:10071000B722209171233091722382239323892B56
:1007200009F090C006C08FEF9FEF9093B72280939F
:10073000B622479A40916223242F30E0207F307008
:100740002115310519F486E480937923809179236A
:10075000815080937923882339F4942F907F80915E
:100760006423892B809364232115310519F481E0DA
:1007700080937823809178238150809378238823F5
:1007800051F48FE080937823942F907F809165239C
:10079000892B809365232115310519F486E4809314
:1007A000772380917723815080937723882351F496
:1007B0008FE080937723942F907F80916623892BFD
:1007C00080936623232B19F486E48093762380910B
:1007D00076238150809376238823A9F4809168231F
:1007E000813011F484E107C0823011F488E003C045
:1007F000833049F481E080937623407F80916723A2
:10080000842B809367238091ED2E9091EE2E892B7F
:1008100049F08091ED2E9091EE2E01979093EE2E5F
:100820008093ED2E8091EF2E9091F02E892B61F028
:100830008091EF2E9091F02E01979093F02E80935F
:10084000EF2E02C0479876CFFF91EF91BF91AF9105
:100850009F918F917F916F915F914F913F912F91D8
:100860000F900BBE0F900FBE0F901F9018950F9317
:100870001F930E944B3F8CE067E04BEA58E420E076
:100880000E942343809141239091422380509041C4
:1008900084F00E94CD4B60913B2370913C2380916A
:1008A0003D2390913E230E94C08F70934423609318
:1008B00043230E94A04C409143235091442385E060
:1008C00065E020E030E000E00E9412468AE065E04A
:1008D00046EA58E420E00E94234340917C2850914E
:1008E0007D2880E066E025E030E00E94094880E451
:1008F0000E94FA81182F80E463E00E945382182B33
:1009000049F080917C2890917D280A9690937D28CB
:1009100080937C2880E80E94FA81182F80E863E0A9
:100920000E945382182B49F080917C2890917D2859
:100930000A9790937D2880937C2880E20E94FA8118
:10094000882309F49FCF80EF0E94FA811F910F91B5
:1009500008951F9311E00E944B3F80E390E00E94B6
:10096000AF54AC0180E068E022E00E945C4383E089
:1009700063E048EC58E420E00E94234383E064E015
:1009800048EB58E420E00E94234380E090E00E947E
:10099000AF54AC0180E067E020E00E945C4311307E
:1009A00061F481E063E046EB58E420E00E942343D9
:1009B00081E064E044EB58E40BC081E063E042EB8B
:1009C00058E420E00E94234381E064E040EB58E4D7
:1009D00020E00E94234380E80E94FA81811111E007
:1009E00080E40E94FA81811112E080E10E94048279
:1009F0008823F9F080912324882359F4113019F4C5
:100A00000E944C31A8CF123009F0A5CF0E94593076
:100A1000A2CF80912324813009F09DCF113019F4A9
:100A20000E94A13198CF123009F095CF0E94AC30CE
:100A300092CF80E20E94FA81882309F4B0CF80EF40
:100A40000E94FA811F9108956F927F928F929F92D8
:100A5000AF92BF92CF92DF92EF92FF920F931F93CC
:100A6000CF93DF93AA249924BB24B39438E4632E54
:100A7000712C22E1822E01C0B12E0E944B3F80E0FA
:100A800060E04CED58E422E00E94234380E090E0D7
:100A90000E94AF54AC0180E067E020E00E945C431C
:100AA000AA2039F081E061E04AED58E420E00E949C
:100AB0002343CA2CDD24C69C8001C79C100DD69C04
:100AC000100D1124C0E0D0E07E01EC0CFD1C86E08E
:100AD000E816F10484F44091B728CE018F5F682FA7
:100AE000489DA0011124400F511F4A50594B83E0EB
:100AF00020E00E942343C53059F495E0E916F10443
:100B00003CF481E066E048ED58E420E00E94234395
:100B10002196085B1F4FC630D105B1F6992069F4C4
:100B2000AA2029F481E066E04B2D20E00AC082E093
:100B300065E04B2D21E001E005C082E066E04B2D31
:100B400021E000E00E948A51182F8E3F31F4A394D7
:100B50009924939495E0B92EA3CF8D3F29F4AA94BC
:100B6000992482E0B82E9CCF8F3FE1F1C82FD0E0CE
:100B7000CA0DD11DC130D10521F482E00E94185662
:100B800005C0C230D10511F40E94D66F8091232494
:100B9000882361F4C330D10519F40E944C311CC084
:100BA000C430D10599F40E94593016C08091232495
:100BB000813061F4C330D10519F40E94A1310CC019
:100BC000C430D10519F40E94AC3006C0C530D1053F
:100BD00019F40E94338050CF269709F04DCF0E9420
:100BE00068504ACFDF91CF911F910F91FF90EF9006
:100BF000DF90CF90BF90AF909F908F907F906F903D
:100C00000895DC014AEA20E030E007C0FD01E20F70
:100C1000F31F8081480F2F5F3F4F26173707B0F330
:100C2000842F08952FB7F8943998389A9091B90085
:100C30009C7F9093B9009AE29093B80010927C2325
:100C400010927E2310927F23882379F0EEEFFEE24C
:100C500010821182128213821482158216821782E8
:100C600038968FE2EE35F80799F778942FBF0895FC
:100C7000EF92FF920F931F9310927C230CEB10E0E6
:100C800084E9F801808380E880831092BD0010928F
:100C9000BA008BEBE82EF12CF70110821092B9000C
:100CA0001092B8001092802380E00E941286F70113
:100CB000108285E8F801808380918323826080938D
:100CC00083231F910F91FF90EF9008951F920F9231
:100CD0000FB60F920BB60F9211242F933F934F93A1
:100CE0008F939F93AF93BF93EF93FF9390917C2348
:100CF0009F5F90937C239150943009F4F4C0953019
:100D000058F4913099F19130A0F0923009F46CC010
:100D1000933009F06EC2CEC0963009F4CEC1963041
:100D200008F41CC1953109F438C2963109F061C24A
:100D300036C281E08093802380917E238C3070F0D6
:100D4000109285231092842310927E2385E0809355
:100D50007C2380917F23880F8D5A04C080917E234D
:100D6000880F8E5A8093BB0085E838C2E0917E23BD
:100D7000F0E043E0EE0FFF1F4A95E1F7E250F14D3E
:100D800081818093BB0085E88093BC00E0917E2345
:100D9000F0E033E0EE0FFF1F3A95E1F7E250F14D3E
:100DA000808180FF85C0E0917E23F0E023E0EE0F9C
:100DB000FF1F2A95E1F7E050F14D8081882329F04B
:100DC0008091BB22873008F42AC2809184239091BD
:100DD0008523892B09F023C2809186239091872354
:100DE000892B09F01CC264C040917E232091862388
:100DF0003091872381E090E002C0880F991F4A95C7
:100E0000E2F782239323892B69F0E0917E23F0E0BF
:100E100093E0EE0FFF1F9A95E1F7EE5FF04D80E152
:100E200080830BC0E0917E23F0E083E0EE0FFF1F94
:100E30008A95E1F7EE5FF04D1082E0917E23A0915C
:100E40007E23F0E0B3E0EE0FFF1FBA95E1F7EE5F0F
:100E5000F04D9081990F990F990FB0E043E0AA0FE0
:100E6000BB1F4A95E1F7A050B14D8C918770982B2C
:100E70009093BB0085E88093BC0040917E23209135
:100E800084233091852381E090E002C0880F991F70
:100E90004A95E2F782239323892B51F086EF9EE255
:100EA00090938A238093892388E080938823B7C115
:100EB00084E070C1E0918923F0918A23819180932D
:100EC000BB0085E88093BC00F0938A23E0938923DC
:100ED00080918823815080938823882309F49FC1BF
:100EE00090937C239CC18091B900803321F580913F
:100EF0008C23882329F480917E238F5F80938C2319
:100F0000E0917E23F0E033E0EE0FFF1F3A95E1F72A
:100F1000E250F14D83818F778F3769F0E0917E2326
:100F2000F0E023E0EE0FFF1F2A95E1F7E250F14DCC
:100F300083818F5F838310927C2384E98093BC003C
:100F40008AE090E09093BA228093B92280917E2328
:100F50008F5F80937E2310927C233AC18091B900E9
:100F60008034B9F1E0917F23F0E093E0EE0FFF1FB2
:100F70009A95E1F7E250F14D83818F7783838091D9
:100F80007F238F5F80937F2380917F238C30A0F01D
:100F900010927F23109287231092862380918B23B7
:100FA0008F5F80938B238C3038F010928B2380914D
:100FB00083238D7F8093832380918323816080931B
:100FC000832310927C2384E98093BC0010928023B9
:100FD0006DC0E0917F23F0E083E0EE0FFF1F8A9564
:100FE000E1F7E250F14D838180688383E0917F23B4
:100FF000F0E0B3E0EE0FFF1FBA95E1F7E250F14DDC
:10100000808180FF2DC0E0917F23F0E0A3E0EE0F10
:10101000FF1FAA95E1F7EE5FF04DE081EE2351F05E
:10102000E031D9F586EF9EE290938A23809389235D
:1010300088E031C080917F2390E0E3E0880F991F22
:10104000EA95E1F78D5F904D90938A2380938923F1
:1010500090917F2380918B239817E1F483E01BC04C
:1010600080917F2390E043E0880F991F4A95E1F734
:101070008D5F904D90938A23809389238091832361
:1010800081FD06C090917F2380918B23981711F4E6
:1010900082E001C081E080938823809188238130A1
:1010A00011F485E801C085EC8093BC0080918C230D
:1010B0008093812310928C23B2C08091BB00E09179
:1010C0008923F0918A238193F0938A23E0938923E3
:1010D00080918823815080938823823010F085ECA2
:1010E00003C0813029F485E88093BC0086E052C0BB
:1010F0008091832381FF26C0E0917F23F0E033E0DD
:10110000EE0FFF1F3A95E1F7E250F14D86818A3FDD
:1011100071F4E0917F23F0E023E0EE0FFF1F2A95AA
:10112000E1F7E250F14D8081816080830BC0E09156
:101130007F23F0E093E0EE0FFF1F9A95E1F7E25076
:10114000F14D108280917F238F5F80937F23809168
:101150007F238C30A0F010927F231092872310926F
:10116000862380918B238F5F80938B238C3038F084
:1011700010928B23809183238D7F80938323109201
:101180007C2384E98093BC008091832381608093D9
:10119000832343C080937C2342C080E8E3CD109238
:1011A0007C2384E98093BC00109280238AE090E045
:1011B0009093BA228093B92280917D23823088F463
:1011C00080917D238F5F80937D2382E180937C23B8
:1011D000809183238E7F8093832385EA8093BC0054
:1011E0001EC010927D23809183238160809383238E
:1011F00016C010927C2384E98093BC0080918323E5
:101200008160809383238AE090E09093BA22809358
:10121000B92210927E2310927F2310928023FF9197
:10122000EF91BF91AF919F918F914F913F912F91EE
:101230000F900BBE0F900FBE0F901F90189581E07E
:1012400008951F93CF93DF93182F809182238823D3
:1012500011F081E093C01D3008F08FC0112389F098
:10126000E12FF0E053E0EE0FFF1F5A95E1F7EA504F
:10127000F14D838187FF81C0808180FD02C083E0C2
:101280007DC08091F62E823011F084E077C0E6EFC9
:10129000FEE29AEA8191980F8EE2ED3FF807D1F7CE
:1012A0008081981711F085E069C080ED97E00E9479
:1012B000CF81EC018091832380FD05C0CE010E9487
:1012C000D9818823B9F3112369F48FEF90E09093CB
:1012D000852380938423EFEFFEE240E050E061E05D
:1012E00070E00CC0212F30E02150304081E090E0D0
:1012F00002C0880F991F2A95E2F7E9CF2091842335
:1013000030918523CB01042E02C0880F991F0A94C7
:10131000E2F782239323892B11F0108211824F5F11
:101320005F4F38964C30510549F710927E2315EAED
:1013300010927C23809183238E7F8093832310934C
:10134000BC008091832380FD05C0CE010E94D9811D
:101350008823B9F38091842390918523892B29F0E8
:10136000CE010E94D981882319F380918423909122
:101370008523892B11F480E001C082E0DF91CF91B9
:101380001F9108951F920F920FB60F920BB60F92F6
:1013900011242F938F939F93EF93FF939091C80005
:1013A0002091CE00E091CF23EF5FEF718091D023A9
:1013B000E81711F482E008C0892F8871E093CF23E9
:1013C000F0E0E355FC4D20838093D123FF91EF9112
:1013D0009F918F912F910F900BBE0F900FBE0F908A
:1013E0001F9018951F920F920FB60F920BB60F9287
:1013F00011248F939F93EF93FF939091CD2380912E
:10140000CE23981769F0E091CE23EF5FEF71E09360
:10141000CE23F0E0E357FC4D80818093CE0005C0E1
:101420008091C9008F7D8093C900FF91EF919F91BA
:101430008F910F900BBE0F900FBE0F901F901895BD
:101440009C011092CD231092CE231092CF231092A4
:10145000D02397FF04C082E08093C8003F77309389
:10146000CD002093CC0088E98093C90086E080936A
:10147000CA0008959091CF238091D023981719F432
:1014800020E031E012C0E091D023EF5FEF71E093F4
:10149000D023F0E0E355FC4D30812091D123922FF1
:1014A00080E0AC01430F511D9A01C9010895482FF6
:1014B0009091CD239F5F9F718091CE239817E1F388
:1014C000E92FF0E0E357FC4D40839093CD238091CA
:1014D000C90080628093C9008091D123382F20E019
:1014E000240F311DC9010895CF93DF93EC0103C090
:1014F00021960E94578A88818823D1F7DF91CF9166
:101500000895CF93DF93EC0102C00E94578AFE0139
:10151000219684918823C9F7DF91CF910895809116
:10152000CF232091D02390E04F96821B91096FE149
:1015300070E00E94029208958091D0238093CF237F
:1015400008951F920F920FB60F920BB60F921124AF
:101550002F933F934F935F936F937F938F939F93BB
:10156000AF93BF93CF93DF93EF93FF938091472384
:10157000853011F0843089F54091C60020911F24F8
:10158000309120248091212490912224281B390B12
:1015900037FF02C0205C3F4F2F3331050CF0AAC04B
:1015A000E0911F24F0912024408380911F2490918A
:1015B000202401969093202480931F2480911F243F
:1015C000909120248F51944209F094C08FED93E2C2
:1015D0009093202480931F248DC07091C600809129
:1015E000D223882309F086C06091DC23662371F43E
:1015F000733279F470935E2F81E08093DC2383E271
:1016000090E09093DE238093DD2374C0643B08F068
:1016100064C0A62FB0E02091DD233091DE237D3021
:1016200069F0A25AB04D7C936F5F6093DC23270F63
:10163000311D3093DE232093DD235CC0FD01E45A8D
:10164000F04D9081ED01C35AD04D8881A901491B0D
:101650005109481B51095F705093DE234093DD23ED
:101660002081CA0136E0969587953A95E1F7835C2B
:10167000821729F59881842F8F73835C8917F9F479
:10168000A25AB04D7C936F5F6093D3239091452312
:101690008091602F9817F1F481E08093D22380919C
:1016A000602F8235B9F42CE088E190E00FB6F89411
:1016B000A895809360000FBE209360000BC08091BE
:1016C000D7239091D82301969093D8238093D72342
:1016D0001092D2231092DC230DC08091D9239091D7
:1016E000DA2301969093DA238093D9231092DC2396
:1016F0001092D223FF91EF91DF91CF91BF91AF91E3
:101700009F918F917F916F915F914F913F912F9119
:101710000F900BBE0F900FBE0F901F901895209149
:101720001F24309120248091212490912224281775
:10173000390711F4E0E01BC0E0912124F09122244C
:10174000E08180912124909122240196909322247B
:101750008093212480912124909122248F519442BE
:1017600031F48FED93E290932224809321248E2FE5
:101770000895DC0120911F243091202480912124A0
:10178000909122242817390711F480E00895E09100
:101790002124F091222480818C93809121249091A6
:1017A0002224019690932224809321248091212445
:1017B000909122248F51944211F081E008958FED91
:1017C00093E2909322248093212481E008959093C2
:1017D000C5008093C4008091C0008D7F8093C000BD
:1017E00086E08093C2008091C1008B7F8093C1000E
:1017F00002C08091C6008091C00087FDFACF809121
:10180000C10088618093C1008091C100806880938D
:10181000C1008FED93E29093222480932124809144
:101820002124909122249093202480931F240895B2
:10183000E1ECF0E08081877F808323982B980895E6
:10184000239A2B98E1ECF0E08081886080830895F2
:10185000982F8091C00085FFFCCF9093C60008951B
:10186000FC0107C08091C00085FFFCCF9093C600AB
:10187000319690819923B1F70895FC0107C08091BA
:10188000C00085FFFCCF9093C600319694919923B8
:10189000B1F708955091D323565033E043E048C048
:1018A000E32FF0E0E25AF04D80813F5FE32FF0E05C
:1018B000E25AF04D20812D533F5FE32FF0E0E25AD2
:1018C000F04D70813F5FE32FF0E03350E25AF04D6E
:1018D0006081E42FF0E0922F92959F708D53880FD6
:1018E000880F892BE25AF04D8083E42FEF5F51304F
:1018F00081F0972F9D53F0E02295207F892F8695C8
:101900008695282BE25AF04D2083E42FEE5F52306B
:1019100011F44E2F10C03C5F5350F0E09295990F98
:10192000990F907C6D53962BE25AF04D90834D5F4A
:10193000552309F0B5CF81E69FE29093D52380939C
:10194000D42343504093D623089580914623813079
:1019500071F58091C00085FFFCCF8BE18093C600BC
:101960008091C00085FFFCCF8BE18093C600809101
:10197000C00085FFFCCF85E58093C6008091C00044
:1019800085FFFCCF8AEA8093C6008091C00085FF66
:10199000FCCF1092C60081E08093472384EF91E052
:1019A00024EF31E0F9013197F1F70197D9F7089564
:1019B00085E08093472384EF91E024EF31E0F90143
:1019C0003197F1F70197D9F70895DF92EF92FF92DF
:1019D0000F931F93DF93CF93CDB7DEB78B857C85B5
:1019E00093E2909331308F59809332308A8580937F
:1019F0003330DE011D96772329F4EE24FF2440E0E6
:101A000050E007C0ED84FE84DE0151964F85588971
:101A1000715003E010E030E07EC0F701E30FF11DEC
:101A200090813F5F4150504091F4772309F4C4C046
:101A3000FD013296ED90FC90DF0112960190F0814D
:101A4000E02D7150309709F4B6C0AF0130E0F701D6
:101A5000E30FF11DD0803F5F4150504099F4772350
:101A600011F460E023C0FD013296ED90FC90DF019F
:101A700012964081518171504115510511F460E079
:101A800014C030E0F701E30FF11D60813F5F41506A
:101A9000504061F4772351F0FD013296ED90FC90B7
:101AA000DF01129640815181715030E0892F869577
:101AB0008695835CF801EF5CFF4C80832D2D229589
:101AC0002F70892F90E083709070F4E0880F991F39
:101AD000FA95E1F7282B235CF801EE5CFF4C20839C
:101AE0008D2D90E08F709070880F991F880F991F2F
:101AF000262F2295269526952370282B235CF80106
:101B0000ED5CFF4C20836F73635CF801EC5CFF4C71
:101B100060830C5F1F4F4115510509F07ECF90E0A7
:101B200020E030E006C0EF5CFF4C8081280F311DC3
:101B30009F5FE92FF0E0E017F107A8F33F70C901BC
:101B400046E0969587954A95E1F7835CF801EF5C4E
:101B5000FF4C8083C80101962F73235CFC01EF5C6E
:101B6000FF4C20830196FC01EF5CFF4C2DE02083AD
:101B7000AC014F5F5F4F1092BC2220E00CC08091FF
:101B8000C00085FFFCCFE22FF0E0EF5CFF4C8081CE
:101B90008093C6002F5F822F90E08417950778F31B
:101BA00081E08093BC22CF91DF911F910F91FF9034
:101BB000EF90DF90089530E060E0DD2477CFDF9391
:101BC000CF930F92CDB7DEB7209147232130A9F5EF
:101BD00092E099834DB75EB7475050400FB6F894E6
:101BE0005EBF0FBE4DBFEDB7FEB7319685E7ADB70F
:101BF000BEB711968C9391832283CE010196948374
:101C0000838381E090E0968385830E94E58C84E065
:101C10008093472324EF31E04DB75EB7495F5F4FB4
:101C20000FB6F8945EBF0FBE4DBF44EF51E0CA013E
:101C30000197F1F721503040D1F70F90CF91DF910C
:101C40000895DF93CF930F92CDB7DEB790914723DE
:101C50009130A1F599832DB73EB7275030400FB68C
:101C6000F8943EBF0FBE2DBFEDB7FEB7319685E7A6
:101C7000ADB7BEB711968C9382E081839283CE017B
:101C800001969483838381E090E0968385830E940C
:101C9000E58C83E08093472324EF31E08DB79EB736
:101CA00007960FB6F8949EBF0FBE8DBF44EF51E06C
:101CB000CA010197F1F721503040D1F70F90CF9131
:101CC000DF9108951F93DF93CF930F92CDB7DEB7C7
:101CD00090914723913099F519822DB73EB727503F
:101CE00030400FB6F8943EBF0FBE2DBFEDB7FEB724
:101CF000319685E7ADB7BEB711968C9312E011838C
:101D00009283CE0101969483838381E090E0968351
:101D100085830E94E58C1093472324EF31E08DB733
:101D20009EB707960FB6F8949EBF0FBE8DBF44EFC7
:101D300051E0CA010197F1F721503040D1F70F90DF
:101D4000CF91DF911F910895FF920F931F93DF931F
:101D5000CF930F92CDB7DEB7082FF62E142F0E9427
:101D6000208C812F6AE00E94E29189838DB79EB713
:101D700007970FB6F8949EBF0FBE8DBFEDB7FEB7A5
:101D80003196ADB7BEB711960C93F18281E0828394
:101D9000CE0101969483838381E090E096838583CE
:101DA0000E94E58C8DB79EB707960FB6F8949EBF3C
:101DB0000FBE8DBF8091BC228823E1F30E94188C56
:101DC0000F90CF91DF911F910F91FF900895505880
:101DD000BB27AA270ED0A0C169D130F06ED120F068
:101DE00031F49F3F11F41EF45EC10EF4E095E7FB61
:101DF00054C1E92FB3D180F3BA1762077307840780
:101E0000950718F071F49EF5CBC10EF4E0950B2EFA
:101E1000BA2FA02D0B01B90190010C01CA01A0013C
:101E20001124FF27591B99F0593F50F4503E68F197
:101E30001A16F040A22F232F342F4427585FF3CFD8
:101E4000469537952795A795F0405395C9F77EF4A9
:101E50001F16BA0B620B730B840BBAF09150A1F0F2
:101E6000FF0FBB1F661F771F881FC2F70EC0BA0F78
:101E7000621F731F841F48F4879577956795B79500
:101E8000F7959E3F08F0B3CF9395880F08F09927F8
:101E9000EE0F979587950895DCD008F481E00895BA
:101EA00014D1E3954AC10CD037C107D140F0FED020
:101EB00030F021F45F3F19F0F0C0511172C1F3C04E
:101EC0004DD198F39923C9F35523B1F3951B550BC5
:101ED000BB27AA2762177307840738F09F5F5F4FFD
:101EE000220F331F441FAA1FA9F333D00E2E3AF03E
:101EF000E0E830D091505040E695001CCAF729D058
:101F0000FE2F27D0660F771F881FBB1F26173707A6
:101F10004807AB07B0E809F0BB0B802DBF01FF27D6
:101F200093585F4F2AF09E3F510568F0B6C039C103
:101F30005F3FECF3983EDCF3869577956795B79510
:101F4000F7959F5FC9F7880F911D9695879597F92B
:101F50000895E1E0660F771F881FBB1F62177307A4
:101F60008407BA0720F0621B730B840BBA0BEE1FB9
:101F700088F7E095089504D06894B11112C10895CE
:101F8000F5D088F09F5790F0B92F9927B751A0F05E
:101F9000D1F0660F771F881F991F1AF0BA95C9F7FD
:101FA00012C0B13081F0FCD0B1E00895F9C0672FC4
:101FB000782F8827B85F39F0B93FCCF386957795AD
:101FC0006795B395D9F73EF4909580957095619596
:101FD0007F4F8F4F9F4F0895E89409C097FB3EF4C1
:101FE00090958095709561957F4F8F4F9F4F992366
:101FF000A9F0F92F96E9BB279395F69587957795E4
:102000006795B795F111F8CFFAF4BB0F11F460FFA3
:102010001BC06F5F7F4F8F4F9F4F16C0882311F0FB
:1020200096E911C0772321F09EE8872F762F05C00F
:10203000662371F096E8862F70E060E02AF09A95AA
:10204000660F771F881FDAF7880F9695879597F99F
:102050000895990F0008550FAA0BE0E8FEEF161639
:102060001706E807F907C0F012161306E407F5078C
:1020700098F0621B730B840B950B39F40A2661F000
:10208000232B242B252B21F408950A2609F4A140A3
:10209000A6958FEF811D811D089597F99F6780E8B0
:1020A00070E060E008959FEF80EC089500240A94AA
:1020B0001616170618060906089500240A94121623
:1020C0001306140605060895EECF50D0E8F3E89401
:1020D000E0E0BB279F57F0F02AED3FE049EC06C057
:1020E000EE0FBB0F661F771F881F28F0B23A6207FA
:1020F0007307840728F0B25A620B730B840BE395C5
:102100009A9572F7803830F49A95BB0F661F771F47
:10211000881FD2F79048F5C0092E0394000C11F4E3
:10212000882352F0BB0F40F4BF2B11F460FF04C0B2
:102130006F5F7F4F8F4F9F4F0895EF93E0FF06C073
:10214000A2EA2AED3FE049EC5FEB53DEE5DF0F90BA
:10215000039401FC9058E0EBF0E0DFC057FD90588D
:10216000440F551F59F05F3F71F04795880F97FB5B
:10217000991F61F09F3F79F0879508951216130615
:102180001406551FF2CF4695F1DF08C01616170644
:102190001806991FF1CF8695710561050894089579
:1021A000E894BB2766277727CB0197F9089551DF7D
:1021B00008F48FEF08950BD0AFCF78DF28F07DDFE4
:1021C00018F0952309F069CF6ECF1124EACFC6DF4E
:1021D000A0F3959FD1F3950F50E0551F629FF0013A
:1021E000729FBB27F00DB11D639FAA27F00DB11D93
:1021F000AA1F649F6627B00DA11D661F829F22271C
:10220000B00DA11D621F739FB00DA11D621F839FA2
:10221000A00D611D221F749F3327A00D611D231F78
:10222000849F600D211D822F762F6A2F11249F57C6
:1022300050408AF0E1F088234AF0EE0FFF1FBB1FE9
:10224000661F771F881F91505040A9F79E3F510588
:1022500070F023CFA6CF5F3FECF3983EDCF386957A
:1022600077956795B795F795E7959F5FC1F7FE2B33
:10227000880F911D9695879597F9089577DFE0F07F
:102280009E37D8F09639B8F49E3848F4672F782FE7
:102290008827985FF9CF86957795679593959539B7
:1022A000D0F3B62FB1706B0F711D811D20F487958F
:1022B00077956795939508C022C073CF9F9305DFEC
:1022C0000F9007FCEE5F39CF882371F4772321F05C
:1022D0009850872B762F07C0662311F499270DC0DD
:1022E0009051862B70E060E02AF09A95660F771F78
:1022F000881FDAF7880F9695879597F908959F3F7D
:1023000031F0915020F4879577956795B795880FB0
:10231000911D9695879597F908959F938F937F9335
:102320006F93FF93EF939B01AC0145DFEF91FF911A
:1023300005D02F913F914F915F913DCFDF93CF9388
:102340001F930F93FF92EF92DF927B018C016894B1
:1023500005C0DA2EEF013BDFFE01E894A59125913F
:10236000359145915591AEF3EF0143DDFE019701A3
:10237000A801DA9479F7DF90EF90FF900F911F9109
:10238000CF91DF910895629FD001739FF001829FEA
:10239000E00DF11D649FE00DF11D929FF00D839FF4
:1023A000F00D749FF00D659FF00D9927729FB00D91
:1023B000E11DF91F639FB00DE11DF91FBD01CF01A4
:1023C00011240895991B79E004C0991F961708F00D
:1023D000961B881F7A95C9F780950895AA1BBB1B89
:1023E00051E107C0AA1FBB1FA617B70710F0A61B15
:1023F000B70B881F991F5A95A9F780959095BC0136
:10240000CD01089597FB092E07260AD077FD04D049
:10241000E5DF06D000201AF4709561957F4F08958E
:10242000F6F7909581959F4F0895A1E21A2EAA1B69
:10243000BB1BFD010DC0AA1FBB1FEE1FFF1FA21774
:10244000B307E407F50720F0A21BB30BE40BF50B71
:10245000661F771F881F991F1A9469F760957095FA
:10246000809590959B01AC01BD01CF01089597FB2C
:10247000092E05260ED057FD04D0D7DF0AD0001C48
:1024800038F450954095309521953F4F4F4F5F4F11
:102490000895F6F790958095709561957F4F8F4FD1
:1024A0009F4F0895FB01DC010D900020E9F7119783
:1024B00005900D920020E1F70895FB01DC010590E5
:1024C0000D920020E1F70895FB01DC0141505040DE
:1024D00030F08D910590801919F40020B9F7881B10
:1024E000990B0895FB0155915523A9F0BF01DC011B
:1024F0004D9145174111E1F759F4CD0105900020A8
:1025000049F04D9140154111C9F3FB014111EFCF45
:1025100081E090E001970895DC0101C06D93415086
:102520005040E0F70895FB019F01E8944230C4F069
:102530004532B4F44A3029F497FB1EF49095819506
:102540009F4F642F77270E94EE91805D8A330CF0B5
:10255000895D8193CB010097A1F716F45DE2519359
:102560001082C9010C941393FB019F01423074F057
:10257000453264F4642F77270E94EE91805D8A33A0
:102580000CF0895D8193CB010097A1F71082C901FE
:102590000C941393DC01CB01FC01F999FECF06C02A
:1025A000F2BDE1BDF89A319600B40D924150504011
:1025B000B8F70895F999FECF92BD81BDF89A992791
:1025C00080B50895A6E1B0E044E050E00C94CC92D0
:1025D000A8E1B0E042E050E00C94CC92DC01CB01E9
:1025E00003C02D910E94F99241505040D0F70895B8
:1025F000262FF999FECF1FBA92BD81BD20BD0FB61F
:10260000F894FA9AF99A0FBE01960895242F0E9421
:10261000F992252F0E94F9920C940E930E94F89241
:10262000272F0C94F992DC01FC01672F719177231D
:10263000E1F7329704C07C916D9370836291AE177D
:0A264000BF07C8F30895F894FFCF18
:10264A000201201A20202020201B20202020456E55
:10265A0064652020204F4B00201A20202020201BB8
:10266A0020202020656E64202020204F4B00201A55
:10267A0020202020201B2020202066696E20202078
:10268A00204F4B00201A20202020201B2020202011
:10269A0045696E646520204F4B00201820202020B9
:1026AA00201920202020456E64652020204F4B00F1
:1026BA00201820202020201920202020656E642048
:1026CA002020204F4B0020182020202020192020D5
:1026DA00202066696E202020204F4B0020182020E1
:1026EA00202020192020202045696E646520204F73
:1026FA004B00201820202020201920202020456E61
:10270A006465200020182020202020192020202065
:10271A00656E642020002018202020202019202007
:10272A00202066696E2020002018202020202019F1
:10273A002020202045696E646500456E646520206E
:10274A00204F4B00656E64202020204F4B006669A5
:10275A006E202020204F4B0045696E646520204F73
:10276A004B00546173746520312053656B756E6438
:10277A0065004B6565702074686520627574746FB6
:10278A006E004D61696E74656E657A206C652062B3
:10279A006F75746F6E00486F7564206465206B6E88
:1027AA006F70202020006C616E6720666573746804
:1027BA00616C74656E2E0070726573736564206651
:1027CA006F722031207365636F6E6400656E666F89
:1027DA006E63E9652070656E642E2031207365632F
:1027EA000031207365636F6E646520696E67656486
:1027FA0072756B742E0056657262696E64756E67C7
:10280A00207A756D204D4B2069737400436F6E6E8C
:10281A00656374696F6E20746F204D4B2069730075
:10282A00436F6E6E6578696F6E20E0204D4B2065B0
:10283A0073740056657262696E64696E67206D65AD
:10284A0074204D4B206973006175662057693233D5
:10285A00322065696E67657374656C6C74007365A4
:10286A007420746F205769323332006D697320E027
:10287A0020576932333200696E67657374656C6418
:10288A00206F7020576932333200617566204B61C0
:10289A0062656C2065696E67657374656C6C74003B
:1028AA0073657420746F206B6162656C206F6E2093
:1028BA00535632006D697320E0206B6162656C20AB
:1028CA007375722053563200766961206B616265B6
:1028DA006C76657262696E64696E6700506F7274B5
:1028EA0061626C6573204B6F7074657220546F6FF0
:1028FA006C00506F727461626C65204B6F70746506
:10290A007220546F6F6C200066FC7220464320567A
:10291A00657220302E38367800666F722046432062
:10292A0056657220302E38367800706F75722046E0
:10293A00432056657220302E38367800566F6F72F3
:10294A002046432056657220302E38367800474E8E
:10295A00552047504C204C6963656E73650041549D
:10296A006D656761203634340041546D65676120B6
:10297A00363434500041546D656761203132383441
:10298A005000486172647761726520312E320048C6
:10299A006172647761726520312E32570048617224
:1029AA00647761726520312E330048617264776101
:1029BA00726520312E3357004861726477617265FF
:1029CA0020332E39002020204C65747A74652050FB
:1029DA006F736974696F6E202020002020206C615B
:1029EA007374202020706F736974696F6E202020C1
:1029FA00002020206465726E69E8726520706F732A
:102A0A006974696F6E20002020204C6161747374B0
:102A1A006520706F736974696520202000204CE47A
:102A2A006E67656E67722020204272656974656EF2
:102A3A00677200206C6F6E67697475646520206C1C
:102A4A00617469747564652000206C656E677465CD
:102A5A0067722E206272656564746567722E006CF7
:102A6A00F6736368656E2020202020202020776579
:102A7A00697465720064656C657465202020202085
:102A8A002020202020657869742000737570707288
:102A9A00696D657220202020202020706C757320BB
:102AAA000077697373656E20202020202020202063
:102ABA007665726465720020202020202067656C8C
:102ACA00F673636874202020202020200020202014
:102ADA0020202064656C65746564202020202020F5
:102AEA0020200020202020207375707072696DE903
:102AFA0020202020202020200020202020202067A5
:102B0A00657769737420202020202020202000531C
:102B1A00756368652046432E2E2E007365617263C5
:102B2A0068696E672046432E2E2E006368657263BD
:102B3A0068616E742046432E2E2E007A6F656B20D4
:102B4A0046432E2E2E00456E64652000656E642075
:102B5A00200066696E20200045696E6465004F6B2F
:102B6A00006F6B0067756564004665686C65720086
:102B7A006572726F7200642765727265757200669B
:102B8A006F757400616B74697600616374697600AD
:102B9A0061637469667300616374696566004643BC
:102BAA00206E6963687420676566756E64656E2158
:102BBA00004643206E6F7420666F756E642100466E
:102BCA0043207061732074726F7576E92100464361
:102BDA00206E696574206765766F6E64656E210084
:102BEA00504B542D546F6F6C20474E552047504C14
:102BFA0000676566756E64656E3A2000666F756E6D
:102C0A00643A200074726F7576E9733A200067653A
:102C1A00766F6E64656E3A2000466C696768742D3B
:102C2A004374726C004E6176692D4374726C00565F
:102C3A00657273696F6E3A20005665727369653AF8
:102C4A0020200020657277617274657400206578AF
:102C5A007065637465640020617474656E6475736D
:102C6A00002076657277616368740020676566750F
:102C7A006E64656E0020666F756E64002074726FF4
:102C8A007576E97300206765766F6E64656E00502D
:102C9A004B542D546F6F6C206E7572206D697400E1
:102CAA00504B542D546F6F6C206F6E6C792077697E
:102CBA00746800504B5420756E697175656D656E48
:102CCA0074206176656300504B542D546F6F6C20ED
:102CDA00616C6C65656E206D657400464320536FA8
:102CEA0066747761726520006B6F6D7061746962DA
:102CFA00656C00636F6D70617469626C6500636F07
:102D0A006D70617469626C657300636F6D70617474
:102D1A006962656C0045696E2020004F6E20202094
:102D2A0000556E2020200041616E202000417573FD
:102D3A002020004F66662020004475202020005580
:102D4A006974202000455343002020504B542061D1
:102D5A007573736368616C74656E3F0020207368D5
:102D6A007574646F776E20504B54203F00202064A6
:102D7A00E9736163746976657220504B54203F0091
:102D8A002020504B5420756974736368616B656CBD
:102D9A00656E203F004E65696E2020204A61006EF4
:102DAA006F20202020796573006E6F6E2020206FBF
:102DBA007569004E6565202020204A6100566572BB
:102DCA0062696E6465205043206D697420504B54CB
:102DDA00202000436F6E6E65637420504320746F29
:102DEA0020504B542D555342006173736F636965CC
:102DFA0072205043206120504B542D5553420056A7
:102E0A00657262696E64205043206D657420504B70
:102E1A0054202020004472FC636B652027537461A0
:102E2A0072742720616D20504B5400507265737381
:102E3A002027537461727427206F6E20504B5420E0
:102E4A000070726573736520276C616E6365722703
:102E5A00206120504B54004472756B2027537461D3
:102E6A00727427206F7020504B542020002020209D
:102E7A002020202020202020456E64652053746184
:102E8A007274002020202020202020202020456E3F
:102E9A006420205374617274002020202020202096
:102EAA0020202066696E20206C616E6365720020A6
:102EBA0020202020202020202045696E6465205390
:102ECA0074617274002050432D517569636B2D56DD
:102EDA00657262696E64756E6720002050432D51D9
:102EEA007569636B2D436F6E6E656374696F6E20CF
:102EFA00002050432D636F6E6E6578696F6E207285
:102F0A006170696465200020536E656C6C652050A1
:102F1A00432D76657262696E64696E6700566572E2
:102F2A0062696E64652064617320504B54206D6938
:102F3A007400436F6E6E65637420504B542077693A
:102F4A007468204D4B00636F6E6E656374657A20FA
:102F5A00504B54206120204D4B0056657262696EB9
:102F6A006420504B5420200064656D204D4B20FC9A
:102F7A006265723A002020206F7665722020202038
:102F8A003A002020612070726F706F73203A00201F
:102F9A0020206D657420202020203A0064656D2071
:102FAA004D4B20FC6265723A20204B6162656C2CA5
:102FBA0020006F7665723A204B6162656C00612071
:102FCA0070726F706F733A204361626C65004D4B8B
:102FDA00207669613A206B6162656C20202020208E
:102FEA0020202000657320697374206B65696E2048
:102FFA0057692E323332007468657265206973200E
:10300A006E6F2057692E323332006C206E27796139
:10301A0020706173206465200065722069732067DF
:10302A0065656E2077692E32333220004D6F6475E4
:10303A006C2065696E6765626175742E00627569D8
:10304A006C7420696E2E006D6F64756C6520696EF4
:10305A0074E96772E9205769323332006D6F64751B
:10306A006C6520696E6765626F7577642E005765B7
:10307A006E6E20646F63682C2064616E6E206269D4
:10308A00747465006966207965732C207468656EAE
:10309A0020666972737400536920766F7573206CA9
:1030AA006520666169746573007A6F206A612C20F5
:1030BA0064616E2061756220656572737400646173
:1030CA0073204D6F64756C207A756572737420690C
:1030DA006D2020006163746976617465206D6F6488
:1030EA00756C20696E0061637469766572206C651F
:1030FA00206D6F64756C65006465206D6F64756C16
:10310A006520616B7469766572656E0053657475C6
:10311A00706D656EFC20616B746976696572656EA7
:10312A002E0053657475706D656E750064616E73FB
:10313A00206D656E7520646520636F6E6669672E03
:10314A0000696E206865742053657475706D656ECC
:10315A00752E00536965206DFC7373656E2064617A
:10316A007320504B5400596F75206861766520743E
:10317A006F00566F757320646576657A0055206D09
:10318A006F657420646520504B54006A65747A74C4
:10319A00206E6575207374617274656E21007265A4
:1031AA00737461727420504B5400726564E96D61E6
:1031BA007272657220504B54006E75206F706E6982
:1031CA00657577207374617274656E21004573208A
:1031DA00697374206B65696E2042544D2D32323208
:1031EA00005468657265206973206E6F2042544DE1
:1031FA002D323232004572206973206765656E2070
:10320A0042544D2D323232004D6F64756C2065691F
:10321A006E676562617574004D6F64756C206275C6
:10322A00696C7420696E006D6F64756C6520696ED7
:10323A0074E96772E92042544D32323200204D4B14
:10324A002D5553422046756E6B74696F6E2020208F
:10325A00202000204D4B2D5553422046756E637435
:10326A00696F6E202020202000204D4B2D5553429F
:10327A0020666F6E6374696F6E2020202020002004
:10328A004D4B2D5553422046756E63746965202057
:10329A002020202000204254202D2D3E204B616208
:1032AA00656C20616E204643202000204254202D68
:1032BA002D3E204B6162656C20746F2046432020AE
:1032CA0000204254202D2D3E204361626C6520610E
:1032DA0020204643202000204254202D2D3E206BE2
:1032EA006162656C206E6161722046430050432022
:1032FA006D697420425420766572622E00636F6E87
:10330A006E656374205043207769746820425400C4
:10331A006173736F63696572205043206120425460
:10332A000050432076696120425420766572626FAC
:10333A006E64656E2E00504B542D4B6162656C2095
:10334A00616E20464300504B542D4B6162656C20E0
:10335A00746F20464300504B542D4361626C6520C4
:10336A006120464300504B542D6B6162656C206EA0
:10337A0061617220464300204254202D2D3E205781
:10338A00692E323332202020202020200057692E37
:10339A0032333220616E2046432020202020202014
:1033AA0020200057692E32333220746F2046432082
:1033BA0020202020202020200057692E323332205E
:1033CA006120464320202020202020202020005752
:1033DA00692E323332206E616172204643202020EA
:1033EA00202020200020555342202D2D3E204B61C5
:1033FA0062656C20616E20464320002055534220AE
:10340A002D2D3E206361626C6520746F2046432037
:10341A000020555342202D2D3E206361626C6520A9
:10342A0061204643202000555342202D2D3E206B1B
:10343A006162656C206E61617220464300504320D0
:10344A006D6974205553422076657262696E6465AF
:10345A006E2000636F6E6E65637420504320776937
:10346A007468205553422020006173736F63696545
:10347A0072205043206120555342202020200056BC
:10348A00657262696E64205043206D6574205553DD
:10349A00422020200020555342202D2D3E205769DE
:1034AA002E323332202020202020004D4B2D546F05
:1034BA006F6C207374617274656E007374617274D8
:1034CA00204D4B2D546F6F6C0064E96D617272610F
:1034DA006765204D4B2D546F6F6C002057692E3253
:1034EA003332204B6F6E6669677572696572656EF5
:1034FA00002057692E32333220436F6E6669677532
:10350A00726174696F6E002057692E3233322063FC
:10351A006F6E666967757265722020200020576990
:10352A002E32333220436F6E666967757261746931
:10353A0065200050726F6772616D6D2073746172DD
:10354A0074656E2E202020200073746172742070BE
:10355A00726F6772616D200044E96D617272657203
:10356A00206C652070726F6772616D6D650073748F
:10357A006172742070726F6772616D6D612E0042A4
:10358A00544D2D323232204B6F6E666967757269FF
:10359A006572656E0042544D2D32323220636F6E71
:1035AA0066696775726174696F6E0042544D2D3297
:1035BA00323220646520636F6E6669677572612EA8
:1035CA000042544D2D32323220636F6E6669677540
:1035DA007261746965004643203E204D4B2D555358
:1035EA0042203E2042544D2D323232004D4B2D5551
:1035FA00534220616E20504320616E7363686C2EC3
:10360A002000636F6E6E65637420504320746F20D0
:10361A004D4B2D55534220006173736F6369657278
:10362A002050432061204D4B2D55534220005665B2
:10363A007262696E64205043206D6574204D4B2D73
:10364A00555342005A7769736368656E204D4B2D56
:10365A0055534220756E64202000636F6E6E656359
:10366A00742063726F73736564206361626C6500B2
:10367A006C6120636F6E6E6578696F6E20656E741B
:10368A0072652050430054757373656E204D4B2D3F
:10369A0055534220656E20504B542000504B542005
:1036AA0065696E2067656B7265757A74657320202B
:1036BA0020006265747765656E204D4B2D55534227
:1036CA0020616E6420202000657420464320756EB8
:1036DA002063E2626C652063726F6973E900656555
:1036EA006E2067656B727569737465206B616265BC
:1036FA006C2020004B6162656C20616E7363686C9C
:10370A0069657373656E2E202000504B5420535602
:10371A003200200061616E736C756974656E2E00EB
:10372A004B6162656C006361626C6500536C617623
:10373A006520006573636C61766573004E6F726D08
:10374A00616C006E6F726D616C65004E6F726D61B7
:10375A00616C005265766572736500696E76657292
:10376A007365006765696E76657200456E64202030
:10377A0020204F4B0046696E202020204F4B0045E9
:10378A00696E642020204F4B0020454550726F6DB2
:10379A00207769726B6C69636800205265616C7985
:1037AA002064656C6574650020656570726F6D20B4
:1037BA007375707072696D65723F0020456570722D
:1037CA006F6D207765726B656C696A6B00206CF6A9
:1037DA00736368656E3F0020454570726F6D3F00E8
:1037EA0020202020002077697373656E3F0064658E
:1037FA00757473636820202020006765726D616E9E
:10380A00202020202000616C6C656D616E6465204B
:10381A002000647569747320202020202000656EC2
:10382A00676C6973636820202000656E676C697332
:10383A00682020202000616E676C61697365202012
:10384A002000656E67656C73202020202000667258
:10385A00616E7AF67369736368006672656E63688F
:10386A002020202020006672616EE761697365205E
:10387A0020006672616E7320202020202000686F6D
:10388A006C6CE46E646973636800647574636820C1
:10389A00202020202000686F6C6C616E646169735F
:1038AA0065006E656465726C616E64732000416EBA
:1038BA007A656967652045696E7374656C6C756EA7
:1038CA0067656E0020446973706C61792053657472
:1038DA007570202020202020200020642761666641
:1038EA0069636861676520636F6E6669672E200089
:1038FA00446973706C617920696E7374656C6C6964
:10390A006E67656E2000496E666F73206265692076
:10391A0053746172743A00496E666F206174207341
:10392A007461727475702000496E662E6175206428
:10393A00656D61727261676500496E666F206269C2
:10394A006A206F7073746172740053707261636875
:10395A0065203A20004C616E67756167653A200000
:10396A006C61206C616E6775653A20005461616C08
:10397A003A20004C6963687420617573206E616334
:10398A00683A004C69676874206F666620616674DD
:10399A0065723A00457874692E6665757820702ECE
:1039AA006C65733A004C6963687420756974206E9B
:1039BA00613A2020004C43442048656C6C69676B6F
:1039CA002E3A00204272696768746E657373203AF2
:1039DA0000206C756D696E6F73697465203A0020FA
:1039EA00696E74656E7369746569743A004C434410
:1039FA00204B6F6E74726173743A004C43442063B7
:103A0A006F6E74726173743A004C4344204E6F7245
:103A1A006D2F496E763A20004C4344204F726965F7
:103A2A006E742E3A2000446562756720504B54002C
:103A3A0057692054582F5258204368616E3A0057EC
:103A4A0069204E6574572E204772702E3A005769C6
:103A5A00204E6574572E204D6F64653A00576920D1
:103A6A0054582054696D656F75743A00576920552A
:103A7A00415254204D54552020203A0057692E3285
:103A8A0033322065696E6765626175743A005769F9
:103A9A002E323332206275696C7420696E203A00C6
:103AAA0057692E32333220696E74E96772E9202031
:103ABA003A0057692E32333220696E6765626F7534
:103ACA0077643A004973742065696E2057692E320B
:103ADA0033322D4D6F64756C20004973205769325B
:103AEA003332206D6F64756C0065737420756E20B7
:103AFA006D6F64756C652000497320657220656579
:103B0A006E2057692E3233320065696E67656261CD
:103B1A0075743F006275696C7420696E3F00696E46
:103B2A0074656772652057693233323F006D6F647E
:103B3A00756C6520696E6765626F7577643F004AC8
:103B4A006120200079657320006F756920004E6539
:103B5A00696E006E6F2020006E6F6E20004E6565E4
:103B6A00200042544D3232322065696E67656261C7
:103B7A0075743A0042544D323232206275696C745F
:103B8A0020696E203A0042544D32323220696E74F6
:103B9A006567726520203A0042544D3232322069FC
:103BAA006E6765626F7577643A0049737420656958
:103BBA006E2042544D2D3232322D4D6F64756C0099
:103BCA0049732042544D2D323232204D6F64756C48
:103BDA000049732065722065656E2042544D2D326E
:103BEA00323200696E74656772652042544D323212
:103BFA00323F0020504B5420416B6B752045696E53
:103C0A007374656C6C756E670020504B5420416369
:103C1A006375205365747570202020202020005081
:103C2A004B5420416B6B757479703A2000504B5499
:103C3A0020416363757479703A2000504B542041D7
:103C4A00636375747970653A2000416B6B75205512
:103C5A00204F66667365743A200041636375205588
:103C6A00204F66667365743A20004F666673657402
:103C7A00207665727374656C6C656E206269730078
:103C8A0061646A757374206F666673657420756EF5
:103C9A0074696C00446563616C616765206C2761B7
:103CAA006A757374657220004F6666736574206165
:103CBA0066726567656C656E20746F740064696509
:103CCA00205370616E6E756E672070617373740035
:103CDA00766F6C7461676520666974730061206C25
:103CEA00612074656E73696F6E006465207370611C
:103CFA006E6E696E67206A756973742069732E0027
:103D0A004C6F77426174205761726E20563A004CAC
:103D1A006F7742617420616C61726D6572696E675A
:103D2A003A00560046004C00480042004400410058
:103D3A00470052004645484C45523A204461746552
:103D4A006E7665726C75737420004552524F523A02
:103D5A002044617461206C6F7374007065727465BD
:103D6A0020646520646F6E6EE96573007665726C17
:103D7A006965732076616E206765676576656E731F
:103D8A0020004C65747A74652062656B616E6E748E
:103D9A0065004C617374206B6E6F776E200044650A
:103DAA00726E69E8726520706F736974696F6E006C
:103DBA004C61617473742062656B656E6465005052
:103DCA006F736974696F6E2067657370656963687C
:103DDA0065727400706F736974696F6E20736176AF
:103DEA00656400636F6E6E75652073617576E900B0
:103DFA00706F736974696520676572656400204530
:103E0A00696E7374656C6C756E67656E20782020B8
:103E1A00202020002053657474696E672078202062
:103E2A002020202020202020200020506172616D57
:103E3A00E87472657320782020202020202020003A
:103E4A0020496E7374656C6C696E67656E207820A4
:103E5A00202020202000E46E6465726E0063686191
:103E6A006E6765006C65206368616E67656D656E77
:103E7A007400766572616E646572696E6700616B63
:103E8A00746976696572656E0061637469766174D6
:103E9A006500616374697665720061637469766549
:103EAA0072656E00616B746976696572740061632C
:103EBA0074697661746564006163746976E96500A2
:103ECA006765616374697665657264002053657419
:103EDA0074696E6720782073706569636865726EAD
:103EEA003F002073746F72652073657474696E671E
:103EFA003F002052E9676C616765206D61676173F5
:103F0A00696E3F0020696E7374656C6C2E6F702049
:103F1A00746520736C61616E3F00476573706569F3
:103F2A00636865727420756E640073746F72656479
:103F3A0020616E640073746F636BE97320657400AB
:103F4A006F706765736C6167656E20656E004B6F95
:103F5A0070696572652053657474696E6700636F72
:103F6A0070792073657474696E6773007061726129
:103F7A006DE87472657320646520636F706965000B
:103F8A006B6F706965657220696E7374656C6C69B4
:103F9A006E67656E0020766F6E20207820206E6135
:103FAA006368202079002066726F6D207820746F14
:103FBA0020790020646573207820617072E873208C
:103FCA0079002076616E2078206E61207900766F04
:103FDA006E2020206E6163682020456E6465202073
:103FEA00204F4B0066726F6D2020746F20202020B6
:103FFA00656E64202020204F4B00646573202020CA
:10400A00617072E8732066696E202020204F4B0091
:10401A0076616E2020206E612020202065696E6402
:10402A006520204F4B005769726B6C696368206B7F
:10403A006F70696572656E3F007265616C6C79209C
:10404A00636F70793F00767261696D656E74206383
:10405A006F7069653F0065636874206B6F7069658E
:10406A003F004B6F706965727420756E6420616BD6
:10407A007469766965727400636F7069656420613A
:10408A006E64206163746976617465642000636F8D
:10409A007069657320657420616374696673004B87
:1040AA006F706965EB6E20656E2061637469656681
:1040BA0000C46E646572652045696E7374656C6CC4
:1040CA00756E67656E20002020206368616E6765E3
:1040DA002073657474696E6773202020006D6F64A5
:1040EA006966696572206C65732072E9676C61673D
:1040FA00657300696E7374656C6C696E67656E20B2
:10410A0077696A7A6967656E002057E4686C65208A
:10411A00506172616D657465722020202020002034
:10412A0073656C65637420706172616D6574657224
:10413A00732020200073E96C656374696F6E6E6585
:10414A007A20506172616DE8742E0053656C656364
:10415A007465657220506172616D65746572732051
:10416A00002057E4686C6520536569746520202037
:10417A0020202020202000202020202073656C652C
:10418A006374207061676520202020200053E96C49
:10419A00656374696F6E6E657A206C612070616701
:1041AA00652000202053656C656374656572207014
:1041BA006167696E61202020002057E4686C6520E1
:1041CA0053657474696E673A2020202020200020ED
:1041DA002073656C6563742073657474696E6720F7
:1041EA00202020200053E96C656374696F6E6E6548
:1041FA007A2073657474696E672000202053656C99
:10420A006563746565722073657474696E672020CE
:10421A00001500020118012E01440115005A01700F
:10422A000186019C011500B201C401D601E80115FD
:10423A0000FA0104020E021802150022023202429A
:10424A000256021500660277028C02A1021500B618
:10425A0002CC02E002F302150008031E032B033707
:10426A000315004A0360037403880315009C03B214
:10427A0003B203B2031500C803D903EA03FC03150A
:10428A00000E040E040E040E0415001E041E041E65
:10429A00041E0415002904290429042904150035DB
:1042AA00043504350435041500420442044204422C
:1042BA000415004F044F044F044F0415005D045DBC
:1042CA00045D045D0415006A046A046A046A04153C
:1042DA00007804780478047804150085049B04B1F6
:1042EA0004C7041500DD04F304F304090515001FCF
:1042FA000535054B056105150077058D05A305B93B
:10430A00051500CF05DB05EB05FB05150006060CB8
:10431A00061206180615001E062106210624061591
:10432A00002906300636063F06150044064A06509E
:10433A0006570615005E0671067F068E061500A052
:10434A0006A006A006A0061500B106BC06C406CE45
:10435A00061500D906D906D906D9061500E506E5D7
:10436A0006E506E5061500EF06EF06EF06F906155F
:10437A000003070D071707210715002B0735073C10
:10438A0007450715004F0760077307870715009B46
:10439A00079B079B079B071500A807B307BE07CA19
:1043AA00071500D507DB07E107E7071500ED07F357
:1043BA0007F907FF07150005080508050805081588
:1043CA000009081C082D084008150055085F0869EF
:1043DA0008730815007D089308A908BF081500D5B9
:1043EA0008EB080109170915002D09430959096F36
:1043FA0009150085099B09B109C7091500DD09F2EC
:10440A0009060A1A0A1500280A350A420A4F0A1525
:10441A00005C0A720A7E0A8E0A1500A40AB70ACA42
:10442A000AD90A1500EC0AFD0A070B1C0B15002E07
:10443A000B440B570B690B15007E0B940BA60BB89C
:10444A000B1500CC0BE20BEC0B010C1500130C2620
:10445A000C320C3D0C15004B0C5E0C6A0C790C15D9
:10446A00008D0CA10CCA0AB50C1500C80CD80CE7B3
:10447A000C1C0B1500FD0C130D290D3F0D150055D5
:10448A000D6B0D810D970D1500AD0DBD0DD00DE114
:10449A000D1500F60D060E160E250E1500370E37F1
:1044AA000E370E370E15004D0E630E790E8F0E1550
:1044BA0000A50EBB0ED10EE70E1500FD0E130F2937
:1044CA000F3F0F1500550F550F550F550F15006B60
:1044DA000F7B0F890F7B0F15009B0FB10FC70FDDE5
:1044EA000F1500F30F091018102E1015003F105564
:1044FA00106B1081101500961096109610961015D4
:10450A0000AC10C210D810EE10150004111A1130A8
:10451A0011461115005C11721188119E111500B413
:10452A0011CA11D211D4111500E011E611E611E0F9
:10453A00111500EC11EC11F311EC111500FC11FC32
:10454A001103120B12150013121B121B1223121540
:10455A0000FA012B1235123F12150049125A12683D
:10456A00127B1215008D129712A012A5121500AE19
:10457A0012BA12C612D2121500DE12EA12F612028C
:10458A001315000E131A132613321315003E134A7D
:10459A00135613621315006E1384139A13B013156E
:1045AA0000C613D713E813F91315000A14151420BB
:1045BA00142C14150033144314541465141500757F
:1045CA0014831491149F141500AD14BB14BB14BBAF
:1045DA00141500C914C914C914C9141500D814D85B
:1045EA0014D814D8141500E614E614E614E61415C3
:1045FA0000F014F014F014F0141500FF14FF14FF67
:10460A0014FF1415000E150E150E150E1515001DA6
:10461A00151D151D151D1515002C152C152C152CE1
:10462A001515003C154E1560157215150084159A5E
:10463A0015A915B8151500C915D415DE15ED1515EA
:10464A0000FF1504160916FF1515000E1613161885
:10465A00161D161500221634164616581615006A27
:10466A00168016A91591161500C915D415A316EDAD
:10467A00151500B316C916C916C9161500DF16EDA9
:10468A0016ED16FB1615000A171A171A171A171518
:10469A0000DF16ED16ED16FB1615002A1740175403
:1046AA0017681715007D1790179D17AA171500C0D0
:1046BA0017C017C017CF171500E217E417E617E45B
:1046CA00171500E817EA17EC17EE171500E617E6B4
:1046DA0017F017E6171500F217F217EC17F217156D
:1046EA0000F4170A181B182C181500421852185EE5
:1046FA0018701815007F189418A318B0181500BE62
:10470A0018D418EA180019150016191D1924193297
:10471A001915003E19491952195A19150064196ECA
:10472A00197819801915008C19A219B219C419150A
:10473A0000DA19EA19F519001A15000E1A1E1A2CB0
:10474A001A401A1500551A661A731A821A15008E1B
:10475A001AA41ABA1AD01A1500E61AF91A061B165A
:10476A001B1500221B381B4E1B5F1B1500711B8774
:10477A001B9D1BB31B1500C91BDF1BF51B0B1C154F
:10478A0000211C371C4D1C631C1500791C8F1CA5AD
:10479A001CBB1C4D6F746F723B56657273696F6EEA
:1047AA003B536574706F696E7420686967683B5320
:1047BA006574706F696E74206C6F773B53746174A3
:1047CA00653B526561644D6F64653B437572726502
:1047DA006E743B4D617850574D3B54656D706572F0
:1047EA0061747572650D003B000D000A00FFFFFF42
:0E47FA0001010A001E00FFFF01640001010022
:00000001FF
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/TODO.txt
0,0 → 1,12
24.8.2011 Cebra
Waypointlisten speichern und zum MK übertragen
Menüs überarbeiten um die Varianten der Schnittstellen einfacher handhaben zu können
Touchsreen entfällt, bring keine wirklichen Vorteile, kostet nur viel Speicher
 
22.7.2011 Cebra
 
HArdwareplatine mit Stick und Schalter zum Steuern der seriellen Kanäle.
 
22.6.2011 Cebra
- erl. I2C Motortest für BL-Controller
- erl. zur Zeit sind durch einen Layoutfehler noch die Tasten vertauscht, in timer.h zu ändern
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/Wi232.c
0,0 → 1,562
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "main.h"
#include "Wi232.h"
#include "timer.h"
#include "eeprom.h"
#if defined HWVERSION1_3W || defined HWVERSION3_9
 
uint8_t Wi232_hardware = 0;
uint8_t InitErr=0;
 
/*************************************************************************
Function: discoverWI232()
Purpose: check if Wi232 available
Returns: Version or 0 = timeout
 
**************************************************************************/
void discoverWi232(void)
 
{
int16_t RegisterWi232;
 
SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
set_WI232CMD();
_delay_ms(200);
 
USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); /* erstmal mit 57600 versuchen*/
lcd_printpns_at (0, 0, PSTR("search Wi.232 Modul"),0);
lcd_printpns_at (0, 1, PSTR("with 57600 Baud "),0);
RegisterWi232 = ReadWi232(regDiscover);
Wi232_hardware = 1;
 
if (RegisterWi232 == 0)
{
USART_Init( UART_BAUD_SELECT(2400,F_CPU) ); /* neues Modul mit 2400 suchen*/
lcd_printpns_at (0, 1, PSTR("with 2400 Baud "),0);
RegisterWi232 = ReadWi232(regDiscover);
Wi232_hardware = 2;
}
 
if (RegisterWi232 == 0)
{
lcd_cls();
lcd_printpns_at (0, 0, PSTR("no Wi.232 found "),0);
Wi232_hardware = 0;
}
 
if (RegisterWi232 == 0xFF)
{
lcd_cls();
lcd_printpns_at (0, 0, PSTR("Wi.232 Sytaxerror "),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
 
if (RegisterWi232 != 0)
{
lcd_cls();
if (Wi232_hardware ==1)
lcd_printpns_at (0, 0, PSTR("Wi.232 found 57600"),0);
 
if (Wi232_hardware ==2) // bei 2400 Baud
{
WiIsSet= false; //wenn hier 2400 gefunden wurde ist Wi232 nicht initialisiert
lcd_printpns_at (0, 0, PSTR("Wi.232 found 2400"),0);
if (WriteWi232(regNVDATARATE,Wi232_57600)!=0) /* NV-Ram auf 57600 setzen*/
{
lcd_printpns_at (0, 1, PSTR("Error set NV-RAM"),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
else
{
_delay_ms(1000);
lcd_printpns_at (0, 1, PSTR("NV-RAM set to 57600"),0);
lcd_printpns_at (0, 2, PSTR("ok "),0);
_delay_ms(2000);
}
 
if (WriteWi232(regDATARATE,Wi232_57600)!=0) /* Ram auf 57600 setzen*/
{
lcd_printpns_at (0, 3, PSTR("Error set RAM "),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
else
{
_delay_ms(1000);
lcd_printpns_at (0, 1, PSTR("RAM set to 57600 "),0);
lcd_printpns_at (0, 2, PSTR("ok "),0);
_delay_ms(2000);
}
USART_Init( UART_BAUD_SELECT(57600,F_CPU) );
}
lcd_cls_line (0,1,21);
lcd_printpns_at (0, 1, PSTR("Version:"),0);
lcd_print_hex_at(9,1,RegisterWi232,0);
}
clr_WI232CMD();
}
 
 
/*************************************************************************
Function: InitWI232()
Purpose: set Wi232Register for Mikrokopter
Returns: 0 = ACK, FF = NAK
 
**************************************************************************/
void InitWi232(void)
{
 
uint8_t i = 0;
 
Change_Output(Uart02Wi); // Verbindung zu Wi232 herstellen
 
discoverWi232(); // Check if Wi232 available
 
if (Wi232_hardware != 0)
{
lcd_printpns_at (0, 2, PSTR("Init Wi232 wait...."),0);
set_WI232CMD();
_delay_ms(200);
SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); /* erstmal mit 57600 versuchen*/
 
if (WriteWi232(regNETGRP,126)!=0) /*damit Wi232 nix mehr vom Kopter schickt erstmal Networkgroup ins Nirwana setzen */
lcd_printpns_at (i++,4,PSTR("."),0);
// InitErr =12;
// Grund:
//If RF packets are received while the CMD line is active,
//they are still processed and presented to the module’s UART for transmission.
 
// wenn sich ein EEPROM-Wert ändert wird auch das Ram beschrieben damit die Änderung sofort wirksam wird
if (WriteWi232(regNVTXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(1); /*TX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regTXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(2);/*TX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVRXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(3);/* RX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regRXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(4);/* RX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVSLPMODE ,Sleep_Awake)!=0)
InitErrorWi232(5);/* Sleepmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVPWRMODE,WbModeP15)!=0)
InitErrorWi232(6);/* Transceiver Mode/Powermode */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVTXTO,WiTXTO)!=0)
InitErrorWi232(7);/* UART Timeout */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regTXTO,WiTXTO)!=0)
InitErrorWi232(8);/* UART Timeout */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVUARTMTU,WiUartMTU)!=0)
InitErrorWi232(9);/* UART Buffer*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regUARTMTU,WiUartMTU)!=0)
InitErrorWi232(10);/* UART Buffer*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVNETMODE,WiNetworkMode)!=0)
InitErrorWi232(11);/* Networkmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNETMODE,WiNetworkMode)!=0)
InitErrorWi232(12);/* Networkmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVUSECRC ,CRC_Enable)!=0)
InitErrorWi232(13);/* CRC*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVCSMAMODE,CSMA_En)!=0)
InitErrorWi232(14);/* CSMA*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVDATARATE,Wi232_57600)!=0)
InitErrorWi232(15);/* Baudrate*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regDATARATE,Wi232_57600)!=0)
InitErrorWi232(16);/* Baudrate*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVNETGRP,WiNetworkGroup)!=0)
InitErrorWi232(17);/* Networkgroup */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNETGRP,WiNetworkGroup)!=0)
InitErrorWi232(18);/* Networkgroup */
lcd_printpns_at (i++,4,PSTR("."),0);
 
clr_WI232CMD();
 
if (InitErr !=0)
{
lcd_printpns_at (0, 2, PSTR("Wi232 InitError "),0);
lcd_print_hex(InitErr,0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
else
{
lcd_printpns_at (0, 2, PSTR("Wi232 Init ok...."),0);
WriteWiInitFlag(); // Init merken
}
USART_Init (UART_BAUD_SELECT(57600,F_CPU));
_delay_ms(2000);
}
}
 
/*************************************************************************
Function: InitErrorWI232()
Purpose: Show Wi232 Error, Value
Returns:
**************************************************************************/
void InitErrorWi232(uint8_t Error)
{
 
lcd_printpns_at (0, 3, PSTR("Wi232 InitError "),0);
lcd_print_hex(Error,0);
InitErr=Error;
BeepTime = 500;
BeepMuster = 0x0040;
_delay_ms(500);
 
}
 
 
 
 
/*************************************************************************
Function: WriteWI232()
Purpose: set Register to Wi232, Register, Value
Returns: 0 = ACK, FF = NAK
ACHTUNG nur für Value <0x80
**************************************************************************/
int16_t WriteWi232(uint8_t Wi232Register, uint8_t RegisterValue)
 
{
uint8_t timeout=10;
uint8_t tc=0;
unsigned int v;
 
USART_putc(0xff);
USART_putc(0x02);
USART_putc(Wi232Register);
USART_putc(RegisterValue);
// lcd_print_hex(Wi232Register,0);
// lcd_print_hex(RegisterValue,0);
 
do
{
v = USART_getc(); /*ACK erwartet*/
_delay_ms(100);
tc ++;
}
while (v==0 && tc!=timeout);
 
// lcd_print_hex(v,0);
if (v != 0x06)
{
lcd_printpns_at (0, 2, PSTR("Wi.232 NAK"),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
return 0xFF;
}
 
if (v==0x06)
return 0;
 
return 0xFF;
}
 
 
/*************************************************************************
Function: ReadWI232()
Purpose: send Readcommand to Wi232,
Returns: Registervalue, 0 = timeout 0xFF = Syntaxerror
 
**************************************************************************/
int16_t ReadWi232(uint16_t Wi232Register)
 
{
uint8_t timeout=10;
uint8_t tc=0;
 
 
unsigned int v;
 
v = USART_getc(); /*Zeichen löschen*/
USART_putc(0xff);
USART_putc(0x02);
USART_putc(0xfe);
USART_putc(Wi232Register);
_delay_ms(50);
// lcd_printpns_at (0, 2, PSTR("read Wi232"),0);
 
 
do
{
v = USART_getc(); /*ACK erwartet*/
_delay_ms(100);
tc ++;
}
while (v==0 && tc!=timeout);
 
if (tc == timeout)
return 0; /* Timeout*/
 
if (v != 0x06)
return 0xFF; /* Syntaxerror*/
 
lcd_print_hex(v,0);
v = USART_getc(); /*Register*/
// lcd_print_hex(v,0);
v = USART_getc(); /*Value*/
// lcd_print_hex(v,0);
 
return v;
 
}
 
 
 
/*************************************************************************
Function: EscapeString()
Purpose:
Returns:
Quelle: Radiotronix Wi.232 Manual
**************************************************************************/
 
 
int EscapeString(char *src, char src_len, char *dest)
{
// The following function copies and encodes the first
// src_len characters from *src into *dest. This
// encoding is necessary for Wi.232 command formats.
// The resulting string is null terminated. The size
// of this string is the function return value.
// ---------------------------------------------------
uint8_t src_idx, dest_idx;
// Save space for the command header and size bytes
// ------------------------------------------------
dest_idx = 2;
// Loop through source string and copy/encode
// ------------------------------------------
for (src_idx = 0; src_idx < src_len; src_idx++)
{
if (src[src_idx] > 127)
{
dest[dest_idx++] = 0xFE;
}
dest[dest_idx++] = (src[src_idx] & 0x7F);
}
// Add null terminator
// -------------------
dest[dest_idx] = 0;
// Add command header
// ------------------
dest[0] = 0xFF;
dest[1] = dest_idx-2;
 
// Return escape string size
// -------------------------
return dest_idx;
}
 
 
//#if defined HWVERSION1_3W || defined HWVERSION3_9
/*************************************************************************
Function: Wi232USB()
Purpose: Connect Wi232 Programmmode to PKT USB,
Returns:
 
**************************************************************************/
void Wi232_USB(void)
 
 
{
unsigned int c0,c1;
 
if (Wi232_hardware==1)
{
// USART_Init (UART_BAUD_SELECT(57600,F_CPU));
// uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init (UART_BAUD_SELECT(2400,F_CPU));
// uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
}
 
if (Wi232_hardware==2)
{
USART_Init (UART_BAUD_SELECT(2400,F_CPU));
uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
}
 
lcd_cls ();
// SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
 
set_WI232CMD();
 
lcd_printpns_at (0, 0, PSTR("Wi.232 Konfiguration "),0);
lcd_printpns_at (0, 1, PSTR("PC mit USB verbinden"),0);
lcd_printpns_at (0, 2, PSTR("Wi.232"),0);
lcd_printpns_at (0, 3, PSTR("Programm starten"),0);
lcd_printpns_at (17, 7, PSTR("Exit"),0);
 
c1 = 0;
 
for(;;)
{
c0 = uart1_getc(); /* from USB*/
if ( c0 & UART_NO_DATA )
{
c1 = USART_getc();
 
if (c1 == 0)
{}
else
{
// lcd_print_hex(c1,0);
uart1_putc (c1); /*to USB*/;
}
}
else
{
USART_putc(c0 ); /* to Wi232*/
// lcd_print_hex(c0,0);
// _delay_ms(1);
}
 
if ((get_key_press (1 << KEY_ENTER)))
{
clr_WI232CMD();
// uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init( UART_BAUD_SELECT(57600,F_CPU) );
// SwitchToFC();
return;
}
 
}
}
/*************************************************************************
Function: Wi232_FC()
Purpose: Connect Wi232 to PKT USB, Transparent
Returns:
 
**************************************************************************/
void Wi232_FC(void)
 
 
{
unsigned int c0,c1;
 
 
USART_Init (UART_BAUD_SELECT(57600,F_CPU));
uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init (UART_BAUD_SELECT(2400,F_CPU));
// uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
 
lcd_cls ();
// SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
 
 
lcd_printpns_at (0, 0, PSTR("Wi.232 to FC "),0);
lcd_printpns_at (0, 1, PSTR("PC mit USB verbinden"),0);
lcd_printpns_at (0, 2, PSTR("und Mikrokoptertool"),0);
lcd_printpns_at (0, 3, PSTR("starten"),0);
lcd_printpns_at (17, 7, PSTR("Exit"),0);
 
c1 = 0;
 
for(;;)
{
c0 = uart1_getc(); /* from USB*/
if ( c0 & UART_NO_DATA )
{
c1 = USART_getc();
if (c1 == 0)
{}
else
{
// lcd_print_hex(c1,0);
uart1_putc (c1); /*to USB*/;
 
}
}
else
{
USART_putc(c0 ); /* to Wi232*/
// lcd_print_hex(c0,0);
// _delay_ms(1);
}
 
if ((get_key_press (1 << KEY_ENTER)))
{
return;
}
}
}
 
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/Wi232.h
0,0 → 1,177
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef WI232_H_
#define WI232_H_
 
 
void discoverWi232(void);
void InitWi232(void);
int16_t WriteWi232(uint8_t Wi232Register, uint8_t RegisterValue);
int16_t ReadWi232(uint16_t Wi232Register);
void InitErrorWi232(uint8_t Error);
extern uint8_t Wi232_hardware;
 
 
// Non-volatile Registers
// Name Address Description Default
#define regNVTXCHANNEL 0x00 // Transmit channel setting ## 0 ##
#define regNVRXCHANNEL 0x01 // Receive channel setting ## 0 ##
#define regNVPWRMODE 0x02 // Operating mode settings ## +13 dBm widebandmode ##
#define regNVDATARATE 0x03 // UART data rate ## 2400bps ##
#define regNVNETMODE 0x04 // Network mode (Normal/Slave) ## Normal ##
#define regNVTXTO 0x05 // Transmit wait timeout ## ~16ms ##
#define regNVNETGRP 0x06 // Network group ID ## 0x00 ##
#define regNVUSECRC 0x08 // Enable/Disable CRC ## Enabled ##
#define regNVUARTMTU 0x09 // Minimum transmission unit. ## 64 bytes ##
#define regNVSHOWVER 0x0A // Enable/Disable start-up message ## Enabled ##
#define regNVCSMAMODE 0x0B // Enable/Disable CSMA ## Enabled ##
#define regNVSLPMODE 0x0D // Power state of module ## Awake ##
#define regNVACKONWAKE 0x0E // Send ACK character to host on wake
 
 
// Non-volatile Read Only Registers
// Name Address Description
#define regMAC0 0x22 // These registers form the unique 48-bit MAC address.
#define regMAC1 0x23 // MAC
#define regMAC2 0x24 // MAC
#define regOUI0 0x25 // MAC
#define regOUI1 0x26 // MAC
#define regOUI2 0x27 // MAC
 
#define regDiscover 0x78 // Versionsregister
 
 
// Volatile Read/Write Registers
// Name Address Description
#define regTXCHANNEL 0x4B // Transmit channel setting
#define regRXCHANNEL 0x4C // Receive channel setting
#define regPWRMODE 0x4D // Operating mode settings
#define regDATARATE 0x4E // UART data rate
#define regNETMODE 0x4F // Network mode (Normal or Slave)
#define regTXTO 0x50 // Transmit wait timeout
#define regNETGRP 0x51 // Network group ID
#define regUSECRC 0x53 // Enable/Disable CRC
#define regUARTMTU 0x54 // Minimum transmission unit.
#define regSHOWVER 0x55 // Enable/Disable start-up message
#define regCSMAMODE 0x56 // Enable/disable CSMA
#define regSLPMODE 0x58 // Power state of module
#define regACKONWAKE 0x59 // Send ACK character to host on wake
 
 
// Wideband Channels
// regNVTXCHAN (0x00) regTXCHAN (0x4B)
// Channel Number Frequency
#define wChan0 0x00 // 868.300 MHz
#define wChan1 0x01 // 868.95 MHz ## MK ##
 
// Narrowband Channels
// regNVRXCHAN (0x01) regRXCHAN (0x4C)
// Channel Number Frequency
#define nChan0 0x00 // 868.225 MHz
#define nChan1 0x01 // 868.375 MHz ## MK ##
#define nChan2 0x02 // 868.850 MHz
#define nChan3 0x03 // 869.050 MHz
#define nChan4 0x04 // 869.525 MHz
#define nChan5 0x05 // 869.850 MHz
 
// Power Mode
// regNVPWRMODE (0x02) regPWRMODE (0x4D)
// PM1 PM1 PM0 Mode
#define NbModeN0 0x00 // 0 0 0 Narrowband Mode 0dBm power setting (typical)
#define WbModeP5 0x01 // 0 0 1 Wideband Mode +5dBm power setting (typical)
#define WbModeP10 0x02 // 0 1 0 Wideband Mode +10dBm power setting (typical)
#define WbModeP15 0x03 // 0 1 1 Wideband Mode +15dBm power setting (typical) ## MK ##
#define WbModeN0 0x04 // 1 0 0 Wideband Mode 0dBm power setting (typical)
#define NbModeP5 0x05 // 1 0 1 Narrowband Mode +5dBm power setting (typical)
#define NbModeP10 0x06 // 1 1 0 Narrowband Mode +10dBm power setting (typical)
#define NbModeP15 0x07 // 1 1 1 Narrowband Mode +15dBm power setting (typical)
 
// Wi232 UART Baudrate
// regNVDATARATE (0x03) regDATARATE (0x4E)
// Baud Rate BR2 BR1 BR0
#define Wi232_2400 0x00 // 0 0 0* (default 2400)
#define Wi232_9600 0x01 // 0 0 1
#define Wi232_19200 0x02 // 0 1 0
#define Wi232_38400 0x03 // 0 1 1
#define Wi232_57600 0x04 // 1 0 0 ## MK ##
#define Wi232_115200 0x05 // 1 0 1
#define Wi232_10400 0x06 // 1 1 0
#define Wi232_31250 0x07 // 1 1 1
 
// NetworkMode
// regNVNETMODE (0x04) regNETMODE (0x4F)
#define NetMode_Slave 0x00 // Slavemode
#define NetMode_Normal 0x01 // Normalmode (default)
 
// Transmit Wait Timeout
// regNVTXTO (0x05) regTXTO (0x50)
#define TWaitTimeFull 0x00 // full Buffer required
#define TWaitTime16 0x10 // 16 ms Delay (default)
 
// Network Group
// regNVNETGRP (0x06) regNETGRP (0x51)
#define NetWorkGroup 66 // default = 0, valid 0-127 ## MK = 66 ##
 
// CRC Control
// regNVUSECRC (0x08) regUSECRC (0x53)
#define CRC_Disable 0x00 // no CRC check
#define CRC_Enable 0x01 // CRC check (default)
 
// UART minimum transmission unit
// regNVUARTMTU (0x09) regUARTMTU (0x54)
#define UartMTU64 64 // default=64, valid 1-144
 
// Verbose mode
// regNVSHOWVER (0x0A)
#define ShowVers_Dis 0x00 // do not show Startupmessage ## MK = 66 ##
#define ShowVers_En 0x01 // show Startupmessage (default)
 
// CSMA enable
// regNVCSMAMODE (0x0B) regCSMAMODE (0x56)
#define CSMA_Dis 0x00 // disable CSMA Carrier-sense multiple access
#define CSMA_En 0x01 // enable CSMA (default)
 
// Sleep control
// regNVSLPMODE (0x0D) regSLPMODE (0x58)
#define Sleep_Awake 0x00 // Sleepmode = Awake (default)
#define Sleep 0x01 // Sleepmode = Sleep
#define Sleep_Stby 0x02 // Sleepmode = Standby
 
// ACK on Wake
// regNVACKONWAKE (0x0D) regACKONWAKE (0x59)
#define ACKwake_Dis 0x00 // disable ACK on Wake
#define ACKwake_En 0x01 // enable ACK on Wake (default)
 
 
#endif // WI232_H_
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/bluetooth.c
0,0 → 1,876
/**
* source for the Bluetooth driver
* @file bluetooth.c
* @author Linus Lotz<lotz@in.tum.de>
* @author Salomon Sickert
*/
 
 
 
#include "cpu.h"
#include <string.h>
#include <util/delay.h>
#include "bluetooth.h"
#include "main.h"
#ifdef HWVERSION3_9
#include "uart1.h"
#include "usart.h"
#include "fifo.h"
#include "error.h"
#include "lcd.h"
#include "eeprom.h"
#include "error.h"
#include "setup.h"
 
 
//#define SaveMem
 
//
// Baudrate for the UART-connection to the BTM-222 on SQUIRREL
//
 
#define SQUIRREL
 
#ifdef SQUIRREL
#define UART_BAUD_RATE 19200
#endif
 
#ifdef NUT
#define UART_BAUD_RATE 19200
#endif
 
 
typedef enum {
BT_RAW,
BT_DATA,
BT_CMD,
BT_NOECHO,
BT_NOANSWER
} communication_mode_t;
 
#define BT_CMD_TIMEOUT_MS 2000
 
typedef enum {
BT_TEST, // AT
BT_CONNECT, // ATA
BT_DISCONNECT, // ATH
BT_CLEAR_ADDRESS, // ATD0
BT_SET_ADDRESS, // ATD=_____
BT_FIND_DEVICES, // ATF?
BT_DISABLE_AUTOCONNECT, // ATO1
BT_SET_MASTER, // ATR0
BT_SET_SLAVE, // ATR1
BT_SET_PIN, // ATP=1234
BT_SET_57600, // ATL4 Baudrate 57600
BT_SET_NOANSWER, // ATQ1 Rückmeldungen aus
BT_SET_NOECHO, // ATE0 ECHO deaktivieren
BT_SET_ANSWER, // ATQ0 Rückmeldungen
BT_SET_ECHO, // ATE1 ECHO aktivieren
BT_SET_DEFAULT, // Defaultwerte setzen
BT_SET_NAME, // Devicename
BT_SET_DISPWRDOWN // disable auto Powerdown
} bt_cmd_t;
 
#ifdef SQUIRREL
#define IN_FIFO_SIZE 100
#endif
 
#ifdef NUT
#define IN_FIFO_SIZE 65
#endif
 
static uint8_t bt_buffer[IN_FIFO_SIZE];
static fifo_t in_fifo;
 
static bt_mode_t bt_mode = BLUETOOTH_SLAVE;
static communication_mode_t comm_mode = BT_CMD;
 
uint8_t i = 0;
uint8_t NoEcho = 0;
uint8_t NoAnswer = 0;
 
 
 
// Set a timeout of Y ms and a Conditon X, which have to be true while timeout
#define while_timeout(X, Y) for(uint16_t __timeout = 0; __timeout++ <= Y && (X); Delay_MS(Y ? 1 : 0))
 
//--------------------------------------------------------------
void Delay_MS(int count)
{
for (int i = 0; i < count; i++)
_delay_ms(1);
}
 
 
//--------------------------------------------------------------
static void uart_receive(void)
{
unsigned int uart_data;
 
while (!fifo_is_full(&in_fifo))
{
uart_data = uart1_getc();
 
// USART_puts(".");
 
switch (uart_data & 0xFF00) {
// Framing Error detected, i.e no stop bit detected
case UART_FRAME_ERROR:
#ifdef DEBUG
warn_pgm(PSTR("FRM ERR"));
#endif
return;
 
// Overrun, a character already presend in the UART UDR register was
// not read by the interrupt handler before the next character arrived,
// one or more received characters have been dropped
//
case UART_OVERRUN_ERROR:
#ifdef DEBUG
warn_pgm(PSTR("OVR ERR"));
#endif
return;
 
// We are not reading the receive buffer fast enough,
// one or more received character have been dropped
//
case UART_BUFFER_OVERFLOW:
#ifdef DEBUG
warn_pgm(PSTR("BUF ERR"));
#endif
return;
 
// UART Inputbuffer empty, nothing to do
case UART_NO_DATA:
return;
 
default:
{
fifo_write(&in_fifo, uart_data);
// USART_putc(uart_data);
}
}
}
#ifdef DEBUG
warn_pgm(PSTR("FIFO OVR ERR"));
#endif
}
 
 
//--------------------------------------------------------------
static void uart_send(const char *data, const uint8_t length)
{
#ifdef DEBUG
debug_pgm(PSTR("bt_uart_send"));
#endif
 
char echo;
 
lcd_printp_at (i++, 1, PSTR("."), 0);
for (uint8_t i = 0; i < length; i++)
{
 
#ifdef DEBUG
USART_putc((data[i])); //test
#endif
// debug_pgm(PSTR("bt_init_S"));
 
if (uart1_putc(data[i]) == 0)
{
#ifdef DEBUG
warn_pgm(PSTR("UART: Remote not ready"));
#endif
return;
}
 
if (comm_mode == BT_RAW)
_delay_ms(50);
 
if (comm_mode == BT_DATA)
_delay_ms(1);
 
if (comm_mode == BT_NOECHO)
_delay_ms(1);
 
if (comm_mode == BT_CMD)
{
uint8_t x = 0;
for (; x < 3; x++)
{
// // while_timeout(X, Y) for(uint16_t __timeout = 0; __timeout++ <= Y && (X); _delay_ms(Y ? 1 : 0))
// while_timeout(fifo_is_empty(&in_fifo), 200)
for(uint16_t __timeout = 0; __timeout++ <= 200 && (fifo_is_empty(&in_fifo)); _delay_ms(200 ? 1 : 0))
{
uart_receive();
}
 
fifo_read(&in_fifo, &echo);
 
if (echo != data[i]) {
if (uart1_putc(data[i]) == 0)
{
warn_pgm(PSTR ("UART: Remote not ready"));
return;
}
}
else
break;
}
 
if (x == 3)
{
error_putc(data[i]);
error_pgm(PSTR("BT: WRONG ECHO"));
}
}
}
}
 
 
//--------------------------------------------------------------
static uint16_t send_cmd(const bt_cmd_t command, const char *data)
{
_delay_ms(500); // org 500 300 zu wenig
char full_command[20]; // Maximum command size
 
switch (command)
{
case BT_SET_PIN:
strcpy_P(full_command, PSTR("ATP="));
for (uint8_t i = 0; i < bt_pin_length; i++)
{
full_command[i+4] = bt_pin[i];
}
full_command[(bt_pin_length+4)] =0;
break;
 
case BT_SET_DEFAULT:
strcpy_P(full_command, PSTR("ATZ0"));
break;
 
case BT_SET_57600:
strcpy_P(full_command, PSTR("ATL4"));
break;
 
case BT_SET_NOANSWER:
strcpy_P(full_command, PSTR("ATQ1"));
break;
 
case BT_SET_NOECHO:
strcpy_P(full_command, PSTR("ATE0"));
break;
 
case BT_SET_ANSWER:
strcpy_P(full_command, PSTR("ATQ0"));
break;
 
case BT_SET_ECHO:
strcpy_P(full_command, PSTR("ATE1"));
break;
 
case BT_TEST:
strcpy_P(full_command, PSTR("AT"));
break;
 
case BT_CONNECT:
strcpy_P(full_command, PSTR("ATA"));
break;
 
case BT_DISCONNECT:
strcpy_P(full_command, PSTR("ATH"));
break;
 
case BT_CLEAR_ADDRESS:
strcpy_P(full_command, PSTR("ATD0"));
break;
 
case BT_SET_ADDRESS:
strcpy_P(full_command, PSTR("ATD="));
memcpy((full_command + strlen(full_command)), data, 12);
full_command[16] = 0;
break;
 
case BT_FIND_DEVICES:
strcpy_P(full_command, PSTR("ATF?"));
break;
 
case BT_DISABLE_AUTOCONNECT:
strcpy_P(full_command, PSTR("ATO1"));
break;
 
case BT_SET_MASTER:
strcpy_P(full_command, PSTR("ATR0"));
break;
 
case BT_SET_SLAVE:
strcpy_P(full_command, PSTR("ATR1"));
break;
 
case BT_SET_NAME:
strcpy_P(full_command, PSTR("ATN="));
for (uint8_t i = 0; i < bt_name_len; i++)
{
full_command[i + 4] = bt_name[i];
}
full_command[(bt_name_len + 4)] = 0;
break;
 
case BT_SET_DISPWRDOWN:
strcpy_P(full_command, PSTR("ATS1"));
break;
 
default:
warn_pgm(PSTR("CMD UNK"));
return false;
}
 
strcat_P(full_command, PSTR("\r"));
 
// throw away your television
uart_receive();
fifo_clear(&in_fifo);
// debug_pgm(PSTR("bt_init3"));
// send command
uart_send(full_command, strlen(full_command));
 
if (command== BT_SET_ECHO)
return true;
 
if (command== BT_SET_ANSWER)
return true;
 
// get response
while_timeout(true, BT_CMD_TIMEOUT_MS)
{
uart_receive();
if (fifo_strstr_pgm(&in_fifo, PSTR("OK\r\n")))
{
info_pgm(PSTR("CMD SEND: OK"));
return true;
}
 
if (fifo_strstr_pgm(&in_fifo, PSTR("ERROR\r\n")))
{
#ifdef DEBUG
info_pgm(PSTR("CMD SEND: Error"));
#endif
return false;
}
}
 
#ifdef DEBUG
if (command != BT_TEST)
warn_pgm(PSTR("CMD SEND: TIMEOUT"));
#endif
 
 
return false;
}
 
 
//--------------------------------------------------------------
void test(void)
{
comm_mode = BT_RAW;
for (uint8_t i = 0; i < 3; i++)
if (send_cmd(BT_TEST, NULL))
break;
comm_mode = BT_CMD;
}
 
 
#ifndef SaveMem
 
//--------------------------------------------------------------
static void clean_line(void)
{
while_timeout(true, 50)
uart_receive();
fifo_strstr_pgm(&in_fifo, PSTR("\r\n"));
}
 
static communication_mode_t update_comm_mode(uint16_t timeout_ms)
{
while_timeout(true, timeout_ms)
{
uart_receive();
 
if (fifo_strstr_pgm(&in_fifo, PSTR("DISCONNECT")))
{
clean_line();
test();
comm_mode = BT_CMD;
return comm_mode;
}
 
if (fifo_strstr_pgm(&in_fifo, PSTR("CONNECT")))
{
_delay_ms(100); //don't delete this, else there will be no success!!!!!!!!!
comm_mode = BT_DATA;
return comm_mode;
}
 
if (fifo_strstr_pgm (&in_fifo, PSTR("Time out,Fail to connect!")))
{
clean_line();
#ifdef DEBUG
debug_pgm(PSTR("CONNECT FAILED"));
#endif
test();
comm_mode = BT_CMD;
return comm_mode;
}
}
 
return comm_mode;
}
#endif
 
 
//--------------------------------------------------------------
uint16_t bt_init(void)
{
uint8_t init_error = false;
uint8_t BT_found = 0;
i = 0;
 
set_BTOn();
 
lcd_cls();
lcd_printp_at (0, 0, PSTR("BT initialisieren.."), 0);
_delay_ms(200);
 
for (uint8_t z = (bt_name_length); z > 0; z--)
{
if (bt_name[z - 1] != ' ')
{
bt_name_len = z;
break;
}
}
 
uart1_init(UART_BAUD_SELECT(57600, F_CPU));
fifo_init(&in_fifo, bt_buffer, IN_FIFO_SIZE);
_delay_ms(100);
// debug_pgm(PSTR("bt_init"));
uart_receive();
// debug_pgm(PSTR("bt_init1"));
fifo_clear(&in_fifo);
send_cmd(BT_TEST, NULL);
comm_mode = BT_NOECHO;
send_cmd(BT_SET_ECHO, NULL);
send_cmd(BT_SET_ANSWER, NULL);
 
// debug_pgm(PSTR("bt_init2"));
#ifdef DEBUG
debug_pgm(PSTR("Check with 57600"));
#endif
// send_cmd(BT_TEST, NULL); // Schrott löschen
 
if (send_cmd(BT_TEST, NULL)) // Test mit 57600
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 57600 Baud"));
#endif
BT_found = 1;
}
 
if (BT_found == 0)
{
#ifdef DEBUG
debug_pgm(PSTR("Check with 19200"));
#endif
uart1_init(UART_BAUD_SELECT(19200, F_CPU));// Test mit 19200
_delay_ms(100);
send_cmd(BT_TEST, NULL); // Schrott löschen
send_cmd(BT_SET_ANSWER, NULL);
send_cmd(BT_SET_ECHO, NULL);
 
if (send_cmd(BT_TEST, NULL))
{
debug_pgm(PSTR("19200 OK"));
if (send_cmd(BT_TEST, NULL))
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 19200 Baud"));
#endif
BT_found = 2;
}
}
}
 
if (BT_found == 0)
{
#ifdef DEBUG
debug_pgm(PSTR("Check with 9600"));
#endif
uart1_init(UART_BAUD_SELECT(9600, F_CPU));//test mit 9600
_delay_ms(100);
send_cmd(BT_TEST, NULL);
send_cmd(BT_SET_ANSWER, NULL);
send_cmd(BT_SET_ECHO, NULL);
if (send_cmd(BT_TEST, NULL));
{
#ifdef DEBUG
debug_pgm(PSTR("9600 OK"));
#endif
if (send_cmd(BT_TEST, NULL))
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 9600 Baud"));
#endif
BT_found = 3;
}
}
}
 
if (BT_found > 0)
{
/* Set comm_mode to CMD */
comm_mode = BT_CMD;
// test();
/* Set BTM Baudrate */
if (!(send_cmd(BT_SET_57600, NULL)))
init_error = true;
uart1_init(UART_BAUD_SELECT(57600, F_CPU));
_delay_ms(100);
// test();
/* Clear remote address */
if(!(send_cmd(BT_CLEAR_ADDRESS, NULL)))
init_error = true;
// test();
/* Set BTM to SLAVE */
if (!(send_cmd(BT_SET_SLAVE, NULL)))
init_error = true;
// test();
/* Set BTM PIN */
if(!(send_cmd(BT_SET_PIN, NULL)))
init_error = true;
// test();
/* Set BTM Name */
if(!(send_cmd(BT_SET_NAME, NULL)))
init_error = true;
_delay_ms(300);
// test();
if(!(send_cmd(BT_SET_DISPWRDOWN, NULL)))
init_error = true;
// test();
/* Set BTM Echo aus */
send_cmd(BT_SET_NOECHO, NULL);
// test();
comm_mode = BT_NOECHO;
/* Set BTM Answer aus */
send_cmd(BT_SET_NOANSWER, NULL);
// test();
 
bt_mode = BLUETOOTH_SLAVE;
 
set_USBOn();
 
if (!init_error)
{
WriteBTInitFlag(); // Init merken
return true;
}
else
return false;
}
else
{
set_USBOn();
return false;
}
 
}
 
 
#ifndef SaveMem
 
//--------------------------------------------------------------
uint16_t bt_set_mode(const bt_mode_t mode)
{
if (update_comm_mode(0) == BT_DATA)
return false;
 
if (mode == bt_mode)
return true;
 
if (mode == BLUETOOTH_MASTER)
if (send_cmd(BT_SET_MASTER, NULL))
{
bt_mode = BLUETOOTH_MASTER;
test();
send_cmd(BT_DISABLE_AUTOCONNECT, NULL);
}
 
if (mode == BLUETOOTH_SLAVE)
if (send_cmd(BT_SET_SLAVE, NULL))
{
bt_mode = BLUETOOTH_SLAVE;
}
 
test();
return mode == bt_mode;
}
 
 
//--------------------------------------------------------------
uint16_t bt_receive(void *data, uint8_t length, uint16_t timeout_ms)
{
uint8_t rec_length = 0;
uint8_t i = 0;
 
// while_timeout(true, timeout_ms);
for(uint16_t __timeout = 0; __timeout++ <= true && (timeout_ms); _delay_ms(true ? 1 : 0))
{
if (i == length)
return true;
 
uart_receive();
 
if (fifo_is_empty(&in_fifo))
continue;
 
if (update_comm_mode(0) != BT_DATA)
{
#ifdef DEBUG
debug_pgm(PSTR("not connected"));
#endif
return false;
}
// We have a connection
if (timeout_ms == 0)
timeout_ms += 2000;
 
if (fifo_is_empty(&in_fifo))
continue;
 
// Find starting point of packet
if (!rec_length)
{
fifo_read(&in_fifo, (char *)&rec_length);
 
if (rec_length != length)
{
rec_length = 0;
}
else
{
// You've got mail!
timeout_ms += 2000;
}
}
else
{
fifo_read(&in_fifo, (char *)data + i);
i++;
}
}
return false;
}
 
#endif
 
#ifndef SaveMem
 
 
//--------------------------------------------------------------
uint16_t bt_send(void *data, const uint8_t length)
{
if (update_comm_mode(0) == BT_CMD)
return false;
 
uart_send((const char *)&length, 1);
uart_send((char *)data, length);
return (update_comm_mode(0) == BT_DATA);
}
 
 
#ifdef SQUIRREL
 
//--------------------------------------------------------------
uint16_t bt_connect(const char *address)
{
// Maybe we already disconnected???
if (BT_DATA == update_comm_mode(0))
{
#ifdef DEBUG
debug_pgm(PSTR("We are still connected..."));
#endif
return false;
}
test();
 
if (!send_cmd(BT_DISABLE_AUTOCONNECT, address))
return false;
 
test();
#ifdef DEBUG
debug_pgm (PSTR ("SET_ADD"));
#endif
 
if (!send_cmd(BT_SET_ADDRESS, address))
return false;
 
test();
#ifdef DEBUG
debug_pgm (PSTR ("CONNECT"));
#endif
 
if (!send_cmd(BT_CONNECT, NULL))
return false;
#ifdef DEBUG
debug_pgm (PSTR ("WAIT FOR COMM"));
#endif
return (BT_DATA == update_comm_mode(60000));
}
 
 
//--------------------------------------------------------------
uint16_t bt_disconnect(void)
{
/* Bluetooth reseten */
// set_bit(PORTC.DIR, 4);
// set_bit(PORTC.OUT, 4);
_delay_ms(500);
// clear_bit(PORTC.OUT, 4);
// return bt_init();
 
#if 1
if (BT_CMD == update_comm_mode(0))
{
fifo_clear(&in_fifo);
return true;
}
 
// Switch to online cmd mode
for (uint8_t i = 0; i < 4; i++)
{
const char plus = '+';
uart_send(&plus, 1);
_delay_ms(1500);
}
 
//comm_mode = BT_CMD;
 
if (!send_cmd(BT_DISCONNECT, NULL))
return false;
 
test();
if (!send_cmd(BT_CLEAR_ADDRESS, NULL))
return false;
test();
 
if (BT_CMD == update_comm_mode(10000))
{
fifo_clear(&in_fifo);
return true;
}
#ifdef DEBUG
debug_pgm(PSTR("Still in DATA??"));
#endif
return false;
#endif
}
 
 
//--------------------------------------------------------------
void copy_address(const char *src, char *dst)
{
uint8_t off = 0;
 
for (uint8_t i = 0; i < 14; i++)
{
if (src[i + off] == '-')
off++;
 
dst[i] = src[i + off];
}
}
 
 
//--------------------------------------------------------------
uint16_t bt_discover(char result[8][12])
 
// 14.8.2011 ist noch nicht getestet, wird für PKT auch nicht benötigt, Cebra
{
// update_callback(20);
test();
if (!bt_set_mode(BLUETOOTH_MASTER))
return false;
 
if (!send_cmd(BT_FIND_DEVICES, NULL))
return false;
 
char buffer[255]; //oversized, but who cares?
char *bufferhead = buffer;
uint8_t pos = 0;
uint16_t Timeout = 20000;
uint8_t pos1 = 0;
 
do
{
uart_receive();
Timeout--;
pos1++;
_delay_ms(1);
 
}
while ((Timeout > 0) ||(!fifo_strstr_pgm(&in_fifo, PSTR("Inquiry Results:\r\n"))));
 
// byte_to_hex(Timeout);
 
assert_pgm((!fifo_strstr_pgm(&in_fifo, PSTR("Inquiry Results:\r\n"))),PSTR("INQ Result false"));
 
info_pgm (PSTR ("Rec1"));
 
for (uint16_t i = 0; i < 60000; i++)
{
//if ((i % 1000) == 0)
//update_callback(40 + i / 1000);
uart_receive();
// lcd_printp(".", 0);
_delay_ms(1);
}
 
info_pgm (PSTR ("Rec2"));
 
//update_callback(100);
 
while (!fifo_is_empty(&in_fifo))
{
// Get next line
while (!fifo_cmp_pgm(&in_fifo, PSTR("\r\n")))
{
fifo_read(&in_fifo, bufferhead);
bufferhead++;
}
// terminate string
*bufferhead = 0;
 
//reset bufferhead
bufferhead = buffer;
 
if (strlen(buffer) == 0)
continue; //the empty line before end of inquiry
 
if (strstr_P(buffer, PSTR("Inquiry End")))
{
fifo_clear(&in_fifo);
test();
return true;
}
 
if (strncmp_P(PSTR("0012"), &buffer[21], 4))
{
copy_address(&buffer[21], result[pos]);
pos++;
}
}
 
return false;
}
 
#endif
#endif
#endif /* SQUIRREL */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/bluetooth.h
0,0 → 1,127
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _BLUETOOTH_H_
#define _BLUETOOTH_H_
 
#include <avr/io.h>
//#include <common.h>
 
 
#define SQUIRREL
#define NUTS_LIST 16
#define EXTENSIONS_LIST 16
 
//void InitBT(void);
 
typedef struct _device_info device_info;
 
// device info struct, holds mac , class and extensions + values of a device
struct _device_info
{
char mac[12];
 
uint8_t class;
uint8_t extension_types[EXTENSIONS_LIST];
uint16_t values_cache[EXTENSIONS_LIST];
};
 
extern device_info device_list[NUTS_LIST];
 
#define valid(num) (num < NUTS_LIST && (device_list[num].mac[0] != 0 || device_list[num].mac[1] != 0 || device_list[num].mac[2] != 0 || device_list[num].mac[3] != 0 || device_list[num].mac[4] != 0 || device_list[num].mac[5] != 0 || device_list[num].mac[6] != 0 || device_list[num].mac[7] != 0 || device_list[num].mac[8] != 0 || device_list[num].mac[9] != 0 || device_list[num].mac[10] != 0 || device_list[num].mac[11] != 0))
 
 
 
// Bluetooth mode ENUM
typedef enum
{
BLUETOOTH_MASTER, // < Master Mode (to create outgoinng connections).
BLUETOOTH_SLAVE // < Slave Mode (to wait for incoming connections).
} bt_mode_t;
 
 
// init bluetooth driver
// @return always true
//
//extern uint16_t bt_init (void (*upate_percentage) (uint16_t));
extern uint16_t bt_init (void);
 
// Set the Bluetooth mode
// @param mode bt_mode_t Bluetooth Mode ENUM (BLUETOOTH_MASTER or BLUETOOTH_SLAVE)
// @return true if mode change was succesful, false if not
//
extern uint16_t bt_set_mode (const bt_mode_t mode);
 
// recieve data over bluetooth
// @param data pointer to memory for data storage
// @param length value of length after call holds the actual recived data length
// @param timeout_ms timeout in ms after the recive function aborts and returns with false
// @return false if recived length > length parameter or it timeouted, true otherwise
//
extern uint16_t bt_receive (void * data, uint8_t length, uint16_t timeout_ms);
 
// send data over bluetooth
// @param data pointer to the data to send
// @param length length of the data to be send
// @return true if sendingn was successful, false otherwise
//
extern uint16_t bt_send (void * data, const uint8_t length);
 
// squirrelt only functions
#ifdef SQUIRREL
 
// open bluetoot connection (only one at a time possible)
// @param address connection is opened to this device mac address
// @return true if connection was established, false otherwise
//
extern uint16_t bt_connect (const char *address);
 
// closes bluetooth connection
// @return false if failed, true otherwise
//
extern uint16_t bt_disconnect (void);
 
// discover bluetooth devices
// @param result in a 2 dimensional array first index are devicecs (max 8) second is mac address string
// @param update_callback to inform of progress (in % from 0 to 100)
// @return true if successful, false if error occured
//
extern uint16_t bt_discover (char result[8][12]);
//extern uint16_t bt_discover (char result[8][12], void (*update_callback)(const uint16_t progress));
 
#endif // SQUIRREL
 
 
#endif
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/connect.c
0,0 → 1,381
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/pgmspace.h>
#include "lcd.h"
#include "timer.h"
#include "eeprom.h"
#include "messages.h"
 
#if defined HWVERSION1_3W || defined HWVERSION3_9
//--------------------------------------------------------------
void Change_Output(uint8_t UartMode) // Schaltet die Rx/Tx Richtungen
{
// hiermit werden die 74HTC125 (IC5) Gatter geschaltet
clr_USB2FC(); // PC2 aus
clr_USB2Wi(); // PB0 aus
clr_Uart02FC(); // PC6 aus
clr_Uart02Wi(); // PC5 aus
 
 
switch (UartMode)
{
case USB2FC:
UCSR1B &= ~(1<<RXEN1);
UCSR1B &= ~(1<<TXEN1);
UCSR1B &= ~(1<<RXCIE1);
 
DDRD &= ~(1<<DDD2); // Pins auf Eingang setzen
DDRD &= ~(1<<DDD3);
PORTD &= ~(1<<PD2); // Pullup aus
PORTD &= ~(1<<PD3);
 
set_USB2FC();
break;
 
case Uart02Wi:
set_Uart02Wi();
break;
 
case Uart02FC:
set_Uart02FC();
break;
 
case USB2Wi:
UCSR1B &= ~(1<<RXEN1);
UCSR1B &= ~(1<<TXEN1);
UCSR1B &= ~(1<<RXCIE1);
 
DDRD &= ~(1<<DDD2); // Pins auf Eingang setzen
DDRD &= ~(1<<DDD3);
PORTD &= ~(1<<PD2); // Pullup aus
PORTD &= ~(1<<PD3);
 
set_USB2Wi();
break;
}
 
}
 
 
//--------------------------------------------------------------
// Function: BT2FC()
// Purpose: Connect BT direct to FC-Kabel (SV2 as MKUSB)
// Returns:
//--------------------------------------------------------------
void Port_BT2FC(void)
{
lcd_cls ();
 
if(UseBT == true)
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" BT --> Kabel an FC "), 2);
lcd_puts_at(0, 1, strGet(CONNECT15), 0);
// lcd_printp_at (0, 3, PSTR("PC mit BT verb."), 0);
lcd_puts_at(0, 3, strGet(CONNECT16), 0);
// lcd_printp_at (0, 4, PSTR("PKT-Kabel an FC"), 0);
lcd_puts_at(0, 4, strGet(CONNECT17), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten"), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
set_BTOn();
 
Change_Output(USB2FC);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_USBOn();
return;
}
else
{
// lcd_printp_at (0, 0, PSTR("Es ist kein BTM-222 "), 0);
// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
lcd_puts_at(0, 1, strGet(CONNECT12), 0);
lcd_puts_at(0, 1, strGet(CONNECT13), 0);
lcd_puts_at(0, 2, strGet(CONNECT7), 0);
lcd_puts_at(0, 3, strGet(CONNECT8), 0);
lcd_puts_at(0, 4, strGet(CONNECT9), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
return;
}
}
 
 
//--------------------------------------------------------------
// Function: BT2Wi()
// Purpose: Connect BT direct to Wi.232
// Returns:
//--------------------------------------------------------------
void Port_BT2Wi(void)
{
 
lcd_cls ();
 
// if((UseBT == true) && (UseWi == true))6.1.2012 CB Abfrage entfernt, damit die Funktion auch ohne Module geht
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" BT --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT18), 2);
// lcd_printp_at (0, 3, PSTR("PC mit BT verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT16), 0);
// lcd_printp_at (0, 4, PSTR("Wi.232 an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT19), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
 
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
set_BTOn();
 
Change_Output(USB2Wi);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_USBOn();
return;
}
// else
// {
//// lcd_printp_at (0, 0, PSTR("Es ist kein BTM-222 "), 0);
//// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
//// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
//// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
//// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
//
// lcd_puts_at(0, 0, strGet(CONNECT12), 0);
// lcd_puts_at(0, 1, strGet(CONNECT13), 0);
// lcd_puts_at(0, 2, strGet(CONNECT7), 0);
// lcd_puts_at(0, 3, strGet(CONNECT8), 0);
// lcd_puts_at(0, 4, strGet(CONNECT9), 0);
// lcd_puts_at(12, 7, strGet(ENDE), 0);
//// lcd_printp_at (12, 7, PSTR("Ende"), 0);
//
// while(!get_key_press (1 << KEY_ESC));
// get_key_press(KEY_ALL);
//
// return;
// }
}
 
 
//--------------------------------------------------------------
// Function: FC2CFG_BT()
// Purpose: Connect FC (Tx1 Pin3, Rx1 Pin4) direct to BT
// Returns:
//--------------------------------------------------------------
void Port_FC2CFG_BT(void)
{
 
lcd_cls ();
lcd_printp_at (0, 0, PSTR("BTM-222 Konfigurieren"), 2);
lcd_printp_at (0, 1, PSTR("FC > MK-USB > BTM-222"), 2);
lcd_printp_at (0, 3, PSTR("MK-USB an PC anschl. "), 0);
lcd_printp_at (0, 4, PSTR("Zwischen MK-USB und "), 0);
lcd_printp_at (0, 5, PSTR("PKT ein gekreuztes "), 0);
lcd_printp_at (0, 6, PSTR("Kabel anschliessen. "), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
set_BTOn();
Change_Output(USB2FC);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_USBOn();
return;
}
 
 
//--------------------------------------------------------------
// Function: USB2FC()
// Purpose: Connect USB direct to FC-Kabel (SV2 as MKUSB)
// Returns:
//--------------------------------------------------------------
void Port_USB2FC(void)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Kabel an FC "), 2);
lcd_puts_at(0, 1, strGet(CONNECT20), 0);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
// lcd_printp_at (0, 4, PSTR("PKT-Kabel an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT17), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
Change_Output(USB2FC);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
 
//--------------------------------------------------------------
// Function: USB2Wi()
// Purpose: Connect USB direct to Wi.232
// Returns:
//--------------------------------------------------------------
void Port_USB2Wi(void)
{
 
lcd_cls ();
// if(UseWi == true) // 6.1.2012 CB Abfrage entfernt, damit die Funktion auch ohne Module geht
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT22), 2);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
// lcd_printp_at (0, 4, PSTR("Wi.232 an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT19), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
Change_Output(USB2Wi);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
// else
// {
//// lcd_printp_at (0, 0, PSTR("Es ist kein Wi.232 "), 0);
//// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
//// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
//// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
//// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
//// lcd_printp_at (12, 7, PSTR("Ende"), 0);
// lcd_puts_at(0, 0, strGet(CONNECT5), 0);
// lcd_puts_at(0, 1, strGet(CONNECT6), 0);
// lcd_puts_at(0, 2, strGet(CONNECT7), 0);
// lcd_puts_at(0, 3, strGet(CONNECT8), 0);
// lcd_puts_at(0, 4, strGet(CONNECT9), 0);
// lcd_puts_at(12, 7, strGet(ENDE), 0);
// while(!get_key_press (1 << KEY_ESC));
// get_key_press(KEY_ALL);
//
// return;
// }
}
 
//--------------------------------------------------------------
// Function: USB2CFG_Wi()
// Purpose: Connect USB direct to Wi.232 in Progmode
// Returns:
//--------------------------------------------------------------
void Port_USB2CFG_Wi(void)
{
 
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wi.232 Konfigurieren"), 2);
lcd_puts_at(0, 0, strGet(CONNECT24), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT22), 2);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden."), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
lcd_printp_at (0, 4, PSTR("Radiotronix Wi.232DTS"), 0);
lcd_printp_at (0, 5, PSTR("Evaluation (868MHz) "), 0);
// lcd_printp_at (0, 6, PSTR("Programm starten. "), 0);
lcd_puts_at(0, 6, strGet(CONNECT25), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
Change_Output(USB2Wi);
 
set_WI232CMD(); // Port D6 = CMD
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
clr_WI232CMD(); // Port D6 = CMD
 
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/connect.h
0,0 → 1,48
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _CONNECT_H
#define _CONNECT_H
 
void Change_Output(uint8_t UartMode);
 
void Port_BT2Wi(void);
void Port_BT2FC(void);
void Port_FC2CFG_BT(void);
 
void Port_USB2FC(void);
void Port_USB2Wi(void);
void Port_USB2CFG_Wi(void);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/cpu.h
0,0 → 1,41
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _CPU_H
#define _CPU_H
 
// Quarz Frequenz in Hz
#define F_CPU 20000000UL
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/debug.c
0,0 → 1,370
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <string.h>
 
#include "main.h"
//#include "menu.h"
#include "lcd.h"
#include "usart.h"
#include "debug.h"
#include "timer.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
#define TIMEOUT 200 // 2 sec
#define ANALOGTIME 20 // 200 ms
 
// WARNING: this work for NC & FC only
// if current_hardware == MK3MAG or MKGPS the access is outside of the array...
uint8_t AnalogNames[2][32][16 + 1]; // 32 names, 16 characters + 1 0x00
uint8_t AnalogNamesRead[2] = {0,0};
 
//--------------------------------------------------------------
//
void GetAnalogNames (void)
{
uint8_t i = AnalogNamesRead[current_hardware - 1];
uint8_t t = 0;
 
lcd_cls ();
lcd_printp_at (0, 3, PSTR("Reading"), 0);
lcd_printp_at (0, 4, PSTR("Analog Names: "), 0);
 
mode = 'A'; // read Names
_delay_ms(200);
rxd_buffer_locked = FALSE;
 
timer = ANALOGTIME;
 
while (i < 32)
{
SendOutData ('a', ADDRESS_ANY, 1, &i, 1);
while (!rxd_buffer_locked && timer);
if (timer)
{
Decode64 ();
if (i == *pRxData)
{
write_ndigit_number_u(14, 4, i, 2, 0);
memcpy (AnalogNames[current_hardware - 1][*pRxData], (uint8_t *) pRxData + 1, 16);
AnalogNames[current_hardware - 1][*pRxData][16] = 0;
i++;
t = 0;
}
else
{
_delay_ms (100);
}
 
timer = ANALOGTIME;
rxd_buffer_locked = FALSE;
}
else
{ // timeout occured
t++;
timer = ANALOGTIME;
 
if (t >= 50)
{
lcd_printp_at (0, 2, PSTR("ERROR: no data"), 0);
 
timer = 100;
while (timer > 0);
break;
}
}
}
 
AnalogNamesRead[current_hardware - 1] = i;
 
#if 0
if (timer)
{
for (page = 0; page < 5; page++)
{
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
}
while (!get_key_press (1 << KEY_ESC)); // ESC
get_key_press(KEY_ALL);
}
}
//return;
#endif
}
 
 
//--------------------------------------------------------------
//
void display_debug (void)
{
uint8_t i = 0;
uint8_t tmp_dat;
uint8_t page = 0;
 
DebugData_t *DebugData;
 
lcd_cls ();
 
timer = TIMEOUT;
 
if (AnalogNamesRead[current_hardware - 1] < 32)
{
GetAnalogNames ();
}
 
if (!timer)
{
return;
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
 
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
abo_timer = ABO_TIMEOUT;
 
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
 
do
{
if (rxd_buffer_locked)
{
Decode64 ();
DebugData = (DebugData_t *) pRxData;
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_write_number_u_at (5, 7, page + 1);
switch (current_hardware)
{
case FC:
lcd_printp_at (3, 7, PSTR("FC"), 0);
lcd_printp_at (19, 7, PSTR("NC"), 0);
break;
 
case NC:
lcd_printp_at (3, 7, PSTR("NC"), 0);
lcd_printp_at (19, 7, PSTR("FC"), 0);
break;
 
default:
lcd_printp_at (19, 7, PSTR("?"), 0);
break;
}
 
for (i = 0; i < 7; i++)
{
//lcd_print_at (0, i, AnalogNames[i + page * 7], 0);
uint8_t size =0;
if( DebugData->Analog[i + page * 7] < -9999)
{
size = 6;
}
else if ( DebugData->Analog[i + page * 7] < -999)
{
size = 5;
}
else if ( DebugData->Analog[i + page * 7] < -99)
{
size = 4;
}
else if ( DebugData->Analog[i + page * 7] < 999)
{
size = 3;
}
else if ( DebugData->Analog[i + page * 7] < 9999)
{
size = 4;
}
else
{
size = 5;
}
write_ndigit_number_s (21-size, i, DebugData->Analog[i + page * 7], size, 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
timer = TIMEOUT;
rxd_buffer_locked = FALSE;
}
 
if (!abo_timer)
{ // renew abo every 3 sec
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
abo_timer = ABO_TIMEOUT;
}
 
if (get_key_press (1 << KEY_MINUS))
{
page--;
if (page > 4)
{
page = 4;
}
lcd_cls ();
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
else if (get_key_press (1 << KEY_PLUS))
{
page++;
if (page > 4)
{
page = 0;
}
lcd_cls ();
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
if ((hardware == NC) && get_key_press (1 << KEY_ENTER))
{
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
_delay_ms (200);
 
if (current_hardware == NC)
{
SwitchToFC();
 
timer = TIMEOUT;
}
else
{
SwitchToNC();
 
timer = TIMEOUT;
}
 
_delay_ms (200);
 
if (AnalogNamesRead[current_hardware - 1] < 32)
{
GetAnalogNames ();
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
 
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
lcd_cls ();
page = 0;
 
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
}
while (!get_key_press (1 << KEY_ESC) && timer); // ESC
get_key_press(KEY_ALL);
 
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
if (!timer)
{ // timeout occured
lcd_cls ();
lcd_printp_at (0, 2, PSTR("ERROR: no data"), 0);
 
timer = 100;
while (timer > 0);
}
SwitchToNC();
}
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/debug.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _DEBUG_H
#define _DEBUG_H
 
extern uint8_t AnalogNamesRead[2];
 
void display_debug(void);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/display.c
0,0 → 1,180
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
 
#include "main.h"
#include "lcd.h"
#include "usart.h"
#include "timer.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
#define TIMEOUT 500 // 5 sec
 
 
void display_data (void)
{
uint8_t cmd;
uint8_t flag = 0;;
 
mode = 'H';
 
lcd_cls ();
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
if (current_hardware == NC)
{
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
}
else
{
if (hardware == FC)
{
lcd_printp_at (0, 0, PSTR(" Display "), 2);
lcd_printp_at (19, 7, PSTR(" "), 0);
}
else
{
lcd_printp_at (0, 0, PSTR(" Flight-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("NC"), 0);
}
}
 
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
cmd = 0xfc; // Home = first page
 
do
{
SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
cmd = 0xff;
//LED6_TOGGLE;
_delay_ms (250);
 
if (rxd_buffer_locked)
{
Decode64 ();
flag = 1;
 
if (!hardware)
{ // hardware was not detected at startup
hardware = rxd_buffer[1] - 'a';
if (hardware == NC)
{
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
current_hardware = NC;
}
else
{
lcd_printp_at (0, 0, PSTR(" Display "), 2);
lcd_printp_at (19, 7, PSTR(" "), 0);
current_hardware = FC;
}
}
 
#if 0
rxd_buffer[24] = 0;
 
lcd_print_at (0, rxd_buffer[3] + 1, (uint8_t *) &rxd_buffer[4], 0);
#else
rxd_buffer[83] = 0;
 
print_display_at (0, 2, (uint8_t *) &rxd_buffer[3]);
#endif
 
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
}
 
if (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
cmd = 0xfe; // next page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
else if (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
cmd = 0xfd; // previous page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
else if ((hardware == NC) && get_key_press (1 << KEY_ENTER))
{
if (current_hardware == NC)
{
SwitchToFC();
 
//timer = TIMEOUT;
lcd_printp_at (0, 0, PSTR(" Flight-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("NC"), 0);
}
else
{
SwitchToNC();
 
//timer = TIMEOUT;
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
}
cmd = 0xfc; // Home = first page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
}
while (!get_key_press (1 << KEY_ESC) && timer);
get_key_press(KEY_ALL);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
if (!timer)
{ // timeout occured
if (flag)
{
lcd_cls ();
}
lcd_printp_at (0, 2, PSTR("Fehler: Keine Daten"), 0);
 
timer = 100;
while (timer > 0);
}
SwitchToNC();
}
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/display.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _DISPLAY_H
#define _DISPLAY_H
 
void display_data (void);
 
#endif
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/eeprom.c
0,0 → 1,353
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <avr/eeprom.h>
#include <stdbool.h>
#include <avr/wdt.h>
#include "lcd.h"
#include "main.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "mk-data-structs.h"
#include "connect.h"
 
 
//--------------------------------------------------------------
//
 
uint8_t EE_LowBat EEMEM = 137; // 13,7V
uint8_t EE_DisplayTimeout EEMEM = 0; // Display immer an
uint8_t EE_DisplayLanguage EEMEM = 254; // Default ungesetzt
uint8_t EE_WiTXRXChannel EEMEM = 1; // Kanal 1 MK Standard
uint8_t EE_WiNetworkGroup EEMEM = 66; // Gruppe 66 MK Standard
uint8_t EE_WiNetworkMode EEMEM = NetMode_Normal; // MK Standard;
uint8_t EE_WiTXTO EEMEM = TWaitTime16; // MK Standard
uint8_t EE_WiUartMTU EEMEM = UartMTU64; // MK Standard
uint8_t EE_LCD_Orientation EEMEM = 0; // normale Ansicht
uint8_t EE_LCD_DisplayMode EEMEM = 0; // Normal
uint8_t EE_LCD_Kontrast EEMEM = 27; // Kontrast normal
uint8_t EE_LCD_Helligkeit EEMEM = 100; // Helligkeit in %gkeit in %
uint8_t EE_USBBT EEMEM = 0; // USB Betrieb
uint8_t EE_U02SV2 EEMEM = 1; // SV2 (Kabel) Standard
uint8_t EE_Debug EEMEM = 0; // kein Debug
uint8_t EE_UseWi EEMEM = true; // Wi.232 eingebaut?
uint8_t EE_UseBT EEMEM = true; // BT-222 eingebaut?
uint8_t EE_WiIsSet EEMEM = false; // Flag für die Initialisierung Wi232
uint8_t EE_BTIsSet EEMEM = false; // Flag für die Initialisierung Bluetooth
uint8_t EE_PKT_IdleBeep EEMEM = 0; // kein Piepsen bei Inaktivität
uint8_t EE_PKT_StartInfo EEMEM = true; // Startinformationen anzeigen
uint16_t EE_Lipo_UOffset EEMEM = 0; // Offset für die Lipospannugsmessung
uint8_t EE_PKT_Accutyp EEMEM = true; // True = Lipo, False = LiON
uint8_t EEMEM EE_BTPin[bt_pin_length + 1];
uint8_t EEMEM EE_BTName[bt_name_length + 1];
uint32_t EE_LastLongitude EEMEM = 0;
uint32_t EE_LastLatitude EEMEM = 0;
 
WPListDirectory EEWPDirectory[NumberOfWPLists] EEMEM;
WayPoints EEWayPointList[NumberOfWaypoints] EEMEM;
 
 
uint8_t EE_PKTVersion EEMEM = EEpromVersion;
 
 
volatile uint8_t DisplayTimeout;
volatile uint8_t DisplayLanguage;
volatile uint8_t WiTXRXChannel;
volatile uint8_t WiNetworkGroup;
volatile uint8_t WiNetworkMode;
volatile uint8_t WiTXTO;
volatile uint8_t WiUartMTU;
volatile uint8_t LCD_ORIENTATION;
volatile uint8_t LCD_DisplayMode;
volatile uint8_t LCD_Kontrast;
volatile uint8_t LCD_Helligkeit;
volatile uint8_t USBBT;
volatile uint8_t U02SV2;
volatile uint8_t Debug;
volatile uint8_t UseWi; // Wi232 wird genutzt
volatile uint8_t UseBT; // BT wird genutzt
volatile uint8_t WiIsSet; // Wi232 ist initialisiert
volatile uint8_t BTIsSet; // BT ist initialisiert
char bt_pin[bt_pin_length + 1]; // BT Pinnummer
char bt_name[bt_name_length + 1]; // BT Name
 
volatile uint32_t LastLongitude; // Letzte Position
volatile uint32_t LastLatitude;
volatile uint8_t PKT_IdleBeep;
volatile uint8_t PKT_StartInfo;
volatile uint16_t Lipo_UOffset; // Offset für die Lipospannugsmessung
volatile uint8_t PKT_Accutyp; // verwendeter Akkutyp
volatile WayPoints PKTWayPoint; // Waypointdaten für einen Waypoint
volatile WPListDirectory PKTWayPointDirectory; // Inhaltsverzeichnis der Listen
 
 
 
//--------------------------------------------------------------
//
void WriteWiInitFlag(void)
{
WiIsSet = true;
eeprom_write_byte(&EE_WiIsSet, WiIsSet);
 
}
 
 
//--------------------------------------------------------------
//
void WriteBTInitFlag(void)
{
BTIsSet = true;
eeprom_write_byte(&EE_BTIsSet, BTIsSet);
 
}
 
 
//--------------------------------------------------------------
//
void ReadLastPosition(void)
 
{
LastLongitude = eeprom_read_dword(&EE_LastLongitude);
LastLatitude = eeprom_read_dword(&EE_LastLatitude);
}
 
 
//--------------------------------------------------------------
//
void WriteLastPosition(uint32_t ELongitude,uint32_t ELatitude)
 
{
 
eeprom_write_dword(&EE_LastLongitude,ELongitude);
eeprom_write_dword(&EE_LastLatitude,ELatitude);
}
 
 
//--------------------------------------------------------------
//
void ReadParameter (void)
{
if (eeprom_read_byte(&EE_PKTVersion) == EEpromVersion)
 
{
MK_LowBat = eeprom_read_byte (&EE_LowBat);
DisplayTimeout = eeprom_read_byte (&EE_DisplayTimeout);
DisplayLanguage = eeprom_read_byte (&EE_DisplayLanguage);
WiTXRXChannel = eeprom_read_byte (&EE_WiTXRXChannel);
WiNetworkGroup = eeprom_read_byte (&EE_WiNetworkGroup);
WiNetworkMode = eeprom_read_byte (&EE_WiNetworkMode);
WiTXTO = eeprom_read_byte (&EE_WiTXTO);
WiUartMTU = eeprom_read_byte (&EE_WiUartMTU);
LCD_ORIENTATION = eeprom_read_byte (&EE_LCD_Orientation);
LCD_DisplayMode = eeprom_read_byte (&EE_LCD_DisplayMode);
LCD_Kontrast = eeprom_read_byte (&EE_LCD_Kontrast);
LCD_Helligkeit = eeprom_read_byte (&EE_LCD_Helligkeit);
USBBT = eeprom_read_byte (&EE_USBBT);
U02SV2 = eeprom_read_byte (&EE_U02SV2);
Debug = eeprom_read_byte (&EE_Debug);
UseWi = eeprom_read_byte (&EE_UseWi);
UseBT = eeprom_read_byte (&EE_UseBT);
WiIsSet = eeprom_read_byte (&EE_WiIsSet);
BTIsSet = eeprom_read_byte (&EE_BTIsSet);
PKT_IdleBeep = eeprom_read_byte (&EE_PKT_IdleBeep);
PKT_StartInfo = eeprom_read_byte (&EE_PKT_StartInfo);
Lipo_UOffset = eeprom_read_word (&EE_Lipo_UOffset);
PKT_Accutyp = eeprom_read_byte (&EE_PKT_Accutyp);
eeprom_read_block ((void*)&bt_pin, (const void*)&EE_BTPin, bt_pin_length);
eeprom_read_block ((void*)&bt_name, (const void*)&EE_BTName, bt_name_length);
LastLongitude = eeprom_read_dword (&EE_LastLongitude);
LastLatitude = eeprom_read_dword (&EE_LastLatitude);
}
 
else
Delete_EEPROM();
 
}
 
//--------------------------------------------------------------
void Delete_EEPROM(void)
{
// EEPROM auf Default setzen
 
lcd_cls();
lcd_printp_at (0, 0, PSTR(" EEPROM Parameter "), 2);
lcd_printp_at (0, 1, PSTR("werden auf"), 0);
lcd_printp_at (0, 2, PSTR("Standardwerte gesetzt"), 0);
 
MK_LowBat = 137; // 13,7V
DisplayTimeout = 0; // Display immer an
DisplayLanguage = 254; // default ungesetzt
WiTXRXChannel = 1; // Kanal 1 MK Standard
WiNetworkGroup = 66; // Gruppe 66 MK Standard
WiNetworkMode = NetMode_Normal; // MK Standard
WiTXTO = TWaitTime16; // MK Standard
WiUartMTU = UartMTU64; // MK Standard
LCD_ORIENTATION = 0; // normale Ansicht
LCD_DisplayMode = 0; // Normal
LCD_Kontrast = 20; // Kontrast normal
LCD_Helligkeit = 100; // Helligkeit in %
USBBT = 0; // USB Betrieb
U02SV2 = 0; // SV2 (Kabel) Standard
Debug = 0; // kein Debug
UseWi = true; // Wi.232 eingebaut?
UseBT = true; // BT-222 eingebaut?
WiIsSet = false; // Flag für die Initialisierung Wi232
BTIsSet = false; // Flag für die Initialisierung Bluetooth
PKT_IdleBeep = 0; // kein Piepsen bei Inaktivität
PKT_StartInfo = true; // Startnformationen anzeigen
PKT_Accutyp = true; // True = Lipo, False= LiON
Lipo_UOffset = 6000; // Offset für PKT-Lipomessung
 
 
strcpy_P(bt_pin, PSTR("1234"));
eeprom_write_block ((const void*)&bt_pin, (void*)&EE_BTPin, bt_pin_length);
 
strcpy_P(bt_name, PSTR("PKT Cebra ")); // Wenn Name kürzer als "bt_name_length" mit Leerzeichen auffüllen
eeprom_write_block ((const void*)&bt_name, (void*)&EE_BTName, bt_name_length);
 
eeprom_write_byte(&EE_WiIsSet,WiIsSet);
eeprom_write_byte(&EE_BTIsSet,BTIsSet);
eeprom_write_byte(&EE_PKTVersion,EEpromVersion);
 
WriteParameter();
 
// lcd_printp_at (0, 4, PSTR("Waypoints loeschen"), 0);
EEWayPointList_Clear();
 
lcd_printp_at (0, 6, PSTR("Neu Starten mit "), 0);
lcd_printp_at (18, 7, PSTR("OK"), 0);
BeepTime = 200;
BeepMuster = 0x0080;
 
while (!(get_key_short (1 << KEY_ENTER)));
_delay_ms(500);
#if defined HWVERSION3_9
clr_V_On();
#else
 
wdt_enable( WDTO_250MS );
while (1)
{;}
#endif
}
 
 
//--------------------------------------------------------------
//
void WriteParameter (void)
{
eeprom_write_byte (&EE_LowBat, MK_LowBat);
eeprom_write_byte (&EE_DisplayTimeout, DisplayTimeout);
eeprom_write_byte (&EE_DisplayLanguage, DisplayLanguage);
eeprom_write_byte (&EE_WiTXRXChannel, WiTXRXChannel);
eeprom_write_byte (&EE_WiNetworkGroup, WiNetworkGroup);
eeprom_write_byte (&EE_WiNetworkMode, WiNetworkMode);
eeprom_write_byte (&EE_WiTXTO, WiTXTO);
eeprom_write_byte (&EE_WiUartMTU, WiUartMTU);
eeprom_write_byte (&EE_LCD_Orientation, LCD_ORIENTATION);
eeprom_write_byte (&EE_LCD_DisplayMode, LCD_DisplayMode);
eeprom_write_byte (&EE_LCD_Kontrast, LCD_Kontrast);
eeprom_write_byte (&EE_LCD_Helligkeit, LCD_Helligkeit);
eeprom_write_byte (&EE_USBBT, USBBT);
eeprom_write_byte (&EE_U02SV2, U02SV2);
eeprom_write_byte (&EE_Debug, Debug);
eeprom_write_byte (&EE_UseWi, UseWi);
eeprom_write_byte (&EE_UseBT, UseBT);
eeprom_write_byte (&EE_WiIsSet, WiIsSet);
eeprom_write_byte (&EE_BTIsSet, BTIsSet);
eeprom_write_byte (&EE_PKT_IdleBeep, PKT_IdleBeep);
eeprom_write_byte (&EE_PKT_StartInfo, PKT_StartInfo);
eeprom_write_word (&EE_Lipo_UOffset,Lipo_UOffset);
eeprom_write_byte (&EE_PKT_Accutyp, PKT_Accutyp);
 
eeprom_write_block ((const void*)&bt_pin, (void*)&EE_BTPin, bt_pin_length);
eeprom_write_block ((const void*)&bt_name, (void*)&EE_BTName, bt_name_length);
 
}
 
 
 
 
//--------------------------------------------------------------
//
void EEWayPointList_Clear(void) // löschen der Waypointliste im EEProm
{
uint8_t i;
PKTWayPoint.Waypoint.Position.Latitude = 0;
PKTWayPoint.Waypoint.Position.Longitude = 0;
PKTWayPoint.Waypoint.Position.Altitude = 0;
PKTWayPoint.Waypoint.Heading = 361;
 
for(i = 0; i < MAX_WPLIST_LEN; i++)
{
PKTWayPointDirectory.WPList.WPDirectory[i] = 0;
}
 
for(i = 0; i < NumberOfWaypoints; i++)
{
lcd_printp (PSTR("."), 0);
eeprom_write_byte (&EEWayPointList[i].WPIndex, i);
eeprom_write_byte (&EEWayPointList[i].Waypoint.Position.Status, INVALID);
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Latitude, (void*)&EEWayPointList[i].Waypoint.Position.Latitude, sizeof(EEWayPointList[i].Waypoint.Position.Latitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Longitude, (void*)&EEWayPointList[i].Waypoint.Position.Longitude, sizeof(EEWayPointList[i].Waypoint.Position.Longitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Altitude, (void*)&EEWayPointList[i].Waypoint.Position.Altitude, sizeof(EEWayPointList[i].Waypoint.Position.Altitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Heading, (void*)&EEWayPointList[i].Waypoint.Heading, sizeof(EEWayPointList[i].Waypoint.Heading));
 
eeprom_write_byte (&EEWayPointList[i].Waypoint.ToleranceRadius, 0); // in meters, if the MK is within that range around the target, then the next target is triggered
eeprom_write_byte (&EEWayPointList[i].Waypoint.HoldTime, 0); // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
eeprom_write_byte (&EEWayPointList[i].Waypoint.Type, POINT_TYPE_INVALID);
eeprom_write_byte (&EEWayPointList[i].Waypoint.Event_Flag, 0); // future implementation
eeprom_write_byte (&EEWayPointList[i].Waypoint.AltitudeRate, 0); // no change of setpoint
}
 
for(i = 0; i < NumberOfWPLists; i++)
{
lcd_printp (PSTR("."), 0);
eeprom_write_byte (&EEWPDirectory[i].WPList.WPListnumber, i);
eeprom_write_byte (&EEWPDirectory[i].WPList.WPListAktiv, false);
eeprom_write_byte (&EEWPDirectory[i].WPList.POI_CAM_NICK_CTR, 0);
eeprom_write_byte (&EEWPDirectory[i].WPList.UsePOI, 0);
eeprom_write_block ((const void*)&PKTWayPointDirectory.WPList.WPDirectory, (void*)&EEWPDirectory[i].WPList.WPDirectory, sizeof(EEWPDirectory[i].WPList.WPDirectory));
 
}
lcd_printp (PSTR("\r\n"), 0);
 
}
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/eeprom.h
0,0 → 1,148
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _EEPROM_H
#define _EEPROM_H
 
#include <stdbool.h>
#include "mk-data-structs.h"
#include "connect.h"
 
 
 
 
//[General]
//FileVersion = 2
//NumberOfWaypoints = 15
//UsePOI = 0
//POI_CAM_NICK_CTRL = 0
 
//[POI]
//Altitude = 1
//Latitude = 46.7140763
//Longitude = 19.2507334
 
//[Waypoint1]
//Latitude = 46.7145686
//Longitude = 19.2515702
//Radius = 10
//Altitude = 15
//ClimbRate = 0
//DelayTime = 4
//WP_Event_Channel_Value = 96
//Heading = 180
 
 
#define EEpromVersion 0x58 //Summe aus Soft.vers. ohne erste Ziffer zB 3.5.5 = 55
 
#define NumberOfWaypoints 55 //Anzahl der Waypoints in der EEPromliste
#define NumberOfWPLists 5 //Anzahl WP Listen im PKT
#define bt_pin_length 4
#define bt_name_length 10
 
 
#define POINT_TYPE_INVALID 255
#define POINT_TYPE_WP 0
#define POINT_TYPE_POI 1
#define INVALID 0x00
#define MAX_WPLIST_LEN 31
 
 
 
 
 
typedef struct
{
uint8_t WPIndex; // Index in der EEpromliste
Point_t Waypoint; // Waypoint
} WayPoints;
 
typedef struct
{
uint8_t WPListnumber; // Nummer der WP Liste im PKT
uint8_t WPListAktiv; // Liste aktiv
uint8_t WPDirectory[31]; // Enthält die Indexe der Waypoints im EEPROM
uint8_t UsePOI;
uint8_t POI_CAM_NICK_CTR;
 
} WPListHeader;
 
typedef struct
{
WPListHeader WPList; // Waypointliste im PKT
} WPListDirectory;
 
 
 
 
 
 
void ReadParameter (void);
void WriteParameter (void);
void ReadLastPosition(void);
void WriteLastPosition(uint32_t ELongitude,uint32_t ELatitude);
void WriteWiInitFlag(void);
void WriteBTInitFlag(void);
void Delete_EEPROM(void);
void EEWayPointList_Clear(void); // l�schen der Waypointliste im EEProm
 
 
uint8_t MK_LowBat;
extern volatile uint8_t LCD_ORIENTATION;
extern volatile uint8_t LCD_DisplayMode;
extern volatile uint8_t LCD_Kontrast;
extern volatile uint8_t LCD_Helligkeit;
extern volatile uint8_t DisplayTimeout;
extern volatile uint8_t DisplayLanguage;
extern volatile uint8_t WiTXRXChannel;
extern volatile uint8_t WiNetworkGroup;
extern volatile uint8_t WiNetworkMode;
extern volatile uint8_t WiTXTO;
extern volatile uint8_t WiUartMTU;
extern volatile uint8_t USBBT;
extern volatile uint8_t U02SV2;
extern volatile uint8_t Debug;
extern volatile uint8_t UseWi; // Wi232 wird genutzt
extern volatile uint8_t UseBT; // BT wird genutzt
extern volatile uint8_t WiIsSet; // Wi232 ist initialisiert
extern volatile uint8_t BTIsSet; // BT ist initialisiert
extern char bt_pin[bt_pin_length + 1]; // BT Pinnummer
extern char bt_name[bt_name_length + 1]; // BT Name
extern volatile uint32_t LastLongitude;
extern volatile uint32_t LastLatitude;
extern volatile uint8_t PKT_IdleBeep;
extern volatile uint8_t PKT_StartInfo;
extern volatile uint16_t Lipo_UOffset; // Offset für die Lipospannugsmessung
extern volatile uint8_t PKT_Accutyp;
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/error.c
0,0 → 1,206
/*
___ ___ ___ ___ _____
/ /\ /__/\ / /\ /__/\ / /::\
/ /::\ | |::\ / /::\ \ \:\ / /:/\:\
/ /:/\:\ ___ ___ | |:|:\ / /:/\:\ \ \:\ / /:/ \:\
/ /:/~/::\ /__/\ / /\ __|__|:|\:\ / /:/ \:\ _____\__\:\ /__/:/ \__\:|
/__/:/ /:/\:\ \ \:\ / /:/ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\ \ \:\ / /:/
\ \:\/:/__\/ \ \:\ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/ \ \:\ /:/
\ \::/ \ \:\/:/ \ \:\ \ \:\ /:/ \ \:\ ~~~ \ \:\/:/
\ \:\ \ \::/ \ \:\ \ \:\/:/ \ \:\ \ \::/
\ \:\ \__\/ \ \:\ \ \::/ \ \:\ \__\/
\__\/ \__\/ \__\/ \__\/
___ ___ ___ ___ ___ ___
/ /\ / /\ /__/\ /__/\ / /\ /__/\
/ /:/ / /::\ | |::\ | |::\ / /::\ \ \:\
/ /:/ / /:/\:\ | |:|:\ | |:|:\ / /:/\:\ \ \:\
/ /:/ ___ / /:/ \:\ __|__|:|\:\ __|__|:|\:\ / /:/ \:\ _____\__\:\
/__/:/ / /\ /__/:/ \__\:\ /__/::::| \:\ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\
\ \:\ / /:/ \ \:\ / /:/ \ \:\~~\__\/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/
\ \:\ /:/ \ \:\ /:/ \ \:\ \ \:\ \ \:\ /:/ \ \:\ ~~~
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\ \ \:\/:/ \ \:\
\ \::/ \ \::/ \ \:\ \ \:\ \ \::/ \ \:\
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
 
 
**
* Error handling functions
*/
 
#include <stdbool.h>
//#include "ftdi.h"
 
#include <avr/pgmspace.h>
#include "error_driver.h"
 
//--------------------------------------------------------------
inline void _send_msg(const char *msg)
{
for (uint8_t i=0; i<255 && msg[i]!='\0'; i++)
{
error_driver_write_c(msg[i]);
}
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void send_pgm(const prog_char *msg)
{
uint8_t myByte;
myByte = pgm_read_byte(msg);
for(int i = 1; myByte != '\0'; i++)
{
error_driver_write_c(myByte);
myByte = pgm_read_byte(msg+i);
}
}
 
#ifdef DEBUG
 
 
//--------------------------------------------------------------
void error_init(void)
{
error_driver_Init();
}
 
 
//--------------------------------------------------------------
void error_putc(const char c)
{
error_driver_write_c(c);
}
 
 
//--------------------------------------------------------------
void assert (bool condition, const char *msg)
{
if (!condition)
{
send_pgm(PSTR("ASS:"));
_send_msg(msg);
}
}
 
 
//--------------------------------------------------------------
void info (const char *msg)
{
send_pgm(PSTR("INF:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void warn (const char *msg)
{
send_pgm(PSTR("WARN:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void debug (const char *msg)
{
send_pgm(PSTR("DBG:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void Error (const char *msg)
{
send_pgm(PSTR("ERR:"));
_send_msg(msg);
}
#endif
 
#ifdef DEBUG
 
//--------------------------------------------------------------
void assert_pgm(bool condition, const prog_char *msg)
{
if (condition) {
send_pgm(PSTR("ASS:"));
send_pgm(msg);
error_driver_write_c('\n');
}
}
 
 
//--------------------------------------------------------------
void info_pgm(const prog_char *msg)
{
send_pgm(PSTR("INF:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void warn_pgm(const prog_char *msg)
{
send_pgm(PSTR("WARN:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void error_pgm(const prog_char *msg)
{
send_pgm(PSTR("ERR:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void debug_pgm(const prog_char *msg)
{
send_pgm(PSTR("DBG:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void print_hex(uint8_t num)
{
if (num<10)
error_putc(num+48);
else
{
switch (num)
{
case 10:
error_putc('A'); break;
case 11:
error_putc('B'); break;
case 12:
error_putc('C'); break;
case 13:
error_putc('D'); break;
case 14:
error_putc('E'); break;
case 15:
error_putc('F'); break;
default:
error_putc('#'); break;
}
}
}
 
 
//--------------------------------------------------------------
void byte_to_hex(uint8_t byte)
{
uint8_t b2 = (byte & 0x0F);
uint8_t b1 = ((byte & 0xF0)>>4);
print_hex(b1);
print_hex(b2);
}
 
#endif
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/error.h
0,0 → 1,75
/*
___ ___ ___ ___ _____
/ /\ /__/\ / /\ /__/\ / /::\
/ /::\ | |::\ / /::\ \ \:\ / /:/\:\
/ /:/\:\ ___ ___ | |:|:\ / /:/\:\ \ \:\ / /:/ \:\
/ /:/~/::\ /__/\ / /\ __|__|:|\:\ / /:/ \:\ _____\__\:\ /__/:/ \__\:|
/__/:/ /:/\:\ \ \:\ / /:/ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\ \ \:\ / /:/
\ \:\/:/__\/ \ \:\ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/ \ \:\ /:/
\ \::/ \ \:\/:/ \ \:\ \ \:\ /:/ \ \:\ ~~~ \ \:\/:/
\ \:\ \ \::/ \ \:\ \ \:\/:/ \ \:\ \ \::/
\ \:\ \__\/ \ \:\ \ \::/ \ \:\ \__\/
\__\/ \__\/ \__\/ \__\/
___ ___ ___ ___ ___ ___
/ /\ / /\ /__/\ /__/\ / /\ /__/\
/ /:/ / /::\ | |::\ | |::\ / /::\ \ \:\
/ /:/ / /:/\:\ | |:|:\ | |:|:\ / /:/\:\ \ \:\
/ /:/ ___ / /:/ \:\ __|__|:|\:\ __|__|:|\:\ / /:/ \:\ _____\__\:\
/__/:/ / /\ /__/:/ \__\:\ /__/::::| \:\ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\
\ \:\ / /:/ \ \:\ / /:/ \ \:\~~\__\/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/
\ \:\ /:/ \ \:\ /:/ \ \:\ \ \:\ \ \:\ /:/ \ \:\ ~~~
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\ \ \:\/:/ \ \:\
\ \::/ \ \::/ \ \:\ \ \:\ \ \::/ \ \:\
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
 
 
*
* Error handling functions.
*/
 
#ifndef __ERROR__
#define __ERROR__
 
#include <avr/pgmspace.h>
#include <stdbool.h>
#include "main.h"
 
 
void error_init(void);
 
void error_putc(const char c);
 
void assert (bool condition, const char *msg);
void info (const char *msg);
void warn(const char *msg);
void debug(const char *msg);
void Error(const char *msg);
 
void assert_pgm(bool condition, const prog_char *msg);
void info_pgm (const prog_char *msg);
void warn_pgm(const prog_char *msg);
void debug_pgm(const prog_char *msg);
void error_pgm(const prog_char *msg);
 
void byte_to_hex(uint8_t byte);
 
#else
 
#define error_init() {}
 
 
#define error_putc(c) {}
 
#define assert(cond, msg) {}
#define info(msg) {}
#define warn(msg) {}
#define debug(msg) {}
#define error(msg) {}
 
#define assert_pgm(cond, msg) {}
#define info_pgm(msg) {}
#define warn_pgm(msg) {}
#define debug_pgm(msg) {}
#define error_pgm(msg) {}
#define byte_to_hex(byte) {}
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/error_driver.c
0,0 → 1,21
#include "cpu.h"
#include "error_driver.h"
#include "main.h"
 
#ifdef DEBUG
 
#include "usart.h"
#include "uart1.h"
 
 
void error_driver_write_c(uint8_t c)
{
USART_putc(c);
}
 
void error_driver_Init(void)
{
// USART_Init(UART_BAUD_SELECT(USART_BAUD,F_CPU));
}
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/error_driver.h
0,0 → 1,22
/*
* Functions to write error message to FTDI or USART
*/
 
#ifndef __ERROR_DRIVER__
#define __ERROR_DRIVER__
 
#include <avr/io.h>
#include "main.h"
 
 
 
#ifdef DEBUG
extern void error_driver_write_c(uint8_t c);
extern void error_driver_Init(void);
#else
#define error_driver_write_c(c) {}
#define error_driver_init() {}
#endif
 
 
#endif //__ERROR_DRIVER__
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/fifo.c
0,0 → 1,114
/**
* a simple Fifo
* @file fifo.c
* @author Pascal Schnurr
*/
 
#include "fifo.h"
 
//--------------------------------------------------------------
void fifo_init (fifo_t * fifo, uint8_t * buffer, uint16_t size)
{
fifo->size = size;
fifo->buffer = buffer;
fifo->head = 0;
fifo->count = 0;
}
 
//--------------------------------------------------------------
bool fifo_is_empty (const fifo_t * fifo)
{
return (fifo->count == 0);
}
 
//--------------------------------------------------------------
bool fifo_is_full (const fifo_t * fifo)
{
return (fifo->size - fifo->count == 0);
}
 
//--------------------------------------------------------------
bool fifo_read (fifo_t * fifo, char *data)
{
if (fifo_is_empty (fifo))
return false;
 
uint8_t *head = fifo->buffer + fifo->head;
 
*data = (char) * head;
 
fifo->head = ( (fifo->head + 1) % fifo->size);
 
fifo->count--;
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_write (fifo_t * fifo, const char data)
{
if (fifo_is_full (fifo))
return false;
 
uint8_t *end = fifo->buffer + ( (fifo->head + fifo->count) % fifo->size);
 
*end = (uint8_t) data;
 
fifo->count++;
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_clear (fifo_t * fifo)
{
fifo->count = 0;
fifo->head = 0;
return true;
}
 
//--------------------------------------------------------------
static bool fifo_cmp_pgm_at (fifo_t * fifo, const prog_char * pgm, const uint16_t index)
{
uint16_t i;
uint8_t fifo_byte;
uint8_t pgm_byte;
 
for (i = 0; pgm_read_byte (pgm + i) != 0; i++)
{
if (fifo->count <= (i + index))
return false;
 
pgm_byte = pgm_read_byte (pgm + i);
 
fifo_byte = * (fifo->buffer + ( (fifo->head + i + index) % fifo->size));
 
if (fifo_byte != pgm_byte)
return false;
}
 
// We found the string, lets move the pointer
fifo->head = ( (fifo->head + i + index) % fifo->size);
 
fifo->count -= (i + index);
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_cmp_pgm (fifo_t * fifo, const prog_char * pgm)
{
return fifo_cmp_pgm_at (fifo, pgm, 0);
}
 
//--------------------------------------------------------------
bool fifo_strstr_pgm (fifo_t * fifo, const prog_char * pgm)
{
for (uint16_t i = 0; i < fifo->count; i++)
{
if (fifo_cmp_pgm_at (fifo, pgm, i))
return true;
}
 
return false;
}
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/fifo.h
0,0 → 1,83
/**
* a simple Fifo
* @file fifo.h
* @author Pascal Schnurr
*/
 
#include <avr/pgmspace.h>
#include <stdbool.h>
#ifndef _FIFO_H_
#define _FIFO_H_
 
/**
*fifo data structure all vital fifo information
*/
typedef struct
{
uint16_t count; /**< current number of elements */
uint16_t head; /**< position of the head element */
uint16_t size; /**< size equals max number of entrys*/
uint8_t* buffer; /**< pointer to memory area where the fifo is to be saved */
} fifo_t;
 
 
/** \brief initialize of a fifo
* sets all the information in your given fifo structure
* @param fifo pointer to an allocated fifo_t structure
* @param buffer pointer to an a allocated memory space for the fifo of size = sizeof(uint8_t) * size
* @param size max number of entrys the fifo will hold
*/
void fifo_init (fifo_t *fifo, uint8_t *buffer, uint16_t size);
 
/** \brief checks if fifo is empty
* @param fifo pointer to your initialized fifo_t structure
* @return true if empty otherwise false
*/
bool fifo_is_empty (const fifo_t *fifo);
 
/** \brief checks if fifo is full
* @param fifo pointer to your initialized fifo_t structure
* @return true if full otherwise false
*/
bool fifo_is_full (const fifo_t *fifo);
 
/** \brief clears the fifo
* resets your fifo structure to 0 elements
* @param fifo pointer to your initialized fifo_t structure
* @return always true (never fails)
*/
bool fifo_clear (fifo_t *fifo);
 
/** \brief reads head of fifo
* reads the first element and removes it
* @param fifo pointer to your initialized fifo_t structure
* @return false if fifo is empty false otherwise
*/
bool fifo_read (fifo_t *fifo, char *data);
 
/** \brief inserts a char into the fifo
* adds a char to the end of the fifo
* @param fifo pointer to your initialized fifo_t structure
* @param data the char data to be inserted
* @return false if fifo is full true otherwise
*/
bool fifo_write (fifo_t *fifo, const char data);
 
/** \brief compares first elements with prog_char string
* if pgm equals the first elements of the fifo these elements are removed
* @param fifo pointer to your initialized fifo_t structure
* @param pgm a prog_char string for comparison
* @return true if pgm is equal to the first entrys in the fifo, false otherwise
*/
bool fifo_cmp_pgm (fifo_t* fifo, const prog_char* pgm);
 
/** \brief searches a string in the whole fifo
* starts at the beginning and searches for the pgm string in the fifo,
* if they are found previous entrys and the string are removed from the fifo
* @param fifo pointer to your initialized fifo_t structure
* @param pgm a prog_char with the search string
* @return true if found, false otherwise
*/
bool fifo_strstr_pgm (fifo_t *fifo, const prog_char *pgm);
 
#endif /* _FIFO_H_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/font8x6.c
0,0 → 1,171
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - font provided by Claas Anders "CaScAdE" Rathje *
* - umlauts and special characters by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#include <avr/pgmspace.h>
 
// one byte is a column
// bit 7 is the bottom
//
// 123456
// L 1 | XXX |
// O 2 |X X |
// W 4 |X X |
// 8 | XXX |
// H 1 |X X |
// I 2 |X X |
// G 4 | XXX |
// H 8 | |
//
// 0x36,0x49,0x49,0x49,0x36,0x00
//
 
prog_uint8_t font8x6[128][6] =
{
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 0 00 (not useable)
{ 0x78,0x15,0x14,0x15,0x78,0x00 }, // ASCII - 1 01 'Ä'
{ 0x20,0x55,0x54,0x55,0x78,0x00 }, // ASCII - 2 02 'ä'
{ 0x38,0x45,0x44,0x45,0x38,0x00 }, // ASCII - 3 03 'Ö'
{ 0x30,0x49,0x48,0x49,0x30,0x00 }, // ASCII - 4 04 'ö'
{ 0x3c,0x41,0x40,0x41,0x3c,0x00 }, // ASCII - 5 05 'Ü'
{ 0x38,0x41,0x40,0x21,0x78,0x00 }, // ASCII - 6 06 'ü'
{ 0x7e,0x15,0x15,0x15,0x0a,0x00 }, // ASCII - 7 07 'ß'
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 8 08
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 9 09
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 10 0A (not useable)
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 11 0B
{ 0x10,0x38,0x54,0x10,0x10,0x1e }, // ASCII - 12 0C Enter Symbol
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 13 0D (not useable)
{ 0x10,0x10,0x10,0x10,0x10,0x10 }, // ASCII - 14 0E hor. line
{ 0x10,0x10,0x10,0x7c,0x10,0x10 }, // ASCII - 15 0F hor. line with tick mark
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 16 10
{ 0x08,0x14,0x00,0x00,0x14,0x08 }, // ASCII - 17 11 <> Change
{ 0x10,0x08,0x04,0x04,0x08,0x10 }, // ASCII - 18 12 /\ Up
{ 0x08,0x10,0x20,0x20,0x10,0x08 }, // ASCII - 19 13 \/ Down
{ 0x00,0x08,0x14,0x22,0x41,0x00 }, // ASCII - 20 14 < Left
{ 0x00,0x41,0x22,0x14,0x08,0x00 }, // ASCII - 21 15 > Right
{ 0x04,0x02,0x7f,0x02,0x04,0x00 }, // ASCII - 22 16 /|\ Arrow up
{ 0x10,0x20,0x7f,0x20,0x10,0x00 }, // ASCII - 23 17 \|/ Arrow down
{ 0x10,0x38,0x54,0x10,0x10,0x10 }, // ASCII - 24 18 <- Arrow left
{ 0x10,0x10,0x10,0x54,0x38,0x10 }, // ASCII - 25 19 -> Arrow right
{ 0x10,0x18,0x1c,0x1c,0x18,0x10 }, // ASCII - 26 1A ^ Triangle up
{ 0x08,0x18,0x38,0x38,0x18,0x08 }, // ASCII - 27 1B v Triangle down
{ 0x00,0x08,0x1c,0x3e,0x7f,0x00 }, // ASCII - 28 1C < Triangle left
{ 0x00,0x7f,0x3e,0x1c,0x08,0x00 }, // ASCII - 29 1D > Triangle right
{ 0x06,0x09,0x09,0x09,0x06,0x00 }, // ASCII - 30 1E '°'
{ 0x06,0x49,0x7d,0x49,0x06,0x00 }, // ASCII - 31 1F Antenne
 
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 32 20 ' '
{ 0x00,0x00,0x2f,0x00,0x00,0x00 }, // ASCII - 33 21 '!'
{ 0x00,0x07,0x00,0x07,0x00,0x00 }, // ASCII - 34 22 '"'
{ 0x14,0x7f,0x14,0x7f,0x14,0x00 }, // ASCII - 35 23 '#'
{ 0x24,0x2a,0x6b,0x2a,0x12,0x00 }, // ASCII - 36 24 '$'
{ 0x23,0x13,0x08,0x64,0x62,0x00 }, // ASCII - 37 25 '%'
{ 0x36,0x49,0x55,0x22,0x50,0x00 }, // ASCII - 38 26 '&'
{ 0x00,0x05,0x03,0x00,0x00,0x00 }, // ASCII - 39 27 '''
{ 0x00,0x1c,0x22,0x41,0x00,0x00 }, // ASCII - 40 28 '('
{ 0x00,0x41,0x22,0x1c,0x00,0x00 }, // ASCII - 41 29 ')'
{ 0x14,0x08,0x3e,0x08,0x14,0x00 }, // ASCII - 42 2a '*'
{ 0x08,0x08,0x3e,0x08,0x08,0x00 }, // ASCII - 43 2b '+'
{ 0x00,0x50,0x30,0x00,0x00,0x00 }, // ASCII - 44 2c ','
{ 0x08,0x08,0x08,0x08,0x08,0x00 }, // ASCII - 45 2d '-'
{ 0x00,0x60,0x60,0x00,0x00,0x00 }, // ASCII - 46 2e '.'
{ 0x20,0x10,0x08,0x04,0x02,0x00 }, // ASCII - 47 2f '/'
{ 0x3e,0x51,0x49,0x45,0x3e,0x00 }, // ASCII - 48 30 '0'
{ 0x00,0x42,0x7f,0x40,0x00,0x00 }, // ASCII - 49 31 '1'
{ 0x42,0x61,0x51,0x49,0x46,0x00 }, // ASCII - 50 32 '2'
{ 0x21,0x41,0x45,0x4b,0x31,0x00 }, // ASCII - 51 33 '3'
{ 0x18,0x14,0x12,0x7f,0x10,0x00 }, // ASCII - 52 34 '4'
{ 0x27,0x45,0x45,0x45,0x39,0x00 }, // ASCII - 53 35 '5'
{ 0x3c,0x4a,0x49,0x49,0x30,0x00 }, // ASCII - 54 36 '6'
{ 0x03,0x01,0x71,0x09,0x07,0x00 }, // ASCII - 55 37 '7'
{ 0x36,0x49,0x49,0x49,0x36,0x00 }, // ASCII - 56 38 '8'
{ 0x06,0x49,0x49,0x29,0x1e,0x00 }, // ASCII - 57 39 '9'
{ 0x00,0x36,0x36,0x00,0x00,0x00 }, // ASCII - 58 3a ':'
{ 0x00,0x56,0x36,0x00,0x00,0x00 }, // ASCII - 59 3b ';'
{ 0x08,0x14,0x22,0x41,0x00,0x00 }, // ASCII - 60 3c '<'
{ 0x14,0x14,0x14,0x14,0x14,0x00 }, // ASCII - 61 3d '='
{ 0x00,0x41,0x22,0x14,0x08,0x00 }, // ASCII - 62 3e '>'
{ 0x02,0x01,0x51,0x09,0x06,0x00 }, // ASCII - 63 3f '?'
{ 0x32,0x49,0x79,0x41,0x3e,0x00 }, // ASCII - 64 40 '@'
{ 0x7e,0x11,0x11,0x11,0x7e,0x00 }, // ASCII - 65 41 'A'
{ 0x7f,0x49,0x49,0x49,0x36,0x00 }, // ASCII - 66 42 'B'
{ 0x3e,0x41,0x41,0x41,0x22,0x00 }, // ASCII - 67 43 'C'
{ 0x7f,0x41,0x41,0x22,0x1c,0x00 }, // ASCII - 68 44 'D'
{ 0x7f,0x49,0x49,0x49,0x41,0x00 }, // ASCII - 69 45 'E'
{ 0x7f,0x09,0x09,0x09,0x01,0x00 }, // ASCII - 70 46 'F'
{ 0x3e,0x41,0x49,0x49,0x7a,0x00 }, // ASCII - 71 47 'G'
{ 0x7f,0x08,0x08,0x08,0x7f,0x00 }, // ASCII - 72 48 'H'
{ 0x00,0x41,0x7f,0x41,0x00,0x00 }, // ASCII - 73 49 'I'
{ 0x20,0x40,0x41,0x3f,0x01,0x00 }, // ASCII - 74 4a 'J'
{ 0x7f,0x08,0x14,0x22,0x41,0x00 }, // ASCII - 75 4b 'K'
{ 0x7f,0x40,0x40,0x40,0x40,0x00 }, // ASCII - 76 4c 'L'
{ 0x7f,0x02,0x0c,0x02,0x7f,0x00 }, // ASCII - 77 4d 'M'
{ 0x7f,0x04,0x08,0x10,0x7f,0x00 }, // ASCII - 78 4e 'N'
{ 0x3e,0x41,0x41,0x41,0x3e,0x00 }, // ASCII - 79 4f 'O'
{ 0x7f,0x09,0x09,0x09,0x06,0x00 }, // ASCII - 80 50 'P'
{ 0x3e,0x41,0x51,0x21,0x5e,0x00 }, // ASCII - 81 51 'Q'
{ 0x7f,0x09,0x19,0x29,0x46,0x00 }, // ASCII - 82 52 'R'
{ 0x46,0x49,0x49,0x49,0x31,0x00 }, // ASCII - 83 53 'S'
{ 0x01,0x01,0x7f,0x01,0x01,0x00 }, // ASCII - 84 54 'T'
{ 0x3f,0x40,0x40,0x40,0x3f,0x00 }, // ASCII - 85 55 'U'
{ 0x1f,0x20,0x40,0x20,0x1f,0x00 }, // ASCII - 86 56 'V'
{ 0x3f,0x40,0x38,0x40,0x3f,0x00 }, // ASCII - 87 57 'W'
{ 0x63,0x14,0x08,0x14,0x63,0x00 }, // ASCII - 88 58 'X'
{ 0x07,0x08,0x70,0x08,0x07,0x00 }, // ASCII - 89 59 'Y'
{ 0x61,0x51,0x49,0x45,0x43,0x00 }, // ASCII - 90 5a 'Z'
{ 0x7f,0x41,0x41,0x00,0x00,0x00 }, // ASCII - 91 5b '['
{ 0x02,0x04,0x08,0x10,0x20,0x00 }, // ASCII - 92 5c '\'
{ 0x00,0x41,0x41,0x7f,0x00,0x00 }, // ASCII - 93 5d ']'
{ 0x04,0x02,0x01,0x02,0x04,0x00 }, // ASCII - 94 5e '^'
{ 0x40,0x40,0x40,0x40,0x40,0x00 }, // ASCII - 95 5f '_'
{ 0x00,0x01,0x02,0x04,0x00,0x00 }, // ASCII - 96 60 '`'
{ 0x20,0x54,0x54,0x54,0x78,0x00 }, // ASCII - 97 61 'a'
{ 0x7f,0x48,0x44,0x44,0x38,0x00 }, // ASCII - 98 62 'b'
{ 0x38,0x44,0x44,0x44,0x20,0x00 }, // ASCII - 99 63 'c'
{ 0x38,0x44,0x44,0x48,0x7f,0x00 }, // ASCII - 100 64 'd'
{ 0x38,0x54,0x54,0x54,0x18,0x00 }, // ASCII - 101 65 'e'
{ 0x08,0x7e,0x09,0x01,0x02,0x00 }, // ASCII - 102 66 'f'
{ 0x0c,0x52,0x52,0x52,0x3e,0x00 }, // ASCII - 103 67 'g'
{ 0x7f,0x08,0x04,0x04,0x78,0x00 }, // ASCII - 104 68 'h'
{ 0x00,0x44,0x7d,0x40,0x00,0x00 }, // ASCII - 105 69 'i'
{ 0x20,0x40,0x44,0x3d,0x00,0x00 }, // ASCII - 106 6a 'j'
{ 0x7f,0x10,0x28,0x44,0x00,0x00 }, // ASCII - 107 6b 'k'
{ 0x00,0x41,0x7f,0x40,0x00,0x00 }, // ASCII - 108 6c 'l'
{ 0x7c,0x04,0x18,0x04,0x78,0x00 }, // ASCII - 109 6d 'm'
{ 0x7c,0x08,0x04,0x04,0x78,0x00 }, // ASCII - 110 6e 'n'
{ 0x38,0x44,0x44,0x44,0x38,0x00 }, // ASCII - 111 6f 'o'
{ 0x7c,0x14,0x14,0x14,0x08,0x00 }, // ASCII - 112 70 'p'
{ 0x08,0x14,0x14,0x18,0x7c,0x00 }, // ASCII - 113 71 'q'
{ 0x7c,0x08,0x04,0x04,0x08,0x00 }, // ASCII - 114 72 'r'
{ 0x48,0x54,0x54,0x54,0x20,0x00 }, // ASCII - 115 73 's'
{ 0x04,0x3f,0x44,0x40,0x20,0x00 }, // ASCII - 116 74 't'
{ 0x3c,0x40,0x40,0x20,0x7c,0x00 }, // ASCII - 117 75 'u'
{ 0x1c,0x20,0x40,0x20,0x1c,0x00 }, // ASCII - 118 76 'v'
{ 0x3c,0x40,0x38,0x40,0x3c,0x00 }, // ASCII - 119 77 'w'
{ 0x44,0x28,0x10,0x28,0x44,0x00 }, // ASCII - 120 78 'x'
{ 0x0c,0x50,0x50,0x50,0x3c,0x00 }, // ASCII - 121 79 'y'
{ 0x44,0x64,0x54,0x4c,0x44,0x00 }, // ASCII - 122 7a 'z'
{ 0x00,0x08,0x36,0x41,0x00,0x00 }, // ASCII - 123 7b '{'
{ 0x00,0x00,0x7f,0x00,0x00,0x00 }, // ASCII - 124 7c '|'
{ 0x00,0x41,0x36,0x08,0x00,0x00 }, // ASCII - 125 7d '}'
{ 0x08,0x08,0x2a,0x1c,0x08,0x00 }, // ASCII - 126 7e ->
{ 0x08,0x1c,0x2a,0x08,0x08,0x00 }, // ASCII - 127 7f <-
};
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/font8x6.h
0,0 → 1,29
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - font provided by Claas Anders "CaScAdE" Rathje *
* - umlauts and special characters by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#ifndef _FONT8X6_H
#define _FONT8X6_H
 
#include <avr/pgmspace.h>
 
extern prog_uint8_t font8x6[128][6];
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/gps.c
0,0 → 1,364
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
 
#include "main.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
 
#define TIMEOUT 200 // 2 sec
 
uint8_t ck_a = 0;
uint8_t ck_b = 0;
uint8_t UBX_class = 0;
uint8_t UBX_id = 0;
uint8_t UBX_buffer[250];
uint8_t UBX_payload_counter = 0;
 
void checksum(uint8_t);
void UBX_process(void);
uint32_t join_4_bytes(uint8_t*);
 
uint8_t display_mode = 0;
 
 
//--------------------------------------------------------------
void gps(void)
{
lcd_cls();
display_mode = 2;
 
if (hardware == FC)
{
lcd_printp_at(0, 3, PSTR("Nur mit NC !"), 0);
timer = 100;
while (timer > 0);
return;
}
 
 
if(current_hardware != NC)
SwitchToNC();
 
SwitchToGPS();
 
uint8_t mode = 0;
 
// SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
timer = TIMEOUT;
uint8_t data = 0;
uint8_t length = 0;
uint8_t UBX_ck_a = 0;
do
{
// if (rxFlag == 1)
if (uart_getc_nb(&data))
{
//rxFlag = 0;
//data = rx_byte;
timer = TIMEOUT;
 
switch(mode)
{
case 0: // init 1
if(data == 0xB5)
{
UBX_payload_counter = 0;
UBX_id = 0;
UBX_class = 0;
ck_a = 0;
ck_b = 0;
mode++;
}
break;
 
case 1: // init 2
if(data == 0x62)
mode++;
else
mode = 0;
break;
 
case 2: //class
if(data != 1)
mode = 0;
else
{
checksum(data);
UBX_class = data;
mode++;
}
break;
 
case 3: // id
if((data != 48)&&(data != 6)&&(data != 18)&&(data != 2))
mode = 0;
else
{
UBX_id = data;
checksum(data);
mode++;
}
break;
 
case 4: // length lo
if(data > 250)
mode = 0;
else
{
checksum(data);
length = data;
mode++;
}
break;
 
case 5: // length hi
if(data != 0)
mode = 0;
else
{
checksum(data);
mode++;
}
break;
 
case 6: // length hi
length--;
UBX_buffer[UBX_payload_counter] = data;
checksum(data);
UBX_payload_counter++;
if(length==0)
{
mode++;
};
break;
 
case 7: // check lo
mode++;
UBX_ck_a = data;
break;
 
case 8: // check hi
mode=0;
if((UBX_ck_a == ck_a) && (data == ck_b))
UBX_process();
 
}
 
 
// write_ndigit_number_u (14, 0, data, 3, 0);
}
 
}
while (!get_key_press (1 << KEY_ESC) && timer);
get_key_press(KEY_ALL);
 
SwitchToNC();
 
 
}
 
 
//--------------------------------------------------------------
void UBX_process()
{
 
if ((get_key_press (1 << KEY_MINUS))||(display_mode == 2))
{
if (display_mode != 1)
{
lcd_cls();
lcd_printp_at (0,0, PSTR("Fix Type : "), 0);
lcd_printp_at (0,1, PSTR("Sat : "), 0);
lcd_printp_at (0,2, PSTR("Accuracy : "), 0);
lcd_printp_at (0,3, PSTR("PDOP : "), 0);
lcd_printp_at (0,4, PSTR("Speed : "), 0);
lcd_printp_at (0,5, PSTR("Long : "), 0);
lcd_printp_at (0,6, PSTR("Lat : "), 0);
lcd_printp_at (0,7, PSTR("Alt : "), 0);
}
display_mode = 1;
}
 
if((UBX_class == 1) && (UBX_id == 48)&&(display_mode == 0))
{
uint8_t channels = UBX_buffer[4];
 
uint8_t i = 0;
for(i = 0; i < channels; i++)
{
if (i > 15)
break;
 
uint8_t line;
uint8_t col;
 
if (i > 7)
{
line = i-7;
col = 11;
}
else
col = 0; line = i;
 
write_ndigit_number_u (col, line, UBX_buffer[9 + 12*i], 3, 0);
write_ndigit_number_u (col+4, line, UBX_buffer[12 + 12*i], 2, 0);
 
if((UBX_buffer[10 + 12*i] & 3) == 3)
lcd_printp_at (col+7,line, PSTR("O"), 0);
else if((UBX_buffer[10 + 12*i] & 1) == 1)
lcd_printp_at (col+7,line, PSTR("X"), 0);
else if(UBX_buffer[11 + 12*i] > 4)
lcd_printp_at (col+7,line, PSTR("x"), 0);
else if(UBX_buffer[11 + 12*i] > 1)
lcd_printp_at (col+7,line, PSTR("-"), 0);
else
lcd_printp_at (col+7,line, PSTR(" "), 0);
 
}
}
 
if(display_mode == 1)
{
if((UBX_class == 1) && (UBX_id == 6)) //SVINFO
{
switch (UBX_buffer[10])
{
case 4:
 
case 3:
lcd_printp_at (11,0, PSTR("3D"), 0);
break;
 
case 2:
lcd_printp_at (11,0, PSTR("2D"), 0);
break;
 
default:
lcd_printp_at (11,0, PSTR("no"), 0);
}
 
if((UBX_buffer[11] & 3) == 3)
lcd_printp_at (17,0, PSTR("D"), 0);
else
lcd_printp_at (17,0, PSTR(" "), 0);
 
if((UBX_buffer[11] & 1) == 1)
lcd_printp_at (14,0, PSTR("ok"), 0);
else
lcd_printp_at (14,0, PSTR(" "), 0);
 
lcd_write_number_u_at (11, 1, UBX_buffer[47]);
 
uint16_t acc = (uint16_t)join_4_bytes(&UBX_buffer[24]);
write_ndigit_number_u (11, 2, acc, 5, 0);
lcd_printp_at (17,2, PSTR("cm"), 0);
 
uint16_t pdop = UBX_buffer[44]+UBX_buffer[45]*255;
write_ndigit_number_u (11, 3, pdop/100, 2, 0);
lcd_printp_at (13,3, PSTR("."), 0);
write_ndigit_number_u (14, 3, (pdop % 100),2, 1);
}
 
if((UBX_class == 1) && (UBX_id == 18)) //VELNED
{
uint16_t speed = (uint16_t)((join_4_bytes(&UBX_buffer[20])*60*60)/100000);
write_ndigit_number_u (11, 4, speed, 3, 0);
lcd_printp_at (15,4, PSTR("km/h"), 0);
 
}
 
if((UBX_class == 1) && (UBX_id == 2)) //POSLLH
{
uint32_t lon = join_4_bytes(&UBX_buffer[4]);
write_ndigit_number_u (10, 5, (uint16_t)(lon/10000000), 2, 0);
lcd_printp_at (12,5, PSTR("."), 0);
write_ndigit_number_u (13, 5, (uint16_t)((lon/1000) % 10000), 4, 1);
write_ndigit_number_u (17, 5, (uint16_t)((lon/10) % 100), 2, 1);
 
uint32_t lat = join_4_bytes(&UBX_buffer[8]);
write_ndigit_number_u (10, 6, (uint16_t)(lat/10000000), 2, 0);
lcd_printp_at (12,6, PSTR("."), 0);
write_ndigit_number_u (13, 6, (uint16_t)((lat/1000) % 10000), 4, 1);
write_ndigit_number_u (17, 6, (uint16_t)((lat/10) % 100), 2, 1);
 
uint16_t height = (uint16_t)(join_4_bytes(&UBX_buffer[16])/1000);
write_ndigit_number_u (11, 7, height, 4, 0);
lcd_printp_at (16,7, PSTR("m"), 0);
 
}
}
}
 
 
//--------------------------------------------------------------
union long_union
{
uint32_t dword;
uint8_t byte[4];
} longUnion;
 
 
//--------------------------------------------------------------
union int_union
{
uint16_t dword;
uint8_t byte[2];
} intUnion;
 
 
//--------------------------------------------------------------
uint32_t join_4_bytes(uint8_t Buffer[])
{
longUnion.byte[0] = *Buffer;
longUnion.byte[1] = *(Buffer+1);
longUnion.byte[2] = *(Buffer+2);
longUnion.byte[3] = *(Buffer+3);
return (longUnion.dword);
}
 
 
//--------------------------------------------------------------
void checksum(uint8_t data)
{
ck_a += data;
ck_b += ck_a;
}
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/gps.h
0,0 → 1,40
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _GPS_H
#define _GPS_H
 
void gps (void);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/lcd.c
0,0 → 1,1370
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - original LCD control by Thomas "thkais" Kaiser *
* - special number formating routines taken from C-OSD *
* from Claas Anders "CaScAdE" Rathje *
* - some extension, ellipse and circ_line by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
#include "font8x6.h"
//#include "font8x8.h"
#include "eeprom.h"
#include "lcd.h"
#include "HAL_HW3_9.h"
 
 
#define DISP_W 128
#define DISP_H 64
 
#define DISP_BUFFER ((DISP_H * DISP_W) / 8)
#define LINE_BUFFER (((DISP_H/8) * DISP_W) / 8)
 
#define Jeti 0 // Jeti Routinen
 
volatile uint8_t display_buffer[DISP_BUFFER]; // Display-Puffer, weil nicht zurückgelesen werden kann
volatile uint8_t line_buffer[LINE_BUFFER]; // Zeilen-Puffer, weil nicht zurückgelesen werden kann
 
volatile uint16_t display_buffer_pointer; // Pointer auf das aktuell übertragene Byte
volatile uint8_t display_buffer_counter; // Hilfszähler zur Selektierung der Page
volatile uint8_t display_page_counter; // aktuelle Page-Nummer
volatile uint8_t display_mode; // Modus für State-Machine
volatile uint8_t LCD_ORIENTATION;
 
// DOG: 128 x 64 with 6x8 Font => 21 x 8
// MAX7456: 30 x 16
 
uint8_t lcd_xpos;
uint8_t lcd_ypos;
 
 
//-----------------------------------------------------------
void send_byte (uint8_t data)
{
clr_cs ();
SPDR = data;
while (!(SPSR & (1<<SPIF)));
//SPSR = SPSR;
set_cs ();
}
 
 
//-----------------------------------------------------------
// * Writes one command byte
// * cmd - the command byte
//
void lcd_command(uint8_t cmd)
{
// LCD_SELECT();
// LCD_CMD();
// spi_write(cmd);
// LCD_UNSELECT();
clr_cs ();
SPDR = cmd;
while (!(SPSR & (1<<SPIF)));
//SPSR = SPSR;
set_cs ();
}
 
 
//-----------------------------------------------------------
void lcd_cls (void)
{
uint16_t i, j;
 
// memset (display_buffer, 0, 1024);
for (i = 0; i < DISP_BUFFER; i++)
display_buffer[i] = 0x00;
for (i = 0; i < 8; i++)
{
clr_A0 ();
send_byte (0xB0 + i); //1011xxxx
send_byte (0x10); //00010000
// send_byte(0x04); //00000100 gedreht plus 4 Byte
// send_byte(0x00); //00000000
send_byte (LCD_ORIENTATION); //00000000
 
set_A0 ();
for (j = 0; j < 128; j++)
send_byte (0x00);
}
 
lcd_xpos = 0;
lcd_ypos = 0;
}
 
 
//-----------------------------------------------------------
void lcd_cls_line (uint8_t x, uint8_t y, uint8_t w)
{
uint8_t lcd_width;
uint8_t lcd_zpos;
uint8_t i;
uint8_t max = 21;
lcd_width = w;
lcd_xpos = x;
lcd_ypos = y;
 
if ((lcd_xpos + lcd_width) > max)
lcd_width = max - lcd_xpos;
 
lcd_zpos = lcd_xpos + lcd_width;
 
for (i = lcd_xpos; i < lcd_zpos; i++)
lcd_putc (i, lcd_ypos, 0x20, 0);
}
 
 
//-----------------------------------------------------------
void wait_1ms (void)
{
_delay_ms (1);
}
 
 
//-----------------------------------------------------------
void wait_ms (uint16_t time)
{
uint16_t i;
 
for (i = 0; i < time; i++)
wait_1ms ();
}
 
 
//-----------------------------------------------------------
void LCD_Init (uint8_t LCD_Mode) // LCD_Mode 0= Default Mode 1= EEPROM-Parameter)
{
lcd_xpos = 0;
lcd_ypos = 0;
 
// DDRB = 0xFF;
 
// SPI max. speed
// the DOGM128 lcd controller can work at 20 MHz
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << CPOL);
SPSR = (1 << SPI2X);
 
set_cs ();
clr_reset ();
wait_ms (10);
set_reset ();
 
clr_cs ();
clr_A0 ();
 
send_byte (0x40); //Display start line = 0
if (LCD_Mode == 1)
{
if (LCD_ORIENTATION == 0)
{
send_byte (0xA1); // A1 normal A0 reverse(original)
send_byte (0xC0); // C0 normal C8 reverse(original)
}
else
{
send_byte (0xA0); // A1 normal A0 reverse(original)
send_byte (0xC8); // C0 normal C8 reverse(original)
}
}
else
{
send_byte (0xA1); // A1 normal A0 reverse(original)
send_byte (0xC0); // C0 normal C8 reverse(original)
}
if (LCD_Mode == 1)
{
if (LCD_DisplayMode == 0)
send_byte (0xA6); //Display normal, not mirrored
else
send_byte (0xA7); //Display reverse, not mirrored
}
else
send_byte (0xA6);
 
 
send_byte (0xA2); //Set bias 1/9 (Duty 1/65)
send_byte (0x2F); //Booster, regulator and follower on
send_byte (0xF8); //Set internal booster to 4x
send_byte (0x00); //Set internal booster to 4x
send_byte (0x27); //resistor ratio set
 
if (LCD_Mode == 1)
{
send_byte (0x81); //Electronic volume register set
send_byte (LCD_Kontrast); //Electronic volume register set
}
else
{
send_byte (0x81);
send_byte (0x16);
}
 
send_byte (0xAC); //Cursor
send_byte (0x00); //No Cursor
send_byte (0xAF); //No indicator
 
if (LCD_Mode == 1)
{
// Helligkeit setzen
OCR2A = LCD_Helligkeit * 2.55;
}
else
{
OCR2A = 255;
}
 
lcd_cls ();
}
 
 
//-----------------------------------------------------------
void set_adress (uint16_t adress, uint8_t data)
{
uint8_t page;
uint8_t column;
 
page = adress >> 7;
 
clr_A0 ();
send_byte (0xB0 + page);
 
column = (adress & 0x7F) + LCD_ORIENTATION;
 
send_byte (0x10 + (column >> 4));
send_byte (column & 0x0F);
 
set_A0 ();
send_byte (data);
}
 
 
//-----------------------------------------------------------
void scroll (void)
{
uint16_t adress;
 
for (adress = 0; adress < 896; adress++)
{
display_buffer[adress] = display_buffer[adress + 128];
set_adress (adress, display_buffer[adress]);
}
 
for (adress = 896; adress < 1024; adress++)
{
display_buffer[adress] = 0;
set_adress (adress, 0);
}
}
 
 
//-----------------------------------------------------------
// sicher eine Zeile für die Statusanzeige
void copy_line (uint8_t y)
{
uint8_t i;
uint16_t adress;
 
adress = y * 128 + 0 * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6*21; i++)
{
line_buffer[i] = display_buffer[adress+i];
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
// holt gesicherte Zeile wieder zurück
void paste_line (uint8_t y)
{
uint8_t i;
uint16_t adress;
 
adress = y * 128 + 0 * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6*21; i++)
{
display_buffer[adress+i] =line_buffer[i];
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
void lcd_puts_at(uint8_t x, uint8_t y,const char *s, uint8_t mode )
{
while (*s)
{
lcd_putc(x, y, *s++, mode);
x++;
}
 
}/* lcd_puts */
 
 
//-----------------------------------------------------------
void lcd_putc (uint8_t x, uint8_t y, uint8_t c, uint8_t mode)
{
uint8_t ch;
uint8_t i;
uint16_t adress;
 
if (mode == 2)
lcd_frect ((x*6),(y*8),5,7,1); // invertierte Darstellung
 
switch (c)
{ // ISO 8859-1
 
case 0xc4: // Ä
c = 0x01;
break;
 
case 0xe4: // ä
c = 0x02;
break;
 
case 0xd6: // Ö
c = 0x03;
break;
 
case 0xf6: // ö
c = 0x04;
break;
 
case 0xdc: // Ü
c = 0x05;
break;
 
case 0xfc: // ü
c = 0x06;
break;
 
case 0xdf: // ß
//c = 0x07;
c = 0x1e; // ° (used by Jeti)
break;
}
 
c &= 0x7f;
 
adress = y * 128 + x * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6; i++)
{
ch = pgm_read_byte (&font8x6[0][0] + i + c * 6);
 
switch (mode)
{
 
case 0:
display_buffer[adress+i] = ch;
break;
 
case 1:
display_buffer[adress+i] |= ch;
break;
 
case 2:
display_buffer[adress+i] ^= ch;
break;
 
case 3:
display_buffer[adress+i] &= ch;
break;
 
case 4:
display_buffer[adress+i] &= ~ch;
break;
}
 
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
#if Jeti
//-----------------------------------------------------------
void lcd_putc_jeti (uint8_t x, uint8_t y, uint8_t c, uint8_t mode)
{
uint8_t ch;
uint8_t i;
uint16_t adress;
 
switch (c)
{
 
case 0x7e:
c = 0x1a; // ->
break;
 
case 0x7f:
c = 0x1b; // <-
break;
 
case 0xdf:
c = 0xf8; // °
break;
}
 
adress = y * 128 + x * 8;
adress &= 0x3FF;
 
for (i = 0; i < 8; i++)
{
ch = pgm_read_byte (&font8x8[0][0] + i + c * 8);
 
switch (mode)
{
 
case 0:
display_buffer[adress+i] = ch;
break;
 
case 1:
display_buffer[adress+i] |= ch;
break;
 
case 2:
display_buffer[adress+i] ^= ch;
break;
 
case 3:
display_buffer[adress+i] &= ch;
break;
 
case 4:
display_buffer[adress+i] &= ~ch;
break;
}
 
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
void lcd_printpj (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc_jeti (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 20)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpj_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printpj (text, mode);
}
#endif
 
 
//-----------------------------------------------------------
void new_line (void)
{
lcd_ypos++;
 
if (lcd_ypos > 7)
{
scroll ();
lcd_ypos = 7;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpns (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
// new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpns_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printpns (text, mode);
}
 
 
//-----------------------------------------------------------
void lcd_printp (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printp_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printp (text, mode);
}
 
 
//-----------------------------------------------------------
void lcd_print (uint8_t *text, uint8_t mode)
{
while (*text)
{
switch (*text)
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, *text, mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_print_at (uint8_t x, uint8_t y, uint8_t *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_print (text, mode);
}
 
 
//-----------------------------------------------------------
void print_display (uint8_t *text)
{
while (*text)
{
lcd_putc (lcd_xpos, lcd_ypos, *text, 0);
lcd_xpos++;
if (lcd_xpos >= 20)
{
lcd_xpos = 0;
new_line ();
}
text++;
}
}
 
 
//-----------------------------------------------------------
void print_display_at (uint8_t x, uint8_t y, uint8_t *text)
{
lcd_xpos = x;
lcd_ypos = y;
print_display (text);
}
 
 
//-----------------------------------------------------------
// + Plot (set one Pixel)
//-----------------------------------------------------------
// mode:
// 0=Clear, 1=Set, 2=XOR
void lcd_plot (uint8_t xpos, uint8_t ypos, uint8_t mode)
{
uint16_t adress;
uint8_t mask;
 
if ((xpos < DISP_W) && (ypos < DISP_H))
{
adress = (ypos / 8) * DISP_W + xpos; // adress = 0/8 * 128 + 0 = 0
mask = 1 << (ypos & 0x07); // mask = 1<<0 = 1
adress &= DISP_BUFFER - 1;
switch (mode)
{
 
case 0:
display_buffer[adress] &= ~mask;
break;
 
case 1:
display_buffer[adress] |= mask;
break;
 
case 2:
display_buffer[adress] ^= mask;
break;
}
set_adress (adress, display_buffer[adress]);
}
}
 
 
//-----------------------------------------------------------
// + Line (draws a line from x1,y1 to x2,y2
// + Based on Bresenham line-Algorithm
// + found in the internet, modified by thkais 2007
//-----------------------------------------------------------
 
void lcd_line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uint8_t mode)
{
int x, y, count, xs, ys, xm, ym;
 
x = (int) x1;
y = (int) y1;
xs = (int) x2 - (int) x1;
ys = (int) y2 - (int) y1;
if (xs < 0)
xm = -1;
else
if (xs > 0)
xm = 1;
else
xm = 0;
if (ys < 0)
ym = -1;
else
if (ys > 0)
ym = 1;
else
ym = 0;
if (xs < 0)
xs = -xs;
 
if (ys < 0)
ys = -ys;
 
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
 
if (xs > ys) // Flat Line <45 degrees
{
count = -(xs / 2);
while (x != x2)
{
count = count + ys;
x = x + xm;
if (count > 0)
{
y = y + ym;
count = count - xs;
}
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
}
}
else // Line >=45 degrees
{
count =- (ys / 2);
while (y != y2)
{
count = count + xs;
y = y + ym;
if (count > 0)
{
x = x + xm;
count = count - ys;
}
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
}
}
}
 
 
//-----------------------------------------------------------
// + Filled rectangle
// + x1, y1 = upper left corner
//-----------------------------------------------------------
 
void lcd_frect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode)
{
uint16_t x2, y2;
uint16_t i;
 
if (x1 >= DISP_W)
x1 = DISP_W - 1;
 
if (y1 >= DISP_H)
y1 = DISP_H - 1;
 
x2 = x1 + widthx;
y2 = y1 + widthy;
 
if (x2 > DISP_W)
x2 = DISP_W;
 
if (y2 > DISP_H)
y2 = DISP_H;
 
for (i = y1; i <= y2; i++)
{
lcd_line (x1, i, x2, i, mode);
}
}
 
 
//-----------------------------------------------------------
// + outline of rectangle
// + x1, y1 = upper left corner
//-----------------------------------------------------------
 
void lcd_rect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode)
{
uint16_t x2, y2;
 
if (x1 >= DISP_W)
x1 = DISP_W - 1;
if (y1 >= DISP_H)
y1 = DISP_H - 1;
x2 = x1 + widthx;
y2 = y1 + widthy;
 
if (x2 > DISP_W)
x2 = DISP_W;
 
if (y2 > DISP_H)
y2 = DISP_H;
 
lcd_line (x1, y1, x2, y1, mode);
lcd_line (x2, y1, x2, y2, mode);
lcd_line (x2, y2, x1, y2, mode);
lcd_line (x1, y2, x1, y1, mode);
}
 
 
//-----------------------------------------------------------
// + outline of a circle
// + Based on Bresenham-algorithm found in wikipedia
// + modified by thkais (2007)
//-----------------------------------------------------------
 
void lcd_circle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode)
{
int16_t f = 1 - radius;
int16_t ddF_x = 0;
int16_t ddF_y = -2 * radius;
int16_t x = 0;
int16_t y = radius;
 
lcd_plot (x0, y0 + radius, mode);
lcd_plot (x0, y0 - radius, mode);
lcd_plot (x0 + radius, y0, mode);
lcd_plot (x0 - radius, y0, mode);
 
while (x < y)
{
if (f >= 0)
{
y --;
ddF_y += 2;
f += ddF_y;
}
x ++;
ddF_x += 2;
f += ddF_x + 1;
 
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 - x, y0 + y, mode);
 
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 - y, mode);
 
lcd_plot (x0 + y, y0 + x, mode);
lcd_plot (x0 - y, y0 + x, mode);
 
lcd_plot (x0 + y, y0 - x, mode);
lcd_plot (x0 - y, y0 - x, mode);
}
}
 
 
//-----------------------------------------------------------
// + filled Circle
// + modified circle-algorithm thkais (2007)
//-----------------------------------------------------------
 
void lcd_fcircle (int16_t x0, int16_t y0, int16_t radius)
{
int16_t f = 1 - radius;
int16_t ddF_x = 0;
int16_t ddF_y = -2 * radius;
int16_t x = 0;
int16_t y = radius;
 
lcd_line (x0, y0 + radius, x0, y0 - radius, 1);
 
lcd_line (x0 + radius, y0, x0 - radius, y0, 1);
 
while (x < y)
{
if (f >= 0)
{
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x + 1;
 
lcd_line (x0 + x, y0 + y, x0 - x, y0 + y, 1);
lcd_line (x0 + x, y0 - y, x0 - x, y0 - y, 1);
lcd_line (x0 + y, y0 + x, x0 - y, y0 + x, 1);
lcd_line (x0 + y, y0 - x, x0 - y, y0 - x, 1);
}
}
 
 
//-----------------------------------------------------------
//
void lcd_circ_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode)
{
uint8_t xc, yc;
double deg_rad;
 
deg_rad = (deg * M_PI) / 180.0;
 
yc = y - (uint8_t) round (cos (deg_rad) * (double) r);
xc = x + (uint8_t) round (sin (deg_rad) * (double) r);
lcd_line (x, y, xc, yc, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ellipse_line (uint8_t x, uint8_t y, uint8_t rx, uint8_t ry, uint16_t deg, uint8_t mode)
{
uint8_t xc, yc;
double deg_rad;
 
deg_rad = (deg * M_PI) / 180.0;
 
yc = y - (uint8_t) round (cos (deg_rad) * (double) ry);
xc = x + (uint8_t) round (sin (deg_rad) * (double) rx);
lcd_line (x, y, xc, yc, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ellipse (int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint8_t mode)
{
const int16_t rx2 = rx * rx;
const int16_t ry2 = ry * ry;
int16_t F = round (ry2 - rx2 * ry + 0.25 * rx2);
int16_t ddF_x = 0;
int16_t ddF_y = 2 * rx2 * ry;
int16_t x = 0;
int16_t y = ry;
 
lcd_plot (x0, y0 + ry, mode);
lcd_plot (x0, y0 - ry, mode);
lcd_plot (x0 + rx, y0, mode);
lcd_plot (x0 - rx, y0, mode);
// while ( 2*ry2*x < 2*rx2*y ) { we can use ddF_x and ddF_y
while (ddF_x < ddF_y)
{
if(F >= 0)
{
y -= 1; // south
ddF_y -= 2 * rx2;
F -= ddF_y;
}
x += 1; // east
ddF_x += 2 * ry2;
F += ddF_x + ry2;
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 + y, mode);
lcd_plot (x0 - x, y0 - y, mode);
}
F = round (ry2 * (x + 0.5) * (x + 0.5) + rx2 * (y - 1) * (y - 1) - rx2 * ry2);
while(y > 0)
{
if(F <= 0)
{
x += 1; // east
ddF_x += 2 * ry2;
F += ddF_x;
}
y -= 1; // south
ddF_y -= 2 * rx2;
F += rx2 - ddF_y;
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 + y, mode);
lcd_plot (x0 - x, y0 - y, mode);
}
}
 
 
//-----------------------------------------------------------
//
void lcd_ecircle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode)
{
lcd_ellipse (x0, y0, radius + 3, radius, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ecirc_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode)
{
lcd_ellipse_line(x, y, r + 3, r, deg, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_view_font (uint8_t page)
{
int x;
int y;
 
lcd_cls ();
lcd_printp (PSTR(" 0123456789ABCDEF\r\n"), 0);
lcd_printpns_at (0, 7, PSTR(" \x1a \x1b Exit"), 0);
 
lcd_ypos = 2;
for (y = page * 4 ; y < (page * 4 + 4); y++)
{
if (y < 10)
{
lcd_putc (0, lcd_ypos, '0' + y, 0);
}
else
{
lcd_putc (0, lcd_ypos, 'A' + y - 10, 0);
}
lcd_xpos = 2;
for (x = 0; x < 16; x++)
{
lcd_putc (lcd_xpos, lcd_ypos, y * 16 + x, 0);
lcd_xpos++;
}
lcd_ypos++;
}
}
 
 
//-----------------------------------------------------------
uint8_t hdigit (uint8_t d)
{
if (d < 10)
{
return '0' + d;
}
else
{
return 'A' + d - 10;
}
}
 
 
//-----------------------------------------------------------
void lcd_print_hex_at (uint8_t x, uint8_t y, uint8_t h, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
 
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h >> 4), mode);
lcd_putc (lcd_xpos, lcd_ypos, hdigit (h & 0x0f), mode);
}
 
 
//-----------------------------------------------------------
void lcd_print_hex (uint8_t h, uint8_t mode)
{
// lcd_xpos = x;
// lcd_ypos = y;
 
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h >> 4), mode);
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h & 0x0f), mode);
lcd_putc (lcd_xpos++, lcd_ypos, ' ', mode);
}
 
 
//-----------------------------------------------------------
void lcd_write_number_u (uint8_t number)
{
uint8_t num = 100;
uint8_t started = 0;
 
while (num > 0)
{
uint8_t b = number / num;
if (b > 0 || started || num == 1)
{
lcd_putc (lcd_xpos++, lcd_ypos, '0' + b, 0);
started = 1;
}
number -= b * num;
 
num /= 10;
}
}
 
 
//-----------------------------------------------------------
void lcd_write_number_u_at (uint8_t x, uint8_t y, uint8_t number)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_write_number_u (number);
}
 
 
//-----------------------------------------------------------
// Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_u (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
utoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
lcd_print_at(x, y, (uint8_t*)s, 0);
}
 
//-----------------------------------------------------------
// Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_s (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
itoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
lcd_print_at(x, y, (uint8_t*)s, 0);
}
 
 
//-----------------------------------------------------------
// Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
// as /10th of the value
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_u_10th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
itoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
 
char rest = s[len - 1];
 
s[len - 1] = 0;
 
if (len == 1)
{
lcd_putc (x-1, y, '0', 0);
}
else if (len == 2 && s[0] == '-')
{
lcd_putc (x-1, y, '-', 0);
lcd_putc (x, y, '0', 0);
}
else
{
lcd_print_at(x, y, (uint8_t*)s, 0);
}
x += len - 1;
lcd_putc (x++, y, '.', 0);
lcd_putc (x++, y, rest, 0);
}
 
 
//-----------------------------------------------------------
void write_ndigit_number_u_100th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad)
{
uint8_t num = 100;
 
while (num > 0)
{
uint8_t b = number / num;
 
if ((num / 10) == 1)
{
lcd_putc (x++, y, '.', 0);
}
lcd_putc (x++, y, '0' + b, 0);
number -= b * num;
 
num /= 10;
}
}
 
 
//-----------------------------------------------------------
// Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
// as /10th of the value
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_s_10th (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
itoa (number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
 
char rest = s[len - 1];
 
s[len - 1] = 0;
 
if (len == 1)
{
lcd_putc (x-1, y, '0', 0);
}
else if (len == 2 && s[0] == '-')
{
lcd_putc (x-1, y, '-', 0);
lcd_putc (x, y, '0', 0);
}
else
{
lcd_print_at(x, y, (uint8_t*)s, 0);
}
x += len - 1;
lcd_putc (x++, y, '.', 0);
lcd_putc (x++, y, rest, 0);
}
 
 
//-----------------------------------------------------------
// write <seconds> as human readable time at <x>/<y> to MAX7456 display mem
//
void write_time (uint8_t x, uint8_t y, uint16_t seconds)
{
uint16_t min = seconds / 60;
seconds -= min * 60;
write_ndigit_number_u (x, y, min, 2, 0);
lcd_putc (x + 2, y, ':', 0);
write_ndigit_number_u (x + 3, y, seconds, 2, 1);
}
 
 
//-----------------------------------------------------------
// wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
//
void write_gps_pos (uint8_t x, uint8_t y, int32_t position)
{
if (position < 0)
{
position ^= ~0;
position++;
lcd_putc (x++, y, '-', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
write_ndigit_number_u (x, y, (uint16_t) (position / (int32_t) 10000000), 3, 1);
lcd_putc (x + 3, y, '.', 0);
position = position - ((position / (int32_t) 10000000) * (int32_t) 10000000);
write_ndigit_number_u (x + 4, y, (uint16_t) (position / (int32_t) 1000), 4, 1);
position = position - ((uint16_t) (position / (int32_t) 1000) * (int32_t) 1000);
write_ndigit_number_u (x + 8, y, (uint16_t) position, 3, 1);
lcd_putc (x + 11, y, 0x1e, 0); // degree symbol
}
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/lcd.h
0,0 → 1,273
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - original LCD control by Thomas "thkais" Kaiser *
* - special number formating routines taken from C-OSD *
* from Claas Anders "CaScAdE" Rathje *
* - some extension, ellipse and circ_line by Peter "woggle" Mack *
* Thanks to Oliver Schwaneberg for adding several functions to this library!*
* *
* Author: Jan Michel (jan at mueschelsoft dot de) *
* License: GNU General Public License, version 3 *
* Version: v0.93 September 2010 *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#ifndef _LCD_H
#define _LCD_H
 
/*
 
//-----------------------------------------------------------------------------
// Command Codes
//-----------------------------------------------------------------------------
//1: Display on/off
#define LCD_DISPLAY_ON 0xAF //switch display on
#define LCD_DISPLAY_OFF 0xAE //switch display off
 
//2: display start line set (lower 6 bits select first line on lcd from 64 lines in memory)
#define LCD_START_LINE 0x40
 
//3: Page address set (lower 4 bits select one of 8 pages)
#define LCD_PAGE_ADDRESS 0xB0
 
//4: column address (lower 4 bits are upper / lower nibble of column address)
#define LCD_COL_ADDRESS_MSB 0x10
#define LCD_COL_ADDRESS_LSB 0x00 //second part of column address
 
//8: select orientation (black side of the display should be further away from viewer)
#define LCD_BOTTOMVIEW 0xA1 //6 o'clock view
#define LCD_TOPVIEW 0xA0 //12 o'clock view
 
//9: select normal (white background, black pixels) or reverse (black background, white pixels) mode
#define LCD_DISPLAY_POSITIVE 0xA6 //not inverted mode
#define LCD_DISPLAY_INVERTED 0xA7 //inverted display
 
//10: show memory content or switch all pixels on
#define LCD_SHOW_NORMAL 0xA4 //show dram content
#define LCD_SHOW_ALL_POINTS 0xA5 //show all points
 
//11: lcd bias set
#define LCD_BIAS_1_9 0xA2
#define LCD_BIAS_1_7 0xA3
 
//14: Reset Controller
#define LCD_RESET_CMD 0xE2
 
//15: output mode select (turns display upside-down)
#define LCD_SCAN_DIR_NORMAL 0xC0 //normal scan direction
#define LCD_SCAN_DIR_REVERSE 0xC8 //reversed scan direction
 
//16: power control set (lower 3 bits select operating mode)
//Bit 0: Voltage follower on/off - Bit 1: Voltage regulator on/off - Bit 2: Booster circuit on/off
#define LCD_POWER_CONTROL 0x28 //base command
#define LCD_POWER_LOW_POWER 0x2F
#define LCD_POWER_WIDE_RANGE 0x2F
#define LCD_POWER_LOW_VOLTAGE 0x2B
 
//17: voltage regulator resistor ratio set (lower 3 bits select ratio)
//selects lcd voltage - 000 is low (~ -2V), 111 is high (~ - 10V), also depending on volume mode. Datasheet suggests 011
#define LCD_VOLTAGE 0x20
 
//18: Volume mode set (2-byte command, lower 6 bits in second word select value, datasheet suggests 0x1F)
#define LCD_VOLUME_MODE_1 0x81
#define LCD_VOLUME_MODE_2 0x00
 
//#if DISPLAY_TYPE == 128 || DISPLAY_TYPE == 132
//19: static indicator (2-byte command), first on/off, then blinking mode
#define LCD_INDICATOR_ON 0xAD //static indicator on
#define LCD_INDICATOR_OFF 0xAC //static indicator off
#define LCD_INDICATOR_MODE_OFF 0x00
#define LCD_INDICATOR_MODE_1HZ 0x01
#define LCD_INDICATOR_MODE_2HZ 0x10
#define LCD_INDICATOR_MODE_ON 0x11
 
//20: booster ratio set (2-byte command)
#define LCD_BOOSTER_SET 0xF8 //set booster ratio
#define LCD_BOOSTER_234 0x00 //2x-4x
#define LCD_BOOSTER_5 0x01 //5x
#define LCD_BOOSTER_6 0x03 //6x
//#endif
 
//22: NOP command
#define LCD_NOP 0xE3
 
//#if DISPLAY_TYPE == 102
////25: advanced program control
//#define LCD_ADV_PROG_CTRL 0xFA
//#define LCD_ADV_PROG_CTRL2 0x10
//#endif
 
//-----------------------------------------------------------------------------
// Makros to execute commands
//-----------------------------------------------------------------------------
 
#define LCD_SWITCH_ON() lcd_command(LCD_DISPLAY_ON)
#define LCD_SWITCH_OFF() lcd_command(LCD_DISPLAY_OFF)
#define LCD_SET_FIRST_LINE(i) lcd_command(LCD_START_LINE | ((i) & 0x3F))
#define LCD_SET_PAGE_ADDR(i) lcd_command(LCD_PAGE_ADDRESS | ((i) & 0x0F))
#define LCD_SET_COLUMN_ADDR(i) lcd_command(LCD_COL_ADDRESS_MSB | ((i>>4) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_LSB | ((i) & 0x0F))
#define LCD_GOTO_ADDRESS(page,col); lcd_command(LCD_PAGE_ADDRESS | ((page) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_MSB | ((col>>4) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_LSB | ((col) & 0x0F));
 
#define LCD_SET_BOTTOM_VIEW() lcd_command(LCD_BOTTOMVIEW)
#define LCD_SET_TOP_VIEW() lcd_command(LCD_TOPVIEW)
#define LCD_SET_MODE_POSITIVE() lcd_command(LCD_DISPLAY_POSITIVE)
#define LCD_SET_MODE_INVERTED() lcd_command(LCD_DISPLAY_INVERTED)
#define LCD_SHOW_ALL_PIXELS_ON() lcd_command(LCD_SHOW_ALL_POINTS)
#define LCD_SHOW_ALL_PIXELS_OFF() lcd_command(LCD_SHOW_NORMAL)
#define LCD_SET_BIAS_RATIO_1_7() lcd_command(LCD_BIAS_1_7)
#define LCD_SET_BIAS_RATIO_1_9() lcd_command(LCD_BIAS_1_9)
#define LCD_SEND_RESET() lcd_command(LCD_RESET_CMD)
#define LCD_ORIENTATION_NORMAL() lcd_command(LCD_SCAN_DIR_NORMAL)
#define LCD_ORIENTATION_UPSIDEDOWN() lcd_command(LCD_SCAN_DIR_REVERSE)
#define LCD_SET_POWER_CONTROL(i) lcd_command(LCD_POWER_CONTROL | ((i) & 0x07))
#define LCD_SET_LOW_POWER() lcd_command(LCD_POWER_LOW_POWER)
#define LCD_SET_WIDE_RANGE() lcd_command(LCD_POWER_WIDE_RANGE)
#define LCD_SET_LOW_VOLTAGE() lcd_command(LCD_POWER_LOW_VOLTAGE)
#define LCD_SET_BIAS_VOLTAGE(i) lcd_command(LCD_VOLTAGE | ((i) & 0x07))
#define LCD_SET_VOLUME_MODE(i) lcd_command(LCD_VOLUME_MODE_1); \
lcd_command(LCD_VOLUME_MODE_2 | ((i) & 0x3F))
 
//#if DISPLAY_TYPE == 128 || DISPLAY_TYPE == 132
#define LCD_SET_INDICATOR_OFF() lcd_command(LCD_INDICATOR_OFF); \
lcd_command(LCD_INDICATOR_MODE_OFF)
#define LCD_SET_INDICATOR_STATIC() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_ON)
#define LCD_SET_INDICATOR_1HZ() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_1HZ)
#define LCD_SET_INDICATOR_2HZ() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_2HZ)
#define LCD_SET_INDICATOR(i,j) lcd_command(LCD_INDICATOR_OFF | ((i) & 1)); \
lcd_command(((j) & 2))
#define LCD_SLEEP_MODE lcd_command(LCD_INDICATOR_OFF); \
lcd_command(LCD_DISPLAY_OFF); \
lcd_command(LCD_SHOW_ALL_POINTS)
//#endif
 
//#if DISPLAY_TYPE == 102
//#define LCD_TEMPCOMP_HIGH 0x80
//#define LCD_COLWRAP 0x02
//#define LCD_PAGEWRAP 0x01
//#define LCD_SET_ADV_PROG_CTRL(i) lcd_command(LCD_ADV_PROG_CTRL);
// lcd_command(LCD_ADV_PROG_CTRL2 & i)
//#endif
 
*/
 
 
 
extern volatile uint8_t LCD_ORIENTATION;
 
//#define LCD_LINES 8
//#define LCD_COLS 21
 
extern uint8_t lcd_xpos;
extern uint8_t lcd_ypos;
 
void lcd_command(uint8_t cmd);
void send_byte (uint8_t data);
void LCD_Init (uint8_t LCD_Mode);
void lcd_puts_at(uint8_t x, uint8_t y,const char *s, uint8_t mode );
void lcd_putc (uint8_t x, uint8_t y, uint8_t c, uint8_t mode);
void send_byte (uint8_t data);
void lcd_print (uint8_t *text, uint8_t mode);
void lcd_print_at (uint8_t x, uint8_t y, uint8_t *text, uint8_t mode);
void lcd_printp (const char *text, uint8_t mode);
void lcd_printp_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
void lcd_printpns (const char *text, uint8_t mode);
void lcd_printpns_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
void lcd_cls (void);
void lcd_cls_line (uint8_t x, uint8_t y, uint8_t w);
 
void print_display (uint8_t *text);
void print_display_at (uint8_t x, uint8_t y, uint8_t *text);
void copy_line (uint8_t y);
void paste_line (uint8_t y);
 
// Jeti
void lcd_putc_jeti (uint8_t x, uint8_t y, uint8_t c, uint8_t mode);
void lcd_printpj (const char *text, uint8_t mode);
void lcd_printpj_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
 
void lcd_plot (uint8_t x, uint8_t y, uint8_t mode);
void lcd_line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uint8_t mode);
void lcd_rect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode);
void lcd_frect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode);
void lcd_circle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode);
void lcd_fcircle (int16_t x0, int16_t y0, int16_t radius);
void lcd_circ_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode);
 
void lcd_ellipse (int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint8_t mode);
void lcd_ellipse_line (uint8_t x, uint8_t y, uint8_t rx, uint8_t ry, uint16_t deg, uint8_t mode);
 
void lcd_ecircle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode);
void lcd_ecirc_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode);
 
void lcd_view_font (uint8_t page);
void lcd_print_hex_at (uint8_t x, uint8_t y, uint8_t h, uint8_t mode);
 
void lcd_write_number_u (uint8_t number);
void lcd_write_number_u_at (uint8_t x, uint8_t y, uint8_t number);
void lcd_print_hex (uint8_t h, uint8_t mode);
/**
* Write only some digits of a unsigned <number> at <x>/<y>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a signed <number> at <x>/<y>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a unsigned <number> at <x>/<y> as /10th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_u_10th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a unsigned <number> at <x>/<y> as /100th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_u_100th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a signed <number> at <x>/<y> as /10th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_s_10th (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad);
 
/**
* write <seconds> as human readable time at <x>/<y>
*/
void write_time (uint8_t x, uint8_t y, uint16_t seconds);
 
/**
* wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
*/
void write_gps_pos (uint8_t x, uint8_t y, int32_t position);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/lipo.c
0,0 → 1,149
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include "lipo.h"
#include "eeprom.h"
 
// Global variables
double accumulator = 0; //!< Accumulated 10-bit samples
double Vin = 0; //!< 16-bit float number result
short temp = 0; //!< Temporary variable
short samples = 0; //!< Number of conversions
uint16_t volt_avg = 0;
 
 
//! ADC interrupt routine
 
ISR (ADC_vect)
{
accumulator += ADCW;
samples++;
if(samples>4095)
{
oversampled();
}
}
 
 
 
//--------------------------------------------------------------
//
void ADC_Init (void)
{
ADMUX = (0<<REFS1) | (1<<REFS0); // externe 5V Referenzspannung nutzen
ADMUX = (ADMUX & ~(0x1F)) | (1 & 0x1F); // ADC1 verwenden
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Prescaler 128, Freilaufend, Interrupte frei
}
 
 
/*! Error compensation, Scaling 16-bit result, Rounding up
, Calculate 16-bit result, Resets variables
 
Quelle AVR121: Enhancing ADC resolution by versampling
 
*/
void oversampled(void)
{
cli();
accumulator += Lipo_UOffset; //5150 Offset error compensation
 
// accumulator *= 0.9993; // Gain error compensation
accumulator *= 0.9600; //0.9800 Gain error compensation
temp=(int)accumulator%64;
accumulator/=64; // Scaling the answer
if(temp>=32)
{
accumulator += 1; // Round up
}
 
// Vin = (accumulator/65536)*4.910; // Calculating 16-bit result
 
Vin =accumulator/7.5;
volt_avg = Vin;
// write_ndigit_number_u(0, 3, Vin, 5, 0);
// write_ndigit_number_u(0, 4, volt_avg, 5, 0);
samples = 0;
accumulator = 0;
 
sei();
}
 
 
void show_Lipo(void)
{
 
uint16_t Balken = 0;
 
 
lcd_rect(103,2,1,3,1);
if (volt_avg < 320)
{
Balken = 0;
lcd_frect(106 + Balken-1, 2, 19-Balken, 3, 0); // löschen
}
 
 
if (PKT_Accutyp == true) //LiPO Akku
{
lcd_rect(104, 0, 23, 7, 1); // Rahmen
if (volt_avg >= 420) Balken = 19;
if ((volt_avg > 320) && (volt_avg < 420)) Balken = (volt_avg-320)/5;
lcd_frect(106 + Balken+1, 2, 19-Balken, 3, 0); // löschen
}
 
if (PKT_Accutyp == false) // LiON Akku
{
lcd_rect(104, 0, 22, 7, 1); // Rahmen
if (volt_avg >= 410) Balken = 18;
if ((volt_avg > 320) && (volt_avg < 410)) Balken = ((volt_avg-320)/5);
lcd_frect(106 + Balken+1, 2, 18-Balken, 3, 0); // löschen
}
 
 
if (Balken > 0) lcd_frect(106, 2, Balken, 3, 1); // Füllung
 
}
 
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/lipo.h
0,0 → 1,50
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef _LIPO_H
#define _LIPO_H
 
 
short samples; //!< Number of conversions
double Vin;
double accumulator;
 
uint16_t volt_avg;
 
void ADC_Init (void);
void oversampled(void);
void show_Lipo(void);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/main.c
0,0 → 1,378
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
 
//************************************************************************************
// Watchdog integrieren und abschalten, wird für Bootloader benötigt
// !!muss hier stehen bleiben!!
 
//--------------------------------------------------------------
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
 
//--------------------------------------------------------------
void wdt_init(void)
{
MCUSR = 0;
wdt_disable();
return;
}
 
//************************************************************************************
// erst ab hier weitere #includes
 
 
#include "lipo.h"
#include "main.h"
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "mk-data-structs.h"
#include "parameter.h"
#include "menu.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
#include "messages.h"
 
//#define MTEST 0 // Menu Test (skip FC/NC detection)
 
Version_t *version;
 
volatile uint8_t mode = 0;
uint8_t hardware = 0;
uint8_t current_hardware = 0;
mk_param_struct_t *mk_param_struct;
 
 
//--------------------------------------------------------------
int main (void)
{
#ifndef DEBUG
uint8_t timeout;
uint8_t val =0;
uint8_t spalte =0;
#endif
 
InitHWPorts(); // Hardwareanhängige Ports konfigurieren
// dafür wird je nach Hardware die HAL_HWxxx verwendet
// Define dazu in der main.h
 
hardware = NO;
current_hardware = 0;
 
 
if (PKT_StartInfo == true)
{
lcd_cls ();
// lcd_printp_at (0,0,PSTR("Portables Kopter Tool"), 0);
lcd_puts_at(0, 0, strGet(START_MSG1), 0);
lcd_puts_at(0, 1, strGet(START_MSG2), 0);
// lcd_printp_at (0,1,PSTR("für FC Ver "), 0);
// lcd_printp_at (11,1,PSTR(FC_Version),0);
// lcd_printp_at (0,3,PSTR("GNU GPL License"), 0);
lcd_puts_at(0, 3, strGet(GNU_GPL), 0);
 
#ifdef HWVERSION1_2
// lcd_printp_at (0,4,PSTR("Hardware 1.2"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
lcd_puts_at(0, 4, strGet(HW12), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
#endif
 
#ifdef HWVERSION1_2W
// lcd_printp_at (0,4,PSTR("Hardware 1.2W"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
lcd_puts_at(0, 4, strGet(HW12W), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
#endif
 
#ifdef HWVERSION1_3
// lcd_printp_at (0,4,PSTR("Hardware 1.3"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
lcd_puts_at(0, 4, strGet(HW13), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
#endif
 
#ifdef HWVERSION1_3W
// lcd_printp_at (0,4,PSTR("Hardware 1.3W"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
lcd_puts_at(0, 4, strGet(HW13W), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
#endif
 
#ifdef HWVERSION3_9
// lcd_printp_at (0,4,PSTR("Hardware 3.9"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 1284P"), 0);
lcd_puts_at(0, 4, strGet(HW39), 0);
lcd_puts_at(0, 5, strGet(ATMEGA1284P), 0);
#endif
 
_delay_ms(1500);
}
 
#ifndef DEBUG
 
ReadLastPosition ();
 
if (LastLongitude>0x00000000 && LastLatitude>0x00000000)
{
// lcd_printp_at (0, 4, PSTR(" Letzte Position "), 2);
// lcd_printp_at (0, 5, PSTR(" Breitengr Längengr "), 2);
// lcd_printp_at (0, 7, PSTR("löschen weiter"), 0);
lcd_puts_at(0, 4, strGet(START_LASTPOS), 2);
lcd_puts_at(0, 5, strGet(START_LASTPOS1), 3);
lcd_puts_at(0, 7, strGet(START_LASTPOS2), 0);
 
 
write_ndigit_number_u (1, 6, (uint16_t)(LastLongitude/10000000), 2, 0);
lcd_printp_at (3, 6, PSTR("."), 0);
write_ndigit_number_u (4, 6, (uint16_t)((LastLongitude/1000) % 10000), 4, 1);
write_ndigit_number_u (8, 6, (uint16_t)((LastLongitude/10) % 100), 2, 1);
 
 
write_ndigit_number_u (12, 6, (uint16_t)(LastLatitude/10000000), 2, 0);
lcd_printp_at (14, 6, PSTR("."), 0);
write_ndigit_number_u (15, 6, (uint16_t)((LastLatitude/1000) % 10000), 4, 1);
write_ndigit_number_u (19, 6, (uint16_t)((LastLatitude/10) % 100), 2, 1);
 
for (;;)
{
if (get_key_press (1 << KEY_MINUS))
{
WriteLastPosition(0x00000000,0x00000000); // Löschen
lcd_frect (0, (8*4), 128, 8, 0); // Zeile löschen (x, y, l, h, in Pixel)
lcd_frect (0, (8*5), 128, 8, 0);
// lcd_printp_at (0,5,PSTR(" gelöscht "), 0);
lcd_puts_at(0, 5, strGet(START_LASTPOSDEL), 0);
 
lcd_cls_line (0, 6, 21);
lcd_cls_line (0, 7, 21);
 
_delay_ms(1000);
break;
}
if (get_key_press (1 << KEY_ENTER))
{
lcd_cls_line (0, 4, 21);
lcd_cls_line (0, 5, 21);
lcd_cls_line (0, 6, 21);
lcd_cls_line (0, 7, 21);
break;
}
}
}
#endif
 
// switch to NC
USART_putc (0x1b);
USART_putc (0x1b);
USART_putc (0x55);
USART_putc (0xaa);
USART_putc (0x00);
 
mode = 'V';
 
#ifndef DEBUG
 
do
{
timeout = 50;
 
lcd_cls();
// lcd_printp_at (0,4,PSTR("Suche FC..."), 0);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(0, 4, strGet(START_SEARCHFC), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
while (!rxd_buffer_locked && timeout)
{
SendOutData('v', ADDRESS_ANY, 0);
 
timer = 20;
 
while (timer > 0);
timeout--;
 
if (spalte <= 20)
{
lcd_printp_at (spalte,6,PSTR("?"),0);
spalte++;
}
else
{
lcd_cls_line (0,6,21);
spalte=0;
}
 
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
for (;;)
{
Debug = 0;
hardware = NO;
main_menu ();
}
}
 
}
 
if(timeout == 0)
{
// lcd_printp_at (0,5,PSTR("FC nicht gefunden!"), 0);
lcd_puts_at(0, 5, strGet(START_FCNOTFOUND), 0);
timer = 90;
while (timer > 0);
}
}
while(timeout == 0);
 
if (timeout != 0)
Decode64 ();
 
version = (Version_t *) pRxData;
 
if (PKT_StartInfo == true)
{
lcd_cls ();
// lcd_printp (PSTR("PKT-Tool GNU GPL\r\n"), 0);
// lcd_printp (PSTR("gefunden:\r\n\n"), 0);
lcd_puts_at(0, 0, strGet(START_FCFOUND), 0);
lcd_puts_at(0, 1, strGet(START_FCFOUND1), 0);
 
}
 
if ((rxd_buffer[1] - 'a') == ADDRESS_FC)
{
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Flight-Ctrl\r\n"), 0);
lcd_puts_at(0, 1, strGet(START_FCFOUND2), 0);
}
hardware = FC;
current_hardware = hardware;
}
else if ((rxd_buffer[1] - 'a') == ADDRESS_NC)
{
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Navi-Ctrl\r\n"), 0);
lcd_puts_at(0, 1, strGet(START_FCFOUND3), 0);
}
hardware = NC;
current_hardware = hardware;
}
 
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Version: "), 0);
lcd_puts_at(0, 2, strGet(START_VERSIONCHECK), 0);
lcd_write_number_u (version->SWMajor);
lcd_printp (PSTR("."), 0);
lcd_write_number_u (version->SWMinor);
lcd_putc (lcd_xpos, lcd_ypos, version->SWPatch + 'a', 0);
_delay_ms(1500);
}
SwitchToFC();
#else
if (PKT_StartInfo == true)
{
lcd_cls ();
lcd_printp (PSTR("PKT-Test DEBUG\r\n"), 0);
_delay_ms(1500);
}
 
#endif
 
 
#ifndef DEBUG
 
// EEprom Version / Struktur prüfen
// val = load_setting(1); // Parameterset 1 holen
val = load_setting(0xff); // aktuelles Parameterset holen
if (mk_param_struct->Revision != EEProm_Version)
{
lcd_cls ();
 
 
lcd_printp_at (0, 0, PSTR("EEPromRev.:"), 0);
lcd_write_number_u (EEProm_Version);
 
lcd_puts_at(0, 1, strGet(START_VERSIONCHECK1), 0);
// lcd_printp (PSTR(" erwartet\r\n"), 0);
 
lcd_printp_at (0, 1, PSTR("EEPromRev.:"), 0);
lcd_write_number_u (mk_param_struct->Revision);
lcd_puts_at(0, 2, strGet(START_VERSIONCHECK2), 0);
 
// lcd_printp (PSTR(" gefunden\r\n"), 0);
 
// lcd_printp (PSTR("PKT-Tool nur mit\r\n"), 0);
// lcd_printp (PSTR("FC Software "), 0);
lcd_puts_at(0, 3, strGet(START_VERSIONCHECK3), 0);
lcd_puts_at(0, 4, strGet(START_VERSIONCHECK4), 0);
 
lcd_printp (PSTR(FC_Version),0);
 
// lcd_printp (PSTR("\r\nkompatibel"), 0);
lcd_puts_at(0, 5, strGet(START_VERSIONCHECK5), 0);
hardware = NO;
BeepTime = 1500;
BeepMuster = 0x0040;
_delay_ms(4000);
}
 
#endif
mode = 0;
rxd_buffer_locked = FALSE;
 
timer = 50;
while (timer > 0);
 
for (;;)
{
main_menu ();
}
}
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/main.h
0,0 → 1,121
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
/**
* @Author Cebra
*
* ${tags}
*/
//**
// *
// *
// *
//
/*
* File name: $HeadURL$
* Revision: $Revision$
* Last modified: $Date$
* Last modified by: $Author$
* $Id$
*/
#ifndef _MAIN_H
#define _MAIN_H
 
// Version der Software
#define PKTSWVersion "3.5.8a" // 1. SVN Version test
 
//#define DEBUG
 
 
// Fusebits für Hardware 1.2 D7 DC FC
// Fusebits für Hardware 1.3
// Fusebits für Hardware 3.x D7 DC FC
// avrdude -pm1284p -cavr109 -P/dev/ttyUSB1 -b115200 -V -Uflash:w:Dateiname.hex:a
 
 
// hier die entsprechende Hardwareversion der Leiterplatte einstellen
 
//#define HWVERSION1_2 // Hardware sebseb7
//#define HWVERSION1_2W // Hardware sebseb7 mit Wi232 Support
//#define HWVERSION1_3 // Hardware sebseb7
//#define HWVERSION1_3W // Hardware sebseb7 mit Wi232 Support
//#define HWVERSION3_1 // Test Hardware Cebra Juni 2011
#define HWVERSION3_9 // Hardware Cebra Oktober 2011 ATmega1284P
 
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
#include "HAL_HW1_2.h"
#endif
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
 
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
 
#define NO 0
#define NC 1
#define FC 2
#define MK3MAG 3
#define MKGPS 4
#define Wi232 5
 
#define ENABLE_PWM
 
 
 
// Menueleiste am unteren Rand definieren
//
// 11 <> Change
//
// 12 /\ Up 13 \/ Down 14 < Left 15 > Right
//
// 16 /|\ Arrow up 17 \|/ Arrow down 18 <- Arrow left 19 -> Arrow right
//
// 1A ^ Triangle up 1B v Triangle down 1C < Triangle left 1D > Triangle right
//
// "01 234567 8901234567890"
// "|O |||||O |||||O|||||O|"
//
//#define KEY_LINE_1 " \x1a \x1b Ende OK"
//#define KEY_LINE_2 " \x18 \x19 Ende OK"
//#define KEY_LINE_3 " \x18 \x19 Ende"
 
 
extern volatile uint8_t mode;
extern uint8_t hardware;
extern uint8_t current_hardware;
 
 
#endif
Property changes:
Added: svn:keywords
+Author Date Id Revision HeadURL
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/menu.c
0,0 → 1,639
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
 
#include "main.h"
#include "lcd.h"
#include "parameter.h"
 
#include "menu.h"
#include "messages.h"
#include "display.h"
#include "debug.h"
#include "timer.h"
#include "osd.h"
#include "motortest.h"
#include "gps.h"
#include "eeprom.h"
#include "setup.h"
#include "uart1.h"
#include "mk-data-structs.h"
#include "Wi232.h"
#include "servo.h"
#include "tools.h"
#include "connect.h"
#include "lipo.h"
#include "messages.h"
 
 
 
 
 
#define ITEMS_NC 7
 
prog_char param_menuitems_nc[ITEMS_NC][NUM_LANG][18]= // zeilen,zeichen+1
 
 
// German, English, French, Netherlands
{
{"OSD ","OSD ","OSD ","OSD "},
{"3D Lage ","3D angeles ","3D location ","3D locatie "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameters \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_FC 4
 
prog_char param_menuitems_fc[ITEMS_FC][NUM_LANG][18]= // zeilen,zeichen+1
{
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_NO 6
 
prog_char param_menuitems_no[ITEMS_NO][NUM_LANG][18]= // zeilen,zeichen+1
{
{"BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester "},
{"Servo Tester ","Servo Tester ","Servo Tester ","Servo Tester "},
{"PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter "},
{"PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter "},
{"PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d"},
{"PKT Version ","PKT Version ","PKT Version ","PKT Versie "},
};
 
 
#define ITEMS_CR 9
 
prog_char param_copyright[ITEMS_CR][22]= // zeilen,zeichen+1
{
" ",
"(C) GNU GPL License ",
" NO WARRANTY ",
" ",
"2008 Thomas Kaiser ",
"2009-2010 Peter Mack ",
"2010 Sebastian Boehm ",
"2011 Chr. Brandtner &",
" Harald Bongartz ",
};
 
 
//--------------------------------------------------------------
// print cursor
void menu_set_cursor (uint8_t before, uint8_t line, uint8_t pos)
{
lcd_printp_at (pos, before, PSTR(" "), 0);
lcd_printp_at (pos, line, PSTR("\x1d"), 0);
}
 
 
// F�r Seting-Auswahl ------------------------------------------
//
uint8_t menu_choose (uint8_t min, uint8_t max, uint8_t pos, uint8_t start)
{
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
line = max;
// line = min; // Wenn wiederholen soll
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
line = min;
// line = max; // Wenn wiederholen soll
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r Setup und Parameter ------------------------------------------
//
uint8_t menu_choose2 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r das Hauptmenue ------------------------------------------
//
uint8_t menu_choose3 (uint8_t min, uint8_t max,uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
menu_set_cursor (line, line, pos);
 
do
{
 
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (get_key_long (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 250;
}
 
if(get_key_long (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return 251;
}
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 252;
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
show_Lipo();
}
while (!(get_key_short (1 << KEY_ENTER)));
 
return line;
}
 
//--------------------------------------------------------------
//
void main_menu (void)
{
uint8_t ii = 0;
uint8_t offset = 0;
uint8_t size = 0;
uint8_t Save_hardware = 0;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val =0;
 
Save_hardware = hardware;
 
get_key_press(KEY_ALL);
 
while(1)
{
if (Debug==1)
hardware = NC;
if (Debug==0)
hardware = Save_hardware;
if(hardware == NO)
size = ITEMS_NO ;
if(hardware == NC)
size = ITEMS_NC ;
if(hardware == FC)
size = ITEMS_FC ;
 
lcd_cls ();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0, PSTR(FC_Version), 2);
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
 
 
while(2)
{
 
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
{
if(hardware == NC)
lcd_printp_at(3,ii+1,param_menuitems_nc[ii+offset][DisplayLanguage], 0);
else if(hardware == FC)
lcd_printp_at(3,ii+1,param_menuitems_fc[ii+offset][DisplayLanguage], 0);
else
lcd_printp_at(3,ii+1,param_menuitems_no[ii+offset][DisplayLanguage], 0);
}
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
show_Lipo();
}
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose3 (1, 5, target_pos,0,1); //menu_choose3 (min, max, start, return_at_start, return_at_end)
else
val = menu_choose3 (1, size, target_pos,0,0);
}
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose3 (2, 6, target_pos,1,0);
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(val == 254)
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
offset--;
dmode = 0;
target_pos = 2;
}
#if defined HWVERSION3_9
else if(val == 252)
{
 
lcd_cls();
// lcd_printp_at (0, 2, PSTR(" PKT ausschalten?"),0);
lcd_puts_at(0, 2, strGet(SHUTDOWN), 0);
// lcd_printp_at (12, 7, PSTR("Nein Ja"),0);
lcd_puts_at(12, 7, strGet(YESNO), 0);
while(1)
{
if (get_key_press (1 << KEY_ENTER))
clr_V_On(); // Spannung abschalten
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
lcd_cls();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0,PSTR(FC_Version), 2);
// show_Lipo();
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
break;
}
}
}
else if(val == 251)
{
PC_Fast_Connect();
return;
}
#endif
else if(val == 250)
{
// Test_HB();
Test_Language();
return;
}
else
break;
}
 
target_pos = val;
 
 
if(hardware == NC)
{
if((val+offset) == 1 )
osd(OSD_Mode);
if((val+offset) == 2 )
osd(THREE_D_Mode);
if((val+offset) == 3 )
display_data();
if((val+offset) == 4 )
edit_parameter();
if((val+offset) == 5 )
display_debug();
if((val+offset) == 6 )
gps();
if((val+offset) == 7 )
PKT_Tools();
 
}
 
 
if(hardware == FC)
{
if((val+offset) == 1 )
display_data();
if((val+offset) == 2 )
edit_parameter();
if((val+offset) == 3 )
display_debug();
if((val+offset) == 4 )
PKT_Tools();
 
}
 
 
if(hardware == NO)
{
if((val+offset) == 1 )
motor_test(FC_Mode);
if((val+offset) == 2 )
servo_test();
#ifdef HWVERSION3_9
if (U02SV2 == 0)
{
if((val+offset) == 3 )
Port_BT2Wi();
if((val+offset) == 4 )
Port_USB2Wi();
}
else if (U02SV2 == 1)
{
if((val+offset) == 3 )
Port_BT2FC();
if((val+offset) == 4 )
Port_USB2FC();
}
#else
if((val+offset) == 3 )
Show_Error_HW();
if((val+offset) == 4 )
Show_Error_HW();
#endif
if((val+offset) == 5 )
PKT_Setup();
if((val+offset) == 6 )
Show_Version();
 
}
 
 
}
}
 
 
//--------------------------------------------------------------
//
void Update_PKT (void)
{
lcd_cls();
lcd_printp_at (0, 0, PSTR(" PKT Update "),2);
// lcd_printp_at (0, 1, PSTR("Connect PC to PKT-USB"),0);
lcd_puts_at(0, 1, strGet(UPDATE1), 0);
// lcd_printp_at (0, 2, PSTR("Press 'Start' on PKT "),0);
lcd_puts_at(0, 2, strGet(UPDATE2), 0);
lcd_printp_at (0, 3, PSTR("Start avrdude.exe "),0);
lcd_printp_at (0, 4, PSTR("-pm1284p -cavr109 "),0);
lcd_printp_at (0, 5, PSTR("-Pcom? -b115200 "),0);
lcd_printp_at (0, 6, PSTR("-Uflash:w:FILE.hex:a "),0);
// avrdude -pm1284p -cavr109 -P/dev/ttyUSB1 -b115200 -V -Uflash:w:Dateiname.hex:a
 
// lcd_printp_at (0, 7, PSTR(" Ende Start"), 0);
lcd_puts_at(0, 7, strGet(ENDSTART), 0);
 
do
{
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
}
while (!(get_key_press (1 << KEY_ENTER)));
{
 
// start bootloader with Reset, Hold KEY_ENTER*/
wdt_enable( WDTO_250MS );
while (1)
{;}
}
}
 
 
//--------------------------------------------------------------
//
void Show_Error_HW (void)
{
lcd_cls ();
lcd_printp_at (0, 2, PSTR(" Mit dieser Hardware"), 0);
lcd_printp_at (0, 3, PSTR(" nicht möglich!"), 0);
lcd_printp_at (12, 7, PSTR("Ende"), 0);
 
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
 
 
//--------------------------------------------------------------
//
void Show_Version (void)
{
uint8_t ii = 0;
uint8_t size = ITEMS_CR;
uint8_t page = 0;
 
lcd_cls ();
 
// lcd_printp_at (0, 0, PSTR("PKT Tool ver "), 2);
// lcd_printp_at (13,0, PSTR(PKTSWVersion),2);
// lcdPuts(Msg(MSG_VERSION1));
// lcd_printp_at (0, 0, Msg(MSG_VERSION1), 2);
// lcd_printp_at (0, 1, PSTR("für FC ver "), 2);
// lcd_printp_at (12,1, PSTR(FC_Version),2);
lcd_puts_at(0, 1, strGet(START_MSG2), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
for(ii = 0;ii < 3 ; ii++)
if((ii + page) < size)
lcd_printp_at(0,ii + 3,param_copyright[ii + page], 0);
 
if (page == 0)
{
lcd_printp_at (0, 2, PSTR(" "), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page > 0 && page < (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page >= (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR(" "), 0);
}
 
 
if (get_key_press (1 << KEY_PLUS))
if (page < size - 3)
page++;
 
if (get_key_press (1 << KEY_MINUS))
if (page > 0)
page--;
 
if (get_key_press (1 << KEY_ESC) || get_key_press (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return;
}
}
}
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/menu.h
0,0 → 1,55
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef MENU_H
#define MENU_H
 
#define CURSOR_COL 1 // column where the menu cursor is displayed
#define MENU_LINE 1 // starting line of menu
#define MENU_COL 3 // column where the menu starts
#define OSD_Mode 1 // OSD Anzeige als OSD
#define THREE_D_Mode 3 // OSD Anzeige in 3D Position
 
void main_menu (void);
void Show_Version (void);
void Show_Error_HW (void);
void Update_PKT (void);
void PC_Fast_Connect (void);
 
 
uint8_t menu_choose (uint8_t min, uint8_t max, uint8_t pos, uint8_t start);
uint8_t menu_choose2 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end);
uint8_t menu_choose3 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/messages.c
0,0 → 1,1442
/****************************************************************************************
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Languagesupport: *
* http://www.netrino.com/Embedded-Systems/How-To/Firmware-Internationalization *
* Nigel Jones *
****************************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "lcd.h"
#include "timer.h"
#include "eeprom.h"
#include "messages.h"
 
 
 
 
typedef enum
{ GERMAN,ENGLISH, FRENCH, NETHERLAND, LAST_LANGUAGE }
LANGUAGE;
 
 
 
typedef struct
{
/*
* Maximum length
*/
int const len;
 
/*
* Array of pointers to language-specific string
*/
char const * const text[LAST_LANGUAGE];
 
} STRING;
 
 
//--------------------------------------------------------------------------------------------------------------------
// Typdefinitionen für alle verwendeten Strings, LAST_STR muss am Ende stehen bleiben
//typedef enum
//{
// BOOT1,BOOT2,BOOT_WI1,BOOT_WI2,BOOT_SV,START_MSG1,START_MSG2,GNU_GPL,ATMEGA644,ATMEGA644P,ATMEGA1284P,HW12,HW12W,HW13,HW13W,HW39,START_LASTPOS,START_LASTPOS1,START_LASTPOS2,START_LASTPOSDEL,
// START_SEARCHFC,ENDE,START_FCNOTFOUND,START_FCFOUND,START_FCFOUND1,START_FCFOUND2,START_FCFOUND3,START_VERSIONCHECK,START_VERSIONCHECK1,
// START_VERSIONCHECK2,START_VERSIONCHECK3,START_VERSIONCHECK4,START_VERSIONCHECK5,LAST_STR
//} STR;
 
 
 
static const STRING strings[LAST_STR] =
{
{ /*KEYLINE1*/
21,
{
" \x1a \x1b Ende OK", /* German */
" \x1a \x1b end OK", /* English*/
" \x1a \x1b fin OK", /* French */
" \x1a \x1b Einde OK", /* Dutch */
 
}
},
{ /*KEYLINE2*/
21,
{
" \x18 \x19 Ende OK", /* German */
" \x18 \x19 end OK", /* English*/
" \x18 \x19 fin OK", /* French */
" \x18 \x19 Einde OK", /* Dutch */
 
}
},
{ /*KEYLINE3*/
21,
{
" \x18 \x19 Ende ", /* German */
" \x18 \x19 end ", /* English*/
" \x18 \x19 fin ", /* French */
" \x18 \x19 Einde", /* Dutch */
 
}
},
{ /*KEYLINE4*/
21,
{
"Ende OK", /* German */
"end OK", /* English*/
"fin OK", /* French */
"Einde OK", /* Dutch */
 
}
},
 
 
 
{ /*BOOT1*/
21,
{
"Taste 1 Sekunde", /* German */
"Keep the button", /* English*/
"Maintenez le bouton", /* French */
"Houd de knop ", /* Dutch */
 
}
},
{ /* BOOT2*/
21,
{
"lang festhalten.", /* German */
"pressed for 1 second", /* English*/
"enfoncée pend. 1 sec", /* French */
"1 seconde ingedrukt.", /* Dutch */
}
},
{ /*BOOT_WI1*/
21,
{
"Verbindung zum MK ist", /* German */
"Connection to MK is", /* English*/
"Connexion à MK est", /* French */
"Verbinding met MK is", /* Dutch */
 
}
},
{ /* BOOT_WI2*/
21,
{
"auf Wi232 eingestellt", /* German */
"set to Wi232", /* English*/
"mis à Wi232", /* French */
"ingesteld op Wi232", /* Dutch */
}
},
{ /*BOOTSV1*/
21,
{
"auf Kabel eingestellt", /* German */
"set to kabel on SV2", /* English*/
"mis à kabel sur SV2", /* French */
"via kabelverbinding", /* Dutch */
 
}
},
{ /**/
21,
{
"Portables Kopter Tool", /* German */
"Portable Kopter Tool ", /* English*/
"Portable Kopter Tool ", /* French */
"Portable Kopter Tool ", /* Dutch */
 
}
},
{ /*START_MSG2 */
21,
{
"für FC Ver "FC_Version, /* German */
"for FC Ver "FC_Version, /* English*/
"pour FC Ver "FC_Version, /* French */
"Voor FC Ver "FC_Version, /* Dutch */
}
},
{ /* GNU/GPL */
21,
{
"GNU GPL License", /* German */
"GNU GPL License", /* English*/
"GNU GPL License", /* French */
"GNU GPL License", /* Dutch */
}
},
{ /**/
21,
{
"ATmega 644", /* German */
"ATmega 644", /* English*/
"ATmega 644", /* French */
"ATmega 644", /* Dutch */
}
},
{ /**/
21,
{
"ATmega 644P", /* German */
"ATmega 644P", /* English*/
"ATmega 644P", /* French */
"ATmega 644P", /* Dutch */
}
},
{ /**/
21,
{
"ATmega 1284P", /* German */
"ATmega 1284P", /* English*/
"ATmega 1284P", /* French */
"ATmega 1284P", /* Dutch */
}
},
 
{ /**/
21,
{
"Hardware 1.2", /* German */
"Hardware 1.2", /* English*/
"Hardware 1.2", /* French */
"Hardware 1.2", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 1.2W", /* German */
"Hardware 1.2W", /* English*/
"Hardware 1.2W", /* French */
"Hardware 1.2W", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 1.3", /* German */
"Hardware 1.3", /* English*/
"Hardware 1.3", /* French */
"Hardware 1.3", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 1.3W", /* German */
"Hardware 1.3W", /* English*/
"Hardware 1.3W", /* French */
"Hardware 1.3W", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 3.9", /* German */
"Hardware 3.9", /* English*/
"Hardware 3.9", /* French */
"Hardware 3.9", /* Dutch */
}
},
{ /*START_LASTPOS*/
21,
{
" Letzte Position ", /* German */
" last position ", /* English*/
" dernière position ", /* French */
" Laatste positie ", /* Dutch */
}
},
{ /*START_LASTPOS1*/
21,
{
" Längengr Breitengr", /* German */
" longitude latitude ", /* English*/
" longitude latitude ", /* French */
" lengtegr. breedtegr.", /* Dutch */
}
},
 
{ /*START_LASTPOS2*/
21,
{
"löschen weiter", /* German */
"delete exit ", /* English*/
"supprimer plus ", /* French */
"wissen verder", /* Dutch */
}
},
{ /*START_LASTPOSDEL*/
21,
{
" gelöscht ", /* German */
" deleted ", /* English*/
" supprimé ", /* French */
" gewist ", /* Dutch */
}
},
{ /*START_SEARCHFC*/
21,
{
"Suche FC...", /* German */
"searching FC...", /* English*/
"cherchant FC...", /* French */
"zoek FC...", /* Dutch */
}
},
 
{ /*ENDE*/
21,
{
"Ende ", /* German */
"end ", /* English*/
"fin ", /* French */
"Einde", /* Dutch */
}
},
{ /*OK*/
21,
{
"Ok", /* German */
"ok", /* English*/
"ok", /* French */
"gued", /* Dutch */
}
},
{ /*FEHLER*/
21,
{
"Fehler", /* German */
"error", /* English*/
"d'erreur", /* French */
"fout", /* Dutch */
}
},
{ /*AKTIV*/
21,
{
"aktiv", /* German */
"activ", /* English*/
"actifs", /* French */
"actief", /* Dutch */
}
},
 
 
{ /*START_FCNOTFOUND*/
21,
{
"FC nicht gefunden!", /* German */
"FC not found!", /* English*/
"FC pas trouvé!", /* French */
"FC niet gevonden!", /* Dutch */
}
},
{ /*START_FCFOUND*/
21,
{
"PKT-Tool GNU GPL", /* German */
"PKT-Tool GNU GPL", /* English*/
"PKT-Tool GNU GPL", /* French */
"PKT-Tool GNU GPL", /* Dutch */
}
},
{ /*START_FCFOUND1*/
21,
{
"gefunden: ", /* German */
"found: ", /* English*/
"trouvés: ", /* French */
"gevonden: ", /* Dutch */
}
},
{ /*START_FCFOUND2*/
21,
{
"Flight-Ctrl", /* German */
"Flight-Ctrl", /* English*/
"Flight-Ctrl", /* French */
"Flight-Ctrl", /* Dutch */
}
},
{ /*START_FCFOUND3*/
21,
{
"Navi-Ctrl", /* German */
"Navi-Ctrl", /* English*/
"Navi-Ctrl", /* French */
"Navi-Ctrl", /* Dutch */
}
},
{ /*START_VERSIONCHECK*/
21,
{
"Version: ", /* German */
"Version: ", /* English*/
"Version: ", /* French */
"Versie: ", /* Dutch */
}
},
{ /*START_VERSIONCHECK1*/
21,
{
" erwartet", /* German */
" expected", /* English*/
" attendus", /* French */
" verwacht", /* Dutch */
}
},
{ /*START_VERSIONCHECK2*/
21,
{
" gefunden", /* German */
" found", /* English*/
" trouvés", /* French */
" gevonden", /* Dutch */
}
},
{ /*START_VERSIONCHECK3*/
21,
{
"PKT-Tool nur mit", /* German */
"PKT-Tool only with", /* English*/
"PKT uniquement avec", /* French */
"PKT-Tool alleen met", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK4*/
21,
{
"FC Software ", /* German */
"FC Software ", /* English*/
"FC Software ", /* French */
"FC Software ", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK5*/
21,
{
"kompatibel", /* German */
"compatible", /* English*/
"compatibles", /* French */
"compatibel", /* Dutch */
}
},
{ /*ON*/
21,
{
"Ein ", /* German */
"On ", /* English*/
"Un ", /* French */
"Aan ", /* Dutch */
}
},
{ /*AUS*/
21,
{
"Aus ", /* German */
"Off ", /* English*/
"Du ", /* French */
"Uit ", /* Dutch */
}
},
{ /*ESC*/
21,
{
"ESC", /* German */
"ESC", /* English*/
"ESC", /* French */
"ESC", /* Dutch */
}
},
{ /*SHUTDOWN*/
21,
{
" PKT ausschalten?", /* German */
" shutdown PKT ?", /* English*/
" désactiver PKT ?", /* French */
" PKT uitschakelen ?", /* Dutch */
}
},
{ /*YES NO*/
21,
{
"Nein Ja", /* German */
"no yes", /* English*/
"non oui", /* French */
"Nee Ja", /* Dutch */
}
},
{ /*UPDATE1*/
21,
{
"Verbinde PC mit PKT ", /* German */
"Connect PC to PKT-USB", /* English*/
"associer PC a PKT-USB", /* French */
"Verbind PC met PKT ", /* Dutch */
}
},
{ /*UPDATE2*/
21,
{
"Drücke 'Start' am PKT", /* German */
"Press 'Start' on PKT ", /* English*/
"presse 'lancer' a PKT", /* French */
"Druk 'Start' op PKT ", /* Dutch */
}
},
{ /*ENDSTART*/
21,
{
" Ende Start", /* German */
" End Start", /* English*/
" fin lancer", /* French */
" Einde Start", /* Dutch */
}
},
{ /*TOOLS1*/
21,
{
" PC-Quick-Verbindung ", /* German */
" PC-Quick-Connection ", /* English*/
" PC-connexion rapide ", /* French */
" Snelle PC-verbinding", /* Dutch */
}
},
{ /*CONNECT1,*/
21,
{
"Verbinde das PKT mit", /* German */
"Connect PKT with MK", /* English*/
"connectez PKT a MK", /* French */
"Verbind PKT ", /* Dutch */
}
},
{ /*CONNECT2*/
21,
{
"dem MK über:", /* German */
" over :", /* English*/
" a propos :", /* French */
" met :", /* Dutch */
}
},
 
{ /*CONNECT4,*/
21,
{
"dem MK über: Kabel, ", /* German */
"over: Kabel", /* English*/
"a propos: Cable", /* French */
"MK via: kabel ", /* Dutch */
}
},
{ /*CONNECT5*/
21,
{
"es ist kein Wi.232", /* German */
"there is no Wi.232", /* English*/
"l n'ya pas de ", /* French */
"er is geen wi.232 ", /* Dutch */
}
},
{ /*CONNECT6*/
21,
{
"Modul eingebaut.", /* German */
"built in.", /* English*/
"module intégré Wi232", /* French */
"module ingebouwd.", /* Dutch */
}
},
{ /*CONNECT7,*/
21,
{
"Wenn doch, dann bitte", /* German */
"if yes, then first", /* English*/
"Si vous le faites", /* French */
"zo ja, dan aub eerst", /* Dutch */
}
},
{ /*CONNECT8*/
21,
{
"das Modul zuerst im ", /* German */
"activate modul in", /* English*/
"activer le module", /* French */
"de module aktiveren", /* Dutch */
}
},
{ /*CONNECT9*/
21,
{
"Setupmenü aktivieren.", /* German */
"Setupmenu", /* English*/
"dans menu de config.", /* French */
"in het Setupmenu.", /* Dutch */
}
},
{ /*CONNECT10*/
21,
{
"Sie müssen das PKT", /* German */
"You have to", /* English*/
"Vous devez", /* French */
"U moet de PKT", /* Dutch */
}
},
{ /*CONNECT11*/
21,
{
"jetzt neu starten!", /* German */
"restart PKT", /* English*/
"redémarrer PKT", /* French */
"nu opnieuw starten!", /* Dutch */
}
},
{ /*CONNECT12*/
21,
{
"Es ist kein BTM-222", /* German */
"There is no BTM-222", /* English*/
"l n'ya pas de ", /* French */
"Er is geen BTM-222", /* Dutch */
}
},
{ /*CONNECT13*/
21,
{
"Modul eingebaut", /* German */
"Modul built in", /* English*/
"module intégré BTM222", /* French */
"module ingebouwd.", /* Dutch */
}
},
{ /*CONNECT14*/
21,
{
" MK-USB Funktion ", /* German */
" MK-USB Function ", /* English*/
" MK-USB fonction ", /* French */
" MK-USB Functie ", /* Dutch */
}
},
{ /*CONNECT15*/
21,
{
" BT --> Kabel an FC ", /* German */
" BT --> Kabel to FC ", /* English*/
" BT --> Cable a FC ", /* French */
" BT --> kabel naar FC", /* Dutch */
}
},
{ /*CONNECT16*/
21,
{
"PC mit BT verb.", /* German */
"connect PC with BT", /* English*/
"associer PC a BT", /* French */
"PC via BT verbonden.", /* Dutch */
}
},
{ /*CONNECT17*/
21,
{
"PKT-Kabel an FC", /* German */
"PKT-Kabel to FC", /* English*/
"PKT-Cable a FC", /* French */
"PKT-kabel naar FC", /* Dutch */
}
},
{ /*CONNECT18*/
21,
{
" BT --> Wi.232 ", /* German */
" BT --> Wi.232 ", /* English*/
" BT --> Wi.232 ", /* French */
" BT --> Wi.232 ", /* Dutch */
}
},
{ /*CONNECT19*/
21,
{
"Wi.232 an FC ", /* German */
"Wi.232 to FC ", /* English*/
"Wi.232 a FC ", /* French */
"Wi.232 naar FC ", /* Dutch */
}
},
 
{ /*CONNECT20*/
21,
{
" USB --> Kabel an FC ", /* German */
" USB --> cable to FC ", /* English*/
" USB --> cable a FC ", /* French */
"USB --> kabel naar FC", /* Dutch */
}
},
{ /*CONNECT21*/
21,
{
"PC mit USB verbinden ", /* German */
"connect PC with USB ", /* English*/
"associer PC a USB ", /* French */
"Verbind PC met USB ", /* Dutch */
}
},
{ /*CONNECT22*/
21,
{
" USB --> Wi.232 ", /* German */
" USB --> Wi.232 ", /* English*/
" USB --> Wi.232 ", /* French */
" USB --> Wi.232 ", /* Dutch */
}
},
{ /*CONNECT23*/
21,
{
"MK-Tool starten", /* German */
"start MK-Tool", /* English*/
"démarrage MK-Tool", /* French */
"start MK-Tool", /* Dutch */
}
},
{ /*CONNECT24*/
21,
{
" Wi.232 Konfigurieren", /* German */
" Wi.232 Configuration", /* English*/
" Wi.232 configurer ", /* French */
" Wi.232 Configuratie ", /* Dutch */
}
},
{ /*CONNECT25*/
21,
{
"Programm starten. ", /* German */
"start program ", /* English*/
"Démarrer le programme", /* French */
"start programma.", /* Dutch */
}
},
 
{ /*CONNECT26*/
21,
{
"BTM-222 Konfigurieren", /* German */
"BTM-222 configuration", /* English*/
"BTM-222 de configura.", /* French */
"BTM-222 configuratie", /* Dutch */
}
},
{ /*CONNECT27*/
21,
{
"FC > MK-USB > BTM-222", /* German */
"FC > MK-USB > BTM-222", /* English*/
"FC > MK-USB > BTM-222", /* French */
"FC > MK-USB > BTM-222", /* Dutch */
}
},
{ /*CONNECT28*/
21,
{
"MK-USB an PC anschl. ", /* German */
"connect PC to MK-USB ", /* English*/
"associer PC a MK-USB ", /* French */
"Verbind PC met MK-USB", /* Dutch */
}
},
{ /*CONNECT29*/
21,
{
"Zwischen MK-USB und ", /* German */
"connect crossed cable", /* English*/
"la connexion entre PC", /* French */
"Tussen MK-USB en PKT ", /* Dutch */
}
},
{ /*CONNECT30*/
21,
{
"PKT ein gekreuztes ", /* German */
"between MK-USB and ", /* English*/
"et FC un câble croisé", /* French */
"een gekruiste kabel ", /* Dutch */
}
},
{ /*CONNECT31*/
21,
{
"Kabel anschliessen. ", /* German */
"PKT SV2", /* English*/
" ", /* French */
"aansluiten.", /* Dutch */
}
},
 
 
 
 
 
{ /*Kabel*/
21,
{
"Kabel", /* German */
"cable", /* English*/
"cable", /* French */
"Kabel", /* Dutch */
}
},
{ /*SLAVE*/
21,
{
"Slave ", /* German */
"Slave ", /* English*/
"esclaves", /* French */
"Slave ", /* Dutch */
}
},
{ /*NORMAL*/
21,
{
"Normal", /* German */
"Normal", /* English*/
"normale", /* French */
"Normaal", /* Dutch */
}
},
{ /*Reverse*/
21,
{
"Reverse", /* German */
"inverse", /* English*/
"inverse", /* French */
"geinver", /* Dutch */
}
},
{ /*ENDOK*/
21,
{
"Ende OK", /* German */
"End OK", /* English*/
"Fin OK", /* French */
"Eind OK", /* Dutch */
}
},
{ /*EEPROM1*/
21,
{
" EEProm wirklich", /* German */
" Realy delete", /* English*/
" eeprom supprimer?", /* French */
" Eeprom werkelijk", /* Dutch */
}
},
{ /*EEPROM2*/
21,
{
" löschen?", /* German */
" EEprom?", /* English*/
" ", /* French */
" wissen?", /* Dutch */
}
},
{ /*DEUTSCH*/
21,
{
"deutsch ", /* German */
"german ", /* English*/
"allemande ", /* French */
"duits ", /* Dutch */
}
},
{ /*ENGLISCH*/
21,
{
"englisch ", /* German */
"english ", /* English*/
"anglaise ", /* French */
"engels ", /* Dutch */
}
},
{ /*FRANCE*/
21,
{
"französisch", /* German */
"french " , /* English*/
"française ", /* French */
"frans ", /* Dutch */
}
},
{ /*NETHERL*/
21,
{
"holländisch", /* German */
"dutch ", /* English*/
"hollandaise", /* French */
"nederlands ", /* Dutch */
}
},
{ /*DISPLAY1*/
21,
{
"Anzeige Einstellungen", /* German */
" Display Setup ", /* English*/
" d'affichage config. ", /* French */
"Display instellingen ", /* Dutch */
}
},
{ /*DISPLAY2*/
21,
{
"Infos bei Start:", /* German */
"Info at startup ", /* English*/
"Inf.au demarrage", /* French */
"Info bij opstart", /* Dutch */
}
},
{ /*DISPLAY3*/
21,
{
"Sprache : ", /* German */
"Language: ", /* English*/
"la langue: ", /* French */
"Taal: ", /* Dutch */
}
},
{ /*DISPLAY4*/
21,
{
"Licht aus nach:", /* German */
"Light off after:", /* English*/
"Exti.feux p.les:", /* French */
"Licht uit na: ", /* Dutch */
}
},
{ /*DISPLAY5*/
21,
{
"LCD Helligk.:", /* German */
" Brightness :", /* English*/
" luminosite :", /* French */
" intensiteit:", /* Dutch */
}
},
{ /*DISPLAY6*/
21,
{
"LCD Kontrast:", /* German */
"LCD contrast:", /* English*/
"LCD contrast:", /* French */
"LCD contrast:", /* Dutch */
}
},
{ /*DISPLAY7*/
21,
{
"LCD Norm/Inv: ", /* German */
"LCD Norm/Inv: ", /* English*/
"LCD Norm/Inv: ", /* French */
"LCD Norm/Inv: ", /* Dutch */
}
},
{ /*DISPLAY8*/
21,
{
"LCD Orient.: ", /* German */
"LCD Orient.: ", /* English*/
"LCD Orient.: ", /* French */
"LCD Orient.: ", /* Dutch */
}
},
 
{ /*DEBUGPKT*/
21,
{
"Debug PKT", /* German */
"Debug PKT", /* English*/
"Debug PKT", /* French */
"Debug PKT", /* Dutch */
}
},
 
{ /*WITXRX*/
21,
{
"Wi TX/RX Chan:", /* German */
"Wi TX/RX Chan:", /* English*/
"Wi TX/RX Chan:", /* French */
"Wi TX/RX Chan:", /* Dutch */
}
},
{ /*WINETG*/
21,
{
"Wi NetW. Grp.:", /* German */
"Wi NetW. Grp.:", /* English*/
"Wi NetW. Grp.:", /* French */
"Wi NetW. Grp.:", /* Dutch */
}
},
{ /*WINETM*/
21,
{
"Wi NetW. Mode:", /* German */
"Wi NetW. Mode:", /* English*/
"Wi NetW. Mode:", /* French */
"Wi NetW. Mode:", /* Dutch */
}
},
 
 
{ /*WITIMEOUT*/
21,
{
"Wi TX Timeout:", /* German */
"Wi TX Timeout:", /* English*/
"Wi TX Timeout:", /* French */
"Wi TX Timeout:", /* Dutch */
}
},
 
{ /*WIUART*/
21,
{
"Wi UART MTU :", /* German */
"Wi UART MTU :", /* English*/
"Wi UART MTU :", /* French */
"Wi UART MTU :", /* Dutch */
}
},
{ /*WI2321*/
21,
{
"Wi.232 eingebaut:", /* German */
"Wi.232 built in :", /* English*/
"Wi.232 intégré :", /* French */
"Wi.232 ingebouwd:", /* Dutch */
}
},
{ /*WI2322*/
21,
{
"Ist ein Wi.232-Modul ", /* German */
"Is Wi232 modul", /* English*/
"est un module ", /* French */
"Is er een Wi.232", /* Dutch */
}
},
{ /*WI2323*/
21,
{
"eingebaut?", /* German */
"built in?", /* English*/
"integre Wi232?", /* French */
"module ingebouwd?", /* Dutch */
}
},
{ /*YES*/
21,
{
"Ja ", /* German */
"yes ", /* English*/
"oui ", /* French */
"Ja ", /* Dutch */
}
},
{ /*NO*/
21,
{
"Nein", /* German */
"no ", /* English*/
"non ", /* French */
"Nee ", /* Dutch */
}
},
{ /*BT1*/
21,
{
"BTM222 eingebaut:", /* German */
"BTM222 built in :", /* English*/
"BTM222 integre :", /* French */
"BTM222 ingebouwd:", /* Dutch */
}
},
{ /*BT2*/
21,
{
"Ist ein BTM-222-Modul", /* German */
"Is BTM-222 Modul", /* English*/
"est un module ", /* French */
"Is er een BTM-222", /* Dutch */
}
},
{ /*BT3*/
21,
{
"eingebaut?", /* German */
"built in?", /* English*/
"integre BTM222?", /* French */
"module ingebouwd?", /* Dutch */
}
},
 
{ /*LIPO1*/
21,
{
" PKT Akku Einstellung", /* German */
" PKT Accu Setup ", /* English*/
" PKT Accu Setup ", /* French */
" PKT Accu Setup ", /* Dutch */
}
},
{ /*LIPO2*/
21,
{
"PKT Akkutyp: ", /* German */
"PKT Accutyp: ", /* English*/
"PKT Accutyp: ", /* French */
"PKT Accutype: ", /* Dutch */
}
},
{ /*LIPO3*/
21,
{
"Akku U Offset: ", /* German */
"Accu U Offset: ", /* English*/
"Accu U Offset: ", /* French */
"Accu U Offset: ", /* Dutch */
}
},
{ /*LIPO4*/
21,
{
"PKT Akkutyp: ", /* German */
"PKT Accutyp: ", /* English*/
"PKT Accutyp: ", /* French */
"PKT Accutype: ", /* Dutch */
}
},
{ /*LIPO5*/
21,
{
"Offset verstellen bis", /* German */
"adjust offset until", /* English*/
"Decalage l'ajuster ", /* French */
"Offset afregelen tot", /* Dutch */
}
},
{ /*LIPO6*/
21,
{
"die Spannung passt", /* German */
"voltage fits", /* English*/
"a la tension", /* French */
"de spanning juist is.", /* Dutch */
}
},
{ /*LOWBAT*/
21,
{
"LowBat Warn V:", /* German */
"LowBat Warn V:", /* English*/
"LowBat Warn V:", /* French */
"LowBat alarmering:", /* Dutch */
}
},
{ /*OSD_V, vorne*/
21,
{
"V", /* German */
"F", /* English*/
"L", /* French */
"F", /* Dutch */
}
},
 
{ /*OSD_H, hinten*/
21,
{
"H", /* German */
"B", /* English*/
"D", /* French */
"A", /* Dutch */
}
},
{ /*OSD_L, links*/
21,
{
"L", /* German */
"L", /* English*/
"G", /* French */
"L", /* Dutch */
}
},
 
{ /*OSD_R, rechts*/
21,
{
"R", /* German */
"R", /* English*/
"D", /* French */
"R", /* Dutch */
}
},
 
{ /*OSD_ERROR*/
21,
{
"FEHLER: Datenverlust ", /* German */
"ERROR: Data lost", /* English*/
"perte de données", /* French */
"verlies van gegevens ", /* Dutch */
}
},
{ /*OSD_POS1*/
21,
{
"Letzte bekannte", /* German */
"Last known ", /* English*/
"Dernière position", /* French */
"Laatst bekende", /* Dutch */
}
},
 
{ /*OSD_POS2*/
21,
{
"Position gespeichert", /* German */
"position saved", /* English*/
"connue sauvé", /* French */
"positie gered", /* Dutch */
}
},
{ /*PARA_SETTINGS*/
21,
{
" Einstellungen x ", /* German */
" Setting x ", /* English*/
" Paramètres x ", /* French */
" Instellingen x ", /* Dutch */
}
},
{ /*PARA_CHANGE*/
21,
{
"ändern", /* German */
"change", /* English*/
"le changement", /* French */
"verandering", /* Dutch */
}
},
 
{ /*PARA_AKTIVI*/
21,
{
"aktivieren", /* German */
"activate", /* English*/
"activer", /* French */
"activeren", /* Dutch */
}
},
 
{ /*PARA_AKTIV*/
21,
{
"aktiviert", /* German */
"activated", /* English*/
"activée", /* French */
"geactiveerd", /* Dutch */
}
},
{ /*PARA_SAVESETT*/
21,
{
" Setting x speichern?", /* German */
" store setting?", /* English*/
" Réglage magasin?", /* French */
" instell.op te slaan?", /* Dutch */
}
},
 
{ /*PARA_SETTSAVED*/
21,
{
"Gespeichert und", /* German */
"stored and", /* English*/
"stockés et", /* French */
"opgeslagen en", /* Dutch */
}
},
{ /*PARA_COPY*/
21,
{
"Kopiere Setting", /* German */
"copy settings", /* English*/
"paramètres de copie", /* French */
"kopieer instellingen", /* Dutch */
}
},
{ /*PARA_FROMTO*/
21,
{
" von x nach y", /* German */
" from x to y", /* English*/
" des x après y", /* French */
" van x na y", /* Dutch */
}
},
 
{ /*PARA_ENDE*/
21,
{
"von nach Ende OK", /* German */
"from to end OK", /* English*/
"des après fin OK", /* French */
"van na einde OK", /* Dutch */
}
},
{ /*PARA_COPYQ*/
21,
{
"Wirklich kopieren?", /* German */
"really copy?", /* English*/
"vraiment copie?", /* French */
"echt kopie?", /* Dutch */
}
},
 
{ /*PARA_COPYACTIV*/
21,
{
"Kopiert und aktiviert", /* German */
"copied and activated ", /* English*/
"copies et actifs", /* French */
"Kopieën en actief", /* Dutch */
}
},
 
{ /*PARA_CHANGESETT*/
21,
{
"Ändere Einstellungen ", /* German */
" change settings ", /* English*/
"modifier les réglages", /* French */
"instellingen wijzigen", /* Dutch */
}
},
 
{ /*PARA_SELECT*/
21,
{
" Wähle Parameter ", /* German */
" select parameters ", /* English*/
"sélectionnez Paramèt.", /* French */
"Selecteer Parameters ", /* Dutch */
}
},
{ /*PARA_SEITE*/
21,
{
" Wähle Seite ", /* German */
" select page ", /* English*/
"Sélectionnez la page ", /* French */
" Selecteer pagina ", /* Dutch */
}
},
{ /*PARA_SELSETT*/
21,
{
" Wähle Setting: ", /* German */
" select setting ", /* English*/
"Sélectionnez setting ", /* French */
" Selecteer setting ", /* Dutch */
}
},
 
 
 
 
 
//---------, ,
//-----------------
};
 
char const * strGet(int str_no)
{
return strings[str_no].text[DisplayLanguage];
}
 
 
 
 
void Test_Language (void) // bleibt für Tests
{
lcd_cls();
lcd_printp_at(12, 7, PSTR("Ende"), 0);
 
 
do
{
lcd_puts_at(1, 2, strGet(BOOT_WI1), 0);
// lcd_printp_at(1, 2, strGet(BOOT_WI1), 0);
 
}
while(!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/messages.h
0,0 → 1,49
/****************************************************************************************
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Languagesupport: *
* http://www.netrino.com/Embedded-Systems/How-To/Firmware-Internationalization *
* Nigel Jones *
****************************************************************************************/
 
#ifndef MESSAGES_H
#define MESSAGES_H
 
 
//---------------------------------------------------------------------------------------------------------------------
// Typdefinitionen für alle verwendeten Strings, LAST_STR muss am Ende stehen bleiben
typedef enum
{
KEYLINE1, KEYLINE2, KEYLINE3,KEYLINE4, BOOT1, BOOT2, BOOT_WI1, BOOT_WI2, BOOT_SV, START_MSG1, START_MSG2, GNU_GPL, ATMEGA644, ATMEGA644P, ATMEGA1284P, HW12, HW12W, HW13,
HW13W, HW39, START_LASTPOS, START_LASTPOS1, START_LASTPOS2, START_LASTPOSDEL, START_SEARCHFC, ENDE, OK, FEHLER, AKTIV, START_FCNOTFOUND, START_FCFOUND, START_FCFOUND1, START_FCFOUND2,
START_FCFOUND3, START_VERSIONCHECK, START_VERSIONCHECK1, START_VERSIONCHECK2, START_VERSIONCHECK3, START_VERSIONCHECK4, START_VERSIONCHECK5, ON, OFF, ESC, SHUTDOWN,
YESNO, UPDATE1, UPDATE2, ENDSTART, TOOLS1, CONNECT1, CONNECT2, CONNECT4, CONNECT5, CONNECT6, CONNECT7, CONNECT8, CONNECT9, CONNECT10, CONNECT11, CONNECT12,
CONNECT13, CONNECT14, CONNECT15, CONNECT16, CONNECT17, CONNECT18, CONNECT19, CONNECT20, CONNECT21, CONNECT22, CONNECT23, CONNECT24, CONNECT25, CONNECT26, CONNECT27,
CONNECT28, CONNECT29, CONNECT30, CONNECT31, KABEL, SLAVE, NORMAL, REVERSE, ENDOK, EEPROM1, EEPROM2, DEUTSCH, ENGLISCH, FRANCE, NETHERL, DISPLAY1, DISPLAY2,
DISPLAY3, DISPLAY4, DISPLAY5, DISPLAY6, DISPLAY7, DISPLAY8, DEBUGPKT, WITXRX, WINETWG, WINETWM, WITIMEOUT, WIUART, WI2321, WI2322, WI2323, YES, NOO, BT1, BT2,
BT3, LIPO1, LIPO2, LIPO3, LIPO4, LIPO5, LIPO6, LOWBAT, OSD_V, OSD_H,OSD_L, OSD_R, OSD_ERROR, OSD_POS1, OSD_POS2, PARA_SETTINGS, PARA_CHANGE, PARA_AKTIVI, PARA_AKTIV,
PARA_SAVESETT, PARA_SETTSAVED,PARA_COPY, PARA_FROMTO, PARA_ENDE,PARA_COPYQ ,PARA_COPYACTIV,PARA_CHANGESETT, PARA_SELECT, PARA_SEITE, PARA_SELSETT, LAST_STR
} STR;
 
#define NUM_LANG 4 // German, English, French, Netherlands
 
char const * strGet(int str_no);
void Test_Language (void); // bleibt für Tests
 
 
#endif /* _MESSAGES_H_ */
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/mk-data-structs.h
0,0 → 1,330
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _MK_DATA_STRUCTS_H
#define _MK_DATA_STRUCTS_H
 
 
// FC Version 0.86
#define EEProm_Version 88 // FC EEProm Revision / Struktur FC 0.86
#define FC_Version "0.86x" //Softwareversion der FC
 
 
#define u8 uint8_t
#define s8 int8_t
#define u16 uint16_t
#define s16 int16_t
#define u32 uint32_t
#define s32 int32_t
 
#define NUMBER_OF_DEBUG_DATAS 32
#define ANALOG_NAME_LENGTH 16
 
// Version of supported serial protocol
#define MIN_VERSION 7
#define MAX_VERSION 10
 
// Setting index
#define SETTING_1 1
#define SETTING_2 2
#define SETTING_3 3
#define SETTING_4 4
#define SETTING_5 5
#define SETTING_CURRENT 0xff
 
typedef struct
{
unsigned char SWMajor;
unsigned char SWMinor;
unsigned char ProtoMajor;
unsigned char ProtoMinor;
unsigned char SWPatch;
unsigned char HardwareError[5];
} __attribute__((packed)) Version_t;
 
 
// FC Debug Struct
// portions taken and adapted from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.h
//
typedef struct
{
uint8_t Digital[2];
// NC: unsigned; FC: signed !!!!
int16_t Analog[32]; // Debugvalues
} __attribute__((packed)) DebugData_t;
 
//typedef struct
//{
// uint8_t line;
// uint8_t text[20];
//} __attribute__((packed)) Display_t;
 
 
//typedef struct
//{
// uint8_t Revision;
// int8_t Name[12];
// int8_t Motor[16][4];
// uint8_t crc;
//} __attribute__((packed)) Mixer_t;
 
 
//
// NaviCtrl OSD Structs
// portions taken and adapted from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
//typedef struct
//{
// signed int Winkel[3]; // nick, roll, compass in 0,1.^
// signed char Centroid[3];
// signed char reserve[5];
//} __attribute__((packed)) Data3D_t;
 
 
typedef struct
{
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
u8 Status; // validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct
{
u16 Distance; // distance to target in cm
s16 Bearing; // course to target in deg
} __attribute__((packed)) GPS_PosDev_t;
 
typedef struct
{
GPS_Pos_t Position; // the gps position of the waypoint, see ubx.h for details
s16 Heading; // orientation, 0 no action, 1...360 fix heading, neg. = Index to POI in WP List
u8 ToleranceRadius; // in meters, if the MK is within that range around the target, then the next target is triggered
u8 HoldTime; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
u8 Event_Flag; // future implementation
u8 Index; // to indentify different waypoints, workaround for bad communications PC <-> NC
u8 Type; // typeof Waypoint
u8 WP_EventChannelValue;
u8 AltitudeRate; // rate to change the setpoint
u8 reserve[8]; // reserve
} __attribute__((packed)) Point_t;
 
 
// NaviCtrl struct
// taken from
// http://mikrocontroller.cco-ev.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
typedef struct
{
u8 Version; // version of the data structure
GPS_Pos_t CurrentPosition; // see ubx.h for details
GPS_Pos_t TargetPosition;
GPS_PosDev_t TargetPositionDeviation;
GPS_Pos_t HomePosition;
GPS_PosDev_t HomePositionDeviation;
u8 WaypointIndex; // index of current waypoints running from 0 to WaypointNumber-1
u8 WaypointNumber; // number of stored waypoints
u8 SatsInUse; // number of satellites used for position solution
s16 Altimeter; // hight according to air pressure
s16 Variometer; // climb(+) and sink(-) rate
u16 FlyingTime; // in seconds
u8 UBat; // Battery Voltage in 0.1 Volts
u16 GroundSpeed; // speed over ground in cm/s (2D)
s16 Heading; // current flight direction in . as angle to north
s16 CompassHeading; // current compass value in .
s8 AngleNick; // current Nick angle in 1.
s8 AngleRoll; // current Rick angle in 1.
u8 RC_Quality; // RC_Quality
u8 FCFlags; // Flags from FC
u8 NCFlags; // Flags from NC
u8 Errorcode; // 0 --> okay
u8 OperatingRadius; // current operation radius around the Home Position in m
s16 TopSpeed; // velocity in vertical direction in cm/s
u8 TargetHoldTime; // time in s to stay at the given target, counts down to 0 if target has been reached
u8 RC_RSSI; // Receiver signal strength (since version 2 added)
s16 SetpointAltitude; // setpoint for altitude
u8 Gas; // for future use
u16 Current; // actual current in 0.1A steps
u16 UsedCapacity; // used capacity in mAh
} __attribute__((packed)) NaviData_t;
 
 
 
 
// MikroKopter Flags
// taken from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.73d%2Ffc.h
//
#define FCFLAG_MOTOR_RUN 0x01
#define FCFLAG_FLY 0x02
#define FCFLAG_CALIBRATE 0x04
#define FCFLAG_START 0x08
#define FCFLAG_NOTLANDUNG 0x10
#define FCFLAG_LOWBAT 0x20
#define FCFLAG_SPI_RX_ERR 0x40
#define FCFLAG_I2CERR 0x80
 
 
// NaviCtrl Flags
// taken from
// http://mikrocontroller.cco-ev.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
#define NC_FLAG_FREE 0x01
#define NC_FLAG_PH 0x02
#define NC_FLAG_CH 0x04
#define NC_FLAG_RANGE_LIMIT 0x08
#define NC_FLAG_NOSERIALLINK 0x10
#define NC_FLAG_TARGET_REACHED 0x20
#define NC_FLAG_MANUAL_CONTROL 0x40
#define NC_FLAG_GPS_OK 0x80
 
 
 
 
// Aus FC eeprom.h
//
typedef struct
{
unsigned char Revision;
unsigned char Kanalbelegung[12]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv
unsigned char Hoehe_MinGas; // Wert : 0-100
unsigned char Luftdruck_D; // Wert : 0-250
unsigned char MaxHoehe; // Wert : 0-32
unsigned char Hoehe_P; // Wert : 0-32
unsigned char Hoehe_Verstaerkung; // Wert : 0-50
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250
unsigned char Hoehe_HoverBand; // Wert : 0-250
unsigned char Hoehe_GPS_Z; // Wert : 0-250
unsigned char Hoehe_StickNeutralPoint; // Wert : 0-250
unsigned char Stick_P; // Wert : 1-6
unsigned char Stick_D; // Wert : 0-64
unsigned char StickGier_P; // Wert : 1-20
unsigned char Gas_Min; // Wert : 0-32
unsigned char Gas_Max; // Wert : 33-250
unsigned char GyroAccFaktor; // Wert : 1-64
unsigned char KompassWirkung; // Wert : 0-32
unsigned char Gyro_P; // Wert : 10-250
unsigned char Gyro_I; // Wert : 0-250
unsigned char Gyro_D; // Wert : 0-250
unsigned char Gyro_Gier_P; // Wert : 10-250
unsigned char Gyro_Gier_I; // Wert : 0-250
unsigned char Gyro_Stability; // Wert : 0-16
unsigned char UnterspannungsWarnung; // Wert : 0-250
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen
unsigned char Receiver; // 0= Summensignal, 1= Spektrum, 2 =Jeti, 3=ACT DSL, 4=ACT S3D
unsigned char I_Faktor; // Wert : 0-250
unsigned char UserParam1; // Wert : 0-250
unsigned char UserParam2; // Wert : 0-250
unsigned char UserParam3; // Wert : 0-250
unsigned char UserParam4; // Wert : 0-250
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag
//--- Seit V0.75
unsigned char ServoRollControl; // Wert : 0-250 // Stellung des Servos
unsigned char ServoRollComp; // Wert : 0-250
unsigned char ServoRollMin; // Wert : 0-250
unsigned char ServoRollMax; // Wert : 0-250
//---
unsigned char ServoNickRefresh; // Speed of the Servo
unsigned char ServoManualControlSpeed; //
unsigned char CamOrientation; //
unsigned char Servo3; // Value or mapping of the Servo Output
unsigned char Servo4; // Value or mapping of the Servo Output
unsigned char Servo5; // Value or mapping of the Servo Output
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung)
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung)
unsigned char Driftkomp;
unsigned char DynamicStability;
unsigned char UserParam5; // Wert : 0-250
unsigned char UserParam6; // Wert : 0-250
unsigned char UserParam7; // Wert : 0-250
unsigned char UserParam8; // Wert : 0-250
//---Output ---------------------------------------------
unsigned char J16Bitmask; // for the J16 Output
unsigned char J16Timing; // for the J16 Output
unsigned char J17Bitmask; // for the J17 Output
unsigned char J17Timing; // for the J17 Output
// seit version V0.75c
unsigned char WARN_J16_Bitmask; // for the J16 Output
unsigned char WARN_J17_Bitmask; // for the J17 Output
//---NaviCtrl---------------------------------------------
unsigned char NaviGpsModeControl; // Parameters for the Naviboard
unsigned char NaviGpsGain;
unsigned char NaviGpsP;
unsigned char NaviGpsI;
unsigned char NaviGpsD;
unsigned char NaviGpsPLimit;
unsigned char NaviGpsILimit;
unsigned char NaviGpsDLimit;
unsigned char NaviGpsACC;
unsigned char NaviGpsMinSat;
unsigned char NaviStickThreshold;
unsigned char NaviWindCorrection;
unsigned char NaviAccCompensation; // New since 0.86 -> was: SpeedCompensation
unsigned char NaviOperatingRadius;
unsigned char NaviAngleLimitation;
unsigned char NaviPH_LoginTime;
//---Ext.Ctrl---------------------------------------------
unsigned char ExternalControl; // for serial Control
//---CareFree---------------------------------------------
unsigned char OrientationAngle; // Where is the front-direction?
unsigned char CareFreeModeControl; // switch for CareFree
unsigned char MotorSafetySwitch;
unsigned char MotorSmooth;
unsigned char ComingHomeAltitude;
unsigned char FailSafeTime;
unsigned char MaxAltitude;
//------------------------------------------------
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt
unsigned char ServoCompInvert; // 0x01 = Nick, 0x02 = Roll 0 oder 1 // WICHTIG!!! am Ende lassen
unsigned char ExtraConfig; // bitcodiert
char Name[12];
unsigned char crc; // MUST BE THE LAST BYTE!
} __attribute__((packed)) mk_param_struct_t;
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/motortest.c
0,0 → 1,419
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include "main.h"
#include "motortest.h"
#include "lcd.h"
#include "timer.h"
#include "twimaster.h"
//#include "menu.h"
#include "uart1.h"
#include "usart.h"
#include "messages.h"
 
 
 
 
uint8_t m;
uint8_t mmode; // 0=Value 1=Motor
uint8_t v;
 
volatile uint8_t i2c_state;
volatile uint8_t motor_addr = 0;
 
 
//--------------------------------------------------------------
// Senden der Motorwerte per I2C-Bus
//
void SendMotorData(uint8_t m,uint8_t v)
{
if (m==0)
 
for(m=0;m<MAX_MOTORS;m++) // alle Motoren
{
// Motor[m].SetPoint = MotorTest[m];
Motor[m].SetPoint = v;
Motor[m].SetPointLowerBits = 0;
 
// Motor[i].SetPoint = MotorTest[i] / 4; // testing the high resolution
// Motor[i].SetPointLowerBits = MotorTest[i] % 4;
 
}
else
{
Motor[m-1].SetPoint = v;
Motor[m-1].SetPointLowerBits = 0;
}
 
 
 
if(I2C_TransferActive)
I2C_TransferActive = 0; // enable for the next time
else
{
motor_write = 0;
I2C_Start(TWI_STATE_MOTOR_TX); //Start I2C Interrupt Mode
}
}
 
 
//--------------------------------------------------------------
//
void Search_BL (void)
{
uint8_t i = 0;
unsigned int timer;
lcd_cls ();
MotorenEin =0;
MotorTest[i] = 0;
 
lcd_printp (PSTR("Suche BL-Ctrl"), 0);
 
// Check connected BL-Ctrls
BLFlags |= BLFLAG_READ_VERSION;
motor_read = 0; // read the first I2C-Data
 
SendMotorData(0,0);
timer = SetDelay(1);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
timer = SetDelay(1);
for(i=0; i < MAX_MOTORS; i++)
{
 
SendMotorData(i,0);
 
 
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
 
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK)
{
 
lcd_printp_at (0, 1, PSTR("Found BL-Ctrl:"), 0);
lcd_print_hex_at (18,1,i,0);
 
lcd_printp_at (0, 2, PSTR("Version:"), 0);
lcd_print_hex_at (8,2,Motor[i].Version,0);
lcd_printp_at (11, 2, PSTR("SetPoi:"), 0);
lcd_print_hex_at (18,2,Motor[i].SetPoint,0);
 
lcd_printp_at (0, 3, PSTR("SetPoiL:"), 0);
lcd_print_hex_at (8,3,Motor[i].SetPointLowerBits,0);
lcd_printp_at (11, 3, PSTR("State :"), 0);
lcd_print_hex_at (18,3,Motor[i].State,0);
 
lcd_printp_at (0, 4, PSTR("ReadMod:"), 0);
lcd_print_hex_at (8,4,Motor[i].ReadMode,0);
lcd_printp_at (11, 4, PSTR("Currnt:"), 0);
lcd_print_hex_at (18,4,Motor[i].Current,0);
 
lcd_printp_at (0, 5, PSTR("MaxPWM :"), 0);
lcd_print_hex_at (8,5,Motor[i].MaxPWM,0);
lcd_printp_at (11, 5, PSTR("Temp :"), 0);
write_ndigit_number_u (18,5,Motor[i].Temperature,3,1);
}
 
} //End For I
}
 
 
//--------------------------------------------------------------
//
void motor (uint8_t m,uint8_t v)
{
memset (buffer, 0, 16);
 
if(m == 0)
{
memset (buffer, v, 16);
}
else
{
buffer[m-1] = v;
}
 
SendOutData('t', ADDRESS_FC, 1, buffer, 16);
}
 
//--------------------------------------------------------------
//
void motor_test (uint8_t MotorMode)
{
 
lcd_cls ();
mmode = 1; // 1=Motor
m = 1;
v = 0;
char buffer[7];
unsigned int SerLoop;
SerLoop = 10;
 
if (MotorMode == I2C_Mode)
{
Search_BL();
do
{
lcd_printp_at (11, 7, PSTR("Ende Check"), 0);
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
}
while (!get_key_press (1 << KEY_ENTER));
}
 
lcd_cls();
lcd_printp (PSTR(" BL-Ctrl Test "), 2);
lcd_printp_at (2, 2, PSTR("Motor: 1"), 0);
lcd_printp_at (2, 3, PSTR("Value: 0"), 0);
lcd_frect ((8*1), (8*5), (0 * (14*8)) / 255, 6, 1);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_printp_at (18, 7, PSTR("\x1a \x1b"), 0);
lcd_printp_at (0, 2, PSTR("\x1d"), 0);
 
#if defined HWVERSION1_3W || defined HWVERSION1_3 || defined HWVERSION3_9
if (MotorMode == I2C_Mode)
uart1_puts("Motor;Version;Setpoint high;Setpoint low;State;ReadMode;Current;MaxPWM;Temperature\r");
#endif
#if defined HWVERSION1_2W || defined HWVERSION1_2
if (MotorMode == I2C_Mode)
USART_puts("Motor;Version;Setpoint high;Setpoint low;State;ReadMode;Current;MaxPWM;Temperature\r");
#endif
 
if (MotorMode == FC_Mode)
{
if (hardware == NC && current_hardware == NC)
{
SwitchToFC();
}
}
do
{
// mmode 0=Value 1=Motor
 
if ((mmode == 0) && (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (v < 254))
{
v++;
write_ndigit_number_u (9, 3, v, 3, 0);
if (MotorMode == FC_Mode)
lcd_frect ((8*1), (8*5), (v * (14*8)) / 255, 6, 1);
}
 
if ((mmode == 0) && (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (v > 0))
{
if (MotorMode == FC_Mode)
lcd_frect (((v * (14*8) / 255) + 8), (8*5), ((14*8) / 255), 6, 0);
 
v--;
write_ndigit_number_u (9, 3, v, 3, 0);
if (MotorMode == FC_Mode)
lcd_frect ((8*1), (8*5), (v * (14*8)) / 255, 6, 1);
}
 
if ((mmode == 1) && (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (m < 16))
{
m++;
write_ndigit_number_u (9, 2, m, 3, 0);
}
 
if ((mmode == 1) && (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (m > 0))
{
m--;
if(m > 0)
write_ndigit_number_u (9, 2, m, 3, 0);
if(m == 0)
lcd_printp_at (9, 2, PSTR("All"), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
if (MotorMode == I2C_Mode)
{
if (v > 0)
{
m = 0;
v=0;
lcd_frect ((8*1), (8*5), (0 * (14*8)) / 255, 6, 1);
lcd_cls_line (0, 5, 21);
if(m > 0) write_ndigit_number_u (9, 2, m, 3, 0);
if(m == 0) lcd_printp_at (9, 2, PSTR("All"), 0);
write_ndigit_number_u (9, 3, v, 3, 0);
SendMotorData(m,v);
timer = SetDelay(1);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
}
 
if(mmode == 0) // 0=Value
{
lcd_printp_at (0, 2, PSTR("\x1d"), 0);
lcd_printp_at (0, 3, PSTR(" "), 0);
mmode = 1; // 1=Motor
}
else
{
lcd_printp_at (0, 2, PSTR(" "), 0);
lcd_printp_at (0, 3, PSTR("\x1d"), 0);
mmode = 0; // 0=Value
}
}
//if (get_key_press (1 << KEY_ENTER))//
 
if (MotorMode == I2C_Mode)
{
SendMotorData(m,v);
timer = SetDelay(1);
lcd_printp_at (0, 3, PSTR("SetPoint :"), 0);
 
write_ndigit_number_u (13,3,Motor[m-1].SetPoint,3,0);
lcd_printp_at (0, 4, PSTR("Current :"), 0);
lcd_print_hex_at (13,4,Motor[m-1].Current,0);
write_ndigit_number_u (13,4,Motor[m-1].Current,3,0);
lcd_printp_at (0, 5, PSTR("Temperature:"), 0);
write_ndigit_number_u (13,5,Motor[m-1].Temperature,3,0);
lcd_printp_at (0, 6, PSTR("Version:"), 0);
lcd_print_hex_at (8,6,Motor[m-1].Version,0);
lcd_printp_at (11, 6, PSTR("State :"), 0);
lcd_print_hex_at (18,6,Motor[m-1].State,0);
 
#if defined HWVERSION1_3W || defined HWVERSION1_3 || defined HWVERSION3_9
 
if (Motor[m-1].SetPoint > 0)
{
if (SerLoop == 0)
{
itoa( m-1, buffer, 10); // convert interger into string (decimal format)
uart1_puts(buffer); // and transmit string to UART
uart1_puts(";");
itoa( Motor[m-1].Version, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].SetPoint, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].SetPointLowerBits, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].State, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].ReadMode, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].Current, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].MaxPWM, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].Temperature, buffer, 10); //
uart1_puts(buffer);
uart1_puts("\r");
uart1_puts("\n");
SerLoop =200;
}
else
SerLoop--;
}
 
#endif
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
 
if (Motor[m-1].SetPoint > 0)
{
if (SerLoop == 0)
{
itoa( m-1, buffer, 10); // convert interger into string (decimal format)
USART_puts(buffer); // and transmit string to UART
USART_puts(";");
itoa( Motor[m-1].Version, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].SetPoint, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].SetPointLowerBits, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].State, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].ReadMode, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].Current, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].MaxPWM, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].Temperature, buffer, 10); //
USART_puts(buffer);
USART_puts("\r");
USART_puts("\n");
SerLoop =200;
}
else
SerLoop--;
}
 
#endif
 
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
else
motor (m,v); //if (MotorMode == I2C_Mode)//
 
}
while (!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
 
if (MotorMode == FC_Mode)
{
motor(0,0); // switch all engines off at exit
}
 
}
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/motortest.h
0,0 → 1,46
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _MOTORTEST_H
#define _MOTORTEST_H
 
#define I2C_Mode 1 // Motortest Lokal
#define FC_Mode 2 // Motortest ueber FC
 
 
 
void motor_test (uint8_t MotorMode);
void SendMotorData(uint8_t m,uint8_t v);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/osd.c
0,0 → 1,695
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
 
#include "main.h"
#include "osd.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#include "eeprom.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
#define COSD_WASFLYING 4
#define TIMEOUT 200 // 2 sec
 
// global definitions and global vars
NaviData_t *naviData;
 
// löschen und alle mit "naviData->Variometer" ersetzen
//int8_t Variometer = 0;
 
// Hier Höhenanzeigefehler Korrigieren
#define AltimeterAdjust 1.5
 
// stats for after flight
int16_t max_Altimeter = 0;
uint16_t max_GroundSpeed = 0;
int16_t max_Distance = 0;
uint8_t min_UBat = 255;
uint16_t max_FlyingTime = 0;
uint16_t max_Current = 0;
uint16_t max_Capacity = 0;
 
// cache old vars for blinking attribute, checkup is faster than full
// attribute write each time
volatile uint8_t last_UBat = 255;
volatile uint8_t last_RC_Quality = 255;
 
volatile uint16_t ftimer = 0;
 
// store stats description in progmem to save space
const char stats_item_0[] PROGMEM = "max Altitude:";
const char stats_item_1[] PROGMEM = "max Speed :";
const char stats_item_2[] PROGMEM = "max Distance:";
const char stats_item_3[] PROGMEM = "min Voltage :";
const char stats_item_4[] PROGMEM = "max Time :";
#if 1
const char stats_item_5[] PROGMEM = "max Current :";
const char stats_item_6[] PROGMEM = "UsedCapacity:";
#else
const char stats_item_5[] PROGMEM = "Long. :";
const char stats_item_6[] PROGMEM = "Lat. :";
#endif
 
 
const char *stats_item_pointers[] PROGMEM = {
stats_item_0,
stats_item_1,
stats_item_2,
stats_item_3,
stats_item_4,
stats_item_5,
stats_item_6
};
 
//char* rose = "-+-N-+-O-+-S-+-W-+-N-+-O-+-S-+-W-+-N-+-O-+-S-+-W";
const char rose[48] PROGMEM = {
0x0e, 0x0f, 0x0e, 'N', 0x0e, 0x0f, 0x0e, 'O', 0x0e, 0x0f, 0x0e, 'S',
0x0e, 0x0f, 0x0e, 'W', 0x0e, 0x0f, 0x0e, 'N', 0x0e, 0x0f, 0x0e, 'O',
0x0e, 0x0f, 0x0e, 'S', 0x0e, 0x0f, 0x0e, 'W', 0x0e, 0x0f, 0x0e, 'N',
0x0e, 0x0f, 0x0e, 'O', 0x0e, 0x0f, 0x0e, 'S', 0x0e, 0x0f, 0x0e, 'W',
};
 
// the center is char 19 (north), we add the current heading in 8th
// which would be 22.5 degrees, but float would bloat up the code
// and *10 / 225 would take ages... so we take the uncorrect way
 
const char str_NE[] PROGMEM = "NE";
const char str_E[] PROGMEM = "E ";
const char str_SE[] PROGMEM = "SE";
const char str_S[] PROGMEM = "S ";
const char str_SW[] PROGMEM = "SW";
const char str_W[] PROGMEM = "W ";
const char str_NW[] PROGMEM = "NW";
const char str_N[] PROGMEM = "N ";
const char *directions_p[8] PROGMEM = {
str_NE,
str_E,
str_SE,
str_S,
str_SW,
str_W,
str_NW,
str_N
};
 
// Flags
uint8_t COSD_FLAGS2 = 0;
 
GPS_Pos_t last5pos[7];
uint8_t error = 0;
 
 
//--------------------------------------------------------------
// convert the <heading> gotton from NC into an index
uint8_t heading_conv (uint16_t heading)
{
if (heading > 23 && heading < 68)
return 0; //direction = "NE";
else if (heading > 67 && heading < 113)
return 1; //direction = "E ";
else if (heading > 112 && heading < 158)
return 2; //direction = "SE";
else if (heading > 157 && heading < 203)
return 3; //direction = "S ";
else if (heading > 202 && heading < 248)
return 4; //direction = "SW";
else if (heading > 247 && heading < 293)
return 5; //direction = "W ";
else if (heading > 292 && heading < 338)
return 6; //direction = "NW";
 
return 7; //direction = "N ";
}
 
//--------------------------------------------------------------
// draw a compass rose at <x>/<y> for <heading>
void draw_compass (uint8_t x, uint8_t y, uint16_t heading)
{
uint8_t front = 19 + (heading / 22);
for (uint8_t i = 0; i < 9; i++)
lcd_putc (x++, y, pgm_read_byte(&rose[front - 4 + i]), 0);
}
 
 
//--------------------------------------------------------------
// variometer
// draw variometer arrows at <x>/<y> according to <variometer>
//
void draw_variometer (uint8_t x, uint8_t y, uint8_t width, uint8_t hight, int16_t variometer)
{
lcd_rect (x, y - ((hight) / 2), width, hight, 1);
lcd_frect (x + 1, y - ((hight) / 2) + 1, width - 2, hight - 2, 0);
lcd_line (x, y, x + width, y, 1);
 
if (variometer > 0) // steigend
{
switch (variometer / 5)
{
case 0:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
break;
 
case 1:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
break;
 
case 2:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
lcd_frect (x + 2, y - 5, 6, 1, 1); // 10 > 14
break;
 
default:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
lcd_frect (x + 2, y - 5, 6, 1, 1); // 10 > 14
lcd_frect (x + 1, y - 6, 8, 1, 1); // 15 >
break;
}
}
else if (variometer < 0) // fallend
{
switch ((variometer) / -5)
{
case 0:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
break;
 
case 1:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
break;
 
case 2:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
lcd_frect (x + 2, y + 4, 6, 1, 1); // -10 > -14
break;
 
default:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
lcd_frect (x + 2, y + 4, 6, 1, 1); // -10 > -14
lcd_frect (x + 1, y + 5, 8, 1, 1); // -15 >
break;
}
}
}
 
 
//--------------------------------------------------------------
void print_statistics (void)
{
uint8_t line = 0;
lcd_cls ();
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
// max Altitude
lcd_printp_at (0, line, stats_item_pointers[0], 0);
write_ndigit_number_s (13, line, max_Altimeter / (30 / AltimeterAdjust), 4, 0);
lcd_putc (17, line, 'm', 0);
 
// max Speed
lcd_printp_at (0, ++line, stats_item_pointers[1], 0);
write_ndigit_number_u (14, line, (uint16_t) (((uint32_t) max_GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
lcd_printp_at(17, line, PSTR("km/h"), 0);
 
// max Distance
lcd_printp_at (0, ++line, stats_item_pointers[2], 0);
write_ndigit_number_u (14, line, max_Distance / 10, 3, 0);
lcd_putc (17, line, 'm', 0);
 
// max time
lcd_printp_at (0, ++line, stats_item_pointers[4], 0);
write_time (13, line, max_FlyingTime);
 
// min voltage
lcd_printp_at (0, ++line, stats_item_pointers[3], 0);
write_ndigit_number_u_10th (13, line, min_UBat, 3, 0);
lcd_putc (17, line, 'V', 0);
 
#if 1
// max Current
lcd_printp_at (0, ++line, stats_item_pointers[5], 0);
write_ndigit_number_u_10th (13, line, max_Current, 3, 0);
lcd_putc (17, line, 'A', 0);
 
// Used Capacity
lcd_printp_at (0, ++line, stats_item_pointers[6], 0);
write_ndigit_number_u (13, line, max_Capacity, 4, 0);
lcd_printp_at(17, line, PSTR("mAh"), 0);
#else
// longitude
lcd_printp_at (0, ++line, stats_item_pointers[5], 0);
write_gps_pos (8, line, naviData->CurrentPosition.Longitude);
 
// latitude
lcd_printp_at (0, ++line, stats_item_pointers[6], 0);
write_gps_pos (8, line, naviData->CurrentPosition.Latitude);
#endif
 
while (!get_key_press (1 << KEY_ESC))
timer = TIMEOUT;
 
COSD_FLAGS2 &= ~COSD_WASFLYING;
get_key_press(KEY_ALL);
lcd_cls();
}
 
//--------------------------------------------------------------
void print_position (void)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Breitengr Längengr "), 2);
lcd_puts_at(0, 0, strGet(START_LASTPOS1), 2);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
uint8_t ij =0;
 
for(ij=0;ij<6;ij++)
{
uint32_t lon = last5pos[ij].Longitude;
write_ndigit_number_u (1, ij+1, (uint16_t)(lon/10000000), 2, 0);
lcd_printp_at (3, ij+1, PSTR("."), 0);
write_ndigit_number_u (4, ij+1, (uint16_t)((lon/1000) % 10000), 4, 1);
write_ndigit_number_u (8, ij+1, (uint16_t)((lon/10) % 100), 2, 1);
 
uint32_t lat = last5pos[ij].Latitude;
write_ndigit_number_u (12, ij+1, (uint16_t)(lat/10000000), 2, 0);
lcd_printp_at (14, ij+1, PSTR("."), 0);
write_ndigit_number_u (15, ij+1, (uint16_t)((lat/1000) % 10000), 4, 1);
write_ndigit_number_u (19, ij+1, (uint16_t)((lat/10) % 100), 2, 1);
}
 
while (!get_key_press (1 << KEY_ESC))
timer = TIMEOUT;
 
get_key_press(KEY_ALL);
lcd_cls();
}
 
 
//--------------------------------------------------------------
void osd (uint8_t ShowMode)
{
uint8_t flag;
uint8_t tmp_dat;
uint8_t OSD_Mode;
uint8_t info_3D = 0;
 
// Clear statistics
max_Altimeter = 0;
max_GroundSpeed = 0;
max_Distance = 0;
min_UBat = 255;
max_FlyingTime = 0;
 
// flags from last round to check for changes
uint8_t old_FCFlags = 0;
 
uint16_t old_hh = 0;
uint8_t old_AngleNick = 0;
uint8_t old_AngleRoll = 0;
 
OSD_Mode = ShowMode;
 
if(error == 0)
lcd_cls();
 
if (hardware == FC)
{
lcd_printp_at(0, 3, PSTR("Only with NC !"), 0);
timer = 100;
while (timer > 0);
 
return;
}
 
SwitchToNC();
 
mode = 'O';
 
// disable debug...
// RS232_request_mk_data (0, 'd', 0);
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
flag = 0;
timer = TIMEOUT;
abo_timer = ABO_TIMEOUT;
 
 
do
{
if (rxd_buffer_locked)
{
timer = TIMEOUT;
Decode64 ();
naviData = (NaviData_t *) pRxData;
 
if(error == 1)
lcd_cls();
 
error = 0;
GPS_Pos_t currpos;
currpos.Latitude = naviData->CurrentPosition.Latitude;
currpos.Longitude = naviData->CurrentPosition.Longitude;
 
if((currpos.Latitude != last5pos[0].Latitude)&&(currpos.Longitude != last5pos[0].Longitude))
{
last5pos[6] = last5pos[5];
last5pos[5] = last5pos[4];
last5pos[4] = last5pos[3];
last5pos[3] = last5pos[2];
last5pos[2] = last5pos[1];
last5pos[1] = last5pos[0];
last5pos[0] = currpos;
}
 
flag = 1;
 
if (OSD_Mode == 1)
{
if (naviData->FCFlags & FCFLAG_MOTOR_RUN)
{ // should be engines running
// motors are on, assume we were/are flying
COSD_FLAGS2 |= COSD_WASFLYING;
}
else
{ // stats
if ((COSD_FLAGS2 & COSD_WASFLYING) | (get_key_press (1 << KEY_ENTER)))
print_statistics ();
 
if (get_key_press (1 << KEY_PLUS))
print_position ();
}
 
lcd_ecircle(22, 35, 16, 1);
 
// Ground Speed
write_ndigit_number_u (1, 0, (uint16_t) (((uint32_t) naviData->GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
lcd_printp_at(4, 0, PSTR("km/h"), 0);
 
// Compass
write_ndigit_number_u (14, 0, naviData->CompassHeading, 3, 0);
lcd_putc (17, 0, 0x1E, 0); // degree symbol
lcd_printp_at (18, 0, (const char *) (pgm_read_word ( &(directions_p[heading_conv(naviData->CompassHeading)]))), 0);
 
draw_compass (12, 1, naviData->CompassHeading);
 
// Altitude
//note:lephisto:according to several sources it's /30
if (naviData->Altimeter > (300 / AltimeterAdjust) || naviData->Altimeter < (-300 / AltimeterAdjust)) // above 10m only write full meters
write_ndigit_number_s (0, 1, naviData->Altimeter / (30 / AltimeterAdjust), 4, 0);
else // up to 10m write meters.dm
write_ndigit_number_s_10th (0, 1, naviData->Altimeter / (3 / AltimeterAdjust), 3, 0);
 
lcd_putc (4, 1, 'm', 0);
 
draw_variometer (54, 7, 10, 14, naviData->Variometer);
 
// TODO: verify correctness
uint16_t heading_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
lcd_ecirc_line (22, 35, 15, old_hh, 0);
old_hh = heading_home;
lcd_ecirc_line (22, 35, 15, heading_home, 1);
 
write_ndigit_number_u (7, 3, heading_home, 3, 0);
lcd_putc (10, 3, 0x1e, 0); // degree symbol
 
write_ndigit_number_u (7, 2, naviData->HomePositionDeviation.Distance / 10, 3, 0);
lcd_putc (10, 2, 'm', 0);
 
// Sats in use
lcd_printp_at(11, 4, PSTR("Sats"), 0);
write_ndigit_number_u (8, 4, naviData->SatsInUse, 2, 0);
 
if (naviData->NCFlags & NC_FLAG_MANUAL_CONTROL)
lcd_putc (19, 4, 'M', 0); // rc transmitter
else
lcd_putc (19, 4, 'X', 0); // clear
 
if (naviData->NCFlags & NC_FLAG_CH)
lcd_printp_at (8, 5, PSTR("Coming Home"), 0);
else if (naviData->NCFlags & NC_FLAG_PH)
lcd_printp_at (8, 5, PSTR("Pos. Hold "), 0);
else // (naviData->NCFlags & NC_FLAG_FREE)
lcd_printp_at (8, 5, PSTR("Free "), 0);
 
// Flying time
write_time (7, 6, naviData->FlyingTime);
lcd_printp_at (12, 6, PSTR("h"), 0);
 
// RC
write_ndigit_number_u (15, 6, naviData->RC_Quality, 3, 0);
lcd_printp_at(18, 6, PSTR("\x1F"), 0); // RC-transmitter
if (naviData->NCFlags & NC_FLAG_NOSERIALLINK)
{
lcd_printpns_at(19, 6, PSTR(" "), 0); // clear
}
else
{
lcd_printpns_at(19, 6, PSTR("PC"), 0);
}
 
// Battery level
write_ndigit_number_u_10th (0, 7, naviData->UBat, 3, 0);
lcd_putc (4, 7, 'V', 0);
 
// Akku Warnung
if (naviData->UBat < MK_LowBat)
{ //Beeper ein
BeepTime = 3000;
BeepMuster = 0x0020;
}
 
//if (naviData->UBat > MK_LowBat+2) //bei kurzzeitigen Schwankungen Beeper erst wieder aus wenn UBat 0,2 V höher als Warnschwelle
//{ //Beeper aus
// BeepTime = 0;
// BeepMuster = 0xFFFF;
//}
// Akku Warnung Ende
 
// Current
write_ndigit_number_u_10th (7, 7, naviData->Current, 3, 0);
lcd_putc (11, 7, 'A', 0);
 
// Capacity
write_ndigit_number_u (14, 7, naviData->UsedCapacity, 4, 0);
lcd_printp_at(18, 7, PSTR("mAh"), 0);
 
// remember statistics (only when engines running)
if (naviData->FCFlags & FCFLAG_MOTOR_RUN)
{
if (naviData->Altimeter > max_Altimeter) max_Altimeter = naviData->Altimeter;
if (naviData->GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData->GroundSpeed;
if (naviData->HomePositionDeviation.Distance > max_Distance) max_Distance = naviData->HomePositionDeviation.Distance;
if (naviData->UBat < min_UBat) min_UBat = naviData->UBat;
if (naviData->FlyingTime > max_FlyingTime) max_FlyingTime = naviData->FlyingTime;
if (naviData->Current > max_Current) max_Current = naviData->Current;
if (naviData->UsedCapacity > max_Capacity) max_Capacity = naviData->UsedCapacity;
}
 
// remember last values
last_RC_Quality = naviData->RC_Quality;
last_UBat = naviData->UBat;
old_FCFlags = naviData->FCFlags;
 
rxd_buffer_locked = FALSE;
}
// 3D Lage anzeige beginnt hier -----------------------------------
else if (OSD_Mode == 3)
{
uint16_t head_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
 
lcd_cls ();
 
lcd_line(0,32,128,32,1); // horizontal //
lcd_line(64,0,64,64,1); // vertical //
lcd_printp_at(12, 7, PSTR("End Info"), 0);
 
 
// 45' Angel
lcd_line(62,11,66,11,1); // -- //
lcd_line(22,30,22,34,1); // | //
lcd_line(106,30,106,34,1); // | //
lcd_line(62,53,66,53,1); // -- //
 
if (info_3D == 1)
{
lcd_line(34,17,36,15,1); // / //
lcd_line(92,15,94,17,1); // \ //
lcd_line(34,47,36,49,1); // \ //
lcd_line(92,49,94,47,1); // / //
 
// lcd_printp_at(9, 0, PSTR("V"), 0);
// lcd_printp_at(0, 3, PSTR("L"), 0);
// lcd_printp_at(20, 3, PSTR("R"), 0);
// lcd_printp_at(9, 7, PSTR("H"), 0);
 
lcd_puts_at(9, 0, strGet(OSD_V), 0);
lcd_puts_at(0, 3, strGet(OSD_L), 0);
lcd_puts_at(20, 3, strGet(OSD_R), 0);
lcd_puts_at(9, 7, strGet(OSD_H), 0);
 
lcd_printp_at(0, 0, PSTR("N:"), 0);
write_ndigit_number_s (2, 0, naviData->AngleNick, 3, 0);
 
lcd_printp_at(0, 7, PSTR("R:"), 0);
write_ndigit_number_s (2, 7, naviData->AngleRoll, 3, 0);
 
lcd_printp_at(15, 0, PSTR("K:"), 0);
write_ndigit_number_s (18, 0,head_home, 3, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
info_3D++;
if (info_3D > 1)
info_3D = 0;
}
 
uint8_t Nick = ((-naviData->AngleNick/2)+32);
uint8_t Roll = -naviData->AngleRoll+64;
lcd_ecircle(old_AngleRoll,old_AngleNick, 10, 0);
lcd_ecirc_line (old_AngleRoll, old_AngleNick, 9, old_hh, 0);
 
lcd_ecircle(Roll, Nick, 10, 1);
lcd_ecirc_line (Roll, Nick, 9, head_home, 1);
 
old_hh = head_home;
old_AngleNick = Nick;
old_AngleRoll = Roll;
// remember last values
last_RC_Quality = naviData->RC_Quality;
last_UBat = naviData->UBat;
old_FCFlags = naviData->FCFlags;
rxd_buffer_locked = FALSE;
}
 
if (!abo_timer)
{ // renew abo every 3 sec
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
abo_timer = ABO_TIMEOUT;
}
}
}
while (!get_key_press (1 << KEY_ESC) && timer);
 
get_key_press(KEY_ALL);
 
 
// disable OSD Data from NC
// RS232_request_mk_data (1, 'o', 0);
tmp_dat = 0;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
 
// Bei Verbindungsverlusst werden hier die letzten bekannten Koordinaten ausgegeben!!!
if (!timer)
{ // timeout occured
if (flag)
{
// Falls Spannungswarnung an war Beeper aus//
BeepTime = 0;
BeepMuster = 0xFFFF;
 
lcd_cls ();
WriteLastPosition(last5pos[0].Longitude,last5pos[0].Latitude); // im EEprom speichern
lcd_puts_at(0, 0, strGet(OSD_ERROR), 2);
 
// lcd_printp_at (0, 0, PSTR(" ERROR: Datenverlust "), 2);
 
// lcd_printp_at (0, 2, PSTR("Letzte bekannte"), 0);
// lcd_printp_at (0, 3, PSTR("Position gespeichert."), 0);
lcd_puts_at(0, 2, strGet(OSD_POS1), 0);
lcd_puts_at(0, 3, strGet(OSD_POS2), 0);
// lcd_printp_at (19, 7, PSTR("OK"), 0);
lcd_puts_at(19, 7, strGet(OK), 0);
// lcd_printp_at (0, 5, PSTR(" Breitengr Längengr "), 0);
 
lcd_puts_at(0, 5, strGet(START_LASTPOS1), 0);
 
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
BeepTime = 1500;
BeepMuster = 0x0040;
error = 1;
 
uint32_t lon = last5pos[0].Longitude;
write_ndigit_number_u (1, 6, (uint16_t)(lon/10000000), 2, 0);
lcd_printp_at (3, 6, PSTR("."), 0);
write_ndigit_number_u (4, 6, (uint16_t)((lon/1000) % 10000), 4, 1);
write_ndigit_number_u (8, 6, (uint16_t)((lon/10) % 100), 2, 1);
 
uint32_t lat = last5pos[0].Latitude;
write_ndigit_number_u (12, 6, (uint16_t)(lat/10000000), 2, 0);
lcd_printp_at (14, 6, PSTR("."), 0);
write_ndigit_number_u (15, 6, (uint16_t)((lat/1000) % 10000), 4, 1);
write_ndigit_number_u (19, 6, (uint16_t)((lat/10) % 100), 2, 1);
 
while (!get_key_press (1 << KEY_ENTER));
 
timer = TIMEOUT;
lcd_cls();
return;
 
}
}
}
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/osd.h
0,0 → 1,41
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _OSD_H
#define _OSD_H
 
void osd (uint8_t ShowMode);
void vario_beep_output (void);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/parameter.c
0,0 → 1,1379
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
 
#include "main.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#include "mk-data-structs.h"
#include "parameter.h"
#include "menu.h"
#include "eeprom.h"
#include "parameter_names.h"
#include "messages.h"
 
#define TIMEOUT 500 // 5 sec
 
uint8_t display_settings_menu (void);
uint8_t display_param_menu (uint8_t);
uint8_t load_setting (uint8_t);
uint8_t write_setting (uint8_t);
uint8_t display_section_menu(void);
void edit_param(uint8_t);
void copy_setting(void);
 
 
mk_param_struct_t *mk_param_struct;
 
uint8_t ii;
volatile uint8_t offset = 0;
volatile uint8_t dmode = 0;
volatile uint8_t target_pos = 1;
volatile uint8_t offset2 = 0;
volatile uint8_t pmode = 0;
volatile uint8_t target_pos2 = 1;
volatile uint8_t setting = 0;
uint8_t changes = 0;
 
#define OFFSETOF(type, field) ((unsigned int) &(((type *) 0)->field))
 
#define MKOSO(field) (uint8_t)OFFSETOF(mk_param_struct_t, field)
 
//--------------------------------------------------------------
// Group, Typ, Min, Max, Struct-Name(Value), Default1, Default2, Default3+4+5,
// 0 1 2 3 4 5 6 7
// |||
// Typ == (0 ohne Poti, 1 mit Poti, 2 bitfield, 3 serCh, 4 LEDmask, 5 Angle, 6 Empfaenger),
//
prog_uchar param_config[8*PARAM_COUNT]=
{
// group 0 (kanaele) 1-15
 
0,0,1,12, MKOSO(Kanalbelegung)+2 , 1,1,1, // gas
0,0,1,12, MKOSO(Kanalbelegung)+3 , 4,4,4, // gier
0,0,1,12, MKOSO(Kanalbelegung)+0 , 3,3,3, // nick
0,0,1,12, MKOSO(Kanalbelegung)+1 , 2,2,2, // roll
0,3,1,25, MKOSO(Kanalbelegung)+4 , 5,5,5, // poti1
0,3,1,25, MKOSO(Kanalbelegung)+5 , 6,6,6, // poti2
0,3,1,25, MKOSO(Kanalbelegung)+6 , 7,7,7, // poti3
0,3,1,25, MKOSO(Kanalbelegung)+7 , 8,8,8, // poti4
0,3,1,25, MKOSO(Kanalbelegung)+8 , 9,9,9, // poti5
0,3,1,25, MKOSO(Kanalbelegung)+9 , 10,10,10, // poti6
0,3,1,25, MKOSO(Kanalbelegung)+10, 11,11,11, // poti7
0,3,1,25, MKOSO(Kanalbelegung)+11, 12,12,12, // poti8
0,0,0,12, MKOSO(MotorSafetySwitch), 0,0,0, // Motor Sicherungsswitch
0,2,0,0x04, MKOSO(ExtraConfig), 0,0,0, // erweiterte signal pruefung
0,6,0,6, MKOSO(Receiver), 1,1,1,
 
 
// group 1 (main) 16-23
 
1,2,0,0x01, MKOSO(GlobalConfig), 0,0,0, // hoehenregler
1,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
1,2,0,0x08, MKOSO(GlobalConfig), 1,1,1, // kompass
1,2,0,0x10, MKOSO(GlobalConfig), 0,0,0, // feste ausrichtung
1,2,0,0x04, MKOSO(ExtraConfig), 0,0,0, // erweiterte signal pruefung
1,2,0,0x40, MKOSO(GlobalConfig), 1,1,1, // achsentkopplung
1,2,0,0x80, MKOSO(GlobalConfig), 0,0,0, // drehratenbregrenzung
1,2,0,0x04, MKOSO(GlobalConfig), 0,0,0, // heading hold
 
 
 
// group 2 (stick) 24-27
 
2,0,0,20, MKOSO(Stick_P), 10,8,6,
2,0,0,20, MKOSO(Stick_D), 16,16,10,
2,1,0,255, MKOSO(StickGier_P), 6,6,4,
2,1,0,255, MKOSO(ExternalControl), 0,0,0,
 
 
// group3 : looping 28-36
 
3,2,0,0x01, MKOSO(BitConfig), 0,0,0, // oben
3,2,0,0x02, MKOSO(BitConfig), 0,0,0, // unten
3,2,0,0x04, MKOSO(BitConfig), 0,0,0, // links
3,2,0,0x08, MKOSO(BitConfig), 0,0,0, // rechts
3,1,0,255, MKOSO(LoopGasLimit), 50,50,50,
3,0,0,247, MKOSO(LoopThreshold), 90,90,90,
3,0,0,247, MKOSO(LoopHysterese), 50,50,50,
3,0,0,247, MKOSO(WinkelUmschlagNick), 78,78,78,
3,0,0,247, MKOSO(WinkelUmschlagRoll), 78,78,78,
 
 
// group 4 (hoehe) 37-50
 
4,2,0,0x01, MKOSO(GlobalConfig), 0,0,0, // hoehenrelger
4,2,0,0x01, MKOSO(ExtraConfig), 0,0,0, // vario oder hoeenbergenzung
4,2,0,0x02, MKOSO(GlobalConfig), 1,1,1, // hoehenschalter
4,2,0,0x02, MKOSO(ExtraConfig), 1,1,1, // variobeep
4,1,0,255, MKOSO(MaxHoehe), 255,255,255,
4,0,0,247, MKOSO(Hoehe_MinGas), 30,30,30,
4,1,0,255, MKOSO(Hoehe_P), 15,15,15,
4,1,0,255, MKOSO(Luftdruck_D), 30,30,30,
4,1,0,255, MKOSO(Hoehe_ACC_Wirkung), 0,0,0,
4,1,0,255, MKOSO(MaxAltitude), 150,150,150,
4,0,0,247, MKOSO(Hoehe_Verstaerkung), 15,15,15,
4,0,0,247, MKOSO(Hoehe_HoverBand), 8,8,8,
4,1,0,255, MKOSO(Hoehe_GPS_Z), 64,64,64,
4,0,0,160, MKOSO(Hoehe_StickNeutralPoint), 0,0,0,
 
 
// group 5 : kamera 51-66
 
5,1,0,255, MKOSO(ServoNickControl), 128,128,128,
5,0,0,247, MKOSO(ServoNickComp), 50,50,50,
5,2,0,0x01, MKOSO(ServoCompInvert), 0,0,0, // nick
5,0,0,247, MKOSO(ServoNickMin), 15,15,15,
5,0,0,247, MKOSO(ServoNickMax), 230,230,230,
5,1,0,255, MKOSO(ServoRollControl), 128,128,128,
5,0,0,247, MKOSO(ServoRollComp), 85,85,85,
5,2,0,0x02, MKOSO(ServoCompInvert), 0,0,0, // roll
5,0,0,247, MKOSO(ServoRollMin), 70,70,70,
5,0,0,247, MKOSO(ServoRollMax), 220,220,220,
5,0,2,8, MKOSO(ServoNickRefresh), 4,4,4,
5,0,0,247, MKOSO(ServoManualControlSpeed), 60,60,60,
5,5,0,247, MKOSO(CamOrientation), 0,0,0,
5,1,0,255, MKOSO(Servo3), 125,125,125,
5,1,0,255, MKOSO(Servo4), 125,125,125,
5,1,0,255, MKOSO(Servo5), 125,125,125,
 
 
// group 6 : navictrl 67-85
 
6,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
6,1,0,255, MKOSO(NaviGpsModeControl), 254,254,254,
6,1,0,255, MKOSO(NaviGpsGain), 100,100,100,
6,0,0,247, MKOSO(NaviStickThreshold), 8,8,8,
6,0,0,247, MKOSO(NaviGpsMinSat), 6,6,6,
6,1,0,255, MKOSO(NaviGpsP), 90,90,90,
6,1,0,255, MKOSO(NaviGpsI), 90,90,90,
6,1,0,255, MKOSO(NaviGpsD), 90,90,90,
6,1,0,255, MKOSO(NaviGpsPLimit), 75,75,75,
6,1,0,255, MKOSO(NaviGpsILimit), 85,85,85,
6,1,0,255, MKOSO(NaviGpsDLimit), 75,75,75,
6,1,0,255, MKOSO(NaviGpsACC), 0,0,0,
6,1,0,255, MKOSO(NaviWindCorrection), 90,90,90,
6,1,0,255, MKOSO(NaviAccCompensation), 42,42,42,
6,1,0,255, MKOSO(NaviOperatingRadius), 245,245,245,
6,1,0,255, MKOSO(NaviAngleLimitation), 140,140,140,
6,0,0,247, MKOSO(NaviPH_LoginTime), 5,5,5,
6,2,0,0x20, MKOSO(ExtraConfig), 0,0,0, // dynamic ph
6,0,0,247, MKOSO(ComingHomeAltitude), 0,0,0,
 
 
// group 7 : ausgaenge 86-95
 
7,4,0,255, MKOSO(J16Bitmask), 95,95,95,
7,1,0,255, MKOSO(J16Timing), 20,20,20,
7,2,0,0x20, MKOSO(BitConfig), 0,0,0, // Motor_Off_Led1
7,2,0,0x10, MKOSO(BitConfig), 1,1,1, // Motor_Blink1
7,4,0,255, MKOSO(J17Bitmask), 243,243,243,
7,1,0,255, MKOSO(J17Timing), 20,20,20,
7,2,0,0x40, MKOSO(BitConfig), 0,0,0, // Motor_Off_Led2
7,2,0,0x80, MKOSO(BitConfig), 1,1,1, // Motor_Blink2
7,4,0,255, MKOSO(WARN_J16_Bitmask), 170,170,170,
7,4,0,255, MKOSO(WARN_J17_Bitmask), 170,170,170,
 
 
// group 8 : versch. 96-107
 
8,0,0,247, MKOSO(Gas_Min), 8,8,8,
8,0,0,247, MKOSO(Gas_Max), 230,230,230,
8,1,0,255, MKOSO(KompassWirkung), 64,64,64,
8,1,0,255, MKOSO(CareFreeModeControl), 0,0,0, // Carefree
8,2,0,0x40, MKOSO(ExtraConfig), 0,0,0, // teachable Carefree
8,0,0,247, MKOSO(UnterspannungsWarnung), 33,33,33,
8,2,0,0x08, MKOSO(ExtraConfig), 0,0,0, // Voltage referenz
8,0,0,247, MKOSO(NotGasZeit), 90,90,90,
8,0,0,247, MKOSO(NotGas), 45,45,45,
8,0,0,247, MKOSO(FailSafeTime), 0,0,0,
8,2,0,0x80, MKOSO(ExtraConfig), 0,0,0, // Ignore Compass Error
8,2,0,0x10, MKOSO(ExtraConfig), 0,0,0, // Kein Summer ohne Sender beim Start
 
 
// group 9 : gyro 108-120
 
9,1,0,255, MKOSO(Gyro_P), 90,100,100,
9,1,0,255, MKOSO(Gyro_I), 120,120,120,
9,1,0,255, MKOSO(Gyro_D), 10,10,10,
9,1,0,255, MKOSO(Gyro_Gier_P), 90,100,100,
9,1,0,255, MKOSO(Gyro_Gier_I), 120,120,120,
9,1,0,255, MKOSO(DynamicStability), 70,70,70,
9,2,0,0x80, MKOSO(GlobalConfig), 0,0,0, // drehratenbregrenzung
9,0,0,247, MKOSO(GyroAccFaktor), 27,27,27,
9,0,0,247, MKOSO(GyroAccAbgleich), 32,32,32,
9,1,0,255, MKOSO(I_Faktor), 16,16,16,
9,0,0,247, MKOSO(Driftkomp), 0,0,0,
9,0,0,16, MKOSO(Gyro_Stability), 6,6,6,
9,0,0,247, MKOSO(MotorSmooth), 0,0,0,
 
 
// group 10: benutzer 121-128
 
10,1,0,255, MKOSO(UserParam1), 0,0,0,
10,1,0,255, MKOSO(UserParam2), 0,0,0,
10,1,0,255, MKOSO(UserParam3), 0,0,0,
10,1,0,255, MKOSO(UserParam4), 0,0,0,
10,1,0,255, MKOSO(UserParam5), 0,0,0,
10,1,0,255, MKOSO(UserParam6), 0,0,0,
10,1,0,255, MKOSO(UserParam7), 0,0,0,
10,1,0,255, MKOSO(UserParam8), 0,0,0,
 
 
// group 11: achskoppl 129-132
 
11,2,0,0x40, MKOSO(GlobalConfig), 0,0,0, // achsentkopplung
11,1,0,255, MKOSO(AchsKopplung1), 90,90,90,
11,1,0,255, MKOSO(AchsKopplung2), 55,55,55,
11,1,0,255, MKOSO(CouplingYawCorrection), 70,70,70,
 
 
// group 12: mixer 133
 
12,5,0,23,MKOSO(OrientationAngle), 0,0,0,
 
// group 13 (easy-setup) 134-144
 
13,2,0,0x01, MKOSO(GlobalConfig), 0,0,0, // hoehenrelger
13,1,0,255, MKOSO(MaxHoehe), 255,255,255,
13,0,0,160, MKOSO(Hoehe_StickNeutralPoint), 0,0,0,
13,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
13,1,0,255, MKOSO(NaviGpsModeControl), 254,254,254,
13,2,0,0x20, MKOSO(ExtraConfig), 0,0,0, // dynamic ph
13,0,0,247, MKOSO(ComingHomeAltitude), 0,0,0,
13,1,0,255, MKOSO(CareFreeModeControl), 0,0,0, // Carefree
13,2,0,0x40, MKOSO(ExtraConfig), 0,0,0, // teachable Carefree
13,0,0,12, MKOSO(MotorSafetySwitch), 0,0,0, // Motor Sicherungsswitch
13,5,0,23, MKOSO(OrientationAngle), 0,0,0,
 
};
 
 
//--------------------------------------------------------------
#define ITEMS_RX 7
 
prog_char param_items_rx[ITEMS_RX][17]= // zeilen,zeichen+1
{
"PPM ",
"Spektrum ",
"Spektrum HiRes ",
"Spektrum LoRes ",
"Jeti ",
"ACT DSL ",
"HOTT ",
};
 
 
//--------------------------------------------------------------
void edit_parameter(void)
{
SwitchToFC();
 
 
// uint8_t setting;
 
 
setting = display_settings_menu();
 
if(setting == 255)
return;
 
if(setting == 6)
{
copy_setting();
return;
}
 
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" Setting x "), 2);
lcd_puts_at(0, 0, strGet(PARA_SETTINGS), 2);
lcd_putc (9, 0, (setting + 48), 2); // ASCII ab 48 (hex 30) beginnt 0 - 9
// lcd_printp_at (3, 2, PSTR("ändern"), 0);
// lcd_printp_at (3, 3, PSTR("aktivieren"), 0);
lcd_puts_at(3, 2, strGet(PARA_CHANGE), 0);
lcd_puts_at(3, 3, strGet(PARA_AKTIVI), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
uint8_t val = menu_choose2 (2, 3, 2, 0, 0);
if (val == 255)
return;
if(val == 3)
{
load_setting(setting);
uint8_t setting_written = write_setting(setting);
if(setting_written == setting)
{
lcd_cls_line (0,2,21);
lcd_cls_line (0,3,21);
// lcd_printp_at (11, 0, PSTR("aktiviert"), 0);
lcd_puts_at(11, 0, strGet(PARA_AKTIV), 0);
}
else
{
lcd_cls_line (0,2,21);
lcd_cls_line (0,3,21);
// lcd_printp_at (0, 4, PSTR("Error"), 0);
lcd_puts_at(0, 4, strGet(FEHLER), 0);
}
_delay_ms(2000);
return;
}
 
if(setting == 255)
return;
 
uint8_t setting_loaded = load_setting(setting);
if(setting_loaded == 255)
return;
 
offset = 0;
dmode = 0;
target_pos = 1;
changes =0;
uint8_t group =0;
 
do
{
group = display_section_menu();
if(group != 255)
{
offset2 = 0;
pmode = 0;
target_pos2 = 1;
uint8_t param;
do
{
param = display_param_menu(group);
if(param != 255)
{
edit_param(param);
}
}
while(param != 255);
}
}
while(group != 255);
 
if(changes == 1)
{
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" Setting x speichern?"), 2);
lcd_puts_at(0, 0, strGet(PARA_SAVESETT), 2);
lcd_putc (9, 0, (setting + 48), 2); // ASCII ab 48 (hex 30) beginnt 0 - 9
write_ndigit_number_u(9, 0, setting, 1, 0);
// lcd_printp_at (3, 2, PSTR("Ja"), 0);
// lcd_printp_at (3, 3, PSTR("Nein"), 0);
 
lcd_puts_at(3, 2, strGet(YES), 0);
lcd_puts_at(3, 3, strGet(NOO), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
uint8_t val = menu_choose2 (2, 3, 2, 0, 0);
if(val == 2)
{
uint8_t setting_written = write_setting(setting);
if(setting_written == setting)
{
// lcd_printp_at (3, 4, PSTR("Gespeichert und"), 0);
lcd_puts_at(3, 4, strGet(PARA_SETTSAVED), 0);
// lcd_printp_at (3, 5, PSTR("Aktiviert"), 0);
lcd_puts_at(3, 5, strGet(PARA_AKTIV), 0);
}
else
{
// lcd_printp_at (0, 4, PSTR("Error"), 0);
lcd_puts_at(0, 4, strGet(FEHLER), 0);
}
timer = 100;
while (timer > 0);
 
}
}
}
 
 
//--------------------------------------------------------------
void copy_setting(void)
{
uint8_t fromsetting = 3;
uint8_t tosetting = 5;
 
lcd_cls();
 
// lcd_printp_at (0, 1, PSTR("Kopiere Setting"), 0);
// lcd_printp_at (0, 3, PSTR("von x nach y"), 0);
// lcd_printp_at (0, 7, PSTR("von nach Ende OK"), 0);
 
lcd_puts_at(0, 1, strGet(PARA_COPY), 0);
lcd_puts_at(0, 3, strGet(PARA_FROMTO), 0);
lcd_puts_at(0, 7, strGet(PARA_ENDE), 0);
 
do
{
write_ndigit_number_u(5,3,fromsetting, 1,0);
write_ndigit_number_u(14,3,tosetting, 1,0);
 
if(get_key_press (1 << KEY_MINUS))
{
fromsetting++;
if(fromsetting == 6) fromsetting = 1;
}
if(get_key_press (1 << KEY_PLUS))
{
tosetting++;
if(tosetting == 6) tosetting = 1;
}
if(get_key_press (1 << KEY_ENTER))
{
lcd_printp_at (0, 5, PSTR("Wirklich Kopieren?"), 0);
lcd_puts_at(0, 5, strGet(PARA_COPYQ), 0);
// lcd_printp_at (0, 7, PSTR(" Ende OK"), 0);
lcd_puts_at(12, 7, strGet(KEYLINE4), 0);
do
{
if(get_key_press (1 << KEY_ENTER))
{
uint8_t loaded = load_setting(fromsetting);
if(loaded == fromsetting)
{
uint8_t written = write_setting(tosetting);
if(written == tosetting)
{
lcd_printp_at (0, 5, PSTR("Kopiert und Aktiviert"), 0);
lcd_puts_at(0, 5, strGet(PARA_COPYACTIV), 0);
}
else
{
// lcd_printp_at (0, 5, PSTR("Fehler"), 0);
lcd_puts_at(0, 5, strGet(FEHLER), 0);
lcd_cls_line (6, 5, 14);
}
}
else
{
// lcd_printp_at (0, 5, PSTR("Fehler"), 0);
lcd_puts_at(0, 5, strGet(FEHLER), 0);
lcd_cls_line (6, 5, 14);
}
timer = 100;
while (timer > 0);
return;
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
lcd_cls_line (0, 5, 21);
// lcd_printp_at (0, 7, PSTR("von nach Ende OK"), 0);
lcd_puts_at(0, 7, strGet(PARA_ENDE), 0);
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
 
//--------------------------------------------------------------
void edit_param(uint8_t param)
{
lcd_cls();
uint8_t type = pgm_read_byte(param_config+(8*param)+1);
// lcd_printp_at (0, 0, PSTR(" Ändere Setting: "), 2);
lcd_puts_at(0, 0, strGet(PARA_CHANGESETT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
if(type != 6)
lcd_printp_at(0,2,param_names[param][DisplayLanguage], 0);
 
 
//-------------------------------------------------------
if(type == 0) // ohne poti
{
lcd_printp_at (4, 4, PSTR("( - ) (d: )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
write_ndigit_number_u (5, 4, min, 3, 0);
write_ndigit_number_u (9, 4, max, 3, 0);
write_ndigit_number_u (17, 4, defaultvalue, 3, 0);
 
do
{
write_ndigit_number_u (0, 4, newvalue, 3, 0);
lcd_frect ((8*0), (8*5), (newvalue * (16*8) / max), 6, 1);
 
if(max >= 50)
{
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 3))
{
if((newvalue-1) >= min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
else
{
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
if((newvalue-1) >= min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
 
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 1) // mit poti
{
lcd_printp_at (4, 4, PSTR("(0-247-P8)(d:Po )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
uint8_t mode = 0;
 
if(defaultvalue > 247)
{
lcd_printp_at (17, 4, PSTR("Po )"), 0);
write_ndigit_number_u (19, 4, 256-defaultvalue, 1, 0);
}
else
write_ndigit_number_u (17, 4, defaultvalue, 3, 0);
 
if(value > 247)
mode = 1;
 
do
{
if(newvalue > 247)
mode = 1;
else
mode = 0;
 
if(mode == 0)
{
write_ndigit_number_u (0, 4, newvalue, 3, 0);
lcd_frect ((8*0), (8*5), (newvalue * (16*8) / max), 6, 1);
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
if((newvalue+1) <= max)
newvalue++;
 
if(newvalue > 247)
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = 255;
}
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 3))
{
if((newvalue-1)>=min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
else
{
lcd_printp_at (0, 4, PSTR("Po"), 0);
write_ndigit_number_u (2, 4, 256 - newvalue, 1, 0);
lcd_frect ((8*0), (8*5), ((256 - newvalue) * (16*8) / 8), 6, 1);
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if(newvalue - 1 > 247)
{
newvalue--;
}
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
lcd_frect (((255 - newvalue) * (16*8) / 8), (8*5), (16*8), 6, 0);
// lcd_frect (((255 - newvalue) * (16*8) / 8), (8*5), ((16*8) / 8), 6, 0);
newvalue++;
 
if(newvalue == 0)
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0); // balken löschen
newvalue = 247;
}
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 2) // ja/nein
{
// lcd_printp_at (3, 4, PSTR("Ja"), 0);
// lcd_printp_at (3, 5, PSTR("Nein"), 0);
lcd_puts_at(3, 4, strGet(YES), 0);
lcd_puts_at(3, 5, strGet(NOO), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
uint8_t bitmap = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
if(defaultvalue == 1)
lcd_printp_at (8, 4, PSTR("*"), 0);
if(defaultvalue == 0)
lcd_printp_at (8, 5, PSTR("*"), 0);
 
do
{
if(newvalue & bitmap)
{
lcd_printp_at (1, 4, PSTR("\x1d"), 0);
lcd_printp_at (1, 5, PSTR(" "), 0);
}
else
{
lcd_printp_at (1, 4, PSTR(" "), 0);
lcd_printp_at (1, 5, PSTR("\x1d"), 0);
}
 
if((get_key_press (1 << KEY_MINUS)) && (!(newvalue & bitmap)))
newvalue ^= bitmap;
 
if((get_key_press (1 << KEY_PLUS)) && (newvalue & bitmap))
newvalue ^= bitmap;
 
if(get_key_press (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 3) // serCH
{
lcd_printp_at (4, 4, PSTR("(1-S12/W) (d: )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
write_ndigit_number_u (17, 4, defaultvalue, 3, 0);
 
do
{
if (newvalue<=(max-13))
write_ndigit_number_u (0, 4, newvalue, 3, 0);
else
{
if (newvalue<=(max-1))
{
lcd_printp_at (0, 4, PSTR("S"), 0);
write_ndigit_number_u (1, 4, (newvalue-12), 2, 0);
}
}
if (newvalue==max)
lcd_printp_at (0, 4, PSTR("WPE"), 0);
 
lcd_frect ((8*0), (8*5), (newvalue * (16*8)) / max, 6, 1);
 
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
if((newvalue-1)>=min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
newvalue--;
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 4) // led bitfeld
{
// TODO: Übersetzung
lcd_printp_at (0, 7, PSTR(" \x19 0\x11I Ende OK"), 0);
 
if (param == 93 || param == 94)
// lcd_printp_at (5, 6, PSTR("aktiv"), 0);
lcd_puts_at(5, 6, strGet(AKTIV), 0);
 
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t newvalue = value;
uint8_t pos = 0;
 
do
{
 
for(ii = 0; ii < 8; ii++)
{
if(newvalue & (1 << ii))
lcd_printp_at (8-ii, 4,PSTR("1"),0);
else
lcd_printp_at (8-ii, 4,PSTR("0"),0);
}
lcd_printp_at (pos+1, 5,PSTR("\x12"),0);
 
if(get_key_press (1 << KEY_MINUS))
{
lcd_printp_at (pos+1, 5,PSTR(" "),0);
pos++;
if(pos == 8)
pos = 0;
}
 
if (param == 93 || param == 94)
{
if(get_key_long (1 << KEY_PLUS))
{
if (newvalue != 0)
newvalue = 0;
else
newvalue = 170;
}
}
 
if(get_key_short (1 << KEY_PLUS))
newvalue ^= (1<<(7-pos));
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes = 1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 5) // Angle
{
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
 
lcd_ecircle(102, 35, 16, 1);
 
uint8_t newvalue = value;
uint8_t oldvalue = newvalue;
do
{
 
if(oldvalue != newvalue) lcd_ecirc_line (102, 35, 15, oldvalue*15, 0);
oldvalue = newvalue;
lcd_ecirc_line (102, 35, 15, newvalue*15, 1);
 
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
newvalue++;
if(newvalue == 24)
newvalue = 0;
}
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if(newvalue == 0)
newvalue = 24;
newvalue--;
}
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 6) // receiver
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
 
uint8_t newvalue = value + 1;
uint8_t val =0;
uint8_t ii = 0;
uint8_t offset = 0;
uint8_t dmode = 0;
uint8_t target_pos = 1;
 
uint8_t size = ITEMS_RX;
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
lcd_printp_at(3,ii+1,param_items_rx[ii+offset], 0);
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
}
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose3 (1, 5, target_pos,0,1); //menu_choose3 (min, max, start, return_at_start, return_at_end)
else
val = menu_choose3 (1, size, target_pos,0,0);
}
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose3 (2, 6, target_pos,1,0);
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
if(val == 254) // überlauf unten
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253) // überlauf oben
{
offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 252) // ESC
return;
else if(val <= size)
{
newvalue = val + offset - 1;
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
return;
}
}
}
}
 
 
//--------------------------------------------------------------
uint8_t display_param_menu(uint8_t group)
{
uint8_t items[20];
 
uint8_t size=0;
for(ii = 0;ii < PARAM_COUNT; ii++)
{
if(pgm_read_byte(param_config+(8*ii)) == (group-1))
{
items[size] = ii;
size++;
}
}
 
uint8_t val =0 ;
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wähle Parameter: "), 2);
lcd_puts_at(0, 0, strGet(PARA_SELECT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
ii = 0;
if(offset2 > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset2) < size)
{
lcd_printp_at(3,ii+1,param_names[items[ii+offset2]][DisplayLanguage], 0);
// this reads the the offset in the struct from the pgm configuration table and then reads the value from the struct
 
uint8_t type = pgm_read_byte(param_config+(8*items[ii+offset2])+1);
 
if(type == 0)
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0);
 
if(type == 1)
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
 
if(value < 248)
write_ndigit_number_u (18, ii+1, value, 3, 0);
 
if(value >= 248)
{
lcd_printp_at (18, ii+1, PSTR(" P"), 0);
write_ndigit_number_u (20, ii+1, 256-value, 1, 0);
}
}
 
if(type == 2)
{
 
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
uint8_t bitmap = pgm_read_byte(param_config+(8*items[ii+offset2])+3);
if(value & bitmap)
lcd_printp_at (18, ii+1, PSTR(" J"), 0);
else
lcd_printp_at (18, ii+1, PSTR(" N"), 0);
 
}
 
if(type == 3)
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
if (value<=12)
write_ndigit_number_u (18, ii+1, value, 3, 0);
else
if (value<=(24))
{
lcd_printp_at (18, ii+1, PSTR("S"), 0);
write_ndigit_number_u (19, ii+1, (value-12), 2, 0);
}
 
if (value==25)
lcd_printp_at (18, ii+1, PSTR("WPE"), 0);
 
}
 
if(type == 4)
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0);
 
if(type == 5)
write_ndigit_number_u (18, ii+1, (*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)))*15, 3, 0);
 
if(type == 6) // Empfänger Typ
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
 
if(value == 0)
lcd_printp_at (18, ii+1, PSTR("PPM"), 0);
else if(value == 1)
lcd_printp_at (18, ii+1, PSTR("Spe"), 0);
else if(value == 2)
lcd_printp_at (18, ii+1, PSTR("SpH"), 0);
else if(value == 3)
lcd_printp_at (18, ii+1, PSTR("SpL"), 0);
else if(value == 4)
lcd_printp_at (18, ii+1, PSTR("Jet"), 0);
else if(value == 5)
lcd_printp_at (18, ii+1, PSTR("ACT"), 0);
else if(value == 6)
lcd_printp_at (18, ii+1, PSTR("HoT"), 0);
else
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0);
 
}
}
 
if((ii == 5)&&(ii+offset2 < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(pmode == 0)
{
if(offset2 == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos2,0,1);
else
val = menu_choose2 (1, size, target_pos2,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos2,1,1);
 
}
if(pmode == 1)
{
if(offset2+7 > size)
val = menu_choose2 (2, 6, target_pos2,1,0);
else
val = menu_choose2 (2, 5, target_pos2,1,1);
 
}
 
if(val == 254)
{
offset2++;
pmode = 1;
target_pos2 = 5;
}
else if(val == 253)
{
offset2--;
pmode = 0;
target_pos2 = 2;
}
else
break;
 
}
 
if(val != 255)
{
target_pos2=val;
return items[val+offset2-1];
}
else
return val;
 
}
 
 
//--------------------------------------------------------------
uint8_t display_section_menu(void)
{
uint8_t size = PAGES;
 
uint8_t val =0;
 
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wähle Seite: "), 2);
lcd_puts_at(0, 7, strGet(PARA_SEITE),2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
lcd_printp_at(3,ii+1,param_pages[ii+offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
 
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
 
if(val == 254)
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
offset--;
dmode = 0;
target_pos = 2;
}
else
break;
 
}
 
if(val != 255)
{
target_pos=val;
return val+offset;
}
else
return val;
 
}
 
 
//--------------------------------------------------------------
uint8_t display_settings_menu (void)
{
uint8_t status;
 
lcd_cls ();
 
// lcd_printp_at (0, 0, PSTR(" Wähle Setting: "), 2);
lcd_puts_at(0, 0, strGet(PARA_SELSETT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
 
for(setting=1;setting<6;setting++)
{
status = load_setting(setting);
if(status == 255)
return 255;
 
write_ndigit_number_u (3, setting, status, 1, 0);
lcd_print_at (5,setting,(uint8_t*)mk_param_struct->Name, 0);
}
// lcd_printp_at (3, 6, PSTR("Kopiere Setting"), 0);
lcd_puts_at(3, 6, strGet(PARA_COPY), 0);
 
status = load_setting(0xff);
if(status == 255)
return 255;
 
setting = menu_choose (1, 6, 1,status);
 
return setting;
}
 
 
//--------------------------------------------------------------
uint8_t load_setting(uint8_t setting)
{
mode = 'Q'; // Settings
uint8_t timeout = 50;
rxd_buffer_locked = FALSE;
 
while (!rxd_buffer_locked && timeout)
{
SendOutData ('q', ADDRESS_FC, 1, &setting, 1);
// _delay_ms(50);
timer = 20;
while (timer > 0);
timeout--;
}
 
if (timeout != 0)
{
Decode64 ();
setting = *pRxData;
mk_param_struct = (mk_param_struct_t *) (pRxData + 1) ;
}
else
{ // timeout occured
// lcd_printp_at (0, 2, PSTR("Fehler: keine Daten"), 0);
lcd_puts_at(0, 2, strGet(OSD_ERROR), 0);
timer = 100;
while (timer > 0);
setting = 255;
}
return setting;
}
 
 
//--------------------------------------------------------------
uint8_t write_setting(uint8_t setting)
{
mode = 'S'; // Settings
uint8_t timeout = 50;
rxd_buffer_locked = FALSE;
 
while (!rxd_buffer_locked && timeout)
{
SendOutData ('s', ADDRESS_FC, 2, &setting, 1, mk_param_struct, sizeof(mk_param_struct_t));
// _delay_ms(50);
timer = 20;
while (timer > 0);
timeout--;
}
 
if (timeout != 0)
{
Decode64 ();
setting = *pRxData;
}
else // timeout occured
{
// lcd_printp_at (0, 2, PSTR("Fehler: keine Daten"), 0);
lcd_puts_at(0, 2, strGet(OSD_ERROR), 0);
timer = 100;
while (timer > 0);
setting = 255;
}
 
return setting;
}
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/parameter.h
0,0 → 1,46
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _PARAMETER_H
#define _PARAMETER_H
 
 
void edit_parameter (void);
uint8_t load_setting(uint8_t setting);
 
 
 
#endif
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/parameter_names.h
0,0 → 1,267
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#define PAGES 14
#define PARAM_COUNT 144
#define PARAM_LENGTH 15
#define PARAM_NUM_LANG 4
 
// German Englisch Franzïösisch Holländisch
 
prog_char param_pages[PAGES][PARAM_NUM_LANG][PARAM_LENGTH]= // zeilen,zeichen+1
{
{"Kanäle ","Channel ","Canaux ","Kanaal "},
{"Konfiguration ","main ","Config ","Configuratie "},
{"Stick ","stick ","Manche ","Stick "},
{"Looping ","Looping ","Looping ","Looping "},
{"Höhe ","Altitude ","Altitude ","Hoogte "},
{"Kamera ","Camera ","Camera ","Camera "},
{"NaviCtrl ","NaviCtrl ","NaviCtrl ","NaviCtrl "},
{"Ausgänge ","Outputs ","Sorties ","Uitgangen "},
{"Verschiedenes ","Divers ","Divers ","Diversen "},
{"Gyro ","Gyro ","Gyro ","Gyro "},
{"Benutzer ","User ","Parametres ","Gebruiker "},
{"Achskopplung ","Coupl Axes ","Coupl Axes ","Koppeling Ass "},
{"Mixer-Setup ","Config Mix ","Config Mix ","Config. Mixer "},
{"Easy Setup ","Config Easy ","Config Easy ","Config. easy "},
 
 
 
};
 
 
//Namen
prog_char param_names[PARAM_COUNT][PARAM_NUM_LANG][PARAM_LENGTH]=
{
// group 0 (kanaele) 1-15
 
{"Gas ","Throttle ","Gaz ","Gas "},
{"Gier ","Gier ","Lacet ","Gier "},
{"Nick ","Nick ","Tangage ","Nick "},
{"Roll ","Roll ","Roulis ","Roll "},
{"Poti 1 ","Poti 1 ","Poti 1 ","Poti 1 "},
{"Poti 2 ","Poti 2 ","Poti 2 ","Poti 2 "},
{"Poti 3 ","Poti 3 ","Poti 3 ","Poti 3 "},
{"Poti 4 ","Poti 4 ","Poti 4 ","Poti 4 "},
{"Poti 5 ","Poti 5 ","Poti 5 ","Poti 5 "},
{"Poti 6 ","Poti 6 ","Poti 6 ","Poti 6 "},
{"Poti 7 ","Poti 7 ","Poti 7 ","Poti 7 "},
{"Poti 8 ","Poti 8 ","Poti 8 ","Poti 8 "},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Erw. Sig. Pr. ","Enh. Sig.Check","Recep Renforce","Uitg.Sig.Check"},
{"Empfänger Typ ","Receiver Type ","Type Recepteur","Ontvang. Type "},
 
 
// group 1 (main) 16-23
 
{"Höhenregeler ","Ctrl Altitude ","Ctrl Altitude ","Ctrl Hoogte "},
{"GPS ","GPS ","GPS ","GPS "},
{"Kompass ","Compass ","Compas ","Kompas "},
{"KompFest Ausr.","CompOrient.Fix","Maintien Cap ","Kompas vast "},
{"Erw. Sig. Pr. ","Sens.RcvSigVal","Ctrl Ren Recep","ExtRec Signaal"},
{"Achs(e.)koppl.","Axis Couping ","Decouplage Axe","As koppeling "},
{"Drehratenbegr.","RotRate limit.","Limit Vit. Rot","RotRate limit."},
{"Heading Hold ","Nick/Roll ","Orient. Fixe ","Koers vast "},
 
 
// group 2 (stick) 24-27
 
{"Nick/Roll P ","Nick/Roll P ","Roul/Tang P ","Nick/Roll P "},
{"Nick/Roll D ","Nick/Roll D ","Roul/Tang D ","Nick/Roll D "},
{"Gier P ","Gier P ","Lacet P ","Gier P "},
{"Externe Kontr.","Extern Ctrl ","Ctrl Externe ","Extern Control"},
 
 
// group3 : (looping) 28-36
 
{"Looping oben ","Looping up ","Looping Avant ","Looping omhoog"},
{"Looping unten ","Looping down ","Looping Arrier","Looping bened."},
{"Looping links ","Looping left ","Looping Gauche","Looping links "},
{"Looping rechts","Looping right ","Looping Droite","Looping rechts"},
{"Gas Limit ","Throttle Limit","Limite Gaz ","Gas Limiet "},
{"Ansprechschw. ","Seuil Reponse ","Seuil Reponse ","Drempelwaarde "},
{"Hysterese ","Hysteresis ","Hysteresis ","Hysterese "},
{"Umkehrp. Nick ","Nick Invers ","Invers Roulis ","Nick geinvert."},
{"Umkehrp. Roll ","Roll Invers ","Invers Tangage","Roll geinvert."},
 
 
// group 4 (hoehe) 37-50
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Control"},
{"J:HBeg,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario"},
{"Schalter f. H.","Switch f. High","Swith Hauteur ","Schak. Hoogte "},
{"akust. Vario ","acoustic Vario","Vario Acoustic","Akoest. Vario "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenste hoogt"},
{"Min. Gas ","min. throttle ","Gaz Min ","Minimaal gas "},
{"Höhe P ","Altitude P ","Altitude P ","Hoogte P "},
{"Luftdruck D ","Barometric D ","Pression D ","Barometr. D "},
{"Z-ACC ","ACC Z ","ACC Z ","ACC Z "},
{"Max. Höhe ","Max. High ","Max. High ","Max. hoogte "},
{"Verstärkung/R ","gain/rate ","Gain/Frequence","Verst./rate "},
{"Schwebegas +/-","hoover varia. ","Var Vol Stat ","hoover varia. "},
{"GPS Z ","GPS Z ","GPS Z ","GPS Z "},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","stick neutr. P"},
 
 
// group 5 : (kamera) 51-66
 
{"Nick S. Anst. ","nick serv ctrl","Asserv Tangage","nick serv ctrl"},
{"Nick Kompens. ","nick compens. ","Comp Tangage ","nick compens. "},
{"Nick Umkehren ","nick inv. dir.","Inverser Roul ","nick inv.rich."},
{"Nick Servo min","nick servo min","Servo Min ","nick servo min"},
{"Nick Servo max","nick servo max","Servo Max ","nick servo max"},
{"Roll S. Anst. ","roll serv ctrl","Asserv Roulis ","roll serv ctrl"},
{"Roll Kompens. ","roll compens. ","Comp Tangage ","roll compens. "},
{"Roll Umkehren ","roll inv. dir.","Inverser Tang ","roll omkeren "},
{"Roll Servo min","roll servo min","Servo Min ","roll servo min"},
{"Roll Servo max","roll servo max","Servo Max ","roll servo max"},
{"Anst. Geschw. ","servo refresh ","Taux Refresh ","Servo refresh "},
{"Manuelle Gesch","manuell Speed ","Vitesse Man. ","Snelh.handbed."},
{"Cam Richtung ","Cam Orient ","Cam Orient ","Camera richt. "},
{"Servo 3 ","Servo 3 ","Servo 3 ","Servo 3 "},
{"Servo 4 ","Servo 4 ","Servo 4 ","Servo 4 "},
{"Servo 5 ","Servo 5 ","Servo 5 ","Servo 5 "},
// group 6 : (navictrl) 67-85 "CH Hoogte "
 
{"GPS ","enable GPS ","Activer GPS ","enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def Mode GPS ","GPS mode contr"},
{"GPS Verstärk. ","GPS Gain ","Gain GPS ","GPS versterk. "},
{"GPS St. Schw. ","GPS stick thre","Seuil Manche ","GPS st. dremp."},
{"Min. Sat. ","Min. Sat. ","Nbre Min. Sat.","Min. Sat. "},
{"GPS-P ","GPS-P ","GPS-P ","GPS-P "},
{"GPS-I ","GPS-I ","GPS-I ","GPS-I "},
{"GPS-D ","GPS-D ","GPS-D ","GPS-D "},
{"P Limit ","Limit P ","Limite P ","Limiet P "},
{"I Limit ","Limit I ","Limite I ","Limiet I "},
{"D Limit ","Limit D ","Limite D ","Limiet D "},
{"GPS Acc ","GPS Acc ","Accel GPS ","GPS Acc "},
{"GPS Windkorr. ","GPS Wind Corr.","Correct Vent ","GPS Wind Corr."},
{"Bremswirkung ","Speed compens.","Compens Vit ","Remwerking "},
{"GPS max. Rad. ","GPS max.radius","Rayon GPS Max ","GPS max.radius"},
{"GPS Winkel Li.","GPS angl.limit","Limit Angl GPS","GPS hoek lim. "},
{"PH Login time ","PH login time ","Tps Memoris ","PH login tijd "},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamische PH "},
{"CH Höhe ","CH High ","CH High ","CH Hoogte "},
 
 
// group 7 : (ausgaenge) 86-95
 
{"LED1 Bitmaske ","Out1 Bitmask ","Bitmask S1 ","Uitg1 Bitpatr."},
{" Timing ","Out1 Timing ","Horloge S1 ","Uitg1 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"LED2 Bitmaske ","Out2 Bitmask ","Bitmask S2 ","Uitg2 Bitpatr."},
{" Timing ","Out2 Timing ","Horloge S2 ","Uitg2 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"LED1 Vmin.Warn","Out1 undervolt","Al Undervoltag","Uitg1 ondersp."},
{"LED2 Vmin.Warn","Out2 undervolt","Al Undervoltag","Uitg2 ondersp."},
 
 
// group 8 : (verschiedenes) 96-107
 
{"Min. Gas ","min. throttle ","Gaz Min. ","minimaal gas "},
{"Max. Gas ","max. throttle ","Gaz Max. ","maximaal gas "},
{"Kompasswirkung","compass effect","Effet compas ","Kompas effect "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Unterspannung ","undervoltage ","Sous Tension ","Onderspanning "},
{"Volt Referenz ","Volt Referenz ","Tension Ref ","Ref. spanning "},
{"Not Gas Zeit ","Emerg.Thr.Time","Duree secours ","Nood gas tijd "},
{"Not Gas ","Emerg.Throttle","Gaz de secours","Nood gas "},
{"Fails. CH Time","Fails. CH Time","Fails. CH Time","Fails. CH Tijd"},
{"Compass Error ","Compass Error ","Compass Error ","Kompas Error "},
{"k.Summer o Sen","Compass Error ","Son Abs Emett ","Kompas Error "},
 
 
// group 9 : (gyro) 108-120
 
{"Gyro P ","Gyro P ","Gyro P ","Gyro P "},
{"Gyro I ","Gyro I ","Gyro I ","Gyro I "},
{"Gyro D ","Gyro D ","Gyro D ","Gyro D "},
{"Gier P ","Lacet P ","Lacet P ","Gier P "},
{"Gier I ","Lacet I ","Lacet I ","Gier I "},
{"Dynamische St.","dynamic stabi.","Stab Dynamique","Dynamis. stab."},
{"Drehratenbeg. ","RotRate limit.","Limit Dit Rota","Toerental lim."},
{"ACC/Gyro Fak. ","ACC/Gyro Fact ","ACC/Gyro Fact ","ACC/Gyro Fact "},
{"ACC/Gyro Komp.","Comp ACC/Gyro ","Comp ACC/Gyro ","Comp ACC/Gyro "},
{"Hauptregler I ","Main I ","Regul Princ I ","Hoofdregel. I "},
{"Drifkompensat.","drift Compens.","Compens Deriv ","Drift compens."},
{"Gyro stab. ","Gyro stability","Gyro Stability","Gyro stabilit."},
{"Motor smooth ","Motor smooth ","Motor Smooth ","Motor smooth "},
 
 
// group 10: (benutzer) 121-128
 
{"Parameter 1 ","Parameter 1 ","Parameter 1 ","Parameter 1 "},
{"Parameter 2 ","Parameter 2 ","Parameter 2 ","Parameter 2 "},
{"Parameter 3 ","Parameter 3 ","Parameter 3 ","Parameter 3 "},
{"Parameter 4 ","Parameter 4 ","Parameter 4 ","Parameter 4 "},
{"Parameter 5 ","Parameter 5 ","Parameter 5 ","Parameter 5 "},
{"Parameter 6 ","Parameter 6 ","Parameter 6 ","Parameter 6 "},
{"Parameter 7 ","Parameter 7 ","Parameter 7 ","Parameter 7 "},
{"Parameter 8 ","Parameter 8 ","Parameter 8 ","Parameter 8 "},
 
 
// group 11: (achskopplung) 129-132
 
{"Achs(e.)koppl.","(De)Coupl Axes","(De)Coupl Axes","As koppeling "},
{"Gier pos. Kopp","Retroac lacet ","Retroac Lacet ","Gier pos. kop."},
{"Nick/Roll Kopp","Retro roul/tan","Retro Roul/Tan","Nick/Roll kop."},
{"Gier Korrektur","Correct lacet ","Correct Lacet ","Gier correctie"},
 
 
// group 12: (mixer) 133
 
{"Orientierung ","Orientierung ","Orientation "},
 
 
// group 13 (easy) 134-144
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Contr. "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenst.hoogte"},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","Stick neutr. P"},
{"GPS ","enable GPS ","Activer GPS ","Enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def mode GPS ","GPS mode contr"},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamic PH "},
{"CH Höhe ","CH High ","CH High ","CH hoogte "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Orientierung ","Orientation ","Orientierung ","Orientatie "},
 
};
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/servo.c
0,0 → 1,156
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
 
#include "lcd.h"
#include "timer.h"
#include "servo.h"
#include "messages.h"
 
#define SERVO_CORRECT 3.125
 
 
//--------------------------------------------------------------
//
void servo_test (void)
{
 
uint8_t chg = 0;
uint8_t Pos = 150; // 1,5mS
 
OCR1A = 150 * SERVO_CORRECT; // Servomitte
 
lcd_cls ();
 
lcd_printp (PSTR(" Servo Tester "), 2);
lcd_printp_at (7, 5, PSTR("%"), 0);
lcd_printp_at (16, 5, PSTR("mS"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_printp_at (18, 7, PSTR("\x19O\x18"), 0);
 
lcd_rect(3, 23, 120, 8, 1); // +-150% Rahmen
lcd_line(23,23,23,31,1); // -100%
lcd_line(43,23,43,31,1); // -50%
lcd_frect(61, 23, 3, 8, 1); // 0%
lcd_line(83,23,83,31,1); // +50%
lcd_line(103,23,103,31,1); // +100%
 
write_ndigit_number_u (4, 5, 0, 3, 0); // Pulse width in %
write_ndigit_number_u_100th(12, 5, 150, 3, 0); // Pulse width in ms
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Pos < 225))
{
if (Pos < 150)
lcd_frect ((63 - ((150 - Pos) * 0.8)), 24, 1, 6, 0);
 
Pos++;
if (Pos == 75 || Pos == 100 || Pos == 125 || Pos == 150 || Pos == 175 || Pos == 200 || Pos == 225)
{
BeepTime = 200;
BeepMuster = 0x0080;
}
 
if (Pos >= 225)
Pos = 225;
 
chg++;
}
else if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Pos > 75))
{
if (Pos > 150)
lcd_frect ((((Pos - 150) * 0.8) + 63), 24, ((Pos - 150) * 0.8), 6, 0);
 
Pos--;
if (Pos == 75 || Pos == 100 || Pos == 125 || Pos == 150 || Pos == 175 || Pos == 200 || Pos == 225)
{
BeepTime = 200;
BeepMuster = 0x0080;
}
 
if (Pos <= 75)
Pos = 75;
 
chg++;
}
else if (get_key_press (1 << KEY_ENTER))
{
lcd_frect (4, 24, 118, 6, 0); // Balken löschen
lcd_frect(61, 23, 3, 8, 1); // 0%
Pos = 150;
BeepTime = 200;
BeepMuster = 0x0080;
chg++;
}
 
if (chg)
{
chg = 0;
 
if (Pos >= 150)
{
lcd_frect (63, 24, ((Pos - 150) * 0.8), 6, 1);
write_ndigit_number_u (4, 5, ((Pos - 150) * 2), 3, 0); // Pulse width in %
lcd_frect(62, 23, 2, 8, 1); // 0%
}
else
{
lcd_frect (63 - ((150 - Pos) * 0.8), 24, ((150 - Pos) * 0.8), 6, 1);
write_ndigit_number_u (4, 5, ((150 - Pos) * 2), 3, 0); // Pulse width in %
lcd_frect(61, 23, 2, 8, 1); // 0%
}
write_ndigit_number_u_100th(12, 5, Pos, 3, 0); // Pulse width in ms
 
lcd_line(3, 23,3, 31,1); // -150%
lcd_line(23, 23,23, 31,1); // -100%
lcd_line(43, 23,43, 31,1); // -50%
lcd_line(83, 23,83, 31,1); // +50%
lcd_line(103,23,103,31,1); // +100%
lcd_line(123,23,123,31,1); // +150%
 
 
OCR1A = Pos * SERVO_CORRECT; // Servostellung
 
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
 
}
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/servo.h
0,0 → 1,40
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _SERVO_H
#define _SERVO_H
 
void servo_test (void);
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/setup.c
0,0 → 1,1969
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>
#include "main.h"
#include "setup.h"
#include "lcd.h"
#include "eeprom.h"
#include "timer.h"
#include "menu.h"
#include "Wi232.h"
#include "bluetooth.h"
#include "connect.h"
#include "lipo.h"
#include "messages.h"
#include "eeprom.h"
 
 
uint8_t spalte;
uint8_t mmode;
uint8_t edit;
uint8_t LCD_Orientation;
uint8_t edit = 0;
uint8_t LCD_Change = 0;
uint8_t PKT_Change = 0;
uint8_t Pre;
uint16_t Pre16;
char EditString[21];
uint8_t bt_name_len;
 
 
//--------------------------------------------------------------
#define ITEMS_PKT 9
 
prog_char param_menuitems_pkt[ITEMS_PKT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Verbindung zum MK","connection to MK "," connexion a MK " ,"Aansluiting op MK"},
{"MK LowBat Warnung","MK LowBat warning","MK LowBat Attent", "MK LowBat waarsch"},
{"Anzeige \x1d","Display \x1d","d'affichage \x1d","tonen \x1d"},
{"Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d"},
{"BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d"},
{"PKT-Akku \x1d","PKT-Accu \x1d","PKT-Accu \x1d","PKT-Accu \x1d"},
{"PKT Update ","PKT Update ","PKT Mise à jour ","PKT Update "},
{"Debug PKT ","Debug PKT ","Debug PKT ","Debug PKT "},
{"EEProm Reset ","EEProm Reset ","EEProm Réinitiali","EEProm Reset "},
};
 
#define ITEMS_LCD 7
 
prog_char param_menuitems_lcd[ITEMS_LCD][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Infos beim Start ","info at startup ","Infor. sur lancer","Infor. o.de start"},
{"Sprache ","language ","Langue ","taal "},
{"Licht aus nach...","light off after ","Lumière au bout ","Lichten uit voor "},
{"Helligkeit ","brightness ","luminosité ","helderheid "},
{"Kontrast ","contrast ","contraste ","contrast "},
{"Normal/Invers ","normal/inverted ","Normal / inversé ","Normal/inverted "},
{"Orientierung ","orientation ","orientation ","orientatie "},
 
};
 
#define ITEMS_WI 8
 
prog_char param_menuitems_wi[ITEMS_WI][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Modul eingebaut? ","module built in? ","Module installé ","module geïnstall?"},
{"TX/RX Kanal ","TX/RX Channel ","TX/RX Channel ","TX/RX Channel "},
{"NetW. Gruppe ","NetW. Group ","NetW. Group ","NetW. Group "},
{"NetW. Mode ","NetW. Mode ","NetW. Mode ","NetW. Mode "},
{"TX Timeout ","TX Timeout ","TX Timeout ","TX Timeout "},
{"TX MTU ","TX MTU ","TX MTU ","TX MTU "},
{"Initialisieren ","initialize ","initialiser ","Initialize "},
{"Konfig. mit PC ","config. with PC ","Config. avec PC ","Config. met PC "},
};
 
 
#define ITEMS_BT 5
 
prog_char param_menuitems_bt[ITEMS_BT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Modul eingebaut? ","module built in? ","Module installé ","module geïnstall?"},
{"Name ","name ","Nom ","Naam "},
{"Pin ","pin ","Pin ","Pin "},
{"Initialisieren ","initialize ","initialiser ","Initialize "},
{"Konfig. mit PC ","config. with PC ","Config. avec PC ","Config. met PC "},
};
 
#define ITEMS_Accu 2
 
prog_char param_menuitems_Accu[ITEMS_Accu][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"PKT-Akkutyp ","PKT-Accutyp ","PKT-Type de batt.","PKT-batterij type"},
{"PKT Akku Messung ","PKT AccuMeasure ","batt. de mesure ","PKT batt. meting"},
};
 
//--------------------------------------------------------------
void Show_Error_HW12(void)
{
lcd_cls();
lcd_printp_at (0,3,PSTR(" Mit Hardware 1.x "), 2);
lcd_printp_at (0,4,PSTR(" nicht möglich "), 2);
_delay_ms(1000);
 
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Int10th_Value(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u_10th (16, 2,Value, 3, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
{
edit = 1;
Value++;
write_ndigit_number_u_10th (16, 2,Value, 3, 0);
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
{
edit = 1;
Value--;
write_ndigit_number_u_10th (16, 2,Value, 3, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Int_Value(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
Pre = Value;
write_ndigit_number_u (16, 2, Value, 3, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max))
{
edit = 1;
Value++;
write_ndigit_number_u (16, 2,Value, 3, 0);
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
edit = 1;
Value--;
write_ndigit_number_u (16, 2,Value, 3, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
#if defined HWVERSION3_9 ||HWVERSION1_3W
//--------------------------------------------------------------
uint8_t ChangeWi_SV2(uint8_t Value)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 1, PSTR("Verbinde das PKT mit"), 0);
// lcd_printp_at (0, 2, PSTR("dem MK über:"), 0);
lcd_puts_at(0, 1, strGet(CONNECT1), 0);
lcd_puts_at(0, 2, strGet(CONNECT2), 0);
 
if(UseWi == false)
{
// lcd_printp_at (0, 0, PSTR("Verbinde das PKT mit "), 0);
// lcd_printp_at (0, 1, PSTR("dem MK über: Kabel, "), 0);
// lcd_printp_at (0, 2, PSTR("da kein Wi.232 Modul "), 0);
// lcd_printp_at (0, 3, PSTR("eingebaut ist. "), 0);
// lcd_printp_at (0, 4, PSTR("Wenn doch, dann bitte"), 0);
// lcd_printp_at (0, 5, PSTR("das Modul zuerst im "), 0);
// lcd_printp_at (0, 6, PSTR("Setupmenü aktivieren."), 0);
lcd_puts_at(0, 1, strGet(CONNECT1), 0);
lcd_puts_at(0, 2, strGet(CONNECT4), 0);
lcd_puts_at(0, 1, strGet(CONNECT5), 0);
lcd_puts_at(0, 2, strGet(CONNECT6), 0);
lcd_puts_at(0, 1, strGet(CONNECT7), 0);
lcd_puts_at(0, 2, strGet(CONNECT8), 0);
lcd_puts_at(0, 1, strGet(CONNECT9), 0);
 
 
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
else
{
switch (Value)
{
case 0x0 :lcd_printp_at (14, 2, PSTR("Wi232"), 0);
break;
case 0x1 : lcd_puts_at(14, 2, strGet(KABEL), 0);
 
//lcd_printp_at (14, 2, PSTR("Kabel"), 0);
 
break;
break;
}
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if(UseWi == true)
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
edit = 1;
Value = 1;
// lcd_printp_at (14, 2, PSTR("Kabel"), 0);
lcd_puts_at(14, 2, strGet(KABEL), 0);
Change_Output(Uart02FC);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
edit = 1;
Value = 0;
lcd_printp_at (14, 2, PSTR("Wi232"), 0);
Change_Output(Uart02Wi);
}
 
if (get_key_press (1 << KEY_ENTER))
{
// lcd_printp_at (0, 4, PSTR("Sie müssen das PKT"), 0);
// lcd_printp_at (0, 5, PSTR("jetzt neu starten!"), 0);
lcd_puts_at(0, 4, strGet(CONNECT10), 0);
lcd_puts_at(0, 5, strGet(CONNECT11), 0);
lcd_cls_line (0, 7, 18);
while (!get_key_press (1 << KEY_ENTER));
return Value;
}
}
}
while (!get_key_press (1 << KEY_ESC));
}
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
 
#endif
//--------------------------------------------------------------
uint8_t Edit_Wi_NetMode_Value(uint8_t Value)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, PSTR("Wi NetW. Mode:"), 0);
lcd_puts_at(0, 2, strGet(WINETWM), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(15, 2, strGet(SLAVE), 0);//lcd_printp_at (15, 2, PSTR("Slave "), 0);
break;
case 0x1 :lcd_puts_at(15, 2, strGet(NORMAL), 0);//lcd_printp_at (15, 2, PSTR("Normal"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
edit = 1;
Value = NetMode_Normal;
// lcd_printp_at (15, 2, PSTR("Normal"), 0);
lcd_puts_at(15, 2, strGet(NORMAL), 0);
 
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
edit = 1;
Value = NetMode_Slave;
// lcd_printp_at (15, 2, PSTR("Slave "), 0);
lcd_puts_at(15, 2, strGet(SLAVE), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_StartInfo(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
 
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2,Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case false :lcd_puts_at(17, 2, strGet(OFF), 0);//lcd_printp_at (17, 2, PSTR("Aus"), 0);
break;
case true :lcd_puts_at(17, 2, strGet(ON), 0);//cd_printp_at (17, 2, PSTR("Ein"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
// lcd_printp_at (17, 2, PSTR("Ein"), 0);
lcd_puts_at(17, 2, strGet(ON), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
// lcd_printp_at (17, 2, PSTR("Aus"), 0);
lcd_puts_at(17, 2, strGet(OFF), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
 
PKT_StartInfo = Value;
WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
PKT_StartInfo = Pre;
return Pre;
}
 
}
 
//--------------------------------------------------------------
uint8_t Edit_YesNo(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
 
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2,Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case false :lcd_puts_at(17, 2, strGet(NOO), 0);//lcd_printp_at (17, 2, PSTR("Aus"), 0);
break;
case true :lcd_puts_at(17, 2, strGet(YES), 0);//cd_printp_at (17, 2, PSTR("Ein"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
// lcd_printp_at (17, 2, PSTR("Ein"), 0);
lcd_puts_at(17, 2, strGet(YES), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
// lcd_printp_at (17, 2, PSTR("Aus"), 0);
lcd_puts_at(17, 2, strGet(NOO), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
 
// PKT_StartInfo = Value;
// WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
// PKT_StartInfo = Pre;
return Pre;
}
 
}
//--------------------------------------------------------------
//uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,const char *Text)
uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2,strGet(Text), 0);
switch (Value)
{
case
0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value < max))
{
edit = 1;
Value++;
//DisplayLanguage = Value;
switch (Value)
{
case 0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value > min))
{
edit = 1;
Value--;
//DisplayLanguage = Value;
switch (Value)
{
case 0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Orientation(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(14, 2, strGet(NORMAL), 0);//lcd_printp_at (14, 2, PSTR("Normal "), 0);
break;
case 0x4 :lcd_puts_at(14, 2, strGet(REVERSE), 0);//lcd_printp_at (14, 2, PSTR("Reverse"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value=4;
// lcd_printp_at (14, 2, PSTR("Reverse"), 0);
lcd_puts_at(14, 2, strGet(REVERSE), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 4))
{
Value = 0;
// lcd_printp_at (14, 2, PSTR("Normal "), 0);
lcd_puts_at(14, 2, strGet(NORMAL), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
cli();
clr_A0 ();
 
if (Value == 0)
{
send_byte (0xA1); // normal
send_byte (0xC0); // normal
}
else
{
send_byte (0xA0); // reverse
send_byte (0xC8); // reverse
}
set_A0 ();
sei();
LCD_Orientation = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayMode(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
//lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(14, 2, strGet(NORMAL), 0);//lcd_printp_at (14, 2, PSTR("Normal "), 0);
break;
case 0x4 :lcd_puts_at(14, 2, strGet(REVERSE), 0);//lcd_printp_at (14, 2, PSTR("Reverse"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value=4;
// lcd_printp_at (14, 2, PSTR("Inverse"), 0);
lcd_puts_at(14, 2, strGet(REVERSE), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 4))
{
Value=0;
// lcd_printp_at (14, 2, PSTR("Normal "), 0);
lcd_puts_at(14, 2, strGet(NORMAL), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
cli();
clr_A0 ();
 
if (Value == 0)
send_byte (0xA6); // normal
else
send_byte (0xA7); // inverse
 
set_A0 ();
sei();
LCD_DisplayMode = Value;
WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
LCD_DisplayMode = Pre;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayKontrast(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u (16, 2, Value, 3, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
write_ndigit_number_u (16, 2,Value, 3, 0);
lcd_frect ((8*0), (8*4), (Value * (16*8) / 64), 6, 1);
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max))
{
Value++;
 
if (Value >= max)
{
Value = max;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
{
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Value); // Daten zum LCD senden
set_A0 ();
sei();
}
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
lcd_frect (((Value - 1) * (16*8) / 64), (8*4), (16*8), 6, 0);
Value--;
 
if (Value == min)
{
Value = min;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
{
// edit = 1;
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Value); // Daten zum LCD senden
set_A0 ();
sei();
}
}
write_ndigit_number_u (16, 2,Value, 3, 0);
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
LCD_Kontrast = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Pre); // Daten zum LCD senden
set_A0 ();
sei();
edit = 0;
LCD_Kontrast = Pre;
WriteParameter();
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayHelligkeit(uint8_t Value, uint8_t min, uint8_t max, uint8_t Text)
{
float ValCorr = 2.55; // (Value * ValCorr) maximal 255
Pre = Value;
OCR2A = Value * ValCorr;
 
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u (16, 2, Value, 3, 0);
lcd_printp_at (17, 2, PSTR("%"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
write_ndigit_number_u (16, 2,Value, 3, 0);
lcd_frect ((8*0), (8*4), (Value * (16*8) / 100), 6, 1);
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
{
Value++;
 
if (Value >= max)
{
Value = max;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
OCR2A = Value * ValCorr;
 
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
{
lcd_frect (((Value - 1) * (16*8) / 100), (8*4), (16*8), 6, 0);
Value--;
 
if (Value == min)
{
Value = min;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
OCR2A = Value * ValCorr;
 
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
OCR2A = Value * ValCorr;
LCD_Helligkeit = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
OCR2A = Pre * ValCorr;
LCD_Helligkeit = Pre;
WriteParameter();
return Pre;
}
}
 
 
//--------------------------------------------------------------
void Reset_EEprom(void)
{
lcd_cls();
get_key_press(KEY_ALL);
// lcd_printp_at (0, 2, PSTR(" EEProm wirklich"), 0);
// lcd_printp_at (0, 3, PSTR(" löschen?"), 0);
// lcd_printp_at (12, 7, PSTR("Ende OK"), 0);
lcd_puts_at(0, 2, strGet(EEPROM1), 0);
lcd_puts_at(0, 3, strGet(EEPROM2), 0);
lcd_puts_at(12, 7, strGet(ENDOK), 0);
 
 
do
{
 
if (get_key_press (1 << KEY_ENTER))
{
Delete_EEPROM();
return;
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
 
//--------------------------------------------------------------
void PKT_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_PKT;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
lcd_cls ();
mmode = 0;
edit= 0;
val = 0;
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" PKT-Setup "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+Offset) < size)
lcd_printp_at(3,ii+1,param_menuitems_pkt[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+Offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset+7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
return;
}
return;
}
else
break;
}
target_pos = val;
 
if((val + Offset) == 1)
{
#ifdef HWVERSION3_9
U02SV2 = ChangeWi_SV2(U02SV2);
 
if (edit == 1)
PKT_Change = 1;
 
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 2)
MK_LowBat = Edit_Int10th_Value(MK_LowBat,33,247,LOWBAT);
 
if((val + Offset) == 3)
Display_Setup();
 
if((val + Offset) == 4)
{
#if defined HWVERSION3_9 || defined HWVERSION1_2W || defined HWVERSION1_3W
if(UseWi == false)
// Wi_Use();
{
UseWi = Edit_YesNo(UseWi,0,1,WI2321);
if (edit==1)
if (UseWi== true) InitWi232();
}
 
else
Wi_Setup();
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 5)
{
#ifdef HWVERSION3_9
if(UseBT == 0)
{
UseBT = Edit_YesNo(UseBT,0,1,BT1);
if (edit==1)
if (UseBT == 1)
{
if (bt_init()) BTIsSet = true; else BTIsSet = false;
WriteParameter();
}
}
else
BT_Setup();
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 6)
#ifdef HWVERSION3_9
Accu_Setup();
#else
Show_Error_HW12();
#endif
if((val + Offset) == 7)
Update_PKT();
 
if((val + Offset) == 8)
Debug = Edit_Int_Value(Debug,0,1,DEBUGPKT);
 
if((val + Offset) == 9)
Reset_EEprom();
 
}
}
 
 
//--------------------------------------------------------------
void Display_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_LCD;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
lcd_cls ();
mmode = 0;
edit= 0;
LCD_Change = 0;
val = 0;
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Display Setup "), 2);
lcd_puts_at(0, 0, strGet(DISPLAY1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1, 1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6 ; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_lcd[ii + Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
return;
}
return;
}
else
break;
}
target_pos = val;
 
if((val + Offset) == 1)
PKT_StartInfo = Edit_StartInfo(PKT_StartInfo,0,2,DISPLAY2);
 
if((val + Offset) == 2)
DisplayLanguage = Edit_Language(DisplayLanguage,0,3,DISPLAY3);
// Edit_Language(DisplayLanguage,0,3,DISPLAY3);
 
if((val + Offset) == 3)
DisplayTimeout = Edit_Int_Value(DisplayTimeout,0,254,DISPLAY4);
 
if((val + Offset) == 4)
LCD_Helligkeit = Edit_DisplayHelligkeit(LCD_Helligkeit,0,100,DISPLAY5);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
 
if((val + Offset) == 5)
LCD_Kontrast = Edit_DisplayKontrast(LCD_Kontrast,0,63,DISPLAY6);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
 
if((val + Offset) == 6)
{
LCD_DisplayMode = Edit_DisplayMode(LCD_DisplayMode,0,4,DISPLAY7);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
}
 
if((val + Offset) == 7)
{
LCD_Orientation = Edit_Orientation(LCD_Orientation,0,4,DISPLAY8);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
}
 
 
 
 
}
}
 
#if defined HWVERSION3_9 ||HWVERSION1_3W
////--------------------------------------------------------------
//void Wi_Use (void)
//{
// Pre = UseWi;
//
// lcd_cls ();
//
// lcd_cls ();
//// lcd_printp_at (0, 0, PSTR(" Wi.232 Setup "), 2);
//// lcd_printp_at (0, 2, PSTR("Ist ein Wi.232-Modul "), 0);
//// lcd_printp_at (0, 4, PSTR("eingebaut?"), 0);
// lcd_puts_at(0, 0, strGet(WI2321), 2);
// lcd_puts_at(0, 2, strGet(WI2322), 0);
// lcd_puts_at(0, 4, strGet(WI2323), 0);
//// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
//
// while(1)
// {
// if(UseWi == false)
//// lcd_printp_at (12, 4, PSTR("Nein"), 0);
// lcd_puts_at(12, 4, strGet(NOO), 0);
// else
// //lcd_printp_at (12, 4, PSTR("Ja "), 0);
// lcd_puts_at(12, 4, strGet(YES), 0);
//
// if(get_key_press (1 << KEY_MINUS))
// {
// UseWi = false;
// edit = 1;
// }
//
// if(get_key_press (1 << KEY_PLUS))
// {
// UseWi = true;
// edit = 1;
// }
//
// if(get_key_short (1 << KEY_ENTER))
// {
//// WiIsSet = false;
//// WriteParameter();
//// if(UseWi == true)
//// Wi_Setup();
// return;
// }
//
// if (get_key_press (1 << KEY_ESC))
// {
// get_key_press(KEY_ALL);
// UseWi = Pre;
// return;
// }
// }
//}
 
 
//--------------------------------------------------------------
void Wi_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_WI;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val = 0;
 
mmode = 0;
edit = 0;
// WiIsSet = true;
 
lcd_cls ();
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" Wi.232 Setup "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1, 1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii+1, param_menuitems_wi[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii + Offset < (size - 1)))
lcd_printp_at(1, 6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
// if (edit == 1)
// {
// if (UseWi==true) InitWi232();
// WriteParameter();
// }
 
return;
}
else
 
if (edit == 1)
{
if (UseWi==true) InitWi232();
WriteParameter();
}
 
 
 
 
break;
}
target_pos = val;
 
if((val + Offset) == 1)
{
UseWi = Edit_YesNo(UseWi,0,1,WI2321);
}
 
if((val + Offset) == 2)
{
WiTXRXChannel = Edit_Int_Value(WiTXRXChannel, 0, 5,WINETWG);
 
}
 
if((val + Offset) == 3)
{
WiNetworkGroup = Edit_Int_Value(WiNetworkGroup, 0, 127, WINETWG);
 
 
}
 
if((val + Offset) == 4)
{
WiNetworkMode = Edit_Wi_NetMode_Value(WiNetworkMode);
 
 
}
 
if((val + Offset) == 5)
{
WiTXTO = Edit_Int_Value(WiTXTO,0,127,WITIMEOUT);
 
 
}
 
if((val + Offset) == 6)
{
WiUartMTU = Edit_Int_Value(WiUartMTU,0,127,WIUART);
 
 
}
 
if((val + Offset) == 7)
InitWi232();
 
if((val + Offset) == 8)
Port_USB2CFG_Wi();
}
}
#endif
 
#ifdef HWVERSION3_9
//--------------------------------------------------------------
//
uint8_t Edit_String(const char *data, const uint8_t length, uint8_t type, const char *Text)
{
uint8_t y = 1;
uint8_t x = 1;
uint8_t I = 0;
 
lcd_cls();
lcd_printp_at (0, 0, Text, 2);
 
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (y++, 3, data[i], 0);
lcd_printp_at (y++, 3, PSTR(" "), 0);
 
EditString[i] = data[i];
}
 
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
lcd_printp_at (0, 6, PSTR(" C"), 0);
lcd_printp_at (0, 7, PSTR(" \x17 \x16 \x19 OK"), 0);
 
do
{
if (type == 1) // Name
{
for (uint8_t i = bt_name_length; i > 0; i--)
{
if (EditString[i - 1] != ' ')
{
bt_name_len = i;
break;
}
}
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && EditString[I] < 'z')
{
EditString[I]++;
 
if (EditString[I] >= 0x00 && EditString[I] < ' ')
EditString[I] = ' ';
 
if (EditString[I] > ' ' && EditString[I] < '0')
EditString[I] = '0';
 
if (EditString[I] > '9' && EditString[I] < 'A')
EditString[I] = 'A';
 
if (EditString[I] > 'Z' && EditString[I] < 'a')
EditString[I] = 'a';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && EditString[I] > ' ')
{
EditString[I]--;
 
if (EditString[I] < 'a' && EditString[I] > 'Z')
EditString[I] = 'Z';
 
if (EditString[I] < 'A' && EditString[I] > '9')
EditString[I] = '9';
 
if (EditString[I] < '0' && EditString[I] > ' ')
EditString[I] = ' ';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
}
else if (type == 2) // PIN
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (EditString[I] < '9'))
{
EditString[I]++;
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (EditString[I] > '0'))
{
EditString[I]--;
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
}
 
if (get_key_long (1 << KEY_ESC))
{
EditString[I] = ' '; // Zeichen l�schen
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if (get_key_short (1 << KEY_ESC))
{
if ((x / 2) + 2 > bt_name_length)
{
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
x = 1;
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
I = 0;
}
else
{
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
x++;
x++;
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
I++; //Zeiger auf Zeichen
}
}
}
while (!get_key_press (1 << KEY_ENTER));
{
get_key_press(KEY_ALL);
return 1;
}
}
 
 
////--------------------------------------------------------------
//void BT_Use (void)
//{
// Pre = UseBT;
//
// lcd_cls ();
//
// lcd_cls ();
//// lcd_printp_at (0, 0, PSTR(" BTM-222 Setup "), 2);
//// lcd_printp_at (0, 2, PSTR("Ist ein BTM-222-Modul"), 0);
//// lcd_printp_at (0, 4, PSTR("eingebaut?"), 0);
// lcd_puts_at(0, 0, strGet(BT1), 2);
// lcd_puts_at(0, 2, strGet(BT2), 0);
// lcd_puts_at(0, 4, strGet(BT3), 0);
//// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
//
// while(1)
// {
// if(UseBT == false)
//// lcd_printp_at (12, 4, PSTR("Nein"), 0);
// lcd_puts_at(12, 4, strGet(NOO), 0);
// else
//// lcd_printp_at (12, 4, PSTR("Ja "), 0);
// lcd_puts_at(12, 4, strGet(YES), 0);
// if(get_key_press (1 << KEY_MINUS))
// UseBT = false;
//
// if(get_key_press (1 << KEY_PLUS))
// UseBT = true;
//
// if(get_key_short (1 << KEY_ENTER))
// {
//// BTIsSet = false;
// WriteParameter();
// if(UseBT == true)
// BT_Setup();
// return;
// }
//
// if (get_key_press (1 << KEY_ESC))
// {
// get_key_press(KEY_ALL);
// UseBT = Pre;
// return;
// }
// }
//}
 
 
//--------------------------------------------------------------
//
void BT_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_BT;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
char string[20];
 
mmode = 0;
edit = 0;
val = 0;
// BTIsSet = true;
 
lcd_cls ();
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" BTM-222 Setup "), 2);
lcd_puts_at(0, 0, strGet(BT1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_bt[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
// if (edit == 1)
// {
// if (UseBT == 1);
// if (bt_init()) BTIsSet = true; else BTIsSet = false;
// WriteParameter();
// return;
// }
return;
}
else
 
if (edit == 1)
{
if (UseBT == 1);
if (bt_init()) BTIsSet = true; else BTIsSet = false;
WriteParameter();
return;
}
 
 
 
 
break;
}
 
target_pos = val;
if((val + Offset) == 1)
// BT_Use();
UseBT = Edit_YesNo(UseBT,0,1,BT1);
 
if((val + Offset) == 2)
{
for (uint8_t i = 0; i < bt_name_length; i++)
{
string[i] = bt_name[i];
}
string[bt_name_length] = 0;
Edit_String(string, bt_name_length, 1, PSTR(" Bluetooth Name "));
if (edit == 1)
{
for (uint8_t i = 0; i < bt_name_len; i++)
{
bt_name[i] = EditString[i];
WriteParameter();
}
 
if (bt_name_len < 10)
{
for (uint8_t i = bt_name_len; i < 10; i++)
{
bt_name[i] = ' ';
WriteParameter();
}
}
}
}
 
if((val + Offset) == 3)
{
for (uint8_t i = 0; i < bt_pin_length; i++)
{
string[i] = bt_pin[i];
}
string[bt_pin_length] = 0;
Edit_String(string, bt_pin_length, 2, PSTR(" Bluetooth Pin "));
if (edit == 1)
{
for (uint8_t i = 0; i < bt_pin_length; i++)
{
bt_pin[i] = EditString[i];
WriteParameter();
}
}
}
 
if((val + Offset) == 4)
{
// if (edit == 1)
// if(BTIsSet)
// BTIsSet = false;
 
if (bt_init() == true)
{
lcd_printp_at (0, 3, PSTR("BT Init ok"), 0);
WriteBTInitFlag();
}
else
{
lcd_printp_at (0, 3, PSTR("BT Init Error"), 0);
BTIsSet = false;
BeepTime = 1000;
BeepMuster = 0x0040;
}
}
 
if((val + Offset) == 5)
Port_FC2CFG_BT();
 
 
}
}
 
//--------------------------------------------------------------
uint8_t Edit_PKT_Accu(uint8_t Value, uint8_t min, uint8_t max)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(LIPO2), 0);
switch (Value)
{
case false :lcd_printp_at (15, 2, PSTR("LiIo"), 0);
break;
case true :lcd_printp_at (15, 2, PSTR("LiPo"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
lcd_printp_at (15, 2, PSTR("LiPo"), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
lcd_printp_at (15, 2, PSTR("LiIo"), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
 
PKT_Accutyp = Value;
// WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
PKT_Accutyp = Pre;
return Pre;
}
 
}
 
//--------------------------------------------------------------
uint16_t Edit_LipoOffset(uint16_t Value, uint16_t min, uint16_t max)
{
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(LIPO3), 0);
lcd_puts_at(0, 5, strGet(LIPO5), 0);
lcd_puts_at(0, 6, strGet(LIPO6), 0);
// lcd_printp_at (0, 3, PSTR("Offset verstellen bis"), 0);
// lcd_printp_at (0, 4, PSTR("die Spannung passt"), 0);
Pre16 = Value;
write_ndigit_number_u (16, 2, Value, 4, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max-10))
{
edit = 1;
Value = Value +10;
Lipo_UOffset = Value;
write_ndigit_number_u (16, 2,Value, 4, 0);
 
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
edit = 1;
Value=Value -10;
Lipo_UOffset = Value;
write_ndigit_number_u (16, 2,Value, 4, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
show_Lipo();
write_ndigit_number_u_100th(8, 3, volt_avg, 0, 0);
lcd_printp_at(3, 3, PSTR("Volt"), 0);
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
Lipo_UOffset = Pre16;
return Pre16;
}
}
 
//--------------------------------------------------------------
 
 
void Accu_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_Accu;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
mmode = 0;
edit = 0;
val = 0;
lcd_cls ();
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" PKT Accu Setup "), 2);
lcd_puts_at(0, 0, strGet(LIPO1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_Accu[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
 
return;
}
return;
}
else
break;
}
 
target_pos = val;
if((val + Offset) == 1)
{
PKT_Accutyp= Edit_PKT_Accu(PKT_Accutyp,0,1);
if (edit == 1) WriteParameter();
}
 
if((val + Offset) == 2)
{
Lipo_UOffset = Edit_LipoOffset(Lipo_UOffset,0,9999);
if (edit == 1) WriteParameter();
}
 
}
}
 
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/setup.h
0,0 → 1,50
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _setup_H
#define _setup_H
 
void PKT_Setup (void);
void Display_Setup (void);
void Wi_Use (void);
void Wi_Setup (void);
void BT_Use (void);
void BT_Setup (void);
void Show_Error_HW12(void);
void Accu_Setup (void);
uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text);
 
extern uint8_t bt_name_len;
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/timer.c
0,0 → 1,519
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>
#include <inttypes.h>
 
 
#include "main.h"
#include "timer.h"
#include "eeprom.h"
#include "lcd.h"
#include "uart1.h"
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
#include "HAL_HW1_2.h"
#endif
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
 
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
 
volatile uint16_t timer;
volatile uint16_t abo_timer;
volatile static unsigned int tim_main;
 
uint8_t key_state = 0; // debounced and inverted key state:
// bit = 1: key pressed
uint8_t key_press = 0; // key press detect
uint8_t key_long = 0; // key long press
uint8_t key_rpt = 0; // key repeat
uint8_t key_lrpt = 0; // key long press and repeat
uint8_t key_rpts = 0; // key long press and speed repeat
uint8_t repeat_speed = 0;
 
uint16_t DisplayTime = 0; // Leuchtdauer
volatile uint16_t IdleTimer = 0; // InaktivitätsTimer
 
uint16_t WarnCount = 0; // Zähler der LIPO Warnzeit
uint16_t WarnToggle = 0; // Togglezähler zum blinken
uint16_t WarnTime = 10; // Länge der LIPO Warnzeit 10 Sek.
uint16_t PoffTime = 30; // Länge der Wartezeit vor Abschalten 30 Sek.
//uint8_t servo = 0;
 
 
volatile uint8_t Display_on;// Flag Display on/off
 
unsigned int BeepTime = 0;
unsigned int BeepMuster = 0xffff;
 
volatile unsigned int CountMilliseconds = 0;
 
// Size of Buffer for Converting unsigned int Value to ASCII
#define STRING_BUFFER_SIZE 5
 
// Buffer for Converting unsigned int Value to ASCII
char String_Buffer[STRING_BUFFER_SIZE];
 
 
//--------------------------------------------------------------
//
void Timer1_Init (void) // Timer 1-A
{
// löschen
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = 0;
 
// setzen
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << CS11) | (1 << CS10) | (1 << WGM13) | (1 << WGM12);
 
ICR1 = (F_CPU / 64) * 20 / 1000;
 
OCR1A = 470; // ca. Servomitte
}
 
 
//--------------------------------------------------------------
void Timer2_Init (void) // Displayhelligkeit
{
DDRD |= (1 << DDD7); // PD7 output
TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1); // non invers
TCCR2B |= (1 << CS20); // Prescaler 1/1
TIMSK2 |= (1 << OCIE2A) | (1 << OCIE2B);
 
OCR2A = 255;
}
 
 
#if defined HWVERSION1_2 || defined HWVERSION1_2W
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD &= ~(1 << PD7);
PORTC &= ~(1 << PC0);
PORTC &= ~(1 << PC1);
}
ISR(TIMER2_COMPB_vect)
{
PORTD |= (1 << PD7);
PORTC |= (1 << PC0);
PORTC |= (1 << PC1);
}
#endif
#if defined HWVERSION1_3 || defined HWVERSION1_3W
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD &= ~(1 << PD7);
PORTD &= ~(1 << PD6);
PORTC &= ~(1 << PC2);
}
ISR(TIMER2_COMPB_vect)
{
PORTD |= (1 << PD7);
PORTD |= (1 << PD6);
PORTC |= (1 << PC2);
}
#endif
#ifdef HWVERSION3_9
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD |= (1 << PD7);
}
ISR(TIMER2_COMPB_vect)
{
PORTD &= ~(1 << PD7);
}
#endif
 
 
//--------------------------------------------------------------
void Timer0_Init (void) // System (100Hz)
{
timer = 0;
 
TCCR0A = (1 << WGM01);
TCCR0B = (1 << CS02) | (1 << CS00);
OCR0A = (F_CPU / (100L * 1024L)) ;
 
TIMSK0 |= (1 << OCIE0A); // enable interrupt for OCR
}
 
 
//--------------------------------------------------------------
ISR(TIMER0_COMPA_vect) // Timer-Interrupt (100 Hz)
{
static uint8_t ct0 = 0;
static uint8_t ct1 = 0;
static uint8_t k_time_l = 0;
static uint8_t k_time_r = 0;
static uint8_t k_time_lr = 0;
static uint8_t k_time_rs = 0;
uint8_t i;
 
static unsigned char cnt_1ms = 1,cnt = 0;
unsigned char beeper_ein = 0;
// unsigned char pieper_ein = 0;
 
// Key handling by Peter Dannegger
// see www.mikrocontroller.net
 
i = key_state ^ ~KEY_PIN; // key changed ?
ct0 = ~(ct0 & i); // reset or count ct0
ct1 = ct0 ^ (ct1 & i); // reset or count ct1
i &= (ct0 & ct1); // count until roll over ?
key_state ^= i; // then toggle debounced state
key_press |= (key_state & i); // 0->1: key press detect
 
if (PKT_IdleBeep == 1)
{
IdleTimer ++; // nix zu tun? Timer hochzählen
if (IdleTimer == 12000) // Warnhinweis
{
BeepTime = 200;
BeepMuster = 0x0080;
IdleTimer = 0;
}
}
 
if (!cnt--)
{
cnt = 9;
CountMilliseconds++;
cnt_1ms++;
}
 
if (i!=0)
{ // Displaylicht einschalten, und bzw. Timeoutzählerreset wenn Taste gedrückt wurde
if (Display_on == 0)
set_D_LIGHT();
 
 
Display_on = 1; // Flag Display on
DisplayTime = 0; // Timer Reset
IdleTimer = 0; // Idletimeout Reset
 
}
 
if (DisplayTimeout > 0)
{
if (Display_on == 1)
{
DisplayTime++;
if ((DisplayTime / 100) == DisplayTimeout) // ISR läuft mit 100Hz
{ // Displaylicht ausschalten
clr_D_LIGHT();
Display_on = 0; // Flag Display off
 
}
}
}
 
//--------------------------------------------------------------
#ifdef HWVERSION3_9
LipoCheck(); // Lipo prüfen
#endif
 
//--------------------------------------------------------------
if (BeepTime)
{
if (BeepTime > 10)
BeepTime -= 10;
else
BeepTime = 0;
 
if (BeepTime & BeepMuster)
beeper_ein = 1;
else
beeper_ein = 0;
}
else
{
beeper_ein = 0;
BeepMuster = 0xffff;
}
 
if (beeper_ein)
set_BEEP();
else
clr_BEEP();
 
 
//--------------------------------------------------------------
if ((key_state & LONG_MASK) == 0) // check long key function
k_time_l = REPEAT_START; // start delay
 
if (--k_time_l == 0) // long countdown
key_long |= (key_state & LONG_MASK);
 
//--------------------------------------------------------------
if ((key_state & REPEAT_MASK) == 0) // check repeat function
k_time_r = 1; // kein delay
 
if (--k_time_r == 0)
{
k_time_r = REPEAT_NEXT; // repeat delay
key_rpt |= (key_state & REPEAT_MASK);
}
 
//--------------------------------------------------------------
if ((key_state & LONG_REPEAT_MASK) == 0) // check repeat function
k_time_lr = REPEAT_START; // start delay
 
if (--k_time_lr == 0)
{
k_time_lr = REPEAT_NEXT; // repeat delay
key_lrpt |= (key_state & LONG_REPEAT_MASK);
}
 
//--------------------------------------------------------------
if ((key_state & LONG_REPEAT_SP_MASK) == 0) // check repeatX function
k_time_rs = REPEAT_START; // start delay
 
if (--k_time_rs == 0) // repeat countdown
{
if (repeat_speed == 1)
{
k_time_rs = REPEAT_SPEED_1;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
else if (repeat_speed == 2)
{
k_time_rs = REPEAT_SPEED_2;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
else if (repeat_speed == 3)
{
k_time_rs = REPEAT_SPEED_3;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
}
 
if (timer > 0)
timer --;
 
if (abo_timer > 0)
abo_timer --;
 
 
}
 
 
//--------------------------------------------------------------
#ifdef HWVERSION3_9
 
void LipoCheck (void) // Lowbatpin des Spannungswandlers prüfen
// LBO des LT1308 wechselt zum Ende der Batterielaufzeit häufig seinen Zustand in der Übergangsphase zum LowBat
// Die Akkuspannung schwankt auch abhängig vom momentanen Stromverbrauch
{
if (WarnToggle == 1) // Beim ersten Auftreten Warnung ausgeben, Rythmus 5/10 Sekunden
{
BeepTime = 1000;
BeepMuster = 0x0020;
lcd_printp_at (0, 0, PSTR(" LIPO !!Warnung!! "), 2);
}
 
if (WarnToggle == WarnTime * 100)
WarnToggle = 0; // erstmal bis hier warnen
 
if (WarnToggle > 0)
WarnToggle++; // weiter hochzählen
 
if (PINC & (1 << LowBat)) // Kurzzeitige Unterspannung bearbeiten und Warnung ausgeben
{
WarnCount = 0;
// if (WarnCount > 0)
// WarnCount--; // Bei LIPO OK erstmal runterzählen, LT1308 überlegt sich noch genauer ob nun ok oder nicht
}
 
if (!(PINC & (1 << LowBat)) ) // LT1308 hat Unterspannung erkannt
{
WarnCount++; // solange LBO low ist Zähler hochzählen
if (WarnCount == 10 && WarnToggle == 0) // mit "10" etwas unempfindlicher gegen kurze Impulse machen
WarnToggle = 1; // Warnhinweis starten
}
 
if ((WarnCount) == PoffTime * 100)
clr_V_On(); // Spannung abschalten
}
 
#endif
 
 
//--------------------------------------------------------------
unsigned int SetDelay (unsigned int t)
{
return(CountMilliseconds + t + 1);
}
 
 
//--------------------------------------------------------------
char CheckDelay(unsigned int t)
{
return(((t - CountMilliseconds) & 0x8000) >> 9);
}
 
 
//--------------------------------------------------------------
void Delay_ms(unsigned int w)
{
unsigned int akt;
akt = SetDelay(w);
while (!CheckDelay(akt));
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_press (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_press; // read key(s)
key_press ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_short (uint8_t key_mask)
{
uint8_t ret;
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
ret = get_key_press (~key_state & key_mask);
 
SREG = sreg; // restore status register
 
return ret;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_long; // read key(s)
key_long ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return get_key_press (get_key_rpt (key_mask));
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_rpt (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_rpt; // read key(s)
key_rpt ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long_rpt (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_lrpt; // read key(s)
key_lrpt ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return get_key_rpt (~key_press^key_mask);
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long_rpt_sp (uint8_t key_mask, uint8_t key_speed)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_rpts; // read key(s)
key_rpts ^= key_mask; // clear key(s)
 
repeat_speed = key_speed;
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/timer.h
0,0 → 1,87
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef _TIMER_H
#define _TIMER_H
 
#include "cpu.h"
#include "main.h"
 
#define KEY_ALL ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define REPEAT_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_REPEAT_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_REPEAT_SP_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
 
#define REPEAT_START 70 // after 700ms
#define REPEAT_NEXT 15 // every 150ms
#define REPEAT_SPEED_1 20 // every 200ms
#define REPEAT_SPEED_2 8 // every 80ms
#define REPEAT_SPEED_3 1 // every 10ms
 
#define ABO_TIMEOUT 300 // 3 sec
extern volatile uint8_t Display_on;
extern volatile uint16_t IdleTimer;
 
extern volatile uint16_t timer;
extern volatile uint16_t abo_timer;
extern uint16_t WarnCount;
 
 
//extern volatile unsigned int BeepTime;
extern unsigned int BeepTime;
extern unsigned int BeepMuster;
 
void Timer0_Init (void); // Systeminterrupt
void Timer1_Init (void); // Servotester
void Timer2_Init (void); // Displayhelligkeit
 
uint8_t get_key_press (uint8_t key_mask); // sofort beim drücken
uint8_t get_key_short (uint8_t key_mask); // erst beim loslassen
uint8_t get_key_long (uint8_t key_mask); // verzögert
uint8_t get_key_rpt (uint8_t key_mask); // mit verzögerung
uint8_t get_key_long_rpt (uint8_t key_mask); //
uint8_t get_key_long_rpt_sp (uint8_t key_mask, uint8_t key_speed); // mit verzögerung und 3 versch. geschw.
 
extern volatile unsigned int CountMilliseconds;
 
 
void Delay_ms(unsigned int);
unsigned int SetDelay (unsigned int t);
char CheckDelay (unsigned int t);
void LipoCheck (void); // Lowbatpin des Spannungswandlers prüfen
 
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/tools.c
0,0 → 1,332
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <util/delay.h>
#include "main.h"
#include "setup.h"
#include "lcd.h"
#include "menu.h"
#include "servo.h"
#include "motortest.h"
#include "eeprom.h"
#include "timer.h"
#include "connect.h"
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
#ifdef HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
//#include "voltmeter.h"
#include "lipo.h"
#include "messages.h"
 
//--------------------------------------------------------------
#define ITEMS_PKT 6
 
prog_char tools_menuitems_pkt[ITEMS_PKT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Netherlands
{
{"Motor Tester ","Motor Tester ","Motor Tester ","Motor Tester "},
{"Servo Tester ","Servo Tester ","Servo Tester ","Servo Tester "},
{"PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter "},
{"PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter "},
{"PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d"},
{"PKT Version ","PKT Version ","PKT Version ","PKT Version "},
};
 
 
//--------------------------------------------------------------
void PKT_Tools (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_PKT ;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
val = 0;
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" PKT-Tools "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(2)
{
ii = 0;
if(Offset > 0)
{
lcd_printp_at(1,1, PSTR("\x12"), 0);
}
for(ii = 0;ii < 6 ; ii++)
{
if((ii+Offset) < size)
{
lcd_printp_at(3,ii+1,tools_menuitems_pkt[ii+Offset][DisplayLanguage], 0);
}
if((ii == 5)&&(ii+Offset < (size-1)))
{
lcd_printp_at(1,6, PSTR("\x13"), 0);
}
}
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
{
val = menu_choose2 (1, 5, target_pos,0,1);
}
else
{
val = menu_choose2 (1, size, target_pos,0,0);
}
}
else
{
val = menu_choose2 (2, 5, target_pos,1,1);
}
}
if(dmode == 1)
{
if(Offset+7 > size)
{
val = menu_choose2 (2, 6, target_pos,1,0);
}
else
{
val = menu_choose2 (2, 5, target_pos,1,1);
}
}
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{
return;
}
else
{
break;
}
 
}
target_pos = val;
 
if((val+Offset) == 1 )
motor_test(FC_Mode);
if((val+Offset) == 2 )
servo_test();
#ifdef HWVERSION3_9
if(U02SV2 == 0)
{
if((val+Offset) == 3 )
Port_BT2Wi();
if((val+Offset) == 4 )
Port_USB2Wi();
}
else if(U02SV2 == 1)
{
if((val+Offset) == 3 )
Port_BT2FC();
if((val+Offset) == 4 )
Port_USB2FC();
}
#else
if((val+Offset) == 3 )
Show_Error_HW();
if((val+Offset) == 4 )
Show_Error_HW();
#endif
if((val+Offset) == 5)
PKT_Setup();
if((val+Offset) == 6)
Show_Version();
}
}
 
 
//--------------------------------------------------------------
//
void PC_Fast_Connect (void)
{
uint8_t value = 1;
 
while(1)
{
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" PC-Quick-Verbindung "), 2);
lcd_puts_at(0, 8, strGet(TOOLS1), 2);
lcd_printp_at (3, 3, PSTR("PC BT > Kopter"), 0);
lcd_printp_at (3, 4, PSTR("PC USB > Kopter"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(2)
{
if(value == 1)
{
lcd_printp_at (1, 3, PSTR("\x1d"), 0);
lcd_printp_at (1, 4, PSTR(" "), 0);
}
else
{
lcd_printp_at (1, 3, PSTR(" "), 0);
lcd_printp_at (1, 4, PSTR("\x1d"), 0);
}
 
if(get_key_press (1 << KEY_MINUS))
value = 1;
 
if(get_key_press (1 << KEY_PLUS))
value = 2;
 
 
if(get_key_short (1 << KEY_ENTER))
{
#ifdef HWVERSION3_9
if(U02SV2 == 0)
{
if(value == 1)
Port_BT2Wi();
if(value == 2)
Port_USB2Wi();
}
else if(U02SV2 == 1)
{
if(value == 1)
Port_BT2FC();
if(value == 2)
Port_USB2FC();
}
#else
if(value == 1)
Show_Error_HW();
if(value == 2)
Show_Error_HW();
#endif
break;
}
 
if(get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
 
}
}
}
 
 
void Test_HB (void) // bleibt für Tests
{
// ADC_Init();
//
// uint16_t volt_avg = 0;
//// uint64_t volt_tmp = 0;
// uint16_t Balken = 0;
 
 
lcd_cls();
lcd_printp_at(12, 7, PSTR("Ende"), 0);
 
// lcd_rect(104, 0, 23, 8, 1); // Rahmen
 
do
{
//
//
if(samples>4095)
{
// write_ndigit_number_u(0, 4, accumulator, 5, 0);
oversampled();
volt_avg = Vin;
}
// // write_ndigit_number_u(0, 3, samples, 5, 0);
//
//// write_ndigit_number_u(0, 1, Vin, 5, 0);
// _delay_ms(50);
 
show_Lipo();
 
write_ndigit_number_u_100th(5, 5, volt_avg, 0, 0);
lcd_printp_at(10, 5, PSTR("Volt"), 0);
//
//
//
write_ndigit_number_u(0, 6, Lipo_UOffset, 5, 0);
// write_ndigit_number_u(15, 6, WarnCount, 4, 0);
//// write_ndigit_number_u(10, 5, Vcorr, 4, 0);
 
 
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
Lipo_UOffset = Lipo_UOffset +10;
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS),3))
{
Lipo_UOffset = Lipo_UOffset -10;
}
//
}
 
 
while(!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/tools.h
0,0 → 1,41
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _tools_H
#define _tools_H
 
void PKT_Tools (void);
void Test_HB (void); // TestTool für Softwareentwicklung
 
#endif
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/twimaster.c
0,0 → 1,511
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) Holger Buss, Ingo Busker
// + Nur f?r den privaten Gebrauch
// + www.MikroKopter.com
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt f?r das gesamte Projekt (Hardware, Software, Bin?rfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur f?r den privaten (nicht-kommerziellen) Gebrauch zul?ssig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Best?ckung und Verkauf von Platinen oder Baus?tzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder ver?ffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright m?ssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien ver?ffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gew?hr auf Fehlerfreiheit, Vollst?ndigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir ?bernehmen keinerlei Haftung f?r direkte oder indirekte Personen- oder Sachsch?den
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zul?ssig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/twi.h>
#include <util/delay.h>
#include "eeprom.h"
#include "twimaster.h"
#include "timer.h"
 
volatile uint8_t twi_state = TWI_STATE_MOTOR_TX;
volatile uint8_t dac_channel = 0;
volatile uint8_t motor_write = 0;
volatile uint8_t motor_read = 0;
volatile uint8_t I2C_TransferActive = 0;
 
volatile uint16_t I2CTimeout = 100;
 
uint8_t MissingMotor = 0;
uint8_t RequiredMotors = 1;
char MotorenEin = 0;
 
volatile uint8_t BLFlags = 0;
 
MotorData_t Motor[MAX_MOTORS];
 
// bit mask for witch BL the configuration should be sent
volatile uint16_t BLConfig_WriteMask = 0;
// bit mask for witch BL the configuration should be read
volatile uint16_t BLConfig_ReadMask = 0;
// buffer for BL Configuration
BLConfig_t BLConfig;
 
#define I2C_WriteByte(byte) {TWDR = byte; TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);}
#define I2C_ReceiveByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);}
#define I2C_ReceiveLastByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);}
 
#define SCL_CLOCK 200000L
#define I2C_TIMEOUT 30000
#define TWI_BASE_ADDRESS 0x52
 
 
 
 
uint8_t RAM_Checksum(uint8_t* pBuffer, uint16_t len)
{
uint8_t crc = 0xAA;
uint16_t i;
 
for(i=0; i<len; i++)
{
crc += pBuffer[i];
}
return crc;
}
 
 
 
 
//--------------------------------------------------------------
// Initialize I2C (TWI)
//
void I2C_Init(char clear)
{
uint8_t i;
uint8_t sreg = SREG;
cli();
 
// SDA is INPUT
DDRC &= ~(1<<DDC1);
// SCL is output
DDRC |= (1<<DDC0);
// pull up SDA
//PORTC |= (1<<PORTC0)|(1<<PORTC1);
 
// TWI Status Register
// prescaler 1 (TWPS1 = 0, TWPS0 = 0)
TWSR &= ~((1<<TWPS1)|(1<<TWPS0));
 
// set TWI Bit Rate Register
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
 
twi_state = TWI_STATE_MOTOR_TX;
motor_write = 0;
motor_read = 0;
 
if(clear) for(i=0; i < MAX_MOTORS; i++)
{
Motor[i].Version = 0;
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
Motor[i].State = 0;
Motor[i].ReadMode = BL_READMODE_STATUS;
Motor[i].Current = 0;
Motor[i].MaxPWM = 0;
Motor[i].Temperature = 0;
}
sei();
SREG = sreg;
}
 
 
//--------------------------------------------------------------
void I2C_Reset(void)
{
// stop i2c bus
I2C_Stop(TWI_STATE_MOTOR_TX);
TWCR = (1<<TWINT); // reset to original state incl. interrupt flag reset
TWAMR = 0;
TWAR = 0;
TWDR = 0;
TWSR = 0;
TWBR = 0;
I2C_TransferActive = 0;
I2C_Init(0);
I2C_WriteByte(0);
BLFlags |= BLFLAG_READ_VERSION;
}
 
 
//--------------------------------------------------------------
// I2C ISR
//
ISR (TWI_vect)
{
static uint8_t missing_motor = 0, motor_read_temperature = 0;
static uint8_t *pBuff = 0;
static uint8_t BuffLen = 0;
 
switch (twi_state++)
{
// Master Transmit
 
case 0: // TWI_STATE_MOTOR_TX
I2C_TransferActive = 1;
// skip motor if not used in mixer
// while((Mixer.Motor[motor_write][MIX_GAS] <= 0) && (motor_write < MAX_MOTORS)) motor_write++;
if(motor_write >= MAX_MOTORS) // writing finished, read now
{
BLConfig_WriteMask = 0; // reset configuration bitmask
motor_write = 0; // reset motor write counter for next cycle
twi_state = TWI_STATE_MOTOR_RX;
I2C_WriteByte(TWI_BASE_ADDRESS + TW_READ + (motor_read<<1) ); // select slave address in rx mode
}
else I2C_WriteByte(TWI_BASE_ADDRESS + TW_WRITE + (motor_write<<1) ); // select slave address in tx mode
break;
 
case 1: // Send Data to Slave
I2C_WriteByte(Motor[motor_write].SetPoint); // transmit setpoint
// if old version has been detected
if(!(Motor[motor_write].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
{
twi_state = 4; //jump over sending more data
}
// the new version has been detected
else if(!( (Motor[motor_write].SetPointLowerBits && (RequiredMotors < 7)) || BLConfig_WriteMask || BLConfig_ReadMask ) )
{ // or LowerBits are zero and no BlConfig should be sent (saves round trip time)
twi_state = 4; //jump over sending more data
}
break;
 
case 2: // lower bits of setpoint (higher resolution)
if ((0x0001<<motor_write) & BLConfig_ReadMask)
{
Motor[motor_write].ReadMode = BL_READMODE_CONFIG; // configuration request
}
else
{
Motor[motor_write].ReadMode = BL_READMODE_STATUS; // normal status request
}
// send read mode and the lower bits of setpoint
I2C_WriteByte((Motor[motor_write].ReadMode<<3)|(Motor[motor_write].SetPointLowerBits & 0x07));
// configuration tranmission request?
if((0x0001<<motor_write) & BLConfig_WriteMask)
{ // redirect tx pointer to configuration data
pBuff = (uint8_t*)&BLConfig; // select config for motor
BuffLen = sizeof(BLConfig_t);
}
else
{ // jump to end of transmission for that motor
twi_state = 4;
}
break;
 
case 3: // send configuration
I2C_WriteByte(*pBuff);
pBuff++;
if(--BuffLen > 0)
twi_state = 3; // if there are some bytes left
break;
 
case 4: // repeat case 0-4 for all motors
if(TWSR == TW_MT_DATA_NACK) // Data transmitted, NACK received
{
if(!missing_motor)
missing_motor = motor_write + 1;
 
if((Motor[motor_write].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK)
Motor[motor_write].State++; // increment error counter and handle overflow
}
I2C_Stop(TWI_STATE_MOTOR_TX);
I2CTimeout = 10;
motor_write++; // next motor
I2C_Start(TWI_STATE_MOTOR_TX); // Repeated start -> switch slave or switch Master Transmit -> Master Receive
break;
 
// Master Receive Data
case 5: // TWI_STATE_MOTOR_RX
if(TWSR != TW_MR_SLA_ACK) // SLA+R transmitted but no ACK received
{ // no response from the addressed slave received
Motor[motor_read].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit
if(++motor_read >= MAX_MOTORS)
{ // all motors read
motor_read = 0; // restart from beginning
BLConfig_ReadMask = 0; // reset read configuration bitmask
if(++motor_read_temperature >= MAX_MOTORS)
{
motor_read_temperature = 0;
BLFlags &= ~BLFLAG_READ_VERSION;
}
}
BLFlags |= BLFLAG_TX_COMPLETE;
I2C_Stop(TWI_STATE_MOTOR_TX);
I2C_TransferActive = 0;
}
else
{ // motor successfully addressed
Motor[motor_read].State |= MOTOR_STATE_PRESENT_MASK; // set present bit
if(Motor[motor_read].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)
{
// new BL found
switch(Motor[motor_read].ReadMode)
{
case BL_READMODE_CONFIG:
pBuff = (uint8_t*)&BLConfig;
BuffLen = sizeof(BLConfig_t);
break;
 
case BL_READMODE_STATUS:
pBuff = (uint8_t*)&(Motor[motor_read].Current);
if(motor_read == motor_read_temperature) BuffLen = 3; // read Current, MaxPwm & Temp
else BuffLen = 1;// read Current only
break;
}
}
else // old BL version
{
pBuff = (uint8_t*)&(Motor[motor_read].Current);
if((BLFlags & BLFLAG_READ_VERSION) || (motor_read == motor_read_temperature)) BuffLen = 2; // Current & MaxPwm
else BuffLen = 1; // read Current only
}
if(BuffLen == 1)
{
I2C_ReceiveLastByte(); // read last byte
}
else
{
I2C_ReceiveByte(); // read next byte
}
}
MissingMotor = missing_motor;
missing_motor = 0;
break;
 
case 6: // receive bytes
*pBuff = TWDR;
pBuff++;
BuffLen--;
if(BuffLen>1)
{
I2C_ReceiveByte(); // read next byte
}
else if (BuffLen == 1)
{
I2C_ReceiveLastByte(); // read last byte
}
else // nothing left
{
if(BLFlags & BLFLAG_READ_VERSION)
{
// if(!(FC_StatusFlags & FC_STATUS_MOTOR_RUN) && (Motor[motor_read].MaxPWM == 250) ) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK;
if((Motor[motor_read].MaxPWM == 250) ) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK;
else Motor[motor_read].Version = 0;
}
if(++motor_read >= MAX_MOTORS)
{
motor_read = 0; // restart from beginning
BLConfig_ReadMask = 0; // reset read configuration bitmask
if(++motor_read_temperature >= MAX_MOTORS)
{
motor_read_temperature = 0;
BLFlags &= ~BLFLAG_READ_VERSION;
}
}
I2C_Stop(TWI_STATE_MOTOR_TX);
BLFlags |= BLFLAG_TX_COMPLETE;
I2C_TransferActive = 0;
return;
}
twi_state = 6; // if there are some bytes left
break;
 
case 21:
I2C_WriteByte(0x80); // 2nd byte for all channels is 0x80
break;
 
case 22:
I2C_Stop(TWI_STATE_MOTOR_TX);
I2C_TransferActive = 0;
I2CTimeout = 10;
// repeat case 18...22 until all DAC Channels are updated
if(dac_channel < 2)
{
dac_channel ++; // jump to next channel
I2C_Start(TWI_STATE_GYRO_OFFSET_TX); // start transmission for next channel
}
else
{
dac_channel = 0; // reset dac channel counter
BLFlags |= BLFLAG_TX_COMPLETE;
}
break;
 
default:
I2C_Stop(TWI_STATE_MOTOR_TX);
BLFlags |= BLFLAG_TX_COMPLETE;
I2CTimeout = 10;
motor_write = 0;
motor_read = 0;
I2C_TransferActive = 0;
break;
}
 
}
 
 
//--------------------------------------------------------------
uint8_t I2C_WriteBLConfig(uint8_t motor)
{
uint8_t i;
uint16_t timer;
 
// if(MotorenEin || PC_MotortestActive)
// return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(MotorenEin)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(motor > MAX_MOTORS)
return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(motor)
{
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK))
return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL!
}
 
// check BL configuration to send
if(BLConfig.Revision != BLCONFIG_REVISION)
return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison
 
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1);
 
if(i != BLConfig.crc)
return(BLCONFIG_ERR_CHECKSUM); // bad checksum
 
timer = SetDelay(2000);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
// prepare the bitmask
if(!motor) // 0 means all
{
BLConfig_WriteMask = 0xFF; // all motors at once with the same configuration
}
else //only one specific motor
{
BLConfig_WriteMask = 0x0001<<(motor-1);
}
for(i = 0; i < MAX_MOTORS; i++)
{
if((0x0001<<i) & BLConfig_WriteMask)
{
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
}
}
 
motor_write = 0;
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms)
do
{
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
while(BLConfig_WriteMask && !CheckDelay(timer)); // repeat until the BL config has been sent
 
if(BLConfig_WriteMask) return(BLCONFIG_ERR_MOTOR_NOT_EXIST);
return(BLCONFIG_SUCCESS);
}
 
 
//--------------------------------------------------------------
uint8_t I2C_ReadBLConfig(uint8_t motor)
{
uint8_t i;
uint16_t timer;
 
// if(MotorenEin || PC_MotortestActive)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(MotorenEin)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(motor > MAX_MOTORS)
return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(motor == 0)
return (BLCONFIG_ERR_READ_NOT_POSSIBLE);
 
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK))
return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL!
 
timer = SetDelay(2000);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
// prepare the bitmask
BLConfig_ReadMask = 0x0001<<(motor-1);
 
for(i = 0; i < MAX_MOTORS; i++)
{
if((0x0001<<i) & BLConfig_ReadMask)
{
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
}
}
 
motor_read = 0;
BLConfig.Revision = 0; // bad revision
BLConfig.crc = 0; // bad checksum
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms)
do
{
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}while(BLConfig_ReadMask && !CheckDelay(timer)); // repeat until the BL config has been received from all motors
// validate result
if(BLConfig.Revision != BLCONFIG_REVISION) return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1);
if(i != BLConfig.crc) return(BLCONFIG_ERR_CHECKSUM); // bad checksum
return(BLCONFIG_SUCCESS);
}
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/twimaster.h
0,0 → 1,100
#ifndef _I2C_MASTER_H
#define _I2C_MASTER_H
+
+#include <inttypes.h>
+
+#define TWI_STATE_MOTOR_TX 0
+#define TWI_STATE_MOTOR_RX 5
+#define TWI_STATE_GYRO_OFFSET_TX 18
+
+extern volatile uint8_t twi_state;
+extern volatile uint8_t motor_write;
+extern volatile uint8_t motor_read;
+extern volatile uint8_t I2C_TransferActive;
+
+extern uint8_t MissingMotor;
+
+#define MAX_MOTORS 12
+#define MOTOR_STATE_PRESENT_MASK 0x80
+#define MOTOR_STATE_ERROR_MASK 0x7F
+#define MOTOR_STATE_NEW_PROTOCOL_MASK 0x01
+#define BLFLAG_TX_COMPLETE 0x01
+#define BLFLAG_READ_VERSION 0x02
+
+extern volatile uint8_t BLFlags;
+extern char MotorenEin;
+unsigned char MotorTest[16];
+#define BL_READMODE_STATUS 0
+#define BL_READMODE_CONFIG 16
+
+typedef struct
+{
+ uint8_t Version; // the version of the BL (0 = old)
+ uint8_t SetPoint; // written by attitude controller
+ uint8_t SetPointLowerBits; // for higher Resolution of new BLs
+ uint8_t State; // 7 bit for I2C error counter, highest bit indicates if motor is present
+ uint8_t ReadMode; // select data to read
+ // the following bytes must be exactly in that order!
+ uint8_t Current; // in 0.1 A steps, read back from BL
+ uint8_t MaxPWM; // read back from BL is less than 255 if BL is in current limit
+ int8_t Temperature; // old BL-Ctrl will return a 255 here, the new version the temp. in �C
+} __attribute__((packed)) MotorData_t;
+
+extern MotorData_t Motor[MAX_MOTORS];
+
+#define BLCONFIG_REVISION 2
+
+#define MASK_SET_PWM_SCALING 0x01
+#define MASK_SET_CURRENT_LIMIT 0x02
+#define MASK_SET_TEMP_LIMIT 0x04
+#define MASK_SET_CURRENT_SCALING 0x08
+#define MASK_SET_BITCONFIG 0x10
+#define MASK_RESET_CAPCOUNTER 0x20
+#define MASK_SET_DEFAULT_PARAMS 0x40
+#define MASK_SET_SAVE_EEPROM 0x80
+
+#define BITCONF_REVERSE_ROTATION 0x01
+#define BITCONF_RES1 0x02
+#define BITCONF_RES2 0x04
+#define BITCONF_RES3 0x08
+#define BITCONF_RES4 0x10
+#define BITCONF_RES5 0x20
+#define BITCONF_RES6 0x40
+#define BITCONF_RES7 0x80
+
+typedef struct
+{
+ uint8_t Revision; // must be BL_REVISION
+ uint8_t SetMask; // settings mask
+ uint8_t PwmScaling; // maximum value of control pwm, acts like a thrust limit
+ uint8_t CurrentLimit; // current limit in A
+ uint8_t TempLimit; // in �C
+ uint8_t CurrentScaling; // scaling factor for current measurement
+ uint8_t BitConfig; // see defines above
+ uint8_t crc; // checksum
+} __attribute__((packed)) BLConfig_t;
+
+extern BLConfig_t BLConfig;
+
+extern volatile uint16_t I2CTimeout;
+
+void I2C_Init(char); // Initialize I2C
+#define I2C_Start(start_state) {twi_state = start_state; BLFlags &= ~BLFLAG_TX_COMPLETE; TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);}
+#define I2C_Stop(start_state) {twi_state = start_state; TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);}
+void I2C_Reset(void); // Reset I2C
+
+#define BLCONFIG_SUCCESS 0
+#define BLCONFIG_ERR_MOTOR_RUNNING 1
+#define BLCONFIG_ERR_MOTOR_NOT_EXIST 2
+#define BLCONFIG_ERR_HW_NOT_COMPATIBLE 3
+#define BLCONFIG_ERR_SW_NOT_COMPATIBLE 4
+#define BLCONFIG_ERR_CHECKSUM 5
+#define BLCONFIG_ERR_READ_NOT_POSSIBLE 6
+
+uint8_t I2C_WriteBLConfig(uint8_t motor);
+uint8_t I2C_ReadBLConfig(uint8_t motor);
+
+#endif
+
+
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/uart1.c
0,0 → 1,303
/*************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: uart.c,v 1.6.2.2 2009/11/29 08:56:12 Peter Exp $
Software: AVR-GCC 4.1, AVR Libc 1.4.6 or higher
Hardware: any AVR with built-in UART,
License: GNU General Public License
 
DESCRIPTION:
An interrupt is generated when the UART has finished transmitting or
receiving a byte. The interrupt handling routines use circular buffers
for buffering received and transmitted data.
 
The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define
the buffer size in bytes. Note that these variables must be a
power of 2.
 
USAGE:
Refere to the header file uart.h for a description of the routines.
See also example test_uart.c.
 
NOTES:
Based on Atmel Application Note AVR306
 
LICENSE:
Copyright (C) 2006 Peter Fleury
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
*************************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "uart1.h"
#include "main.h"
 
//
// constants and macros
//
 
 
// size of RX/TX buffers
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)
 
#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
 
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
#error TX buffer size is not a power of 2
#endif
 
 
// ATmega with two USART
 
#define ATMEGA_USART1
 
#define UART1_STATUS UCSR1A
#define UART1_CONTROL UCSR1B
#define UART1_DATA UDR1
#define UART1_UDRIE UDRIE1
 
 
 
//
// module global variables
//
 
#if defined( ATMEGA_USART1 )
static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART1_TxHead;
static volatile unsigned char UART1_TxTail;
static volatile unsigned char UART1_RxHead;
static volatile unsigned char UART1_RxTail;
static volatile unsigned char UART1_LastRxError;
#endif
 
 
 
 
//
// these functions are only for ATmegas with two USART
//
 
 
#if defined( ATMEGA_USART1 )
 
//--------------------------------------------------------------
// Function: UART1 Receive Complete interrupt
// Purpose: called when the UART1 has received a character
//--------------------------------------------------------------
ISR(USART1_RX_vect)
{
unsigned char tmphead;
unsigned char data;
unsigned char usr;
unsigned char lastRxError;
 
 
// read UART status register and UART data register
usr = UART1_STATUS;
data = UART1_DATA;
 
lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) );
 
// calculate buffer index
tmphead = ( UART1_RxHead + 1) & UART_RX_BUFFER_MASK;
 
if ( tmphead == UART1_RxTail )
{
// error: receive buffer overflow
lastRxError = UART_BUFFER_OVERFLOW >> 8;
}
else
{
// store new index
UART1_RxHead = tmphead;
// store received data in buffer
UART1_RxBuf[tmphead] = data;
}
UART1_LastRxError = lastRxError;
}
 
 
//--------------------------------------------------------------
// Function: UART1 Data Register Empty interrupt
// Purpose: called when the UART1 is ready to transmit the next byte
//--------------------------------------------------------------
ISR(USART1_UDRE_vect)
{
unsigned char tmptail;
 
 
if ( UART1_TxHead != UART1_TxTail)
{
// calculate and store new buffer index
tmptail = (UART1_TxTail + 1) & UART_TX_BUFFER_MASK;
UART1_TxTail = tmptail;
// get one byte from buffer and write it to UART
UART1_DATA = UART1_TxBuf[tmptail]; // start transmission
}
else
{
// tx buffer empty, disable UDRE interrupt
UART1_CONTROL &= ~_BV(UART1_UDRIE);
}
}
 
 
//--------------------------------------------------------------
// Function: uart1_init()
// Purpose: initialize UART1 and set baudrate
// Input: baudrate using macro UART_BAUD_SELECT()
// Returns: none
//--------------------------------------------------------------
void uart1_init(unsigned int baudrate)
{
UART1_TxHead = 0;
UART1_TxTail = 0;
UART1_RxHead = 0;
UART1_RxTail = 0;
 
 
// Set baud rate
if ( baudrate & 0x8000 )
{
UART1_STATUS = (1<<U2X1); //Enable 2x speed
baudrate &= ~0x8000;
}
UBRR1H = (unsigned char)(baudrate>>8);
UBRR1L = (unsigned char) baudrate;
 
// Enable USART receiver and transmitter and receive complete interrupt
UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
 
// Set frame format: asynchronous, 8data, no parity, 1stop bit
#ifdef URSEL1
UCSR1C = (1<<URSEL1)|(3<<UCSZ10);
#else
UCSR1C = (3<<UCSZ10);
#endif
}
 
 
//--------------------------------------------------------------
// Function: uart1_getc()
// Purpose: return byte from ringbuffer
// Returns: lower byte: received byte from ringbuffer
// higher byte: last receive error
//--------------------------------------------------------------
unsigned int uart1_getc(void)
{
unsigned char tmptail;
unsigned char data;
 
 
if ( UART1_RxHead == UART1_RxTail )
{
return UART_NO_DATA; // no data available
}
 
// calculate /store buffer index
tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK;
UART1_RxTail = tmptail;
 
// get data from receive buffer
data = UART1_RxBuf[tmptail];
 
return (UART1_LastRxError << 8) + data;
 
}
 
 
//--------------------------------------------------------------
// Function: uart1_putc()
// Purpose: write byte to ringbuffer for transmitting via UART
// Input: byte to be transmitted
// Returns: 1 on succes, 0 if remote not ready
//--------------------------------------------------------------
int uart1_putc(unsigned char data)
{
unsigned char tmphead;
 
 
tmphead = (UART1_TxHead + 1) & UART_TX_BUFFER_MASK;
 
while ( tmphead == UART1_TxTail )
{;} // wait for free space in buffer
 
UART1_TxBuf[tmphead] = data;
UART1_TxHead = tmphead;
 
// enable UDRE interrupt
UART1_CONTROL |= _BV(UART1_UDRIE);
return (UART1_LastRxError << 8) + data;
}
 
 
//--------------------------------------------------------------
// Function: uart1_puts()
// Purpose: transmit string to UART1
// Input: string to be transmitted
// Returns: none
//--------------------------------------------------------------
void uart1_puts(const char *s )
{
while (*s)
uart1_putc(*s++);
}
 
 
//--------------------------------------------------------------
// Function: uart1_puts_p()
// Purpose: transmit string from program memory to UART1
// Input: program memory string to be transmitted
// Returns: none
//--------------------------------------------------------------
void uart1_puts_p(const char *progmem_s )
{
register char c;
while ( (c = pgm_read_byte(progmem_s++)) )
uart1_putc(c);
}
 
 
//--------------------------------------------------------------
// Function: uart1_available()
// Purpose: Determine the number of bytes waiting in the receive buffer
// Input: None
// Returns: Integer number of bytes in the receive buffer
//--------------------------------------------------------------
int uart1_available(void)
{
return (UART_RX_BUFFER_MASK + UART1_RxHead - UART1_RxTail) % UART_RX_BUFFER_MASK;
}
 
 
 
//--------------------------------------------------------------
// Function: uart1_flush()
// Purpose: Flush bytes waiting the receive buffer. Acutally ignores them.
// Input: None
// Returns: None
//--------------------------------------------------------------
void uart1_flush(void)
{
UART1_RxHead = UART1_RxTail;
}
 
 
#endif
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/uart1.h
0,0 → 1,167
/************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: uart.h,v 1.8.2.1 2007/07/01 11:14:38 peter Exp $
Software: AVR-GCC 4.1, AVR Libc 1.4
Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
License: GNU General Public License
Usage: see Doxygen manual
 
LICENSE:
Copyright (C) 2006 Peter Fleury
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
************************************************************************/
 
//
// @defgroup pfleury_uart UART Library
// @code #include <uart.h> @endcode
//
// @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.
//
// This library can be used to transmit and receive data through the built in UART.
//
// An interrupt is generated when the UART has finished transmitting or
// receiving a byte. The interrupt handling routines use circular buffers
// for buffering received and transmitted data.
//
// The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define
// the size of the circular buffers in bytes. Note that these constants must be a power of 2.
// You may need to adapt this constants to your target and your application by adding
// CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile.
//
// @note Based on Atmel Application Note AVR306
// @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury
//
 
#ifndef UART_H
#define UART_H
 
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
 
 
// constants and macros
 
 
// @brief UART Baudrate Expression
// @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
// @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
//
#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1)
 
// @brief UART Baudrate Expression for ATmega double speed mode
// @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
// @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
//
#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) (((xtalCpu)/((baudRate)*8l)-1)|0x8000)
 
 
// Size of the circular receive buffer, must be power of 2
#ifndef UART_RX_BUFFER_SIZE
#define UART_RX_BUFFER_SIZE 32
#endif
 
// Size of the circular transmit buffer, must be power of 2
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 32
#endif
 
// test if the size of the circular buffers fits into SRAM
#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) )
#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM"
#endif
 
 
// high byte error return code of uart_getc()
 
#define UART_FRAME_ERROR 0x0800 // Framing Error by UART
#define UART_OVERRUN_ERROR 0x0400 // Overrun condition by UART
#define UART_BUFFER_OVERFLOW 0x0200 // receive ringbuffer overflow
#define UART_NO_DATA 0x0100 // no receive data available
 
 
//
// function prototypes
//
 
//
// @brief Initialize UART and set baudrate
// @param baudrate Specify baudrate using macro UART_BAUD_SELECT()
// @return none
//
extern void uart_init(unsigned int baudrate);
 
 
//
// @brief Get received byte from ringbuffer
//
// Returns in the lower byte the received character and in the
// higher byte the last receive error.
// UART_NO_DATA is returned when no data is available.
//
// @param void
// @return lower byte: received byte from ringbuffer
// @return higher byte: last receive status
// - \b 0 successfully received data from UART
// - \b UART_NO_DATA
// <br>no receive data available
// - \b UART_BUFFER_OVERFLOW
// <br>Receive ringbuffer overflow.
// We are not reading the receive buffer fast enough,
// one or more received character have been dropped
// - \b UART_OVERRUN_ERROR
// <br>Overrun condition by UART.
// A character already present in the UART UDR register was
// not read by the interrupt handler before the next character arrived,
// one or more received characters have been dropped.
// - \b UART_FRAME_ERROR
// <br>Framing Error by UART
//
extern unsigned int uart_getc(void);
 
 
//
// @brief Put byte to ringbuffer for transmitting via UART
// @param data byte to be transmitted
// @return none
//
 
 
 
 
// @brief Initialize USART1 (only available on selected ATmegas) @see uart_init
extern void uart1_init(unsigned int baudrate);
 
// @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc
extern unsigned int uart1_getc(void);
 
// @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc
//extern void uart1_putc(unsigned char data);
extern int uart1_putc(unsigned char data);
 
// @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts
extern void uart1_puts(const char *s );
 
// @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p
extern void uart1_puts_p(const char *s );
 
// @brief Macro to automatically put a string constant into program memory
#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
 
extern char *utoa1(char* buffer, const unsigned int size, unsigned int value);
 
 
#endif // UART_H
 
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/usart.c
0,0 → 1,634
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <stdarg.h>
 
#include "main.h"
#include "usart.h"
#include "lcd.h"
#include "timer.h"
 
uint8_t buffer[30];
 
volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
volatile uint8_t txd_complete = TRUE;
 
volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
volatile uint8_t rxd_buffer_locked = FALSE;
volatile uint8_t ReceivedBytes = 0;
volatile uint8_t *pRxData = 0;
volatile uint8_t RxDataLen = 0;
 
volatile uint16_t stat_crc_error = 0;
volatile uint16_t stat_overflow_error = 0;
 
volatile uint8_t rx_byte;
volatile uint8_t rxFlag = 0;
 
 
#define UART_RXBUFSIZE 64
#define UART_NO_DATA 0x0100 /* no receive data available */
 
volatile static uint8_t rxbuf[UART_RXBUFSIZE];
volatile static uint8_t *volatile rxhead, *volatile rxtail;
 
 
/*
 
//-----------------------------------------------------------------------------
// USART1 transmitter ISR
ISR (USART1_TX_vect)
{
static uint16_t ptr_txd1_buffer = 0;
uint8_t tmp_tx1;
 
if(!txd1_complete) // transmission not completed
{
ptr_txd1_buffer++; // [0] was already sent
tmp_tx1 = txd1_buffer[ptr_txd1_buffer];
// if terminating character or end of txd buffer was reached
if((tmp_tx1 == '\r') || (ptr_txd1_buffer == TXD_BUFFER_LEN))
{
ptr_txd1_buffer = 0; // reset txd pointer
txd1_complete = TRUE; // stop transmission
}
UDR1 = tmp_tx1; // send current byte will trigger this ISR again
}
// transmission completed
else ptr_txd1_buffer = 0;
}
 
*/
 
 
#ifdef USART_INT
//-----------------------------------------------------------------------------
// USART0 transmitter ISR
ISR (USART_TX_vect)
{
static uint16_t ptr_txd_buffer = 0;
uint8_t tmp_tx;
 
if(!txd_complete) // transmission not completed
{
ptr_txd_buffer++; // [0] was already sent
tmp_tx = txd_buffer[ptr_txd_buffer];
// if terminating character or end of txd buffer was reached
if((tmp_tx == '\r') || (ptr_txd_buffer == TXD_BUFFER_LEN))
{
ptr_txd_buffer = 0; // reset txd pointer
txd_complete = TRUE; // stop transmission
}
UDR = tmp_tx; // send current byte will trigger this ISR again
}
// transmission completed
else ptr_txd_buffer = 0;
}
#endif
 
 
 
 
 
//-----------------------------------------------------------------------------
//
 
//
//uint8_t uart_getc_nb(uint8_t *c)
//{
// if (rxhead==rxtail) return 0;
// *c = *rxtail;
// if (++rxtail == (rxbuf + UART_RXBUFSIZE)) rxtail = rxbuf;
// return 1;
//}
 
 
 
 
ISR (USART0_RX_vect)
{
static uint16_t crc;
static uint8_t ptr_rxd_buffer = 0;
uint8_t crc1, crc2;
uint8_t c;
// IdleTimer = 0;
if (current_hardware == Wi232)
{
// rx_byte = c;
// rxFlag = 1;
int diff;
uint8_t c;
c=UDR;
diff = rxhead - rxtail;
if (diff < 0) diff += UART_RXBUFSIZE;
if (diff < UART_RXBUFSIZE -1)
{
*rxhead = c;
++rxhead;
if (rxhead == (rxbuf + UART_RXBUFSIZE)) rxhead = rxbuf;
};
// USART_putc (c);
return;
}
 
 
if (current_hardware == MKGPS)
{
// rx_byte = c;
// rxFlag = 1;
int diff;
uint8_t c;
c=UDR;
diff = rxhead - rxtail;
if (diff < 0) diff += UART_RXBUFSIZE;
if (diff < UART_RXBUFSIZE -1)
{
*rxhead = c;
++rxhead;
if (rxhead == (rxbuf + UART_RXBUFSIZE)) rxhead = rxbuf;
};
 
return;
}
 
c = UDR; // catch the received byte
 
 
if (rxd_buffer_locked)
return; // if rxd buffer is locked immediately return
 
// the rxd buffer is unlocked
if ((ptr_rxd_buffer == 0) && (c == '#')) // if rxd buffer is empty and syncronisation character is received
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
crc = c; // init crc
}
else if (ptr_rxd_buffer < RXD_BUFFER_LEN) // collect incomming bytes
{
if(c != '\r') // no termination character
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
}
else // termination character was received
{
// the last 2 bytes are no subject for checksum calculation
// they are the checksum itself
crc -= rxd_buffer[ptr_rxd_buffer-2];
crc -= rxd_buffer[ptr_rxd_buffer-1];
// calculate checksum from transmitted data
crc %= 4096;
crc1 = '=' + crc / 64;
crc2 = '=' + crc % 64;
// compare checksum to transmitted checksum bytes
if((crc1 == rxd_buffer[ptr_rxd_buffer-2]) && (crc2 == rxd_buffer[ptr_rxd_buffer-1]))
{ // checksum valid
rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character
ReceivedBytes = ptr_rxd_buffer + 1;// store number of received bytes
if (mode == rxd_buffer[2])
{
rxd_buffer_locked = TRUE; // lock the rxd buffer
// if 2nd byte is an 'R' enable watchdog that will result in an reset
if(rxd_buffer[2] == 'R') {wdt_enable(WDTO_250MS);} // Reset-Commando
}
}
else
{ // checksum invalid
stat_crc_error++;
rxd_buffer_locked = FALSE; // unlock rxd buffer
}
ptr_rxd_buffer = 0; // reset rxd buffer pointer
}
}
else // rxd buffer overrun
{
stat_overflow_error++;
ptr_rxd_buffer = 0; // reset rxd buffer
rxd_buffer_locked = FALSE; // unlock rxd buffer
}
}
 
 
//-----------------------------------------------------------------------------
// Function: uart0_getc()
// Purpose: return byte from ringbuffer
// Returns: lower byte: received byte from ringbuffer
// higher byte: last receive error
//-----------------------------------------------------------------------------
char USART_getc(void)
{
char val;
 
// while(rxhead==rxtail) ;
if (rxhead==rxtail)
return val=0;
// IdleTimer = 0;
val = *rxtail;
if (++rxtail == (rxbuf + UART_RXBUFSIZE))
rxtail = rxbuf;
 
return val;
}
 
 
uint8_t uart_getc_nb(uint8_t *c)
{
if (rxhead==rxtail)
return 0;
// IdleTimer = 0;
*c = *rxtail;
if (++rxtail == (rxbuf + UART_RXBUFSIZE))
rxtail = rxbuf;
return 1;
}
//-----------------------------------------------------------------------------
//
 
 
 
 
 
//-----------------------------------------------------------------------------
//
void USART_Init (unsigned int baudrate)
{
// set clock divider
// #undef BAUD
// #define BAUD baudrate
// #include <util/setbaud.h>
// UBRRH = UBRRH_VALUE;
// UBRRL = UBRRL_VALUE;
 
UBRRH = (unsigned char)(baudrate>>8);
UBRRL = (unsigned char) baudrate;
 
#if USE_2X
UCSRA |= (1 << U2X); // enable double speed operation
#else
UCSRA &= ~(1 << U2X); // disable double speed operation
#endif
 
// set 8N1
#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega32__)
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
#else
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
#endif
UCSRB &= ~(1 << UCSZ2);
 
// flush receive buffer
while ( UCSRA & (1 << RXC) ) UDR;
 
UCSRB |= (1 << RXEN) | (1 << TXEN);
#ifdef USART_INT
UCSRB |= (1 << RXCIE) | (1 << TXCIE);
#else
UCSRB |= (1 << RXCIE);
#endif
 
rxhead = rxtail = rxbuf;
 
}
 
 
 
 
 
//-----------------------------------------------------------------------------
// disable the txd pin of usart
void USART_DisableTXD (void)
{
#ifdef USART_INT
UCSRB &= ~(1 << TXCIE); // disable TX-Interrupt
#endif
UCSRB &= ~(1 << TXEN); // disable TX in USART
DDRB &= ~(1 << DDB3); // set TXD pin as input
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
}
 
//-----------------------------------------------------------------------------
// enable the txd pin of usart
void USART_EnableTXD (void)
{
DDRB |= (1 << DDB3); // set TXD pin as output
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
UCSRB |= (1 << TXEN); // enable TX in USART
#ifdef USART_INT
UCSRB |= (1 << TXCIE); // enable TX-Interrupt
#endif
}
 
//-----------------------------------------------------------------------------
// short script to directly send a request thorugh usart including en- and disabling it
// where <address> is the address of the receipient, <label> is which data set to request
// and <ms> represents the milliseconds delay between data
void USART_request_mk_data (uint8_t cmd, uint8_t addr, uint8_t ms)
{
USART_EnableTXD (); // re-enable TXD pin
 
unsigned char mstenth = ms/10;
SendOutData(cmd, addr, 1, &mstenth, 1);
// wait until command transmitted
while (txd_complete == FALSE);
 
USART_DisableTXD (); // disable TXD pin again
}
 
//-----------------------------------------------------------------------------
//
void USART_putc (char c)
{
#ifdef USART_INT
#else
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
#endif
}
 
 
 
//-----------------------------------------------------------------------------
//
void USART_puts (char *s)
{
#ifdef USART_INT
#else
while (*s)
{
USART_putc (*s);
s++;
}
#endif
}
 
//-----------------------------------------------------------------------------
//
void USART_puts_p (const char *s)
{
#ifdef USART_INT
#else
while (pgm_read_byte(s))
{
USART_putc (pgm_read_byte(s));
s++;
}
#endif
}
 
//-----------------------------------------------------------------------------
//
void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...) // uint8_t *pdata, uint8_t len, ...
{
va_list ap;
uint16_t pt = 0;
uint8_t a,b,c;
uint8_t ptr = 0;
uint16_t tmpCRC = 0;
 
uint8_t *pdata = 0;
int len = 0;
 
txd_buffer[pt++] = '#'; // Start character
txd_buffer[pt++] = 'a' + addr; // Address (a=0; b=1,...)
txd_buffer[pt++] = cmd; // Command
 
va_start(ap, numofbuffers);
if(numofbuffers)
{
pdata = va_arg (ap, uint8_t*);
len = va_arg (ap, int);
ptr = 0;
numofbuffers--;
}
 
while(len)
{
if(len)
{
a = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
a = 0;
 
if(len)
{
b = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
b = 0;
 
if(len)
{
c = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
c = 0;
 
txd_buffer[pt++] = '=' + (a >> 2);
txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
txd_buffer[pt++] = '=' + ( c & 0x3f);
}
va_end(ap);
 
for(a = 0; a < pt; a++)
{
tmpCRC += txd_buffer[a];
}
tmpCRC %= 4096;
txd_buffer[pt++] = '=' + tmpCRC / 64;
txd_buffer[pt++] = '=' + tmpCRC % 64;
txd_buffer[pt++] = '\r';
 
txd_complete = FALSE;
#ifdef USART_INT
UDR = txd_buffer[0]; // initiates the transmittion (continued in the TXD ISR)
#else
for(a = 0; a < pt; a++)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = txd_buffer[a];
}
txd_complete = TRUE;
#endif
}
 
//-----------------------------------------------------------------------------
//
void Decode64 (void)
{
uint8_t a,b,c,d;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
 
while (len)
{
a = rxd_buffer[ptrIn++] - '=';
b = rxd_buffer[ptrIn++] - '=';
c = rxd_buffer[ptrIn++] - '=';
d = rxd_buffer[ptrIn++] - '=';
//if(ptrIn > ReceivedBytes - 3) break;
 
if (len--)
rxd_buffer[ptrOut++] = (a << 2) | (b >> 4);
else
break;
 
if (len--)
rxd_buffer[ptrOut++] = ((b & 0x0f) << 4) | (c >> 2);
else
break;
 
if (len--)
rxd_buffer[ptrOut++] = ((c & 0x03) << 6) | d;
else
break;
}
pRxData = &rxd_buffer[3];
RxDataLen = ptrOut - 3;
}
 
 
//-----------------------------------------------------------------------------
//
void SwitchToNC (void)
{
 
if(hardware == NC)
{
// switch to NC
USART_putc (0x1b);
USART_putc (0x1b);
USART_putc (0x55);
USART_putc (0xaa);
USART_putc (0x00);
current_hardware = NC;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
 
 
//-----------------------------------------------------------------------------
//
void SwitchToWi232 (void)
{
 
// if(hardware == NC)
{
// switch to Wi232
current_hardware = Wi232;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToFC (void)
{
uint8_t cmd;
 
if (current_hardware == NC)
{
// switch to FC
cmd = 0x00; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = FC;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToMAG (void)
{
uint8_t cmd;
 
if (current_hardware == NC)
{
// switch to MK3MAG
cmd = 0x01; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = MK3MAG;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToGPS (void)
{
uint8_t cmd;
if (current_hardware == NC)
{
// switch to MKGPS
cmd = 0x02; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = MKGPS;
_delay_ms (50);
}
}
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/usart.h
0,0 → 1,149
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _USART_H
#define _USART_H
 
//--------------------------------------------------------------
//
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
 
// addresses
#define ADDRESS_ANY 0
#define ADDRESS_FC 1
#define ADDRESS_NC 2
#define ADDRESS_MAG 3
 
// must be at least 4('#'+Addr+'CmdID'+'\r')+ (80 * 4)/3 = 111 bytes
#define TXD_BUFFER_LEN 60
#define RXD_BUFFER_LEN 180
 
// Baud rate of the USART
#define USART_BAUD 57600
//#define USART_BAUD 125000
 
//--------------------------------------------------------------
//
extern uint8_t buffer[30];
 
extern volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
extern volatile uint8_t txd_complete;
extern volatile uint8_t txd1_buffer[TXD_BUFFER_LEN];
extern volatile uint8_t txd1_complete;
extern volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
extern volatile uint8_t rxd_buffer_locked;
extern volatile uint8_t ReceivedBytes;
extern volatile uint8_t *pRxData;
extern volatile uint8_t RxDataLen;
 
extern volatile uint16_t stat_crc_error;
extern volatile uint16_t stat_overflow_error;
 
extern volatile uint8_t rxFlag;
extern volatile uint8_t rx_byte;
 
//--------------------------------------------------------------
//
void USART_Init (unsigned int baudrate);
void USART_DisableTXD (void);
void USART_EnableTXD (void);
void USART_request_mk_data (uint8_t cmd, uint8_t addr, uint8_t ms);
 
void USART_putc (char c);
void USART_puts (char *s);
void USART_puts_p (const char *s);
 
 
extern char USART_getc(void);
void SendOutData (uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...); // uint8_t *pdata, uint8_t len, ...
//void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, uint8_t *pdata, uint8_t len); // uint8_t *pdata, uint8_t len, ...
void Decode64 (void);
 
void SwitchToNC (void);
void SwitchToFC (void);
void SwitchToMAG (void);
void SwitchToGPS (void);
void SwitchToWi232 (void);
void debug1(void);
 
uint8_t uart_getc_nb(uint8_t*);
 
//--------------------------------------------------------------
//Anpassen der seriellen Schnittstellen Register
#define USART_RXC_vect USART0_RX_vect
//--------------------------------------------------------------
#define UCSRA UCSR0A
#define UCSRB UCSR0B
#define UCSRC UCSR0C
#define UDR UDR0
#define UBRRL UBRR0L
#define UBRRH UBRR0H
 
// UCSRA
#define RXC RXC0
#define TXC TXC0
#define UDRE UDRE0
#define FE FE0
#define UPE UPE0
#define U2X U2X0
#define MPCM MPCM0
 
// UCSRB
#define RXCIE RXCIE0
#define TXCIE TXCIE0
#define UDRIE UDRIE0
#define TXEN TXEN0
#define RXEN RXEN0
#define UCSZ2 UCSZ02
#define RXB8 RXB80
#define TXB8 TXB80
 
// UCSRC
#define UMSEL1 UMSEL01
#define UMSEL0 UMSEL00
#define UPM1 UPM01
#define UPM0 UPM00
#define USBS USBS0
#define UCSZ1 UCSZ01
#define UCSZ0 UCSZ00
#define UCPOL UCPOL0
 
 
#endif
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/waypoints.c
0,0 → 1,347
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <string.h>
#include "91x_lib.h"
#include "waypoints.h"
#include "uart1.h"
 
// the waypoints list
#define MAX_LIST_LEN 31
 
Point_t PointList[MAX_LIST_LEN];
u8 WPIndex = 0; // list index of GPS point representig the current WP, can be maximal WPCount
u8 POIIndex = 0; // list index of GPS Point representing the current POI, can be maximal WPCount
u8 WPCount = 0; // number of waypoints
u8 PointCount = 0; // number of wp in the list can be maximal equal to MAX_LIST_LEN
u8 POICount = 0;
 
u8 WPActive = FALSE;
 
u8 PointList_Init(void)
{
return PointList_Clear();
}
 
u8 PointList_Clear(void)
{
u8 i;
WPIndex = 0; // real list position are 1 ,2, 3 ...
POIIndex = 0; // real list position are 1 ,2, 3 ...
WPCount = 0; // no waypoints
POICount = 0;
PointCount = 0; // no contents
WPActive = FALSE;
NaviData.WaypointNumber = WPCount;
NaviData.WaypointIndex = 0;
 
for(i = 0; i < MAX_LIST_LEN; i++)
{
PointList[i].Position.Status = INVALID;
PointList[i].Position.Latitude = 0;
PointList[i].Position.Longitude = 0;
PointList[i].Position.Altitude = 0;
PointList[i].Heading = 361; // invalid value
PointList[i].ToleranceRadius = 0; // in meters, if the MK is within that range around the target, then the next target is triggered
PointList[i].HoldTime = 0; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
PointList[i].Type = POINT_TYPE_INVALID;
PointList[i].Event_Flag = 0; // future implementation
PointList[i].AltitudeRate = 0; // no change of setpoint
}
return TRUE;
}
 
u8 PointList_GetCount(void)
{
return PointCount; // number of points in the list
}
 
Point_t* PointList_GetAt(u8 index)
{
if((index > 0) && (index <= PointCount)) return(&(PointList[index-1])); // return pointer to this waypoint
else return(NULL);
}
 
u8 PointList_SetAt(Point_t* pPoint)
{
// if index is in range
if((pPoint->Index > 0) && (pPoint->Index <= MAX_LIST_LEN))
{
// check list entry before update
switch(PointList[pPoint->Index-1].Type)
{
case POINT_TYPE_INVALID: // was invalid
switch(pPoint->Type)
{
default:
case POINT_TYPE_INVALID:
// nothing to do
break;
 
case POINT_TYPE_WP:
WPCount++;
PointCount++;
break;
case POINT_TYPE_POI:
POICount++;
PointCount++;
break;
}
break;
case POINT_TYPE_WP: // was a waypoint
switch(pPoint->Type)
{
case POINT_TYPE_INVALID:
WPCount--;
PointCount--;
break;
 
default:
case POINT_TYPE_WP:
//nothing to do
break;
case POINT_TYPE_POI:
POICount++;
WPCount--;
break;
}
break;
case POINT_TYPE_POI: // was a poi
switch(pPoint->Type)
{
case POINT_TYPE_INVALID:
POICount--;
PointCount--;
break;
 
case POINT_TYPE_WP:
WPCount++;
POICount--;
break;
case POINT_TYPE_POI:
default:
// nothing to do
break;
}
break;
}
memcpy(&PointList[pPoint->Index-1], pPoint, sizeof(Point_t)); // copy data to list entry
NaviData.WaypointNumber = WPCount;
return pPoint->Index;
}
else return(0);
}
 
// returns the pointer to the first waypoint within the list
Point_t* PointList_WPBegin(void)
{
u8 i;
WPIndex = 0; // set list position invalid
 
if(WPActive == FALSE) return(NULL);
 
POIIndex = 0; // set invalid POI
if(PointCount > 0)
{
// search for first wp in list
for(i = 0; i <MAX_LIST_LEN; i++)
{
if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID))
{
WPIndex = i + 1;
break;
}
}
if(WPIndex) // found a WP in the list
{
NaviData.WaypointIndex = 1;
// update index to POI
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
}
else // some points in the list but no WP found
{
NaviData.WaypointIndex = 0;
//Check for an existing POI
for(i = 0; i < MAX_LIST_LEN; i++)
{
if((PointList[i].Type == POINT_TYPE_POI) && (PointList[i].Position.Status != INVALID))
{
POIIndex = i + 1;
break;
}
}
}
}
else // no point in the list
{
POIIndex = 0;
NaviData.WaypointIndex = 0;
}
 
if(WPIndex) return(&(PointList[WPIndex-1]));
else return(NULL);
}
 
// returns the last waypoint
Point_t* PointList_WPEnd(void)
{
u8 i;
WPIndex = 0; // set list position invalid
POIIndex = 0; // set invalid
 
if(WPActive == FALSE) return(NULL);
 
if(PointCount > 0)
{
// search backward!
for(i = 1; i <= MAX_LIST_LEN; i++)
{
if((PointList[MAX_LIST_LEN - i].Type == POINT_TYPE_WP) && (PointList[MAX_LIST_LEN - i].Position.Status != INVALID))
{
WPIndex = MAX_LIST_LEN - i + 1;
break;
}
}
if(WPIndex) // found a WP within the list
{
NaviData.WaypointIndex = WPCount;
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
}
else // list contains some points but no WP in the list
{
// search backward for a POI!
for(i = 1; i <= MAX_LIST_LEN; i++)
{
if((PointList[MAX_LIST_LEN - i].Type == POINT_TYPE_POI) && (PointList[MAX_LIST_LEN - i].Position.Status != INVALID))
{
POIIndex = MAX_LIST_LEN - i + 1;
break;
}
}
NaviData.WaypointIndex = 0;
}
}
else // no point in the list
{
POIIndex = 0;
NaviData.WaypointIndex = 0;
}
if(WPIndex) return(&(PointList[WPIndex-1]));
else return(NULL);
}
 
// returns a pointer to the next waypoint or NULL if the end of the list has been reached
Point_t* PointList_WPNext(void)
{
u8 wp_found = 0;
if(WPActive == FALSE) return(NULL);
if(WPIndex < MAX_LIST_LEN) // if there is a next entry in the list
{
u8 i;
for(i = WPIndex; i < MAX_LIST_LEN; i++) // start search for next at next list entry
{
if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID)) // jump over POIs
{
wp_found = i+1;
break;
}
}
}
if(wp_found)
{
WPIndex = wp_found; // update list position
NaviData.WaypointIndex++;
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
return(&(PointList[WPIndex-1])); // return pointer to this waypoint
}
else
{ // no next wp found
NaviData.WaypointIndex = 0;
POIIndex = 0;
return(NULL);
}
}
 
void PointList_WPActive(u8 set)
{
if(set)
{
WPActive = TRUE;
PointList_WPBegin(); // uopdates POI index
}
else
{
WPActive = FALSE;
POIIndex = 0; // disable POI also
}
}
Point_t* PointList_GetPOI(void)
{
return PointList_GetAt(POIIndex);
}
 
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/waypoints.h
0,0 → 1,56
#ifndef _WAYPOINTS_H
#define _WAYPOINTS_H
 
//#include "ubx.h"
 
#define POINT_TYPE_INVALID 255
#define POINT_TYPE_WP 0
#define POINT_TYPE_POI 1
 
 
typedef struct
{
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
u8 Status;// validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct
{
GPS_Pos_t Position; // the gps position of the waypoint, see ubx.h for details
s16 Heading; // orientation, 0 no action, 1...360 fix heading, neg. = Index to POI in WP List
u8 ToleranceRadius; // in meters, if the MK is within that range around the target, then the next target is triggered
u8 HoldTime; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
u8 Event_Flag; // future implementation
u8 Index; // to indentify different waypoints, workaround for bad communications PC <-> NC
u8 Type; // typeof Waypoint
u8 WP_EventChannelValue; //
u8 AltitudeRate; // rate to change the setpoint
u8 reserve[8]; // reserve
} __attribute__((packed)) Point_t;
 
// Init List, return TRUE on success
u8 PointList_Init(void);
// Clear List, return TRUE on success
u8 PointList_Clear(void);
// Returns number of points in the list
u8 PointList_GetCount(void);
// return pointer to point at position
Point_t* PointList_GetAt(u8 index);
// set a point in the list at index, returns its index on success, else 0
u8 PointList_SetAt(Point_t* pPoint);
// goto the first WP in the list and return pointer to it
Point_t* PointList_WPBegin(void);
// goto the last WP in the list and return pointer to it
Point_t* PointList_WPEnd(void);
// goto next WP in the list and return pointer to it
Point_t* PointList_WPNext(void);
// enables/disables waypoint function
void PointList_WPActive(u8 set);
// returns pointer to actual POI
Point_t* PointList_GetPOI(void);
 
 
#endif // _WAYPOINTS_H
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/Beta/GPL_PKT_V3_5_9a_FC087.hex
0,0 → 1,5328
:100000000C9481250C94A9250C94A9250C94A92560
:100010000C94A9250C94A9250C94A9250C94A92528
:100020000C94A9250C94EA830C94F5830C94A925CF
:100030000C94A9250C94A9250C94A9250C94A92508
:100040000C9413850C94A9250C94A9250C94A9252E
:100050000C94E28C0C94A9250C94A9250C94A92548
:100060000C94914D0C94A9250C94A7880C94A92567
:100070000C94038C0C94338C0C94A9250C94A92516
:100080000C94A9250C94A9250C94A925582C5C2C1A
:10009000602C642C682C7D2C812C852C892C2F2C99
:1000A000442C482C4C2C502C542C402C8D2CAC2CFB
:1000B00005A84CCDB2D44EB93836A9020C50B9912E
:1000C0008688083CA6AAAA2ABE000000803F457880
:1000D0006974007374617274656E00756E64204D8E
:1000E000696B726F6B6F70746572746F6F6C0050B8
:1000F00043206D6974205553422076657262696EA3
:1001000064656E0057692E32333220746F20464387
:100110002000457869740050726F6772616D6D20C0
:100120007374617274656E0057692E3233320050F9
:1001300043206D6974205553422076657262696E62
:1001400064656E0057692E323332204B6F6E6669DC
:100150006775726174696F6E200057692E32333291
:10016000204E414B00576932333220496E69744545
:1001700072726F72202000576932333220496E69E3
:1001800074206F6B2E2E2E2E005769323332204989
:100190006E69744572726F722020002E002E002E40
:1001A000002E002E002E002E002E002E002E002EDF
:1001B000002E002E002E002E002E002E002E002ECF
:1001C00000496E697420576932333220776169744F
:1001D0002E2E2E2E0056657273696F6E3A006F6B6D
:1001E000202020202020202020202020202020200F
:1001F00020200052414D2073657420746F203537E4
:1002000036303020202020004572726F72207365D6
:10021000742052414D2020202020006F6B20202090
:100220002020202020202020202020202020004EC0
:10023000562D52414D2073657420746F203537362A
:100240003030004572726F7220736574204E562DE7
:1002500052414D0057692E32333220666F756E64FD
:1002600020323430300057692E32333220666F75B9
:100270006E642035373630300057692E32333220E5
:1002800053797461786572726F72202020006E6FEE
:100290002057692E32333220666F756E64090077FD
:1002A000697468203234303020426175640920203E
:1002B0002000776974682035373630302042617508
:1002C0006409007365617263682057692E323332A6
:1002D000204D6F64756C003030313200496E71759D
:1002E00069727920456E64000D0A00496E71756966
:1002F000727920526573756C74733A0D0A00455219
:10030000524F520D0A004F4B0D0A000D004154533D
:10031000310041544E3D004154523100415452305D
:100320000041544F31004154463F004154443D0088
:10033000415444300041544800415441004154006C
:100340004154453100415451300041544530004141
:100350005451310041544C340041545A30004154FE
:10036000503D002E0054696D65206F75742C4661F8
:10037000696C20746F20636F6E6E65637421004337
:100380004F4E4E45435400444953434F4E4E454310
:1003900054000D0A00425420696E697469616C69E9
:1003A00073696572656E2E2E004576616C75617499
:1003B000696F6E20283836384D487A29202000523F
:1003C0006164696F74726F6E69782057692E323379
:1003D00032445453004B6162656C20616E736368F4
:1003E0006C69657373656E2E202000504B54206538
:1003F000696E2067656B7265757A7465732020205D
:10040000005A7769736368656E204D4B2D555342D2
:1004100020756E642020004D4B2D55534220616E97
:1004200020504320616E7363686C2E200046432089
:100430003E204D4B2D555342203E2042544D2D32EF
:1004400032320042544D2D323232204B6F6E66698B
:10045000677572696572656E004552524F523A2057
:100460006E6F2064617461003F004643004E43009C
:100470004E43004643004552524F523A206E6F2081
:100480006461746100416E616C6F67204E616D65DF
:10049000733A200052656164696E67004665686C56
:1004A00065723A204B65696E6520446174656E0023
:1004B000464300204E6176692D4374726C20446976
:1004C00073706C6179202020004E430020466C69D7
:1004D0006768742D4374726C20446973706C617921
:1004E000200020200020446973706C617920202056
:1004F0002020202020202020202000464300204EC5
:100500006176692D4374726C20446973706C6179F3
:10051000202020004E430020466C696768742D43FC
:1005200074726C20446973706C6179200020200023
:1005300020446973706C61792020202020202020C5
:10054000202020202000464300204E6176692D4364
:1005500074726C20446973706C6179202020000DE6
:100560000A002E002E004F4B002121436865636B6B
:1005700020506172616D6574657221212000504BBD
:100580005420436562726120003132333400537469
:10059000616E646172647765727465206765736506
:1005A000747A740077657264656E206175660020E8
:1005B000454550524F4D20506172616D65746572B2
:1005C000202020200000000000000078151415787D
:1005D0000020555455780038454445380030494886
:1005E0004930003C4140413C003841402178007E88
:1005F0001515150A000000000000000000000000B2
:10060000000000000000000000000000001038544E
:1006100010101E000000000000101010101010102C
:1006200010107C10100000000000000814000014DE
:1006300008100804040810081020201008000814EE
:1006400022410000412214080004027F020400102D
:10065000207F201000103854101010101010543843
:100660001010181C1C181008183838180800081C1E
:100670003E7F00007F3E1C080006090909060006AF
:10068000497D49060000000000000000002F000026
:1006900000000700070000147F147F1400242A6B59
:1006A0002A120023130864620036495522500000C4
:1006B0000503000000001C224100000041221C0034
:1006C0000014083E08140008083E080800005030D6
:1006D0000000000808080808000060600000002012
:1006E00010080402003E5149453E0000427F400090
:1006F000004261514946002141454B310018141216
:100700007F10002745454539003C4A4949300003E0
:100710000171090700364949493600064949291E31
:100720000000363600000000563600000008142293
:100730004100001414141414000041221408000293
:100740000151090600324979413E007E1111117EA6
:10075000007F49494936003E41414122007F4141E5
:10076000221C007F49494941007F09090901003ED7
:100770004149497A007F0808087F0000417F410015
:10078000002040413F01007F08142241007F40408B
:100790004040007F020C027F007F0408107F003E73
:1007A0004141413E007F09090906003E4151215E59
:1007B000007F091929460046494949310001017F56
:1007C0000101003F4040403F001F2040201F003FEC
:1007D0004038403F0063140814630007087008079E
:1007E000006151494543007F414100000002040877
:1007F0001020000041417F0000040201020400407B
:10080000404040400000010204000020545454784D
:10081000007F48444438003844444420003844446D
:10082000487F00385454541800087E090102000C17
:100830005252523E007F080404780000447D40007C
:10084000002040443D00007F102844000000417F0C
:100850004000007C04180478007C08040478003808
:1008600044444438007C1414140800081414187C00
:10087000007C0804040800485454542000043F44F9
:100880004020003C4040207C001C2040201C003CBC
:100890004038403C004428102844000C5050503C44
:1008A000004464544C440000083641000000007FBE
:1008B00000000000413608000008082A1C08000853
:1008C0001C2A0808006D002E002E006B6D2F68009A
:1008D0002E00636D002020006F6B00200044006E2E
:1008E0006F0032440033440020002D00780058008F
:1008F0004F00416C742020202020203A20004C61C1
:10090000742020202020203A20004C6F6E67202089
:100910002020203A20005370656564202020203A72
:10092000200050444F5020202020203A20004163D6
:10093000637572616379203A20005361742020202E
:100940002020203A20004669782054797065203AAA
:1009500020004E7572206D6974204E4320210020C6
:100960001A202020201B2020202020457869740098
:100970002020303132333435363738394142434420
:1009800045460D0A00302E38377800454550726FC5
:100990006D5265762E3A00454550726F6D52657600
:1009A0002E3A002E003F002E002E004F53442020F0
:1009B000202020202020202020202020004F5344D1
:1009C0002020202020202020202020202020004F18
:1009D00053442020202020202020202020202020C0
:1009E000004F5344202020202020202020202020A1
:1009F0002020003344204C616765202020202020E7
:100A00002020202000334420616E67656C657320D0
:100A1000202020202020003344206C6F6361746903
:100A20006F6E202020202020003344206C6F6361F3
:100A300074696520202020202020004D4B2044692F
:100A400073706C617920202020202020004D4B20E5
:100A5000446973706C617920202020202020004D93
:100A60004B20446973706C61792020202020202065
:100A7000004D4B20446973706C6179202020202048
:100A8000202000506172616D657465722020202005
:100A90002020201D00506172616D657465722020F8
:100AA00020202020201D00506172616D65746572E8
:100AB000202020202020201D00506172616D65746F
:100AC0006572732020202020201D00446562756718
:100AD0002044617461202020202020200044656291
:100AE000756720446174612020202020202000446C
:100AF00065627567204461746120202020202020D9
:100B000000446562756720446174612020202020C4
:100B100020200047505320496E666F20202020205F
:100B2000202020200047505320496E666F2020204F
:100B30002020202020200047505320496E666F203F
:100B400020202020202020200047505320496E667E
:100B50006F20202020202020202000504B542054A3
:100B60006F6F6C73202020202020201D00504B54DC
:100B700020546F6F6C73202020202020201D0050F7
:100B80004B5420546F6F6C73202020202020201D98
:100B900000504B5420546F6F6C7320202020202075
:100BA000201D004D4B20446973706C61792020201A
:100BB00020202020004D4B20446973706C61792007
:100BC000202020202020004D4B20446973706C6150
:100BD0007920202020202020004D4B204469737074
:100BE0006C61792020202020202000506172616DEE
:100BF00065746572202020202020201D0050617225
:100C0000616D65746572202020202020201D005019
:100C10006172616D65746572202020202020201D86
:100C200000506172616D6574657220202020202063
:100C3000201D004465627567204461746120202096
:100C40002020202000446562756720446174612083
:100C500020202020202000446562756720446174B4
:100C600061202020202020200044656275672044F8
:100C70006174612020202020202000504B542054FB
:100C80006F6F6C73202020202020201D00504B54BB
:100C900020546F6F6C73202020202020201D0050D6
:100CA0004B5420546F6F6C73202020202020201D77
:100CB00000504B5420546F6F6C7320202020202054
:100CC000201D00424C2D4374726C2E2054657374A9
:100CD0006572200000424C2D4374726C2E205465C6
:100CE00073746572200000424C2D4374726C2E2088
:100CF000546573746572200000424C2D4374726C0D
:100D00002E20546573746572200000536572766FEF
:100D10002054657374657220202020200053657272
:100D2000766F205465737465722020202020005354
:100D30006572766F205465737465722020202020C0
:100D400000536572766F205465737465722020209D
:100D5000202000504320425420203E204B6F7074CE
:100D60006572202000504320425420203E204B6FCB
:100D700070746572202000504320425420203E2091
:100D80004B6F707465722020005043204254202025
:100D90003E204B6F707465722020005043205553E5
:100DA00042203E204B6F707465722020005043201B
:100DB000555342203E204B6F7074657220200050C6
:100DC0004320555342203E204B6F707465722020A3
:100DD00000504320555342203E204B6F7074657283
:100DE000202000504B542053657475702020202023
:100DF0002020201D00504B54205365747570202016
:100E000020202020201D00504B5420536574757005
:100E1000202020202020201D00504B54205365749A
:100E20007570202020202020201D00504B5420567B
:100E3000657273696F6E20202020202000504B5473
:100E40002056657273696F6E20202020202000508C
:100E50004B542056657273696F6E2020202020202D
:100E600000504B5420566572736965202020202065
:100E70002020002020202020202020202020202092
:100E800020202020202020200028432920474E55C4
:100E90002047504C204C6963656E7365202000200C
:100EA0002020204E4F2057415252414E545920206D
:100EB0002020202000202020202020202020202052
:100EC00020202020202020202020003230303820F8
:100ED00054686F6D6173204B6169736572202020C7
:100EE00000323030392D3230313020506574657227
:100EF000204D61636B2000323031302053656261D8
:100F0000737469616E20426F65686D200032303104
:100F100031204368722E204272616E64746E657275
:100F20002026002020202020486172616C6420422D
:100F30006F6E676172747A20002000120013001235
:100F40000013002000332E352E396100504B542001
:100F5000546F6F6C2020562E20202020202020202F
:100F60002000456E646500206E69636874206DF62C
:100F7000676C6963682100204D697420646965733A
:100F80006572204861726477617265002D55666CE8
:100F90006173683A773A46494C452E6865783A61FC
:100FA00020002D50636F6D3F202D6231313532307E
:100FB00030202020202020002D706D3132383470F8
:100FC000202D636176723130392020202000537447
:100FD00061727420617672647564652E657865202F
:100FE0002020200020504B542055706461746520EF
:100FF00020202020202020202000302E383778008C
:10100000504B542D546F6F6C204643200013001238
:1010100000302E38377800504B542D546F6F6C20B1
:10102000464320001D0020005374617465203A007F
:1010300056657273696F6E3A0054656D70657261C2
:10104000747572653A0043757272656E7420202063
:10105000203A00536574506F696E742020203A0066
:101060001D00200020001D00416C6C00416C6C00D4
:101070001D001A201B0056616C75653A2020203037
:10108000004D6F746F723A202020310020424C2DA9
:101090004374726C2054657374202020202020201B
:1010A0002000456E646520436865636B0054656D80
:1010B0007020203A004D617850574D203A0043751A
:1010C00072726E743A00526561644D6F643A0053F7
:1010D00074617465203A00536574506F694C3A002E
:1010E000536574506F693A0056657273696F6E3A52
:1010F00000466F756E6420424C2D4374726C3A004A
:10110000537563686520424C2D4374726C006D61A9
:101110007820416C7469747564653A006D6178205B
:1011200053706565642020203A006D617820446921
:101130007374616E63653A006D696E20566F6C74EE
:10114000616765203A006D61782054696D652020E3
:1011500020203A006D61782043757272656E7420AC
:101160003A005573656443617061636974793A004C
:101170000E111C112A1138114611541162110E0F53
:101180000E4E0E0F0E4F0E0F0E530E0F0E570E0F6C
:101190000E4E0E0F0E4F0E0F0E530E0F0E570E0F5C
:1011A0000E4E0E0F0E4F0E0F0E530E0F0E574E45D6
:1011B000004520005345005320005357005720009E
:1011C0004E57004E2000AE11B111B411B711BA1133
:1011D000BD11C011C3114B3A00523A004E3A0045BE
:1011E0006E642020496E666F006D416800504300B8
:1011F0002020001F00680046726565202020202006
:10120000202000506F732E20486F6C642020004314
:101210006F6D696E6720486F6D6500536174730070
:101220006B6D2F68004F6E6C792077697468204E63
:10123000432021002E002E002E002E002E002E0016
:101240006D4168006B6D2F68004B616EE46C65202A
:1012500020202020202020004368616E6E656C20D5
:101260002020202020200043616E617578202020FE
:101270002020202020004B616E61616C2020202006
:1012800020202020004B6F6E66696775726174695B
:101290006F6E20006D61696E2020202020202020AC
:1012A000202000436F6E66696720202020202020C8
:1012B0002000436F6E6669677572617469652020EE
:1012C00000537469636B2020202020202020200000
:1012D000737469636B202020202020202020004D83
:1012E000616E636865202020202020202000537438
:1012F00069636B202020202020202020004C6F6F6D
:1013000070696E6720202020202020004C6F6F70B5
:10131000696E6720202020202020004C6F6F7069AC
:101320006E6720202020202020004C6F6F70696E97
:1013300067202020202020200048F66865202020FB
:101340002020202020202000416C74697475646581
:1013500020202020202000416C7469747564652071
:10136000202020202000486F6F67746520202020F7
:1013700020202020004B616D6572612020202020FC
:101380002020200043616D657261202020202020F4
:1013900020200043616D65726120202020202020E4
:1013A000200043616D6572612020202020202020D4
:1013B000004E6176694374726C202020202020004A
:1013C0004E6176694374726C202020202020004EEC
:1013D0006176694374726C202020202020004E61C9
:1013E00076694374726C20202020202000417573A0
:1013F00067E46E6765202020202020004F75747000
:101400007574732020202020202000536F7274698F
:101410006573202020202020200055697467616EAC
:1014200067656E202020202000566572736368690E
:101430006564656E6573200044697665727320206B
:10144000202020202020004469766572732020200F
:10145000202020202000446976657273656E20206C
:1014600020202020004779726F202020202020207B
:10147000202020004779726F20202020202020206B
:101480002020004779726F2020202020202020205B
:1014900020004779726F202020202020202020204B
:1014A0000042656E75747A6572202020202020002D
:1014B00055736572202020202020202020200050FD
:1014C0006172616D6574726573202020200047652C
:1014D000627275696B65722020202020004163686C
:1014E000736B6F70706C756E67202000436F757042
:1014F0006C20417865732020202000436F75706C4C
:10150000204178657320202020004B6F7070656C3F
:10151000696E672041737320004D697865722D53A1
:101520006574757020202000436F6E666967204DDA
:1015300069782020202000436F6E666967204D691E
:10154000782020202000436F6E6669672E204D6949
:101550007865722000456173792053657475702039
:1015600020202000436F6E666967204561737920F3
:10157000202000436F6E66696720456173792020E3
:101580002000436F6E6669672E20656173792020A5
:1015900000476173202020202020202020202000D0
:1015A0005468726F74746C652020202020200047DE
:1015B000617A202020202020202020202000476148
:1015C0007320202020202020202020200047696533
:1015D00072202020202020202020200047696572D2
:1015E00020202020202020202020004C61636574D2
:1015F0002020202020202020200047696572202004
:101600002020202020202020004E69636B202020F5
:1016100020202020202020004E69636B20202020E5
:101620002020202020200054616E67616765202003
:101630002020202020004E69636B202020202020C5
:101640002020202000526F6C6C20202020202020A1
:1016500020202000526F6C6C202020202020202091
:10166000202000526F756C697320202020202020DC
:101670002000526F6C6C2020202020202020202071
:1016800000506F746920312020202020202020006D
:10169000506F74692031202020202020202000500D
:1016A0006F74692031202020202020202000506FDE
:1016B00074692031202020202020202000506F74C9
:1016C000692032202020202020202000506F7469C3
:1016D0002032202020202020202000506F746920FC
:1016E00032202020202020202000506F74692032DA
:1016F000202020202020202000506F7469203320DB
:101700002020202020202000506F746920332020CA
:1017100020202020202000506F74692033202020BA
:10172000202020202000506F7469203320202020AA
:101730002020202000506F74692034202020202099
:1017400020202000506F7469203420202020202089
:10175000202000506F746920342020202020202079
:101760002000506F74692034202020202020202069
:1017700000506F7469203520202020202020200078
:10178000506F746920352020202020202020005018
:101790006F74692035202020202020202000506FE9
:1017A00074692035202020202020202000506F74D4
:1017B000692036202020202020202000506F7469CE
:1017C0002036202020202020202000506F74692007
:1017D00036202020202020202000506F74692036E1
:1017E000202020202020202000506F7469203720E6
:1017F0002020202020202000506F746920372020D6
:1018000020202020202000506F74692037202020C5
:10181000202020202000506F7469203720202020B5
:101820002020202000506F746920382020202020A4
:1018300020202000506F7469203820202020202094
:10184000202000506F746920382020202020202084
:101850002000506F74692038202020202020202074
:10186000004D6F746F7220536963682E5363680074
:101870004D6F742E5361666574792053772E004D39
:101880006F742E5361666574792053772E004D6F07
:10189000742E7361662E736368616B2E00457277D8
:1018A0002E205369672E2050722E2000456E682E20
:1018B000205369672E436865636B005265636570EA
:1018C0002052656E666F72636500556974672E53AA
:1018D00069672E436865636B00456D7066E46E67EB
:1018E000657220547970200052656365697665726F
:1018F00020547970652000547970652052656365C5
:101900007074657572004F6E7476616E672E205428
:10191000797065200048F668656E726567656C656C
:10192000722020004374726C20416C746974756479
:101930006520004374726C20416C74697475646531
:1019400020004374726C20486F6F677465202020FC
:10195000004750532020202020202020202020003D
:1019600047505320202020202020202020200047E6
:1019700050532020202020202020202020004750CD
:10198000532020202020202020202020004B6F6D7D
:10199000706173732020202020202000436F6D7021
:1019A0006173732020202020202000436F6D706120
:1019B000732020202020202020004B6F6D70617349
:1019C0002020202020202020004B6F6D7046657362
:1019D0007420417573722E00436F6D704F7269658C
:1019E0006E742E466978004D61696E7469656E206B
:1019F0004361702020004B6F6D70617320766173BE
:101A000074202020004572772E205369672E2050C5
:101A1000722E200053656E732E526376536967569B
:101A2000616C004374726C2052656E205265636570
:101A30007000457874526563205369676E61616C0C
:101A4000004163687328652E296B6F70706C2E00DF
:101A50004178697320436F7570696E672020004478
:101A600065636F75706C61676520417865004173CF
:101A7000206B6F7070656C696E6720200044726522
:101A800068726174656E626567722E00526F74527F
:101A9000617465206C696D69742E004C696D6974A0
:101AA000205669742E20526F7400526F7452617404
:101AB00065206C696D69742E0048656164696E67A4
:101AC00020486F6C642020004E69636B2F526F6C4E
:101AD0006C2020202020004F7269656E742E2046F5
:101AE0006978652020004B6F65727320766173748E
:101AF00020202020004E69636B2F526F6C6C2050A9
:101B0000202020004E69636B2F526F6C6C20502098
:101B1000202000526F756C2F54616E67205020207A
:101B200020004E69636B2F526F6C6C205020202078
:101B3000004E69636B2F526F6C6C20442020200094
:101B40004E69636B2F526F6C6C2044202020005232
:101B50006F756C2F54616E672044202020004E6901
:101B6000636B2F526F6C6C20442020200047696506
:101B700072205020202020202020200047696572FC
:101B800020502020202020202020004C61636574FC
:101B900020502020202020202000476965722050FE
:101BA00020202020202020200045787465726E655A
:101BB000204B6F6E74722E0045787465726E2043F0
:101BC00074726C202020004374726C204578746518
:101BD000726E6520200045787465726E20436F6ECA
:101BE00074726F6C004C6F6F70696E67206F626506
:101BF0006E2020004C6F6F70696E6720757020201A
:101C00002020004C6F6F70696E67204176616E74A2
:101C100020004C6F6F70696E67206F6D686F6F6723
:101C2000004C6F6F70696E6720756E74656E200072
:101C30004C6F6F70696E6720646F776E2020004C68
:101C40006F6F70696E6720417272696572004C6FC8
:101C50006F70696E672062656E65642E004C6F6FF1
:101C600070696E67206C696E6B7320004C6F6F70CB
:101C7000696E67206C6566742020004C6F6F706918
:101C80006E6720476175636865004C6F6F70696EA1
:101C900067206C696E6B7320004C6F6F70696E67A4
:101CA00020726563687473004C6F6F70696E672093
:101CB000726967687420004C6F6F70696E672044AA
:101CC000726F697465004C6F6F70696E6720726522
:101CD0006368747300476173204C696D69742020D8
:101CE000202020005468726F74746C65204C696DFC
:101CF0006974004C696D6974652047617A20202001
:101D00002000476173204C696D6965742020202094
:101D100000416E737072656368736368772E20008C
:101D2000526573702E205468726573682E200053BC
:101D30006575696C205265706F6E73652000447222
:101D4000656D70656C7761617264652000487973B8
:101D500074657265736520202020200048797374B3
:101D6000657265736973202020200048797374655B
:101D7000726573697320202020004879737465723E
:101D8000657365202020202000556D6B656872709A
:101D90002E204E69636B20005475726E6F766572EB
:101DA000204E69636B2000496E7665727320526F16
:101DB000756C697320004E69636B206765696E7688
:101DC0006572742E00556D6B656872702E20526FAF
:101DD0006C6C20005475726E6F76657220526F6C59
:101DE0006C2000496E766572732054616E6761677E
:101DF0006500526F6C6C206765696E766572742E33
:101E00000048F668656E726567656C756E672000E0
:101E1000416C746974756465204374726C2000436E
:101E200074726C20416C7469747564652000486F2D
:101E30006F67746520436F6E74726F6C004A3A4826
:101E40004265672C4E3A566172696F00593A4C6987
:101E50006D482C4E3A566172696F00593A4C696D63
:101E6000482C4E3A566172696F00593A4C696D4878
:101E70002C4E3A566172696F00536368616C7465E9
:101E80007220662E20482E007573652053772E2011
:101E9000662E5365747000537769746820486175C5
:101EA000746575722000536368616B2E20486F6FF4
:101EB0006774652000616B7573742E2056617269BA
:101EC0006F20200061636F757374696320566172BF
:101ED000696F00566172696F2041636F7573746931
:101EE0006300416B6F6573742E20566172696F20B9
:101EF00000536F6C6C68F66865202020202020005D
:101F0000536574706F696E74202020202020004873
:101F1000617574657572204D6178202020004765D9
:101F200077656E73746520686F6F6774004D696EB6
:101F30002E20476173202020202020006D696E2E06
:101F4000207468726F74746C65200047617A204D4C
:101F5000696E20202020202020004D696E696D616F
:101F6000616C2067617320200048F668652050206E
:101F70002020202020202000416C74697475646545
:101F800020502020202000416C7469747564652005
:101F9000502020202000486F6F677465205020205B
:101FA00020202020004C756674647275636B204499
:101FB000202020004261726F6D6574726963204455
:101FC0002020005072657373696F6E2044202020BA
:101FD00020004261726F6D6574722E2044202020B3
:101FE000005A2D4143432020202020202020200083
:101FF000414343205A20202020202020202000413F
:102000004343205A2020202020202020200041432C
:1020100043205A202020202020202020004D6178BD
:102020002E2048F668652020202020004D61782E63
:1020300020416C74697475646520004D61782E20B0
:10204000486967682020202020004D61782E206894
:102050006F6F677465202020005665727374E47298
:102060006B756E672F5220006761696E2F72617405
:10207000652020202020004761696E2F467265711F
:1020800075656E63650056657273742E2F72617488
:10209000652020200053636877656265676173205F
:1020A0002B2F2D00686F6F766572207661726961E3
:1020B0002E200056617220566F6C2053746174207C
:1020C0002000686F6F7665722076617269612E20DC
:1020D00000475053205A202020202020202020007C
:1020E000475053205A202020202020202020004725
:1020F0005053205A2020202020202020200047500C
:1021000053205A20202020202020202000537469B2
:10211000636B204E657574722E2050007374696372
:102120006B206E657574722E205000506F73204EB8
:102130006575747265204D616E00737469636B2000
:102140006E657574722E2050004E69636B20532E9D
:1021500020416E73742E20006E69636B207365726C
:1021600076206374726C00417373657276205461DB
:102170006E67616765006E69636B207365727620B8
:102180006374726C004E69636B204B6F6D70656E8B
:10219000732E20006E69636B20636F6D70656E73C4
:1021A0002E2000436F6D702054616E67616765205B
:1021B00020006E69636B20636F6D70656E732E20F7
:1021C000004E69636B20556D6B656872656E20000B
:1021D0006E69636B20696E762E206469722E0049E9
:1021E0006E76657273657220526F756C20006E6931
:1021F000636B20696E762E726963682E004E696388
:102200006B20536572766F206D696E006E69636B2B
:1022100020736572766F206D696E00536572766FFC
:10222000204D696E2020202020006E69636B207392
:102230006572766F206D696E004E69636B20536521
:1022400072766F206D6178006E69636B20736572C2
:10225000766F206D617800536572766F204D6178DE
:102260002020202020006E69636B20736572766FDA
:10227000206D6178004E69636B205365727620464D
:10228000696C74004E69636B2053657276204669F1
:102290006C74004E69636B20536572762046696CDE
:1022A00074004E69636B20536572762046696C74C6
:1022B00000526F6C6C20532E20416E73742E2000E0
:1022C000726F6C6C2073657276206374726C00415F
:1022D000737365727620526F756C69732000726F2C
:1022E0006C6C2073657276206374726C00526F6C34
:1022F0006C204B6F6D70656E732E2000726F6C6C6E
:1023000020636F6D70656E732E2000436F6D7020BB
:1023100054616E67616765202000726F6C6C20638A
:102320006F6D70656E732E2000526F6C6C20556D52
:102330006B656872656E2000726F6C6C20696E76DA
:102340002E206469722E00496E7665727365722064
:1023500054616E672000726F6C6C206F6D6B6572DC
:10236000656E202000526F6C6C20536572766F2072
:102370006D696E00726F6C6C20736572766F206D84
:10238000696E00536572766F204D696E20202020A3
:102390002000726F6C6C20736572766F206D696EB1
:1023A00000526F6C6C20536572766F206D617800FF
:1023B000726F6C6C20736572766F206D617800535C
:1023C0006572766F204D6178202020202000726F8A
:1023D0006C6C20736572766F206D617800526F6C43
:1023E0006C20536572762046696C7400526F6C6C79
:1023F00020536572762046696C7400526F6C6C20B5
:10240000536572762046696C7400526F6C6C205371
:102410006572762046696C7400416E73742E204795
:1024200065736368772E2000736572766F2072651E
:102430006672657368200054617578205265667213
:10244000657368202000536572766F20726566722E
:1024500065736820004D616E75656C6C652047651D
:10246000736368006D616E75656C6C205370656593
:1024700064200056697465737365204D616E2E206B
:102480002000536E656C682E68616E646265642E10
:102490000043616D205269636874756E6720200087
:1024A00043616D204F7269656E74202020200043C7
:1024B000616D204F7269656E742020202000436199
:1024C0006D6572612072696368742E2000536572B5
:1024D000766F203320202020202020005365727644
:1024E0006F20332020202020202000536572766F3B
:1024F00020332020202020202000536572766F207A
:10250000332020202020202000536572766F203455
:102510002020202020202000536572766F20342058
:1025200020202020202000536572766F2034202048
:10253000202020202000536572766F203420202038
:102540002020202000536572766F20352020202027
:1025500020202000536572766F2035202020202017
:10256000202000536572766F203520202020202007
:102570002000536572766F203520202020202020F7
:102580000047505320202020202020202020200001
:10259000656E61626C652047505320202020004109
:1025A0006374697665722047505320202000656E61
:1025B00061626C6520475053202020200047505313
:1025C000204D6F6475732053742E200047505320A4
:1025D0006D6F646520636F6E747200446566204D94
:1025E0006F646520475053202000475053206D6F83
:1025F000646520636F6E7472004750532056657295
:102600007374E4726B2E2000475053204761696E4B
:10261000202020202020004761696E204750532051
:102620002020202020004750532076657273746567
:10263000726B2E20004750532053742E2053636832
:10264000772E200047505320737469636B207468A1
:10265000726500536575696C204D616E6368652015
:1026600020004750532073742E206472656D702EC5
:10267000004D696E2E205361742E202020202000F2
:102680004D696E2E205361742E2020202020004E94
:10269000627265204D696E2E205361742E004D6963
:1026A0006E2E205361742E2020202020004750538E
:1026B0002D50202020202020202020004750532D66
:1026C00050202020202020202020004750532D5033
:1026D000202020202020202020004750532D502053
:1026E0002020202020202020004750532D4920204A
:1026F00020202020202020004750532D492020203A
:10270000202020202020004750532D492020202029
:102710002020202020004750532D49202020202019
:1027200020202020004750532D442020202020200E
:10273000202020004750532D4420202020202020FE
:102740002020004750532D442020202020202020EE
:1027500020004750532D44202020202020202020DE
:102760000050204C696D697420202020202020001A
:102770004C696D6974202050202020202020004CBE
:10278000696D6974652050202020202020004C694C
:102790006D69657420205020202020200049204CA5
:1027A000696D697420202020202020004C696D690B
:1027B00074202049202020202020004C696D69745D
:1027C000652049202020202020004C696D69657417
:1027D00020204920202020200044204C696D69746D
:1027E00020202020202020004C696D697420204486
:1027F000202020202020004C696D69746520442031
:102800002020202020004C696D6965742020442020
:1028100020202020004750532041636320202020A7
:102820002020200047505320416363202020202097
:10283000202000416363656C2047505320202020F6
:102840002000475053204163632020202020202077
:10285000004750532057696E646B6F72722E2000D0
:102860004750532057696E6420436F72722E0043A5
:102870006F72726563742056656E74202000475035
:10288000532057696E6420436F72722E0042726546
:102890006D737769726B756E672020005370656584
:1028A0006420636F6D70656E732E00436F6D70658D
:1028B0006E73205669742020200052656D77657212
:1028C0006B696E672020202000475053206D61788F
:1028D0002E205261642E2000475053206D61782EC7
:1028E000726164697573005261796F6E204750534D
:1028F000204D61782000475053206D61782E726121
:1029000064697573004750532057696E6B656C207E
:102910004C692E0047505320616E676C2E6C696DB8
:102920006974004C696D697420416E676C20475072
:10293000530047505320686F656B206C696D2E20E3
:10294000005048204C6F67696E2074696D652000E7
:102950005048206C6F67696E2074696D6520005463
:102960007073204D656D6F72697320202000504890
:10297000206C6F67696E2074696A64200044796E08
:10298000616D6963205048202020200044796E61E9
:102990006D6963205048202020200044796E616DCD
:1029A0006963205048202020200044796E616D69C1
:1029B000736368652050482000475053206D2E20D7
:1029C0005261642064504800475053206D2E2052BD
:1029D00061642064504800475053206D2E2052619E
:1029E000642064504800475053206D2E205261648B
:1029F000206450480043482048F668652020202085
:102A000020202000434820416C746974756465205F
:102A1000202000434820416C74697475646520204F
:102A20002000434820486F6F6774652020202020D5
:102A3000004C454431204269746D61736B65200020
:102A40004F757431204269746D61736B20200042B0
:102A500069746D61736B205331202020200055690B
:102A600074673120426974706174722E00202020D6
:102A7000202054696D696E67202020004F757431E5
:102A80002054696D696E6720202000486F726C6F5A
:102A9000676520533120202020005569746731205C
:102AA00054696D696E672020002020202020736FFC
:102AB000666F727420616E00416374697620202015
:102AC00020202020202000416374696620202020DF
:102AD0002020202020004469726563742061616EAB
:102AE000202020200020202020206E2E6D2E4D6FD3
:102AF000746F72004163742E2077692E204D6F74BD
:102B00006F72004163746966204175205265706F71
:102B10007300416B742E206D6F746F722075697431
:102B2000004C454432204269746D61736B6520002E
:102B30004F757432204269746D61736B20200042BE
:102B400069746D61736B2053322020202000556919
:102B500074673220426974706174722E00202020E4
:102B6000202054696D696E67202020004F757432F3
:102B70002054696D696E6720202000486F726C6F69
:102B80006765205332202020200055697467322069
:102B900054696D696E672020002020202020736F0B
:102BA000666F727420616E00416374697620202024
:102BB00020202020202000416374696620202020EE
:102BC0002020202020004469726563742061616EBA
:102BD000202020200020202020206E2E6D2E4D6FE2
:102BE000746F72004163742E2077692E204D6F74CC
:102BF0006F72004163746966204175205265706F81
:102C00007300416B742E206D6F746F722075697440
:102C1000004F75743120566D696E2E5761726E00CB
:102C20004F75743120756E646572766F6C740041F7
:102C30006C20556E646572766F6C746167005569BF
:102C4000746731206F6E64657273702E004F7574F7
:102C50003220566D696E2E5761726E004F75743258
:102C600020756E646572766F6C7400416C20556ED1
:102C7000646572766F6C74616700556974673220A1
:102C80006F6E64657273702E004D696E2E20476101
:102C900073202020202020006D696E2E2074687221
:102CA0006F74746C65200047617A204D696E2E2028
:102CB0002020202020006D696E696D61616C2067A5
:102CC00061732020004D61782E2047617320202001
:102CD000202020006D61782E207468726F74746CEF
:102CE00065200047617A204D61782E202020202029
:102CF00020006D6178696D61616C206761732020CF
:102D0000004B6F6D706173737769726B756E6700DE
:102D1000636F6D70617373206566666563740045EB
:102D20006666657420636F6D7061732020004B6F61
:102D30006D7061732065666665637420004361721F
:102D400065667265652053742E20200043617265AC
:102D500066726565204374726C200043617265661B
:102D6000726565204374726C2000436172656672FF
:102D70006565204374726C2000546561636861620C
:102D80006C65204361726500546561636861626CC3
:102D900065204361726500546561636861626C65BA
:102DA000204361726500546561636861626C6520EF
:102DB0004361726500556E7465727370616E6E75F5
:102DC0006E672000756E646572766F6C74616765FE
:102DD000202000536F75732054656E73696F6E20E9
:102DE00020004F6E6465727370616E6E696E67204D
:102DF00000566F6C74205265666572656E7A2000AD
:102E0000566F6C74205265666572656E7A20005448
:102E1000656E73696F6E20526566202020005265D2
:102E2000662E207370616E6E696E6720004E6F743F
:102E300020476173205A656974202000456D6572D2
:102E4000672E5468722E54696D650044757265650D
:102E5000207365636F75727320004E6F6F64206717
:102E600061732074696A6420004E6F742047617337
:102E70002020202020202000456D6572672E546898
:102E8000726F74746C650047617A206465207365A5
:102E9000636F757273004E6F6F64206761732020DB
:102EA00020202020004661696C732E204348205466
:102EB000696D65004661696C732E20434820546932
:102EC0006D65004661696C732E2043482054696D1E
:102ED00065004661696C732E2043482054696A641A
:102EE000004661696C732E204368616E6E656C00EC
:102EF0004661696C732E204368616E6E656C004696
:102F000061696C732E204368616E6E656C0046616A
:102F1000696C732E204368616E6E656C006B2E5376
:102F2000756D6D6572206F2053656E006E20626551
:102F300065702061637420545820006E20626565BE
:102F4000702061637420545820006E2062656570A3
:102F5000206163742054582000566172696F2066A6
:102F600061696C20416C7400566172696F20666102
:102F7000696C20416C7400566172696F20666169EA
:102F80006C20416C7400566172696F206661696CD7
:102F900020416C7400436F6D7061737320457272D1
:102FA0006F722000436F6D70617373204572726F92
:102FB000722000436F6D70617373204572726F727F
:102FC00020004B6F6D706173204572726F7220200C
:102FD000006B2E5374617274206F2E53442D4B007E
:102FE0006E2073742E207774686F20534420006E17
:102FF0002073742E207774686F20534420006E2055
:1030000073742E207774686F2053442000477972C0
:103010006F20502020202020202020004779726F30
:1030200020502020202020202020004779726F206F
:10303000502020202020202020004779726F20502F
:103040002020202020202020004779726F20492056
:1030500020202020202020004779726F2049202046
:10306000202020202020004779726F204920202036
:103070002020202020004779726F20492020202026
:1030800020202020004779726F204420202020201B
:10309000202020004779726F20442020202020200B
:1030A0002020004779726F204420202020202020FB
:1030B00020004779726F20442020202020202020EB
:1030C0000047696572205020202020202020200009
:1030D0004C61636574205020202020202020004C6B
:1030E0006163657420502020202020202000476943
:1030F0006572205020202020202020200047696574
:103100007220492020202020202020004C6163656F
:1031100074204920202020202020004C6163657409
:103120002049202020202020200047696572204966
:1031300020202020202020200044796E616D6973BA
:103140006368652053742E0064796E616D69632035
:1031500073746162692E00537461622044796E61F8
:103160006D697175650044796E616D69732E2073A8
:103170007461622E0044726568726174656E626586
:10318000672E2000526F7452617465206C696D69FE
:10319000742E004C696D69742044697420526F74F8
:1031A0006100546F6572656E74616C206C696D2E80
:1031B000004143432F4779726F2046616B2E2000F8
:1031C0004143432F4779726F204661637420004169
:1031D00043432F4779726F20466163742000414357
:1031E000432F4779726F2046616374200041434347
:1031F0002F4779726F204B6F6D702E00436F6D708B
:10320000204143432F4779726F2000436F6D702038
:103210004143432F4779726F2000436F6D70204107
:1032200043432F4779726F2000486175707472654F
:10323000676C6572204920004D61696E204920202D
:1032400020202020202000526567756C2050726974
:103250006E6320492000486F6F6664726567656C15
:103260002E20492000447269666B6F6D70656E7325
:1032700061742E00647269667420436F6D70656EB0
:10328000732E00436F6D70656E73204465726976AE
:103290002000447269667420636F6D70656E732ED2
:1032A000004779726F20737461622E202020200005
:1032B0004779726F2073746162696C697479004731
:1032C00079726F2053746162696C6974790047790F
:1032D000726F2073746162696C69742E004D6F7433
:1032E0006F7220736D6F6F74682020004D6F746F64
:1032F0007220736D6F6F74682020004D6F746F7251
:1033000020536D6F6F74682020004D6F746F7220B2
:10331000736D6F6F7468202000506172616D657409
:103320006572203120202000506172616D657465E6
:1033300072203120202000506172616D65746572C9
:10334000203120202000506172616D65746572200B
:103350003120202000506172616D657465722032E9
:1033600020202000506172616D65746572203220EA
:10337000202000506172616D6574657220322020DA
:103380002000506172616D657465722032202020CA
:1033900000506172616D65746572203320202000D9
:1033A000506172616D657465722033202020005079
:1033B0006172616D65746572203320202000506158
:1033C00072616D6574657220332020200050617237
:1033D000616D657465722034202020005061726137
:1033E0006D65746572203420202000506172616D1B
:1033F00065746572203420202000506172616D6513
:10340000746572203420202000506172616D6574F3
:103410006572203520202000506172616D657465F1
:1034200072203520202000506172616D65746572D4
:10343000203520202000506172616D657465722016
:103440003520202000506172616D657465722036F0
:1034500020202000506172616D65746572203620F5
:10346000202000506172616D6574657220362020E5
:103470002000506172616D657465722036202020D5
:1034800000506172616D65746572203720202000E4
:10349000506172616D657465722037202020005084
:1034A0006172616D65746572203720202000506163
:1034B00072616D6574657220372020200050617242
:1034C000616D657465722038202020005061726142
:1034D0006D65746572203820202000506172616D26
:1034E00065746572203820202000506172616D651E
:1034F0007465722038202020004163687328652E8F
:10350000296B6F70706C2E0028446529436F7570AD
:103510006C20417865730028446529436F75706C91
:103520002041786573004173206B6F7070656C6922
:103530006E672020004769657220706F732E204BE4
:103540006F707000526574726F6163206C616365A7
:10355000742000526574726F6163204C61636574FE
:1035600020004769657220706F732E206B6F702E7C
:10357000004E69636B2F526F6C6C204B6F70700044
:10358000526574726F20726F756C2F74616E005289
:103590006574726F20526F756C2F54616E004E69A6
:1035A000636B2F526F6C6C206B6F702E00476965D8
:1035B00072204B6F7272656B74757200436F72721A
:1035C000656374206C616365742000436F7272657B
:1035D0006374204C616365742000476965722063E1
:1035E0006F72726563746965004F7269656E7469A4
:1035F0006572756E672020004F7269656E7469652B
:1036000072756E672020004F7269656E746174690F
:103610006F6E20202000000000000000000000006D
:10362000000000000048F668656E726567656C759D
:103630006E672000416C7469747564652043747210
:103640006C20004374726C20416C746974756465FD
:103650002000486F6F67746520436F6E74722E2070
:1036600000536F6C6C68F6686520202020202000D5
:10367000536574706F696E742020202020200048EC
:10368000617574657572204D617820202000476552
:1036900077656E73742E686F6F6774650053746915
:1036A000636B204E657574722E20500073746963CD
:1036B0006B206E657574722E205000506F73204E13
:1036C0006575747265204D616E00537469636B207B
:1036D0006E657574722E20500047505320202020B4
:1036E0002020202020202000656E61626C6520472C
:1036F0005053202020200041637469766572204772
:10370000505320202000456E61626C652047505365
:103710002020202000475053204D6F6475732053A4
:10372000742E2000475053206D6F646520636F6EC8
:10373000747200446566206D6F64652047505320A5
:103740002000475053206D6F646520636F6E747264
:103750000044796E616D696320504820202020006C
:1037600044796E616D696320504820202020004418
:10377000796E616D696320504820202020004479D3
:103780006E616D696320504820202020004348204E
:1037900048F668652020202020202000434820484B
:1037A00069676820202020202020004348204869A5
:1037B00067682020202020202000434820686F6F69
:1037C0006774652020202020004361726566726561
:1037D000652053742E202000436172656672656512
:1037E000204374726C2000436172656672656520C7
:1037F0004374726C20004361726566726565204394
:1038000074726C2000546561636861626C6520436A
:1038100061726500546561636861626C6520436133
:10382000726500546561636861626C652043617212
:103830006500546561636861626C6520436172650F
:10384000004D6F746F7220536963682E5363680074
:103850004D6F742E5361666574792053772E004D39
:103860006F742E5361666574792053772E004D6F07
:10387000742E7361662E736368616B2E004F7269DC
:10388000656E74696572756E672020004F72696598
:103890006E746174696F6E202020004F7269656ECE
:1038A00074696572756E672020004F7269656E7469
:1038B0006174696520202020000000010C030101D3
:1038C000010000010C040404040000010C010303C6
:1038D000030000010C0202020200030119050505A4
:1038E000050003011906060606000301190707076C
:1038F000070003011908080808000301190909094C
:1039000009000301190A0A0A0A000301190B0B0B2B
:103910000B000301190C0C0C0C0000000C630000E0
:1039200000000200046D00000000060006270101EF
:1039300001010200010D000000010200200D010143
:1039400001010200080D010101010200100D00003B
:1039500000010200046D000000010200400D0101A1
:1039600001010200800D000000010200040D0000B2
:103970000002000014170A080602000014181010B4
:103980000A020100FF19060604020100FF600000A0
:1039900000030200016B000000030200026B000044
:1039A00000030200046B000000030200086B00002B
:1039B00000030100FF3B323232030000F73C5A5A49
:1039C0005A030000F73D323232030000F7414E4EF9
:1039D0004E030000F7424E4E4E040200010D00005F
:1039E00000040200016D000000040200020D01014C
:1039F00001040200026D010101040100FF10FFFF3C
:103A0000FF040000F70E1E1E1E040100FF110F0F21
:103A10000F040100FF0F1E1E1E040100FF13000013
:103A200000040100FF67969696040000F7120F0F3E
:103A30000F040000F714080808040100FF154040B7
:103A400040040000A016000000050100FF2D80804A
:103A500080050000F72E323232050200016C0000B2
:103A600000050000F72F0F0F0F050000F730E6E606
:103A7000E60500001969000000050100FF318080A3
:103A800080050000F732555555050200026C000014
:103A900000050000F733464646050000F734DCDC3D
:103AA000DC050000196A0000000500020835040466
:103AB00004050000F7363C3C3C050500F7370000E4
:103AC00000050100FF387D7D7D050100FF397D7D0A
:103AD0007D050100FF3A7D7D7D060200200D01017C
:103AE00001060100FF50FEFEFE060100FF51646466
:103AF00064060000F75A080808060000F759060691
:103B000006060100FF525A5A5A060100FF535A5A3C
:103B10005A060100FF545A5A5A060100FF554B4BF2
:103B20004B060100FF56555555060100FF574B4BFC
:103B30004B060100FF58000000060100FF5B5A5AC7
:103B40005A060100FF5C2A2A2A060100FF5DF5F5EE
:103B5000F5060100FF5E8C8C8C060000F75F050502
:103B600005060200206D000000060200026E000043
:103B700000060000F765000000070400FF4A5F5FD1
:103B80005F070100FF4B141414070200206B0000B4
:103B900000070200106B010101070400FF4CF3F362
:103BA000F3070100FF4D141414070200406B0000DE
:103BB00000070200806B010101070400FF4EAAAA62
:103BC000AA070400FF4FAAAAAA080000F71A0808CB
:103BD00008080000F71BE6E6E6080100FF1D40406C
:103BE00040080100FF62000000080200406D000074
:103BF00000080000F724212121080200086D0000C0
:103C000000080000F7265A5A5A080000F7252D2D03
:103C10002D080000F7660000000800000C68000096
:103C200000080200106D000000080200046E000091
:103C300000080200806D000000080200016E000014
:103C400000090100FF1E5A6464090100FF1F787813
:103C500078090100FF200A0A0A090100FF215A64BD
:103C600064090100FF22787878090100FF45464683
:103C700046090200800D000000090000F71C1B1B14
:103C80001B090000F743202020090100FF28101025
:103C900010090000F7440000000900001023060688
:103CA00006090000F7640000000A0100FF29000077
:103CB000000A0100FF2A0000000A0100FF2B00009B
:103CC000000A0100FF2C0000000A0100FF4600006E
:103CD000000A0100FF470000000A0100FF48000041
:103CE000000A0100FF490000000B0200400D000027
:103CF000000B0100FF3E5A5A5A0B0100FF3F3737B5
:103D0000370B0100FF404646460C050017610000D6
:103D1000000D0200010D0000000D0100FF10FFFF6B
:103D2000FF0D0000A0160000000D0200200D010193
:103D3000010D0100FF50FEFEFE0D0200206D00008F
:103D4000000D0000F7650000000D0100FF6200009B
:103D5000000D0200406D0000000D00000C6300002B
:103D6000000D0500176100000050504D202020205C
:103D7000202020202020202020005370656B7472AA
:103D8000756D2020202020202020005370656B744A
:103D900072756D2048695265732020005370656B01
:103DA0007472756D204C6F5265732020004A6574E3
:103DB0006920202020202020202020202000414396
:103DC000542044534C202020202020202020004834
:103DD0004F5454202020202020202020202020006C
:103DE000467574756261205342555320202020206F
:103DF0000013001200130053425500486F54004155
:103E00004354004A65740053704C0053704800538B
:103E100070650050504D0057504500530020204E13
:103E20000020204A00205000120013001200200041
:103E300012003000310020192020202030114920AC
:103E40002020456E64652020204F4B0057504500D0
:103E500053005374642E0028312D5331322F5729CB
:103E60002028643A20202029001D00200020001D69
:103E7000002A002A00506F00506F202900537464FC
:103E80002E0028302D3234372D50382928643A50EE
:103E90006F2029005374642E00282020202D20201C
:103EA00020292028643A20202029004B6F70696562
:103EB000727420756E6420416B74697669657274E2
:103EC000005769726B6C696368204B6F706965722B
:103ED000656E3F00194F18006D5300250020536593
:103EE00072766F2054657374657220202020202024
:103EF00020200056657262696E64756E67207A755F
:103F00006D204D4B00636F6E6E656374696F6E203C
:103F1000746F204D4B200020636F6E6E6578696F63
:103F20006E2061204D4B20000041616E736C7569FD
:103F300074696E67206F70204D4B004D4B204C6FA5
:103F400077426174205761726E756E67004D4B2029
:103F50004C6F77426174207761726E696E67004DB5
:103F60004B204C6F7742617420417474656E74000D
:103F7000004D4B204C6F42617420616C61726D206A
:103F8000202000416E7A656967652020202020206E
:103F90002020201D00446973706C6179202020204E
:103FA00020202020201D0064276166666963686107
:103FB000676520202020201D00446973706C6179A2
:103FC0002020202020202020201D0057692E323361
:103FD00032202020202020202020201D0057692E64
:103FE000323332202020202020202020201D005786
:103FF000692E323332202020202020202020201D36
:104000000057692E3233322020202020202020200B
:10401000201D0042544D2D323232202020202020FD
:104020002020201D0042544D2D32323220202020ED
:1040300020202020201D0042544D2D3232322020DD
:10404000202020202020201D0042544D2D323232CD
:104050002020202020202020201D00504B542D41C6
:104060006B6B7520202020202020201D00504B54F9
:104070002D4163637520202020202020201D00502A
:104080004B542D4163637520202020202020201DCB
:1040900000504B542D4163637520202020202020A8
:1040A000201D00504B542055706461746520202001
:1040B0002020202000504B542055706461746520EE
:1040C00020202020202000504B54204D6973652073
:1040D00061206A6F7572202000504B542055706427
:1040E00061746520202020202020004465627567CF
:1040F00020504B54202020202020202000446562A6
:10410000756720504B542020202020202020004480
:104110006562756720504B542020202020202020ED
:1041200000446562756720504B54202020202020D9
:10413000202000454550726F6D20526573657420D4
:104140002020202000454550726F6D205265736518
:1041500074202020202000454550726F6D2052654C
:10416000696E697469616C6900454550726F6D20B4
:104170005265736574202020202000496E666F739D
:10418000206265696D2053746172742000696E66E7
:104190006F206174207374617274757020200049FF
:1041A0006E666F722E20737572206C616E6365721D
:1041B00000696E666F2062696A206F707374617245
:1041C0007420004F534420456D7066616E677361C3
:1041D0007573662E004F534420726563656976657A
:1041E000204572726F72004F534420726563656997
:1041F0007665204572726F72004F5344207265637A
:1042000065697665204572726F72005370726163E2
:10421000686520202020202020202020006C616E56
:104220006775616765202020202020202020004C19
:10423000616E67756520202020202020202020200E
:10424000007461616C20202020202020202020206C
:104250002020004C6963687420617573206E61636F
:10426000682E2E2E006C69676874206F6666206168
:10427000667465722020004C756D696572652061F9
:104280007520626F75742020006C696368742075F6
:104290006974206E6120202020200048656C6C69C4
:1042A000676B6569742020202020202000627269DD
:1042B0006768746E65737320202020202020006CB6
:1042C000756D696E6F736974652020202020202031
:1042D0000068656C64657268656964202020202030
:1042E0002020004B6F6E7472617374202020202098
:1042F0002020202000636F6E747261737420202070
:1043000020202020202000636F6E7472617374651A
:10431000202020202020202000636F6E74726173A3
:1043200074202020202020202020004E6F726D61FC
:104330006C2F496E7665727320202020006E6F729C
:104340006D616C2F696E7665727465642020004E15
:104350006F726D616C202F20696E766572736520B7
:10436000004E6F726D616C2F696E76657274656454
:104370002020004F7269656E74696572756E6720E2
:1043800020202020006F7269656E746174696F6E01
:10439000202020202020006F7269656E746174698E
:1043A0006F6E202020202020006F7269656E74617E
:1043B00074696520202020202020004D6F64756CDA
:1043C0002065696E6765626175743F20006D6F647A
:1043D000756C65206275696C7420696E3F20004DB4
:1043E0006F64756C6520696E7374616C6CE9202074
:1043F000004D6F64756C65206765696E7374616CE0
:104400002E3F0054582F5258204B616E616C202073
:10441000202020200054582F5258204368616E6E8F
:10442000656C202020200054582F5258204368618A
:104430006E6E656C202020200054582F5258204367
:1044400068616E6E656C20202020004E6574572ECA
:10445000204772757070652020202020004E657402
:10446000572E2047726F7570202020202020004E8C
:104470006574572E2047726F7570202020202020F1
:10448000004E6574572E2047726F757020202020D3
:104490002020004E6574572E204D6F64652020202B
:1044A00020202020004E6574572E204D6F6465201B
:1044B000202020202020004E6574572E204D6F6450
:1044C0006520202020202020004E6574572E204D8E
:1044D0006F6465202020202020200054582054693B
:1044E0006D656F75742020202020202000545820F6
:1044F00054696D656F7574202020202020200054A1
:10450000582054696D656F7574202020202020206C
:104510000054582054696D656F7574202020202048
:104520002020005458204D545520202020202020A9
:1045300020202020005458204D5455202020202099
:10454000202020202020005458204D545520202089
:104550002020202020202020005458204D54552079
:104560002020202020202020202000496E6974690E
:10457000616C6973696572656E20202000696E69DF
:104580007469616C697A65202020202020200069F0
:104590006E697469616C6973657220202020202027
:1045A00000496E697469616C697A65202020202059
:1045B0002020004B6F6E6669672E206D6974205055
:1045C0004320202000636F6E6669672E2077697430
:1045D00068202050432000436F6E6669672E20617B
:1045E000766563205043202000436F6E6669672E16
:1045F000206D6574205043202020004D6F64756C41
:104600002065696E6765626175743F20006D6F6437
:10461000756C65206275696C7420696E3F20004D71
:104620006F64756C6520696E7374616C6CE9202031
:10463000006D6F64756C65206765EF6E7374616CF7
:104640006C3F004E616D652020202020202020201E
:1046500020202020006E616D652020202020202059
:10466000202020202020004E6F6D202020202020A0
:104670002020202020202020004E61616D2020205D
:10468000202020202020202020200050696E202083
:104690002020202020202020202020200070696E53
:1046A00020202020202020202020202020200050FA
:1046B000696E202020202020202020202020202063
:1046C0000050696E20202020202020202020202043
:1046D000202000496E697469616C6973696572654F
:1046E0006E20202000696E697469616C697A6520AA
:1046F00020202020202000696E697469616C697334
:10470000657220202020202000496E697469616C48
:10471000697A6520202020202020004B6F6E66697A
:10472000672E206D697420504320202000636F6E37
:104730006669672E20776974682020504320004303
:104740006F6E6669672E2061766563205043202076
:1047500000436F6E6669672E206D6574205043209C
:10476000202000504B542D416B6B757479702020C4
:104770002020202000504B542D41636375747970C4
:1047800020202020202000504B542D54797065208B
:10479000646520626174742E00504B542D62617404
:1047A000746572696A207479706500504B542041B9
:1047B0006B6B75204D657373756E672000504B549D
:1047C00020416363754D65617375726520200062D9
:1047D0006174742E206465206D6573757265202088
:1047E00000504B5420626174742E206D6574696EA4
:1047F00067200013001200566F6C74004C69496FFB
:10480000004C69506F004C69506F004C69496F0053
:10481000425420496E6974204572726F720042548E
:1048200020496E6974206F6B0020426C7565746F4F
:104830006F74682050696E202020202020200020E6
:10484000426C7565746F6F7468204E616D652020D1
:1048500020202020001300120020172020202020DC
:1048600016202020202019202020204F4B0020201F
:104870002020202020202020202020430020001362
:104880000012002057692E32333220536574757040
:1048900020202020202020200013001200130012CE
:1048A0000020504B542D536574757020202020201B
:1048B0002020202020200025005769323332005765
:1048C00069323332002020206E69636874206DF6EF
:1048D000676C696368202020200020204D697420C7
:1048E000486172647761726520312E782020200043
:1048F00020204C49504F202021215761726E756E47
:104900006721212020004D6F746F722054657374ED
:1049100065722020202020004D6F746F7220546536
:10492000737465722020202020004D6F746F7220F8
:104930005465737465722020202020004D6F746FC1
:104940007220546573746572202020202000536506
:1049500072766F20546573746572202020202000C9
:10496000536572766F205465737465722020202021
:104970002000536572766F20546573746572202031
:1049800020202000536572766F2054657374657221
:10499000202020202000504320425420203E204B45
:1049A0006F70746572202000504320425420203ED6
:1049B000204B6F70746572202000504320425420B9
:1049C000203E204B6F7074657220200050432042BF
:1049D0005420203E204B6F7074657220200050439D
:1049E00020555342203E204B6F707465722020008A
:1049F000504320555342203E204B6F707465722007
:104A00002000504320555342203E204B6F70746568
:104A100072202000504320555342203E204B6F709F
:104A2000746572202000504B5420536574757020BB
:104A30002020202020201D00504B542053657475E9
:104A400070202020202020201D00504B5420536532
:104A5000747570202020202020201D00504B5420F1
:104A60005365747570202020202020201D00504B9D
:104A7000542056657273696F6E202020202020001C
:104A8000504B542056657273696F6E202020202091
:104A90002000504B542056657273696F6E202020A1
:104AA00020202000504B542056657273696F6E2091
:104AB000202020202000566F6C7400456E64650035
:104AC0001D00200020001D00504320555342203E71
:104AD000204B6F7074657200504320425420203E7A
:104AE000204B6F70746572001300120020504B54FD
:104AF0002D546F6F6C732020202020202020202038
:104B0000200014BE88E10FB6F894809360001092E4
:104B100060000FBE11241FBECFEFD0E4DEBFCDBFBB
:104B200013E2A0E0B1E0ECECFAE201E00BBF02C05E
:104B300007900D92A230B107D9F710E3A2E0B3E2DB
:104B400001C01D92A23BB107E1F70E94644E0C9494
:104B500064950C940000E0EBF0E080818368808332
:104B6000E1EBF0E080818160808308951092B000D5
:104B70001092B100089582B1806F82B90C988FEFC6
:104B800084B988B1806988B987B18C6E87B93C983F
:104B900043985E9A8AB1806F8AB9299A0E940084EC
:104BA0000E94BB830E94D68381E08093312F84E1F1
:104BB00090E00E94288E84E190E00E94618C81E068
:104BC0000E945388789480E00E94CE400E94513B1E
:104BD0008091FC28853070F081E08093FC288091E2
:104BE000FC2860E043E02EE50E949A748093FC2844
:104BF0000E94BC396091CE2870E0882777FD8095AF
:104C0000982F0E942F9223E333E343E250E40E9463
:104C10001C930E9401926093B30081E00E94CE40F9
:104C200088EC90E09093B6238093B52380E890E0E1
:104C30009093FB228093FA220E94024D85E090E03F
:104C40000E94F055AC0180E062E020E00E949D44AB
:104C500086E090E00E94F055AC0180E063E020E047
:104C60000E949D4480E49FE124EF31E0F9013197F7
:104C7000F1F70197D9F70799299828EE33E044EF27
:104C800051E0CA010197F1F721503040D1F784EF8C
:104C900091E09093B6238093B52380E890E09093C1
:104CA000FB228093FA2280EF0E943B840E948C407A
:104CB0008091F828813031F48091FB28882311F409
:104CC0000E945F290E948C40439A8091F528813090
:104CD00039F48091FA28882319F40E94AF2F439A5F
:104CE0000E948C408091F828813051F58091672492
:104CF000882331F585E00E94CA308091CF28813029
:104D000009F042C087E090E00E94F055AC0180E0DD
:104D100060E020E00E949D4488E090E00E94F05511
:104D2000AC0180E061E020E00E949D4480E29EE4CE
:104D300024EF31E0F9013197F1F70197D9F724C059
:104D400086E00E94CA308091CF288130E9F487E064
:104D500090E00E94F055AC0180E060E020E00E940D
:104D60009D4489E090E00E94F055AC0180E061E054
:104D700020E00E949D4480E29EE424EF31E0F901AE
:104D80003197F1F70197D9F70E948C400895CF939E
:104D9000DF93EA01DC0120E092E03EEF10C08C914D
:104DA00087FF05C0FE01E90FF11D30839F5FFE0103
:104DB000E90FF11D8D918F7780839F5F2F5F2617FD
:104DC00070F3FE01E90FF11D10828FEF888392507E
:104DD00099839E5F892F90E0DF91CF9108950F9383
:104DE0001F93CF93DF93182F062F8FEF0E94698EAA
:104DF00082E00E94698E812F0E94698E802F0E941E
:104E0000698E10E0C4EFD1E00E94D08D90E028EED2
:104E100033E0FE013197F1F721503040D1F7009790
:104E200021F41F5F1A3081F705C0069719F420E0BE
:104E300030E01EC080E062E04AE551E020E00E94E0
:104E4000944488EE93E09093B6238093B52380E456
:104E500090E09093FB228093FA2280E29EE424EF7C
:104E600031E0F9013197F1F70197D9F72FEF30E0F1
:104E7000C901DF91CF911F910F91089584E190E0D6
:104E80000E94288E84E190E00E94618C0E948C40F8
:104E900080E060E044E051E020E00E94944480E043
:104EA00061E04FEE50E020E00E94944480E062E038
:104EB0004BED50E020E00E94944480E063E043ED3D
:104EC00050E020E00E94944481E167E04EEC50E025
:104ED00020E00E9494440E947B8C90FF07C00E94B7
:104EE000D08D882329F00E94988C02C00E94698E80
:104EF00080E10E943B84882371F30895809102230E
:104F0000823041F487E092E00E94288E87E092E0B0
:104F10000E94618C0E948C405E9880E060E044E4D6
:104F200051E020E00E94944480E061E04FE251E0D3
:104F300020E00E94944480E062E048E251E020E0FA
:104F40000E94944480E063E047E151E020E00E9449
:104F5000944481E167E042E151E020E00E94944402
:104F60000E947B8C90FF07C00E94D08D882329F07F
:104F70000E94988C02C00E94698E80E10E943B844E
:104F8000882371F35E9A08951F93CF93DF93182FB0
:104F90000E94D08D8FEF0E94698E82E00E94698E00
:104FA0008EEF0E94698E812F0E94698E84EF91E0BE
:104FB00024EF31E0F9013197F1F70197D9F710E0CB
:104FC000C4EFD1E00E94D08D482F50E028EE33E0AE
:104FD000FE013197F1F721503040D1F71F5F4115A5
:104FE000510519F41A3071F712C01A3081F04630A9
:104FF000510519F02FEF30E00CC060E00E94DB4655
:105000000E94D08D0E94D08D282F30E002C020E079
:1050100030E0C901DF91CF911F9108951F93182FA0
:1050200080E063E045E651E020E00E949444812F57
:1050300060E00E94DB461093032384EF91E090939D
:10504000B6238093B52380E490E09093FB22809375
:10505000FA2288E893E124EF31E0F9013197F1F782
:105060000197D9F71F910895CF93DF930E94198F6D
:105070005E9880ED97E024EF31E0F9013197F1F788
:105080000197D9F784E190E00E94288E80E060E0EB
:1050900043EC52E020E00E94944480E061E042EB67
:1050A00052E020E00E94944488E790E00E94C427E8
:1050B000EC0181E080930223209709F587E092E0DC
:1050C0000E94288E80E061E04FE952E020E00E94DB
:1050D000944488E790E00E94C427EC0182E080932A
:1050E0000223209761F40E948C4080E060E04EE84B
:1050F00052E020E00E94944410920223DCC0CF3F93
:10510000D105F9F40E948C4080E060E049E752E06C
:1051100020E00E94944488EE93E09093B62380931D
:10512000B52380E490E09093FB228093FA2280E202
:105130009EE424EF31E0F9013197F1F70197D9F7B7
:1051400003C0209709F4B7C00E948C4080910223CD
:10515000813039F480E060E046E652E020E00E94D1
:10516000944480910223823009F093C01092FB286E
:1051700080E060E044E552E020E00E94944483E057
:1051800064E00E94EF26892BE9F080E061E043E4CF
:1051900052E020E00E94944488EE93E09093B6237E
:1051A0008093B52380E490E09093FB228093FA22D1
:1051B00080E29EE424EF31E0F9013197F1F70197A5
:1051C000D9F720C080E197E224EF31E0F90131976F
:1051D000F1F70197D9F780E061E04FE252E020E07B
:1051E0000E94944480E062E04BE152E020E00E94A3
:1051F000944480E29EE424EF31E0F9013197F1F725
:105200000197D9F78EE464E00E94EF26892BE9F03C
:1052100080E063E048E052E020E00E94944488EEA1
:1052200093E09093B6238093B52380E490E090932D
:10523000FB228093FA2280E29EE424EF31E0F90120
:105240003197F1F70197D9F720C080E197E224EF79
:1052500031E0F9013197F1F70197D9F780E061E08A
:1052600043EF51E020E00E94944480E062E04EED84
:1052700051E020E00E94944480E29EE424EF31E07B
:10528000F9013197F1F70197D9F784E190E00E9495
:10529000288E80E061E045E10E94B74480E061E053
:1052A00045ED51E020E00E94944489E061E04C2FFC
:1052B00020E00E94B6465E9ADF91CF910895FF925A
:1052C0000F931F9385E00E94CA300E94342880917A
:1052D0000223882309F4B1C180E062E041EC51E08F
:1052E00020E00E9494445E9880ED97E024EF31E046
:1052F000F9013197F1F70197D9F70E94198F84E1ED
:1053000090E00E94288E81E56EE70E94EF26892BAF
:1053100011F410E008C080E064E04FEB51E020E0C1
:105320000E94944411E06091082980E00E94EF26D9
:10533000892B19F081E00E940E28F12EF394812F21
:1053400064E04DEB51E020E00E9494446091082914
:105350008BE40E94EF26892B19F082E00E940E2830
:105360000F2D0F5F8F2D64E04BEB51E020E00E948A
:1053700094446091082981E00E94EF26892B19F05E
:1053800083E00E940E28102F1F5F802F64E049EBFE
:1053900051E020E00E949444609108298CE40E942E
:1053A000EF26892B19F084E00E940E28012F0F5F51
:1053B000812F64E047EB51E020E00E9494448DE0AF
:1053C00060E00E94EF26892B19F085E00E940E28EC
:1053D000102F1F5F802F64E045EB51E020E00E941A
:1053E000944482E063E00E94EF26892B19F086E066
:1053F0000E940E28012F0F5F812F64E043EB51E0E4
:1054000020E00E9494446091F32885E00E94EF26FA
:10541000892B19F087E00E940E28102F1F5F802F24
:1054200064E041EB51E020E00E9494446091F32855
:1054300080E50E94EF26892B19F088E00E940E2853
:10544000012F0F5F812F64E04FEA51E020E00E94BE
:1054500094446091F72889E00E94EF26892B19F087
:1054600089E00E940E28102F1F5F802F64E04DEA14
:1054700051E020E00E9494446091F72884E50E9466
:10548000EF26892B19F08AE00E940E28012F0F5F6A
:10549000812F64E04BEA51E020E00E949444609147
:1054A000012984E00E94EF26892B19F08BE00E94ED
:1054B0000E28102F1F5F802F64E049EA51E020E0A2
:1054C0000E949444609101298FE40E94EF26892B69
:1054D00019F08CE00E940E28012F0F5F812F64E0ED
:1054E00047EA51E020E00E94944488E061E00E9495
:1054F000EF26892B19F08DE00E940E28102F1F5FD8
:10550000802F64E045EA51E020E00E9494448BE063
:1055100061E00E94EF26892B19F08EE00E940E2890
:10552000012F0F5F812F64E043EA51E020E00E94E9
:10553000944483E064E00E94EF26892B19F08FE009
:105540000E940E28102F1F5F802F64E041EA51E077
:1055500020E00E9494448EE464E00E94EF26892BB0
:1055600019F080E10E940E28012F0F5F812F64E067
:105570004FE951E020E00E9494446091F62886E0D3
:105580000E94EF26892B19F081E10E940E28802FBE
:1055900064E04DE951E020E00E9494446091F628D7
:1055A00081E50E94EF26892B19F082E10E940E28E6
:1055B000802F8F5F64E04BE951E020E00E9494442B
:1055C0005E9A80910323882311F180E062E049E82C
:1055D00051E020E00E9494448091032360E00E9407
:1055E000DB4688EE93E09093B6238093B52380E466
:1055F00090E09093FB228093FA2280E29EE424EFD5
:1056000031E0F9013197F1F70197D9F709C080E04E
:1056100062E047E751E020E00E9494440E94E038B5
:1056200084E190E00E94288E80E29EE424EF31E045
:10563000F9013197F1F70197D9F71F910F91FF9079
:10564000089520E030E048E853E105C0FA013197C1
:10565000F1F72F5F3F4F28173907C4F30895CF9311
:10566000DF93EC0140E020E030E0FE01E20FF31FA9
:10567000E40FF11D80818D3209F44F5FFB01E20FD1
:10568000F31FDE01A20FB31FA40FB11D8C91808305
:105690002F5F3F4F2E30310541F7DF91CF910895B5
:1056A0001BC00E947B8CBC01807022E0803092077E
:1056B000C9F022E08130920720F48050914041F4FB
:1056C000089524E08030920769F08050984051F0AE
:1056D0008BE693E20E947A3C8BE693E20E944A3C7E
:1056E0008823F9F208955F926F927F928F929F9232
:1056F000AF92BF92CF92DF92EF92FF920F931F93E0
:10570000DF93CF930F92CDB7DEB7182F092F562E08
:10571000809104238F5F80930423815061E043E6EE
:1057200053E020E00E946444212F302FC9017C0106
:10573000CC2498E8A92E93E1B92E3E010894611C6F
:10574000711C84EF882E81E0982E49C0F70180817A
:105750000E94988C892B09F445C080910001882310
:1057600041F484EF91E0F4013197F1F70197D9F713
:1057700032C0813011F0833021F4C5010197F1F777
:105780002AC0823041F5DD2423C00E94502BC50180
:105790000197F1F70F5F1F4F0A3C110531F08BE6BF
:1057A00093E20E94413C882381F78BE693E2B301A8
:1057B0000E94563CF70190818981891761F0892FF9
:1057C0000E94988C892B71F0D394F3E0DF1619F0C6
:1057D00000E010E0DFCFC3940894E11CF11CC51475
:1057E00008F4B4CF0F90CF91DF911F910F91FF90EC
:1057F000EF90DF90CF90BF90AF909F908F907F9071
:105800006F905F900895DF92EF92FF920F931F9336
:10581000DF93CF93CDB7DEB764970FB6F894DEBFB2
:105820000FBECDBFD82EF62EE72E88E893E124EFE9
:1058300031E0F9013197F1F70197D9F7ED2DF0E05B
:10584000E231F10508F0CEC0EA5BFF4F8E010F5F39
:105850001F4FEE0FFF1F0590F491E02D0994C80132
:105860006EE573E00E949E94E3E0F9E2DE01159696
:1058700081918D9389E2E730F807D1F7198671C0DD
:10588000C80169E573E06BC0C80164E573E067C0F7
:10589000C8016FE473E063C0C8016AE473E05FC0ED
:1058A000C80165E473E05BC0C80160E473E057C001
:1058B000C8016DE373E053C0C80169E373E04FC0F2
:1058C000C80165E373E04BC0C80160E373E047C003
:1058D000C8016BE273E00E949E94F80101900020E1
:1058E000E9F731978F2D9E2D9C01D9018CE00D9009
:1058F00001928150E1F7198A34C0C80166E273E071
:105900002EC0C80161E273E02AC0C8016CE173E0F7
:1059100026C0C80167E173E022C0C80162E173E0FC
:105920000E949E9480912E2F63EC78E29E012B5F63
:105930003F4FE82FF0E0AF01460F571F06C0DB01D5
:105940008D91BD01D9018D939D0164177507B9F73C
:10595000EC0FFD1F158205C0C8016DE073E00E94C9
:105960009E948E010F5F1F4FC8016BE073E00E9491
:1059700093940E94502B8BE693E20E949B3CF8018B
:1059800001900020E9F73197E01BF10BC8016E2F61
:105990000E94732BBEE0DB1641F18DE0D81629F191
:1059A00000E010E028E8E22E23E1F22E15C00E946C
:1059B000502B8BE693E266E073E00E94F43C882370
:1059C000A1F48BE693E26EEF72E00E94F43C882330
:1059D00049F4C7010197F1F70F5F1F4FA7E0023DA0
:1059E0001A0729F720E030E002C021E030E0C901C9
:1059F00064960FB6F894DEBF0FBECDBFCF91DF9196
:105A00001F910F91FF90EF90DF9008951F931092D8
:105A1000000110E080E060E070E00E94032C892B20
:105A200019F41F5F1330B1F782E0809300011F91DA
:105A300008950F931F93CF93DF93C0E0D0E008E861
:105A400013E105C00E94502BC8010197F1F7219680
:105A5000C433D105B9F78BE693E262E973E00E94A3
:105A6000F43CDF91CF911F910F910895EF92FF9237
:105A70000F931F93CF93DF938C01C0E0D0E038E801
:105A8000E32E33E1F32E3FC00E94502B8BE693E2CE
:105A900067E873E00E94F43C8823E9F48BE693E224
:105AA0006FE773E00E94F43C882369F088EE93E08E
:105AB00024EF31E0F9013197F1F70197D9F781E04F
:105AC0008093000126C08BE693E265E673E00E94B6
:105AD000F43C882331F00E94192D0E94062D82E0AB
:105AE000EFCF98010115110511F021E030E080E0C1
:105AF00090E005C0C7010197F1F781E090E08217BF
:105B00009307C4F321960C171D0708F0BDCF8091B1
:105B10000001DF91CF911F910F91FF90EF900895B9
:105B2000CF92DF92EF92FF920F931F93DF93CF9369
:105B30000F92CDB7DEB788E893E124EF31E0F901A9
:105B40003197F1F70197D9F780E090E00E94362D68
:105B5000823089F110E00BE26E010894C11CD11C67
:105B600044EFE42E41E0F42E0983C60161E00E9477
:105B7000732B88E99AE3F7013197F1F70197D9F789
:105B80001F5F143089F782E060E070E00E94032C10
:105B9000892BC1F00E94062D83E060E070E00E9436
:105BA000032C892B79F00E94062D80E197E20E9458
:105BB000362D823039F48BE693E20E949B3C21E043
:105BC00030E002C020E030E0C9010F90CF91DF91BA
:105BD0001F910F91FF90EF90DF90CF900895CF939A
:105BE000DF93EC0180E090E00E94362D813021F1BE
:105BF0000E94062D86E0BE010E94032C892BE1F055
:105C00000E94062D84E0BE010E94032C892BA1F086
:105C10000E94062D81E060E070E00E94032C892B39
:105C200059F080E69AEE0E94362D20E030E0813077
:105C300029F421E030E002C020E030E0C901DF912A
:105C4000CF9108950F931F93DF93CF930F92CDB70A
:105C5000DEB78C01698380E090E00E94362D8230AF
:105C600019F420E030E013C0CE01019661E00E94FB
:105C7000732BC80169810E94732B80E090E00E9421
:105C8000362D20E030E0813011F421E030E0C90110
:105C90000F90CF91DF911F910F9108951F93182FAF
:105CA00080E090E00E94362D813019F420E030E051
:105CB0002CC080910101181731F1112389F487E07C
:105CC00060E070E00E94032C892BA9F01092010182
:105CD0000E94062D86E060E070E00E94032C0BC05D
:105CE000113049F488E060E070E00E94032C892BB9
:105CF00011F0109301010E94062D20E030E0809108
:105D00000101181711F421E030E0C9011F91089535
:105D10008F929F92AF92BF92CF92DF92EF92FF92BB
:105D20000F931F93DF93CF93CDB7DEB7CF5FD040F4
:105D30000FB6F894DEBF0FBECDBFD82EB92E0E948D
:105D4000062D80E00E944E2E892B09F47EC085E04E
:105D500060E070E00E94032C892B09F476C000E219
:105D60001EE4E8E8EE2EE3E1FE2E0E94502B0150E7
:105D70001040C7010197F1F701151105B1F78BE646
:105D800093E26BEE72E00E94F43C882371F300E032
:105D900010E078E8E72E73E1F72E0E94502BC70140
:105DA0000197F1F70F5F1F4F8AEE00361807A9F72A
:105DB000ED2CFB2CDD244E010894811C911C66E126
:105DC000A62EB12CAC0EBD1E5CE0C52E36C08BE6F7
:105DD00093E2B8010E94563C0F5F1F4F8BE693E29F
:105DE00068EE72E00E94EF3C882389F3F80110828C
:105DF0008981882311F1C4016CED72E00E94B39493
:105E0000892B49F08BE693E20E949B3C0E94062D71
:105E100021E030E01CC087ED92E0B50144E050E0A5
:105E20000E94A594892B49F0DC9CB00111246E0DD1
:105E30007F1DC5010E942F2BD3948BE693E20E9415
:105E4000413C882311F48401C9CF20E030E0C9012E
:105E5000C150DF4F0FB6F894DEBF0FBECDBFCF915C
:105E6000DF911F910F91FF90EF90DF90CF90BF9047
:105E7000AF909F908F9008956F927F928F929F9294
:105E8000AF92BF92CF92DF92EF92FF920F931F9348
:105E9000DF93CF930F92CDB7DEB75C01C62E7A01A8
:105EA0001982DD2400E010E03E010894611C711CA1
:105EB000F8E88F2EF3E19F2E36C0DC1419F421E0B0
:105EC00030E03CC00E94502B8BE693E20E94413CA4
:105ED000882331F580E090E00E94362D813061F515
:105EE0008BE693E20E94413C8823D1F48981882388
:105EF00079F48BE693E2B3010E94563C89818C15BC
:105F000011F019820DC080ED97E0E80EF91E08C06F
:105F1000B5016D0D711D8BE693E20E94563CD39442
:105F2000C4010197F1F70F5F1F4F0330110521F0F6
:105F3000E114F10409F0C1CF20E030E0C9010F9075
:105F4000CF91DF911F910F91FF90EF90DF90CF9055
:105F5000BF90AF909F908F907F906F9008951F9308
:105F6000CF93DF931092042343980E948C4080E0EB
:105F700060E045E953E020E00E94644480ED97E052
:105F800024EF31E0F9013197F1F70197D9F7ECEC03
:105F9000F8E29AE08081803219F090932E2F04C0AD
:105FA000915031979923B1F784E190E00E94618C80
:105FB0008BE693E267E073E244E650E00E94373CF0
:105FC00088EE93E024EF31E0F9013197F1F7019782
:105FD000D9F70E94502B8BE693E20E949B3C80E015
:105FE00060E070E00E94032C83E0809300018EE06B
:105FF00060E070E00E94032C8DE060E070E00E94A1
:10600000032C80E060E070E00E94032C892B09F0F3
:106010004EC080E490E00E94618C88EE93E024EF13
:1060200031E0F9013197F1F70197D9F780E060E0AD
:1060300070E00E94032C8DE060E070E00E94032C71
:106040008EE060E070E00E94032C80E060E070E091
:106050000E94032C892B09F494C080E060E070E07A
:106060000E94032C892B19F58CC0CA010197F1F706
:1060700021503040D1F780E060E070E00E94032CB6
:106080008DE060E070E00E94032C8EE060E070E044
:106090000E94032C80E060E070E00E94032C80E00E
:1060A00060E070E00E94032C892B09F462C082E05A
:1060B000809300018AE060E070E00E94032CEC0114
:1060C00084E190E00E94618C88EE93E024EF31E05F
:1060D000F9013197F1F70197D9F783E060E070E0BB
:1060E0000E94032C892B19F010E0CD2B09F411E04C
:1060F00088E060E070E00E94032C892B09F411E035
:1061000089E060E070E00E94032C892B09F411E023
:1061100080E160E070E00E94032C892B09F411E01B
:1061200088EB9BE024EF31E0F9013197F1F701971B
:10613000D9F781E160E070E00E94032C892B09F41B
:1061400011E08CE060E070E00E94032C83E080931B
:1061500000018BE060E070E00E94032C81E08093FE
:106160000101439A112331F40E94D63821E030E036
:1061700003C0439A20E030E0C901DF91CF911F9125
:10618000089581E890E00E94618C28EE33E044EFAE
:1061900051E06BCF429A289A469A459A823051F044
:1061A000833018F48823F9F008958530C1F08630E3
:1061B00071F517C08091C9008F7E8093C9008091CE
:1061C000C900877F8093C9008091C9008F77809331
:1061D000C900529853985A985B98429808954598E8
:1061E0000895469808958091C9008F7E8093C900D4
:1061F0008091C900877F8093C9008091C9008F7703
:106200008093C900529853985A985B98289808959B
:106210000E948C4089E490E00E94F055AC0180E03F
:1062200060E022E00E949D4487E490E00E94F055E7
:10623000AC0180E061E022E00E949D4486E490E0B1
:106240000E94F055AC0180E063E020E00E949D4494
:1062500080E064E04FEB53E020E00E94644480E083
:1062600065E049EA53E020E00E9464448AE490E05B
:106270000E94F055AC0180E066E020E00E949D4461
:106280008CE290E00E94F055AC018CE067E020E0E9
:106290000E949D4480E00E94CA305E9880E20E9485
:1062A0003B848823D9F380EF0E943B845E9A8091DF
:1062B0006724813011F486E001C085E00E94CA3075
:1062C00008950E948C4080E060E043E454E022E0C6
:1062D0000E94644480E061E04DE254E022E00E94CC
:1062E000644480E063E047E154E020E00E946444BD
:1062F00080E064E041E054E020E00E94644480E0FB
:1063000065E04BEE53E020E00E94644480E066E0EC
:1063100045ED53E020E00E9464448CE290E00E944E
:10632000F055AC018CE067E020E00E949D4443986A
:1063300082E00E94CA3080E20E943B848823D9F325
:1063400080EF0E943B8480916724813011F486E0C5
:1063500001C085E00E94CA30439A08950E948C4093
:106360008FE390E00E94F055AC0180E060E022E015
:106370000E949D4487E490E00E94F055AC0180E0CB
:1063800061E022E00E949D4486E490E00E94F05586
:10639000AC0180E063E020E00E949D4484E490E052
:1063A0000E94F055AC0180E064E020E00E949D4432
:1063B00088E490E00E94F055AC0180E065E020E0C8
:1063C0000E949D448CE290E00E94F055AC018CE06C
:1063D00067E020E00E949D4480E00E94CA300E9455
:1063E000E14D80E20E943B848823C9F380EF0E9444
:1063F0003B8480916724813011F486E001C085E000
:106400000E94CA3008950E948C408FE390E00E9461
:10641000F055AC0180E060E022E00E949D4485E4FC
:1064200090E00E94F055AC0180E061E020E00E9425
:106430009D4486E490E00E94F055AC0180E063E06A
:1064400020E00E949D4482E490E00E94F055AC015F
:1064500080E064E020E00E949D4488E490E00E9497
:10646000F055AC0180E065E020E00E949D448CE2A4
:1064700090E00E94F055AC018CE067E020E00E94C3
:106480009D4482E00E94CA300E94E14D80E20E9459
:106490003B848823C9F380EF0E943B84809167246A
:1064A000813011F486E001C085E00E94CA30089571
:1064B0000E948C408FE390E00E94F055AC0180E098
:1064C00060E022E00E949D4483E490E00E94F05549
:1064D000AC0180E061E022E00E949D4481E490E014
:1064E0000E94F055AC0180E063E020E00E949D44F2
:1064F00084E490E00E94F055AC0180E064E020E08C
:106500000E949D4488E490E00E94F055AC0180E038
:1065100065E020E00E949D448CE290E00E94F055EE
:10652000AC018CE067E020E00E949D44439880E04D
:106530000E94CA300E94E14D80E20E943B84882381
:10654000C9F380EF0E943B8480916724813011F46D
:1065500086E001C085E00E94CA30439A08950E94F7
:106560008C408091F528813009F055C08FE390E090
:106570000E94F055AC0180E060E022E00E949D4462
:1065800080E490E00E94F055AC0180E061E020E002
:106590000E949D4481E490E00E94F055AC0180E0AF
:1065A00063E020E00E949D4482E490E00E94F05568
:1065B000AC0180E064E020E00E949D4488E490E02B
:1065C0000E94F055AC0180E065E020E00E949D440F
:1065D0008CE290E00E94F055AC018CE067E020E096
:1065E0000E949D44439882E00E94CA300E94E14D7F
:1065F00080E20E943B848823C9F380EF0E943B84A1
:1066000080916724813011F486E001C085E00E940A
:10661000CA30439A08958DE390E00E94F055AC0192
:1066200080E061E020E00E949D448EE390E00E94C3
:10663000F055AC0180E061E020E00E949D4488E3D9
:1066400090E00E94F055AC0180E062E020E00E9402
:106650009D4489E390E00E94F055AC0180E063E046
:1066600020E00E949D448AE390E00E94F055AC0136
:1066700080E064E020E00E949D448BE190E00E9475
:10668000F055AC018CE067E020E00E949D4480E280
:106690000E943B848823D9F380EF0E943B840895B5
:1066A0004F925F926F927F928F929F92AF92BF9222
:1066B000CF92DF92EF92FF920F931F93DF93CF93CE
:1066C0000F92CDB7DEB7E0918B23F0E0EE58FC4D92
:1066D000808189830E948C4080E063E044E954E03B
:1066E00020E00E94644480E064E045E854E020E05B
:1066F0000E94644481E48093892380ED97E024EF35
:1067000031E0F9013197F1F70197D9F7109216248A
:1067100084E190E09093332F8093322F00E0F1E6F4
:106720004F2E552453943E010894611C711CE1E0E6
:106730008E2E912C74E1C72ED12C64EFA62E61E031
:10674000B62E11E150E2E52E52E0F52EAFC02DB786
:106750003EB7275030400FB6F8943EBF0FBE2DBF56
:10676000EDB7FEB73196ADB7BEB711964C92118218
:10677000528274826382968285820E94268F2DB710
:106780003EB7295F3F4F0FB6F8943EBF0FBE2DBFF7
:1067900080911624882331F48091322F9091332FE9
:1067A000892BB1F78091322F9091332F892B09F4E7
:1067B00062C00E948B8E4981E0911824F0911924C7
:1067C0008081481709F049C08EE064E050E022E083
:1067D00030E000E00E944A49E0911824F091192429
:1067E0008191819FD001112480918B2390E00197AA
:1067F0009C012E9DC0012F9D900D3E9D900D11245A
:10680000A80FB91FA658BB4D80E101900D92815091
:10681000E1F7E0911824F0911924208130E0809173
:106820008B2390E00197F90144E0EE0FFF1F4A959A
:10683000E1F7E20FF31FDC01AE9DC001AF9D900DAB
:10684000BE9D900D1124E80FF91FE658FB4D108AEC
:1068500089818F5F898300E007C088EE93E0F501AE
:106860003197F1F70197D9F7D092332FC092322F99
:10687000109216241BC00F5FD092332FC092322F7C
:106880000233A0F080E062E046E754E020E00E949E
:10689000644484E690E09093332F8093322F80916C
:1068A000322F9091332F892BD1F704C08981803208
:1068B00008F44DCFE0918B23F0E0EE58FC4D898138
:1068C00080830F90CF91DF911F910F91FF90EF90F8
:1068D000DF90CF90BF90AF909F908F907F906F9000
:1068E0005F904F9008952F923F924F925F926F92D8
:1068F0007F928F929F92AF92BF92CF92DF92EF9250
:10690000FF920F931F93DF93CF930F92CDB7DEB714
:106910000E948C4088EC90E09093332F8093322F2C
:10692000E0918B23F0E0EE58FC4D8081803210F432
:106930000E9450338091322F9091332F892B09F48C
:10694000B6C284E4809389231092162488EC90E0E8
:106950009093332F8093322F8AE089832DB73EB7EF
:10696000275030400FB6F8943EBF0FBE2DBFEDB795
:10697000FEB7319684E6ADB7BEB711968C931182FF
:1069800081E08283CE0101969483838381E090E04D
:10699000968385830E94268F8CE291E09093352F19
:1069A0008093342FFF2400E010E02DB73EB7295F1D
:1069B0003F4F0FB6F8943EBF0FBE2DBF40E2C42E2E
:1069C00042E0D42E80918B2390E001978C9DA00112
:1069D0008D9D500D9C9D500D1124400F511F465808
:1069E0005B4D80E06F2D20E00E943344F3940F5EF6
:1069F0001F4F37E0F31631F7FF2438EC832E912C2C
:106A000024E6E22E1E010894211C311C91E0492E3F
:106A1000512C80E2682E82E0782E80911624882303
:106A200009F48CC00E948B8EA0901824B090192479
:106A300083E090E00E94F055AC0180E067E020E048
:106A40000E949D444F2D4F5F85E067E00E944B47B9
:106A500080918B238130B1F0823001F583E067E0D3
:106A600043E754E020E00E94644483E167E040E7AC
:106A700054E020E00E94644487E0F89E6001112405
:106A800010E011C083E067E04DE654E020E00E9492
:106A9000644483E167E04AE654E0EBCF83E167E0DA
:106AA00048E654E0E6CFF601E10FF11D3196EE0F16
:106AB000FF1FEA0DFB1D4081518198ED413F5907B1
:106AC00014F426E015C0ACEF49315A0774F0BFEF5B
:106AD0004D395B0764F023E0473E520714F423E08E
:106AE00007C037E24F30530714F025E001C024E01F
:106AF00085E1821B612F30E000E00E94DF4884E0E6
:106B0000F81691F4143080F080E064E045E10E94D2
:106B1000B74480E065E045E10E94B74480E066E06C
:106B200045E10E94B74417E01F5F173008F4BBCF60
:106B30009092332F8092322F109216248091342F0E
:106B40009091352F892B31F59AE09983ADB7BEB777
:106B500017970FB6F894BEBF0FBEADBFEDB7FEB727
:106B600031961196EC921182B1E0B2833482238285
:106B7000568245820E94268F2CE231E03093352FD9
:106B80002093342F8DB79EB707960FB6F8949EBF0B
:106B90000FBE8DBF80E80E943B84882309F446C065
:106BA000FA9494E09F1510F414E0F12E0E948C40AA
:106BB000A7E0FA9E6001112400E0C601800F911D3C
:106BC000AC01B4E0440F551FBA95E1F7480F591FC7
:106BD00080918B2390E001979C01269DC001279D09
:106BE000900D369D900D1124480F591F46585B4D4E
:106BF00080E0602F20E00E94334434E0F31691F4EB
:106C0000043080F080E064E045E10E94B74480E019
:106C100065E045E10E94B74480E066E045E10E94FE
:106C2000B74407E00F5F073040F24AC080E40E949B
:106C30003B84882309F444C0F39484E08F1508F45E
:106C4000FF240E948C4097E0F99E6001112400E02F
:106C5000C601800F911DAC01A4E0440F551FAA95F9
:106C6000E1F7480F591F80918B2390E00197DC01D9
:106C7000A69DC001A79D900DB69D900D1124480FB3
:106C8000591F46585B4D80E0602F20E00E9433443E
:106C9000B4E0FB1691F4043080F080E064E045E15C
:106CA0000E94B74480E065E045E10E94B74480E07F
:106CB00066E045E10E94B74407E00F5F073040F20D
:106CC00010918A23113009F09BC080E10E943B841F
:106CD000882309F495C019822DB73EB7275030405C
:106CE0000FB6F8943EBF0FBE2DBFEDB7FEB731967D
:106CF000ADB7BEB71196EC92118212833482238213
:106D0000568245820E94268F80ED97E02DB73EB7D0
:106D1000295F3F4F0FB6F8943EBF0FBE2DBFE4EF83
:106D2000F1E03197F1F70197D1F780918B23813012
:106D300019F40E94A39002C00E94E68E9092332F15
:106D40008092322F80ED97E0E4EFF1E03197F1F798
:106D50000197D1F7E0918B23F0E0EE58FC4D808154
:106D6000803210F40E94503384E48093892310927F
:106D700016249092332F8092322F3AE039838DB7C8
:106D80009EB707970FB6F8949EBF0FBE8DBFEDB7A5
:106D9000FEB73196ADB7BEB71196EC921182B1E055
:106DA000B28334822382568245820E94268F2DB779
:106DB0003EB7295F3F4F0FB6F8943EBF0FBE2DBFC1
:106DC0000E948C40FF2400E010E080918B2390E033
:106DD0000197869DA001879D500D969D500D112411
:106DE000400F511F46585B4D80E06F2D20E00E9400
:106DF0003344F3940F5E1F4F37E0F31631F7FF244F
:106E000080E20E943B84882339F48091322F909154
:106E1000332F892B09F001CE80EF0E943B84198229
:106E20008DB79EB707970FB6F8949EBF0FBE8DBF64
:106E3000EDB7FEB7319684E6ADB7BEB711968C9329
:106E4000118281E08283CE0101969483838381E065
:106E500090E0968385830E94268F1092892310925A
:106E600016248091322F9091332F2DB73EB7295F92
:106E70003F4F0FB6F8943EBF0FBE2DBF892BA9F42C
:106E80000E948C4080E062E049E554E020E00E94EE
:106E9000644484E690E09093332F8093322F809166
:106EA000322F9091332F892BD1F70E94E68E0F90CD
:106EB000CF91DF911F910F91FF90EF90DF90CF90D6
:106EC000BF90AF909F908F907F906F905F904F900A
:106ED0003F902F9008953F924F925F926F927F92D2
:106EE0008F929F92AF92BF92CF92DF92EF92FF92DA
:106EF0000F931F93DF93CF930F92CDB7DEB788E444
:106F0000809389230E948C4083E090E00E94F0559A
:106F1000AC0180E067E020E00E949D4480918B23DB
:106F2000813061F480E060E049E455E022E00E94B5
:106F3000644483E167E046E455E01BC080918A2306
:106F4000823061F480E060E040E355E022E00E949E
:106F5000644483E167E04DE255E00BC080E060E00F
:106F600047E155E022E00E94644483E167E044E1A8
:106F700055E020E00E9464441092162484EF91E0D2
:106F80009093332F8093322F8CEF898310E058E653
:106F9000452E332433944E010894811C911C41E00A
:106FA000A42EB12C55245A9434EFC32E31E0D32EA5
:106FB00024EFE22E21E0F22E9EEF692E0DEF8CEFF2
:106FC000782E2DB73EB7275030400FB6F8943EBF0D
:106FD0000FBE2DBFEDB7FEB73196ADB7BEB7119658
:106FE0004C921182328294828382B682A5820E9460
:106FF000268F598284EC99E02DB73EB7295F3F4F29
:107000000FB6F8943EBF0FBE2DBFF6013197F1F7D2
:107010000197D9F7809116248823E9F10E948B8E7D
:1070200080918A23882341F51091A42F1156109343
:107030008A23113081F460E04EEF54E022E00E9498
:10704000644483E167E04BEF54E020E00E94644435
:1070500010938B2311C080E060E045EE54E022E005
:107060000E94644483E167E042EE54E020E00E9425
:10707000644482E080938B231092F62F80E062E0DC
:1070800046EA5FE20E94044410921624F092332FE5
:10709000E092322F11E080E80E943B84882331F493
:1070A00080E862E00E949484882311F0698239C0EC
:1070B00080E40E943B84882331F480E462E00E94F3
:1070C0009484882311F009832CC080918A23813015
:1070D00041F580E10E943B84882319F180918B2344
:1070E000813071F40E94A39080E060E04CEC54E0A9
:1070F00022E00E94644483E167E049EC54E00DC063
:107100000E94E68E80E060E043EB54E022E00E94C3
:10711000644483E167E040EB54E020E00E94644473
:10712000798280E20E943B84882339F48091322F57
:107130009091332F892B09F044CF80EF0E943B843C
:1071400010928923109216248091322F9091332F20
:10715000892BB9F4112311F00E948C4080E062E089
:107160004CE954E020E00E94644484E690E090936F
:10717000332F8093322F8091322F9091332F892B90
:10718000D1F70E94E68E0F90CF91DF911F910F9162
:10719000FF90EF90DF90CF90BF90AF909F908F9037
:1071A0007F906F905F904F903F90089581E0809323
:1071B000FA286091FA2882E190E00E9439950895BA
:1071C00081E08093FB286091FB2881E190E00E94A0
:1071D00039950895EF92FF920F931F93CF93DF930A
:1071E00010920E2910920F29109210291092112935
:1071F00010920A2910920B2910920C2910920D2935
:107200001092122910921329109214291092152904
:1072100089E691E0909318298093172980E090E007
:10722000FC01E053F74D128201968F319105C1F7B1
:10723000C0E0D0E084E695E060E00E943C448E012E
:1072400095E0000F111F9A95E1F70C1B1D0BC8016B
:107250008F519F4F6C2F0E943995C80182519F4FCB
:1072600060E00E943995B8016A517F4F8EE099E243
:1072700044E050E00E942F95B8016E517F4F8AE0A4
:1072800099E244E050E00E942F95B80166517F4F8B
:1072900082E199E244E050E00E942F95B8016151EB
:1072A0007F4F87E199E242E050E00E942F95C801AC
:1072B0008F509F4F60E00E943995C8018E509F4FBC
:1072C00060E00E943995C8018B509F4F6FEF0E947C
:1072D0003995C8018D509F4F60E00E943995C801D3
:1072E00089509F4F60E00E9439952196C733D105A0
:1072F00009F0A0CFC0E0D0E083E2E82EF12C82E6D6
:1073000095E060E00E943C44CE9D8001CF9D100D31
:10731000DE9D100D1124C8018E5C9F4F6C2F0E94C2
:107320003995C8018D5C9F4F60E00E943995C80176
:107330008C5A9F4F60E00E943995C8018D5A9F4F2B
:1073400060E00E9439950C5C1F4F82ED98E2B80115
:107350004FE150E00E942F952196C530D10579F676
:107360008FE595E060E00E943C44DF91CF911F9152
:107370000F91FF90EF90089580E090E06091792464
:107380000E9439956091292981E090E00E94399509
:107390006091FC2882E090E00E9439956091082974
:1073A00083E090E00E9439956091F62884E090E0B7
:1073B0000E9439956091012985E090E00E943995FD
:1073C0006091F32886E090E00E9439956091F7285B
:1073D00087E090E00E9439956091BE2888E090E0B7
:1073E0000E9439956091C22889E090E00E94399509
:1073F000609128298AE090E00E9439956091CE281A
:107400008BE090E00E943995609178248CE090E0C8
:107410000E943995609167248DE090E00E94399533
:10742000609102298EE090E00E9439956091F828E1
:107430008FE090E00E9439956091F52880E190E01E
:107440000E9439956091FB2881E190E00E94399576
:107450006091FA2882E190E00E9439956091F928C4
:1074600083E190E00E9439956091CF2884E190E01B
:107470000E9439956091C0287091C12885E190E003
:107480000E944F956091BF2887E190E00E94399556
:107490006091F42888E190E00E94399583E099E2B8
:1074A00062E270E044E050E00E942F9583EC98E2A5
:1074B00067E270E04AE050E00E942F950895AF9295
:1074C000BF92CF92DF92EF92FF920F931F937B01B7
:1074D0008C0159016A0189E190E0B801A7010E947D
:1074E00047958DE190E0B601A5010E9447951F9157
:1074F0000F91FF90EF90DF90CF90BF90AF900895E5
:107500000E948C4080E060E04FEA55E022E00E945B
:10751000644480E061E044EA55E020E00E94644475
:1075200080E062E04EE855E020E00E94644489E893
:10753000809379241092292991E09093FC289093CC
:10754000082982E48093F6289093012980E18093B2
:10755000F32880E48093F7281092BE281092C22866
:1075600084E18093282984E68093CE2810927824A1
:1075700010926724109202299093F8289093F5288E
:107580001092FB281092FA281092F9289093CF2895
:107590009093BF289093F42880E797E19093C128B7
:1075A0008093C02888E292EDA1E4B5E08093BA28E8
:1075B0009093BB28A093BC28B093BD288EE491EB98
:1075C000ADE1BFE18093FD289093FE28A093FF28B2
:1075D000B09300294091BA285091BB286091BC28F3
:1075E0007091BD2889E190E00E9447954091FD2867
:1075F0005091FE286091FF28709100298DE190E064
:107600000E94479583E099E269E875E00E949E94A4
:1076100083E099E262E270E044E050E00E942F953E
:1076200083EC98E26EE775E00E949E9483EC98E20A
:1076300067E270E04AE050E00E942F956091FB28DD
:1076400081E190E00E9439956091FA2882E190E012
:107650000E94399581E290E069E50E9439950E9487
:10766000BC3980E066E049E655E020E00E946444D1
:1076700082E167E046E655E020E00E94644488EC41
:1076800090E09093B6238093B52380E890E09093A8
:10769000FB228093FA2280E10E9445848823D9F35B
:1076A000089581E290E00E941B95893509F0BBC0E6
:1076B00080E090E00E941B958093792481E090E027
:1076C0000E941B958093292982E090E00E941B95DF
:1076D0008093FC2883E090E00E941B95809308290A
:1076E00084E090E00E941B958093F62885E090E06E
:1076F0000E941B958093012986E090E00E941B95D3
:107700008093F32887E090E00E941B958093F728F0
:1077100088E090E00E941B958093BE2889E090E06D
:107720000E941B958093C2288AE090E00E941B95DE
:10773000809328298BE090E00E941B958093CE28AF
:107740008CE090E00E941B95809378248DE090E07F
:107750000E941B95809367248EE090E00E941B9509
:10776000809302298FE090E00E941B958093F82877
:1077700080E190E00E941B958093F52881E190E0E4
:107780000E941B958093FB2882E190E00E941B954C
:107790008093FA2883E190E00E941B958093F9285A
:1077A00084E190E00E941B958093CF2885E190E0D2
:1077B0000E9429959093C1288093C02887E190E08A
:1077C0000E941B958093BF2888E190E00E941B9542
:1077D0008093F42883E099E262E270E044E050E0B4
:1077E0000E940B9583EC98E267E270E04AE050E07B
:1077F0000E940B9589E190E00E9423956093BA283E
:107800007093BB288093BC289093BD288DE190E0B5
:107810000E9423956093FD287093FE288093FF2893
:107820009093002908950E94803A089589E190E09C
:107830000E9423956093BA287093BB288093BC283C
:107840009093BD288DE190E00E9423956093FD28E0
:107850007093FE288093FF28909300290895FC01DF
:10786000849101C0849131968823E1F70895FC0149
:107870005583448377836683138212821182108238
:107880000895FC0120E080819181892B09F421E099
:10789000822F0895FC0140E024813581808191810F
:1078A0002817390709F441E0842F0895CF93DF9317
:1078B000EC01DB0188819981892B11F480E017C0EC
:1078C000EE81FF818A819B81E80FF91F80818C9373
:1078D0008A819B816C817D8101960E942F949B837C
:1078E0008A838881998101979983888381E0DF91D8
:1078F000CF910895CF93DF93EC01462F6C817D816A
:10790000288139816217730711F480E011C08A81E0
:107910009B81820F931F0E942F94EE81FF81E80FBD
:10792000F91F40838881998101969983888381E03A
:10793000DF91CF910895FC0111821082138212828F
:1079400081E00895CF92DF92EF92FF920F931F9301
:10795000CF93DF93EC016B017A0100E010E019C0D6
:10796000C8018E0D9F1D8217930778F58A819B8130
:107970008E0D9F1D6C817D81800F911F0E942F9421
:10798000EE81FF81E80FF91F80818417F1F40F5F0A
:107990001F4FF601E00FF11F4491288139814423E4
:1079A000F9F68A819B818E0D9F1D6C817D81800FF0
:1079B000911F0E942F949B838A832E193F09201BBD
:1079C000310B3983288381E001C080E0DF91CF91C2
:1079D0001F910F91FF90EF90DF90CF90089540E0BE
:1079E00050E00E94A23C0895EF92FF920F931F93E4
:1079F000CF93DF938C017B01C0E0D0E00AC0C801C7
:107A0000B701AE010E94A23C882311F081E008C0BA
:107A10002196F80180819181C817D90780F380E011
:107A2000DF91CF911F910F91FF90EF900895FC018E
:107A300080818093262A81818093272A8281809366
:107A4000282A93819093292A6091262A7091272AC7
:107A5000089590917523980F9093752380917623C4
:107A6000890F809376230895CF92DF92EF92FF9251
:107A70000F931F93CF93DF9380E80E943B8488236A
:107A800029F480917A23823009F041C080917A23D1
:107A90008130D1F10E948C4080E060E046E459E002
:107AA00020E00E94644480E061E04AE359E020E085
:107AB0000E94644480E062E04EE259E020E00E94CF
:107AC000644480E063E042E259E020E00E946444C4
:107AD00080E064E046E159E020E00E94644480E0F8
:107AE00065E04AE059E020E00E94644480E066E0FE
:107AF0004EEF58E020E00E94644480E067E042EFEF
:107B000058E020E00E94644481E080937A238091D1
:107B10007723813009F05EC080917823803309F0AB
:107B200059C080917A23882309F054C0C0902E292F
:107B3000C3E3D9E2EE244BC080E1E81609F44AC061
:107B400087E08E1510F010E001C01BE04881812F06
:107B50006E2D50E023E030E000E00E944A494B8166
:107B6000812F8C5F6E2D50E022E030E00E944A4968
:107B70008981282F30E0C90183709070039731F418
:107B8000812F895F6E2D40EF58E01CC020FF06C09A
:107B9000812F895F6E2D4EEE58E014C09A8195308A
:107BA00030F0812F895F6E2D4CEE58E00BC0812F95
:107BB000895F923020F06E2D4AEE58E003C06E2DA2
:107BC00048EE58E020E00E946444E3942C96EC14C4
:107BD00008F4B2CF80917A23813009F06FC180918F
:107BE0007723813009F084C080917823863009F0B2
:107BF0007FC080913429823049F0823060F0853036
:107C000050F48BE060E045EE58E009C08BE060E0A6
:107C100042EE58E004C08BE060E04FED58E020E019
:107C20000E946444809135298370833029F481E176
:107C300060E04DED58E004C081E160E04BED58E0BC
:107C400020E00E9464448091352980FF05C08EE0C9
:107C500060E048ED58E004C08EE060E045ED58E09B
:107C600020E00E9464448BE061E0409159290E9429
:107C70004B4782E499E20E94173D9B01AC018BE0E7
:107C800062E0A90125E030E000E00E944A4981E17C
:107C900062E042ED58E020E00E946444E090572901
:107CA0008FEFE89E7001112480915629E80EF11C97
:107CB000C70164E670E00E942F94AB018BE063E0A3
:107CC00022E030E00E944A498DE063E040ED58E058
:107CD00020E00E946444C70164E670E00E942F9493
:107CE000AC018EE063E022E030E001E00E944A490E
:107CF00080917723813019F5809178238231F9F4CE
:107D00008EE399E20E94173D20E13EE040E050E022
:107D10000E94049420EA36E841E050E00E94569424
:107D20008BE064E0A90123E030E000E00E944A49D2
:107D30008FE064E04BEC58E020E00E9464448091C6
:107D40007723813009F0BAC080917823823009F01E
:107D5000B5C08EE299E20E94173D6B017C0120E8DC
:107D600036E948E950E00E9456948AE065E0A901AE
:107D700022E030E000E00E944A498CE065E049ECF6
:107D800058E020E00E946444C701B60128EE33E0C9
:107D900040E050E00E945694CA01B90120E137E268
:107DA00040E050E00E9456949B01AC018DE065E0FC
:107DB000A90124E030E001E00E944A49C701B60170
:107DC0002AE030E040E050E00E945694CA01B90138
:107DD00024E630E040E050E00E9456949B01AC0164
:107DE00081E165E0A90122E030E00E944A4982E396
:107DF00099E20E94173D6B017C0120E836E948E9D1
:107E000050E00E9456948AE066E0A90122E030E04A
:107E100000E00E944A498CE066E047EC58E020E030
:107E20000E946444C701B60128EE33E040E050E010
:107E30000E945694CA01B90120E137E240E050E0C7
:107E40000E9456949B01AC018DE066E0A90124E0FC
:107E500030E001E00E944A49C701B6012AE030E063
:107E600040E050E00E945694CA01B90124E630E097
:107E700040E050E00E9456949B01AC0181E166E035
:107E8000A90122E030E00E944A498AE399E20E9477
:107E9000173D28EE33E040E050E00E9456948BE01E
:107EA00067E0A90124E030E000E00E944A4980E157
:107EB00067E045EC58E020E00E946444DF91CF91F8
:107EC0001F910F91FF90EF90DF90CF900895AF92A8
:107ED000BF92CF92DF92EF92FF920F931F93DF93A7
:107EE000CF930F92CDB7DEB70E948C4082E0809393
:107EF0007A2380918A238230A1F480E063E042E516
:107F000059E020E00E94644484E690E09093332F8F
:107F10008093322F8091322F9091332F892BD1F77C
:107F2000E1C080918B23813011F00E94E68E0E9487
:107F3000209088EC90E09093332F8093322F198219
:107F400010E0FF24EE245E010894A11CB11C88EC13
:107F5000C82ED12CC5010E94FA8D882309F4ACC02B
:107F6000D092332FC092322F143009F45DC01530F7
:107F700050F4113031F1113098F0123049F11330D2
:107F800009F09AC038C0163009F46BC0163008F4F6
:107F90005BC0173009F480C0183009F08DC080C074
:107FA0008981853B09F088C010927923109278234B
:107FB0001092772310927523109276230F2D11E0E3
:107FC0007FC08981823609F079C00F2D12E078C018
:107FD0002981213009F072C0909175239F5F9093A1
:107FE000752380917623890F8093762320937723BE
:107FF0000F2D13E065C08981803339F0863029F078
:10800000823119F0823009F059C080937823909121
:108010007523980F9093752380917623890F809311
:1080200076230F2D14E04CC009810B3F08F046C0A9
:1080300090917523900F9093752380917623890FEB
:108040008093762315E03CC089818823B9F590910F
:10805000752380917623890F809376230F2D16E068
:108060002FC00F2D0150209179238981E22FF0E05C
:10807000E65DF64D808390917523980F909375235C
:1080800080917623890F809376232F5F2093792325
:108090000023B1F417E014C0E9800F2D18E010C0E0
:1080A00080917523E81651F4998180917623981771
:1080B00029F40E94343D02C00F2D02C00F2D10E0A4
:1080C00080E20E943B84882341F48091322F90917A
:1080D000332F892B11F0F02E3DCF80EF0E943B848F
:1080E0000E94E68E0F90CF91DF911F910F91FF902C
:1080F000EF90DF90CF90BF90AF9008952C988EBDF9
:108100000DB407FEFDCF2C9A08952C988EBD0DB4AA
:1081100007FEFDCF2C9A08951F93CF93DF9380E045
:1081200090E0FC01E55DF54D1082019624E0803081
:108130009207B9F710EB2B98812F0E947E4080E1C7
:108140000E947E408091BE280E947E402B9AC0E013
:10815000D0E080E00E947E402196C038D105C9F76A
:108160001F5F183B41F71092AE2E1092AF2EDF9199
:10817000CF911F91089588E893E10197F1F7089551
:1081800020E030E048E853E105C0FA013197F1F70B
:108190002F5F3F4F28173907C0F308951F93182FFB
:1081A0001092AE2E1092AF2E8CE58CBD81E08DBD6D
:1081B0002C9A2A9880E090E028E833E1F901319781
:1081C000F1F701968A309105C9F72A9A2C982B98D5
:1081D00080E40E947E401130A1F48091BE28882363
:1081E00029F481EA0E947E4080EC04C080EA0E946B
:1081F0007E4088EC0E947E408091C228882349F40A
:1082000006C081EA0E947E4080EC0E947E4086EAA1
:1082100001C087EA0E947E4082EA0E947E408FE28F
:108220000E947E4088EF0E947E4080E00E947E4057
:1082300087E20E947E40113031F481E80E947E4046
:108240008091282904C081E80E947E4086E10E9436
:108250007E408CEA0E947E4080E00E947E408FEA51
:108260000E947E401130A1F46091CE2870E08827F2
:1082700077FD8095982F0E942F9223E333E343E20A
:1082800050E40E941C930E9401926093B30003C0CB
:108290008FEF8093B3000E948C401F910895FF924E
:1082A0000F931F938C01F62E2B98880F892F881F10
:1082B000990B919580550E947E408091BE280F7742
:1082C000080F802F82958F70805F0E947E40802FE4
:1082D0008F700E947E402B9A8F2D0E947E401F91AE
:1082E0000F91FF900895CF93DF93C0E0D0E0FE019F
:1082F000E555F54D8081FE01E55DF54D808360819A
:10830000CE010E944F41219683E0C038D80779F70B
:10831000FE01E55DF54D1082CE0160E00E944F4107
:10832000219684E0C030D80799F7DF91CF91089566
:108330000F931F93CF93DF93082F10E01695102F04
:108340000027179507951370C0E0D0E0CE01800F8D
:10835000911FDC01A55DB54D2C91FE01E45DF14D51
:1083600020836C910E944F412196CE37D10571F741
:10837000DF91CF911F910F9108950F931F93CF938A
:10838000DF93082F10E01695102F002717950795FB
:108390001370C0E0D0E0CE01800F911FFE01E45DBC
:1083A000F14D2081FC01E55DF54D208360810E9447
:1083B0004F412196CE37D10571F7DF91CF911F91B3
:1083C0000F9108958091AF2E8F5F8093AF2E8830EC
:1083D00028F00E94734187E08093AF2E0895982F74
:1083E00087FD3AC06034C0F5862F869586958695C0
:1083F000282F30E03695322F222737952795290FE1
:10840000311D677081E090E0582F01C0550F6A95CB
:10841000EAF7652F3370413061F0413018F0423097
:10842000A1F40DC0F901E55DF54D808160958623CD
:108430000BC0F901E55DF54D8081852B05C0F90183
:10844000E55DF54D808185278083F901E55DF54D7A
:108450006081C9010E944F4108952F923F924F922F
:108460005F926F927F928F929F92AF92BF92CF92C4
:10847000DF92EF92FF920F931F93DF93CF93CDB7CD
:10848000DEB729970FB6F894DEBF0FBECDBF8E833F
:10849000A62E0F83482E5524662E7724842F90E035
:1084A0009D838C8384199509E22FF0E0FB83EA8396
:1084B000AF014619570997FF04C022242A94322C91
:1084C00006C09C01009711F021E030E0190157FF30
:1084D00004C088248A94982C07C09A01411551053C
:1084E00011F021E030E049016C0197FF04C0D09405
:1084F000C194D108D3947A0157FF04C0F094E19459
:10850000F108F3948E816A2D4F810E94EF41EC14A3
:10851000FD04A4F5C60162E070E00E9443942227A6
:108520003327261B370B39872887A22CB22CB40C93
:1085300000E010E03E81432E552417C04885598540
:108540004E0D5F1D598748871416150634F4680CC4
:10855000791C4C195D09598748878B2D662D4F81F1
:108560000E94EF41020D131DBA0CC801840D951D28
:10857000EC81FD818E179F0709F733C0C70162E0C8
:1085800070E00E94439422273327261B370B39873C
:1085900028878982B82CB60C00E010E06A2C77247A
:1085A00018C0488559854C0D5D1D5987488714169C
:1085B000150634F4420C531C4E195F09598748873D
:1085C000842D6B2D4F810E94EF41080D191D59819B
:1085D000B50EC801860D971DEA81FB818E179F0796
:1085E00001F729960FB6F894DEBF0FBECDBFCF912D
:1085F000DF911F910F91FF90EF90DF90CF90BF9090
:10860000AF909F908F907F906F905F904F903F9032
:108610002F900895BF92CF92DF92EF92FF920F9327
:108620001F93CF93DF93182FB02E87FD1FE7603481
:1086300008F06FE3C42EDD24862F90E0820F911D99
:10864000C10ED11C21E8C216D10418F0E0E8CE2EEC
:10865000D12C7C0181E4E816F10418F070E4E72ED7
:10866000F12CC62FD0E008C0812F6C2F4C2D2C2F61
:108670000B2D0E942D422196EC16FD06A8F7DF91E6
:10868000CF911F910F91FF90EF90DF90CF90BF900F
:108690000895CF92DF92FF920F931F93CF93DF93B2
:1086A000C82ED62E142FF22E82E0281779F470E00F
:1086B000B3E0660F771FBA95E1F786E0C89E802D7C
:1086C000112445E027E001E00E940A431F3DE1F04C
:1086D000103E38F4163D81F01C3D91F0143CA9F495
:1086E00007C0163F59F01C3F69F0143E71F402C0F8
:1086F00011E00BC012E009C013E007C014E005C090
:1087000015E003C016E001C01EE1CD2DD0E0D695E6
:10871000DC2FCC27D795C79526E0C29EC001112437
:10872000C80FD91FD3701F77129F900111248901A0
:108730000B531A4FFBECCF2EF5E0DF2EC20ED31EEB
:10874000F8019491F2E0FF16D1F0FF1530F0FF2010
:1087500059F081E0F81629F50CC0E3E0FE16A9F007
:10876000F4E0FF16F1F416C0FE01E55DF54D9083CF
:1087700018C0FE01E55DF54D8081892B11C0FE0119
:10878000E55DF54D808189270BC0FE01E55DF54D66
:10879000808105C0FE01E55DF54D808190958923BE
:1087A0008083FE01E55DF54D6081CE010E944F4161
:1087B0000F5F1F4F21960C151D0509F0C1CFDF91EA
:1087C000CF911F910F91FF90DF90CF900895CF939D
:1087D000DF93EC0113C08091AE2E6091AF2E20E0AC
:1087E0000E9449438091AE2E8F5F8093AE2E8431DC
:1087F00020F01092AE2E0E94E2412196488144233F
:1088000051F7DF91CF9108958093AE2E6093AF2EF4
:10881000CA010E94E74308951F93CF93DF93EC01B1
:10882000162F1AC04A30A9F04D3019F41092AE2E0E
:1088300012C08091AE2E6091AF2E212F0E9449432D
:108840008091AE2E8F5F8093AE2E863120F01092F5
:10885000AE2E0E94E24121964881442319F7DF9110
:10886000CF911F9108958093AE2E6093AF2ECA01D1
:10887000622F0E940C4408951F93CF93DF93EC0165
:10888000162F1AC04A30A9F04D3019F41092AE2EAE
:1088900012C08091AE2E6091AF2E212F0E944943CD
:1088A0008091AE2E8F5F8093AE2E863120F0109295
:1088B000AE2E0E94E2412196FE014491442311F71D
:1088C000DF91CF911F9108958093AE2E6093AF2ECC
:1088D000CA01622F0E943C4408951F93CF93DF93F7
:1088E000EC01162F19C04A3019F04D3021F411C097
:1088F0000E94E24110C08091AE2E6091AF2E212FD8
:108900000E9449438091AE2E8F5F8093AE2E8631B8
:1089100010F01092AE2E2196FE014491442319F7D7
:10892000DF91CF911F9108958093AE2E6093AF2E6B
:10893000CA01622F0E946D440895FF920F931F9306
:10894000CF93DF93182FF62EEA01022F07C021964E
:10895000812F6F2D202F0E9449431F5F48814423A0
:10896000B1F7DF91CF911F910F91FF9008950F9371
:108970001F93282F8093AE2E6093AF2E90E0840F2C
:10898000911D469714F045E1421B042F020F122F50
:1089900008C0812F6091AF2E40E220E00E94494341
:1089A0001F5F1017B0F31F910F910895DF92EF92A0
:1089B000FF920F931F93CF93DF93F82ED02E87FF54
:1089C00002C01FE7F12E162F603408F01FE350E0BD
:1089D000C12FD0E0C20FD11D4F0D511D413851059F
:1089E00010F040E850E0E42E8F2D612F212F0D2D47
:1089F0000E942D42C134D10510F0C0E4D0E08E2D8C
:108A0000612F4E2D2C2F0D2D0E942D428E2D6C2F5F
:108A10004F2D2C2F0E942D428F2D6C2F4F2D212F4B
:108A20000E942D42DF91CF911F910F91FF90EF9007
:108A3000DF9008952F923F924F925F926F927F92B4
:108A40008F929F92AF92BF92CF92DF92EF92FF925E
:108A50000F931F93CF93DF93682E762E8A01C22E39
:108A6000C1E0D0E0C41BD50BCA01880F991F222496
:108A70003324281A390A642F670D862D4C2D0E9445
:108A8000EF41672D601B862D4C2D0E94EF41802FFA
:108A9000860D672D4C2D0E94EF41862D801B672D82
:108AA0004C2D0E94EF414801AA24BB2403E0402E34
:108AB000512C4DC0D7FD09C008948108910882E06F
:108AC00090E0280E391EC20DD31D0894A11CB11CC4
:108AD000C40DD51DDA2CD60C182D170D8D2D612F38
:108AE0004C2D0E94EF41E62CEA188E2D612F4C2D63
:108AF0000E94EF41172D18198D2D612F4C2D0E94CA
:108B0000EF418E2D612F4C2D0E94EF41E82CE60C99
:108B10001A2D170D8E2D612F4C2D0E94EF41962D91
:108B20009819092F892F612F4C2D0E94EF41172D85
:108B30001A198E2D612F4C2D0E94EF41802F612F2D
:108B40004C2D0E94EF4182E090E0480E591EA8147F
:108B5000B9040CF4AFCFDF91CF911F910F91FF902B
:108B6000EF90DF90CF90BF90AF909F908F907F90CD
:108B70006F905F904F903F902F9008952F923F926B
:108B80004F925F927F928F929F92AF92BF92CF92BD
:108B9000DF92EF92FF920F931F93CF93DF93782E84
:108BA000C62E7A01C1E0D0E0C41BD50BCA01880FE4
:108BB000991F22243324281A390A6E2D6C0D2C2D6E
:108BC0002E19872D472D01E00E942D42472D4E1969
:108BD0008E2D870D6C2D2C2D0E942D424701AA242D
:108BE000BB2433E0432E512C3AC0D7FD09C0089472
:108BF0008108910882E090E0280E391EC20DD31D35
:108C00000894A11CB11CC40DD51DEA2CE70CD72C6F
:108C1000DA18282D2C0D8E2D622F4D2D01E00E948B
:108C20002D422C2D28198E2D622F4D2D0E942D4264
:108C3000E82CE70C972D9819192F2A2D2C0D8E2D25
:108C4000622F492F0E942D422C2D2A198E2D622F22
:108C5000412F0E942D4282E090E0480E591EA81438
:108C6000B9041CF2DF91CF911F910F91FF90EF900B
:108C7000DF90CF90BF90AF909F908F907F905F904C
:108C80004F903F902F900895CF92DF92EF92FF92F6
:108C90000F931F93CF93DF93082F0E948C4080E7A0
:108CA00099E060E00E943C441092AE2E87E08093F1
:108CB000AF2E8FE599E060E00E946D4482E08093E2
:108CC000AF2E10E07801EE0CFF1CEE0CFF1C0F5FC6
:108CD0001F4F6801CC0CDD1CCC0CDD1C015010407A
:108CE0000295000F000F007C12E02EC08AE0E8160B
:108CF000F1041CF44E2D405D02C04E2D495C80E015
:108D00006091AF2E20E00E9449431093AE2EC0E048
:108D1000D0E0402F4C0F8091AE2E6091AF2E20E01E
:108D20000E9449438091AE2E8F5F8093AE2E219694
:108D3000C031D10571F78091AF2E8F5F8093AF2E38
:108D40000894E11CF11C005FEC14FD047CF2DF913F
:108D5000CF911F910F91FF90EF90DF90CF900895EA
:108D60008A3010F4805D0895895C08950F931F93F5
:108D7000142F022F6093AF2E8F5F8093AE2E815001
:108D800042954F704A3010F4405D01C0495C202F7D
:108D90000E9449438091AE2E6091AF2E412F4F70BB
:108DA0004A3010F4405D01C0495C202F0E944943C5
:108DB0001F910F9108950F931F93082F162F8091E5
:108DC000AE2E8F5F8093AE2E81506091AF2E402FDC
:108DD00042954F704A3010F4405D01C0495C212F2C
:108DE0000E9449438091AE2E8F5F8093AE2E8150BA
:108DF0006091AF2E402F4F704A3010F4405D01C09B
:108E0000495C212F0E9449438091AE2E8F5F809351
:108E1000AE2E81506091AF2E40E2212F0E94494337
:108E20001F910F910895FF920F931F93CF93DF939C
:108E3000F82E14E620E0C0E0D0E08F2D612F0E94D4
:108E40002394082F882321F4222311F4113071F484
:108E50008091AE2E8F5F8093AE2E8150402F405D6B
:108E60006091AF2E20E00E94494321E0812F6AE00B
:108E70000E942394982F2196C330D10531F0019F91
:108E8000802D1124F81A192FD8CFDF91CF911F917F
:108E90000F91FF9008958093AE2E6093AF2E842F94
:108EA0000E9413470895BF92CF92DF92EF92FF92F4
:108EB0000F931F93CF93DF93082FB62E7A0114E6FA
:108EC000C0E0D0E0C701612F70E00E942F94C62E51
:108ED000812F8A508A3048F4D02ED394802F6B2D66
:108EE0004EE220E00E9449430D2D4C2D405D802F25
:108EF0006B2D20E00E944943812F6AE00E94239459
:108F0000282F2196C330D10541F00F5FC19EC001CB
:108F10001124E81AF90A122FD5CFDF91CF911F91B2
:108F20000F91FF90EF90DF90CF90BF9008957F92C8
:108F30008F929F92AF92BF92CF92DF92EF92FF9269
:108F40000F931F93DF93CF93CDB7DEB727970FB65D
:108F5000F894DEBF0FBECDBF882EC62ECA017901A0
:108F6000702E8E010F5F1F4FB8014AE050E00E9443
:108F7000D494F80101900020E9F731979E2E901AC1
:108F8000092D10E0E016F1062CF0DD245701A01A9F
:108F9000B10A1EC010E007C0822F6C2D4AE220E00B
:108FA0000E9449431F5F212F280D812F90E08E15CD
:108FB0009F0594F34CC0772021F08F2D6C2D40E35A
:108FC00003C08F2D6C2D40E220E00E944943D394D2
:108FD000FD2CF80C8D2D90E08A159B0564F3FE01A5
:108FE000E00FF11F0081108281E0981619F48F2D97
:108FF00081500EC082E0981689F489818D3271F417
:109000008F2D81506C2D4DE220E00E9449438F2D21
:109010006C2D40E320E00E94494309C0F092AE2E3F
:10902000C092AF2ECE01019660E00E940C44192D33
:1090300011501F0D812F6C2D4EE220E00E944943FC
:10904000812F8F5F6C2D402F20E00E94494327968F
:109050000FB6F894DEBF0FBECDBFCF91DF911F9149
:109060000F91FF90EF90DF90CF90BF90AF909F90C7
:109070008F907F9008957F928F929F92AF92BF9230
:10908000CF92DF92EF92FF920F931F93DF93CF93D4
:10909000CDB7DEB727970FB6F894DEBF0FBECDBFB2
:1090A000882EC62ECA017901702E8E010F5F1F4FC8
:1090B000B8014AE050E00E94D494F80101900020E9
:1090C000E9F731979E2E901A092D10E0E016F1066F
:1090D0002CF0DD245701A01AB10A1EC010E007C011
:1090E000822F6C2D4AE220E00E9449431F5F212F0E
:1090F000280D812F90E08E159F0594F34CC07720AA
:1091000021F08F2D6C2D40E303C08F2D6C2D40E29C
:1091100020E00E944943D394FD2CF80C8D2D90E063
:109120008A159B0564F3FE01E00FF11F0081108298
:1091300081E0981619F48F2D81500EC082E09816A8
:1091400089F489818D3271F48F2D81506C2D4DE21F
:1091500020E00E9449438F2D6C2D40E320E00E94C7
:10916000494309C0F092AE2EC092AF2ECE010196B7
:1091700060E00E940C44192D11501F0D812F6C2DA1
:109180004EE220E00E944943812F8F5F6C2D402FDB
:1091900020E00E94494327960FB6F894DEBF0FBE29
:1091A000CDBFCF91DF911F910F91FF90EF90DF9096
:1091B000CF90BF90AF909F908F907F900895BF9277
:1091C000CF92DF92EF92FF920F931F93DF93CF9393
:1091D000CDB7DEB727970FB6F894DEBF0FBECDBF71
:1091E000C82ED62ECA017901B02E8E010F5F1F4FF7
:1091F000B8014AE050E00E94D494F80101900020A8
:10920000E9F73197E01B2E2F30E0E216F30624F049
:1092100000E0E21AF30A1EC000E007C0822F6D2DA5
:109220004AE220E00E9449430F5F202F2C0D802F3F
:1092300090E08E159F0594F31DC0BB2021F0822F76
:109240006D2D40E303C0822F6D2D40E220E00E948F
:1092500049430F5F202F2C0D802F90E08E159F0526
:1092600064F32093AE2ED092AF2ECE01019660E033
:109270000E940C4427960FB6F894DEBF0FBECDBFF8
:10928000CF91DF911F910F91FF90EF90DF90CF90E2
:10929000BF900895BF92CF92DF92EF92FF920F930B
:1092A0001F93DF93CF93CDB7DEB727970FB6F89410
:1092B000DEBF0FBECDBFC82ED62ECA017901B02E9B
:1092C0008E010F5F1F4FB8014AE050E00E94F594F5
:1092D000F80101900020E9F73197E01B2E2F30E0D4
:1092E000E216F30624F000E0E21AF30A1EC000E0E2
:1092F00007C0822F6D2D4AE220E00E9449430F5F94
:10930000202F2C0D802F90E08E159F0594F31DC00B
:10931000BB2021F0822F6D2D40E303C0822F6D2DE5
:1093200040E220E00E9449430F5F202F2C0D802F48
:1093300090E08E159F0564F32093AE2ED092AF2E51
:10934000CE01019660E00E940C4427960FB6F89477
:10935000DEBF0FBECDBFCF91DF911F910F91FF9068
:10936000EF90DF90CF90BF9008957F928F929F9261
:10937000AF92BF92CF92DF92EF92FF920F931F9323
:10938000162F69017A01782E739457FF0BC0C09491
:10939000D094E094F0940894C11CD11CE11CF11C01
:1093A0004DE201C040E220E00E944943C701B601FE
:1093B00020E836E948E950E00E947894872D612F33
:1093C000A90123E030E001E00E944A49872D8D5F2A
:1093D000612F4EE220E00E944943C701B60120E818
:1093E00036E948E950E00E9478946B017C01C7019E
:1093F000B60128EE33E040E050E00E947894490145
:10940000872D8C5F612FA90124E030E00E944A493A
:10941000AA24BB24C501B40128E13CEF4FEF5FEF64
:109420000E940494C60ED71EE81EF91E872D885F81
:10943000612FA60123E030E00E944A49872D855F15
:10944000612F4EE120E00E9449431F910F91FF9050
:10945000EF90DF90CF90BF90AF909F908F907F90D4
:109460000895BF92CF92DF92EF92FF920F931F93D6
:10947000182FB62E6A01CA016CE370E00E942F9487
:109480007B01812F6B2DA70122E030E000E00E94DC
:109490004A49812F8E5F6B2D4AE320E00E944943A9
:1094A0008CE390E09C01E29EC001E39E900DF29E51
:1094B000900D1124C81AD90A812F8D5F6B2DA6013A
:1094C00022E030E001E00E944A491F910F91FF9095
:1094D000EF90DF90CF90BF9008952F923F924F92E0
:1094E0005F926F927F928F929F92AF92BF92CF9234
:1094F000DF92EF92FF920F931F93DF93CF93CDB73D
:10950000DEB72F970FB6F894DEBF0FBECDBF8C87A6
:109510006D876A0159010B87449F9001459F300D6B
:10952000549F300D11243E832D83AA9CC001AB9C17
:10953000900DBA9C900D11249C838B83A29E4001B8
:10954000A39E900CB29E900C1124BC01681979095D
:10955000882777FD8095982F0E942F927B018C01A0
:10956000ED81FE81BF01882777FD8095982F0E94AD
:109570002F9220E030E040E85EE30E941C939B01C4
:10958000AC01C801B7010E9429910E947F930E94FB
:10959000FC912B019401220F331F3A8329836D859F
:1095A0006A0D8C854B850E94EF416D856A198C850B
:1095B0004B850E94EF418C858C0D6D854B850E94FB
:1095C000EF418C858C196D854B850E94EF418D8113
:1095D0009E81880F991FEE27FF27E81BF90BFA875A
:1095E000E9872B813C81220F331F38872F83490164
:1095F0008B819C81880E991E222433246624772433
:1096000038C057FC0DC00894A108B108E981FA815F
:1096100029853A85E20FF31FFA83E9834E1A5F0A20
:109620000894611C711C8F819885280E391E480C86
:10963000591C0C85060DED84EA0C802F6E2D4B8590
:109640000E94EF41FD84FA18802F6F2D4B850E94F8
:10965000EF411C851619812F6E2D4B850E94EF411D
:10966000812F6F2D4B850E94EF41EF81F8858E0E83
:109670009F1E29813A81221633061CF2B3018827E6
:1096800077FD8095982F0E942F9220E030E040E0F7
:109690005FE30E9429917B018C0165010894C10858
:1096A000D108EB81FC81BF01882777FD8095982F39
:1096B0000E942F92A80197010E941C93A801970174
:1096C0000E941C937B018C01CC9CC001CD9C900D11
:1096D000DC9C900D11242D813E81829FB001839FDF
:1096E000700D929F700D1124882777FD8095982F1B
:1096F0000E942F929B01AC01C801B7010E942991E1
:109700007B018C018B819C81ED81FE818E9FB0015C
:109710008F9F700D9E9F700D1124882777FD809577
:10972000982F0E942F929B01AC01C801B7010E94A3
:1097300028910E947F930E94FC915B01460149841D
:109740005A8450944194510853942D813E818985C7
:109750009A85281B390BE981FA812E1B3F0B3F8725
:109760002E8735C01A141B044CF00894611C711C20
:109770002F813885220E331EA20CB31C8E859F8547
:10978000A80EB91E0C85060DED84E80C802F6E2DF9
:109790004B850E94EF41FD84F818802F6F2D4B857B
:1097A0000E94EF411C851619812F6E2D4B850E945A
:1097B000EF41812F6F2D4B850E94EF410894810866
:1097C0009108EE85FF85E40DF51DFF87EE87C40146
:1097D00001961816190634F22F960FB6F894DEBFCC
:1097E0000FBECDBFCF91DF911F910F91FF90EF90F2
:1097F000DF90CF90BF90AF909F908F907F906F90B1
:109800005F904F903F902F9008950F93FA01022F91
:109810004D5F5F4F9F010E946D4A0F9108952F92F7
:109820003F924F925F926F927F928F929F92AF92F0
:10983000BF92CF92DF92EF92FF920F931F93DF932D
:10984000CF930F92CDB7DEB7382E262E4983422E06
:10985000B8010E2D80E090E00E942D922BED3FE0AC
:1098600049E450E40E941C9320E030E044E353E4D8
:109870000E9494916B017C01C7010E9491914B0160
:109880005C01552466247724C301B2010E942D9205
:109890009B01AC01C501B4010E941C930E947F93FF
:1098A0004B015C01B601C7010E949F936B017C01D3
:1098B0002981622F70E080E090E00E942D929B0150
:1098C000AC01C701B6010E941C930E947F930E94C5
:1098D0000192132D160FC501B4010E940192222D91
:1098E000261B832D622D412F0E942D420F90CF9178
:1098F000DF911F910F91FF90EF90DF90CF90BF907D
:10990000AF909F908F907F906F905F904F903F901F
:109910002F900895EF920F931F93942FF901E02E4B
:109920004D5F292F8F010E940F4C1F910F91EF90D7
:1099300008952F923F924F925F926F927F928F92F3
:109940009F92AF92BF92CF92DF92EF92FF920F93CE
:109950001F93382E262E442E40E050E0CA01B90154
:109960000E942D922BED3FE049E450E40E941C93AD
:1099700020E030E044E353E40E9494916B017C01C9
:10998000C7010E9491914B015C0155246624772404
:10999000C301B2010E942D922B013C01C501B4010B
:1099A000A30192010E941C930E947F934B015C01D2
:1099B000B601C7010E949F93A30192010E941C93CC
:1099C0000E947F930E940192132D160FC501B401CE
:1099D0000E940192222D261B832D622D412F0E9471
:1099E0002D421F910F91FF90EF90DF90CF90BF908D
:1099F000AF909F908F907F906F905F904F903F902F
:109A00002F900895ECE7F0E080E480838081807EF1
:109A1000816080838FEE80937A000895CF92DF92E9
:109A2000EF92FF920F931F93F8946091C02870916A
:109A3000C12880E090E00E942D9220917B233091FC
:109A40007C2340917D2350917E230E9429912FE811
:109A500032EC45E75FE30E941C936B017C010E949E
:109A6000FC91DC01CB0160E470E00E9443948C0126
:109A70009093842380938323C701B60120E030E0D4
:109A800040E85CE30E941C9360937B2370937C23EB
:109A900080937D2390937E230032110574F020E0A3
:109AA00030E040E85FE30E94299160937B2370934C
:109AB0007C2380937D2390937E2360917B23709100
:109AC0007C2380917D2390917E2320E030E040EF45
:109AD00050E40E94949160937F237093802380933D
:109AE0008123909382230E94019270938823609334
:109AF0008723109286231092852380E090E0A0E0D7
:109B0000B0E080937B2390937C23A0937D23B0933C
:109B10007E2378941F910F91FF90EF90DF90CF906C
:109B200008951F920F920FB60F920BB60F92112449
:109B30002F933F934F935F936F937F938F939F9355
:109B4000AF93BF93EF93FF9360917800709179008A
:109B500080E090E00E942D929B01AC0160917B23FC
:109B600070917C2380917D2390917E230E94299186
:109B700060937B2370937C2380937D2390937E233B
:109B800080918523909186230196909386238093DC
:109B900085238050904114F00E940E4DFF91EF916B
:109BA000BF91AF919F918F917F916F915F914F91F5
:109BB0003F912F910F900BBE0F900FBE0F901F90F3
:109BC00018950F93CF93DF9387E662E041E023E09F
:109BD00001E00E94D644809187239091882380548D
:109BE000914038F489E662E043E123E000E00E941E
:109BF0000A438091BF28813019F0C0E0D0E02BC02B
:109C000088E660E047E127E001E00E94D644209129
:109C100087233091882381E0243A380718F0C3E184
:109C2000D0E002C0C0E0D0E0C90181549140833649
:109C3000910540F4C9018054914065E070E00E94B4
:109C40002F94EB018C2F43E14C1B855962E023E0FC
:109C500000E00E940A438091BF28882341F588E6EE
:109C600060E046E127E001E00E94D644209187238E
:109C70003091882381E02A39380710F0C2E1D0E022
:109C8000C901815491408935910540F4C90180543E
:109C9000914065E070E00E942F94EB018C2F42E12F
:109CA0004C1B855962E023E000E00E940A432097A4
:109CB00039F08AE662E04C2F23E001E00E940A437B
:109CC000DF91CF910F910895DF92EF92FF920F9362
:109CD0001F93CF93DF930E94BB2510928A2310928B
:109CE0008B238091CF28813009F03DC00E948C40A9
:109CF0008AE090E00E94F055AC0180E060E020E056
:109D00000E949D448BE090E00E94F055AC0180E001
:109D100061E020E00E949D448CE090E00E94F055BC
:109D2000AC0180E063E020E00E949D4484E190E08B
:109D30000E94F055AC0180E064E020E00E949D4468
:109D40008FE090E00E94F055AC0180E065E020E0FB
:109D50000E949D4488E99AE324EF31E0F9013197AC
:109D6000F1F70197D9F70E94163C8091BA2890919B
:109D7000BB28A091BC28B091BD280097A105B105D2
:109D800009F443C18091FD289091FE28A091FF28FD
:109D9000B09100290097A105B10509F436C10E94D0
:109DA0008C4085E190E00E94F055AC0180E060E0DD
:109DB00022E00E949D4488E190E00E94F055AC01B1
:109DC00080E061E022E00E949D4486E190E00E94F4
:109DD000F055AC0180E062E022E00E949D4487E102
:109DE00090E00E94F055AC0180E067E020E00E9426
:109DF0009D446091FD287091FE288091FF289091EC
:109E0000002920E836E948E950E00E94569481E0B4
:109E100064E0A90122E030E000E00E944A4983E0CA
:109E200064E049EA59E020E00E9464446091FD2822
:109E30007091FE288091FF289091002928EE33E050
:109E400040E050E00E945694CA01B90120E137E297
:109E500040E050E00E9456949B01AC0184E064E035
:109E6000A90124E030E001E00E944A496091FD2808
:109E70007091FE288091FF28909100292AE030E01F
:109E800040E050E00E945694CA01B90124E630E057
:109E900040E050E00E9456949B01AC0188E064E0F1
:109EA000A90122E030E00E944A496091BA287091ED
:109EB000BB288091BC289091BD2820E836E948E96C
:109EC00050E00E9456948CE064E0A90122E030E06A
:109ED00000E00E944A498EE064E047EA59E020E051
:109EE0000E9464446091BA287091BB288091BC287C
:109EF0009091BD2828EE33E040E050E00E94569457
:109F0000CA01B90120E137E240E050E00E945694D6
:109F10009B01AC018FE064E0A90124E030E001E0A6
:109F20000E944A496091BA287091BB288091BC2850
:109F30009091BD282AE030E040E050E00E94569425
:109F4000CA01B90124E630E040E050E00E94569496
:109F50009B01AC0183E164E0A90122E030E00E94B2
:109F60004A4980E80E943B848823A9F160E070E0C0
:109F700080E090E020E030E040E050E00E945F3A76
:109F800080E060E240E828E000E00E940A4380E0D0
:109F900068E240E828E00E940A4389E190E00E94DC
:109FA000F055AC0180E065E020E00E949D4480E037
:109FB00066E045E10E94B74480E067E045E10E9429
:109FC000B74480E197E224EF31E0F9013197F1F7EE
:109FD0000197D9F71AC080E10E943B84882309F4D5
:109FE000C0CF80E064E045E10E94B74480E065E0D6
:109FF00045E10E94B74480E066E045E10E94B74435
:10A0000080E067E045E10E94B7448BE10E94698EE1
:10A010008BE10E94698E85E50E94698E8AEA0E9422
:10A02000698E80E00E94698E86E58093892310E026
:10A0300096E7D92E84E1E82EF12CCAE5D0E00E9403
:10A040008C408AE190E00E94F055AC0180E064E031
:10A0500020E00E949D448BE190E00E94F055AC010D
:10A060008CE067E020E00E949D4402E33BC000D00A
:10A070000F92EDB7FEB73196ADB7BEB71196DC9231
:10A08000118212820E94268FF092332FE092322F9B
:10A090000F900F900F908091322F9091332F892B3A
:10A0A000D1F7153148F4812F66E045EA59E020E008
:10A0B0000E9464441F5F06C080E066E045E10E94A4
:10A0C000B74410E080E20E943B84882351F080EF87
:10A0D0000E943B841092022910928A230E94EF531F
:10A0E000F9CF015080911624882321F4002309F030
:10A0F000BECF02C00023A9F48FE190E00E94F0558A
:10A10000AC0180E065E020E00E949D44D093332FB5
:10A11000C093322F8091322F9091332F892BD1F71A
:10A120008ECF0E948B8E8091182490911924909349
:10A13000B12E8093B02E8091CF288130B1F40E944F
:10A140008C4080E290E00E94F055AC0180E060E03D
:10A1500020E00E949D4481E290E00E94F055AC0115
:10A1600080E061E020E00E949D448091A42F82362F
:10A1700081F48091CF28813051F482E290E00E94F6
:10A18000F055AC0180E061E020E00E949D4482E057
:10A1900013C08091A42F833699F48091CF28813009
:10A1A00051F483E290E00E94F055AC0180E061E060
:10A1B00020E00E949D4481E080938A2380938B233A
:10A1C0008091CF28813099F584E290E00E94F0558B
:10A1D000AC0180E062E020E00E949D44E091B02E5E
:10A1E000F091B12E80810E94134783EA99E060E0EC
:10A1F0000E943C44E091B02EF091B12E81810E94EA
:10A200001347E091B02EF091B12E44814F598091C7
:10A21000AE2E6091AF2E20E00E94494388E99AE378
:10A2200024EF31E0F9013197F1F70197D9F70E9456
:10A23000A3908FEF0E94FD65E091B22EF091B32EB6
:10A2400080818A3509F468C00E948C4080E060E01B
:10A2500047E959E020E00E9464448AE50E941347E0
:10A2600085E290E00E94F055AC0180E061E020E0E2
:10A270000E949D4480E061E04BE859E020E00E94AC
:10A280006444E091B22EF091B32E80810E94134776
:10A2900086E290E00E94F055AC0180E062E020E0B0
:10A2A0000E949D4487E290E00E94F055AC0180E05E
:10A2B00063E020E00E949D4488E290E00E94F05517
:10A2C000AC0180E064E020E00E949D4485E899E0D4
:10A2D00060E00E943C4489E290E00E94F055AC01AD
:10A2E00080E065E020E00E949D4410928A238CED7E
:10A2F00095E09093B6238093B52380E490E090930B
:10A30000FB228093FA2280E49CE924EF31E0F901FA
:10A310003197F1F70197D9F71092892310921624FB
:10A3200082E390E09093332F8093322F8091322FED
:10A330009091332F892BD1F70E94EF53FDCF0F93CC
:10A340001F93982F062F142F842F692F46E250E178
:10A3500020E00E946444812F602F44E250E120E01D
:10A360000E9464441F910F9108958F929F92AF9223
:10A37000BF92DF92EF92FF920F931F93CF93DF93E1
:10A380000E948C4080E060E04CE45FE022E00E94AC
:10A3900064448DE060E045E45FE022E00E946444B4
:10A3A0008BE090E00E94F055AC0180E061E022E09B
:10A3B0000E949D4481E090E00E94F055AC0180E055
:10A3C00067E020E00E949D44DD2486E1882E912CE8
:10A3D000ED2CFF24E89C8001E99C100DF89C100DE9
:10A3E00011240D58114FC0E0D0E05701CE018E0D61
:10A3F0009F1D099744F4CE018D5F682F80E0A8016E
:10A4000020E00E94644421960A5E1F4FC330D105AC
:10A4100069F7DD2009F057C080E062E043E45FE0C7
:10A4200020E00E94644480E066E041E45FE00BC00D
:10A4300080E062E04FE35FE020E00E94644480E05F
:10A4400066E04DE35FE020E00E94644496E0A916D8
:10A45000B10474F080E062E04BE35FE020E00E9432
:10A46000644480E066E049E35FE020E00E946444E9
:10A4700080E40E943B84882329F086E0A816B1047A
:10A480000CF4D39480E80E943B84882311F0D1100F
:10A49000DA9480E20E943B84882331F480E10E94B8
:10A4A0003B84882309F494CF80EF0E943B84DF91A2
:10A4B000CF911F910F91FF90EF90DF90BF90AF90E1
:10A4C0009F908F90089596E0A916B1041CF6B0CF26
:10A4D0000E948C4080E062E047E75FE020E00E945D
:10A4E000644480E063E047E65FE020E00E9464446B
:10A4F0008CE067E042E65FE020E00E94644480E296
:10A500000E943B848823D9F380EF0E943B84089506
:10A510000E948C4080E060E044EE5FE022E00E9418
:10A5200064448FE290E00E94F055AC0180E061E06D
:10A5300020E00E949D4480E390E00E94F055AC0131
:10A5400080E062E020E00E949D4480E063E04EEC09
:10A550005FE020E00E94644480E064E048EB5FE05C
:10A5600020E00E94644480E065E042EA5FE020E091
:10A570000E94644480E066E04CE85FE020E00E94D6
:10A58000644481E390E00E94F055AC0180E067E014
:10A5900020E00E949D4480E20E943B84882321F0B9
:10A5A00080EF0E943B84089580E10E943B848823D1
:10A5B00091F32CE088E190E00FB6F894A895809391
:10A5C00060000FBE20936000FFCFBF92CF92DF925A
:10A5D000EF92FF920F931F93D82EE62E142FB22ED8
:10A5E000C02E842F642F41E00E949F51012FF12E35
:10A5F00080E40E943B84182F80E461E00E949484F0
:10A60000182B51F00E1510F40F5F06C081E0C8162C
:10A6100011F40EEF24C00E2D80E80E943B84182F09
:10A6200080E861E00E949484182B51F0D01610F459
:10A63000015006C081E0B81611F40DEF10C00D2DC9
:10A640000F1529F08F2D602F41E00E949F5180E36C
:10A650000E943B84F02E882359F285FD0FEF802F56
:10A660001F910F91FF90EF90DF90CF90BF900895D2
:10A67000CF92DF92EF92FF920F931F93C82ED62EA8
:10A68000E42E122F822F622F0E949F51012FF12E54
:10A6900080E40E943B84182F80E461E00E9494844F
:10A6A000182B29F00D1510F00D2D01C00F5F80E85B
:10A6B0000E943B84182F80E861E00E949484182B4C
:10A6C00029F0C01610F00C2D01C001500F1529F013
:10A6D0008F2D602F4E2D0E949F5180E30E943B845E
:10A6E000F02E8823A9F285FD0FEF802F1F910F9187
:10A6F000FF90EF90DF90CF900895BF92CF92DF92BE
:10A70000EF92FF920F931F93D82EE62E142FB22EA6
:10A71000C02E842F642F41E00E949F51012FF12E03
:10A7200080E40E943B84182F80E461E00E949484BE
:10A73000182B51F00E1510F40F5F06C081E0C816FB
:10A7400011F40EEF43C00E2D80E80E943B84182FB9
:10A7500080E861E00E949484182B51F0D01610F428
:10A76000015006C081E0B81611F40DEF2FC00D2D79
:10A7700080E20E945684882329F080EF0E943B8467
:10A780000AEF24C080E10E945684882329F080EFDC
:10A790000E943B840BEF1AC080E20E94458488230C
:10A7A00029F080EF0E943B840CEF10C00F1529F0B8
:10A7B0008F2D602F41E00E949F510E94E14D80E16A
:10A7C0000E944584F02E882309F4AACF802F1F9180
:10A7D0000F91FF90EF90DF90CF90BF9008952F9250
:10A7E0003F924F925F926F927F928F929F92AF9221
:10A7F000BF92CF92DF92EF92FF920F931F93DF935E
:10A80000CF9300D000D00F92CDB7DEB720918A232E
:10A81000298380EF0E943B84772466243324AA2472
:10A82000A39462E1262E01C0A02E809102298130DE
:10A8300011F480938A2380910229882319F43981A5
:10A8400030938A2380918A23882319F456E0652E59
:10A8500009C0813019F447E0642E04C0823011F43D
:10A8600034E0632E0E948C4080E060E047E150E1DC
:10A8700022E00E9464448CE060E041E150E122E08B
:10A880000E94644481E090E00E94F055AC0180E0B9
:10A8900067E020E00E949D448BE290E00E94F0552A
:10A8A000AC018CE067E020E00E949D44462C5524DA
:10A8B000C20101979B838A83772039F081E061E0B0
:10A8C0004FE050E120E00E946444E72CFF2428E49C
:10A8D00030E0E29EF001E39EF00DF29EF00D1124B7
:10A8E000FD83EC8300E010E0BB24B39467014801D2
:10A8F0008E0C9F1C8414950474F580918A238130FA
:10A9000061F44091FC28429DA00111248C819D811D
:10A91000480F591F4555564F19C0823061F4409178
:10A92000FC28429DA0011124EC81FD814E0F5F1F88
:10A930004D55544F0BC04091FC28429DA00111245D
:10A940002C813D81420F531F4D53534F83E06B2D9C
:10A9500020E00E946444053061F48A819B8188165E
:10A9600099063CF481E066E04DE050E120E00E9471
:10A9700064440E94E14D0F5F1F4FB394EC81FD8151
:10A98000E85BFF4FFD83EC83F7E0BF1609F0AFCF24
:10A99000332071F47720C9F46F1629F481E065E063
:10A9A0004A2D20E016C081E0662D4A2D20E00BC024
:10A9B00026E030E0C20ED31EC414D50434F082E089
:10A9C00066E04A2D21E000E005C082E065E04A2D06
:10A9D00021E001E00E947D53082F8E3F31F47394F3
:10A9E0003324339425E0A22E67CF8D3F29F47A9447
:10A9F000332492E0A92E60CF8C3F09F048C00E941A
:10AA00008C408DE290E00E94F055AC0180E062E065
:10AA100020E00E949D448EE290E00E94F055AC013F
:10AA20008CE067E020E00E949D4480E10E943B842E
:10AA30008111299880E20E9445848823B1F380EF38
:10AA40000E943B840E948C4080E060E040E050E146
:10AA500022E00E9464448CE060E04AEF5FE022E084
:10AA60000E94644481E090E00E94F055AC0180E0D7
:10AA700067E020E00E949D448BE290E00E94F05548
:10AA8000AC018CE067E020E00E949D4415CF8B3F35
:10AA900019F40E94EA868CC08A3F19F40E9402567B
:10AAA00087C080918A23813039F5E02EFF24E70C9E
:10AAB000F11C31E0E316F10419F40E944D6016C058
:10AAC00082E0E816F10421F483E00E944D6014C096
:10AAD00093E0E916F10419F40E946B370DC0E4E02D
:10AAE000EE16F10419F40E94D17006C0F7E0EF16DB
:10AAF000F10411F40E94658780918A23823071F4F9
:10AB0000802F90E0870D911D8130910519F40E94EE
:10AB10006B3704C0029711F40E94D17080918A2390
:10AB2000882309F081CEE02EFF24E70CF11C21E000
:10AB3000E216F10421F482E00E94605706C032E080
:10AB4000E316F10411F40E940572809167248823B2
:10AB500071F483E0E816F10419F40E94583220C021
:10AB600094E0E916F104A9F40E94AE3119C0809175
:10AB70006724813071F4E3E0EE16F10419F40E94C9
:10AB8000AF320EC0F4E0EF16F10419F40E94033264
:10AB900007C025E0E216F10419F40E94748244CE45
:10ABA00036E0E316F10409F03FCE0E94B5513CCEE9
:10ABB0000F900F900F900F900F90CF91DF911F91FA
:10ABC0000F91FF90EF90DF90CF90BF90AF909F904C
:10ABD0008F907F906F905F904F903F902F9008954F
:10ABE0002091FC28FC01EE0FFF1FEE0FFF1FE80F66
:10ABF000F91FE20FF11DEE0FFF1FE750F34E8081AA
:10AC0000918108950E948C40E091FC28F0E0EE0FC5
:10AC1000FF1FEB53F14E408151818CE067E020E053
:10AC20000E949D44E091FC28F0E0EE0FFF1FE750EA
:10AC3000F34E4081518180E062E020E00E949D441B
:10AC400080E20E943B84882369F380EF0E943B846A
:10AC50000895882351F4E4E4FFE26083118238967A
:10AC60008FE2E43AF807C9F710C0E82FF0E0319717
:10AC700093E0EE0FFF1F9A95E1F7DF01AD5BB04D5A
:10AC800011966C93EB5BF04D10828091C423882366
:10AC900019F01092C42308951092C2231092C02379
:10ACA0008091C7238E7F8093C72385EA8093BC0061
:10ACB0000895EF92FF920F931F93CF93DF930E941B
:10ACC0008C401092C6231092682480E091E160E0ED
:10ACD0000E943C448091C72382608093C7231092D6
:10ACE000C32380E060E00E94295681E090E00E944A
:10ACF0001084EC018091C72380FD05C0CE010E9425
:10AD00001A848823B9F381E090E00E9410847C01CA
:10AD1000C3E4DFE210E0812F60E00E9429568091B9
:10AD2000C72380FD05C0C7010E941A848823B9F398
:10AD30008B8187FF7AC080E061E041EF50E120E045
:10AD40000E94644482E161E0412F20E00E94B64607
:10AD500080E062E048EE50E120E00E94644488E038
:10AD600062E0488120E00E94B6468BE062E040EE5F
:10AD700050E120E00E94644482E162E0498120E0E9
:10AD80000E94B64680E063E047ED50E120E00E947B
:10AD9000644488E063E04A8120E00E94B6468BE08C
:10ADA00063E04FEC50E120E00E94644482E163E004
:10ADB0004B8120E00E94B64680E064E046EC50E122
:10ADC00020E00E94644488E064E04C8120E00E941E
:10ADD000B6468BE064E04EEB50E120E00E94644414
:10ADE00082E164E04D8120E00E94B64680E065E0AB
:10ADF00045EB50E120E00E94644488E065E04E812C
:10AE000020E00E94B6468BE065E04DEA50E120E08C
:10AE10000E9464444F81552747FD509582E165E0CB
:10AE200023E030E001E00E944A491F5F28961C3071
:10AE300009F071CFDF91CF911F910F91FF90EF90AB
:10AE40000895CF93DF93E82FA7E5B0E380E1ED010C
:10AE500019928A95E9F7EE2339F4CD0170E040E1CB
:10AE600050E00E94CD9404C0F0E0EA5AFF4C6083A9
:10AE70008DB79EB707970FB6F8949EBF0FBE8DBFD4
:10AE8000EDB7FEB7319684E7ADB7BEB711968C9398
:10AE900081E08183828387E590E39483838380E1EB
:10AEA00090E0968385830E94268FCDB7DEB72796E4
:10AEB0000FB6F894DEBF0FBECDBFDF91CF910895DE
:10AEC000BF92CF92DF92EF92FF920F931F93DF9387
:10AED000CF93CDB7DEB727970FB6F894DEBF0FBE7E
:10AEE000CDBF182F0E948C4081E08093B52E8093B7
:10AEF000B72E1092B62E1130B9F40E9459568BE03D
:10AF000067E042EA50E120E00E94644480E20E944F
:10AF10003B84882321F080EF0E943B843FC380E183
:10AF20000E943B84882359F30E948C408CE890E176
:10AF300062E00E943C4482E062E041E850E120E0AF
:10AF40000E94644482E063E046E750E120E00E9412
:10AF5000644488E068E240E026E001E00E940A43A1
:10AF600083E090E00E94F055AC0180E067E020E0D3
:10AF70000E949D4482E167E042E750E120E00E94A8
:10AF8000644480E062E040E750E120E00E946444D5
:10AF9000113029F487E992E20E94B58C0CC012307E
:10AFA00051F480918A23813031F480918B23813058
:10AFB00011F40E94A390EAE0CE2ED12C70E7B72EB8
:10AFC0007E010894E11CF11C8091B52E882361F567
:10AFD00080E40E943B84882331F480E463E00E9493
:10AFE0009484882309F14091B62E4E3FE8F44F5FD8
:10AFF0004093B62E89E063E050E023E030E000E0CB
:10B000000E944A49123081F48091B62E8B9DC00176
:10B0100011246FEF70E00E944394462F88E068E2AD
:10B0200026E001E00E940A438091B52E882309F0B2
:10B030003FC080E80E943B84882331F480E863E0CD
:10B040000E9494848823A1F18091B62E882381F1F7
:10B05000123079F48B9DC00111246FEF70E00E94D3
:10B060004394862F885F68E240E026E000E00E947B
:10B070000A434091B62E41504093B62E89E063E0DA
:10B0800050E023E030E000E00E944A49123081F4B1
:10B090008091B62E8B9DC00111246FEF70E00E944D
:10B0A0004394462F88E068E226E001E00E940A43CC
:10B0B0008091B52E8130D1F480E40E943B848823B6
:10B0C00031F480E461E00E949484882379F0409117
:10B0D000B72E403158F44F5F4093B72E89E062E0BD
:10B0E00050E023E030E000E00E944A498091B52E14
:10B0F000813039F580E80E943B84882331F480E870
:10B1000061E00E9494848823E1F04091B72E4423AB
:10B11000C1F041504093B72E442341F089E062E0F2
:10B1200050E023E030E000E00E944A498091B72ED1
:10B13000882339F489E062E04CE650E120E00E9487
:10B14000644480E10E943B84882309F478C0113074
:10B1500009F050C08091B62E882309F44BC010929C
:10B16000B72E1092B62E88E068E240E026E001E0BB
:10B170000E940A4380E065E045E10E94B7444091A7
:10B18000B72E442341F089E062E050E023E030E054
:10B1900000E00E944A498091B72E882339F489E063
:10B1A00062E048E650E120E00E9464444091B62EFF
:10B1B00089E063E050E023E030E000E00E944A498B
:10B1C0008091B72E6091B62E0E94295681E090E0C2
:10B1D0000E9410849093332F8093322F8091C72345
:10B1E00080FD08C08091322F9091332F0E941A84E5
:10B1F0008823A1F38091B52E882389F462E046E686
:10B2000050E120E00E94644480E063E044E650E1C5
:10B2100020E00E94644481E08093B52E10C080E05D
:10B2200062E042E650E120E00E94644480E063E096
:10B2300040E650E120E00E9464441092B52E1130A7
:10B2400009F097C18091B72E6091B62E0E942956C1
:10B2500081E090E00E9410849093332F8093322FEE
:10B2600080E063E043E550E120E00E946444E09127
:10B27000B72EF0E063E0EE0FFF1F6A95E1F7E55CA3
:10B28000F04D41818DE063E050E023E030E000E0EC
:10B290000E944A4980E064E046E450E120E00E94D8
:10B2A0006444E091B72EF0E053E0EE0FFF1F5A9593
:10B2B000E1F7E55CF04D8DE064E0458120E00E941F
:10B2C000B646E091B72EF0E043E0EE0FFF1F4A953F
:10B2D000E1F7E55CF04D45818DE064E050E023E06E
:10B2E00030E00E944A4980E065E049E350E120E017
:10B2F0000E946444E091B72EF0E033E0EE0FFF1FB0
:10B300003A95E1F7E55CF04D4781552747FD5095AB
:10B310008DE065E023E030E00E944A4980E066E08D
:10B3200040E350E120E00E946444E091B72EF0E059
:10B3300023E0EE0FFF1F2A95E1F7E55CF04D88E072
:10B3400066E0408120E00E94B6468BE066E048E27D
:10B3500050E120E00E946444E091B72EF0E093E0D9
:10B36000EE0FFF1F9A95E1F7E55CF04D82E166E094
:10B37000438120E00E94B6468091B72E282F30E00E
:10B3800021503040F90183E0EE0FFF1F8A95E1F76D
:10B39000ED5BF04D8181882309F4DEC0C114D10436
:10B3A00009F0D7C0C901B7014AE050E00E94D49427
:10B3B000C7010E94B58C8BEE92E20E94B58CE091A1
:10B3C000B72EF0E003E0EE0FFF1F0A95E1F7E55C12
:10B3D000F04D808190E0B7014AE050E00E94D494A3
:10B3E000C7010E94B58C8BEE92E20E94B58CE09171
:10B3F000B72EF0E0B3E0EE0FFF1FBA95E1F7E55C82
:10B40000F04D818190E0B7014AE050E00E94D49471
:10B41000C7010E94B58C8BEE92E20E94B58CE09140
:10B42000B72EF0E0A3E0EE0FFF1FAA95E1F7E35C73
:10B43000F04D808190E0B7014AE050E00E94D49442
:10B44000C7010E94B58C8BEE92E20E94B58CE09110
:10B45000B72EF0E073E0EE0FFF1F7A95E1F7E55CA1
:10B46000F04D838190E0B7014AE050E00E94D4940F
:10B47000C7010E94B58C8BEE92E20E94B58CE091E0
:10B48000B72EF0E063E0EE0FFF1F6A95E1F7E15C95
:10B49000F04D808190E0B7014AE050E00E94D494E2
:10B4A000C7010E94B58C8BEE92E20E94B58CE091B0
:10B4B000B72EF0E053E0EE0FFF1F5A95E1F7E55C81
:10B4C000F04D858190E0B7014AE050E00E94D494AD
:10B4D000C7010E94B58C8BEE92E20E94B58CE09180
:10B4E000B72EF0E043E0EE0FFF1F4A95E1F7E55C71
:10B4F000F04D868190E0B7014AE050E00E94D4947C
:10B50000C7010E94B58C8BEE92E20E94B58CE0914F
:10B51000B72EF0E033E0EE0FFF1F3A95E1F7E55C60
:10B52000F04D8781992787FD9095B7014AE050E05B
:10B530000E94D494C7010E94B58C8DEE92E20E94C5
:10B54000B58C8FEE92E20E94B58C28ECC22ED12CE5
:10B5500003C00894C108D1088091C72380FD0FC0A3
:10B560008091322F9091332F0E941A848823A1F367
:10B5700006C08091B72E6091B62E0E94215780E2BE
:10B580000E943B84882309F41FCD80EF0E943B84F6
:10B59000123021F480E060E00E94215727960FB618
:10B5A000F894DEBF0FBECDBFCF91DF911F910F91F9
:10B5B000FF90EF90DF90CF90BF9008959C01489747
:10B5C0008C9710F480E00895C901845490408D97C1
:10B5D00010F481E00895C901815790408D9710F4CF
:10B5E00082E00895C9018E5990408D9710F483E050
:10B5F0000895C9018B5C90408D9710F484E0089504
:10B60000C901885F90408D9710F485E00895255218
:10B6100031402D32310510F087E0089586E008951D
:10B62000EF92FF920F931F93CF93DF93282F062F54
:10B63000CA0166E170E00E942F946D5E70E0EB013C
:10B64000C658DE4E83E8E82E81E1F82EE60EF71E9E
:10B65000122F1F5FFE014491822F602F20E00E9475
:10B6600049432196212FCE15DF0591F7DF91CF9128
:10B670001F910F91FF90EF900895CF92DF92EF927C
:10B68000FF920F938FE790E00E94F055AC0180E0AD
:10B6900062E020E00E949D4480E890E00E94F05526
:10B6A000AC0180E063E020E00E949D4486E190E0F0
:10B6B0000E94F055AC0180E065E020E00E949D44CE
:10B6C000C090BC2ED090BD2EE090BE2EF090BF2E2C
:10B6D000C701B60120E836E948E950E00E945694D7
:10B6E00081E066E0A90122E030E000E00E944A49E2
:10B6F00083E066E04AE352E120E00E946444C7012F
:10B70000B60128EE33E040E050E00E945694CA01B2
:10B71000B90120E137E240E050E00E9456949B01DD
:10B72000AC0184E066E0A90124E030E001E00E9481
:10B730004A49C701B6012AE030E040E050E00E94EB
:10B740005694CA01B90124E630E040E050E00E947E
:10B7500056949B01AC0188E066E0A90122E030E04C
:10B760000E944A49C090B82ED090B92EE090BA2ECF
:10B77000F090BB2EC701B60120E836E948E950E059
:10B780000E9456948CE066E0A90122E030E000E0DF
:10B790000E944A498EE066E048E352E120E00E94C0
:10B7A0006444C701B60128EE33E040E050E00E9457
:10B7B0005694CA01B90120E137E240E050E00E940E
:10B7C00056949B01AC018FE066E0A90124E030E0D3
:10B7D00001E00E944A49C701B6012AE030E040E09A
:10B7E00050E00E945694CA01B90124E630E040E0DE
:10B7F00050E00E9456949B01AC0183E166E0A901F0
:10B8000022E030E00E944A490F91FF90EF90DF90D4
:10B81000CF900895CF92DF92EF92FF920F931F93F4
:10B82000CF93DF930E948C4086E190E00E94F05518
:10B83000AC0180E060E022E00E949D448BE190E05A
:10B840000E94F055AC018CE067E020E00E949D442E
:10B85000C8EBDEE210E0CC80DD80EE80FF801F5F71
:10B86000C701B60120E836E948E950E00E94569445
:10B8700081E0612FA90122E030E000E00E944A4906
:10B8800083E0612F4EE352E120E00E946444C7014F
:10B89000B60128EE33E040E050E00E945694CA0121
:10B8A000B90120E137E240E050E00E9456949B014C
:10B8B000AC0184E0612FA90124E030E001E00E94A6
:10B8C0004A49C701B6012AE030E040E050E00E945A
:10B8D0005694CA01B90124E630E040E050E00E94ED
:10B8E00056949B01AC0188E0612FA90122E030E071
:10B8F0000E944A49C880D980EA80FB80C701B6010E
:10B9000020E836E948E950E00E9456948CE0612F27
:10B91000A90122E030E000E00E944A498EE0612F58
:10B920004CE352E120E00E946444C701B60128EED6
:10B9300033E040E050E00E945694CA01B90120E192
:10B9400037E240E050E00E9456949B01AC018FE04A
:10B95000612FA90124E030E001E00E944A49C701BB
:10B96000B6012AE030E040E050E00E945694CA015F
:10B97000B90124E630E040E050E00E9456949B017B
:10B98000AC0183E1612FA90122E030E00E944A4925
:10B990002D96163009F05FCF05C01093332F00931A
:10B9A000322F02C008EC10E080E20E943B84882322
:10B9B000A1F380EF0E943B840E948C40DF91CF91E5
:10B9C0001F910F91FF90EF90DF90CF9008950F930C
:10B9D000CF93DF930E948C408BE190E00E94F05562
:10B9E000AC018CE067E020E00E949D4480E060E0D4
:10B9F0004EE051E120E00E94644460918D237091FB
:10BA00008E23882777FD8095982F0E942F9220E023
:10BA100030E040EA51E40E9494910E94FC919B0125
:10BA2000AC018DE060E0A90124E030E000E00E947C
:10BA3000DF4881E160E04DE620E00E94494380E07C
:10BA400061E04CE151E120E00E94644420918F23A9
:10BA50003091902340E050E0CA01B901E3E0660F65
:10BA6000771F881F991FEA95D1F7620F731F841FF4
:10BA7000951F2AEF30E040E050E00E9456948EE09F
:10BA800061E0A90123E030E00E944A4981E161E0E0
:10BA900044E452E120E00E94644480E062E04AE233
:10BAA00051E120E00E94644480919123909192237F
:10BAB0006AE070E00E944394AB018EE062E023E014
:10BAC00030E00E944A4981E162E04DE620E00E94B8
:10BAD000494380E063E046E451E120E00E94644491
:10BAE00040919323509194238DE063E00E94314A6A
:10BAF00080E064E048E351E120E00E94644440912A
:10BB0000F1228DE064E050E023E030E00E943B4809
:10BB100081E164E046E520E00E94494380E065E081
:10BB200044E551E120E00E94644440919523509106
:10BB300096238DE065E023E030E00E943B4881E100
:10BB400065E041E420E00E94494380E066E042E68F
:10BB500051E120E00E946444409197235091982342
:10BB60008DE066E024E030E00E944A4981E166E031
:10BB700040E452E120E00E946444C8ECD0E004C0FC
:10BB8000D093332FC093322F80E20E943B848823CE
:10BB9000B9F380919B238B7F80939B2380EF0E943E
:10BBA0003B840E948C40DF91CF910F910895AF921A
:10BBB000BF92CF92DF92EF92FF920F931F93DF938A
:10BBC000CF930F92CDB7DEB7F8ECAF2EB12CB09279
:10BBD000332FA092322F109289231092162488239B
:10BBE00009F4FEC01092B6231092B5238FEF9FEF99
:10BBF0009093FB228093FA220E948C406091B82E91
:10BC00007091B92E8091BA2E9091BB2E2091BC2EAE
:10BC10003091BD2E4091BE2E5091BF2E0E945F3AB2
:10BC20008EE790E00E94F055AC0180E060E022E0F9
:10BC30000E949D448FE790E00E94F055AC0180E0A7
:10BC400062E020E00E949D4480E890E00E94F05570
:10BC5000AC0180E063E020E00E949D4486E190E03A
:10BC60000E94F055AC0180E065E020E00E949D4418
:10BC70008AEF90E09093B6238093B52380E490E020
:10BC80009093FB228093FA2281E080939C23C090C2
:10BC9000BC2ED090BD2EE090BE2EF090BF2EC701DE
:10BCA000B60120E836E948E950E00E94569481E068
:10BCB00066E0A90122E030E000E00E944A4983E00A
:10BCC00066E046E352E120E00E946444C701B60109
:10BCD00028EE33E040E050E00E945694CA01B901DA
:10BCE00020E137E240E050E00E9456949B01AC0115
:10BCF00084E066E0A90124E030E001E00E944A49C6
:10BD0000C701B6012AE030E040E050E00E945694BE
:10BD1000CA01B90124E630E040E050E00E945694A8
:10BD20009B01AC0188E066E0A90122E030E00E94BE
:10BD30004A49C090B82ED090B92EE090BA2EF0901B
:10BD4000BB2EC701B60120E836E948E950E00E9461
:10BD500056948CE066E0A90122E030E000E00E9409
:10BD60004A498EE066E044E352E120E00E946444E8
:10BD7000C701B60128EE33E040E050E00E9456943F
:10BD8000CA01B90120E137E240E050E00E94569438
:10BD90009B01AC018FE066E0A90124E030E001E006
:10BDA0000E944A49C701B6012AE030E040E050E075
:10BDB0000E945694CA01B90124E630E040E050E008
:10BDC0000E9456949B01AC0183E166E0A90122E048
:10BDD00030E00E944A49B092332FA092322F1AC00D
:10BDE0008EE790E00E94F055AC0180E060E022E038
:10BDF0000E949D440E943D5B8091F428813051F463
:10BE0000B092B623A092B52380E890E09093FB22F5
:10BE10008093FA220E94E68E8FE480938923198210
:10BE20008DB79EB707970FB6F8949EBF0FBE8DBF14
:10BE3000EDB7FEB7319684E6ADB7BEB711968C93D9
:10BE40001182DD24D394D2827E010894E11CF11C7E
:10BE5000F482E38201E010E0168305830E94268FBE
:10BE60008AE08983EDB7FEB731968FE6ADB7BEB7EE
:10BE700011968C9382E08183D282F482E3821683CE
:10BE800005830E94268F8DB79EB707960FB6F8944C
:10BE90009EBF0FBE8DBF0F90CF91DF911F910F916D
:10BEA000FF90EF90DF90CF90BF90AF900895AF924A
:10BEB000BF92CF92DF92EF92FF920F931F93DF9387
:10BEC000CF930F92CDB7DEB7D82EE62EF42E922F59
:10BED0005801822F8695162F181B8D2D612F01E09A
:10BEE00099830E94D644CD2CC3941F5F4F2D42509E
:10BEF000998192508C2D612F292F00E00E940A43D6
:10BF0000FD0C8D2D6E2D4F2D2E2D01E00E942D420A
:10BF10001A141B040CF050C0C50165E070E00E94CB
:10BF200043946130710561F062307105B9F02E2DD6
:10BF300021508D2D8C5F4D2D4A5F672B29F553C005
:10BF40002E2D21508D2D8C5F622F96E0D90E4D2D18
:10BF500001E00E942D42EDEFEE0E57C02E2D215034
:10BF60004D2D4A5F8D2D8C5F622F01E00E942D4286
:10BF7000FDEFEF0E8D2D8D5F6E2D44E021E00E94D0
:10BF80000A438EEFE80E5BC0622F01E00E942D4253
:10BF90009DEFE90E8D2D8D5F6E2D44E021E00E9416
:10BFA0000A43EEEFEE0E8D2D8E5F6E2D46E021E002
:10BFB0000E940A43EA945FC0A114B10409F461C06D
:10BFC000C5016BEF7FEF0E9443946130710581F0F2
:10BFD00062307105F9F08D2D8C5F4D2D4A5F2E2D4D
:10BFE0002F5F672B89F5622F01E00E942D4249C027
:10BFF0002E2D2F5F8D2D8C5F622FF6E0DF0E4D2DE5
:10C0000001E00E942D4282E0E80E8D2D83506E2DBE
:10C0100044E034C02E2D2F5F4D2D4A5F8D2D8C5F57
:10C02000622F01E00E942D4292E0E90E8D2D8D5F7E
:10C030006E2D44E021E00E940A43E2E0EE0E8D2DD9
:10C040008E5F6E2D46E01AC0622F01E00E942D42E5
:10C05000F2E0EF0E8D2D8D5F6E2D44E021E00E9409
:10C060000A4382E0E80E8D2D8E5F6E2D46E021E0C2
:10C070000E940A43E3948C2D6E2D48E021E00E943B
:10C080000A430F90CF91DF911F910F91FF90EF9096
:10C09000DF90CF90BF90AF9008954F925F926F92D4
:10C0A0007F928F929F92AF92BF92CF92DF92EF9248
:10C0B000FF920F931F93DF93CF93CDB7DEB72E97E9
:10C0C0000FB6F894DEBF0FBECDBF682E10928E2340
:10C0D00010928D231092902310928F23109292230E
:10C0E000109291238FEF8093F1221092942310925B
:10C0F00093230E948C4080918A238230A1F480E0B7
:10C1000063E045E252E120E00E94644484E690E06E
:10C110009093332F8093322F8091322F9091332F31
:10C12000892BD1F7BCC40E94E68E8FE480938923CB
:10C1300019828DB79EB707970FB6F8949EBF0FBEB2
:10C140008DBFEDB7FEB7319684E6ADB7BEB7119699
:10C150008C931182DD24D394D2828E010F5F1F4F06
:10C160001483038381E0E82EF12CF682E5820E949D
:10C17000268F8AE08983EDB7FEB731968FE6ADB79B
:10C18000BEB711968C9382E08183D282148303839D
:10C19000F682E5820E94268F88EC90E09093332F00
:10C1A0008093322F8CE291E09093352F8093342F3F
:10C1B000FF249924CC24DD2477248824EDB7FEB70E
:10C1C00037960FB6F894FEBF0FBEEDBF502E412E2E
:10C1D00080911624882309F44FC488EC90E0909352
:10C1E000332F8093322F0E948B8E80911824909150
:10C1F00019249093142F8093132F80919C238130C6
:10C2000011F40E948C4010929C232091132F3091A6
:10C21000142FD9011596ED90FD900D911C91189752
:10C2200011964D915D916D917C9114978091BC2EEA
:10C230009091BD2EA091BE2EB091BF2EE816F906AA
:10C240000A071B0709F455C08091B82E9091B92EAA
:10C25000A091BA2EB091BB2E481759076A077B07E9
:10C2600009F447C0E6E0FFE2DF011D978DE00D9085
:10C2700001928150E1F7E9EFFEE2DF011D978DE0C9
:10C280000D9001928150E1F7ECEEFEE2DF011D9787
:10C290008DE00D9001928150E1F7EFEDFEE2DF01BC
:10C2A0001D978DE00D9001928150E1F7E2EDFEE2E5
:10C2B000DF011D978DE00D9001928150E1F7E5ECD3
:10C2C000FEE2DF011D978DE00D9001928150E1F7B4
:10C2D000EE82FF82088719874A835B836C837D83A4
:10C2E000A8EBBEE2FE0132968DE001900D928150E6
:10C2F000E1F7B1E06B1609F06BC22D5B3F4FF9011E
:10C30000808100919B2380FF04C0046000939B23E5
:10C3100014C010E00470107080E10E943B8490E033
:10C32000802B912B892B11F00E94E75C80E40E9406
:10C330003B84882311F00E940A5C86E190E063E26E
:10C3400070E040E150E021E00E94054CE091132FA5
:10C35000F091142F22AD33AD40E050E0CA01B90195
:10C36000B3E0660F771F881F991FBA95D1F7620F48
:10C37000731F841F951F2AEF30E040E050E00E94B9
:10C38000569481E060E0A90123E030E000E00E94E3
:10C390004A4984E060E040E252E120E00E946444C7
:10C3A000E091132FF091142F46AD57AD8EE060E071
:10C3B00023E030E00E944A4981E160E04EE120E064
:10C3C0000E944943E091132FF091142F86AD97AD51
:10C3D0000E94DE5AE82FF0E0EE0FFF1FEA53FE4EF8
:10C3E0004591549182E160E020E00E946444E09134
:10C3F000132FF091142F46AD57AD8CE061E00E94F1
:10C40000105BE091132FF091142F63A974A9882772
:10C4100077FD8095982F0E942F927B018C0120E060
:10C4200030E048E453E40E941893181654F0C80111
:10C43000B70120E030E048E453EC0E948D9188235E
:10C44000ACF4C801B70120E030E040EA51E40E94BA
:10C4500094910E94FC919B01AC0180E061E0A901F4
:10C4600024E030E000E00E94DF4814C0C801B701BA
:10C4700020E030E040E05FE30E941C930E94FC91CA
:10C480009B01AC0180E061E0A90123E030E000E025
:10C490000E94974784E061E04DE620E00E94494316
:10C4A000E091132FF091142F05A916A986E367E0F8
:10C4B0004AE02EE00E94575FE091132FF091142F75
:10C4C00086A597A588599E4F26AD37AD821B930B45
:10C4D00068E671E00E944394182FF92E86E163E22A
:10C4E0004FE0960100E00E948A4C86E163E24FE053
:10C4F000212F3F2D01E00E948A4C87E063E0412F0D
:10C500005F2D23E030E000E00E944A498AE063E0CA
:10C510004EE120E00E944943E091132FF091142F47
:10C5200084A595A56AE070E00E942F94AB0187E096
:10C5300062E023E030E00E944A498AE062E04DE692
:10C5400020E00E9449438BE064E04BE152E120E0AF
:10C550000E946444E091132FF091142F42A988E0C7
:10C5600064E050E022E030E00E944A49E091132F5D
:10C57000F091142FEC5BFF4F808186FF04C083E1B4
:10C5800064E04DE403C083E164E048E520E00E94FC
:10C590004943E091132FF091142FEC5BFF4F808102
:10C5A00082FF05C088E065E04FE052E10BC081FFEB
:10C5B00005C088E065E043E052E104C088E065E042
:10C5C00047EF51E120E00E946444E091132FF09185
:10C5D000142F47A950AD87E066E00E94314A8CE0F5
:10C5E00066E045EF51E120E00E946444E091132FA2
:10C5F000F091142FEE5BFF4F40818FE066E050E03A
:10C6000023E030E000E00E944A4982E166E043EF27
:10C6100051E120E00E946444E091132FF091142F27
:10C62000EC5BFF4F808184FF05C083E166E040EF53
:10C6300051E104C083E166E04DEE51E120E00E944B
:10C640009444E091132FF091142F41AD80E067E006
:10C6500050E023E030E000E00E943B4884E067E0E7
:10C6600046E520E00E944943E091132FF091142FFA
:10C6700091AD80917924981760F488EB9BE09093BA
:10C68000B6238093B52380E290E09093FB228093C1
:10C69000FA22E25BFF4F4081518187E067E023E0AF
:10C6A00030E000E00E943B488BE067E041E420E09E
:10C6B0000E944943E091132FF091142FE05BFF4F4C
:10C6C000408151818EE067E024E030E00E944A49D9
:10C6D00082E167E049EE51E120E00E946444E0918C
:10C6E000132FF091142FED5BFF4F8081E354F04046
:10C6F00080FF5DC023A934A980918D2390918E2362
:10C700008217930724F430938E2320938D2322AD38
:10C7100033AD80918F23909190238217930720F45B
:10C720003093902320938F2324A535A580919123C6
:10C73000909192238217930720F4309392232093B1
:10C74000912391AD8091F122981710F49093F122EA
:10C7500027A930AD8091932390919423821793075A
:10C7600020F43093942320939323E25BFF4F2081A6
:10C770003181EE54F0408091952390919623821759
:10C78000930720F43093962320939523E05BFF4F8B
:10C7900020813181E055F04080919723909198233A
:10C7A0008217930720F43093982320939723EE5B0E
:10C7B000FF4F8081E254F0408093F32281AD80935B
:10C7C000F22210921624212F3F2DC9016C011FC1A6
:10C7D000F3E06F1609F01BC1D9019E968D919C91D3
:10C7E0009F9788599E4FDE962D913C91DF97821B33
:10C7F000930B68E671E00E944394B82EA92E0E9424
:10C800008C4080E060E240E820E201E00E942D429E
:10C8100080E460E040E420E40E942D428CE067E088
:10C820004FED51E120E00E9464448EE36BE042E46E
:10C830002BE00E942D4286E16EE146E122E20E9459
:10C840002D428AE66EE14AE622E20E942D428EE304
:10C8500065E342E425E30E942D42901609F07EC074
:10C8600082E261E144E22FE00E942D428CE56FE01C
:10C870004EE521E10E942D4282E26FE244E221E393
:10C880000E942D428CE561E34EE52FE20E942D428D
:10C890008AE790E00E94F055AC0189E060E020E07A
:10C8A0000E949D448CE790E00E94F055AC0180E02E
:10C8B00063E020E00E949D448DE790E00E94F055E7
:10C8C000AC0184E163E020E00E949D448BE790E0AE
:10C8D0000E94F055AC0189E067E020E00E949D4491
:10C8E00080E060E04CED51E120E00E946444E09182
:10C8F000132FF091142FE05CFF4F4081552747FD27
:10C90000509582E060E023E030E000E00E94DF48E4
:10C9100080E067E049ED51E120E00E946444E0914D
:10C92000132FF091142FEF5BFF4F4081552747FDE8
:10C93000509582E067E023E030E00E94DF488FE01E
:10C9400060E046ED51E120E00E94644482E160E055
:10C950004B2D5A2D23E030E00E94DF4880E10E94F9
:10C960003B84882329F09394B1E0B91508F4992405
:10C97000E091132FF091142FE05CFF4F81919927E4
:10C9800087FD909562E070E00E9443947B01F094F3
:10C99000E194F108F39480E2E80E10E48081181B22
:10C9A000882D90E0672D70E04AE050E020E00E9482
:10C9B000054C882D672D49E0960100E00E948A4CC5
:10C9C000812F90E06E2D70E04AE050E021E00E945F
:10C9D000054C812F6E2D49E02B2D3A2D01E00E9450
:10C9E0008A4CE091132FF091142FEE5BFF4F808162
:10C9F000E254F0408093F32281AD8093F2221092B2
:10CA000016242B2D3A2DC9016C017E2C812E80918C
:10CA1000342F9091352F892B19F0FF24F3942CC0DB
:10CA20008AE08983ADB7BEB717970FB6F894BEBF3B
:10CA30000FBEADBFEDB7FEB731968FE611968C9362
:10CA400082E0818381E082835382448281E090E0AE
:10CA5000968385830E94268F8CE291E09093352FF8
:10CA60008093342FFF24F394EDB7FEB737960FB6BB
:10CA7000F894FEBF0FBEEDBF8091322F9091332FFF
:10CA8000892B39F48F2D0E94D75D81E080939C2300
:10CA9000FF2480E20E943B84882309F499CB2E96E0
:10CAA0000FB6F894DEBF0FBECDBFCF91DF911F91BF
:10CAB0000F91FF90EF90DF90CF90BF90AF909F903D
:10CAC0008F907F906F905F904F9008956F927F92BC
:10CAD0008F929F92AF92BF92CF92DF92EF92FF928E
:10CAE0000F931F93DF93CF930F92CDB7DEB7898358
:10CAF00083E5809389231092162412E333E7632E93
:10CB00007724739402E04E010894811C911C21E06B
:10CB1000A22EB12C9CE7C92ED12C84E1E82EF12C59
:10CB200032C08DB79EB70B970FB6F8949EBF0FBE5D
:10CB30008DBFEDB7FEB73196ADB7BEB711966C920B
:10CB40007182028394828382B682A5828091B22E02
:10CB50009091B32E90878783D286C1860E94268FBC
:10CB6000F092332FE092322F8DB79EB70B960FB60F
:10CB7000F8949EBF0FBE8DBF8091322F9091332FBE
:10CB8000892BD1F7115080911624882319F4112391
:10CB900041F60AC0112341F00E948B8EE0911824C7
:10CBA000F0911924808117C08EE790E00E94F05523
:10CBB000AC0180E062E020E00E949D4484E690E0C9
:10CBC0009093332F8093322F8091322F9091332F77
:10CBD000892BD1F78FEF898389810F90CF91DF91D6
:10CBE0001F910F91FF90EF90DF90CF90BF90AF908B
:10CBF0009F908F907F906F9008959F92AF92BF9279
:10CC0000CF92DF92EF92FF920F931F93DF93CF9318
:10CC10000F92CDB7DEB7898381E580938923109287
:10CC2000162412E361E7962E01E05E010894A11C30
:10CC3000B11C51E0C52ED12C44E1E42EF12C2AC0C8
:10CC40008DB79EB707970FB6F8949EBF0FBE8DBFE6
:10CC5000EDB7FEB73196ADB7BEB711969C92018382
:10CC60000283B482A382D682C5820E94268FF0926C
:10CC7000332FE092322F8DB79EB707960FB6F894F8
:10CC80009EBF0FBE8DBF8091322F9091332F892B85
:10CC9000D1F7115080911624882319F4112381F6BD
:10CCA0000FC0112369F00E948B8EE0911824F0913F
:10CCB000192481918983F093B32EE093B22E18C08A
:10CCC0008EE790E00E94F055AC0180E062E020E049
:10CCD0000E949D4484E690E09093332F8093322FFE
:10CCE0008091322F9091332F892BD1F78FEF898349
:10CCF00089810F90CF91DF911F910F91FF90EF905D
:10CD0000DF90CF90BF90AF909F9008950F930E94B7
:10CD10008C408FE890E00E94F055AC0180E060E02C
:10CD200022E00E949D4481E090E00E94F055AC0119
:10CD300080E067E020E00E949D4481E01FC0809178
:10CD4000A1230E94FD65482F8F3FC1F16091A1236F
:10CD500083E050E021E030E000E00E944A49609129
:10CD6000A1234091B22E5091B32E41595F4F85E0DF
:10CD700020E00E9433448091A1238F5F8093A12300
:10CD80008091A1238630D8F287E890E00E94F05588
:10CD9000AC0183E066E020E00E949D448FEF0E949A
:10CDA000FD65282F8F3F51F081E066E041E00E9451
:10CDB00038538093A1238091A12301C08FEF0F915D
:10CDC00008950F931F93CF93DF9300E0CCE3D0E05F
:10CDD0001FE00E948C408EE890E00E94F055AC016C
:10CDE00080E067E022E00E949D4481E090E00E94A4
:10CDF000F055AC0180E067E020E00E949D44109275
:10CE0000152F80919D23882339F081E061E043EF65
:10CE10005DE320E00E9464441092152F38C0E62F95
:10CE2000F0E080919D239F01280F311D2E303105A8
:10CE3000CCF420919D238091FC286F5FE20FF11DBF
:10CE4000EC9FA001ED9F500DFC9F500D1124819F80
:10CE5000C0011124480F591F475B5D4E83E020E05D
:10CE60000E9464448091152F853061F480919D2348
:10CE700090E008973CF481E066E041EF5DE320E05C
:10CE80000E9464448091152F8F5F8093152F6091CD
:10CE9000152F663020F280919E23882399F480918B
:10CEA0009D23882331F44091F42281E065E020E065
:10CEB00005C04091F42282E065E021E001E00E949B
:10CEC000E552082F80919E238130A9F480919D2303
:10CED00090E008973CF04091F42282E066E021E087
:10CEE00000E006C04091F42282E065E021E001E02C
:10CEF0000E94E552082F0E3F51F480919D238F5FD1
:10CF000080939D2381E080939E2385E00AC00D3F9E
:10CF100059F480919D23815080939D2310929E23EC
:10CF200082E08093F42255CF0F3F29F00093F42242
:10CF300080919D23080F802FDF91CF911F910F913A
:10CF400008955F926F927F928F929F92AF92BF925D
:10CF5000CF92DF92EF92FF920F931F93DF93CF93C5
:10CF6000CDB7DEB764970FB6F894DEBF0FBECDBF66
:10CF7000DD2440E0282F30E021503040BE016F5FBB
:10CF80007F4F15C0E42FF0E053E0EE0FFF1F5A95DE
:10CF9000E1F7E754F74CE4918E2F90E08217930766
:10CFA00029F4FB01ED0DF11D4083D3944F5F463909
:10CFB00048F34093152F10E0ED2CFF245E010894F8
:10CFC000A11CB11C2CE3522E9FE0C92E612C81E0E4
:10CFD000782E47010894810891080E948C408DE8C2
:10CFE00090E00E94F055AC0180E060E022E00E94F9
:10CFF0009D4481E090E00E94F055AC0180E067E044
:10D0000020E00E949D441092152F80919F23882339
:10D0100039F081E061E048E25EE320E00E94644490
:10D020001092152FA5C1E62FF0E080919F239F015C
:10D03000280F311D2E153F050CF083C120919F2331
:10D040008091FC286F5FEA0DFB1DE20FF11D40810E
:10D05000459DA00111248C9DC0011124480F591F2A
:10D060004F565A4E83E020E00E9464446091152F91
:10D07000262F30E080919F23D501A20FB31FFD0121
:10D08000E80FF11DE081F0E003E0EE0FFF1F0A95CD
:10D09000E1F7E654F74C8491882379F480919F233B
:10D0A000A80FB11DEC91F0E073E0EE0FFF1F7A9531
:10D0B000E1F7E354F74CE491ACC0813049F580913D
:10D0C0009F23A80FB11DEC91F0E053E0EE0FFF1F7E
:10D0D0005A95E1F7E354F74CE491A091B22EB09148
:10D0E000B32EAE0FB11D0C916F5F083F08F45FC007
:10D0F00082E145E25EE320E00E9464446091152FE6
:10D100006F5FA301401B510984E121E030E016C1AB
:10D11000823081F580919F23FD01E80FF11DE081B0
:10D12000F0E043E0EE0FFF1F4A95E1F7E354F74CC0
:10D13000249180919F23A80FB11DEC91F0E033E082
:10D14000EE0FFF1F3A95E1F7E454F74C9491E0910C
:10D15000B22EF091B32EE20FF11D808198236F5F04
:10D16000992321F082E141E25EE3CEC082E14DE10C
:10D170005EE3CAC08330D1F580919F23F501E80FAB
:10D18000F11DE20FF31FE081F0E023E0EE0FFF1F3F
:10D190002A95E1F7E354F74CE491A091B22EB091B7
:10D1A000B32EAE0FB11D0C910D3020F46F5F82E1F4
:10D1B000402FC1C0093190F46F5F82E14BE15EE323
:10D1C00020E00E9464446091152F6F5F402F50E073
:10D1D0004C50504083E122E030E0B0C0093109F00A
:10D1E000B0C06F5F82E147E15EE38EC08430D1F46E
:10D1F00080919F23F501E80FF11DE20FF31FE081FD
:10D20000F0E093E0EE0FFF1F9A95E1F7E354F74C3F
:10D21000E4916F5FA091B22EB091B32EAE0FB11D0D
:10D220004C9188C08530F1F480919F23F501E80F7F
:10D23000F11DE20FF31FE081F0E083E0EE0FFF1F2E
:10D240008A95E1F7E354F74CE4916F5FA091B22E19
:10D25000B091B32EAE0FB11D4C914C9DA001112485
:10D2600082E16AC0863009F06CC02091B22E309104
:10D27000B32E80919F23FD01E80FF11DE081F0E0C6
:10D2800003E0EE0FFF1F0A95E1F7E354F74CE4913A
:10D29000C9018E0F911DFC01E081EE2329F46F5F1F
:10D2A00082E143E15EE330C0E13029F46F5F82E167
:10D2B0004FE05EE329C0E23029F46F5F82E14BE08A
:10D2C0005EE322C0E33029F46F5F82E147E05EE372
:10D2D0001BC0E43029F46F5F82E143E05EE314C0D9
:10D2E000E53029F46F5F82E14FEF5DE30DC0E6307A
:10D2F00029F46F5F82E14BEF5DE306C06F5FE730BB
:10D3000039F482E147EF5DE320E00E94644419C0F4
:10D3100080919F23A80FB11DEC91F0E073E0EE0F18
:10D32000FF1F7A95E1F7E354F74CE4912E0F311D7E
:10D33000F901408182E150E023E030E000E00E940A
:10D340004A498091152F853071F480919F2390E098
:10D350000596881599053CF481E066E045EF5DE3AC
:10D3600020E00E9464448091152F8F5F8093152FD9
:10D370006091152F663008F456CE8091A023882343
:10D38000E9F480919F23882381F4F6E0FD1530F4C1
:10D390004091F52281E065E020E00CC04091F5224B
:10D3A00081E06D2D20E000E006C04091F52282E092
:10D3B00065E021E001E00E94E552182F8091A02352
:10D3C0008130B9F480919F2390E006968E159F05D9
:10D3D0003CF04091F52282E066E021E000E006C0EA
:10D3E0004091F52282E065E021E001E00E94E552F3
:10D3F000182F1E3F51F480919F238F5F80939F23AE
:10D4000081E08093A02385E00AC01D3F59F48091FC
:10D410009F23815080939F231092A02382E08093CA
:10D42000F522DBCD1F3F59F01093F522E0919F23A9
:10D43000F0E03197E10FF11DEC0FFD1F1181812FFD
:10D4400064960FB6F894DEBF0FBECDBFCF91DF91CB
:10D450001F910F91FF90EF90DF90CF90BF90AF9012
:10D460009F908F907F906F905F9008952F923F9242
:10D470004F925F926F927F928F929F92AF92BF92E4
:10D48000CF92DF92EF92FF920F931F93DF93CF9390
:10D4900000D00F92CDB7DEB7082F0E948C40C02E6F
:10D4A000DD247601A3E0EE0CFF1CAA95E1F7F7015D
:10D4B000E654F74C14918CE890E00E94F055AC01D2
:10D4C00080E060E022E00E949D4481E090E00E94C4
:10D4D000F055AC0180E067E020E00E949D441630EA
:10D4E00009F490C32091FC288CE390E0C89EA00131
:10D4F000C99E500DD89E500D11248FE0289F900199
:10D500001124420F531F4F565A4E80E062E020E034
:10D510000E946444112309F0DAC084E064E049E920
:10D520005EE320E00E9464448CE066E044E95EE350
:10D5300020E00E94644482E090E00E94F055AC013B
:10D5400080E067E020E00E949D446701F701E55418
:10D55000F74C14912CEB38E3E20EF31EF701E49044
:10D56000C6010496E9EB8E2EE8E39E2E880E991EE6
:10D57000F4012491E091B22EF091B32EE20FF11D4F
:10D5800060802091A123820F911D8754974CFC014C
:10D59000749085E064E0412F50E023E030E000E04B
:10D5A0000E944A4989E064E04E2D50E023E030E0DB
:10D5B0000E944A4981E164E0472D50E023E030E0D9
:10D5C0000E944A49F62CCE2CDD24A12EBB2480E0FB
:10D5D00064E04F2D50E023E030E000E00E944A4933
:10D5E0004F2C5524C2019695982F8827979587959B
:10D5F000B6010E944394462F80E068E226E001E0F5
:10D600000E940A43F1E3FE15A8F480E40E943B84E3
:10D61000182F80E463E00E949484182B21F04C14AE
:10D620005D040CF4F39480E80E943B84182F80E89A
:10D6300063E014C080E40E943B84182F80E462E021
:10D640000E949484182B21F04C145D040CF4F39484
:10D6500080E80E943B84182F80E862E00E94948456
:10D66000182BB1F08F2D90E0A816B9068CF4019715
:10D670009695982F882797958795B6010E94439491
:10D68000862F68E240E826E000E00E940A43FA9410
:10D6900080E20E945684882341F080E068E240E8FE
:10D6A00026E000E00E940A43F72C80E10E944584B6
:10D6B000882331F0F61409F4CEC3F401849193C2A7
:10D6C00080E20E944584882309F481CFC4C31130CD
:10D6D00009F017C184E064E042E85EE320E00E94C4
:10D6E00064448CE066E04DE75EE320E00E94644421
:10D6F00082E090E00E94F055AC0180E067E020E01D
:10D700000E949D4453E0CC0CDD1C5A95E1F7F601D4
:10D71000E554F74C94902CEB38E3E20EF31EF7013E
:10D720001491C601049639EB632E38E3732E680E0C
:10D73000791EF3012491E091B22EF091B32EE20F05
:10D74000F11D50802091A123820F911D8754974C89
:10D75000FC01C490F7EFFC1580F481E164E048E738
:10D760005EE320E00E94644440E051E04C1951091E
:10D7700083E164E021E030E006C081E164E04C2D0B
:10D7800050E023E030E000E00E944A49D52CA12E71
:10D79000BB24892C99242FEF222E312C2D2D30E003
:10D7A0003B832A8337EF3D1508F0F1C380E064E046
:10D7B00045E75EE320E00E946444E12C91E0F92E0D
:10D7C0008A819B81E81AF90A82E064E0A70121E0DE
:10D7D00030E000E00E944A4984E0EE0CFF1C8A958C
:10D7E000E1F780E068E24E2D26E001E00E940A4366
:10D7F00080E40E943B84182F80E461E00E949484BE
:10D80000182BA1F539C0EA81FB81EA15FB056CF400
:10D81000D394F8EFDF1649F480E068E240E826E0B0
:10D8200000E00E940A43DD24DA9480E80E943B84F1
:10D83000182F80E863E00E949484182BE1F18D2D6D
:10D8400090E088169906BCF501979695982F882741
:10D8500097958795B5010E944394862F68E240E82A
:10D8600026E000E00E940A43DA9425C02A813B8129
:10D87000283F310509F0DA9480E80E943B84182F94
:10D8800080E861E00E949484182BA9F0C1018D19F1
:10D8900091098295807F68E240E826E000E00E94DE
:10D8A0000A43D39441F480E068E240E826E00E9415
:10D8B0000A4317EFD12E80E20E945684882341F05C
:10D8C00080E068E240E826E000E00E940A43DC2CA9
:10D8D00080E10E944584882369F0D51409F4BBC215
:10D8E000F3018491E091B22EF091B32EE80FF11D77
:10D8F000D082A7C280E20E944584882309F44ECFDB
:10D90000AAC2123009F09AC08EE690E00E94F0554B
:10D91000AC0183E064E020E00E949D448FE690E04B
:10D920000E94F055AC0183E065E020E00E949D4438
:10D9300081E090E00E94F055AC0180E067E020E0DB
:10D940000E949D442CEB38E3E20EF31EF701049194
:10D95000C601B3E0880F991FBA95E1F70496A9EBC9
:10D96000CA2EA8E3DA2EC80ED91EF6012491E09142
:10D97000B22EF091B32EE20FF11DE0802091A12391
:10D98000820F911D8754974CFC014491413029F43A
:10D9900088E064E043E75EE306C0442339F488E0AE
:10D9A00065E041E75EE320E00E9464441E2DF12E15
:10D9B000F02261F081E064E04FE65EE320E00E9447
:10D9C000644481E065E04DE65EE30BC081E064E025
:10D9D0004BE65EE320E00E94644481E065E049E6B6
:10D9E0005EE320E00E94644480E80E943B84882338
:10D9F00019F0FF2009F4102780E40E943B8488235B
:10DA000021F0812F802309F0102780E10E943B84C0
:10DA1000882369F01E1509F41EC2F6018491E09175
:10DA2000B22EF091B32EE80FF11D10830AC280E2EE
:10DA30000E944584882309F4BACF0DC2133009F03F
:10DA4000E1C084E064E047E55EE320E00E946444D6
:10DA50008CE066E042E55EE320E00E94644482E000
:10DA600090E00E94F055AC0180E067E020E00E9469
:10DA70009D44F3E0CC0CDD1CFA95E1F7F601E5548A
:10DA8000F74C14912CEB38E3E20EF31EF7014490AF
:10DA9000C601049679EBA72E78E3B72EA80EB91E1F
:10DAA000F5012491E091B22EF091B32EE20FF11D19
:10DAB00050802091A123820F911D8754974CFC0127
:10DAC000E49081E164E04E2D50E023E030E000E09E
:10DAD0000E944A49F52CC42CDD2464EF662E6FEFBA
:10DAE000762E6C0C7D1C812E99242F2C3324261429
:10DAF00037043CF480E064E04F2D50E023E030E058
:10DB000011C02C143D048CF480E064E040E55EE339
:10DB100020E00E946444A1014C50504081E064E048
:10DB200022E030E000E00E944A49F41439F480E039
:10DB300064E04CE45EE320E00E946444C1019695F9
:10DB4000982F882797958795B6010E944394462F72
:10DB500080E068E226E001E00E940A4380E40E943F
:10DB60003B84182F80E462E00E949484182B21F0FB
:10DB70002C143D040CF4F39480E80E943B84182F8D
:10DB800080E862E00E949484182BB1F08F2D90E021
:10DB9000881699068CF401979695982F8827979563
:10DBA0008795B6010E944394862F68E240E826E0FC
:10DBB00000E00E940A43FA9480E20E94568488237F
:10DBC00041F080E068E240E826E000E00E940A437D
:10DBD000FE2C80E10E944584882369F0F51409F445
:10DBE0003AC1F5018491E091B22EF091B32EE80F85
:10DBF000F11DF08226C180E20E944584882309F449
:10DC000074CF29C1143009F0A9C080E067E046E371
:10DC10005EE320E00E946444F02FFD55F983F2306A
:10DC200050F48EE190E00E94F055AC0185E066E092
:10DC300020E00E949D44402E552433E0440C551CA6
:10DC40003A95E1F72DEB38E3420E531EF201849131
:10DC5000E091B22EF091B32EE80FF11DE0800E2D71
:10DC6000FF2428E0722E97E0892E912C81E0A82EC7
:10DC7000B12C1092152FC02EDD241CC0C601022E1F
:10DC800002C0959587950A94E2F780FF06C0872D1C
:10DC9000821B64E044E35EE305C0872D821B64E0E1
:10DCA00042E35EE320E00E9464448091152F8F5F81
:10DCB0008093152F2091152F283000F31F2D1F5F03
:10DCC000812F65E040E35EE320E00E94644480E849
:10DCD0000E943B84882311F41F2D0AC0812F65E028
:10DCE0004EE25EE320E00E946444183009F410E044
:10DCF000F981F23050F480E40E945684882329F0A0
:10DD0000002311F40AEA01C000E080E40E94458487
:10DD1000882351F0C401811B9109950102C0220F93
:10DD2000331F8A95E2F7022780E10E944584882309
:10DD300069F00E1509F48FC0F2018491E091B22EC2
:10DD4000F091B32EE80FF11D00837BC080E20E94AA
:10DD50004584882309F07FC0F12E8BCF153009F060
:10DD60007EC082E090E00E94F055AC0180E067E068
:10DD700020E00E949D44802E992403E0880C991C89
:10DD80000A95E1F72DEB38E3820E931EF40184919E
:10DD9000E091B22EF091B32EE80FF11DB08086E62F
:10DDA00090E063E270E040E150E021E00E94054C29
:10DDB000FB2C1FE0A12E0AC0FE1439F086E663E2B8
:10DDC0004FE0960100E00E948A4CFE2CFA9C600114
:10DDD000112486E663E24FE0960101E00E948A4C3E
:10DDE00080E40E943B84182F80E461E00E949484C8
:10DDF000182B11F4EF2C06C0EF2CE394F8E1EF168A
:10DE000009F4EE2480E80E943B84182F80E861E04A
:10DE10000E949484182B29F0EE2011F4B8E1EB2E27
:10DE2000EA9480E10E944584882379F0EB1499F00C
:10DE3000F4018491E091B22EF091B32EE80FF11D20
:10DE4000E08281E08093A22306C080E20E944584A4
:10DE5000882309F4B1CF80EF0E943B84BEC0163006
:10DE600009F0BBC0802E9924A3E0880C991CAA95C8
:10DE7000E1F72DEB38E3820E931E81E090E00E94E3
:10DE8000F055AC0180E067E020E00E949D44BB2497
:10DE90005524AA24A39409C0BB2039F081E061E095
:10DEA0004CE25EE320E00E946444EB2CFF248701F7
:10DEB000F4E0000F111FFA95E1F70E0D1F1D075931
:10DEC000124C2224332437016101CE0CDF1C38E0D0
:10DED000C316D1043CF4622D6F5F83E0A80120E0FB
:10DEE0000E94644485E0281659F497E0C916D104CD
:10DEF0003CF481E066E04AE25EE320E00E94644494
:10DF00000894211C311C0F5E1F4FE6E02E163104D1
:10DF1000D9F6552039F4BB2079F481E065E04A2D2B
:10DF200020E00EC0F2E06F16710434F082E066E08B
:10DF30004A2D21E000E005C082E065E04A2D21E0A5
:10DF400001E00E947D53982F8E3F31F4B394552405
:10DF50005394E5E0AE2EA0CF8D3F29F4BA9455241A
:10DF600072E0A72E99CF8C3FC1F1893008F094CF91
:10DF7000F4018491E091B22EF091B32EE80FF11DDF
:10DF8000B90EBA94B08281E08093A22326C080E0CB
:10DF900064E04D2D50E023E030E000E00E944A496B
:10DFA0008A819B819695982F882797958795B501AB
:10DFB0000E944394462F80E068E226E001E00E9440
:10DFC0000A4380E40E943B84182F80E463E00E94AF
:10DFD0009484182B09F017CC28CC0F900F900F9039
:10DFE000CF91DF911F910F91FF90EF90DF90CF9035
:10DFF000BF90AF909F908F907F906F905F904F9069
:10E000003F902F900895FF920F931F930E948C4092
:10E0100087E890E00E94F055AC0180E061E020E0EC
:10E020000E949D4488E890E00E94F055AC0180E099
:10E0300063E020E00E949D4489E890E00E94F05552
:10E04000AC0180E067E020E00E949D4413E0B5E071
:10E05000FB2E85E063E0412F50E021E030E000E05E
:10E060000E944A498EE063E04F2D50E021E030E00D
:10E070000E944A4980E80E943B84882321F01F5F68
:10E08000163009F411E080E40E943B84882331F0CB
:10E09000F39486E0F81611F4FF24F39480E10E94D3
:10E0A0003B84882309F470C080E065E041EC5EE3C6
:10E0B00020E00E9464448AE890E00E94F055AC01A0
:10E0C00080E065E020E00E949D4484E090E00E94B2
:10E0D000F055AC018CE067E020E00E949D4480E1B7
:10E0E0000E943B848823C1F1812F0E94FD65811726
:10E0F000B9F48F2D0E9466658F1591F480E065E07C
:10E100004BEA5EE320E00E9464448BE890E00E94CA
:10E11000F055AC0180E065E020E00E949D440FC016
:10E120008DE190E00E94F055AC0180E065E020E0D8
:10E130000E949D4486E065E04EE00E94B74484E67C
:10E1400090E09093332F8093322F8091322F9091D3
:10E15000332F892BD1F721C080E20E943B84882392
:10E1600009F4BDCF80EF0E943B8480E065E045E18B
:10E170000E94B74489E890E00E94F055AC0180E02D
:10E1800067E020E00E949D4480E20E943B84882357
:10E1900009F45FCF80EF0E943B841F910F91FF90A5
:10E1A00008950F931F930E94A3900E948666809308
:10E1B000A1238091A1238F3F09F424C18091A12341
:10E1C000863019F40E9403701DC10E948C4081E8C2
:10E1D00090E00E94F055AC0180E060E022E00E94F7
:10E1E0009D444091A123405D89E060E022E00E94CF
:10E1F000494382E890E00E94F055AC0183E062E080
:10E2000020E00E949D4483E890E00E94F055AC011C
:10E2100083E063E020E00E949D4481E090E00E9462
:10E22000F055AC0180E067E020E00E949D4482E070
:10E2300063E042E020E000E00E94E5528F3F09F4F5
:10E24000E1C0833009F03CC08091A1230E94FD65AC
:10E250008091A1230E9466659091A123891791F472
:10E2600080E062E045E10E94B74480E063E045E180
:10E270000E94B74484E890E00E94F055AC018BE026
:10E2800060E011C080E062E045E10E94B74480E0B8
:10E2900063E045E10E94B7448DE190E00E94F055B3
:10E2A000AC0180E064E020E00E949D4480E29EE4B6
:10E2B00024EF31E0F9013197F1F70197D9F7A2C0C6
:10E2C0008091A1238F3F09F49DC08091A1230E94DA
:10E2D000FD658F3F09F496C010929D2310929E23F6
:10E2E00081E08093F4221092A22311E00E94E16663
:10E2F000082F8F3F71F010929F231092A02310934C
:10E30000F522802F0E94A1678F3F81F30E94366A19
:10E31000F8CF8091A223813009F074C00E948C4014
:10E3200085E890E00E94F055AC0180E060E022E0DA
:10E330000E949D444091A123405D89E060E022E07D
:10E340000E9449434091A12389E060E050E021E030
:10E3500030E000E00E944A498EE690E00E94F055CD
:10E36000AC0183E062E020E00E949D448FE690E0F3
:10E370000E94F055AC0183E063E020E00E949D44E0
:10E3800081E090E00E94F055AC0180E067E020E081
:10E390000E949D4482E063E042E020E00E94E5525A
:10E3A000823081F58091A1230E9466659091A1231E
:10E3B000891791F486E890E00E94F055AC0183E063
:10E3C00064E020E00E949D4484E890E00E94F055C3
:10E3D000AC0183E065E007C08DE190E00E94F0555C
:10E3E000AC0180E064E020E00E949D4484E690E07F
:10E3F0009093332F8093322F8091322F9091332F2F
:10E40000892BD1F71F910F9108952F923F924F9230
:10E410005F926F927F928F929F92AF92BF92CF92B4
:10E42000DF92EF92FF920F931F93DF93CF93CDB7BD
:10E43000DEB728970FB6F894DEBF0FBECDBF84EDD0
:10E4400091E090938900809388000E948C408DED2C
:10E450009EE362E00E943C4487E065E04BED5EE3B2
:10E4600020E00E94644480E165E048ED5EE320E046
:10E470000E94644483E090E00E94F055AC0180E08B
:10E4800067E020E00E949D4482E167E044ED5EE3A6
:10E4900020E00E94644483E067E148E728E001E06F
:10E4A0000E94D64487E167E147E12FE10E942D42B7
:10E4B0008BE267E14BE22FE10E942D428DE367E1A1
:10E4C00043E028E00E940A4383E567E143E52FE14A
:10E4D0000E942D4287E667E147E62FE10E942D4228
:10E4E00084E065E040E050E023E030E000E00E949E
:10E4F0004A498CE065E046E950E023E030E00E94C4
:10E50000534716E946E9442E512C38EC632E712C02
:10E5100020E8222E312C80E40E943B84882331F4B1
:10E5200080E463E00E9494848823E1F1113ED0F5F9
:10E530001639F8F4B201611B7109882777FD8095BF
:10E54000982F0E942F922DEC3CEC4CE45FEB0E9444
:10E550001C9320E030E04CE752E40E9429910E9495
:10E560000192DC01CB0168E141E026E000E00E947D
:10E570000A431F5F1B3469F0143659F01D3749F008
:10E58000163939F01F3A29F0183C19F0113E09F0FC
:10E5900080C07092B6236092B5233092FB22209205
:10E5A000FA2277C080E80E943B84882339F480E80F
:10E5B00063E00E949484882309F44DC01C3408F45D
:10E5C0004AC0173958F1612F70E0665970408827AA
:10E5D00077FD8095982F0E942F922DEC3CEC4CE417
:10E5E0005FE30E941C935B016C0120E030E04CE78C
:10E5F00052E40E9429910E9401926D837E838F8351
:10E600009887C601B5010E9401929B01AC018D81E2
:10E6100068E1422F26E000E00E940A43412F41506A
:10E620004B3461F0443651F04D3741F0463931F00A
:10E630004F3A21F0483C11F0413E41F47092B6232C
:10E640006092B5233092FB222092FA22142F4B3491
:10E6500000F51BE44AC080E10E943B84882309F452
:10E66000CAC084E068E146E726E000E00E940A4371
:10E670008DE367E143E028E001E00E940A437092E5
:10E68000B6236092B5233092FB222092FA2216E93B
:10E6900002C0163950F1E12EFF248AE69FEFE80E02
:10E6A000F91EB701882777FD8095982F0E942F9239
:10E6B0002DEC3CEC4CE45FE30E941C930E94019221
:10E6C0009B01AC018FE368E1422F26E001E00E944C
:10E6D0000A43EE0CFF1C84E065E0A70123E030E074
:10E6E00000E00E944A498EE33EC04201811A91082F
:10E6F000B401882777FD8095982F0E942F92698317
:10E700007A838B839C832DEC3CEC4CE45FEB0E9482
:10E710001C9320E030E04CE752E40E9429910E94D3
:10E7200001925B016C0169817A818B819C812DEC66
:10E730003CEC4CE45FE30E941C930E9401929B011D
:10E74000AC018A2D68E1422F26E001E00E940A43D5
:10E75000880C991C84E065E0A40123E030E000E02F
:10E760000E944A498DE367E142E028E001E00E940F
:10E770000A438CE065E0412F50E023E030E000E008
:10E780000E94534783E067E143E02FE101E00E94EC
:10E790002D4287E167E147E12FE10E942D428BE2A4
:10E7A00067E14BE22FE10E942D4283E567E143E5FB
:10E7B0002FE10E942D4287E667E147E62FE10E94A4
:10E7C0002D428BE767E14BE72FE10E942D42612F3D
:10E7D00070E0882777FD8095982F0E942F9220E087
:10E7E00030E048E450E40E941C930E940192709330
:10E7F00089006093880080E20E943B84882309F4AA
:10E800008ACE80EF0E943B8428960FB6F894DEBF34
:10E810000FBECDBFCF91DF911F910F91FF90EF9071
:10E82000DF90CF90BF90AF909F908F907F906F9030
:10E830005F904F903F902F9008950E948C4080E011
:10E8400063E04AED58E422E00E94644480E064E022
:10E8500045EC58E422E00E94644480E197E224EF12
:10E8600031E0F9013197F1F70197D9F708951F9336
:10E87000182F80932F2F0E948C4084E790E00E94F5
:10E88000F055AC0180E062E020E00E949D4411233D
:10E8900019F0113069F405C08FE062E04BE058E4F4
:10E8A00004C08FE062E046E058E420E00E94644447
:10E8B00082E090E00E94F055AC0180E067E020E04B
:10E8C0000E949D4480E40E943B84882351F01123E0
:10E8D00041F48FE062E041E058E420E00E946444AB
:10E8E00011E080E80E943B84882351F0113041F40C
:10E8F0008FE062E04CEF57E420E00E94644410E0B7
:10E9000080E10E943B84882321F081E08093A3234F
:10E910000CC080E20E943B848823A1F280EF0E9419
:10E920003B841092A32310912F2F1093BF28812F87
:10E930001F910895EF92FF920F931F93082FE62ED9
:10E94000F42E122F80932F2F0E948C40812F90E065
:10E950000E94F055AC0180E062E020E00E949D44FE
:10E96000013051F0013028F0023049F00330A1F4B9
:10E9700009C088E590E008C089E590E005C08AE517
:10E9800090E002C08BE590E00E94F055AC018AE077
:10E9900062E020E00E949D4482E090E00E94F055F9
:10E9A000AC0180E067E020E00E949D4411E080E43B
:10E9B0000E943B84882309F10F15F8F41093A323D8
:10E9C0000F5F013051F0013028F0023049F0033080
:10E9D000A1F409C088E590E008C089E590E005C091
:10E9E0008AE590E002C08BE590E00E94F055AC0112
:10E9F0008AE062E020E00E949D4480E80E943B841F
:10EA0000882309F1E016F8F41093A3230150013094
:10EA100051F0013028F0023049F00330A1F409C070
:10EA200088E590E008C089E590E005C08AE590E0BF
:10EA300002C08BE590E00E94F055AC018AE062E0F4
:10EA400020E00E949D4480E10E943B84882369F479
:10EA500080E20E943B84882309F4A9CF80EF0E94C2
:10EA60003B841092A32300912F2F802F1F910F9191
:10EA7000FF90EF9008950F931F93082F122F80930C
:10EA80002F2F0E948C40812F90E00E94F055AC0106
:10EA900080E062E020E00E949D44002319F00130F4
:10EAA00071F403C08FE690E002C08EE690E00E9411
:10EAB000F055AC0181E162E020E00E949D4482E0DB
:10EAC00090E00E94F055AC0180E067E020E00E94F9
:10EAD0009D4411E080E40E943B84882379F0002368
:10EAE00069F41093A3238EE690E00E94F055AC01E8
:10EAF00081E162E020E00E949D4401E080E80E9404
:10EB00003B84882379F0013069F40093A3238FE6D6
:10EB100090E00E94F055AC0181E162E020E00E94AB
:10EB20009D4400E080E10E943B84882361F480E200
:10EB30000E943B84882371F280EF0E943B841092F4
:10EB4000A32300912F2F802F1F910F9108950F93D2
:10EB50001F93082F122F80932F2F0E948C40812FFC
:10EB600090E00E94F055AC0180E062E020E00E945D
:10EB70009D44002319F0013071F403C08BE290E052
:10EB800002C08AE290E00E94F055AC0181E162E0AF
:10EB900020E00E949D4482E090E00E94F055AC018C
:10EBA00080E067E020E00E949D4411E080E40E9444
:10EBB0003B84882379F0002369F41093A3238AE22D
:10EBC00090E00E94F055AC0181E162E020E00E94FB
:10EBD0009D4401E080E80E943B84882379F0013065
:10EBE00069F40093A3238BE290E00E94F055AC01FE
:10EBF00081E162E020E00E949D4400E080E10E940B
:10EC00003B84882361F480E20E943B84882371F274
:10EC100080EF0E943B841092A32300912F2F802F1E
:10EC20001F910F9108950F931F93182F80932F2FEB
:10EC30000E948C4088E690E00E94F055AC0180E094
:10EC400062E020E00E949D44112319F0113071F41C
:10EC500003C082E590E002C083E590E00E94F05599
:10EC6000AC018FE062E020E00E949D4482E090E0F1
:10EC70000E94F055AC0180E067E020E00E949D44D6
:10EC800001E080E40E943B84882379F0112369F439
:10EC90000093A32383E590E00E94F055AC018FE040
:10ECA00062E020E00E949D4411E080E80E943B84E5
:10ECB000882379F0113069F41093A32382E590E062
:10ECC0000E94F055AC018FE062E020E00E949D447C
:10ECD00010E080E10E943B84882361F480E20E947E
:10ECE0003B84882371F280EF0E943B841092A3231F
:10ECF00010912F2F812F1F910F910895DF92EF9286
:10ED0000FF920F931F93F82ED62EE42E122F0E94FF
:10ED10008C40812F90E00E94F055AC0180E062E0D1
:10ED200020E00E949D44F0922F2F80E162E04F2D61
:10ED300050E023E030E000E00E944A4982E090E0A9
:10ED40000E94F055AC0180E067E020E00E949D4405
:10ED500011E080E40E943B84882331F480E462E087
:10ED60000E949484882371F0FE1460F41093A3230E
:10ED7000F39480E162E04F2D50E023E030E000E0CA
:10ED80000E944A4980E80E943B84882331F480E84D
:10ED900062E00E949484882371F0DF1460F4109381
:10EDA000A323FA9480E162E04F2D50E023E030E0AD
:10EDB00000E00E944A4980E10E943B84882361F47C
:10EDC00080E20E943B84882321F280EF0E943B84F2
:10EDD0001092A323F0902F2F8F2D1F910F91FF9052
:10EDE000EF90DF900895CF92DF92EF92FF920F9312
:10EDF0001F93CF93DF93EC016B017A010E948C404B
:10EE000085E790E00E94F055AC0180E062E020E0F0
:10EE10000E949D4487E790E00E94F055AC0180E09D
:10EE200065E020E00E949D4488E790E00E94F05554
:10EE3000AC0180E066E020E00E949D44D093172F53
:10EE4000C093162F80E162E0AE0124E030E000E0E4
:10EE50000E944A4982E090E00E94F055AC0180E0B7
:10EE600067E020E00E949D4486EF9FEFE80EF91EC8
:10EE700011E080E40E943B84882331F480E462E066
:10EE80000E949484882391F0CE15DF0578F41093C6
:10EE9000A3232A96D093C128C093C02880E162E0C2
:10EEA000AE0124E030E000E00E944A4980E80E9480
:10EEB0003B84882331F480E862E00E9494848823B4
:10EEC00091F0CC16DD0678F41093A3232A97D09303
:10EED000C128C093C02880E162E0AE0124E030E0A8
:10EEE00000E00E944A4980E10E943B84882339F572
:10EEF0000E94E14D409187235091882388E063E090
:10EF000020E030E000E00E94534783E063E047EFF9
:10EF100057E420E00E94644480E20E943B848823FE
:10EF200009F4A7CF80EF0E943B841092A323C091E5
:10EF3000162FD091172FD093C128C093C028CE018F
:10EF4000DF91CF911F910F91FF90EF90DF90CF90C5
:10EF500008956F927F928F929F92AF92BF92CF92BD
:10EF6000DF92EF92FF920F931F93CF93DF93109254
:10EF7000B52E1092A3230E948C40BB249924AA246E
:10EF8000A39438E4632E712C22E1822E01C0A02EBE
:10EF90000E948C4083E790E00E94F055AC0180E035
:10EFA00060E022E00E949D4481E090E00E94F055E4
:10EFB000AC0180E067E020E00E949D44BB2039F076
:10EFC00081E061E045EF57E420E00E946444CB2CEF
:10EFD000DD24C69C8001C79C100DD69C100D112409
:10EFE000C0E0D0E07E01EC0CFD1C82E0E816F104EC
:10EFF00084F44091FC28CE018F5F682F489DA001CA
:10F000001124400F511F4D59584B83E020E00E94BE
:10F010006444C53049F4EF2839F481E066E043EFF9
:10F0200057E420E00E9464442196085B1F4FC630DD
:10F03000D105C1F6992069F4BB2029F481E062E092
:10F040004A2D20E00AC082E065E04A2D21E001E07F
:10F0500005C082E066E04A2D21E000E00E94E55212
:10F06000082F8E3F31F4B3949924939495E0A92E00
:10F07000A5CF8D3F29F4BA94992482E0A82E9ECF83
:10F080008F3F39F48091A323813059F50E94BC3918
:10F0900028C090E08B0D911D8130910549F480913D
:10F0A000BF2860E041E00E9437748093BF2811C000
:10F0B000029709F06CCF8091C0289091C12860E040
:10F0C00070E04FE057E20E94F3769093C12880935E
:10F0D000C0288091A323813009F059CF0E94BC3908
:10F0E00056CFDF91CF911F910F91FF90EF90DF905E
:10F0F000CF90BF90AF909F908F907F906F9008952A
:10F100006F927F928F929F92AF92BF92CF92DF9237
:10F11000EF92FF920F931F93CF93DF93F82EE92E78
:10F12000D62EB42E89010E948C4080E060E0A801B8
:10F1300022E00E9464442F2D3E2DC901EC01B8E16C
:10F14000EB2EBFE2FB2E01E0DD0CD39414C0102F98
:10F150001F5F802F63E0488120E00E9449430E5FDB
:10F16000812F63E04DE758E420E00E9464448991D8
:10F17000F70181937F010D1551F783E066E14AE0C5
:10F180002AE001E00E94D64480E066E04EE658E4C2
:10F1900020E00E94644480E067E049E558E420E014
:10F1A0000E94644411E0FF24EE24E394A0E2CA2EFE
:10F1B000F9E37F2EEAE56E2E71E6A72E61E4962E26
:10F1C00050E3852E46E0D42EF1E0BF1609F078C05A
:10F1D000E1E2FFE29AE08081803219F090932E2FD5
:10F1E00004C0915031979923B1F780E40E943B8489
:10F1F000882331F480E462E00E949484882379F1CA
:10F20000AF2DB0E0FD01E85EF04D80818A3738F522
:10F210008F5F8083803208F4C082FD01E85EF04D8C
:10F22000808181528F3008F48082FD01E85EF04DCC
:10F2300080818A53873008F49082FD01E85EF04DAA
:10F2400080818B55863008F4A082A85EB04D812F56
:10F2500063E04C9120E00E944943E092A32380E8C0
:10F260000E943B84882339F480E862E00E94948401
:10F27000882309F45EC0AF2DB0E0FD01E85EF04DDB
:10F280008081813208F455C0815080838B5586304F
:10F2900008F46082FD01E85EF04D80818A5387307A
:10F2A00008F47082FD01E85EF04D808181528F305C
:10F2B00008F4C082A85EB04D812F63E04C9134C049
:10F2C00082E0B816B1F580E40E943B84882331F4D3
:10F2D00080E461E00E949484882381F0EF2DF0E0C7
:10F2E000E85EF04D4081493348F44F5F4083812F01
:10F2F00063E020E00E944943E092A32380E80E945B
:10F300003B84882331F480E861E00E949484882360
:10F3100081F0EF2DF0E0E85EF04D4081413348F0A0
:10F3200041504083812F63E020E00E944943E092F6
:10F33000A32380E20E945684882369F0EF2DF0E039
:10F34000E85EF04DC082812F63E040E220E00E9441
:10F350004943E092A32380E20E944584882379F107
:10F36000812F869590E00997A4F01D9DC00111247E
:10F37000835066E14AE02AE000E00E94D64483E040
:10F3800066E14AE02AE001E00E94D64411E0FF2451
:10F3900016C01D9DC0011124835066E14AE02AE099
:10F3A00000E00E94D6441E5F1D9DC00111248350C1
:10F3B00066E14AE02AE001E00E94D644F39480E14D
:10F3C0000E943B84882309F4FFCE80EF0E943B8497
:10F3D00081E0DF91CF911F910F91FF90EF90DF902F
:10F3E000CF90BF90AF909F908F907F906F90089537
:10F3F0002F923F924F925F926F927F928F929F9245
:10F40000AF92BF92CF92DF92EF92FF920F931F9332
:10F41000DF93CF93CDB7DEB764970FB6F894DEBF16
:10F420000FBECDBF1092B52E1092A3230E948C4028
:10F43000882455249924939408EE202E03E0302E3E
:10F440003E010894611C711C10E2412E01C09F2CEA
:10F450000E948C4080E790E00E94F055AC0180E073
:10F4600060E022E00E949D4481E090E00E94F0551F
:10F47000AC0180E067E020E00E949D44882039F0E4
:10F4800081E061E047E558E420E00E946444A82C54
:10F49000BB2488E490E0A89E7001A99EF00CB89E61
:10F4A000F00C112400E010E06801CA0CDB1C95E0B0
:10F4B000C916D10484F44091FC28602F6F5F82E16B
:10F4C000489FA00111244E0D5F1D45505A4B83E00B
:10F4D00020E00E946444053059F494E0C916D10438
:10F4E0003CF481E066E045E558E420E00E94644495
:10F4F0000F5F1F4F88E490E0E80EF91E06301105FB
:10F5000099F6552069F4882029F481E065E0492DB9
:10F5100020E00AC082E065E0492D21E001E005C05D
:10F5200082E066E0492D21E000E00E94E552F82EDD
:10F530009EEF891721F48394552453941CC08DEFBA
:10F54000F81619F48A94552416C09FEFF91609F499
:10F55000BBC01091A323113071F48091F5280E9453
:10F56000AF2F892B19F01093FA2802C01092FA28B5
:10F570000E94BC39A9C00F2D10E0080D111D0130EB
:10F58000110551F48091F52860E041E020E70E94E8
:10F590003B758093F52891C002301105E1F520E01C
:10F5A00030E0F301E20FF31FD901AD53B74D8C9159
:10F5B00080832F5F3F4F2A30310599F71B86C301A7
:10F5C0006AE041E02FE338E40E9480788091A32331
:10F5D000813009F04DC000E00CC0E02FF0E0DF0109
:10F5E000A85EB04D8C91ED53F74D80830E94BC39DD
:10F5F0000F5F10912E2F011780F31A3048F027CF9C
:10F60000E12FF0E0ED53F74D40820E94BC391F5FBF
:10F610001A30B0F31CCF0330110551F58091032946
:10F620008983809104298A83809105298B83809125
:10F6300006298C831D82C30164E042E029E238E49C
:10F640000E9480788091A323813091F400E010E043
:10F65000F801ED5FF64DD801A85EB04D8C91808326
:10F660000E94BC390F5F1F4F0430110589F7EFCEA0
:10F670000430110511F50E94AF2F019751F480E07D
:10F6800063E04EE158E420E00E9464440E94D638D2
:10F69000DECE80E063E040E158E420E00E94644474
:10F6A0001092FA283092B6232092B52380E490E09D
:10F6B0009093FB228093FA22CACE0530110509F0FF
:10F6C000C6CE0E946131C3CE64960FB6F894DEBFF9
:10F6D0000FBECDBFCF91DF911F910F91FF90EF90A3
:10F6E000DF90CF90BF90AF909F908F907F906F9062
:10F6F0005F904F903F902F9008954F925F926F923E
:10F700007F928F929F92AF92BF92CF92DF92EF92B1
:10F71000FF920F931F93CF93DF931092B52E109209
:10F72000A3230E948C40AA247724BB24B39498E49A
:10F73000492E512C82E1682E01C0B12E0E948C40CE
:10F7400080E060E043E858E422E00E94644481E005
:10F7500090E00E94F055AC0180E067E020E00E945C
:10F760009D44AA2039F081E061E041E858E420E0BE
:10F770000E9464440A2D10E0049D7001059DF00C68
:10F78000149DF00C1124C0E0D0E048016E01C00EC1
:10F79000D11E88E0C816D10484F44091FC28CE0123
:10F7A0008F5F682F469DA00111244E0D5F1D4554AB
:10F7B0005C4B83E020E00E946444C53059F497E03C
:10F7C000C916D1043CF481E066E04FE758E420E03C
:10F7D0000E946444219688E490E0E80EF91EC63049
:10F7E000D105A1F6772039F4AA2079F481E065E00B
:10F7F0004B2D20E00EC092E08916910434F082E097
:10F8000066E04B2D21E000E005C082E065E04B2D75
:10F8100021E001E00E94E552182F8E3F21F4A394CD
:10F820007724739414C08D3F19F4AA9477240FC0E1
:10F830008F3F09F467C08091A323813041F4809108
:10F84000F828813011F40E945F290E94BC39C12F31
:10F85000D0E0CA0DD11DC130D10551F48091F828F6
:10F8600060E041E02BE60E943B758093F82824C0BD
:10F87000C230D10551F48091082960E045E027E6C7
:10F880000E947E768093082924C0C330D10551F4AC
:10F890008091F62860E04FE727E60E947E7680930D
:10F8A000F62824C0C430D10539F4809101290E9482
:10F8B00013768093012920C0C530D10551F4809181
:10F8C000F32860E04FE729E60E947E768093F328D4
:10F8D00034CFC630D10551F48091F72860E04FE76E
:10F8E0002AE60E947E768093F72827CFC730D1057D
:10F8F00019F40E945F2921CF289709F01ECF0E949A
:10F9000008311BCFDF91CF911F910F91FF90EF90A6
:10F91000DF90CF90BF90AF909F908F907F906F902F
:10F920005F904F9008950E948C4080EF0E943B842E
:10F9300086E590E00E94F055AC0180E062E020E0B6
:10F940000E949D4487E590E00E94F055AC0180E064
:10F9500063E020E00E949D4485E590E00E94F05520
:10F96000AC018CE067E020E00E949D4480E10E94B1
:10F970003B84882319F00E94803A089580E20E9417
:10F980003B84882399F380EF0E943B840895BF92C3
:10F99000CF92DF92EF92FF920F931F93CF93DF935B
:10F9A000F82EB62EE42E122F80932F2F682F70E0A2
:10F9B000882777FD8095982F0E942F9223E333E3C9
:10F9C00043E250E40E941C930E9401926093B300B2
:10F9D0000E948C40812F90E00E94F055AC0180E0A5
:10F9E00062E020E00E949D4480E162E04F2D50E003
:10F9F00023E030E000E00E944A4981E162E047EB09
:10FA000058E420E00E94644482E090E00E94F055B7
:10FA1000AC0180E067E020E00E949D4448ECC42EE9
:10FA2000D12CC0E8D0E080E162E04F2D50E023E02F
:10FA300030E000E00E944A498F2D90E09695982F83
:10FA400088279795879564E670E00E944394462F37
:10FA500080E060E226E001E00E940A4380E40E9428
:10FA60003B84882331F480E463E00E9494848823FB
:10FA700009F1FE14F8F4F394FE1450F0D092B6237A
:10FA8000C092B523D093FB22C093FA22FE2C12C061
:10FA90006F2D70E0882777FD8095982F0E942F9218
:10FAA00023E333E343E250E40E941C930E9401925B
:10FAB0006093B30080E80E943B84882331F480E89F
:10FAC00063E00E949484882399F1BF1488F58F2DF8
:10FAD00090E001979695982F88279795879564E6EB
:10FAE00070E00E944394862F60E240E826E000E048
:10FAF0000E940A43FA94FB1449F4D092B623C092B0
:10FB0000B523D093FB22C093FA2212C06F2D70E070
:10FB1000882777FD8095982F0E942F9223E333E367
:10FB200043E250E40E941C930E9401926093B30050
:10FB300080E10E943B848823D1F081E08093A3235D
:10FB40006F2D70E0882777FD8095982F0E942F9267
:10FB500023E333E343E250E40E941C930E940192AA
:10FB60006093B300F092CE280E94BC3925C080E299
:10FB70000E943B84882309F456CF80EF0E943B8487
:10FB80001092A32310912F2F612F70E0882777FD0B
:10FB90008095982F0E942F9223E333E343E250E4B1
:10FBA0000E941C930E9401926093B3001093CE2890
:10FBB0000E94BC39F0902F2F8F2DDF91CF911F9194
:10FBC0000F91FF90EF90DF90CF90BF900895BF927C
:10FBD000CF92DF92EF92FF920F931F93CF93DF9319
:10FBE000F82EB62EE42E122F80932F2F0E948C40D9
:10FBF000812F90E00E94F055AC0180E062E020E0AF
:10FC00000E949D4480E162E04F2D50E023E030E00F
:10FC100000E00E944A4982E090E00E94F055AC0169
:10FC200080E067E020E00E949D4478ECC72ED12C54
:10FC3000C0E8D0E080E162E04F2D50E023E030E00A
:10FC400000E00E944A494F2D50E0440F551F80E0CC
:10FC500060E226E001E00E940A4380E40E943B84C7
:10FC6000882331F480E462E00E9494848823C9F000
:10FC7000FE14B8F4F394FE1450F0D092B623C09260
:10FC8000B523D093FB22C093FA22FE2C0AC0F8942D
:10FC90002B9881E80E947E408F2D0E947E402B9AF7
:10FCA000789480E80E943B84882331F480E862E005
:10FCB0000E949484882309F1BF14F8F48F2D880FD3
:10FCC000825060E240E826E000E00E940A43FA9495
:10FCD000FB1449F4D092B623C092B523D093FB22F3
:10FCE000C093FA220AC0F8942B9881E80E947E40C3
:10FCF0008F2D0E947E402B9A789480E162E04F2DF8
:10FD000050E023E030E000E00E944A4980E10E9498
:10FD10003B84882341F081E08093A323F09228293B
:10FD20000E94BC391EC080E20E943B84882309F4F3
:10FD300081CF80EF0E943B84F8942B9881E80E9449
:10FD40007E4080912F2F0E947E402B9A78941092B3
:10FD5000A32380912F2F809328290E94BC39F090F3
:10FD60002F2F8F2DDF91CF911F910F91FF90EF904B
:10FD7000DF90CF90BF9008950F931F93082F122FFD
:10FD800080932F2F0E948C40812F90E00E94F0558D
:10FD9000AC0180E062E020E00E949D44002319F065
:10FDA000043071F403C083E590E002C084E590E084
:10FDB0000E94F055AC018EE062E020E00E949D447C
:10FDC00082E090E00E94F055AC0180E067E020E026
:10FDD0000E949D4480E40E943B84882369F00023B4
:10FDE00059F484E590E00E94F055AC018EE062E0A9
:10FDF00020E00E949D4404E080E80E943B84882328
:10FE000069F0043059F483E590E00E94F055AC01AC
:10FE10008EE062E020E00E949D4400E080E10E94CC
:10FE20003B84882399F081E08093A323F8942B9856
:10FE3000002311F486EA01C087EA0E947E402B9AD3
:10FE400078940093C2280E94BC390FC080E20E94BF
:10FE50003B84882309F4BECF80EF0E943B8410923C
:10FE6000A32300912F2F0093C228802F1F910F9161
:10FE700008950F931F93082F122F80932F2F0E9406
:10FE80008C40812F90E00E94F055AC0180E062E050
:10FE900020E00E949D44002319F0043071F403C057
:10FEA00083E590E002C084E590E00E94F055AC014B
:10FEB0008EE062E020E00E949D4482E090E00E949B
:10FEC000F055AC0180E067E020E00E949D4480E4B2
:10FED0000E943B84882369F0002359F484E590E074
:10FEE0000E94F055AC018EE062E020E00E949D444B
:10FEF00004E080E80E943B84882369F0043059F4D0
:10FF000083E590E00E94F055AC018EE062E020E0D5
:10FF10000E949D4400E080E10E943B848823C9F058
:10FF200081E08093A323F8942B98002329F481EA9D
:10FF30000E947E4080EC04C080EA0E947E4088ECF3
:10FF40000E947E402B9A789400932D2F0E94BC39FA
:10FF50000DC080E20E943B84882309F4B8CF80EF73
:10FF60000E943B841092A32300912F2F802F1F917A
:10FF70000F9108954F925F926F927F928F929F920E
:10FF8000AF92BF92CF92DF92EF92FF920F931F93A7
:10FF9000CF93DF930E948C401092B52E1092A32332
:10FFA0001092A423AA247724BB24B394B8E44B2E44
:10FFB000512CA2E16A2E01C0B12E0E948C408CE52A
:10FFC00090E00E94F055AC0180E060E022E00E94E9
:10FFD0009D4481E090E00E94F055AC0180E067E034
:10FFE00020E00E949D44AA2039F081E061E04BE9C5
:10FFF00058E420E00E9464440A2D10E0049D700142
:020000021000EC
:10000000059DF00C149DF00C1124C0E0D0E04801D7
:100010006E01C00ED11E88E0C816D10484F4409150
:10002000FC28CE018F5F682F469DA00111244E0D44
:100030005F1D45585E4B83E020E00E946444C5305C
:1000400059F497E0C916D1043CF481E066E049E92F
:1000500058E420E00E946444219688E490E0E80E91
:10006000F91EC630D105A1F6772039F4AA2079F41B
:1000700081E065E04B2D20E00EC092E089169104EE
:1000800034F082E066E04B2D21E000E005C082E024
:1000900065E04B2D21E001E00E94E552182F8E3FD4
:1000A00031F4A39477247394F5E0BF2E9CCF8D3F59
:1000B00029F4AA947724E2E0BE2E95CF8F3F41F435
:1000C0008091A323813009F08DC00E94BC398AC081
:1000D000C82FD0E0CA0DD11DC130D10551F4809197
:1000E000CF2860E042E02DE50E94A7758093CF28DD
:1000F00027C0C230D10551F48091F42860E042E07D
:1001000024E60E94A7758093F42826C0C330D10549
:1001100051F48091FC2860E043E02EE50E949A743F
:100120008093FC2819C0C430D10551F4809129294D
:1001300060E04EEF2FE50E947E76809329290CC067
:10014000C530D10549F48091CE2860E044E620E630
:100150000E94C77C8093CE289091A323913031F4E4
:100160008091A423882311F49093A423C630D10551
:1001700049F48091282960E04FE321E60E94E77D61
:10018000809328299091A323913031F48091A42366
:10019000882311F49093A423C730D10551F48091A2
:1001A000C22860E044E022E60E94BC7E8093C22820
:1001B0000CC0289709F000CF80912D2F60E044E01B
:1001C00023E60E94397F80932D2F9091A3239130B5
:1001D00009F0F2CE8091A423882309F0EDCE90930C
:1001E000A423EACEDF91CF911F910F91FF90EF9062
:1001F000DF90CF90BF90AF909F908F907F906F9047
:100200005F904F9008950F931F93182F80932F2F77
:100210000E948C4083E390E00E94F055AC0180E0A6
:1002200061E020E00E949D4484E390E00E94F0554C
:10023000AC0180E062E020E00E949D448091F828BB
:10024000882309F056C083E390E00E94F055AC018A
:1002500080E061E020E00E949D4485E390E00E9400
:10026000F055AC0180E062E020E00E949D4486E30E
:1002700090E00E94F055AC0180E061E020E00E9437
:100280009D4487E390E00E94F055AC0180E062E07D
:1002900020E00E949D4488E390E00E94F055AC016C
:1002A00080E061E020E00E949D4489E390E00E94AC
:1002B000F055AC0180E062E020E00E949D448AE3BA
:1002C00090E00E94F055AC0180E061E020E00E94E7
:1002D0009D448BE190E00E94F055AC018CE067E01A
:1002E00020E00E949D4480E20E943B848823D9F351
:1002F0007BC0112319F0113099F408C08EE062E040
:100300004FEB58E420E00E9464440AC081E590E08D
:100310000E94F055AC018EE062E020E00E949D4416
:1003200082E090E00E94F055AC0180E067E020E0C0
:100330000E949D440091F828013009F04FC080E4EC
:100340000E943B84882391F0112381F40093A3231E
:1003500081E590E00E94F055AC018EE062E020E083
:100360000E949D4486E00E94CA3011E080E80E940D
:100370003B84882379F0113069F41093A3238EE035
:1003800062E049EB58E420E00E94644485E00E946A
:10039000CA3010E080E10E943B848823F9F08BE3AF
:1003A00090E00E94F055AC0180E064E020E00E9403
:1003B0009D448CE390E00E94F055AC0180E065E044
:1003C00020E00E949D4480E067E042E10E94B74443
:1003D00080E10E943B848823D9F30DC080E20E9413
:1003E0003B84882309F4A6CF80EF0E943B841092BF
:1003F000A32310912F2F812F1F910F910895DF922A
:10040000EF92FF920F931F93F82ED62EE42E122F09
:1004100080932F2F0E948C40812F90E00E94F055F6
:10042000AC0180E062E020E00E949D4480E162E057
:100430004F2D50E023E030E000E00E943B4882E096
:1004400090E00E94F055AC0180E067E020E00E945F
:100450009D4411E080E40E943B84882331F480E4D1
:1004600063E00E949484882371F0FE1460F410937A
:10047000A323F39480E162E04F2D50E023E030E0CD
:1004800000E00E943B4880E80E943B84882331F4CE
:1004900080E863E00E949484882371F0DF1460F4A4
:1004A0001093A323FA9480E162E04F2D50E023E003
:1004B00030E000E00E943B4880E10E943B848823BA
:1004C00061F480E20E943B84882321F280EF0E9445
:1004D0003B841092A323F0902F2F8F2D1F910F910B
:1004E000FF90EF90DF9008954F925F926F927F920E
:1004F0008F929F92AF92BF92CF92DF92EF92FF9234
:100500000F931F93CF93DF930E948C401092B52ED0
:100510001092A323AA247724BB24B39498E4492EF1
:10052000512C82E1682E01C0B02E0E948C4080E0E8
:1005300060E041EA58E422E00E94644481E090E0F7
:100540000E94F055AC0180E067E020E00E949D44ED
:10055000AA2039F081E061E04FE958E420E00E94F0
:1005600064440A2D10E0049D7001059DF00C149D5B
:10057000F00C1124C0E0D0E048016E01C00ED11E85
:1005800089E0C816D10484F44091FC28CE018F5F25
:10059000682F469DA00111244E0D5F1D4D50514CFA
:1005A00083E020E00E946444C53059F498E0C91605
:1005B000D1043CF481E066E04DE958E420E00E947B
:1005C0006444219688E490E0E80EF91EC630D10517
:1005D000A1F6772039F4AA2079F481E065E04B2D6B
:1005E00020E00EC093E08916910434F082E066E0CA
:1005F0004B2D21E000E005C082E065E04B2D21E0BD
:1006000001E00E94E552082F8E3F31F4A394772435
:10061000739405E0B02E9CCF8D3F29F4AA947724E3
:1006200012E0B12E95CF8F3F41F48091A32381300A
:1006300009F090C00E94BC398DC0C82FD0E0CA0D0F
:10064000D11DC130D10569F4809167240E940381D6
:10065000809367248091A323813081F48093A52324
:100660005AC0C230D10551F48091792461E247EF3C
:1006700029E70E94FF81809379244DC0C330D105C2
:1006800019F40E94BA7F4DC0C430D105E1F48091C5
:10069000F8288823A9F48091F82860E041E02BE64F
:1006A0000E943B758093F8288091A323813099F5AF
:1006B0008091F828813009F047C00E945F2944C02A
:1006C0000E947D7B28C0C530D10529F58091F52891
:1006D0008823F1F48091F52860E041E020E70E9452
:1006E0003B758093F5288091A3238130D1F410913C
:1006F000F528113009F018CF0E94AF2F892B19F07F
:100700001093FA2802C01092FA280E94BC390CCF2C
:100710000E94F87906C0C630D10519F40E94A97765
:1007200003CFC730D10519F40E948852FDCEC830DE
:10073000D10551F48091022960E041E025E60E9454
:100740007E7680930229F0CE299709F0EDCE0E94A3
:10075000937CEACEDF91CF911F910F91FF90EF90A4
:10076000DF90CF90BF90AF909F908F907F906F90D1
:100770005F904F900895E0E8F0E01082A1E8B0E0CB
:100780001C9210926F008081826880838C918B61B3
:100790008C938AE698E1909387008093860086ED9B
:1007A00091E090938900809388000895579AE0EB38
:1007B000F0E0808183688083E1EBF0E080818160FC
:1007C0008083E0E7F0E08081866080838FEF809314
:1007D000B30008951F920F920FB60F9211245F9AE3
:1007E0000F900FBE0F901F9018951F920F920FB68B
:1007F0000F9211245F980F900FBE0F901F901895C5
:100800001092332F1092322F82E084BD85E085BD97
:1008100083EC87BDEEE6F0E08081826080830895FE
:100820002091B7233091B8232F5F3F4F280F391FF6
:10083000C90108952091B7233091B823821B930BEF
:1008400080709078892F869508952091B7233091F4
:10085000B8232F5F3F4F280F391F8091B723909106
:10086000B823A901481B590BCA0180709078892FC1
:10087000869599F308952FB7F8949091A72389232B
:1008800098279093A7232FBF08954FB7F8943FB7A9
:10089000F8942091A7239091A623909589238223F1
:1008A00028272093A7233FBF4FBF08952FB7F89461
:1008B0009091A823892398279093A8232FBF2FB71F
:1008C000F8949091A923892398279093A9232FBF67
:1008D0002FB7F8949091A723892398279093A72363
:1008E0002FBF08952FB7F8949091A92389239827B3
:1008F0009093A9232FBF0895282F9FB7F894809134
:10090000AA23282382278093AA239FBF3FB7F89466
:100910009091A9238091A7238095822789239827E6
:100920009093A9233FBF08952FB7F8949091AB23DC
:10093000892398279093AB236093AC232FBF08950E
:100940008091B3239091B423019799F488EE93E0BA
:100950009093B6238093B52380E290E09093FB229E
:100960008093FA2280E060E040EF58E422E00E94A9
:1009700064442091F6223091F72284E690E0A901A8
:10098000489F9001499F300D589F300D1124809150
:10099000B3239091B4238217930721F41092B423C8
:1009A0001092B3238091B3239091B423009729F040
:1009B00001969093B4238093B323349B04C0109288
:1009C000B2231092B123349917C08091B123909132
:1009D000B22301969093B2238093B1230A9761F4D6
:1009E0008091B3239091B423892B31F481E090E07E
:1009F0009093B4238093B3232091F8223091F9226D
:100A000084E690E0A901489F9001499F300D589FCE
:100A1000300D11248091B1239091B2238217930756
:100A200009F4299808951F920F920FB60F920BB6F2
:100A30000F9211242F933F934F935F936F937F9364
:100A40008F939F93AF93BF93EF93FF933091A62320
:100A500020B1209523278091BF2382238095809306
:100A6000BF239091BE23922398279093BE232823DF
:100A70002923922F93279093A62392238091A72333
:100A8000892B8093A7238091F928813001F58091EB
:100A9000AF239091B02301969093B0238093AF231E
:100AA0008091AF239091B023805E9E4281F488ECC8
:100AB00090E09093B6238093B52380E890E09093E4
:100AC000FB228093FA221092B0231092AF238091E0
:100AD000B92381508093B9238F5F89F489E0809393
:100AE000B9238091B7239091B82301969093B823AE
:100AF0008093B7238091FC228F5F8093FC22222376
:100B000089F08091312F882311F40E94AB2581E078
:100B10008093312F1092AE231092AD231092B02308
:100B20001092AF23809129298823D9F08091312F09
:100B30008130B9F48091AD239091AE2301969093CA
:100B4000AE238093AD232091292964E670E00E94B2
:100B50002F9430E06217730721F40E94B62510929B
:100B6000312F0E94A0848091B5239091B6230097E5
:100B7000D9F08B30910530F00A979093B62380938B
:100B8000B52304C01092B6231092B5238091FA22A7
:100B90009091FB222091B5233091B6238223932399
:100BA000892B09F090C006C08FEF9FEF9093FB2236
:100BB0008093FA22479A4091A623242F30E0207F89
:100BC00030702115310519F486E48093BD2380919E
:100BD000BD2381508093BD23882339F4942F907FC7
:100BE0008091A823892B8093A8232115310519F41E
:100BF00081E08093BC238091BC2381508093BC23EF
:100C0000882351F48FE08093BC23942F907F8091B0
:100C1000A923892B8093A9232115310519F486E492
:100C20008093BB238091BB2381508093BB23882377
:100C300051F48FE08093BB23942F907F8091AA235F
:100C4000892B8093AA23232B19F486E48093BA235B
:100C50008091BA2381508093BA238823A9F480918C
:100C6000AC23813011F484E107C0823011F488E0B4
:100C700003C0833049F481E08093BA23407F8091A0
:100C8000AB23842B8093AB238091322F9091332F11
:100C9000892B49F08091322F9091332F01979093B7
:100CA000332F8093322F8091342F9091352F892BC1
:100CB00061F08091342F9091352F01979093352FCB
:100CC0008093342F02C0479876CFFF91EF91BF9168
:100CD000AF919F918F917F916F915F914F913F91D4
:100CE0002F910F900BBE0F900FBE0F901F90189575
:100CF0000F931F930E948C408CE067E04BEB5AE40B
:100D000020E00E9464448091852390918623805046
:100D1000904184F00E940E4D60917F23709180235A
:100D200080918123909182230E9401927093882365
:100D3000609387230E94E14D40918723509188233F
:100D400085E065E020E030E000E00E9453478AE063
:100D500065E046EB5AE420E00E9464444091C028DC
:100D60005091C12880E066E025E030E00E944A49C9
:100D700080E40E943B84182F80E463E00E94948406
:100D8000182B49F08091C0289091C1280A96909321
:100D9000C1288093C02880E80E943B84182F80E8F7
:100DA00063E00E949484182B49F08091C0289091B0
:100DB000C1280A979093C1288093C02880E20E949E
:100DC0003B84882309F49FCF80EF0E943B841F91CE
:100DD0000F9108951F9311E00E948C4082E390E0F0
:100DE0000E94F055AC0180E068E022E00E949D4442
:100DF00083E063E048ED5AE420E00E94644483E02D
:100E000064E048EC5AE420E00E94644481E090E011
:100E10000E94F055AC0180E067E020E00E949D4414
:100E2000113061F481E063E046EC5AE420E00E9476
:100E3000644481E064E044EC5AE40BC081E063E088
:100E400042EC5AE420E00E94644481E064E040EC1B
:100E50005AE420E00E94644480E80E943B848111AF
:100E600011E080E40E943B84811112E080E10E9445
:100E700045848823F9F080916724882359F4113040
:100E800019F40E945832A8CF123009F0A5CF0E9461
:100E9000AE31A2CF80916724813009F09DCF11300F
:100EA00019F40E94AF3298CF123009F095CF0E940A
:100EB000033292CF80E20E943B84882309F4B0CFB2
:100EC00080EF0E943B841F9108956F927F928F92D2
:100ED0009F92AF92BF92CF92DF92EF92FF920F93C9
:100EE0001F93CF93DF93AA249924BB24B39438E4AF
:100EF000632E712C22E1822E01C0B12E0E948C4003
:100F000080E060E04CEE5AE422E00E94644481E01C
:100F100090E00E94F055AC0180E067E020E00E9484
:100F20009D44AA2039F081E061E04AEE5AE420E0D5
:100F30000E946444CA2CDD24C69C8001C79C100D0D
:100F4000D69C100D1124C0E0D0E07E01EC0CFD1CFD
:100F500086E0E816F10484F44091FC28CE018F5F0E
:100F6000682F489DA0011124400F511F4A5F564B26
:100F700083E020E00E946444C53059F495E0E9160E
:100F8000F1043CF481E066E048EE5AE420E00E947F
:100F900064442196085B1F4FC630D105B1F69920F5
:100FA00069F4AA2029F481E066E04B2D20E00AC014
:100FB00082E065E04B2D21E001E005C082E066E0C3
:100FC0004B2D21E000E00E94E552182F8E3F31F4B6
:100FD000A3949924939495E0B92EA3CF8D3F29F43F
:100FE000AA94992482E0B82E9CCF8F3FE1F1C82FBC
:100FF000D0E0CA0DD11DC130D10521F482E00E949C
:10100000605705C0C230D10511F40E94057280916D
:101010006724882361F4C330D10519F40E94583243
:101020001CC0C430D10599F40E94AE3116C0809125
:101030006724813061F4C330D10519F40E94AF32C6
:101040000CC0C430D10519F40E94033206C0C5306B
:10105000D10519F40E94748250CF269709F04DCF24
:101060000E94B5514ACFDF91CF911F910F91FF9010
:10107000EF90DF90CF90BF90AF909F908F907F9038
:101080006F900895DC014AEA20E030E007C0FD01DE
:10109000E20FF31F8081480F2F5F3F4F261737075E
:1010A000B0F3842F08952FB7F8943998389A909117
:1010B000B9009C7F9093B9009AE29093B800109287
:1010C000C0231092C2231092C323882379F0E3E453
:1010D000FFE210821182128213821482158216821C
:1010E000178238968FE2E33AF80799F778942FBF82
:1010F0000895EF92FF920F931F931092C0230CEB71
:1011000010E084E9F801808380E880831092BD00BC
:101110001092BA008BEBE82EF12CF701108210929E
:10112000B9001092B8001092C42380E00E94538846
:10113000F701108285E8F80180838091C7238260DF
:101140008093C7231F910F91FF90EF9008951F92F6
:101150000F920FB60F920BB60F9211242F933F935D
:101160004F938F939F93AF93BF93EF93FF93909180
:10117000C0239F5F9093C0239150943009F4F4C032
:10118000953058F4913099F19130A0F0923009F4F3
:101190006CC0933009F06EC2CEC0963009F4CEC157
:1011A000963008F41CC1953109F438C2963109F023
:1011B00061C236C281E08093C4238091C2238C3007
:1011C00070F01092C9231092C8231092C22385E0B8
:1011D0008093C0238091C323880F8D5A04C08091CF
:1011E000C223880F8E5A8093BB0085E838C2E091F5
:1011F000C223F0E043E0EE0FFF1F4A95E1F7ED5BFD
:10120000F04D81818093BB0085E88093BC00E09124
:10121000C223F0E033E0EE0FFF1F3A95E1F7ED5BFC
:10122000F04D808180FF85C0E091C223F0E023E093
:10123000EE0FFF1F2A95E1F7EB5BF04D80818823CD
:1012400029F08091FF22873008F42AC28091C823B8
:101250009091C923892B09F023C28091CA239091D0
:10126000CB23892B09F01CC264C04091C22320917A
:10127000CA233091CB2381E090E002C0880F991FF0
:101280004A95E2F782239323892B69F0E091C223E8
:10129000F0E093E0EE0FFF1F9A95E1F7E95BF04D68
:1012A00080E180830BC0E091C223F0E083E0EE0F89
:1012B000FF1F8A95E1F7E95BF04D1082E091C223B0
:1012C000A091C223F0E0B3E0EE0FFF1FBA95E1F763
:1012D000E95BF04D9081990F990F990FB0E043E0D1
:1012E000AA0FBB1F4A95E1F7AB5BB04D8C9187709D
:1012F000982B9093BB0085E88093BC004091C2235B
:101300002091C8233091C92381E090E002C0880F6A
:10131000991F4A95E2F782239323892B51F08BE39F
:101320009FE29093CE238093CD2388E08093CC23BB
:10133000B7C184E070C1E091CD23F091CE238191BB
:101340008093BB0085E88093BC00F093CE23E093AC
:10135000CD238091CC2381508093CC23882309F422
:101360009FC19093C0239CC18091B900803321F527
:101370008091D023882329F48091C2238F5F8093AA
:10138000D023E091C223F0E033E0EE0FFF1F3A9547
:10139000E1F7ED5BF04D83818F778F3769F0E09156
:1013A000C223F0E023E0EE0FFF1F2A95E1F7ED5B8B
:1013B000F04D83818F5F83831092C02384E98093F3
:1013C000BC008AE090E09093FE228093FD22809101
:1013D000C2238F5F8093C2231092C0233AC18091B1
:1013E000B9008034B9F1E091C323F0E093E0EE0F4F
:1013F000FF1F9A95E1F7ED5BF04D83818F77838333
:101400008091C3238F5F8093C3238091C3238C304B
:10141000A0F01092C3231092CB231092CA23809184
:10142000CF238F5F8093CF238C3038F01092CF235F
:101430008091C7238D7F8093C7238091C7238160CC
:101440008093C7231092C02384E98093BC0010923C
:10145000C4236DC0E091C323F0E083E0EE0FFF1FD3
:101460008A95E1F7ED5BF04D838180688383E0919D
:10147000C323F0E0B3E0EE0FFF1FBA95E1F7ED5B99
:10148000F04D808180FF2DC0E091C323F0E0A3E008
:10149000EE0FFF1FAA95E1F7E95BF04DE081EE2327
:1014A00051F0E031D9F58BE39FE29093CE23809306
:1014B000CD2388E031C08091C32390E0E3E0880F22
:1014C000991FEA95E1F7885B904D9093CE23809326
:1014D000CD239091C3238091CF239817E1F483E02B
:1014E0001BC08091C32390E043E0880F991F4A9569
:1014F000E1F7885B904D9093CE238093CD2380912C
:10150000C72381FD06C09091C3238091CF239817F4
:1015100011F482E001C081E08093CC238091CC2340
:10152000813011F485E801C085EC8093BC00809186
:10153000D0238093C5231092D023B2C08091BB00EA
:10154000E091CD23F091CE238193F093CE23E093CD
:10155000CD238091CC2381508093CC23823010F016
:1015600085EC03C0813029F485E88093BC0086E0D7
:1015700052C08091C72381FF26C0E091C323F0E0D1
:1015800033E0EE0FFF1F3A95E1F7ED5BF04D8681FA
:101590008A3F71F4E091C323F0E023E0EE0FFF1FD8
:1015A0002A95E1F7ED5BF04D8081816080830BC06F
:1015B000E091C323F0E093E0EE0FFF1F9A95E1F76F
:1015C000ED5BF04D10828091C3238F5F8093C32326
:1015D0008091C3238C30A0F01092C3231092CB23B0
:1015E0001092CA238091CF238F5F8093CF238C30BA
:1015F00038F01092CF238091C7238D7F8093C7232B
:101600001092C02384E98093BC008091C72381603D
:101610008093C72343C08093C02342C080E8E3CDBA
:101620001092C02384E98093BC001092C4238AE006
:1016300090E09093FE228093FD228091C12382301E
:1016400088F48091C1238F5F8093C12382E18093CE
:10165000C0238091C7238E7F8093C72385EA809320
:10166000BC001EC01092C1238091C723816080936B
:10167000C72316C01092C02384E98093BC008091D8
:10168000C72381608093C7238AE090E09093FE2275
:101690008093FD221092C2231092C3231092C42380
:1016A000FF91EF91BF91AF919F918F914F913F919A
:1016B0002F910F900BBE0F900FBE0F901F9018959B
:1016C00081E008951F93CF93DF93182F8091C62355
:1016D000882311F081E093C01D3008F08FC01123E2
:1016E00089F0E12FF0E053E0EE0FFF1F5A95E1F78C
:1016F000E55CF04D838187FF81C0808180FD02C061
:1017000083E07DC080913B2F823011F084E077C070
:10171000EBE3FFE29AEA8191980F8FE2E234F80757
:10172000D1F78081981711F085E069C080ED97E0CE
:101730000E941084EC018091C72380FD05C0CE017A
:101740000E941A848823B9F3112369F48FEF90E083
:101750009093C9238093C823E4E4FFE240E050E083
:1017600061E070E00CC0212F30E02150304081E07A
:1017700090E002C0880F991F2A95E2F7E9CF2091E7
:10178000C8233091C923CB01042E02C0880F991FB2
:101790000A94E2F782239323892B11F0108211829D
:1017A0004F5F5F4F38964C30510549F71092C22376
:1017B00015EA1092C0238091C7238E7F8093C723A0
:1017C0001093BC008091C72380FD05C0CE010E940C
:1017D0001A848823B9F38091C8239091C923892B57
:1017E00029F0CE010E941A84882319F38091C8231E
:1017F0009091C923892B11F480E001C082E0DF9130
:10180000CF911F9108951F920F920FB60F920BB6B2
:101810000F9211242F938F939F93EF93FF939091A7
:10182000C8002091CE00E0911324EF5FEF7180910A
:101830001424E81711F482E008C0892F8871E0931E
:101840001324F0E0EF50FC4D208380931524FF918A
:10185000EF919F918F912F910F900BBE0F900FBE24
:101860000F901F9018951F920F920FB60F920BB604
:101870000F9211248F939F93EF93FF9390911124D4
:1018800080911224981769F0E0911224EF5FEF71B4
:10189000E0931224F0E0EF52FC4D80818093CE0063
:1018A00005C08091C9008F7D8093C900FF91EF91A1
:1018B0009F918F910F900BBE0F900FBE0F901F90B6
:1018C00018959C0110921124109212241092132446
:1018D0001092142497FF04C082E08093C8003F77E1
:1018E0003093CD002093CC0088E98093C90086E036
:1018F0008093CA000895909113248091142498171E
:1019000019F420E031E012C0E0911424EF5FEF7190
:10191000E0931424F0E0EF50FC4D30812091152429
:10192000922F80E0AC01430F511D9A01C901089527
:10193000482F909111249F5F9F71809112249817D6
:10194000E1F3E92FF0E0EF52FC4D40839093112436
:101950008091C90080628093C90080911524382F3E
:1019600020E0240F311DC9010895CF93DF93EC01CE
:1019700003C021960E94988C88818823D1F7DF913B
:10198000CF910895CF93DF93EC0102C00E94988C11
:10199000FE01219684918823C9F7DF91CF910895A4
:1019A000809113242091142490E04F96821B91097A
:1019B0006FE170E00E944394089580911424809315
:1019C000132408951F920F920FB60F920BB60F9229
:1019D00011242F933F934F935F936F937F938F9334
:1019E0009F93AF93BF93CF93DF93EF93FF93809138
:1019F0008B23853011F0843089F54091C600209109
:101A00006324309164248091652490916624281B7E
:101A1000390B37FF02C0205C3F4F2F3331050CF0EC
:101A2000AAC0E0916324F0916424408380916324F0
:101A30009091642401969093642480936324809110
:101A40006324909164248356944209F094C083E205
:101A500094E290936424809363248DC07091C600B7
:101A600080911624882309F086C060912024662383
:101A700071F4733279F47093A32F81E08093202462
:101A800083E290E0909322248093212474C0643BED
:101A900008F064C0A62FB0E02091212430912224C8
:101AA0007D3069F0AD55B04D7C936F5F609320241D
:101AB000270F311D30932224209321245CC0FD0187
:101AC000EF55F04D9081ED01CE55D04D8881A901A3
:101AD000491B5109481B51095F70509322244093C0
:101AE00021242081CA0136E0969587953A95E1F741
:101AF000835C821729F59881842F8F73835C891703
:101B0000F9F4AD55B04D7C936F5F609317249091BD
:101B100089238091A52F9817F1F481E080931624F2
:101B20008091A52F8235B9F42CE088E190E00FB6C2
:101B3000F894A895809360000FBE209360000BC0BE
:101B400080911B2490911C24019690931C248093D7
:101B50001B2410921624109220240DC080911D2465
:101B600090911E24019690931E2480931D24109220
:101B7000202410921624FF91EF91DF91CF91BF9115
:101B8000AF919F918F917F916F915F914F913F9115
:101B90002F910F900BBE0F900FBE0F901F901895B6
:101BA000209163243091642480916524909166246F
:101BB0002817390711F4E0E01BC0E0916524F0918B
:101BC0006624E0818091652490916624019690932B
:101BD00066248093652480916524909166248356C1
:101BE000944231F483E294E29093662480936524D6
:101BF0008E2F0895DC01209163243091642480911C
:101C00006524909166242817390711F480E008951F
:101C1000E0916524F091662480818C938091652405
:101C20009091662401969093662480936524809118
:101C30006524909166248356944211F081E00895C2
:101C400083E294E2909366248093652481E0089572
:101C50009093C5008093C4008091C0008D7F8093D5
:101C6000C00086E08093C2008091C1008B7F80938A
:101C7000C10002C08091C6008091C00087FDFACFEC
:101C80008091C10088618093C1008091C10080680B
:101C90008093C10083E294E290936624809365244C
:101CA00080916524909166249093642480936324AA
:101CB0000895E1ECF0E08081877F808323982B9862
:101CC0000895239A2B98E1ECF0E08081886080836E
:101CD0000895982F8091C00085FFFCCF9093C60097
:101CE0000895FC0107C08091C00085FFFCCF909350
:101CF000C600319690819923B1F70895FC0107C081
:101D00008091C00085FFFCCF9093C60031969491DE
:101D10009923B1F7089550911724565033E043E0CA
:101D200048C0E32FF0E0ED55F04D80813F5FE32F99
:101D3000F0E0ED55F04D20812D533F5FE32FF0E0B3
:101D4000ED55F04D70813F5FE32FF0E03350ED55DE
:101D5000F04D6081E42FF0E0922F92959F708D53AB
:101D6000880F880F892BED55F04D8083E42FEF5FAE
:101D7000513081F0972F9D53F0E02295207F892FDD
:101D800086958695282BED55F04D2083E42FEE5F48
:101D9000523011F44E2F10C03C5F5350F0E092953A
:101DA000990F990F907C6D53962BED55F04D9083C4
:101DB0004D5F552309F0B5CF86EA9FE29093192431
:101DC00080931824435040931A24089580918A23C5
:101DD000813071F58091C00085FFFCCF8BE180934D
:101DE000C6008091C00085FFFCCF8BE18093C600C8
:101DF0008091C00085FFFCCF85E58093C60080916F
:101E0000C00085FFFCCF8AEA8093C6008091C000A5
:101E100085FFFCCF1092C60081E080938B2384EF76
:101E200091E024EF31E0F9013197F1F70197D9F70B
:101E3000089585E080938B2384EF91E024EF31E0D7
:101E4000F9013197F1F70197D9F70895DF92EF92F1
:101E5000FF920F931F93DF93CF93CDB7DEB78B85A0
:101E60007C8593E2909376308F59809377308A8582
:101E700080937830DE011D96772329F4EE24FF2429
:101E800040E050E007C0ED84FE84DE0151964F85AE
:101E90005889715003E010E030E07EC0F701E30F95
:101EA000F11D90813F5F4150504091F4772309F438
:101EB000C4C0FD013296ED90FC90DF0112960190B6
:101EC000F081E02D7150309709F4B6C0AF0130E0D9
:101ED000F701E30FF11DD0803F5F4150504099F46E
:101EE000772311F460E023C0FD013296ED90FC9061
:101EF000DF0112964081518171504115510511F455
:101F000060E014C030E0F701E30FF11D60813F5F36
:101F10004150504061F4772351F0FD013296ED902D
:101F2000FC90DF01129640815181715030E0892F81
:101F300086958695835CF801EA58FF4C80832D2DA9
:101F400022952F70892F90E083709070F4E0880FB5
:101F5000991FFA95E1F7282B235CF801E958FF4C0B
:101F600020838D2D90E08F709070880F991F880FBF
:101F7000991F262F2295269526952370282B235CC2
:101F8000F801E858FF4C20836F73635CF801E75851
:101F9000FF4C60830C5F1F4F4115510509F07ECF48
:101FA00090E020E030E006C0EA58FF4C8081280F26
:101FB000311D9F5FE92FF0E0E017F107A8F33F70B4
:101FC000C90146E0969587954A95E1F7835CF8014B
:101FD000EA58FF4C8083C80101962F73235CFC01F3
:101FE000EA58FF4C20830196FC01EA58FF4C2DE093
:101FF0002083AC014F5F5F4F1092002320E00CC0A4
:102000008091C00085FFFCCFE22FF0E0EA58FF4C42
:1020100080818093C6002F5F822F90E08417950700
:1020200078F381E080930023CF91DF911F910F918E
:10203000FF90EF90DF90089530E060E0DD2477CFEF
:10204000DF93CF930F92CDB7DEB720918B23213052
:10205000A9F592E099834DB75EB7475050400FB64F
:10206000F8945EBF0FBE4DBFEDB7FEB7319685E762
:10207000ADB7BEB711968C9391832283CE010196A2
:102080009483838381E090E0968385830E94268FEA
:1020900084E080938B2324EF31E04DB75EB7495F36
:1020A0005F4F0FB6F8945EBF0FBE4DBF44EF51E0D7
:1020B000CA010197F1F721503040D1F70F90CF912D
:1020C000DF910895DF93CF930F92CDB7DEB7909154
:1020D0008B239130A1F599832DB73EB7275030401F
:1020E0000FB6F8943EBF0FBE2DBFEDB7FEB73196C9
:1020F00085E7ADB7BEB711968C9382E0818392835A
:10210000CE0101969483838381E090E0968385835A
:102110000E94268F83E080938B2324EF31E08DB7DC
:102120009EB707960FB6F8949EBF0FBE8DBF44EFC3
:1021300051E0CA010197F1F721503040D1F70F90DB
:10214000CF91DF9108951F93DF93CF930F92CDB777
:10215000DEB790918B23913099F519822DB73EB758
:10216000275030400FB6F8943EBF0FBE2DBFEDB7DD
:10217000FEB7319685E7ADB7BEB711968C9312E0E6
:1021800011839283CE0101969483838381E090E052
:10219000968385830E94268F10938B2324EF31E052
:1021A0008DB79EB707960FB6F8949EBF0FBE8DBF32
:1021B00044EF51E0CA010197F1F721503040D1F7C7
:1021C0000F90CF91DF911F910895FF920F931F936E
:1021D000DF93CF930F92CDB7DEB7082FF62E142FD3
:1021E0000E94618E812F6AE00E94239489838DB7BB
:1021F0009EB707970FB6F8949EBF0FBE8DBFEDB781
:10220000FEB73196ADB7BEB711960C93F18281E05F
:102210008283CE0101969483838381E090E096834C
:1022200085830E94268F8DB79EB707960FB6F894C8
:102230009EBF0FBE8DBF809100238823E1F30E94D3
:10224000598E0F90CF91DF911F910F91FF900895BC
:102250005058BB27AA270ED0A0C169D130F06ED14B
:1022600020F031F49F3F11F41EF45EC10EF4E095AE
:10227000E7FB54C1E92FB3D180F3BA1762077307A4
:102280008407950718F071F49EF5CBC10EF4E09524
:102290000B2EBA2FA02D0B01B90190010C01CA0120
:1022A000A0011124FF27591B99F0593F50F4503ECB
:1022B00068F11A16F040A22F232F342F4427585FBD
:1022C000F3CF469537952795A795F0405395C9F7D5
:1022D0007EF41F16BA0B620B730B840BBAF091508D
:1022E000A1F0FF0FBB1F661F771F881FC2F70EC02C
:1022F000BA0F621F731F841F48F4879577956795FF
:10230000B795F7959E3F08F0B3CF9395880F08F0E7
:102310009927EE0F979587950895DCD008F481E012
:10232000089514D1E3954AC10CD037C107D140F0CC
:10233000FED030F021F45F3F19F0F0C0511172C1AE
:10234000F3C04DD198F39923C9F35523B1F3951BED
:10235000550BBB27AA2762177307840738F09F5FC6
:102360005F4F220F331F441FAA1FA9F333D00E2E35
:102370003AF0E0E830D091505040E695001CCAF7A2
:1023800029D0FE2F27D0660F771F881FBB1F261767
:1023900037074807AB07B0E809F0BB0B802DBF013A
:1023A000FF2793585F4F2AF09E3F510568F0B6C053
:1023B00039C15F3FECF3983EDCF3869577956795DE
:1023C000B795F7959F5FC9F7880F911D96958795EB
:1023D00097F90895E1E0660F771F881FBB1F62170A
:1023E00073078407BA0720F0621B730B840BBA0BC8
:1023F000EE1F88F7E095089504D06894B11112C1DA
:102400000895F5D088F09F5790F0B92F9927B751CC
:10241000A0F0D1F0660F771F881F991F1AF0BA95A8
:10242000C9F712C0B13081F0FCD0B1E00895F9C015
:10243000672F782F8827B85F39F0B93FCCF386959E
:1024400077956795B395D9F73EF4909580957095FB
:1024500061957F4F8F4F9F4F0895E89409C097FB78
:102460003EF490958095709561957F4F8F4F9F4F6B
:102470009923A9F0F92F96E9BB279395F6958795AF
:1024800077956795B795F111F8CFFAF4BB0F11F472
:1024900060FF1BC06F5F7F4F8F4F9F4F16C0882319
:1024A00011F096E911C0772321F09EE8872F762F4F
:1024B00005C0662371F096E8862F70E060E02AF090
:1024C0009A95660F771F881FDAF7880F969587957C
:1024D00097F90895990F0008550FAA0BE0E8FEEF51
:1024E00016161706E807F907C0F012161306E407D8
:1024F000F50798F0621B730B840B950B39F40A26D1
:1025000061F0232B242B252B21F408950A2609F4AE
:10251000A140A6958FEF811D811D089597F99F67B2
:1025200080E870E060E008959FEF80EC089500245B
:102530000A941616170618060906089500240A9428
:1025400012161306140605060895EECF50D0E8F3D0
:10255000E894E0E0BB279F57F0F02AED3FE049EC1C
:1025600006C0EE0FBB0F661F771F881F28F0B23A18
:1025700062077307840728F0B25A620B730B840B4F
:10258000E3959A9572F7803830F49A95BB0F661FE1
:10259000771F881FD2F79048F5C0092E0394000CCE
:1025A00011F4882352F0BB0F40F4BF2B11F460FFED
:1025B00004C06F5F7F4F8F4F9F4F0895EF93E0FFF1
:1025C00006C0A2EA2AED3FE049EC5FEB53DEE5DF0F
:1025D0000F90039401FC9058E0EBF0E0DFC057FD52
:1025E0009058440F551F59F05F3F71F04795880F81
:1025F00097FB991F61F09F3F79F087950895121618
:1026000013061406551FF2CF4695F1DF08C01616C3
:1026100017061806991FF1CF869571056105089474
:102620000895E894BB2766277727CB0197F908958B
:1026300051DF08F48FEF08950BD0AFCF78DF28F08B
:102640007DDF18F0952309F069CF6ECF1124EACF12
:10265000C6DFA0F3959FD1F3950F50E0551F629F01
:10266000F001729FBB27F00DB11D639FAA27F00DEB
:10267000B11DAA1F649F6627B00DA11D661F829F12
:102680002227B00DA11D621F739FB00DA11D621FF7
:10269000839FA00D611D221F749F3327A00D611D14
:1026A000231F849F600D211D822F762F6A2F1124F6
:1026B0009F5750408AF0E1F088234AF0EE0FFF1F49
:1026C000BB1F661F771F881F91505040A9F79E3F80
:1026D000510570F023CFA6CF5F3FECF3983EDCF3BB
:1026E000869577956795B795F795E7959F5FC1F7BD
:1026F000FE2B880F911D9695879597F9089577DFA2
:10270000E0F09E37D8F09639B8F49E3848F4672F39
:10271000782F8827985FF9CF869577956795939559
:102720009539D0F3B62FB1706B0F711D811D20F458
:10273000879577956795939508C022C073CF9F932F
:1027400005DF0F9007FCEE5F39CF882371F4772304
:1027500021F09850872B762F07C0662311F4992714
:102760000DC09051862B70E060E02AF09A95660FBC
:10277000771F881FDAF7880F9695879597F9089540
:102780009F3F31F0915020F4879577956795B795E5
:10279000880F911D9695879597F908959F938F932C
:1027A0007F936F93FF93EF939B01AC0145DFEF9114
:1027B000FF9105D02F913F914F915F913DCFDF93D6
:1027C000CF931F930F93FF92EF92DF927B018C01C7
:1027D000689405C0DA2EEF013BDFFE01E894A59175
:1027E0002591359145915591AEF3EF0143DDFE0101
:1027F0009701A801DA9479F7DF90EF90FF900F919D
:102800001F91CF91DF910895629FD001739FF001D6
:10281000829FE00DF11D649FE00DF11D929FF00D70
:10282000839FF00D749FF00D659FF00D9927729FA7
:10283000B00DE11DF91F639FB00DE11DF91FBD0132
:10284000CF0111240895991B79E004C0991F9617B0
:1028500008F0961B881F7A95C9F780950895AA1BE2
:10286000BB1B51E107C0AA1FBB1FA617B70710F07B
:10287000A61BB70B881F991F5A95A9F780959095AD
:10288000BC01CD01089597FB092E07260AD077FDDC
:1028900004D0E5DF06D000201AF4709561957F4FD3
:1028A0000895F6F7909581959F4F0895A1E21A2E0D
:1028B000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FE4
:1028C000A217B307E407F50720F0A21BB30BE40B34
:1028D000F50B661F771F881F991F1A9469F760957B
:1028E0007095809590959B01AC01BD01CF01089535
:1028F00097FB092E05260ED057FD04D0D7DF0AD04E
:10290000001C38F450954095309521953F4F4F4F1E
:102910005F4F0895F6F790958095709561957F4F7C
:102920008F4F9F4F0895FB01DC010D900020E9F7C8
:10293000119705900D920020E1F70895FB01DC014D
:1029400005900D920020E1F70895FB01DC01415054
:10295000504030F08D910590801919F40020B9F79E
:10296000881B990B0895FB0155915523A9F0BF01D0
:10297000DC014D9145174111E1F759F4CD01059066
:10298000002049F04D9140154111C9F3FB0141115F
:10299000EFCF81E090E001970895DC0101C06D93D5
:1029A00041505040E0F70895FB019F01E894423008
:1029B000C4F04532B4F44A3029F497FB1EF49095E4
:1029C00081959F4F642F77270E942F94805D8A33D3
:1029D0000CF0895D8193CB010097A1F716F45DE2BD
:1029E00051931082C9010C945495FB019F01423010
:1029F00074F0453264F4642F77270E942F94805D31
:102A00008A330CF0895D8193CB010097A1F7108286
:102A1000C9010C945495DC01CB01FC01F999FECF5E
:102A200006C0F2BDE1BDF89A319600B40D92415056
:102A30005040B8F70895F999FECF92BD81BDF89A3C
:102A4000992780B50895A6E1B0E044E050E00C94E9
:102A50000D95A8E1B0E042E050E00C940D95DC014A
:102A6000CB0103C02D910E943A9541505040D0F7C0
:102A70000895262FF999FECF1FBA92BD81BD20BDC2
:102A80000FB6F894FA9AF99A0FBE01960895242F7A
:102A90000E943A95252F0E943A950C944F950E94DA
:102AA0003995272F0C943A95DC01FC01672F719121
:102AB0007723E1F7329704C07C916D937083629124
:0C2AC000AE17BF07C8F30895F894FFCFCD
:102ACC0002014E6F7420666F726D617420686172C2
:102ADC006469736B20433F00201A20202020201BA8
:102AEC0020202020456E64652020204F4B00201AAA
:102AFC0020202020201B20202020656E64202020F8
:102B0C00204F4B00201A20202020201B202020208A
:102B1C0066696E202020204F4B00201A2020202098
:102B2C00201B2020202045696E646520204F4B001F
:102B3C00201820202020201920202020456E64659C
:102B4C002020204F4B00201820202020201920204E
:102B5C002020656E64202020204F4B002018202060
:102B6C00202020192020202066696E202020204F54
:102B7C004B002018202020202019202020204569DF
:102B8C006E646520204F4B00201820202020201937
:102B9C0020202020456E6465200020182020202055
:102BAC00201920202020656E642020002018202071
:102BBC00202020192020202066696E20200020185B
:102BCC002020202020192020202045696E646500DB
:102BDC00456E64652020204F4B00656E64202020DC
:102BEC00204F4B0066696E202020204F4B0045691A
:102BFC006E646520204F4B00546173746520312046
:102C0C0053656B756E6465004B6565702074686503
:102C1C0020627574746F6E004D61696E74656E65BB
:102C2C007A206C6520626F75746F6E00486F7564E6
:102C3C00206465206B6E6F70202020006C616E67C5
:102C4C00206665737468616C74656E2E00707265B5
:102C5C007373656420666F722031207365636F6EC9
:102C6C006400656E666F6E6365652070656E642EBC
:102C7C002031207365630031207365636F6E64656A
:102C8C0020696E67656472756B742E00566572628E
:102C9C00696E64756E67207A756D204D4B20697373
:102CAC007400436F6E6E656374696F6E20746F2071
:102CBC004D4B20697300436F6E6E6578696F6E20A3
:102CCC00E0204D4B206573740056657262696E642A
:102CDC00696E67206D6574204D4B206973006175BA
:102CEC00662057693233322065696E676573746587
:102CFC006C6C740073657420746F205769323332B6
:102D0C00006D6973206120576932333200696E6738
:102D1C00657374656C64206F7020576932333200B0
:102D2C00617566204B6162656C2065696E676573C1
:102D3C0074656C6C740073657420746F206B6162C5
:102D4C00656C206F6E20535632006D6973206120C4
:102D5C006B6162656C207375722053563200766914
:102D6C0061206B6162656C76657262696E64696E16
:102D7C006700506F727461626C6573204B6F707476
:102D8C00657220546F6F6C00506F727461626C6569
:102D9C00204B6F7074657220546F6F6C200066FC52
:102DAC00722046432056657220302E3837780066E4
:102DBC006F722046432056657220302E38377800CB
:102DCC00706F75722046432056657220302E38374E
:102DDC007800566F6F722046432056657220302E55
:102DEC0038377800474E552047504C204C69636566
:102DFC006E73650041546D65676120363434004153
:102E0C00546D65676120363434500041546D6567EC
:102E1C0061203132383450004861726477617265D8
:102E2C0020312E3200486172647761726520312E38
:102E3C00325700486172647761726520312E33001D
:102E4C00486172647761726520312E335700486196
:102E5C0072647761726520332E39002020204C6516
:102E6C00747A746520506F736974696F6E202020BA
:102E7C00002020206C617374202020706F736974A3
:102E8C00696F6E202020002020206465726E6965B9
:102E9C00726520706F736974696F6E20002020203A
:102EAC004C61617473746520706F7369746965200B
:102EBC00202000204272656974656E677220204C78
:102ECC00E46E67656E67722000206C6174697475BE
:102EDC00646520206C6F6E67697475646520006290
:102EEC0072656564746567722E206C656E677465B7
:102EFC0067722E20006CF6736368656E20202020AC
:102F0C00202020207765697465720064656C657497
:102F1C006520202020202020202020657869742026
:102F2C00007375707072696D6572202020202020EE
:102F3C0020706C7573200077697373656E20202088
:102F4C0020202020202076657264657200202020CD
:102F5C0020476F6F676C652045696E6761626520FD
:102F6C0020200020202020476F6F676C6520496E61
:102F7C007075742020202020002020202020206725
:102F8C00656CF673636874202020202020200020BC
:102F9C00202020202064656C65746564202020202E
:102FAC002020202000202020202073757070726952
:102FBC006D65202020202020202000202020202093
:102FCC002067657769737420202020202020202022
:102FDC000053756368652046432E2E2E0073656181
:102FEC00726368696E672046432E2E2E00636865F7
:102FFC00726368616E742046432E2E2E007A6F65C4
:10300C006B2046432E2E2E00456E64652000656EA7
:10301C006420200066696E20200045696E6465009E
:10302C004F6B006F6B0067756564004665686C6577
:10303C0072006572726F72006427657272657572C8
:10304C0000666F757400616B7469760061637469F6
:10305C007600616374696673006163746965660008
:10306C004643206E6963687420676566756E646597
:10307C006E21004643206E6F7420666F756E64215E
:10308C00004643207061732074726F757665210061
:10309C004643206E696574206765766F6E64656E55
:1030AC002100504B542D546F6F6C20474E552047C8
:1030BC00504C00676566756E64656E3A2000666FED
:1030CC00756E643A200074726F7576E9733A20005D
:1030DC006765766F6E64656E3A2000466C6967684A
:1030EC00742D4374726C004E6176692D4374726C4E
:1030FC000056657273696F6E3A200056657273697B
:10310C00653A202000206572776172746574002026
:10311C0065787065637465640020617474656E64B1
:10312C00757300207665727761636874002067653B
:10313C0066756E64656E0020666F756E6400207433
:10314C00726F7576657300206765766F6E64656E59
:10315C0000504B542D546F6F6C206E7572206D693E
:10316C007400504B542D546F6F6C206F6E6C792023
:10317C007769746800504B5420756E697175656D74
:10318C00656E74206176656300504B542D546F6FDF
:10319C006C20616C6C65656E206D65740046432017
:1031AC00536F66747761726520006B6F6D7061741C
:1031BC006962656C00636F6D70617469626C650047
:1031CC00636F6D70617469626C657300636F6D70B1
:1031DC0061746962656C0045696E2020004F6E2039
:1031EC00202000556E2020200041616E20200041DF
:1031FC0075732020004F6666202000447520202027
:10320C0000556974202000455343002020504B5436
:10321C0020617573736368616C74656E3F00202068
:10322C0073687574646F776E20504B54203F002088
:10323C00206465736163746976657220504B542009
:10324C003F002020504B5420756974736368616B88
:10325C00656C656E203F004E65696E2020204A61CA
:10326C00006E6F20202020796573006E6F6E202019
:10327C00206F7569004E6565202020204A6100563C
:10328C00657262696E6465205043206D69742050CC
:10329C004B54202000436F6E6E65637420504320A6
:1032AC00746F20504B542D555342006173736F63F0
:1032BC00696572205043206120504B542D55534268
:1032CC000056657262696E64205043206D657420EF
:1032DC00504B54202020004472FC636B6520275314
:1032EC00746172742720616D20504B5400507265CC
:1032FC0073732027537461727427206F6E20504BA8
:10330C0054200070726573736520276C616E636561
:10331C007227206120504B54004472756B20275348
:10332C007461727427206F7020504B542020002041
:10333C0020202020202020202020456E6465205352
:10334C007461727400202020202020202020202056
:10335C00456E64202053746172740020202020205C
:10336C00202020202066696E20206C616E636572BF
:10337C00002020202020202020202045696E64651C
:10338C00205374617274002050432D517569636B26
:10339C002D56657262696E64756E6720002050430D
:1033AC002D517569636B2D436F6E6E656374696F18
:1033BC006E20002050432D636F6E6E6578696F6EC2
:1033CC0020726170696465200020536E656C6C65B9
:1033DC002050432D76657262696E64696E67005683
:1033EC00657262696E64652064617320504B542071
:1033FC006D697400436F6E6E65637420504B54207E
:10340C0077697468204D4B00636F6E6E65637465ED
:10341C007A20504B54206120204D4B00566572622F
:10342C00696E6420504B5420200064656D204D4B18
:10343C0020FC6265723A002020206F766572202095
:10344C0020203A002020612070726F706F73203A38
:10345C00002020206D657420202020203A00646517
:10346C006D204D4B20FC6265723A20204B616265E9
:10347C006C2C20006F7665723A204B6162656C0093
:10348C00612070726F706F733A204361626C6500DB
:10349C004D4B207669613A206B6162656C2020206F
:1034AC00202020202000657320697374206B6569CF
:1034BC006E2057692E32333200746865726520694C
:1034CC0073206E6F2057692E323332006C206E27BA
:1034DC0079612070617320646520006572206973C6
:1034EC00206765656E2077692E32333220004D6F70
:1034FC0064756C2065696E6765626175742E006217
:10350C0075696C7420696E2E006D6F64756C652026
:10351C00696E7465677265205769323332006D6F5E
:10352C0064756C6520696E6765626F7577642E00D3
:10353C0057656E6E20646F63682C2064616E6E201C
:10354C006269747465006966207965732C207468EF
:10355C00656E20666972737400536920766F75739B
:10356C00206C6520666169746573007A6F206A61EE
:10357C002C2064616E206175622065657273740025
:10358C00646173204D6F64756C207A756572737409
:10359C0020696D2020006163746976617465206D0B
:1035AC006F64756C20696E00616374697665722056
:1035BC006C65206D6F64756C65006465206D6F645F
:1035CC00756C6520616B7469766572656E00536508
:1035DC007475706D656EFC20616B746976696572CB
:1035EC00656E2E0053657475706D656E7500646143
:1035FC006E73206D656E7520646520636F6E6669F1
:10360C00672E00696E206865742053657475706D43
:10361C00656E752E00536965206DFC7373656E20A5
:10362C0064617320504B5400596F75206861766546
:10363C0020746F00566F757320646576657A00553B
:10364C00206D6F657420646520504B54006A65745E
:10365C007A74206E6575207374617274656E2100C6
:10366C007265737461727420504B5400726564659A
:10367C006D617272657220504B54006E75206F70C4
:10368C006E69657577207374617274656E2100457F
:10369C007320697374206B65696E2042544D2D3212
:1036AC003232005468657265206973206E6F204257
:1036BC00544D2D3232320045722069732067656596
:1036CC006E2042544D2D323232004D6F64756C2099
:1036DC0065696E676562617574004D6F64756C2009
:1036EC006275696C7420696E006D6F64756C652011
:1036FC00696E74656772652042544D323232002017
:10370C004D4B2D5553422046756E6B74696F6E2070
:10371C0000204D4B2D5553422046756E6374696FD6
:10372C006E2000204D4B2D55534220666F6E6374F6
:10373C00696F6E2000204D4B2D5553422046756EFF
:10374C0063746965202000204254202D2D3E204BAF
:10375C006162656C20616E2046432020002042543B
:10376C00202D2D3E204B6162656C20746F204643EA
:10377C00202000204254202D2D3E204361626C6598
:10378C00206120204643202000204254202D2D3E35
:10379C00206B6162656C206E616172204643005043
:1037AC0043206D697420425420766572622E00634A
:1037BC006F6E6E6563742050432077697468204285
:1037CC0054006173736F63696572205043206120EC
:1037DC004254005043207669612042542076657231
:1037EC00626F6E64656E2E00504B542D4B6162659A
:1037FC006C20616E20464300504B542D4B6162652A
:10380C006C20746F20464300504B542D4361626C06
:10381C0065206120464300504B542D6B6162656CF2
:10382C00206E61617220464300204254202D2D3EB3
:10383C002057692E323332202020202020200057A0
:10384C00692E32333220616E204643202020202006
:10385C00202020200057692E32333220746F2046EE
:10386C00432020202020202020200057692E323396
:10387C0032206120464320202020202020202020A0
:10388C000057692E323332206E616172204643201C
:10389C002020202020200020555342202D2D3E207A
:1038AC004B6162656C20616E2046432000205553AD
:1038BC0042202D2D3E206361626C6520746F204682
:1038CC0043200020555342202D2D3E206361626C15
:1038DC00652061204643202000555342202D2D3E6B
:1038EC00206B6162656C206E6161722046430050F2
:1038FC0043206D6974205553422076657262696E5F
:10390C0064656E2000636F6E6E6563742050432097
:10391C0077697468205553422020006173736F637C
:10392C00696572205043206120555342202020208D
:10393C000056657262696E64205043206D65742078
:10394C005553422020200020555342202D2D3E203F
:10395C0057692E323332202020202020004D4B2D51
:10396C00546F6F6C207374617274656E0073746144
:10397C007274204D4B2D546F6F6C0064656D6172C9
:10398C0072616765204D4B2D546F6F6C0020576929
:10399C002E323332204B6F6E6669677572696572B1
:1039AC00656E002057692E32333220436F6E666984
:1039BC006775726174696F6E002057692E323332ED
:1039CC0020636F6E66696775726572202020002017
:1039DC0057692E32333220436F6E66696775726198
:1039EC00746965200050726F6772616D6D2073741D
:1039FC00617274656E2E20202020007374617274C5
:103A0C002070726F6772616D200044E96D61727293
:103A1C006572206C652070726F6772616D6D6500E8
:103A2C0073746172742070726F6772616D6D612E48
:103A3C000042544D2D323232204B6F6E66696775E1
:103A4C0072696572656E0042544D2D3232322063BC
:103A5C006F6E66696775726174696F6E0042544D62
:103A6C002D32323220646520636F6E666967757221
:103A7C00612E0042544D2D32323220636F6E6669D6
:103A8C0067757261746965004643203E204D4B2D6D
:103A9C00555342203E2042544D2D323232004D4B74
:103AAC002D55534220616E20504320616E73636824
:103ABC006C2E2000636F6E6E65637420504320740F
:103ACC006F204D4B2D55534220006173736F63690A
:103ADC0065722050432061204D4B2D5553422000E0
:103AEC0056657262696E64205043206D6574204D7A
:103AFC004B2D555342005A7769736368656E204DA0
:103B0C004B2D55534220756E64202000636F6E6EF2
:103B1C006563742063726F73736564206361626C98
:103B2C0065006C6120636F6E6E6578696F6E2065E1
:103B3C006E7472652050430054757373656E204D1E
:103B4C004B2D55534220656E20504B542000504B4A
:103B5C00542065696E2067656B7265757A74657340
:103B6C00202020006265747765656E204D4B2D55C5
:103B7C00534220616E64202020006574204643204F
:103B8C00756E206361626C652063726F697365008A
:103B9C0065656E2067656B727569737465206B6102
:103BAC0062656C2020004B6162656C20616E7363F2
:103BBC00686C69657373656E2E202000504B542021
:103BCC0053563200200061616E736C756974656EBA
:103BDC002E004B6162656C006361626C6500536C16
:103BEC0061766520006573636C61766573004E6F5A
:103BFC00726D616C006E6F726D616C004E6F726DE8
:103C0C002E20005265766572736500696E7665725A
:103C1C007365006765696E76657200456E64202079
:103C2C0020204F4B0046696E202020204F4B004532
:103C3C00696E642020204F4B0020454550726F6DFB
:103C4C00207769726B6C69636800205265616C79CE
:103C5C002064656C6574650020656570726F6D20FD
:103C6C007375707072696D65723F00204565707276
:103C7C006F6D207765726B656C696A6B00206CF6F2
:103C8C00736368656E3F0020454570726F6D3F0031
:103C9C0020202020002077697373656E3F006465D7
:103CAC00757473636820202020006765726D616EE7
:103CBC00202020202000616C6C656D616E64652095
:103CCC002000647569747320202020202000656E0C
:103CDC00676C6973636820202000656E676C69737C
:103CEC00682020202000616E676C6169736520205C
:103CFC002000656E67656C732020202020006672A2
:103D0C00616E7AF67369736368006672656E6368D8
:103D1C002020202020006672616EE76169736520A7
:103D2C0020006672616E7320202020202000686FB6
:103D3C006C6CE46E6469736368006475746368200A
:103D4C00202020202000686F6C6C616E64616973A8
:103D5C0065006E656465726C616E64732000416E03
:103D6C007A656967652045696E7374656C6C756EF0
:103D7C0067656E0020446973706C617920536574BB
:103D8C00757020202020202020002064276166668A
:103D9C0069636861676520636F6E6669672E2000D2
:103DAC00446973706C617920696E7374656C6C69AD
:103DBC006E67656E2000496E666F732062656920C0
:103DCC0053746172743A00496E666F20617420738B
:103DDC007461727475702000496E662E6175206472
:103DEC00656D61727261676500496E666F2062690C
:103DFC006A206F70737461727400537072616368BF
:103E0C0065203A20004C616E67756167653A200049
:103E1C006C61206C616E6775653A20005461616C51
:103E2C003A20004C6963687420617573206E61637D
:103E3C00683A004C69676874206F66662061667426
:103E4C0065723A00457874692E6665757820702E17
:103E5C006C65733A004C6963687420756974206EE4
:103E6C00613A2020004C43442048656C6C69676BB8
:103E7C002E3A00204272696768746E657373203A3B
:103E8C0000206C756D696E6F73697465203A002043
:103E9C00696E74656E7369746569743A004C434459
:103EAC00204B6F6E74726173743A004C4344206300
:103EBC006F6E74726173743A004C4344204E6F728F
:103ECC006D2F496E763A20004C4344204F72696541
:103EDC006E742E3A20005243204665686C657270F1
:103EEC00696570203A005243204572726F726265A8
:103EFC00657020203A00446562756720504B540071
:103F0C0057692054582F5258204368616E3A005715
:103F1C0069204E6574572E204772702E3A005769EF
:103F2C00204E6574572E204D6F64653A00576920FA
:103F3C0054582054696D656F75743A005769205553
:103F4C00415254204D54552020203A0057692E32AE
:103F5C0033322065696E6765626175743A00576922
:103F6C002E323332206275696C7420696E203A00EF
:103F7C0057692E32333220696E7465677265202062
:103F8C003A0057692E32333220696E6765626F755D
:103F9C0077643A004973742065696E2057692E3234
:103FAC0033322D4D6F64756C200049732057693284
:103FBC003332206D6F64756C0065737420756E20E0
:103FCC006D6F64756C6520004973206572206565A2
:103FDC006E2057692E3233320065696E67656261F7
:103FEC0075743F006275696C7420696E3F00696E70
:103FFC0074656772652057693233323F006D6F64A8
:10400C00756C6520696E6765626F7577643F004AF1
:10401C006120200079657320006F756920004E6562
:10402C00696E006E6F2020006E6F6E20004E65650D
:10403C00200042544D3232322065696E67656261F0
:10404C0075743A0042544D323232206275696C7488
:10405C0020696E203A0042544D32323220696E741F
:10406C006567726520203A0042544D323232206925
:10407C006E6765626F7577643A0049737420656981
:10408C006E2042544D2D3232322D4D6F64756C00C2
:10409C0049732042544D2D323232204D6F64756C71
:1040AC000049732065722065656E2042544D2D3297
:1040BC00323200696E74656772652042544D32323B
:1040CC00323F0020504B5420416B6B752045696E7C
:1040DC007374656C6C756E670020504B5420416393
:1040EC0063752053657475702020202020200050AB
:1040FC004B5420416B6B757479703A2000504B54C3
:10410C0020416363757479703A2000504B54204100
:10411C00636375747970653A2000416B6B7520553B
:10412C00204F66667365743A2000416363752055B1
:10413C00204F66667365743A20004F66667365742B
:10414C00207665727374656C6C656E2062697300A1
:10415C0061646A757374206F666673657420756E1E
:10416C0074696C00446563616C616765206C2761E0
:10417C006A757374657220004F666673657420618E
:10418C0066726567656C656E20746F740064696532
:10419C00205370616E6E756E67207061737374005E
:1041AC00766F6C7461676520666974730061206C4E
:1041BC00612074656E73696F6E0064652073706145
:1041CC006E6E696E67206A756973742069732E0050
:1041DC004C6F77426174205761726E20563A004CD6
:1041EC006F7742617420616C61726D203A005600E9
:1041FC0046004C0048004200440041004700520079
:10420C004645484C45523A20446174656E76657259
:10421C006C75737420004552524F523A20446174AD
:10422C0061206C6F73740070657274652064652016
:10423C00646F6E6E6565730076657262696E646933
:10424C006E672076657262726F6B656E20004C65CE
:10425C00747A74652062656B616E6E7465004C6176
:10426C007374206B6E6F776E20004465726E696597
:10427C00726520706F736974696F6E004C61617444
:10428C0073742062656B656E646500506F7369743E
:10429C00696F6E2000706F736974696F6E20000017
:1042AC00706F736974696520002045696E7374655D
:1042BC006C6C756E67656E207820202020200020A5
:1042CC0053657474696E672078202020202020208C
:1042DC00202020200020506172616D65747265731E
:1042EC00207820202020202020200020496E73746C
:1042FC00656C6C696E67656E20782020202020200C
:10430C0000E46E6465726E006368616E6765006CD4
:10431C0065206368616E67656D656E7400766572A5
:10432C00616E646572696E6700616B74697669654C
:10433C0072656E00616374697661746500616374A3
:10434C00697665720061637469766572656E006189
:10435C006B746976696572740061637469766174F3
:10436C006564006163746976656500676561637493
:10437C00697665657264002053657474696E672094
:10438C00782073706569636865726E3F0020737482
:10439C006F72652073657474696E673F0020526597
:1043AC00676C616765206D61676173696E3F0020A2
:1043BC00696E7374656C6C2E6F7020746520736CF1
:1043CC0061616E3F004765737065696368657274FF
:1043DC0020756E640073746F72656420616E640086
:1043EC0073746F636B6573206574006F70676573AE
:1043FC006C6167656E20656E004B6F7069657265E8
:10440C002053657474696E6700636F7079207365EF
:10441C007474696E677300706172616D6574726536
:10442C007320646520636F706965006B6F706965DC
:10443C00657220696E7374656C2E0020766F6E2029
:10444C00207820206E616368202079002066726FCE
:10445C006D207820746F207900206465732078209B
:10446C0061707265732079002076616E2078206E01
:10447C0061207900766F6E2020206E6163682020A9
:10448C00456E64652020204F4B0066726F6D2020B6
:10449C00746F20202020656E64202020204F4B005C
:1044AC0064657320202061707265732066696E20CC
:1044BC002020204F4B0076616E2020206E61202042
:1044CC00202065696E646520204F4B005769726B24
:1044DC006C696368206B6F70696572656E3F007202
:1044EC0065616C6C7920636F70793F0076726169DD
:1044FC006D656E7420636F7069653F0065636874E9
:10450C00206B6F7069653F004B6F7069657274202A
:10451C00756E6420616B7469766965727400636F83
:10452C007069656420616E6420616374697661747E
:10453C0065642000636F7069657320657420616326
:10454C0074696673004B6F706965EB6E20656E2045
:10455C0061637469656600C46E6465726520456943
:10456C006E7374656C6C756E67656E200020202010
:10457C006368616E67652073657474696E67732018
:10458C002020006D6F646966696572206C6573200C
:10459C007265676C6167657300696E7374656C6CCA
:1045AC00696E67656E2077696A7A6967656E002047
:1045BC0057E4686C6520506172616D65746572209A
:1045CC0020202020002073656C656374207061725C
:1045DC00616D65746572732020200073656C656372
:1045EC0074696F6E6E657A20506172616D65742EA0
:1045FC000053656C65637465657220506172616D02
:10460C00657465727320002057E4686C65205365EF
:10461C0069746520202020202020202000202020CC
:10462C00202073656C6563742070616765202020A1
:10463C0020200053656C656374696F6E6E657A201B
:10464C006C6120706167652000202053656C656388
:10465C007465657220706167696E6120202000208E
:10466C0057E4686C652053657474696E673A202052
:10467C002020202000202073656C656374207365F6
:10468C007474696E6720202020200053656C65636C
:10469C0074696F6E6E657A2073657474696E6720C9
:1046AC0000202053656C65637465657220736574B6
:1046BC0074696E67202000150002010201020102DC
:1046CC0001150018012E0144015A011500700186D4
:1046DC00019C01B2011500C801DA01EC01FE0115C3
:1046EC000010021A0224022E021500380248025849
:1046FC00026C0215007C028D02A202B7021500CCDE
:10470C0002E202F602090315001E03340341034DB5
:10471C00031500600376038A039E031500B203C8D9
:10472C0003C803C8031500DE03EF030004120415CD
:10473C000024042404240424041500340434043414
:10474C0004340415003F043F043F043F0415004BA0
:10475C00044B044B044B04150058045804580458DB
:10476C000415006504650465046504150073047381
:10477C000473047304150080048004800480041501
:10478C00008E048E048E048E0415009B04B104C7A5
:10479C0004DD041500F304090509051F0515003592
:1047AC00054B056105770515008D05A305A305A32C
:1047BC00051500B905CF05E505FB05150011061D0E
:1047CC00062D063D06150048064E0654065A0615DB
:1047DC0000600663066306660615006B06720678B3
:1047EC00068106150086068C06920699061500A011
:1047FC0006B306C106D0061500E206E206E206E2A2
:10480C00061500F306FE060607100715001B071B0E
:10481C00071B071B0715002707270727072707155F
:10482C00003107310731073B07150045074F075982
:10483C0007630715006D0777077E0787071500913B
:10484C0007A207B507C9071500DD07DD07DD07DD82
:10485C00071500EA07F50700080C08150017081DD6
:10486C00082308290815002F0835083B08410815AE
:10487C0000470847084708470815004B085E086FB3
:10488C0008820815009708A108AB08B5081500BFE9
:10489C0008D508EB080109150017092D094309591A
:1048AC000915006F0985099B09B1091500C709DDB8
:1048BC0009F309090A15001F0A340A480A5C0A158B
:1048CC00006A0A770A840A910A15009E0AB40AC083
:1048DC000AD00A1500E60AF90A0C0B1B0B15002E60
:1048EC000B3F0B490B5E0B1500700B860B990BAB3A
:1048FC000B1500C00BD60BE80BFA0B15000E0C2495
:10490C000C2E0C430C1500550C680C740C7F0C15FC
:10491C00008D0CA00CAC0CBB0C1500CF0CE30C0CDC
:10492C000BF70C15000A0D1A0D290D5E0B15003F27
:10493C000D510D630D750D1500870D9D0DB30DC932
:10494C000D1500DF0DEF0D020E130E1500280E389D
:10495C000E480E570E1500690E690E690E690E157C
:10496C00007F0E950EAB0EC10E1500D70EED0E038B
:10497C000F190F15002F0F450F5B0F710F150087C7
:10498C000F870F870F870F15009D0FAD0FBB0FAD56
:10499C000F1500CD0FE30FF90F0F10150025103B6D
:1049AC00104A1060101500711087109D10B310156F
:1049BC0000C810C810C810C8101500DE10F4100A7A
:1049CC00112011150036114C116211781115008E41
:1049DC0011A411BA11D0111500E611FC1104120624
:1049EC00121500121218121812121215001E121E95
:1049FC001225121E1215002E122E1235123C1215F3
:104A0C000043124B124B125312150010025B12652D
:104A1C00126F12150079128A129812AB121500BD82
:104A2C0012C712D012D5121500DE12EA12F61202BB
:104A3C001315000E131A132613321315003E134AC6
:104A4C00135613621315006E137A138613921315F3
:104A5C00009E13B413CA13E0131500F613071418B1
:104A6C0014291415003A14451450145C14150063E1
:104A7C00147314841495141500A514B314C114CF15
:104A8C00141500DD14EB14EB14EB141500F914F9E8
:104A9C0014F914F91415000815081508150815153E
:104AAC00001615261526152615150036153615363D
:104ABC001536151500401540154015401515004FBD
:104ACC00154F154F154F1515005E155E155E155ECD
:104ADC001515006D156D156D156D1515007C157C76
:104AEC00157C157C1515008C159E15B015C2151569
:104AFC0000D415EA15F91508161500191624162EEA
:104B0C00163D1615004F16541659164F1615005E05
:104B1C0016631668166D161500721684169616A86E
:104B2C00161500BA16D016F915E11615001916242B
:104B3C0016F3163D16150003171917191719171523
:104B4C00002F173D173D174B1715005A176A176A98
:104B5C00176A1715002F173D173D174B1715007ABD
:104B6C00179017A417B8171500CD17E017ED17FA03
:104B7C001715001018101810181F1815002E1830C3
:104B8C00183218301815003418361838183A181509
:104B9C0000321832183C18321815003E183E1838DE
:104BAC00183E181500401856186718781815008EFE
:104BBC00189E18AA18BC181500CB18D518DF18E0C9
:104BCC00181500E918FF1815192B1915004119486B
:104BDC00194F195D191500691974197D1985191565
:104BEC00008F199919A319AB191500B719CD19DD37
:104BFC0019EF191500051A151A201A2B1A15003958
:104C0C001A491A571A6B1A15007B1A8C1A991AA87A
:104C1C001A1500B41ACA1AE01AF61A15000C1B1F42
:104C2C001B2C1B3C1B1500481B5E1B741B851B158A
:104C3C0000971BAD1BC31BD91B1500EF1B051C1BC1
:104C4C001C311C1500471C5D1C731C891C15009F16
:104C5C001CB51CCB1CE11C4D6F746F723B566572FE
:104C6C0073696F6E3B536574706F696E74206869FD
:104C7C0067683B536574706F696E74206C6F773B1B
:104C8C0053746174653B526561644D6F64653B435D
:104C9C00757272656E743B4D617850574D3B54651F
:104CAC006D70657261747572650D003B000D000AC4
:104CBC0000FFFFFF01010A001E00FFFF016400015D
:024CCC000100E5
:00000001FF
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/CHANGE.LOG
0,0 → 1,92
/****************************************************************************
* Copyright (C) 2011 by Christian "cebra" Brandtner *
* brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
!!Vor dem Kompilieren in der main.h die Hardwareversion einstellen!!
 
 
24.1.2012 V3.5.8d Cebra
Fehlerpiepen beim Empfangsausfall im OSD Screen ist im Setup schaltbar
 
23.2.2012 V3.5.8c Cebra
Sprachunterstützung verbessert
Letzte Postion in OSD verbessert, bei Datenverlust automatisches Reconnect
Akkuanzeige im MK-USB Betrieb.
 
7.1.2012 V3.5.8 Cebra
Languagesupport für die Menüs eingebaut, 4 Sprachen sind möglich, z.Z. Deutsch und Englisch in den Menüs und zusätzlich Französisch im Parametermenü.
Ein paar Änderungen im Bereich Setup Wi232 und BTM222
 
30.12.2011 V3.5.7a Cebra
Moduleinit wurde nicht immer gespeichert, dadurch Init der Module beim Start obwohl nicht notwendig.
Bluetooth wird beim ersten Betätigen der Einschalttaste aktiviert um USB auszuschalten, damit der angeschlossene PC erstmal ruhig bleibt.
 
30.12.2011 V3.5.7 Cebra
PKT Setup für Akkutyp und Spannungsmessung
 
28.12.2011 V3.5.6a Cebra
Lipo Spannungsmessung eingebaut
 
26.10.2011 V3.5.3 Cebra
Fehler bei der Bluetoothinitialisierung beseitigt
 
 
25.8.2011 V3.4.4Cebra
Initsequenzen für Wi232 und BT erfolgen nur wenn sich was ändert oder sie neu sind.
Lipowarnung verbessert
Lastposition in OSD wird gespeichern wenn Verbindung zum MK verlorengegenagen ist
Beim Start von PKT wird sie angezeigt.
 
14.08.2011 V3.4.3 Cebra
Anpassungen an neue Hardware, Bluetooth, Wi232, interne seriell Switche, PKT Lipowarnung
 
 
30.7.2011 V3.4.1 Cebra
Abschalten des PKT über Menütaste
 
29.7.2011 V3.4.0 Cebra
Summeranschaltung für HW1.2 angepasst, ist jetzt Summer an GND und Pin 25
Vorbereitungen für neue Hardware 3.9
 
 
25.7.2011 V3.3.4
BL-Controller(0-12) Test with CSV-Output over USB (HW1.2 Uart0, HW>1.2 Uart1=USB)
Setupmenu Wi232 Parameter Uart Timeout, Uart MTU
 
15.7.2011 V3.2.3
 
HW1.3
Beim Rücksprung aus der Wi Konfig fällt die rechte Led der Beleuchtung aus.
(PGM des Wi allerdings noch nicht angeschlossen!)
nur durch Hardwareänderung lösbar PD6 Pin für Wi232
 
Die Pfeile am Display im Setup PMK Menue sind noch <- -> statt oben und unten.
 
 
1.7.2011 cebra
Bugfixes: Summer(PC7) bei Unterspannung, Setup Wi232, Kosmetik
 
27.6.2011 cebra
 
PKT Setup überarbeitet, Setupmenü ist jetzt erweiterbar, Quick and Dirty war nix ;-)
 
26.6.2011 cebra
 
Das EEprom des PKT wird beim Starten geprüft ob es schon initialisiert ist.
Falls nicht werden Defaultwerte gesetzt.
 
Displayausrichtung kann im Setupmenü geändert werden
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW1_2.c
0,0 → 1,132
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.2 sebseb7
 
 
#ifndef HAL_HW1_2_C_
#define HAL_HW1_2_C_
 
 
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
 
#include "usart.h"
#include "uart1.h"
#include "lcd.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRC |= (1<<DDC0)|(1<<DDC1)|(1<<DDC6)|(1<<DDC5)|(1<<DDC7);
DDRD |= (1<<DDD7);
DDRB = 0xFF;
 
set_LED1();
 
set_D_LIGHT();
Timer0_Init ();
Timer1_Init (); // pwm
Timer2_Init (); // Displaybeleuchtung
LCD_Init (0);
BeepTime = 500;
BeepMuster = 0x0080;
 
// _delay_ms(250);
 
clr_LED1();
Display_on = 1;
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
// I2C_Init(1);
sei ();
 
ReadParameter ();
LCD_Init (1);
OCR2A =LCD_Helligkeit*2.55;
#ifdef HWVERSION1_2W
if (WiIsSet==false)
InitWi232(); /* wenn Wi232 nicht initialisiert ist, dann jetzt tun*/
else
{
discoverWi232(); /* Wi232 suchen*/
_delay_ms(1000);
}
#endif
}
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
PORTC &= ~(1<<PORTC0);
PORTC &= ~(1<<PORTC1);
PORTD &= ~(1<<PORTD7);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
PORTC |= (1<<PORTC0);
PORTC |= (1<<PORTC1);
PORTD |= (1<<PORTD7);
}
 
 
 
#endif
#endif /* HAL_HW3_2_C_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW1_2.h
0,0 → 1,99
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.2 sebseb7
 
 
/* Belegung der Ports*/
/*Hardware 1.2 sebseb7 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Displaybeleuchtung PD7 Pin 16 LED an +
Displaybeleuchtung PC0 Pin 10 LED an +
Displaybeleuchtung PC1 Pin 20 LED an +
Summer PC6 Pin 25 Summer an GND
Wi232 PC7 Pin 26 Wi232 CMD Pin
 
*/
 
 
 
 
 
#ifndef HAL_HW1_2_H_
#define HAL_HW1_2_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define set_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define clr_LED1() (PORTC |= (1 << PC3))
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define clr_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define set_BEEP() (PORTC |= (1 << PC6))
 
#define set_WI232CMD() (PORTC &= ~(1 << PC7))
#define clr_WI232CMD() (PORTC |= (1 << PC7))
 
 
#define KEY_PIN PINA
 
#define KEY_ENTER PA7
#define KEY_ESC PA6
#define KEY_PLUS PA5
#define KEY_MINUS PA4
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus*/
 
void InitHWPorts(void);
 
#endif /* HAL_HW1_2_H_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW1_3.c
0,0 → 1,137
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.3 sebseb7
// * USB,LED
 
 
#ifndef HAL_HW1_3_C_
#define HAL_HW1_3_C_
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
 
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRD |= (1<<DDD7)|(1<<DDD6);
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC6)|(1<<DDC5)|(1<<DDC7); /* Leds,Summer*/
 
DDRB = 0xFF;
set_LED1();
 
BeepTime = 500;
BeepMuster = 0x0080;
 
set_D_LIGHT();
clr_WI232CMD();
_delay_ms(250);
 
clr_LED1();
 
 
Display_on = 1;
 
LCD_Init (0);
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); /* USB*/
uart1_putc('R');
// I2C_Init(1);
 
Timer0_Init ();
Timer1_Init (); // pwm
Timer2_Init (); // Displaybeleuchtung
sei ();
 
ReadParameter ();
LCD_Init (1);
OCR2A =LCD_Helligkeit*2.55;
// InitWi232();
#ifdef HWVERSION1_3W
if (WiIsSet==false)
InitWi232(); /* wenn Wi232 nicht initialisiert ist, dann jetzt tun*/
else
{
discoverWi232(); /* Wi232 suchen*/
_delay_ms(1000);
}
#endif
 
}
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
PORTD &= ~(1<<PORTD6);
PORTC &= ~(1<<PORTC2);
PORTD &= ~(1<<PORTD7);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
PORTD |= (1<<PORTD6);
PORTD |= (1<<PORTD7);
PORTC |= (1<<PORTC2);
}
 
 
#endif
#endif /* HAL_HW1_3_C_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW1_3.h
0,0 → 1,108
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.3 sebseb7
// * USB,LED
 
 
/*Hardware 1.3.1 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Bootlader LED PC3 Pin 22 LED an GND
Summer PC6 Pin 25 Summer an GND
Displaybeleuchtung PD6 Pin 15 LED an +
Displaybeleuchtung PD7 Pin 16 LED an +
Displaybeleuchtung PC2 Pin 21 LED an +
Wi232 PC7 Pin 26 Wi232 CMD Pin
 
 
*/
 
 
 
 
#ifndef HAL_HW1_3_H_
#define HAL_HW1_3_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define clr_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define set_LED1() (PORTC |= (1 << PC3))
 
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define clr_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define set_BEEP() (PORTC |= (1 << PC6))
 
 
#define set_WI232CMD() (PORTC &= ~(1 << PC7))
#define clr_WI232CMD() (PORTC |= (1 << PC7))
 
 
#define KEY_PIN PINA
 
 
#define KEY_ENTER PA7
#define KEY_ESC PA6
#define KEY_PLUS PA5
#define KEY_MINUS PA4
 
 
 
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus*/
 
 
void InitHWPorts(void);
void Port_USB2FC(void);
 
#endif /* HAL_HW1_3_H_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW3_1.c
0,0 → 1,122
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V3.2 Cebra
// * USB,Wi232,LED
 
 
#ifndef HAL_HW3_2_C_
#define HAL_HW3_2_C_
 
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#ifdef HWVERSION3_1
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRD |= (1<<DDD7)|(1<<DDD6);
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC7); /* Leds,Summer*/
 
DDRB = 0xFF;
set_LED1();
set_LED2();
set_LED3();
set_LED4();
 
BeepTime = 500;
BeepMuster = 0x0080;
 
set_D_LIGHT();
clr_WI232CMD();
_delay_ms(250);
 
clr_LED1();
clr_LED2();
clr_LED3();
clr_LED4();
 
Display_on = 1;
 
LCD_Init ();
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); /* USB*/
uart1_putc('R');
I2C_Init(1);
 
Timer0_Init ();
Timer1_Init (); // pwm
// TIMER2_Init(); //PWM Displaybeleuchtung
 
sei ();
 
ReadParameter ();
LCD_Init ();
InitWi232();
 
}
 
 
 
 
#endif
#endif /* HAL_HW3_2_C_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW3_1.h
0,0 → 1,108
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V3.2 Cebra
// * USB,Wi232,LED
 
 
/* Hardware 3.1 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Wi.232 CMD PD6 Pin 15 aktiv low
Displaybeleuchtung PD7 Pin 16 LED an +
I2C PC0 Pin 19
I2C PC1 Pin 20
LED2 PC2 Pin 21 LED an +
LED1 PC3 Pin 22 LED an +
Summer PC6 Pin 25 Summer an +
LED3 PB1 Pin 41 LED an +
LED4 PB0 Pin 40 LED an +
 
*/
#ifndef HAL_HW3_2_H_
#define HAL_HW3_2_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define set_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define clr_LED1() (PORTC |= (1 << PC3))
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define set_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define clr_BEEP() (PORTC |= (1 << PC6))
 
 
#define set_D_LIGHT() (PORTD |= (1 << PD7)) // Displaybeleuchtung
#define clr_D_LIGHT() (PORTD &= ~(1 << PD7))
#define set_WI232CMD() (PORTD &= ~(1 << PD6))
#define clr_WI232CMD() (PORTD |= (1 << PD6))
 
 
#define KEY_PIN PINA
 
//#if defined HWVERSION1_2 || defined HWVERSION1_3 || defined HWVERSION3_2
//#define KEY_ENTER PA7
//#define KEY_ESC PA6
//#define KEY_PLUS PA5
//#define KEY_MINUS PA4
//#endif
 
/*in der Hardwareversion sind die Tasten im Layout verdreht*/
#define KEY_ENTER PA4
#define KEY_ESC PA5
#define KEY_PLUS PA6
#define KEY_MINUS PA7
 
 
 
void InitHWPorts(void);
 
#endif /* HAL_HW3_2_H_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW3_9.c
0,0 → 1,196
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef HAL_HW3_9_C_
#define HAL_HW3_9_C_
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdbool.h>
#include "main.h"
#if defined HWVERSION3_9
#include "messages.h"
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
#include "uart1.h"
#include "bluetooth.h"
#include "error.h"
#include "connect.h"
#include "lipo.h"
#include "setup.h"
 
 
volatile uint8_t USBBT;
volatile uint8_t U02SV2;
 
 
//--------------------------------------------------------------
void InitHWPorts(void) // Initialisierung der Hardware für die jeweilige Leiterplattenversion
 
{
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7); // Enable Pull Up for the 4 keys
DDRA &= ~(1<<DDA4); // Eingang: A4 auf Low setzen (Power On)
 
DDRB = 0xFF; // Alles Ausgänge
 
PORTC |= (1<<PORTC4)|(1<<PORTC7); // Enable Pull Up for LBO + Summer
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC5)|(1<<DDC6)|(1<<DDC7); // Ausgang: Led2,Rs232Switch,Summer
DDRC &= ~(1<<DDC4); // Eingang: LowBat LTC1308
set_BTOn(); // Erstmal USB dektivieren, damit beim versehentlichen Einschalten USB im PC ruhig bleibt
 
PORTD |= (1<<PORTD6); // Wi232-CMD auf High schalten
DDRD |= (1<<DDD4)|(1<<DDD5)|(1<<DDD6)|(1<<DDD7); // Ausgang: PiepserTest, Servo, Wi232-CMD und Beleuchtung
 
set_V_On(); // Spannung mit T3 halten
 
Timer0_Init (); // system
Timer1_Init (); // pwm
Timer2_Init (); // display
 
 
Display_on = 1;
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); // USB
I2C_Init(1);
 
 
sei ();
 
LCD_Init (0); // muss vor "ReadParameter" stehen
ReadParameter (); // Aktuelle Werte aus EEProm auslesen
 
if (DisplayLanguage > NUM_LANG) // Beim ersten Start Sprache abfragen
{ DisplayLanguage = 1;
DisplayLanguage = Edit_Language(DisplayLanguage,0,3,DISPLAY3);
WriteParameter();
}
 
 
OCR2A = LCD_Helligkeit * 2.55;
LCD_Init (1);
BeepTime = 200;
BeepMuster = 0x0080;
ADC_Init(); // ADC für Lipomessung
// Power On Delay
// lcd_printp_at (2,2,PSTR("Taste 1 Sekunde"), 0);
// lcd_printp_at (2,3,PSTR("lang festhalten."), 0);
 
lcd_puts_at(0, 2, strGet(BOOT1), 0);
lcd_puts_at(0, 3, strGet(BOOT2), 0);
 
_delay_ms(800);
 
if (PINA & (1<<PINA7)) // Spannung eingeschaltet lassen
clr_V_On();
 
_delay_ms(100);
BeepTime = 500;
BeepMuster = 0x0080;
get_key_press(KEY_ALL);
 
lcd_cls();
 
if ((UseWi == true) && (WiIsSet == false))
{
InitWi232(); // wenn Wi232 nicht initialisiert ist, dann jetzt tun
}
 
lcd_cls();
set_USBOn(); // USB erstmal wieder einschalten
if ((UseBT == true) && (BTIsSet == false))
{
bt_init();
set_USBOn();
}
 
lcd_cls();
 
if ((UseWi == true) && (U02SV2 == 0))
{
Change_Output(Uart02Wi); // Verbindung zu Wi232 herstellen
if (PKT_StartInfo == true)
{
// lcd_printp_at (0, 0, PSTR("Verbindung zum MK ist"), 0);
// lcd_printp_at (0, 1, PSTR("auf Wi232 eingestellt"), 0);
lcd_puts_at(0, 0, strGet(BOOT_WI1), 0);
lcd_puts_at(0, 1, strGet(BOOT_WI2), 0);
_delay_ms(2000);
}
}
else
{
Change_Output(Uart02FC); // Verbindung zu SV" (Kabel) herstellen
if (PKT_StartInfo == true)
{
// lcd_printp_at (0, 0, PSTR("Verbindung zum MK ist"), 0);
// lcd_printp_at (0, 1, PSTR("auf Kabel eingestellt"), 0);
lcd_puts_at(0, 0, strGet(BOOT_WI1), 0);
lcd_puts_at(0, 1, strGet(BOOT_SV), 0);
_delay_ms(2000);
}
}
 
lcd_cls();
 
}
 
 
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
// PWM einschalten
TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1);
TCCR2B |= (1 << CS20);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
// PWM ausschalten
TCCR2A = 0;
TCCR2B = 0;
}
 
#endif
#endif // HAL_HW3_9_C_
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/HAL_HW3_9.h
0,0 → 1,139
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef HAL_HW3_9_H_
#define HAL_HW3_9_H_
 
 
 
//#define PIEPSER_NERVT // Summer zu Testzwecken ganz Ausschalten
 
 
// Hardware 3.9 Portbelegung
#define KEY_PIN PINA // Port A als Input
 
#define Touch0 PA0 // Pin 37
#define Touch1 PA1 // Pin 36
#define Touch2 PA2 // Pin 35
#define Touch3 PA3 // Pin 34
#define Key1 PA4 // Pin 33
#define Key2 PA5 // Pin 32
#define Key3 PA6 // Pin 31
#define Key4 PA7 // Pin 30
 
#define USB2Wi PB0 // Pin 40 aktiv low > IC5
#define VoltageHold PB1 // Pin 41 High = Spannung T3 halten
#define Display_Reset PB2 // Pin 42
#define Display_A0 PB3 // Pin 43
#define Display_CS PB4 // Pin 44
#define Display_SI PB5 // Pin 1
#define LED1 PB6 // Pin 2 Low = LED1 (nicht benutzbar wegen SCL
#define Display_SCL PB7 // Pin 3
 
#define I2C_SCL PC0 // Pin 19 SCL
#define I2C_CDA PC1 // Pin 20 SDA
#define USB2FC PC2 // Pin 21 aktiv low > IC5
#define USB_BT PC3 // Pin 22 high = USB, Low = Bluetooth, LED2
#define LowBat PC4 // Pin 23 Low Bat Warning Lipo PKT,Input
#define Uart02Wi PC5 // Pin 24 aktiv Low > IC4
#define Uart02FC PC6 // Pin 25 aktiv Low > IC4
#define Summer PC7 // Pin 26 Low = Summer
 
#define Uart0RxD PD0 // Pin 9 über IC4 =Wi | SV2
#define Uart0TxD PD1 // Pin 10 über IC4 =Wi | SV2
#define Uart1RxD PD2 // Pin 11 direkt = USB, BTM, über IC5 = Wi | SV2
#define Uart1TxD PD3 // Pin 12 direkt = USB, BTM, über IC5 = Wi | SV2
#define PiepserTest PD4 // Pin 13 CTC für Piepser
#define Servo PD5 // Pin 14 PWM für Servo
#define Wi232_CMD PD6 // Pin 15 aktiv Low = Wi232 CMD
#define Displaybeleuchtung PD7 // Pin 16 High = Display-LED
 
#define KEY_ENTER Key1
#define KEY_ESC Key2
#define KEY_PLUS Key3
#define KEY_MINUS Key4
 
 
 
// |= schaltet Ausgang auf HIGH
// &= ~ schaltet Ausgang auf LOW
 
#define set_reset() (PORTB |= (1 << Display_Reset))
#define clr_reset() (PORTB &= ~(1 << Display_Reset))
 
#define set_A0() (PORTB |= (1 << Display_A0))
#define clr_A0() (PORTB &= ~(1 << Display_A0))
 
#define set_cs() (PORTB |= (1 << Display_CS))
#define clr_cs() (PORTB &= ~(1 << Display_CS))
 
#define set_si() (PORTB |= (1 << Display_SI))
#define clr_si() (PORTB &= ~(1 << Display_SI))
 
#define set_scl() (PORTB |= (1 << Display_SCL))
#define clr_scl() (PORTB &= ~(1 << Display_SCL))
 
#define set_BTOn() (PORTC &= ~(1 << USB_BT)) // Bluetooth ein
 
#define set_USBOn() (PORTC |= (1 << USB_BT)) // USB ein
 
#define clr_V_On() (PORTB &= ~(1 << VoltageHold)) // Spannung mit T3 halten
#define set_V_On() (PORTB |= (1 << VoltageHold))
 
#define set_USB2FC() (PORTC &= ~(1 << USB2FC)) // USB mit FC-Kabel verbinden
#define clr_USB2FC() (PORTC |= (1 << USB2FC))
 
#define set_USB2Wi() (PORTB &= ~(1 << USB2Wi)) // USB mit Wi232 verbinden
#define clr_USB2Wi() (PORTB |= (1 << USB2Wi))
 
#define set_Uart02FC() (PORTC &= ~(1 << Uart02FC)) // Uart0 mit FC-Kabel verbinden
#define clr_Uart02FC() (PORTC |= (1 << Uart02FC))
 
#define set_Uart02Wi() (PORTC &= ~(1 << Uart02Wi)) // Uart0 mit Wi232 verbinden
#define clr_Uart02Wi() (PORTC |= (1 << Uart02Wi))
 
#define set_BEEP() (PORTC &= ~(1 << Summer)) // Summer
#define clr_BEEP() (PORTC |= (1 << Summer))
 
#define set_WI232CMD() (PORTD &= ~(1 << Wi232_CMD)) // Wi232 Programmierpin
#define clr_WI232CMD() (PORTD |= (1 << Wi232_CMD))
 
 
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus */
void InitHWPorts(void);
 
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/TODO.txt
0,0 → 1,12
24.8.2011 Cebra
Waypointlisten speichern und zum MK übertragen
Menüs überarbeiten um die Varianten der Schnittstellen einfacher handhaben zu können
Touchsreen entfällt, bring keine wirklichen Vorteile, kostet nur viel Speicher
 
22.7.2011 Cebra
 
HArdwareplatine mit Stick und Schalter zum Steuern der seriellen Kanäle.
 
22.6.2011 Cebra
- erl. I2C Motortest für BL-Controller
- erl. zur Zeit sind durch einen Layoutfehler noch die Tasten vertauscht, in timer.h zu ändern
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/Wi232.c
0,0 → 1,562
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "main.h"
#include "Wi232.h"
#include "timer.h"
#include "eeprom.h"
#if defined HWVERSION1_3W || defined HWVERSION3_9
 
uint8_t Wi232_hardware = 0;
uint8_t InitErr=0;
 
/*************************************************************************
Function: discoverWI232()
Purpose: check if Wi232 available
Returns: Version or 0 = timeout
 
**************************************************************************/
void discoverWi232(void)
 
{
int16_t RegisterWi232;
 
SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
set_WI232CMD();
_delay_ms(200);
 
USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); /* erstmal mit 57600 versuchen*/
lcd_printpns_at (0, 0, PSTR("search Wi.232 Modul"),0);
lcd_printpns_at (0, 1, PSTR("with 57600 Baud "),0);
RegisterWi232 = ReadWi232(regDiscover);
Wi232_hardware = 1;
 
if (RegisterWi232 == 0)
{
USART_Init( UART_BAUD_SELECT(2400,F_CPU) ); /* neues Modul mit 2400 suchen*/
lcd_printpns_at (0, 1, PSTR("with 2400 Baud "),0);
RegisterWi232 = ReadWi232(regDiscover);
Wi232_hardware = 2;
}
 
if (RegisterWi232 == 0)
{
lcd_cls();
lcd_printpns_at (0, 0, PSTR("no Wi.232 found "),0);
Wi232_hardware = 0;
}
 
if (RegisterWi232 == 0xFF)
{
lcd_cls();
lcd_printpns_at (0, 0, PSTR("Wi.232 Sytaxerror "),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
 
if (RegisterWi232 != 0)
{
lcd_cls();
if (Wi232_hardware ==1)
lcd_printpns_at (0, 0, PSTR("Wi.232 found 57600"),0);
 
if (Wi232_hardware ==2) // bei 2400 Baud
{
WiIsSet= false; //wenn hier 2400 gefunden wurde ist Wi232 nicht initialisiert
lcd_printpns_at (0, 0, PSTR("Wi.232 found 2400"),0);
if (WriteWi232(regNVDATARATE,Wi232_57600)!=0) /* NV-Ram auf 57600 setzen*/
{
lcd_printpns_at (0, 1, PSTR("Error set NV-RAM"),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
else
{
_delay_ms(1000);
lcd_printpns_at (0, 1, PSTR("NV-RAM set to 57600"),0);
lcd_printpns_at (0, 2, PSTR("ok "),0);
_delay_ms(2000);
}
 
if (WriteWi232(regDATARATE,Wi232_57600)!=0) /* Ram auf 57600 setzen*/
{
lcd_printpns_at (0, 3, PSTR("Error set RAM "),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
else
{
_delay_ms(1000);
lcd_printpns_at (0, 1, PSTR("RAM set to 57600 "),0);
lcd_printpns_at (0, 2, PSTR("ok "),0);
_delay_ms(2000);
}
USART_Init( UART_BAUD_SELECT(57600,F_CPU) );
}
lcd_cls_line (0,1,21);
lcd_printpns_at (0, 1, PSTR("Version:"),0);
lcd_print_hex_at(9,1,RegisterWi232,0);
}
clr_WI232CMD();
}
 
 
/*************************************************************************
Function: InitWI232()
Purpose: set Wi232Register for Mikrokopter
Returns: 0 = ACK, FF = NAK
 
**************************************************************************/
void InitWi232(void)
{
 
uint8_t i = 0;
 
Change_Output(Uart02Wi); // Verbindung zu Wi232 herstellen
 
discoverWi232(); // Check if Wi232 available
 
if (Wi232_hardware != 0)
{
lcd_printpns_at (0, 2, PSTR("Init Wi232 wait...."),0);
set_WI232CMD();
_delay_ms(200);
SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); /* erstmal mit 57600 versuchen*/
 
if (WriteWi232(regNETGRP,126)!=0) /*damit Wi232 nix mehr vom Kopter schickt erstmal Networkgroup ins Nirwana setzen */
lcd_printpns_at (i++,4,PSTR("."),0);
// InitErr =12;
// Grund:
//If RF packets are received while the CMD line is active,
//they are still processed and presented to the module’s UART for transmission.
 
// wenn sich ein EEPROM-Wert ändert wird auch das Ram beschrieben damit die Änderung sofort wirksam wird
if (WriteWi232(regNVTXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(1); /*TX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regTXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(2);/*TX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVRXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(3);/* RX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regRXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(4);/* RX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVSLPMODE ,Sleep_Awake)!=0)
InitErrorWi232(5);/* Sleepmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVPWRMODE,WbModeP15)!=0)
InitErrorWi232(6);/* Transceiver Mode/Powermode */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVTXTO,WiTXTO)!=0)
InitErrorWi232(7);/* UART Timeout */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regTXTO,WiTXTO)!=0)
InitErrorWi232(8);/* UART Timeout */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVUARTMTU,WiUartMTU)!=0)
InitErrorWi232(9);/* UART Buffer*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regUARTMTU,WiUartMTU)!=0)
InitErrorWi232(10);/* UART Buffer*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVNETMODE,WiNetworkMode)!=0)
InitErrorWi232(11);/* Networkmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNETMODE,WiNetworkMode)!=0)
InitErrorWi232(12);/* Networkmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVUSECRC ,CRC_Enable)!=0)
InitErrorWi232(13);/* CRC*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVCSMAMODE,CSMA_En)!=0)
InitErrorWi232(14);/* CSMA*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVDATARATE,Wi232_57600)!=0)
InitErrorWi232(15);/* Baudrate*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regDATARATE,Wi232_57600)!=0)
InitErrorWi232(16);/* Baudrate*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVNETGRP,WiNetworkGroup)!=0)
InitErrorWi232(17);/* Networkgroup */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNETGRP,WiNetworkGroup)!=0)
InitErrorWi232(18);/* Networkgroup */
lcd_printpns_at (i++,4,PSTR("."),0);
 
clr_WI232CMD();
 
if (InitErr !=0)
{
lcd_printpns_at (0, 2, PSTR("Wi232 InitError "),0);
lcd_print_hex(InitErr,0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
}
else
{
lcd_printpns_at (0, 2, PSTR("Wi232 Init ok...."),0);
WriteWiInitFlag(); // Init merken
}
USART_Init (UART_BAUD_SELECT(57600,F_CPU));
_delay_ms(2000);
}
}
 
/*************************************************************************
Function: InitErrorWI232()
Purpose: Show Wi232 Error, Value
Returns:
**************************************************************************/
void InitErrorWi232(uint8_t Error)
{
 
lcd_printpns_at (0, 3, PSTR("Wi232 InitError "),0);
lcd_print_hex(Error,0);
InitErr=Error;
BeepTime = 500;
BeepMuster = 0x0040;
_delay_ms(500);
 
}
 
 
 
 
/*************************************************************************
Function: WriteWI232()
Purpose: set Register to Wi232, Register, Value
Returns: 0 = ACK, FF = NAK
ACHTUNG nur für Value <0x80
**************************************************************************/
int16_t WriteWi232(uint8_t Wi232Register, uint8_t RegisterValue)
 
{
uint8_t timeout=10;
uint8_t tc=0;
unsigned int v;
 
USART_putc(0xff);
USART_putc(0x02);
USART_putc(Wi232Register);
USART_putc(RegisterValue);
// lcd_print_hex(Wi232Register,0);
// lcd_print_hex(RegisterValue,0);
 
do
{
v = USART_getc(); /*ACK erwartet*/
_delay_ms(100);
tc ++;
}
while (v==0 && tc!=timeout);
 
// lcd_print_hex(v,0);
if (v != 0x06)
{
lcd_printpns_at (0, 2, PSTR("Wi.232 NAK"),0);
BeepTime = 1000;
BeepMuster = 0x0040;
_delay_ms(2000);
return 0xFF;
}
 
if (v==0x06)
return 0;
 
return 0xFF;
}
 
 
/*************************************************************************
Function: ReadWI232()
Purpose: send Readcommand to Wi232,
Returns: Registervalue, 0 = timeout 0xFF = Syntaxerror
 
**************************************************************************/
int16_t ReadWi232(uint16_t Wi232Register)
 
{
uint8_t timeout=10;
uint8_t tc=0;
 
 
unsigned int v;
 
v = USART_getc(); /*Zeichen löschen*/
USART_putc(0xff);
USART_putc(0x02);
USART_putc(0xfe);
USART_putc(Wi232Register);
_delay_ms(50);
// lcd_printpns_at (0, 2, PSTR("read Wi232"),0);
 
 
do
{
v = USART_getc(); /*ACK erwartet*/
_delay_ms(100);
tc ++;
}
while (v==0 && tc!=timeout);
 
if (tc == timeout)
return 0; /* Timeout*/
 
if (v != 0x06)
return 0xFF; /* Syntaxerror*/
 
lcd_print_hex(v,0);
v = USART_getc(); /*Register*/
// lcd_print_hex(v,0);
v = USART_getc(); /*Value*/
// lcd_print_hex(v,0);
 
return v;
 
}
 
 
 
/*************************************************************************
Function: EscapeString()
Purpose:
Returns:
Quelle: Radiotronix Wi.232 Manual
**************************************************************************/
 
 
int EscapeString(char *src, char src_len, char *dest)
{
// The following function copies and encodes the first
// src_len characters from *src into *dest. This
// encoding is necessary for Wi.232 command formats.
// The resulting string is null terminated. The size
// of this string is the function return value.
// ---------------------------------------------------
uint8_t src_idx, dest_idx;
// Save space for the command header and size bytes
// ------------------------------------------------
dest_idx = 2;
// Loop through source string and copy/encode
// ------------------------------------------
for (src_idx = 0; src_idx < src_len; src_idx++)
{
if (src[src_idx] > 127)
{
dest[dest_idx++] = 0xFE;
}
dest[dest_idx++] = (src[src_idx] & 0x7F);
}
// Add null terminator
// -------------------
dest[dest_idx] = 0;
// Add command header
// ------------------
dest[0] = 0xFF;
dest[1] = dest_idx-2;
 
// Return escape string size
// -------------------------
return dest_idx;
}
 
 
//#if defined HWVERSION1_3W || defined HWVERSION3_9
/*************************************************************************
Function: Wi232USB()
Purpose: Connect Wi232 Programmmode to PKT USB,
Returns:
 
**************************************************************************/
void Wi232_USB(void)
 
 
{
unsigned int c0,c1;
 
if (Wi232_hardware==1)
{
// USART_Init (UART_BAUD_SELECT(57600,F_CPU));
// uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init (UART_BAUD_SELECT(2400,F_CPU));
// uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
}
 
if (Wi232_hardware==2)
{
USART_Init (UART_BAUD_SELECT(2400,F_CPU));
uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
}
 
lcd_cls ();
// SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
 
set_WI232CMD();
 
lcd_printpns_at (0, 0, PSTR("Wi.232 Konfiguration "),0);
lcd_printpns_at (0, 1, PSTR("PC mit USB verbinden"),0);
lcd_printpns_at (0, 2, PSTR("Wi.232"),0);
lcd_printpns_at (0, 3, PSTR("Programm starten"),0);
lcd_printpns_at (17, 7, PSTR("Exit"),0);
 
c1 = 0;
 
for(;;)
{
c0 = uart1_getc(); /* from USB*/
if ( c0 & UART_NO_DATA )
{
c1 = USART_getc();
 
if (c1 == 0)
{}
else
{
// lcd_print_hex(c1,0);
uart1_putc (c1); /*to USB*/;
}
}
else
{
USART_putc(c0 ); /* to Wi232*/
// lcd_print_hex(c0,0);
// _delay_ms(1);
}
 
if ((get_key_press (1 << KEY_ENTER)))
{
clr_WI232CMD();
// uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init( UART_BAUD_SELECT(57600,F_CPU) );
// SwitchToFC();
return;
}
 
}
}
/*************************************************************************
Function: Wi232_FC()
Purpose: Connect Wi232 to PKT USB, Transparent
Returns:
 
**************************************************************************/
void Wi232_FC(void)
 
 
{
unsigned int c0,c1;
 
 
USART_Init (UART_BAUD_SELECT(57600,F_CPU));
uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init (UART_BAUD_SELECT(2400,F_CPU));
// uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
 
lcd_cls ();
// SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
 
 
lcd_printpns_at (0, 0, PSTR("Wi.232 to FC "),0);
lcd_printpns_at (0, 1, PSTR("PC mit USB verbinden"),0);
lcd_printpns_at (0, 2, PSTR("und Mikrokoptertool"),0);
lcd_printpns_at (0, 3, PSTR("starten"),0);
lcd_printpns_at (17, 7, PSTR("Exit"),0);
 
c1 = 0;
 
for(;;)
{
c0 = uart1_getc(); /* from USB*/
if ( c0 & UART_NO_DATA )
{
c1 = USART_getc();
if (c1 == 0)
{}
else
{
// lcd_print_hex(c1,0);
uart1_putc (c1); /*to USB*/;
 
}
}
else
{
USART_putc(c0 ); /* to Wi232*/
// lcd_print_hex(c0,0);
// _delay_ms(1);
}
 
if ((get_key_press (1 << KEY_ENTER)))
{
return;
}
}
}
 
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/Wi232.h
0,0 → 1,177
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef WI232_H_
#define WI232_H_
 
 
void discoverWi232(void);
void InitWi232(void);
int16_t WriteWi232(uint8_t Wi232Register, uint8_t RegisterValue);
int16_t ReadWi232(uint16_t Wi232Register);
void InitErrorWi232(uint8_t Error);
extern uint8_t Wi232_hardware;
 
 
// Non-volatile Registers
// Name Address Description Default
#define regNVTXCHANNEL 0x00 // Transmit channel setting ## 0 ##
#define regNVRXCHANNEL 0x01 // Receive channel setting ## 0 ##
#define regNVPWRMODE 0x02 // Operating mode settings ## +13 dBm widebandmode ##
#define regNVDATARATE 0x03 // UART data rate ## 2400bps ##
#define regNVNETMODE 0x04 // Network mode (Normal/Slave) ## Normal ##
#define regNVTXTO 0x05 // Transmit wait timeout ## ~16ms ##
#define regNVNETGRP 0x06 // Network group ID ## 0x00 ##
#define regNVUSECRC 0x08 // Enable/Disable CRC ## Enabled ##
#define regNVUARTMTU 0x09 // Minimum transmission unit. ## 64 bytes ##
#define regNVSHOWVER 0x0A // Enable/Disable start-up message ## Enabled ##
#define regNVCSMAMODE 0x0B // Enable/Disable CSMA ## Enabled ##
#define regNVSLPMODE 0x0D // Power state of module ## Awake ##
#define regNVACKONWAKE 0x0E // Send ACK character to host on wake
 
 
// Non-volatile Read Only Registers
// Name Address Description
#define regMAC0 0x22 // These registers form the unique 48-bit MAC address.
#define regMAC1 0x23 // MAC
#define regMAC2 0x24 // MAC
#define regOUI0 0x25 // MAC
#define regOUI1 0x26 // MAC
#define regOUI2 0x27 // MAC
 
#define regDiscover 0x78 // Versionsregister
 
 
// Volatile Read/Write Registers
// Name Address Description
#define regTXCHANNEL 0x4B // Transmit channel setting
#define regRXCHANNEL 0x4C // Receive channel setting
#define regPWRMODE 0x4D // Operating mode settings
#define regDATARATE 0x4E // UART data rate
#define regNETMODE 0x4F // Network mode (Normal or Slave)
#define regTXTO 0x50 // Transmit wait timeout
#define regNETGRP 0x51 // Network group ID
#define regUSECRC 0x53 // Enable/Disable CRC
#define regUARTMTU 0x54 // Minimum transmission unit.
#define regSHOWVER 0x55 // Enable/Disable start-up message
#define regCSMAMODE 0x56 // Enable/disable CSMA
#define regSLPMODE 0x58 // Power state of module
#define regACKONWAKE 0x59 // Send ACK character to host on wake
 
 
// Wideband Channels
// regNVTXCHAN (0x00) regTXCHAN (0x4B)
// Channel Number Frequency
#define wChan0 0x00 // 868.300 MHz
#define wChan1 0x01 // 868.95 MHz ## MK ##
 
// Narrowband Channels
// regNVRXCHAN (0x01) regRXCHAN (0x4C)
// Channel Number Frequency
#define nChan0 0x00 // 868.225 MHz
#define nChan1 0x01 // 868.375 MHz ## MK ##
#define nChan2 0x02 // 868.850 MHz
#define nChan3 0x03 // 869.050 MHz
#define nChan4 0x04 // 869.525 MHz
#define nChan5 0x05 // 869.850 MHz
 
// Power Mode
// regNVPWRMODE (0x02) regPWRMODE (0x4D)
// PM1 PM1 PM0 Mode
#define NbModeN0 0x00 // 0 0 0 Narrowband Mode 0dBm power setting (typical)
#define WbModeP5 0x01 // 0 0 1 Wideband Mode +5dBm power setting (typical)
#define WbModeP10 0x02 // 0 1 0 Wideband Mode +10dBm power setting (typical)
#define WbModeP15 0x03 // 0 1 1 Wideband Mode +15dBm power setting (typical) ## MK ##
#define WbModeN0 0x04 // 1 0 0 Wideband Mode 0dBm power setting (typical)
#define NbModeP5 0x05 // 1 0 1 Narrowband Mode +5dBm power setting (typical)
#define NbModeP10 0x06 // 1 1 0 Narrowband Mode +10dBm power setting (typical)
#define NbModeP15 0x07 // 1 1 1 Narrowband Mode +15dBm power setting (typical)
 
// Wi232 UART Baudrate
// regNVDATARATE (0x03) regDATARATE (0x4E)
// Baud Rate BR2 BR1 BR0
#define Wi232_2400 0x00 // 0 0 0* (default 2400)
#define Wi232_9600 0x01 // 0 0 1
#define Wi232_19200 0x02 // 0 1 0
#define Wi232_38400 0x03 // 0 1 1
#define Wi232_57600 0x04 // 1 0 0 ## MK ##
#define Wi232_115200 0x05 // 1 0 1
#define Wi232_10400 0x06 // 1 1 0
#define Wi232_31250 0x07 // 1 1 1
 
// NetworkMode
// regNVNETMODE (0x04) regNETMODE (0x4F)
#define NetMode_Slave 0x00 // Slavemode
#define NetMode_Normal 0x01 // Normalmode (default)
 
// Transmit Wait Timeout
// regNVTXTO (0x05) regTXTO (0x50)
#define TWaitTimeFull 0x00 // full Buffer required
#define TWaitTime16 0x10 // 16 ms Delay (default)
 
// Network Group
// regNVNETGRP (0x06) regNETGRP (0x51)
#define NetWorkGroup 66 // default = 0, valid 0-127 ## MK = 66 ##
 
// CRC Control
// regNVUSECRC (0x08) regUSECRC (0x53)
#define CRC_Disable 0x00 // no CRC check
#define CRC_Enable 0x01 // CRC check (default)
 
// UART minimum transmission unit
// regNVUARTMTU (0x09) regUARTMTU (0x54)
#define UartMTU64 64 // default=64, valid 1-144
 
// Verbose mode
// regNVSHOWVER (0x0A)
#define ShowVers_Dis 0x00 // do not show Startupmessage ## MK = 66 ##
#define ShowVers_En 0x01 // show Startupmessage (default)
 
// CSMA enable
// regNVCSMAMODE (0x0B) regCSMAMODE (0x56)
#define CSMA_Dis 0x00 // disable CSMA Carrier-sense multiple access
#define CSMA_En 0x01 // enable CSMA (default)
 
// Sleep control
// regNVSLPMODE (0x0D) regSLPMODE (0x58)
#define Sleep_Awake 0x00 // Sleepmode = Awake (default)
#define Sleep 0x01 // Sleepmode = Sleep
#define Sleep_Stby 0x02 // Sleepmode = Standby
 
// ACK on Wake
// regNVACKONWAKE (0x0D) regACKONWAKE (0x59)
#define ACKwake_Dis 0x00 // disable ACK on Wake
#define ACKwake_En 0x01 // enable ACK on Wake (default)
 
 
#endif // WI232_H_
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/bluetooth.c
0,0 → 1,876
/**
* source for the Bluetooth driver
* @file bluetooth.c
* @author Linus Lotz<lotz@in.tum.de>
* @author Salomon Sickert
*/
 
 
 
#include "cpu.h"
#include <string.h>
#include <util/delay.h>
#include "bluetooth.h"
#include "main.h"
#ifdef HWVERSION3_9
#include "uart1.h"
#include "usart.h"
#include "fifo.h"
#include "error.h"
#include "lcd.h"
#include "eeprom.h"
#include "error.h"
#include "setup.h"
 
 
//#define SaveMem
 
//
// Baudrate for the UART-connection to the BTM-222 on SQUIRREL
//
 
#define SQUIRREL
 
#ifdef SQUIRREL
#define UART_BAUD_RATE 19200
#endif
 
#ifdef NUT
#define UART_BAUD_RATE 19200
#endif
 
 
typedef enum {
BT_RAW,
BT_DATA,
BT_CMD,
BT_NOECHO,
BT_NOANSWER
} communication_mode_t;
 
#define BT_CMD_TIMEOUT_MS 2000
 
typedef enum {
BT_TEST, // AT
BT_CONNECT, // ATA
BT_DISCONNECT, // ATH
BT_CLEAR_ADDRESS, // ATD0
BT_SET_ADDRESS, // ATD=_____
BT_FIND_DEVICES, // ATF?
BT_DISABLE_AUTOCONNECT, // ATO1
BT_SET_MASTER, // ATR0
BT_SET_SLAVE, // ATR1
BT_SET_PIN, // ATP=1234
BT_SET_57600, // ATL4 Baudrate 57600
BT_SET_NOANSWER, // ATQ1 Rückmeldungen aus
BT_SET_NOECHO, // ATE0 ECHO deaktivieren
BT_SET_ANSWER, // ATQ0 Rückmeldungen
BT_SET_ECHO, // ATE1 ECHO aktivieren
BT_SET_DEFAULT, // Defaultwerte setzen
BT_SET_NAME, // Devicename
BT_SET_DISPWRDOWN // disable auto Powerdown
} bt_cmd_t;
 
#ifdef SQUIRREL
#define IN_FIFO_SIZE 100
#endif
 
#ifdef NUT
#define IN_FIFO_SIZE 65
#endif
 
static uint8_t bt_buffer[IN_FIFO_SIZE];
static fifo_t in_fifo;
 
static bt_mode_t bt_mode = BLUETOOTH_SLAVE;
static communication_mode_t comm_mode = BT_CMD;
 
uint8_t i = 0;
uint8_t NoEcho = 0;
uint8_t NoAnswer = 0;
 
 
 
// Set a timeout of Y ms and a Conditon X, which have to be true while timeout
#define while_timeout(X, Y) for(uint16_t __timeout = 0; __timeout++ <= Y && (X); Delay_MS(Y ? 1 : 0))
 
//--------------------------------------------------------------
void Delay_MS(int count)
{
for (int i = 0; i < count; i++)
_delay_ms(1);
}
 
 
//--------------------------------------------------------------
static void uart_receive(void)
{
unsigned int uart_data;
 
while (!fifo_is_full(&in_fifo))
{
uart_data = uart1_getc();
 
// USART_puts(".");
 
switch (uart_data & 0xFF00) {
// Framing Error detected, i.e no stop bit detected
case UART_FRAME_ERROR:
#ifdef DEBUG
warn_pgm(PSTR("FRM ERR"));
#endif
return;
 
// Overrun, a character already presend in the UART UDR register was
// not read by the interrupt handler before the next character arrived,
// one or more received characters have been dropped
//
case UART_OVERRUN_ERROR:
#ifdef DEBUG
warn_pgm(PSTR("OVR ERR"));
#endif
return;
 
// We are not reading the receive buffer fast enough,
// one or more received character have been dropped
//
case UART_BUFFER_OVERFLOW:
#ifdef DEBUG
warn_pgm(PSTR("BUF ERR"));
#endif
return;
 
// UART Inputbuffer empty, nothing to do
case UART_NO_DATA:
return;
 
default:
{
fifo_write(&in_fifo, uart_data);
// USART_putc(uart_data);
}
}
}
#ifdef DEBUG
warn_pgm(PSTR("FIFO OVR ERR"));
#endif
}
 
 
//--------------------------------------------------------------
static void uart_send(const char *data, const uint8_t length)
{
#ifdef DEBUG
debug_pgm(PSTR("bt_uart_send"));
#endif
 
char echo;
 
lcd_printp_at (i++, 1, PSTR("."), 0);
for (uint8_t i = 0; i < length; i++)
{
 
#ifdef DEBUG
USART_putc((data[i])); //test
#endif
// debug_pgm(PSTR("bt_init_S"));
 
if (uart1_putc(data[i]) == 0)
{
#ifdef DEBUG
warn_pgm(PSTR("UART: Remote not ready"));
#endif
return;
}
 
if (comm_mode == BT_RAW)
_delay_ms(50);
 
if (comm_mode == BT_DATA)
_delay_ms(1);
 
if (comm_mode == BT_NOECHO)
_delay_ms(1);
 
if (comm_mode == BT_CMD)
{
uint8_t x = 0;
for (; x < 3; x++)
{
// // while_timeout(X, Y) for(uint16_t __timeout = 0; __timeout++ <= Y && (X); _delay_ms(Y ? 1 : 0))
// while_timeout(fifo_is_empty(&in_fifo), 200)
for(uint16_t __timeout = 0; __timeout++ <= 200 && (fifo_is_empty(&in_fifo)); _delay_ms(200 ? 1 : 0))
{
uart_receive();
}
 
fifo_read(&in_fifo, &echo);
 
if (echo != data[i]) {
if (uart1_putc(data[i]) == 0)
{
warn_pgm(PSTR ("UART: Remote not ready"));
return;
}
}
else
break;
}
 
if (x == 3)
{
error_putc(data[i]);
error_pgm(PSTR("BT: WRONG ECHO"));
}
}
}
}
 
 
//--------------------------------------------------------------
static uint16_t send_cmd(const bt_cmd_t command, const char *data)
{
_delay_ms(500); // org 500 300 zu wenig
char full_command[20]; // Maximum command size
 
switch (command)
{
case BT_SET_PIN:
strcpy_P(full_command, PSTR("ATP="));
for (uint8_t i = 0; i < bt_pin_length; i++)
{
full_command[i+4] = bt_pin[i];
}
full_command[(bt_pin_length+4)] =0;
break;
 
case BT_SET_DEFAULT:
strcpy_P(full_command, PSTR("ATZ0"));
break;
 
case BT_SET_57600:
strcpy_P(full_command, PSTR("ATL4"));
break;
 
case BT_SET_NOANSWER:
strcpy_P(full_command, PSTR("ATQ1"));
break;
 
case BT_SET_NOECHO:
strcpy_P(full_command, PSTR("ATE0"));
break;
 
case BT_SET_ANSWER:
strcpy_P(full_command, PSTR("ATQ0"));
break;
 
case BT_SET_ECHO:
strcpy_P(full_command, PSTR("ATE1"));
break;
 
case BT_TEST:
strcpy_P(full_command, PSTR("AT"));
break;
 
case BT_CONNECT:
strcpy_P(full_command, PSTR("ATA"));
break;
 
case BT_DISCONNECT:
strcpy_P(full_command, PSTR("ATH"));
break;
 
case BT_CLEAR_ADDRESS:
strcpy_P(full_command, PSTR("ATD0"));
break;
 
case BT_SET_ADDRESS:
strcpy_P(full_command, PSTR("ATD="));
memcpy((full_command + strlen(full_command)), data, 12);
full_command[16] = 0;
break;
 
case BT_FIND_DEVICES:
strcpy_P(full_command, PSTR("ATF?"));
break;
 
case BT_DISABLE_AUTOCONNECT:
strcpy_P(full_command, PSTR("ATO1"));
break;
 
case BT_SET_MASTER:
strcpy_P(full_command, PSTR("ATR0"));
break;
 
case BT_SET_SLAVE:
strcpy_P(full_command, PSTR("ATR1"));
break;
 
case BT_SET_NAME:
strcpy_P(full_command, PSTR("ATN="));
for (uint8_t i = 0; i < bt_name_len; i++)
{
full_command[i + 4] = bt_name[i];
}
full_command[(bt_name_len + 4)] = 0;
break;
 
case BT_SET_DISPWRDOWN:
strcpy_P(full_command, PSTR("ATS1"));
break;
 
default:
warn_pgm(PSTR("CMD UNK"));
return false;
}
 
strcat_P(full_command, PSTR("\r"));
 
// throw away your television
uart_receive();
fifo_clear(&in_fifo);
// debug_pgm(PSTR("bt_init3"));
// send command
uart_send(full_command, strlen(full_command));
 
if (command== BT_SET_ECHO)
return true;
 
if (command== BT_SET_ANSWER)
return true;
 
// get response
while_timeout(true, BT_CMD_TIMEOUT_MS)
{
uart_receive();
if (fifo_strstr_pgm(&in_fifo, PSTR("OK\r\n")))
{
info_pgm(PSTR("CMD SEND: OK"));
return true;
}
 
if (fifo_strstr_pgm(&in_fifo, PSTR("ERROR\r\n")))
{
#ifdef DEBUG
info_pgm(PSTR("CMD SEND: Error"));
#endif
return false;
}
}
 
#ifdef DEBUG
if (command != BT_TEST)
warn_pgm(PSTR("CMD SEND: TIMEOUT"));
#endif
 
 
return false;
}
 
 
//--------------------------------------------------------------
void test(void)
{
comm_mode = BT_RAW;
for (uint8_t i = 0; i < 3; i++)
if (send_cmd(BT_TEST, NULL))
break;
comm_mode = BT_CMD;
}
 
 
#ifndef SaveMem
 
//--------------------------------------------------------------
static void clean_line(void)
{
while_timeout(true, 50)
uart_receive();
fifo_strstr_pgm(&in_fifo, PSTR("\r\n"));
}
 
static communication_mode_t update_comm_mode(uint16_t timeout_ms)
{
while_timeout(true, timeout_ms)
{
uart_receive();
 
if (fifo_strstr_pgm(&in_fifo, PSTR("DISCONNECT")))
{
clean_line();
test();
comm_mode = BT_CMD;
return comm_mode;
}
 
if (fifo_strstr_pgm(&in_fifo, PSTR("CONNECT")))
{
_delay_ms(100); //don't delete this, else there will be no success!!!!!!!!!
comm_mode = BT_DATA;
return comm_mode;
}
 
if (fifo_strstr_pgm (&in_fifo, PSTR("Time out,Fail to connect!")))
{
clean_line();
#ifdef DEBUG
debug_pgm(PSTR("CONNECT FAILED"));
#endif
test();
comm_mode = BT_CMD;
return comm_mode;
}
}
 
return comm_mode;
}
#endif
 
 
//--------------------------------------------------------------
uint16_t bt_init(void)
{
uint8_t init_error = false;
uint8_t BT_found = 0;
i = 0;
 
set_BTOn();
 
lcd_cls();
lcd_printp_at (0, 0, PSTR("BT initialisieren.."), 0);
_delay_ms(200);
 
for (uint8_t z = (bt_name_length); z > 0; z--)
{
if (bt_name[z - 1] != ' ')
{
bt_name_len = z;
break;
}
}
 
uart1_init(UART_BAUD_SELECT(57600, F_CPU));
fifo_init(&in_fifo, bt_buffer, IN_FIFO_SIZE);
_delay_ms(100);
// debug_pgm(PSTR("bt_init"));
uart_receive();
// debug_pgm(PSTR("bt_init1"));
fifo_clear(&in_fifo);
send_cmd(BT_TEST, NULL);
comm_mode = BT_NOECHO;
send_cmd(BT_SET_ECHO, NULL);
send_cmd(BT_SET_ANSWER, NULL);
 
// debug_pgm(PSTR("bt_init2"));
#ifdef DEBUG
debug_pgm(PSTR("Check with 57600"));
#endif
// send_cmd(BT_TEST, NULL); // Schrott löschen
 
if (send_cmd(BT_TEST, NULL)) // Test mit 57600
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 57600 Baud"));
#endif
BT_found = 1;
}
 
if (BT_found == 0)
{
#ifdef DEBUG
debug_pgm(PSTR("Check with 19200"));
#endif
uart1_init(UART_BAUD_SELECT(19200, F_CPU));// Test mit 19200
_delay_ms(100);
send_cmd(BT_TEST, NULL); // Schrott löschen
send_cmd(BT_SET_ANSWER, NULL);
send_cmd(BT_SET_ECHO, NULL);
 
if (send_cmd(BT_TEST, NULL))
{
debug_pgm(PSTR("19200 OK"));
if (send_cmd(BT_TEST, NULL))
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 19200 Baud"));
#endif
BT_found = 2;
}
}
}
 
if (BT_found == 0)
{
#ifdef DEBUG
debug_pgm(PSTR("Check with 9600"));
#endif
uart1_init(UART_BAUD_SELECT(9600, F_CPU));//test mit 9600
_delay_ms(100);
send_cmd(BT_TEST, NULL);
send_cmd(BT_SET_ANSWER, NULL);
send_cmd(BT_SET_ECHO, NULL);
if (send_cmd(BT_TEST, NULL));
{
#ifdef DEBUG
debug_pgm(PSTR("9600 OK"));
#endif
if (send_cmd(BT_TEST, NULL))
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 9600 Baud"));
#endif
BT_found = 3;
}
}
}
 
if (BT_found > 0)
{
/* Set comm_mode to CMD */
comm_mode = BT_CMD;
// test();
/* Set BTM Baudrate */
if (!(send_cmd(BT_SET_57600, NULL)))
init_error = true;
uart1_init(UART_BAUD_SELECT(57600, F_CPU));
_delay_ms(100);
// test();
/* Clear remote address */
if(!(send_cmd(BT_CLEAR_ADDRESS, NULL)))
init_error = true;
// test();
/* Set BTM to SLAVE */
if (!(send_cmd(BT_SET_SLAVE, NULL)))
init_error = true;
// test();
/* Set BTM PIN */
if(!(send_cmd(BT_SET_PIN, NULL)))
init_error = true;
// test();
/* Set BTM Name */
if(!(send_cmd(BT_SET_NAME, NULL)))
init_error = true;
_delay_ms(300);
// test();
if(!(send_cmd(BT_SET_DISPWRDOWN, NULL)))
init_error = true;
// test();
/* Set BTM Echo aus */
send_cmd(BT_SET_NOECHO, NULL);
// test();
comm_mode = BT_NOECHO;
/* Set BTM Answer aus */
send_cmd(BT_SET_NOANSWER, NULL);
// test();
 
bt_mode = BLUETOOTH_SLAVE;
 
set_USBOn();
 
if (!init_error)
{
WriteBTInitFlag(); // Init merken
return true;
}
else
return false;
}
else
{
set_USBOn();
return false;
}
 
}
 
 
#ifndef SaveMem
 
//--------------------------------------------------------------
uint16_t bt_set_mode(const bt_mode_t mode)
{
if (update_comm_mode(0) == BT_DATA)
return false;
 
if (mode == bt_mode)
return true;
 
if (mode == BLUETOOTH_MASTER)
if (send_cmd(BT_SET_MASTER, NULL))
{
bt_mode = BLUETOOTH_MASTER;
test();
send_cmd(BT_DISABLE_AUTOCONNECT, NULL);
}
 
if (mode == BLUETOOTH_SLAVE)
if (send_cmd(BT_SET_SLAVE, NULL))
{
bt_mode = BLUETOOTH_SLAVE;
}
 
test();
return mode == bt_mode;
}
 
 
//--------------------------------------------------------------
uint16_t bt_receive(void *data, uint8_t length, uint16_t timeout_ms)
{
uint8_t rec_length = 0;
uint8_t i = 0;
 
// while_timeout(true, timeout_ms);
for(uint16_t __timeout = 0; __timeout++ <= true && (timeout_ms); _delay_ms(true ? 1 : 0))
{
if (i == length)
return true;
 
uart_receive();
 
if (fifo_is_empty(&in_fifo))
continue;
 
if (update_comm_mode(0) != BT_DATA)
{
#ifdef DEBUG
debug_pgm(PSTR("not connected"));
#endif
return false;
}
// We have a connection
if (timeout_ms == 0)
timeout_ms += 2000;
 
if (fifo_is_empty(&in_fifo))
continue;
 
// Find starting point of packet
if (!rec_length)
{
fifo_read(&in_fifo, (char *)&rec_length);
 
if (rec_length != length)
{
rec_length = 0;
}
else
{
// You've got mail!
timeout_ms += 2000;
}
}
else
{
fifo_read(&in_fifo, (char *)data + i);
i++;
}
}
return false;
}
 
#endif
 
#ifndef SaveMem
 
 
//--------------------------------------------------------------
uint16_t bt_send(void *data, const uint8_t length)
{
if (update_comm_mode(0) == BT_CMD)
return false;
 
uart_send((const char *)&length, 1);
uart_send((char *)data, length);
return (update_comm_mode(0) == BT_DATA);
}
 
 
#ifdef SQUIRREL
 
//--------------------------------------------------------------
uint16_t bt_connect(const char *address)
{
// Maybe we already disconnected???
if (BT_DATA == update_comm_mode(0))
{
#ifdef DEBUG
debug_pgm(PSTR("We are still connected..."));
#endif
return false;
}
test();
 
if (!send_cmd(BT_DISABLE_AUTOCONNECT, address))
return false;
 
test();
#ifdef DEBUG
debug_pgm (PSTR ("SET_ADD"));
#endif
 
if (!send_cmd(BT_SET_ADDRESS, address))
return false;
 
test();
#ifdef DEBUG
debug_pgm (PSTR ("CONNECT"));
#endif
 
if (!send_cmd(BT_CONNECT, NULL))
return false;
#ifdef DEBUG
debug_pgm (PSTR ("WAIT FOR COMM"));
#endif
return (BT_DATA == update_comm_mode(60000));
}
 
 
//--------------------------------------------------------------
uint16_t bt_disconnect(void)
{
/* Bluetooth reseten */
// set_bit(PORTC.DIR, 4);
// set_bit(PORTC.OUT, 4);
_delay_ms(500);
// clear_bit(PORTC.OUT, 4);
// return bt_init();
 
#if 1
if (BT_CMD == update_comm_mode(0))
{
fifo_clear(&in_fifo);
return true;
}
 
// Switch to online cmd mode
for (uint8_t i = 0; i < 4; i++)
{
const char plus = '+';
uart_send(&plus, 1);
_delay_ms(1500);
}
 
//comm_mode = BT_CMD;
 
if (!send_cmd(BT_DISCONNECT, NULL))
return false;
 
test();
if (!send_cmd(BT_CLEAR_ADDRESS, NULL))
return false;
test();
 
if (BT_CMD == update_comm_mode(10000))
{
fifo_clear(&in_fifo);
return true;
}
#ifdef DEBUG
debug_pgm(PSTR("Still in DATA??"));
#endif
return false;
#endif
}
 
 
//--------------------------------------------------------------
void copy_address(const char *src, char *dst)
{
uint8_t off = 0;
 
for (uint8_t i = 0; i < 14; i++)
{
if (src[i + off] == '-')
off++;
 
dst[i] = src[i + off];
}
}
 
 
//--------------------------------------------------------------
uint16_t bt_discover(char result[8][12])
 
// 14.8.2011 ist noch nicht getestet, wird für PKT auch nicht benötigt, Cebra
{
// update_callback(20);
test();
if (!bt_set_mode(BLUETOOTH_MASTER))
return false;
 
if (!send_cmd(BT_FIND_DEVICES, NULL))
return false;
 
char buffer[255]; //oversized, but who cares?
char *bufferhead = buffer;
uint8_t pos = 0;
uint16_t Timeout = 20000;
uint8_t pos1 = 0;
 
do
{
uart_receive();
Timeout--;
pos1++;
_delay_ms(1);
 
}
while ((Timeout > 0) ||(!fifo_strstr_pgm(&in_fifo, PSTR("Inquiry Results:\r\n"))));
 
// byte_to_hex(Timeout);
 
assert_pgm((!fifo_strstr_pgm(&in_fifo, PSTR("Inquiry Results:\r\n"))),PSTR("INQ Result false"));
 
info_pgm (PSTR ("Rec1"));
 
for (uint16_t i = 0; i < 60000; i++)
{
//if ((i % 1000) == 0)
//update_callback(40 + i / 1000);
uart_receive();
// lcd_printp(".", 0);
_delay_ms(1);
}
 
info_pgm (PSTR ("Rec2"));
 
//update_callback(100);
 
while (!fifo_is_empty(&in_fifo))
{
// Get next line
while (!fifo_cmp_pgm(&in_fifo, PSTR("\r\n")))
{
fifo_read(&in_fifo, bufferhead);
bufferhead++;
}
// terminate string
*bufferhead = 0;
 
//reset bufferhead
bufferhead = buffer;
 
if (strlen(buffer) == 0)
continue; //the empty line before end of inquiry
 
if (strstr_P(buffer, PSTR("Inquiry End")))
{
fifo_clear(&in_fifo);
test();
return true;
}
 
if (strncmp_P(PSTR("0012"), &buffer[21], 4))
{
copy_address(&buffer[21], result[pos]);
pos++;
}
}
 
return false;
}
 
#endif
#endif
#endif /* SQUIRREL */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/bluetooth.h
0,0 → 1,127
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _BLUETOOTH_H_
#define _BLUETOOTH_H_
 
#include <avr/io.h>
//#include <common.h>
 
 
#define SQUIRREL
#define NUTS_LIST 16
#define EXTENSIONS_LIST 16
 
//void InitBT(void);
 
typedef struct _device_info device_info;
 
// device info struct, holds mac , class and extensions + values of a device
struct _device_info
{
char mac[12];
 
uint8_t class;
uint8_t extension_types[EXTENSIONS_LIST];
uint16_t values_cache[EXTENSIONS_LIST];
};
 
extern device_info device_list[NUTS_LIST];
 
#define valid(num) (num < NUTS_LIST && (device_list[num].mac[0] != 0 || device_list[num].mac[1] != 0 || device_list[num].mac[2] != 0 || device_list[num].mac[3] != 0 || device_list[num].mac[4] != 0 || device_list[num].mac[5] != 0 || device_list[num].mac[6] != 0 || device_list[num].mac[7] != 0 || device_list[num].mac[8] != 0 || device_list[num].mac[9] != 0 || device_list[num].mac[10] != 0 || device_list[num].mac[11] != 0))
 
 
 
// Bluetooth mode ENUM
typedef enum
{
BLUETOOTH_MASTER, // < Master Mode (to create outgoinng connections).
BLUETOOTH_SLAVE // < Slave Mode (to wait for incoming connections).
} bt_mode_t;
 
 
// init bluetooth driver
// @return always true
//
//extern uint16_t bt_init (void (*upate_percentage) (uint16_t));
extern uint16_t bt_init (void);
 
// Set the Bluetooth mode
// @param mode bt_mode_t Bluetooth Mode ENUM (BLUETOOTH_MASTER or BLUETOOTH_SLAVE)
// @return true if mode change was succesful, false if not
//
extern uint16_t bt_set_mode (const bt_mode_t mode);
 
// recieve data over bluetooth
// @param data pointer to memory for data storage
// @param length value of length after call holds the actual recived data length
// @param timeout_ms timeout in ms after the recive function aborts and returns with false
// @return false if recived length > length parameter or it timeouted, true otherwise
//
extern uint16_t bt_receive (void * data, uint8_t length, uint16_t timeout_ms);
 
// send data over bluetooth
// @param data pointer to the data to send
// @param length length of the data to be send
// @return true if sendingn was successful, false otherwise
//
extern uint16_t bt_send (void * data, const uint8_t length);
 
// squirrelt only functions
#ifdef SQUIRREL
 
// open bluetoot connection (only one at a time possible)
// @param address connection is opened to this device mac address
// @return true if connection was established, false otherwise
//
extern uint16_t bt_connect (const char *address);
 
// closes bluetooth connection
// @return false if failed, true otherwise
//
extern uint16_t bt_disconnect (void);
 
// discover bluetooth devices
// @param result in a 2 dimensional array first index are devicecs (max 8) second is mac address string
// @param update_callback to inform of progress (in % from 0 to 100)
// @return true if successful, false if error occured
//
extern uint16_t bt_discover (char result[8][12]);
//extern uint16_t bt_discover (char result[8][12], void (*update_callback)(const uint16_t progress));
 
#endif // SQUIRREL
 
 
#endif
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/connect.c
0,0 → 1,394
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/pgmspace.h>
#include "lcd.h"
#include "timer.h"
#include "eeprom.h"
#include "messages.h"
#include "lipo.h"
 
#if defined HWVERSION1_3W || defined HWVERSION3_9
//--------------------------------------------------------------
void Change_Output(uint8_t UartMode) // Schaltet die Rx/Tx Richtungen
{
// hiermit werden die 74HTC125 (IC5) Gatter geschaltet
clr_USB2FC(); // PC2 aus
clr_USB2Wi(); // PB0 aus
clr_Uart02FC(); // PC6 aus
clr_Uart02Wi(); // PC5 aus
 
 
switch (UartMode)
{
case USB2FC:
UCSR1B &= ~(1<<RXEN1);
UCSR1B &= ~(1<<TXEN1);
UCSR1B &= ~(1<<RXCIE1);
 
DDRD &= ~(1<<DDD2); // Pins auf Eingang setzen
DDRD &= ~(1<<DDD3);
PORTD &= ~(1<<PD2); // Pullup aus
PORTD &= ~(1<<PD3);
 
set_USB2FC();
break;
 
case Uart02Wi:
set_Uart02Wi();
break;
 
case Uart02FC:
set_Uart02FC();
break;
 
case USB2Wi:
UCSR1B &= ~(1<<RXEN1);
UCSR1B &= ~(1<<TXEN1);
UCSR1B &= ~(1<<RXCIE1);
 
DDRD &= ~(1<<DDD2); // Pins auf Eingang setzen
DDRD &= ~(1<<DDD3);
PORTD &= ~(1<<PD2); // Pullup aus
PORTD &= ~(1<<PD3);
 
set_USB2Wi();
break;
}
 
}
 
 
//--------------------------------------------------------------
// Function: BT2FC()
// Purpose: Connect BT direct to FC-Kabel (SV2 as MKUSB)
// Returns:
//--------------------------------------------------------------
void Port_BT2FC(void)
{
lcd_cls ();
 
if(UseBT == true)
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" BT --> Kabel an FC "), 2);
lcd_puts_at(0, 1, strGet(CONNECT15), 0);
// lcd_printp_at (0, 3, PSTR("PC mit BT verb."), 0);
lcd_puts_at(0, 3, strGet(CONNECT16), 0);
// lcd_printp_at (0, 4, PSTR("PKT-Kabel an FC"), 0);
lcd_puts_at(0, 4, strGet(CONNECT17), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten"), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
set_BTOn();
 
Change_Output(USB2FC);
do
{
show_Lipo();
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_USBOn();
return;
}
else
{
// lcd_printp_at (0, 0, PSTR("Es ist kein BTM-222 "), 0);
// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
lcd_puts_at(0, 1, strGet(CONNECT12), 0);
lcd_puts_at(0, 1, strGet(CONNECT13), 0);
lcd_puts_at(0, 2, strGet(CONNECT7), 0);
lcd_puts_at(0, 3, strGet(CONNECT8), 0);
lcd_puts_at(0, 4, strGet(CONNECT9), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
return;
}
}
 
 
//--------------------------------------------------------------
// Function: BT2Wi()
// Purpose: Connect BT direct to Wi.232
// Returns:
//--------------------------------------------------------------
void Port_BT2Wi(void)
{
 
lcd_cls ();
 
// if((UseBT == true) && (UseWi == true))6.1.2012 CB Abfrage entfernt, damit die Funktion auch ohne Module geht
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" BT --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT18), 2);
// lcd_printp_at (0, 3, PSTR("PC mit BT verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT16), 0);
// lcd_printp_at (0, 4, PSTR("Wi.232 an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT19), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
 
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
set_BTOn();
 
Change_Output(USB2Wi);
do
{
show_Lipo();
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_USBOn();
return;
}
// else
// {
//// lcd_printp_at (0, 0, PSTR("Es ist kein BTM-222 "), 0);
//// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
//// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
//// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
//// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
//
// lcd_puts_at(0, 0, strGet(CONNECT12), 0);
// lcd_puts_at(0, 1, strGet(CONNECT13), 0);
// lcd_puts_at(0, 2, strGet(CONNECT7), 0);
// lcd_puts_at(0, 3, strGet(CONNECT8), 0);
// lcd_puts_at(0, 4, strGet(CONNECT9), 0);
// lcd_puts_at(12, 7, strGet(ENDE), 0);
//// lcd_printp_at (12, 7, PSTR("Ende"), 0);
//
// while(!get_key_press (1 << KEY_ESC));
// get_key_press(KEY_ALL);
//
// return;
// }
}
 
 
//--------------------------------------------------------------
// Function: FC2CFG_BT()
// Purpose: Connect FC (Tx1 Pin3, Rx1 Pin4) direct to BT
// Returns:
//--------------------------------------------------------------
void Port_FC2CFG_BT(void)
{
 
lcd_cls ();
lcd_printp_at (0, 0, PSTR("BTM-222 Konfigurieren"), 2);
lcd_printp_at (0, 1, PSTR("FC > MK-USB > BTM-222"), 2);
lcd_printp_at (0, 3, PSTR("MK-USB an PC anschl. "), 0);
lcd_printp_at (0, 4, PSTR("Zwischen MK-USB und "), 0);
lcd_printp_at (0, 5, PSTR("PKT ein gekreuztes "), 0);
lcd_printp_at (0, 6, PSTR("Kabel anschliessen. "), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
set_BTOn();
Change_Output(USB2FC);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_USBOn();
return;
}
 
 
//--------------------------------------------------------------
// Function: USB2FC()
// Purpose: Connect USB direct to FC-Kabel (SV2 as MKUSB)
// Returns:
//--------------------------------------------------------------
void Port_USB2FC(void)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Kabel an FC "), 2);
lcd_puts_at(0, 1, strGet(CONNECT20), 0);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
// lcd_printp_at (0, 4, PSTR("PKT-Kabel an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT17), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
Change_Output(USB2FC);
do
{
show_Lipo();
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
 
//--------------------------------------------------------------
// Function: USB2Wi()
// Purpose: Connect USB direct to Wi.232
// Returns:
//--------------------------------------------------------------
void Port_USB2Wi(void)
{
 
lcd_cls ();
// if(UseWi == true) // 6.1.2012 CB Abfrage entfernt, damit die Funktion auch ohne Module geht
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT22), 2);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
// lcd_printp_at (0, 4, PSTR("Wi.232 an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT19), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
Change_Output(USB2Wi);
do
{
show_Lipo();
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
// else
// {
//// lcd_printp_at (0, 0, PSTR("Es ist kein Wi.232 "), 0);
//// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
//// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
//// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
//// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
//// lcd_printp_at (12, 7, PSTR("Ende"), 0);
// lcd_puts_at(0, 0, strGet(CONNECT5), 0);
// lcd_puts_at(0, 1, strGet(CONNECT6), 0);
// lcd_puts_at(0, 2, strGet(CONNECT7), 0);
// lcd_puts_at(0, 3, strGet(CONNECT8), 0);
// lcd_puts_at(0, 4, strGet(CONNECT9), 0);
// lcd_puts_at(12, 7, strGet(ENDE), 0);
// while(!get_key_press (1 << KEY_ESC));
// get_key_press(KEY_ALL);
//
// return;
// }
}
 
//--------------------------------------------------------------
// Function: USB2CFG_Wi()
// Purpose: Connect USB direct to Wi.232 in Progmode
// Returns:
//--------------------------------------------------------------
void Port_USB2CFG_Wi(void)
{
 
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wi.232 Konfigurieren"), 2);
lcd_puts_at(0, 0, strGet(CONNECT24), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT22), 2);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden."), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
lcd_printp_at (0, 4, PSTR("Radiotronix Wi.232DTS"), 0);
lcd_printp_at (0, 5, PSTR("Evaluation (868MHz) "), 0);
// lcd_printp_at (0, 6, PSTR("Programm starten. "), 0);
lcd_puts_at(0, 6, strGet(CONNECT25), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
Change_Output(USB2Wi);
 
set_WI232CMD(); // Port D6 = CMD
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
clr_WI232CMD(); // Port D6 = CMD
 
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/connect.h
0,0 → 1,48
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _CONNECT_H
#define _CONNECT_H
 
void Change_Output(uint8_t UartMode);
 
void Port_BT2Wi(void);
void Port_BT2FC(void);
void Port_FC2CFG_BT(void);
 
void Port_USB2FC(void);
void Port_USB2Wi(void);
void Port_USB2CFG_Wi(void);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/cpu.h
0,0 → 1,41
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _CPU_H
#define _CPU_H
 
// Quarz Frequenz in Hz
#define F_CPU 20000000UL
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/debug.c
0,0 → 1,370
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <string.h>
 
#include "main.h"
//#include "menu.h"
#include "lcd.h"
#include "usart.h"
#include "debug.h"
#include "timer.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
#define TIMEOUT 200 // 2 sec
#define ANALOGTIME 20 // 200 ms
 
// WARNING: this work for NC & FC only
// if current_hardware == MK3MAG or MKGPS the access is outside of the array...
uint8_t AnalogNames[2][32][16 + 1]; // 32 names, 16 characters + 1 0x00
uint8_t AnalogNamesRead[2] = {0,0};
 
//--------------------------------------------------------------
//
void GetAnalogNames (void)
{
uint8_t i = AnalogNamesRead[current_hardware - 1];
uint8_t t = 0;
 
lcd_cls ();
lcd_printp_at (0, 3, PSTR("Reading"), 0);
lcd_printp_at (0, 4, PSTR("Analog Names: "), 0);
 
mode = 'A'; // read Names
_delay_ms(200);
rxd_buffer_locked = FALSE;
 
timer = ANALOGTIME;
 
while (i < 32)
{
SendOutData ('a', ADDRESS_ANY, 1, &i, 1);
while (!rxd_buffer_locked && timer);
if (timer)
{
Decode64 ();
if (i == *pRxData)
{
write_ndigit_number_u(14, 4, i, 2, 0);
memcpy (AnalogNames[current_hardware - 1][*pRxData], (uint8_t *) pRxData + 1, 16);
AnalogNames[current_hardware - 1][*pRxData][16] = 0;
i++;
t = 0;
}
else
{
_delay_ms (100);
}
 
timer = ANALOGTIME;
rxd_buffer_locked = FALSE;
}
else
{ // timeout occured
t++;
timer = ANALOGTIME;
 
if (t >= 50)
{
lcd_printp_at (0, 2, PSTR("ERROR: no data"), 0);
 
timer = 100;
while (timer > 0);
break;
}
}
}
 
AnalogNamesRead[current_hardware - 1] = i;
 
#if 0
if (timer)
{
for (page = 0; page < 5; page++)
{
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
}
while (!get_key_press (1 << KEY_ESC)); // ESC
get_key_press(KEY_ALL);
}
}
//return;
#endif
}
 
 
//--------------------------------------------------------------
//
void display_debug (void)
{
uint8_t i = 0;
uint8_t tmp_dat;
uint8_t page = 0;
 
DebugData_t *DebugData;
 
lcd_cls ();
 
timer = TIMEOUT;
 
if (AnalogNamesRead[current_hardware - 1] < 32)
{
GetAnalogNames ();
}
 
if (!timer)
{
return;
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
 
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
abo_timer = ABO_TIMEOUT;
 
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
 
do
{
if (rxd_buffer_locked)
{
Decode64 ();
DebugData = (DebugData_t *) pRxData;
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_write_number_u_at (5, 7, page + 1);
switch (current_hardware)
{
case FC:
lcd_printp_at (3, 7, PSTR("FC"), 0);
lcd_printp_at (19, 7, PSTR("NC"), 0);
break;
 
case NC:
lcd_printp_at (3, 7, PSTR("NC"), 0);
lcd_printp_at (19, 7, PSTR("FC"), 0);
break;
 
default:
lcd_printp_at (19, 7, PSTR("?"), 0);
break;
}
 
for (i = 0; i < 7; i++)
{
//lcd_print_at (0, i, AnalogNames[i + page * 7], 0);
uint8_t size =0;
if( DebugData->Analog[i + page * 7] < -9999)
{
size = 6;
}
else if ( DebugData->Analog[i + page * 7] < -999)
{
size = 5;
}
else if ( DebugData->Analog[i + page * 7] < -99)
{
size = 4;
}
else if ( DebugData->Analog[i + page * 7] < 999)
{
size = 3;
}
else if ( DebugData->Analog[i + page * 7] < 9999)
{
size = 4;
}
else
{
size = 5;
}
write_ndigit_number_s (21-size, i, DebugData->Analog[i + page * 7], size, 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
timer = TIMEOUT;
rxd_buffer_locked = FALSE;
}
 
if (!abo_timer)
{ // renew abo every 3 sec
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
abo_timer = ABO_TIMEOUT;
}
 
if (get_key_press (1 << KEY_MINUS))
{
page--;
if (page > 4)
{
page = 4;
}
lcd_cls ();
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
else if (get_key_press (1 << KEY_PLUS))
{
page++;
if (page > 4)
{
page = 0;
}
lcd_cls ();
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
if ((hardware == NC) && get_key_press (1 << KEY_ENTER))
{
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
_delay_ms (200);
 
if (current_hardware == NC)
{
SwitchToFC();
 
timer = TIMEOUT;
}
else
{
SwitchToNC();
 
timer = TIMEOUT;
}
 
_delay_ms (200);
 
if (AnalogNamesRead[current_hardware - 1] < 32)
{
GetAnalogNames ();
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
 
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
lcd_cls ();
page = 0;
 
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
}
while (!get_key_press (1 << KEY_ESC) && timer); // ESC
get_key_press(KEY_ALL);
 
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
if (!timer)
{ // timeout occured
lcd_cls ();
lcd_printp_at (0, 2, PSTR("ERROR: no data"), 0);
 
timer = 100;
while (timer > 0);
}
SwitchToNC();
}
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/debug.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _DEBUG_H
#define _DEBUG_H
 
extern uint8_t AnalogNamesRead[2];
 
void display_debug(void);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/display.c
0,0 → 1,180
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
 
#include "main.h"
#include "lcd.h"
#include "usart.h"
#include "timer.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
#define TIMEOUT 500 // 5 sec
 
 
void display_data (void)
{
uint8_t cmd;
uint8_t flag = 0;;
 
mode = 'H';
 
lcd_cls ();
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
if (current_hardware == NC)
{
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
}
else
{
if (hardware == FC)
{
lcd_printp_at (0, 0, PSTR(" Display "), 2);
lcd_printp_at (19, 7, PSTR(" "), 0);
}
else
{
lcd_printp_at (0, 0, PSTR(" Flight-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("NC"), 0);
}
}
 
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
cmd = 0xfc; // Home = first page
 
do
{
SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
cmd = 0xff;
//LED6_TOGGLE;
_delay_ms (250);
 
if (rxd_buffer_locked)
{
Decode64 ();
flag = 1;
 
if (!hardware)
{ // hardware was not detected at startup
hardware = rxd_buffer[1] - 'a';
if (hardware == NC)
{
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
current_hardware = NC;
}
else
{
lcd_printp_at (0, 0, PSTR(" Display "), 2);
lcd_printp_at (19, 7, PSTR(" "), 0);
current_hardware = FC;
}
}
 
#if 0
rxd_buffer[24] = 0;
 
lcd_print_at (0, rxd_buffer[3] + 1, (uint8_t *) &rxd_buffer[4], 0);
#else
rxd_buffer[83] = 0;
 
print_display_at (0, 2, (uint8_t *) &rxd_buffer[3]);
#endif
 
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
}
 
if (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
cmd = 0xfe; // next page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
else if (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
cmd = 0xfd; // previous page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
else if ((hardware == NC) && get_key_press (1 << KEY_ENTER))
{
if (current_hardware == NC)
{
SwitchToFC();
 
//timer = TIMEOUT;
lcd_printp_at (0, 0, PSTR(" Flight-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("NC"), 0);
}
else
{
SwitchToNC();
 
//timer = TIMEOUT;
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
}
cmd = 0xfc; // Home = first page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
}
while (!get_key_press (1 << KEY_ESC) && timer);
get_key_press(KEY_ALL);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
if (!timer)
{ // timeout occured
if (flag)
{
lcd_cls ();
}
lcd_printp_at (0, 2, PSTR("Fehler: Keine Daten"), 0);
 
timer = 100;
while (timer > 0);
}
SwitchToNC();
}
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/display.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _DISPLAY_H
#define _DISPLAY_H
 
void display_data (void);
 
#endif
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/eeprom.c
0,0 → 1,356
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <avr/eeprom.h>
#include <stdbool.h>
#include <avr/wdt.h>
#include "lcd.h"
#include "main.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "mk-data-structs.h"
#include "connect.h"
 
 
//--------------------------------------------------------------
//
 
uint8_t EE_LowBat EEMEM = 137; // 13,7V
uint8_t EE_DisplayTimeout EEMEM = 0; // Display immer an
uint8_t EE_DisplayLanguage EEMEM = 254; // Default ungesetzt
uint8_t EE_WiTXRXChannel EEMEM = 1; // Kanal 1 MK Standard
uint8_t EE_WiNetworkGroup EEMEM = 66; // Gruppe 66 MK Standard
uint8_t EE_WiNetworkMode EEMEM = NetMode_Normal; // MK Standard;
uint8_t EE_WiTXTO EEMEM = TWaitTime16; // MK Standard
uint8_t EE_WiUartMTU EEMEM = UartMTU64; // MK Standard
uint8_t EE_LCD_Orientation EEMEM = 0; // normale Ansicht
uint8_t EE_LCD_DisplayMode EEMEM = 0; // Normal
uint8_t EE_LCD_Kontrast EEMEM = 27; // Kontrast normal
uint8_t EE_LCD_Helligkeit EEMEM = 100; // Helligkeit in %gkeit in %
uint8_t EE_USBBT EEMEM = 0; // USB Betrieb
uint8_t EE_U02SV2 EEMEM = 1; // SV2 (Kabel) Standard
uint8_t EE_Debug EEMEM = 0; // kein Debug
uint8_t EE_UseWi EEMEM = true; // Wi.232 eingebaut?
uint8_t EE_UseBT EEMEM = true; // BT-222 eingebaut?
uint8_t EE_WiIsSet EEMEM = false; // Flag für die Initialisierung Wi232
uint8_t EE_BTIsSet EEMEM = false; // Flag für die Initialisierung Bluetooth
uint8_t EE_PKT_IdleBeep EEMEM = 0; // kein Piepsen bei Inaktivität
uint8_t EE_PKT_StartInfo EEMEM = true; // Startinformationen anzeigen
uint16_t EE_Lipo_UOffset EEMEM = 0; // Offset für die Lipospannugsmessung
uint8_t EE_PKT_Accutyp EEMEM = true; // True = Lipo, False = LiON
uint8_t EEMEM EE_BTPin[bt_pin_length + 1];
uint8_t EEMEM EE_BTName[bt_name_length + 1];
uint32_t EE_LastLongitude EEMEM = 0;
uint32_t EE_LastLatitude EEMEM = 0;
 
WPListDirectory EEWPDirectory[NumberOfWPLists] EEMEM;
WayPoints EEWayPointList[NumberOfWaypoints] EEMEM;
 
 
uint8_t EE_PKTVersion EEMEM = EEpromVersion;
 
 
volatile uint8_t DisplayTimeout;
volatile uint8_t DisplayLanguage;
volatile uint8_t WiTXRXChannel;
volatile uint8_t WiNetworkGroup;
volatile uint8_t WiNetworkMode;
volatile uint8_t WiTXTO;
volatile uint8_t WiUartMTU;
volatile uint8_t LCD_ORIENTATION;
volatile uint8_t LCD_DisplayMode;
volatile uint8_t LCD_Kontrast;
volatile uint8_t LCD_Helligkeit;
volatile uint8_t USBBT;
volatile uint8_t U02SV2;
volatile uint8_t Debug;
volatile uint8_t UseWi; // Wi232 wird genutzt
volatile uint8_t UseBT; // BT wird genutzt
volatile uint8_t WiIsSet; // Wi232 ist initialisiert
volatile uint8_t BTIsSet; // BT ist initialisiert
char bt_pin[bt_pin_length + 1]; // BT Pinnummer
char bt_name[bt_name_length + 1]; // BT Name
 
volatile uint32_t LastLongitude; // Letzte Position
volatile uint32_t LastLatitude;
volatile uint8_t PKT_IdleBeep;
volatile uint8_t PKT_StartInfo;
volatile uint16_t Lipo_UOffset; // Offset für die Lipospannugsmessung
volatile uint8_t PKT_Accutyp; // verwendeter Akkutyp
volatile WayPoints PKTWayPoint; // Waypointdaten für einen Waypoint
volatile WPListDirectory PKTWayPointDirectory; // Inhaltsverzeichnis der Listen
 
 
 
//--------------------------------------------------------------
//
void WriteWiInitFlag(void)
{
WiIsSet = true;
eeprom_write_byte(&EE_WiIsSet, WiIsSet);
 
}
 
 
//--------------------------------------------------------------
//
void WriteBTInitFlag(void)
{
BTIsSet = true;
eeprom_write_byte(&EE_BTIsSet, BTIsSet);
 
}
 
 
//--------------------------------------------------------------
//
void ReadLastPosition(void)
 
{
LastLongitude = eeprom_read_dword(&EE_LastLongitude);
LastLatitude = eeprom_read_dword(&EE_LastLatitude);
}
 
 
//--------------------------------------------------------------
//
void WriteLastPosition(uint32_t ELongitude,uint32_t ELatitude)
 
{
 
eeprom_write_dword(&EE_LastLongitude,ELongitude);
eeprom_write_dword(&EE_LastLatitude,ELatitude);
}
 
 
//--------------------------------------------------------------
//
void ReadParameter (void)
{
if (eeprom_read_byte(&EE_PKTVersion) == EEpromVersion)
 
{
MK_LowBat = eeprom_read_byte (&EE_LowBat);
DisplayTimeout = eeprom_read_byte (&EE_DisplayTimeout);
DisplayLanguage = eeprom_read_byte (&EE_DisplayLanguage);
WiTXRXChannel = eeprom_read_byte (&EE_WiTXRXChannel);
WiNetworkGroup = eeprom_read_byte (&EE_WiNetworkGroup);
WiNetworkMode = eeprom_read_byte (&EE_WiNetworkMode);
WiTXTO = eeprom_read_byte (&EE_WiTXTO);
WiUartMTU = eeprom_read_byte (&EE_WiUartMTU);
LCD_ORIENTATION = eeprom_read_byte (&EE_LCD_Orientation);
LCD_DisplayMode = eeprom_read_byte (&EE_LCD_DisplayMode);
LCD_Kontrast = eeprom_read_byte (&EE_LCD_Kontrast);
LCD_Helligkeit = eeprom_read_byte (&EE_LCD_Helligkeit);
USBBT = eeprom_read_byte (&EE_USBBT);
U02SV2 = eeprom_read_byte (&EE_U02SV2);
Debug = eeprom_read_byte (&EE_Debug);
UseWi = eeprom_read_byte (&EE_UseWi);
UseBT = eeprom_read_byte (&EE_UseBT);
WiIsSet = eeprom_read_byte (&EE_WiIsSet);
BTIsSet = eeprom_read_byte (&EE_BTIsSet);
PKT_IdleBeep = eeprom_read_byte (&EE_PKT_IdleBeep);
PKT_StartInfo = eeprom_read_byte (&EE_PKT_StartInfo);
Lipo_UOffset = eeprom_read_word (&EE_Lipo_UOffset);
PKT_Accutyp = eeprom_read_byte (&EE_PKT_Accutyp);
eeprom_read_block ((void*)&bt_pin, (const void*)&EE_BTPin, bt_pin_length);
eeprom_read_block ((void*)&bt_name, (const void*)&EE_BTName, bt_name_length);
LastLongitude = eeprom_read_dword (&EE_LastLongitude);
LastLatitude = eeprom_read_dword (&EE_LastLatitude);
}
 
else
Delete_EEPROM();
 
}
 
//--------------------------------------------------------------
void Delete_EEPROM(void)
{
// EEPROM auf Default setzen
 
lcd_cls();
lcd_printp_at (0, 0, PSTR(" EEPROM Parameter "), 2);
lcd_printp_at (0, 1, PSTR("werden auf"), 0);
lcd_printp_at (0, 2, PSTR("Standardwerte gesetzt"), 0);
 
MK_LowBat = 137; // 13,7V
DisplayTimeout = 0; // Display immer an
DisplayLanguage = 1; // default englisch
WiTXRXChannel = 1; // Kanal 1 MK Standard
WiNetworkGroup = 66; // Gruppe 66 MK Standard
WiNetworkMode = NetMode_Normal; // MK Standard
WiTXTO = TWaitTime16; // MK Standard
WiUartMTU = UartMTU64; // MK Standard
LCD_ORIENTATION = 0; // normale Ansicht
LCD_DisplayMode = 0; // Normal
LCD_Kontrast = 20; // Kontrast normal
LCD_Helligkeit = 100; // Helligkeit in %
USBBT = 0; // USB Betrieb
U02SV2 = 0; // SV2 (Kabel) Standard
Debug = 0; // kein Debug
UseWi = true; // Wi.232 eingebaut?
UseBT = true; // BT-222 eingebaut?
WiIsSet = false; // Flag für die Initialisierung Wi232
BTIsSet = false; // Flag für die Initialisierung Bluetooth
PKT_IdleBeep = 0; // kein Piepsen bei Inaktivität
PKT_StartInfo = true; // Startnformationen anzeigen
PKT_Accutyp = true; // True = Lipo, False= LiON
Lipo_UOffset = 6000; // Offset für PKT-Lipomessung
LastLongitude = 88199720;
LastLatitude = 522039630;
eeprom_write_dword(&EE_LastLongitude,LastLongitude);
eeprom_write_dword(&EE_LastLatitude,LastLatitude);
 
strcpy_P(bt_pin, PSTR("1234"));
eeprom_write_block ((const void*)&bt_pin, (void*)&EE_BTPin, bt_pin_length);
 
strcpy_P(bt_name, PSTR("PKT Cebra ")); // Wenn Name kürzer als "bt_name_length" mit Leerzeichen auffüllen
eeprom_write_block ((const void*)&bt_name, (void*)&EE_BTName, bt_name_length);
 
eeprom_write_byte(&EE_WiIsSet,WiIsSet);
eeprom_write_byte(&EE_BTIsSet,BTIsSet);
eeprom_write_byte(&EE_PKTVersion,EEpromVersion);
 
WriteParameter();
 
// lcd_printp_at (0, 4, PSTR("Waypoints loeschen"), 0);
// EEWayPointList_Clear();
 
lcd_printp_at (0, 6, PSTR("!!Check Parameter!! "), 0);
lcd_printp_at (18, 7, PSTR("OK"), 0);
BeepTime = 200;
BeepMuster = 0x0080;
do{}
while (!(get_key_short (1 << KEY_ENTER)));
// _delay_ms(500);
//#if defined HWVERSION3_9
// clr_V_On();
//#else
//
// wdt_enable( WDTO_250MS );
// while (1)
// {;}
//#endif
}
 
 
//--------------------------------------------------------------
//
void WriteParameter (void)
{
eeprom_write_byte (&EE_LowBat, MK_LowBat);
eeprom_write_byte (&EE_DisplayTimeout, DisplayTimeout);
eeprom_write_byte (&EE_DisplayLanguage, DisplayLanguage);
eeprom_write_byte (&EE_WiTXRXChannel, WiTXRXChannel);
eeprom_write_byte (&EE_WiNetworkGroup, WiNetworkGroup);
eeprom_write_byte (&EE_WiNetworkMode, WiNetworkMode);
eeprom_write_byte (&EE_WiTXTO, WiTXTO);
eeprom_write_byte (&EE_WiUartMTU, WiUartMTU);
eeprom_write_byte (&EE_LCD_Orientation, LCD_ORIENTATION);
eeprom_write_byte (&EE_LCD_DisplayMode, LCD_DisplayMode);
eeprom_write_byte (&EE_LCD_Kontrast, LCD_Kontrast);
eeprom_write_byte (&EE_LCD_Helligkeit, LCD_Helligkeit);
eeprom_write_byte (&EE_USBBT, USBBT);
eeprom_write_byte (&EE_U02SV2, U02SV2);
eeprom_write_byte (&EE_Debug, Debug);
eeprom_write_byte (&EE_UseWi, UseWi);
eeprom_write_byte (&EE_UseBT, UseBT);
eeprom_write_byte (&EE_WiIsSet, WiIsSet);
eeprom_write_byte (&EE_BTIsSet, BTIsSet);
eeprom_write_byte (&EE_PKT_IdleBeep, PKT_IdleBeep);
eeprom_write_byte (&EE_PKT_StartInfo, PKT_StartInfo);
eeprom_write_word (&EE_Lipo_UOffset,Lipo_UOffset);
eeprom_write_byte (&EE_PKT_Accutyp, PKT_Accutyp);
 
eeprom_write_block ((const void*)&bt_pin, (void*)&EE_BTPin, bt_pin_length);
eeprom_write_block ((const void*)&bt_name, (void*)&EE_BTName, bt_name_length);
 
}
 
 
 
 
//--------------------------------------------------------------
//
void EEWayPointList_Clear(void) // löschen der Waypointliste im EEProm
{
uint8_t i;
PKTWayPoint.Waypoint.Position.Latitude = 0;
PKTWayPoint.Waypoint.Position.Longitude = 0;
PKTWayPoint.Waypoint.Position.Altitude = 0;
PKTWayPoint.Waypoint.Heading = 361;
 
for(i = 0; i < MAX_WPLIST_LEN; i++)
{
PKTWayPointDirectory.WPList.WPDirectory[i] = 0;
}
 
for(i = 0; i < NumberOfWaypoints; i++)
{
lcd_printp (PSTR("."), 0);
eeprom_write_byte (&EEWayPointList[i].WPIndex, i);
eeprom_write_byte (&EEWayPointList[i].Waypoint.Position.Status, INVALID);
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Latitude, (void*)&EEWayPointList[i].Waypoint.Position.Latitude, sizeof(EEWayPointList[i].Waypoint.Position.Latitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Longitude, (void*)&EEWayPointList[i].Waypoint.Position.Longitude, sizeof(EEWayPointList[i].Waypoint.Position.Longitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Altitude, (void*)&EEWayPointList[i].Waypoint.Position.Altitude, sizeof(EEWayPointList[i].Waypoint.Position.Altitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Heading, (void*)&EEWayPointList[i].Waypoint.Heading, sizeof(EEWayPointList[i].Waypoint.Heading));
 
eeprom_write_byte (&EEWayPointList[i].Waypoint.ToleranceRadius, 0); // in meters, if the MK is within that range around the target, then the next target is triggered
eeprom_write_byte (&EEWayPointList[i].Waypoint.HoldTime, 0); // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
eeprom_write_byte (&EEWayPointList[i].Waypoint.Type, POINT_TYPE_INVALID);
eeprom_write_byte (&EEWayPointList[i].Waypoint.Event_Flag, 0); // future implementation
eeprom_write_byte (&EEWayPointList[i].Waypoint.AltitudeRate, 0); // no change of setpoint
}
 
for(i = 0; i < NumberOfWPLists; i++)
{
lcd_printp (PSTR("."), 0);
eeprom_write_byte (&EEWPDirectory[i].WPList.WPListnumber, i);
eeprom_write_byte (&EEWPDirectory[i].WPList.WPListAktiv, false);
eeprom_write_byte (&EEWPDirectory[i].WPList.POI_CAM_NICK_CTR, 0);
eeprom_write_byte (&EEWPDirectory[i].WPList.UsePOI, 0);
eeprom_write_block ((const void*)&PKTWayPointDirectory.WPList.WPDirectory, (void*)&EEWPDirectory[i].WPList.WPDirectory, sizeof(EEWPDirectory[i].WPList.WPDirectory));
 
}
lcd_printp (PSTR("\r\n"), 0);
 
}
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/eeprom.h
0,0 → 1,148
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _EEPROM_H
#define _EEPROM_H
 
#include <stdbool.h>
#include "mk-data-structs.h"
#include "connect.h"
 
 
 
 
//[General]
//FileVersion = 2
//NumberOfWaypoints = 15
//UsePOI = 0
//POI_CAM_NICK_CTRL = 0
 
//[POI]
//Altitude = 1
//Latitude = 46.7140763
//Longitude = 19.2507334
 
//[Waypoint1]
//Latitude = 46.7145686
//Longitude = 19.2515702
//Radius = 10
//Altitude = 15
//ClimbRate = 0
//DelayTime = 4
//WP_Event_Channel_Value = 96
//Heading = 180
 
 
#define EEpromVersion 0x58 //Summe aus Soft.vers. ohne erste Ziffer zB 3.5.5 = 55
 
#define NumberOfWaypoints 55 //Anzahl der Waypoints in der EEPromliste
#define NumberOfWPLists 5 //Anzahl WP Listen im PKT
#define bt_pin_length 4
#define bt_name_length 10
 
 
#define POINT_TYPE_INVALID 255
#define POINT_TYPE_WP 0
#define POINT_TYPE_POI 1
#define INVALID 0x00
#define MAX_WPLIST_LEN 31
 
 
 
 
 
typedef struct
{
uint8_t WPIndex; // Index in der EEpromliste
Point_t Waypoint; // Waypoint
} WayPoints;
 
typedef struct
{
uint8_t WPListnumber; // Nummer der WP Liste im PKT
uint8_t WPListAktiv; // Liste aktiv
uint8_t WPDirectory[31]; // Enthält die Indexe der Waypoints im EEPROM
uint8_t UsePOI;
uint8_t POI_CAM_NICK_CTR;
 
} WPListHeader;
 
typedef struct
{
WPListHeader WPList; // Waypointliste im PKT
} WPListDirectory;
 
 
 
 
 
 
void ReadParameter (void);
void WriteParameter (void);
void ReadLastPosition(void);
void WriteLastPosition(uint32_t ELongitude,uint32_t ELatitude);
void WriteWiInitFlag(void);
void WriteBTInitFlag(void);
void Delete_EEPROM(void);
void EEWayPointList_Clear(void); // l�schen der Waypointliste im EEProm
 
 
uint8_t MK_LowBat;
extern volatile uint8_t LCD_ORIENTATION;
extern volatile uint8_t LCD_DisplayMode;
extern volatile uint8_t LCD_Kontrast;
extern volatile uint8_t LCD_Helligkeit;
extern volatile uint8_t DisplayTimeout;
extern volatile uint8_t DisplayLanguage;
extern volatile uint8_t WiTXRXChannel;
extern volatile uint8_t WiNetworkGroup;
extern volatile uint8_t WiNetworkMode;
extern volatile uint8_t WiTXTO;
extern volatile uint8_t WiUartMTU;
extern volatile uint8_t USBBT;
extern volatile uint8_t U02SV2;
extern volatile uint8_t Debug;
extern volatile uint8_t UseWi; // Wi232 wird genutzt
extern volatile uint8_t UseBT; // BT wird genutzt
extern volatile uint8_t WiIsSet; // Wi232 ist initialisiert
extern volatile uint8_t BTIsSet; // BT ist initialisiert
extern char bt_pin[bt_pin_length + 1]; // BT Pinnummer
extern char bt_name[bt_name_length + 1]; // BT Name
extern volatile uint32_t LastLongitude;
extern volatile uint32_t LastLatitude;
extern volatile uint8_t PKT_IdleBeep;
extern volatile uint8_t PKT_StartInfo;
extern volatile uint16_t Lipo_UOffset; // Offset für die Lipospannugsmessung
extern volatile uint8_t PKT_Accutyp;
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/error.c
0,0 → 1,206
/*
___ ___ ___ ___ _____
/ /\ /__/\ / /\ /__/\ / /::\
/ /::\ | |::\ / /::\ \ \:\ / /:/\:\
/ /:/\:\ ___ ___ | |:|:\ / /:/\:\ \ \:\ / /:/ \:\
/ /:/~/::\ /__/\ / /\ __|__|:|\:\ / /:/ \:\ _____\__\:\ /__/:/ \__\:|
/__/:/ /:/\:\ \ \:\ / /:/ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\ \ \:\ / /:/
\ \:\/:/__\/ \ \:\ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/ \ \:\ /:/
\ \::/ \ \:\/:/ \ \:\ \ \:\ /:/ \ \:\ ~~~ \ \:\/:/
\ \:\ \ \::/ \ \:\ \ \:\/:/ \ \:\ \ \::/
\ \:\ \__\/ \ \:\ \ \::/ \ \:\ \__\/
\__\/ \__\/ \__\/ \__\/
___ ___ ___ ___ ___ ___
/ /\ / /\ /__/\ /__/\ / /\ /__/\
/ /:/ / /::\ | |::\ | |::\ / /::\ \ \:\
/ /:/ / /:/\:\ | |:|:\ | |:|:\ / /:/\:\ \ \:\
/ /:/ ___ / /:/ \:\ __|__|:|\:\ __|__|:|\:\ / /:/ \:\ _____\__\:\
/__/:/ / /\ /__/:/ \__\:\ /__/::::| \:\ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\
\ \:\ / /:/ \ \:\ / /:/ \ \:\~~\__\/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/
\ \:\ /:/ \ \:\ /:/ \ \:\ \ \:\ \ \:\ /:/ \ \:\ ~~~
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\ \ \:\/:/ \ \:\
\ \::/ \ \::/ \ \:\ \ \:\ \ \::/ \ \:\
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
 
 
**
* Error handling functions
*/
 
#include <stdbool.h>
//#include "ftdi.h"
 
#include <avr/pgmspace.h>
#include "error_driver.h"
 
//--------------------------------------------------------------
inline void _send_msg(const char *msg)
{
for (uint8_t i=0; i<255 && msg[i]!='\0'; i++)
{
error_driver_write_c(msg[i]);
}
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void send_pgm(const prog_char *msg)
{
uint8_t myByte;
myByte = pgm_read_byte(msg);
for(int i = 1; myByte != '\0'; i++)
{
error_driver_write_c(myByte);
myByte = pgm_read_byte(msg+i);
}
}
 
#ifdef DEBUG
 
 
//--------------------------------------------------------------
void error_init(void)
{
error_driver_Init();
}
 
 
//--------------------------------------------------------------
void error_putc(const char c)
{
error_driver_write_c(c);
}
 
 
//--------------------------------------------------------------
void assert (bool condition, const char *msg)
{
if (!condition)
{
send_pgm(PSTR("ASS:"));
_send_msg(msg);
}
}
 
 
//--------------------------------------------------------------
void info (const char *msg)
{
send_pgm(PSTR("INF:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void warn (const char *msg)
{
send_pgm(PSTR("WARN:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void debug (const char *msg)
{
send_pgm(PSTR("DBG:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void Error (const char *msg)
{
send_pgm(PSTR("ERR:"));
_send_msg(msg);
}
#endif
 
#ifdef DEBUG
 
//--------------------------------------------------------------
void assert_pgm(bool condition, const prog_char *msg)
{
if (condition) {
send_pgm(PSTR("ASS:"));
send_pgm(msg);
error_driver_write_c('\n');
}
}
 
 
//--------------------------------------------------------------
void info_pgm(const prog_char *msg)
{
send_pgm(PSTR("INF:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void warn_pgm(const prog_char *msg)
{
send_pgm(PSTR("WARN:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void error_pgm(const prog_char *msg)
{
send_pgm(PSTR("ERR:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void debug_pgm(const prog_char *msg)
{
send_pgm(PSTR("DBG:"));
send_pgm(msg);
error_driver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void print_hex(uint8_t num)
{
if (num<10)
error_putc(num+48);
else
{
switch (num)
{
case 10:
error_putc('A'); break;
case 11:
error_putc('B'); break;
case 12:
error_putc('C'); break;
case 13:
error_putc('D'); break;
case 14:
error_putc('E'); break;
case 15:
error_putc('F'); break;
default:
error_putc('#'); break;
}
}
}
 
 
//--------------------------------------------------------------
void byte_to_hex(uint8_t byte)
{
uint8_t b2 = (byte & 0x0F);
uint8_t b1 = ((byte & 0xF0)>>4);
print_hex(b1);
print_hex(b2);
}
 
#endif
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/error.h
0,0 → 1,75
/*
___ ___ ___ ___ _____
/ /\ /__/\ / /\ /__/\ / /::\
/ /::\ | |::\ / /::\ \ \:\ / /:/\:\
/ /:/\:\ ___ ___ | |:|:\ / /:/\:\ \ \:\ / /:/ \:\
/ /:/~/::\ /__/\ / /\ __|__|:|\:\ / /:/ \:\ _____\__\:\ /__/:/ \__\:|
/__/:/ /:/\:\ \ \:\ / /:/ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\ \ \:\ / /:/
\ \:\/:/__\/ \ \:\ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/ \ \:\ /:/
\ \::/ \ \:\/:/ \ \:\ \ \:\ /:/ \ \:\ ~~~ \ \:\/:/
\ \:\ \ \::/ \ \:\ \ \:\/:/ \ \:\ \ \::/
\ \:\ \__\/ \ \:\ \ \::/ \ \:\ \__\/
\__\/ \__\/ \__\/ \__\/
___ ___ ___ ___ ___ ___
/ /\ / /\ /__/\ /__/\ / /\ /__/\
/ /:/ / /::\ | |::\ | |::\ / /::\ \ \:\
/ /:/ / /:/\:\ | |:|:\ | |:|:\ / /:/\:\ \ \:\
/ /:/ ___ / /:/ \:\ __|__|:|\:\ __|__|:|\:\ / /:/ \:\ _____\__\:\
/__/:/ / /\ /__/:/ \__\:\ /__/::::| \:\ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\
\ \:\ / /:/ \ \:\ / /:/ \ \:\~~\__\/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/
\ \:\ /:/ \ \:\ /:/ \ \:\ \ \:\ \ \:\ /:/ \ \:\ ~~~
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\ \ \:\/:/ \ \:\
\ \::/ \ \::/ \ \:\ \ \:\ \ \::/ \ \:\
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
 
 
*
* Error handling functions.
*/
 
#ifndef __ERROR__
#define __ERROR__
 
#include <avr/pgmspace.h>
#include <stdbool.h>
#include "main.h"
 
 
void error_init(void);
 
void error_putc(const char c);
 
void assert (bool condition, const char *msg);
void info (const char *msg);
void warn(const char *msg);
void debug(const char *msg);
void Error(const char *msg);
 
void assert_pgm(bool condition, const prog_char *msg);
void info_pgm (const prog_char *msg);
void warn_pgm(const prog_char *msg);
void debug_pgm(const prog_char *msg);
void error_pgm(const prog_char *msg);
 
void byte_to_hex(uint8_t byte);
 
#else
 
#define error_init() {}
 
 
#define error_putc(c) {}
 
#define assert(cond, msg) {}
#define info(msg) {}
#define warn(msg) {}
#define debug(msg) {}
#define error(msg) {}
 
#define assert_pgm(cond, msg) {}
#define info_pgm(msg) {}
#define warn_pgm(msg) {}
#define debug_pgm(msg) {}
#define error_pgm(msg) {}
#define byte_to_hex(byte) {}
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/error_driver.c
0,0 → 1,21
#include "cpu.h"
#include "error_driver.h"
#include "main.h"
 
#ifdef DEBUG
 
#include "usart.h"
#include "uart1.h"
 
 
void error_driver_write_c(uint8_t c)
{
USART_putc(c);
}
 
void error_driver_Init(void)
{
// USART_Init(UART_BAUD_SELECT(USART_BAUD,F_CPU));
}
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/error_driver.h
0,0 → 1,22
/*
* Functions to write error message to FTDI or USART
*/
 
#ifndef __ERROR_DRIVER__
#define __ERROR_DRIVER__
 
#include <avr/io.h>
#include "main.h"
 
 
 
#ifdef DEBUG
extern void error_driver_write_c(uint8_t c);
extern void error_driver_Init(void);
#else
#define error_driver_write_c(c) {}
#define error_driver_init() {}
#endif
 
 
#endif //__ERROR_DRIVER__
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/fifo.c
0,0 → 1,114
/**
* a simple Fifo
* @file fifo.c
* @author Pascal Schnurr
*/
 
#include "fifo.h"
 
//--------------------------------------------------------------
void fifo_init (fifo_t * fifo, uint8_t * buffer, uint16_t size)
{
fifo->size = size;
fifo->buffer = buffer;
fifo->head = 0;
fifo->count = 0;
}
 
//--------------------------------------------------------------
bool fifo_is_empty (const fifo_t * fifo)
{
return (fifo->count == 0);
}
 
//--------------------------------------------------------------
bool fifo_is_full (const fifo_t * fifo)
{
return (fifo->size - fifo->count == 0);
}
 
//--------------------------------------------------------------
bool fifo_read (fifo_t * fifo, char *data)
{
if (fifo_is_empty (fifo))
return false;
 
uint8_t *head = fifo->buffer + fifo->head;
 
*data = (char) * head;
 
fifo->head = ( (fifo->head + 1) % fifo->size);
 
fifo->count--;
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_write (fifo_t * fifo, const char data)
{
if (fifo_is_full (fifo))
return false;
 
uint8_t *end = fifo->buffer + ( (fifo->head + fifo->count) % fifo->size);
 
*end = (uint8_t) data;
 
fifo->count++;
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_clear (fifo_t * fifo)
{
fifo->count = 0;
fifo->head = 0;
return true;
}
 
//--------------------------------------------------------------
static bool fifo_cmp_pgm_at (fifo_t * fifo, const prog_char * pgm, const uint16_t index)
{
uint16_t i;
uint8_t fifo_byte;
uint8_t pgm_byte;
 
for (i = 0; pgm_read_byte (pgm + i) != 0; i++)
{
if (fifo->count <= (i + index))
return false;
 
pgm_byte = pgm_read_byte (pgm + i);
 
fifo_byte = * (fifo->buffer + ( (fifo->head + i + index) % fifo->size));
 
if (fifo_byte != pgm_byte)
return false;
}
 
// We found the string, lets move the pointer
fifo->head = ( (fifo->head + i + index) % fifo->size);
 
fifo->count -= (i + index);
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_cmp_pgm (fifo_t * fifo, const prog_char * pgm)
{
return fifo_cmp_pgm_at (fifo, pgm, 0);
}
 
//--------------------------------------------------------------
bool fifo_strstr_pgm (fifo_t * fifo, const prog_char * pgm)
{
for (uint16_t i = 0; i < fifo->count; i++)
{
if (fifo_cmp_pgm_at (fifo, pgm, i))
return true;
}
 
return false;
}
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/fifo.h
0,0 → 1,83
/**
* a simple Fifo
* @file fifo.h
* @author Pascal Schnurr
*/
 
#include <avr/pgmspace.h>
#include <stdbool.h>
#ifndef _FIFO_H_
#define _FIFO_H_
 
/**
*fifo data structure all vital fifo information
*/
typedef struct
{
uint16_t count; /**< current number of elements */
uint16_t head; /**< position of the head element */
uint16_t size; /**< size equals max number of entrys*/
uint8_t* buffer; /**< pointer to memory area where the fifo is to be saved */
} fifo_t;
 
 
/** \brief initialize of a fifo
* sets all the information in your given fifo structure
* @param fifo pointer to an allocated fifo_t structure
* @param buffer pointer to an a allocated memory space for the fifo of size = sizeof(uint8_t) * size
* @param size max number of entrys the fifo will hold
*/
void fifo_init (fifo_t *fifo, uint8_t *buffer, uint16_t size);
 
/** \brief checks if fifo is empty
* @param fifo pointer to your initialized fifo_t structure
* @return true if empty otherwise false
*/
bool fifo_is_empty (const fifo_t *fifo);
 
/** \brief checks if fifo is full
* @param fifo pointer to your initialized fifo_t structure
* @return true if full otherwise false
*/
bool fifo_is_full (const fifo_t *fifo);
 
/** \brief clears the fifo
* resets your fifo structure to 0 elements
* @param fifo pointer to your initialized fifo_t structure
* @return always true (never fails)
*/
bool fifo_clear (fifo_t *fifo);
 
/** \brief reads head of fifo
* reads the first element and removes it
* @param fifo pointer to your initialized fifo_t structure
* @return false if fifo is empty false otherwise
*/
bool fifo_read (fifo_t *fifo, char *data);
 
/** \brief inserts a char into the fifo
* adds a char to the end of the fifo
* @param fifo pointer to your initialized fifo_t structure
* @param data the char data to be inserted
* @return false if fifo is full true otherwise
*/
bool fifo_write (fifo_t *fifo, const char data);
 
/** \brief compares first elements with prog_char string
* if pgm equals the first elements of the fifo these elements are removed
* @param fifo pointer to your initialized fifo_t structure
* @param pgm a prog_char string for comparison
* @return true if pgm is equal to the first entrys in the fifo, false otherwise
*/
bool fifo_cmp_pgm (fifo_t* fifo, const prog_char* pgm);
 
/** \brief searches a string in the whole fifo
* starts at the beginning and searches for the pgm string in the fifo,
* if they are found previous entrys and the string are removed from the fifo
* @param fifo pointer to your initialized fifo_t structure
* @param pgm a prog_char with the search string
* @return true if found, false otherwise
*/
bool fifo_strstr_pgm (fifo_t *fifo, const prog_char *pgm);
 
#endif /* _FIFO_H_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/font8x6.c
0,0 → 1,171
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - font provided by Claas Anders "CaScAdE" Rathje *
* - umlauts and special characters by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#include <avr/pgmspace.h>
 
// one byte is a column
// bit 7 is the bottom
//
// 123456
// L 1 | XXX |
// O 2 |X X |
// W 4 |X X |
// 8 | XXX |
// H 1 |X X |
// I 2 |X X |
// G 4 | XXX |
// H 8 | |
//
// 0x36,0x49,0x49,0x49,0x36,0x00
//
 
prog_uint8_t font8x6[128][6] =
{
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 0 00 (not useable)
{ 0x78,0x15,0x14,0x15,0x78,0x00 }, // ASCII - 1 01 'Ä'
{ 0x20,0x55,0x54,0x55,0x78,0x00 }, // ASCII - 2 02 'ä'
{ 0x38,0x45,0x44,0x45,0x38,0x00 }, // ASCII - 3 03 'Ö'
{ 0x30,0x49,0x48,0x49,0x30,0x00 }, // ASCII - 4 04 'ö'
{ 0x3c,0x41,0x40,0x41,0x3c,0x00 }, // ASCII - 5 05 'Ü'
{ 0x38,0x41,0x40,0x21,0x78,0x00 }, // ASCII - 6 06 'ü'
{ 0x7e,0x15,0x15,0x15,0x0a,0x00 }, // ASCII - 7 07 'ß'
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 8 08
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 9 09
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 10 0A (not useable)
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 11 0B
{ 0x10,0x38,0x54,0x10,0x10,0x1e }, // ASCII - 12 0C Enter Symbol
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 13 0D (not useable)
{ 0x10,0x10,0x10,0x10,0x10,0x10 }, // ASCII - 14 0E hor. line
{ 0x10,0x10,0x10,0x7c,0x10,0x10 }, // ASCII - 15 0F hor. line with tick mark
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 16 10
{ 0x08,0x14,0x00,0x00,0x14,0x08 }, // ASCII - 17 11 <> Change
{ 0x10,0x08,0x04,0x04,0x08,0x10 }, // ASCII - 18 12 /\ Up
{ 0x08,0x10,0x20,0x20,0x10,0x08 }, // ASCII - 19 13 \/ Down
{ 0x00,0x08,0x14,0x22,0x41,0x00 }, // ASCII - 20 14 < Left
{ 0x00,0x41,0x22,0x14,0x08,0x00 }, // ASCII - 21 15 > Right
{ 0x04,0x02,0x7f,0x02,0x04,0x00 }, // ASCII - 22 16 /|\ Arrow up
{ 0x10,0x20,0x7f,0x20,0x10,0x00 }, // ASCII - 23 17 \|/ Arrow down
{ 0x10,0x38,0x54,0x10,0x10,0x10 }, // ASCII - 24 18 <- Arrow left
{ 0x10,0x10,0x10,0x54,0x38,0x10 }, // ASCII - 25 19 -> Arrow right
{ 0x10,0x18,0x1c,0x1c,0x18,0x10 }, // ASCII - 26 1A ^ Triangle up
{ 0x08,0x18,0x38,0x38,0x18,0x08 }, // ASCII - 27 1B v Triangle down
{ 0x00,0x08,0x1c,0x3e,0x7f,0x00 }, // ASCII - 28 1C < Triangle left
{ 0x00,0x7f,0x3e,0x1c,0x08,0x00 }, // ASCII - 29 1D > Triangle right
{ 0x06,0x09,0x09,0x09,0x06,0x00 }, // ASCII - 30 1E '°'
{ 0x06,0x49,0x7d,0x49,0x06,0x00 }, // ASCII - 31 1F Antenne
 
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 32 20 ' '
{ 0x00,0x00,0x2f,0x00,0x00,0x00 }, // ASCII - 33 21 '!'
{ 0x00,0x07,0x00,0x07,0x00,0x00 }, // ASCII - 34 22 '"'
{ 0x14,0x7f,0x14,0x7f,0x14,0x00 }, // ASCII - 35 23 '#'
{ 0x24,0x2a,0x6b,0x2a,0x12,0x00 }, // ASCII - 36 24 '$'
{ 0x23,0x13,0x08,0x64,0x62,0x00 }, // ASCII - 37 25 '%'
{ 0x36,0x49,0x55,0x22,0x50,0x00 }, // ASCII - 38 26 '&'
{ 0x00,0x05,0x03,0x00,0x00,0x00 }, // ASCII - 39 27 '''
{ 0x00,0x1c,0x22,0x41,0x00,0x00 }, // ASCII - 40 28 '('
{ 0x00,0x41,0x22,0x1c,0x00,0x00 }, // ASCII - 41 29 ')'
{ 0x14,0x08,0x3e,0x08,0x14,0x00 }, // ASCII - 42 2a '*'
{ 0x08,0x08,0x3e,0x08,0x08,0x00 }, // ASCII - 43 2b '+'
{ 0x00,0x50,0x30,0x00,0x00,0x00 }, // ASCII - 44 2c ','
{ 0x08,0x08,0x08,0x08,0x08,0x00 }, // ASCII - 45 2d '-'
{ 0x00,0x60,0x60,0x00,0x00,0x00 }, // ASCII - 46 2e '.'
{ 0x20,0x10,0x08,0x04,0x02,0x00 }, // ASCII - 47 2f '/'
{ 0x3e,0x51,0x49,0x45,0x3e,0x00 }, // ASCII - 48 30 '0'
{ 0x00,0x42,0x7f,0x40,0x00,0x00 }, // ASCII - 49 31 '1'
{ 0x42,0x61,0x51,0x49,0x46,0x00 }, // ASCII - 50 32 '2'
{ 0x21,0x41,0x45,0x4b,0x31,0x00 }, // ASCII - 51 33 '3'
{ 0x18,0x14,0x12,0x7f,0x10,0x00 }, // ASCII - 52 34 '4'
{ 0x27,0x45,0x45,0x45,0x39,0x00 }, // ASCII - 53 35 '5'
{ 0x3c,0x4a,0x49,0x49,0x30,0x00 }, // ASCII - 54 36 '6'
{ 0x03,0x01,0x71,0x09,0x07,0x00 }, // ASCII - 55 37 '7'
{ 0x36,0x49,0x49,0x49,0x36,0x00 }, // ASCII - 56 38 '8'
{ 0x06,0x49,0x49,0x29,0x1e,0x00 }, // ASCII - 57 39 '9'
{ 0x00,0x36,0x36,0x00,0x00,0x00 }, // ASCII - 58 3a ':'
{ 0x00,0x56,0x36,0x00,0x00,0x00 }, // ASCII - 59 3b ';'
{ 0x08,0x14,0x22,0x41,0x00,0x00 }, // ASCII - 60 3c '<'
{ 0x14,0x14,0x14,0x14,0x14,0x00 }, // ASCII - 61 3d '='
{ 0x00,0x41,0x22,0x14,0x08,0x00 }, // ASCII - 62 3e '>'
{ 0x02,0x01,0x51,0x09,0x06,0x00 }, // ASCII - 63 3f '?'
{ 0x32,0x49,0x79,0x41,0x3e,0x00 }, // ASCII - 64 40 '@'
{ 0x7e,0x11,0x11,0x11,0x7e,0x00 }, // ASCII - 65 41 'A'
{ 0x7f,0x49,0x49,0x49,0x36,0x00 }, // ASCII - 66 42 'B'
{ 0x3e,0x41,0x41,0x41,0x22,0x00 }, // ASCII - 67 43 'C'
{ 0x7f,0x41,0x41,0x22,0x1c,0x00 }, // ASCII - 68 44 'D'
{ 0x7f,0x49,0x49,0x49,0x41,0x00 }, // ASCII - 69 45 'E'
{ 0x7f,0x09,0x09,0x09,0x01,0x00 }, // ASCII - 70 46 'F'
{ 0x3e,0x41,0x49,0x49,0x7a,0x00 }, // ASCII - 71 47 'G'
{ 0x7f,0x08,0x08,0x08,0x7f,0x00 }, // ASCII - 72 48 'H'
{ 0x00,0x41,0x7f,0x41,0x00,0x00 }, // ASCII - 73 49 'I'
{ 0x20,0x40,0x41,0x3f,0x01,0x00 }, // ASCII - 74 4a 'J'
{ 0x7f,0x08,0x14,0x22,0x41,0x00 }, // ASCII - 75 4b 'K'
{ 0x7f,0x40,0x40,0x40,0x40,0x00 }, // ASCII - 76 4c 'L'
{ 0x7f,0x02,0x0c,0x02,0x7f,0x00 }, // ASCII - 77 4d 'M'
{ 0x7f,0x04,0x08,0x10,0x7f,0x00 }, // ASCII - 78 4e 'N'
{ 0x3e,0x41,0x41,0x41,0x3e,0x00 }, // ASCII - 79 4f 'O'
{ 0x7f,0x09,0x09,0x09,0x06,0x00 }, // ASCII - 80 50 'P'
{ 0x3e,0x41,0x51,0x21,0x5e,0x00 }, // ASCII - 81 51 'Q'
{ 0x7f,0x09,0x19,0x29,0x46,0x00 }, // ASCII - 82 52 'R'
{ 0x46,0x49,0x49,0x49,0x31,0x00 }, // ASCII - 83 53 'S'
{ 0x01,0x01,0x7f,0x01,0x01,0x00 }, // ASCII - 84 54 'T'
{ 0x3f,0x40,0x40,0x40,0x3f,0x00 }, // ASCII - 85 55 'U'
{ 0x1f,0x20,0x40,0x20,0x1f,0x00 }, // ASCII - 86 56 'V'
{ 0x3f,0x40,0x38,0x40,0x3f,0x00 }, // ASCII - 87 57 'W'
{ 0x63,0x14,0x08,0x14,0x63,0x00 }, // ASCII - 88 58 'X'
{ 0x07,0x08,0x70,0x08,0x07,0x00 }, // ASCII - 89 59 'Y'
{ 0x61,0x51,0x49,0x45,0x43,0x00 }, // ASCII - 90 5a 'Z'
{ 0x7f,0x41,0x41,0x00,0x00,0x00 }, // ASCII - 91 5b '['
{ 0x02,0x04,0x08,0x10,0x20,0x00 }, // ASCII - 92 5c '\'
{ 0x00,0x41,0x41,0x7f,0x00,0x00 }, // ASCII - 93 5d ']'
{ 0x04,0x02,0x01,0x02,0x04,0x00 }, // ASCII - 94 5e '^'
{ 0x40,0x40,0x40,0x40,0x40,0x00 }, // ASCII - 95 5f '_'
{ 0x00,0x01,0x02,0x04,0x00,0x00 }, // ASCII - 96 60 '`'
{ 0x20,0x54,0x54,0x54,0x78,0x00 }, // ASCII - 97 61 'a'
{ 0x7f,0x48,0x44,0x44,0x38,0x00 }, // ASCII - 98 62 'b'
{ 0x38,0x44,0x44,0x44,0x20,0x00 }, // ASCII - 99 63 'c'
{ 0x38,0x44,0x44,0x48,0x7f,0x00 }, // ASCII - 100 64 'd'
{ 0x38,0x54,0x54,0x54,0x18,0x00 }, // ASCII - 101 65 'e'
{ 0x08,0x7e,0x09,0x01,0x02,0x00 }, // ASCII - 102 66 'f'
{ 0x0c,0x52,0x52,0x52,0x3e,0x00 }, // ASCII - 103 67 'g'
{ 0x7f,0x08,0x04,0x04,0x78,0x00 }, // ASCII - 104 68 'h'
{ 0x00,0x44,0x7d,0x40,0x00,0x00 }, // ASCII - 105 69 'i'
{ 0x20,0x40,0x44,0x3d,0x00,0x00 }, // ASCII - 106 6a 'j'
{ 0x7f,0x10,0x28,0x44,0x00,0x00 }, // ASCII - 107 6b 'k'
{ 0x00,0x41,0x7f,0x40,0x00,0x00 }, // ASCII - 108 6c 'l'
{ 0x7c,0x04,0x18,0x04,0x78,0x00 }, // ASCII - 109 6d 'm'
{ 0x7c,0x08,0x04,0x04,0x78,0x00 }, // ASCII - 110 6e 'n'
{ 0x38,0x44,0x44,0x44,0x38,0x00 }, // ASCII - 111 6f 'o'
{ 0x7c,0x14,0x14,0x14,0x08,0x00 }, // ASCII - 112 70 'p'
{ 0x08,0x14,0x14,0x18,0x7c,0x00 }, // ASCII - 113 71 'q'
{ 0x7c,0x08,0x04,0x04,0x08,0x00 }, // ASCII - 114 72 'r'
{ 0x48,0x54,0x54,0x54,0x20,0x00 }, // ASCII - 115 73 's'
{ 0x04,0x3f,0x44,0x40,0x20,0x00 }, // ASCII - 116 74 't'
{ 0x3c,0x40,0x40,0x20,0x7c,0x00 }, // ASCII - 117 75 'u'
{ 0x1c,0x20,0x40,0x20,0x1c,0x00 }, // ASCII - 118 76 'v'
{ 0x3c,0x40,0x38,0x40,0x3c,0x00 }, // ASCII - 119 77 'w'
{ 0x44,0x28,0x10,0x28,0x44,0x00 }, // ASCII - 120 78 'x'
{ 0x0c,0x50,0x50,0x50,0x3c,0x00 }, // ASCII - 121 79 'y'
{ 0x44,0x64,0x54,0x4c,0x44,0x00 }, // ASCII - 122 7a 'z'
{ 0x00,0x08,0x36,0x41,0x00,0x00 }, // ASCII - 123 7b '{'
{ 0x00,0x00,0x7f,0x00,0x00,0x00 }, // ASCII - 124 7c '|'
{ 0x00,0x41,0x36,0x08,0x00,0x00 }, // ASCII - 125 7d '}'
{ 0x08,0x08,0x2a,0x1c,0x08,0x00 }, // ASCII - 126 7e ->
{ 0x08,0x1c,0x2a,0x08,0x08,0x00 }, // ASCII - 127 7f <-
};
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/font8x6.h
0,0 → 1,29
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - font provided by Claas Anders "CaScAdE" Rathje *
* - umlauts and special characters by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#ifndef _FONT8X6_H
#define _FONT8X6_H
 
#include <avr/pgmspace.h>
 
extern prog_uint8_t font8x6[128][6];
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/gps.c
0,0 → 1,364
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
 
#include "main.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
 
#define TIMEOUT 200 // 2 sec
 
uint8_t ck_a = 0;
uint8_t ck_b = 0;
uint8_t UBX_class = 0;
uint8_t UBX_id = 0;
uint8_t UBX_buffer[250];
uint8_t UBX_payload_counter = 0;
 
void checksum(uint8_t);
void UBX_process(void);
uint32_t join_4_bytes(uint8_t*);
 
uint8_t display_mode = 0;
 
 
//--------------------------------------------------------------
void gps(void)
{
lcd_cls();
display_mode = 2;
 
if (hardware == FC)
{
lcd_printp_at(0, 3, PSTR("Nur mit NC !"), 0);
timer = 100;
while (timer > 0);
return;
}
 
 
if(current_hardware != NC)
SwitchToNC();
 
SwitchToGPS();
 
uint8_t mode = 0;
 
// SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
timer = TIMEOUT;
uint8_t data = 0;
uint8_t length = 0;
uint8_t UBX_ck_a = 0;
do
{
// if (rxFlag == 1)
if (uart_getc_nb(&data))
{
//rxFlag = 0;
//data = rx_byte;
timer = TIMEOUT;
 
switch(mode)
{
case 0: // init 1
if(data == 0xB5)
{
UBX_payload_counter = 0;
UBX_id = 0;
UBX_class = 0;
ck_a = 0;
ck_b = 0;
mode++;
}
break;
 
case 1: // init 2
if(data == 0x62)
mode++;
else
mode = 0;
break;
 
case 2: //class
if(data != 1)
mode = 0;
else
{
checksum(data);
UBX_class = data;
mode++;
}
break;
 
case 3: // id
if((data != 48)&&(data != 6)&&(data != 18)&&(data != 2))
mode = 0;
else
{
UBX_id = data;
checksum(data);
mode++;
}
break;
 
case 4: // length lo
if(data > 250)
mode = 0;
else
{
checksum(data);
length = data;
mode++;
}
break;
 
case 5: // length hi
if(data != 0)
mode = 0;
else
{
checksum(data);
mode++;
}
break;
 
case 6: // length hi
length--;
UBX_buffer[UBX_payload_counter] = data;
checksum(data);
UBX_payload_counter++;
if(length==0)
{
mode++;
};
break;
 
case 7: // check lo
mode++;
UBX_ck_a = data;
break;
 
case 8: // check hi
mode=0;
if((UBX_ck_a == ck_a) && (data == ck_b))
UBX_process();
 
}
 
 
// write_ndigit_number_u (14, 0, data, 3, 0);
}
 
}
while (!get_key_press (1 << KEY_ESC) && timer);
get_key_press(KEY_ALL);
 
SwitchToNC();
 
 
}
 
 
//--------------------------------------------------------------
void UBX_process()
{
 
if ((get_key_press (1 << KEY_MINUS))||(display_mode == 2))
{
if (display_mode != 1)
{
lcd_cls();
lcd_printp_at (0,0, PSTR("Fix Type : "), 0);
lcd_printp_at (0,1, PSTR("Sat : "), 0);
lcd_printp_at (0,2, PSTR("Accuracy : "), 0);
lcd_printp_at (0,3, PSTR("PDOP : "), 0);
lcd_printp_at (0,4, PSTR("Speed : "), 0);
lcd_printp_at (0,5, PSTR("Long : "), 0);
lcd_printp_at (0,6, PSTR("Lat : "), 0);
lcd_printp_at (0,7, PSTR("Alt : "), 0);
}
display_mode = 1;
}
 
if((UBX_class == 1) && (UBX_id == 48)&&(display_mode == 0))
{
uint8_t channels = UBX_buffer[4];
 
uint8_t i = 0;
for(i = 0; i < channels; i++)
{
if (i > 15)
break;
 
uint8_t line;
uint8_t col;
 
if (i > 7)
{
line = i-7;
col = 11;
}
else
col = 0; line = i;
 
write_ndigit_number_u (col, line, UBX_buffer[9 + 12*i], 3, 0);
write_ndigit_number_u (col+4, line, UBX_buffer[12 + 12*i], 2, 0);
 
if((UBX_buffer[10 + 12*i] & 3) == 3)
lcd_printp_at (col+7,line, PSTR("O"), 0);
else if((UBX_buffer[10 + 12*i] & 1) == 1)
lcd_printp_at (col+7,line, PSTR("X"), 0);
else if(UBX_buffer[11 + 12*i] > 4)
lcd_printp_at (col+7,line, PSTR("x"), 0);
else if(UBX_buffer[11 + 12*i] > 1)
lcd_printp_at (col+7,line, PSTR("-"), 0);
else
lcd_printp_at (col+7,line, PSTR(" "), 0);
 
}
}
 
if(display_mode == 1)
{
if((UBX_class == 1) && (UBX_id == 6)) //SVINFO
{
switch (UBX_buffer[10])
{
case 4:
 
case 3:
lcd_printp_at (11,0, PSTR("3D"), 0);
break;
 
case 2:
lcd_printp_at (11,0, PSTR("2D"), 0);
break;
 
default:
lcd_printp_at (11,0, PSTR("no"), 0);
}
 
if((UBX_buffer[11] & 3) == 3)
lcd_printp_at (17,0, PSTR("D"), 0);
else
lcd_printp_at (17,0, PSTR(" "), 0);
 
if((UBX_buffer[11] & 1) == 1)
lcd_printp_at (14,0, PSTR("ok"), 0);
else
lcd_printp_at (14,0, PSTR(" "), 0);
 
lcd_write_number_u_at (11, 1, UBX_buffer[47]);
 
uint16_t acc = (uint16_t)join_4_bytes(&UBX_buffer[24]);
write_ndigit_number_u (11, 2, acc, 5, 0);
lcd_printp_at (17,2, PSTR("cm"), 0);
 
uint16_t pdop = UBX_buffer[44]+UBX_buffer[45]*255;
write_ndigit_number_u (11, 3, pdop/100, 2, 0);
lcd_printp_at (13,3, PSTR("."), 0);
write_ndigit_number_u (14, 3, (pdop % 100),2, 1);
}
 
if((UBX_class == 1) && (UBX_id == 18)) //VELNED
{
uint16_t speed = (uint16_t)((join_4_bytes(&UBX_buffer[20])*60*60)/100000);
write_ndigit_number_u (11, 4, speed, 3, 0);
lcd_printp_at (15,4, PSTR("km/h"), 0);
 
}
 
if((UBX_class == 1) && (UBX_id == 2)) //POSLLH
{
uint32_t lon = join_4_bytes(&UBX_buffer[4]);
write_ndigit_number_u (10, 5, (uint16_t)(lon/10000000), 2, 0);
lcd_printp_at (12,5, PSTR("."), 0);
write_ndigit_number_u (13, 5, (uint16_t)((lon/1000) % 10000), 4, 1);
write_ndigit_number_u (17, 5, (uint16_t)((lon/10) % 100), 2, 1);
 
uint32_t lat = join_4_bytes(&UBX_buffer[8]);
write_ndigit_number_u (10, 6, (uint16_t)(lat/10000000), 2, 0);
lcd_printp_at (12,6, PSTR("."), 0);
write_ndigit_number_u (13, 6, (uint16_t)((lat/1000) % 10000), 4, 1);
write_ndigit_number_u (17, 6, (uint16_t)((lat/10) % 100), 2, 1);
 
uint16_t height = (uint16_t)(join_4_bytes(&UBX_buffer[16])/1000);
write_ndigit_number_u (11, 7, height, 4, 0);
lcd_printp_at (16,7, PSTR("m"), 0);
 
}
}
}
 
 
//--------------------------------------------------------------
union long_union
{
uint32_t dword;
uint8_t byte[4];
} longUnion;
 
 
//--------------------------------------------------------------
union int_union
{
uint16_t dword;
uint8_t byte[2];
} intUnion;
 
 
//--------------------------------------------------------------
uint32_t join_4_bytes(uint8_t Buffer[])
{
longUnion.byte[0] = *Buffer;
longUnion.byte[1] = *(Buffer+1);
longUnion.byte[2] = *(Buffer+2);
longUnion.byte[3] = *(Buffer+3);
return (longUnion.dword);
}
 
 
//--------------------------------------------------------------
void checksum(uint8_t data)
{
ck_a += data;
ck_b += ck_a;
}
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/gps.h
0,0 → 1,40
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _GPS_H
#define _GPS_H
 
void gps (void);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/joop_parameter_names.h
0,0 → 1,264
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#define PAGES 14
#define PARAM_COUNT 144
#define PARAM_LENGTH 15
#define PARAM_NUM_LANG 4
 
// German Englisch Französisch Holländisch
 
prog_char param_pages[PAGES][PARAM_NUM_LANG][PARAM_LENGTH]= // zeilen,zeichen+1
{
{"Kanäle ","Channel ","Canaux ","Kanaal "},
{"Konfiguration ","main ","Config ","Configuratie "},
{"Stick ","stick ","Manche ","Stick "},
{"Looping ","Looping ","Looping ","Looping "},
{"Höhe ","Altitude ","Altitude ","Hoogte "},
{"Kamera ","Camera ","Camera ","Camera "},
{"NaviCtrl ","NaviCtrl ","NaviCtrl ","NaviCtrl "},
{"Ausgänge ","Outputs ","Sorties ","Uitgangen "},
{"Verschiedenes ","Divers ","Divers ","Diversen "},
{"Gyro ","Gyro ","Gyro ","Gyro "},
{"Benutzer ","User ","Parametres ","Gebruiker "},
{"Achskopplung ","Coupl Axes ","Coupl Axes ","Koppeling Ass."},
{"Mixer-Setup ","Config Mix ","Config Mix ","Config. Mixer "},
{"Easy Setup ","Config Easy","Config Easy","Config. easy "},
};
 
 
//Namen
prog_char param_names[PARAM_COUNT][PARAM_NUM_LANG][PARAM_LENGTH]=
{
// group 0 (kanaele) 1-15
 
{"Gas ","Throttle ","Gaz ","Gas "},
{"Gier ","Gier ","Lacet ","Gier "},
{"Nick ","Nick ","Tangage ","Nick "},
{"Roll ","Roll ","Roulis ","Roll "},
{"Poti 1 ","Poti 1 ","Poti 1 ","Poti 1 "},
{"Poti 2 ","Poti 2 ","Poti 2 ","Poti 2 "},
{"Poti 3 ","Poti 3 ","Poti 3 ","Poti 3 "},
{"Poti 4 ","Poti 4 ","Poti 4 ","Poti 4 "},
{"Poti 5 ","Poti 5 ","Poti 5 ","Poti 5 "},
{"Poti 6 ","Poti 6 ","Poti 6 ","Poti 6 "},
{"Poti 7 ","Poti 7 ","Poti 7 ","Poti 7 "},
{"Poti 8 ","Poti 8 ","Poti 8 ","Poti 8 "},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Erw. Sig. Pr. ","Enh. Sig.Check","Recep Renforce","Uitg.Sig.Check"},
{"Empfänger Typ ","Receiver Type ","Type Recepteur","Ontvang. Type "},
 
 
// group 1 (main) 16-23
 
{"Höhenregeler ","Ctrl Altitude ","Ctrl Altitude ","Ctrl Hoogte "},
{"GPS ","GPS ","GPS ","GPS "},
{"Kompass ","Compass ","Compas ","Kompas "},
{"KompFest Ausr.","CompOrient.Fix","Maintien Cap ","Kompas vast "},
{"Erw. Sig. Pr. ","Sens.RcvSigVal","Ctrl Ren Recep","ExtRec Signaal"},
{"Achs(e.)koppl.","Axis Couping ","Decouplage Axe","As koppeling },
{"Drehratenbegr.","RotRate limit.","Limit Vit. Rot","RotRate limit."},
{"Heading Hold ","Nick/Roll ","Orient. Fixe ","Koers vast "},
 
 
// group 2 (stick) 24-27
 
{"Nick/Roll P ","Nick/Roll P ","Roul/Tang P ","Nick/Roll P "},
{"Nick/Roll D ","Nick/Roll D ","Roul/Tang D ","Nick/Roll D "},
{"Gier P ","Gier P ","Lacet P ","Gier P "},
{"Externe Kontr.","Extern Ctrl ","Ctrl Externe ","Extern Control"},
 
 
// group3 : (looping) 28-36
 
{"Looping oben ","Looping up ","Looping Avant ","Looping omhoog"},
{"Looping unten ","Looping down ","Looping Arrier","Looping bened."},
{"Looping links ","Looping left ","Looping Gauche","Looping links "},
{"Looping rechts","Looping right ","Looping Droite","Looping rechts"},
{"Gas Limit ","Throttle Limit","Limite Gaz ","Gas Limiet "},
{"Ansprechschw. ","Seuil Reponse ","Seuil Reponse ","Drempelwaarde "},
{"Hysterese ","Hysteresis ","Hysteresis ","Hysterese "},
{"Umkehrp. Nick ","Nick Invers ","Invers Roulis ","Nick geinvert."},
{"Umkehrp. Roll ","Roll Invers ","Invers Tangage","Roll geinvert."},
 
 
// group 4 (hoehe) 37-50
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Control"},
{"J:HBeg,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario"},
{"Schalter f. H.","Switch f. High","Swith Hauteur ","Schak. Hoogte "},
{"akust. Vario ","acoustic Vario","Vario Acoustic","Akoest. Vario "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenste hoogt"},
{"Min. Gas ","min. throttle ","Gaz Min ","Minimaal gas "},
{"Höhe P ","Altitude P ","Altitude P ","Hoogte P "},
{"Luftdruck D ","Barometric D ","Pression D ","Barometr. D "},
{"Z-ACC ","ACC Z ","ACC Z ","ACC Z "},
{"Max. Höhe ","Max. High ","Max. High ","Max. hoogte "},
{"Verstärkung/R ","gain/rate ","Gain/Frequence","Verst./rate "},
{"Schwebegas +/-","hoover varia. ","Var Vol Stat ","hoover varia. "},
{"GPS Z ","GPS Z ","GPS Z ","GPS Z "},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","stick neutr. P"},
 
 
// group 5 : (kamera) 51-66
 
{"Nick S. Anst. ","nick serv ctrl","Asserv Tangage","nick serv ctrl"},
{"Nick Kompens. ","nick compens. ","Comp Tangage ","nick compens. "},
{"Nick Umkehren ","nick inv. dir.","Inverser Roul ","nick inv.rich."},
{"Nick Servo min","nick servo min","Servo Min ","nick servo min"},
{"Nick Servo max","nick servo max","Servo Max ","nick servo max"},
{"Roll S. Anst. ","roll serv ctrl","Asserv Roulis ","roll serv ctrl"},
{"Roll Kompens. ","roll compens. ","Comp Tangage ","roll compens. "},
{"Roll Umkehren ","roll inv. dir.","Inverser Tang ","roll omkeren "},
{"Roll Servo min","roll servo min","Servo Min ","roll servo min"},
{"Roll Servo max","roll servo max","Servo Max ","roll servo max"},
{"Anst. Geschw. ","servo refresh ","Taux Refresh ","Servo refresh "},
{"Manuelle Gesch","manuell Speed ","Vitesse Man. ","Snelh.handbed."},
{"Cam Richtung ","Cam Orient ","Cam Orient ","Camera richt. "},
{"Servo 3 ","Servo 3 ","Servo 3 ","Servo 3 "},
{"Servo 4 ","Servo 4 ","Servo 4 ","Servo 4 "},
{"Servo 5 ","Servo 5 ","Servo 5 ","Servo 5 "},
 
 
// group 6 : (navictrl) 67-85
 
{"GPS ","enable GPS ","Activer GPS ","enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def Mode GPS ","GPS mode contr"},
{"GPS Verstärk. ","GPS Gain ","Gain GPS ","GPS versterk. "},
{"GPS St. Schw. ","GPS stick thre","Seuil Manche ","GPS st. dremp."},
{"Min. Sat. ","Min. Sat. ","Nbre Min. Sat.","Min. Sat. "},
{"GPS-P ","GPS-P ","GPS-P ","GPS-P "},
{"GPS-I ","GPS-I ","GPS-I ","GPS-I "},
{"GPS-D ","GPS-D ","GPS-D ","GPS-D "},
{"P Limit ","Limit P ","Limite P ","Limiet P "},
{"I Limit ","Limit I ","Limite I ","Limiet I "},
{"D Limit ","Limit D ","Limite D ","Limiet D "},
{"GPS Acc ","GPS Acc ","Accel GPS ","GPS Acc "},
{"GPS Windkorr. ","GPS Wind Corr.","Correct Vent ","GPS Wind Corr."},
{"Bremswirkung ","Speed compens.","Compens Vit ","Remwerking "},
{"GPS max. Rad. ","GPS max.radius","Rayon GPS Max ","GPS max.radius"},
{"GPS Winkel Li.","GPS angl.limit","Limit Angl GPS","GPS hoek lim. "},
{"PH Login time ","PH login time ","Tps Memoris ","PH login tijd "},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamische PH "},
{"CH Höhe ","CH High ","CH High ","CH Hoogte "},
 
 
// group 7 : (ausgaenge) 86-95
 
{"LED1 Bitmaske ","Out1 Bitmask ","Bitmask S1 ","Uitg1 Bitpatr."},
{" Timing ","Out1 Timing ","Horloge S1 ","Uitg1 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"LED2 Bitmaske ","Out2 Bitmask ","Bitmask S2 ","Uitg2 Bitpatr."},
{" Timing ","Out2 Timing ","Horloge S2 ","Uitg2 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"LED1 Vmin.Warn","Out1 undervolt","Al Undervoltag","Uitg1 ondersp."},
{"LED2 Vmin.Warn","Out2 undervolt","Al Undervoltag","Uitg2 ondersp."},
 
 
// group 8 : (verschiedenes) 96-107
 
{"Min. Gas ","min. throttle ","Gaz Min. ","minimaal gas "},
{"Max. Gas ","max. throttle ","Gaz Max. ","maximaal gas "},
{"Kompasswirkung","compass effect","Effet compas ","Kompas effect "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Unterspannung ","undervoltage ","Sous Tension ","Onderspanning "},
{"Volt Referenz ","Volt Referenz ","Tension Ref ","Ref. spanning "},
{"Not Gas Zeit ","Emerg.Thr.Time","Duree secours ","Nood gas tijd "},
{"Not Gas ","Emerg.Throttle","Gaz de secours","Nood gas "},
{"Fails. CH Time","Fails. CH Time","Fails. CH Time","Fails. CH Tijd"},
{"Compass Error ","Compass Error ","Compass Error ","Kompas Error "},
{"k.Summer o Sen","Compass Error ","Son Abs Emett ","Kompas Error "},
 
 
// group 9 : (gyro) 108-120
 
{"Gyro P ","Gyro P ","Gyro P ","Gyro P "},
{"Gyro I ","Gyro I ","Gyro I ","Gyro I "},
{"Gyro D ","Gyro D ","Gyro D ","Gyro D "},
{"Gier P ","Lacet P ","Lacet P ","Gier P "},
{"Gier I ","Lacet I ","Lacet I ","Gier I "},
{"Dynamische St.","dynamic stabi.","Stab Dynamique","Dynamis. stab."},
{"Drehratenbeg. ","RotRate limit.","Limit Dit Rota","Toerental lim."},
{"ACC/Gyro Fak. ","ACC/Gyro Fact ","ACC/Gyro Fact ","ACC/Gyro Fact "},
{"ACC/Gyro Komp.","Comp ACC/Gyro ","Comp ACC/Gyro ","Comp ACC/Gyro "},
{"Hauptregler I ","Main I ","Regul Princ I ","Hoofdregel. I "},
{"Drifkompensat.","drift Compens.","Compens Deriv ","Drift compens."},
{"Gyro stab. ","Gyro stability","Gyro Stability","Gyro stabilit."},
{"Motor smooth ","Motor smooth ","Motor Smooth ","Motor smooth "},
 
 
// group 10: (benutzer) 121-128
 
{"Parameter 1 ","Parameter 1 ","Parameter 1 ","Parameter 1 "},
{"Parameter 2 ","Parameter 2 ","Parameter 2 ","Parameter 2 "},
{"Parameter 3 ","Parameter 3 ","Parameter 3 ","Parameter 3 "},
{"Parameter 4 ","Parameter 4 ","Parameter 4 ","Parameter 4 "},
{"Parameter 5 ","Parameter 5 ","Parameter 5 ","Parameter 5 "},
{"Parameter 6 ","Parameter 6 ","Parameter 6 ","Parameter 6 "},
{"Parameter 7 ","Parameter 7 ","Parameter 7 ","Parameter 7 "},
{"Parameter 8 ","Parameter 8 ","Parameter 8 ","Parameter 8 "},
 
 
// group 11: (achskopplung) 129-132
 
{"Achs(e.)koppl.","(De)Coupl Axes","(De)Coupl Axes","As koppeling "},
{"Gier pos. Kopp","Retroac lacet ","Retroac Lacet ","Gier pos. kop."},
{"Nick/Roll Kopp","Retro roul/tan","Retro Roul/Tan","Nick/Roll kop."},
{"Gier Korrektur","Correct lacet ","Correct Lacet ","Gier correctie"},
 
 
// group 12: (mixer) 133
 
{"Orientierung ","Orientierung ","Orientation "},
 
 
// group 13 (easy) 134-144
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Contr. "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenst.hoogte"},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","Stick neutr. P"},
{"GPS ","enable GPS ","Activer GPS ","Enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def mode GPS ","GPS mode contr"},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamic PH "},
{"CH Höhe ","CH High ","CH High ","CH hoogte "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Orientierung ","Orientation ","Orientierung ","Orientatie "},
 
};
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/lcd.c
0,0 → 1,1370
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - original LCD control by Thomas "thkais" Kaiser *
* - special number formating routines taken from C-OSD *
* from Claas Anders "CaScAdE" Rathje *
* - some extension, ellipse and circ_line by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
#include "font8x6.h"
//#include "font8x8.h"
#include "eeprom.h"
#include "lcd.h"
#include "HAL_HW3_9.h"
 
 
#define DISP_W 128
#define DISP_H 64
 
#define DISP_BUFFER ((DISP_H * DISP_W) / 8)
#define LINE_BUFFER (((DISP_H/8) * DISP_W) / 8)
 
#define Jeti 0 // Jeti Routinen
 
volatile uint8_t display_buffer[DISP_BUFFER]; // Display-Puffer, weil nicht zurückgelesen werden kann
volatile uint8_t line_buffer[LINE_BUFFER]; // Zeilen-Puffer, weil nicht zurückgelesen werden kann
 
volatile uint16_t display_buffer_pointer; // Pointer auf das aktuell übertragene Byte
volatile uint8_t display_buffer_counter; // Hilfszähler zur Selektierung der Page
volatile uint8_t display_page_counter; // aktuelle Page-Nummer
volatile uint8_t display_mode; // Modus für State-Machine
volatile uint8_t LCD_ORIENTATION;
 
// DOG: 128 x 64 with 6x8 Font => 21 x 8
// MAX7456: 30 x 16
 
uint8_t lcd_xpos;
uint8_t lcd_ypos;
 
 
//-----------------------------------------------------------
void send_byte (uint8_t data)
{
clr_cs ();
SPDR = data;
while (!(SPSR & (1<<SPIF)));
//SPSR = SPSR;
set_cs ();
}
 
 
//-----------------------------------------------------------
// * Writes one command byte
// * cmd - the command byte
//
void lcd_command(uint8_t cmd)
{
// LCD_SELECT();
// LCD_CMD();
// spi_write(cmd);
// LCD_UNSELECT();
clr_cs ();
SPDR = cmd;
while (!(SPSR & (1<<SPIF)));
//SPSR = SPSR;
set_cs ();
}
 
 
//-----------------------------------------------------------
void lcd_cls (void)
{
uint16_t i, j;
 
// memset (display_buffer, 0, 1024);
for (i = 0; i < DISP_BUFFER; i++)
display_buffer[i] = 0x00;
for (i = 0; i < 8; i++)
{
clr_A0 ();
send_byte (0xB0 + i); //1011xxxx
send_byte (0x10); //00010000
// send_byte(0x04); //00000100 gedreht plus 4 Byte
// send_byte(0x00); //00000000
send_byte (LCD_ORIENTATION); //00000000
 
set_A0 ();
for (j = 0; j < 128; j++)
send_byte (0x00);
}
 
lcd_xpos = 0;
lcd_ypos = 0;
}
 
 
//-----------------------------------------------------------
void lcd_cls_line (uint8_t x, uint8_t y, uint8_t w)
{
uint8_t lcd_width;
uint8_t lcd_zpos;
uint8_t i;
uint8_t max = 21;
lcd_width = w;
lcd_xpos = x;
lcd_ypos = y;
 
if ((lcd_xpos + lcd_width) > max)
lcd_width = max - lcd_xpos;
 
lcd_zpos = lcd_xpos + lcd_width;
 
for (i = lcd_xpos; i < lcd_zpos; i++)
lcd_putc (i, lcd_ypos, 0x20, 0);
}
 
 
//-----------------------------------------------------------
void wait_1ms (void)
{
_delay_ms (1);
}
 
 
//-----------------------------------------------------------
void wait_ms (uint16_t time)
{
uint16_t i;
 
for (i = 0; i < time; i++)
wait_1ms ();
}
 
 
//-----------------------------------------------------------
void LCD_Init (uint8_t LCD_Mode) // LCD_Mode 0= Default Mode 1= EEPROM-Parameter)
{
lcd_xpos = 0;
lcd_ypos = 0;
 
// DDRB = 0xFF;
 
// SPI max. speed
// the DOGM128 lcd controller can work at 20 MHz
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << CPOL);
SPSR = (1 << SPI2X);
 
set_cs ();
clr_reset ();
wait_ms (10);
set_reset ();
 
clr_cs ();
clr_A0 ();
 
send_byte (0x40); //Display start line = 0
if (LCD_Mode == 1)
{
if (LCD_ORIENTATION == 0)
{
send_byte (0xA1); // A1 normal A0 reverse(original)
send_byte (0xC0); // C0 normal C8 reverse(original)
}
else
{
send_byte (0xA0); // A1 normal A0 reverse(original)
send_byte (0xC8); // C0 normal C8 reverse(original)
}
}
else
{
send_byte (0xA1); // A1 normal A0 reverse(original)
send_byte (0xC0); // C0 normal C8 reverse(original)
}
if (LCD_Mode == 1)
{
if (LCD_DisplayMode == 0)
send_byte (0xA6); //Display normal, not mirrored
else
send_byte (0xA7); //Display reverse, not mirrored
}
else
send_byte (0xA6);
 
 
send_byte (0xA2); //Set bias 1/9 (Duty 1/65)
send_byte (0x2F); //Booster, regulator and follower on
send_byte (0xF8); //Set internal booster to 4x
send_byte (0x00); //Set internal booster to 4x
send_byte (0x27); //resistor ratio set
 
if (LCD_Mode == 1)
{
send_byte (0x81); //Electronic volume register set
send_byte (LCD_Kontrast); //Electronic volume register set
}
else
{
send_byte (0x81);
send_byte (0x16);
}
 
send_byte (0xAC); //Cursor
send_byte (0x00); //No Cursor
send_byte (0xAF); //No indicator
 
if (LCD_Mode == 1)
{
// Helligkeit setzen
OCR2A = LCD_Helligkeit * 2.55;
}
else
{
OCR2A = 255;
}
 
lcd_cls ();
}
 
 
//-----------------------------------------------------------
void set_adress (uint16_t adress, uint8_t data)
{
uint8_t page;
uint8_t column;
 
page = adress >> 7;
 
clr_A0 ();
send_byte (0xB0 + page);
 
column = (adress & 0x7F) + LCD_ORIENTATION;
 
send_byte (0x10 + (column >> 4));
send_byte (column & 0x0F);
 
set_A0 ();
send_byte (data);
}
 
 
//-----------------------------------------------------------
void scroll (void)
{
uint16_t adress;
 
for (adress = 0; adress < 896; adress++)
{
display_buffer[adress] = display_buffer[adress + 128];
set_adress (adress, display_buffer[adress]);
}
 
for (adress = 896; adress < 1024; adress++)
{
display_buffer[adress] = 0;
set_adress (adress, 0);
}
}
 
 
//-----------------------------------------------------------
// sicher eine Zeile für die Statusanzeige
void copy_line (uint8_t y)
{
uint8_t i;
uint16_t adress;
 
adress = y * 128 + 0 * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6*21; i++)
{
line_buffer[i] = display_buffer[adress+i];
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
// holt gesicherte Zeile wieder zurück
void paste_line (uint8_t y)
{
uint8_t i;
uint16_t adress;
 
adress = y * 128 + 0 * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6*21; i++)
{
display_buffer[adress+i] =line_buffer[i];
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
void lcd_puts_at(uint8_t x, uint8_t y,const char *s, uint8_t mode )
{
while (*s)
{
lcd_putc(x, y, *s++, mode);
x++;
}
 
}/* lcd_puts */
 
 
//-----------------------------------------------------------
void lcd_putc (uint8_t x, uint8_t y, uint8_t c, uint8_t mode)
{
uint8_t ch;
uint8_t i;
uint16_t adress;
 
if (mode == 2)
lcd_frect ((x*6),(y*8),5,7,1); // invertierte Darstellung
 
switch (c)
{ // ISO 8859-1
 
case 0xc4: // Ä
c = 0x01;
break;
 
case 0xe4: // ä
c = 0x02;
break;
 
case 0xd6: // Ö
c = 0x03;
break;
 
case 0xf6: // ö
c = 0x04;
break;
 
case 0xdc: // Ü
c = 0x05;
break;
 
case 0xfc: // ü
c = 0x06;
break;
 
case 0xdf: // ß
//c = 0x07;
c = 0x1e; // ° (used by Jeti)
break;
}
 
c &= 0x7f;
 
adress = y * 128 + x * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6; i++)
{
ch = pgm_read_byte (&font8x6[0][0] + i + c * 6);
 
switch (mode)
{
 
case 0:
display_buffer[adress+i] = ch;
break;
 
case 1:
display_buffer[adress+i] |= ch;
break;
 
case 2:
display_buffer[adress+i] ^= ch;
break;
 
case 3:
display_buffer[adress+i] &= ch;
break;
 
case 4:
display_buffer[adress+i] &= ~ch;
break;
}
 
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
#if Jeti
//-----------------------------------------------------------
void lcd_putc_jeti (uint8_t x, uint8_t y, uint8_t c, uint8_t mode)
{
uint8_t ch;
uint8_t i;
uint16_t adress;
 
switch (c)
{
 
case 0x7e:
c = 0x1a; // ->
break;
 
case 0x7f:
c = 0x1b; // <-
break;
 
case 0xdf:
c = 0xf8; // °
break;
}
 
adress = y * 128 + x * 8;
adress &= 0x3FF;
 
for (i = 0; i < 8; i++)
{
ch = pgm_read_byte (&font8x8[0][0] + i + c * 8);
 
switch (mode)
{
 
case 0:
display_buffer[adress+i] = ch;
break;
 
case 1:
display_buffer[adress+i] |= ch;
break;
 
case 2:
display_buffer[adress+i] ^= ch;
break;
 
case 3:
display_buffer[adress+i] &= ch;
break;
 
case 4:
display_buffer[adress+i] &= ~ch;
break;
}
 
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
void lcd_printpj (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc_jeti (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 20)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpj_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printpj (text, mode);
}
#endif
 
 
//-----------------------------------------------------------
void new_line (void)
{
lcd_ypos++;
 
if (lcd_ypos > 7)
{
scroll ();
lcd_ypos = 7;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpns (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
// new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpns_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printpns (text, mode);
}
 
 
//-----------------------------------------------------------
void lcd_printp (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printp_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printp (text, mode);
}
 
 
//-----------------------------------------------------------
void lcd_print (uint8_t *text, uint8_t mode)
{
while (*text)
{
switch (*text)
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, *text, mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_print_at (uint8_t x, uint8_t y, uint8_t *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_print (text, mode);
}
 
 
//-----------------------------------------------------------
void print_display (uint8_t *text)
{
while (*text)
{
lcd_putc (lcd_xpos, lcd_ypos, *text, 0);
lcd_xpos++;
if (lcd_xpos >= 20)
{
lcd_xpos = 0;
new_line ();
}
text++;
}
}
 
 
//-----------------------------------------------------------
void print_display_at (uint8_t x, uint8_t y, uint8_t *text)
{
lcd_xpos = x;
lcd_ypos = y;
print_display (text);
}
 
 
//-----------------------------------------------------------
// + Plot (set one Pixel)
//-----------------------------------------------------------
// mode:
// 0=Clear, 1=Set, 2=XOR
void lcd_plot (uint8_t xpos, uint8_t ypos, uint8_t mode)
{
uint16_t adress;
uint8_t mask;
 
if ((xpos < DISP_W) && (ypos < DISP_H))
{
adress = (ypos / 8) * DISP_W + xpos; // adress = 0/8 * 128 + 0 = 0
mask = 1 << (ypos & 0x07); // mask = 1<<0 = 1
adress &= DISP_BUFFER - 1;
switch (mode)
{
 
case 0:
display_buffer[adress] &= ~mask;
break;
 
case 1:
display_buffer[adress] |= mask;
break;
 
case 2:
display_buffer[adress] ^= mask;
break;
}
set_adress (adress, display_buffer[adress]);
}
}
 
 
//-----------------------------------------------------------
// + Line (draws a line from x1,y1 to x2,y2
// + Based on Bresenham line-Algorithm
// + found in the internet, modified by thkais 2007
//-----------------------------------------------------------
 
void lcd_line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uint8_t mode)
{
int x, y, count, xs, ys, xm, ym;
 
x = (int) x1;
y = (int) y1;
xs = (int) x2 - (int) x1;
ys = (int) y2 - (int) y1;
if (xs < 0)
xm = -1;
else
if (xs > 0)
xm = 1;
else
xm = 0;
if (ys < 0)
ym = -1;
else
if (ys > 0)
ym = 1;
else
ym = 0;
if (xs < 0)
xs = -xs;
 
if (ys < 0)
ys = -ys;
 
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
 
if (xs > ys) // Flat Line <45 degrees
{
count = -(xs / 2);
while (x != x2)
{
count = count + ys;
x = x + xm;
if (count > 0)
{
y = y + ym;
count = count - xs;
}
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
}
}
else // Line >=45 degrees
{
count =- (ys / 2);
while (y != y2)
{
count = count + xs;
y = y + ym;
if (count > 0)
{
x = x + xm;
count = count - ys;
}
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
}
}
}
 
 
//-----------------------------------------------------------
// + Filled rectangle
// + x1, y1 = upper left corner
//-----------------------------------------------------------
 
void lcd_frect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode)
{
uint16_t x2, y2;
uint16_t i;
 
if (x1 >= DISP_W)
x1 = DISP_W - 1;
 
if (y1 >= DISP_H)
y1 = DISP_H - 1;
 
x2 = x1 + widthx;
y2 = y1 + widthy;
 
if (x2 > DISP_W)
x2 = DISP_W;
 
if (y2 > DISP_H)
y2 = DISP_H;
 
for (i = y1; i <= y2; i++)
{
lcd_line (x1, i, x2, i, mode);
}
}
 
 
//-----------------------------------------------------------
// + outline of rectangle
// + x1, y1 = upper left corner
//-----------------------------------------------------------
 
void lcd_rect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode)
{
uint16_t x2, y2;
 
if (x1 >= DISP_W)
x1 = DISP_W - 1;
if (y1 >= DISP_H)
y1 = DISP_H - 1;
x2 = x1 + widthx;
y2 = y1 + widthy;
 
if (x2 > DISP_W)
x2 = DISP_W;
 
if (y2 > DISP_H)
y2 = DISP_H;
 
lcd_line (x1, y1, x2, y1, mode);
lcd_line (x2, y1, x2, y2, mode);
lcd_line (x2, y2, x1, y2, mode);
lcd_line (x1, y2, x1, y1, mode);
}
 
 
//-----------------------------------------------------------
// + outline of a circle
// + Based on Bresenham-algorithm found in wikipedia
// + modified by thkais (2007)
//-----------------------------------------------------------
 
void lcd_circle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode)
{
int16_t f = 1 - radius;
int16_t ddF_x = 0;
int16_t ddF_y = -2 * radius;
int16_t x = 0;
int16_t y = radius;
 
lcd_plot (x0, y0 + radius, mode);
lcd_plot (x0, y0 - radius, mode);
lcd_plot (x0 + radius, y0, mode);
lcd_plot (x0 - radius, y0, mode);
 
while (x < y)
{
if (f >= 0)
{
y --;
ddF_y += 2;
f += ddF_y;
}
x ++;
ddF_x += 2;
f += ddF_x + 1;
 
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 - x, y0 + y, mode);
 
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 - y, mode);
 
lcd_plot (x0 + y, y0 + x, mode);
lcd_plot (x0 - y, y0 + x, mode);
 
lcd_plot (x0 + y, y0 - x, mode);
lcd_plot (x0 - y, y0 - x, mode);
}
}
 
 
//-----------------------------------------------------------
// + filled Circle
// + modified circle-algorithm thkais (2007)
//-----------------------------------------------------------
 
void lcd_fcircle (int16_t x0, int16_t y0, int16_t radius)
{
int16_t f = 1 - radius;
int16_t ddF_x = 0;
int16_t ddF_y = -2 * radius;
int16_t x = 0;
int16_t y = radius;
 
lcd_line (x0, y0 + radius, x0, y0 - radius, 1);
 
lcd_line (x0 + radius, y0, x0 - radius, y0, 1);
 
while (x < y)
{
if (f >= 0)
{
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x + 1;
 
lcd_line (x0 + x, y0 + y, x0 - x, y0 + y, 1);
lcd_line (x0 + x, y0 - y, x0 - x, y0 - y, 1);
lcd_line (x0 + y, y0 + x, x0 - y, y0 + x, 1);
lcd_line (x0 + y, y0 - x, x0 - y, y0 - x, 1);
}
}
 
 
//-----------------------------------------------------------
//
void lcd_circ_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode)
{
uint8_t xc, yc;
double deg_rad;
 
deg_rad = (deg * M_PI) / 180.0;
 
yc = y - (uint8_t) round (cos (deg_rad) * (double) r);
xc = x + (uint8_t) round (sin (deg_rad) * (double) r);
lcd_line (x, y, xc, yc, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ellipse_line (uint8_t x, uint8_t y, uint8_t rx, uint8_t ry, uint16_t deg, uint8_t mode)
{
uint8_t xc, yc;
double deg_rad;
 
deg_rad = (deg * M_PI) / 180.0;
 
yc = y - (uint8_t) round (cos (deg_rad) * (double) ry);
xc = x + (uint8_t) round (sin (deg_rad) * (double) rx);
lcd_line (x, y, xc, yc, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ellipse (int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint8_t mode)
{
const int16_t rx2 = rx * rx;
const int16_t ry2 = ry * ry;
int16_t F = round (ry2 - rx2 * ry + 0.25 * rx2);
int16_t ddF_x = 0;
int16_t ddF_y = 2 * rx2 * ry;
int16_t x = 0;
int16_t y = ry;
 
lcd_plot (x0, y0 + ry, mode);
lcd_plot (x0, y0 - ry, mode);
lcd_plot (x0 + rx, y0, mode);
lcd_plot (x0 - rx, y0, mode);
// while ( 2*ry2*x < 2*rx2*y ) { we can use ddF_x and ddF_y
while (ddF_x < ddF_y)
{
if(F >= 0)
{
y -= 1; // south
ddF_y -= 2 * rx2;
F -= ddF_y;
}
x += 1; // east
ddF_x += 2 * ry2;
F += ddF_x + ry2;
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 + y, mode);
lcd_plot (x0 - x, y0 - y, mode);
}
F = round (ry2 * (x + 0.5) * (x + 0.5) + rx2 * (y - 1) * (y - 1) - rx2 * ry2);
while(y > 0)
{
if(F <= 0)
{
x += 1; // east
ddF_x += 2 * ry2;
F += ddF_x;
}
y -= 1; // south
ddF_y -= 2 * rx2;
F += rx2 - ddF_y;
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 + y, mode);
lcd_plot (x0 - x, y0 - y, mode);
}
}
 
 
//-----------------------------------------------------------
//
void lcd_ecircle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode)
{
lcd_ellipse (x0, y0, radius + 3, radius, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ecirc_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode)
{
lcd_ellipse_line(x, y, r + 3, r, deg, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_view_font (uint8_t page)
{
int x;
int y;
 
lcd_cls ();
lcd_printp (PSTR(" 0123456789ABCDEF\r\n"), 0);
lcd_printpns_at (0, 7, PSTR(" \x1a \x1b Exit"), 0);
 
lcd_ypos = 2;
for (y = page * 4 ; y < (page * 4 + 4); y++)
{
if (y < 10)
{
lcd_putc (0, lcd_ypos, '0' + y, 0);
}
else
{
lcd_putc (0, lcd_ypos, 'A' + y - 10, 0);
}
lcd_xpos = 2;
for (x = 0; x < 16; x++)
{
lcd_putc (lcd_xpos, lcd_ypos, y * 16 + x, 0);
lcd_xpos++;
}
lcd_ypos++;
}
}
 
 
//-----------------------------------------------------------
uint8_t hdigit (uint8_t d)
{
if (d < 10)
{
return '0' + d;
}
else
{
return 'A' + d - 10;
}
}
 
 
//-----------------------------------------------------------
void lcd_print_hex_at (uint8_t x, uint8_t y, uint8_t h, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
 
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h >> 4), mode);
lcd_putc (lcd_xpos, lcd_ypos, hdigit (h & 0x0f), mode);
}
 
 
//-----------------------------------------------------------
void lcd_print_hex (uint8_t h, uint8_t mode)
{
// lcd_xpos = x;
// lcd_ypos = y;
 
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h >> 4), mode);
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h & 0x0f), mode);
lcd_putc (lcd_xpos++, lcd_ypos, ' ', mode);
}
 
 
//-----------------------------------------------------------
void lcd_write_number_u (uint8_t number)
{
uint8_t num = 100;
uint8_t started = 0;
 
while (num > 0)
{
uint8_t b = number / num;
if (b > 0 || started || num == 1)
{
lcd_putc (lcd_xpos++, lcd_ypos, '0' + b, 0);
started = 1;
}
number -= b * num;
 
num /= 10;
}
}
 
 
//-----------------------------------------------------------
void lcd_write_number_u_at (uint8_t x, uint8_t y, uint8_t number)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_write_number_u (number);
}
 
 
//-----------------------------------------------------------
// Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_u (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
utoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
lcd_print_at(x, y, (uint8_t*)s, 0);
}
 
//-----------------------------------------------------------
// Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_s (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
itoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
lcd_print_at(x, y, (uint8_t*)s, 0);
}
 
 
//-----------------------------------------------------------
// Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
// as /10th of the value
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_u_10th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
itoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
 
char rest = s[len - 1];
 
s[len - 1] = 0;
 
if (len == 1)
{
lcd_putc (x-1, y, '0', 0);
}
else if (len == 2 && s[0] == '-')
{
lcd_putc (x-1, y, '-', 0);
lcd_putc (x, y, '0', 0);
}
else
{
lcd_print_at(x, y, (uint8_t*)s, 0);
}
x += len - 1;
lcd_putc (x++, y, '.', 0);
lcd_putc (x++, y, rest, 0);
}
 
 
//-----------------------------------------------------------
void write_ndigit_number_u_100th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad)
{
uint8_t num = 100;
 
while (num > 0)
{
uint8_t b = number / num;
 
if ((num / 10) == 1)
{
lcd_putc (x++, y, '.', 0);
}
lcd_putc (x++, y, '0' + b, 0);
number -= b * num;
 
num /= 10;
}
}
 
 
//-----------------------------------------------------------
// Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
// as /10th of the value
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_s_10th (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad)
{
char s[7];
 
itoa (number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', 0);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
}
 
char rest = s[len - 1];
 
s[len - 1] = 0;
 
if (len == 1)
{
lcd_putc (x-1, y, '0', 0);
}
else if (len == 2 && s[0] == '-')
{
lcd_putc (x-1, y, '-', 0);
lcd_putc (x, y, '0', 0);
}
else
{
lcd_print_at(x, y, (uint8_t*)s, 0);
}
x += len - 1;
lcd_putc (x++, y, '.', 0);
lcd_putc (x++, y, rest, 0);
}
 
 
//-----------------------------------------------------------
// write <seconds> as human readable time at <x>/<y> to MAX7456 display mem
//
void write_time (uint8_t x, uint8_t y, uint16_t seconds)
{
uint16_t min = seconds / 60;
seconds -= min * 60;
write_ndigit_number_u (x, y, min, 2, 0);
lcd_putc (x + 2, y, ':', 0);
write_ndigit_number_u (x + 3, y, seconds, 2, 1);
}
 
 
//-----------------------------------------------------------
// wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
//
void write_gps_pos (uint8_t x, uint8_t y, int32_t position)
{
if (position < 0)
{
position ^= ~0;
position++;
lcd_putc (x++, y, '-', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
write_ndigit_number_u (x, y, (uint16_t) (position / (int32_t) 10000000), 3, 1);
lcd_putc (x + 3, y, '.', 0);
position = position - ((position / (int32_t) 10000000) * (int32_t) 10000000);
write_ndigit_number_u (x + 4, y, (uint16_t) (position / (int32_t) 1000), 4, 1);
position = position - ((uint16_t) (position / (int32_t) 1000) * (int32_t) 1000);
write_ndigit_number_u (x + 8, y, (uint16_t) position, 3, 1);
lcd_putc (x + 11, y, 0x1e, 0); // degree symbol
}
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/lcd.h
0,0 → 1,273
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - original LCD control by Thomas "thkais" Kaiser *
* - special number formating routines taken from C-OSD *
* from Claas Anders "CaScAdE" Rathje *
* - some extension, ellipse and circ_line by Peter "woggle" Mack *
* Thanks to Oliver Schwaneberg for adding several functions to this library!*
* *
* Author: Jan Michel (jan at mueschelsoft dot de) *
* License: GNU General Public License, version 3 *
* Version: v0.93 September 2010 *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#ifndef _LCD_H
#define _LCD_H
 
/*
 
//-----------------------------------------------------------------------------
// Command Codes
//-----------------------------------------------------------------------------
//1: Display on/off
#define LCD_DISPLAY_ON 0xAF //switch display on
#define LCD_DISPLAY_OFF 0xAE //switch display off
 
//2: display start line set (lower 6 bits select first line on lcd from 64 lines in memory)
#define LCD_START_LINE 0x40
 
//3: Page address set (lower 4 bits select one of 8 pages)
#define LCD_PAGE_ADDRESS 0xB0
 
//4: column address (lower 4 bits are upper / lower nibble of column address)
#define LCD_COL_ADDRESS_MSB 0x10
#define LCD_COL_ADDRESS_LSB 0x00 //second part of column address
 
//8: select orientation (black side of the display should be further away from viewer)
#define LCD_BOTTOMVIEW 0xA1 //6 o'clock view
#define LCD_TOPVIEW 0xA0 //12 o'clock view
 
//9: select normal (white background, black pixels) or reverse (black background, white pixels) mode
#define LCD_DISPLAY_POSITIVE 0xA6 //not inverted mode
#define LCD_DISPLAY_INVERTED 0xA7 //inverted display
 
//10: show memory content or switch all pixels on
#define LCD_SHOW_NORMAL 0xA4 //show dram content
#define LCD_SHOW_ALL_POINTS 0xA5 //show all points
 
//11: lcd bias set
#define LCD_BIAS_1_9 0xA2
#define LCD_BIAS_1_7 0xA3
 
//14: Reset Controller
#define LCD_RESET_CMD 0xE2
 
//15: output mode select (turns display upside-down)
#define LCD_SCAN_DIR_NORMAL 0xC0 //normal scan direction
#define LCD_SCAN_DIR_REVERSE 0xC8 //reversed scan direction
 
//16: power control set (lower 3 bits select operating mode)
//Bit 0: Voltage follower on/off - Bit 1: Voltage regulator on/off - Bit 2: Booster circuit on/off
#define LCD_POWER_CONTROL 0x28 //base command
#define LCD_POWER_LOW_POWER 0x2F
#define LCD_POWER_WIDE_RANGE 0x2F
#define LCD_POWER_LOW_VOLTAGE 0x2B
 
//17: voltage regulator resistor ratio set (lower 3 bits select ratio)
//selects lcd voltage - 000 is low (~ -2V), 111 is high (~ - 10V), also depending on volume mode. Datasheet suggests 011
#define LCD_VOLTAGE 0x20
 
//18: Volume mode set (2-byte command, lower 6 bits in second word select value, datasheet suggests 0x1F)
#define LCD_VOLUME_MODE_1 0x81
#define LCD_VOLUME_MODE_2 0x00
 
//#if DISPLAY_TYPE == 128 || DISPLAY_TYPE == 132
//19: static indicator (2-byte command), first on/off, then blinking mode
#define LCD_INDICATOR_ON 0xAD //static indicator on
#define LCD_INDICATOR_OFF 0xAC //static indicator off
#define LCD_INDICATOR_MODE_OFF 0x00
#define LCD_INDICATOR_MODE_1HZ 0x01
#define LCD_INDICATOR_MODE_2HZ 0x10
#define LCD_INDICATOR_MODE_ON 0x11
 
//20: booster ratio set (2-byte command)
#define LCD_BOOSTER_SET 0xF8 //set booster ratio
#define LCD_BOOSTER_234 0x00 //2x-4x
#define LCD_BOOSTER_5 0x01 //5x
#define LCD_BOOSTER_6 0x03 //6x
//#endif
 
//22: NOP command
#define LCD_NOP 0xE3
 
//#if DISPLAY_TYPE == 102
////25: advanced program control
//#define LCD_ADV_PROG_CTRL 0xFA
//#define LCD_ADV_PROG_CTRL2 0x10
//#endif
 
//-----------------------------------------------------------------------------
// Makros to execute commands
//-----------------------------------------------------------------------------
 
#define LCD_SWITCH_ON() lcd_command(LCD_DISPLAY_ON)
#define LCD_SWITCH_OFF() lcd_command(LCD_DISPLAY_OFF)
#define LCD_SET_FIRST_LINE(i) lcd_command(LCD_START_LINE | ((i) & 0x3F))
#define LCD_SET_PAGE_ADDR(i) lcd_command(LCD_PAGE_ADDRESS | ((i) & 0x0F))
#define LCD_SET_COLUMN_ADDR(i) lcd_command(LCD_COL_ADDRESS_MSB | ((i>>4) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_LSB | ((i) & 0x0F))
#define LCD_GOTO_ADDRESS(page,col); lcd_command(LCD_PAGE_ADDRESS | ((page) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_MSB | ((col>>4) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_LSB | ((col) & 0x0F));
 
#define LCD_SET_BOTTOM_VIEW() lcd_command(LCD_BOTTOMVIEW)
#define LCD_SET_TOP_VIEW() lcd_command(LCD_TOPVIEW)
#define LCD_SET_MODE_POSITIVE() lcd_command(LCD_DISPLAY_POSITIVE)
#define LCD_SET_MODE_INVERTED() lcd_command(LCD_DISPLAY_INVERTED)
#define LCD_SHOW_ALL_PIXELS_ON() lcd_command(LCD_SHOW_ALL_POINTS)
#define LCD_SHOW_ALL_PIXELS_OFF() lcd_command(LCD_SHOW_NORMAL)
#define LCD_SET_BIAS_RATIO_1_7() lcd_command(LCD_BIAS_1_7)
#define LCD_SET_BIAS_RATIO_1_9() lcd_command(LCD_BIAS_1_9)
#define LCD_SEND_RESET() lcd_command(LCD_RESET_CMD)
#define LCD_ORIENTATION_NORMAL() lcd_command(LCD_SCAN_DIR_NORMAL)
#define LCD_ORIENTATION_UPSIDEDOWN() lcd_command(LCD_SCAN_DIR_REVERSE)
#define LCD_SET_POWER_CONTROL(i) lcd_command(LCD_POWER_CONTROL | ((i) & 0x07))
#define LCD_SET_LOW_POWER() lcd_command(LCD_POWER_LOW_POWER)
#define LCD_SET_WIDE_RANGE() lcd_command(LCD_POWER_WIDE_RANGE)
#define LCD_SET_LOW_VOLTAGE() lcd_command(LCD_POWER_LOW_VOLTAGE)
#define LCD_SET_BIAS_VOLTAGE(i) lcd_command(LCD_VOLTAGE | ((i) & 0x07))
#define LCD_SET_VOLUME_MODE(i) lcd_command(LCD_VOLUME_MODE_1); \
lcd_command(LCD_VOLUME_MODE_2 | ((i) & 0x3F))
 
//#if DISPLAY_TYPE == 128 || DISPLAY_TYPE == 132
#define LCD_SET_INDICATOR_OFF() lcd_command(LCD_INDICATOR_OFF); \
lcd_command(LCD_INDICATOR_MODE_OFF)
#define LCD_SET_INDICATOR_STATIC() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_ON)
#define LCD_SET_INDICATOR_1HZ() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_1HZ)
#define LCD_SET_INDICATOR_2HZ() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_2HZ)
#define LCD_SET_INDICATOR(i,j) lcd_command(LCD_INDICATOR_OFF | ((i) & 1)); \
lcd_command(((j) & 2))
#define LCD_SLEEP_MODE lcd_command(LCD_INDICATOR_OFF); \
lcd_command(LCD_DISPLAY_OFF); \
lcd_command(LCD_SHOW_ALL_POINTS)
//#endif
 
//#if DISPLAY_TYPE == 102
//#define LCD_TEMPCOMP_HIGH 0x80
//#define LCD_COLWRAP 0x02
//#define LCD_PAGEWRAP 0x01
//#define LCD_SET_ADV_PROG_CTRL(i) lcd_command(LCD_ADV_PROG_CTRL);
// lcd_command(LCD_ADV_PROG_CTRL2 & i)
//#endif
 
*/
 
 
 
extern volatile uint8_t LCD_ORIENTATION;
 
//#define LCD_LINES 8
//#define LCD_COLS 21
 
extern uint8_t lcd_xpos;
extern uint8_t lcd_ypos;
 
void lcd_command(uint8_t cmd);
void send_byte (uint8_t data);
void LCD_Init (uint8_t LCD_Mode);
void lcd_puts_at(uint8_t x, uint8_t y,const char *s, uint8_t mode );
void lcd_putc (uint8_t x, uint8_t y, uint8_t c, uint8_t mode);
void send_byte (uint8_t data);
void lcd_print (uint8_t *text, uint8_t mode);
void lcd_print_at (uint8_t x, uint8_t y, uint8_t *text, uint8_t mode);
void lcd_printp (const char *text, uint8_t mode);
void lcd_printp_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
void lcd_printpns (const char *text, uint8_t mode);
void lcd_printpns_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
void lcd_cls (void);
void lcd_cls_line (uint8_t x, uint8_t y, uint8_t w);
 
void print_display (uint8_t *text);
void print_display_at (uint8_t x, uint8_t y, uint8_t *text);
void copy_line (uint8_t y);
void paste_line (uint8_t y);
 
// Jeti
void lcd_putc_jeti (uint8_t x, uint8_t y, uint8_t c, uint8_t mode);
void lcd_printpj (const char *text, uint8_t mode);
void lcd_printpj_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
 
void lcd_plot (uint8_t x, uint8_t y, uint8_t mode);
void lcd_line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uint8_t mode);
void lcd_rect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode);
void lcd_frect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode);
void lcd_circle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode);
void lcd_fcircle (int16_t x0, int16_t y0, int16_t radius);
void lcd_circ_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode);
 
void lcd_ellipse (int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint8_t mode);
void lcd_ellipse_line (uint8_t x, uint8_t y, uint8_t rx, uint8_t ry, uint16_t deg, uint8_t mode);
 
void lcd_ecircle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode);
void lcd_ecirc_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode);
 
void lcd_view_font (uint8_t page);
void lcd_print_hex_at (uint8_t x, uint8_t y, uint8_t h, uint8_t mode);
 
void lcd_write_number_u (uint8_t number);
void lcd_write_number_u_at (uint8_t x, uint8_t y, uint8_t number);
void lcd_print_hex (uint8_t h, uint8_t mode);
/**
* Write only some digits of a unsigned <number> at <x>/<y>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a signed <number> at <x>/<y>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a unsigned <number> at <x>/<y> as /10th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_u_10th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a unsigned <number> at <x>/<y> as /100th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_u_100th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a signed <number> at <x>/<y> as /10th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_s_10th (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad);
 
/**
* write <seconds> as human readable time at <x>/<y>
*/
void write_time (uint8_t x, uint8_t y, uint16_t seconds);
 
/**
* wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
*/
void write_gps_pos (uint8_t x, uint8_t y, int32_t position);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/lipo.c
0,0 → 1,149
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include "lipo.h"
#include "eeprom.h"
 
// Global variables
double accumulator = 0; //!< Accumulated 10-bit samples
double Vin = 0; //!< 16-bit float number result
short temp = 0; //!< Temporary variable
short samples = 0; //!< Number of conversions
uint16_t volt_avg = 0;
 
 
//! ADC interrupt routine
 
ISR (ADC_vect)
{
accumulator += ADCW;
samples++;
if(samples>4095)
{
oversampled();
}
}
 
 
 
//--------------------------------------------------------------
//
void ADC_Init (void)
{
ADMUX = (0<<REFS1) | (1<<REFS0); // externe 5V Referenzspannung nutzen
ADMUX = (ADMUX & ~(0x1F)) | (1 & 0x1F); // ADC1 verwenden
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Prescaler 128, Freilaufend, Interrupte frei
}
 
 
/*! Error compensation, Scaling 16-bit result, Rounding up
, Calculate 16-bit result, Resets variables
 
Quelle AVR121: Enhancing ADC resolution by versampling
 
*/
void oversampled(void)
{
cli();
accumulator += Lipo_UOffset; //5150 Offset error compensation
 
// accumulator *= 0.9993; // Gain error compensation
accumulator *= 0.9600; //0.9800 Gain error compensation
temp=(int)accumulator%64;
accumulator/=64; // Scaling the answer
if(temp>=32)
{
accumulator += 1; // Round up
}
 
// Vin = (accumulator/65536)*4.910; // Calculating 16-bit result
 
Vin =accumulator/7.5;
volt_avg = Vin;
// write_ndigit_number_u(0, 3, Vin, 5, 0);
// write_ndigit_number_u(0, 4, volt_avg, 5, 0);
samples = 0;
accumulator = 0;
 
sei();
}
 
 
void show_Lipo(void)
{
 
uint16_t Balken = 0;
 
 
lcd_rect(103,2,1,3,1);
if (volt_avg < 320)
{
Balken = 0;
lcd_frect(106 + Balken-1, 2, 19-Balken, 3, 0); // löschen
}
 
 
if (PKT_Accutyp == true) //LiPO Akku
{
lcd_rect(104, 0, 23, 7, 1); // Rahmen
if (volt_avg >= 420) Balken = 19;
if ((volt_avg > 320) && (volt_avg < 420)) Balken = (volt_avg-320)/5;
lcd_frect(106 + Balken+1, 2, 19-Balken, 3, 0); // löschen
}
 
if (PKT_Accutyp == false) // LiON Akku
{
lcd_rect(104, 0, 22, 7, 1); // Rahmen
if (volt_avg >= 410) Balken = 18;
if ((volt_avg > 320) && (volt_avg < 410)) Balken = ((volt_avg-320)/5);
lcd_frect(106 + Balken+1, 2, 18-Balken, 3, 0); // löschen
}
 
 
if (Balken > 0) lcd_frect(106, 2, Balken, 3, 1); // Füllung
 
}
 
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/lipo.h
0,0 → 1,50
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef _LIPO_H
#define _LIPO_H
 
 
short samples; //!< Number of conversions
double Vin;
double accumulator;
 
uint16_t volt_avg;
 
void ADC_Init (void);
void oversampled(void);
void show_Lipo(void);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/main.c
0,0 → 1,380
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
 
//************************************************************************************
// Watchdog integrieren und abschalten, wird für Bootloader benötigt
// !!muss hier stehen bleiben!!
 
//--------------------------------------------------------------
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
 
//--------------------------------------------------------------
void wdt_init(void)
{
MCUSR = 0;
wdt_disable();
return;
}
 
//************************************************************************************
// erst ab hier weitere #includes
 
 
#include "lipo.h"
#include "main.h"
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "mk-data-structs.h"
#include "parameter.h"
#include "menu.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
#include "messages.h"
 
//#define MTEST 0 // Menu Test (skip FC/NC detection)
 
Version_t *version;
 
volatile uint8_t mode = 0;
uint8_t hardware = 0;
uint8_t current_hardware = 0;
mk_param_struct_t *mk_param_struct;
 
 
//--------------------------------------------------------------
int main (void)
{
#ifndef DEBUG
uint8_t timeout;
uint8_t val =0;
uint8_t spalte =0;
#endif
 
InitHWPorts(); // Hardwareanhängige Ports konfigurieren
// dafür wird je nach Hardware die HAL_HWxxx verwendet
// Define dazu in der main.h
 
hardware = NO;
current_hardware = 0;
 
 
if (PKT_StartInfo == true)
{
lcd_cls ();
// lcd_printp_at (0,0,PSTR("Portables Kopter Tool"), 0);
lcd_puts_at(0, 0, strGet(START_MSG1), 0);
lcd_puts_at(0, 1, strGet(START_MSG2), 0);
// lcd_printp_at (0,1,PSTR("für FC Ver "), 0);
// lcd_printp_at (11,1,PSTR(FC_Version),0);
// lcd_printp_at (0,3,PSTR("GNU GPL License"), 0);
lcd_puts_at(0, 3, strGet(GNU_GPL), 0);
 
#ifdef HWVERSION1_2
// lcd_printp_at (0,4,PSTR("Hardware 1.2"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
lcd_puts_at(0, 4, strGet(HW12), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
#endif
 
#ifdef HWVERSION1_2W
// lcd_printp_at (0,4,PSTR("Hardware 1.2W"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
lcd_puts_at(0, 4, strGet(HW12W), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
#endif
 
#ifdef HWVERSION1_3
// lcd_printp_at (0,4,PSTR("Hardware 1.3"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
lcd_puts_at(0, 4, strGet(HW13), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
#endif
 
#ifdef HWVERSION1_3W
// lcd_printp_at (0,4,PSTR("Hardware 1.3W"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
lcd_puts_at(0, 4, strGet(HW13W), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
#endif
 
#ifdef HWVERSION3_9
// lcd_printp_at (0,4,PSTR("Hardware 3.9"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 1284P"), 0);
lcd_puts_at(0, 4, strGet(HW39), 0);
lcd_puts_at(0, 5, strGet(ATMEGA1284P), 0);
#endif
 
_delay_ms(1500);
}
 
#ifndef DEBUG
 
ReadLastPosition ();
 
if (LastLongitude>0x00000000 && LastLatitude>0x00000000)
{
lcd_cls ();
// lcd_printp_at (0, 4, PSTR(" Letzte Position "), 2);
// lcd_printp_at (0, 5, PSTR(" Breitengr Längengr "), 2);
// lcd_printp_at (0, 7, PSTR("löschen weiter"), 0);
lcd_puts_at(0, 0, strGet(START_LASTPOS), 2);
lcd_puts_at(0, 1, strGet(START_LASTPOS3), 2);
lcd_puts_at(0, 2, strGet(START_LASTPOS1), 2);
lcd_puts_at(0, 7, strGet(START_LASTPOS2), 0);
 
 
write_ndigit_number_u (1, 4, (uint16_t)(LastLatitude/10000000), 2, 0);
lcd_printp_at (3, 4, PSTR("."), 0);
write_ndigit_number_u (4, 4, (uint16_t)((LastLatitude/1000) % 10000), 4, 1);
write_ndigit_number_u (8, 4, (uint16_t)((LastLatitude/10) % 100), 2, 1);
 
 
write_ndigit_number_u (12, 4, (uint16_t)(LastLongitude/10000000), 2, 0);
lcd_printp_at (14, 4, PSTR("."), 0);
write_ndigit_number_u (15, 4, (uint16_t)((LastLongitude/1000) % 10000), 4, 1);
write_ndigit_number_u (19, 4, (uint16_t)((LastLongitude/10) % 100), 2, 1);
 
for (;;)
{
if (get_key_press (1 << KEY_MINUS))
{
WriteLastPosition(0x00000000,0x00000000); // Löschen
lcd_frect (0, (8*4), 128, 8, 0); // Zeile löschen (x, y, l, h, in Pixel)
lcd_frect (0, (8*5), 128, 8, 0);
// lcd_printp_at (0,5,PSTR(" gelöscht "), 0);
lcd_puts_at(0, 5, strGet(START_LASTPOSDEL), 0);
 
lcd_cls_line (0, 6, 21);
lcd_cls_line (0, 7, 21);
 
_delay_ms(1000);
break;
}
if (get_key_press (1 << KEY_ENTER))
{
lcd_cls_line (0, 4, 21);
lcd_cls_line (0, 5, 21);
lcd_cls_line (0, 6, 21);
lcd_cls_line (0, 7, 21);
break;
}
}
}
#endif
 
// switch to NC
USART_putc (0x1b);
USART_putc (0x1b);
USART_putc (0x55);
USART_putc (0xaa);
USART_putc (0x00);
 
mode = 'V';
 
#ifndef DEBUG
 
do
{
timeout = 50;
 
lcd_cls();
// lcd_printp_at (0,4,PSTR("Suche FC..."), 0);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(0, 4, strGet(START_SEARCHFC), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
while (!rxd_buffer_locked && timeout)
{
SendOutData('v', ADDRESS_ANY, 0);
 
timer = 20;
 
while (timer > 0);
timeout--;
 
if (spalte <= 20)
{
lcd_printp_at (spalte,6,PSTR("?"),0);
spalte++;
}
else
{
lcd_cls_line (0,6,21);
spalte=0;
}
 
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
for (;;)
{
Debug = 0;
hardware = NO;
main_menu ();
}
}
 
}
 
if(timeout == 0)
{
// lcd_printp_at (0,5,PSTR("FC nicht gefunden!"), 0);
lcd_puts_at(0, 5, strGet(START_FCNOTFOUND), 0);
timer = 90;
while (timer > 0);
}
}
while(timeout == 0);
 
if (timeout != 0)
Decode64 ();
 
version = (Version_t *) pRxData;
 
if (PKT_StartInfo == true)
{
lcd_cls ();
// lcd_printp (PSTR("PKT-Tool GNU GPL\r\n"), 0);
// lcd_printp (PSTR("gefunden:\r\n\n"), 0);
lcd_puts_at(0, 0, strGet(START_FCFOUND), 0);
lcd_puts_at(0, 1, strGet(START_FCFOUND1), 0);
 
}
 
if ((rxd_buffer[1] - 'a') == ADDRESS_FC)
{
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Flight-Ctrl\r\n"), 0);
lcd_puts_at(0, 1, strGet(START_FCFOUND2), 0);
}
hardware = FC;
current_hardware = hardware;
}
else if ((rxd_buffer[1] - 'a') == ADDRESS_NC)
{
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Navi-Ctrl\r\n"), 0);
lcd_puts_at(0, 1, strGet(START_FCFOUND3), 0);
}
hardware = NC;
current_hardware = hardware;
}
 
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Version: "), 0);
lcd_puts_at(0, 2, strGet(START_VERSIONCHECK), 0);
lcd_write_number_u (version->SWMajor);
lcd_printp (PSTR("."), 0);
lcd_write_number_u (version->SWMinor);
lcd_putc (lcd_xpos, lcd_ypos, version->SWPatch + 'a', 0);
_delay_ms(1500);
}
SwitchToFC();
#else
if (PKT_StartInfo == true)
{
lcd_cls ();
lcd_printp (PSTR("PKT-Test DEBUG\r\n"), 0);
_delay_ms(1500);
}
 
#endif
 
 
#ifndef DEBUG
 
// EEprom Version / Struktur prüfen
// val = load_setting(1); // Parameterset 1 holen
val = load_setting(0xff); // aktuelles Parameterset holen
if (mk_param_struct->Revision != EEProm_Version)
{
lcd_cls ();
 
 
lcd_printp_at (0, 0, PSTR("EEPromRev.:"), 0);
lcd_write_number_u (EEProm_Version);
 
lcd_puts_at(0, 1, strGet(START_VERSIONCHECK1), 0);
// lcd_printp (PSTR(" erwartet\r\n"), 0);
 
lcd_printp_at (0, 1, PSTR("EEPromRev.:"), 0);
lcd_write_number_u (mk_param_struct->Revision);
lcd_puts_at(0, 2, strGet(START_VERSIONCHECK2), 0);
 
// lcd_printp (PSTR(" gefunden\r\n"), 0);
 
// lcd_printp (PSTR("PKT-Tool nur mit\r\n"), 0);
// lcd_printp (PSTR("FC Software "), 0);
lcd_puts_at(0, 3, strGet(START_VERSIONCHECK3), 0);
lcd_puts_at(0, 4, strGet(START_VERSIONCHECK4), 0);
 
lcd_printp (PSTR(FC_Version),0);
 
// lcd_printp (PSTR("\r\nkompatibel"), 0);
lcd_puts_at(0, 5, strGet(START_VERSIONCHECK5), 0);
hardware = NO;
BeepTime = 1500;
BeepMuster = 0x0040;
_delay_ms(4000);
}
 
#endif
mode = 0;
rxd_buffer_locked = FALSE;
 
timer = 50;
while (timer > 0);
 
for (;;)
{
main_menu ();
}
}
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/main.h
0,0 → 1,121
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
/**
* @Author Cebra test test test test
*
* ${tags}
*/
//**
// *
// *
// *
//
/*
* File name: $HeadURL: http://mikrokopter.de/mikrosvn/Projects/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/main.h $
* Revision: $Revision: 1496 $
* Last modified: $Date: 2012-01-15 21:31:25 +0100 (So, 15 Jan 2012) $
* Last modified by: $Author: $
* $Id: main.h 1496 2012-01-15 20:31:25Z $
*/
#ifndef _MAIN_H
#define _MAIN_H
 
// Version der Software
#define PKTSWVersion "3.5.8c" // 1. SVN Version test
 
//#define DEBUG
 
 
// Fusebits für Hardware 1.2 D7 DC FC
// Fusebits für Hardware 1.3
// Fusebits für Hardware 3.x D7 DC FC
// avrdude -pm1284p -cavr109 -P/dev/ttyUSB1 -b115200 -V -Uflash:w:Dateiname.hex:a
 
 
// hier die entsprechende Hardwareversion der Leiterplatte einstellen
 
//#define HWVERSION1_2 // Hardware sebseb7
//#define HWVERSION1_2W // Hardware sebseb7 mit Wi232 Support
//#define HWVERSION1_3 // Hardware sebseb7
//#define HWVERSION1_3W // Hardware sebseb7 mit Wi232 Support
//#define HWVERSION3_1 // Test Hardware Cebra Juni 2011
#define HWVERSION3_9 // Hardware Cebra Oktober 2011 ATmega1284P
 
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
#include "HAL_HW1_2.h"
#endif
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
 
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
 
#define NO 0
#define NC 1
#define FC 2
#define MK3MAG 3
#define MKGPS 4
#define Wi232 5
 
#define ENABLE_PWM
 
 
 
// Menueleiste am unteren Rand definieren
//
// 11 <> Change
//
// 12 /\ Up 13 \/ Down 14 < Left 15 > Right
//
// 16 /|\ Arrow up 17 \|/ Arrow down 18 <- Arrow left 19 -> Arrow right
//
// 1A ^ Triangle up 1B v Triangle down 1C < Triangle left 1D > Triangle right
//
// "01 234567 8901234567890"
// "|O |||||O |||||O|||||O|"
//
//#define KEY_LINE_1 " \x1a \x1b Ende OK"
//#define KEY_LINE_2 " \x18 \x19 Ende OK"
//#define KEY_LINE_3 " \x18 \x19 Ende"
 
 
extern volatile uint8_t mode;
extern uint8_t hardware;
extern uint8_t current_hardware;
 
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/menu.c
0,0 → 1,639
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
 
#include "main.h"
#include "lcd.h"
#include "parameter.h"
 
#include "menu.h"
#include "messages.h"
#include "display.h"
#include "debug.h"
#include "timer.h"
#include "osd.h"
#include "motortest.h"
#include "gps.h"
#include "eeprom.h"
#include "setup.h"
#include "uart1.h"
#include "mk-data-structs.h"
#include "Wi232.h"
#include "servo.h"
#include "tools.h"
#include "connect.h"
#include "lipo.h"
#include "messages.h"
 
 
 
 
 
#define ITEMS_NC 7
 
prog_char param_menuitems_nc[ITEMS_NC][NUM_LANG][18]= // zeilen,zeichen+1
 
 
// German, English, French, Netherlands
{
{"OSD ","OSD ","OSD ","OSD "},
{"3D Lage ","3D angeles ","3D location ","3D locatie "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameters \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_FC 4
 
prog_char param_menuitems_fc[ITEMS_FC][NUM_LANG][18]= // zeilen,zeichen+1
{
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_NO 6
 
prog_char param_menuitems_no[ITEMS_NO][NUM_LANG][18]= // zeilen,zeichen+1
{
{"BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester "},
{"Servo Tester ","Servo Tester ","Servo Tester ","Servo Tester "},
{"PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter "},
{"PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter "},
{"PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d"},
{"PKT Version ","PKT Version ","PKT Version ","PKT Versie "},
};
 
 
#define ITEMS_CR 9
 
prog_char param_copyright[ITEMS_CR][22]= // zeilen,zeichen+1
{
" ",
"(C) GNU GPL License ",
" NO WARRANTY ",
" ",
"2008 Thomas Kaiser ",
"2009-2010 Peter Mack ",
"2010 Sebastian Boehm ",
"2011 Chr. Brandtner &",
" Harald Bongartz ",
};
 
 
//--------------------------------------------------------------
// print cursor
void menu_set_cursor (uint8_t before, uint8_t line, uint8_t pos)
{
lcd_printp_at (pos, before, PSTR(" "), 0);
lcd_printp_at (pos, line, PSTR("\x1d"), 0);
}
 
 
// F�r Seting-Auswahl ------------------------------------------
//
uint8_t menu_choose (uint8_t min, uint8_t max, uint8_t pos, uint8_t start)
{
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
line = max;
// line = min; // Wenn wiederholen soll
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
line = min;
// line = max; // Wenn wiederholen soll
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r Setup und Parameter ------------------------------------------
//
uint8_t menu_choose2 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r das Hauptmenue ------------------------------------------
//
uint8_t menu_choose3 (uint8_t min, uint8_t max,uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
menu_set_cursor (line, line, pos);
 
do
{
 
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (get_key_long (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 250;
}
 
if(get_key_long (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return 251;
}
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 252;
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
show_Lipo();
}
while (!(get_key_short (1 << KEY_ENTER)));
 
return line;
}
 
//--------------------------------------------------------------
//
void main_menu (void)
{
uint8_t ii = 0;
uint8_t offset = 0;
uint8_t size = 0;
uint8_t Save_hardware = 0;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val =0;
 
Save_hardware = hardware;
 
get_key_press(KEY_ALL);
 
while(1)
{
if (Debug==1)
hardware = NC;
if (Debug==0)
hardware = Save_hardware;
if(hardware == NO)
size = ITEMS_NO ;
if(hardware == NC)
size = ITEMS_NC ;
if(hardware == FC)
size = ITEMS_FC ;
 
lcd_cls ();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0, PSTR(FC_Version), 2);
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
 
 
while(2)
{
 
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
{
if(hardware == NC)
lcd_printp_at(3,ii+1,param_menuitems_nc[ii+offset][DisplayLanguage], 0);
else if(hardware == FC)
lcd_printp_at(3,ii+1,param_menuitems_fc[ii+offset][DisplayLanguage], 0);
else
lcd_printp_at(3,ii+1,param_menuitems_no[ii+offset][DisplayLanguage], 0);
}
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
show_Lipo();
}
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose3 (1, 5, target_pos,0,1); //menu_choose3 (min, max, start, return_at_start, return_at_end)
else
val = menu_choose3 (1, size, target_pos,0,0);
}
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose3 (2, 6, target_pos,1,0);
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(val == 254)
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
offset--;
dmode = 0;
target_pos = 2;
}
#if defined HWVERSION3_9
else if(val == 252)
{
 
lcd_cls();
// lcd_printp_at (0, 2, PSTR(" PKT ausschalten?"),0);
lcd_puts_at(0, 2, strGet(SHUTDOWN), 0);
// lcd_printp_at (12, 7, PSTR("Nein Ja"),0);
lcd_puts_at(12, 7, strGet(YESNO), 0);
while(1)
{
if (get_key_press (1 << KEY_ENTER))
clr_V_On(); // Spannung abschalten
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
lcd_cls();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0,PSTR(FC_Version), 2);
// show_Lipo();
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
break;
}
}
}
else if(val == 251)
{
PC_Fast_Connect();
return;
}
#endif
else if(val == 250)
{
// Test_HB();
Test_Language();
return;
}
else
break;
}
 
target_pos = val;
 
 
if(hardware == NC)
{
if((val+offset) == 1 )
osd(OSD_Mode);
if((val+offset) == 2 )
osd(THREE_D_Mode);
if((val+offset) == 3 )
display_data();
if((val+offset) == 4 )
edit_parameter();
if((val+offset) == 5 )
display_debug();
if((val+offset) == 6 )
gps();
if((val+offset) == 7 )
PKT_Tools();
 
}
 
 
if(hardware == FC)
{
if((val+offset) == 1 )
display_data();
if((val+offset) == 2 )
edit_parameter();
if((val+offset) == 3 )
display_debug();
if((val+offset) == 4 )
PKT_Tools();
 
}
 
 
if(hardware == NO)
{
if((val+offset) == 1 )
motor_test(FC_Mode);
if((val+offset) == 2 )
servo_test();
#ifdef HWVERSION3_9
if (U02SV2 == 0)
{
if((val+offset) == 3 )
Port_BT2Wi();
if((val+offset) == 4 )
Port_USB2Wi();
}
else if (U02SV2 == 1)
{
if((val+offset) == 3 )
Port_BT2FC();
if((val+offset) == 4 )
Port_USB2FC();
}
#else
if((val+offset) == 3 )
Show_Error_HW();
if((val+offset) == 4 )
Show_Error_HW();
#endif
if((val+offset) == 5 )
PKT_Setup();
if((val+offset) == 6 )
Show_Version();
 
}
 
 
}
}
 
 
//--------------------------------------------------------------
//
void Update_PKT (void)
{
lcd_cls();
lcd_printp_at (0, 0, PSTR(" PKT Update "),2);
// lcd_printp_at (0, 1, PSTR("Connect PC to PKT-USB"),0);
lcd_puts_at(0, 1, strGet(UPDATE1), 0);
// lcd_printp_at (0, 2, PSTR("Press 'Start' on PKT "),0);
lcd_puts_at(0, 2, strGet(UPDATE2), 0);
lcd_printp_at (0, 3, PSTR("Start avrdude.exe "),0);
lcd_printp_at (0, 4, PSTR("-pm1284p -cavr109 "),0);
lcd_printp_at (0, 5, PSTR("-Pcom? -b115200 "),0);
lcd_printp_at (0, 6, PSTR("-Uflash:w:FILE.hex:a "),0);
// avrdude -pm1284p -cavr109 -P/dev/ttyUSB1 -b115200 -V -Uflash:w:Dateiname.hex:a
 
// lcd_printp_at (0, 7, PSTR(" Ende Start"), 0);
lcd_puts_at(0, 7, strGet(ENDSTART), 0);
 
do
{
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
}
while (!(get_key_press (1 << KEY_ENTER)));
{
 
// start bootloader with Reset, Hold KEY_ENTER*/
wdt_enable( WDTO_250MS );
while (1)
{;}
}
}
 
 
//--------------------------------------------------------------
//
void Show_Error_HW (void)
{
lcd_cls ();
lcd_printp_at (0, 2, PSTR(" Mit dieser Hardware"), 0);
lcd_printp_at (0, 3, PSTR(" nicht möglich!"), 0);
lcd_printp_at (12, 7, PSTR("Ende"), 0);
 
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
 
 
//--------------------------------------------------------------
//
void Show_Version (void)
{
uint8_t ii = 0;
uint8_t size = ITEMS_CR;
uint8_t page = 0;
 
lcd_cls ();
 
lcd_printp_at (0, 0, PSTR("PKT Tool V. "), 2);
lcd_printp_at (13,0, PSTR(PKTSWVersion),2);
// lcdPuts(Msg(MSG_VERSION1));
// lcd_printp_at (0, 0, Msg(MSG_VERSION1), 2);
// lcd_printp_at (0, 1, PSTR("für FC ver "), 2);
// lcd_printp_at (12,1, PSTR(FC_Version),2);
lcd_puts_at(0, 1, strGet(START_MSG2), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
for(ii = 0;ii < 3 ; ii++)
if((ii + page) < size)
lcd_printp_at(0,ii + 3,param_copyright[ii + page], 0);
 
if (page == 0)
{
lcd_printp_at (0, 2, PSTR(" "), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page > 0 && page < (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page >= (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR(" "), 0);
}
 
 
if (get_key_press (1 << KEY_PLUS))
if (page < size - 3)
page++;
 
if (get_key_press (1 << KEY_MINUS))
if (page > 0)
page--;
 
if (get_key_press (1 << KEY_ESC) || get_key_press (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return;
}
}
}
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/menu.h
0,0 → 1,55
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef MENU_H
#define MENU_H
 
#define CURSOR_COL 1 // column where the menu cursor is displayed
#define MENU_LINE 1 // starting line of menu
#define MENU_COL 3 // column where the menu starts
#define OSD_Mode 1 // OSD Anzeige als OSD
#define THREE_D_Mode 3 // OSD Anzeige in 3D Position
 
void main_menu (void);
void Show_Version (void);
void Show_Error_HW (void);
void Update_PKT (void);
void PC_Fast_Connect (void);
 
 
uint8_t menu_choose (uint8_t min, uint8_t max, uint8_t pos, uint8_t start);
uint8_t menu_choose2 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end);
uint8_t menu_choose3 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/messages.c
0,0 → 1,1451
/****************************************************************************************
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Languagesupport: *
* http://www.netrino.com/Embedded-Systems/How-To/Firmware-Internationalization *
* Nigel Jones *
****************************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "lcd.h"
#include "timer.h"
#include "eeprom.h"
#include "messages.h"
 
 
 
 
typedef enum
{ GERMAN,ENGLISH, FRENCH, NETHERLAND, LAST_LANGUAGE }
LANGUAGE;
 
 
 
typedef struct
{
/*
* Maximum length
*/
int const len;
 
/*
* Array of pointers to language-specific string
*/
char const * const text[LAST_LANGUAGE];
 
} STRING;
 
 
//--------------------------------------------------------------------------------------------------------------------
// Typdefinitionen für alle verwendeten Strings, LAST_STR muss am Ende stehen bleiben
//typedef enum
//{
// BOOT1,BOOT2,BOOT_WI1,BOOT_WI2,BOOT_SV,START_MSG1,START_MSG2,GNU_GPL,ATMEGA644,ATMEGA644P,ATMEGA1284P,HW12,HW12W,HW13,HW13W,HW39,START_LASTPOS,START_LASTPOS1,START_LASTPOS2,START_LASTPOSDEL,
// START_SEARCHFC,ENDE,START_FCNOTFOUND,START_FCFOUND,START_FCFOUND1,START_FCFOUND2,START_FCFOUND3,START_VERSIONCHECK,START_VERSIONCHECK1,
// START_VERSIONCHECK2,START_VERSIONCHECK3,START_VERSIONCHECK4,START_VERSIONCHECK5,LAST_STR
//} STR;
 
 
 
static const STRING strings[LAST_STR] =
{
{ /*KEYLINE1*/
21,
{
" \x1a \x1b Ende OK", /* German */
" \x1a \x1b end OK", /* English*/
" \x1a \x1b fin OK", /* French */
" \x1a \x1b Einde OK", /* Dutch */
 
}
},
{ /*KEYLINE2*/
21,
{
" \x18 \x19 Ende OK", /* German */
" \x18 \x19 end OK", /* English*/
" \x18 \x19 fin OK", /* French */
" \x18 \x19 Einde OK", /* Dutch */
 
}
},
{ /*KEYLINE3*/
21,
{
" \x18 \x19 Ende ", /* German */
" \x18 \x19 end ", /* English*/
" \x18 \x19 fin ", /* French */
" \x18 \x19 Einde", /* Dutch */
 
}
},
{ /*KEYLINE4*/
21,
{
"Ende OK", /* German */
"end OK", /* English*/
"fin OK", /* French */
"Einde OK", /* Dutch */
 
}
},
 
 
 
{ /*BOOT1*/
21,
{
"Taste 1 Sekunde", /* German */
"Keep the button", /* English*/
"Maintenez le bouton", /* French */
"Houd de knop ", /* Dutch */
 
}
},
{ /* BOOT2*/
21,
{
"lang festhalten.", /* German */
"pressed for 1 second", /* English*/
"enfoncee pend. 1 sec", /* French */
"1 seconde ingedrukt.", /* Dutch */
}
},
{ /*BOOT_WI1*/
21,
{
"Verbindung zum MK ist", /* German */
"Connection to MK is", /* English*/
"Connexion à MK est", /* French */
"Verbinding met MK is", /* Dutch */
 
}
},
{ /* BOOT_WI2*/
21,
{
"auf Wi232 eingestellt", /* German */
"set to Wi232", /* English*/
"mis a Wi232", /* French */
"ingesteld op Wi232", /* Dutch */
}
},
{ /*BOOTSV1*/
21,
{
"auf Kabel eingestellt", /* German */
"set to kabel on SV2", /* English*/
"mis a kabel sur SV2", /* French */
"via kabelverbinding", /* Dutch */
 
}
},
{ /**/
21,
{
"Portables Kopter Tool", /* German */
"Portable Kopter Tool ", /* English*/
"Portable Kopter Tool ", /* French */
"Portable Kopter Tool ", /* Dutch */
 
}
},
{ /*START_MSG2 */
21,
{
"für FC Ver "FC_Version, /* German */
"for FC Ver "FC_Version, /* English*/
"pour FC Ver "FC_Version, /* French */
"Voor FC Ver "FC_Version, /* Dutch */
}
},
{ /* GNU/GPL */
21,
{
"GNU GPL License", /* German */
"GNU GPL License", /* English*/
"GNU GPL License", /* French */
"GNU GPL License", /* Dutch */
}
},
{ /**/
21,
{
"ATmega 644", /* German */
"ATmega 644", /* English*/
"ATmega 644", /* French */
"ATmega 644", /* Dutch */
}
},
{ /**/
21,
{
"ATmega 644P", /* German */
"ATmega 644P", /* English*/
"ATmega 644P", /* French */
"ATmega 644P", /* Dutch */
}
},
{ /**/
21,
{
"ATmega 1284P", /* German */
"ATmega 1284P", /* English*/
"ATmega 1284P", /* French */
"ATmega 1284P", /* Dutch */
}
},
 
{ /**/
21,
{
"Hardware 1.2", /* German */
"Hardware 1.2", /* English*/
"Hardware 1.2", /* French */
"Hardware 1.2", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 1.2W", /* German */
"Hardware 1.2W", /* English*/
"Hardware 1.2W", /* French */
"Hardware 1.2W", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 1.3", /* German */
"Hardware 1.3", /* English*/
"Hardware 1.3", /* French */
"Hardware 1.3", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 1.3W", /* German */
"Hardware 1.3W", /* English*/
"Hardware 1.3W", /* French */
"Hardware 1.3W", /* Dutch */
}
},
{ /**/
21,
{
"Hardware 3.9", /* German */
"Hardware 3.9", /* English*/
"Hardware 3.9", /* French */
"Hardware 3.9", /* Dutch */
}
},
{ /*START_LASTPOS*/
21,
{
" Letzte Position ", /* German */
" last position ", /* English*/
" derniere position ", /* French */
" Laatste positie ", /* Dutch */
}
},
{ /*START_LASTPOS1*/
21,
{
" Breitengr Längengr ", /* German */
" latitude longitude ", /* English*/
" latitude longitude ", /* French */
"breedtegr. lengtegr. ", /* Dutch */
}
},
 
{ /*START_LASTPOS2*/
21,
{
"löschen weiter", /* German */
"delete exit ", /* English*/
"supprimer plus ", /* French */
"wissen verder", /* Dutch */
}
},
{ /*START_LASTPOS3*/
21,
{
" Google Eingabe ", /* German */
" Google Input ", /* English*/
" Google Input ", /* French */
" Google Input ", /* Dutch */
}
},
{ /*START_LASTPOSDEL*/
21,
{
" gelöscht ", /* German */
" deleted ", /* English*/
" supprime ", /* French */
" gewist ", /* Dutch */
}
},
{ /*START_SEARCHFC*/
21,
{
"Suche FC...", /* German */
"searching FC...", /* English*/
"cherchant FC...", /* French */
"zoek FC...", /* Dutch */
}
},
 
{ /*ENDE*/
21,
{
"Ende ", /* German */
"end ", /* English*/
"fin ", /* French */
"Einde", /* Dutch */
}
},
{ /*OK*/
21,
{
"Ok", /* German */
"ok", /* English*/
"ok", /* French */
"gued", /* Dutch */
}
},
{ /*FEHLER*/
21,
{
"Fehler", /* German */
"error", /* English*/
"d'erreur", /* French */
"fout", /* Dutch */
}
},
{ /*AKTIV*/
21,
{
"aktiv", /* German */
"activ", /* English*/
"actifs", /* French */
"actief", /* Dutch */
}
},
 
 
{ /*START_FCNOTFOUND*/
21,
{
"FC nicht gefunden!", /* German */
"FC not found!", /* English*/
"FC pas trouve!", /* French */
"FC niet gevonden!", /* Dutch */
}
},
{ /*START_FCFOUND*/
21,
{
"PKT-Tool GNU GPL", /* German */
"PKT-Tool GNU GPL", /* English*/
"PKT-Tool GNU GPL", /* French */
"PKT-Tool GNU GPL", /* Dutch */
}
},
{ /*START_FCFOUND1*/
21,
{
"gefunden: ", /* German */
"found: ", /* English*/
"trouvés: ", /* French */
"gevonden: ", /* Dutch */
}
},
{ /*START_FCFOUND2*/
21,
{
"Flight-Ctrl", /* German */
"Flight-Ctrl", /* English*/
"Flight-Ctrl", /* French */
"Flight-Ctrl", /* Dutch */
}
},
{ /*START_FCFOUND3*/
21,
{
"Navi-Ctrl", /* German */
"Navi-Ctrl", /* English*/
"Navi-Ctrl", /* French */
"Navi-Ctrl", /* Dutch */
}
},
{ /*START_VERSIONCHECK*/
21,
{
"Version: ", /* German */
"Version: ", /* English*/
"Version: ", /* French */
"Versie: ", /* Dutch */
}
},
{ /*START_VERSIONCHECK1*/
21,
{
" erwartet", /* German */
" expected", /* English*/
" attendus", /* French */
" verwacht", /* Dutch */
}
},
{ /*START_VERSIONCHECK2*/
21,
{
" gefunden", /* German */
" found", /* English*/
" trouves", /* French */
" gevonden", /* Dutch */
}
},
{ /*START_VERSIONCHECK3*/
21,
{
"PKT-Tool nur mit", /* German */
"PKT-Tool only with", /* English*/
"PKT uniquement avec", /* French */
"PKT-Tool alleen met", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK4*/
21,
{
"FC Software ", /* German */
"FC Software ", /* English*/
"FC Software ", /* French */
"FC Software ", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK5*/
21,
{
"kompatibel", /* German */
"compatible", /* English*/
"compatibles", /* French */
"compatibel", /* Dutch */
}
},
{ /*ON*/
21,
{
"Ein ", /* German */
"On ", /* English*/
"Un ", /* French */
"Aan ", /* Dutch */
}
},
{ /*AUS*/
21,
{
"Aus ", /* German */
"Off ", /* English*/
"Du ", /* French */
"Uit ", /* Dutch */
}
},
{ /*ESC*/
21,
{
"ESC", /* German */
"ESC", /* English*/
"ESC", /* French */
"ESC", /* Dutch */
}
},
{ /*SHUTDOWN*/
21,
{
" PKT ausschalten?", /* German */
" shutdown PKT ?", /* English*/
" desactiver PKT ?", /* French */
" PKT uitschakelen ?", /* Dutch */
}
},
{ /*YES NO*/
21,
{
"Nein Ja", /* German */
"no yes", /* English*/
"non oui", /* French */
"Nee Ja", /* Dutch */
}
},
{ /*UPDATE1*/
21,
{
"Verbinde PC mit PKT ", /* German */
"Connect PC to PKT-USB", /* English*/
"associer PC a PKT-USB", /* French */
"Verbind PC met PKT ", /* Dutch */
}
},
{ /*UPDATE2*/
21,
{
"Drücke 'Start' am PKT", /* German */
"Press 'Start' on PKT ", /* English*/
"presse 'lancer' a PKT", /* French */
"Druk 'Start' op PKT ", /* Dutch */
}
},
{ /*ENDSTART*/
21,
{
" Ende Start", /* German */
" End Start", /* English*/
" fin lancer", /* French */
" Einde Start", /* Dutch */
}
},
{ /*TOOLS1*/
21,
{
" PC-Quick-Verbindung ", /* German */
" PC-Quick-Connection ", /* English*/
" PC-connexion rapide ", /* French */
" Snelle PC-verbinding", /* Dutch */
}
},
{ /*CONNECT1,*/
21,
{
"Verbinde das PKT mit", /* German */
"Connect PKT with MK", /* English*/
"connectez PKT a MK", /* French */
"Verbind PKT ", /* Dutch */
}
},
{ /*CONNECT2*/
21,
{
"dem MK über:", /* German */
" over :", /* English*/
" a propos :", /* French */
" met :", /* Dutch */
}
},
 
{ /*CONNECT4,*/
21,
{
"dem MK über: Kabel, ", /* German */
"over: Kabel", /* English*/
"a propos: Cable", /* French */
"MK via: kabel ", /* Dutch */
}
},
{ /*CONNECT5*/
21,
{
"es ist kein Wi.232", /* German */
"there is no Wi.232", /* English*/
"l n'ya pas de ", /* French */
"er is geen wi.232 ", /* Dutch */
}
},
{ /*CONNECT6*/
21,
{
"Modul eingebaut.", /* German */
"built in.", /* English*/
"module integre Wi232", /* French */
"module ingebouwd.", /* Dutch */
}
},
{ /*CONNECT7,*/
21,
{
"Wenn doch, dann bitte", /* German */
"if yes, then first", /* English*/
"Si vous le faites", /* French */
"zo ja, dan aub eerst", /* Dutch */
}
},
{ /*CONNECT8*/
21,
{
"das Modul zuerst im ", /* German */
"activate modul in", /* English*/
"activer le module", /* French */
"de module aktiveren", /* Dutch */
}
},
{ /*CONNECT9*/
21,
{
"Setupmenü aktivieren.", /* German */
"Setupmenu", /* English*/
"dans menu de config.", /* French */
"in het Setupmenu.", /* Dutch */
}
},
{ /*CONNECT10*/
21,
{
"Sie müssen das PKT", /* German */
"You have to", /* English*/
"Vous devez", /* French */
"U moet de PKT", /* Dutch */
}
},
{ /*CONNECT11*/
21,
{
"jetzt neu starten!", /* German */
"restart PKT", /* English*/
"redemarrer PKT", /* French */
"nu opnieuw starten!", /* Dutch */
}
},
{ /*CONNECT12*/
21,
{
"Es ist kein BTM-222", /* German */
"There is no BTM-222", /* English*/
"l n'ya pas de ", /* French */
"Er is geen BTM-222", /* Dutch */
}
},
{ /*CONNECT13*/
21,
{
"Modul eingebaut", /* German */
"Modul built in", /* English*/
"module integre BTM222", /* French */
"module ingebouwd.", /* Dutch */
}
},
{ /*CONNECT14*/
21,
{
" MK-USB Funktion ", /* German */
" MK-USB Function ", /* English*/
" MK-USB fonction ", /* French */
" MK-USB Functie ", /* Dutch */
}
},
{ /*CONNECT15*/
21,
{
" BT --> Kabel an FC ", /* German */
" BT --> Kabel to FC ", /* English*/
" BT --> Cable a FC ", /* French */
" BT --> kabel naar FC", /* Dutch */
}
},
{ /*CONNECT16*/
21,
{
"PC mit BT verb.", /* German */
"connect PC with BT", /* English*/
"associer PC a BT", /* French */
"PC via BT verbonden.", /* Dutch */
}
},
{ /*CONNECT17*/
21,
{
"PKT-Kabel an FC", /* German */
"PKT-Kabel to FC", /* English*/
"PKT-Cable a FC", /* French */
"PKT-kabel naar FC", /* Dutch */
}
},
{ /*CONNECT18*/
21,
{
" BT --> Wi.232 ", /* German */
" BT --> Wi.232 ", /* English*/
" BT --> Wi.232 ", /* French */
" BT --> Wi.232 ", /* Dutch */
}
},
{ /*CONNECT19*/
21,
{
"Wi.232 an FC ", /* German */
"Wi.232 to FC ", /* English*/
"Wi.232 a FC ", /* French */
"Wi.232 naar FC ", /* Dutch */
}
},
 
{ /*CONNECT20*/
21,
{
" USB --> Kabel an FC ", /* German */
" USB --> cable to FC ", /* English*/
" USB --> cable a FC ", /* French */
"USB --> kabel naar FC", /* Dutch */
}
},
{ /*CONNECT21*/
21,
{
"PC mit USB verbinden ", /* German */
"connect PC with USB ", /* English*/
"associer PC a USB ", /* French */
"Verbind PC met USB ", /* Dutch */
}
},
{ /*CONNECT22*/
21,
{
" USB --> Wi.232 ", /* German */
" USB --> Wi.232 ", /* English*/
" USB --> Wi.232 ", /* French */
" USB --> Wi.232 ", /* Dutch */
}
},
{ /*CONNECT23*/
21,
{
"MK-Tool starten", /* German */
"start MK-Tool", /* English*/
"demarrage MK-Tool", /* French */
"start MK-Tool", /* Dutch */
}
},
{ /*CONNECT24*/
21,
{
" Wi.232 Konfigurieren", /* German */
" Wi.232 Configuration", /* English*/
" Wi.232 configurer ", /* French */
" Wi.232 Configuratie ", /* Dutch */
}
},
{ /*CONNECT25*/
21,
{
"Programm starten. ", /* German */
"start program ", /* English*/
"Démarrer le programme", /* French */
"start programma.", /* Dutch */
}
},
 
{ /*CONNECT26*/
21,
{
"BTM-222 Konfigurieren", /* German */
"BTM-222 configuration", /* English*/
"BTM-222 de configura.", /* French */
"BTM-222 configuratie", /* Dutch */
}
},
{ /*CONNECT27*/
21,
{
"FC > MK-USB > BTM-222", /* German */
"FC > MK-USB > BTM-222", /* English*/
"FC > MK-USB > BTM-222", /* French */
"FC > MK-USB > BTM-222", /* Dutch */
}
},
{ /*CONNECT28*/
21,
{
"MK-USB an PC anschl. ", /* German */
"connect PC to MK-USB ", /* English*/
"associer PC a MK-USB ", /* French */
"Verbind PC met MK-USB", /* Dutch */
}
},
{ /*CONNECT29*/
21,
{
"Zwischen MK-USB und ", /* German */
"connect crossed cable", /* English*/
"la connexion entre PC", /* French */
"Tussen MK-USB en PKT ", /* Dutch */
}
},
{ /*CONNECT30*/
21,
{
"PKT ein gekreuztes ", /* German */
"between MK-USB and ", /* English*/
"et FC un cable croise", /* French */
"een gekruiste kabel ", /* Dutch */
}
},
{ /*CONNECT31*/
21,
{
"Kabel anschliessen. ", /* German */
"PKT SV2", /* English*/
" ", /* French */
"aansluiten.", /* Dutch */
}
},
 
 
 
 
 
{ /*Kabel*/
21,
{
"Kabel", /* German */
"cable", /* English*/
"cable", /* French */
"Kabel", /* Dutch */
}
},
{ /*SLAVE*/
21,
{
"Slave ", /* German */
"Slave ", /* English*/
"esclaves", /* French */
"Slave ", /* Dutch */
}
},
{ /*NORMAL*/
21,
{
"Normal", /* German */
"Normal", /* English*/
"normal", /* French */
"Norm. ", /* Dutch */
}
},
{ /*Reverse*/
21,
{
"Reverse", /* German */
"inverse", /* English*/
"inverse", /* French */
"geinver", /* Dutch */
}
},
{ /*ENDOK*/
21,
{
"Ende OK", /* German */
"End OK", /* English*/
"Fin OK", /* French */
"Eind OK", /* Dutch */
}
},
{ /*EEPROM1*/
21,
{
" EEProm wirklich", /* German */
" Realy delete", /* English*/
" eeprom supprimer?", /* French */
" Eeprom werkelijk", /* Dutch */
}
},
{ /*EEPROM2*/
21,
{
" löschen?", /* German */
" EEprom?", /* English*/
" ", /* French */
" wissen?", /* Dutch */
}
},
{ /*DEUTSCH*/
21,
{
"deutsch ", /* German */
"german ", /* English*/
"allemande ", /* French */
"duits ", /* Dutch */
}
},
{ /*ENGLISCH*/
21,
{
"englisch ", /* German */
"english ", /* English*/
"anglaise ", /* French */
"engels ", /* Dutch */
}
},
{ /*FRANCE*/
21,
{
"französisch", /* German */
"french " , /* English*/
"française ", /* French */
"frans ", /* Dutch */
}
},
{ /*NETHERL*/
21,
{
"holländisch", /* German */
"dutch ", /* English*/
"hollandaise", /* French */
"nederlands ", /* Dutch */
}
},
{ /*DISPLAY1*/
21,
{
"Anzeige Einstellungen", /* German */
" Display Setup ", /* English*/
" d'affichage config. ", /* French */
"Display instellingen ", /* Dutch */
}
},
{ /*DISPLAY2*/
21,
{
"Infos bei Start:", /* German */
"Info at startup ", /* English*/
"Inf.au demarrage", /* French */
"Info bij opstart", /* Dutch */
}
},
{ /*DISPLAY3*/
21,
{
"Sprache : ", /* German */
"Language: ", /* English*/
"la langue: ", /* French */
"Taal: ", /* Dutch */
}
},
{ /*DISPLAY4*/
21,
{
"Licht aus nach:", /* German */
"Light off after:", /* English*/
"Exti.feux p.les:", /* French */
"Licht uit na: ", /* Dutch */
}
},
{ /*DISPLAY5*/
21,
{
"LCD Helligk.:", /* German */
" Brightness :", /* English*/
" luminosite :", /* French */
" intensiteit:", /* Dutch */
}
},
{ /*DISPLAY6*/
21,
{
"LCD Kontrast:", /* German */
"LCD contrast:", /* English*/
"LCD contrast:", /* French */
"LCD contrast:", /* Dutch */
}
},
{ /*DISPLAY7*/
21,
{
"LCD Norm/Inv: ", /* German */
"LCD Norm/Inv: ", /* English*/
"LCD Norm/Inv: ", /* French */
"LCD Norm/Inv: ", /* Dutch */
}
},
{ /*DISPLAY8*/
21,
{
"LCD Orient.: ", /* German */
"LCD Orient.: ", /* English*/
"LCD Orient.: ", /* French */
"LCD Orient.: ", /* Dutch */
}
},
 
{ /*DEBUGPKT*/
21,
{
"Debug PKT", /* German */
"Debug PKT", /* English*/
"Debug PKT", /* French */
"Debug PKT", /* Dutch */
}
},
 
{ /*WITXRX*/
21,
{
"Wi TX/RX Chan:", /* German */
"Wi TX/RX Chan:", /* English*/
"Wi TX/RX Chan:", /* French */
"Wi TX/RX Chan:", /* Dutch */
}
},
{ /*WINETG*/
21,
{
"Wi NetW. Grp.:", /* German */
"Wi NetW. Grp.:", /* English*/
"Wi NetW. Grp.:", /* French */
"Wi NetW. Grp.:", /* Dutch */
}
},
{ /*WINETM*/
21,
{
"Wi NetW. Mode:", /* German */
"Wi NetW. Mode:", /* English*/
"Wi NetW. Mode:", /* French */
"Wi NetW. Mode:", /* Dutch */
}
},
 
 
{ /*WITIMEOUT*/
21,
{
"Wi TX Timeout:", /* German */
"Wi TX Timeout:", /* English*/
"Wi TX Timeout:", /* French */
"Wi TX Timeout:", /* Dutch */
}
},
 
{ /*WIUART*/
21,
{
"Wi UART MTU :", /* German */
"Wi UART MTU :", /* English*/
"Wi UART MTU :", /* French */
"Wi UART MTU :", /* Dutch */
}
},
{ /*WI2321*/
21,
{
"Wi.232 eingebaut:", /* German */
"Wi.232 built in :", /* English*/
"Wi.232 integre :", /* French */
"Wi.232 ingebouwd:", /* Dutch */
}
},
{ /*WI2322*/
21,
{
"Ist ein Wi.232-Modul ", /* German */
"Is Wi232 modul", /* English*/
"est un module ", /* French */
"Is er een Wi.232", /* Dutch */
}
},
{ /*WI2323*/
21,
{
"eingebaut?", /* German */
"built in?", /* English*/
"integre Wi232?", /* French */
"module ingebouwd?", /* Dutch */
}
},
{ /*YES*/
21,
{
"Ja ", /* German */
"yes ", /* English*/
"oui ", /* French */
"Ja ", /* Dutch */
}
},
{ /*NO*/
21,
{
"Nein", /* German */
"no ", /* English*/
"non ", /* French */
"Nee ", /* Dutch */
}
},
{ /*BT1*/
21,
{
"BTM222 eingebaut:", /* German */
"BTM222 built in :", /* English*/
"BTM222 integre :", /* French */
"BTM222 ingebouwd:", /* Dutch */
}
},
{ /*BT2*/
21,
{
"Ist ein BTM-222-Modul", /* German */
"Is BTM-222 Modul", /* English*/
"est un module ", /* French */
"Is er een BTM-222", /* Dutch */
}
},
{ /*BT3*/
21,
{
"eingebaut?", /* German */
"built in?", /* English*/
"integre BTM222?", /* French */
"module ingebouwd?", /* Dutch */
}
},
 
{ /*LIPO1*/
21,
{
" PKT Akku Einstellung", /* German */
" PKT Accu Setup ", /* English*/
" PKT Accu Setup ", /* French */
" PKT Accu Setup ", /* Dutch */
}
},
{ /*LIPO2*/
21,
{
"PKT Akkutyp: ", /* German */
"PKT Accutyp: ", /* English*/
"PKT Accutyp: ", /* French */
"PKT Accutype: ", /* Dutch */
}
},
{ /*LIPO3*/
21,
{
"Akku U Offset: ", /* German */
"Accu U Offset: ", /* English*/
"Accu U Offset: ", /* French */
"Accu U Offset: ", /* Dutch */
}
},
{ /*LIPO4*/
21,
{
"PKT Akkutyp: ", /* German */
"PKT Accutyp: ", /* English*/
"PKT Accutyp: ", /* French */
"PKT Accutype: ", /* Dutch */
}
},
{ /*LIPO5*/
21,
{
"Offset verstellen bis", /* German */
"adjust offset until", /* English*/
"Decalage l'ajuster ", /* French */
"Offset afregelen tot", /* Dutch */
}
},
{ /*LIPO6*/
21,
{
"die Spannung passt", /* German */
"voltage fits", /* English*/
"a la tension", /* French */
"de spanning juist is.", /* Dutch */
}
},
{ /*LOWBAT*/
21,
{
"LowBat Warn V:", /* German */
"LowBat Warn V:", /* English*/
"LowBat Warn V:", /* French */
"LowBat alarm :", /* Dutch */
}
},
{ /*OSD_V, vorne*/
21,
{
"V", /* German */
"F", /* English*/
"L", /* French */
"F", /* Dutch */
}
},
 
{ /*OSD_H, hinten*/
21,
{
"H", /* German */
"B", /* English*/
"D", /* French */
"A", /* Dutch */
}
},
{ /*OSD_L, links*/
21,
{
"L", /* German */
"L", /* English*/
"G", /* French */
"L", /* Dutch */
}
},
 
{ /*OSD_R, rechts*/
21,
{
"R", /* German */
"R", /* English*/
"D", /* French */
"R", /* Dutch */
}
},
 
{ /*OSD_ERROR*/
21,
{
"FEHLER: Datenverlust ", /* German */
"ERROR: Data lost", /* English*/
"perte de donnees", /* French */
"verbinding verbroken ", /* Dutch */
}
},
{ /*OSD_POS1*/
21,
{
"Letzte bekannte", /* German */
"Last known ", /* English*/
"Derniere position", /* French */
"Laatst bekende", /* Dutch */
}
},
 
{ /*OSD_POS2*/
21,
{
"Position ", /* German */
"position ", /* English*/
"", /* French */
"positie ", /* Dutch */
}
},
{ /*PARA_SETTINGS*/
21,
{
" Einstellungen x ", /* German */
" Setting x ", /* English*/
" Parametres x ", /* French */
" Instellingen x ", /* Dutch */
}
},
{ /*PARA_CHANGE*/
21,
{
"ändern", /* German */
"change", /* English*/
"le changement", /* French */
"verandering", /* Dutch */
}
},
 
{ /*PARA_AKTIVI*/
21,
{
"aktivieren", /* German */
"activate", /* English*/
"activer", /* French */
"activeren", /* Dutch */
}
},
 
{ /*PARA_AKTIV*/
21,
{
"aktiviert", /* German */
"activated", /* English*/
"activee", /* French */
"geactiveerd", /* Dutch */
}
},
{ /*PARA_SAVESETT*/
21,
{
" Setting x speichern?", /* German */
" store setting?", /* English*/
" Reglage magasin?", /* French */
" instell.op te slaan?", /* Dutch */
}
},
 
{ /*PARA_SETTSAVED*/
21,
{
"Gespeichert und", /* German */
"stored and", /* English*/
"stockes et", /* French */
"opgeslagen en", /* Dutch */
}
},
{ /*PARA_COPY*/
21,
{
"Kopiere Setting", /* German */
"copy settings", /* English*/
"parametres de copie", /* French */
"kopieer instel.", /* Dutch */
}
},
{ /*PARA_FROMTO*/
21,
{
" von x nach y", /* German */
" from x to y", /* English*/
" des x apres y", /* French */
" van x na y", /* Dutch */
}
},
 
{ /*PARA_ENDE*/
21,
{
"von nach Ende OK", /* German */
"from to end OK", /* English*/
"des apres fin OK", /* French */
"van na einde OK", /* Dutch */
}
},
{ /*PARA_COPYQ*/
21,
{
"Wirklich kopieren?", /* German */
"really copy?", /* English*/
"vraiment copie?", /* French */
"echt kopie?", /* Dutch */
}
},
 
{ /*PARA_COPYACTIV*/
21,
{
"Kopiert und aktiviert", /* German */
"copied and activated ", /* English*/
"copies et actifs", /* French */
"Kopieën en actief", /* Dutch */
}
},
 
{ /*PARA_CHANGESETT*/
21,
{
"Ändere Einstellungen ", /* German */
" change settings ", /* English*/
"modifier les reglages", /* French */
"instellingen wijzigen", /* Dutch */
}
},
 
{ /*PARA_SELECT*/
21,
{
" Wähle Parameter ", /* German */
" select parameters ", /* English*/
"selectionnez Paramet.", /* French */
"Selecteer Parameters ", /* Dutch */
}
},
{ /*PARA_SEITE*/
21,
{
" Wähle Seite ", /* German */
" select page ", /* English*/
"Selectionnez la page ", /* French */
" Selecteer pagina ", /* Dutch */
}
},
{ /*PARA_SELSETT*/
21,
{
" Wähle Setting: ", /* German */
" select setting ", /* English*/
"Selectionnez setting ", /* French */
" Selecteer setting ", /* Dutch */
}
},
 
 
 
 
 
//---------, ,
//-----------------
};
 
char const * strGet(int str_no)
{
return strings[str_no].text[DisplayLanguage];
}
 
 
 
 
void Test_Language (void) // bleibt für Tests
{
lcd_cls();
lcd_printp_at(12, 7, PSTR("Ende"), 0);
 
 
do
{
lcd_puts_at(1, 2, strGet(BOOT_WI1), 0);
// lcd_printp_at(1, 2, strGet(BOOT_WI1), 0);
 
}
while(!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/messages.h
0,0 → 1,49
/****************************************************************************************
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Languagesupport: *
* http://www.netrino.com/Embedded-Systems/How-To/Firmware-Internationalization *
* Nigel Jones *
****************************************************************************************/
 
#ifndef MESSAGES_H
#define MESSAGES_H
 
 
//---------------------------------------------------------------------------------------------------------------------
// Typdefinitionen für alle verwendeten Strings, LAST_STR muss am Ende stehen bleiben
typedef enum
{
KEYLINE1, KEYLINE2, KEYLINE3,KEYLINE4, BOOT1, BOOT2, BOOT_WI1, BOOT_WI2, BOOT_SV, START_MSG1, START_MSG2, GNU_GPL, ATMEGA644, ATMEGA644P, ATMEGA1284P, HW12, HW12W, HW13,
HW13W, HW39, START_LASTPOS, START_LASTPOS1, START_LASTPOS2, START_LASTPOS3, START_LASTPOSDEL, START_SEARCHFC, ENDE, OK, FEHLER, AKTIV, START_FCNOTFOUND, START_FCFOUND, START_FCFOUND1, START_FCFOUND2,
START_FCFOUND3, START_VERSIONCHECK, START_VERSIONCHECK1, START_VERSIONCHECK2, START_VERSIONCHECK3, START_VERSIONCHECK4, START_VERSIONCHECK5, ON, OFF, ESC, SHUTDOWN,
YESNO, UPDATE1, UPDATE2, ENDSTART, TOOLS1, CONNECT1, CONNECT2, CONNECT4, CONNECT5, CONNECT6, CONNECT7, CONNECT8, CONNECT9, CONNECT10, CONNECT11, CONNECT12,
CONNECT13, CONNECT14, CONNECT15, CONNECT16, CONNECT17, CONNECT18, CONNECT19, CONNECT20, CONNECT21, CONNECT22, CONNECT23, CONNECT24, CONNECT25, CONNECT26, CONNECT27,
CONNECT28, CONNECT29, CONNECT30, CONNECT31, KABEL, SLAVE, NORMAL, REVERSE, ENDOK, EEPROM1, EEPROM2, DEUTSCH, ENGLISCH, FRANCE, NETHERL, DISPLAY1, DISPLAY2,
DISPLAY3, DISPLAY4, DISPLAY5, DISPLAY6, DISPLAY7, DISPLAY8, DEBUGPKT, WITXRX, WINETWG, WINETWM, WITIMEOUT, WIUART, WI2321, WI2322, WI2323, YES, NOO, BT1, BT2,
BT3, LIPO1, LIPO2, LIPO3, LIPO4, LIPO5, LIPO6, LOWBAT, OSD_V, OSD_H,OSD_L, OSD_R, OSD_ERROR, OSD_POS1, OSD_POS2, PARA_SETTINGS, PARA_CHANGE, PARA_AKTIVI, PARA_AKTIV,
PARA_SAVESETT, PARA_SETTSAVED,PARA_COPY, PARA_FROMTO, PARA_ENDE,PARA_COPYQ ,PARA_COPYACTIV,PARA_CHANGESETT, PARA_SELECT, PARA_SEITE, PARA_SELSETT, LAST_STR
} STR;
 
#define NUM_LANG 4 // German, English, French, Netherlands
 
char const * strGet(int str_no);
void Test_Language (void); // bleibt für Tests
 
 
#endif /* _MESSAGES_H_ */
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/mk-data-structs.h
0,0 → 1,330
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _MK_DATA_STRUCTS_H
#define _MK_DATA_STRUCTS_H
 
 
// FC Version 0.86
#define EEProm_Version 88 // FC EEProm Revision / Struktur FC 0.86
#define FC_Version "0.86x" //Softwareversion der FC
 
 
#define u8 uint8_t
#define s8 int8_t
#define u16 uint16_t
#define s16 int16_t
#define u32 uint32_t
#define s32 int32_t
 
#define NUMBER_OF_DEBUG_DATAS 32
#define ANALOG_NAME_LENGTH 16
 
// Version of supported serial protocol
#define MIN_VERSION 7
#define MAX_VERSION 10
 
// Setting index
#define SETTING_1 1
#define SETTING_2 2
#define SETTING_3 3
#define SETTING_4 4
#define SETTING_5 5
#define SETTING_CURRENT 0xff
 
typedef struct
{
unsigned char SWMajor;
unsigned char SWMinor;
unsigned char ProtoMajor;
unsigned char ProtoMinor;
unsigned char SWPatch;
unsigned char HardwareError[5];
} __attribute__((packed)) Version_t;
 
 
// FC Debug Struct
// portions taken and adapted from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.h
//
typedef struct
{
uint8_t Digital[2];
// NC: unsigned; FC: signed !!!!
int16_t Analog[32]; // Debugvalues
} __attribute__((packed)) DebugData_t;
 
//typedef struct
//{
// uint8_t line;
// uint8_t text[20];
//} __attribute__((packed)) Display_t;
 
 
//typedef struct
//{
// uint8_t Revision;
// int8_t Name[12];
// int8_t Motor[16][4];
// uint8_t crc;
//} __attribute__((packed)) Mixer_t;
 
 
//
// NaviCtrl OSD Structs
// portions taken and adapted from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
//typedef struct
//{
// signed int Winkel[3]; // nick, roll, compass in 0,1.^
// signed char Centroid[3];
// signed char reserve[5];
//} __attribute__((packed)) Data3D_t;
 
 
typedef struct
{
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
u8 Status; // validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct
{
u16 Distance; // distance to target in cm
s16 Bearing; // course to target in deg
} __attribute__((packed)) GPS_PosDev_t;
 
typedef struct
{
GPS_Pos_t Position; // the gps position of the waypoint, see ubx.h for details
s16 Heading; // orientation, 0 no action, 1...360 fix heading, neg. = Index to POI in WP List
u8 ToleranceRadius; // in meters, if the MK is within that range around the target, then the next target is triggered
u8 HoldTime; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
u8 Event_Flag; // future implementation
u8 Index; // to indentify different waypoints, workaround for bad communications PC <-> NC
u8 Type; // typeof Waypoint
u8 WP_EventChannelValue;
u8 AltitudeRate; // rate to change the setpoint
u8 reserve[8]; // reserve
} __attribute__((packed)) Point_t;
 
 
// NaviCtrl struct
// taken from
// http://mikrocontroller.cco-ev.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
typedef struct
{
u8 Version; // version of the data structure
GPS_Pos_t CurrentPosition; // see ubx.h for details
GPS_Pos_t TargetPosition;
GPS_PosDev_t TargetPositionDeviation;
GPS_Pos_t HomePosition;
GPS_PosDev_t HomePositionDeviation;
u8 WaypointIndex; // index of current waypoints running from 0 to WaypointNumber-1
u8 WaypointNumber; // number of stored waypoints
u8 SatsInUse; // number of satellites used for position solution
s16 Altimeter; // hight according to air pressure
s16 Variometer; // climb(+) and sink(-) rate
u16 FlyingTime; // in seconds
u8 UBat; // Battery Voltage in 0.1 Volts
u16 GroundSpeed; // speed over ground in cm/s (2D)
s16 Heading; // current flight direction in . as angle to north
s16 CompassHeading; // current compass value in .
s8 AngleNick; // current Nick angle in 1.
s8 AngleRoll; // current Rick angle in 1.
u8 RC_Quality; // RC_Quality
u8 FCFlags; // Flags from FC
u8 NCFlags; // Flags from NC
u8 Errorcode; // 0 --> okay
u8 OperatingRadius; // current operation radius around the Home Position in m
s16 TopSpeed; // velocity in vertical direction in cm/s
u8 TargetHoldTime; // time in s to stay at the given target, counts down to 0 if target has been reached
u8 RC_RSSI; // Receiver signal strength (since version 2 added)
s16 SetpointAltitude; // setpoint for altitude
u8 Gas; // for future use
u16 Current; // actual current in 0.1A steps
u16 UsedCapacity; // used capacity in mAh
} __attribute__((packed)) NaviData_t;
 
 
 
 
// MikroKopter Flags
// taken from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.73d%2Ffc.h
//
#define FCFLAG_MOTOR_RUN 0x01
#define FCFLAG_FLY 0x02
#define FCFLAG_CALIBRATE 0x04
#define FCFLAG_START 0x08
#define FCFLAG_NOTLANDUNG 0x10
#define FCFLAG_LOWBAT 0x20
#define FCFLAG_SPI_RX_ERR 0x40
#define FCFLAG_I2CERR 0x80
 
 
// NaviCtrl Flags
// taken from
// http://mikrocontroller.cco-ev.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
#define NC_FLAG_FREE 0x01
#define NC_FLAG_PH 0x02
#define NC_FLAG_CH 0x04
#define NC_FLAG_RANGE_LIMIT 0x08
#define NC_FLAG_NOSERIALLINK 0x10
#define NC_FLAG_TARGET_REACHED 0x20
#define NC_FLAG_MANUAL_CONTROL 0x40
#define NC_FLAG_GPS_OK 0x80
 
 
 
 
// Aus FC eeprom.h
//
typedef struct
{
unsigned char Revision;
unsigned char Kanalbelegung[12]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv
unsigned char Hoehe_MinGas; // Wert : 0-100
unsigned char Luftdruck_D; // Wert : 0-250
unsigned char MaxHoehe; // Wert : 0-32
unsigned char Hoehe_P; // Wert : 0-32
unsigned char Hoehe_Verstaerkung; // Wert : 0-50
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250
unsigned char Hoehe_HoverBand; // Wert : 0-250
unsigned char Hoehe_GPS_Z; // Wert : 0-250
unsigned char Hoehe_StickNeutralPoint; // Wert : 0-250
unsigned char Stick_P; // Wert : 1-6
unsigned char Stick_D; // Wert : 0-64
unsigned char StickGier_P; // Wert : 1-20
unsigned char Gas_Min; // Wert : 0-32
unsigned char Gas_Max; // Wert : 33-250
unsigned char GyroAccFaktor; // Wert : 1-64
unsigned char KompassWirkung; // Wert : 0-32
unsigned char Gyro_P; // Wert : 10-250
unsigned char Gyro_I; // Wert : 0-250
unsigned char Gyro_D; // Wert : 0-250
unsigned char Gyro_Gier_P; // Wert : 10-250
unsigned char Gyro_Gier_I; // Wert : 0-250
unsigned char Gyro_Stability; // Wert : 0-16
unsigned char UnterspannungsWarnung; // Wert : 0-250
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen
unsigned char Receiver; // 0= Summensignal, 1= Spektrum, 2 =Jeti, 3=ACT DSL, 4=ACT S3D
unsigned char I_Faktor; // Wert : 0-250
unsigned char UserParam1; // Wert : 0-250
unsigned char UserParam2; // Wert : 0-250
unsigned char UserParam3; // Wert : 0-250
unsigned char UserParam4; // Wert : 0-250
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag
//--- Seit V0.75
unsigned char ServoRollControl; // Wert : 0-250 // Stellung des Servos
unsigned char ServoRollComp; // Wert : 0-250
unsigned char ServoRollMin; // Wert : 0-250
unsigned char ServoRollMax; // Wert : 0-250
//---
unsigned char ServoNickRefresh; // Speed of the Servo
unsigned char ServoManualControlSpeed; //
unsigned char CamOrientation; //
unsigned char Servo3; // Value or mapping of the Servo Output
unsigned char Servo4; // Value or mapping of the Servo Output
unsigned char Servo5; // Value or mapping of the Servo Output
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung)
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung)
unsigned char Driftkomp;
unsigned char DynamicStability;
unsigned char UserParam5; // Wert : 0-250
unsigned char UserParam6; // Wert : 0-250
unsigned char UserParam7; // Wert : 0-250
unsigned char UserParam8; // Wert : 0-250
//---Output ---------------------------------------------
unsigned char J16Bitmask; // for the J16 Output
unsigned char J16Timing; // for the J16 Output
unsigned char J17Bitmask; // for the J17 Output
unsigned char J17Timing; // for the J17 Output
// seit version V0.75c
unsigned char WARN_J16_Bitmask; // for the J16 Output
unsigned char WARN_J17_Bitmask; // for the J17 Output
//---NaviCtrl---------------------------------------------
unsigned char NaviGpsModeControl; // Parameters for the Naviboard
unsigned char NaviGpsGain;
unsigned char NaviGpsP;
unsigned char NaviGpsI;
unsigned char NaviGpsD;
unsigned char NaviGpsPLimit;
unsigned char NaviGpsILimit;
unsigned char NaviGpsDLimit;
unsigned char NaviGpsACC;
unsigned char NaviGpsMinSat;
unsigned char NaviStickThreshold;
unsigned char NaviWindCorrection;
unsigned char NaviAccCompensation; // New since 0.86 -> was: SpeedCompensation
unsigned char NaviOperatingRadius;
unsigned char NaviAngleLimitation;
unsigned char NaviPH_LoginTime;
//---Ext.Ctrl---------------------------------------------
unsigned char ExternalControl; // for serial Control
//---CareFree---------------------------------------------
unsigned char OrientationAngle; // Where is the front-direction?
unsigned char CareFreeModeControl; // switch for CareFree
unsigned char MotorSafetySwitch;
unsigned char MotorSmooth;
unsigned char ComingHomeAltitude;
unsigned char FailSafeTime;
unsigned char MaxAltitude;
//------------------------------------------------
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt
unsigned char ServoCompInvert; // 0x01 = Nick, 0x02 = Roll 0 oder 1 // WICHTIG!!! am Ende lassen
unsigned char ExtraConfig; // bitcodiert
char Name[12];
unsigned char crc; // MUST BE THE LAST BYTE!
} __attribute__((packed)) mk_param_struct_t;
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/motortest.c
0,0 → 1,419
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include "main.h"
#include "motortest.h"
#include "lcd.h"
#include "timer.h"
#include "twimaster.h"
//#include "menu.h"
#include "uart1.h"
#include "usart.h"
#include "messages.h"
 
 
 
 
uint8_t m;
uint8_t mmode; // 0=Value 1=Motor
uint8_t v;
 
volatile uint8_t i2c_state;
volatile uint8_t motor_addr = 0;
 
 
//--------------------------------------------------------------
// Senden der Motorwerte per I2C-Bus
//
void SendMotorData(uint8_t m,uint8_t v)
{
if (m==0)
 
for(m=0;m<MAX_MOTORS;m++) // alle Motoren
{
// Motor[m].SetPoint = MotorTest[m];
Motor[m].SetPoint = v;
Motor[m].SetPointLowerBits = 0;
 
// Motor[i].SetPoint = MotorTest[i] / 4; // testing the high resolution
// Motor[i].SetPointLowerBits = MotorTest[i] % 4;
 
}
else
{
Motor[m-1].SetPoint = v;
Motor[m-1].SetPointLowerBits = 0;
}
 
 
 
if(I2C_TransferActive)
I2C_TransferActive = 0; // enable for the next time
else
{
motor_write = 0;
I2C_Start(TWI_STATE_MOTOR_TX); //Start I2C Interrupt Mode
}
}
 
 
//--------------------------------------------------------------
//
void Search_BL (void)
{
uint8_t i = 0;
unsigned int timer;
lcd_cls ();
MotorenEin =0;
MotorTest[i] = 0;
 
lcd_printp (PSTR("Suche BL-Ctrl"), 0);
 
// Check connected BL-Ctrls
BLFlags |= BLFLAG_READ_VERSION;
motor_read = 0; // read the first I2C-Data
 
SendMotorData(0,0);
timer = SetDelay(1);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
timer = SetDelay(1);
for(i=0; i < MAX_MOTORS; i++)
{
 
SendMotorData(i,0);
 
 
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
 
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK)
{
 
lcd_printp_at (0, 1, PSTR("Found BL-Ctrl:"), 0);
lcd_print_hex_at (18,1,i,0);
 
lcd_printp_at (0, 2, PSTR("Version:"), 0);
lcd_print_hex_at (8,2,Motor[i].Version,0);
lcd_printp_at (11, 2, PSTR("SetPoi:"), 0);
lcd_print_hex_at (18,2,Motor[i].SetPoint,0);
 
lcd_printp_at (0, 3, PSTR("SetPoiL:"), 0);
lcd_print_hex_at (8,3,Motor[i].SetPointLowerBits,0);
lcd_printp_at (11, 3, PSTR("State :"), 0);
lcd_print_hex_at (18,3,Motor[i].State,0);
 
lcd_printp_at (0, 4, PSTR("ReadMod:"), 0);
lcd_print_hex_at (8,4,Motor[i].ReadMode,0);
lcd_printp_at (11, 4, PSTR("Currnt:"), 0);
lcd_print_hex_at (18,4,Motor[i].Current,0);
 
lcd_printp_at (0, 5, PSTR("MaxPWM :"), 0);
lcd_print_hex_at (8,5,Motor[i].MaxPWM,0);
lcd_printp_at (11, 5, PSTR("Temp :"), 0);
write_ndigit_number_u (18,5,Motor[i].Temperature,3,1);
}
 
} //End For I
}
 
 
//--------------------------------------------------------------
//
void motor (uint8_t m,uint8_t v)
{
memset (buffer, 0, 16);
 
if(m == 0)
{
memset (buffer, v, 16);
}
else
{
buffer[m-1] = v;
}
 
SendOutData('t', ADDRESS_FC, 1, buffer, 16);
}
 
//--------------------------------------------------------------
//
void motor_test (uint8_t MotorMode)
{
 
lcd_cls ();
mmode = 1; // 1=Motor
m = 1;
v = 0;
char buffer[7];
unsigned int SerLoop;
SerLoop = 10;
 
if (MotorMode == I2C_Mode)
{
Search_BL();
do
{
lcd_printp_at (11, 7, PSTR("Ende Check"), 0);
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
}
while (!get_key_press (1 << KEY_ENTER));
}
 
lcd_cls();
lcd_printp (PSTR(" BL-Ctrl Test "), 2);
lcd_printp_at (2, 2, PSTR("Motor: 1"), 0);
lcd_printp_at (2, 3, PSTR("Value: 0"), 0);
lcd_frect ((8*1), (8*5), (0 * (14*8)) / 255, 6, 1);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_printp_at (18, 7, PSTR("\x1a \x1b"), 0);
lcd_printp_at (0, 2, PSTR("\x1d"), 0);
 
#if defined HWVERSION1_3W || defined HWVERSION1_3 || defined HWVERSION3_9
if (MotorMode == I2C_Mode)
uart1_puts("Motor;Version;Setpoint high;Setpoint low;State;ReadMode;Current;MaxPWM;Temperature\r");
#endif
#if defined HWVERSION1_2W || defined HWVERSION1_2
if (MotorMode == I2C_Mode)
USART_puts("Motor;Version;Setpoint high;Setpoint low;State;ReadMode;Current;MaxPWM;Temperature\r");
#endif
 
if (MotorMode == FC_Mode)
{
if (hardware == NC && current_hardware == NC)
{
SwitchToFC();
}
}
do
{
// mmode 0=Value 1=Motor
 
if ((mmode == 0) && (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (v < 254))
{
v++;
write_ndigit_number_u (9, 3, v, 3, 0);
if (MotorMode == FC_Mode)
lcd_frect ((8*1), (8*5), (v * (14*8)) / 255, 6, 1);
}
 
if ((mmode == 0) && (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (v > 0))
{
if (MotorMode == FC_Mode)
lcd_frect (((v * (14*8) / 255) + 8), (8*5), ((14*8) / 255), 6, 0);
 
v--;
write_ndigit_number_u (9, 3, v, 3, 0);
if (MotorMode == FC_Mode)
lcd_frect ((8*1), (8*5), (v * (14*8)) / 255, 6, 1);
}
 
if ((mmode == 1) && (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (m < 16))
{
m++;
write_ndigit_number_u (9, 2, m, 3, 0);
}
 
if ((mmode == 1) && (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (m > 0))
{
m--;
if(m > 0)
write_ndigit_number_u (9, 2, m, 3, 0);
if(m == 0)
lcd_printp_at (9, 2, PSTR("All"), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
if (MotorMode == I2C_Mode)
{
if (v > 0)
{
m = 0;
v=0;
lcd_frect ((8*1), (8*5), (0 * (14*8)) / 255, 6, 1);
lcd_cls_line (0, 5, 21);
if(m > 0) write_ndigit_number_u (9, 2, m, 3, 0);
if(m == 0) lcd_printp_at (9, 2, PSTR("All"), 0);
write_ndigit_number_u (9, 3, v, 3, 0);
SendMotorData(m,v);
timer = SetDelay(1);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
}
 
if(mmode == 0) // 0=Value
{
lcd_printp_at (0, 2, PSTR("\x1d"), 0);
lcd_printp_at (0, 3, PSTR(" "), 0);
mmode = 1; // 1=Motor
}
else
{
lcd_printp_at (0, 2, PSTR(" "), 0);
lcd_printp_at (0, 3, PSTR("\x1d"), 0);
mmode = 0; // 0=Value
}
}
//if (get_key_press (1 << KEY_ENTER))//
 
if (MotorMode == I2C_Mode)
{
SendMotorData(m,v);
timer = SetDelay(1);
lcd_printp_at (0, 3, PSTR("SetPoint :"), 0);
 
write_ndigit_number_u (13,3,Motor[m-1].SetPoint,3,0);
lcd_printp_at (0, 4, PSTR("Current :"), 0);
lcd_print_hex_at (13,4,Motor[m-1].Current,0);
write_ndigit_number_u (13,4,Motor[m-1].Current,3,0);
lcd_printp_at (0, 5, PSTR("Temperature:"), 0);
write_ndigit_number_u (13,5,Motor[m-1].Temperature,3,0);
lcd_printp_at (0, 6, PSTR("Version:"), 0);
lcd_print_hex_at (8,6,Motor[m-1].Version,0);
lcd_printp_at (11, 6, PSTR("State :"), 0);
lcd_print_hex_at (18,6,Motor[m-1].State,0);
 
#if defined HWVERSION1_3W || defined HWVERSION1_3 || defined HWVERSION3_9
 
if (Motor[m-1].SetPoint > 0)
{
if (SerLoop == 0)
{
itoa( m-1, buffer, 10); // convert interger into string (decimal format)
uart1_puts(buffer); // and transmit string to UART
uart1_puts(";");
itoa( Motor[m-1].Version, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].SetPoint, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].SetPointLowerBits, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].State, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].ReadMode, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].Current, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].MaxPWM, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].Temperature, buffer, 10); //
uart1_puts(buffer);
uart1_puts("\r");
uart1_puts("\n");
SerLoop =200;
}
else
SerLoop--;
}
 
#endif
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
 
if (Motor[m-1].SetPoint > 0)
{
if (SerLoop == 0)
{
itoa( m-1, buffer, 10); // convert interger into string (decimal format)
USART_puts(buffer); // and transmit string to UART
USART_puts(";");
itoa( Motor[m-1].Version, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].SetPoint, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].SetPointLowerBits, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].State, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].ReadMode, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].Current, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].MaxPWM, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].Temperature, buffer, 10); //
USART_puts(buffer);
USART_puts("\r");
USART_puts("\n");
SerLoop =200;
}
else
SerLoop--;
}
 
#endif
 
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
else
motor (m,v); //if (MotorMode == I2C_Mode)//
 
}
while (!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
 
if (MotorMode == FC_Mode)
{
motor(0,0); // switch all engines off at exit
}
 
}
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/motortest.h
0,0 → 1,46
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _MOTORTEST_H
#define _MOTORTEST_H
 
#define I2C_Mode 1 // Motortest Lokal
#define FC_Mode 2 // Motortest ueber FC
 
 
 
void motor_test (uint8_t MotorMode);
void SendMotorData(uint8_t m,uint8_t v);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/osd.c
0,0 → 1,813
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
 
#include "main.h"
#include "osd.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#include "eeprom.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
#define COSD_WASFLYING 4
#define TIMEOUT 200 // 2 sec
 
// global definitions and global vars
NaviData_t *naviData;
 
// löschen und alle mit "naviData->Variometer" ersetzen
//int8_t Variometer = 0;
 
// Hier Höhenanzeigefehler Korrigieren
#define AltimeterAdjust 1.5
 
// stats for after flight
int16_t max_Altimeter = 0;
uint16_t max_GroundSpeed = 0;
int16_t max_Distance = 0;
uint8_t min_UBat = 255;
uint16_t max_FlyingTime = 0;
uint16_t max_Current = 0;
uint16_t max_Capacity = 0;
 
// cache old vars for blinking attribute, checkup is faster than full
// attribute write each time
volatile uint8_t last_UBat = 255;
volatile uint8_t last_RC_Quality = 255;
 
volatile uint16_t ftimer = 0;
 
// store stats description in progmem to save space
const char stats_item_0[] PROGMEM = "max Altitude:";
const char stats_item_1[] PROGMEM = "max Speed :";
const char stats_item_2[] PROGMEM = "max Distance:";
const char stats_item_3[] PROGMEM = "min Voltage :";
const char stats_item_4[] PROGMEM = "max Time :";
#if 1
const char stats_item_5[] PROGMEM = "max Current :";
const char stats_item_6[] PROGMEM = "UsedCapacity:";
#else
const char stats_item_5[] PROGMEM = "Long. :";
const char stats_item_6[] PROGMEM = "Lat. :";
#endif
 
 
const char *stats_item_pointers[] PROGMEM = {
stats_item_0,
stats_item_1,
stats_item_2,
stats_item_3,
stats_item_4,
stats_item_5,
stats_item_6
};
 
//char* rose = "-+-N-+-O-+-S-+-W-+-N-+-O-+-S-+-W-+-N-+-O-+-S-+-W";
const char rose[48] PROGMEM = {
0x0e, 0x0f, 0x0e, 'N', 0x0e, 0x0f, 0x0e, 'O', 0x0e, 0x0f, 0x0e, 'S',
0x0e, 0x0f, 0x0e, 'W', 0x0e, 0x0f, 0x0e, 'N', 0x0e, 0x0f, 0x0e, 'O',
0x0e, 0x0f, 0x0e, 'S', 0x0e, 0x0f, 0x0e, 'W', 0x0e, 0x0f, 0x0e, 'N',
0x0e, 0x0f, 0x0e, 'O', 0x0e, 0x0f, 0x0e, 'S', 0x0e, 0x0f, 0x0e, 'W',
};
 
// the center is char 19 (north), we add the current heading in 8th
// which would be 22.5 degrees, but float would bloat up the code
// and *10 / 225 would take ages... so we take the uncorrect way
 
const char str_NE[] PROGMEM = "NE";
const char str_E[] PROGMEM = "E ";
const char str_SE[] PROGMEM = "SE";
const char str_S[] PROGMEM = "S ";
const char str_SW[] PROGMEM = "SW";
const char str_W[] PROGMEM = "W ";
const char str_NW[] PROGMEM = "NW";
const char str_N[] PROGMEM = "N ";
const char *directions_p[8] PROGMEM = {
str_NE,
str_E,
str_SE,
str_S,
str_SW,
str_W,
str_NW,
str_N
};
 
// Flags
uint8_t COSD_FLAGS2 = 0;
 
GPS_Pos_t last5pos[7];
uint8_t error = 0;
 
 
//--------------------------------------------------------------
// convert the <heading> gotton from NC into an index
uint8_t heading_conv (uint16_t heading)
{
if (heading > 23 && heading < 68)
return 0; //direction = "NE";
else if (heading > 67 && heading < 113)
return 1; //direction = "E ";
else if (heading > 112 && heading < 158)
return 2; //direction = "SE";
else if (heading > 157 && heading < 203)
return 3; //direction = "S ";
else if (heading > 202 && heading < 248)
return 4; //direction = "SW";
else if (heading > 247 && heading < 293)
return 5; //direction = "W ";
else if (heading > 292 && heading < 338)
return 6; //direction = "NW";
 
return 7; //direction = "N ";
}
 
//--------------------------------------------------------------
// draw a compass rose at <x>/<y> for <heading>
void draw_compass (uint8_t x, uint8_t y, uint16_t heading)
{
uint8_t front = 19 + (heading / 22);
for (uint8_t i = 0; i < 9; i++)
lcd_putc (x++, y, pgm_read_byte(&rose[front - 4 + i]), 0);
}
 
 
//--------------------------------------------------------------
// variometer
// draw variometer arrows at <x>/<y> according to <variometer>
//
void draw_variometer (uint8_t x, uint8_t y, uint8_t width, uint8_t hight, int16_t variometer)
{
lcd_rect (x, y - ((hight) / 2), width, hight, 1);
lcd_frect (x + 1, y - ((hight) / 2) + 1, width - 2, hight - 2, 0);
lcd_line (x, y, x + width, y, 1);
 
if (variometer > 0) // steigend
{
switch (variometer / 5)
{
case 0:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
break;
 
case 1:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
break;
 
case 2:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
lcd_frect (x + 2, y - 5, 6, 1, 1); // 10 > 14
break;
 
default:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
lcd_frect (x + 2, y - 5, 6, 1, 1); // 10 > 14
lcd_frect (x + 1, y - 6, 8, 1, 1); // 15 >
break;
}
}
else if (variometer < 0) // fallend
{
switch ((variometer) / -5)
{
case 0:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
break;
 
case 1:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
break;
 
case 2:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
lcd_frect (x + 2, y + 4, 6, 1, 1); // -10 > -14
break;
 
default:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
lcd_frect (x + 2, y + 4, 6, 1, 1); // -10 > -14
lcd_frect (x + 1, y + 5, 8, 1, 1); // -15 >
break;
}
}
}
 
 
//--------------------------------------------------------------
void print_statistics (void)
{
uint8_t line = 0;
lcd_cls ();
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
// max Altitude
lcd_printp_at (0, line, stats_item_pointers[0], 0);
write_ndigit_number_s (13, line, max_Altimeter / (30 / AltimeterAdjust), 4, 0);
lcd_putc (17, line, 'm', 0);
 
// max Speed
lcd_printp_at (0, ++line, stats_item_pointers[1], 0);
write_ndigit_number_u (14, line, (uint16_t) (((uint32_t) max_GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
lcd_printp_at(17, line, PSTR("km/h"), 0);
 
// max Distance
lcd_printp_at (0, ++line, stats_item_pointers[2], 0);
write_ndigit_number_u (14, line, max_Distance / 10, 3, 0);
lcd_putc (17, line, 'm', 0);
 
// max time
lcd_printp_at (0, ++line, stats_item_pointers[4], 0);
write_time (13, line, max_FlyingTime);
 
// min voltage
lcd_printp_at (0, ++line, stats_item_pointers[3], 0);
write_ndigit_number_u_10th (13, line, min_UBat, 3, 0);
lcd_putc (17, line, 'V', 0);
 
#if 1
// max Current
lcd_printp_at (0, ++line, stats_item_pointers[5], 0);
write_ndigit_number_u_10th (13, line, max_Current, 3, 0);
lcd_putc (17, line, 'A', 0);
 
// Used Capacity
lcd_printp_at (0, ++line, stats_item_pointers[6], 0);
write_ndigit_number_u (13, line, max_Capacity, 4, 0);
lcd_printp_at(17, line, PSTR("mAh"), 0);
#else
// longitude
lcd_printp_at (0, ++line, stats_item_pointers[5], 0);
write_gps_pos (8, line, naviData->CurrentPosition.Longitude);
 
// latitude
lcd_printp_at (0, ++line, stats_item_pointers[6], 0);
write_gps_pos (8, line, naviData->CurrentPosition.Latitude);
#endif
 
while (!get_key_press (1 << KEY_ESC))
timer = TIMEOUT;
 
COSD_FLAGS2 &= ~COSD_WASFLYING;
get_key_press(KEY_ALL);
lcd_cls();
}
 
//--------------------------------------------------------------
void print_position (void)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Breitengr Längengr "), 2);
lcd_puts_at(0, 0, strGet(START_LASTPOS1), 2);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
uint8_t ij =0;
 
for(ij=0;ij<6;ij++)
{
uint32_t lon = last5pos[ij].Latitude;
write_ndigit_number_u (1, ij+1, (uint16_t)(lon/10000000), 2, 0);
lcd_printp_at (3, ij+1, PSTR("."), 0);
write_ndigit_number_u (4, ij+1, (uint16_t)((lon/1000) % 10000), 4, 1);
write_ndigit_number_u (8, ij+1, (uint16_t)((lon/10) % 100), 2, 1);
 
uint32_t lat = last5pos[ij].Longitude;
write_ndigit_number_u (12, ij+1, (uint16_t)(lat/10000000), 2, 0);
lcd_printp_at (14, ij+1, PSTR("."), 0);
write_ndigit_number_u (15, ij+1, (uint16_t)((lat/1000) % 10000), 4, 1);
write_ndigit_number_u (19, ij+1, (uint16_t)((lat/10) % 100), 2, 1);
}
 
while (!get_key_press (1 << KEY_ESC))
timer = TIMEOUT;
 
get_key_press(KEY_ALL);
lcd_cls();
}
void Show_LastPosition(void)
{
lcd_puts_at(0, 2, strGet(OSD_POS1), 0);
lcd_puts_at(0, 3, strGet(OSD_POS2), 0);
lcd_puts_at(0, 5, strGet(START_LASTPOS1), 0);
uint32_t lon = last5pos[0].Latitude;
write_ndigit_number_u (1, 6, (uint16_t)(lon/10000000), 2, 0);
lcd_printp_at (3, 6, PSTR("."), 0);
write_ndigit_number_u (4, 6, (uint16_t)((lon/1000) % 10000), 4, 1);
write_ndigit_number_u (8, 6, (uint16_t)((lon/10) % 100), 2, 1);
 
uint32_t lat = last5pos[0].Longitude;
write_ndigit_number_u (12, 6, (uint16_t)(lat/10000000), 2, 0);
lcd_printp_at (14, 6, PSTR("."), 0);
write_ndigit_number_u (15, 6, (uint16_t)((lat/1000) % 10000), 4, 1);
write_ndigit_number_u (19, 6, (uint16_t)((lat/10) % 100), 2, 1);
 
}
 
void OSD_Timeout(uint8_t flag)
{
 
// uint8_t flag;
uint8_t tmp_dat;
// flag = 0;
timer = TIMEOUT;
// disable OSD Data from NC
// RS232_request_mk_data (1, 'o', 0);
// tmp_dat = 0;
// SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
 
// Bei Verbindungsverlusst werden hier die letzten bekannten Koordinaten ausgegeben!!!
// if (!timer)
// { // timeout occured
if (flag)
{
// Falls Spannungswarnung an war Beeper aus//
BeepTime = 0;
BeepMuster = 0xFFFF;
 
lcd_cls ();
WriteLastPosition(last5pos[0].Longitude,last5pos[0].Latitude); // im EEprom speichern
lcd_puts_at(0, 0, strGet(OSD_ERROR), 2);
 
// lcd_printp_at (0, 0, PSTR(" ERROR: Datenverlust "), 2);
 
// lcd_printp_at (0, 2, PSTR("Letzte bekannte"), 0);
// lcd_printp_at (0, 3, PSTR("Position gespeichert."), 0);
lcd_puts_at(0, 2, strGet(OSD_POS1), 0);
lcd_puts_at(0, 3, strGet(OSD_POS2), 0);
// lcd_printp_at (19, 7, PSTR("OK"), 0);
lcd_puts_at(19, 7, strGet(OK), 0);
// lcd_printp_at (0, 5, PSTR(" Breitengr Längengr "), 0);
 
lcd_puts_at(0, 5, strGet(START_LASTPOS1), 0);
 
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
BeepTime = 250;
BeepMuster = 0x0080;
error = 1;
 
uint32_t lon = last5pos[0].Latitude;
write_ndigit_number_u (1, 6, (uint16_t)(lon/10000000), 2, 0);
lcd_printp_at (3, 6, PSTR("."), 0);
write_ndigit_number_u (4, 6, (uint16_t)((lon/1000) % 10000), 4, 1);
write_ndigit_number_u (8, 6, (uint16_t)((lon/10) % 100), 2, 1);
 
uint32_t lat = last5pos[0].Longitude;
write_ndigit_number_u (12, 6, (uint16_t)(lat/10000000), 2, 0);
lcd_printp_at (14, 6, PSTR("."), 0);
write_ndigit_number_u (15, 6, (uint16_t)((lat/1000) % 10000), 4, 1);
write_ndigit_number_u (19, 6, (uint16_t)((lat/10) % 100), 2, 1);
 
// while (!get_key_press (1 << KEY_ENTER));
_delay_ms(1000);
timer = TIMEOUT;
lcd_cls();
// return;
 
 
}
else
{
lcd_puts_at(0, 0, strGet(OSD_ERROR), 2);
Show_LastPosition();
BeepTime = 250;
BeepMuster = 0x0080;
}
// }
SwitchToNC();
 
mode = 'O';
 
// disable debug...
// RS232_request_mk_data (0, 'd', 0);
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
 
}
 
 
 
 
//--------------------------------------------------------------
void osd (uint8_t ShowMode)
{
uint8_t flag;
uint8_t tmp_dat;
uint8_t OSD_Mode;
uint8_t info_3D = 0;
 
// Clear statistics
max_Altimeter = 0;
max_GroundSpeed = 0;
max_Distance = 0;
min_UBat = 255;
max_FlyingTime = 0;
 
// flags from last round to check for changes
uint8_t old_FCFlags = 0;
 
uint16_t old_hh = 0;
uint8_t old_AngleNick = 0;
uint8_t old_AngleRoll = 0;
lcd_cls();
OSD_Mode = ShowMode;
 
// if(error == 0)
// lcd_cls();
 
if (hardware == FC)
{
lcd_printp_at(0, 3, PSTR("Only with NC !"), 0);
timer = 100;
while (timer > 0);
 
return;
}
 
SwitchToNC();
 
mode = 'O';
 
// disable debug...
// RS232_request_mk_data (0, 'd', 0);
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
flag = 0;
timer = TIMEOUT;
abo_timer = ABO_TIMEOUT;
 
 
do
{
if (rxd_buffer_locked)
{
timer = TIMEOUT;
Decode64 ();
naviData = (NaviData_t *) pRxData;
 
if(error == 1)
lcd_cls();
 
error = 0;
GPS_Pos_t currpos;
currpos.Latitude = naviData->CurrentPosition.Latitude;
currpos.Longitude = naviData->CurrentPosition.Longitude;
 
if((currpos.Latitude != last5pos[0].Latitude)&&(currpos.Longitude != last5pos[0].Longitude))
{
last5pos[6] = last5pos[5];
last5pos[5] = last5pos[4];
last5pos[4] = last5pos[3];
last5pos[3] = last5pos[2];
last5pos[2] = last5pos[1];
last5pos[1] = last5pos[0];
last5pos[0] = currpos;
}
 
flag = 1;
 
if (OSD_Mode == 1)
{
if (naviData->FCFlags & FCFLAG_MOTOR_RUN)
{ // should be engines running
// motors are on, assume we were/are flying
COSD_FLAGS2 |= COSD_WASFLYING;
}
else
{ // stats
if ((COSD_FLAGS2 & COSD_WASFLYING) | (get_key_press (1 << KEY_ENTER)))
print_statistics ();
 
if (get_key_press (1 << KEY_PLUS))
print_position ();
}
 
lcd_ecircle(22, 35, 16, 1);
 
// Ground Speed
write_ndigit_number_u (1, 0, (uint16_t) (((uint32_t) naviData->GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
lcd_printp_at(4, 0, PSTR("km/h"), 0);
 
// Compass
write_ndigit_number_u (14, 0, naviData->CompassHeading, 3, 0);
lcd_putc (17, 0, 0x1E, 0); // degree symbol
lcd_printp_at (18, 0, (const char *) (pgm_read_word ( &(directions_p[heading_conv(naviData->CompassHeading)]))), 0);
 
draw_compass (12, 1, naviData->CompassHeading);
 
// Altitude
//note:lephisto:according to several sources it's /30
if (naviData->Altimeter > (300 / AltimeterAdjust) || naviData->Altimeter < (-300 / AltimeterAdjust)) // above 10m only write full meters
write_ndigit_number_s (0, 1, naviData->Altimeter / (30 / AltimeterAdjust), 4, 0);
else // up to 10m write meters.dm
write_ndigit_number_s_10th (0, 1, naviData->Altimeter / (3 / AltimeterAdjust), 3, 0);
 
lcd_putc (4, 1, 'm', 0);
 
draw_variometer (54, 7, 10, 14, naviData->Variometer);
 
// TODO: verify correctness
uint16_t heading_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
lcd_ecirc_line (22, 35, 15, old_hh, 0);
old_hh = heading_home;
lcd_ecirc_line (22, 35, 15, heading_home, 1);
 
write_ndigit_number_u (7, 3, heading_home, 3, 0);
lcd_putc (10, 3, 0x1e, 0); // degree symbol
 
write_ndigit_number_u (7, 2, naviData->HomePositionDeviation.Distance / 10, 3, 0);
lcd_putc (10, 2, 'm', 0);
 
// Sats in use
lcd_printp_at(11, 4, PSTR("Sats"), 0);
write_ndigit_number_u (8, 4, naviData->SatsInUse, 2, 0);
 
if (naviData->NCFlags & NC_FLAG_MANUAL_CONTROL)
lcd_putc (19, 4, 'M', 0); // rc transmitter
else
lcd_putc (19, 4, 'X', 0); // clear
 
if (naviData->NCFlags & NC_FLAG_CH)
lcd_printp_at (8, 5, PSTR("Coming Home"), 0);
else if (naviData->NCFlags & NC_FLAG_PH)
lcd_printp_at (8, 5, PSTR("Pos. Hold "), 0);
else // (naviData->NCFlags & NC_FLAG_FREE)
lcd_printp_at (8, 5, PSTR("Free "), 0);
 
// Flying time
write_time (7, 6, naviData->FlyingTime);
lcd_printp_at (12, 6, PSTR("h"), 0);
 
// RC
write_ndigit_number_u (15, 6, naviData->RC_Quality, 3, 0);
lcd_printp_at(18, 6, PSTR("\x1F"), 0); // RC-transmitter
if (naviData->NCFlags & NC_FLAG_NOSERIALLINK)
{
lcd_printpns_at(19, 6, PSTR(" "), 0); // clear
}
else
{
lcd_printpns_at(19, 6, PSTR("PC"), 0);
}
 
// Battery level
write_ndigit_number_u_10th (0, 7, naviData->UBat, 3, 0);
lcd_putc (4, 7, 'V', 0);
 
// Akku Warnung
if (naviData->UBat < MK_LowBat)
{ //Beeper ein
BeepTime = 3000;
BeepMuster = 0x0020;
}
 
//if (naviData->UBat > MK_LowBat+2) //bei kurzzeitigen Schwankungen Beeper erst wieder aus wenn UBat 0,2 V höher als Warnschwelle
//{ //Beeper aus
// BeepTime = 0;
// BeepMuster = 0xFFFF;
//}
// Akku Warnung Ende
 
// Current
write_ndigit_number_u_10th (7, 7, naviData->Current, 3, 0);
lcd_putc (11, 7, 'A', 0);
 
// Capacity
write_ndigit_number_u (14, 7, naviData->UsedCapacity, 4, 0);
lcd_printp_at(18, 7, PSTR("mAh"), 0);
 
// remember statistics (only when engines running)
if (naviData->FCFlags & FCFLAG_MOTOR_RUN)
{
if (naviData->Altimeter > max_Altimeter) max_Altimeter = naviData->Altimeter;
if (naviData->GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData->GroundSpeed;
if (naviData->HomePositionDeviation.Distance > max_Distance) max_Distance = naviData->HomePositionDeviation.Distance;
if (naviData->UBat < min_UBat) min_UBat = naviData->UBat;
if (naviData->FlyingTime > max_FlyingTime) max_FlyingTime = naviData->FlyingTime;
if (naviData->Current > max_Current) max_Current = naviData->Current;
if (naviData->UsedCapacity > max_Capacity) max_Capacity = naviData->UsedCapacity;
}
 
// remember last values
last_RC_Quality = naviData->RC_Quality;
last_UBat = naviData->UBat;
old_FCFlags = naviData->FCFlags;
 
rxd_buffer_locked = FALSE;
}
// 3D Lage anzeige beginnt hier -----------------------------------
else if (OSD_Mode == 3)
{
uint16_t head_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
 
lcd_cls ();
 
lcd_line(0,32,128,32,1); // horizontal //
lcd_line(64,0,64,64,1); // vertical //
lcd_printp_at(12, 7, PSTR("End Info"), 0);
 
 
// 45' Angel
lcd_line(62,11,66,11,1); // -- //
lcd_line(22,30,22,34,1); // | //
lcd_line(106,30,106,34,1); // | //
lcd_line(62,53,66,53,1); // -- //
 
if (info_3D == 1)
{
lcd_line(34,17,36,15,1); // / //
lcd_line(92,15,94,17,1); // \ //
lcd_line(34,47,36,49,1); // \ //
lcd_line(92,49,94,47,1); // / //
 
// lcd_printp_at(9, 0, PSTR("V"), 0);
// lcd_printp_at(0, 3, PSTR("L"), 0);
// lcd_printp_at(20, 3, PSTR("R"), 0);
// lcd_printp_at(9, 7, PSTR("H"), 0);
 
lcd_puts_at(9, 0, strGet(OSD_V), 0);
lcd_puts_at(0, 3, strGet(OSD_L), 0);
lcd_puts_at(20, 3, strGet(OSD_R), 0);
lcd_puts_at(9, 7, strGet(OSD_H), 0);
 
lcd_printp_at(0, 0, PSTR("N:"), 0);
write_ndigit_number_s (2, 0, naviData->AngleNick, 3, 0);
 
lcd_printp_at(0, 7, PSTR("R:"), 0);
write_ndigit_number_s (2, 7, naviData->AngleRoll, 3, 0);
 
lcd_printp_at(15, 0, PSTR("K:"), 0);
write_ndigit_number_s (18, 0,head_home, 3, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
info_3D++;
if (info_3D > 1)
info_3D = 0;
}
 
uint8_t Nick = ((-naviData->AngleNick/2)+32);
uint8_t Roll = -naviData->AngleRoll+64;
lcd_ecircle(old_AngleRoll,old_AngleNick, 10, 0);
lcd_ecirc_line (old_AngleRoll, old_AngleNick, 9, old_hh, 0);
 
lcd_ecircle(Roll, Nick, 10, 1);
lcd_ecirc_line (Roll, Nick, 9, head_home, 1);
 
old_hh = head_home;
old_AngleNick = Nick;
old_AngleRoll = Roll;
// remember last values
last_RC_Quality = naviData->RC_Quality;
last_UBat = naviData->UBat;
old_FCFlags = naviData->FCFlags;
rxd_buffer_locked = FALSE;
}
 
if (!abo_timer)
{ // renew abo every 3 sec
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
abo_timer = ABO_TIMEOUT;
}
}
if (!timer)
{
OSD_Timeout(flag);
flag = 0;
}
}
 
while (!get_key_press (1 << KEY_ESC));
// while (!get_key_press (1 << KEY_ESC) && timer);
// get_key_press(KEY_ALL);
//
//
// // disable OSD Data from NC
// // RS232_request_mk_data (1, 'o', 0);
// tmp_dat = 0;
// SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
//
// mode = 0;
// rxd_buffer_locked = FALSE;
//
//
// // Bei Verbindungsverlusst werden hier die letzten bekannten Koordinaten ausgegeben!!!
// if (!timer)
// { // timeout occured
// if (flag)
// {
// // Falls Spannungswarnung an war Beeper aus//
// BeepTime = 0;
// BeepMuster = 0xFFFF;
//
// lcd_cls ();
// WriteLastPosition(last5pos[0].Longitude,last5pos[0].Latitude); // im EEprom speichern
// lcd_puts_at(0, 0, strGet(OSD_ERROR), 2);
//
//// lcd_printp_at (0, 0, PSTR(" ERROR: Datenverlust "), 2);
//
//// lcd_printp_at (0, 2, PSTR("Letzte bekannte"), 0);
//// lcd_printp_at (0, 3, PSTR("Position gespeichert."), 0);
// lcd_puts_at(0, 2, strGet(OSD_POS1), 0);
// lcd_puts_at(0, 3, strGet(OSD_POS2), 0);
//// lcd_printp_at (19, 7, PSTR("OK"), 0);
// lcd_puts_at(19, 7, strGet(OK), 0);
//// lcd_printp_at (0, 5, PSTR(" Breitengr Längengr "), 0);
//
// lcd_puts_at(0, 5, strGet(START_LASTPOS1), 0);
//
// lcd_puts_at(12, 7, strGet(ENDE), 0);
//
// BeepTime = 1500;
// BeepMuster = 0x0040;
// error = 1;
//
// uint32_t lon = last5pos[0].Longitude;
// write_ndigit_number_u (1, 6, (uint16_t)(lon/10000000), 2, 0);
// lcd_printp_at (3, 6, PSTR("."), 0);
// write_ndigit_number_u (4, 6, (uint16_t)((lon/1000) % 10000), 4, 1);
// write_ndigit_number_u (8, 6, (uint16_t)((lon/10) % 100), 2, 1);
//
// uint32_t lat = last5pos[0].Latitude;
// write_ndigit_number_u (12, 6, (uint16_t)(lat/10000000), 2, 0);
// lcd_printp_at (14, 6, PSTR("."), 0);
// write_ndigit_number_u (15, 6, (uint16_t)((lat/1000) % 10000), 4, 1);
// write_ndigit_number_u (19, 6, (uint16_t)((lat/10) % 100), 2, 1);
//
// while (!get_key_press (1 << KEY_ENTER));
//
// timer = TIMEOUT;
// lcd_cls();
// return;
//
// }
// }
}
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/osd.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _OSD_H
#define _OSD_H
 
void osd (uint8_t ShowMode);
void vario_beep_output (void);
void OSD_Timeout(uint8_t flag);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/parameter.c
0,0 → 1,1384
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
 
#include "main.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#include "mk-data-structs.h"
#include "parameter.h"
#include "menu.h"
#include "eeprom.h"
#include "parameter_names.h"
#include "messages.h"
 
#define TIMEOUT 500 // 5 sec
 
uint8_t display_settings_menu (void);
uint8_t display_param_menu (uint8_t);
uint8_t load_setting (uint8_t);
uint8_t write_setting (uint8_t);
uint8_t display_section_menu(void);
void edit_param(uint8_t);
void copy_setting(void);
 
 
mk_param_struct_t *mk_param_struct;
 
uint8_t ii;
volatile uint8_t offset = 0;
volatile uint8_t dmode = 0;
volatile uint8_t target_pos = 1;
volatile uint8_t offset2 = 0;
volatile uint8_t pmode = 0;
volatile uint8_t target_pos2 = 1;
volatile uint8_t setting = 0;
uint8_t changes = 0;
 
#define OFFSETOF(type, field) ((unsigned int) &(((type *) 0)->field))
 
#define MKOSO(field) (uint8_t)OFFSETOF(mk_param_struct_t, field)
 
 
 
//--------------------------------------------------------------
// Group, Typ, Min, Max, Struct-Name(Value), Default1, Default2, Default3+4+5,
// 0 1 2 3 4 5 6 7
// |||
// Typ == (0 ohne Poti, 1 mit Poti, 2 bitfield, 3 serCh, 4 LEDmask, 5 Angle, 6 Empfaenger),
//
prog_uchar param_config[8*PARAM_COUNT]=
{
// group 0 (kanaele) 1-15
 
0,0,1,12, MKOSO(Kanalbelegung)+2 , 1,1,1, // gas
0,0,1,12, MKOSO(Kanalbelegung)+3 , 4,4,4, // gier
0,0,1,12, MKOSO(Kanalbelegung)+0 , 3,3,3, // nick
0,0,1,12, MKOSO(Kanalbelegung)+1 , 2,2,2, // roll
0,3,1,25, MKOSO(Kanalbelegung)+4 , 5,5,5, // poti1
0,3,1,25, MKOSO(Kanalbelegung)+5 , 6,6,6, // poti2
0,3,1,25, MKOSO(Kanalbelegung)+6 , 7,7,7, // poti3
0,3,1,25, MKOSO(Kanalbelegung)+7 , 8,8,8, // poti4
0,3,1,25, MKOSO(Kanalbelegung)+8 , 9,9,9, // poti5
0,3,1,25, MKOSO(Kanalbelegung)+9 , 10,10,10, // poti6
0,3,1,25, MKOSO(Kanalbelegung)+10, 11,11,11, // poti7
0,3,1,25, MKOSO(Kanalbelegung)+11, 12,12,12, // poti8
0,0,0,12, MKOSO(MotorSafetySwitch), 0,0,0, // Motor Sicherungsswitch
0,2,0,0x04, MKOSO(ExtraConfig), 0,0,0, // erweiterte signal pruefung
0,6,0,6, MKOSO(Receiver), 1,1,1,
 
 
// group 1 (main) 16-23
 
1,2,0,0x01, MKOSO(GlobalConfig), 0,0,0, // hoehenregler
1,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
1,2,0,0x08, MKOSO(GlobalConfig), 1,1,1, // kompass
1,2,0,0x10, MKOSO(GlobalConfig), 0,0,0, // feste ausrichtung
1,2,0,0x04, MKOSO(ExtraConfig), 0,0,0, // erweiterte signal pruefung
1,2,0,0x40, MKOSO(GlobalConfig), 1,1,1, // achsentkopplung
1,2,0,0x80, MKOSO(GlobalConfig), 0,0,0, // drehratenbregrenzung
1,2,0,0x04, MKOSO(GlobalConfig), 0,0,0, // heading hold
 
 
 
// group 2 (stick) 24-27
 
2,0,0,20, MKOSO(Stick_P), 10,8,6,
2,0,0,20, MKOSO(Stick_D), 16,16,10,
2,1,0,255, MKOSO(StickGier_P), 6,6,4,
2,1,0,255, MKOSO(ExternalControl), 0,0,0,
 
 
// group3 : looping 28-36
 
3,2,0,0x01, MKOSO(BitConfig), 0,0,0, // oben
3,2,0,0x02, MKOSO(BitConfig), 0,0,0, // unten
3,2,0,0x04, MKOSO(BitConfig), 0,0,0, // links
3,2,0,0x08, MKOSO(BitConfig), 0,0,0, // rechts
3,1,0,255, MKOSO(LoopGasLimit), 50,50,50,
3,0,0,247, MKOSO(LoopThreshold), 90,90,90,
3,0,0,247, MKOSO(LoopHysterese), 50,50,50,
3,0,0,247, MKOSO(WinkelUmschlagNick), 78,78,78,
3,0,0,247, MKOSO(WinkelUmschlagRoll), 78,78,78,
 
 
// group 4 (hoehe) 37-50
 
4,2,0,0x01, MKOSO(GlobalConfig), 0,0,0, // hoehenrelger
4,2,0,0x01, MKOSO(ExtraConfig), 0,0,0, // vario oder hoeenbergenzung
4,2,0,0x02, MKOSO(GlobalConfig), 1,1,1, // hoehenschalter
4,2,0,0x02, MKOSO(ExtraConfig), 1,1,1, // variobeep
4,1,0,255, MKOSO(MaxHoehe), 255,255,255,
4,0,0,247, MKOSO(Hoehe_MinGas), 30,30,30,
4,1,0,255, MKOSO(Hoehe_P), 15,15,15,
4,1,0,255, MKOSO(Luftdruck_D), 30,30,30,
4,1,0,255, MKOSO(Hoehe_ACC_Wirkung), 0,0,0,
4,1,0,255, MKOSO(MaxAltitude), 150,150,150,
4,0,0,247, MKOSO(Hoehe_Verstaerkung), 15,15,15,
4,0,0,247, MKOSO(Hoehe_HoverBand), 8,8,8,
4,1,0,255, MKOSO(Hoehe_GPS_Z), 64,64,64,
4,0,0,160, MKOSO(Hoehe_StickNeutralPoint), 0,0,0,
 
 
// group 5 : kamera 51-66
 
5,1,0,255, MKOSO(ServoNickControl), 128,128,128,
5,0,0,247, MKOSO(ServoNickComp), 50,50,50,
5,2,0,0x01, MKOSO(ServoCompInvert), 0,0,0, // nick
5,0,0,247, MKOSO(ServoNickMin), 15,15,15,
5,0,0,247, MKOSO(ServoNickMax), 230,230,230,
5,1,0,255, MKOSO(ServoRollControl), 128,128,128,
5,0,0,247, MKOSO(ServoRollComp), 85,85,85,
5,2,0,0x02, MKOSO(ServoCompInvert), 0,0,0, // roll
5,0,0,247, MKOSO(ServoRollMin), 70,70,70,
5,0,0,247, MKOSO(ServoRollMax), 220,220,220,
5,0,2,8, MKOSO(ServoNickRefresh), 4,4,4,
5,0,0,247, MKOSO(ServoManualControlSpeed), 60,60,60,
5,5,0,247, MKOSO(CamOrientation), 0,0,0,
5,1,0,255, MKOSO(Servo3), 125,125,125,
5,1,0,255, MKOSO(Servo4), 125,125,125,
5,1,0,255, MKOSO(Servo5), 125,125,125,
 
 
// group 6 : navictrl 67-85
 
6,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
6,1,0,255, MKOSO(NaviGpsModeControl), 254,254,254,
6,1,0,255, MKOSO(NaviGpsGain), 100,100,100,
6,0,0,247, MKOSO(NaviStickThreshold), 8,8,8,
6,0,0,247, MKOSO(NaviGpsMinSat), 6,6,6,
6,1,0,255, MKOSO(NaviGpsP), 90,90,90,
6,1,0,255, MKOSO(NaviGpsI), 90,90,90,
6,1,0,255, MKOSO(NaviGpsD), 90,90,90,
6,1,0,255, MKOSO(NaviGpsPLimit), 75,75,75,
6,1,0,255, MKOSO(NaviGpsILimit), 85,85,85,
6,1,0,255, MKOSO(NaviGpsDLimit), 75,75,75,
6,1,0,255, MKOSO(NaviGpsACC), 0,0,0,
6,1,0,255, MKOSO(NaviWindCorrection), 90,90,90,
6,1,0,255, MKOSO(NaviAccCompensation), 42,42,42,
6,1,0,255, MKOSO(NaviOperatingRadius), 245,245,245,
6,1,0,255, MKOSO(NaviAngleLimitation), 140,140,140,
6,0,0,247, MKOSO(NaviPH_LoginTime), 5,5,5,
6,2,0,0x20, MKOSO(ExtraConfig), 0,0,0, // dynamic ph
6,0,0,247, MKOSO(ComingHomeAltitude), 0,0,0,
 
 
// group 7 : ausgaenge 86-95
 
7,4,0,255, MKOSO(J16Bitmask), 95,95,95,
7,1,0,255, MKOSO(J16Timing), 20,20,20,
7,2,0,0x20, MKOSO(BitConfig), 0,0,0, // Motor_Off_Led1
7,2,0,0x10, MKOSO(BitConfig), 1,1,1, // Motor_Blink1
7,4,0,255, MKOSO(J17Bitmask), 243,243,243,
7,1,0,255, MKOSO(J17Timing), 20,20,20,
7,2,0,0x40, MKOSO(BitConfig), 0,0,0, // Motor_Off_Led2
7,2,0,0x80, MKOSO(BitConfig), 1,1,1, // Motor_Blink2
7,4,0,255, MKOSO(WARN_J16_Bitmask), 170,170,170,
7,4,0,255, MKOSO(WARN_J17_Bitmask), 170,170,170,
 
 
// group 8 : versch. 96-107
 
8,0,0,247, MKOSO(Gas_Min), 8,8,8,
8,0,0,247, MKOSO(Gas_Max), 230,230,230,
8,1,0,255, MKOSO(KompassWirkung), 64,64,64,
8,1,0,255, MKOSO(CareFreeModeControl), 0,0,0, // Carefree
8,2,0,0x40, MKOSO(ExtraConfig), 0,0,0, // teachable Carefree
8,0,0,247, MKOSO(UnterspannungsWarnung), 33,33,33,
8,2,0,0x08, MKOSO(ExtraConfig), 0,0,0, // Voltage referenz
8,0,0,247, MKOSO(NotGasZeit), 90,90,90,
8,0,0,247, MKOSO(NotGas), 45,45,45,
8,0,0,247, MKOSO(FailSafeTime), 0,0,0,
8,2,0,0x80, MKOSO(ExtraConfig), 0,0,0, // Ignore Compass Error
8,2,0,0x10, MKOSO(ExtraConfig), 0,0,0, // Kein Summer ohne Sender beim Start
 
 
// group 9 : gyro 108-120
 
9,1,0,255, MKOSO(Gyro_P), 90,100,100,
9,1,0,255, MKOSO(Gyro_I), 120,120,120,
9,1,0,255, MKOSO(Gyro_D), 10,10,10,
9,1,0,255, MKOSO(Gyro_Gier_P), 90,100,100,
9,1,0,255, MKOSO(Gyro_Gier_I), 120,120,120,
9,1,0,255, MKOSO(DynamicStability), 70,70,70,
9,2,0,0x80, MKOSO(GlobalConfig), 0,0,0, // drehratenbregrenzung
9,0,0,247, MKOSO(GyroAccFaktor), 27,27,27,
9,0,0,247, MKOSO(GyroAccAbgleich), 32,32,32,
9,1,0,255, MKOSO(I_Faktor), 16,16,16,
9,0,0,247, MKOSO(Driftkomp), 0,0,0,
9,0,0,16, MKOSO(Gyro_Stability), 6,6,6,
9,0,0,247, MKOSO(MotorSmooth), 0,0,0,
 
 
// group 10: benutzer 121-128
 
10,1,0,255, MKOSO(UserParam1), 0,0,0,
10,1,0,255, MKOSO(UserParam2), 0,0,0,
10,1,0,255, MKOSO(UserParam3), 0,0,0,
10,1,0,255, MKOSO(UserParam4), 0,0,0,
10,1,0,255, MKOSO(UserParam5), 0,0,0,
10,1,0,255, MKOSO(UserParam6), 0,0,0,
10,1,0,255, MKOSO(UserParam7), 0,0,0,
10,1,0,255, MKOSO(UserParam8), 0,0,0,
 
 
// group 11: achskoppl 129-132
 
11,2,0,0x40, MKOSO(GlobalConfig), 0,0,0, // achsentkopplung
11,1,0,255, MKOSO(AchsKopplung1), 90,90,90,
11,1,0,255, MKOSO(AchsKopplung2), 55,55,55,
11,1,0,255, MKOSO(CouplingYawCorrection), 70,70,70,
 
 
// group 12: mixer 133
 
12,5,0,23,MKOSO(OrientationAngle), 0,0,0,
 
// group 13 (easy-setup) 134-144
 
13,2,0,0x01, MKOSO(GlobalConfig), 0,0,0, // hoehenrelger
13,1,0,255, MKOSO(MaxHoehe), 255,255,255,
13,0,0,160, MKOSO(Hoehe_StickNeutralPoint), 0,0,0,
13,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
13,1,0,255, MKOSO(NaviGpsModeControl), 254,254,254,
13,2,0,0x20, MKOSO(ExtraConfig), 0,0,0, // dynamic ph
13,0,0,247, MKOSO(ComingHomeAltitude), 0,0,0,
13,1,0,255, MKOSO(CareFreeModeControl), 0,0,0, // Carefree
13,2,0,0x40, MKOSO(ExtraConfig), 0,0,0, // teachable Carefree
13,0,0,12, MKOSO(MotorSafetySwitch), 0,0,0, // Motor Sicherungsswitch
13,5,0,23, MKOSO(OrientationAngle), 0,0,0,
 
};
 
 
//--------------------------------------------------------------
#define ITEMS_RX 7
 
prog_char param_items_rx[ITEMS_RX][17]= // zeilen,zeichen+1
{
"PPM ",
"Spektrum ",
"Spektrum HiRes ",
"Spektrum LoRes ",
"Jeti ",
"ACT DSL ",
"HOTT ",
};
 
 
 
 
 
//--------------------------------------------------------------
void edit_parameter(void)
{
SwitchToFC();
 
 
// uint8_t setting;
 
 
setting = display_settings_menu();
 
if(setting == 255)
return;
 
if(setting == 6)
{
copy_setting();
return;
}
 
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" Setting x "), 2);
lcd_puts_at(0, 0, strGet(PARA_SETTINGS), 2);
lcd_putc (9, 0, (setting + 48), 2); // ASCII ab 48 (hex 30) beginnt 0 - 9
// lcd_printp_at (3, 2, PSTR("ändern"), 0);
// lcd_printp_at (3, 3, PSTR("aktivieren"), 0);
lcd_puts_at(3, 2, strGet(PARA_CHANGE), 0);
lcd_puts_at(3, 3, strGet(PARA_AKTIVI), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
uint8_t val = menu_choose2 (2, 3, 2, 0, 0);
if (val == 255)
return;
if(val == 3)
{
load_setting(setting);
uint8_t setting_written = write_setting(setting);
if(setting_written == setting)
{
lcd_cls_line (0,2,21);
lcd_cls_line (0,3,21);
// lcd_printp_at (11, 0, PSTR("aktiviert"), 0);
lcd_puts_at(11, 0, strGet(PARA_AKTIV), 0);
}
else
{
lcd_cls_line (0,2,21);
lcd_cls_line (0,3,21);
// lcd_printp_at (0, 4, PSTR("Error"), 0);
lcd_puts_at(0, 4, strGet(FEHLER), 0);
}
_delay_ms(2000);
return;
}
 
if(setting == 255)
return;
 
uint8_t setting_loaded = load_setting(setting);
if(setting_loaded == 255)
return;
 
offset = 0;
dmode = 0;
target_pos = 1;
changes =0;
uint8_t group =0;
 
do
{
group = display_section_menu();
if(group != 255)
{
offset2 = 0;
pmode = 0;
target_pos2 = 1;
uint8_t param;
do
{
param = display_param_menu(group);
if(param != 255)
{
edit_param(param);
}
}
while(param != 255);
}
}
while(group != 255);
 
if(changes == 1)
{
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" Setting x speichern?"), 2);
lcd_puts_at(0, 0, strGet(PARA_SAVESETT), 2);
lcd_putc (9, 0, (setting + 48), 2); // ASCII ab 48 (hex 30) beginnt 0 - 9
write_ndigit_number_u(9, 0, setting, 1, 0);
// lcd_printp_at (3, 2, PSTR("Ja"), 0);
// lcd_printp_at (3, 3, PSTR("Nein"), 0);
 
lcd_puts_at(3, 2, strGet(YES), 0);
lcd_puts_at(3, 3, strGet(NOO), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
uint8_t val = menu_choose2 (2, 3, 2, 0, 0);
if(val == 2)
{
uint8_t setting_written = write_setting(setting);
if(setting_written == setting)
{
// lcd_printp_at (3, 4, PSTR("Gespeichert und"), 0);
lcd_puts_at(3, 4, strGet(PARA_SETTSAVED), 0);
// lcd_printp_at (3, 5, PSTR("Aktiviert"), 0);
lcd_puts_at(3, 5, strGet(PARA_AKTIV), 0);
}
else
{
// lcd_printp_at (0, 4, PSTR("Error"), 0);
lcd_puts_at(0, 4, strGet(FEHLER), 0);
}
timer = 100;
while (timer > 0);
 
}
}
}
 
 
//--------------------------------------------------------------
void copy_setting(void)
{
uint8_t fromsetting = 3;
uint8_t tosetting = 5;
 
lcd_cls();
 
// lcd_printp_at (0, 1, PSTR("Kopiere Setting"), 0);
// lcd_printp_at (0, 3, PSTR("von x nach y"), 0);
// lcd_printp_at (0, 7, PSTR("von nach Ende OK"), 0);
 
lcd_puts_at(0, 1, strGet(PARA_COPY), 0);
lcd_puts_at(0, 3, strGet(PARA_FROMTO), 0);
lcd_puts_at(0, 7, strGet(PARA_ENDE), 0);
 
do
{
write_ndigit_number_u(5,3,fromsetting, 1,0);
write_ndigit_number_u(14,3,tosetting, 1,0);
 
if(get_key_press (1 << KEY_MINUS))
{
fromsetting++;
if(fromsetting == 6) fromsetting = 1;
}
if(get_key_press (1 << KEY_PLUS))
{
tosetting++;
if(tosetting == 6) tosetting = 1;
}
if(get_key_press (1 << KEY_ENTER))
{
lcd_printp_at (0, 5, PSTR("Wirklich Kopieren?"), 0);
lcd_puts_at(0, 5, strGet(PARA_COPYQ), 0);
// lcd_printp_at (0, 7, PSTR(" Ende OK"), 0);
lcd_puts_at(12, 7, strGet(KEYLINE4), 0);
do
{
if(get_key_press (1 << KEY_ENTER))
{
uint8_t loaded = load_setting(fromsetting);
if(loaded == fromsetting)
{
uint8_t written = write_setting(tosetting);
if(written == tosetting)
{
lcd_printp_at (0, 5, PSTR("Kopiert und Aktiviert"), 0);
lcd_puts_at(0, 5, strGet(PARA_COPYACTIV), 0);
}
else
{
// lcd_printp_at (0, 5, PSTR("Fehler"), 0);
lcd_puts_at(0, 5, strGet(FEHLER), 0);
lcd_cls_line (6, 5, 14);
}
}
else
{
// lcd_printp_at (0, 5, PSTR("Fehler"), 0);
lcd_puts_at(0, 5, strGet(FEHLER), 0);
lcd_cls_line (6, 5, 14);
}
timer = 100;
while (timer > 0);
return;
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
lcd_cls_line (0, 5, 21);
// lcd_printp_at (0, 7, PSTR("von nach Ende OK"), 0);
lcd_puts_at(0, 7, strGet(PARA_ENDE), 0);
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
 
//--------------------------------------------------------------
void edit_param(uint8_t param)
{
lcd_cls();
uint8_t type = pgm_read_byte(param_config+(8*param)+1);
// lcd_printp_at (0, 0, PSTR(" Ändere Setting: "), 2);
lcd_puts_at(0, 0, strGet(PARA_CHANGESETT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
if(type != 6)
lcd_printp_at(0,2,param_names[param][DisplayLanguage], 0);
 
 
//-------------------------------------------------------
if(type == 0) // ohne poti
{
lcd_printp_at (4, 4, PSTR("( - ) (d: )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
write_ndigit_number_u (5, 4, min, 3, 0);
write_ndigit_number_u (9, 4, max, 3, 0);
write_ndigit_number_u (17, 4, defaultvalue, 3, 0);
 
do
{
write_ndigit_number_u (0, 4, newvalue, 3, 0);
lcd_frect ((8*0), (8*5), (newvalue * (16*8) / max), 6, 1);
 
if(max >= 50)
{
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 3))
{
if((newvalue-1) >= min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
else
{
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
if((newvalue-1) >= min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
 
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 1) // mit poti
{
lcd_printp_at (4, 4, PSTR("(0-247-P8)(d:Po )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
uint8_t mode = 0;
 
if(defaultvalue > 247)
{
lcd_printp_at (17, 4, PSTR("Po )"), 0);
write_ndigit_number_u (19, 4, 256-defaultvalue, 1, 0);
}
else
write_ndigit_number_u (17, 4, defaultvalue, 3, 0);
 
if(value > 247)
mode = 1;
 
do
{
if(newvalue > 247)
mode = 1;
else
mode = 0;
 
if(mode == 0)
{
write_ndigit_number_u (0, 4, newvalue, 3, 0);
lcd_frect ((8*0), (8*5), (newvalue * (16*8) / max), 6, 1);
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
if((newvalue+1) <= max)
newvalue++;
 
if(newvalue > 247)
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = 255;
}
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 3))
{
if((newvalue-1)>=min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
else
{
lcd_printp_at (0, 4, PSTR("Po"), 0);
write_ndigit_number_u (2, 4, 256 - newvalue, 1, 0);
lcd_frect ((8*0), (8*5), ((256 - newvalue) * (16*8) / 8), 6, 1);
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if(newvalue - 1 > 247)
{
newvalue--;
}
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
lcd_frect (((255 - newvalue) * (16*8) / 8), (8*5), (16*8), 6, 0);
// lcd_frect (((255 - newvalue) * (16*8) / 8), (8*5), ((16*8) / 8), 6, 0);
newvalue++;
 
if(newvalue == 0)
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0); // balken löschen
newvalue = 247;
}
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 2) // ja/nein
{
// lcd_printp_at (3, 4, PSTR("Ja"), 0);
// lcd_printp_at (3, 5, PSTR("Nein"), 0);
lcd_puts_at(3, 4, strGet(YES), 0);
lcd_puts_at(3, 5, strGet(NOO), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
uint8_t bitmap = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
if(defaultvalue == 1)
lcd_printp_at (8, 4, PSTR("*"), 0);
if(defaultvalue == 0)
lcd_printp_at (8, 5, PSTR("*"), 0);
 
do
{
if(newvalue & bitmap)
{
lcd_printp_at (1, 4, PSTR("\x1d"), 0);
lcd_printp_at (1, 5, PSTR(" "), 0);
}
else
{
lcd_printp_at (1, 4, PSTR(" "), 0);
lcd_printp_at (1, 5, PSTR("\x1d"), 0);
}
 
if((get_key_press (1 << KEY_MINUS)) && (!(newvalue & bitmap)))
newvalue ^= bitmap;
 
if((get_key_press (1 << KEY_PLUS)) && (newvalue & bitmap))
newvalue ^= bitmap;
 
if(get_key_press (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 3) // serCH
{
lcd_printp_at (4, 4, PSTR("(1-S12/W) (d: )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
write_ndigit_number_u (17, 4, defaultvalue, 3, 0);
 
do
{
if (newvalue<=(max-13))
write_ndigit_number_u (0, 4, newvalue, 3, 0);
else
{
if (newvalue<=(max-1))
{
lcd_printp_at (0, 4, PSTR("S"), 0);
write_ndigit_number_u (1, 4, (newvalue-12), 2, 0);
}
}
if (newvalue==max)
lcd_printp_at (0, 4, PSTR("WPE"), 0);
 
lcd_frect ((8*0), (8*5), (newvalue * (16*8)) / max, 6, 1);
 
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
if((newvalue-1)>=min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
newvalue--;
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 4) // led bitfeld
{
// TODO: Übersetzung
lcd_printp_at (0, 7, PSTR(" \x19 0\x11I Ende OK"), 0);
 
if (param == 93 || param == 94)
// lcd_printp_at (5, 6, PSTR("aktiv"), 0);
lcd_puts_at(5, 6, strGet(AKTIV), 0);
 
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t newvalue = value;
uint8_t pos = 0;
 
do
{
 
for(ii = 0; ii < 8; ii++)
{
if(newvalue & (1 << ii))
lcd_printp_at (8-ii, 4,PSTR("1"),0);
else
lcd_printp_at (8-ii, 4,PSTR("0"),0);
}
lcd_printp_at (pos+1, 5,PSTR("\x12"),0);
 
if(get_key_press (1 << KEY_MINUS))
{
lcd_printp_at (pos+1, 5,PSTR(" "),0);
pos++;
if(pos == 8)
pos = 0;
}
 
if (param == 93 || param == 94)
{
if(get_key_long (1 << KEY_PLUS))
{
if (newvalue != 0)
newvalue = 0;
else
newvalue = 170;
}
}
 
if(get_key_short (1 << KEY_PLUS))
newvalue ^= (1<<(7-pos));
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes = 1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 5) // Angle
{
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
 
lcd_ecircle(102, 35, 16, 1);
 
uint8_t newvalue = value;
uint8_t oldvalue = newvalue;
do
{
 
if(oldvalue != newvalue) lcd_ecirc_line (102, 35, 15, oldvalue*15, 0);
oldvalue = newvalue;
lcd_ecirc_line (102, 35, 15, newvalue*15, 1);
 
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
newvalue++;
if(newvalue == 24)
newvalue = 0;
}
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if(newvalue == 0)
newvalue = 24;
newvalue--;
}
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 6) // receiver
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
 
uint8_t newvalue = value + 1;
uint8_t val =0;
uint8_t ii = 0;
uint8_t offset = 0;
uint8_t dmode = 0;
uint8_t target_pos = 1;
 
uint8_t size = ITEMS_RX;
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
lcd_printp_at(3,ii+1,param_items_rx[ii+offset], 0);
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
}
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose3 (1, 5, target_pos,0,1); //menu_choose3 (min, max, start, return_at_start, return_at_end)
else
val = menu_choose3 (1, size, target_pos,0,0);
}
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose3 (2, 6, target_pos,1,0);
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
if(val == 254) // überlauf unten
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253) // überlauf oben
{
offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 252) // ESC
return;
else if(val <= size)
{
newvalue = val + offset - 1;
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
return;
}
}
}
}
 
 
//--------------------------------------------------------------
uint8_t display_param_menu(uint8_t group)
{
uint8_t items[20];
 
uint8_t size=0;
for(ii = 0;ii < PARAM_COUNT; ii++)
{
if(pgm_read_byte(param_config+(8*ii)) == (group-1))
{
items[size] = ii;
size++;
}
}
 
uint8_t val =0 ;
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wähle Parameter: "), 2);
lcd_puts_at(0, 0, strGet(PARA_SELECT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
ii = 0;
if(offset2 > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset2) < size)
{
lcd_printp_at(3,ii+1,param_names[items[ii+offset2]][DisplayLanguage], 0);
// this reads the the offset in the struct from the pgm configuration table and then reads the value from the struct
 
uint8_t type = pgm_read_byte(param_config+(8*items[ii+offset2])+1);
 
if(type == 0)
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0);
 
if(type == 1)
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
 
if(value < 248)
write_ndigit_number_u (18, ii+1, value, 3, 0);
 
if(value >= 248)
{
lcd_printp_at (18, ii+1, PSTR(" P"), 0);
write_ndigit_number_u (20, ii+1, 256-value, 1, 0);
}
}
 
if(type == 2)
{
 
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
uint8_t bitmap = pgm_read_byte(param_config+(8*items[ii+offset2])+3);
if(value & bitmap)
lcd_printp_at (18, ii+1, PSTR(" J"), 0);
else
lcd_printp_at (18, ii+1, PSTR(" N"), 0);
 
}
 
if(type == 3)
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
if (value<=12)
write_ndigit_number_u (18, ii+1, value, 3, 0);
else
if (value<=(24))
{
lcd_printp_at (18, ii+1, PSTR("S"), 0);
write_ndigit_number_u (19, ii+1, (value-12), 2, 0);
}
 
if (value==25)
lcd_printp_at (18, ii+1, PSTR("WPE"), 0);
 
}
 
if(type == 4)
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0);
 
if(type == 5)
write_ndigit_number_u (18, ii+1, (*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)))*15, 3, 0);
 
if(type == 6) // Empfänger Typ
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
 
if(value == 0)
lcd_printp_at (18, ii+1, PSTR("PPM"), 0);
else if(value == 1)
lcd_printp_at (18, ii+1, PSTR("Spe"), 0);
else if(value == 2)
lcd_printp_at (18, ii+1, PSTR("SpH"), 0);
else if(value == 3)
lcd_printp_at (18, ii+1, PSTR("SpL"), 0);
else if(value == 4)
lcd_printp_at (18, ii+1, PSTR("Jet"), 0);
else if(value == 5)
lcd_printp_at (18, ii+1, PSTR("ACT"), 0);
else if(value == 6)
lcd_printp_at (18, ii+1, PSTR("HoT"), 0);
else
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0);
 
}
}
 
if((ii == 5)&&(ii+offset2 < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(pmode == 0)
{
if(offset2 == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos2,0,1);
else
val = menu_choose2 (1, size, target_pos2,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos2,1,1);
 
}
if(pmode == 1)
{
if(offset2+7 > size)
val = menu_choose2 (2, 6, target_pos2,1,0);
else
val = menu_choose2 (2, 5, target_pos2,1,1);
 
}
 
if(val == 254)
{
offset2++;
pmode = 1;
target_pos2 = 5;
}
else if(val == 253)
{
offset2--;
pmode = 0;
target_pos2 = 2;
}
else
break;
 
}
 
if(val != 255)
{
target_pos2=val;
return items[val+offset2-1];
}
else
return val;
 
}
 
 
//--------------------------------------------------------------
uint8_t display_section_menu(void)
{
uint8_t size = PAGES;
 
uint8_t val =0;
 
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wähle Seite: "), 2);
lcd_puts_at(0, 7, strGet(PARA_SEITE),2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
lcd_printp_at(3,ii+1,param_pages[ii+offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
 
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
 
if(val == 254)
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
offset--;
dmode = 0;
target_pos = 2;
}
else
break;
 
}
 
if(val != 255)
{
target_pos=val;
return val+offset;
}
else
return val;
 
}
 
 
//--------------------------------------------------------------
uint8_t display_settings_menu (void)
{
uint8_t status;
 
lcd_cls ();
 
// lcd_printp_at (0, 0, PSTR(" Wähle Setting: "), 2);
lcd_puts_at(0, 0, strGet(PARA_SELSETT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
 
for(setting=1;setting<6;setting++)
{
status = load_setting(setting);
if(status == 255)
return 255;
 
write_ndigit_number_u (3, setting, status, 1, 0);
lcd_print_at (5,setting,(uint8_t*)mk_param_struct->Name, 0);
}
// lcd_printp_at (3, 6, PSTR("Kopiere Setting"), 0);
lcd_puts_at(3, 6, strGet(PARA_COPY), 0);
 
status = load_setting(0xff);
if(status == 255)
return 255;
 
setting = menu_choose (1, 6, 1,status);
 
return setting;
}
 
 
//--------------------------------------------------------------
uint8_t load_setting(uint8_t setting)
{
mode = 'Q'; // Settings
uint8_t timeout = 50;
rxd_buffer_locked = FALSE;
 
while (!rxd_buffer_locked && timeout)
{
SendOutData ('q', ADDRESS_FC, 1, &setting, 1);
// _delay_ms(50);
timer = 20;
while (timer > 0);
timeout--;
}
 
if (timeout != 0)
{
Decode64 ();
setting = *pRxData;
mk_param_struct = (mk_param_struct_t *) (pRxData + 1) ;
}
else
{ // timeout occured
// lcd_printp_at (0, 2, PSTR("Fehler: keine Daten"), 0);
lcd_puts_at(0, 2, strGet(OSD_ERROR), 0);
timer = 100;
while (timer > 0);
setting = 255;
}
return setting;
}
 
 
//--------------------------------------------------------------
uint8_t write_setting(uint8_t setting)
{
mode = 'S'; // Settings
uint8_t timeout = 50;
rxd_buffer_locked = FALSE;
 
while (!rxd_buffer_locked && timeout)
{
SendOutData ('s', ADDRESS_FC, 2, &setting, 1, mk_param_struct, sizeof(mk_param_struct_t));
// _delay_ms(50);
timer = 20;
while (timer > 0);
timeout--;
}
 
if (timeout != 0)
{
Decode64 ();
setting = *pRxData;
}
else // timeout occured
{
// lcd_printp_at (0, 2, PSTR("Fehler: keine Daten"), 0);
lcd_puts_at(0, 2, strGet(OSD_ERROR), 0);
timer = 100;
while (timer > 0);
setting = 255;
}
 
return setting;
}
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/parameter.h
0,0 → 1,46
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _PARAMETER_H
#define _PARAMETER_H
 
 
void edit_parameter (void);
uint8_t load_setting(uint8_t setting);
 
 
 
#endif
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/parameter_names.h
0,0 → 1,267
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#define PAGES 14
#define PARAM_COUNT 144
#define PARAM_LENGTH 15
#define PARAM_NUM_LANG 4
 
// German Englisch Franzïösisch Holländisch
 
prog_char param_pages[PAGES][PARAM_NUM_LANG][PARAM_LENGTH]= // zeilen,zeichen+1
{
{"Kanäle ","Channel ","Canaux ","Kanaal "},
{"Konfiguration ","main ","Config ","Configuratie "},
{"Stick ","stick ","Manche ","Stick "},
{"Looping ","Looping ","Looping ","Looping "},
{"Höhe ","Altitude ","Altitude ","Hoogte "},
{"Kamera ","Camera ","Camera ","Camera "},
{"NaviCtrl ","NaviCtrl ","NaviCtrl ","NaviCtrl "},
{"Ausgänge ","Outputs ","Sorties ","Uitgangen "},
{"Verschiedenes ","Divers ","Divers ","Diversen "},
{"Gyro ","Gyro ","Gyro ","Gyro "},
{"Benutzer ","User ","Parametres ","Gebruiker "},
{"Achskopplung ","Coupl Axes ","Coupl Axes ","Koppeling Ass "},
{"Mixer-Setup ","Config Mix ","Config Mix ","Config. Mixer "},
{"Easy Setup ","Config Easy ","Config Easy ","Config. easy "},
 
 
 
};
 
 
//Namen
prog_char param_names[PARAM_COUNT][PARAM_NUM_LANG][PARAM_LENGTH]=
{
// group 0 (kanaele) 1-15
 
{"Gas ","Throttle ","Gaz ","Gas "},
{"Gier ","Gier ","Lacet ","Gier "},
{"Nick ","Nick ","Tangage ","Nick "},
{"Roll ","Roll ","Roulis ","Roll "},
{"Poti 1 ","Poti 1 ","Poti 1 ","Poti 1 "},
{"Poti 2 ","Poti 2 ","Poti 2 ","Poti 2 "},
{"Poti 3 ","Poti 3 ","Poti 3 ","Poti 3 "},
{"Poti 4 ","Poti 4 ","Poti 4 ","Poti 4 "},
{"Poti 5 ","Poti 5 ","Poti 5 ","Poti 5 "},
{"Poti 6 ","Poti 6 ","Poti 6 ","Poti 6 "},
{"Poti 7 ","Poti 7 ","Poti 7 ","Poti 7 "},
{"Poti 8 ","Poti 8 ","Poti 8 ","Poti 8 "},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Erw. Sig. Pr. ","Enh. Sig.Check","Recep Renforce","Uitg.Sig.Check"},
{"Empfänger Typ ","Receiver Type ","Type Recepteur","Ontvang. Type "},
 
 
// group 1 (main) 16-23
 
{"Höhenregeler ","Ctrl Altitude ","Ctrl Altitude ","Ctrl Hoogte "},
{"GPS ","GPS ","GPS ","GPS "},
{"Kompass ","Compass ","Compas ","Kompas "},
{"KompFest Ausr.","CompOrient.Fix","Maintien Cap ","Kompas vast "},
{"Erw. Sig. Pr. ","Sens.RcvSigVal","Ctrl Ren Recep","ExtRec Signaal"},
{"Achs(e.)koppl.","Axis Couping ","Decouplage Axe","As koppeling "},
{"Drehratenbegr.","RotRate limit.","Limit Vit. Rot","RotRate limit."},
{"Heading Hold ","Nick/Roll ","Orient. Fixe ","Koers vast "},
 
 
// group 2 (stick) 24-27
 
{"Nick/Roll P ","Nick/Roll P ","Roul/Tang P ","Nick/Roll P "},
{"Nick/Roll D ","Nick/Roll D ","Roul/Tang D ","Nick/Roll D "},
{"Gier P ","Gier P ","Lacet P ","Gier P "},
{"Externe Kontr.","Extern Ctrl ","Ctrl Externe ","Extern Control"},
 
 
// group3 : (looping) 28-36
 
{"Looping oben ","Looping up ","Looping Avant ","Looping omhoog"},
{"Looping unten ","Looping down ","Looping Arrier","Looping bened."},
{"Looping links ","Looping left ","Looping Gauche","Looping links "},
{"Looping rechts","Looping right ","Looping Droite","Looping rechts"},
{"Gas Limit ","Throttle Limit","Limite Gaz ","Gas Limiet "},
{"Ansprechschw. ","Seuil Reponse ","Seuil Reponse ","Drempelwaarde "},
{"Hysterese ","Hysteresis ","Hysteresis ","Hysterese "},
{"Umkehrp. Nick ","Nick Invers ","Invers Roulis ","Nick geinvert."},
{"Umkehrp. Roll ","Roll Invers ","Invers Tangage","Roll geinvert."},
 
 
// group 4 (hoehe) 37-50
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Control"},
{"J:HBeg,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario"},
{"Schalter f. H.","Switch f. High","Swith Hauteur ","Schak. Hoogte "},
{"akust. Vario ","acoustic Vario","Vario Acoustic","Akoest. Vario "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenste hoogt"},
{"Min. Gas ","min. throttle ","Gaz Min ","Minimaal gas "},
{"Höhe P ","Altitude P ","Altitude P ","Hoogte P "},
{"Luftdruck D ","Barometric D ","Pression D ","Barometr. D "},
{"Z-ACC ","ACC Z ","ACC Z ","ACC Z "},
{"Max. Höhe ","Max. High ","Max. High ","Max. hoogte "},
{"Verstärkung/R ","gain/rate ","Gain/Frequence","Verst./rate "},
{"Schwebegas +/-","hoover varia. ","Var Vol Stat ","hoover varia. "},
{"GPS Z ","GPS Z ","GPS Z ","GPS Z "},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","stick neutr. P"},
 
 
// group 5 : (kamera) 51-66
 
{"Nick S. Anst. ","nick serv ctrl","Asserv Tangage","nick serv ctrl"},
{"Nick Kompens. ","nick compens. ","Comp Tangage ","nick compens. "},
{"Nick Umkehren ","nick inv. dir.","Inverser Roul ","nick inv.rich."},
{"Nick Servo min","nick servo min","Servo Min ","nick servo min"},
{"Nick Servo max","nick servo max","Servo Max ","nick servo max"},
{"Roll S. Anst. ","roll serv ctrl","Asserv Roulis ","roll serv ctrl"},
{"Roll Kompens. ","roll compens. ","Comp Tangage ","roll compens. "},
{"Roll Umkehren ","roll inv. dir.","Inverser Tang ","roll omkeren "},
{"Roll Servo min","roll servo min","Servo Min ","roll servo min"},
{"Roll Servo max","roll servo max","Servo Max ","roll servo max"},
{"Anst. Geschw. ","servo refresh ","Taux Refresh ","Servo refresh "},
{"Manuelle Gesch","manuell Speed ","Vitesse Man. ","Snelh.handbed."},
{"Cam Richtung ","Cam Orient ","Cam Orient ","Camera richt. "},
{"Servo 3 ","Servo 3 ","Servo 3 ","Servo 3 "},
{"Servo 4 ","Servo 4 ","Servo 4 ","Servo 4 "},
{"Servo 5 ","Servo 5 ","Servo 5 ","Servo 5 "},
// group 6 : (navictrl) 67-85 "CH Hoogte "
 
{"GPS ","enable GPS ","Activer GPS ","enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def Mode GPS ","GPS mode contr"},
{"GPS Verstärk. ","GPS Gain ","Gain GPS ","GPS versterk. "},
{"GPS St. Schw. ","GPS stick thre","Seuil Manche ","GPS st. dremp."},
{"Min. Sat. ","Min. Sat. ","Nbre Min. Sat.","Min. Sat. "},
{"GPS-P ","GPS-P ","GPS-P ","GPS-P "},
{"GPS-I ","GPS-I ","GPS-I ","GPS-I "},
{"GPS-D ","GPS-D ","GPS-D ","GPS-D "},
{"P Limit ","Limit P ","Limite P ","Limiet P "},
{"I Limit ","Limit I ","Limite I ","Limiet I "},
{"D Limit ","Limit D ","Limite D ","Limiet D "},
{"GPS Acc ","GPS Acc ","Accel GPS ","GPS Acc "},
{"GPS Windkorr. ","GPS Wind Corr.","Correct Vent ","GPS Wind Corr."},
{"Bremswirkung ","Speed compens.","Compens Vit ","Remwerking "},
{"GPS max. Rad. ","GPS max.radius","Rayon GPS Max ","GPS max.radius"},
{"GPS Winkel Li.","GPS angl.limit","Limit Angl GPS","GPS hoek lim. "},
{"PH Login time ","PH login time ","Tps Memoris ","PH login tijd "},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamische PH "},
{"CH Höhe ","CH High ","CH High ","CH Hoogte "},
 
 
// group 7 : (ausgaenge) 86-95
 
{"LED1 Bitmaske ","Out1 Bitmask ","Bitmask S1 ","Uitg1 Bitpatr."},
{" Timing ","Out1 Timing ","Horloge S1 ","Uitg1 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"LED2 Bitmaske ","Out2 Bitmask ","Bitmask S2 ","Uitg2 Bitpatr."},
{" Timing ","Out2 Timing ","Horloge S2 ","Uitg2 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"LED1 Vmin.Warn","Out1 undervolt","Al Undervoltag","Uitg1 ondersp."},
{"LED2 Vmin.Warn","Out2 undervolt","Al Undervoltag","Uitg2 ondersp."},
 
 
// group 8 : (verschiedenes) 96-107
 
{"Min. Gas ","min. throttle ","Gaz Min. ","minimaal gas "},
{"Max. Gas ","max. throttle ","Gaz Max. ","maximaal gas "},
{"Kompasswirkung","compass effect","Effet compas ","Kompas effect "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Unterspannung ","undervoltage ","Sous Tension ","Onderspanning "},
{"Volt Referenz ","Volt Referenz ","Tension Ref ","Ref. spanning "},
{"Not Gas Zeit ","Emerg.Thr.Time","Duree secours ","Nood gas tijd "},
{"Not Gas ","Emerg.Throttle","Gaz de secours","Nood gas "},
{"Fails. CH Time","Fails. CH Time","Fails. CH Time","Fails. CH Tijd"},
{"Compass Error ","Compass Error ","Compass Error ","Kompas Error "},
{"k.Summer o Sen","Compass Error ","Son Abs Emett ","Kompas Error "},
 
 
// group 9 : (gyro) 108-120
 
{"Gyro P ","Gyro P ","Gyro P ","Gyro P "},
{"Gyro I ","Gyro I ","Gyro I ","Gyro I "},
{"Gyro D ","Gyro D ","Gyro D ","Gyro D "},
{"Gier P ","Lacet P ","Lacet P ","Gier P "},
{"Gier I ","Lacet I ","Lacet I ","Gier I "},
{"Dynamische St.","dynamic stabi.","Stab Dynamique","Dynamis. stab."},
{"Drehratenbeg. ","RotRate limit.","Limit Dit Rota","Toerental lim."},
{"ACC/Gyro Fak. ","ACC/Gyro Fact ","ACC/Gyro Fact ","ACC/Gyro Fact "},
{"ACC/Gyro Komp.","Comp ACC/Gyro ","Comp ACC/Gyro ","Comp ACC/Gyro "},
{"Hauptregler I ","Main I ","Regul Princ I ","Hoofdregel. I "},
{"Drifkompensat.","drift Compens.","Compens Deriv ","Drift compens."},
{"Gyro stab. ","Gyro stability","Gyro Stability","Gyro stabilit."},
{"Motor smooth ","Motor smooth ","Motor Smooth ","Motor smooth "},
 
 
// group 10: (benutzer) 121-128
 
{"Parameter 1 ","Parameter 1 ","Parameter 1 ","Parameter 1 "},
{"Parameter 2 ","Parameter 2 ","Parameter 2 ","Parameter 2 "},
{"Parameter 3 ","Parameter 3 ","Parameter 3 ","Parameter 3 "},
{"Parameter 4 ","Parameter 4 ","Parameter 4 ","Parameter 4 "},
{"Parameter 5 ","Parameter 5 ","Parameter 5 ","Parameter 5 "},
{"Parameter 6 ","Parameter 6 ","Parameter 6 ","Parameter 6 "},
{"Parameter 7 ","Parameter 7 ","Parameter 7 ","Parameter 7 "},
{"Parameter 8 ","Parameter 8 ","Parameter 8 ","Parameter 8 "},
 
 
// group 11: (achskopplung) 129-132
 
{"Achs(e.)koppl.","(De)Coupl Axes","(De)Coupl Axes","As koppeling "},
{"Gier pos. Kopp","Retroac lacet ","Retroac Lacet ","Gier pos. kop."},
{"Nick/Roll Kopp","Retro roul/tan","Retro Roul/Tan","Nick/Roll kop."},
{"Gier Korrektur","Correct lacet ","Correct Lacet ","Gier correctie"},
 
 
// group 12: (mixer) 133
 
{"Orientierung ","Orientierung ","Orientation "},
 
 
// group 13 (easy) 134-144
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Contr. "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenst.hoogte"},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","Stick neutr. P"},
{"GPS ","enable GPS ","Activer GPS ","Enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def mode GPS ","GPS mode contr"},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamic PH "},
{"CH Höhe ","CH High ","CH High ","CH hoogte "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Orientierung ","Orientation ","Orientierung ","Orientatie "},
 
};
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/servo.c
0,0 → 1,156
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
 
#include "lcd.h"
#include "timer.h"
#include "servo.h"
#include "messages.h"
 
#define SERVO_CORRECT 3.125
 
 
//--------------------------------------------------------------
//
void servo_test (void)
{
 
uint8_t chg = 0;
uint8_t Pos = 150; // 1,5mS
 
OCR1A = 150 * SERVO_CORRECT; // Servomitte
 
lcd_cls ();
 
lcd_printp (PSTR(" Servo Tester "), 2);
lcd_printp_at (7, 5, PSTR("%"), 0);
lcd_printp_at (16, 5, PSTR("mS"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_printp_at (18, 7, PSTR("\x19O\x18"), 0);
 
lcd_rect(3, 23, 120, 8, 1); // +-150% Rahmen
lcd_line(23,23,23,31,1); // -100%
lcd_line(43,23,43,31,1); // -50%
lcd_frect(61, 23, 3, 8, 1); // 0%
lcd_line(83,23,83,31,1); // +50%
lcd_line(103,23,103,31,1); // +100%
 
write_ndigit_number_u (4, 5, 0, 3, 0); // Pulse width in %
write_ndigit_number_u_100th(12, 5, 150, 3, 0); // Pulse width in ms
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Pos < 225))
{
if (Pos < 150)
lcd_frect ((63 - ((150 - Pos) * 0.8)), 24, 1, 6, 0);
 
Pos++;
if (Pos == 75 || Pos == 100 || Pos == 125 || Pos == 150 || Pos == 175 || Pos == 200 || Pos == 225)
{
BeepTime = 200;
BeepMuster = 0x0080;
}
 
if (Pos >= 225)
Pos = 225;
 
chg++;
}
else if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Pos > 75))
{
if (Pos > 150)
lcd_frect ((((Pos - 150) * 0.8) + 63), 24, ((Pos - 150) * 0.8), 6, 0);
 
Pos--;
if (Pos == 75 || Pos == 100 || Pos == 125 || Pos == 150 || Pos == 175 || Pos == 200 || Pos == 225)
{
BeepTime = 200;
BeepMuster = 0x0080;
}
 
if (Pos <= 75)
Pos = 75;
 
chg++;
}
else if (get_key_press (1 << KEY_ENTER))
{
lcd_frect (4, 24, 118, 6, 0); // Balken löschen
lcd_frect(61, 23, 3, 8, 1); // 0%
Pos = 150;
BeepTime = 200;
BeepMuster = 0x0080;
chg++;
}
 
if (chg)
{
chg = 0;
 
if (Pos >= 150)
{
lcd_frect (63, 24, ((Pos - 150) * 0.8), 6, 1);
write_ndigit_number_u (4, 5, ((Pos - 150) * 2), 3, 0); // Pulse width in %
lcd_frect(62, 23, 2, 8, 1); // 0%
}
else
{
lcd_frect (63 - ((150 - Pos) * 0.8), 24, ((150 - Pos) * 0.8), 6, 1);
write_ndigit_number_u (4, 5, ((150 - Pos) * 2), 3, 0); // Pulse width in %
lcd_frect(61, 23, 2, 8, 1); // 0%
}
write_ndigit_number_u_100th(12, 5, Pos, 3, 0); // Pulse width in ms
 
lcd_line(3, 23,3, 31,1); // -150%
lcd_line(23, 23,23, 31,1); // -100%
lcd_line(43, 23,43, 31,1); // -50%
lcd_line(83, 23,83, 31,1); // +50%
lcd_line(103,23,103,31,1); // +100%
lcd_line(123,23,123,31,1); // +150%
 
 
OCR1A = Pos * SERVO_CORRECT; // Servostellung
 
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
 
}
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/servo.h
0,0 → 1,40
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _SERVO_H
#define _SERVO_H
 
void servo_test (void);
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/setup.c
0,0 → 1,1969
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>
#include "main.h"
#include "setup.h"
#include "lcd.h"
#include "eeprom.h"
#include "timer.h"
#include "menu.h"
#include "Wi232.h"
#include "bluetooth.h"
#include "connect.h"
#include "lipo.h"
#include "messages.h"
#include "eeprom.h"
 
 
uint8_t spalte;
uint8_t mmode;
uint8_t edit;
uint8_t LCD_Orientation;
uint8_t edit = 0;
uint8_t LCD_Change = 0;
uint8_t PKT_Change = 0;
uint8_t Pre;
uint16_t Pre16;
char EditString[21];
uint8_t bt_name_len;
 
 
//--------------------------------------------------------------
#define ITEMS_PKT 9
 
prog_char param_menuitems_pkt[ITEMS_PKT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Verbindung zum MK","connection to MK "," connexion a MK " ,"Aansluiting op MK"},
{"MK LowBat Warnung","MK LowBat warning","MK LowBat Attent", "MK LoBat alarm "},
{"Anzeige \x1d","Display \x1d","d'affichage \x1d","Display \x1d"},
{"Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d"},
{"BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d"},
{"PKT-Akku \x1d","PKT-Accu \x1d","PKT-Accu \x1d","PKT-Accu \x1d"},
{"PKT Update ","PKT Update ","PKT Mise a jour ","PKT Update "},
{"Debug PKT ","Debug PKT ","Debug PKT ","Debug PKT "},
{"EEProm Reset ","EEProm Reset ","EEProm Reinitiali","EEProm Reset "},
};
 
#define ITEMS_LCD 7
 
prog_char param_menuitems_lcd[ITEMS_LCD][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Infos beim Start ","info at startup ","Infor. sur lancer","info bij opstart "},
{"Sprache ","language ","Langue ","taal "},
{"Licht aus nach...","light off after ","Lumiere au bout ","licht uit na "},
{"Helligkeit ","brightness ","luminosite ","helderheid "},
{"Kontrast ","contrast ","contraste ","contrast "},
{"Normal/Invers ","normal/inverted ","Normal / inverse ","Normal/inverted "},
{"Orientierung ","orientation ","orientation ","orientatie "},
 
};
 
#define ITEMS_WI 8
 
prog_char param_menuitems_wi[ITEMS_WI][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Modul eingebaut? ","module built in? ","Module installé ","Module geinstal.?"},
{"TX/RX Kanal ","TX/RX Channel ","TX/RX Channel ","TX/RX Channel "},
{"NetW. Gruppe ","NetW. Group ","NetW. Group ","NetW. Group "},
{"NetW. Mode ","NetW. Mode ","NetW. Mode ","NetW. Mode "},
{"TX Timeout ","TX Timeout ","TX Timeout ","TX Timeout "},
{"TX MTU ","TX MTU ","TX MTU ","TX MTU "},
{"Initialisieren ","initialize ","initialiser ","Initialize "},
{"Konfig. mit PC ","config. with PC ","Config. avec PC ","Config. met PC "},
};
 
 
#define ITEMS_BT 5
 
prog_char param_menuitems_bt[ITEMS_BT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Modul eingebaut? ","module built in? ","Module installé ","module geïnstall?"},
{"Name ","name ","Nom ","Naam "},
{"Pin ","pin ","Pin ","Pin "},
{"Initialisieren ","initialize ","initialiser ","Initialize "},
{"Konfig. mit PC ","config. with PC ","Config. avec PC ","Config. met PC "},
};
 
#define ITEMS_Accu 2
 
prog_char param_menuitems_Accu[ITEMS_Accu][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"PKT-Akkutyp ","PKT-Accutyp ","PKT-Type de batt.","PKT-batterij type"},
{"PKT Akku Messung ","PKT AccuMeasure ","batt. de mesure ","PKT batt. meting "},
};
 
//--------------------------------------------------------------
void Show_Error_HW12(void)
{
lcd_cls();
lcd_printp_at (0,3,PSTR(" Mit Hardware 1.x "), 2);
lcd_printp_at (0,4,PSTR(" nicht möglich "), 2);
_delay_ms(1000);
 
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Int10th_Value(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u_10th (16, 2,Value, 3, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
{
edit = 1;
Value++;
write_ndigit_number_u_10th (16, 2,Value, 3, 0);
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
{
edit = 1;
Value--;
write_ndigit_number_u_10th (16, 2,Value, 3, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Int_Value(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
Pre = Value;
write_ndigit_number_u (16, 2, Value, 3, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max))
{
edit = 1;
Value++;
write_ndigit_number_u (16, 2,Value, 3, 0);
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
edit = 1;
Value--;
write_ndigit_number_u (16, 2,Value, 3, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
#if defined HWVERSION3_9 ||HWVERSION1_3W
//--------------------------------------------------------------
uint8_t ChangeWi_SV2(uint8_t Value)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 1, PSTR("Verbinde das PKT mit"), 0);
// lcd_printp_at (0, 2, PSTR("dem MK über:"), 0);
lcd_puts_at(0, 1, strGet(CONNECT1), 0);
lcd_puts_at(0, 2, strGet(CONNECT2), 0);
 
if(UseWi == false)
{
// lcd_printp_at (0, 0, PSTR("Verbinde das PKT mit "), 0);
// lcd_printp_at (0, 1, PSTR("dem MK über: Kabel, "), 0);
// lcd_printp_at (0, 2, PSTR("da kein Wi.232 Modul "), 0);
// lcd_printp_at (0, 3, PSTR("eingebaut ist. "), 0);
// lcd_printp_at (0, 4, PSTR("Wenn doch, dann bitte"), 0);
// lcd_printp_at (0, 5, PSTR("das Modul zuerst im "), 0);
// lcd_printp_at (0, 6, PSTR("Setupmenü aktivieren."), 0);
lcd_puts_at(0, 1, strGet(CONNECT1), 0);
lcd_puts_at(0, 2, strGet(CONNECT4), 0);
lcd_puts_at(0, 1, strGet(CONNECT5), 0);
lcd_puts_at(0, 2, strGet(CONNECT6), 0);
lcd_puts_at(0, 1, strGet(CONNECT7), 0);
lcd_puts_at(0, 2, strGet(CONNECT8), 0);
lcd_puts_at(0, 1, strGet(CONNECT9), 0);
 
 
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
else
{
switch (Value)
{
case 0x0 :lcd_printp_at (14, 2, PSTR("Wi232"), 0);
break;
case 0x1 : lcd_puts_at(14, 2, strGet(KABEL), 0);
 
//lcd_printp_at (14, 2, PSTR("Kabel"), 0);
 
break;
break;
}
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if(UseWi == true)
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
edit = 1;
Value = 1;
// lcd_printp_at (14, 2, PSTR("Kabel"), 0);
lcd_puts_at(14, 2, strGet(KABEL), 0);
Change_Output(Uart02FC);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
edit = 1;
Value = 0;
lcd_printp_at (14, 2, PSTR("Wi232"), 0);
Change_Output(Uart02Wi);
}
 
if (get_key_press (1 << KEY_ENTER))
{
// lcd_printp_at (0, 4, PSTR("Sie müssen das PKT"), 0);
// lcd_printp_at (0, 5, PSTR("jetzt neu starten!"), 0);
lcd_puts_at(0, 4, strGet(CONNECT10), 0);
lcd_puts_at(0, 5, strGet(CONNECT11), 0);
lcd_cls_line (0, 7, 18);
while (!get_key_press (1 << KEY_ENTER));
return Value;
}
}
}
while (!get_key_press (1 << KEY_ESC));
}
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
 
#endif
//--------------------------------------------------------------
uint8_t Edit_Wi_NetMode_Value(uint8_t Value)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, PSTR("Wi NetW. Mode:"), 0);
lcd_puts_at(0, 2, strGet(WINETWM), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(15, 2, strGet(SLAVE), 0);//lcd_printp_at (15, 2, PSTR("Slave "), 0);
break;
case 0x1 :lcd_puts_at(15, 2, strGet(NORMAL), 0);//lcd_printp_at (15, 2, PSTR("Normal"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
edit = 1;
Value = NetMode_Normal;
// lcd_printp_at (15, 2, PSTR("Normal"), 0);
lcd_puts_at(15, 2, strGet(NORMAL), 0);
 
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
edit = 1;
Value = NetMode_Slave;
// lcd_printp_at (15, 2, PSTR("Slave "), 0);
lcd_puts_at(15, 2, strGet(SLAVE), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_StartInfo(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
 
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2,Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case false :lcd_puts_at(17, 2, strGet(OFF), 0);//lcd_printp_at (17, 2, PSTR("Aus"), 0);
break;
case true :lcd_puts_at(17, 2, strGet(ON), 0);//cd_printp_at (17, 2, PSTR("Ein"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
// lcd_printp_at (17, 2, PSTR("Ein"), 0);
lcd_puts_at(17, 2, strGet(ON), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
// lcd_printp_at (17, 2, PSTR("Aus"), 0);
lcd_puts_at(17, 2, strGet(OFF), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
 
PKT_StartInfo = Value;
WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
PKT_StartInfo = Pre;
return Pre;
}
 
}
 
//--------------------------------------------------------------
uint8_t Edit_YesNo(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
 
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2,Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case false :lcd_puts_at(17, 2, strGet(NOO), 0);//lcd_printp_at (17, 2, PSTR("Aus"), 0);
break;
case true :lcd_puts_at(17, 2, strGet(YES), 0);//cd_printp_at (17, 2, PSTR("Ein"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
// lcd_printp_at (17, 2, PSTR("Ein"), 0);
lcd_puts_at(17, 2, strGet(YES), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
// lcd_printp_at (17, 2, PSTR("Aus"), 0);
lcd_puts_at(17, 2, strGet(NOO), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
 
// PKT_StartInfo = Value;
// WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
// PKT_StartInfo = Pre;
return Pre;
}
 
}
//--------------------------------------------------------------
//uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,const char *Text)
uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2,strGet(Text), 0);
switch (Value)
{
case
0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value < max))
{
edit = 1;
Value++;
//DisplayLanguage = Value;
switch (Value)
{
case 0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value > min))
{
edit = 1;
Value--;
//DisplayLanguage = Value;
switch (Value)
{
case 0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Orientation(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(14, 2, strGet(NORMAL), 0);//lcd_printp_at (14, 2, PSTR("Normal "), 0);
break;
case 0x4 :lcd_puts_at(14, 2, strGet(REVERSE), 0);//lcd_printp_at (14, 2, PSTR("Reverse"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value=4;
// lcd_printp_at (14, 2, PSTR("Reverse"), 0);
lcd_puts_at(14, 2, strGet(REVERSE), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 4))
{
Value = 0;
// lcd_printp_at (14, 2, PSTR("Normal "), 0);
lcd_puts_at(14, 2, strGet(NORMAL), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
cli();
clr_A0 ();
 
if (Value == 0)
{
send_byte (0xA1); // normal
send_byte (0xC0); // normal
}
else
{
send_byte (0xA0); // reverse
send_byte (0xC8); // reverse
}
set_A0 ();
sei();
LCD_Orientation = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayMode(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
//lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(14, 2, strGet(NORMAL), 0);//lcd_printp_at (14, 2, PSTR("Normal "), 0);
break;
case 0x4 :lcd_puts_at(14, 2, strGet(REVERSE), 0);//lcd_printp_at (14, 2, PSTR("Reverse"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value=4;
// lcd_printp_at (14, 2, PSTR("Inverse"), 0);
lcd_puts_at(14, 2, strGet(REVERSE), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 4))
{
Value=0;
// lcd_printp_at (14, 2, PSTR("Normal "), 0);
lcd_puts_at(14, 2, strGet(NORMAL), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
cli();
clr_A0 ();
 
if (Value == 0)
send_byte (0xA6); // normal
else
send_byte (0xA7); // inverse
 
set_A0 ();
sei();
LCD_DisplayMode = Value;
WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
LCD_DisplayMode = Pre;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayKontrast(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u (16, 2, Value, 3, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
write_ndigit_number_u (16, 2,Value, 3, 0);
lcd_frect ((8*0), (8*4), (Value * (16*8) / 64), 6, 1);
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max))
{
Value++;
 
if (Value >= max)
{
Value = max;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
{
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Value); // Daten zum LCD senden
set_A0 ();
sei();
}
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
lcd_frect (((Value - 1) * (16*8) / 64), (8*4), (16*8), 6, 0);
Value--;
 
if (Value == min)
{
Value = min;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
{
// edit = 1;
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Value); // Daten zum LCD senden
set_A0 ();
sei();
}
}
write_ndigit_number_u (16, 2,Value, 3, 0);
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
LCD_Kontrast = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Pre); // Daten zum LCD senden
set_A0 ();
sei();
edit = 0;
LCD_Kontrast = Pre;
WriteParameter();
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayHelligkeit(uint8_t Value, uint8_t min, uint8_t max, uint8_t Text)
{
float ValCorr = 2.55; // (Value * ValCorr) maximal 255
Pre = Value;
OCR2A = Value * ValCorr;
 
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u (16, 2, Value, 3, 0);
lcd_printp_at (17, 2, PSTR("%"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
write_ndigit_number_u (16, 2,Value, 3, 0);
lcd_frect ((8*0), (8*4), (Value * (16*8) / 100), 6, 1);
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
{
Value++;
 
if (Value >= max)
{
Value = max;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
OCR2A = Value * ValCorr;
 
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
{
lcd_frect (((Value - 1) * (16*8) / 100), (8*4), (16*8), 6, 0);
Value--;
 
if (Value == min)
{
Value = min;
BeepTime = 200;
BeepMuster = 0x0080;
}
else
OCR2A = Value * ValCorr;
 
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
OCR2A = Value * ValCorr;
LCD_Helligkeit = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
OCR2A = Pre * ValCorr;
LCD_Helligkeit = Pre;
WriteParameter();
return Pre;
}
}
 
 
//--------------------------------------------------------------
void Reset_EEprom(void)
{
lcd_cls();
get_key_press(KEY_ALL);
// lcd_printp_at (0, 2, PSTR(" EEProm wirklich"), 0);
// lcd_printp_at (0, 3, PSTR(" löschen?"), 0);
// lcd_printp_at (12, 7, PSTR("Ende OK"), 0);
lcd_puts_at(0, 2, strGet(EEPROM1), 0);
lcd_puts_at(0, 3, strGet(EEPROM2), 0);
lcd_puts_at(12, 7, strGet(ENDOK), 0);
 
 
do
{
 
if (get_key_press (1 << KEY_ENTER))
{
Delete_EEPROM();
return;
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
 
//--------------------------------------------------------------
void PKT_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_PKT;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
lcd_cls ();
mmode = 0;
edit= 0;
val = 0;
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" PKT-Setup "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+Offset) < size)
lcd_printp_at(3,ii+1,param_menuitems_pkt[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+Offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset+7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
return;
}
return;
}
else
break;
}
target_pos = val;
 
if((val + Offset) == 1)
{
#ifdef HWVERSION3_9
U02SV2 = ChangeWi_SV2(U02SV2);
 
if (edit == 1)
PKT_Change = 1;
 
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 2)
MK_LowBat = Edit_Int10th_Value(MK_LowBat,33,247,LOWBAT);
 
if((val + Offset) == 3)
Display_Setup();
 
if((val + Offset) == 4)
{
#if defined HWVERSION3_9 || defined HWVERSION1_2W || defined HWVERSION1_3W
if(UseWi == false)
// Wi_Use();
{
UseWi = Edit_YesNo(UseWi,0,1,WI2321);
if (edit==1)
if (UseWi== true) InitWi232();
}
 
else
Wi_Setup();
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 5)
{
#ifdef HWVERSION3_9
if(UseBT == 0)
{
UseBT = Edit_YesNo(UseBT,0,1,BT1);
if (edit==1)
if (UseBT == 1)
{
if (bt_init()) BTIsSet = true; else BTIsSet = false;
WriteParameter();
}
}
else
BT_Setup();
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 6)
#ifdef HWVERSION3_9
Accu_Setup();
#else
Show_Error_HW12();
#endif
if((val + Offset) == 7)
Update_PKT();
 
if((val + Offset) == 8)
Debug = Edit_Int_Value(Debug,0,1,DEBUGPKT);
 
if((val + Offset) == 9)
Reset_EEprom();
 
}
}
 
 
//--------------------------------------------------------------
void Display_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_LCD;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
lcd_cls ();
mmode = 0;
edit= 0;
LCD_Change = 0;
val = 0;
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Display Setup "), 2);
lcd_puts_at(0, 0, strGet(DISPLAY1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1, 1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6 ; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_lcd[ii + Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
return;
}
return;
}
else
break;
}
target_pos = val;
 
if((val + Offset) == 1)
PKT_StartInfo = Edit_StartInfo(PKT_StartInfo,0,2,DISPLAY2);
 
if((val + Offset) == 2)
DisplayLanguage = Edit_Language(DisplayLanguage,0,3,DISPLAY3);
// Edit_Language(DisplayLanguage,0,3,DISPLAY3);
 
if((val + Offset) == 3)
DisplayTimeout = Edit_Int_Value(DisplayTimeout,0,254,DISPLAY4);
 
if((val + Offset) == 4)
LCD_Helligkeit = Edit_DisplayHelligkeit(LCD_Helligkeit,0,100,DISPLAY5);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
 
if((val + Offset) == 5)
LCD_Kontrast = Edit_DisplayKontrast(LCD_Kontrast,0,63,DISPLAY6);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
 
if((val + Offset) == 6)
{
LCD_DisplayMode = Edit_DisplayMode(LCD_DisplayMode,0,4,DISPLAY7);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
}
 
if((val + Offset) == 7)
{
LCD_Orientation = Edit_Orientation(LCD_Orientation,0,4,DISPLAY8);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
}
 
 
 
 
}
}
 
#if defined HWVERSION3_9 ||HWVERSION1_3W
////--------------------------------------------------------------
//void Wi_Use (void)
//{
// Pre = UseWi;
//
// lcd_cls ();
//
// lcd_cls ();
//// lcd_printp_at (0, 0, PSTR(" Wi.232 Setup "), 2);
//// lcd_printp_at (0, 2, PSTR("Ist ein Wi.232-Modul "), 0);
//// lcd_printp_at (0, 4, PSTR("eingebaut?"), 0);
// lcd_puts_at(0, 0, strGet(WI2321), 2);
// lcd_puts_at(0, 2, strGet(WI2322), 0);
// lcd_puts_at(0, 4, strGet(WI2323), 0);
//// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
//
// while(1)
// {
// if(UseWi == false)
//// lcd_printp_at (12, 4, PSTR("Nein"), 0);
// lcd_puts_at(12, 4, strGet(NOO), 0);
// else
// //lcd_printp_at (12, 4, PSTR("Ja "), 0);
// lcd_puts_at(12, 4, strGet(YES), 0);
//
// if(get_key_press (1 << KEY_MINUS))
// {
// UseWi = false;
// edit = 1;
// }
//
// if(get_key_press (1 << KEY_PLUS))
// {
// UseWi = true;
// edit = 1;
// }
//
// if(get_key_short (1 << KEY_ENTER))
// {
//// WiIsSet = false;
//// WriteParameter();
//// if(UseWi == true)
//// Wi_Setup();
// return;
// }
//
// if (get_key_press (1 << KEY_ESC))
// {
// get_key_press(KEY_ALL);
// UseWi = Pre;
// return;
// }
// }
//}
 
 
//--------------------------------------------------------------
void Wi_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_WI;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val = 0;
 
mmode = 0;
edit = 0;
// WiIsSet = true;
 
lcd_cls ();
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" Wi.232 Setup "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1, 1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii+1, param_menuitems_wi[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii + Offset < (size - 1)))
lcd_printp_at(1, 6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
// if (edit == 1)
// {
// if (UseWi==true) InitWi232();
// WriteParameter();
// }
 
return;
}
else
 
if (edit == 1)
{
if (UseWi==true) InitWi232();
WriteParameter();
}
 
 
 
 
break;
}
target_pos = val;
 
if((val + Offset) == 1)
{
UseWi = Edit_YesNo(UseWi,0,1,WI2321);
}
 
if((val + Offset) == 2)
{
WiTXRXChannel = Edit_Int_Value(WiTXRXChannel, 0, 5,WINETWG);
 
}
 
if((val + Offset) == 3)
{
WiNetworkGroup = Edit_Int_Value(WiNetworkGroup, 0, 127, WINETWG);
 
 
}
 
if((val + Offset) == 4)
{
WiNetworkMode = Edit_Wi_NetMode_Value(WiNetworkMode);
 
 
}
 
if((val + Offset) == 5)
{
WiTXTO = Edit_Int_Value(WiTXTO,0,127,WITIMEOUT);
 
 
}
 
if((val + Offset) == 6)
{
WiUartMTU = Edit_Int_Value(WiUartMTU,0,127,WIUART);
 
 
}
 
if((val + Offset) == 7)
InitWi232();
 
if((val + Offset) == 8)
Port_USB2CFG_Wi();
}
}
#endif
 
#ifdef HWVERSION3_9
//--------------------------------------------------------------
//
uint8_t Edit_String(const char *data, const uint8_t length, uint8_t type, const char *Text)
{
uint8_t y = 1;
uint8_t x = 1;
uint8_t I = 0;
 
lcd_cls();
lcd_printp_at (0, 0, Text, 2);
 
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (y++, 3, data[i], 0);
lcd_printp_at (y++, 3, PSTR(" "), 0);
 
EditString[i] = data[i];
}
 
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
lcd_printp_at (0, 6, PSTR(" C"), 0);
lcd_printp_at (0, 7, PSTR(" \x17 \x16 \x19 OK"), 0);
 
do
{
if (type == 1) // Name
{
for (uint8_t i = bt_name_length; i > 0; i--)
{
if (EditString[i - 1] != ' ')
{
bt_name_len = i;
break;
}
}
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && EditString[I] < 'z')
{
EditString[I]++;
 
if (EditString[I] >= 0x00 && EditString[I] < ' ')
EditString[I] = ' ';
 
if (EditString[I] > ' ' && EditString[I] < '0')
EditString[I] = '0';
 
if (EditString[I] > '9' && EditString[I] < 'A')
EditString[I] = 'A';
 
if (EditString[I] > 'Z' && EditString[I] < 'a')
EditString[I] = 'a';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && EditString[I] > ' ')
{
EditString[I]--;
 
if (EditString[I] < 'a' && EditString[I] > 'Z')
EditString[I] = 'Z';
 
if (EditString[I] < 'A' && EditString[I] > '9')
EditString[I] = '9';
 
if (EditString[I] < '0' && EditString[I] > ' ')
EditString[I] = ' ';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
}
else if (type == 2) // PIN
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (EditString[I] < '9'))
{
EditString[I]++;
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (EditString[I] > '0'))
{
EditString[I]--;
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
}
 
if (get_key_long (1 << KEY_ESC))
{
EditString[I] = ' '; // Zeichen l�schen
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if (get_key_short (1 << KEY_ESC))
{
if ((x / 2) + 2 > bt_name_length)
{
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
x = 1;
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
I = 0;
}
else
{
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
x++;
x++;
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
I++; //Zeiger auf Zeichen
}
}
}
while (!get_key_press (1 << KEY_ENTER));
{
get_key_press(KEY_ALL);
return 1;
}
}
 
 
////--------------------------------------------------------------
//void BT_Use (void)
//{
// Pre = UseBT;
//
// lcd_cls ();
//
// lcd_cls ();
//// lcd_printp_at (0, 0, PSTR(" BTM-222 Setup "), 2);
//// lcd_printp_at (0, 2, PSTR("Ist ein BTM-222-Modul"), 0);
//// lcd_printp_at (0, 4, PSTR("eingebaut?"), 0);
// lcd_puts_at(0, 0, strGet(BT1), 2);
// lcd_puts_at(0, 2, strGet(BT2), 0);
// lcd_puts_at(0, 4, strGet(BT3), 0);
//// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
//
// while(1)
// {
// if(UseBT == false)
//// lcd_printp_at (12, 4, PSTR("Nein"), 0);
// lcd_puts_at(12, 4, strGet(NOO), 0);
// else
//// lcd_printp_at (12, 4, PSTR("Ja "), 0);
// lcd_puts_at(12, 4, strGet(YES), 0);
// if(get_key_press (1 << KEY_MINUS))
// UseBT = false;
//
// if(get_key_press (1 << KEY_PLUS))
// UseBT = true;
//
// if(get_key_short (1 << KEY_ENTER))
// {
//// BTIsSet = false;
// WriteParameter();
// if(UseBT == true)
// BT_Setup();
// return;
// }
//
// if (get_key_press (1 << KEY_ESC))
// {
// get_key_press(KEY_ALL);
// UseBT = Pre;
// return;
// }
// }
//}
 
 
//--------------------------------------------------------------
//
void BT_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_BT;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
char string[20];
 
mmode = 0;
edit = 0;
val = 0;
// BTIsSet = true;
 
lcd_cls ();
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" BTM-222 Setup "), 2);
lcd_puts_at(0, 0, strGet(BT1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_bt[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
// if (edit == 1)
// {
// if (UseBT == 1);
// if (bt_init()) BTIsSet = true; else BTIsSet = false;
// WriteParameter();
// return;
// }
return;
}
else
 
if (edit == 1)
{
if (UseBT == 1);
if (bt_init()) BTIsSet = true; else BTIsSet = false;
WriteParameter();
return;
}
 
 
 
 
break;
}
 
target_pos = val;
if((val + Offset) == 1)
// BT_Use();
UseBT = Edit_YesNo(UseBT,0,1,BT1);
 
if((val + Offset) == 2)
{
for (uint8_t i = 0; i < bt_name_length; i++)
{
string[i] = bt_name[i];
}
string[bt_name_length] = 0;
Edit_String(string, bt_name_length, 1, PSTR(" Bluetooth Name "));
if (edit == 1)
{
for (uint8_t i = 0; i < bt_name_len; i++)
{
bt_name[i] = EditString[i];
WriteParameter();
}
 
if (bt_name_len < 10)
{
for (uint8_t i = bt_name_len; i < 10; i++)
{
bt_name[i] = ' ';
WriteParameter();
}
}
}
}
 
if((val + Offset) == 3)
{
for (uint8_t i = 0; i < bt_pin_length; i++)
{
string[i] = bt_pin[i];
}
string[bt_pin_length] = 0;
Edit_String(string, bt_pin_length, 2, PSTR(" Bluetooth Pin "));
if (edit == 1)
{
for (uint8_t i = 0; i < bt_pin_length; i++)
{
bt_pin[i] = EditString[i];
WriteParameter();
}
}
}
 
if((val + Offset) == 4)
{
// if (edit == 1)
// if(BTIsSet)
// BTIsSet = false;
 
if (bt_init() == true)
{
lcd_printp_at (0, 3, PSTR("BT Init ok"), 0);
WriteBTInitFlag();
}
else
{
lcd_printp_at (0, 3, PSTR("BT Init Error"), 0);
BTIsSet = false;
BeepTime = 1000;
BeepMuster = 0x0040;
}
}
 
if((val + Offset) == 5)
Port_FC2CFG_BT();
 
 
}
}
 
//--------------------------------------------------------------
uint8_t Edit_PKT_Accu(uint8_t Value, uint8_t min, uint8_t max)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(LIPO2), 0);
switch (Value)
{
case false :lcd_printp_at (15, 2, PSTR("LiIo"), 0);
break;
case true :lcd_printp_at (15, 2, PSTR("LiPo"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
lcd_printp_at (15, 2, PSTR("LiPo"), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
lcd_printp_at (15, 2, PSTR("LiIo"), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
 
PKT_Accutyp = Value;
// WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
PKT_Accutyp = Pre;
return Pre;
}
 
}
 
//--------------------------------------------------------------
uint16_t Edit_LipoOffset(uint16_t Value, uint16_t min, uint16_t max)
{
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(LIPO3), 0);
lcd_puts_at(0, 5, strGet(LIPO5), 0);
lcd_puts_at(0, 6, strGet(LIPO6), 0);
// lcd_printp_at (0, 3, PSTR("Offset verstellen bis"), 0);
// lcd_printp_at (0, 4, PSTR("die Spannung passt"), 0);
Pre16 = Value;
write_ndigit_number_u (16, 2, Value, 4, 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max-10))
{
edit = 1;
Value = Value +10;
Lipo_UOffset = Value;
write_ndigit_number_u (16, 2,Value, 4, 0);
 
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
edit = 1;
Value=Value -10;
Lipo_UOffset = Value;
write_ndigit_number_u (16, 2,Value, 4, 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
show_Lipo();
write_ndigit_number_u_100th(8, 3, volt_avg, 0, 0);
lcd_printp_at(3, 3, PSTR("Volt"), 0);
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
Lipo_UOffset = Pre16;
return Pre16;
}
}
 
//--------------------------------------------------------------
 
 
void Accu_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_Accu;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
mmode = 0;
edit = 0;
val = 0;
lcd_cls ();
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" PKT Accu Setup "), 2);
lcd_puts_at(0, 0, strGet(LIPO1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_Accu[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
 
return;
}
return;
}
else
break;
}
 
target_pos = val;
if((val + Offset) == 1)
{
PKT_Accutyp= Edit_PKT_Accu(PKT_Accutyp,0,1);
if (edit == 1) WriteParameter();
}
 
if((val + Offset) == 2)
{
Lipo_UOffset = Edit_LipoOffset(Lipo_UOffset,0,9999);
if (edit == 1) WriteParameter();
}
 
}
}
 
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/setup.h
0,0 → 1,50
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _setup_H
#define _setup_H
 
void PKT_Setup (void);
void Display_Setup (void);
void Wi_Use (void);
void Wi_Setup (void);
void BT_Use (void);
void BT_Setup (void);
void Show_Error_HW12(void);
void Accu_Setup (void);
uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text);
 
extern uint8_t bt_name_len;
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/timer.c
0,0 → 1,519
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>
#include <inttypes.h>
 
 
#include "main.h"
#include "timer.h"
#include "eeprom.h"
#include "lcd.h"
#include "uart1.h"
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
#include "HAL_HW1_2.h"
#endif
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
 
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
 
volatile uint16_t timer;
volatile uint16_t abo_timer;
volatile static unsigned int tim_main;
 
uint8_t key_state = 0; // debounced and inverted key state:
// bit = 1: key pressed
uint8_t key_press = 0; // key press detect
uint8_t key_long = 0; // key long press
uint8_t key_rpt = 0; // key repeat
uint8_t key_lrpt = 0; // key long press and repeat
uint8_t key_rpts = 0; // key long press and speed repeat
uint8_t repeat_speed = 0;
 
uint16_t DisplayTime = 0; // Leuchtdauer
volatile uint16_t IdleTimer = 0; // InaktivitätsTimer
 
uint16_t WarnCount = 0; // Zähler der LIPO Warnzeit
uint16_t WarnToggle = 0; // Togglezähler zum blinken
uint16_t WarnTime = 10; // Länge der LIPO Warnzeit 10 Sek.
uint16_t PoffTime = 30; // Länge der Wartezeit vor Abschalten 30 Sek.
//uint8_t servo = 0;
 
 
volatile uint8_t Display_on;// Flag Display on/off
 
unsigned int BeepTime = 0;
unsigned int BeepMuster = 0xffff;
 
volatile unsigned int CountMilliseconds = 0;
 
// Size of Buffer for Converting unsigned int Value to ASCII
#define STRING_BUFFER_SIZE 5
 
// Buffer for Converting unsigned int Value to ASCII
char String_Buffer[STRING_BUFFER_SIZE];
 
 
//--------------------------------------------------------------
//
void Timer1_Init (void) // Timer 1-A
{
// löschen
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = 0;
 
// setzen
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << CS11) | (1 << CS10) | (1 << WGM13) | (1 << WGM12);
 
ICR1 = (F_CPU / 64) * 20 / 1000;
 
OCR1A = 470; // ca. Servomitte
}
 
 
//--------------------------------------------------------------
void Timer2_Init (void) // Displayhelligkeit
{
DDRD |= (1 << DDD7); // PD7 output
TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1); // non invers
TCCR2B |= (1 << CS20); // Prescaler 1/1
TIMSK2 |= (1 << OCIE2A) | (1 << OCIE2B);
 
OCR2A = 255;
}
 
 
#if defined HWVERSION1_2 || defined HWVERSION1_2W
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD &= ~(1 << PD7);
PORTC &= ~(1 << PC0);
PORTC &= ~(1 << PC1);
}
ISR(TIMER2_COMPB_vect)
{
PORTD |= (1 << PD7);
PORTC |= (1 << PC0);
PORTC |= (1 << PC1);
}
#endif
#if defined HWVERSION1_3 || defined HWVERSION1_3W
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD &= ~(1 << PD7);
PORTD &= ~(1 << PD6);
PORTC &= ~(1 << PC2);
}
ISR(TIMER2_COMPB_vect)
{
PORTD |= (1 << PD7);
PORTD |= (1 << PD6);
PORTC |= (1 << PC2);
}
#endif
#ifdef HWVERSION3_9
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD |= (1 << PD7);
}
ISR(TIMER2_COMPB_vect)
{
PORTD &= ~(1 << PD7);
}
#endif
 
 
//--------------------------------------------------------------
void Timer0_Init (void) // System (100Hz)
{
timer = 0;
 
TCCR0A = (1 << WGM01);
TCCR0B = (1 << CS02) | (1 << CS00);
OCR0A = (F_CPU / (100L * 1024L)) ;
 
TIMSK0 |= (1 << OCIE0A); // enable interrupt for OCR
}
 
 
//--------------------------------------------------------------
ISR(TIMER0_COMPA_vect) // Timer-Interrupt (100 Hz)
{
static uint8_t ct0 = 0;
static uint8_t ct1 = 0;
static uint8_t k_time_l = 0;
static uint8_t k_time_r = 0;
static uint8_t k_time_lr = 0;
static uint8_t k_time_rs = 0;
uint8_t i;
 
static unsigned char cnt_1ms = 1,cnt = 0;
unsigned char beeper_ein = 0;
// unsigned char pieper_ein = 0;
 
// Key handling by Peter Dannegger
// see www.mikrocontroller.net
 
i = key_state ^ ~KEY_PIN; // key changed ?
ct0 = ~(ct0 & i); // reset or count ct0
ct1 = ct0 ^ (ct1 & i); // reset or count ct1
i &= (ct0 & ct1); // count until roll over ?
key_state ^= i; // then toggle debounced state
key_press |= (key_state & i); // 0->1: key press detect
 
if (PKT_IdleBeep == 1)
{
IdleTimer ++; // nix zu tun? Timer hochzählen
if (IdleTimer == 12000) // Warnhinweis
{
BeepTime = 200;
BeepMuster = 0x0080;
IdleTimer = 0;
}
}
 
if (!cnt--)
{
cnt = 9;
CountMilliseconds++;
cnt_1ms++;
}
 
if (i!=0)
{ // Displaylicht einschalten, und bzw. Timeoutzählerreset wenn Taste gedrückt wurde
if (Display_on == 0)
set_D_LIGHT();
 
 
Display_on = 1; // Flag Display on
DisplayTime = 0; // Timer Reset
IdleTimer = 0; // Idletimeout Reset
 
}
 
if (DisplayTimeout > 0)
{
if (Display_on == 1)
{
DisplayTime++;
if ((DisplayTime / 100) == DisplayTimeout) // ISR läuft mit 100Hz
{ // Displaylicht ausschalten
clr_D_LIGHT();
Display_on = 0; // Flag Display off
 
}
}
}
 
//--------------------------------------------------------------
#ifdef HWVERSION3_9
LipoCheck(); // Lipo prüfen
#endif
 
//--------------------------------------------------------------
if (BeepTime)
{
if (BeepTime > 10)
BeepTime -= 10;
else
BeepTime = 0;
 
if (BeepTime & BeepMuster)
beeper_ein = 1;
else
beeper_ein = 0;
}
else
{
beeper_ein = 0;
BeepMuster = 0xffff;
}
 
if (beeper_ein)
set_BEEP();
else
clr_BEEP();
 
 
//--------------------------------------------------------------
if ((key_state & LONG_MASK) == 0) // check long key function
k_time_l = REPEAT_START; // start delay
 
if (--k_time_l == 0) // long countdown
key_long |= (key_state & LONG_MASK);
 
//--------------------------------------------------------------
if ((key_state & REPEAT_MASK) == 0) // check repeat function
k_time_r = 1; // kein delay
 
if (--k_time_r == 0)
{
k_time_r = REPEAT_NEXT; // repeat delay
key_rpt |= (key_state & REPEAT_MASK);
}
 
//--------------------------------------------------------------
if ((key_state & LONG_REPEAT_MASK) == 0) // check repeat function
k_time_lr = REPEAT_START; // start delay
 
if (--k_time_lr == 0)
{
k_time_lr = REPEAT_NEXT; // repeat delay
key_lrpt |= (key_state & LONG_REPEAT_MASK);
}
 
//--------------------------------------------------------------
if ((key_state & LONG_REPEAT_SP_MASK) == 0) // check repeatX function
k_time_rs = REPEAT_START; // start delay
 
if (--k_time_rs == 0) // repeat countdown
{
if (repeat_speed == 1)
{
k_time_rs = REPEAT_SPEED_1;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
else if (repeat_speed == 2)
{
k_time_rs = REPEAT_SPEED_2;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
else if (repeat_speed == 3)
{
k_time_rs = REPEAT_SPEED_3;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
}
 
if (timer > 0)
timer --;
 
if (abo_timer > 0)
abo_timer --;
 
 
}
 
 
//--------------------------------------------------------------
#ifdef HWVERSION3_9
 
void LipoCheck (void) // Lowbatpin des Spannungswandlers prüfen
// LBO des LT1308 wechselt zum Ende der Batterielaufzeit häufig seinen Zustand in der Übergangsphase zum LowBat
// Die Akkuspannung schwankt auch abhängig vom momentanen Stromverbrauch
{
if (WarnToggle == 1) // Beim ersten Auftreten Warnung ausgeben, Rythmus 5/10 Sekunden
{
BeepTime = 1000;
BeepMuster = 0x0020;
lcd_printp_at (0, 0, PSTR(" LIPO !!Warnung!! "), 2);
}
 
if (WarnToggle == WarnTime * 100)
WarnToggle = 0; // erstmal bis hier warnen
 
if (WarnToggle > 0)
WarnToggle++; // weiter hochzählen
 
if (PINC & (1 << LowBat)) // Kurzzeitige Unterspannung bearbeiten und Warnung ausgeben
{
WarnCount = 0;
// if (WarnCount > 0)
// WarnCount--; // Bei LIPO OK erstmal runterzählen, LT1308 überlegt sich noch genauer ob nun ok oder nicht
}
 
if (!(PINC & (1 << LowBat)) ) // LT1308 hat Unterspannung erkannt
{
WarnCount++; // solange LBO low ist Zähler hochzählen
if (WarnCount == 10 && WarnToggle == 0) // mit "10" etwas unempfindlicher gegen kurze Impulse machen
WarnToggle = 1; // Warnhinweis starten
}
 
if ((WarnCount) == PoffTime * 100)
clr_V_On(); // Spannung abschalten
}
 
#endif
 
 
//--------------------------------------------------------------
unsigned int SetDelay (unsigned int t)
{
return(CountMilliseconds + t + 1);
}
 
 
//--------------------------------------------------------------
char CheckDelay(unsigned int t)
{
return(((t - CountMilliseconds) & 0x8000) >> 9);
}
 
 
//--------------------------------------------------------------
void Delay_ms(unsigned int w)
{
unsigned int akt;
akt = SetDelay(w);
while (!CheckDelay(akt));
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_press (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_press; // read key(s)
key_press ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_short (uint8_t key_mask)
{
uint8_t ret;
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
ret = get_key_press (~key_state & key_mask);
 
SREG = sreg; // restore status register
 
return ret;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_long; // read key(s)
key_long ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return get_key_press (get_key_rpt (key_mask));
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_rpt (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_rpt; // read key(s)
key_rpt ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long_rpt (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_lrpt; // read key(s)
key_lrpt ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return get_key_rpt (~key_press^key_mask);
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long_rpt_sp (uint8_t key_mask, uint8_t key_speed)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_rpts; // read key(s)
key_rpts ^= key_mask; // clear key(s)
 
repeat_speed = key_speed;
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/timer.h
0,0 → 1,87
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef _TIMER_H
#define _TIMER_H
 
#include "cpu.h"
#include "main.h"
 
#define KEY_ALL ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define REPEAT_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_REPEAT_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_REPEAT_SP_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
 
#define REPEAT_START 70 // after 700ms
#define REPEAT_NEXT 15 // every 150ms
#define REPEAT_SPEED_1 20 // every 200ms
#define REPEAT_SPEED_2 8 // every 80ms
#define REPEAT_SPEED_3 1 // every 10ms
 
#define ABO_TIMEOUT 300 // 3 sec
extern volatile uint8_t Display_on;
extern volatile uint16_t IdleTimer;
 
extern volatile uint16_t timer;
extern volatile uint16_t abo_timer;
extern uint16_t WarnCount;
 
 
//extern volatile unsigned int BeepTime;
extern unsigned int BeepTime;
extern unsigned int BeepMuster;
 
void Timer0_Init (void); // Systeminterrupt
void Timer1_Init (void); // Servotester
void Timer2_Init (void); // Displayhelligkeit
 
uint8_t get_key_press (uint8_t key_mask); // sofort beim drücken
uint8_t get_key_short (uint8_t key_mask); // erst beim loslassen
uint8_t get_key_long (uint8_t key_mask); // verzögert
uint8_t get_key_rpt (uint8_t key_mask); // mit verzögerung
uint8_t get_key_long_rpt (uint8_t key_mask); //
uint8_t get_key_long_rpt_sp (uint8_t key_mask, uint8_t key_speed); // mit verzögerung und 3 versch. geschw.
 
extern volatile unsigned int CountMilliseconds;
 
 
void Delay_ms(unsigned int);
unsigned int SetDelay (unsigned int t);
char CheckDelay (unsigned int t);
void LipoCheck (void); // Lowbatpin des Spannungswandlers prüfen
 
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/tools.c
0,0 → 1,332
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <util/delay.h>
#include "main.h"
#include "setup.h"
#include "lcd.h"
#include "menu.h"
#include "servo.h"
#include "motortest.h"
#include "eeprom.h"
#include "timer.h"
#include "connect.h"
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
#ifdef HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
//#include "voltmeter.h"
#include "lipo.h"
#include "messages.h"
 
//--------------------------------------------------------------
#define ITEMS_PKT 6
 
prog_char tools_menuitems_pkt[ITEMS_PKT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Netherlands
{
{"Motor Tester ","Motor Tester ","Motor Tester ","Motor Tester "},
{"Servo Tester ","Servo Tester ","Servo Tester ","Servo Tester "},
{"PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter "},
{"PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter "},
{"PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d"},
{"PKT Version ","PKT Version ","PKT Version ","PKT Version "},
};
 
 
//--------------------------------------------------------------
void PKT_Tools (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_PKT ;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
val = 0;
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" PKT-Tools "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(2)
{
ii = 0;
if(Offset > 0)
{
lcd_printp_at(1,1, PSTR("\x12"), 0);
}
for(ii = 0;ii < 6 ; ii++)
{
if((ii+Offset) < size)
{
lcd_printp_at(3,ii+1,tools_menuitems_pkt[ii+Offset][DisplayLanguage], 0);
}
if((ii == 5)&&(ii+Offset < (size-1)))
{
lcd_printp_at(1,6, PSTR("\x13"), 0);
}
}
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
{
val = menu_choose2 (1, 5, target_pos,0,1);
}
else
{
val = menu_choose2 (1, size, target_pos,0,0);
}
}
else
{
val = menu_choose2 (2, 5, target_pos,1,1);
}
}
if(dmode == 1)
{
if(Offset+7 > size)
{
val = menu_choose2 (2, 6, target_pos,1,0);
}
else
{
val = menu_choose2 (2, 5, target_pos,1,1);
}
}
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{
return;
}
else
{
break;
}
 
}
target_pos = val;
 
if((val+Offset) == 1 )
motor_test(FC_Mode);
if((val+Offset) == 2 )
servo_test();
#ifdef HWVERSION3_9
if(U02SV2 == 0)
{
if((val+Offset) == 3 )
Port_BT2Wi();
if((val+Offset) == 4 )
Port_USB2Wi();
}
else if(U02SV2 == 1)
{
if((val+Offset) == 3 )
Port_BT2FC();
if((val+Offset) == 4 )
Port_USB2FC();
}
#else
if((val+Offset) == 3 )
Show_Error_HW();
if((val+Offset) == 4 )
Show_Error_HW();
#endif
if((val+Offset) == 5)
PKT_Setup();
if((val+Offset) == 6)
Show_Version();
}
}
 
 
//--------------------------------------------------------------
//
void PC_Fast_Connect (void)
{
uint8_t value = 1;
 
while(1)
{
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" PC-Quick-Verbindung "), 2);
lcd_puts_at(0, 8, strGet(TOOLS1), 2);
lcd_printp_at (3, 3, PSTR("PC BT > Kopter"), 0);
lcd_printp_at (3, 4, PSTR("PC USB > Kopter"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(2)
{
if(value == 1)
{
lcd_printp_at (1, 3, PSTR("\x1d"), 0);
lcd_printp_at (1, 4, PSTR(" "), 0);
}
else
{
lcd_printp_at (1, 3, PSTR(" "), 0);
lcd_printp_at (1, 4, PSTR("\x1d"), 0);
}
 
if(get_key_press (1 << KEY_MINUS))
value = 1;
 
if(get_key_press (1 << KEY_PLUS))
value = 2;
 
 
if(get_key_short (1 << KEY_ENTER))
{
#ifdef HWVERSION3_9
if(U02SV2 == 0)
{
if(value == 1)
Port_BT2Wi();
if(value == 2)
Port_USB2Wi();
}
else if(U02SV2 == 1)
{
if(value == 1)
Port_BT2FC();
if(value == 2)
Port_USB2FC();
}
#else
if(value == 1)
Show_Error_HW();
if(value == 2)
Show_Error_HW();
#endif
break;
}
 
if(get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
 
}
}
}
 
 
void Test_HB (void) // bleibt für Tests
{
// ADC_Init();
//
// uint16_t volt_avg = 0;
//// uint64_t volt_tmp = 0;
// uint16_t Balken = 0;
 
 
lcd_cls();
lcd_printp_at(12, 7, PSTR("Ende"), 0);
 
// lcd_rect(104, 0, 23, 8, 1); // Rahmen
 
do
{
//
//
if(samples>4095)
{
// write_ndigit_number_u(0, 4, accumulator, 5, 0);
oversampled();
volt_avg = Vin;
}
// // write_ndigit_number_u(0, 3, samples, 5, 0);
//
//// write_ndigit_number_u(0, 1, Vin, 5, 0);
// _delay_ms(50);
 
show_Lipo();
 
write_ndigit_number_u_100th(5, 5, volt_avg, 0, 0);
lcd_printp_at(10, 5, PSTR("Volt"), 0);
//
//
//
write_ndigit_number_u(0, 6, Lipo_UOffset, 5, 0);
// write_ndigit_number_u(15, 6, WarnCount, 4, 0);
//// write_ndigit_number_u(10, 5, Vcorr, 4, 0);
 
 
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
Lipo_UOffset = Lipo_UOffset +10;
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS),3))
{
Lipo_UOffset = Lipo_UOffset -10;
}
//
}
 
 
while(!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/tools.h
0,0 → 1,41
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _tools_H
#define _tools_H
 
void PKT_Tools (void);
void Test_HB (void); // TestTool für Softwareentwicklung
 
#endif
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/twimaster.c
0,0 → 1,511
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) Holger Buss, Ingo Busker
// + Nur f?r den privaten Gebrauch
// + www.MikroKopter.com
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt f?r das gesamte Projekt (Hardware, Software, Bin?rfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur f?r den privaten (nicht-kommerziellen) Gebrauch zul?ssig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Best?ckung und Verkauf von Platinen oder Baus?tzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder ver?ffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright m?ssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien ver?ffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gew?hr auf Fehlerfreiheit, Vollst?ndigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir ?bernehmen keinerlei Haftung f?r direkte oder indirekte Personen- oder Sachsch?den
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zul?ssig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/twi.h>
#include <util/delay.h>
#include "eeprom.h"
#include "twimaster.h"
#include "timer.h"
 
volatile uint8_t twi_state = TWI_STATE_MOTOR_TX;
volatile uint8_t dac_channel = 0;
volatile uint8_t motor_write = 0;
volatile uint8_t motor_read = 0;
volatile uint8_t I2C_TransferActive = 0;
 
volatile uint16_t I2CTimeout = 100;
 
uint8_t MissingMotor = 0;
uint8_t RequiredMotors = 1;
char MotorenEin = 0;
 
volatile uint8_t BLFlags = 0;
 
MotorData_t Motor[MAX_MOTORS];
 
// bit mask for witch BL the configuration should be sent
volatile uint16_t BLConfig_WriteMask = 0;
// bit mask for witch BL the configuration should be read
volatile uint16_t BLConfig_ReadMask = 0;
// buffer for BL Configuration
BLConfig_t BLConfig;
 
#define I2C_WriteByte(byte) {TWDR = byte; TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);}
#define I2C_ReceiveByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);}
#define I2C_ReceiveLastByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);}
 
#define SCL_CLOCK 200000L
#define I2C_TIMEOUT 30000
#define TWI_BASE_ADDRESS 0x52
 
 
 
 
uint8_t RAM_Checksum(uint8_t* pBuffer, uint16_t len)
{
uint8_t crc = 0xAA;
uint16_t i;
 
for(i=0; i<len; i++)
{
crc += pBuffer[i];
}
return crc;
}
 
 
 
 
//--------------------------------------------------------------
// Initialize I2C (TWI)
//
void I2C_Init(char clear)
{
uint8_t i;
uint8_t sreg = SREG;
cli();
 
// SDA is INPUT
DDRC &= ~(1<<DDC1);
// SCL is output
DDRC |= (1<<DDC0);
// pull up SDA
//PORTC |= (1<<PORTC0)|(1<<PORTC1);
 
// TWI Status Register
// prescaler 1 (TWPS1 = 0, TWPS0 = 0)
TWSR &= ~((1<<TWPS1)|(1<<TWPS0));
 
// set TWI Bit Rate Register
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
 
twi_state = TWI_STATE_MOTOR_TX;
motor_write = 0;
motor_read = 0;
 
if(clear) for(i=0; i < MAX_MOTORS; i++)
{
Motor[i].Version = 0;
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
Motor[i].State = 0;
Motor[i].ReadMode = BL_READMODE_STATUS;
Motor[i].Current = 0;
Motor[i].MaxPWM = 0;
Motor[i].Temperature = 0;
}
sei();
SREG = sreg;
}
 
 
//--------------------------------------------------------------
void I2C_Reset(void)
{
// stop i2c bus
I2C_Stop(TWI_STATE_MOTOR_TX);
TWCR = (1<<TWINT); // reset to original state incl. interrupt flag reset
TWAMR = 0;
TWAR = 0;
TWDR = 0;
TWSR = 0;
TWBR = 0;
I2C_TransferActive = 0;
I2C_Init(0);
I2C_WriteByte(0);
BLFlags |= BLFLAG_READ_VERSION;
}
 
 
//--------------------------------------------------------------
// I2C ISR
//
ISR (TWI_vect)
{
static uint8_t missing_motor = 0, motor_read_temperature = 0;
static uint8_t *pBuff = 0;
static uint8_t BuffLen = 0;
 
switch (twi_state++)
{
// Master Transmit
 
case 0: // TWI_STATE_MOTOR_TX
I2C_TransferActive = 1;
// skip motor if not used in mixer
// while((Mixer.Motor[motor_write][MIX_GAS] <= 0) && (motor_write < MAX_MOTORS)) motor_write++;
if(motor_write >= MAX_MOTORS) // writing finished, read now
{
BLConfig_WriteMask = 0; // reset configuration bitmask
motor_write = 0; // reset motor write counter for next cycle
twi_state = TWI_STATE_MOTOR_RX;
I2C_WriteByte(TWI_BASE_ADDRESS + TW_READ + (motor_read<<1) ); // select slave address in rx mode
}
else I2C_WriteByte(TWI_BASE_ADDRESS + TW_WRITE + (motor_write<<1) ); // select slave address in tx mode
break;
 
case 1: // Send Data to Slave
I2C_WriteByte(Motor[motor_write].SetPoint); // transmit setpoint
// if old version has been detected
if(!(Motor[motor_write].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
{
twi_state = 4; //jump over sending more data
}
// the new version has been detected
else if(!( (Motor[motor_write].SetPointLowerBits && (RequiredMotors < 7)) || BLConfig_WriteMask || BLConfig_ReadMask ) )
{ // or LowerBits are zero and no BlConfig should be sent (saves round trip time)
twi_state = 4; //jump over sending more data
}
break;
 
case 2: // lower bits of setpoint (higher resolution)
if ((0x0001<<motor_write) & BLConfig_ReadMask)
{
Motor[motor_write].ReadMode = BL_READMODE_CONFIG; // configuration request
}
else
{
Motor[motor_write].ReadMode = BL_READMODE_STATUS; // normal status request
}
// send read mode and the lower bits of setpoint
I2C_WriteByte((Motor[motor_write].ReadMode<<3)|(Motor[motor_write].SetPointLowerBits & 0x07));
// configuration tranmission request?
if((0x0001<<motor_write) & BLConfig_WriteMask)
{ // redirect tx pointer to configuration data
pBuff = (uint8_t*)&BLConfig; // select config for motor
BuffLen = sizeof(BLConfig_t);
}
else
{ // jump to end of transmission for that motor
twi_state = 4;
}
break;
 
case 3: // send configuration
I2C_WriteByte(*pBuff);
pBuff++;
if(--BuffLen > 0)
twi_state = 3; // if there are some bytes left
break;
 
case 4: // repeat case 0-4 for all motors
if(TWSR == TW_MT_DATA_NACK) // Data transmitted, NACK received
{
if(!missing_motor)
missing_motor = motor_write + 1;
 
if((Motor[motor_write].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK)
Motor[motor_write].State++; // increment error counter and handle overflow
}
I2C_Stop(TWI_STATE_MOTOR_TX);
I2CTimeout = 10;
motor_write++; // next motor
I2C_Start(TWI_STATE_MOTOR_TX); // Repeated start -> switch slave or switch Master Transmit -> Master Receive
break;
 
// Master Receive Data
case 5: // TWI_STATE_MOTOR_RX
if(TWSR != TW_MR_SLA_ACK) // SLA+R transmitted but no ACK received
{ // no response from the addressed slave received
Motor[motor_read].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit
if(++motor_read >= MAX_MOTORS)
{ // all motors read
motor_read = 0; // restart from beginning
BLConfig_ReadMask = 0; // reset read configuration bitmask
if(++motor_read_temperature >= MAX_MOTORS)
{
motor_read_temperature = 0;
BLFlags &= ~BLFLAG_READ_VERSION;
}
}
BLFlags |= BLFLAG_TX_COMPLETE;
I2C_Stop(TWI_STATE_MOTOR_TX);
I2C_TransferActive = 0;
}
else
{ // motor successfully addressed
Motor[motor_read].State |= MOTOR_STATE_PRESENT_MASK; // set present bit
if(Motor[motor_read].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)
{
// new BL found
switch(Motor[motor_read].ReadMode)
{
case BL_READMODE_CONFIG:
pBuff = (uint8_t*)&BLConfig;
BuffLen = sizeof(BLConfig_t);
break;
 
case BL_READMODE_STATUS:
pBuff = (uint8_t*)&(Motor[motor_read].Current);
if(motor_read == motor_read_temperature) BuffLen = 3; // read Current, MaxPwm & Temp
else BuffLen = 1;// read Current only
break;
}
}
else // old BL version
{
pBuff = (uint8_t*)&(Motor[motor_read].Current);
if((BLFlags & BLFLAG_READ_VERSION) || (motor_read == motor_read_temperature)) BuffLen = 2; // Current & MaxPwm
else BuffLen = 1; // read Current only
}
if(BuffLen == 1)
{
I2C_ReceiveLastByte(); // read last byte
}
else
{
I2C_ReceiveByte(); // read next byte
}
}
MissingMotor = missing_motor;
missing_motor = 0;
break;
 
case 6: // receive bytes
*pBuff = TWDR;
pBuff++;
BuffLen--;
if(BuffLen>1)
{
I2C_ReceiveByte(); // read next byte
}
else if (BuffLen == 1)
{
I2C_ReceiveLastByte(); // read last byte
}
else // nothing left
{
if(BLFlags & BLFLAG_READ_VERSION)
{
// if(!(FC_StatusFlags & FC_STATUS_MOTOR_RUN) && (Motor[motor_read].MaxPWM == 250) ) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK;
if((Motor[motor_read].MaxPWM == 250) ) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK;
else Motor[motor_read].Version = 0;
}
if(++motor_read >= MAX_MOTORS)
{
motor_read = 0; // restart from beginning
BLConfig_ReadMask = 0; // reset read configuration bitmask
if(++motor_read_temperature >= MAX_MOTORS)
{
motor_read_temperature = 0;
BLFlags &= ~BLFLAG_READ_VERSION;
}
}
I2C_Stop(TWI_STATE_MOTOR_TX);
BLFlags |= BLFLAG_TX_COMPLETE;
I2C_TransferActive = 0;
return;
}
twi_state = 6; // if there are some bytes left
break;
 
case 21:
I2C_WriteByte(0x80); // 2nd byte for all channels is 0x80
break;
 
case 22:
I2C_Stop(TWI_STATE_MOTOR_TX);
I2C_TransferActive = 0;
I2CTimeout = 10;
// repeat case 18...22 until all DAC Channels are updated
if(dac_channel < 2)
{
dac_channel ++; // jump to next channel
I2C_Start(TWI_STATE_GYRO_OFFSET_TX); // start transmission for next channel
}
else
{
dac_channel = 0; // reset dac channel counter
BLFlags |= BLFLAG_TX_COMPLETE;
}
break;
 
default:
I2C_Stop(TWI_STATE_MOTOR_TX);
BLFlags |= BLFLAG_TX_COMPLETE;
I2CTimeout = 10;
motor_write = 0;
motor_read = 0;
I2C_TransferActive = 0;
break;
}
 
}
 
 
//--------------------------------------------------------------
uint8_t I2C_WriteBLConfig(uint8_t motor)
{
uint8_t i;
uint16_t timer;
 
// if(MotorenEin || PC_MotortestActive)
// return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(MotorenEin)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(motor > MAX_MOTORS)
return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(motor)
{
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK))
return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL!
}
 
// check BL configuration to send
if(BLConfig.Revision != BLCONFIG_REVISION)
return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison
 
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1);
 
if(i != BLConfig.crc)
return(BLCONFIG_ERR_CHECKSUM); // bad checksum
 
timer = SetDelay(2000);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
// prepare the bitmask
if(!motor) // 0 means all
{
BLConfig_WriteMask = 0xFF; // all motors at once with the same configuration
}
else //only one specific motor
{
BLConfig_WriteMask = 0x0001<<(motor-1);
}
for(i = 0; i < MAX_MOTORS; i++)
{
if((0x0001<<i) & BLConfig_WriteMask)
{
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
}
}
 
motor_write = 0;
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms)
do
{
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
while(BLConfig_WriteMask && !CheckDelay(timer)); // repeat until the BL config has been sent
 
if(BLConfig_WriteMask) return(BLCONFIG_ERR_MOTOR_NOT_EXIST);
return(BLCONFIG_SUCCESS);
}
 
 
//--------------------------------------------------------------
uint8_t I2C_ReadBLConfig(uint8_t motor)
{
uint8_t i;
uint16_t timer;
 
// if(MotorenEin || PC_MotortestActive)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(MotorenEin)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(motor > MAX_MOTORS)
return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(motor == 0)
return (BLCONFIG_ERR_READ_NOT_POSSIBLE);
 
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK))
return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL!
 
timer = SetDelay(2000);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
// prepare the bitmask
BLConfig_ReadMask = 0x0001<<(motor-1);
 
for(i = 0; i < MAX_MOTORS; i++)
{
if((0x0001<<i) & BLConfig_ReadMask)
{
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
}
}
 
motor_read = 0;
BLConfig.Revision = 0; // bad revision
BLConfig.crc = 0; // bad checksum
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms)
do
{
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}while(BLConfig_ReadMask && !CheckDelay(timer)); // repeat until the BL config has been received from all motors
// validate result
if(BLConfig.Revision != BLCONFIG_REVISION) return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1);
if(i != BLConfig.crc) return(BLCONFIG_ERR_CHECKSUM); // bad checksum
return(BLCONFIG_SUCCESS);
}
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/twimaster.h
0,0 → 1,100
#ifndef _I2C_MASTER_H
#define _I2C_MASTER_H
+
+#include <inttypes.h>
+
+#define TWI_STATE_MOTOR_TX 0
+#define TWI_STATE_MOTOR_RX 5
+#define TWI_STATE_GYRO_OFFSET_TX 18
+
+extern volatile uint8_t twi_state;
+extern volatile uint8_t motor_write;
+extern volatile uint8_t motor_read;
+extern volatile uint8_t I2C_TransferActive;
+
+extern uint8_t MissingMotor;
+
+#define MAX_MOTORS 12
+#define MOTOR_STATE_PRESENT_MASK 0x80
+#define MOTOR_STATE_ERROR_MASK 0x7F
+#define MOTOR_STATE_NEW_PROTOCOL_MASK 0x01
+#define BLFLAG_TX_COMPLETE 0x01
+#define BLFLAG_READ_VERSION 0x02
+
+extern volatile uint8_t BLFlags;
+extern char MotorenEin;
+unsigned char MotorTest[16];
+#define BL_READMODE_STATUS 0
+#define BL_READMODE_CONFIG 16
+
+typedef struct
+{
+ uint8_t Version; // the version of the BL (0 = old)
+ uint8_t SetPoint; // written by attitude controller
+ uint8_t SetPointLowerBits; // for higher Resolution of new BLs
+ uint8_t State; // 7 bit for I2C error counter, highest bit indicates if motor is present
+ uint8_t ReadMode; // select data to read
+ // the following bytes must be exactly in that order!
+ uint8_t Current; // in 0.1 A steps, read back from BL
+ uint8_t MaxPWM; // read back from BL is less than 255 if BL is in current limit
+ int8_t Temperature; // old BL-Ctrl will return a 255 here, the new version the temp. in �C
+} __attribute__((packed)) MotorData_t;
+
+extern MotorData_t Motor[MAX_MOTORS];
+
+#define BLCONFIG_REVISION 2
+
+#define MASK_SET_PWM_SCALING 0x01
+#define MASK_SET_CURRENT_LIMIT 0x02
+#define MASK_SET_TEMP_LIMIT 0x04
+#define MASK_SET_CURRENT_SCALING 0x08
+#define MASK_SET_BITCONFIG 0x10
+#define MASK_RESET_CAPCOUNTER 0x20
+#define MASK_SET_DEFAULT_PARAMS 0x40
+#define MASK_SET_SAVE_EEPROM 0x80
+
+#define BITCONF_REVERSE_ROTATION 0x01
+#define BITCONF_RES1 0x02
+#define BITCONF_RES2 0x04
+#define BITCONF_RES3 0x08
+#define BITCONF_RES4 0x10
+#define BITCONF_RES5 0x20
+#define BITCONF_RES6 0x40
+#define BITCONF_RES7 0x80
+
+typedef struct
+{
+ uint8_t Revision; // must be BL_REVISION
+ uint8_t SetMask; // settings mask
+ uint8_t PwmScaling; // maximum value of control pwm, acts like a thrust limit
+ uint8_t CurrentLimit; // current limit in A
+ uint8_t TempLimit; // in �C
+ uint8_t CurrentScaling; // scaling factor for current measurement
+ uint8_t BitConfig; // see defines above
+ uint8_t crc; // checksum
+} __attribute__((packed)) BLConfig_t;
+
+extern BLConfig_t BLConfig;
+
+extern volatile uint16_t I2CTimeout;
+
+void I2C_Init(char); // Initialize I2C
+#define I2C_Start(start_state) {twi_state = start_state; BLFlags &= ~BLFLAG_TX_COMPLETE; TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);}
+#define I2C_Stop(start_state) {twi_state = start_state; TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);}
+void I2C_Reset(void); // Reset I2C
+
+#define BLCONFIG_SUCCESS 0
+#define BLCONFIG_ERR_MOTOR_RUNNING 1
+#define BLCONFIG_ERR_MOTOR_NOT_EXIST 2
+#define BLCONFIG_ERR_HW_NOT_COMPATIBLE 3
+#define BLCONFIG_ERR_SW_NOT_COMPATIBLE 4
+#define BLCONFIG_ERR_CHECKSUM 5
+#define BLCONFIG_ERR_READ_NOT_POSSIBLE 6
+
+uint8_t I2C_WriteBLConfig(uint8_t motor);
+uint8_t I2C_ReadBLConfig(uint8_t motor);
+
+#endif
+
+
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/uart1.c
0,0 → 1,303
/*************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: uart.c,v 1.6.2.2 2009/11/29 08:56:12 Peter Exp $
Software: AVR-GCC 4.1, AVR Libc 1.4.6 or higher
Hardware: any AVR with built-in UART,
License: GNU General Public License
 
DESCRIPTION:
An interrupt is generated when the UART has finished transmitting or
receiving a byte. The interrupt handling routines use circular buffers
for buffering received and transmitted data.
 
The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define
the buffer size in bytes. Note that these variables must be a
power of 2.
 
USAGE:
Refere to the header file uart.h for a description of the routines.
See also example test_uart.c.
 
NOTES:
Based on Atmel Application Note AVR306
 
LICENSE:
Copyright (C) 2006 Peter Fleury
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
*************************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "uart1.h"
#include "main.h"
 
//
// constants and macros
//
 
 
// size of RX/TX buffers
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)
 
#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
 
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
#error TX buffer size is not a power of 2
#endif
 
 
// ATmega with two USART
 
#define ATMEGA_USART1
 
#define UART1_STATUS UCSR1A
#define UART1_CONTROL UCSR1B
#define UART1_DATA UDR1
#define UART1_UDRIE UDRIE1
 
 
 
//
// module global variables
//
 
#if defined( ATMEGA_USART1 )
static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART1_TxHead;
static volatile unsigned char UART1_TxTail;
static volatile unsigned char UART1_RxHead;
static volatile unsigned char UART1_RxTail;
static volatile unsigned char UART1_LastRxError;
#endif
 
 
 
 
//
// these functions are only for ATmegas with two USART
//
 
 
#if defined( ATMEGA_USART1 )
 
//--------------------------------------------------------------
// Function: UART1 Receive Complete interrupt
// Purpose: called when the UART1 has received a character
//--------------------------------------------------------------
ISR(USART1_RX_vect)
{
unsigned char tmphead;
unsigned char data;
unsigned char usr;
unsigned char lastRxError;
 
 
// read UART status register and UART data register
usr = UART1_STATUS;
data = UART1_DATA;
 
lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) );
 
// calculate buffer index
tmphead = ( UART1_RxHead + 1) & UART_RX_BUFFER_MASK;
 
if ( tmphead == UART1_RxTail )
{
// error: receive buffer overflow
lastRxError = UART_BUFFER_OVERFLOW >> 8;
}
else
{
// store new index
UART1_RxHead = tmphead;
// store received data in buffer
UART1_RxBuf[tmphead] = data;
}
UART1_LastRxError = lastRxError;
}
 
 
//--------------------------------------------------------------
// Function: UART1 Data Register Empty interrupt
// Purpose: called when the UART1 is ready to transmit the next byte
//--------------------------------------------------------------
ISR(USART1_UDRE_vect)
{
unsigned char tmptail;
 
 
if ( UART1_TxHead != UART1_TxTail)
{
// calculate and store new buffer index
tmptail = (UART1_TxTail + 1) & UART_TX_BUFFER_MASK;
UART1_TxTail = tmptail;
// get one byte from buffer and write it to UART
UART1_DATA = UART1_TxBuf[tmptail]; // start transmission
}
else
{
// tx buffer empty, disable UDRE interrupt
UART1_CONTROL &= ~_BV(UART1_UDRIE);
}
}
 
 
//--------------------------------------------------------------
// Function: uart1_init()
// Purpose: initialize UART1 and set baudrate
// Input: baudrate using macro UART_BAUD_SELECT()
// Returns: none
//--------------------------------------------------------------
void uart1_init(unsigned int baudrate)
{
UART1_TxHead = 0;
UART1_TxTail = 0;
UART1_RxHead = 0;
UART1_RxTail = 0;
 
 
// Set baud rate
if ( baudrate & 0x8000 )
{
UART1_STATUS = (1<<U2X1); //Enable 2x speed
baudrate &= ~0x8000;
}
UBRR1H = (unsigned char)(baudrate>>8);
UBRR1L = (unsigned char) baudrate;
 
// Enable USART receiver and transmitter and receive complete interrupt
UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
 
// Set frame format: asynchronous, 8data, no parity, 1stop bit
#ifdef URSEL1
UCSR1C = (1<<URSEL1)|(3<<UCSZ10);
#else
UCSR1C = (3<<UCSZ10);
#endif
}
 
 
//--------------------------------------------------------------
// Function: uart1_getc()
// Purpose: return byte from ringbuffer
// Returns: lower byte: received byte from ringbuffer
// higher byte: last receive error
//--------------------------------------------------------------
unsigned int uart1_getc(void)
{
unsigned char tmptail;
unsigned char data;
 
 
if ( UART1_RxHead == UART1_RxTail )
{
return UART_NO_DATA; // no data available
}
 
// calculate /store buffer index
tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK;
UART1_RxTail = tmptail;
 
// get data from receive buffer
data = UART1_RxBuf[tmptail];
 
return (UART1_LastRxError << 8) + data;
 
}
 
 
//--------------------------------------------------------------
// Function: uart1_putc()
// Purpose: write byte to ringbuffer for transmitting via UART
// Input: byte to be transmitted
// Returns: 1 on succes, 0 if remote not ready
//--------------------------------------------------------------
int uart1_putc(unsigned char data)
{
unsigned char tmphead;
 
 
tmphead = (UART1_TxHead + 1) & UART_TX_BUFFER_MASK;
 
while ( tmphead == UART1_TxTail )
{;} // wait for free space in buffer
 
UART1_TxBuf[tmphead] = data;
UART1_TxHead = tmphead;
 
// enable UDRE interrupt
UART1_CONTROL |= _BV(UART1_UDRIE);
return (UART1_LastRxError << 8) + data;
}
 
 
//--------------------------------------------------------------
// Function: uart1_puts()
// Purpose: transmit string to UART1
// Input: string to be transmitted
// Returns: none
//--------------------------------------------------------------
void uart1_puts(const char *s )
{
while (*s)
uart1_putc(*s++);
}
 
 
//--------------------------------------------------------------
// Function: uart1_puts_p()
// Purpose: transmit string from program memory to UART1
// Input: program memory string to be transmitted
// Returns: none
//--------------------------------------------------------------
void uart1_puts_p(const char *progmem_s )
{
register char c;
while ( (c = pgm_read_byte(progmem_s++)) )
uart1_putc(c);
}
 
 
//--------------------------------------------------------------
// Function: uart1_available()
// Purpose: Determine the number of bytes waiting in the receive buffer
// Input: None
// Returns: Integer number of bytes in the receive buffer
//--------------------------------------------------------------
int uart1_available(void)
{
return (UART_RX_BUFFER_MASK + UART1_RxHead - UART1_RxTail) % UART_RX_BUFFER_MASK;
}
 
 
 
//--------------------------------------------------------------
// Function: uart1_flush()
// Purpose: Flush bytes waiting the receive buffer. Acutally ignores them.
// Input: None
// Returns: None
//--------------------------------------------------------------
void uart1_flush(void)
{
UART1_RxHead = UART1_RxTail;
}
 
 
#endif
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/uart1.h
0,0 → 1,167
/************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: uart.h,v 1.8.2.1 2007/07/01 11:14:38 peter Exp $
Software: AVR-GCC 4.1, AVR Libc 1.4
Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
License: GNU General Public License
Usage: see Doxygen manual
 
LICENSE:
Copyright (C) 2006 Peter Fleury
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
************************************************************************/
 
//
// @defgroup pfleury_uart UART Library
// @code #include <uart.h> @endcode
//
// @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.
//
// This library can be used to transmit and receive data through the built in UART.
//
// An interrupt is generated when the UART has finished transmitting or
// receiving a byte. The interrupt handling routines use circular buffers
// for buffering received and transmitted data.
//
// The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define
// the size of the circular buffers in bytes. Note that these constants must be a power of 2.
// You may need to adapt this constants to your target and your application by adding
// CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile.
//
// @note Based on Atmel Application Note AVR306
// @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury
//
 
#ifndef UART_H
#define UART_H
 
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
 
 
// constants and macros
 
 
// @brief UART Baudrate Expression
// @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
// @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
//
#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1)
 
// @brief UART Baudrate Expression for ATmega double speed mode
// @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
// @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
//
#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) (((xtalCpu)/((baudRate)*8l)-1)|0x8000)
 
 
// Size of the circular receive buffer, must be power of 2
#ifndef UART_RX_BUFFER_SIZE
#define UART_RX_BUFFER_SIZE 32
#endif
 
// Size of the circular transmit buffer, must be power of 2
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 32
#endif
 
// test if the size of the circular buffers fits into SRAM
#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) )
#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM"
#endif
 
 
// high byte error return code of uart_getc()
 
#define UART_FRAME_ERROR 0x0800 // Framing Error by UART
#define UART_OVERRUN_ERROR 0x0400 // Overrun condition by UART
#define UART_BUFFER_OVERFLOW 0x0200 // receive ringbuffer overflow
#define UART_NO_DATA 0x0100 // no receive data available
 
 
//
// function prototypes
//
 
//
// @brief Initialize UART and set baudrate
// @param baudrate Specify baudrate using macro UART_BAUD_SELECT()
// @return none
//
extern void uart_init(unsigned int baudrate);
 
 
//
// @brief Get received byte from ringbuffer
//
// Returns in the lower byte the received character and in the
// higher byte the last receive error.
// UART_NO_DATA is returned when no data is available.
//
// @param void
// @return lower byte: received byte from ringbuffer
// @return higher byte: last receive status
// - \b 0 successfully received data from UART
// - \b UART_NO_DATA
// <br>no receive data available
// - \b UART_BUFFER_OVERFLOW
// <br>Receive ringbuffer overflow.
// We are not reading the receive buffer fast enough,
// one or more received character have been dropped
// - \b UART_OVERRUN_ERROR
// <br>Overrun condition by UART.
// A character already present in the UART UDR register was
// not read by the interrupt handler before the next character arrived,
// one or more received characters have been dropped.
// - \b UART_FRAME_ERROR
// <br>Framing Error by UART
//
extern unsigned int uart_getc(void);
 
 
//
// @brief Put byte to ringbuffer for transmitting via UART
// @param data byte to be transmitted
// @return none
//
 
 
 
 
// @brief Initialize USART1 (only available on selected ATmegas) @see uart_init
extern void uart1_init(unsigned int baudrate);
 
// @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc
extern unsigned int uart1_getc(void);
 
// @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc
//extern void uart1_putc(unsigned char data);
extern int uart1_putc(unsigned char data);
 
// @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts
extern void uart1_puts(const char *s );
 
// @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p
extern void uart1_puts_p(const char *s );
 
// @brief Macro to automatically put a string constant into program memory
#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
 
extern char *utoa1(char* buffer, const unsigned int size, unsigned int value);
 
 
#endif // UART_H
 
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/usart.c
0,0 → 1,634
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <stdarg.h>
 
#include "main.h"
#include "usart.h"
#include "lcd.h"
#include "timer.h"
 
uint8_t buffer[30];
 
volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
volatile uint8_t txd_complete = TRUE;
 
volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
volatile uint8_t rxd_buffer_locked = FALSE;
volatile uint8_t ReceivedBytes = 0;
volatile uint8_t *pRxData = 0;
volatile uint8_t RxDataLen = 0;
 
volatile uint16_t stat_crc_error = 0;
volatile uint16_t stat_overflow_error = 0;
 
volatile uint8_t rx_byte;
volatile uint8_t rxFlag = 0;
 
 
#define UART_RXBUFSIZE 64
#define UART_NO_DATA 0x0100 /* no receive data available */
 
volatile static uint8_t rxbuf[UART_RXBUFSIZE];
volatile static uint8_t *volatile rxhead, *volatile rxtail;
 
 
/*
 
//-----------------------------------------------------------------------------
// USART1 transmitter ISR
ISR (USART1_TX_vect)
{
static uint16_t ptr_txd1_buffer = 0;
uint8_t tmp_tx1;
 
if(!txd1_complete) // transmission not completed
{
ptr_txd1_buffer++; // [0] was already sent
tmp_tx1 = txd1_buffer[ptr_txd1_buffer];
// if terminating character or end of txd buffer was reached
if((tmp_tx1 == '\r') || (ptr_txd1_buffer == TXD_BUFFER_LEN))
{
ptr_txd1_buffer = 0; // reset txd pointer
txd1_complete = TRUE; // stop transmission
}
UDR1 = tmp_tx1; // send current byte will trigger this ISR again
}
// transmission completed
else ptr_txd1_buffer = 0;
}
 
*/
 
 
#ifdef USART_INT
//-----------------------------------------------------------------------------
// USART0 transmitter ISR
ISR (USART_TX_vect)
{
static uint16_t ptr_txd_buffer = 0;
uint8_t tmp_tx;
 
if(!txd_complete) // transmission not completed
{
ptr_txd_buffer++; // [0] was already sent
tmp_tx = txd_buffer[ptr_txd_buffer];
// if terminating character or end of txd buffer was reached
if((tmp_tx == '\r') || (ptr_txd_buffer == TXD_BUFFER_LEN))
{
ptr_txd_buffer = 0; // reset txd pointer
txd_complete = TRUE; // stop transmission
}
UDR = tmp_tx; // send current byte will trigger this ISR again
}
// transmission completed
else ptr_txd_buffer = 0;
}
#endif
 
 
 
 
 
//-----------------------------------------------------------------------------
//
 
//
//uint8_t uart_getc_nb(uint8_t *c)
//{
// if (rxhead==rxtail) return 0;
// *c = *rxtail;
// if (++rxtail == (rxbuf + UART_RXBUFSIZE)) rxtail = rxbuf;
// return 1;
//}
 
 
 
 
ISR (USART0_RX_vect)
{
static uint16_t crc;
static uint8_t ptr_rxd_buffer = 0;
uint8_t crc1, crc2;
uint8_t c;
// IdleTimer = 0;
if (current_hardware == Wi232)
{
// rx_byte = c;
// rxFlag = 1;
int diff;
uint8_t c;
c=UDR;
diff = rxhead - rxtail;
if (diff < 0) diff += UART_RXBUFSIZE;
if (diff < UART_RXBUFSIZE -1)
{
*rxhead = c;
++rxhead;
if (rxhead == (rxbuf + UART_RXBUFSIZE)) rxhead = rxbuf;
};
// USART_putc (c);
return;
}
 
 
if (current_hardware == MKGPS)
{
// rx_byte = c;
// rxFlag = 1;
int diff;
uint8_t c;
c=UDR;
diff = rxhead - rxtail;
if (diff < 0) diff += UART_RXBUFSIZE;
if (diff < UART_RXBUFSIZE -1)
{
*rxhead = c;
++rxhead;
if (rxhead == (rxbuf + UART_RXBUFSIZE)) rxhead = rxbuf;
};
 
return;
}
 
c = UDR; // catch the received byte
 
 
if (rxd_buffer_locked)
return; // if rxd buffer is locked immediately return
 
// the rxd buffer is unlocked
if ((ptr_rxd_buffer == 0) && (c == '#')) // if rxd buffer is empty and syncronisation character is received
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
crc = c; // init crc
}
else if (ptr_rxd_buffer < RXD_BUFFER_LEN) // collect incomming bytes
{
if(c != '\r') // no termination character
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
}
else // termination character was received
{
// the last 2 bytes are no subject for checksum calculation
// they are the checksum itself
crc -= rxd_buffer[ptr_rxd_buffer-2];
crc -= rxd_buffer[ptr_rxd_buffer-1];
// calculate checksum from transmitted data
crc %= 4096;
crc1 = '=' + crc / 64;
crc2 = '=' + crc % 64;
// compare checksum to transmitted checksum bytes
if((crc1 == rxd_buffer[ptr_rxd_buffer-2]) && (crc2 == rxd_buffer[ptr_rxd_buffer-1]))
{ // checksum valid
rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character
ReceivedBytes = ptr_rxd_buffer + 1;// store number of received bytes
if (mode == rxd_buffer[2])
{
rxd_buffer_locked = TRUE; // lock the rxd buffer
// if 2nd byte is an 'R' enable watchdog that will result in an reset
if(rxd_buffer[2] == 'R') {wdt_enable(WDTO_250MS);} // Reset-Commando
}
}
else
{ // checksum invalid
stat_crc_error++;
rxd_buffer_locked = FALSE; // unlock rxd buffer
}
ptr_rxd_buffer = 0; // reset rxd buffer pointer
}
}
else // rxd buffer overrun
{
stat_overflow_error++;
ptr_rxd_buffer = 0; // reset rxd buffer
rxd_buffer_locked = FALSE; // unlock rxd buffer
}
}
 
 
//-----------------------------------------------------------------------------
// Function: uart0_getc()
// Purpose: return byte from ringbuffer
// Returns: lower byte: received byte from ringbuffer
// higher byte: last receive error
//-----------------------------------------------------------------------------
char USART_getc(void)
{
char val;
 
// while(rxhead==rxtail) ;
if (rxhead==rxtail)
return val=0;
// IdleTimer = 0;
val = *rxtail;
if (++rxtail == (rxbuf + UART_RXBUFSIZE))
rxtail = rxbuf;
 
return val;
}
 
 
uint8_t uart_getc_nb(uint8_t *c)
{
if (rxhead==rxtail)
return 0;
// IdleTimer = 0;
*c = *rxtail;
if (++rxtail == (rxbuf + UART_RXBUFSIZE))
rxtail = rxbuf;
return 1;
}
//-----------------------------------------------------------------------------
//
 
 
 
 
 
//-----------------------------------------------------------------------------
//
void USART_Init (unsigned int baudrate)
{
// set clock divider
// #undef BAUD
// #define BAUD baudrate
// #include <util/setbaud.h>
// UBRRH = UBRRH_VALUE;
// UBRRL = UBRRL_VALUE;
 
UBRRH = (unsigned char)(baudrate>>8);
UBRRL = (unsigned char) baudrate;
 
#if USE_2X
UCSRA |= (1 << U2X); // enable double speed operation
#else
UCSRA &= ~(1 << U2X); // disable double speed operation
#endif
 
// set 8N1
#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega32__)
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
#else
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
#endif
UCSRB &= ~(1 << UCSZ2);
 
// flush receive buffer
while ( UCSRA & (1 << RXC) ) UDR;
 
UCSRB |= (1 << RXEN) | (1 << TXEN);
#ifdef USART_INT
UCSRB |= (1 << RXCIE) | (1 << TXCIE);
#else
UCSRB |= (1 << RXCIE);
#endif
 
rxhead = rxtail = rxbuf;
 
}
 
 
 
 
 
//-----------------------------------------------------------------------------
// disable the txd pin of usart
void USART_DisableTXD (void)
{
#ifdef USART_INT
UCSRB &= ~(1 << TXCIE); // disable TX-Interrupt
#endif
UCSRB &= ~(1 << TXEN); // disable TX in USART
DDRB &= ~(1 << DDB3); // set TXD pin as input
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
}
 
//-----------------------------------------------------------------------------
// enable the txd pin of usart
void USART_EnableTXD (void)
{
DDRB |= (1 << DDB3); // set TXD pin as output
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
UCSRB |= (1 << TXEN); // enable TX in USART
#ifdef USART_INT
UCSRB |= (1 << TXCIE); // enable TX-Interrupt
#endif
}
 
//-----------------------------------------------------------------------------
// short script to directly send a request thorugh usart including en- and disabling it
// where <address> is the address of the receipient, <label> is which data set to request
// and <ms> represents the milliseconds delay between data
void USART_request_mk_data (uint8_t cmd, uint8_t addr, uint8_t ms)
{
USART_EnableTXD (); // re-enable TXD pin
 
unsigned char mstenth = ms/10;
SendOutData(cmd, addr, 1, &mstenth, 1);
// wait until command transmitted
while (txd_complete == FALSE);
 
USART_DisableTXD (); // disable TXD pin again
}
 
//-----------------------------------------------------------------------------
//
void USART_putc (char c)
{
#ifdef USART_INT
#else
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
#endif
}
 
 
 
//-----------------------------------------------------------------------------
//
void USART_puts (char *s)
{
#ifdef USART_INT
#else
while (*s)
{
USART_putc (*s);
s++;
}
#endif
}
 
//-----------------------------------------------------------------------------
//
void USART_puts_p (const char *s)
{
#ifdef USART_INT
#else
while (pgm_read_byte(s))
{
USART_putc (pgm_read_byte(s));
s++;
}
#endif
}
 
//-----------------------------------------------------------------------------
//
void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...) // uint8_t *pdata, uint8_t len, ...
{
va_list ap;
uint16_t pt = 0;
uint8_t a,b,c;
uint8_t ptr = 0;
uint16_t tmpCRC = 0;
 
uint8_t *pdata = 0;
int len = 0;
 
txd_buffer[pt++] = '#'; // Start character
txd_buffer[pt++] = 'a' + addr; // Address (a=0; b=1,...)
txd_buffer[pt++] = cmd; // Command
 
va_start(ap, numofbuffers);
if(numofbuffers)
{
pdata = va_arg (ap, uint8_t*);
len = va_arg (ap, int);
ptr = 0;
numofbuffers--;
}
 
while(len)
{
if(len)
{
a = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
a = 0;
 
if(len)
{
b = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
b = 0;
 
if(len)
{
c = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
c = 0;
 
txd_buffer[pt++] = '=' + (a >> 2);
txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
txd_buffer[pt++] = '=' + ( c & 0x3f);
}
va_end(ap);
 
for(a = 0; a < pt; a++)
{
tmpCRC += txd_buffer[a];
}
tmpCRC %= 4096;
txd_buffer[pt++] = '=' + tmpCRC / 64;
txd_buffer[pt++] = '=' + tmpCRC % 64;
txd_buffer[pt++] = '\r';
 
txd_complete = FALSE;
#ifdef USART_INT
UDR = txd_buffer[0]; // initiates the transmittion (continued in the TXD ISR)
#else
for(a = 0; a < pt; a++)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = txd_buffer[a];
}
txd_complete = TRUE;
#endif
}
 
//-----------------------------------------------------------------------------
//
void Decode64 (void)
{
uint8_t a,b,c,d;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
 
while (len)
{
a = rxd_buffer[ptrIn++] - '=';
b = rxd_buffer[ptrIn++] - '=';
c = rxd_buffer[ptrIn++] - '=';
d = rxd_buffer[ptrIn++] - '=';
//if(ptrIn > ReceivedBytes - 3) break;
 
if (len--)
rxd_buffer[ptrOut++] = (a << 2) | (b >> 4);
else
break;
 
if (len--)
rxd_buffer[ptrOut++] = ((b & 0x0f) << 4) | (c >> 2);
else
break;
 
if (len--)
rxd_buffer[ptrOut++] = ((c & 0x03) << 6) | d;
else
break;
}
pRxData = &rxd_buffer[3];
RxDataLen = ptrOut - 3;
}
 
 
//-----------------------------------------------------------------------------
//
void SwitchToNC (void)
{
 
if(hardware == NC)
{
// switch to NC
USART_putc (0x1b);
USART_putc (0x1b);
USART_putc (0x55);
USART_putc (0xaa);
USART_putc (0x00);
current_hardware = NC;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
 
 
//-----------------------------------------------------------------------------
//
void SwitchToWi232 (void)
{
 
// if(hardware == NC)
{
// switch to Wi232
current_hardware = Wi232;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToFC (void)
{
uint8_t cmd;
 
if (current_hardware == NC)
{
// switch to FC
cmd = 0x00; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = FC;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToMAG (void)
{
uint8_t cmd;
 
if (current_hardware == NC)
{
// switch to MK3MAG
cmd = 0x01; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = MK3MAG;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToGPS (void)
{
uint8_t cmd;
if (current_hardware == NC)
{
// switch to MKGPS
cmd = 0x02; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = MKGPS;
_delay_ms (50);
}
}
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/usart.h
0,0 → 1,149
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _USART_H
#define _USART_H
 
//--------------------------------------------------------------
//
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
 
// addresses
#define ADDRESS_ANY 0
#define ADDRESS_FC 1
#define ADDRESS_NC 2
#define ADDRESS_MAG 3
 
// must be at least 4('#'+Addr+'CmdID'+'\r')+ (80 * 4)/3 = 111 bytes
#define TXD_BUFFER_LEN 60
#define RXD_BUFFER_LEN 180
 
// Baud rate of the USART
#define USART_BAUD 57600
//#define USART_BAUD 125000
 
//--------------------------------------------------------------
//
extern uint8_t buffer[30];
 
extern volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
extern volatile uint8_t txd_complete;
extern volatile uint8_t txd1_buffer[TXD_BUFFER_LEN];
extern volatile uint8_t txd1_complete;
extern volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
extern volatile uint8_t rxd_buffer_locked;
extern volatile uint8_t ReceivedBytes;
extern volatile uint8_t *pRxData;
extern volatile uint8_t RxDataLen;
 
extern volatile uint16_t stat_crc_error;
extern volatile uint16_t stat_overflow_error;
 
extern volatile uint8_t rxFlag;
extern volatile uint8_t rx_byte;
 
//--------------------------------------------------------------
//
void USART_Init (unsigned int baudrate);
void USART_DisableTXD (void);
void USART_EnableTXD (void);
void USART_request_mk_data (uint8_t cmd, uint8_t addr, uint8_t ms);
 
void USART_putc (char c);
void USART_puts (char *s);
void USART_puts_p (const char *s);
 
 
extern char USART_getc(void);
void SendOutData (uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...); // uint8_t *pdata, uint8_t len, ...
//void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, uint8_t *pdata, uint8_t len); // uint8_t *pdata, uint8_t len, ...
void Decode64 (void);
 
void SwitchToNC (void);
void SwitchToFC (void);
void SwitchToMAG (void);
void SwitchToGPS (void);
void SwitchToWi232 (void);
void debug1(void);
 
uint8_t uart_getc_nb(uint8_t*);
 
//--------------------------------------------------------------
//Anpassen der seriellen Schnittstellen Register
#define USART_RXC_vect USART0_RX_vect
//--------------------------------------------------------------
#define UCSRA UCSR0A
#define UCSRB UCSR0B
#define UCSRC UCSR0C
#define UDR UDR0
#define UBRRL UBRR0L
#define UBRRH UBRR0H
 
// UCSRA
#define RXC RXC0
#define TXC TXC0
#define UDRE UDRE0
#define FE FE0
#define UPE UPE0
#define U2X U2X0
#define MPCM MPCM0
 
// UCSRB
#define RXCIE RXCIE0
#define TXCIE TXCIE0
#define UDRIE UDRIE0
#define TXEN TXEN0
#define RXEN RXEN0
#define UCSZ2 UCSZ02
#define RXB8 RXB80
#define TXB8 TXB80
 
// UCSRC
#define UMSEL1 UMSEL01
#define UMSEL0 UMSEL00
#define UPM1 UPM01
#define UPM0 UPM00
#define USBS USBS0
#define UCSZ1 UCSZ01
#define UCSZ0 UCSZ00
#define UCPOL UCPOL0
 
 
#endif
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/waypoints.c
0,0 → 1,347
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <string.h>
#include "91x_lib.h"
#include "waypoints.h"
#include "uart1.h"
 
// the waypoints list
#define MAX_LIST_LEN 31
 
Point_t PointList[MAX_LIST_LEN];
u8 WPIndex = 0; // list index of GPS point representig the current WP, can be maximal WPCount
u8 POIIndex = 0; // list index of GPS Point representing the current POI, can be maximal WPCount
u8 WPCount = 0; // number of waypoints
u8 PointCount = 0; // number of wp in the list can be maximal equal to MAX_LIST_LEN
u8 POICount = 0;
 
u8 WPActive = FALSE;
 
u8 PointList_Init(void)
{
return PointList_Clear();
}
 
u8 PointList_Clear(void)
{
u8 i;
WPIndex = 0; // real list position are 1 ,2, 3 ...
POIIndex = 0; // real list position are 1 ,2, 3 ...
WPCount = 0; // no waypoints
POICount = 0;
PointCount = 0; // no contents
WPActive = FALSE;
NaviData.WaypointNumber = WPCount;
NaviData.WaypointIndex = 0;
 
for(i = 0; i < MAX_LIST_LEN; i++)
{
PointList[i].Position.Status = INVALID;
PointList[i].Position.Latitude = 0;
PointList[i].Position.Longitude = 0;
PointList[i].Position.Altitude = 0;
PointList[i].Heading = 361; // invalid value
PointList[i].ToleranceRadius = 0; // in meters, if the MK is within that range around the target, then the next target is triggered
PointList[i].HoldTime = 0; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
PointList[i].Type = POINT_TYPE_INVALID;
PointList[i].Event_Flag = 0; // future implementation
PointList[i].AltitudeRate = 0; // no change of setpoint
}
return TRUE;
}
 
u8 PointList_GetCount(void)
{
return PointCount; // number of points in the list
}
 
Point_t* PointList_GetAt(u8 index)
{
if((index > 0) && (index <= PointCount)) return(&(PointList[index-1])); // return pointer to this waypoint
else return(NULL);
}
 
u8 PointList_SetAt(Point_t* pPoint)
{
// if index is in range
if((pPoint->Index > 0) && (pPoint->Index <= MAX_LIST_LEN))
{
// check list entry before update
switch(PointList[pPoint->Index-1].Type)
{
case POINT_TYPE_INVALID: // was invalid
switch(pPoint->Type)
{
default:
case POINT_TYPE_INVALID:
// nothing to do
break;
 
case POINT_TYPE_WP:
WPCount++;
PointCount++;
break;
case POINT_TYPE_POI:
POICount++;
PointCount++;
break;
}
break;
case POINT_TYPE_WP: // was a waypoint
switch(pPoint->Type)
{
case POINT_TYPE_INVALID:
WPCount--;
PointCount--;
break;
 
default:
case POINT_TYPE_WP:
//nothing to do
break;
case POINT_TYPE_POI:
POICount++;
WPCount--;
break;
}
break;
case POINT_TYPE_POI: // was a poi
switch(pPoint->Type)
{
case POINT_TYPE_INVALID:
POICount--;
PointCount--;
break;
 
case POINT_TYPE_WP:
WPCount++;
POICount--;
break;
case POINT_TYPE_POI:
default:
// nothing to do
break;
}
break;
}
memcpy(&PointList[pPoint->Index-1], pPoint, sizeof(Point_t)); // copy data to list entry
NaviData.WaypointNumber = WPCount;
return pPoint->Index;
}
else return(0);
}
 
// returns the pointer to the first waypoint within the list
Point_t* PointList_WPBegin(void)
{
u8 i;
WPIndex = 0; // set list position invalid
 
if(WPActive == FALSE) return(NULL);
 
POIIndex = 0; // set invalid POI
if(PointCount > 0)
{
// search for first wp in list
for(i = 0; i <MAX_LIST_LEN; i++)
{
if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID))
{
WPIndex = i + 1;
break;
}
}
if(WPIndex) // found a WP in the list
{
NaviData.WaypointIndex = 1;
// update index to POI
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
}
else // some points in the list but no WP found
{
NaviData.WaypointIndex = 0;
//Check for an existing POI
for(i = 0; i < MAX_LIST_LEN; i++)
{
if((PointList[i].Type == POINT_TYPE_POI) && (PointList[i].Position.Status != INVALID))
{
POIIndex = i + 1;
break;
}
}
}
}
else // no point in the list
{
POIIndex = 0;
NaviData.WaypointIndex = 0;
}
 
if(WPIndex) return(&(PointList[WPIndex-1]));
else return(NULL);
}
 
// returns the last waypoint
Point_t* PointList_WPEnd(void)
{
u8 i;
WPIndex = 0; // set list position invalid
POIIndex = 0; // set invalid
 
if(WPActive == FALSE) return(NULL);
 
if(PointCount > 0)
{
// search backward!
for(i = 1; i <= MAX_LIST_LEN; i++)
{
if((PointList[MAX_LIST_LEN - i].Type == POINT_TYPE_WP) && (PointList[MAX_LIST_LEN - i].Position.Status != INVALID))
{
WPIndex = MAX_LIST_LEN - i + 1;
break;
}
}
if(WPIndex) // found a WP within the list
{
NaviData.WaypointIndex = WPCount;
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
}
else // list contains some points but no WP in the list
{
// search backward for a POI!
for(i = 1; i <= MAX_LIST_LEN; i++)
{
if((PointList[MAX_LIST_LEN - i].Type == POINT_TYPE_POI) && (PointList[MAX_LIST_LEN - i].Position.Status != INVALID))
{
POIIndex = MAX_LIST_LEN - i + 1;
break;
}
}
NaviData.WaypointIndex = 0;
}
}
else // no point in the list
{
POIIndex = 0;
NaviData.WaypointIndex = 0;
}
if(WPIndex) return(&(PointList[WPIndex-1]));
else return(NULL);
}
 
// returns a pointer to the next waypoint or NULL if the end of the list has been reached
Point_t* PointList_WPNext(void)
{
u8 wp_found = 0;
if(WPActive == FALSE) return(NULL);
if(WPIndex < MAX_LIST_LEN) // if there is a next entry in the list
{
u8 i;
for(i = WPIndex; i < MAX_LIST_LEN; i++) // start search for next at next list entry
{
if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID)) // jump over POIs
{
wp_found = i+1;
break;
}
}
}
if(wp_found)
{
WPIndex = wp_found; // update list position
NaviData.WaypointIndex++;
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
return(&(PointList[WPIndex-1])); // return pointer to this waypoint
}
else
{ // no next wp found
NaviData.WaypointIndex = 0;
POIIndex = 0;
return(NULL);
}
}
 
void PointList_WPActive(u8 set)
{
if(set)
{
WPActive = TRUE;
PointList_WPBegin(); // uopdates POI index
}
else
{
WPActive = FALSE;
POIIndex = 0; // disable POI also
}
}
Point_t* PointList_GetPOI(void)
{
return PointList_GetAt(POIIndex);
}
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/GPL_PKT_V3_5_8b_FC086/waypoints.h
0,0 → 1,56
#ifndef _WAYPOINTS_H
#define _WAYPOINTS_H
 
//#include "ubx.h"
 
#define POINT_TYPE_INVALID 255
#define POINT_TYPE_WP 0
#define POINT_TYPE_POI 1
 
 
typedef struct
{
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
u8 Status;// validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct
{
GPS_Pos_t Position; // the gps position of the waypoint, see ubx.h for details
s16 Heading; // orientation, 0 no action, 1...360 fix heading, neg. = Index to POI in WP List
u8 ToleranceRadius; // in meters, if the MK is within that range around the target, then the next target is triggered
u8 HoldTime; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
u8 Event_Flag; // future implementation
u8 Index; // to indentify different waypoints, workaround for bad communications PC <-> NC
u8 Type; // typeof Waypoint
u8 WP_EventChannelValue; //
u8 AltitudeRate; // rate to change the setpoint
u8 reserve[8]; // reserve
} __attribute__((packed)) Point_t;
 
// Init List, return TRUE on success
u8 PointList_Init(void);
// Clear List, return TRUE on success
u8 PointList_Clear(void);
// Returns number of points in the list
u8 PointList_GetCount(void);
// return pointer to point at position
Point_t* PointList_GetAt(u8 index);
// set a point in the list at index, returns its index on success, else 0
u8 PointList_SetAt(Point_t* pPoint);
// goto the first WP in the list and return pointer to it
Point_t* PointList_WPBegin(void);
// goto the last WP in the list and return pointer to it
Point_t* PointList_WPEnd(void);
// goto next WP in the list and return pointer to it
Point_t* PointList_WPNext(void);
// enables/disables waypoint function
void PointList_WPActive(u8 set);
// returns pointer to actual POI
Point_t* PointList_GetPOI(void);
 
 
#endif // _WAYPOINTS_H
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/CHANGE.LOG
0,0 → 1,136
/****************************************************************************
* Copyright (C) 2011 by Christian "cebra" Brandtner *
* brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
!!Vor dem Kompilieren in der main.h die Hardwareversion einstellen!!
05.08.2012 V3.6.3.i Cebra
Neue OSD Variante 3
Alarme werden priorisiert, MK Lowbat hat höchste Prio und wird nicht von anderen Meldungen überschrieben
27.7.2012 V3.6.2h Cebra
PKT-Tools wurde bei nur FC Betrieb nicht angezeigt
17.6.2012 V3.6.2g Cebra
OSD Screen, Spannungsanzeige kann auf Balkenanzeige gesetzt werden, Balkenanzeige ist nur aktiv wenn die LOW-Batt Spannung < 5V ist,
damit wird die Zellenerkennung eingeschaltet. die Einstellung ist funktionsgleich wie beim MK, <5V Zellenerkennung > 5V absolute Spannung wird verwendet
Erweiterung im OSD1 Screen um Waypointanzeige
Textfehler beim MK-Settings aktivieren behoben.
OSD Screen, Beep bei Erreichen eines Waypoints
Fehler im BT-Setup bei Pin und Namenseingabe beseitigt.
 
29.5.2012 V3.6.2f Cebra
OSD Screen umschaltbar zwischen zwei Varianten
28.5.2012 V3.6.2d Cebra
Variobeep it jetzt abhängig von Motoren laufen und Höhenschalter aktiv
Variobeep für Sinken schneller
26.5.2012 V3.6.2c Cebra
Variopiepser im OSD-Screen, langes Piepen = steigen, kurzes Piepen = fallen.
Homesicht im OSD, Richtung im Kreis umkehrbar
24.5.2012 V3.6.2.b2 Cebra
bei Unterspannung wird neben dem Piepsen der Spannungswert invertiert angezeigt.
Wenn der MK kein GPS OK sendet ist die Sat-Anzeige invertiert.
23.5.2012 V3.6.2 Cebra
maximale Sinkrate einstellbar im OSD Setup
Anpassungen im OSD-Screen
18.5.2012 V3.6.1b Cebra
Falsche Beschriftung im Wi232 Kanal Setup
16.5.2012 V3.6.1 Cebra
Anpassung an FC Version 0.88M.
Out1/Out2 Anzeige kann im Setup negiert werden.
Navidatenausgabe an SV2 vorbereitet
15.3.2012 V3.6.0.c Cebra
Anpassung für unterschiedlieche BTM-222 Module, Devicename und MAC-Adresse werden jetzt unabhängig von der BTM-222 Software sauber getrennt
GPS Anzeige der Daten um Uhrzeit erweitert, wenn Uhrzeit dargestellt wird dann ist Verbindung zur GPS-Maus vorhanden
Fehlerbeseitigung bei Showversion und Startanzeige
 
13.3.2012 V3.6.0.b Cebra
Statistik im OSD Screen, max. Entfernung jetzt 4 stellig
 
11.3.2012 V3.6.0 Cebra
Neue Version für FC 0.88
Erweiterungen im Setup als Vorbereitung für Antennentracking
Bluetooth GPS-Maus Konfiguration, hat jetzt noch keine Funktion , nur zum Testen
 
24.1.2012 V3.5.8d Cebra
Fehlerpiepen beim Empfangsausfall im OSD Screen ist im Setup schaltbar
 
23.2.2012 V3.5.8c Cebra
Sprachunterstützung verbessert
Letzte Postion in OSD verbessert, bei Datenverlust automatisches Reconnect
Akkuanzeige im MK-USB Betrieb.
 
7.1.2012 V3.5.8 Cebra
Languagesupport für die Menüs eingebaut, 4 Sprachen sind möglich, z.Z. Deutsch und Englisch in den Menüs und zusätzlich Französisch im Parametermenü.
Ein paar Änderungen im Bereich Setup Wi232 und BTM222
 
30.12.2011 V3.5.7a Cebra
Moduleinit wurde nicht immer gespeichert, dadurch Init der Module beim Start obwohl nicht notwendig.
Bluetooth wird beim ersten Betätigen der Einschalttaste aktiviert um USB auszuschalten, damit der angeschlossene PC erstmal ruhig bleibt.
 
30.12.2011 V3.5.7 Cebra
PKT Setup für Akkutyp und Spannungsmessung
 
28.12.2011 V3.5.6a Cebra
Lipo Spannungsmessung eingebaut
 
26.10.2011 V3.5.3 Cebra
Fehler bei der Bluetoothinitialisierung beseitigt
 
 
25.8.2011 V3.4.4Cebra
Initsequenzen für Wi232 und BT erfolgen nur wenn sich was ändert oder sie neu sind.
Lipowarnung verbessert
Lastposition in OSD wird gespeichern wenn Verbindung zum MK verlorengegenagen ist
Beim Start von PKT wird sie angezeigt.
 
14.08.2011 V3.4.3 Cebra
Anpassungen an neue Hardware, Bluetooth, Wi232, interne seriell Switche, PKT Lipowarnung
 
 
30.7.2011 V3.4.1 Cebra
Abschalten des PKT über Menütaste
 
29.7.2011 V3.4.0 Cebra
Summeranschaltung für HW1.2 angepasst, ist jetzt Summer an GND und Pin 25
Vorbereitungen für neue Hardware 3.9
 
 
25.7.2011 V3.3.4
BL-Controller(0-12) Test with CSV-Output over USB (HW1.2 Uart0, HW>1.2 Uart1=USB)
Setupmenu Wi232 Parameter Uart Timeout, Uart MTU
 
15.7.2011 V3.2.3
 
HW1.3
Beim Rücksprung aus der Wi Konfig fällt die rechte Led der Beleuchtung aus.
(PGM des Wi allerdings noch nicht angeschlossen!)
nur durch Hardwareänderung lösbar PD6 Pin für Wi232
 
Die Pfeile am Display im Setup PMK Menue sind noch <- -> statt oben und unten.
 
 
1.7.2011 cebra
Bugfixes: Summer(PC7) bei Unterspannung, Setup Wi232, Kosmetik
 
27.6.2011 cebra
 
PKT Setup überarbeitet, Setupmenü ist jetzt erweiterbar, Quick and Dirty war nix ;-)
 
26.6.2011 cebra
 
Das EEprom des PKT wird beim Starten geprüft ob es schon initialisiert ist.
Falls nicht werden Defaultwerte gesetzt.
 
Displayausrichtung kann im Setupmenü geändert werden
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/Font8x8.c
0,0 → 1,273
/*
* font8x8.c
* LCD-OSD
*
* Created by Peter Mack on 26.12.09.
* Copyright 2009 SCS GmbH & Co. KG. All rights reserved.
*
*/
 
#include <avr/pgmspace.h>
 
const uint8_t Font8x8[256][8]PROGMEM=
{
 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x00
{0x7E,0x81,0x95,0xB1,0xB1,0x95,0x81,0x7E}, // 0x01
{0x7E,0xFF,0xEB,0xCF,0xCF,0xEB,0xFF,0x7E}, // 0x02
{0x0E,0x1F,0x3F,0x7E,0x3F,0x1F,0x0E,0x00}, // 0x03
{0x08,0x1C,0x3E,0x7F,0x3E,0x1C,0x08,0x00}, // 0x04
{0x38,0x3A,0x9F,0xFF,0x9F,0x3A,0x38,0x00}, // 0x05
{0x10,0x38,0xBC,0xFF,0xBC,0x38,0x10,0x00}, // 0x06
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x07
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x08
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x09
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x0A
{0x70,0xF8,0x88,0x88,0xFD,0x7F,0x07,0x0F}, // 0x0B
{0x00,0x4E,0x5F,0xF1,0xF1,0x5F,0x4E,0x00}, // 0x0C
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x0D
{0xC0,0xFF,0x7F,0x05,0x05,0x65,0x7F,0x3F}, // 0x0E
{0x99,0x5A,0x3C,0xE7,0xE7,0x3C,0x5A,0x99}, // 0x0F
{0x7F,0x3E,0x3E,0x1C,0x1C,0x08,0x08,0x00}, // 0x10
{0x08,0x08,0x1C,0x1C,0x3E,0x3E,0x7F,0x00}, // 0x11
{0x00,0x24,0x66,0xFF,0xFF,0x66,0x24,0x00}, // 0x12
{0x00,0x5F,0x5F,0x00,0x00,0x5F,0x5F,0x00}, // 0x13
{0x06,0x0F,0x09,0x7F,0x7F,0x01,0x7F,0x7F}, // 0x14
{0xDA,0xBF,0xA5,0xA5,0xFD,0x59,0x03,0x02}, // 0x15
{0x00,0x70,0x70,0x70,0x70,0x70,0x70,0x00}, // 0x16
{0x80,0x94,0xB6,0xFF,0xFF,0xB6,0x94,0x80}, // 0x17
{0x00,0x04,0x06,0x7F,0x7F,0x06,0x04,0x00}, // 0x18
{0x00,0x10,0x30,0x7F,0x7F,0x30,0x10,0x00}, // 0x19
{0x08,0x08,0x08,0x2A,0x3E,0x1C,0x08,0x00}, // 0x1A
{0x08,0x1C,0x3E,0x2A,0x08,0x08,0x08,0x00}, // 0x1B
{0x3C,0x3C,0x20,0x20,0x20,0x20,0x20,0x00}, // 0x1C
{0x08,0x1C,0x3E,0x08,0x08,0x3E,0x1C,0x08}, // 0x1D
{0x30,0x38,0x3C,0x3E,0x3E,0x3C,0x38,0x30}, // 0x1E
{0x06,0x0E,0x1E,0x3E,0x3E,0x1E,0x0E,0x06}, // 0x1F
 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0x20
{0x00,0x06,0x5F,0x5F,0x06,0x00,0x00,0x00}, // 0x21
{0x00,0x07,0x07,0x00,0x07,0x07,0x00,0x00}, // 0x22
{0x14,0x7F,0x7F,0x14,0x7F,0x7F,0x14,0x00}, // 0x23
{0x24,0x2E,0x6B,0x6B,0x3A,0x12,0x00,0x00}, // 0x24
{0x46,0x66,0x30,0x18,0x0C,0x66,0x62,0x00}, // 0x25
{0x30,0x7A,0x4F,0x5D,0x37,0x7A,0x48,0x00}, // 0x26
{0x04,0x07,0x03,0x00,0x00,0x00,0x00,0x00}, // 0x27
{0x00,0x1C,0x3E,0x63,0x41,0x00,0x00,0x00}, // 0x28
{0x00,0x41,0x63,0x3E,0x1C,0x00,0x00,0x00}, // 0x29
{0x08,0x2A,0x3E,0x1C,0x1C,0x3E,0x2A,0x08}, // 0x2A
{0x08,0x08,0x3E,0x3E,0x08,0x08,0x00,0x00}, // 0x2B
{0x00,0xA0,0xE0,0x60,0x00,0x00,0x00,0x00}, // 0x2C
{0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00}, // 0x2D
{0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00}, // 0x2E
{0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // 0x2F
{0x3E,0x7F,0x59,0x4D,0x7F,0x3E,0x00,0x00}, // 0x30
{0x42,0x42,0x7F,0x7F,0x40,0x40,0x00,0x00}, // 0x31
{0x62,0x73,0x59,0x49,0x6F,0x66,0x00,0x00}, // 0x32
{0x22,0x63,0x49,0x49,0x7F,0x36,0x00,0x00}, // 0x33
{0x18,0x1C,0x16,0x13,0x7F,0x7F,0x10,0x00}, // 0x34
{0x27,0x67,0x45,0x45,0x7D,0x39,0x00,0x00}, // 0x35
{0x3C,0x7E,0x4B,0x49,0x79,0x30,0x00,0x00}, // 0x36
{0x03,0x63,0x71,0x19,0x0F,0x07,0x00,0x00}, // 0x37
{0x36,0x7F,0x49,0x49,0x7F,0x36,0x00,0x00}, // 0x38
{0x06,0x4F,0x49,0x69,0x3F,0x1E,0x00,0x00}, // 0x39
{0x00,0x00,0x6C,0x6C,0x00,0x00,0x00,0x00}, // 0x3A
{0x00,0xA0,0xEC,0x6C,0x00,0x00,0x00,0x00}, // 0x3B
{0x08,0x1C,0x36,0x63,0x41,0x00,0x00,0x00}, // 0x3C
{0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x00}, // 0x3D
{0x00,0x41,0x63,0x36,0x1C,0x08,0x00,0x00}, // 0x3E
{0x02,0x03,0x51,0x59,0x0F,0x06,0x00,0x00}, // 0x3F
{0x3E,0x7F,0x41,0x5D,0x5D,0x1F,0x1E,0x00}, // 0x40
{0x7C,0x7E,0x13,0x13,0x7E,0x7C,0x00,0x00}, // 0x41
{0x41,0x7F,0x7F,0x49,0x49,0x7F,0x36,0x00}, // 0x42
{0x1C,0x3E,0x63,0x41,0x41,0x63,0x22,0x00}, // 0x43
{0x41,0x7F,0x7F,0x41,0x63,0x7F,0x1C,0x00}, // 0x44
{0x41,0x7F,0x7F,0x49,0x5D,0x41,0x63,0x00}, // 0x45
{0x41,0x7F,0x7F,0x49,0x1D,0x01,0x03,0x00}, // 0x46
{0x1C,0x3E,0x63,0x41,0x51,0x73,0x72,0x00}, // 0x47
{0x7F,0x7F,0x08,0x08,0x7F,0x7F,0x00,0x00}, // 0x48
{0x00,0x41,0x7F,0x7F,0x41,0x00,0x00,0x00}, // 0x49
{0x30,0x70,0x40,0x41,0x7F,0x3F,0x01,0x00}, // 0x4A
{0x41,0x7F,0x7F,0x08,0x1C,0x77,0x63,0x00}, // 0x4B
{0x41,0x7F,0x7F,0x41,0x40,0x60,0x70,0x00}, // 0x4C
{0x7F,0x7F,0x06,0x0C,0x06,0x7F,0x7F,0x00}, // 0x4D
{0x7F,0x7F,0x06,0x0C,0x18,0x7F,0x7F,0x00}, // 0x4E
{0x1C,0x3E,0x63,0x41,0x63,0x3E,0x1C,0x00}, // 0x4F
{0x41,0x7F,0x7F,0x49,0x09,0x0F,0x06,0x00}, // 0x50
{0x1E,0x3F,0x21,0x71,0x7F,0x5E,0x00,0x00}, // 0x51
{0x41,0x7F,0x7F,0x19,0x39,0x6F,0x46,0x00}, // 0x52
{0x26,0x67,0x4D,0x59,0x7B,0x32,0x00,0x00}, // 0x53
{0x03,0x41,0x7F,0x7F,0x41,0x03,0x00,0x00}, // 0x54
{0x7F,0x7F,0x40,0x40,0x7F,0x7F,0x00,0x00}, // 0x55
{0x1F,0x3F,0x60,0x60,0x3F,0x1F,0x00,0x00}, // 0x56
{0x7F,0x7F,0x30,0x18,0x30,0x7F,0x7F,0x00}, // 0x57
{0x63,0x77,0x1C,0x08,0x1C,0x77,0x63,0x00}, // 0x58
{0x07,0x4F,0x78,0x78,0x4F,0x07,0x00,0x00}, // 0x59
{0x67,0x73,0x59,0x4D,0x47,0x63,0x71,0x00}, // 0x5A
{0x00,0x7F,0x7F,0x41,0x41,0x00,0x00,0x00}, // 0x5B
{0x01,0x03,0x06,0x0C,0x18,0x30,0x60,0x00}, // 0x5C
{0x00,0x41,0x41,0x7F,0x7F,0x00,0x00,0x00}, // 0x5D
{0x08,0x0C,0x06,0x03,0x06,0x0C,0x08,0x00}, // 0x5E
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80}, // 0x5F
{0x00,0x00,0x03,0x07,0x04,0x00,0x00,0x00}, // 0x60
{0x20,0x74,0x54,0x54,0x3C,0x78,0x40,0x00}, // 0x61
{0x41,0x3F,0x7F,0x44,0x44,0x7C,0x38,0x00}, // 0x62
{0x38,0x7C,0x44,0x44,0x6C,0x28,0x00,0x00}, // 0x63
{0x30,0x78,0x48,0x49,0x3F,0x7F,0x40,0x00}, // 0x64
{0x38,0x7C,0x54,0x54,0x5C,0x18,0x00,0x00}, // 0x65
{0x48,0x7E,0x7F,0x49,0x03,0x02,0x00,0x00}, // 0x66
{0x98,0xBC,0xA4,0xA4,0xF8,0x7C,0x04,0x00}, // 0x67
{0x41,0x7F,0x7F,0x08,0x04,0x7C,0x78,0x00}, // 0x68
{0x00,0x44,0x7D,0x7D,0x40,0x00,0x00,0x00}, // 0x69
{0x40,0xC4,0x84,0xFD,0x7D,0x00,0x00,0x00}, // 0x6A
{0x41,0x7F,0x7F,0x10,0x38,0x6C,0x44,0x00}, // 0x6B
{0x00,0x41,0x7F,0x7F,0x40,0x00,0x00,0x00}, // 0x6C
{0x7C,0x7C,0x0C,0x18,0x0C,0x7C,0x78,0x00}, // 0x6D
{0x7C,0x7C,0x04,0x04,0x7C,0x78,0x00,0x00}, // 0x6E
{0x38,0x7C,0x44,0x44,0x7C,0x38,0x00,0x00}, // 0x6F
{0x84,0xFC,0xF8,0xA4,0x24,0x3C,0x18,0x00}, // 0x70
{0x18,0x3C,0x24,0xA4,0xF8,0xFC,0x84,0x00}, // 0x71
{0x44,0x7C,0x78,0x44,0x1C,0x18,0x00,0x00}, // 0x72
{0x48,0x5C,0x54,0x54,0x74,0x24,0x00,0x00}, // 0x73
{0x00,0x04,0x3E,0x7F,0x44,0x24,0x00,0x00}, // 0x74
{0x3C,0x7C,0x40,0x40,0x3C,0x7C,0x40,0x00}, // 0x75
{0x1C,0x3C,0x60,0x60,0x3C,0x1C,0x00,0x00}, // 0x76
{0x3C,0x7C,0x60,0x30,0x60,0x7C,0x3C,0x00}, // 0x77
{0x44,0x6C,0x38,0x10,0x38,0x6C,0x44,0x00}, // 0x78
{0x9C,0xBC,0xA0,0xA0,0xFC,0x7C,0x00,0x00}, // 0x79
{0x4C,0x64,0x74,0x5C,0x4C,0x64,0x00,0x00}, // 0x7A
{0x08,0x08,0x3E,0x77,0x41,0x41,0x00,0x00}, // 0x7B
{0x00,0x00,0x00,0x77,0x77,0x00,0x00,0x00}, // 0x7C
{0x41,0x41,0x77,0x3E,0x08,0x08,0x00,0x00}, // 0x7D
{0x02,0x03,0x01,0x03,0x02,0x03,0x01,0x00}, // 0x7E
{0x78,0x7C,0x46,0x43,0x46,0x7C,0x78,0x00}, // 0x7F
 
{0x1E,0xBF,0xE1,0x61,0x33,0x12,0x00,0x00}, // 0x80
{0x3A,0x7A,0x40,0x40,0x7A,0x7A,0x40,0x00}, // 0x81
{0x38,0x7C,0x56,0x57,0x5D,0x18,0x00,0x00}, // 0x82
{0x02,0x23,0x75,0x55,0x55,0x7D,0x7B,0x42}, // 0x83
{0x21,0x75,0x54,0x54,0x7D,0x79,0x40,0x00}, // 0x84
{0x20,0x75,0x57,0x56,0x7C,0x78,0x40,0x00}, // 0x85
{0x00,0x22,0x77,0x55,0x55,0x7F,0x7A,0x40}, // 0x86
{0x1C,0xBE,0xE2,0x62,0x36,0x14,0x00,0x00}, // 0x87
{0x02,0x3B,0x7D,0x55,0x55,0x5D,0x1B,0x02}, // 0x88
{0x39,0x7D,0x54,0x54,0x5D,0x19,0x00,0x00}, // 0x89
{0x38,0x7D,0x57,0x56,0x5C,0x18,0x00,0x00}, // 0x8A
{0x01,0x45,0x7C,0x7C,0x41,0x01,0x00,0x00}, // 0x8B
{0x02,0x03,0x45,0x7D,0x7D,0x43,0x02,0x00}, // 0x8C
{0x00,0x45,0x7F,0x7E,0x40,0x00,0x00,0x00}, // 0x8D
{0x79,0x7D,0x26,0x26,0x7D,0x79,0x00,0x00}, // 0x8E
{0x70,0x7A,0x2D,0x2D,0x7A,0x70,0x00,0x00}, // 0x8F
{0x44,0x7C,0x7E,0x57,0x55,0x44,0x00,0x00}, // 0x90
{0x20,0x74,0x54,0x54,0x7C,0x7C,0x54,0x54}, // 0x91
{0x7C,0x7E,0x0B,0x09,0x7F,0x7F,0x49,0x00}, // 0x92
{0x32,0x7B,0x49,0x49,0x7B,0x32,0x00,0x00}, // 0x93
{0x32,0x7A,0x48,0x48,0x7A,0x32,0x00,0x00}, // 0x94
{0x30,0x79,0x4B,0x4A,0x78,0x30,0x00,0x00}, // 0x95
{0x3A,0x7B,0x41,0x41,0x7B,0x7A,0x40,0x00}, // 0x96
{0x38,0x79,0x43,0x42,0x78,0x78,0x40,0x00}, // 0x97
{0xBA,0xBA,0xA0,0xA0,0xFA,0x7A,0x00,0x00}, // 0x98
{0x39,0x7D,0x44,0x44,0x44,0x7D,0x39,0x00}, // 0x99
{0x3D,0x7D,0x40,0x40,0x7D,0x3D,0x00,0x00}, // 0x9A
{0x38,0x7C,0x64,0x54,0x4C,0x7C,0x38,0x00}, // 0x9B
{0x68,0x7E,0x7F,0x49,0x43,0x66,0x20,0x00}, // 0x9C
{0x5C,0x3E,0x73,0x49,0x67,0x3E,0x1D,0x00}, // 0x9D
{0x44,0x6C,0x38,0x38,0x6C,0x44,0x00,0x00}, // 0x9E
{0x40,0xC8,0x88,0xFE,0x7F,0x09,0x0B,0x02}, // 0x9F
{0x20,0x74,0x56,0x57,0x7D,0x78,0x40,0x00}, // 0xA0
{0x00,0x44,0x7E,0x7F,0x41,0x00,0x00,0x00}, // 0xA1
{0x30,0x78,0x48,0x4A,0x7B,0x31,0x00,0x00}, // 0xA2
{0x38,0x78,0x40,0x42,0x7B,0x79,0x40,0x00}, // 0xA3
{0x7A,0x7B,0x09,0x0B,0x7A,0x73,0x01,0x00}, // 0xA4
{0x7A,0x7B,0x19,0x33,0x7A,0x7B,0x01,0x00}, // 0xA5
{0x00,0x26,0x2F,0x29,0x2F,0x2F,0x28,0x00}, // 0xA6
{0x00,0x26,0x2F,0x29,0x29,0x2F,0x26,0x00}, // 0xA7
{0x30,0x78,0x4D,0x45,0x60,0x20,0x00,0x00}, // 0xA8
{0x1C,0x22,0x7D,0x4B,0x5B,0x65,0x22,0x1C}, // 0xA9
{0x08,0x08,0x08,0x08,0x38,0x38,0x00,0x00}, // 0xAA
{0x61,0x3F,0x1F,0xCC,0xEE,0xAB,0xB9,0x90}, // 0xAB
{0x61,0x3F,0x1F,0x4C,0x66,0x73,0xD9,0xF8}, // 0xAC
{0x00,0x00,0x60,0xFA,0xFA,0x60,0x00,0x00}, // 0xAD
{0x08,0x1C,0x36,0x22,0x08,0x1C,0x36,0x22}, // 0xAE
{0x22,0x36,0x1C,0x08,0x22,0x36,0x1C,0x08}, // 0xAF
{0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00}, // 0xB0
{0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55}, // 0xB1
{0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF}, // 0xB2
{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, // 0xB3
{0x10,0x10,0x10,0xFF,0xFF,0x00,0x00,0x00}, // 0xB4
{0x70,0x78,0x2C,0x2E,0x7B,0x71,0x00,0x00}, // 0xB5
{0x72,0x79,0x2D,0x2D,0x79,0x72,0x00,0x00}, // 0xB6
{0x71,0x7B,0x2E,0x2C,0x78,0x70,0x00,0x00}, // 0xB7
{0x1C,0x22,0x5D,0x55,0x55,0x41,0x22,0x1C}, // 0xB8
{0x14,0x14,0xF7,0xF7,0x00,0xFF,0xFF,0x00}, // 0xB9
{0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00}, // 0xBA
{0x14,0x14,0xF4,0xF4,0x04,0xFC,0xFC,0x00}, // 0xBB
{0x14,0x14,0x17,0x17,0x10,0x1F,0x1F,0x00}, // 0xBC
{0x18,0x3C,0x24,0xE7,0xE7,0x24,0x24,0x00}, // 0xBD
{0x2B,0x2F,0xFC,0xFC,0x2F,0x2B,0x00,0x00}, // 0xBE
{0x10,0x10,0x10,0xF0,0xF0,0x00,0x00,0x00}, // 0xBF
{0x00,0x00,0x00,0x1F,0x1F,0x10,0x10,0x10}, // 0xC0
{0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10}, // 0xC1
{0x10,0x10,0x10,0xF0,0xF0,0x10,0x10,0x10}, // 0xC2
{0x00,0x00,0x00,0xFF,0xFF,0x10,0x10,0x10}, // 0xC3
{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}, // 0xC4
{0x10,0x10,0x10,0xFF,0xFF,0x10,0x10,0x10}, // 0xC5
{0x22,0x77,0x55,0x57,0x7E,0x7B,0x41,0x00}, // 0xC6
{0x72,0x7B,0x2D,0x2F,0x7A,0x73,0x01,0x00}, // 0xC7
{0x00,0x00,0x1F,0x1F,0x10,0x17,0x17,0x14}, // 0xC8
{0x00,0x00,0xFC,0xFC,0x04,0xF4,0xF4,0x14}, // 0xC9
{0x14,0x14,0x17,0x17,0x10,0x17,0x17,0x14}, // 0xCA
{0x14,0x14,0xF4,0xF4,0x04,0xF4,0xF4,0x14}, // 0xCB
{0x00,0x00,0xFF,0xFF,0x00,0xF7,0xF7,0x14}, // 0xCC
{0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14}, // 0xCD
{0x14,0x14,0xF7,0xF7,0x00,0xF7,0xF7,0x14}, // 0xCE
{0x66,0x3C,0x3C,0x24,0x3C,0x3C,0x66,0x00}, // 0xCF
{0x05,0x27,0x72,0x57,0x7D,0x38,0x00,0x00}, // 0xD0
{0x49,0x7F,0x7F,0x49,0x63,0x7F,0x1C,0x00}, // 0xD1
{0x46,0x7D,0x7D,0x55,0x55,0x46,0x00,0x00}, // 0xD2
{0x45,0x7D,0x7C,0x54,0x55,0x45,0x00,0x00}, // 0xD3
{0x44,0x7D,0x7F,0x56,0x54,0x44,0x00,0x00}, // 0xD4
{0x0A,0x0E,0x08,0x00,0x00,0x00,0x00,0x00}, // 0xD5
{0x00,0x44,0x7E,0x7F,0x45,0x00,0x00,0x00}, // 0xD6
{0x02,0x45,0x7D,0x7D,0x45,0x02,0x00,0x00}, // 0xD7
{0x01,0x45,0x7C,0x7C,0x45,0x01,0x00,0x00}, // 0xD8
{0x10,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00}, // 0xD9
{0x00,0x00,0x00,0xF0,0xF0,0x10,0x10,0x10}, // 0xDA
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, // 0xDB
{0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0}, // 0xDC
{0x00,0x00,0x00,0x77,0x77,0x00,0x00,0x00}, // 0xDD
{0x00,0x45,0x7F,0x7E,0x44,0x00,0x00,0x00}, // 0xDE
{0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F}, // 0xDF
{0x38,0x7C,0x46,0x47,0x45,0x7C,0x38,0x00}, // 0xE0
{0xFC,0xFE,0x2A,0x2A,0x3E,0x14,0x00,0x00}, // 0xE1
{0x3A,0x7D,0x45,0x45,0x45,0x7D,0x3A,0x00}, // 0xE2
{0x38,0x7C,0x45,0x47,0x46,0x7C,0x38,0x00}, // 0xE3
{0x32,0x7B,0x49,0x4B,0x7A,0x33,0x01,0x00}, // 0xE4
{0x3A,0x7F,0x45,0x47,0x46,0x7F,0x39,0x00}, // 0xE5
{0x80,0xFE,0x7E,0x20,0x20,0x3E,0x1E,0x00}, // 0xE6
{0x42,0x7E,0x7E,0x54,0x1C,0x08,0x00,0x00}, // 0xE7
{0x41,0x7F,0x7F,0x55,0x14,0x1C,0x08,0x00}, // 0xE8
{0x3C,0x7C,0x42,0x43,0x7D,0x3C,0x00,0x00}, // 0xE9
{0x3A,0x79,0x41,0x41,0x79,0x3A,0x00,0x00}, // 0xEA
{0x3C,0x7D,0x43,0x42,0x7C,0x3C,0x00,0x00}, // 0xEB
{0xB8,0xB8,0xA2,0xA3,0xF9,0x78,0x00,0x00}, // 0xEC
{0x0C,0x5C,0x72,0x73,0x5D,0x0C,0x00,0x00}, // 0xED
{0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00}, // 0xEE
{0x00,0x00,0x02,0x03,0x01,0x00,0x00,0x00}, // 0xEF
{0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00}, // 0xF0
{0x44,0x44,0x5F,0x5F,0x44,0x44,0x00,0x00}, // 0xF1
{0x28,0x28,0x28,0x28,0x28,0x28,0x00,0x00}, // 0xF2
{0x71,0x35,0x1F,0x4C,0x66,0x73,0xD9,0xF8}, // 0xF3
{0x06,0x0F,0x09,0x7F,0x7F,0x01,0x7F,0x7F}, // 0xF4
{0xDA,0xBF,0xA5,0xA5,0xFD,0x59,0x03,0x02}, // 0xF5
{0x08,0x08,0x6B,0x6B,0x08,0x08,0x00,0x00}, // 0xF6
{0x00,0x80,0xC0,0x40,0x00,0x00,0x00,0x00}, // 0xF7
{0x00,0x06,0x0F,0x09,0x0F,0x06,0x00,0x00}, // 0xF8
{0x02,0x02,0x00,0x00,0x02,0x02,0x00,0x00}, // 0xF9
{0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00}, // 0xFA
{0x00,0x12,0x13,0x1F,0x1F,0x10,0x10,0x00}, // 0xFB
{0x00,0x11,0x15,0x15,0x1F,0x1F,0x0A,0x00}, // 0xFC
{0x00,0x19,0x1D,0x15,0x17,0x12,0x00,0x00}, // 0xFD
{0x00,0x00,0x3C,0x3C,0x3C,0x3C,0x00,0x00}, // 0xFE
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} // 0xFF
};
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/Font8x8.h
0,0 → 1,31
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - font provided by Claas Anders "CaScAdE" Rathje *
* - umlauts and special characters by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#ifndef _FONT8X8_H
#define _FONT8X8_H
 
#include <avr/pgmspace.h>
 
 
extern const uint8_t Font8x8[256][8];
 
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/HAL_HW1_2.c
0,0 → 1,132
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.2 sebseb7
 
 
#ifndef HAL_HW1_2_C_
#define HAL_HW1_2_C_
 
 
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
 
#include "usart.h"
#include "uart1.h"
#include "lcd.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRC |= (1<<DDC0)|(1<<DDC1)|(1<<DDC6)|(1<<DDC5)|(1<<DDC7);
DDRD |= (1<<DDD7);
DDRB = 0xFF;
 
set_LED1();
 
set_D_LIGHT();
Timer0_Init ();
Timer1_Init (); // pwm
Timer2_Init (); // Displaybeleuchtung
LCD_Init (0);
BeepTime = 500;
BeepMuster = 0x0080;
 
// _delay_ms(250);
 
clr_LED1();
Display_on = 1;
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
// I2C_Init(1);
sei ();
 
ReadParameter ();
LCD_Init (1);
OCR2A =LCD_Helligkeit*2.55;
#ifdef HWVERSION1_2W
if (WiIsSet==false)
InitWi232(); /* wenn Wi232 nicht initialisiert ist, dann jetzt tun*/
else
{
discoverWi232(); /* Wi232 suchen*/
_delay_ms(1000);
}
#endif
}
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
PORTC &= ~(1<<PORTC0);
PORTC &= ~(1<<PORTC1);
PORTD &= ~(1<<PORTD7);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
PORTC |= (1<<PORTC0);
PORTC |= (1<<PORTC1);
PORTD |= (1<<PORTD7);
}
 
 
 
#endif
#endif /* HAL_HW3_2_C_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/HAL_HW1_2.h
0,0 → 1,99
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.2 sebseb7
 
 
/* Belegung der Ports*/
/*Hardware 1.2 sebseb7 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Displaybeleuchtung PD7 Pin 16 LED an +
Displaybeleuchtung PC0 Pin 10 LED an +
Displaybeleuchtung PC1 Pin 20 LED an +
Summer PC6 Pin 25 Summer an GND
Wi232 PC7 Pin 26 Wi232 CMD Pin
 
*/
 
 
 
 
 
#ifndef HAL_HW1_2_H_
#define HAL_HW1_2_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define set_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define clr_LED1() (PORTC |= (1 << PC3))
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define clr_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define set_BEEP() (PORTC |= (1 << PC6))
 
#define set_WI232CMD() (PORTC &= ~(1 << PC7))
#define clr_WI232CMD() (PORTC |= (1 << PC7))
 
 
#define KEY_PIN PINA
 
#define KEY_ENTER PA7
#define KEY_ESC PA6
#define KEY_PLUS PA5
#define KEY_MINUS PA4
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus*/
 
void InitHWPorts(void);
 
#endif /* HAL_HW1_2_H_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/HAL_HW1_3.c
0,0 → 1,137
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// *Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.3 sebseb7
// * USB,LED
 
 
#ifndef HAL_HW1_3_C_
#define HAL_HW1_3_C_
 
 
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include "main.h"
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
 
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
 
 
 
 
void InitHWPorts(void) /* Initialisierung der Hardware für die jeweilige Leiterplattenversion */
 
{
 
// enable pull ups for the 4 keys
PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7);
 
DDRD |= (1<<DDD7)|(1<<DDD6);
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC6)|(1<<DDC5)|(1<<DDC7); /* Leds,Summer*/
 
DDRB = 0xFF;
set_LED1();
 
BeepTime = 500;
BeepMuster = 0x0080;
 
set_D_LIGHT();
clr_WI232CMD();
_delay_ms(250);
 
clr_LED1();
 
 
Display_on = 1;
 
LCD_Init (0);
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
 
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); /* USB*/
uart1_putc('R');
// I2C_Init(1);
 
Timer0_Init ();
Timer1_Init (); // pwm
Timer2_Init (); // Displaybeleuchtung
sei ();
 
ReadParameter ();
LCD_Init (1);
OCR2A =LCD_Helligkeit*2.55;
// InitWi232();
#ifdef HWVERSION1_3W
if (WiIsSet==false)
InitWi232(); /* wenn Wi232 nicht initialisiert ist, dann jetzt tun*/
else
{
discoverWi232(); /* Wi232 suchen*/
_delay_ms(1000);
}
#endif
 
}
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
PORTD &= ~(1<<PORTD6);
PORTC &= ~(1<<PORTC2);
PORTD &= ~(1<<PORTD7);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
PORTD |= (1<<PORTD6);
PORTD |= (1<<PORTD7);
PORTC |= (1<<PORTC2);
}
 
 
#endif
#endif /* HAL_HW1_3_C_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/HAL_HW1_3.h
0,0 → 1,108
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
// * Hardwareabhängige Definitionen und Prozeduren
// * Hardware Leiterplatte V1.3 sebseb7
// * USB,LED
 
 
/*Hardware 1.3.1 Portbelegung
 
Servo PD4 Pin 13
Servo PD5 Pin 14
Bootlader LED PC3 Pin 22 LED an GND
Summer PC6 Pin 25 Summer an GND
Displaybeleuchtung PD6 Pin 15 LED an +
Displaybeleuchtung PD7 Pin 16 LED an +
Displaybeleuchtung PC2 Pin 21 LED an +
Wi232 PC7 Pin 26 Wi232 CMD Pin
 
 
*/
 
 
 
 
#ifndef HAL_HW1_3_H_
#define HAL_HW1_3_H_
 
#define set_cs() (PORTB |= (1 << PB4)) // Display
#define clr_cs() (PORTB &= ~(1 << PB4))
#define set_reset() (PORTB |= (1 << PB2))
#define clr_reset() (PORTB &= ~(1 << PB2))
#define set_A0() (PORTB |= (1 << PB3)) // Data
#define clr_A0() (PORTB &= ~(1 << PB3)) // Command
#define set_scl() (PORTB |= (1 << PB7))
#define clr_scl() (PORTB &= ~(1 << PB7))
#define set_si() (PORTB |= (1 << PB5))
#define clr_si() (PORTB &= ~(1 << PB5))
 
#define clr_LED1() (PORTC &= ~(1 << PC3)) // Leds
#define set_LED1() (PORTC |= (1 << PC3))
 
#define set_LED2() (PORTC &= ~(1 << PC2))
#define clr_LED2() (PORTC |= (1 << PC2))
#define set_LED3() (PORTB &= ~(1 << PB1))
#define clr_LED3() (PORTB |= (1 << PB1))
#define set_LED4() (PORTB &= ~(1 << PB0))
#define clr_LED4() (PORTB |= (1 << PB0))
 
 
#define clr_BEEP() (PORTC &= ~(1 << PC6)) //Summer
#define set_BEEP() (PORTC |= (1 << PC6))
 
 
#define set_WI232CMD() (PORTC &= ~(1 << PC7))
#define clr_WI232CMD() (PORTC |= (1 << PC7))
 
 
#define KEY_PIN PINA
 
 
#define KEY_ENTER PA7
#define KEY_ESC PA6
#define KEY_PLUS PA5
#define KEY_MINUS PA4
 
 
 
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus*/
 
 
void InitHWPorts(void);
void Port_USB2FC(void);
 
#endif /* HAL_HW1_3_H_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/HAL_HW3_9.c
0,0 → 1,221
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef HAL_HW3_9_C_
#define HAL_HW3_9_C_
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdbool.h>
#include <stdlib.h>
#include "main.h"
#if defined HWVERSION3_9
#include "messages.h"
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
#include "uart1.h"
#include "bluetooth.h"
#include "error.h"
#include "connect.h"
#include "lipo.h"
#include "setup.h"
#include "osd.h"
 
 
volatile uint8_t USBBT;
volatile uint8_t U02SV2;
 
 
//--------------------------------------------------------------
void InitHWPorts(void) // Initialisierung der Hardware für die jeweilige Leiterplattenversion
 
{
//PORTA |= (1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7); // Enable Pull Up for the 4 keys // MartinR: so war es
PORTA |= (1<<PORTA3)|(1<<PORTA4)|(1<<PORTA5)|(1<<PORTA6)|(1<<PORTA7); // Enable Pull Up for the 4 keys // MartinR: Port3: Taster von Joystick
DDRA &= ~(1<<DDA4); // Eingang: A4 auf Low setzen (Power On)
 
DDRB = 0xFF; // Alles Ausgänge
 
PORTC |= (1<<PORTC4)|(1<<PORTC7); // Enable Pull Up for LBO + Summer
DDRC |= (1<<DDC2)|(1<<DDC3)|(1<<DDC5)|(1<<DDC6)|(1<<DDC7); // Ausgang: Led2,Rs232Switch,Summer
DDRC &= ~(1<<DDC4); // Eingang: LowBat LTC1308
_BTOn(); // Erstmal USB dektivieren, damit beim versehentlichen Einschalten USB im PC ruhig bleibt
 
PORTD |= (1<<PORTD6); // Wi232-CMD auf High schalten
DDRD |= (1<<DDD4)|(1<<DDD5)|(1<<DDD6)|(1<<DDD7); // Ausgang: PiepserTest, Servo, Wi232-CMD und Beleuchtung
 
set_V_On(); // Spannung mit T3 halten
 
Timer0_Init (); // system
Timer1_Init (); // pwm
Timer2_Init (); // display
 
 
Display_on = 1;
USART_Init (UART_BAUD_SELECT(USART_BAUD,F_CPU));
uart1_init (UART_BAUD_SELECT(USART_BAUD,F_CPU)); // USB
I2C_Init(1);
 
 
sei ();
 
LCD_Init (0); // muss vor "ReadParameter" stehen
ReadParameter (); // Aktuelle Werte aus EEProm auslesen
 
if (DisplayLanguage > NUM_LANG) // Beim ersten Start Sprache abfragen
{ DisplayLanguage = 1;
DisplayLanguage = Edit_Language(DisplayLanguage,0,3,DISPLAY3);
WriteParameter();
}
 
 
OCR2A = LCD_Helligkeit * 2.55;
LCD_Init (1);
set_beep ( 200, 0x0080, BeepNormal);
 
OSD_active = false; //keine OSD Ausgabe
// MartinR: zu menue.c hin verschoben
// ADC_Init(); // ADC für Lipomessung
// Power On Delay
// lcd_printp_at (2,2,PSTR("Taste 1 Sekunde"), 0);
// lcd_printp_at (2,3,PSTR("lang festhalten."), 0);
lcd_printpj_at (4, 1, PSTR("PKT 3.9"),0);
lcd_printpj_at (4, 2, PSTR(PKTSWVersion),0);
lcd_puts_at(0, 4, strGet(BOOT1), 0);
lcd_puts_at(0, 5, strGet(BOOT2), 0);
 
_delay_ms(800);
 
if (PINA & (1<<PINA7)) // Spannung eingeschaltet lassen
clr_V_On();
 
_delay_ms(100);
 
set_beep ( 500, 0x0080, BeepNormal);
get_key_press(KEY_ALL);
 
lcd_cls();
 
if ((UseWi == true) && (WiIsSet == false))
{
InitWi232(PKT_Baudrate); // wenn Wi232 nicht initialisiert ist, dann jetzt tun
}
 
lcd_cls();
set_BTOff(); // BT ausschalten
if ((UseBT == true) && (BTIsSet == false))
{
bt_init();
// set_USBOn();
}
 
lcd_cls();
 
if ((UseWi == true) && (U02SV2 == 0))
{
Change_Output(Uart02Wi); // Verbindung zu Wi232 herstellen
if (PKT_StartInfo == true)
{
// lcd_printp_at (0, 0, PSTR("Verbindung zum MK ist"), 0);
// lcd_printp_at (0, 1, PSTR("auf Wi232 eingestellt"), 0);
lcd_puts_at(0, 0, strGet(BOOT_WI1), 0);
lcd_puts_at(0, 1, strGet(BOOT_WI2), 0);
_delay_ms(2000);
}
}
else
{
Change_Output(Uart02FC); // Verbindung zu SV" (Kabel) herstellen
if (PKT_StartInfo == true)
{
// lcd_printp_at (0, 0, PSTR("Verbindung zum MK ist"), 0);
// lcd_printp_at (0, 1, PSTR("auf Kabel eingestellt"), 0);
lcd_puts_at(0, 0, strGet(BOOT_WI1), 0);
lcd_puts_at(0, 1, strGet(BOOT_SV), 0);
_delay_ms(2000);
}
}
 
lcd_cls();
 
}
 
 
 
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
// PWM einschalten
TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1);
TCCR2B |= (1 << CS20);
}
 
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
// PWM ausschalten
TCCR2A = 0;
TCCR2B = 0;
}
 
uint8_t BTIsOn=0;
 
void set_BTOn(void)
{
if (BTIsOn == 0)
{
_BTOn();
BTIsOn = 1;
_delay_ms(2000);
}
}
void set_BTOff(void)
{
set_USBOn();
BTIsOn = 0;
}
 
 
 
#endif
#endif // HAL_HW3_9_C_
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/HAL_HW3_9.h
0,0 → 1,142
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef HAL_HW3_9_H_
#define HAL_HW3_9_H_
 
 
 
//#define PIEPSER_NERVT // Summer zu Testzwecken ganz Ausschalten
 
 
// Hardware 3.9 Portbelegung
#define KEY_PIN PINA // Port A als Input
// MartinR: von PA.. auf PINA.. geändert...
#define Touch0 PINA0 // Pin 37
#define Touch1 PINA1 // Pin 36
#define Touch2 PINA2 // Pin 35
#define Touch3 PINA3 // Pin 34
#define Key1 PINA4 // Pin 33 // MartinR: von PA.. auf PINA.. geändert
#define Key2 PINA5 // Pin 32 // MartinR: von PA.. auf PINA.. geändert
#define Key3 PINA6 // Pin 31 // MartinR: von PA.. auf PINA.. geändert
#define Key4 PINA7 // Pin 30 // MartinR: von PA.. auf PINA.. geändert
 
#define USB2Wi PINB0 // Pin 40 aktiv low > IC5
#define VoltageHold PINB1 // Pin 41 High = Spannung T3 halten
#define Display_Reset PINB2 // Pin 42
#define Display_A0 PINB3 // Pin 43
#define Display_CS PINB4 // Pin 44
#define Display_SI PINB5 // Pin 1
#define LED1 PINB6 // Pin 2 Low = LED1 (nicht benutzbar wegen SCL
#define Display_SCL PINB7 // Pin 3
 
#define I2C_SCL PINC0 // Pin 19 SCL
#define I2C_CDA PINC1 // Pin 20 SDA
#define USB2FC PINC2 // Pin 21 aktiv low > IC5
#define USB_BT PINC3 // Pin 22 high = USB, Low = Bluetooth, LED2
#define LowBat PINC4 // Pin 23 Low Bat Warning Lipo PKT,Input
#define Uart02Wi PINC5 // Pin 24 aktiv Low > IC4
#define Uart02FC PINC6 // Pin 25 aktiv Low > IC4
#define Summer PINC7 // Pin 26 Low = Summer
 
#define Uart0RxD PIND0 // Pin 9 über IC4 =Wi | SV2
#define Uart0TxD PIND1 // Pin 10 über IC4 =Wi | SV2
#define Uart1RxD PIND2 // Pin 11 direkt = USB, BTM, über IC5 = Wi | SV2
#define Uart1TxD PIND3 // Pin 12 direkt = USB, BTM, über IC5 = Wi | SV2
#define PiepserTest PIND4 // Pin 13 CTC für Piepser
#define Servo PIND5 // Pin 14 PWM für Servo
#define Wi232_CMD PIND6 // Pin 15 aktiv Low = Wi232 CMD
#define Displaybeleuchtung PIND7 // Pin 16 High = Display-LED
 
#define KEY_ENTER Key1
#define KEY_ESC Key2
#define KEY_PLUS Key3
#define KEY_MINUS Key4
 
#define KEY_EXT PINA3 // MartinR
 
// |= schaltet Ausgang auf HIGH
// &= ~ schaltet Ausgang auf LOW
 
#define set_reset() (PORTB |= (1 << Display_Reset))
#define clr_reset() (PORTB &= ~(1 << Display_Reset))
 
#define set_A0() (PORTB |= (1 << Display_A0))
#define clr_A0() (PORTB &= ~(1 << Display_A0))
 
#define set_cs() (PORTB |= (1 << Display_CS))
#define clr_cs() (PORTB &= ~(1 << Display_CS))
 
#define set_si() (PORTB |= (1 << Display_SI))
#define clr_si() (PORTB &= ~(1 << Display_SI))
 
#define set_scl() (PORTB |= (1 << Display_SCL))
#define clr_scl() (PORTB &= ~(1 << Display_SCL))
 
#define _BTOn() (PORTC &= ~(1 << USB_BT)) // Bluetooth ein
 
#define set_USBOn() (PORTC |= (1 << USB_BT)) // USB ein
 
#define clr_V_On() (PORTB &= ~(1 << VoltageHold)) // Spannung mit T3 halten
#define set_V_On() (PORTB |= (1 << VoltageHold))
 
#define set_USB2FC() (PORTC &= ~(1 << USB2FC)) // USB mit FC-Kabel verbinden
#define clr_USB2FC() (PORTC |= (1 << USB2FC))
 
#define set_USB2Wi() (PORTB &= ~(1 << USB2Wi)) // USB mit Wi232 verbinden
#define clr_USB2Wi() (PORTB |= (1 << USB2Wi))
 
#define set_Uart02FC() (PORTC &= ~(1 << Uart02FC)) // Uart0 mit FC-Kabel verbinden
#define clr_Uart02FC() (PORTC |= (1 << Uart02FC))
 
#define set_Uart02Wi() (PORTC &= ~(1 << Uart02Wi)) // Uart0 mit Wi232 verbinden
#define clr_Uart02Wi() (PORTC |= (1 << Uart02Wi))
 
#define set_BEEP() (PORTC &= ~(1 << Summer)) // Summer
#define clr_BEEP() (PORTC |= (1 << Summer))
 
#define set_WI232CMD() (PORTD &= ~(1 << Wi232_CMD)) // Wi232 Programmierpin
#define clr_WI232CMD() (PORTD |= (1 << Wi232_CMD))
 
 
 
void set_D_LIGHT(void); /* Displaybeleuchtung ein*/
void clr_D_LIGHT(void); /* Displaybeleuchtung aus */
void InitHWPorts(void);
void set_BTOn(void); /* Bluetooth einschalten*/
void set_BTOff(void); /* Bluetooth einschalten*/
 
 
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/Hex/PKT_3.6.3a_MartinR_HW_3_9_de_25092012.hex
0,0 → 1,7051
:100000000C94442E0C946C2E0C946C2E0C946C2E30
:100010000C946C2E0C946C2E0C946C2E0C946C2EF8
:100020000C946C2E0C9404360C940F360C946C2E9D
:100030000C946C2E0C946C2E0C946C2E0C946C2ED8
:100040000C94C6360C946C2E0C946C2E0C946C2E66
:100050000C944C3F0C946C2E0C946C2E0C946C2EC7
:100060000C94337B0C946C2E0C94C63A0C946C2E2E
:100070000C94553E0C94983E0C946C2E0C946C2E63
:100080000C946C2E0C946C2E0C946C2E78507B502F
:100090007E508150845098509B50A450A7503F50A0
:1000A0005A505D5060506350665069506C506F50AC
:1000B000725075505150B050C9509783B583188411
:1000C0006A859485A385CB85DE85E885FE850E86C9
:1000D0003E86CC86F786C787DF873E884F8866884E
:1000E0009288F48825893E8731898887DE8605A82D
:1000F0004CCDB2D44EB93836A9020C50B99186888D
:10010000083CA6AAAA2ABE000000803F2E002E00AE
:100110003F002E00454550726F6D526576200045B8
:100120004550726F6D5265762000302E38386D0064
:1001300020202020202020202020202020202020BF
:1001400020202020200028432920474E55204750BA
:100150004C204C6963656E736520200020202020B0
:100160004E4F2057415252414E54592020202020BA
:10017000200020202020202020202020202020209F
:100180002020202020202000323030382054686F7A
:100190006D6173204B6169736572202020003230DD
:1001A00030392D32303130205065746572204D6108
:1001B000636B2000323031302053656261737469A3
:1001C000616E20426F65686D20003230313220430D
:1001D00068722E204272616E64746E657220260011
:1001E0002020202020486172616C6420426F6E677D
:1001F0006172747A20004A6F79737469636B20208E
:1002000020202020202020004A6F79737469636BBE
:10021000202020202020202020004A6F797374693C
:10022000636B202020202020202020004A6F79733B
:100230007469636B20202020202020202000504B58
:100240005420546F6F6C73202020202020201D002C
:10025000504B5420546F6F6C73202020202020209E
:100260001D00504B5420546F6F6C732020202020B1
:1002700020201D00504B5420546F6F6C73202020A1
:10028000202020201D004A6F79737469636B202041
:1002900020202020202020004A6F79737469636B2E
:1002A000202020202020202020004A6F79737469AC
:1002B000636B202020202020202020004A6F7973AB
:1002C0007469636B202020202020202020004D4BCB
:1002D00020446973706C6179202020202020200048
:1002E0004D4B20446973706C6179202020202020C0
:1002F00020004D4B20446973706C617920202020D0
:10030000202020004D4B20446973706C61792020BF
:10031000202020202000506172616D65746572207C
:100320002020202020201D00506172616D657465C1
:1003300072202020202020201D00506172616D65F8
:10034000746572202020202020201D0050617261E1
:100350006D65746572202020202020201D004465DA
:1003600062756720446174612020202020202000D5
:10037000446562756720446174612020202020203C
:10038000200044656275672044617461202020204C
:10039000202020004465627567204461746120203C
:1003A000202020202000504B5420546F6F6C73206D
:1003B0002020202020201D00504B5420546F6F6CB3
:1003C00073202020202020201D00504B5420546FEB
:1003D0006F6C73202020202020201D00504B5420C3
:1003E000546F6F6C73202020202020201D004A6F46
:1003F00079737469636B2020202020202020200046
:100400004A6F79737469636B20202020202020209C
:1004100020004A6F79737469636B202020202020AC
:10042000202020004A6F79737469636B202020209C
:100430002020202020004F53442020202020202056
:1004400020202020202020004F5344202020202046
:10045000202020202020202020004F534420202036
:100460002020202020202020202020004F53442026
:100470002020202020202020202020202000334465
:10048000204C616765202020202020202020200093
:10049000334420616E67656C657320202020202026
:1004A00020003344206C6F636174696F6E202020DC
:1004B000202020003344206C6F6361746965202024
:1004C00020202020200047505320496E666F2020B6
:1004D000202020202020200047505320496E666FA6
:1004E0002020202020202020200047505320496E2B
:1004F000666F2020202020202020200047505320FD
:10050000496E666F20202020202020202000466F8A
:100510006C6C6F77204D652020202020202020004B
:10052000466F6C6C6F77204D6520202020202020A6
:100530002000466F6C6C6F77204D652020202020B6
:1005400020202000466F6C6C6F77204D65202020A6
:100550002020202020004D4B20446973706C61796D
:1005600020202020202020004D4B20446973706CF7
:10057000617920202020202020004D4B20446973E9
:10058000706C617920202020202020004D4B2044D9
:100590006973706C61792020202020202000506138
:1005A00072616D65746572202020202020201D005E
:1005B000506172616D6574657220202020202020BA
:1005C0001D00506172616D657465722020202020CD
:1005D00020201D00506172616D65746572202020BD
:1005E000202020201D0044656275672044617461ED
:1005F000202020202020200044656275672044616F
:10060000746120202020202020004465627567202E
:100610004461746120202020202020004465627500
:100620006720446174612020202020202000504B4E
:100630005420546F6F6C73202020202020201D0038
:10064000504B5420546F6F6C7320202020202020AA
:100650001D00504B5420546F6F6C732020202020BD
:1006600020201D00504B5420546F6F6C73202020AD
:10067000202020201D0020001D00504B542D546FC1
:100680006F6C2046432000302E38386D0012001366
:1006900000504B542D546F6F6C2046432000302E79
:1006A00038386D0020504B542055706461746520BB
:1006B00020202020202020202000537461727420EC
:1006C000617672647564652E65786520202020004F
:1006D0002D706D3132383470202D63617672313077
:1006E0003920202020002D50636F6D3F202D623176
:1006F0003135323030202020202020002D55666CEE
:100700006173683A773A46494C452E6865783A6194
:100710002000204D6974206469657365722048610A
:1007200072647761726500206E69636874206DF68B
:10073000676C6963682100456E646500504B542006
:10074000546F6F6C2020562E202020202020202047
:100750002000332E362E3361002020202020202040
:1007600020202020202020202020202020200020A9
:10077000001300120013001200200020204C4950EA
:100780004F202021215761726E756E672121202034
:10079000004D6F746F722054657374657220202051
:1007A0002020004D6F746F72205465737465722041
:1007B00020202020004D6F746F7220546573746583
:1007C000722020202020004D6F746F7220546573BA
:1007D000746572202020202000536572766F2054AB
:1007E0006573746572202020202000536572766F37
:1007F0002054657374657220202020200053657298
:10080000766F205465737465722020202020005379
:100810006572766F205465737465722020202020E5
:1008200000504320425420203E204B6F707465726C
:10083000202000504320425420203E204B6F7074F3
:100840006572202000504320425420203E204B6FF0
:1008500070746572202000504320425420203E20B6
:100860004B6F707465722020005043205553422016
:100870003E204B6F7074657220200050432055530A
:1008800042203E204B6F7074657220200050432040
:10089000555342203E204B6F7074657220200050EB
:1008A0004320555342203E204B6F707465722020C8
:1008B00000504B5420536574757020202020202058
:1008C000201D00504B54205365747570202020204B
:1008D0002020201D00504B5420536574757020203B
:1008E00020202020201D00504B542053657475702B
:1008F000202020202020201D00504B5420566572BF
:1009000073696F6E20202020202000504B54205609
:10091000657273696F6E20202020202000504B5498
:100920002056657273696F6E2020202020200050B1
:100930004B542056657273696F6E20202020202052
:100940000020504B542D546F6F6C732020202020BA
:100950002020202020200012001300504320425469
:1009600020203E204B6F7074657200504320555319
:1009700042203E204B6F70746572001D00200020E5
:10098000001D00456E646500566F6C7400537563FE
:10099000686520424C2D4374726C00466F756E641E
:1009A00020424C2D4374726C3A0056657273696F25
:1009B0006E3A00536574506F693A00536574506F16
:1009C000694C3A005374617465203A005265616461
:1009D0004D6F643A00437572726E743A004D6178DF
:1009E00050574D203A0054656D7020203A00456EF6
:1009F000646520436865636B0020424C2D4374722C
:100A00006C20546573742020202020202020004D6D
:100A10006F746F723A202020310056616C75653A10
:100A200020202030001A201B001D00416C6C00416A
:100A30006C6C001D00200020001D00536574506F79
:100A4000696E742020203A0043757272656E7420BE
:100A50002020203A0054656D70657261747572656E
:100A60003A0056657273696F6E3A0053746174652B
:100A7000203A00504B5420332E3900332E362E337B
:100A80006100576932333220496E69744572726F62
:100A90007220200057692E323332204E414B0073B2
:100AA00065617263682057692E323332204D6F645E
:100AB000756C0020776974682032343030204261D0
:100AC0007564200020776974682039363030204200
:100AD00061756420002077697468203139323030C4
:100AE00020426175642000207769746820333834AF
:100AF0003030204261756400207769746820353792
:100B00003630302042617564002077697468203186
:100B100031353230302042617564006E6F20576984
:100B20002E32333220666F756E640057692E323371
:100B3000322053797461786572726F7220202000C0
:100B400057692E32333220666F756E642000576904
:100B50002E3233322077726F6E6720426175647275
:100B6000617465004572726F7220736574204E5611
:100B70002D52414D004E562D52414D206973207328
:100B8000657420746F2000676976656E2042617518
:100B90006472617465004572726F722073657420AF
:100BA00052414D20202020200052414D20697320C9
:100BB00073657420746F2000676976656E204261EA
:100BC0007564726174650056657273696F6E3A0080
:100BD000496E697420576932333220776169742E07
:100BE0002E2E2E002E002E002E002E002E002E0067
:100BF0002E002E002E002E002E002E002E002E0085
:100C00002E002E002E002E002E0057693233322087
:100C1000496E69744572726F7220200057693233D1
:100C20003220496E6974206F6B2E2E2E2E0057696C
:100C30002E323332204B6F6E66696775726174694C
:100C40006F6E20005043206D69742055534220760A
:100C5000657262696E64656E0057692E32333200C8
:100C600050726F6772616D6D207374617274656E1E
:100C700000457869740057692E32333220746F2032
:100C8000464320005043206D69742055534220761E
:100C9000657262696E64656E00756E64204D696B85
:100CA000726F6B6F70746572746F6F6C00737461C8
:100CB0007274656E0045786974002E004154503D91
:100CC0000041545A300041544C2A0041544C3100E8
:100CD00041544C320041544C330041544C34004197
:100CE000544C350041545131004154453000415479
:100CF00051300041544531004154004154410041BC
:100D000054480041544430004154443D004154464D
:100D10003F0041544F310041545230004154523150
:100D20000041544E3D0041545331000D004F4B0DD6
:100D30000A004552524F520D0A000D0A0044495311
:100D4000434F4E4E45435400434F4E4E454354008F
:100D500054696D65206F75742C4661696C20746FE1
:100D600020636F6E6E6563742100425420696E6962
:100D70007469616C6973696572656E2E2E002E0050
:100D8000496E717569727920526573756C74733A26
:100D90000D0A000D0A00496E717569727920456E61
:100DA000640042544D2D323232204B6F6E666967BB
:100DB0007572696572656E004643203E204D4B2D6D
:100DC000555342203E2042544D2D323232004D4B7D
:100DD0002D55534220616E20504320616E7363682D
:100DE0006C2E20005A7769736368656E204D4B2D19
:100DF00055534220756E64202000504B5420656985
:100E00006E2067656B7265757A74657320202000AB
:100E10004B6162656C20616E7363686C69657373A6
:100E2000656E2E202000526164696F74726F6E6966
:100E3000782057692E323332445453004576616C22
:100E4000756174696F6E20283836384D487A2920CC
:100E5000200052656164696E6700416E616C6F6766
:100E6000204E616D65733A20004552524F523A2030
:100E70006E6F2064617461004643004E43004E4330
:100E8000004643003F004552524F523A206E6F20B9
:100E90006461746100204E6176692D4374726C2028
:100EA000446973706C61792020200046430020441F
:100EB0006973706C61792020202020202020202060
:100EC0002020200020200020466C696768742D4394
:100ED00074726C20446973706C617920004E430019
:100EE000204E6176692D4374726C20446973706C76
:100EF00061792020200046430020446973706C61B2
:100F000079202020202020202020202020200020A8
:100F1000200020466C696768742D4374726C20440D
:100F20006973706C617920004E4300204E617669D0
:100F30002D4374726C20446973706C617920202099
:100F4000004643004665686C65723A204B65696EE1
:100F50006520446174656E0020454550524F4D2018
:100F6000506172616D657465722020202000776584
:100F70007264656E20617566005374616E6461729F
:100F80006477657274652067657365747A74003080
:100F900030303000504B5420436562726120002194
:100FA00021436865636B20506172616D6574657281
:100FB000212120004F4B002E002E000D0A000000C2
:100FC000000000007815141578002055545578005D
:100FD0003845444538003049484930003C4140419B
:100FE0003C003841402178007E1515150A00221773
:100FF0000F172200008482FF82840000000000009E
:1010000000000000000010385410101E0000000006
:1010100000001010101010101010107C10100000A4
:101020000000000008140000140810080404081050
:10103000081020201008000814224100004122144A
:10104000080004027F02040010207F2010001038E6
:101050005410101010101054381010181C1C1810B8
:1010600008183838180800081C3E7F00007F3E1C16
:10107000080006090909060006497D490600000026
:101080000000000000002F00000000070007000023
:10109000147F147F1400242A6B2A1200231308647F
:1010A0006200364955225000000503000000001C74
:1010B000224100000041221C000014083E081400D8
:1010C00008083E0808000050300000000808080822
:1010D00008000060600000002010080402003E517B
:1010E00049453E0000427F400000426151494600B0
:1010F0002141454B31001814127F1000274545450A
:1011000039003C4A4949300003017109070036495A
:1011100049493600064949291E00003636000000BC
:101120000056360000000814224100001414141464
:10113000140000412214080002015109060032493E
:1011400079413E007E1111117E007F4949493600E8
:101150003E41414122007F4141221C007F494949D3
:1011600041007F09090901003E4149497A007F0891
:1011700008087F0000417F4100002040413F0100FE
:101180007F08142241007F40404040007F020C0253
:101190007F007F0408107F003E4141413E007F09EF
:1011A000090906003E4151215E007F0919294600C8
:1011B00046494949310001017F0101003F4040405B
:1011C0003F001F2040201F003F4038403F00631475
:1011D000081463000708700807006151494543007F
:1011E0007F41410000000204081020000041417FBF
:1011F00000000402010204004040404040000001A1
:10120000020400002054545478007F4844443800BD
:10121000384444442000384444487F0038545454EF
:101220001800087E090102000C5252523E007F084D
:101230000404780000447D4000002040443D00004C
:101240007F102844000000417F4000007C04180407
:1012500078007C08040478003844444438007C1446
:1012600014140800081414187C007C0804040800F6
:10127000485454542000043F444020003C40402047
:101280007C001C2040201C003C4038403C0044288E
:10129000102844000C5050503C004464544C44000E
:1012A00000083641000000007F00000000413608C1
:1012B000000008082A1C0800081C2A0808004669C3
:1012C000782054797065203A2000536174202020E2
:1012D0002020203A20004163637572616379203ACF
:1012E000200050444F5020202020203A20005370EE
:1012F000656564202020203A20004C6F6E67202016
:101300002020203A20004C61742020202020203A08
:101310002000416C742020202020203A20004F0023
:10132000580078002D0020003344003244006E6FD6
:1013300000440020006F6B00202000636D002E0031
:101340006B6D2F68002E002E006D004E7572206DA3
:101350006974204E4320210020203031323334354F
:10136000363738394142434445460D0A00201A2099
:101370002020201B20202020204578697400A31302
:10138000A0139D139A139713941391138E134E2049
:10139000004E57005720005357005320005345007C
:1013A0004520004E45000E0F0E4E0E0F0E4F0E0F35
:1013B0000E530E0F0E570E0F0E4E0E0F0E4F0E0F3A
:1013C0000E530E0F0E570E0F0E4E0E0F0E4F0E0F2A
:1013D0000E530E0F0E576B6D68006D4168002E00A6
:1013E0002E002E002E002E002E006D005300530004
:1013F000560056006D4168006D41680041006D0067
:101400004B6D6800486F6D65006D202D005A696551
:101410006C006D202D005750001F0020200050430D
:1014200000205361740020536174006D2F73006DB0
:101430002F73006D2F730050504D2020202020204E
:1014400020202020202020005370656B7472756D61
:101450002020202020202020005370656B7472759E
:101460006D2048695265732020005370656B74725B
:10147000756D204C6F5265732020004A6574692099
:101480002020202020202020202020004143542004
:1014900044534C20202020202020202000484F545E
:1014A00054202020202020202020202020004675AD
:1014B000747562612053425553202020202000552E
:1014C0007365722020202020202020202020200052
:1014D0000000010C030101010000010C04040404DC
:1014E0000000010C010303030000010C02020202D0
:1014F0000003011905050505000301190606060686
:101500000003011907070707000301190808080865
:101510000003011909090909000301190A0A0A0A45
:10152000000301190B0B0B0B000301190C0C0C0C25
:101530000000000C63000000000200086E000000C4
:10154000000200046D0000000006000627010101F2
:10155000010200010D000000010200200D01010147
:10156000010200080D010101010200100D00000040
:10157000010200046D000000010200400D010101A4
:10158000010200800D000000010200040D000000B7
:1015900002000014170A0806020000141810100AAE
:1015A000020100FF19060604020100FF60000000AE
:1015B000030200016B000000030200026B00000048
:1015C000030200046B000000030200086B0000002F
:1015D000030100FF3B323232030000F73C5A5A5AF3
:1015E000030000F73D323232030000F7414E4E4E09
:1015F000030000F7424E4E4E040200010D000000B1
:10160000040200016D000000040200020D0101014E
:10161000040200026D010101040100FF10FFFFFF41
:10162000040000F70E1E1E1E040100FF110F0F0F15
:10163000040100FF0F1E1E1E040100FF1300000026
:10164000040100FF67969696040000F7120F0F0F33
:10165000040000F714080808040100FF154040408A
:10166000040000A016000000050100FF2D8080800E
:10167000050000F72E323232050200016C00000036
:10168000050000F72F0F0F0F050000F730E6E6E624
:101690000500001969000000050100FF318080800D
:1016A000050000F732555555050200026C00000098
:1016B000050000F733464646050000F734DCDCDC65
:1016C000050000196A000000050002083504040442
:1016D000050000F7363C3C3C050500F737000000EC
:1016E000050100FF387D7D7D050100FF397D7D7D91
:1016F000050100FF3A7D7D7D060200200D010101FC
:10170000060100FF50FEFEFE060100FF5164646406
:10171000060000F75A080808060000F759060606F2
:10172000060100FF525A5A5A060100FF535A5A5AEC
:10173000060100FF545A5A5A060100FF554B4B4B05
:10174000060100FF56555555060100FF574B4B4B00
:10175000060100FF58000000060100FF5B5A5A5ABC
:10176000060100FF5C2A2A2A060100FF5DF5F5F557
:10177000060100FF5E8C8C8C060000F75F050505F6
:10178000060200206D000000060200026E0000004C
:10179000060000F765000000070400FF4A5F5F5F76
:1017A000070100FF4B141414070200206B00000017
:1017B000070200106B010101070400FF4CF3F3F373
:1017C000070100FF4D141414070200406B000000D5
:1017D000070200806B010101070400FF4EAAAAAABC
:1017E000070400FF4FAAAAAA080000F71A08080871
:1017F000080000F71BE6E6E6080100FF1D40404038
:10180000080100FF62000000080200406D000000B7
:10181000080000F724212121080200086D000000C3
:10182000080000F7265A5A5A080000F7252D2D2DDA
:10183000080000F7660000000800000C68000000C7
:10184000080200106D000000080200046E00000095
:10185000080200806D000000080200016E00000018
:10186000080200106E000000090100FF1E5A6464A7
:10187000090100FF1F787878090100FF200A0A0A91
:10188000090100FF215A6464090100FF2278787879
:10189000090100FF45464646090200800D00000090
:1018A000090000F71C1B1B1B090000F74320202028
:1018B000090100FF28101010090000F74400000083
:1018C0000900001023060606090000F76400000066
:1018D0000A0100FF290000000A0100FF2A000000A1
:1018E0000A0100FF2B0000000A0100FF2C0000008D
:1018F0000A0100FF460000000A0100FF4700000047
:101900000A0100FF480000000A0100FF4900000032
:101910000B0200400D0000000B0100FF3E5A5A5A16
:101920000B0100FF3F3737370B0100FF40464646AB
:101930000C050017610000000D0200010D00000001
:101940000D0100FF10FFFFFF0D0000A016000000BA
:101950000D0200200D0101010D0100FF50FEFEFEF1
:101960000D0200206D0000000D0000F76500000072
:101970000D0100FF620000000D0200406D0000003C
:101980000D00000C630000000D0500176100000051
:101990004761732020202020202020202020005478
:1019A00068726F74746C65202020202020004761CD
:1019B0007A20202020202020202020200047617332
:1019C0002020202020202020202020004769657230
:1019D0002020202020202020202000476965722020
:1019E000202020202020202020004C6163657420CE
:1019F0002020202020202020004769657220202000
:101A000020202020202020004E69636B20202020F1
:101A1000202020202020004E69636B2020202020E1
:101A200020202020200054616E67616765202020FF
:101A300020202020004E69636B20202020202020C1
:101A400020202000526F6C6C20202020202020209D
:101A5000202000526F6C6C2020202020202020208D
:101A60002000526F756C69732020202020202020D8
:101A700000526F6C6C20202020202020202020008D
:101A8000506F746920312020202020202020005019
:101A90006F74692031202020202020202000506FEA
:101AA00074692031202020202020202000506F74D5
:101AB000692031202020202020202000506F7469D0
:101AC0002032202020202020202000506F74692008
:101AD00032202020202020202000506F74692032E6
:101AE000202020202020202000506F7469203220E8
:101AF0002020202020202000506F746920332020D7
:101B000020202020202000506F74692033202020C6
:101B1000202020202000506F7469203320202020B6
:101B20002020202000506F746920332020202020A6
:101B300020202000506F7469203420202020202095
:101B4000202000506F746920342020202020202085
:101B50002000506F74692034202020202020202075
:101B600000506F7469203420202020202020200085
:101B7000506F746920352020202020202020005024
:101B80006F74692035202020202020202000506FF5
:101B900074692035202020202020202000506F74E0
:101BA000692035202020202020202000506F7469DB
:101BB0002036202020202020202000506F74692013
:101BC00036202020202020202000506F74692036ED
:101BD000202020202020202000506F7469203620F3
:101BE0002020202020202000506F746920372020E2
:101BF00020202020202000506F74692037202020D2
:101C0000202020202000506F7469203720202020C1
:101C10002020202000506F746920372020202020B1
:101C200020202000506F74692038202020202020A0
:101C3000202000506F746920382020202020202090
:101C40002000506F74692038202020202020202080
:101C500000506F7469203820202020202020200090
:101C60004D6F746F7220536963682E536368004D23
:101C70006F742E5361666574792053772E004D6F13
:101C8000742E5361666574792053772E004D6F74FE
:101C90002E7361662E736368616B2E004D6F746FD7
:101CA00072205377692E4D6F6465004D6F746F72AB
:101CB000205377692E4D6F6465004D6F746F7220ED
:101CC0005377692E4D6F6465004D6F746F722053AA
:101CD00077692E4D6F6465004572772E20536967D2
:101CE0002E2050722E2000456E682E205369672EDC
:101CF000436865636B0052656365702052656E666C
:101D00006F72636500556974672E5369672E436867
:101D100065636B00456D7066E46E6765722054798B
:101D2000702000526563656976657220547970652C
:101D30002000547970652052656365707465757212
:101D4000004F6E7476616E672E20547970652000A6
:101D500048F668656E726567656C657220200043A1
:101D600074726C20416C74697475646520004374EE
:101D7000726C20416C7469747564652000437472E0
:101D80006C20486F6F6774652020200047505320F7
:101D900020202020202020202020004750532020D9
:101DA00020202020202020202000475053202020C9
:101DB00020202020202020200047505320202020B9
:101DC00020202020202020004B6F6D706173732035
:101DD00020202020202000436F6D7061737320202D
:101DE000202020202000436F6D7061732020202070
:101DF00020202020004B6F6D706173202020202058
:101E0000202020004B6F6D70466573742041757300
:101E1000722E00436F6D704F7269656E742E466945
:101E200078004D61696E7469656E20436170202091
:101E3000004B6F6D706173207661737420202000F9
:101E40004572772E205369672E2050722E20005342
:101E5000656E732E52637653696756616C004374E6
:101E6000726C2052656E205265636570004578740F
:101E7000526563205369676E61616C0041636873EA
:101E800028652E296B6F70706C2E00417869732065
:101E9000436F7570696E672020004465636F7570CD
:101EA0006C61676520417865004173206B6F7070CD
:101EB000656C696E672020004472656872617465A4
:101EC0006E626567722E00526F7452617465206C89
:101ED000696D69742E004C696D6974205669742EA1
:101EE00020526F7400526F7452617465206C696D7A
:101EF00069742E0048656164696E6720486F6C6480
:101F00002020004E69636B2F526F6C6C20202020C4
:101F100020004F7269656E742E2046697865202016
:101F2000004B6F657273207661737420202020004F
:101F30004E69636B2F526F6C6C2050202020004E36
:101F400069636B2F526F6C6C205020202000526F01
:101F5000756C2F54616E672050202020004E6963FD
:101F60006B2F526F6C6C2050202020004E69636BE9
:101F70002F526F6C6C2044202020004E69636B2F21
:101F8000526F6C6C204420202000526F756C2F54CF
:101F9000616E672044202020004E69636B2F526FD2
:101FA0006C6C20442020200047696572205020205E
:101FB000202020202020004769657220502020200A
:101FC0002020202020004C616365742050202020B8
:101FD00020202020004769657220502020202020EA
:101FE0002020200045787465726E65204B6F6E74FA
:101FF000722E0045787465726E204374726C2020D6
:1020000020004374726C2045787465726E652020E0
:102010000045787465726E20436F6E74726F6C0049
:102020004C6F6F70696E67206F62656E2020004C88
:102030006F6F70696E6720757020202020004C6FD4
:102040006F70696E67204176616E7420004C6F6F0F
:1020500070696E67206F6D686F6F67004C6F6F708F
:10206000696E6720756E74656E20004C6F6F7069C5
:102070006E6720646F776E2020004C6F6F70696E02
:102080006720417272696572004C6F6F70696E678C
:102090002062656E65642E004C6F6F70696E6720FC
:1020A0006C696E6B7320004C6F6F70696E67206C8B
:1020B0006566742020004C6F6F70696E6720476101
:1020C00075636865004C6F6F70696E67206C696E30
:1020D0006B7320004C6F6F70696E67207265636868
:1020E0007473004C6F6F70696E67207269676874F3
:1020F00020004C6F6F70696E672044726F69746561
:10210000004C6F6F70696E6720726563687473004E
:10211000476173204C696D69742020202020005491
:1021200068726F74746C65204C696D6974004C69D9
:102130006D6974652047617A202020200047617313
:10214000204C696D6965742020202000416E7370F9
:1021500072656368736368772E2000526573702E12
:10216000205468726573682E2000536575696C2071
:102170005265706F6E736520004472656D70656C9A
:102180007761617264652000487973746572657364
:10219000652020202020004879737465726573697A
:1021A0007320202020004879737465726573697309
:1021B00020202020004879737465726573652020A3
:1021C00020202000556D6B656872702E204E69636B
:1021D0006B20005475726E6F766572204E69636B6A
:1021E0002000496E7665727320526F756C6973209A
:1021F000004E69636B206765696E766572742E00A8
:10220000556D6B656872702E20526F6C6C20005497
:1022100075726E6F76657220526F6C6C2000496E1D
:10222000766572732054616E6761676500526F6CEA
:102230006C206765696E766572742E0048F6686575
:102240006E726567656C756E672000416C746974A9
:10225000756465204374726C20004374726C204175
:102260006C7469747564652000486F6F67746520CD
:10227000436F6E74726F6C004A3A484265672C4E29
:102280003A566172696F00593A4C696D482C4E3A62
:10229000566172696F00593A4C696D482C4E3A5636
:1022A0006172696F00593A4C696D482C4E3A56611B
:1022B00072696F00536368616C74657220662E20CA
:1022C000482E007573652053772E20662E53657453
:1022D0007000537769746820486175746575722061
:1022E00000536368616B2E20486F6F677465200030
:1022F000616B7573742E20566172696F20200061C6
:10230000636F757374696320566172696F005661FB
:1023100072696F2041636F757374696300416B6FFD
:102320006573742E20566172696F2000536F6C6C58
:1023300068F6686520202020202000536574706FA7
:10234000696E742020202020200048617574657516
:1023500072204D617820202000476577656E737488
:102360006520686F6F6774004D696E2E204761733A
:10237000202020202020006D696E2E207468726F4E
:1023800074746C65200047617A204D696E202020AE
:1023900020202020004D696E696D61616C206761AD
:1023A0007320200048F6686520502020202020203F
:1023B000202000416C7469747564652050202020D1
:1023C0002000416C746974756465205020202020C1
:1023D00000486F6F67746520502020202020200067
:1023E0004C756674647275636B2044202020004233
:1023F00061726F6D657472696320442020005072B1
:10240000657373696F6E2044202020200042617242
:102410006F6D6574722E2044202020005A2D414398
:102420004320202020202020202000414343205A08
:1024300020202020202020202000414343205A201B
:10244000202020202020202000414343205A20200B
:1024500020202020202020004D61782E2048F66882
:10246000652020202020004D61782E20416C746969
:102470007475646520004D61782E20486967682076
:1024800020202020004D61782E20686F6F677465D2
:10249000202020005665727374E4726B756E672F8E
:1024A0005220006761696E2F7261746520202020C0
:1024B00020004761696E2F4672657175656E6365B0
:1024C0000056657273742E2F72617465202020008F
:1024D00053636877656265676173202B2F2D0068F1
:1024E0006F6F7665722076617269612E2000566189
:1024F0007220566F6C2053746174202000686F6FD7
:102500007665722076617269612E200047505320F3
:102510005A20202020202020202000475053205ADD
:1025200020202020202020202000475053205A2007
:10253000202020202020202000475053205A2020F7
:102540002020202020202000537469636B204E65DA
:102550007574722E205000737469636B206E6575FC
:1025600074722E205000506F73204E657574726522
:10257000204D616E00737469636B206E65757472B3
:102580002E2050004E69636B20532E20416E7374D1
:102590002E20006E69636B207365727620637472FF
:1025A0006C004173736572762054616E6761676574
:1025B000006E69636B2073657276206374726C00C1
:1025C0004E69636B204B6F6D70656E732E20006ECD
:1025D00069636B20636F6D70656E732E2000436FAF
:1025E0006D702054616E676167652020006E6963BD
:1025F0006B20636F6D70656E732E20004E69636B88
:1026000020556D6B656872656E20006E69636B2086
:10261000696E762E206469722E00496E766572733B
:10262000657220526F756C20006E69636B20696E55
:10263000762E726963682E004E69636B2053657253
:10264000766F206D696E006E69636B2073657276BC
:102650006F206D696E00536572766F204D696E2034
:1026600020202020006E69636B20736572766F20D6
:102670006D696E004E69636B20536572766F206DD5
:102680006178006E69636B20736572766F206D618F
:102690007800536572766F204D61782020202020CD
:1026A000006E69636B20736572766F206D617800D0
:1026B0004E69636B20536572762046696C74004ED8
:1026C00069636B20536572762046696C74004E69AD
:1026D000636B20536572762046696C74004E6963A3
:1026E0006B20536572762046696C7400526F6C6C77
:1026F00020532E20416E73742E2000726F6C6C205C
:1027000073657276206374726C00417373657276C0
:1027100020526F756C69732000726F6C6C2073654A
:102720007276206374726C00526F6C6C204B6F6D0C
:1027300070656E732E2000726F6C6C20636F6D700D
:10274000656E732E2000436F6D702054616E67615B
:102750006765202000726F6C6C20636F6D70656E12
:10276000732E2000526F6C6C20556D6B656872651E
:102770006E2000726F6C6C20696E762E2064697218
:102780002E00496E7665727365722054616E672003
:1027900000726F6C6C206F6D6B6572656E2020002F
:1027A000526F6C6C20536572766F206D696E00728B
:1027B0006F6C6C20736572766F206D696E00536567
:1027C00072766F204D696E202020202000726F6C81
:1027D0006C20736572766F206D696E00526F6C6C41
:1027E00020536572766F206D617800726F6C6C207B
:1027F000736572766F206D617800536572766F2015
:102800004D6178202020202000726F6C6C20736551
:1028100072766F206D617800526F6C6C2053657218
:10282000762046696C7400526F6C6C20536572762A
:102830002046696C7400526F6C6C20536572762070
:1028400046696C7400526F6C6C205365727620463A
:10285000696C7400416E73742E20476573636877EA
:102860002E2000736572766F2072656672657368DC
:102870002000546175782052656672657368202067
:1028800000536572766F207265667265736820000A
:102890004D616E75656C6C65204765736368006D8E
:1028A000616E75656C6C20537065656420005669B7
:1028B0007465737365204D616E2E202000536E6524
:1028C0006C682E68616E646265642E0043616D20E1
:1028D0005269636874756E6720200043616D204FF4
:1028E0007269656E74202020200043616D204F7254
:1028F00069656E74202020200043616D657261203F
:1029000072696368742E2000536572766F203320DD
:1029100020202020202000536572766F2033202055
:10292000202020202000536572766F203320202045
:102930002020202000536572766F20332020202035
:1029400020202000536572766F2034202020202024
:10295000202000536572766F203420202020202014
:102960002000536572766F20342020202020202004
:1029700000536572766F2034202020202020200014
:10298000536572766F2035202020202020200053B0
:102990006572766F2035202020202020200053658E
:1029A00072766F2035202020202020200053657271
:1029B000766F2035202020202020200047505320F3
:1029C0002020202020202020202000656E61626CC5
:1029D00065204750532020202000416374697665AC
:1029E000722047505320202000656E61626C652084
:1029F0004750532020202000475053204D6F6475CE
:102A0000732053742E2000475053206D6F6465204F
:102A1000636F6E747200446566204D6F6465204775
:102A20005053202000475053206D6F646520636F22
:102A30006E747200475053205665727374E4726B63
:102A40002E2000475053204761696E20202020200F
:102A500020004761696E204750532020202020200D
:102A60000047505320766572737465726B2E200098
:102A70004750532053742E20536368772E2000470D
:102A8000505320737469636B2074687265005365DA
:102A900075696C204D616E63686520200047505356
:102AA0002073742E206472656D702E004D696E2E39
:102AB000205361742E2020202020004D696E2E208E
:102AC0005361742E2020202020004E627265204D1C
:102AD000696E2E205361742E004D696E2E20536155
:102AE000742E2020202020004750532D50202020DD
:102AF000202020202020004750532D50202020202F
:102B00002020202020004750532D5020202020201E
:102B100020202020004750532D502020202020200E
:102B2000202020004750532D492020202020202005
:102B30002020004750532D492020202020202020F5
:102B400020004750532D49202020202020202020E5
:102B5000004750532D4920202020202020202000F5
:102B60004750532D442020202020202020200047A3
:102B700050532D442020202020202020200047508A
:102B8000532D442020202020202020200047505377
:102B90002D442020202020202020200050204C697F
:102BA0006D697420202020202020004C696D6974FC
:102BB000202050202020202020004C696D69746561
:102BC0002050202020202020004C696D6965742051
:102BD000205020202020200049204C696D6974205D
:102BE000202020202020004C696D6974202049207D
:102BF0002020202020004C696D6974652049202028
:102C000020202020004C696D696574202049202017
:102C10002020200044204C696D6974202020202051
:102C20002020004C696D6974202044202020202041
:102C300020004C696D6974652044202020202020EC
:102C4000004C696D696574202044202020202000FC
:102C5000475053204163632020202020202000473C
:102C60005053204163632020202020202000416316
:102C700063656C204750532020202020004750538C
:102C80002041636320202020202020004750532033
:102C900057696E646B6F72722E2000475053205735
:102CA000696E6420436F72722E00436F72726563A7
:102CB000742056656E742020004750532057696E6B
:102CC0006420436F72722E004272656D7377697271
:102CD0006B756E67202000537065656420636F6DAF
:102CE00070656E732E00436F6D70656E732056694C
:102CF000742020200052656D7765726B696E6720C5
:102D000020202000475053206D61782E20526164AE
:102D10002E2000475053206D61782E7261646975D2
:102D200073005261796F6E20475053204D617820B7
:102D300000475053206D61782E726164697573008D
:102D40004750532057696E6B656C204C692E0047C5
:102D5000505320616E676C2E6C696D6974004C690C
:102D60006D697420416E676C204750530047505383
:102D700020686F656B206C696D2E20005048204CD8
:102D80006F67696E2074696D6520005048206C6F14
:102D900067696E2074696D652000547073204D65FD
:102DA0006D6F726973202020005048206C6F676936
:102DB0006E2074696A64200044796E616D696320D5
:102DC0005048202020200044796E616D69632050B6
:102DD00048202020200044796E616D6963205048AE
:102DE000202020200044796E616D6973636865203E
:102DF00050482000475053206D2E205261642064BB
:102E0000504800475053206D2E205261642064507A
:102E10004800475053206D2E205261642064504872
:102E200000475053206D2E205261642064504800AA
:102E300043482048F66865202020202020200043B9
:102E40004820416C746974756465202020004348F3
:102E500020416C746974756465202020004348200B
:102E6000486F6F6774652020202020004C45443156
:102E7000204269746D61736B6520004F7574312059
:102E80004269746D61736B2020004269746D6173D7
:102E90006B20533120202020005569746731204277
:102EA0006974706174722E00202020202054696D96
:102EB000696E67202020004F7574312054696D6958
:102EC0006E6720202000486F726C6F676520533159
:102ED000202020200055697467312054696D696E87
:102EE000672020002020202020736F666F727420DE
:102EF000616E00416374697620202020202020200C
:102F0000200041637469662020202020202020209A
:102F1000004469726563742061616E202020200086
:102F200020202020206E2E6D2E4D6F746F72004178
:102F300063742E2077692E204D6F746F7200416389
:102F4000746966204175205265706F7300416B741F
:102F50002E206D6F746F7220756974004C45443279
:102F6000204269746D61736B6520004F7574322067
:102F70004269746D61736B2020004269746D6173E6
:102F80006B20533220202020005569746732204284
:102F90006974706174722E00202020202054696DA5
:102FA000696E67202020004F7574322054696D6966
:102FB0006E6720202000486F726C6F676520533267
:102FC000202020200055697467322054696D696E95
:102FD000672020002020202020736F666F727420ED
:102FE000616E00416374697620202020202020201B
:102FF00020004163746966202020202020202020AA
:10300000004469726563742061616E202020200095
:1030100020202020206E2E6D2E4D6F746F72004187
:1030200063742E2077692E204D6F746F7200416398
:10303000746966204175205265706F7300416B742E
:103040002E206D6F746F7220756974004F75743126
:1030500020566D696E2E5761726E004F7574312067
:10306000756E646572766F6C7400416C20556E6489
:103070006572766F6C746167005569746731206F93
:103080006E64657273702E004F75743220566D69D0
:103090006E2E5761726E004F75743220756E6465C6
:1030A00072766F6C7400416C20556E646572766F39
:1030B0006C746167005569746732206F6E64657265
:1030C00073702E004D696E2E2047617320202020E2
:1030D0002020006D696E2E207468726F74746C65A8
:1030E000200047617A204D696E2E2020202020206C
:1030F000006D696E696D61616C20676173202000ED
:103100004D61782E20476173202020202020006D03
:1031100061782E207468726F74746C65200047614A
:103120007A204D61782E202020202020006D6178AB
:10313000696D61616C206761732020004B6F6D7059
:103140006173737769726B756E6700636F6D706121
:1031500073732065666665637400456666657420F2
:10316000636F6D7061732020004B6F6D7061732011
:1031700065666665637420004361726566726565A5
:103180002053742E202000436172656672656520AD
:103190004374726C200043617265667265652043FA
:1031A00074726C20004361726566726565204374B9
:1031B000726C2000546561636861626C65204361D4
:1031C000726500546561636861626C652043617279
:1031D0006500546561636861626C65204361726576
:1031E00000546561636861626C65204361726500CB
:1031F000556E7465727370616E6E756E67200075C2
:103200006E646572766F6C74616765202000536F21
:1032100075732054656E73696F6E2020004F6E6465
:1032200065727370616E6E696E672000566F6C74A4
:10323000205265666572656E7A2000566F6C742048
:103240005265666572656E7A200054656E73696FAB
:103250006E20526566202020005265662E20737015
:10326000616E6E696E6720004E6F74204761732037
:103270005A656974202000456D6572672E54687226
:103280002E54696D65004475726565207365636FC2
:1032900075727320004E6F6F6420676173207469CC
:1032A0006A6420004E6F7420476173202020202024
:1032B000202000456D6572672E5468726F74746CBF
:1032C000650047617A206465207365636F7572736A
:1032D000004E6F6F64206761732020202020200043
:1032E0004661696C732E2043482054696D65004621
:1032F00061696C732E2043482054696D65004661F6
:10330000696C732E2043482054696D6500466169DD
:103310006C732E2043482054696A64004661696CCE
:10332000732E204368616E6E656C004661696C7334
:103330002E204368616E6E656C004661696C732E69
:10334000204368616E6E656C004661696C732E2067
:103350004368616E6E656C006B2E53756D6D6572A2
:10336000206F2053656E006E20626565702061637A
:103370007420545820006E2062656570206163746B
:1033800020545820006E20626565702061637420AF
:1033900054582000566172696F206661696C204143
:1033A0006C7400566172696F206661696C20416CB3
:1033B0007400566172696F206661696C20416C749B
:1033C00000566172696F206661696C20416C7400FF
:1033D000436F6D70617373204572726F722000438A
:1033E0006F6D70617373204572726F722000436F4E
:1033F0006D70617373204572726F7220004B6F6D38
:10340000706173204572726F722020006B2E5374AE
:10341000617274206F2E53442D4B006E2073742EF6
:10342000207774686F20534420006E2073742E2020
:103430007774686F20534420006E2073742E2077B9
:1034400074686F20534420006B2E53746172742093
:103450006F2E47505320006E2073742E20777468AF
:103460006F20475053006E2073742E207774686F5E
:1034700020475044006E2073742E207774686F20AC
:10348000475053004779726F205020202020202081
:103490002020004779726F205020202020202020FB
:1034A00020004779726F20502020202020202020EB
:1034B000004779726F2050202020202020202000FB
:1034C0004779726F204920202020202020200047AB
:1034D00079726F2049202020202020202000477969
:1034E000726F204920202020202020200047797260
:1034F0006F20492020202020202020004779726F53
:1035000020442020202020202020004779726F2096
:10351000442020202020202020004779726F204462
:103520002020202020202020004779726F20442076
:103530002020202020202000476965722050202074
:10354000202020202020004C616365742050202022
:103550002020202020004C61636574205020202012
:103560002020202000476965722050202020202044
:10357000202020004769657220492020202020203B
:103580002020004C616365742049202020202020E9
:1035900020004C61636574204920202020202020D9
:1035A000004769657220492020202020202020002B
:1035B00044796E616D69736368652053742E00648D
:1035C000796E616D69632073746162692E00537452
:1035D00061622044796E616D697175650044796E30
:1035E000616D69732E20737461622E004472656888
:1035F000726174656E6265672E2000526F7452614D
:103600007465206C696D69742E004C696D69742055
:1036100044697420526F746100546F6572656E74F2
:10362000616C206C696D2E004143432F4779726FA6
:103630002046616B2E20004143432F4779726F2053
:103640004661637420004143432F4779726F2046DF
:1036500061637420004143432F4779726F204661B4
:10366000637420004143432F4779726F204B6F6D85
:10367000702E00436F6D70204143432F4779726F66
:103680002000436F6D70204143432F4779726F20B4
:1036900000436F6D70204143432F4779726F2000C4
:1036A00048617570747265676C6572204920004DC1
:1036B00061696E20492020202020202020005265B2
:1036C00067756C205072696E6320492000486F6FE7
:1036D0006664726567656C2E2049200044726966D5
:1036E0006B6F6D70656E7361742E006472696674C1
:1036F00020436F6D70656E732E00436F6D70656E45
:103700007320446572697620004472696674206390
:103710006F6D70656E732E004779726F20737461E0
:10372000622E20202020004779726F20737461621E
:10373000696C697479004779726F205374616269AA
:103740006C697479004779726F2073746162696C77
:1037500069742E004D6F746F7220736D6F6F746893
:103760002020004D6F746F7220736D6F6F7468202E
:1037700020004D6F746F7220536D6F6F746820203E
:10378000004D6F746F7220736D6F6F74682020002E
:10379000506172616D657465722031202020005087
:1037A0006172616D65746572203120202000506166
:1037B00072616D6574657220312020200050617245
:1037C000616D657465722031202020005061726146
:1037D0006D65746572203220202000506172616D29
:1037E00065746572203220202000506172616D6521
:1037F000746572203220202000506172616D657402
:103800006572203220202000506172616D65746500
:1038100072203320202000506172616D65746572E2
:10382000203320202000506172616D657465722024
:103830003320202000506172616D65746572203301
:1038400020202000506172616D6574657220342003
:10385000202000506172616D6574657220342020F3
:103860002000506172616D657465722034202020E3
:1038700000506172616D65746572203420202000F3
:10388000506172616D657465722035202020005092
:103890006172616D65746572203520202000506171
:1038A00072616D6574657220352020200050617250
:1038B000616D657465722035202020005061726151
:1038C0006D65746572203620202000506172616D34
:1038D00065746572203620202000506172616D652C
:1038E000746572203620202000506172616D65740D
:1038F0006572203620202000506172616D6574650C
:1039000072203720202000506172616D65746572ED
:10391000203720202000506172616D65746572202F
:103920003720202000506172616D65746572203708
:1039300020202000506172616D657465722038200E
:10394000202000506172616D6574657220382020FE
:103950002000506172616D657465722038202020EE
:1039600000506172616D65746572203820202000FE
:103970004163687328652E296B6F70706C2E002868
:10398000446529436F75706C204178657300284445
:103990006529436F75706C20417865730041732011
:1039A0006B6F7070656C696E672020004769657287
:1039B00020706F732E204B6F707000526574726FA1
:1039C0006163206C616365742000526574726F617D
:1039D00063204C6163657420004769657220706FD5
:1039E000732E206B6F702E004E69636B2F526F6CBD
:1039F0006C204B6F707000526574726F20726F751F
:103A00006C2F74616E00526574726F20526F756C0A
:103A10002F54616E004E69636B2F526F6C6C206B7C
:103A20006F702E0047696572204B6F7272656B7400
:103A3000757200436F7272656374206C61636574A4
:103A40002000436F7272656374204C61636574205B
:103A5000004769657220636F7272656374696500FF
:103A60004F7269656E74696572756E672020004FCC
:103A70007269656E74696572756E672020004F7299
:103A800069656E746174696F6E202020000000000B
:103A900000000000000000000000000048F668651B
:103AA0006E726567656C756E672000416C74697431
:103AB000756465204374726C20004374726C2041FD
:103AC0006C7469747564652000486F6F6774652055
:103AD000436F6E74722E2000536F6C6C68F66865CD
:103AE00020202020202000536574706F696E7420A0
:103AF00020202020200048617574657572204D617A
:103B00007820202000476577656E73742E686F6F8C
:103B100067746500537469636B204E657574722E0B
:103B2000205000737469636B206E657574722E206B
:103B30005000506F73204E6575747265204D616E34
:103B400000537469636B206E657574722E2050008B
:103B500047505320202020202020202020200065B6
:103B60006E61626C65204750532020202000416325
:103B700074697665722047505320202000456E619D
:103B8000626C65204750532020202000475053206E
:103B90004D6F6475732053742E2000475053206D71
:103BA0006F646520636F6E747200446566206D6F8C
:103BB000646520475053202000475053206D6F64A8
:103BC0006520636F6E74720044796E616D69632065
:103BD0005048202020200044796E616D6963205098
:103BE00048202020200044796E616D696320504890
:103BF000202020200044796E616D696320504820A8
:103C00002020200043482048F668652020202020FE
:103C10002020004348204869676820202020202079
:103C20002000434820486967682020202020202069
:103C300000434820686F6F677465202020202000B3
:103C400043617265667265652053742E20200043BF
:103C500061726566726565204374726C2000436111
:103C6000726566726565204374726C2000436172F0
:103C70006566726565204374726C200054656163EB
:103C80006861626C652043617265005465616368B8
:103C900061626C65204361726500546561636861AF
:103CA000626C65204361726500546561636861629E
:103CB0006C652043617265004D6F746F72205369AB
:103CC00063682E536368004D6F742E53616665748C
:103CD000792053772E004D6F742E53616665747989
:103CE0002053772E004D6F742E7361662E736368B8
:103CF000616B2E004F7269656E74696572756E67CF
:103D00002020004F7269656E746174696F6E2020A7
:103D100020004F7269656E74696572756E67202048
:103D2000004F7269656E74617469652020202000FF
:103D30004B616EE46C652020202020202020004371
:103D400068616E6E656C2020202020202000436179
:103D50006E6175782020202020202020004B616E8D
:103D600061616C2020202020202020004B6F6E6697
:103D7000696775726174696F6E20006D61696E208C
:103D800020202020202020202000436F6E666967BD
:103D9000202020202020202000436F6E6669677558
:103DA0007261746965202000537469636B20202060
:103DB00020202020202000737469636B20202020A5
:103DC0002020202020004D616E6368652020202087
:103DD0002020202000537469636B202020202020A5
:103DE000202020004C6F6F70696E672020202020FB
:103DF0002020004C6F6F70696E67202020202020EB
:103E000020004C6F6F70696E6720202020202020DA
:103E1000004C6F6F70696E672020202020202000EA
:103E200048F6686520202020202020202020004106
:103E30006C74697475646520202020202000416C1A
:103E400074697475646520202020202000486F6FFD
:103E50006774652020202020202020004B616D65A4
:103E6000726120202020202020200043616D657297
:103E70006120202020202020200043616D65726198
:103E800020202020202020200043616D65726120C9
:103E900020202020202020004E6176694374726C1F
:103EA000202020202020004E6176694374726C200F
:103EB0002020202020004E6176694374726C2020FF
:103EC00020202020004E6176694374726C202020EF
:103ED0002020200041757367E46E67652020202054
:103EE0002020004F757470757473202020202020CE
:103EF0002000536F727469657320202020202020D9
:103F00000055697467616E67656E2020202020006F
:103F1000566572736368696564656E6573200044F5
:103F200069766572732020202020202020004469BB
:103F3000766572732020202020202020004469769E
:103F4000657273656E202020202020004779726FF3
:103F500020202020202020202020004779726F2060
:103F6000202020202020202020004779726F202050
:103F70002020202020202020004779726F20202040
:103F8000202020202020200042656E75747A657202
:103F90002020202020200055736572202020202022
:103FA000202020202000506172616D65747265735D
:103FB00020202020004765627275696B65722020A1
:103FC00020202000416368736B6F70706C756E67A2
:103FD000202000436F75706C20417865732020208D
:103FE0002000436F75706C2041786573202020207D
:103FF000004B6F7070656C696E67204173732000B1
:104000004D697865722D53657475702020200043CA
:104010006F6E666967204D69782020202000436F0D
:104020006E666967204D69782020202000436F6EFE
:104030006669672E204D6978657220004561737945
:104040002053657475702020202000436F6E6669D0
:1040500067204561737920202000436F6E66696791
:10406000204561737920202000436F6E6669672EBA
:1040700020656173792020001200130012002500D2
:10408000200020500020204A0020204E00530057DE
:1040900050450050504D0053706500537048005318
:1040A000704C004A65740041435400486F540053FB
:1040B000425500555352001300282020202D202067
:1040C00020292028643A20202029005374642E00DF
:1040D00028302D3234372D50382928643A506F203B
:1040E00029005374642E00506F202900506F002A5D
:1040F000002A001D00200020001D0028312D533112
:10410000322F57292028643A202020290053746434
:104110002E00530057504500201920202020301138
:1041200049202020456E64652020204F4B0031003F
:10413000300012002000120013005769726B6C6986
:104140006368204B6F70696572656E3F004B6F70DE
:104150006965727420756E6420416B746976696557
:1041600072740020536572766F20546573746572A3
:1041700020202020202020200025006D5300194FF2
:1041800018004F534420416E7A6569676520566177
:10419000722E20004F53442073637265656E6D6FFD
:1041A0006465202020004F53442073637265656E60
:1041B0006D6F6465202020004F5344207363726547
:1041C000656E6D6F6465202020004F5554312F328D
:1041D00020466F726D617420202020004F555431AD
:1041E0002F3220666F726D617420202020004F55A1
:1041F00054312F3220666F726D61742020202000B0
:104200004F5554312F3220666F726D61742020201B
:1042100020004F5554312F3220506F6C61726974F9
:10422000E47420004F5554312F3220706F6C61724E
:104230006974792020004F5554312F3220706F6CF3
:1042400061726974792020004F5554312F322070EB
:104250006F6C61726974792020004E617669204428
:104260006174656E20616E20535632004E6176692E
:10427000206461746120746F2053563220004E61B7
:104280007669206461746120746F20535632200077
:104290004E617669206461746120746F20535632D8
:1042A00020004D61782E2053696E6B726174652019
:1042B0006D2F73006D61782066616C6C737065653D
:1042C00064206D2F73006D61782066616C6C737073
:1042D000656564206D2F73006D61782066616C6C7C
:1042E0007370656564206D2F7300566172696F6D20
:1042F00065746572204265657020200056617269A0
:104300006F6D65746572206265657020200056616E
:1043100072696F6D6574657220626565702020003A
:10432000566172696F6D6574657220626565702093
:104330002000486F6D6520617573204D4B205369D7
:1043400063687400686F6D652066726F6D204D4BF9
:10435000207669657700686F6D652066726F6D20E5
:104360004D4B207669657700686F6D652066726FCA
:104370006D204D4B2076696577004D4B204C6F7753
:10438000426174205761726E756E67004D4B204C10
:104390006F77426174207761726E696E67004D4B72
:1043A000204C6F7742617420417474656E742000F4
:1043B0004D4B204C6F42617420616C61726D202006
:1043C00020004D4B206D4168202020205761726EE7
:1043D000756E67004D4B206D4168207761726E6984
:1043E0006E67202020004D4B206D41682041747481
:1043F000656E7420202020004D4B206D41682061A7
:104400006C61726D2020202020004D4B20566F6C77
:10441000742020202042616C6B656E004D4B20762D
:104420006F6C7420626172677261706820004D4B1E
:1044300020766F6C74206261726772617068200010
:104440004D4B20766F6C7420626172677261706888
:104450002000466F6C6C6F774D6520526566726503
:1044600073680000466F6C6C6F774D65205265660F
:10447000726573680000466F6C6C6F774D652052F3
:104480006566726573680000466F6C6C6F774D658A
:1044900020526566726573680000466F6C6C6F77BA
:1044A0004D6520537065656420200000466F6C6C7C
:1044B0006F774D6520537065656420200000466F5E
:1044C0006C6C6F774D65205370656564202000002B
:1044D000466F6C6C6F774D65205370656564202066
:1044E0000000546F6C6572616E7A20526164697568
:1044F00073200000546F6C6572616E6365205261B9
:10450000646975730000546F6C6572616E63652039
:104510005261646975730000546F6C6572616E63FB
:10452000652052616469757300000000000000009E
:10453000000000000000000000000000000000007B
:10454000000000000000000000000000000000006B
:10455000000000000000000000000000000000005B
:10456000000000000000000000000000000000004B
:10457000000000000000000000000000000000003B
:10458000000000000000000000000000000000002B
:10459000000000000000000000000000000000001B
:1045A000000000000000000000000000000000000B
:1045B00000000000000000000000000000000000FB
:1045C00000000000000000000000000000000000EB
:1045D00000000000000000000000000000000000DB
:1045E00000000000000000000000000000000000CB
:1045F00000000000000000000000000000000000BB
:10460000000077E4686C6520475053204D61757356
:104610002020200073656C65637420475053206D23
:104620006F757365200073656C6563742047505324
:10463000206D6F757365200073656C65637420472A
:104640005053206D6F757365200053756368652046
:10465000475053204D6175732020200073656172AF
:10466000636820475053206D6F7573652000736534
:104670006172636820475053206D6F757365200029
:1046800073656172636820475053206D6F75736561
:104690002000475053204D617573205479702020BD
:1046A00020202000475053206D6F7573652074796A
:1046B000702020202000475053206D6F75736520B7
:1046C0007479702020202000475053206D6F75733F
:1046D00065207479702020202000475053204D61C0
:1046E000757320616B7469763F202000475053201A
:1046F0006D6F7573652061637469763F2000475064
:1047000053206D6F7573652061637469763F200077
:10471000475053206D6F7573652061637469763FF0
:1047200020005A65696765204750532044657669C3
:104730006365200073686F77204750532064657667
:1047400069636520200073686F77204750532064A9
:10475000657669636520200073686F772047505342
:1047600020646576696365202000475053204461CA
:1047700074656E20202020202020200047505320E8
:1047800064617461202020202020202020004750D8
:1047900053206461746120202020202020202000EC
:1047A0004750532064617461202020202020202065
:1047B0002000504B542D416B6B7574797020202074
:1047C00020202000504B542D416363757479702074
:1047D000202020202000504B542D547970652064F7
:1047E0006520626174742E00504B542D62617474A4
:1047F0006572696A207479706500504B5420416B72
:104800006B75204D657373756E672000504B542097
:10481000416363754D656173757265202000626147
:1048200074742E206465206D657375726520200098
:10483000504B5420626174742E206D6574696E67EC
:1048400020004D6F64756C2065696E6765626175E7
:10485000743F20006D6F64756C65206275696C74BF
:1048600020696E3F20004D6F64756C6520696E7322
:1048700074616C6C652020006D6F64756C652067D9
:1048800065696E7374616C6C3F004E616D652020CC
:104890002020202020202020202020006E616D6517
:1048A00020202020202020202020202020004E6FAB
:1048B0006D202020202020202020202020202000CB
:1048C0004E61616D202020202020202020202020EB
:1048D000200050696E202020202020202020202031
:1048E0002020200070696E20202020202020202001
:1048F00020202020200050696E2020202020202011
:10490000202020202020200050696E202020202000
:1049100020202020202020202000496E6974696119
:104920006C6973696572656E20202000696E697418
:1049300069616C697A652020202020202000696E42
:10494000697469616C6973657220202020202000E1
:10495000496E697469616C697A6520202020202085
:1049600020004B6F6E6669672E206D69742050437E
:1049700020202000636F6E6669672E207769746857
:10498000202050432000436F6E6669672E206176B9
:104990006563205043202000436F6E6669672E20B8
:1049A0006D6574205043202020004D6F64756C208D
:1049B00065696E6765626175743F20006D6F64752F
:1049C0006C65206275696C7420696E3F20004D6FC4
:1049D00064756C6520696E7374616C6C6520200071
:1049E0004D6F64756C65206765696E7374616C2EBC
:1049F0003F0054582F5258204B616E616C2020208C
:104A00002020200054582F5258204368616E6E6554
:104A10006C202020200054582F5258204368616E8B
:104A20006E656C202020200054582F525820436877
:104A3000616E6E656C20202020004E6574572E201C
:104A40004772757070652020202020004E657457D5
:104A50002E2047726F7570202020202020004E6588
:104A600074572E2047726F75702020202020200060
:104A70004E6574572E2047726F75702020202020BD
:104A800020004E6574572E204D6F64652020202035
:104A9000202020004E6574572E204D6F6465202025
:104AA0002020202020004E6574572E204D6F646515
:104AB00020202020202020004E6574572E204D6F8E
:104AC0006465202020202020200054582054696D47
:104AD000656F757420202020202020005458205419
:104AE000696D656F757420202020202020005458A7
:104AF0002054696D656F75742020202020202000CF
:104B000054582054696D656F757420202020202032
:104B100020005458204D54552020202020202020B3
:104B2000202020005458204D5455202020202020A3
:104B30002020202020005458204D54552020202093
:104B400020202020202020005458204D5455202083
:104B500020202020202020202000426175647261E6
:104B600074652057693233322F42540042617564B4
:104B7000726174652057693233322F4254004261AA
:104B80007564726174652057693233322F42540064
:104B900042617564726174652057693233322F4205
:104BA0005400496E697469616C6973696572656EF8
:104BB00020202000696E697469616C697A65202023
:104BC000202020202000696E697469616C6973651A
:104BD0007220202020202000496E697469616C6970
:104BE0007A6520202020202020004B6F6E666967A8
:104BF0002E206D697420504320202000636F6E6664
:104C000069672E2077697468202050432000436F25
:104C10006E6669672E206176656320504320200010
:104C2000436F6E6669672E206D65742050432020A7
:104C30002000496E666F73206265696D2053746150
:104C400072742000696E666F2061742073746172E3
:104C5000747570202000496E666F722E2073757215
:104C6000206C616E63657200696E666F2062696AAE
:104C7000206F70737461727420004F534420456D2F
:104C80007066616E6773617573662E004F534420C2
:104C900072656365697665204572726F72004F5365
:104CA000442072656365697665204572726F720093
:104CB0004F53442072656365697665204572726F53
:104CC00072005370726163686520202020202020CC
:104CD000202020006C616E677561676520202020B0
:104CE0002020202020004C616E6775652020202048
:104CF00020202020202020007461616C20202020B2
:104D0000202020202020202020004C69636874206F
:104D1000617573206E6163682E2E2E006C69676862
:104D200074206F66662061667465722020004C7581
:104D30006D6965726520617520626F757420200051
:104D40006C6963687420756974206E61202020206E
:104D5000200048656C6C69676B65697420202020B1
:104D6000202020006272696768746E65737320206A
:104D70002020202020006C756D696E6F736974654A
:104D8000202020202020200068656C646572686502
:104D9000696420202020202020004B6F6E747261F7
:104DA000737420202020202020202000636F6E7448
:104DB0007261737420202020202020202000636F47
:104DC0006E747261737465202020202020202000E2
:104DD000636F6E7472617374202020202020202065
:104DE00020004E6F726D616C2F496E766572732074
:104DF000202020006E6F726D616C2F696E76657277
:104E00007465642020004E6F726D616C202F2069E4
:104E10006E766572736520004E6F726D616C2F69DE
:104E20006E7665727465642020004F7269656E74D9
:104E3000696572756E672020202020006F72696599
:104E40006E746174696F6E202020202020006F72C4
:104E500069656E746174696F6E20202020202000C7
:104E60006F7269656E74617469652020202020204E
:104E7000200056657262696E64756E67207A756D82
:104E8000204D4B00636F6E6E656374696F6E2074A6
:104E90006F204D4B200020636F6E6E6578696F6EDA
:104EA0002061204D4B20000041616E736C75697468
:104EB000696E67206F70204D4B00416E7A6569679F
:104EC000652020202020202020201D0044697370B0
:104ED0006C61792020202020202020201D006427C4
:104EE00061666669636861676520202020201D0077
:104EF000446973706C6179202020202020202020BC
:104F00001D0057692E3233322020202020202020FF
:104F100020201D0057692E323332202020202020EF
:104F2000202020201D0057692E32333220202020DF
:104F30002020202020201D0057692E3233322020CF
:104F400020202020202020201D0042544D2D3232D0
:104F5000322020202020202020201D0042544D2DD2
:104F60003232322020202020202020201D004254D8
:104F70004D2D3232322020202020202020201D00E4
:104F800042544D2D3232322020202020202020205B
:104F90001D00416E74656E6E656E20547261636BA8
:104FA0002E201D00616E74656E6E612074726163E7
:104FB0006B696E671D00616E74656E6E6120747240
:104FC00061636B696E671D00616E74656E6E612052
:104FD000747261636B696E671D004F534420416EAC
:104FE0007A6569676520202020201D004F534420EA
:104FF00073637265656E2020202020201D004F53B2
:10500000442073637265656E2020202020201D00DF
:105010004F53442073637265656E2020202020204A
:105020001D00475053202020202020202020202019
:1050300020201D0047505320202020202020202009
:10504000202020201D0047505320202020202020F9
:105050002020202020201D004750532020202020E9
:1050600020202020202020201D00466F6C6C6F77B0
:10507000204D65202020202020201D00466F6C6CD4
:105080006F77204D65202020202020201D00466FB6
:105090006C6C6F77204D65202020202020201D0083
:1050A000466F6C6C6F77204D6520202020202020DB
:1050B0001D00504B542D416B6B752020202020206B
:1050C00020201D00504B542D41636375202020206B
:1050D000202020201D00504B542D4163637520205B
:1050E0002020202020201D00504B542D416363754B
:1050F00020202020202020201D00504B54205570BF
:10510000646174652020202020202000504B542012
:105110005570646174652020202020202000504BB1
:1051200054204D6973652061206A6F7572202000DC
:10513000504B54205570646174652020202020203D
:105140002000446562756720504B542020202020A9
:1051500020202000446562756720504B5420202099
:10516000202020202000446562756720504B542089
:105170002020202020202000446562756720504BAD
:1051800054202020202020202000454550726F6DA3
:105190002052657365742020202020004545507200
:1051A0006F6D2052657365742020202020004545D6
:1051B00050726F6D205265696E697469616C690027
:1051C000454550726F6D2052657365742020202014
:1051D000200020204D6974204861726477617265F7
:1051E00020312E78202020002020206E69636874F2
:1051F000206DF6676C6963682020202000576932B3
:1052000033320057693233320032343030202000DC
:1052100039363030202000313932303020003338F8
:1052200034303020200035373630302000313135F1
:1052300032303000323430302020003936303020E7
:1052400020003139323030200033383430302020E3
:1052500000353736303020003131353230300032D1
:1052600034303020200039363030202000313932BF
:10527000303020003338343030202000353736309D
:10528000302000313135323030002500120013005B
:10529000120013002057692E323332205365747583
:1052A0007020202020202020200012001300200049
:1052B00020202020202020202020202020430020EB
:1052C00017202020202016202020202019202020F8
:1052D000204F4B002042542073656C65637420445A
:1052E00065766963652020202000120013001200FB
:1052F000130020426C7565746F6F7468204E616D89
:10530000652020202020200020426C7565746F6F7E
:1053100074682050696E20202020202020004254F4
:1053200020496E6974206F6B00425420496E697485
:10533000204572726F72001200130077E4686C658A
:10534000204254204465766963650073756368651F
:10535000204254204465766963650044657669633C
:10536000653A004D41433A00636F6E6E6563746544
:105370006400204C6174697475646520204C6F6E04
:10538000676974756465002E002E004750532054E1
:10539000696D653A200020536174656C6C697465B1
:1053A0003A2000475053207472656E6E656E00455A
:1053B00072726F7220617420636F6E6E65637469C0
:1053C0006E67004665686C6572206265696D205481
:1053D00072656E6E656E004C69496F004C69506F66
:1053E000004C69506F004C69496F00566F6C740037
:1053F000120013001200130020504B542D536574FB
:105400007570202020202020202020202000120045
:105410001300466C7974696D653A00537065656474
:105420003A00446973743A004D4B3A002E002E0046
:105430002121216E6F7420696D706C656D656E74CD
:10544000656421212100010000000A0000006400C1
:105450000000E803000010270000A0860100404281
:105460000F008096980000E1F50500CA9A3B000005
:105470000000000000007E8195B1B195817E7EFF25
:10548000EBCFCFEBFF7E0E1F3F7E3F1F0E00081CB1
:105490003E7F3E1C0800383A9FFF9F3A3800103884
:1054A000BCFFBC381000000000000000000000003D
:1054B00000000000000000000000000000000000EC
:1054C00000000000000070F88888FD7F070F004E84
:1054D0005FF1F15F4E000000000000000000C0FF1F
:1054E0007F0505657F3F995A3CE7E73C5A997F3E27
:1054F0003E1C1C08080008081C1C3E3E7F000024BF
:1055000066FFFF662400005F5F00005F5F00060F1C
:10551000097F7F017F7FDABFA5A5FD5903020070D7
:105520007070707070008094B6FFFFB694800004B5
:10553000067F7F0604000010307F7F3010000808CF
:10554000082A3E1C0800081C3E2A080808003C3CAB
:10555000202020202000081C3E08083E1C0830386F
:105560003C3E3E3C3830060E1E3E3E1E0E060000FF
:1055700000000000000000065F5F0600000000075A
:10558000070007070000147F7F147F7F1400242E7C
:105590006B6B3A120000466630180C666200307A77
:1055A0004F5D377A48000407030000000000001C2C
:1055B0003E63410000000041633E1C000000082AD9
:1055C0003E1C1C3E2A0808083E3E0808000000A0B9
:1055D000E06000000000080808080808000000005B
:1055E0006060000000006030180C060301003E7F80
:1055F000594D7F3E000042427F7F40400000627371
:1056000059496F660000226349497F360000181C23
:1056100016137F7F1000276745457D3900003C7ECB
:105620004B4979300000036371190F070000367F82
:1056300049497F360000064F49693F1E00000000BF
:105640006C6C0000000000A0EC6C00000000081C66
:1056500036634100000014141414141400000041B7
:1056600063361C080000020351590F0600003E7FFC
:10567000415D5D1F1E007C7E13137E7C0000417F18
:105680007F49497F36001C3E634141632200417FD0
:105690007F41637F1C00417F7F495D416300417F03
:1056A0007F491D0103001C3E6341517372007F7FDF
:1056B00008087F7F000000417F7F410000003070BC
:1056C00040417F3F0100417F7F081C776300417F9D
:1056D0007F41406070007F7F060C067F7F007F7FE8
:1056E000060C187F7F001C3E6341633E1C00417F17
:1056F0007F49090F06001E3F21717F5E0000417F38
:105700007F19396F460026674D597B3200000341EF
:105710007F7F410300007F7F40407F7F00001F3F6D
:1057200060603F1F00007F7F3018307F7F0063770D
:105730001C081C776300074F78784F0700006773D9
:10574000594D47637100007F7F4141000000010314
:10575000060C183060000041417F7F000000080CFB
:105760000603060C08008080808080808080000016
:10577000030704000000207454543C784000413F6B
:105780007F44447C3800387C44446C2800003078E6
:1057900048493F7F4000387C54545C180000487EE4
:1057A0007F490302000098BCA4A4F87C0400417F58
:1057B0007F08047C780000447D7D4000000040C4E8
:1057C00084FD7D000000417F7F10386C4400004163
:1057D0007F7F400000007C7C0C180C7C78007C7C77
:1057E00004047C780000387C44447C38000084FC4D
:1057F000F8A4243C1800183C24A4F8FC8400447C41
:1058000078441C180000485C5454742400000004C0
:105810003E7F442400003C7C40403C7C40001C3CDB
:1058200060603C1C00003C7C6030607C3C00446C50
:105830003810386C44009CBCA0A0FC7C00004C6478
:10584000745C4C64000008083E7741410000000091
:105850000077770000004141773E0808000002030E
:10586000010302030100787C4643467C78001EBF9A
:10587000E161331200003A7A40407A7A4000387C85
:1058800056575D18000002237555557D7B422175E2
:1058900054547D794000207557567C784000002292
:1058A0007755557F7A401CBEE26236140000023BF9
:1058B0007D55555D1B02397D54545D190000387DBE
:1058C00057565C18000001457C7C41010000020332
:1058D000457D7D43020000457F7E40000000797DCC
:1058E00026267D790000707A2D2D7A700000447C88
:1058F0007E5755440000207454547C7C54547C7E64
:105900000B097F7F4900327B49497B320000327AA4
:1059100048487A32000030794B4A783000003A7BB0
:1059200041417B7A40003879434278784000BABAE6
:10593000A0A0FA7A0000397D4444447D39003D7DC1
:1059400040407D3D0000387C64544C7C3800687ECB
:105950007F49436620005C3E7349673E1D00446CEE
:1059600038386C44000040C888FE7F090B02207460
:1059700056577D78400000447E7F4100000030781B
:10598000484A7B310000387840427B7940007A7B7E
:10599000090B7A7301007A7B19337A7B01000026A8
:1059A0002F292F2F280000262F29292F2600307875
:1059B0004D45602000001C227D4B5B65221C0808C1
:1059C000080838380000613F1FCCEEABB990613F4A
:1059D0001F4C6673D9F8000060FAFA600000081CDA
:1059E0003622081C362222361C0822361C08AA0041
:1059F0005500AA005500AA55AA55AA55AA5555FF03
:105A0000AAFF55FFAAFF000000FFFF0000001010D2
:105A100010FFFF00000070782C2E7B71000072795F
:105A20002D2D79720000717B2E2C787000001C22C5
:105A30005D555541221C1414F7F700FFFF000000CC
:105A4000FFFF00FFFF001414F4F404FCFC00141426
:105A50001717101F1F00183C24E7E72424002B2FE2
:105A6000FCFC2F2B0000101010F0F00000000000D4
:105A7000001F1F1010101010101F1F1010101010FA
:105A800010F0F0101010000000FFFF1010101010A8
:105A9000101010101010101010FFFF1010102277AF
:105AA00055577E7B4100727B2D2F7A7301000000D9
:105AB0001F1F101717140000FCFC04F4F414141436
:105AC0001717101717141414F4F404F4F414000046
:105AD000FFFF00F7F71414141414141414141414FE
:105AE000F7F700F7F714663C3C243C3C66000527BA
:105AF00072577D380000497F7F49637F1C00467DD7
:105B00007D5555460000457D7C5455450000447D3B
:105B10007F56544400000A0E0800000000000044B4
:105B20007E7F4500000002457D7D45020000014565
:105B30007C7C450100001010101F1F0000000000B9
:105B400000F0F0101010FFFFFFFFFFFFFFFFF0F06D
:105B5000F0F0F0F0F0F00000007777000000004572
:105B60007F7E440000000F0F0F0F0F0F0F0F387CC8
:105B70004647457C3800FCFE2A2A3E1400003A7D48
:105B80004545457D3A00387C4547467C3800327BA8
:105B9000494B7A3301003A7F4547467F390080FE02
:105BA0007E20203E1E00427E7E541C080000417F65
:105BB0007F55141C08003C7C42437D3C00003A7930
:105BC0004141793A00003C7D43427C3C0000B8B83A
:105BD000A2A3F97800000C5C72735D0C0000020255
:105BE0000202020200000000020301000000101087
:105BF00010101010000044445F5F44440000282847
:105C000028282828000071351F4C6673D9F8060F24
:105C1000097F7F017F7FDABFA5A5FD590302080830
:105C20006B6B080800000080C04000000000000608
:105C30000F090F060000020200000202000000002F
:105C40000010100000000012131F1F1010000011A0
:105C500015151F1F0A0000191D151712000000005E
:105C60003C3C3C3C000000000000000000002073B1
:105C7000657269656C6C6520506F74697320312D95
:105C8000352000194F18000014BE88E10FB6F894B3
:105C900080936000109260000FBE11241FBECFEFF2
:105CA000D0E4DEBFCDBF1AE2A0E0B1E0EAEEFEE84C
:105CB00001E00BBF02C007900D92AE39B107D9F7D2
:105CC0001EE3AEE9BAE201C01D92A935B107E1F7C2
:105CD0000E946E2E0C9474C70C940000CFEFD0E499
:105CE000DEBFCDBFC0E00E94C048C0939F2AC093D2
:105CF0009E2A00918137013009F03DC00E94AA6BB5
:105D00008BE090E00E9438BC2C2FAC016C2F8C2FC4
:105D10000E942F718CE090E00E9438BC2C2FAC01C7
:105D2000602F8C2F0E942F718DE090E00E9438BC74
:105D30002C2FAC0163E08C2F0E942F7185E190E045
:105D40000E9438BC2C2FAC0164E08C2F0E942F7174
:105D500080E190E00E9438BC2C2FAC0165E08C2FD4
:105D60000E942F7128E93AE384EF91E00197F1F75F
:105D700021503040C9F70E94975F80916937909118
:105D80006A37A0916B37B0916C370097A105B105C8
:105D900009F453C18091CD379091CE37A091CF3780
:105DA000B091D0370097A105B10509F446C10E9412
:105DB000AA6B86E190E00E9438BC22E0AC0160E072
:105DC000862F0E942F7189E190E00E9438BC22E06A
:105DD000AC0161E080E00E942F7187E190E00E94B9
:105DE00038BC22E0AC01622F80E00E942F7188E174
:105DF00090E00E9438BC20E0AC0167E0822F0E9456
:105E00002F718091CD379091CE37A091CF37B0913F
:105E1000D037BC01CD0120E836E948E950E00E94C6
:105E2000F5C6DA01C901EE240E2D22E030E0AC0106
:105E300064E081E00E9434772E2D4CE051E064E074
:105E400083E00E94EE708091CD379091CE37A09183
:105E5000CF37B091D037BC01CD0128EE33E040E020
:105E600050E00E94F5C6CA01B90120E137E240E0E6
:105E700050E00E94F5C6DC01CB0101E024E030E0F7
:105E8000AC0164E0862F0E9434778091CD379091E9
:105E9000CE37A091CF37B091D037BC01CD012AE0E9
:105EA00030E040E050E00E94F5C6CA01B90124E6A6
:105EB00030E040E050E00E94F5C6DC01CB0122E07A
:105EC00030E0AC0164E088E00E943477809169376B
:105ED00090916A37A0916B37B0916C37BC01CD01BE
:105EE00020E836E948E950E00E94F5C6DA01C90128
:105EF0000E2D22E030E0AC0164E08CE00E943477AB
:105F00002E2D4EE051E064E08EE00E94EE70809114
:105F1000693790916A37A0916B37B0916C37BC01AB
:105F2000CD0128EE33E040E050E00E94F5C6CA0102
:105F3000B90120E137E240E050E00E94F5C6DC0103
:105F4000CB0101E024E030E0AC0164E08FE00E948E
:105F500034778091693790916A37A0916B37B0910F
:105F60006C37BC01CD012AE030E040E050E00E94F7
:105F7000F5C6CA01B90124E630E040E050E00E94D5
:105F8000F5C6DC01CB0122E030E0AC0164E083E146
:105F90000E94347780E80E944238082F882399F1C4
:105FA00020E030E040E050E0CA01B9010E94B85F53
:105FB00000E028E040E860E2802F0E945F6E28E069
:105FC00040E868E2802F0E945F6E8AE190E00E94C4
:105FD00038BC202FAC0165E0802F0E942F7145E175
:105FE00066E0802F0E944C7145E167E0802F0E949F
:105FF0004C7120E137E284EF91E00197F1F72150F5
:106000003040C9F71AC080E10E944238882309F461
:10601000C1CF45E164E0802F0E944C7145E165E00D
:10602000802F0E944C7145E166E0802F0E944C71E8
:1060300045E167E0802F0E944C718BE10E94164180
:106040008BE10E94164185E50E9416418AEA0E9472
:10605000164180E00E94164186E58093A02A02E363
:106060000E94AA6B8BE190E00E9438BC20E0AC015A
:1060700064E0822F0E942F718CE190E00E9438BC76
:1060800020E0AC0167E08CE00E942F7180919F2B93
:10609000882309F058C01F921F9286E78F930E94B1
:1060A000404184E190E09093512E8093502E0F90C8
:1060B0000F900F908091502E9091512E892BD1F7F7
:1060C0000150C53148F420E040E151E066E08C2FFA
:1060D0000E94EE70CF5F06C045E166E080E00E945E
:1060E0004C71C0E080E20E944238882351F080EF7A
:1060F0000E9442381092D33710929F2A0E94D832C1
:10610000F9CF80919F2B882311F4002321F60023DF
:10611000B9F480E290E00E9438BC202FAC0165E029
:10612000802F0E942F718AE590E09093512E8093EA
:10613000502E8091502E9091512E892BD1F78FCFD8
:10614000002309F48CCF0E94924280919C2B909165
:106150009D2B90933B2E80933A2E009181370130F6
:10616000B1F40E94AA6B81E290E00E9438BC20E06A
:10617000AC01622F822F0E942F7182E290E00E9478
:1061800038BC20E0AC01602F822F0E942F718091DB
:10619000C22E823681F480918137813051F483E2BE
:1061A00090E00E9438BC20E0AC0162E0822F0E94A7
:1061B0002F7182E013C08091C22E833699F48091B2
:1061C0008137813051F484E290E00E9438BC20E0B5
:1061D000AC0162E0822F0E942F7181E080939F2AA0
:1061E00080939E2A809181378130B9F585E290E0D5
:1061F0000E9438BC20E0AC0163E0822F0E942F7126
:10620000E0913A2EF0913B2E408163E089E00E94BC
:106210002C7720E042E151E063E08AE00E94EE70DA
:10622000E0913A2EF0913B2E418163E08BE00E9499
:106230002C77E0913A2EF0913B2E84818F59482F94
:1062400063E08EE00E942C7728EA31E684EF91E04B
:106250000197F1F721503040C9F70E942A438FEF90
:106260000E94AE99E0913C2EF0913D2E80818B35BD
:1062700009F465C00E94AA6B20E044E151E0622F5E
:10628000822F0E94EE708BE50E94FC7686E290E001
:106290000E9438BC20E0AC01622F8DE00E942F717B
:1062A00020E04FE151E062E0822F0E94EE70E09129
:1062B0003C2EF0913D2E80810E94FC7687E290E09A
:1062C0000E9438BC20E0AC0162E08DE00E942F719A
:1062D00088E290E00E9438BC20E0AC0164E0822FAC
:1062E0000E942F7189E290E00E9438BC20E0AC014E
:1062F00065E0822F0E942F7120E04AE251E065E0C4
:106300008CE00E94EE708AE290E00E9438BC20E0AF
:10631000AC0166E0822F0E942F7110929F2A40E00C
:1063200060E470E08CED95E00E942A3620E43CE9C0
:1063300084EF91E00197F1F721503040C9F71092B6
:10634000A02A10929F2B82E390E09093512E80938D
:10635000502E8091502E9091512E892BD1F70E9472
:10636000D832FDCF0F931F93062F142F20E046E75E
:1063700056E0682F812F0E94EE7020E048E756E03B
:10638000602F812F0E94EE701F910F910895DF9270
:10639000EF92FF920F931F93CF93D82EE62EF42EF9
:1063A000C22F022F622F822F0E94B23180E40E94FE
:1063B0004238182F61E080E40E948638182B29F0BB
:1063C000CE1510F4CF5F01C0CE2D80E80E94423878
:1063D000182F61E080E80E948638182B29F0DC161F
:1063E00010F4C15001C0CD2DC01731F04F2D6C2FCE
:1063F000802F0E94B2310C2F80E30E944238882304
:10640000A9F285FDCFEF8C2F9927CF911F910F9186
:10641000FF90EF90DF900895CF92DF92EF92FF927E
:106420000F931F93CF93E82EF62E842FC22ED02EDB
:10643000C42F042F41E0682F0E94B23180E40E94F3
:106440004238182F61E080E40E948638182B59F0FA
:10645000CF1510F4CF5F07C081E0D81619F48EEF86
:1064600090E027C0CF2D80E80E944238182F61E0CD
:1064700080E80E948638182B59F0EC1610F4C150B1
:1064800007C081E0C81619F48DEF90E012C0CE2D40
:10649000C01731F041E06C2F802F0E94B2310C2FD9
:1064A00080E30E944238882349F285FDCFEF8C2F8C
:1064B0009927CF911F910F91FF90EF90DF90CF9090
:1064C0000895CF92DF92EF92FF920F931F93CF9395
:1064D000E82EF62E842FC22ED02EC42F042F41E09A
:1064E000682F0E94B23180E40E944238182F61E088
:1064F00080E40E948638182B59F0CF1510F4CF5F36
:1065000007C081E0D81619F48EEF90E049C0CF2D76
:1065100080E80E944238182F61E080E80E948638A7
:10652000182B59F0EC1610F4C15007C081E0C816C2
:1065300019F48DEF90E034C0CE2D80E20E946538D2
:10654000882331F080EF0E9442388AEF90E028C023
:1065500080E10E946538882331F080EF0E94423844
:106560008BEF90E01DC080E20E944D38882331F00F
:1065700080EF0E9442388CEF90E012C0C01731F0DB
:1065800041E06C2F802F0E94B2310C2F0E94A97B1A
:1065900080E10E944D38882309F4A5CF8C2F9927DC
:1065A000CF911F910F91FF90EF90DF90CF900895C2
:1065B0006F927F928F929F92AF92BF92CF92DF9213
:1065C000EF92FF920F931F93CF93DF93DD247D2CE7
:1065D0008D2C71E0972EBD2C60909F2A0E949C7B91
:1065E00080EF0E9442388091D337813011F480933C
:1065F0009F2A8091D337882311F460929F2A80913B
:106600009F2A882319F462E0762E09C0813019F49C
:1066100059E0752E04C0823011F445E0742E0E94BA
:10662000AA6B22E04AE756E060E0862F0E94EE70F7
:1066300022E047E856E060E08CE00E94EE7081E0E6
:1066400090E00E9438BC20E0AC0167E0822F0E94FD
:106650002F718CE290E00E9438BC20E0AC0167E032
:106660008CE00E942F71AA24DD2039F02A2D4DE8FC
:1066700056E061E0862F0E94EE7031E0C32EEE24DA
:10668000FF240D2D1127A701400F511FC72DDD2716
:106690004C175D070CF049C080919F2A8130A9F406
:1066A00088E490E0489F9001499F300D589F300D3D
:1066B0001124A9019091CA3782E1989FC001112449
:1066C000480F591F42515C4F2BC08230A9F488E417
:1066D00090E0489F9001499F300D589F300D112444
:1066E000A9019091CA3782E1989FC0011124480FF7
:1066F000591F4A575D4F14C088E490E0489F9001AD
:10670000499F300D589F300D1124A9019091CA372F
:1067100082E1989FC0011124480F591F4A505E4FD3
:1067200020E06C2D83E00E94EE7035E0A31669F442
:106730000B5F1F4F21970C171D073CF420E04FE81B
:1067400056E066E081E00E94EE700E94A97BA3946F
:106750000894E11CF11CC39485E08A1508F091CFE0
:106760008820A1F4DD2079F496E0971530F401E05B
:106770002D2D492D682F802F1EC00D2D2D2D492D1B
:10678000672D81E018C001E0202F12C021E08216A1
:10679000A9F48D2D99270796272D33272817390718
:1067A0002CF400E0282D492D66E004C0082D282D8A
:1067B000492D65E082E00E946132B82E3EEFB316AB
:1067C00031F4D39421E0822E95E0992E4CCF8DEFB9
:1067D000B81629F4DA94882482E0982E44CF9CEFEE
:1067E000B91681F50E94AA6B8EE290E00E9438BC37
:1067F00020E0AC0162E0822F0E942F718FE290E0D6
:106800000E9438BC20E0AC0167E08CE00E942F7150
:1068100080E10E9442388111299880E20E944D381F
:106820008823B1F380EF0E9442380E94AA6B22E0D5
:1068300041E956E060E0862F0E94EE7022E04EE9CA
:1068400056E0F9CE2BEFB21619F40E94783972C0D7
:106850003AEFB31619F40E944ABC6CC09B2C1091FD
:106860009F2A113091F58B2D8D0D912D911DEC01ED
:10687000019711F40E9433BEC230D10519F4812F63
:106880000E94F489C330D10519F483E00E94F48991
:10689000C430D10511F40E94B56AC530D10511F498
:1068A0000E94D3B7C630D10511F40E94FC5DC730F9
:1068B000D10511F40E94539BC830D10511F40E94F8
:1068C0003C5B299711F40E94953880919F2A823071
:1068D000E9F42B2D2D0D312D311DE901213031052C
:1068E00011F40E9433BEC230D10511F40E94FC5D48
:1068F000C330D10511F40E94539BC430D10511F46B
:106900000E943C5B259711F40E94953880919F2A44
:10691000882309F068CE8B2D8D0D912D911DEC01F2
:10692000019711F40E9433BE229709F05CCE0E94B9
:10693000953859CEDF91CF911F910F91FF90EF9035
:10694000DF90CF90BF90AF909F908F907F906F908F
:1069500008950E94AA6B22E044EA56E060E0862F88
:106960000E94EE7080E390E00E9438BC20E0AC0111
:1069700061E0822F0E942F7181E390E00E9438BC79
:1069800020E0AC0162E0822F0E942F7120E04AEBF0
:1069900056E063E0822F0E94EE7020E040ED56E06A
:1069A00064E0822F0E94EE7020E046EE56E065E043
:1069B000822F0E94EE7020E04CEF56E066E0822FBE
:1069C0000E94EE7082E390E00E9438BC20E0AC01AF
:1069D00067E0822F0E942F7180E20E944238882354
:1069E00021F080EF0E944238089580E10E944238F1
:1069F000882391F388E190E02CE00FB6F894A895F5
:106A0000809360000FBE20936000FFCF0E94AA6BAE
:106A100020E042E157E062E0822F0E94EE7020E029
:106A200047E257E063E0822F0E94EE7020E047E3E8
:106A300057E067E08CE00E94EE7080E20E944238EE
:106A40008823D9F380EF0E9442380895EF92FF9295
:106A50000F931F93CF93DF9310E00E94AA6B22E065
:106A60004CE357E0612F812F0E94EE7022E042E557
:106A700057E0612F8DE00E94EE7022E049E557E07B
:106A800061E0812F0E94EE708CE090E00E9438BCA3
:106A900022E0AC0161E0812F0E942F7181E090E043
:106AA0000E9438BC212FAC0167E0812F0E942F711A
:106AB00000E0C0E0D0E0E12EFF249E012E0D3F1D3E
:106AC00029303105A4F486E190E0289FA001299F98
:106AD000500D389F500D1124CA01805D9E4F302FFC
:106AE0003D5F20E0AC01632F822F0E94EE700F5FAC
:106AF0002196033000F3112369F4212F4FE657E06C
:106B000062E0812F0E94EE70212F41E757E066E09E
:106B1000812F10C056E0E516F10474F420E043E73D
:106B200057E062E0822F0E94EE7020E045E757E0D8
:106B300066E0822F0E94EE70C12FDD27C630D1059E
:106B400074F020E047E757E062E0822F0E94EE7089
:106B500020E049E757E066E0822F0E94EE7080E473
:106B60000E944238882319F026970CF41F5F80E8B2
:106B70000E944238882311F01111115080E20E94C6
:106B80004238882331F480E10E944238882309F496
:106B90008FCF80EF0E944238DF91CF911F910F91EC
:106BA000FF90EF9008951092800010928100109253
:106BB0006F008091800082688093800080918100C6
:106BC0008B61809381008AE698E19093870080939F
:106BD000860086ED91E09093890080938800089567
:106BE000579A8091B00083688093B0008091B10083
:106BF00081608093B1008091700086608093700006
:106C00008FEF8093B30008951F920F920FB60F92EB
:106C100011245F9A0F900FBE0F901F9018951F922E
:106C20000F920FB60F9211245F980F900FBE0F9026
:106C30001F9018951092512E1092502E82E084BD14
:106C400085E085BD83EC87BD80916E008260809376
:106C50006E0008959C01442339F48091A32A9091F9
:106C6000A42A892B31F50EC04130A9F48091A32AC2
:106C70009091A42A892BE9F481E090E09093A42AD2
:106C80008093A32A3093A62A2093A52A709301010A
:106C9000609300010895423061F41092A42A10928A
:106CA000A32A1092A62A1092A52A109201011092EE
:106CB000000108958091A72A9091A82A019771F464
:106CC00040E060E270E088EE93E00E942A3622E025
:106CD0004BE757E060E0862F0E94EE7020910401A0
:106CE0003091050184E690E0289FA001299F500D76
:106CF000389F500D11248091A72A9091A82A8417BB
:106D0000950721F41092A82A1092A72A8091A72A09
:106D10009091A82A009729F001969093A82A809331
:106D2000A72A349B04C01092AA2A1092A92A349947
:106D300017C08091A92A9091AA2A01969093AA2A15
:106D40008093A92A0A9761F48091A72A9091A82A92
:106D5000892B31F481E090E09093A82A8093A72AB0
:106D6000209102013091030184E690E0289FA00168
:106D7000299F500D389F500D11248091A92A909180
:106D8000AA2A8417950709F4299808951F920F924B
:106D90000FB60F9211242F933F934F935F936F93EE
:106DA0007F938F939F93AF93BF93CF93EF93FF9373
:106DB000C0B1C0952091B52AC2279091B62A9C23D4
:106DC00090959093B62A8091B72A8C238927809337
:106DD000B72A9823C923922F9C279093B52A9C23E6
:106DE0008091B42A892B8093B42A8091C73781304F
:106DF000D9F48091AB2A9091AC2A01969093AC2A59
:106E00008093AB2A8091AB2A9091AC2A805E9E42FF
:106E100059F440E060E870E088EC90E00E942A3687
:106E20001092AC2A1092AB2A8091BC2A8150809398
:106E3000BC2A8F3F89F489E08093BC2A8091A12AE3
:106E40009091A22A01969093A22A8093A12A8091E0
:106E500006018F5F80930601CC2389F080914F2E2D
:106E6000882311F40E94E14981E080934F2E109213
:106E7000AE2A1092AD2A1092AC2A1092AB2A8091C1
:106E800009388823D9F080914F2E8130B9F4809150
:106E9000AD2A9091AE2A01969093AE2A8093AD2AA6
:106EA00064E670E00E94CEC6809109389927681781
:106EB000790721F40E94EC4910924F2E80917A00BC
:106EC000992783709070892B11F00E945A36209177
:106ED000A52A3091A62A21153105E1F02B30310584
:106EE00038F02A5030403093A62A2093A52A04C0B7
:106EF0001092A62A1092A52A8091A52A9091A62ADE
:106F0000209100013091010182239323892B61F0AC
:106F100047980BC08FEF9FEF909301018093000182
:106F20003093A42A2093A32A479A9091B52A907F60
:106F300019F486E48093B82A8091B82A815080930E
:106F4000B82A882329F48091B32A892B8093B32A05
:106F5000992319F481E08093B92A8091B92A81504C
:106F60008093B92A882341F48FE08093B92A8091D5
:106F7000B22A892B8093B22A992319F486E480934C
:106F8000BA2A8091BA2A81508093BA2A882341F480
:106F90008FE08093BA2A8091B12A892B8093B12AFD
:106FA000992319F486E48093BB2A8091BB2A8150EF
:106FB0008093BB2A8823A1F48091AF2A813011F4F9
:106FC00084E107C0823011F488E003C0833041F4CB
:106FD00081E08093BB2A8091B02A892B8093B02ACC
:106FE0008091502E9091512E892B49F08091502EF6
:106FF0009091512E01979093512E8093502E809115
:10700000522E9091532E892B49F08091522E9091BF
:10701000532E01979093532E8093522EFF91EF9110
:10702000CF91BF91AF919F918F917F916F915F9120
:107030004F913F912F910F900FBE0F901F90189579
:107040002091A12A3091A22A280F391FC901019647
:1070500008952091A12A3091A22A821B930B892F97
:1070600099278695807490700895CF93DF930E943E
:107070002038EC01CE010E9429388823D9F3DF9112
:10708000CF9108952FB7F8949091B42A8923982727
:107090009093B42A2FBF992708951F931FB7F89490
:1070A0009091B52A909589230E9442381FBF992755
:1070B0001F9108952FB7F8949091B22A89239827A9
:1070C0009093B22A2FBF992708952FB7F8949091E3
:1070D000B32A892398279093B32A2FBF0E945A3846
:1070E0000E94423899270895982F2FB7F8948091DD
:1070F000B12A982389278093B12A2FBF8091B42A7F
:10710000809589270E945A3899270895982F3FB76C
:10711000F8948091B02A982389278093B02A6093AD
:10712000AF2A3FBF892F992708959F92AF92BF92B0
:10713000CF92DF92EF92FF920F931F93CF93DF9343
:10714000CC249C2C31E0A32EBC2C0E94AA6B22E004
:1071500041E459E060E0862F0E94EE7081E090E00B
:107160000E9438BC20E0AC0167E0822F0E942F71A2
:10717000DD24CC2039F02D2D47E559E061E0862F44
:107180000E94EE70EE24FF240C2D1127E701C00FA2
:10719000D11FC630D105D4F488E490E0C89FA00187
:1071A000C99F500DD89F500D11249091CA3782E18C
:1071B000989FC0011124480F591F4F56584F8D2DCD
:1071C0008F5F20E0682F83E00E94EE7085E0D81684
:1071D00049F425973CF420E049E559E066E081E078
:1071E0000E94EE70D3940894E11CF11C85E08D158B
:1071F00058F6992059F4CC2031F40C2D2C2D4A2D21
:1072000066E081E015C001E0202F0FC081E09816F4
:1072100091F4095F1F4F073011052CF000E0292D74
:107220004A2D66E004C0092D292D4A2D65E082E033
:107230000E940C32B82E8EEFB81631F4C39421E0C0
:10724000922E95E0A92E94CF8DEFB81629F4CA940A
:10725000992482E0A82E8CCF8FEFB81609F43CC099
:10726000AB2CEB2CFF240C2D1127E701C00FD11FF5
:10727000C130D10519F482E00E940645C230D10523
:1072800011F40E94949C8091D42F882351F4C33030
:10729000D10511F40E949958249781F40E949659BF
:1072A0000DC08091D42F813049F4C330D10511F441
:1072B0000E94F457249711F40E944159E701C00F2E
:1072C000D11FC530D10511F40E948CB6269709F064
:1072D0003CCF0E94263539CFDF91CF911F910F917E
:1072E000FF90EF90DF90CF90BF90AF909F90089568
:1072F000CF93C1E00E94AA6B83E390E00E9438BC68
:1073000022E0AC0168E080E00E942F7120E04BE5B4
:1073100059E063E0862F0E94EE7020E04BE659E0D2
:1073200064E083E00E94EE7081E090E00E9438BC4F
:1073300020E0AC0167E0822F0E942F71C13069F418
:1073400020E04BE759E063E08C2F0E94EE7020E0D4
:107350004DE759E064E08C2F0CC020E04FE759E086
:1073600063E081E00E94EE7020E041E859E064E0D3
:1073700081E00E94EE7080E80E9442388111C1E0F5
:1073800080E40E9442388111C2E080E10E944D38C1
:107390008823F9F08091D42F882359F4C13019F44F
:1073A0000E949958A7CFC23009F0A4CF0E949659E5
:1073B000A1CF8091D42F813009F09CCFC13019F436
:1073C0000E94F45797CFC23009F094CF0E944159E0
:1073D00091CF80E20E944238882309F4AFCF80EF3A
:1073E0000E944238CF910895EF920F931F930E940D
:1073F000AA6B20E043E859E067E08CE00E94EE7061
:107400008091062E9091072E80509041A4F00E940A
:107410007C7A80910A2E90910B2EA0910C2EB09127
:107420000D2EBC01CD010E94A0C4DC01CB019093C4
:10743000052E8093042E0E94A97B00E020E030E01E
:107440004091042E5091052E65E0862F0E94D3783E
:10745000202F48E859E065E08AE00E94EE70E02EB7
:1074600025E030E040916F375091703766E0802F13
:107470000E94347780E40E944238182F63E080E451
:107480000E948638182B49F080916F3790917037A1
:107490000A969093703780936F3780E80E94423845
:1074A000182F63E080E80E948638182B49F08091FD
:1074B0006F37909170370A979093703780936F373A
:1074C00080E20E944238882309F49ACF80EF0E941C
:1074D00042381F910F91EF9008954AEA20E030E082
:1074E0002617370740F4FC018191480F2F5F3F4F6B
:1074F00026173707C8F3842F992708952FB7F894D4
:107500003998389A9091B9009C7F9093B9009AE28B
:107510009093B8001092CA2A1092C82A1092C72AD3
:10752000882379F0E1E6FEE28BE01082118212827C
:10753000138214821582168217828150389687FF33
:10754000F4CF78942FBF08951092CA2A84E98093CB
:10755000BC0080E88093BC001092BD001092BA007D
:107560001092BB001092B9001092B8001092C62A77
:1075700080E00E947E3A1092BB0085E88093BC00B8
:107580008091C32A82608093C32A08951F920F922C
:107590000FB60F9211242F933F938F939F93EF93E6
:1075A000FF938091CA2A282F33278F5F8093CA2A9E
:1075B0002430310509F411C1253031059CF4213006
:1075C0003105F1F12230310524F421153105D9F0CE
:1075D000A2C22230310509F476C02330310509F406
:1075E000E4C099C22630310509F4F1C126303105D5
:1075F0000CF434C12531310509F461C2263131055D
:1076000009F45FC288C281E08093C62A8091C82AAB
:107610008C3070F03093C22A2093C12A1092C82A6D
:1076200085E08093CA2A8091C72A880F8D5A04C0AA
:107630008091C82A880F8E5A8093BB0085E860C26B
:107640008091C82AE82FFF2783E0EE0FFF1F8A955D
:10765000E1F7EF59F14D81818093BB0085E880937C
:10766000BC008091C82AE82FFF27EE0FFF1FEE0F06
:10767000FF1FEE0FFF1FEF59F14D808180FF93C078
:107680008091C82AE82FFF27EE0FFF1FEE0FFF1F84
:10769000EE0FFF1FEF59F14D8281882329F0809171
:1076A0000701873008F44DC28091C12A9091C22A07
:1076B000892B09F046C28091BF2A9091C02A892B5C
:1076C00009F03FC270C08091C82A21E030E002C0BA
:1076D000220F331F8A95E2F78091BF2A9091C02A2A
:1076E00028233923232B79F08091C82AE82FFF27FC
:1076F000EE0FFF1FEE0FFF1FEE0FFF1FEF59F14DB3
:1077000080E184830DC08091C82AE82FFF27EE0F07
:10771000FF1FEE0FFF1FEE0FFF1FEF59F14D1482F9
:107720008091C82AE82FFF27EE0FFF1FEE0FFF1FE3
:10773000EE0FFF1FEF59F14D8481282F3327220FC1
:10774000331F220F331F220F331F8091C82AE82FC7
:10775000FF2793E0EE0FFF1F9A95E1F7EF59F14DE8
:1077600082818770822B8093BB0085E88093BC0068
:107770002091C82A81E090E002C0880F991F2A95C5
:10778000E2F72091C12A3091C22A82239323892BC8
:1077900051F089E59EE29093CE2A8093CD2A88E02D
:1077A0008093CF2ACEC184E087C1E091CD2AF091A9
:1077B000CE2A81918093BB0085E88093BC00F09332
:1077C000CE2AE093CD2A8091CF2A81508093CF2A70
:1077D000882309F4B6C183E06FC18091B90080337A
:1077E00051F58091CB2A882329F48091C82A8F5F94
:1077F0008093CB2A8091C82AE82FFF2783E0EE0FE1
:10780000FF1F8A95E1F7EF59F14D838199278F7713
:1078100090708F3791057CF48091C82AE82FFF275C
:10782000EE0FFF1FEE0FFF1FEE0FFF1FEF59F14D81
:1078300083818F5F83831092CA2A84E98093BC007E
:107840008AE090E090930901809308018091C82A12
:107850008F5F8093C82A1092CA2A4CC18091B900C8
:107860008034C9F18091C72AE82FFF27EE0FFF1F50
:10787000EE0FFF1FEE0FFF1FEF59F14D83818F7742
:1078800083838091C72A8F5F8093C72A8091C72AFC
:107890008C30A0F01092C72A1092C02A1092BF2AF2
:1078A0008091CC2A8F5F8093CC2A8C3038F0109254
:1078B000CC2A8091C32A8D7F8093C32A8091C32ACA
:1078C00081608093C32A1092CA2A84E98093BC0005
:1078D0001092C62A75C08091C72AE82FFF27EE0FA5
:1078E000FF1FEE0FFF1FEE0FFF1FEF59F14D8381BA
:1078F000806883838091C72AE82FFF27EE0FFF1F40
:10790000EE0FFF1FEE0FFF1FEF59F14D808180FF3B
:1079100031C08091C72AE82FFF27EE0FFF1FEE0F1F
:10792000FF1FEE0FFF1FEF59F14D8481992700973C
:1079300051F04097E1F589E59EE29093CE2A80933D
:10794000CD2A88E032C08091C72A9927880F991FD5
:10795000880F991F880F991F8A59914D9093CE2AAD
:107960008093CD2A9091C72A8091CC2A9817E1F470
:1079700083E01BC08091C72A992733E0880F991FA5
:107980003A95E1F78A59914D9093CE2A8093CD2A6A
:107990008091C32A81FD06C09091C72A8091CC2A8C
:1079A000981711F482E001C081E08093CF2A809182
:1079B000CF2A813011F485E801C085EC8093BC00AA
:1079C0008091CB2A8093C52A1092CB2ABAC0E0912D
:1079D000CD2AF091CE2A8091BB0080838091CD2A60
:1079E0009091CE2A01969093CE2A8093CD2A8091B1
:1079F000CF2A81508093CF2A823010F085EC59C075
:107A0000813011F485E855C08091C32A81FF29C0D7
:107A10008091C72AE82FFF2723E0EE0FFF1F2A954A
:107A2000E1F7EF59F14D86818A3F79F48091C72AB9
:107A3000E82FFF2793E0EE0FFF1F9A95E1F7EF592C
:107A4000F14D8081816080830CC08091C72AE82F2E
:107A5000FF2783E0EE0FFF1F8A95E1F7EF59F14D05
:107A600010828091C72A8F5F8093C72A8091C72A8E
:107A70008C30A0F01092C72A1092C02A1092BF2A10
:107A80008091CC2A8F5F8093CC2A8C3038F0109272
:107A9000CC2A8091C32A8D7F8093C32A1092CA2A50
:107AA00084E98093BC008091C32A81608093C32ABB
:107AB00046C08093BC0086E08093CA2A42C080E81A
:107AC000BBCD1092CA2A84E98093BC001092C62ACA
:107AD0008AE090E090930901809308018091C92A7F
:107AE000823088F48091C92A8F5F8093C92A82E10D
:107AF0008093CA2A8091C32A8E7F8093C32A85EA05
:107B00008093BC001EC01092C92A8091C32A816054
:107B10008093C32A16C01092CA2A84E98093BC00BD
:107B20008091C32A81608093C32A8AE090E0909379
:107B30000901809308011092C82A1092C72A109256
:107B4000C62AFF91EF919F918F913F912F910F90B6
:107B50000FBE0F901F9018951F93CF93DF93182F90
:107B60008091C42A882319F081E090E097C01D30ED
:107B700008F092C01123B1F0E12FFF2793E0EE0F40
:107B8000FF1F9A95E1F7EF59F14D359780813596B2
:107B900088230CF081C03897808180FD03C083E08A
:107BA00090E07CC08091592E823019F084E090E002
:107BB00075C067E070E089E59EE20E946D3A9091A1
:107BC000602E891719F085E090E068C080ED97E09D
:107BD0000E942038EC018091C32A80FD05C0CE01AF
:107BE0000E9429388823B9F3112319F48FEF90E00C
:107BF0000BC0212F33272150304081E090E002C09C
:107C0000880F991F2A95E2F79093C22A8093C12A80
:107C1000A1E0B0E0E1E6FEE240E050E06BE0CD0143
:107C2000042E02C0880F991F0A94E2F72091C12AFE
:107C30003091C22A82239323892B11F01182128260
:107C400061504F5F5F4F389667FFE9CF1092C82AA7
:107C50001092CA2A8091C32A8E7F8093C32A85EA14
:107C60008093BC008091C32A80FD05C0CE010E9494
:107C700029388823B9F38091C12A9091C22A892B8F
:107C800029F0CE010E942938882311F38091C12A5E
:107C90009091C22A009711F082E090E0DF91CF919D
:107CA0001F91089581E090E008951F920F920FB602
:107CB0000F9211242F933F934F935F936F937F9372
:107CC0008F939F93AF93BF93EF93FF939091C800CF
:107CD0002091CE009871E091932BEF5FEF77809128
:107CE000942BE81711F492E006C0E093932BFF2742
:107CF000EF5EF44D20839093952B8091D02A8130B4
:107D000031F40E943E57892B11F00E94CFBBFF91A6
:107D1000EF91BF91AF919F918F917F916F915F9103
:107D20004F913F912F910F900FBE0F901F9018957C
:107D30001F920F920FB60F9211248F939F93EF9380
:107D4000FF939091912B8091922B981771F08091D5
:107D5000922B8F5F8F738093922BE82FFF27EF5228
:107D6000F54D80818093CE0005C08091C9008F7D44
:107D70008093C900FF91EF919F918F910F900FBE5B
:107D80000F901F9018959C011092912B1092922B9E
:107D90001092932B1092942B97FF04C082E0809353
:107DA000C8003F77832F99278093CD002093CC0084
:107DB00088E98093C90086E08093CA000895909175
:107DC000932B8091942B981719F480E091E00895FB
:107DD0008091942B8F5F8F778093942BE82FFF27D0
:107DE000EF5EF44D20818091952B9927982F88275D
:107DF000820F911D0895282F9091912B9F5F9F7363
:107E00008091922B9817E1F3E92FFF27EF52F54D60
:107E100020839093912B8091C90080628093C90048
:107E20008091952B9927982F8827820F911D08956F
:107E3000CF93DF93EC018881882331F089910E94F0
:107E4000FB3E88818823D1F7DF91CF910895CF93AE
:107E5000DF93EC01FC0121968491882339F00E9484
:107E6000FB3EFE01219684918823C9F7DF91CF91D3
:107E700008958091932B99272091942B821B91092F
:107E800081589F4F6FE770E00E94E2C6089580918D
:107E9000942B8093932B08951F920F920FB60F92FD
:107EA00011240F931F932F933F934F935F936F93DF
:107EB0007F938F939F93AF93BF93CF93EF93FF9352
:107EC00080919E2A853061F54091C6002091E32B78
:107ED0003091E42B8091E52B9091E62B281B390BF8
:107EE00037FF02C0205C3F4F2F3331050CF0EAC052
:107EF000E091E32BF091E42B40838091E32B909170
:107F0000E42B01969093E42B8093E32B8091E32B59
:107F10009091E42B2BE2833E920709F0D3C02DC051
:107F2000843091F54091C6002091E32B3091E42BF1
:107F30008091E52B9091E62B281B390B37FF02C06F
:107F4000205C3F4F2F3331050CF0BCC0E091E32B98
:107F5000F091E42B40838091E32B9091E42B0196E8
:107F60009093E42B8093E32B8091E32B9091E42B6F
:107F7000EBE2833E9E0709F0A5C0805490409093A9
:107F8000E42B8093E32B9EC0C091C6008091EF3D0F
:107F9000882339F080910838882319F08C2F0E94AB
:107FA000FB3E20919F2B222309F08CC04091A22BF5
:107FB000442371F4C33279F4C093C12E81E08093DD
:107FC000A22B83E290E09093A12B8093A02B7AC008
:107FD000443B08F06AC02091A02B3091A12BE42FE4
:107FE000FF27CD3069F0EF53F14DC0834F5F4093D1
:107FF000A22B2C0F311D3093A12B2093A02B62C0FC
:10800000DF01AF53B14D8D0102501040F801808166
:10801000281B3109BD0161507040FB018081281B84
:108020003109C9019F709093A12B8093A02B689474
:1080300015F8969587951694E1F7982F935C2F7312
:108040003070235CF8018081981709F5FB0180816D
:108050002817E9F4CC934F5F40939E2B9091A02A70
:108060008091C32E9817F1F481E080939F2B80912B
:10807000C32E8235B9F488E190E02CE00FB6F89475
:10808000A895809360000FBE209360000BC0809184
:10809000992B90919A2B019690939A2B8093992BE0
:1080A00010929F2B1092A22B0DC08091972B909134
:1080B000982B01969093982B8093972B2093A22B2B
:1080C00020939F2BFF91EF91CF91BF91AF919F9103
:1080D0008F917F916F915F914F913F912F911F9160
:1080E0000F910F900FBE0F901F9018952091E32BCA
:1080F0003091E42B8091E52B9091E62B28173907DE
:1081000019F480E090E00895E091E52BF091E62BE2
:10811000E0818091E52B9091E62B01969093E62BE0
:108120008093E52B8091E52B9091E62B2BE2833E0B
:10813000920731F4805490409093E62B8093E52B86
:108140008E2F99270895DC012091E32B3091E42BA9
:108150008091E52B9091E62B2817390719F480E0E0
:1081600090E00895E091E52BF091E62B80818C93CF
:108170008091E52B9091E62B01969093E62B8093CE
:10818000E52B8091E52B9091E62B2BE2833E920725
:1081900031F4805490409093E62B8093E52B81E05E
:1081A00090E008959C01892F99278093C500209322
:1081B000C4008091C0008D7F8093C00086E08093D2
:1081C000C2008091C1008B7F8093C1008091C0006C
:1081D00087FF03C08091C600F9CF8091C1008861FC
:1081E0008093C1008091C10080688093C10083EAC0
:1081F0009BE29093E62B8093E52B8091E52B909169
:10820000E62B9093E42B8093E32B08958091C1009B
:10821000877F8093C10023982B980895239A2B98E9
:108220008091C10088608093C1000895982F80914B
:10823000C00085FFFCCF9093C6000895CF93DF93D5
:10824000EC018881882331F089910E941641888150
:108250008823D1F7DF91CF910895CF93DF93EC017D
:10826000FC018491882349F0FE0184910E9416410B
:108270002196FE0184918823B9F7DF91CF9108956B
:108280008F929F92BF92CF92DF92EF92FF920F93C5
:108290001F93CF93DF93CDB7DEB72E859F85E888F8
:1082A000BB248824992483E28093942F9F59909330
:1082B000952F2093962F63E070E0EE2009F49CC088
:1082C000C988DA888E010B5E1F4FAB89BC89EA949E
:1082D000109709F491C01097B9F0F601EB0DF11D5C
:1082E000B3942081119791F4EE2049F1F8010E5FCB
:1082F0001F4FD801C080D1800E5F1F4F0D90BC91E1
:10830000A02DBB24EA9402C020E019C01097B9F058
:10831000F601EB0DF11DB3944081119791F4EE201D
:1083200041F1F8010E5F1F4FD801C080D1800E5F70
:108330001F4F0D90BC91A02DBB24EA9402C040E0D9
:1083400018C01097B1F0F601EB0DF11DB394F08059
:10835000119781F4EE2071F0F8013296D801CD909A
:10836000DC908F010E5F1F4FA081B181BB24EA9486
:1083700001C0FF24FB01EC56F04D822F86958695B7
:10838000835C80836F5F7F4FFB01EC56F04D822F43
:1083900099278370907024E0880F991F2A95E1F740
:1083A00055279A0194E0369527959A95E1F7822B07
:1083B000835C80836F5F7F4FFB01EC56F04D4F7005
:1083C0005070440F551F440F551F8F2D992726E0DD
:1083D000969587952A95E1F7842B835C80836F5F60
:1083E0007F4FFB01EC56F04D8FE3F8228DE3F80E42
:1083F000F0826F5F7F4F6CCF20E06115710569F0EF
:10840000E22FFF27EC56F04D8081880E911C2F5FE4
:10841000822F99278617970798F394013F70FB01E5
:10842000EC56F04DC901A6E096958795AA95E1F71F
:10843000835C80836F5F7F4FFB01EC56F04D2F73A1
:108440003070822F835C80836F5F7F4FFB01EC561F
:10845000F04D8DE080836F5F7F4F10920A0120E026
:108460006115710589F08091C00085FFFCCFE22F76
:10847000FF27EC56F04D80818093C6002F5F822F3E
:1084800099278617970778F381E080930A01DF9197
:10849000CF911F910F91FF90EF90DF90CF90BF9001
:1084A0009F908F900895FF920F931F93CF93DF9328
:1084B000CDB7DEB721970FB6F894DEBF0FBECDBFA4
:1084C000F82E062F142F0E940E41812F6AE00E9481
:1084D000C2C6898381E090E09F938F93CE0101967D
:1084E0009F938F9381E08F930F93FF920E9440415F
:1084F0008DB79EB707960FB6F8949EBF0FBE8DBF7F
:1085000080910A018823E1F30E94064121960FB66B
:10851000F894DEBF0FBECDBFDF91CF911F910F91B9
:10852000FF90089573E0672F30919E2B36503323D0
:1085300009F458C0E62FFF27EF53F14D80818D538A
:108540006F5FE62FFF27EF53F14D40814D536F5F73
:10855000E62FFF27EF53F14DA081AD536F5FE62F5C
:10856000FF27EF53F14D50815D536F5F31503F3F17
:10857000C9F1E72FFF27EF53F14D9927880F991F76
:10858000880F991F242F22952F70282B20837F5F1F
:1085900031503F3F39F1E72FFF27EF53F14D842F43
:1085A00099278F709070B4E0880F991FBA95E1F702
:1085B0002A2F26952695282B20837F5F31503F3F19
:1085C00089F0E72FFF27EF53F14D8A2F992783700A
:1085D000907046E0880F991F4A95E1F7582B508319
:1085E0007F5FA5CF84EC9EE290939D2B80939C2B84
:1085F000735070939B2B0895CF93C0919F2AC130E5
:10860000D1F48BE10E9416418BE10E94164185E571
:108610000E9416418AEA0E94164180E00E9416419B
:10862000C0939E2A24EF31E084EF91E00197F1F7A7
:1086300021503040C9F7CF91089585E080939E2A5C
:1086400024EF31E084EF91E00197F1F721503040C1
:10865000C9F708951F93CF93DF93CDB7DEB7219766
:108660000FB6F894DEBF0FBECDBF20919E2A2130F9
:1086700019F5198281E090E09F938F93CE010196C6
:108680009F938F932F9312E01F9385E78F930E9400
:10869000404110939E2A8DB79EB707960FB6F89467
:1086A0009EBF0FBE8DBF24EF31E084EF91E00197B4
:1086B000F1F721503040C9F721960FB6F894DEBF8C
:1086C0000FBECDBFDF91CF911F910895CF93DF9360
:1086D000CDB7DEB721970FB6F894DEBF0FBECDBF82
:1086E00020919E2A213021F5298381E090E09F93FB
:1086F0008F93CE0101969F938F932F9382E08F9358
:1087000085E78F930E94404183E080939E2A8DB736
:108710009EB707960FB6F8949EBF0FBE8DBF24EF8D
:1087200031E084EF91E00197F1F721503040C9F733
:1087300021960FB6F894DEBF0FBECDBFDF91CF916B
:108740000895CF93DF93CDB7DEB721970FB6F89496
:10875000DEBF0FBECDBF30919E2A313021F522E021
:10876000298381E090E09F938F93CE0101969F93A0
:108770008F933F932F9385E78F930E94404184E02E
:1087800080939E2A8DB79EB707960FB6F8949EBF2A
:108790000FBE8DBF24EF31E084EF91E00197F1F738
:1087A00021503040C9F721960FB6F894DEBF0FBEB6
:1087B000CDBFDF91CF910895882351F4A1E6BEE2A9
:1087C000FD01618312828F5F18968C30C8F30CC054
:1087D000E82FFF2783E0EE0FFF1F8A95E1F7EF599F
:1087E000F14D3797619310828091C62A882319F042
:1087F0001092C62A08958093C82A8093CA2A80912D
:10880000C32A8E7F8093C32A85EA8093BC00089593
:10881000CF92DF92EF920F931F93CF93DF9310E0ED
:108820000E94AA6B1093C42A10933E2E612F8DE8EC
:1088300099E00E94BE708091C32A82608093C32A0F
:108840001093C72A612F812F0E94DC4381E090E0C2
:108850000E9420386C018091C32A80FD05C0C601AA
:108860000E9429388823B9F381E090E00E942038E3
:108870006C0110E0C1E6DEE260E0812F0E94DC4383
:108880008091C32A80FD05C0C6010E942938882333
:10889000B9F38B8187FF7CC020E04BE959E061E0B0
:1088A000822F0E94EE7020E0412F61E082E10E9461
:1088B0009A7620E04AEA59E062E0822F0E94EE7048
:1088C00020E0488162E088E00E949A7620E043EB55
:1088D00059E062E08BE00E94EE7020E0498162E0A6
:1088E00082E10E949A7620E04BEB59E063E0822F10
:1088F0000E94EE7020E04A8163E088E00E949A7650
:1089000020E044EC59E063E08BE00E94EE7020E050
:108910004B8163E082E10E949A7620E04CEC59E0C2
:1089200064E0822F0E94EE7020E04C8164E088E0D9
:108930000E949A7620E045ED59E064E08BE00E94C9
:10894000EE7020E04D8164E082E10E949A7620E0A2
:108950004DED59E065E0822F0E94EE7020E04E81DF
:1089600065E088E00E949A7620E046EE59E065E0F6
:108970008BE00E94EE708F81992787FD9095EE2401
:1089800001E023E030E0AC0165E082E10E94347751
:108990001F5F28961C3008F46FCFDF91CF911F9195
:1089A0000F91EF90DF90CF900895CF93DF93E82F52
:1089B000C5E7DFE280E1DE011D928A95E9F7EE234B
:1089C00049F4862F992740E150E0BC01CE010E9476
:1089D0005BC204C0FF27EC58F04D608380E190E05B
:1089E0009F938F93DF93CF9381E08F938F9384E74F
:1089F0008F930E9440418DB79EB707960FB6F894AB
:108A00009EBF0FBE8DBFDF91CF910895CF92DF92B1
:108A1000EF92FF920F931F93CF93DF93CDB7DEB703
:108A200027970FB6F894DEBF0FBECDBFF82E0E9479
:108A3000AA6B81E08093D12F8093D32F1092D22FF5
:108A40006AE0C62ED12CF816B9F40E94084420E042
:108A50004EEE59E067E08BE00E94EE7080E20E94EB
:108A60004238882321F080EF0E94423876C380E1AB
:108A70000E944238882359F30E94AA6B62E089EF72
:108A800099E00E94BE7020E04FE05AE062E0862F3D
:108A90000E94EE7020E04AE15AE063E082E00E942A
:108AA000EE7001E026E040E068E288E00E945F6E40
:108AB00083E090E00E9438BC20E0AC0167E0822FA8
:108AC0000E942F7120E045E25AE067E082E10E94B7
:108AD000EE7020E049E25AE062E0822F0E94EE70E0
:108AE000F01629F48BE091E00E94183F0DC082E05F
:108AF000F81651F480919F2A813031F480919E2A9A
:108B0000813011F40E942A430091D12F002379F57E
:108B100080E40E944238882331F463E080E40E94BC
:108B20008638882321F18091D22F8E3F00F58F5F08
:108B30008093D22F9927E02E23E030E0AC0163E050
:108B400089E00E94347782E0F81689F48091D22F70
:108B500090E7899FC00111246FEF70E00E94E2C688
:108B600001E026E0462F68E288E00E945F6E1091E7
:108B7000D12F112309F045C080E80E944238882394
:108B800031F463E080E80E9486388823D1F1909127
:108B9000D22F9923B1F182E0F81681F480E7989FF3
:108BA000C00111246FEF70E00E94E2C6CB01012FDB
:108BB00026E0412F68E2885F0E945F6E8091D22F8D
:108BC00081508093D22F9927E12E012F23E030E0AE
:108BD000AC0163E089E00E94347782E0F81689F402
:108BE0008091D22F90E7899FC00111246FEF70E030
:108BF0000E94E2C601E026E0462F68E288E00E947B
:108C00005F6E0091D12F0130E1F480E40E94423880
:108C1000882331F4602F80E40E948638882389F00D
:108C20008091D32F803168F48F5F8093D32F992761
:108C3000EE240E2D23E030E0AC0162E089E00E94DA
:108C400034770091D12F013041F580E80E944238FD
:108C5000882331F4602F80E80E9486388823E9F069
:108C60008091D32F8823C9F081508093D32F8823FC
:108C700051F09927EE240E2D23E030E0AC0162E0A4
:108C800089E00E9434772091D32F222331F44BE2E4
:108C90005AE062E089E00E94EE7080E10E94423872
:108CA000882309F47DC081E0F81609F053C0809153
:108CB000D22F882309F44EC01092D32F1092D22FB6
:108CC0000F2D26E040E068E288E00E945F6E45E1FB
:108CD00065E080E00E944C718091D32F882351F091
:108CE0009927EE240E2D23E030E0AC0162E089E00C
:108CF0000E9434772091D32F222331F44FE25AE09F
:108D000062E089E00E94EE708091D22F9927EE24D4
:108D10000E2D23E030E0AC0163E089E00E9434775F
:108D20006091D22F8091D32F0E94DC4381E090E0AC
:108D30000E9420389093512E8093502E8091C32A08
:108D400080FD08C08091502E9091512E0E942938AC
:108D50008823A1F30091D12F002391F4202F43E326
:108D60005AE062E0802F0E94EE70202F45E35AE027
:108D700063E0802F0E94EE7081E08093D12F10C0BD
:108D800020E047E35AE062E0822F0E94EE7020E08C
:108D900049E35AE063E0822F0E94EE701092D12FD7
:108DA00081E0F81609F0C3C16091D22F8091D32FD2
:108DB0000E94DC4381E090E00E9420389093512E85
:108DC0008093502E20E04BE35AE063E0822F0E9414
:108DD000EE708091D32FE82FFF2753E0EE0FFF1F97
:108DE0005A95E1F7E65AF14D80819927EE240E2D30
:108DF00023E030E0AC0163E08DE00E9434772E2D5B
:108E000048E45AE064E08E2D0E94EE708091D32FEA
:108E1000E82FFF2743E0EE0FFF1F4A95E1F7E25AE4
:108E2000F14D2E2D408164E08DE00E949A76809174
:108E3000D32FE82FFF2733E0EE0FFF1F3A95E1F71E
:108E4000E25AF14D8081992723E030E0AC0164E0E3
:108E50008DE00E9434772E2D45E55AE065E08E2D99
:108E60000E94EE708091D32FE82FFF2723E0EE0FB2
:108E7000FF1F2A95E1F7E05AF14D8081992787FD80
:108E8000909523E030E0AC0165E08DE00E943477FE
:108E90002E2D42E65AE066E08E2D0E94EE70809103
:108EA000D32FE82FFF2793E0EE0FFF1F9A95E1F7EE
:108EB000E75AF14D2E2D408166E088E00E949A76B7
:108EC0002E2D4BE65AE066E08BE00E94EE7080911A
:108ED000D32FE82FFF2783E0EE0FFF1F8A95E1F7DE
:108EE000E45AF14D2E2D408166E082E10E949A768F
:108EF0008091D32F282F3327F90113E0EE0FFF1FA6
:108F00001A95E1F7E65AF14D8081882309F402C1F0
:108F1000C114D10409F0FBC04AE050E0BE016F5F0C
:108F20007F4FC90101970E9478C3CE0101960E942C
:108F3000183F8FE591E00E94183F8091D32FE82FD2
:108F4000FF27B3E0EE0FFF1FBA95E1F7E75AF14DA7
:108F500080814AE050E0BE016F5F7F4F99270E94F9
:108F600078C3CE0101960E94183F8FE591E00E94E0
:108F7000183F8091D32FE82FFF27A3E0EE0FFF1FAC
:108F8000AA95E1F7E65AF14D80814AE050E0BE0132
:108F90006F5F7F4F99270E9478C3CE0101960E9490
:108FA000183F8FE591E00E94183F8091D32FE82F62
:108FB000FF2773E0EE0FFF1F7A95E1F7E55AF14DB9
:108FC00080814AE050E0BE016F5F7F4F99270E9489
:108FD00078C3CE0101960E94183F8FE591E00E9470
:108FE000183F8091D32FE82FFF2763E0EE0FFF1F7C
:108FF0006A95E1F7E45AF14D80814AE050E0BE0104
:109000006F5F7F4F99270E9478C3CE0101960E941F
:10901000183F8FE591E00E94183F8091D32FE82FF1
:10902000FF2753E0EE0FFF1F5A95E1F7E35AF14D8A
:1090300080814AE050E0BE016F5F7F4F99270E9418
:1090400078C3CE0101960E94183F8FE591E00E94FF
:10905000183F8091D32FE82FFF2743E0EE0FFF1F2B
:109060004A95E1F7E25AF14D80814AE050E0BE01B5
:109070006F5F7F4F99270E9478C3CE0101960E94AF
:10908000183F8FE591E00E94183F8091D32FE82F81
:10909000FF2733E0EE0FFF1F3A95E1F7E15AF14D5C
:1090A00080814AE050E0BE016F5F7F4F99270E94A8
:1090B00078C3CE0101960E94183F8FE591E00E948F
:1090C000183F8091D32FE82FFF2723E0EE0FFF1FDB
:1090D0002A95E1F7E05AF14D80814AE050E0BE0167
:1090E0006F5F7F4F992787FD90950E9478C3CE01CF
:1090F00001960E94183F81E691E00E94183F83E6A6
:1091000091E00E94183F98ECC92ED12C03C008941E
:10911000C108D1088091C32A80FD0FC08091502ED4
:109120009091512E0E9429388823A1F306C06091A6
:10913000D22F8091D32F0E94D54480E20E944238E2
:10914000882309F4E1CC80EF0E94423882E0F816CF
:1091500021F460E0862F0E94D54427960FB6F8943C
:10916000DEBF0FBECDBFDF91CF911F910F91FF905A
:10917000EF90DF90CF900895439A1092E82B0895D6
:109180001F93CF9382B1886F82B90C988FEF84B907
:1091900088B1806988B987B18C6E87B93C9843984B
:1091A0005E9A8AB1806F8AB9299A0E941A360E9403
:1091B000D3350E94F03511E010934F2E84E190E0FA
:1091C0000E94D24084E190E00E94C33E812F0E9421
:1091D0007E3A789480E00E94F76B0E9476638091DB
:1091E000CA37853070F081E08093CA372FE543E0BD
:1091F00060E08091CA370E94EEA38093CA370E9434
:10920000D55F809180379927AA2797FDA095BA2F1F
:10921000BC01CD010E94CEC4DC01CB0123E333E3CA
:1092200043E250E4BC01CD010E94BBC5DC01CB018F
:10923000BC01CD010E94A0C4DC01CB018093B3002E
:1092400081E00E94F76B40E060E870E088EC90E01D
:109250000E942A361092EF3D20E043E75AE061E099
:1092600084E00E947D6F20E04BE75AE062E084E0FA
:109270000E947D6F86E090E00E9438BC20E0AC0147
:1092800064E0822F0E942F7187E090E00E9438BC3A
:1092900020E0AC0165E0822F0E942F7120E43FE1C5
:1092A00084EF91E00197F1F721503040C9F7079919
:1092B000299828EE33E084EF91E00197F1F72150EF
:1092C0003040C9F740E060E870E084EF91E00E9430
:1092D0002A3680EF0E9442380E94AA6B8091AD37F7
:1092E000813041F48091C937882321F48091D237AD
:1092F0000E94FF4C0E94AA6B0E94BC488091A93733
:10930000813031F48091C837882311F40E94FF52D4
:109310000E94AA6B8091AD37813051F51091D42F06
:10932000112331F585E00E94B257C0918137C130D9
:1093300009F042C088E090E00E9438BC212FAC01C7
:10934000612F812F0E942F7189E090E00E9438BC2C
:10935000212FAC016C2F812F0E942F7120E23EE45F
:1093600084EF91E00197F1F721503040C9F724C014
:1093700086E00E94B257C0918137C130E9F488E09D
:1093800090E00E9438BC20E0AC01622F822F0E9446
:109390002F718AE090E00E9438BC20E0AC016C2F75
:1093A000822F0E942F7120E23EE484EF91E001972A
:1093B000F1F721503040C9F70E94AA6BCF911F915D
:1093C00008958091B00083688093B0008091B100CF
:1093D00081608093B10008951092B0001092B100A6
:1093E00008958091E82B882369F4439881E0809365
:1093F000E82B20E23EE484EF91E00197F1F7215061
:109400003040C9F70895992782309105C9F083301B
:1094100091052CF4009761F0019769F0089584306C
:109420009105A1F08430910574F0059791F00895AD
:1094300087E092E002C081E890E00E94D240089567
:1094400080E490E0FACF8FE190E0F7CF84E190E004
:10945000F4CF8AE090E0F1CF992782309105C9F0EE
:10946000833091052CF4009761F0019769F008951D
:1094700084309105A1F08430910574F0059791F046
:10948000089587E092E002C081E890E00E94C33E28
:10949000089580E490E0FACF8FE190E0F7CF84E187
:1094A00090E0F4CF8AE090E0F1CF1F93182F20E0F6
:1094B00042E85AE063E0822F0E94267160E0812F2B
:1094C0000E94C4761093EC2B40E060E470E084EFDF
:1094D00091E00E942A3628E833E184EF91E0019779
:1094E000F1F721503040C9F71F9108950F931F9352
:1094F000CF938C01C0E00E9476408FEF0E9416410E
:1095000082E00E9416418EEF0E941641802F0E9439
:10951000164124EF31E084EF91E00197F1F72150FB
:109520003040C9F70E947640282F332748EE53E099
:1095300084EF91E00197F1F741505040C9F7CF5FB8
:109540002115310511F4CA3069F7CA3011F4CA0186
:109550000FC02630310519F08FEF90E009C060E0B0
:10956000822F0E94C4760E9476400E9476409927FE
:10957000CF911F910F9108950F931F93CF93182FA1
:10958000062FC0E08FEF0E94164182E00E94164134
:10959000812F0E941641802F0E9416410E94764022
:1095A000482F552728EE33E084EF91E00197F1F73B
:1095B00021503040C9F7CF5F4115510511F4CA3031
:1095C00069F746305105D1F020E044E95AE062E005
:1095D000822F0E94267140E060E470E088EE93E004
:1095E0000E942A3620E23EE484EF91E00197F1F7F1
:1095F00021503040C9F78FEF90E001C0C901CF91F1
:109600001F910F910895CF93DF93C82F0E941D43A0
:109610005E9820ED37E084EF91E00197F1F721505B
:109620003040C9F70E94AA6B8C2F0E94034A20E0A9
:109630004FE95AE0622F822F0E94267188E790E05E
:109640000E94764AEC0120E0482F622F82E10E94BE
:109650009A76CE0101978E3F910538F481E0809390
:10966000ED2B8091D2378093EB2B209709F0D7C058
:1096700087E092E00E94D24020E043EB5AE061E0B4
:10968000822F0E94267188E790E00E94764AEC01C2
:1096900020E0482F61E082E10E949A76CE01019796
:1096A0008E3F910528F482E08093ED2B1092EB2BF6
:1096B000209709F581E890E00E94D24020E044EC38
:1096C0005AE062E0822F0E94267188E790E00E94B3
:1096D000764AEC0120E0482F62E082E10E949A760F
:1096E000CE0101978E3F910530F482E08093ED2BFF
:1096F00081E08093EB2B209701F580E490E00E94BD
:10970000D24020E045ED5AE063E0822F0E942671AE
:1097100088E790E00E94764AEC0120E0482F63E061
:1097200082E10E949A76CE0101978E3F910528F43E
:1097300082E08093ED2B8093EB2B209709F58FE14E
:1097400090E00E94D24020E047EE5AE064E0822F91
:109750000E94267188E790E00E94764AEC0120E0A2
:10976000482F64E082E10E949A76CE0101978E3FF5
:10977000910530F482E08093ED2B83E08093EB2B16
:10978000209709F584E190E00E94D24020E048EF64
:109790005AE065E0822F0E94267188E790E00E94DF
:1097A000764AEC0120E0482F65E082E10E949A763B
:1097B000CE0101978E3F910530F482E08093ED2B2E
:1097C00084E08093EB2B209709F589E090E00E94DC
:1097D000D24020E049E05BE066E0822F0E942671E3
:1097E00088E790E00E94764AEC0120E0482F66E08E
:1097F00082E10E949A76CE0101978E3F910530F466
:1098000082E08093ED2B85E08093EB2B20E23EE419
:1098100084EF91E00197F1F721503040C9F720978C
:10982000A1F40E94AA6B20E04BE15BE0622F822F43
:109830000E9426711092ED2B20E23EE484EF91E02D
:109840000197F1F721503040C9F7CF3FD105D1F44E
:109850000E94AA6B20E04BE25BE0622F822F0E9405
:10986000267140E060E470E088EE93E00E942A36C2
:1098700040E25EE484EF91E00197F1F741505040FF
:10988000C9F7EA01CE0101978E3F910508F0B3C0F8
:109890000E94AA6B8091ED2B813039F420E040E4E6
:1098A0005BE0622F822F0E9426718091ED2B823027
:1098B00009F08FC01092C93720E04EE45BE0622FC0
:1098C000822F0E9426716091D23783E00E94BC4AA9
:1098D000892BC1F020E044E65BE061E0822F0E942A
:1098E000267140E060E470E088EE93E00E942A3642
:1098F00020E23EE484EF91E00197F1F721503040FF
:10990000C9F720C020E137E284EF91E00197F1F739
:1099100021503040C9F720E045E75BE061E0822F4D
:109920000E94267120E047E85BE062E0822F0E94FF
:10993000267120E23EE484EF91E00197F1F7215097
:109940003040C9F76091D2378EE40E94BC4A892B1F
:10995000C1F020E046E95BE063E0822F0E942671BF
:1099600040E060E470E088EE93E00E942A3620E256
:109970003EE484EF91E00197F1F721503040C9F7C0
:1099800020C020E137E284EF91E00197F1F7215008
:109990003040C9F720E049EA5BE061E0822F0E9495
:1099A000267120E048EB5BE062E0822F0E94267186
:1099B00020E23EE484EF91E00197F1F7215030403E
:1099C000C9F78091D2370E94034A8091D2378093A1
:1099D000E92B45E161E080E00E944C7120E047EC1A
:1099E0005BE061E0822F0E94267120E04C2F61E055
:1099F00089E00E949A765E9ADF91CF910895CF9385
:109A0000C0E085E00E94B2578091E92B0E94034B91
:109A10008091ED2B882309F49BC12C2F40ED5BE056
:109A200062E08C2F0E9426715E9820ED37E084EF73
:109A300091E00197F1F721503040C9F70E941D4392
:109A40006EE781E50E94BC4A892B41F0C1E020E02D
:109A500044EE5BE064E0822F0E9426716091D9376A
:109A600080E00E94BC4A892B19F081E00E94554A8F
:109A70008C2FCF5F20E046EE5BE064E00E94267111
:109A80006091D9378BE40E94BC4A892B19F082E09F
:109A90000E94554A8C2FCF5F20E048EE5BE064E0E7
:109AA0000E9426716091D93781E00E94BC4A892BBF
:109AB00019F083E00E94554A8C2FCF5F20E04AEED8
:109AC0005BE064E00E9426716091D9378CE40E94CB
:109AD000BC4A892B19F084E00E94554A8C2FCF5F35
:109AE00020E04CEE5BE064E00E94267160E08DE0D7
:109AF0000E94BC4A892B19F085E00E94554A8C2FA0
:109B0000CF5F20E04EEE5BE064E00E94267163E0F0
:109B100082E00E94BC4A892B19F086E00E94554AD7
:109B20008C2FCF5F20E040EF5BE064E00E94267165
:109B30006091A53785E00E94BC4A892B19F087E027
:109B40000E94554A8C2FCF5F20E042EF5BE064E03B
:109B50000E9426716091A53780E50E94BC4A892B3E
:109B600019F088E00E94554A8C2FCF5F20E044EF27
:109B70005BE064E00E9426716091AB3789E00E944F
:109B8000BC4A892B19F089E00E94554A8C2FCF5F7F
:109B900020E046EF5BE064E00E9426716091AB3705
:109BA00084E50E94BC4A892B19F08AE00E94554A3C
:109BB0008C2FCF5F20E048EF5BE064E00E942671CD
:109BC0006091D13784E00E94BC4A892B19F08BE068
:109BD0000E94554A8C2FCF5F20E04AEF5BE064E0A3
:109BE0000E9426716091D1378FE40E94BC4A892B74
:109BF00019F08CE00E94554A8C2FCF5F20E04CEF8B
:109C00005BE064E00E94267161E088E00E94BC4A4B
:109C1000892B19F08DE00E94554A8C2FCF5F20E0F0
:109C20004EEF5BE064E00E94267161E08BE00E94F1
:109C3000BC4A892B19F08EE00E94554A8C2FCF5FC9
:109C400020E040E05CE064E00E9426716091AA3769
:109C500086E00E94BC4A892B19F08FE00E94554A89
:109C60008C2FCF5F20E042E05CE064E00E94267130
:109C70006091AA3781E50E94BC4A892B19F08FE0D8
:109C80000E94554A8C2FCF5F20E044E05CE064E006
:109C90000E9426716091EA2B83E00E94BC4A892BC6
:109CA00019F080E10E94554A8C2FCF5F20E046E0FA
:109CB0005CE064E00E9426716091EA2B8EE40E94D1
:109CC000BC4A892B19F081E10E94554A20E048E006
:109CD0005CE064E08C2F0E9426715E9A8091EC2BF0
:109CE0008823E9F020E04AE05CE062E0822F0E94F5
:109CF000267160E08091EC2B0E94C47640E060E425
:109D000070E088EE93E00E942A3620E23EE484EF81
:109D100091E00197F1F721503040C9F708C0282F92
:109D20004CE15CE062E00E9426710E944C5F8091F1
:109D3000D2370E94034A8091D2378093E92B20E2E8
:109D40003EE484EF91E00197F1F721503040C9F7EC
:109D5000CF910895CF93DF93EA0132E020E02617F8
:109D6000A0F44EEFDC018C9187FF05C0FE01E30FEC
:109D7000F11D40833F5FFE01E30FF11D8D918F7751
:109D800080833F5F2F5F261770F3832F9927FC0195
:109D9000EC0FFD1F10822FEF288332503983DF91A3
:109DA000CF9108958091ED2B823041F487E092E0CD
:109DB0000E94D24087E092E00E94C33E0E94AA6BBC
:109DC0005E9820E04EE25CE0622F822F0E942671B6
:109DD00020E044E45CE061E0822F0E94267120E0F4
:109DE00049E55CE062E0822F0E94267120E040E6B7
:109DF0005CE063E0822F0E94267120E041E75CE096
:109E000067E081E10E9426710E94DF3E90FF08C05A
:109E10000E9476409927009729F00E94FB3E02C0DD
:109E20000E94164180E10E944238882369F35E9ABD
:109E300008950E94AA6B20E046E75CE0622F822F23
:109E40000E94267120E044E85CE061E0822F0E94DD
:109E5000267120E049E95CE062E0822F0E942671D1
:109E600020E04DEA5CE063E0822F0E94267120E052
:109E700045EB5CE067E081E10E9426710E94DF3ED5
:109E800090FF08C00E9476409927009729F00E9411
:109E9000FB3E02C00E94164180E10E9442388823A6
:109EA00069F30895CF93DF93AC0120E030E02817E9
:109EB000390764F4A8E8B3E1C0E0D0E0CD01019730
:109EC000F1F72F5F3F4F24173507C4F3DF91CF9190
:109ED000089522C00E94DF3E9C01207042E02030A5
:109EE000340779F042E02130340720F4205031402B
:109EF000C9F00DC044E02030340719F0205038403C
:109F000031F48091EE2B8F5F8093EE2B0895682FB4
:109F100084EF9DE20E94306784EF9DE20E94F66626
:109F20008823C1F20895BF92CF92DF92EF92FF9201
:109F30000F931F93CF93DF93CDB7DEB721970FB663
:109F4000F894DEBF0FBECDBF8C01B62E8091F22BF0
:109F5000982F8F5F8093F22B20E04AEB5CE061E06A
:109F6000892F0E94EE70CC24CB1408F053C07801E6
:109F7000F70180810E94FB3E892B09F44BC0409180
:109F80006701442351F424EF31E084EF91E001971D
:109F9000F1F721503040C9F702C0413011F0433091
:109FA00029F488E893E10197F1F72DC0423059F583
:109FB000DD2400E010E006C00E94694F88E893E1CC
:109FC0000197F1F7C8010F5F1F4F893C910530F4ED
:109FD00084EF9DE20E94EB66882371F7BE016F5FFC
:109FE0007F4F84EF9DE20E9404678981F701908191
:109FF000891749F0892F0E94FB3E892B59F0D39491
:10A00000F2E0FD15B0F6C3940894E11CF11CCB14EA
:10A0100008F4AECF21960FB6F894DEBF0FBECDBFC9
:10A02000DF91CF911F910F91FF90EF90DF90CF9034
:10A03000BF900895AF92BF92CF92DF92EF92FF92BE
:10A040000F931F93CF93DF93CDB7DEB764970FB60F
:10A05000F894DEBF0FBECDBFD82E7B0100E010E02C
:10A060009927AA27BB27FC01479708F09BC0EA5B0A
:10A07000FF4FEE0FFF1F0590F491E02D09946CEB5C
:10A080007CE0CE0101960E9435C2DE011596E4ED1A
:10A09000F7E393E081918D93915097FFFBCF198661
:10A0A0007EC061EC7CE0CE0101960E9435C208EED4
:10A0B00013E07AC066EC7CE06EC06BEC7CE06BC0B9
:10A0C00060ED7CE068C065ED7CE065C06AED7CE039
:10A0D00062C06FED7CE05FC064EE7CE05CC069EE66
:10A0E0007CE059C06EEE7CE056C063EF7CE053C06C
:10A0F00068EF7CE050C06BEF7CE04DC06FEF7CE020
:10A100004AC063E07DE047C068E07DE0CE01019693
:10A110000E9435C2FE01319601900020E9F7319787
:10A120008CE0D7010D9001928A95E1F7198A37C02A
:10A130006DE07DE030C062E17DE0CE0101960E94DD
:10A1400035C20CEA1DE030C067E17DE002C06CE181
:10A150007DE0CE0101960E9435C208EB1BE024C0D1
:10A1600061E27DE0CE0101960E9435C220E090912F
:10A17000113E291748F4DE011596E5E7F7E38191D2
:10A180008D932F5F2917D8F3FE01E90FF11D15827A
:10A1900006C066E27DE0CE0101960E9435C204E66B
:10A1A00010E002C0C8019FC16BE27DE0CE010196C4
:10A1B0000E942AC20E94694F84EF9DE20E94576765
:10A1C000DE011196FD0101900020E9F73197EA1BAD
:10A1D000FB0B6E2FCD010E94934FB1E1DB1609F00E
:10A1E00041C0C801AA2797FDA095BA2FBC01CD0197
:10A1F0000E94CEC45B016C0120E030E44CE955E4E0
:10A200000E94BBC57B018C0120E030E040E85FE3A9
:10A210000E942CC487FD1EC120E03FEF4FE757E4AA
:10A22000C801B7010E94B7C518160CF03AC120E06A
:10A2300030E040E251E4C601B5010E94BBC5DC013B
:10A24000CB01BC01CD010E94A0C4DC01CB01FC010B
:10A25000892B09F42FC184EF91E00197F1F7319731
:10A26000D1F728C120E1D21609F041C0C801AA27C0
:10A2700097FDA095BA2FBC01CD010E94CEC45B0111
:10A280006C0120E030E44CE955E40E94BBC57B0141
:10A290008C0120E030E040E85FE30E942CC487FDA1
:10A2A000D9C020E03FEF4FE757E4C801B7010E9453
:10A2B000B7C518160CF0F5C020E030E040E251E4DC
:10A2C000C601B5010E94BBC5DC01CB01BC01CD01BB
:10A2D0000E94A0C4DC01CB01FC01892B09F4EAC077
:10A2E00084EF91E00197F1F73197D1F7E3C083E173
:10A2F000D81609F041C0C801AA2797FDA095BA2F2A
:10A30000BC01CD010E94CEC45B016C0120E030E4B1
:10A310004CE955E40E94BBC57B018C0120E030E094
:10A3200040E85FE30E942CC487FD94C020E03FEF2B
:10A330004FE757E4C801B7010E94B7C518160CF0E3
:10A34000B0C020E030E040E251E4C601B5010E9417
:10A35000BBC5DC01CB01BC01CD010E94A0C4DC0166
:10A36000CB01FC01892B09F4A5C084EF91E0019792
:10A37000F1F73197D1F79EC0A2E1DA1609F041C09A
:10A38000C801AA2797FDA095BA2FBC01CD010E9454
:10A39000CEC45B016C0120E030E44CE955E40E943E
:10A3A000BBC57B018C0120E030E040E85FE30E9408
:10A3B0002CC487FD4FC020E03FEF4FE757E4C801B2
:10A3C000B7010E94B7C518160CF06BC020E030E052
:10A3D00040E251E4C601B5010E94BBC5DC01CB01DE
:10A3E000BC01CD010E94A0C4DC01CB01FC01892B82
:10A3F00009F460C084EF91E00197F1F73197D1F74C
:10A4000059C081E0E82EF12C0E94694F6DE27DE099
:10A4100084EF9DE20E941568882309F44EC0C801AC
:10A42000AA2797FDA095BA2FBC01CD010E94CEC4EA
:10A430005B016C0120E030E44CE955E40E94BBC5AF
:10A440007B018C0120E030E040E85FE30E942CC4F7
:10A4500088231CF4E1E0F0E02BC020E03FEF4FE761
:10A4600057E4C801B7010E94B7C51816D4F420E01C
:10A4700030E040E251E4C601B5010E94BBC5DC01F9
:10A48000CB01BC01CD010E94A0C4DC01CB01FC01C9
:10A49000892B81F084EF91E00197F1F73197D1F7A3
:10A4A00009C0C801B7010E94A0C4DC01CB01FC01B6
:10A4B0003197F1F781E090E016C062E37DE084EF30
:10A4C0009DE20E941568882361F481E090E00E947B
:10A4D000524FC7010894E11CF11C815D974008F4BC
:10A4E00093CF80E090E064960FB6F894DEBF0FBE85
:10A4F000CDBFDF91CF911F910F91FF90EF90DF9033
:10A50000CF90BF90AF900895CF9310926701C0E0B5
:10A5100060E070E080E00E941A50892B19F4CF5F50
:10A52000C230B0F382E080936701CF910895CF935A
:10A53000DF93C1E0D0E00E94694F81E090E00E948B
:10A54000524FCE012196C397B0F36AE37DE084EFCA
:10A550009DE20E941568DF91CF9108950F931F939C
:10A56000CF93DF938C01C1E0D0E00E94694F6DE38F
:10A570007DE084EF9DE20E9415688823F9F468E489
:10A580007DE084EF9DE20E941568882379F028EE33
:10A5900033E084EF91E00197F1F721503040C9F7A3
:10A5A00081E08093670181E090E024C060E57DE078
:10A5B00084EF9DE20E941568882351F00E94975213
:10A5C0000E94845282E08093670182E090E012C092
:10A5D00080E090E00115110511F081E090E00E940B
:10A5E000524FCE0121960817190708F0BECF80916F
:10A5F00067019927DF91CF911F910F9108951F93C4
:10A60000CF93DF9310E01093F22B0E94F1490E9448
:10A61000AA6B212F4AE65DE0612F812F0E94EE7028
:10A620009AE0EEE7F7E380813197803209F0F6C0D7
:10A630009150C9F784E190E00E94C33E40E052E0AF
:10A6400064EF7BE284EF9DE20E94DD66C8EED3E01A
:10A6500084EF91E00197F1F72197D1F784EF9DE224
:10A660000E945767BE0180E00E941A5083E08093E9
:10A670006701BE0183E10E941A50BE0182E10E947F
:10A680001A50BE0180E00E941A50892B09F06BC05D
:10A6900080E490E00E94C33EC8EED3E084EF91E0F6
:10A6A0000197F1F72197D1F7BE0180E00E941A507F
:10A6B000BE0182E10E941A50BE0183E10E941A503D
:10A6C000BE0180E00E941A50892B39F0BE0180E063
:10A6D0000E941A50892B09F046C081E890E00E9440
:10A6E000C33EC8EED3E084EF91E00197F1F72197E4
:10A6F000D1F7BE0180E00E941A50BE0182E10E94A3
:10A700001A50BE0183E10E941A50BE0180E00E94EF
:10A710001A50BE0180E00E941A50892B21F583E077
:10A7200091E00E94C33EC8EED3E084EF91E0019730
:10A73000F1F72197D1F7BE0180E00E941A50BE01C7
:10A7400082E10E941A50BE0183E10E941A50BE01AC
:10A7500080E00E941A50BE0180E00E941A50EC0175
:10A76000892B09F45EC082E08093670160E070E0AD
:10A770008EE00E941A50892B09F411E084E190E0E8
:10A780000E94C33EC8EED3E084EF91E00197F1F759
:10A790002197D1F7BE0183E00E941A50892B09F45A
:10A7A00011E0BE0188E00E941A50892B09F411E0E3
:10A7B000BE0189E00E941A50892B09F411E0BE0104
:10A7C00085E10E941A50892B09F411E0C8EBDBE007
:10A7D00084EF91E00197F1F72197D1F7BE0186E16F
:10A7E0000E941A50892B09F411E0BE0181E10E94F8
:10A7F0001A5083E080936701BE0180E10E941A50E5
:10A8000081E0809368010E94BC48112361F40E949A
:10A810005F5F0E94725F61E070E006C09093113E3E
:10A8200009CF0E94BC48BE01CB01DF91CF911F919F
:10A830000895CF93C82F80916801C81719F481E05B
:10A8400090E038C0CC2389F460E070E087E00E949B
:10A850001A50892B31F1C093680160E070E086E006
:10A860000E941A500E94855F1CC0C130D1F460E084
:10A8700070E088E00E941A50892B11F0C0936801A3
:10A8800060E070E081E10E941A5083E080936701EC
:10A8900060E070E080E10E941A50C09368010E945D
:10A8A000725F20E030E080916801C81711F421E068
:10A8B00030E0C901CF9108959F92AF92BF92CF929D
:10A8C000DF92EF92FF920F931F93CF93DF93CDB759
:10A8D000DEB721970FB6F894DEBF0FBECDBF5C0187
:10A8E000962E8A011982E98091E0C92ED12C01159A
:10A8F000110509F444C0E91419F481E090E041C065
:10A900000E94694F84EF9DE20E94EB66882361F507
:10A9100080E090E00E94AE52813089F5011511056A
:10A9200011F400ED17E084EF9DE20E94EB668823AE
:10A93000D9F4F980FF2079F4BE016F5F7F4F84EF77
:10A940009DE20E9404678981891511F0F9820CC08B
:10A950000053184F09C0C5018E0D911DBC0184EF35
:10A960009DE20E940467E39488E893E10197F1F780
:10A97000C6010894C11CD11C029708F4B8CF80E02E
:10A9800090E021960FB6F894DEBF0FBECDBFDF91E9
:10A99000CF911F910F91FF90EF90DF90CF90BF90DC
:10A9A000AF909F9008950F931F93CF93DF93CDB7F0
:10A9B000DEB721970FB6F894DEBF0FBECDBF8C0176
:10A9C000698380E090E00E94AE52823019F480E00A
:10A9D00090E013C061E0CE0101960E94934F69811F
:10A9E000C8010E94934F00E010E0C8010E94AE52DF
:10A9F000813011F401E010E0C80121960FB6F894FF
:10AA0000DEBF0FBECDBFDF91CF911F910F91089593
:10AA1000CF93DF93EC0140E052E064EF7BE284EF00
:10AA20009DE20E94DD660E94694F84EF9DE20E94D4
:10AA3000576780E090E00E94AE52813019F480E0C8
:10AA400090E01EC00E9484520E948452BE0184E0A5
:10AA50000E941A500097A1F00E94845260E070E0BA
:10AA600081E00E941A50009759F0C0E0D0E080E6E3
:10AA70009AEE0E94AE52813011F4C1E0D0E0CE01D6
:10AA8000DF91CF910895FF920F931F93CF93DF93A0
:10AA9000CDB7DEB721970FB6F894DEBF0FBECDBF9E
:10AAA00080E090E00E94AE52823059F1FF248BE2A8
:10AAB000898361E0CE0101960E94934F00E117E285
:10AAC00084EF91E00197F1F701501040C9F7F3943A
:10AAD00083E08F1560F782E080936701B8010E94E0
:10AAE0001A50009731F0B80183E00E941A50009785
:10AAF00011F4BC010EC080E197E20E94AE52823098
:10AB000039F484EF9DE20E94576761E070E001C074
:10AB1000B801CB0121960FB6F894DEBF0FBECDBFB2
:10AB2000DF91CF911F910F91FF900895CF93AC01CA
:10AB3000C0E02C2FFC0180818D3231F483818D3275
:10AB400019F4C22FC45004C02F5F3196283298F3F5
:10AB5000DB019A019DE0F901EC0FF11D80818D323E
:10AB600009F4CF5FF901EC0FF11D80818D939150B5
:10AB70002F5F3F4F97FFEFCFCF91089540E0DB016C
:10AB8000FC019081903219F48181803229F09D93EB
:10AB90004F5F31964E30A8F308954F925F926F92B7
:10ABA0007F928F929F92AF92BF92CF92DF92EF925D
:10ABB000FF920F931F93CF93DF93CDB7DEB7CF5F95
:10ABC000D0400FB6F894DEBF0FBECDBF60E070E09E
:10ABD00085E00E941A50009741F49CC084EF9DE2EA
:10ABE0000E94576781E090E095C02E010894411CB7
:10ABF000511C42016624772440E6A42E4DE6B42E73
:10AC000063010E94694F0894A108B1080894C11C0F
:10AC1000D11C88E893E10197F1F784EF9DE20E944F
:10AC2000E766EE240E2D25E030E0AC0165E08E2DC8
:10AC30000E94347788EEC81683E0D80679F48091B4
:10AC4000F22B982F8F5F8093F22B2E2D4EE75DE035
:10AC500061E0892F0E94EE70CC24DD2484EF9DE218
:10AC60000E94F666882361F4A114B10451F660E8ED
:10AC70007DE084EF9DE20E941568882309F4C1CF2E
:10AC8000AA24BB243FC0B40184EF9DE20E94046764
:10AC90000894811C911C63E97DE084EF9DE20E9491
:10ACA0000F68882381F3F40110824201898188238F
:10ACB00049F166E97DE0C2010E943CC2892B09F09E
:10ACC0008DCF8501060D171D36E0E32E31E3F32EFF
:10ACD000E00EF11E24E0C22ED12CCC0EDD1EB701F9
:10ACE000C6010E94BE55F7011686065E1E4CB801CD
:10ACF000C6010E9496550894611C711C81E290E087
:10AD0000A80EB91E84EF9DE20E94EB66882319F21B
:10AD100080E090E0C150DF4F0FB6F894DEBF0FBE69
:10AD2000CDBFDF91CF911F910F91FF90EF90DF90FA
:10AD3000CF90BF90AF909F908F907F906F905F90DB
:10AD40004F900895CF93DF9340E052E064EF7BE2B1
:10AD500084EF9DE20E94DD66C8EED3E084EF91E0CF
:10AD60000197F1F72197D1F70E94694F84EF9DE297
:10AD70000E94576783E080936701BE0183E10E94D0
:10AD80001A5082E080936701BE0182E10E941A504E
:10AD900080E00E9419540E94855FDF91CF91089551
:10ADA000CF93DF93CDB7DEB7C056D0400FB6F8943F
:10ADB000DEBF0FBECDBF20E04CE050E0822F9927D0
:10ADC000849FF001859FF00D949FF00D1124EC0FEE
:10ADD000FD1F31968BE01192815087FFFCCF2F5FD2
:10ADE000283060F3CE0101960E94CD55892BE1F108
:10ADF0001092EF2B60E0962F20E030E0A901903117
:10AE000088F5F901E40FF51FEA5FFE4C8489882379
:10AE100009F585898823F1F486898823D9F48789FF
:10AE20008823C1F4808D8823A9F4818D882391F42F
:10AE3000828D882379F4838D882361F4848D88231F
:10AE400049F4858D882331F4868D882319F4878D04
:10AE5000882341F06F5F9F5F4F5F5F4F2F5D3F4FD4
:10AE6000983068F26093EF2BC05ADF4F0FB6F8941A
:10AE7000DEBF0FBECDBFDF91CF910895CF93DF939B
:10AE8000CDB7DEB721970FB6F894DEBF0FBECDBFAA
:10AE90000E94694F84EF9DE20E94EB66882309F0CF
:10AEA00056C080E090E00E94AE52813019F080E000
:10AEB00090E04FC084EF9DE20E94EB66882309F08A
:10AEC00046C0BE016F5F7F4F84EF9DE20E94046722
:10AED0002091F32B2223D9F539818091660138170F
:10AEE00071F480916901882351F02093690186ED06
:10AEF0009FE290936B0180936A01209305318091CA
:10AF000069018823A1F4E0916A01F0916B0130831B
:10AF1000809105318F5F8093053199818091650122
:10AF2000981729F481E0809369018093F32B809135
:10AF30006A0190916B01019690936B0180936A0175
:10AF400080910531863919F481E08093690181E0AF
:10AF500090E021960FB6F894DEBF0FBECDBFDF9113
:10AF6000CF910895429A289A469A459A9927823015
:10AF7000910561F0833091051CF4892B01F108954E
:10AF800085309105C1F00697C1F008958091C90000
:10AF90008F7E8093C9008091C900877F8093C9000C
:10AFA0008091C9008F778093C900529853985A981E
:10AFB0005B98429808954598089546980895809121
:10AFC000C9008F7E8093C9008091C900877F8093DC
:10AFD000C9008091C9008F778093C9005298539817
:10AFE0005A985B9828980895CF930E94AA6BC091B5
:10AFF000A937C13009F057C080E490E00E9438BC06
:10B0000022E0AC0160E0862F0E942F7181E490E085
:10B010000E9438BC20E0AC016C2F822F0E942F715F
:10B0200082E490E00E9438BC20E0AC0163E0822F13
:10B030000E942F7183E490E00E9438BC20E0AC01B4
:10B0400064E0822F0E942F7189E490E00E9438BC56
:10B0500020E0AC0165E0822F0E942F718DE290E02C
:10B060000E9438BC20E0AC0167E08CE00E942F71A8
:10B070000E94F14982E00E94B2570E94A97B80E2BF
:10B080000E9442388823C9F380EF0E9442388091A1
:10B09000D42F813011F486E001C085E00E94B257C0
:10B0A0000E94BC4844C08EE390E00E9438BC20E07F
:10B0B000AC0161E0822F0E942F718FE390E00E942B
:10B0C00038BC20E0AC0161E0822F0E942F7189E33F
:10B0D00090E00E9438BC20E0AC0162E0822F0E9428
:10B0E0002F718AE390E00E9438BC20E0AC0163E05D
:10B0F000822F0E942F718BE390E00E9438BC20E0E9
:10B10000AC0164E0822F0E942F718CE190E00E94DC
:10B1100038BC20E0AC0167E08CE00E942F7180E237
:10B120000E9442388823D9F380EF0E944238CF91A1
:10B1300008950E94AA6B80E490E00E9438BC22E04F
:10B14000AC0160E0862F0E942F7184E490E00E94A1
:10B1500038BC22E0AC0161E080E00E942F7182E403
:10B1600090E00E9438BC20E0AC0163E0822F0E9496
:10B170002F7185E490E00E9438BC20E0AC0164E0CF
:10B18000822F0E942F7189E490E00E9438BC20E059
:10B19000AC0165E0822F0E942F718DE290E00E9449
:10B1A00038BC20E0AC0167E08CE00E942F710E9467
:10B1B000F14980E00E94B2570E94A97B80E20E9480
:10B1C00042388823C9F380EF0E9442388091D42FFF
:10B1D000813011F486E001C085E00E94B2570E94E0
:10B1E000BC4808950E94AA6B22E042EA5DE060E05C
:10B1F000862F0E94EE7022E048EB5DE061E080E087
:10B200000E94EE7020E04EEC5DE063E0822F0E9431
:10B21000EE7020E044EE5DE064E0822F0E94EE706C
:10B2200020E04AEF5DE065E0822F0E94EE7020E0B2
:10B2300040E15EE066E0822F0E94EE708DE290E0D9
:10B240000E9438BC20E0AC0167E08CE00E942F71C6
:10B250000E94F14982E00E94B25780E20E94423887
:10B260008823D9F380EF0E9442388091D42F813017
:10B2700011F486E001C085E00E94B2570E94BC48EC
:10B2800008950E94AA6B80E490E00E9438BC22E0FE
:10B29000AC0160E0862F0E942F7186E490E00E944E
:10B2A00038BC20E0AC0161E0822F0E942F7187E45E
:10B2B00090E00E9438BC20E0AC0163E0822F0E9445
:10B2C0002F7183E490E00E9438BC20E0AC0164E080
:10B2D000822F0E942F7189E490E00E9438BC20E008
:10B2E000AC0165E0822F0E942F718DE290E00E94F8
:10B2F00038BC20E0AC0167E08CE00E942F7182E056
:10B300000E94B2570E94A97B80E20E9442388823A3
:10B31000C9F380EF0E9442388091D42F813011F41C
:10B3200086E001C085E00E94B25708950E94AA6B92
:10B3300080E490E00E9438BC22E0AC0160E0862FFF
:10B340000E942F7188E490E00E9438BC22E0AC019A
:10B3500061E080E00E942F7187E490E00E9438BC99
:10B3600020E0AC0163E0822F0E942F7185E490E021
:10B370000E9438BC20E0AC0164E0822F0E942F7153
:10B3800089E490E00E9438BC20E0AC0165E0822FA7
:10B390000E942F718DE290E00E9438BC20E0AC0149
:10B3A00067E08CE00E942F7180E00E94B2570E94FB
:10B3B000A97B80E20E9442388823C9F380EF0E9473
:10B3C00042388091D42F813011F486E001C085E0AD
:10B3D0000E94B25708950E94AA6B8AE490E00E94EE
:10B3E00038BC22E0AC0160E0862F0E942F7188E417
:10B3F00090E00E9438BC22E0AC0161E080E00E9455
:10B400002F7187E490E00E9438BC20E0AC0163E03B
:10B41000822F0E942F7120E046E25EE064E0822FDE
:10B420000E94EE7020E04CE35EE065E0822F0E9417
:10B43000EE708BE490E00E9438BC20E0AC0166E046
:10B44000822F0E942F718DE290E00E9438BC20E094
:10B45000AC0167E08CE00E942F7180E00E94B2573F
:10B460005E9880E20E9442388823D9F380EF0E94E0
:10B4700042385E9A8091D42F813011F486E001C069
:10B4800085E00E94B2570895EF920F93CF93DF9318
:10B49000CDB7DEB721970FB6F894DEBF0FBECDBF94
:10B4A00080919E2AE82FFF27E550F24D8081898305
:10B4B00000E00E94AA6B202F42E55EE063E0802F4F
:10B4C0000E94EE70202F4AE55EE064E0802F0E942B
:10B4D000EE7081E48093A02A20ED37E084EF91E0C4
:10B4E0000197F1F721503040C9F710929F2B84E16A
:10B4F00090E09093512E8093502E8981803208F0F5
:10B50000A8C081E090E09F938F93CE0101969F9316
:10B510008F9381E08F931F9281E68F930E94404129
:10B520008DB79EB707960FB6F8949EBF0FBE8DBF1E
:10B5300080919F2B882331F48091502E9091512E31
:10B54000892BB1F78091502E9091512E892B09F4BF
:10B5500063C00E949242E0919C2BF0919D2B9981B7
:10B560008081981709F046C0892F9927EE240E2D67
:10B5700022E030E0AC0164E08EE00E9434778091FC
:10B580009E2A482F552760919C2B70919D2BDB01A3
:10B590008D91282F332780E292E0489FF001499F48
:10B5A000F00D589FF00D1124AF01F90184E0EE0F6A
:10B5B000FF1F8A95E1F7E20FF31FE40FF51FEA5F23
:10B5C000FE4C80E10D9001928A95E1F7FB018081AC
:10B5D0009927FC0124E0EE0FFF1F2A95E1F7E80F01
:10B5E000F91FE40FF51FEA5EFE4CE08289818F5F50
:10B5F000898309C028EE33E084EF91E00197F1F7E9
:10B6000021503040C9F784E190E09093512E80930F
:10B61000502E10929F2B71CF0F5F84E190E090939A
:10B62000512E8093502E023308F467CF20E049E674
:10B630005EE062E0822F0E94EE7084E690E09093DC
:10B64000512E8093502E8091502E9091512E892B07
:10B65000D1F780919E2AE82FFF27E550F24D89818E
:10B66000808321960FB6F894DEBF0FBECDBFDF9169
:10B67000CF910F91EF900895AF92BF92CF92DF924A
:10B68000EF92FF920F931F93CF93DF93CDB7DEB767
:10B6900021970FB6F894DEBF0FBECDBF10E0D12EBC
:10B6A0000E94AA6B08ECE02EF12CF092512EE09251
:10B6B000502E80919E2AE82FFF27E550F24D808181
:10B6C000803210F40E94445A8091502E9091512E55
:10B6D000892B09F480C284E48093A02A10939F2BC5
:10B6E000F092512EE092502E8AE0898381E090E022
:10B6F0009F938F93CE0101969F938F9381E08F93B9
:10B700001F9384E68F930E9440418CE291E09093D6
:10B71000532E8093522E4DB75EB7495F5F4F0FB6E1
:10B72000F8945EBF0FBE4DBFEE24FF2480919E2A89
:10B73000282F332780E292E0289FA001299F500DF7
:10B74000389F500D1124CA018E0D9F1D8A5F9E4C9B
:10B7500020E0AC01612F822F0E94B5701F5F81E154
:10B7600090E0E80EF91E173008F380919F2B882394
:10B7700009F4A0C00E949242A0909C2BB0909D2BF7
:10B7800083E090E00E9438BC20E0AC0167E0822FAB
:10B790000E942F718D2D8F5F482F67E085E00E94FA
:10B7A0002C7780919E2A99278130910569F0029724
:10B7B000B1F420E048E75EE067E083E00E94EE70CD
:10B7C00020E04BE75EE00EC020E04EE75EE067E081
:10B7D00083E00E94EE7020E041E85EE003C020E0DC
:10B7E00044E85EE067E083E10E94EE7010E0412FE4
:10B7F00055272D2D3327F901B3E0EE0FFF1FBA9522
:10B80000E1F7E21BF30BE40FF51FEE0FFF1FEA0D4C
:10B81000FB1D8281938168ED813F960714F476E0E9
:10B8200014C06CEF893196077CF06FEF8D39960765
:10B830004CF063E0873E960714F473E006C08F5027
:10B84000974214F474E001C075E0872F9927F9013D
:10B85000A3E0EE0FFF1FAA95E1F7E21BF30BE40F45
:10B86000F51FEE0FFF1FEA0DFB1DEE240E2D9C01B0
:10B8700042815381612F85E1871B0E94AE7784E06E
:10B88000D81661F4143050F01D2D45E1612F80E091
:10B890000E944C711F5F1730C0F317E01F5F173015
:10B8A00008F4A5CF88EC90E09093512E8093502E11
:10B8B00010929F2B8091522E9091532E892B01F53F
:10B8C0008AE0898381E090E09F938F93CE01019677
:10B8D0009F938F9381E08F931F9284E68F930E94B2
:10B8E00040418CE291E09093532E8093522E4DB7BD
:10B8F0005EB7495F5F4F0FB6F8945EBF0FBE4DBF96
:10B9000080E80E944238182F882309F43FC0DA9457
:10B9100054E05D1508F4D52E0E94AA6B10E08091CA
:10B920009E2A282F332780E292E0289FA001299F9A
:10B93000500D389F500D112487E0D89E900111249E
:10B94000210F311DC90174E0880F991F7A95E1F725
:10B95000820F931F480F591F4A5F5E4C20E0612FF2
:10B96000822F0E94B57064E0D61661F4143050F056
:10B970001D2D45E1612F80E00E944C711F5F173043
:10B98000C0F317E01F5F173050F242C080E40E94FE
:10B9900042388823E9F1D39484E08D1508F4D12E40
:10B9A0000E94AA6B80919E2A282F332780E292E082
:10B9B000289FA001299F500D389F500D112487E02A
:10B9C000D89E90011124210F311DC90164E0880F18
:10B9D000991F6A95E1F7820F931F480F591F4A5F1D
:10B9E0005E4C20E0612F822F0E94B57094E0D91642
:10B9F00061F4143050F01D2D45E1612F80E00E946C
:10BA00004C711F5F1730C0F317E01F5F173050F203
:10BA100010919F2A113009F095C080E10E944238B0
:10BA2000882309F48FC0198281E090E09F938F935F
:10BA30006E01C80ED91EDF92CF921F931F9284E62B
:10BA40008F930E9440414DB75EB7495F5F4F0FB67D
:10BA5000F8945EBF0FBE4DBF20ED37E084EF91E05C
:10BA60000197F1F721503040C9F780919E2A81302B
:10BA700019F40E942A4302C00E94FC4288EC90E024
:10BA80009093512E8093502E90EDE92E97E0F92E51
:10BA900084EF91E00197F1F70894E108F108E114CF
:10BAA000F104B1F780919E2AE82FFF27E550F24D6F
:10BAB0008081803210F40E94445A84E48093A02A4A
:10BAC00010929F2B88EC90E09093512E8093502EF3
:10BAD0008AE0898381E090E09F938F93DF92CF92F9
:10BAE00081E08F931F9284E68F930E9440410E94D1
:10BAF000AA6B10E0D12E8DB79EB707960FB6F894BB
:10BB00009EBF0FBE8DBF80919E2A282F332780E2D3
:10BB100092E0289FA001299F500D389F500D1124BD
:10BB2000CA018E0D9F1D8A5F9E4C20E0AC01612FE3
:10BB3000822F0E94B5701F5F81E190E0E80EF91E30
:10BB4000173008F380E20E944238882339F480914C
:10BB5000502E9091512E892B09F007CE80EF0E9434
:10BB60004238198281E090E09F938F93CE01019635
:10BB70009F938F9381E08F931F9284E68F930E940F
:10BB800040411092A02A10929F2B4DB75EB7495F9B
:10BB90005F4F0FB6F8945EBF0FBE4DBF8091502E21
:10BBA0009091512E892BA9F40E94AA6B20E046E8BF
:10BBB0005EE062E0822F0E94EE7084E690E0909357
:10BBC000512E8093502E8091502E9091512E892B82
:10BBD000D1F70E94FC4221960FB6F894DEBF0FBE4B
:10BBE000CDBFDF91CF911F910F91FF90EF90DF902C
:10BBF000CF90BF90AF9008950F931F93CF93DF9393
:10BC0000CDB7DEB721970FB6F894DEBF0FBECDBF1C
:10BC100000E088E48093A02A0E94AA6B83E090E071
:10BC20000E9438BC202FAC0167E0802F0E942F714A
:10BC300080919E2A813059F422E045E95EE0602F30
:10BC4000802F0E94EE70202F4BEA5EE018C02091FA
:10BC50009F2A223051F44EEA5EE0602F802F0E942E
:10BC6000EE70202F44EC5EE00AC022E047EC5EE07C
:10BC7000602F802F0E94EE70202F4DED5EE067E078
:10BC800083E10E94EE7010929F2B84EF91E09093DD
:10BC9000512E8093502E8CEF898381E090E09F930A
:10BCA0008F93CE0101969F938F9381E08F931F9284
:10BCB00088E68F930E9440418FEF89838DB79EB7AE
:10BCC00007960FB6F8949EBF0FBE8DBF24EC39E0E7
:10BCD00084EF91E00197F1F721503040C9F780914E
:10BCE0009F2B882309F440C00E94924201E01091EA
:10BCF0009F2A112349F58091C22E815680939F2A55
:10BD0000801789F422E040EE5EE0612F812F0E94CF
:10BD1000EE70212F46EF5EE067E083E10E94EE7057
:10BD200000939E2A11C022E049EF5EE0612F812F2F
:10BD30000E94EE70212F4FE05FE067E083E10E94F8
:10BD4000EE7082E080939E2A1092142F44EC5EE203
:10BD500062E080E00E94807010929F2B84EF91E05F
:10BD60009093512E8093502E80E80E944238882371
:10BD700031F462E080E80E948638882311F08EEF6B
:10BD800039C080E40E944238882339F462E080E4BC
:10BD90000E948638182F882311F08DEF2BC08091D8
:10BDA0009F2A813041F580E10E944238882319F1B1
:10BDB00080919E2A813069F40E942A4322E042E168
:10BDC0005FE0612F812F0E94EE70212F48E25FE03B
:10BDD0000CC00E94FC4222E04BE25FE0612F812F09
:10BDE0000E94EE70212F41E45FE067E083E10E9452
:10BDF000EE708CEF898380E20E944238882339F408
:10BE00008091502E9091512E892B09F046CF80EFD2
:10BE10000E9442381092A02A10929F2B8091502E9F
:10BE20009091512E892BB9F4002311F00E94AA6B36
:10BE300020E044E45FE062E0822F0E94EE7084E63E
:10BE400090E09093512E8093502E8091502E90919F
:10BE5000512E892BD1F70E94FC4221960FB6F894FF
:10BE6000DEBF0FBECDBFDF91CF911F910F9108951F
:10BE7000F999FECF92BD81BDF89A80B599270895B2
:10BE8000F999FECF1FBA92BD81BD60BD0FB6F8947F
:10BE9000FA9AF99A0FBE089581E08093C9372091EC
:10BEA000C937F999FECF1FBA81E290E092BD81BDFA
:10BEB00020BD0FB6F894FA9AF99A0FBE089581E062
:10BEC0008093C8372091C837F999FECF1FBA80E216
:10BED00090E092BD81BD20BD0FB6F894FA9AF99A10
:10BEE0000FBE089581E08093AC372091AC37F9996B
:10BEF000FECF1FBA82E290E092BD81BD20BD0FB699
:10BF0000F894FA9AF99A0FBE08951092AC372091DE
:10BF1000AC37F999FECF1FBA82E290E092BD81BDA5
:10BF200020BD0FB6F894FA9AF99A0FBE089568E307
:10BF30007FE585E090E00E94D7C2DC01CB018093D1
:10BF4000693790936A37A0936B37B0936C3768E387
:10BF50007FE581E090E00E94D7C2DC01CB018093B5
:10BF6000CD379093CE37A093CF37B093D037089585
:10BF7000EF92FF920F931F93DC01CB0179018A01AD
:10BF800020E43FE5AC01BD0185E090E00E9438C3AC
:10BF900020E43FE5B801A70181E090E00E9438C3AA
:10BFA0001F910F91FF90EF90089520914E2EF999D7
:10BFB000FECF1FBA83E390E092BD81BD20BD0FB6D6
:10BFC000F894FA9AF99A0FBE20910938F999FECFA0
:10BFD0001FBA82E390E092BD81BD20BD0FB6F894F8
:10BFE000FA9AF99A0FBE2091CA37F999FECF1FBA73
:10BFF00081E390E092BD81BD20BD0FB6F894FA9A1E
:10C00000F99A0FBE2091D937F999FECF1FBA80E374
:10C0100090E092BD81BD20BD0FB6F894FA9AF99ACE
:10C020000FBE2091AA37F999FECF1FBA8FE290E098
:10C0300092BD81BD20BD0FB6F894FA9AF99A0FBE51
:10C040002091D137F999FECF1FBA8EE290E092BDD0
:10C0500081BD20BD0FB6F894FA9AF99A0FBE2091CF
:10C06000A537F999FECF1FBA8DE290E092BD81BD50
:10C0700020BD0FB6F894FA9AF99A0FBE2091AB370B
:10C08000F999FECF1FBA8CE290E092BD81BD20BD30
:10C090000FB6F894FA9AF99A0FBE20916D37F99974
:10C0A000FECF1FBA8BE290E092BD81BD20BD0FB6DE
:10C0B000F894FA9AF99A0FBE20917337F999FECF46
:10C0C0001FBA8AE290E092BD81BD20BD0FB6F89400
:10C0D000FA9AF99A0FBE20910738F999FECF1FBA44
:10C0E00089E290E092BD81BD20BD0FB6F894FA9A26
:10C0F000F99A0FBE20918037F999FECF1FBA88E2D6
:10C1000090E092BD81BD20BD0FB6F894FA9AF99ADD
:10C110000FBE2091D52FF999FECF1FBA87E290E08C
:10C1200092BD81BD20BD0FB6F894FA9AF99A0FBE60
:10C130002091D42FF999FECF1FBA86E290E092BDEC
:10C1400081BD20BD0FB6F894FA9AF99A0FBE2091DE
:10C15000D337F999FECF1FBA85E290E092BD81BD39
:10C1600020BD0FB6F894FA9AF99A0FBE2091AD3718
:10C17000F999FECF1FBA84E290E092BD81BD20BD47
:10C180000FB6F894FA9AF99A0FBE2091A937F99947
:10C19000FECF1FBA83E290E092BD81BD20BD0FB6F5
:10C1A000F894FA9AF99A0FBE2091C937F999FECFFF
:10C1B0001FBA81E290E092BD81BD20BD0FB6F89418
:10C1C000FA9AF99A0FBE2091C837F999FECF1FBA93
:10C1D00080E290E092BD81BD20BD0FB6F894FA9A3E
:10C1E000F99A0FBE2091AC37F999FECF1FBA82E2BF
:10C1F00090E092BD81BD20BD0FB6F894FA9AF99AED
:10C200000FBE2091C737F999FECF1FBA8FE190E09A
:10C2100092BD81BD20BD0FB6F894FA9AF99A0FBE6F
:10C2200020918137F999FECF1FBA8EE190E092BD3F
:10C2300081BD20BD0FB6F894FA9AF99A0FBE80918D
:10C240006F379091703740E45FE5BC018CE190E07E
:10C250000E945FC320916E37F999FECF1FBA8BE120
:10C2600090E092BD81BD20BD0FB6F894FA9AF99A7C
:10C270000FBE2091A837F999FECF1FBA8AE190E04E
:10C2800092BD81BD20BD0FB6F894FA9AF99A0FBEFF
:10C290002091A637F999FECF1FBA89E190E092BDAF
:10C2A00081BD20BD0FB6F894FA9AF99A0FBE20917D
:10C2B000A737F999FECF1FBA88E190E092BD81BD02
:10C2C00020BD0FB6F894FA9AF99A0FBE209108385B
:10C2D000F999FECF1FBA87E190E092BD81BD20BDE4
:10C2E0000FB6F894FA9AF99A0FBE2091CC37F999C3
:10C2F000FECF1FBA86E190E092BD81BD20BD0FB692
:10C30000F894FA9AF99A0FBE20917437F999FECFF2
:10C310001FBA85E190E092BD81BD20BD0FB6F894B3
:10C32000FA9AF99A0FBE2091C337F999FECF1FBA36
:10C3300084E190E092BD81BD20BD0FB6F894FA9AD9
:10C34000F99A0FBE809167379091683740E45FE5B6
:10C35000BC0182E190E00E945FC320916637F999A9
:10C36000FECF1FBA81E190E092BD81BD20BD0FB626
:10C37000F894FA9AF99A0FBE2091C437F999FECF32
:10C380001FBA80E190E092BD81BD20BD0FB6F89448
:10C39000FA9AF99A0FBE2091D237F999FECF1FBAB7
:10C3A0008FE090E092BD81BD20BD0FB6F894FA9A5F
:10C3B000F99A0FBE80910A3890910B3840E45FE5FE
:10C3C000BC018DE090E00E945FC380917137909135
:10C3D000723740E45FE5BC018BE090E00E945FC3F0
:10C3E0008091C5379091C63740E45FE5BC0189E094
:10C3F00090E00E945FC320E43FE544E050E064ED3C
:10C4000077E384E390E00E9416C320E43FE54AE02E
:10C4100050E065E777E389E390E00E9416C320E4EB
:10C420003FE544E150E06EEA77E384E490E00E9467
:10C4300016C320E43FE54EE050E06AED77E388E57F
:10C4400090E00E9416C32091CB37F999FECF1FBA16
:10C4500086E690E092BD81BD20BD0FB6F894FA9AB1
:10C46000F99A0FBE2091C237F999FECF1FBA87E61D
:10C4700090E092BD81BD20BD0FB6F894FA9AF99A6A
:10C480000FBE08950E94AA6B22E048E55FE060E0DD
:10C49000862F0E94EE7020E04EE65FE061E0822F82
:10C4A0000E94EE7020E049E75FE062E0822F0E9488
:10C4B000EE7089E880934E2E1092093891E09093A7
:10C4C000CA379093D93782E48093AA379093D137B3
:10C4D00080E18093A53780E48093AB3710926D376D
:10C4E0001092733784E18093073884E68093803715
:10C4F0001092D52F1092D42F1092D3379093AD373E
:10C500009093A9371092C9371092C8379093AC37DF
:10C510001092C7379093813790936E379093A837D6
:10C520001092A6379093A7371092083888E280932C
:10C53000CC37909374379093C33780E197E2909310
:10C54000683780936737109266371092C43784E05B
:10C550008093D23780E797E19093703780936F375D
:10C5600084EF91E090930B3880930A388EE190E04D
:10C57000909372378093713785E090E09093C6373F
:10C580008093C53788E292EDA1E4B5E080936937E6
:10C5900090936A37A0936B37B0936C378EE491EB2E
:10C5A000ADE1BFE18093CD379093CE37A093CF37E5
:10C5B000B093D0378091693790916A37A0916B37EB
:10C5C000B0916C3720E43FE5AC01BD0185E090E01F
:10C5D0000E9438C38091CD379091CE37A091CF374C
:10C5E000B091D03720E43FE5AC01BD0181E090E09F
:10C5F0000E9438C36FE87FE084ED97E30E9435C264
:10C6000020E43FE544E050E064ED77E384E390E02C
:10C610000E9416C364E97FE085E797E30E9435C274
:10C6200020E43FE54AE050E065E777E389E390E006
:10C630000E9416C3EEEAF7E383E11192815087FF6F
:10C64000FCCF90E3EAEDF7E38DE09193815087FF13
:10C65000FCCF1092CB371092C2372091C937F9998D
:10C66000FECF1FBA81E290E092BD81BD20BD0FB622
:10C67000F894FA9AF99A0FBE2091C837F999FECF2B
:10C680001FBA80E290E092BD81BD20BD0FB6F89444
:10C69000FA9AF99A0FBEF999FECF1FBA80E090E09E
:10C6A00092BD81BD80E780BD0FB6F894FA9AF99AE1
:10C6B0000FBE0E94D55F20E04FE95FE066E0822F69
:10C6C0000E94EE7020E044EB5FE067E082E10E94B0
:10C6D000EE7040E060E870E088EC90E00E942A365E
:10C6E00080E10E944D388823D9F30895F999FECF4F
:10C6F00080E090E092BD81BDF89A80B5803709F066
:10C7000003C2F999FECF83E390E092BD81BDF89A10
:10C7100080B580934E2EF999FECF82E390E092BDD2
:10C7200081BDF89A80B5992780930938F999FECF91
:10C7300081E390E092BD81BDF89A80B599278093FE
:10C74000CA37F999FECF80E390E092BD81BDF89A97
:10C7500080B599278093D937F999FECF8FE290E081
:10C7600092BD81BDF89A80B599278093AA37F9992F
:10C77000FECF8EE290E092BD81BDF89A80B59927F8
:10C780008093D137F999FECF8DE290E092BD81BDC3
:10C79000F89A80B599278093A537F999FECF8CE256
:10C7A00090E092BD81BDF89A80B599278093AB3710
:10C7B000F999FECF8BE290E092BD81BDF89A80B5E9
:10C7C000992780936D37F999FECF8AE290E092BD68
:10C7D00081BDF89A80B5992780937337F999FECF78
:10C7E00089E290E092BD81BDF89A80B59927809347
:10C7F0000738F999FECF88E290E092BD81BDF89AA2
:10C8000080B5992780938037F999FECF87E290E031
:10C8100092BD81BDF89A80B599278093D52FF9995B
:10C82000FECF86E290E092BD81BDF89A80B599274F
:10C830008093D42FF999FECF85E290E092BD81BD1F
:10C84000F89A80B599278093D337F999FECF84E27F
:10C8500090E092BD81BDF89A80B599278093AD375D
:10C86000F999FECF83E290E092BD81BDF89A80B540
:10C8700099278093A937F999FECF81E290E092BD84
:10C8800081BDF89A80B599278093C937F999FECF71
:10C8900080E290E092BD81BDF89A80B5992780939F
:10C8A000C837F999FECF82E290E092BD81BDF89A37
:10C8B00080B599278093AC37F999FECF8FE190E04E
:10C8C00092BD81BDF89A80B599278093C737F999B1
:10C8D000FECF8EE190E092BD81BDF89A80B5992798
:10C8E0008093813768E37FE58CE190E00E94FEC28F
:10C8F0009093703780936F37F999FECF8BE190E07A
:10C9000092BD81BDF89A80B5992780936E37F999C9
:10C91000FECF8AE190E092BD81BDF89A80B599275B
:10C920008093A837F999FECF89E190E092BD81BD4F
:10C93000F89A80B599278093A637F999FECF88E1B8
:10C9400090E092BD81BDF89A80B599278093A73772
:10C95000F999FECF87E190E092BD81BDF89A80B54C
:10C96000992780930838F999FECF86E190E092BD2F
:10C9700081BDF89A80B599278093CC37F999FECF7D
:10C9800085E190E092BD81BDF89A80B599278093AA
:10C990007437F999FECF84E190E092BD81BDF89A99
:10C9A00080B599278093C33768E37FE582E190E003
:10C9B0000E94FEC29093683780936737F999FECF43
:10C9C00081E190E092BD81BDF89A80B5992780936E
:10C9D0006637F999FECF80E190E092BD81BDF89A6B
:10C9E00080B599278093C437F999FECF8FE090E006
:10C9F00092BD81BDF89A80B599278093D23768E3BC
:10CA00007FE58DE090E00E94FEC290930B3880930A
:10CA10000A3868E37FE58BE090E00E94FEC29093C5
:10CA200072378093713768E37FE589E090E00E9478
:10CA3000FEC29093C6378093C5378091D2378093DA
:10CA4000EA2B8091D2378093E92B28E33FE544E03D
:10CA500050E064E370E084ED97E30E94B2C228E303
:10CA60003FE54AE050E069E370E085E797E30E9424
:10CA7000B2C228E33FE544E150E064E470E08EEAAE
:10CA800097E30E94B2C228E33FE54EE050E068E53C
:10CA900070E08AED97E30E94B2C2F999FECF86E674
:10CAA00090E092BD81BDF89A80B599278093CB37ED
:10CAB000F999FECF87E690E092BD81BDF89A80B5E6
:10CAC00099278093C23768E37FE585E090E00E9474
:10CAD000D7C2DC01CB018093693790936A37A0936A
:10CAE0006B37B0936C3768E37FE581E090E00E949C
:10CAF000D7C2DC01CB018093CD379093CE37A09382
:10CB0000CF37B093D03708950E94426208950F93B3
:10CB10001F93CF931092ED371092EE371092EF37AC
:10CB20001092F0371092E9371092EA371092EB37F3
:10CB30001092EC371092F1371092F2371092F337CF
:10CB40001092F43789E691E09093F7378093F637A7
:10CB5000E2E8F7E3CEE11282C1503196C7FFFBCF86
:10CB6000C0E060E087EB9FE00E94BE708FE1C89F4D
:10CB7000C0011124895E9E4FF999FECF1FBA92BD64
:10CB800081BDC0BD0FB6F894FA9AF99A0FBE8FE135
:10CB9000C89FC00111248C5D9E4FF999FECF1FBA2A
:10CBA00092BD81BD10BC0FB6F894FA9AF99A0FBEE7
:10CBB0008FE1C89F8001112420E43FE544E050E06C
:10CBC0006DEE77E3C801845E9E4F0E9416C320E499
:10CBD0003FE544E050E069EE77E3C801885E9E4F90
:10CBE0000E9416C320E43FE544E050E061EF77E3A4
:10CBF000C801805E9E4F0E9416C320E43FE542E0DC
:10CC000050E066EF77E3C8018B5D9E4F0E9416C32C
:10CC1000C801895D9E4FF999FECF1FBA92BD81BDB3
:10CC200010BC0FB6F894FA9AF99A0FBE8FE1C89F1C
:10CC3000C0011124885D9E4FF999FECF1FBA92BDA5
:10CC400081BD10BC0FB6F894FA9AF99A0FBE8FE125
:10CC5000C89FC0011124855D9E4FF999FECF1FBA70
:10CC600092BD81BD8FEF80BD0FB6F894FA9AF99A04
:10CC70000FBE8FE1C89FC0011124875D9E4FF999B7
:10CC8000FECF1FBA92BD81BD10BC0FB6F894FA9AC0
:10CC9000F99A0FBE8FE1C89FC0011124835D9E4F9A
:10CCA000F999FECF1FBA92BD81BD10BC0FB6F894A2
:10CCB000FA9AF99A0FBECF5FC73308F452CFC0E09B
:10CCC00060E089EB9FE00E94BE7083E2C89FC001D4
:10CCD000112488599F4FF999FECF1FBA92BD81BD8B
:10CCE000C0BD0FB6F894FA9AF99A0FBE83E2C89FB6
:10CCF000C001112487599F4FF999FECF1FBA92BDE9
:10CD000081BD10BC0FB6F894FA9AF99A0FBE83E26F
:10CD1000C89FC001112486579F4FF999FECF1FBAB3
:10CD200092BD81BD10BC0FB6F894FA9AF99A0FBE65
:10CD300083E2C89FC001112487579F4FF999FECF06
:10CD40001FBA92BD81BD10BC0FB6F894FA9AF99A39
:10CD50000FBE83E2C89FC001112420E43FE54FE1EC
:10CD600050E064E877E386599F4F0E9416C3CF5F77
:10CD7000C53008F4A5CFC0E06C2F8BEB9FE00E947C
:10CD8000BE70CF911F910F910895DC0190E08C91BE
:10CD9000882341F09F5F9F3F29F0FD01E90FF11DBE
:10CDA0008081F6CF0895FC018491882329F0319683
:10CDB000849131968823E1F70895FC0155834483DB
:10CDC0007783668313821282118210820895FC0198
:10CDD000808191810895FC0120E030E08081918183
:10CDE000892B11F421E030E0C9010895FC0140E0F5
:10CDF00050E024813581808191812817390711F411
:10CE000041E050E0CA0108950F931F93CF93DF9341
:10CE1000EC018B010E94EB66882319F080E090E022
:10CE20001AC0EE81FF818A819B81E80FF91F808102
:10CE3000F80180838A819B812C813D810196B90113
:10CE40000E94CEC69B838A838881998101979983AA
:10CE5000888381E090E0DF91CF911F910F91089539
:10CE60001F93CF93DF93EC01162F0E94F666882361
:10CE700019F080E090E017C04A815B818881998138
:10CE80002C813D81840F951FB9010E94CEC6EE8191
:10CE9000FF81E80FF91F108388819981019699839A
:10CEA000888381E090E0DF91CF911F910895FC018C
:10CEB000118210821382128281E090E008956F92B5
:10CEC0007F928F929F92AF92BF92CF92DF92EF921A
:10CED000FF920F931F93CF93DF93EC01FB014A0165
:10CEE000AA24BB248491882371F1688079808B0106
:10CEF0007B016A01C614D704A0F4F70144918A812A
:10CF00009B818A0D9B1D2C813D81880D991DB90146
:10CF10000E94CEC6EE81FF81E80FF91F8081841741
:10CF200019F080E090E026C00894A11CB11C089480
:10CF3000C11CD11C0894E11CF11C0F5F1F4FF801AC
:10CF400084918823B9F68A819B818A0D9B1D2C814F
:10CF50003D81880D991DB9010E94CEC69B838A83AD
:10CF6000A80CB91C888199818A199B0999838883A7
:10CF700081E090E0DF91CF911F910F91FF90EF90B2
:10CF8000DF90CF90BF90AF909F908F907F906F90E9
:10CF90000895AF92BF92CF92DF92EF92FF920F93DC
:10CFA0001F93CF93DF937C01FB01CC24DD2484917C
:10CFB000882341F1D701AD90BC90EB018B01CA14DD
:10CFC000DB0498F4F8014491F70182819381248174
:10CFD00035818C0D9D1DB9010E94CEC6A681B781F9
:10CFE000A80FB91F8C91841719F080E090E00CC055
:10CFF0000894C11CD11C0F5F1F4F2196FE01849124
:10D000008823E9F681E090E0DF91CF911F910F91A5
:10D01000FF90EF90DF90CF90BF90AF90089540E0E9
:10D0200050E00E945F6799270895EF92FF920F9357
:10D030001F93CF93DF93EC017B0100E010E0888128
:10D0400099810817190768F4A801B701CE010E9459
:10D050005F67882319F081E090E005C00F5F1F4FE4
:10D06000EECF80E090E0DF91CF911F910F91FF9084
:10D07000EF9008959091032E980F9093032E809136
:10D08000022E890F8093022E0895FC0180818093E7
:10D090000839818180930939828180930A3983819B
:10D0A00080930B398091083990910939A0910A3900
:10D0B000B0910B39BC01CD010895AF92BF92CF92D0
:10D0C000DF92EF920F931F93CF9380E80E94423834
:10D0D000882329F48091FE2D823009F041C080918F
:10D0E000FE2D8130D1F10E94AA6B20E04EEB52E17F
:10D0F000622F822F0E94EE7020E04AEC52E161E044
:10D10000822F0E94EE7020E046ED52E162E0822F15
:10D110000E94EE7020E042EE52E163E0822F0E9416
:10D12000EE7020E04EEE52E164E0822F0E94EE703D
:10D1300020E04AEF52E165E0822F0E94EE7020E08D
:10D1400046E053E166E0822F0E94EE7020E042E16B
:10D1500053E167E0822F0E94EE7081E08093FE2D04
:10D160008091012E813009F067C08091002E8033BC
:10D1700009F062C06091FE2D662309F05DC0A090A9
:10D180001038C62F6A1508F057C08CE0C82E88E307
:10D19000D82EC03108F050C0C83010F01BE001C0DC
:10D1A00010E0F60181859927EE240E2D23E030E072
:10D1B000AC016C2F812F0E943477F601848599276A
:10D1C00022E030E0AC016C2F812F8C5F0E9434771D
:10D1D000F6018285282F3327C90183709070039749
:10D1E00021F42E2D4EE153E105C020FF07C020E0C1
:10D1F00040E253E16C2F812F895F14C0F6019385C3
:10D20000953020F020E042E253E1F4CF812F895F96
:10D21000923020F020E044E253E103C020E046E2F7
:10D2200053E16C2F0E94EE70CF5F8CE090E0C80E4F
:10D23000D91ECA1508F4ADCF8091FE2D813009F0BA
:10D240008BC18091012E813009F08AC08091002E1F
:10D25000863009F085C08091163899278230910573
:10D2600049F08230910554F0059744F420E048E2FB
:10D2700053E107C020E04BE253E103C020E04EE25F
:10D2800053E1622F8BE00E94EE708091173899274E
:10D2900083709070039721F420E041E353E103C0D1
:10D2A00020E043E353E1622F81E10E94EE70809120
:10D2B000173880FF04C020E045E353E103C020E0BD
:10D2C00048E353E1622F8EE00E94EE7080913B387C
:10D2D0009927EE240E2D22E030E0AC0161E08BE0D6
:10D2E0000E94347784E298E30E944568DC01CB0118
:10D2F00025E030E0AC0162E08BE00E9434772E2D17
:10D300004BE353E162E081E10E94EE7020913838F6
:10D31000909139388FEF989F60011124C20ED11C73
:10D32000C60164E670E00E94CEC622E030E0AB01A8
:10D3300063E08BE00E9434772E2D4EE353E163E0EF
:10D340008DE00E94EE70C60164E670E00E94CEC6D9
:10D3500001E022E030E0AC0163E08EE00E9434772F
:10D360008091012E813071F58091002E823151F52E
:10D3700080E298E30E944568DC01CB01BC01CD014D
:10D3800020E13EE040E050E00E94A3C6DC01CB017A
:10D39000BC01CD0120EA36E841E050E00E94F5C62C
:10D3A000DA01C901EE240E2D23E030E0AC0164E087
:10D3B0008BE00E9434772E2D40E453E164E08FE04F
:10D3C0000E94EE70C091012EC13009F0C5C080915D
:10D3D000002E823009F0C0C080E198E30E944568C9
:10D3E0005B016C0120E836E948E950E00E94F5C68F
:10D3F000DA01C901EE240E2D22E030E0AC0165E037
:10D400008AE00E9434772E2D45E453E165E08CE0FC
:10D410000E94EE70C601B50128EE33E040E050E016
:10D420000E94F5C6CA01B90120E137E240E050E0B0
:10D430000E94F5C6DC01CB010C2F24E030E0AC01EA
:10D4400065E08DE00E943477C601B5012AE030E046
:10D4500040E050E00E94F5C6CA01B90124E630E080
:10D4600040E050E00E94F5C6DC01CB0122E030E054
:10D47000AC0165E081E10E94347784E198E30E9489
:10D4800045685B016C0120E836E948E950E00E94FC
:10D49000F5C6DA01C9010E2D22E030E0AC0166E0EC
:10D4A0008AE00E9434772E2D47E453E166E08CE059
:10D4B0000E94EE70C601B50128EE33E040E050E076
:10D4C0000E94F5C6CA01B90120E137E240E050E010
:10D4D0000E94F5C6DC01CB010C2F24E030E0AC014A
:10D4E00066E08DE00E943477C601B5012AE030E0A5
:10D4F00040E050E00E94F5C6CA01B90124E630E0E0
:10D5000040E050E00E94F5C6DC01CB0122E030E0B3
:10D51000AC0166E081E10E9434778CE198E30E94DF
:10D520004568DC01CB01BC01CD0128EE33E040E0D1
:10D5300050E00E94F5C6DA01C9010E2D24E030E06A
:10D54000AC0167E08BE00E9434772E2D49E453E173
:10D5500067E080E10E94EE70CF911F910F91EF90F4
:10D56000DF90CF90BF90AF900895FF920F931F93DD
:10D57000CF93DF93CDB7DEB721970FB6F894DEBF18
:10D580000FBECDBF0E94AA6B82E08093FE2D8091DA
:10D590009F2A8230A1F420E04BE453E163E0822F24
:10D5A0000E94EE7084E690E09093512E8093502E6E
:10D5B0008091502E9091512E892BD1F7B1C080913E
:10D5C0009E2A813011F00E94FC420E94A14310E08B
:10D5D00088EC90E09093512E8093502E1983012F68
:10D5E000F12ECE0101960E94A340882309F487C042
:10D5F00088EC90E09093512E8093502E812F9927A4
:10D600008430910509F449C0853091057CF481305E
:10D61000910551F1823091051CF4892BB1F06FC056
:10D620008230910529F1039761F169C08630910537
:10D6300009F442C086309105BCF18730910509F4A8
:10D640004FC0089709F44FC05AC08981853B09F043
:10D6500056C01092FF2D1092002E1092012E1092A3
:10D66000032E1092022E3AC089818236B9F11FC072
:10D6700089818130E1F40E943A6889818093012E8A
:10D680002DC08981803331F0863021F0823111F054
:10D69000823069F48093002E0CC089818B3F38F46E
:10D6A0000E943A6809811AC08981882311F010E02C
:10D6B00026C00E943A6812C001508091FF2DE82FC9
:10D6C000FF27E45FF74C898180830E943A6880914C
:10D6D000FF2D8F5F8093FF2D002389F41F5F0FC004
:10D6E0001F5FF9800CC010E08091032EF81639F40A
:10D6F00099818091022E981711F40E945D6880E252
:10D700000E944238882339F48091502E9091512EF6
:10D71000892B09F066CF80EF0E9442380E94FC42BC
:10D7200021960FB6F894DEBF0FBECDBFDF91CF912B
:10D730001F910F91FF9008952C988EBD0DB407FE98
:10D74000FDCF2C9A08952C988EBD0DB407FEFDCF09
:10D750002C9A08950F931F93CF93DF938DE099E355
:10D76000FC01119201962DE38C309207D1F3C8F39E
:10D7700000E010E02B98802F80550E949C6B80E188
:10D780000E949C6B80916D370E949C6B2B9ACFE717
:10D79000D0E080E00E949C6B2197D7FFFACF0F5F0B
:10D7A0001F4F0830110530F31092903D1092913DBB
:10D7B000DF91CF911F910F91089588E893E1019730
:10D7C000F1F708950F931F93CF93DF938C01C0E07F
:10D7D000D0E0C817D90730F40E94DD6B2196C0173E
:10D7E000D107D0F3DF91CF911F910F910895CF937F
:10D7F000C82F1092903D1092913D8CE58CBD81E038
:10D800008DBD2C9A2A988AE090E00E94E26B2A9AB9
:10D810002C982B9880E40E949C6BC130A9F48091D5
:10D820006D37882329F481EA0E949C6B80EC04C048
:10D8300080EA0E949C6B88EC0E949C6B80917337FD
:10D84000882341F087EA07C081EA0E949C6B80EC44
:10D850000E949C6B86EA0E949C6B82EA0E949C6BF1
:10D860008FE20E949C6B88EF0E949C6B80E00E947C
:10D870009C6B87E20E949C6BC13031F481E80E946E
:10D880009C6B8091073804C081E80E949C6B86E104
:10D890000E949C6B8CEA0E949C6B80E00E949C6BB7
:10D8A0008FEA0E949C6BC130F1F4809180379927F8
:10D8B000AA2797FDA095BA2FBC01CD010E94CEC426
:10D8C000DC01CB0123E333E343E250E4BC01CD01AF
:10D8D0000E94BBC5DC01CB01BC01CD010E94A0C4EC
:10D8E000DC01CB0101C08FEF8093B3000E94AA6BD3
:10D8F000CF910895FF920F931F938C01F62E880FFE
:10D90000892F881F990B91952B9880550E949C6BAD
:10D91000102F1F7780916D37180F812F82958F7090
:10D92000805F0E949C6B812F8F700E949C6B2B9A52
:10D930008F2D0E949C6B1F910F91FF900895EF9285
:10D94000FF920F931F93CF93DF93C0E0D0E03DE8A9
:10D95000E32E39E3F32E870100581040F70181913F
:10D960007F01F801808361918F01CE010E947A6C62
:10D970002196F3E0C038DF0788F3C0E8D3E00DE874
:10D980001CE3F80111928F0160E0CE010E947A6CD5
:10D990002196F4E0C030DF07A0F3DF91CF911F9113
:10D9A0000F91FF90EF900895AF92BF92DF92EF92A8
:10D9B000FF920F931F93CF93DF93C82FDD27D69548
:10D9C000DC2FCC27D795C795D3708E015EE0A52EAE
:10D9D0005DE3B52EEE24FF244DE7D42EFE01E35F78
:10D9E000F64CEE0DFF1D8081D5018D935D016081A8
:10D9F000C8010E947A6CDA940894E11CF11C0F5F54
:10DA00001F4FD7FEEBCFDF91CF911F910F91FF906A
:10DA1000EF90DF90BF90AF900895AF92BF92DF92EA
:10DA2000EF92FF920F931F93CF93DF93C82FDD27C1
:10DA3000D695DC2FCC27D795C795D3708E01EEE015
:10DA4000AE2EEDE3BE2EEE24FF247DE7D72EFE01A1
:10DA5000E35FF64CEE0DFF1DD5018D915D018083D6
:10DA60006081C8010E947A6CDA940894E11CF11C70
:10DA70000F5F1F4FD7FEEBCFDF91CF911F910F911B
:10DA8000FF90EF90DF90BF90AF9008958091913D0F
:10DA90008F5F8093913D883028F00E949F6C87E0D3
:10DAA0008093913D0895982F87FD45C0603408F01C
:10DAB00042C0862F869586958695A82FBB27B6955A
:10DAC000BA2FAA27B795A795A90FB11D262F3327DF
:10DAD0002770307081E090E002C0880F991F2A956E
:10DAE000E2F7982FB37055274130510589F0423045
:10DAF00051051CF4452B29F017C04230510571F037
:10DB000013C0FD01E35FF64C9095808189230BC023
:10DB1000FD01E35FF64C8081892B05C0FD01E35FC9
:10DB2000F64C808189278083FD01E35FF64C60819C
:10DB3000CD010E947A6C08952F923F924F925F928E
:10DB40006F927F928F929F92AF92BF92CF92DF920D
:10DB5000EF92FF920F931F93CF93DF93CDB7DEB772
:10DB600023970FB6F894DEBF0FBECDBF0983A82E52
:10DB7000BB24C62EDD24642E77247301EA18FB082B
:10DB8000822E992484010C191D09F7FE04C07FEF31
:10DB9000272E372E09C01E141F0424F461E0262E00
:10DBA000312C02C02224332417FF04C05FEF452E1E
:10DBB000552E09C01016110624F441E0442E512CB4
:10DBC00002C044245524F7FE04C0F094E194F10807
:10DBD000F39417FF03C0109501951F4F49816C2DD9
:10DBE0008A2D0E94536D0E151F054CF5C701F7FCD9
:10DBF00001969595879522273327281B390B3B8360
:10DC00002A83A614B70409F441C08A819B81800F3E
:10DC1000911F9B838A83A20CB31C1816190634F437
:10DC2000C40CD51C8E199F099B838A8349816C2D56
:10DC30008A2D0E94536DA614B70439F727C0C80176
:10DC400017FD019695958795EE27FF27E81BF90BA1
:10DC5000FB83EA83C814D904C9F02A813B812E0DC5
:10DC60003F1D3B832A83C40CD51C1216130634F4C3
:10DC7000A20CB31C201B310B3B832A8349816C2DE2
:10DC80008A2D0E94536DC814D90439F723960FB614
:10DC9000F894DEBF0FBECDBFDF91CF911F910F91E2
:10DCA000FF90EF90DF90CF90BF90AF909F908F90BC
:10DCB0007F906F905F904F903F902F900895BF920C
:10DCC000CF92DF92EF92FF920F931F93CF93DF9348
:10DCD000182F822FB02E17FD1FE7603408F06FE376
:10DCE000212F240F312D311D6901262F3327790172
:10DCF000E80EF11C81E8C816D10418F0F0E8CF2E28
:10DD0000D12C81E4E816F10418F0E0E4EE2EF12CB9
:10DD1000E901E216F30658F00B2D2C2F4C2D6C2F39
:10DD2000812F0E949C6D2196EC16FD06A8F7DF91CD
:10DD3000CF911F910F91FF90EF90DF90CF90BF9008
:10DD40000895BF92CF92DF92EF92FF920F931F93AD
:10DD5000CF93DF93182FC62FD42EB22E82E0281730
:10DD600089F4862F992733E0880F991F3A95E1F7B8
:10DD700001E028E0422F682F812F880F880F880F3D
:10DD80000E945F6E8D2D99278F37910571F0803835
:10DD9000910524F48E37910529F00CC08F3D910533
:10DDA00039F008C02AE1D22E05C09BE1D92E02C06D
:10DDB00088EFD82EDD2704E0CC0FDD1F0A95E1F7B0
:10DDC000C10FD11D13E0CC0FDD1F1A95E1F7D37001
:10DDD0007E0100E010E0B7E0CB2EED2DFF27A3E0A1
:10DDE000EE0FFF1FAA95E1F7E00FF11FE259FB4A82
:10DDF00024918B2D992782309105E9F0833091058C
:10DE00002CF4009749F0019771F02CC083309105F4
:10DE1000D1F00497F1F026C0FE01E35FF64CE00F6D
:10DE2000F11F20831FC0FE01E35FF64CE00FF11FDE
:10DE30008081822B16C0FE01E35FF64CE00FF11FDC
:10DE4000808182270EC0FE01E35FF64CE00FF11FD8
:10DE500006C0FE01E35FF64CE00FF11F20958081C4
:10DE600082238083FE01E35FF64CE00FF11F6081A7
:10DE7000C7010E947A6CCA940F5F1F4F0894E11C7F
:10DE8000F11CC7FEAACFDF91CF911F910F91FF9098
:10DE9000EF90DF90CF90BF9008951F93CF93DF93C3
:10DEA000EC01162FFC018491882319F1FE014491A5
:10DEB000842F99278A309105A9F00D9719F41092B3
:10DEC000903D12C0212F6091913D8091903D0E9424
:10DED000A16E8091903D8F5F8093903D853120F0C1
:10DEE0001092903D0E94466D2196FE0184918823F8
:10DEF000E9F6DF91CF911F9108958093903D609353
:10DF0000913D622FCA010E944D6F0895BF92CF923A
:10DF1000DF92EF92FF920F931F93CF93DF93182F0F
:10DF2000C62FF42EE22E82E0281791F4862F99272F
:10DF300023E0880F991F2A95E1F701E027E045E0EB
:10DF4000682F86E0189F802D11240E945F6E0FC0FD
:10DF500083E0281711F420E004C084E0281739F486
:10DF600022E04F2D6C2F812F0E94A16E9FC08F2D1C
:10DF700099278F3D910589F1803E910574F4863D86
:10DF80009105F9F0873D910524F4843C910599F0C1
:10DF900026C08C3D9105D9F022C0863F9105A1F0A5
:10DFA000873F910524F4843E910541F018C08C3FD1
:10DFB000910581F014C001E0F02E11C0B2E0FB2EFB
:10DFC0000EC0A3E0FA2E0BC0F4E0FF2E08C0E5E07F
:10DFD000FE2E05C076E0F72E02C06EE1F62E8FE72A
:10DFE000F822DD27D695DC2FCC27D795C79586E07C
:10DFF000189FC0011124C80FD91FD3706E0100E013
:10E0000010E045E0B42E86E0F89EF0011124E00F08
:10E01000F11FE254F04F24918E2D99278230910503
:10E02000E9F0833091052CF4009749F0019771F0E5
:10E030002CC083309105D1F00497F1F026C0FE0189
:10E04000E35FF64CE00FF11F20831FC0FE01E35F8A
:10E05000F64CE00FF11F8081822B16C0FE01E35FBA
:10E06000F64CE00FF11F808182270EC0FE01E35FB6
:10E07000F64CE00FF11F06C0FE01E35FF64CE00F27
:10E08000F11F2095808182238083FE01E35FF64C9F
:10E09000E00FF11F6081C6010E947A6CBA940F5F95
:10E0A0001F4F0894C11CD11CB7FEADCFDF91CF919B
:10E0B0001F910F91FF90EF90DF90CF90BF90089548
:10E0C000CF93DF93EC0188818823B9F020E0488169
:10E0D0006091913D8091903D0E94866F8091903D2E
:10E0E0008F5F8093903D843120F01092903D0E948C
:10E0F000466D21968881882349F7DF91CF91089555
:10E100008093903D6093913DCA010E946070089594
:10E110001F93CF93DF93EC01162F8881882309F199
:10E120004881842F99278A309105A9F00D9719F419
:10E130001092903D12C0212F6091913D8091903DB1
:10E140000E94866F8091903D8F5F8093903D8631D5
:10E1500020F01092903D0E94466D21968881882380
:10E16000F9F6DF91CF911F9108958093903D6093D0
:10E17000913D622FCA010E94887008951F93CF932A
:10E18000DF93EC01162FFC018491882319F1FE0125
:10E190004491842F99278A309105A9F00D9719F49D
:10E1A0001092903D12C0212F6091913D8091903D41
:10E1B0000E94866F8091903D8F5F8093903D863165
:10E1C00020F01092903D0E94466D2196FE018491B0
:10E1D0008823E9F6DF91CF911F9108958093903DB8
:10E1E0006093913D622FCA010E94BE7008951F93F3
:10E1F000CF93DF93EC01162FFC018491882311F15A
:10E20000FE014491842F99278A30910519F00D97CA
:10E2100021F411C00E94466D10C0212F6091913DE4
:10E220008091903D0E94866F8091903D8F5F80939A
:10E23000903D863110F01092903D2196FE01849120
:10E240008823F1F6DF91CF911F9108958093903D3F
:10E250006093913D622FCA010E94F7700895FF926A
:10E260000F931F93CF93DF93182FF62EEA01022FFF
:10E270008881882359F08991202F482F6F2D812F75
:10E280000E94866F1F5F88818823A9F7DF91CF9155
:10E290001F910F91FF9008951F93CF93382F842FD4
:10E2A000242F3093903D6093913D432F480F512D83
:10E2B000511D463151051CF085E1282F231B132FDA
:10E2C000120FC32F311750F420E040E26091913DCE
:10E2D0008C2F0E94866FCF5FC117B0F3CF911F9133
:10E2E0000895CF92DF92EF92FF920F931F93CF93F7
:10E2F000DF93D82E162FC02E87FF02C05FE7D52EE2
:10E30000103408F01FE38D2D840F912D911DEC0129
:10E31000812F820F912D911D7C01C138D10510F004
:10E32000C0E8D0E091E4E916F10418F030E4E32EFF
:10E33000F12C0C2D212F4C2F612F8D2D0E949C6DC7
:10E340002E2D4C2F612F8C2F0E949C6D2E2D4D2D2C
:10E350006E2D8C2F0E949C6D212F4D2D6E2D8D2D9D
:10E360000E949C6DDF91CF911F910F91FF90EF90D4
:10E37000DF90CF9008952F923F924F925F926F92CD
:10E380007F928F929F92AF92BF92CF92DF92EF9245
:10E39000FF920F931F93CF93DF935C016B01E22EEB
:10E3A00061E0862E912C841A950A222433248EEF64
:10E3B0009FEF489F2001499F500C589F500C1124FB
:10E3C0003101EA018C2D840F422F682F8A2D0E9483
:10E3D000536D8C2D8C1B4E2D682F8A2D0E94536DF2
:10E3E0004E2D6C2D8A2D8C0F0E94536D4E2D6C2D51
:10E3F0008A2D8C1B0E94536D2C163D060CF051C0CB
:10E4000097FC07C0219782E090E0480E591E840CCB
:10E41000951C0894611C711C82E090E0280E391E46
:10E42000820C931C0894811C911C1C2D1C0FFA2C2F
:10E43000F60C4E2D612F8F2D0E94536D0A2D06195B
:10E440004E2D612F802F0E94536D1C2D1C1B4E2DB5
:10E45000612F8F2D0E94536D4E2D612F802F0E94B2
:10E46000536D1C2D160DFA2CFC0E4E2D612F8F2D89
:10E470000E94536D0A2D0C1B4E2D612F802F0E9480
:10E48000536D1C2D16194E2D612F8F2D0E94536D2B
:10E490004E2D612F802F0E94536D6C167D060CF45B
:10E4A000AFCFDF91CF911F910F91FF90EF90DF9051
:10E4B000CF90BF90AF909F908F907F906F905F9024
:10E4C0004F903F902F9008952F923F924F925F92DE
:10E4D0006F927F928F929F92AF92BF92CF92DF9274
:10E4E000EF92FF920F931F93CF93DF935C016B0129
:10E4F000E22E71E0672E712C641A750A22243324EF
:10E500008EEF9FEF489F2001499F500C589F500C61
:10E5100011244101EA018C2D841B9C2D940F022FA4
:10E52000282F4A2D692F8A2D0E949C6D8A2D8C1BC5
:10E530002C2D482F6C2D8A2D8C0F0E949C6D2C1633
:10E540003D060CF042C077FC07C0219782E090E0C6
:10E55000480E591E640C751C0894811C911C82E0A5
:10E5600090E0280E391E620C731C0894611C711C0B
:10E570008C2D8C0F1A2D1819FA2CF80C0E2D282F13
:10E58000412F682F8F2D0E949C6D8C2D8C1B282F66
:10E59000412F682F8F2D0E949C6D8C2D880D1A2D78
:10E5A0001C1BFA2CFC0E282F412F682F8F2D0E9448
:10E5B0009C6D8C2D8819282F412F682F8F2D0E943C
:10E5C0009C6D8C169D060CF4BECFDF91CF911F91F0
:10E5D0000F91FF90EF90DF90CF90BF90AF909F9002
:10E5E0008F907F906F905F904F903F902F90089505
:10E5F0002F923F924F925F926F927F928F929F9253
:10E60000AF92BF92CF92DF92EF92FF920F931F9340
:10E61000CF93382E462EC42F7901202EC901AA2768
:10E6200097FDA095BA2FBC01CD010E94CEC4F7FE84
:10E6300006C020E030E040E857E40E94C8C32BED5C
:10E640003FE049E450E40E94BBC5DC01CB0120E07F
:10E6500030E044E353E4BC01CD010E9433C43B01EC
:10E660004C010E9430C47B018C01AC2EBB24A7FC62
:10E67000B094CB2CDB2CC601B5010E94CEC4C7FFE1
:10E6800006C020E030E040E853E40E94C8C39B018C
:10E69000AC01C801B7010E94BBC5DC01CB01BC01C4
:10E6A000CD010E941EC6DC01CB01BC01CD010E9440
:10E6B000A0C4DC01CB01542C581AC401B3010E9440
:10E6C0003EC67B018C01C601B5010E94CEC4C7FFC6
:10E6D00006C020E030E040E853E40E94C8C39B013C
:10E6E000AC01C801B7010E94BBC5DC01CB01BC0174
:10E6F000CD010E941EC6DC01CB01BC01CD010E94F0
:10E70000A0C4DC01CB01830D022D252D482F642DE3
:10E71000832D0E949C6DCF911F910F91FF90EF90E0
:10E72000DF90CF90BF90AF909F908F907F906F9031
:10E730005F904F903F902F9008956F927F928F92AD
:10E740009F92AF92BF92CF92DF92EF92FF920F9380
:10E750001F93CF93782E862E942EC22F6E2CC80135
:10E76000AA2797FDA095BA2FBC01CD010E94CEC467
:10E7700017FF06C020E030E040E857E40E94C8C31D
:10E780002BED3FE049E450E40E94BBC5DC01CB0126
:10E7900020E030E044E353E4BC01CD010E9433C4E7
:10E7A0005B016C010E9430C47B018C018C2F992786
:10E7B00087FD9095A92FB92FBC01CD010E94CEC431
:10E7C000C7FF06C020E030E040E853E40E94C8C321
:10E7D0009B01AC01C801B7010E94BBC5DC01CB01A4
:10E7E000BC01CD010E941EC6DC01CB01BC01CD01E4
:10E7F0000E94A0C4DC01CB01C82DC81BC601B50115
:10E800000E943EC67B018C01892D992787FD90953A
:10E81000A92FB92FBC01CD010E94CEC497FE06C01E
:10E8200020E030E040E853E40E94C8C39B01AC0103
:10E83000C801B7010E94BBC5DC01CB01BC01CD0101
:10E840000E941EC6DC01CB01BC01CD010E94A0C408
:10E85000DC01CB01870D062D2C2F482F682D872D2D
:10E860000E949C6DCF911F910F91FF90EF90DF90D0
:10E87000CF90BF90AF909F908F907F906F900895B2
:10E880002F923F924F925F926F927F928F929F92C0
:10E89000AF92BF92CF92DF92EF92FF920F931F93AE
:10E8A000CF93DF93CDB7DEB72D970FB6F894DEBFC9
:10E8B0000FBECDBF9A8389837C836B834A01690134
:10E8C0000D83449F1001459F300C549F300C112440
:10E8D000CC9C9001CD9C300DDC9C300D11243F83ED
:10E8E0002E832C9C50012D9CB00C3C9CB00C112410
:10E8F000C9018A199B09AA2797FDA095BA2FBC01C7
:10E90000CD010E94CEC47B018C01C101AA2797FDD5
:10E91000A095BA2FBC01CD010E94CEC4DC01CB0171
:10E9200020E030E040E85EE3BC01CD010E94BBC5C1
:10E93000DC01CB019C01AD01C801B7010E94C8C335
:10E94000DC01CB01BC01CD010E941EC6DC01CB0164
:10E95000BC01CD010E949BC4DC01CB019D878C874B
:10E960001986188625014A0C5B1C40E050E05B8745
:10E970004A8736018B818C0D4D81682F89810E94D9
:10E98000536D8B818C194D81682F89810E94536D45
:10E990004D816B818981880D0E94536D4D816B8102
:10E9A000898188190E94536D8A859B8584159505F8
:10E9B0000CF04CC0EC85FD85F7FD0CC00894610897
:10E9C0007108C101820D931D481A590AE419F5090D
:10E9D000FD87EC872A853B852F5F3F4F3B872A8742
:10E9E0008E819F81880F991F48855985480F591F2F
:10E9F00059874887CA01EE81FF818E0F9F1F2C85A2
:10EA00003D85280F391F3D872C87FB80F60C198127
:10EA10003A85130F4D816F2D812F0E94536D0B810D
:10EA200006194D81602F812F0E94536D19814A85EF
:10EA3000141B4D816F2D812F0E94536D4D81602FCE
:10EA4000812F0E94536D88859985B0CFEE81FF811B
:10EA5000CF01AA2797FDA095BA2FBC01CD010E9436
:10EA6000CEC45B016C012A853B85C901AA2797FDAD
:10EA7000A095BA2FBC01CD010E94CEC4DC01CB0110
:10EA800020E030E040E05FE3BC01CD010E94C8C35C
:10EA90007B018C019B01AC01C601B5010E94BBC585
:10EAA000DC01CB01A8019701BC01CD010E94BBC5CF
:10EAB0007B018C01930121503040229EC001239E96
:10EAC000900D329E900D1124829FA001839F500DC6
:10EAD000929F500D1124CA01AA2797FDA095BA2F25
:10EAE000BC01CD010E94CEC4DC01CB019C01AD0173
:10EAF000C801B7010E94C8C37B018C01EE81FF8170
:10EB00002E9EC0012F9E900D3E9E900D1124AA278F
:10EB100097FDA095BA2FBC01CD010E94CEC4DC01A7
:10EB2000CB019C01AD01C801B7010E94C7C3DC0144
:10EB3000CB01BC01CD010E941EC6DC01CB01BC0192
:10EB4000CD010E949BC4DC01CB019D878C871614EC
:10EB500017040CF04CC02C853D8512161306A4F04A
:10EB60004A855B854F5F5F4F5B874A878E819F81B8
:10EB7000880F991FE885F985E80FF91FF987E8875D
:10EB80002E0F3F1F3D872C87089461087108C10133
:10EB9000820D931D481A590AC101841995092C85C3
:10EBA0003D85280F391F3D872C87FB80F60C198186
:10EBB0003A85130F4D816F2D812F0E94536D0B816C
:10EBC00006194D81602F812F0E94536D19814A854E
:10EBD000141B4D816F2D812F0E94536D4D81602F2D
:10EBE000812F0E94536D161417040CF4B4CF2D9688
:10EBF0000FB6F894DEBF0FBECDBFDF91CF911F914E
:10EC00000F91FF90EF90DF90CF90BF90AF909F90CB
:10EC10008F907F906F905F904F903F902F900895CE
:10EC20000F93022F9A014D5F5F4F0E9440740F9126
:10EC30000895EF920F931F93E02E8901242F4D5FCB
:10EC40000E949D731F910F91EF900895CF92DF92D4
:10EC5000EF92FF920F931F93CF93DF93182F0E9491
:10EC6000AA6B60E088E593E10E94BE7020E04DE66B
:10EC700053E167E0822F0E94267182E08093913DEC
:10EC8000C12EDD24860102C0000F111F8A95E2F714
:10EC90007601F6E0EE0CFF1CFA95E1F70A3011055B
:10ECA0001CF4802F805D02C0802F895C20E0482FFB
:10ECB0006091913D822F0E94866F82E08093903D0B
:10ECC000C0E0D0E08E2D8C0F20E0482F6091913D68
:10ECD0008091903D0E94866F8091903D8F5F8093E0
:10ECE000903D2196C031D1056CF38091913D8F5FAD
:10ECF0008093913D0F5F1F4F80E190E0E80EF91E79
:10ED0000C601880F991F880F991F049608171907C5
:10ED10002CF2DF91CF911F910F91FF90EF90DF9038
:10ED2000CF9008958A3018F4805D99270895895C02
:10ED300099270895EF92FF920F931F93182F062F94
:10ED4000F42EE22E6093913D842F82958F700E9465
:10ED500092761F5F1093903D11502E2D482F602FFB
:10ED6000812F0E94866F8F2D8F700E9492762E2D9C
:10ED7000482F6091913D8091903D0E94866F1F9138
:10ED80000F91FF90EF9008950F931F93082F162F68
:10ED900082958F700E949276982F8091903D382FA7
:10EDA0008F5F8093903D212F492F6091913D832F5C
:10EDB0000E94866F802F8F700E949276982F80918C
:10EDC000903D382F8F5F8093903D212F492F609188
:10EDD000913D832F0E94866F8091903D982F8F5F89
:10EDE0008093903D212F40E26091913D892F0E94B8
:10EDF000866F1F910F9108950F931F93CF93182F34
:10EE000004E620E0812F602F0E94C2C6C82F88230D
:10EE100021F4222311F4013081F48C2F805D909134
:10EE2000903D392F9F5F9093903D20E0482F609157
:10EE3000913D832F0E94866F21E0C09F802D112479
:10EE4000181B802F6AE00E94C2C6082F8823D1F6C3
:10EE5000CF911F910F9108958093903D6093913DC4
:10EE6000842F0E94FC7608959F92AF92BF92CF921A
:10EE7000DF92EF92FF920F931F93CF93DF93CDB763
:10EE8000DEB727970FB6F894DEBF0FBECDBFF82EC2
:10EE9000B62ECA016901902E4AE050E0BE016F5FB4
:10EEA0007F4F0E94A1C3DE011196FD010190002059
:10EEB000E9F731978E2F8A1B082F1127C016D1062C
:10EEC00094F410E01C141D04BCF58F2DF3942E2D2A
:10EED0004AE26B2D0E94866F1F5F812F99278C1548
:10EEE0009D059CF329C0AA24C601801B910B18160E
:10EEF0001906D4F49F2D9F5F81E0981629F48F2D79
:10EF0000F92E2E2D40E304C08F2DF92E2E2D40E238
:10EF10006B2D0E94866FA3942A2D3327C601801B78
:10EF2000910B2817390734F32E2DAE014F5F5F4F39
:10EF30006B2D8F2D0E94B57027960FB6F894DEBF0B
:10EF40000FBECDBFDF91CF911F910F91FF90EF903A
:10EF5000DF90CF90BF90AF909F9008959F92AF9217
:10EF6000BF92CF92DF92EF92FF920F931F93CF93B6
:10EF7000DF93CDB7DEB727970FB6F894DEBF0FBE8D
:10EF8000CDBFF82EB62ECA016901902E4AE050E09E
:10EF9000BE016F5F7F4F0E9478C3DE011196FD01B5
:10EFA00001900020E9F731978E2F8A1B082F112737
:10EFB000C016D10694F410E01C141D04B4F58F2D76
:10EFC000F3942E2D4AE26B2D0E94866F1F5F812FD6
:10EFD00099278C159D059CF328C0AA24C601801B87
:10EFE000910B18161906CCF49F2D9F5F992029F0DC
:10EFF0008F2DF92E2E2D40E304C08F2DF92E2E2DAE
:10F0000040E26B2D0E94866FA3942A2D3327C60100
:10F01000801B910B281739073CF32E2DAE014F5F53
:10F020005F4F6B2D8F2D0E94B57027960FB6F89409
:10F03000DEBF0FBECDBFDF91CF911F910F91FF902B
:10F04000EF90DF90CF90BF90AF909F9008958F92F8
:10F050009F92AF92BF92CF92DF92EF92FF920F9367
:10F060001F93CF93DF93CDB7DEB727970FB6F894F2
:10F07000DEBF0FBECDBFF82EB62ECA016901802EAD
:10F080004AE050E0BE016F5F7F4F0E9478C3DE010F
:10F090001196FD0101900020E9F73197AE2EAA1AD2
:10F0A0000A2D1127C016D1069CF410E01C141D0473
:10F0B0000CF066C08F2DF3942E2D4AE26B2D0E942A
:10F0C000866F1F5F812F99278C159D059CF358C073
:10F0D0009924C601801B910B18161906CCF49F2D9C
:10F0E0009F5F882029F08F2DF92E2E2D40E304C03C
:10F0F0008F2DF92E2E2D40E26B2D0E94866F93945A
:10F10000292D3327C601801B910B281739073CF3A3
:10F11000FE01EA0DF11D0081108281E0A81631F494
:10F120002E2D40E36B2D8F2D815010C082E0A8164C
:10F1300081F449814D3269F42E2D6B2D8F2D815034
:10F140000E94866F2E2D40E36B2D8F2D0E94866FBF
:10F1500008C02E2DAE014F5F5F4F6B2D8F2D0E948B
:10F16000B5701F2D1A0D2E2D4EE26B2D812F815063
:10F170000E94866F2E2D402F6B2D812F0E94866F4F
:10F1800027960FB6F894DEBF0FBECDBFDF91CF91AB
:10F190001F910F91FF90EF90DF90CF90BF90AF90B5
:10F1A0009F908F900895EF92FF920F931F93CF93AC
:10F1B000DF93182FE62EEA0104E6202F3327CE0135
:10F1C000B9010E94CEC6F62E802F6AE00E94C2C608
:10F1D000813039F4812F1F5F20E04EE26E2D0E94B6
:10F1E000866F8F2D805D912F1F5F20E0482F6E2D41
:10F1F000892F0E94866FF09EC0011124C81BD90B75
:10F20000802F6AE00E94C2C6082F8823B1F6DF91E2
:10F21000CF911F910F91FF90EF9008958F929F9241
:10F22000AF92BF92CF92DF92EF92FF920F931F9314
:10F23000CF93DF93CDB7DEB727970FB6F894DEBF35
:10F240000FBECDBFF82EB62ECA016901802E4AE04E
:10F2500050E0BE016F5F7F4F0E9478C3DE011196C0
:10F26000FD0101900020E9F73197AE2EAA1A0A2D70
:10F270001127C016D1069CF410E01C141D040CF0DC
:10F2800066C08F2DF3942E2D4AE26B2D0E94866F5F
:10F290001F5F812F99278C159D059CF358C09924D9
:10F2A000C601801B910B18161906CCF49F2D9F5F89
:10F2B000882029F08F2DF92E2E2D40E304C08F2DAC
:10F2C000F92E2E2D40E26B2D0E94866F9394292DEE
:10F2D0003327C601801B910B281739073CF3FE0129
:10F2E000EA0DF11D0081108281E0A81631F42E2D67
:10F2F00040E36B2D8F2D815010C082E0A81681F461
:10F3000049814D3269F42E2D6B2D8F2D81500E9435
:10F31000866F2E2D40E36B2D8F2D0E94866F08C0C7
:10F320002E2DAE014F5F5F4F6B2D8F2D0E94B5705C
:10F330001F2D1A0D2E2D4EE26B2D812F81500E9414
:10F34000866F2E2D402F6B2D812F0E94866F279662
:10F350000FB6F894DEBF0FBECDBFDF91CF911F91E6
:10F360000F91FF90EF90DF90CF90BF90AF909F9064
:10F370008F900895CF92DF92EF92FF920F931F9399
:10F38000F82E162F6A012CE330E0CA01B9010E9461
:10F39000CEC6AB01629FC001639F900D729F900D1E
:10F3A0001124C81AD90AEE240E2D22E030E0612F74
:10F3B0008F2D0E9434772E2D4AE3612F8F2D8E5F83
:10F3C0000E94866F01E022E030E0A601612F8F2DC0
:10F3D0008D5F0E9434771F910F91FF90EF90DF9027
:10F3E000CF9008956F927F928F929F92AF92BF922B
:10F3F000CF92DF92EF920F931F93CF93C62F3901D5
:10F400004A01182F1F5F57FF0BC09094809470948F
:10F410006094611C711C811C911C20E04DE202C0B3
:10F4200020E040E26C2F0E94866FC401B30120E807
:10F4300036E948E950E00E9417C759016A01EE24F5
:10F4400001E023E030E0A5016C2F812F0E9434778A
:10F450002E2D4EE26C2F812F8D5F0E94866FC6018C
:10F46000B50120E836E948E950E00E94A3C6DC0176
:10F47000CB01681A790A8A0A9B0AC401B30128EEF3
:10F4800033E040E050E00E9417C759016A0124E0D0
:10F4900030E0A5016C2F812F8C5F0E943477C5016D
:10F4A000AA27BB27BC01CD0128EE33E040E050E0A5
:10F4B0000E94A3C6DC01CB01681A790A8A0A9B0A5A
:10F4C00023E030E0A3016C2F812F885F0E94347706
:10F4D0002E2D4EE16C2F812F855F0E94866FCF917C
:10F4E0001F910F91EF90DF90CF90BF90AF909F90C2
:10F4F0008F907F906F900895CF92DF92EF92FF925E
:10F500000F931F93CF93DF93F89400916F3710916F
:10F510007037C801AA2797FDA095BA2FBC01CD016D
:10F520000E94CEC4FC01EB0117FF08C020E030E0D0
:10F5300040E857E40E94C8C3FC01EB0180910E2E05
:10F5400090910F2EA091102EB091112E9E01AF011F
:10F55000BC01CD010E94C8C3DC01CB012FE832EC15
:10F5600045E75FE3BC01CD010E94BBC56B017C0197
:10F5700060930E2E70930F2E8093102E9093112E69
:10F580000E949BC4DC01CB01AC019C0197FF02C02F
:10F59000215C3F4F207C8A01021B130B1093092E24
:10F5A0000093082E20E030E040E85CE3C701B6019C
:10F5B0000E94BBC560930E2E70930F2E8093102E69
:10F5C0009093112E0032110584F020E030E040E8E5
:10F5D0005FE30E94C8C3DC01CB0180930E2E9093A1
:10F5E0000F2EA093102EB093112E80910E2E90917D
:10F5F0000F2EA091102EB091112E20E030E040EFA0
:10F6000050E4BC01CD010E9433C4DC01CB018093E6
:10F610000A2E90930B2EA0930C2EB0930D2EBC01AE
:10F62000CD010E94A0C4DC01CB019093052E8093F4
:10F63000042E1092072E1092062E80E090E0A0E09B
:10F64000B0E080930E2E90930F2EA093102EB093C7
:10F65000112E7894DF91CF911F910F91FF90EF9031
:10F66000DF90CF9008951F920F920FB60F92112442
:10F670000F931F932F933F934F935F936F937F93BA
:10F680008F939F93AF93BF93CF93DF93EF93FF93AA
:10F690000091780010917900C801AA2797FDA095E4
:10F6A000BA2FBC01CD010E94CEC4FC01EB0117FFB3
:10F6B00008C020E030E040E857E40E94C8C3FC01E5
:10F6C000EB0180910E2E90910F2EA091102EB091F3
:10F6D000112E9E01AF01BC01CD010E94C8C3DC0107
:10F6E000CB0180930E2E90930F2EA093102EB093EB
:10F6F000112E8091062E9091072E01969093072E41
:10F700008093062E8050904114F00E947C7AFF91E5
:10F71000EF91DF91CF91BF91AF919F918F917F91A9
:10F720006F915F914F913F912F911F910F910F908A
:10F730000FBE0F901F90189580E480937C008091FD
:10F740007C00807E816080937C008FEE80937A00C5
:10F7500008950F931F93CF93DF93C0E0D0E001E0B3
:10F7600023E0402F62E087E60E9471718091042EB1
:10F770009091052E8054914038F400E023E043E15D
:10F7800062E089E60E945F6E00916E37013041F5BC
:10F7900027E047E160E088E60E9471712091042E25
:10F7A0003091052E81E0243A380710F0C3E1D0E013
:10F7B000C901815491408336910540F4C9018054B8
:10F7C000914065E070E00E94CEC6EB0183E18C1BA6
:10F7D00000E023E0482F62E08C2F85590E945F6E85
:10F7E00010916E37112349F501E027E046E1612FC2
:10F7F00088E60E9471712091042E3091052E81E0DF
:10F800002A39380710F0C2E1D0E0C9018154914093
:10F810008935910540F4C9018054914065E070E05C
:10F820000E94CEC6EB0182E18C1B012F23E0482F02
:10F8300062E08C2F85590E945F6E209739F001E0BD
:10F8400023E04C2F62E08AE60E945F6EDF91CF9149
:10F850001F910F91089560914E2E623340F55091A3
:10F86000132E533030F582E08093F53DE091F33D67
:10F87000F091F43D7BE281AD282F33274091F53D97
:10F88000479FC00111242817390734F0842F8F5F58
:10F890008093F53D873078F38091F53D869F802DEC
:10F8A00011248093933D5F5F5093132E02C06093A9
:10F8B000933DE091F33DF091F43D91AD8091933D06
:10F8C000981778F48091122E853020F48F5F809302
:10F8D000122E089541E060E270E088EE93E00E940D
:10F8E0002A3608959C0148978C9718F480E090E0A0
:10F8F0000895C901845490408D9718F481E090E0F8
:10F900000895C901815790408D9718F482E090E0E6
:10F910000895C9018E5990408D9718F483E090E0C6
:10F920000895C9018B5C90408D9718F484E090E0B5
:10F930000895C901885F90408D9718F485E090E0A4
:10F940000895255231402D32310518F486E090E0BB
:10F95000089587E090E00895FF920F931F93CF934F
:10F96000DF93182FF62ECA0166E170E00E94CEC622
:10F97000CB018D5EC82FDD27CE55DC4E08E0FE01A1
:10F980008491912F1F5F20E0482F6F2D892F0E94B7
:10F99000866F0150219607FFF2CFDF91CF911F9123
:10F9A0000F91FF9008957F928F929F92AF92BF9296
:10F9B000CF92DF92EF92FF920F931F93CF93DF933B
:10F9C000CDB7DEB721970FB6F894DEBF0FBECDBF1F
:10F9D000762ED42E922F580126E0822E889D70011B
:10F9E0001124CE2C770C770C770C87E0780E892FBA
:10F9F0008695172D181B01E0292F612F8E2D9983D5
:10FA00000E947171998192508D2D8250100F9E2C01
:10FA1000900E00E0292F482F612F892D0E945F6EE4
:10FA2000DE0C01E0272D4D2D672D8E2D0E949C6D43
:10FA30001A141B040CF060C0C50165E070E00E9460
:10FA4000E2C66130710579F0623071051CF4672BF4
:10FA500029F033C062307105A1F02FC0872D81508D
:10FA600096E0C90E61C0972D91508E2D8A5F01E0FE
:10FA7000292F482F692F82500E949C6DEDEF7E0E3A
:10FA800069C0972D91508E2D8A5F01E0292F482F54
:10FA9000692F82500E949C6DFDEF7F0E202F44E065
:10FAA000672D8E2D8D5F0E945F6E8EEF780E202F5A
:10FAB000482D672D8E2D8E5F91C0972D91508C2DE6
:10FAC0008A5F01E0292F482F692F82500E949C6D88
:10FAD0009DEF790E202F44E0672D8C2D8D5F0E94C5
:10FAE0005F6EEEEF7E0E202F46E0672D8C2D8E5F31
:10FAF0000E945F6E7A946EC0B7FE72C0C5016BEF54
:10FB00007FEF0E94E2C661307105B9F06230710585
:10FB10001CF4672B29F040C06230710509F13CC02C
:10FB2000872D8F5FF6E0CF0E01E0282F4C2D682F38
:10FB30008C2D82500E949C6D53C0972D9F5F8E2DFF
:10FB40008A5F01E0292F482F692F82500E949C6D07
:10FB500082E0780E202F44E0672D8C2D8D5F3EC013
:10FB6000972D9F5F8E2D8A5F01E0292F482F692FE7
:10FB700082500E949C6D92E0790E202F44E0672D08
:10FB80008E2D8D5F0E945F6EE2E07E0E202F482D4D
:10FB9000672D8E2D8E0F22C0972D9F5F8C2D8A5F33
:10FBA00001E0292F482F692F82500E949C6DF2E0BE
:10FBB0007F0E202F44E0672D8C2D8D5F0E945F6E9D
:10FBC00082E0780E202F46E0672D8C2D8E5F0E94FC
:10FBD0005F6E700E202F48E0672D892D0E945F6EAA
:10FBE00021960FB6F894DEBF0FBECDBFDF91CF9147
:10FBF0001F910F91FF90EF90DF90CF90BF90AF904B
:10FC00009F908F907F9008959F92AF92BF92CF92D6
:10FC1000DF92EF92FF920F931F93162F96E0899F2A
:10FC2000C0011124E82E110F110F110F195F6CEF95
:10FC3000962E910E41E0692D0E94536D5BEFA52E2B
:10FC4000A10EBE2CB394C12ECA9401E02A2D4B2DD7
:10FC50006C2D8B2D0E949C6D012F065041E0602F72
:10FC60008E2D8E5F0E94536D812F875043E0D42EDE
:10FC7000DE0C41E0682F8D2D0E94536D41E0602F16
:10FC80008E2D8C5F0E94536D35E0F32EFE0C01E04B
:10FC90002A2D4F2D6C2D8F2D0E949C6D402F692D8C
:10FCA0008E2D8A5F0E94536D402F6C2D8D2D0E94EA
:10FCB000536D812F8250402F682F8D2D0E94536DE0
:10FCC000212F4F2D612F8B2D0E949C6D1F910F9125
:10FCD000FF90EF90DF90CF90BF90AF909F900895EE
:10FCE0008F929F92BF92CF92DF92EF92FF920F93EB
:10FCF0001F93162F96E0899F40011124B82C110FF5
:10FD0000110F110F195FC12EDD248DEF9FEFC80E6B
:10FD1000D91EE82CFF2483E090E0E80EF91E21E0D4
:10FD200044E050E0B601C7010E94BB71812F8350AF
:10FD300096E0B90E01E0282F4B2D682F882D0E94E8
:10FD40009C6D812F86509B2D9350282F492F612F1A
:10FD5000892F0E949C6D202F42E050E0B601C70120
:10FD60000E94BB711F910F91FF90EF90DF90CF9099
:10FD7000BF909F908F900895EF920F930E94AA6B6F
:10FD80008CE190E00E9438BC20E0AC0167E08CE0A0
:10FD90000E942F7188E990E00E9438BC20E0AC01FD
:10FDA000622F822F0E942F718091272E9091282EF2
:10FDB000AA2797FDA095BA2FBC01CD010E94CEC401
:10FDC000DC01CB0120E030E040EA51E4BC01CD0190
:10FDD0000E9433C4DC01CB01BC01CD010E949BC455
:10FDE000DC01CB01EE240E2D24E030E0AC016E2DC1
:10FDF0008EE00E94AE772E2D4DE66E2D82E10E94A0
:10FE0000866F89E990E00E9438BC2E2DAC0161E03C
:10FE10008E2D0E942F718091252E9091262E9C016F
:10FE200044275527DA01C90173E0880F991FAA1FDB
:10FE3000BB1F7A95D1F7820F931FA41FB51FBC017A
:10FE4000CD012AEF30E040E050E00E94F5C6DA0133
:10FE5000C90123E030E0AC0161E08FE00E9434771B
:10FE60002E2D46ED53E161E082E10E94EE708AE9B9
:10FE700090E00E9438BC2E2DAC0162E08E2D0E94D5
:10FE80002F718091232E9091242E6AE070E00E94C1
:10FE9000E2C624E030E0AB0162E08FE00E943477FC
:10FEA0002E2D4DE662E083E10E94866F8CE990E0A2
:10FEB0000E9438BC2E2DAC0163E08E2D0E942F7164
:10FEC0004091212E5091222E63E08EE00E94BA795B
:10FED0002E2D4DE663E083E10E94866F8BE990E072
:10FEE0000E9438BC2E2DAC0164E08E2D0E942F7133
:10FEF00080917101992723E030E0AC0164E08EE04D
:10FF00000E9427782E2D46E564E082E10E94866FEC
:10FF10008DE990E00E9438BC2E2DAC0165E08E2D5D
:10FF20000E942F7124E030E040911F2E5091202E2E
:10FF300065E08EE00E9427782E2D41E465E083E1A4
:10FF40000E94866F8EE990E00E9438BC2E2DAC0195
:10FF500066E08E2D0E942F7124E030E040911D2E2E
:10FF600050911E2E66E08EE00E9434772E2D4AEDD1
:10FF700053E166E082E10E94EE7006C088EC90E0FA
:10FF80009093512E8093502E80E20E944238882315
:10FF9000A9F38091152E8B7F8093152E80EF0E9400
:10FFA00042380E94AA6B0F91EF9008958F929F9212
:10FFB000AF92BF92CF92DF92EF920F931F930E9466
:10FFC000AA6B87E190E00E9438BC22E0AC0160E0BF
:10FFD000862F0E942F718CE190E00E9438BC20E0B7
:10FFE000AC0167E08CE00E942F7110E0212F3327D5
:10FFF0008DE090E0289F4001299F900C389F900C45
:020000021000EC
:10000000112484E99DE3880E991EF401A480B58033
:10001000C680D780C601B50120E836E948E950E03E
:100020000E94F5C6DA01C9011F5FEE240E2D22E001
:1000300030E0AC01612F81E00E9434772E2D4EED2F
:1000400053E1612F83E00E94EE70C601B50128EEF6
:1000500033E040E050E00E94F5C6CA01B90120E15A
:1000600037E240E050E00E94F5C6DC01CB0101E040
:1000700024E030E0AC01612F84E00E943477C601B7
:10008000B5012AE030E040E050E00E94F5C6CA0128
:10009000B90124E630E040E050E00E94F5C6DC0102
:1000A000CB0122E030E0AC01612F88E00E94347780
:1000B000F401A080B180C280D380C601B50120E8E0
:1000C00036E948E950E00E94F5C6DA01C9010E2D73
:1000D00022E030E0AC01612F8CE00E9434772E2DBD
:1000E00040EE53E1612F8EE00E94EE70C601B50133
:1000F00028EE33E040E050E00E94F5C6CA01B901A5
:1001000020E137E240E050E00E94F5C6DC01CB017F
:1001100001E024E030E0AC01612F8FE00E943477F1
:10012000C601B5012AE030E040E050E00E94F5C68B
:10013000CA01B90124E630E040E050E00E94F5C673
:10014000DC01CB0122E030E0AC01612F83E10E94B1
:100150003477163008F44ACF06C088EC90E09093CC
:10016000512E8093502E80E20E9442388823A9F3BA
:1001700080EF0E9442380E94AA6B1F910F91EF906E
:10018000DF90CF90BF90AF909F908F9008952F9267
:100190003F924F925F926F927F928F929F92AF9217
:1001A000BF92CF92DF92EF920F9384E890E00E948B
:1001B00038BC20E0AC0162E0822F0E942F7185E8FC
:1001C00090E00E9438BC20E0AC0163E0822F0E94E6
:1001D0002F7187E190E00E9438BC20E0AC0165E01F
:1001E000822F0E942F71A090983DB090993DC090B1
:1001F0009A3DD0909B3DC601B50120E836E948E91B
:1002000050E00E94F5C6DA01C901EE240E2D22E06D
:1002100030E0AC0166E081E00E9434772E2D42EEA2
:1002200053E166E083E00E94EE70C601B50128EE5E
:1002300033E040E050E00E94F5C6CA01B90120E178
:1002400037E240E050E00E94F5C6DC01CB0101E05E
:1002500024E030E0AC0166E084E00E943477FAE00C
:100260002F2E312C412C512CC601B501A201910138
:100270000E94F5C6E4E66E2E712C812C912CCA01E9
:10028000B901A40193010E94F5C6DC01CB0122E073
:1002900030E0AC0166E088E00E943477A090943DA5
:1002A000B090953DC090963DD090973DC601B50168
:1002B00020E836E948E950E00E94F5C6DA01C901B4
:1002C0000E2D22E030E0AC0166E08CE00E94347735
:1002D0002E2D44EE53E166E08EE00E94EE70C601E2
:1002E000B50128EE33E040E050E00E94F5C6CA01B7
:1002F000B90120E137E240E050E00E94F5C6DC01A0
:10030000CB0101E024E030E0AC0166E08FE00E9428
:100310003477C601B501A20191010E94F5C6CA0158
:10032000B901A40193010E94F5C6DC01CB0122E0D2
:1003300030E0AC0166E083E10E9434770F91EF90EA
:10034000DF90CF90BF90AF909F908F907F906F90F5
:100350005F904F903F902F9008958F929F92AF9211
:10036000BF92CF92DF92EF92FF920F931F93CF93A2
:10037000DF93CDB7DEB721970FB6F894DEBF0FBE7F
:10038000CDBF182F08EC802E912C9092512E809288
:10039000502E1092A02A10929F2B882309F4FAC0A5
:1003A00042E060E070E0CB010E942A360E94AA6B16
:1003B0002091983D3091993D40919A3D50919B3DBF
:1003C0006091943D7091953D8091963D9091973DBF
:1003D0000E94B85F83E890E00E9438BC22E0AC0144
:1003E00060E0862F0E942F7184E890E00E9438BC64
:1003F00020E0AC0162E0822F0E942F7185E890E03E
:100400000E9438BC20E0AC0163E0822F0E942F7173
:1004100087E190E00E9438BC20E0AC0165E0822FCB
:100420000E942F7140E060E470E08AEF90E00E944B
:100430002A3611E01093142EA090983DB090993D6B
:10044000C0909A3DD0909B3DC601B50120E836E9A9
:1004500048E950E00E94F5C6DA01C901EE240E2DEC
:1004600022E030E0AC0166E0812F0E9434772E2D2F
:1004700046EE53E166E083E00E94EE70C601B501EE
:1004800028EE33E040E050E00E94F5C6CA01B90111
:1004900020E137E240E050E00E94F5C6DC01CB01EC
:1004A000012F24E030E0AC0166E084E00E94347764
:1004B000C601B5012AE030E040E050E00E94F5C6F8
:1004C000CA01B90124E630E040E050E00E94F5C6E0
:1004D000DC01CB0122E030E0AC0166E088E00E9464
:1004E0003477A090943DB090953DC090963DD090CB
:1004F000973DC601B50120E836E948E950E00E9481
:10050000F5C6DA01C9010E2D22E030E0AC0166E04B
:100510008CE00E9434772E2D48EE53E166E08EE0A9
:100520000E94EE70C601B50128EE33E040E050E0D5
:100530000E94F5C6CA01B90120E137E240E050E06F
:100540000E94F5C6DC01CB01012F24E030E0AC01B4
:1005500066E08FE00E943477C601B5012AE030E002
:1005600040E050E00E94F5C6CA01B90124E630E03F
:1005700040E050E00E94F5C6DC01CB0122E030E013
:10058000AC0166E083E10E9434779092512E809214
:10059000502E16C083E890E00E9438BC22E0AC01E7
:1005A000612F812F0E942F710E94C7808091A837F0
:1005B000813031F4412F60E870E0C4010E942A3696
:1005C0000E94FC428FE48093A02A1982B1E0EB2EB6
:1005D000F12CFF92EF928E010E0D1F1D1F930F93B2
:1005E000A1E0DA2EDF921F9284E68F930E944041B1
:1005F0008AE08983FF92EF921F930F93DF9282E04C
:100600008F938FE68F930E9440418DB79EB70E96D1
:100610000FB6F8949EBF0FBE8DBF21960FB6F8940B
:10062000DEBF0FBECDBFDF91CF911F910F91FF9025
:10063000EF90DF90CF90BF90AF909F908F900895F4
:100640000F93DC01CA01022F440F551F440F551FA1
:10065000480F591F480F591F57FF02C04F5F5F4F88
:10066000CA01959587951296FD01EE0FFF1FEE0FBB
:10067000FF1FEA0FFB1FEA0FFB1F6F5F7F4F23E097
:10068000660F771F2A95E1F76D5F7F4FAC014350EE
:10069000504005979C01CF0102960E9440740F9133
:1006A0000895EF920F931F93E82F562FD90126E05C
:1006B000429F802D112463E00E94C2C69927EE5FFD
:1006C000E29FE02D11245F5F062E01C0550F0A94B2
:1006D000EAF7560FE02E8D01282F482F652F8E2F19
:1006E0008E5F0E949D731F910F91EF900895AF92BE
:1006F000BF92CF92DF92EF92FF920F931F93CF930F
:10070000DF93C82ED62E842FAA24BB249927AA278C
:10071000BB27FC013197EA31F10508F05AC6E35ACC
:10072000FF4FEE0FFF1F0590F491E02D099480918B
:10073000F23DE091F33DF091F43D80FF0BC0E65BAC
:10074000FF4F808181FF03C084EA90E075C583EA92
:1007500090E072C5E65BFF4F808181FF03C086EAAF
:1007600090E06AC585EA90E067C5E091F33DF091BD
:10077000F43D83A994A9AA2797FDA095BA2FBC019F
:10078000CD010E94CEC47B018C0120E030E048E422
:1007900053E40E94B7C5181654F020E030E048E456
:1007A00053ECC801B7010E942CC48823D4F420E084
:1007B00030E040EA51E4C801B7010E9433C4DC01D3
:1007C000CB01BC01CD010E949BC4DC01CB01EE2416
:1007D0000E2D24E030E0AC016D2D8C2D0E94AE7703
:1007E00019C020E030E040E05FE3C801B7010E949B
:1007F000BBC5DC01CB01BC01CD010E949BC4DC0167
:10080000CB01EE240E2D23E030E0AC016D2D8C2DBC
:100810000E940E7920E04AEE53E16D2D8C2D8C5F05
:100820000E94EE7020E049E06D2D8C2D8B5FAEC4F0
:100830008091C437813009F0EFC04091F53D4423E9
:1008400009F4EAC0E091F33DF091F43D91AD80915F
:10085000933D55277C2D7A5FCC2DC95F981760F4A6
:10086000E2E0EE2E00E021E030E0872F0E943477B6
:100870002E2D4CEE53E10AC0EE240E2D21E030E087
:10088000872F0E9434772E2D4EEE53E16D2D8C2F45
:100890000E94EE708091F53D833009F051C0CD2D5E
:1008A000DD2763E0CC0FDD1F6A95E1F786E0C89E87
:1008B0007001112401E027E04CE16C2F8E2D0E9485
:1008C0007171E091F33DF091F43D81AD282F332714
:1008D0008091F53D992755E0880F991F5A95E1F7CA
:1008E000281B390BC90143E0880F991F4A95E1F78E
:1008F000820F931F820F931F6CE070E00E94E2C68C
:100900005B01CB0101974B9748F48C2F800F25E0BA
:10091000462F682F8E2D800F0E945F6E8BE1A816E8
:10092000B10470F48AE18A199C2F9F5F3A2D3E0D25
:1009300000E025E0482F692F832F8F5F0E945F6EB4
:100940008091F53D8450823008F066C0CD2DDD27C2
:1009500083E0CC0FDD1F8A95E1F786E0C89E700129
:10096000112401E027E04EE16C2F8E2D0E94717161
:100970008091F53D8430B1F4E091F33DF091F43D88
:1009800081AD282F332720583040C90103E0880F5C
:10099000991F0A95E1F7820F931F820F931F6FE053
:1009A00070E017C08530C1F4E091F33DF091F43D63
:1009B00081AD282F3327205A3040C90113E0880F1A
:1009C000991F1A95E1F7820F931F820F931F63E11E
:1009D00070E00E94E2C65B01C50101974D9750F49B
:1009E0008C2F8F5F01E025E04A2D682F8E2D800F20
:1009F0000E945F6E9CE1A916B10470F48CE18A1923
:100A00009C2F9F5F3A2D3E0D00E025E0482F692F77
:100A1000832F8F5F0E945F6EC091C437CC2309F093
:100A2000D8C4809166379927823091051CF00297CF
:100A300039F1CFC4E091F33DF091F43D81AD909157
:100A4000933D1C2D1C5F482F5527891768F4B2E091
:100A5000EB2E0C2F23E030E06D2D8C2D0E9427789B
:100A60002E2D40EF53E1BBC3EC2E0C2F23E030E0E2
:100A70006D2D8C2D0E9427782C2F42EF53E1AFC3B0
:100A8000E091F33DF091F43D81AD9091933D482F7D
:100A900055277C2D72501C2D1E5F891758F4A4E039
:100AA000EA2E0C2F23E030E06D2D872F0E9427784F
:100AB00022E00AC0F3E0EF2E0C2F23E030E06D2D92
:100AC000872F0E9427782C2F46E56D2D812F0E94BD
:100AD000A16E7FC4E091F33DF091F43DE05BFF4FE8
:100AE000408151818091673790916837CC2DCB5FE1
:100AF0008417950760F4E2E0EE2E00E025E030E098
:100B00008C2D0E9434772E2D44EF53E10AC0EE2441
:100B10000E2D25E030E08C2D0E9434772E2D48EFED
:100B200053E16D2D8C2F5DC3E091F33DF091F43DC9
:100B3000E65BFF4F808180FF03C088EA90E07CC3C2
:100B400087EA90E079C380916637992782309105D2
:100B50001CF0029761F03DC4E091F33DF091F43D4B
:100B6000EE240E2D23E030E046AD57AD1DC1E091DF
:100B7000F33DF091F43D73E0E72E00E023E030E038
:100B800046AD57AD8C2D0E943477202F4EE16D2D50
:100B90008C2D885FFBC2E091F33DF091F43D86AD72
:100BA00097AD0E94727CE82FFF27EE0FFF1FE258DF
:100BB000FC4E8591949120E0AC01E6C1E091F33DBB
:100BC000F091F43D46AD57AD8C2D0E94AC7C01C434
:100BD000E091F33DF091F43DE25BFF4FEE240E2DEA
:100BE00023E030E0408151818C2D0E9427782E2D0A
:100BF0004CEF53E16D2D8C2D8C5FF3C2E091F33DF2
:100C0000F091F43D47A950AD8C2D0E94BA7920E0B7
:100C10004EEF53E16D2D8C2D8B5FE3C2E091F33DE0
:100C2000F091F43D82AD93AD9C0144275527DA0144
:100C3000C90163E0880F991FAA1FBB1F6A95D1F7EE
:100C4000820F931FA41FB51FBC01CD012AEF30E016
:100C500040E050E00E94F5C6DA01C901EE240E2DF5
:100C600023E030E0AC016D2D8C2D0E9434772E2DC9
:100C700040E054E16D2D8C2D8D5FB3C280916637BD
:100C800099278130910551F08230910524F4892B08
:100C900009F441C09EC30297F1F19BC3862F9927A7
:100CA00021E047E050E0BC018C2D99270E94208371
:100CB0008091C337E091F33DF091F43D882329F012
:100CC00086A597A526AD37AD04C086AD97AD26A500
:100CD00037A5821B930B88599E4F68E671E00E94EE
:100CE000E2C69093F73D8093F63D00E02091292ED7
:100CF00030912A2E47E06D2D8C2D0E9451838091DA
:100D0000F63D9091F73D90932A2E8093292E01E095
:100D10009C0147E03CC08D2D992721E045E050E043
:100D2000BC018C2D99270E9420838091C337E091CC
:100D3000F33DF091F43D882329F086A597A526ADD3
:100D400037AD04C086AD97AD26A537A5821B930BA2
:100D500088599E4F68E671E00E94E2C69093F73D85
:100D60008093F63D00E02091292E30912A2E45E017
:100D70006D2D8C2D0E9451838091F63D9091F73D11
:100D800090932A2E8093292E01E09C0145E06D2D41
:100D90008C2D0E9451831DC3EE240E2D23E030E0E4
:100DA0004091F63D5091F73D6D2D8C2D0E9434778A
:100DB000202F4EE16D2D8C2D8D5FE8C1809166371F
:100DC0009927823091051CF0029709F002C3E09147
:100DD000F33DF091F43D858D968D6AE070E00E94C0
:100DE000E2C6EE240E2D23E030E0AB01DDCF809192
:100DF00066379927823091051CF0029709F1E9C204
:100E0000E091F33DF091F43D84A595A56AE070E092
:100E10000E94CEC6EE240E2D23E030E0AB016D2DF6
:100E20008C2D0E9434772E2D4DE66D2D8C2D8D5FEF
:100E30000E94866F6D2D8C2D8C5F0E94047EC9C22E
:100E400020E044E054E18C2D0E94EE70E091F33DEF
:100E5000F091F43D84A595A56AE070E00E94CEC6AD
:100E6000EE240E2D23E030E0AB016D2D8C2D8B5F39
:100E70000E9434772E2D49E054E146C080916637B8
:100E80009927823091051CF0029709F1A2C2E091E6
:100E9000F33DF091F43D838D948D6AE070E00E9403
:100EA000CEC6EE240E2D23E030E0AB016D2D8C2D4F
:100EB0000E9434772E2D4DE66D2D8C2D8D5F0E9476
:100EC000866F6D2D8C2D8C5F0E94707E82C220E01B
:100ED0004DE054E18C2D0E94EE70E091F33DF091D5
:100EE000F43D838D948D6AE070E00E94CEC6EE24BE
:100EF0000E2D23E030E0AB016D2D8C2D8B5F0E9419
:100F000034772E2D42E154E16D2D8C2D885F69C11F
:100F100040E050E08091172E882311F441E050E02A
:100F2000E091F33DF091F43D20A9822F99274817D5
:100F3000590729F42093172E81E08093162E809173
:100F4000162E813071F4EC5BFF4F808185FF09C064
:100F500040E060E870E084EF91E00E942A36109251
:100F6000162EE091F33DF091F43D80A99927EE24EF
:100F70000E2D22E030E0AC016D2D8C2D8E5F0E9495
:100F800034772E2D46E154E16D2D8C2D2AC1209110
:100F9000A637E091F33DF091F43D222341F4E65B66
:100FA000FF4F8081E62EFF2483FD18C032C0E65B30
:100FB000FF4F8081E62EFF2483FD2BC03FC0209190
:100FC000A637E091F33DF091F43D2223D9F4E65B9E
:100FD000FF4F8081E62EFF2484FF1BC08091A7373E
:100FE000482F552703E0EE0CFF1C0A95E1F783E03C
:100FF00090E0E80EF91E86E0C89E800111240B5F88
:101000001F4F30C0E65BFF4F8081E62EFF2484FF38
:1010100015C08091A737482F552713E0EE0CFF1C11
:101020001A95E1F783E090E0E80EF91E86E0C89E8D
:10103000800111240B5F1F4F21E014C08091A7375E
:10104000482F5527C3E0EE0CFF1CCA95E1F783E05B
:1010500090E0E80EF91E86E0C89E800111240B5F27
:101060001F4F20E0B701C8010E94647221E043E0F5
:1010700050E0B701C8010E94BB71ABC1E091F33DE4
:10108000F091F43DEC5BFF4F808186FF03C020E0D0
:101090004DE402C020E048E56D2D8C2D77C0E09135
:1010A000F33DF091F43DEC5BFF4F8081992780FF89
:1010B00003C08CEA90E0C0C081FF03C08DEA90E0DD
:1010C000BBC082FF86C18EEA90E0B6C0E091F33DDE
:1010D000F091F43DEE5BFF4F80819927EE240E2DB9
:1010E00023E030E0AC018C2D0E943477CC2DCD5F15
:1010F0002E2D49E154E16D2D8C2F0E94EE70E09170
:10110000F33DF091F43DEC5BFF4F808184FF04C020
:101110002E2D4BE154E103C020E04EE154E16D2D52
:101120008C2F55C180916637282F33272230310507
:1011300024F02230310569F14CC1E091F33DF0918A
:10114000F43DEC5BFF4F8081E454F0401C2D1E5FAA
:1011500092A987FF0CC0892F9927EE240E2D22E03B
:1011600030E0AC018C2D0E9434772E2D0CC0892FDD
:101170009927B2E0EB2E00E022E030E0AC018C2DAC
:101180000E9434772E2D48E06D2D812F0E94866FAE
:1011900020C1E091F33DF091F43DEC5BFF4F808185
:1011A000E454F0401C2D1E5F92A987FF0CC0892FCC
:1011B0009927EE240E2DAC018C2D0E9434772E2D14
:1011C00041E254E10CC0892F9927A2E0EA2E00E009
:1011D000AC018C2D0E9434772E2D46E254E16D2D0A
:1011E000812F0E94EE70F5C0E091F33DF091F43D47
:1011F000ED5BFF4F8081992782FF03C080EB90E079
:101200001BC083FF03C081EB90E016C080FF03C0CA
:1012100082EB90E011C081FF03C083EB90E00CC033
:1012200084FF03C084EB90E007C085FF03C085EB1B
:1012300090E002C08FEA90E00E9438BC20E0AC0150
:101240006D2D8C2D0E942F71C4C0E091F33DF09163
:10125000F43D05A916A92EE04AE08C2D0E94D37C0E
:10126000B8C0E091F33DF091F43DC5A9C0958091DF
:101270007437882309F469C0ED5BFF4F8081E35424
:10128000F04080FF62C0E65BFF4F8081EA54F0408F
:1012900081FF5BC085A996A997FF24C010921A2EE2
:1012A0009091182E9F5F9093182E4091192E4423F1
:1012B00071F480916C01981750F06FEF7FEF8CE222
:1012C00091E00E942A3680916C018093182E8091C3
:1012D000192E8F5F8093192E90916D01891711F44B
:1012E0001092192EE091F33DF091F43D85A996A955
:1012F000892B11F41092182E85A996A91816190693
:1013000024F51092192E9091182E9F5F9093182E0D
:1013100040911A2E442371F480916C01981750F07B
:101320006FEF7FEF84E690E00E942A3680916C0197
:101330008093182E80911A2E8F5F80931A2E909191
:101340006E01891711F410921A2EE091F33DF0917D
:10135000F43D45A956A957FF2CC08091CC371C2DD0
:101360001C5F8C17C0F4F2E0EF2E00E023E030E0C9
:101370006D2D8C2D0E940E792E2D4BE254E16D2D9A
:10138000812F0E942671402F60E670E088EE93E086
:101390000E942A361EC0EE240E2D23E030E06D2D73
:1013A0008C2D0E940E792E2D4FE254E16D2D812F50
:1013B0000EC0EE240E2D23E030E06D2D8C2D0E940A
:1013C0000E792E2D43E354E16D2D8C2D8C5F0E9400
:1013D0002671DF91CF911F910F91FF90EF90DF90D9
:1013E000CF90BF90AF9008954F925F926F927F928F
:1013F0008F929F92AF92BF92CF92DF92EF92FF9225
:101400000F931F93CF93DF93CDB7DEB72E970FB611
:10141000F894DEBF0FBECDBF782ECC241092282EBC
:101420001092272E1092262E1092252E1092242EE6
:101430001092232E1FEF109371011092222E109202
:10144000212EC092132EC092F53DC092122EC09252
:10145000172EC092162E8C2C6C2C0E94AA6B809199
:101460009F2A8230B9F481EA90E00E9438BC2C2D8A
:10147000AC0163E08C2D0E942F7184E690E0909384
:10148000512E8093502E8091502E9091512E892B69
:10149000D1F70AC50E942A43812F0E94AE998F3F3F
:1014A00099F482EA90E00E9438BC2C2DAC016C2D9E
:1014B0008C2D0E942F7120E23EE484EF91E0019791
:1014C000F1F721503040C9F7E0913C2EF0913D2ECC
:1014D000E359FF4F8081ED56F0408093F23D8585C2
:1014E0008093F03DE259FF4F80818093F13D0E944F
:1014F000FC428FE48093A02A1E8631E0E32EF12C7B
:10150000FF92EF922EE0422E512C4C0E5D1E5F9208
:101510004F9211E01F931F9284E68F930E944041E7
:101520008AE08E871093EF3DFF92EF925F924F9289
:101530001F9382E08F938FE68F930E9440419924FE
:1015400088EC90E09093512E8093502E8CE291E0A5
:101550009093532E8093522E8DB79EB70E960FB652
:10156000F8949EBF0FBE8DBF80919F2B882309F4F6
:1015700086C488EC90E09093512E8093502E0E9468
:10158000924280919C2B90919D2B9093F43D80935F
:10159000F33D8091142E813011F40E94AA6B1092B9
:1015A000142E6091F33D7091F43DFB01258136814D
:1015B000478150852D833E834F835887E180F28099
:1015C00003811481E982FA820B831C838091983D08
:1015D0009091993DA0919A3DB0919B3D2817390774
:1015E0004A075B0709F455C044E95DE38091943DE7
:1015F0009091953DA091963DB091973DE816F906E2
:101600000A071B0709F445C0FA01E25BFF4F9A0184
:101610002F5B3F4F8DE0D901982F0D9001929A9545
:10162000E1F78A010C5C1F4FD901F801982F019056
:101630000D929A95E1F797E2E92EF12CE40EF51E52
:10164000D801F701982F01900D929A95E1F79A0130
:10165000265E3F4FD701F901982F01900D929A9580
:10166000E1F78A01035F1F4FD901F801982F01901C
:101670000D929A95E1F7D801FA01982F01900D92F9
:101680009A95E1F7FE013196DA0101900D928A9563
:10169000E1F701E0902E791409F074C26D5B7F4F81
:1016A000FB0180810091152E80FF04C0046000932F
:1016B000152E14C011270470107080E10E9442386A
:1016C0009927082B192B012B11F00E94BC7E80E476
:1016D0000E944238882311F00E94D67F809166379D
:1016E0009927009719F0029721F008C041E063E0C4
:1016F00002C041E0642F80E00E94778380916637CA
:1017000099278130910569F0823091051CF4892B6D
:1017100021F010C0029749F00DC042E063E08BE079
:1017200007C042E061E0862F03C042E064E081E050
:101730000E9477838091663799278130910549F01F
:10174000823091051CF4892B21F00CC0029729F0FE
:1017500009C043E067E080E003C043E067E08DE05C
:101760000E9477838091663799278130910549F0EF
:10177000823091051CF4892B21F00CC0029729F0CE
:1017800009C044E067E08DE003C044E067E080E02A
:101790000E9477838091663799278130910541F0C7
:1017A000823091051CF4892B19F007C0029729F4A7
:1017B00049E067E088E00E94778380916637992747
:1017C000009719F0029721F008C045E0642F02C08D
:1017D00045E063E080E00E94778380916637992737
:1017E0008130910549F0823091051CF4892B21F05C
:1017F0000CC0029729F009C046E060E08DE003C00C
:1018000046E063E08CE00E947783809166379927F9
:10181000009711F0019729F447E060E082E10E940F
:101820007783809166379927009711F0019729F403
:1018300048E061E08CE00E947783809166379927C9
:101840008130910569F0823091051CF4892B21F0DB
:1018500010C0029749F00DC04AE061E080E007C087
:101860004AE066E087E003C04AE065E08FE00E945E
:101870007783809166379927009711F0019729F4B3
:101880004BE060E0862F0E9477838091663799272E
:101890008130910561F0823091051CF4892B21F093
:1018A0000FC0029741F00CC04CE064E006C04CE071
:1018B00063E081E003C04CE060E080E10E94778358
:1018C0008091663799278130910569F082309105C2
:1018D0001CF4892B21F010C0029749F00DC04DE097
:1018E00064E08CE007C04DE063E088E003C04DE0B9
:1018F00065E08BE00E94778380916637992781307D
:10190000910569F0823091051CF4892B21F010C0FB
:10191000029749F00DC04EE065E08AE007C04EE056
:1019200062E087E003C04EE065E080E00E947783DC
:10193000809166379927009719F0029729F009C01E
:1019400047E166E08AE003C047E166E080E00E948C
:10195000778380916637823029F44AE166E08BE034
:101960000E94778380916637882329F449E166E0F5
:1019700085E00E947783809166379927009719F058
:10198000029729F009C04FE066E080E003C04FE015
:1019900062E08CE00E9477838091663799270097F8
:1019A00019F0029729F009C040E166E083E003C026
:1019B00040E162E08EE00E9477838091663799274C
:1019C0008130910561F0823091051CF4892B21F062
:1019D0000FC0029741F00CC042E164E006C042E152
:1019E00065E088E003C042E162E080E00E94778326
:1019F00080916637813029F443E166E08FE00E94F0
:101A000077838091663799278130910569F082301C
:101A100091051CF4892B21F010C0029749F00DC0EC
:101A200048E162E08BE007C048E162E08EE003C07D
:101A300048E164E088E00E947783809166379927C7
:101A40008130910569F0823091051CF4892B21F0D9
:101A500010C0029749F00DC044E162E082E107C086
:101A600044E164E088E003C044E160E08AE00E9471
:101A70007783809166379927009719F0029729F0AC
:101A800009C045E162E080E003C045E160E0862FE7
:101A90000E947783809166379927009711F001970C
:101AA00029F446E160E089E00E9477830E942B7C64
:101AB000E091F33DF091F43DED5BFF4F8081E35405
:101AC000F04080FFACC123A934A98091272E9091CA
:101AD000282E8217930724F43093282E2093272E44
:101AE00022AD33AD8091252E9091262E821793073B
:101AF00020F43093262E2093252E24A535A5809101
:101B0000232E9091242E8217930720F43093242EB5
:101B10002093232E91AD80917101981710F490932A
:101B2000710127A930AD8091212E9091222E82172C
:101B3000930720F43093222E2093212EE25BFF4F57
:101B400020813181EE54F04080911F2E9091202E03
:101B50008217930720F43093202E20931F2EE05BF2
:101B6000FF4F20813181E055F04080911D2E9091F2
:101B70001E2E8217930708F052C130931E2E209319
:101B80001D2E4DC1F3E07F1609F055C1FB0186A55E
:101B900097A526AD37AD821B930B88599E4F68E6FB
:101BA00071E00E94E2C65C010E94AA6B092D20E24E
:101BB00044E6622F8AE10E949C6D2FE3422F60E091
:101BC000822F0E949C6D85E090E00E9438BC20E04E
:101BD000AC0167E08CE00E942F712BE041E4622FA2
:101BE0008DE30E949C6D22E248E26EE1842F0E9408
:101BF0009C6D22E246E56EE1842F0E949C6D25E3F8
:101C000041E4622F8DE30E949C6DF1E0CF1609F054
:101C10009EC08CE790E00E9438BC20E0AC01622FAF
:101C200089E00E942F718EE790E00E9438BC20E08E
:101C3000AC01672D872D0E942F718FE790E00E94E5
:101C400038BC20E0AC01672D81E10E942F718DE747
:101C500090E00E9438BC20E0AC0167E089E00E947F
:101C60002F7180E890E00E9438BC20E0AC01622F28
:101C7000822F0E942F71E091F33DF091F43DE05CE2
:101C8000FF4F8081992787FD9095EE240E2D23E04C
:101C900030E0AC016E2D82E00E94AE772E2D4EE139
:101CA0006E2D85E00E94866F81E890E00E9438BC2E
:101CB0002E2DAC0167E08E2D0E942F71E091F33D37
:101CC000F091F43DEF5BFF4F8081992787FD909560
:101CD00023E030E0AC0167E082E00E94AE772E2D79
:101CE0004EE167E085E00E94866F82E890E00E9406
:101CF00038BC2E2DAC016E2D8DE00E942F71E0912D
:101D0000F33DF091F43D23E030E046AD57AD6E2D4C
:101D10008FE00E9434772E2D4EE16E2D82E10E94DD
:101D2000866FE091F33DF091F43D86AD97AD0E9452
:101D3000727CE82FFF27EE0FFF1FE258FC4E8591C3
:101D400094912E2DAC016E2D83E10E94EE7080E106
:101D50000E944238882329F0C39481E08C1508F44E
:101D6000CC24E091F33DF091F43DE05CFF4F8081A5
:101D7000E054F040992787FD909566277727681BE8
:101D8000790B77FF02C06F5F7F4F75956795B0E263
:101D9000DB2ED60EEF5BFF4F8081992787FD909554
:101DA000909581959F4F97FD019695958795FFE3B7
:101DB000FF2EF80E862D992700E028E030E049E05C
:101DC00050E0BC01882D99270E944074E02E0091BC
:101DD000292E10912A2E27E048E0662D882D0E949A
:101DE0009D738D2D992701E028E030E049E050E017
:101DF000BC018F2D99270E944074E02E850127E0B9
:101E000048E06D2D8F2D0E949D73B0922A2EA092D6
:101E1000292E6D2C8F2CE091F33DF091F43DEE5B7B
:101E2000FF4F8081E254F04080936F0181AD809339
:101E3000700110929F2B8091522E9091532E892BDE
:101E4000F1F48AE08E8781E090E09F938F935F9218
:101E50004F9281E08F9382E08F938FE68F930E9461
:101E600040418CE291E09093532E8093522EADB777
:101E7000BEB717960FB6F894BEBF0FBEADBF809128
:101E8000502E9091512E892B39F4892D0E94AD81CD
:101E9000992481E08093142E80E20E9442388823A6
:101EA00009F462CB1092EF3D2E960FB6F894DEBF88
:101EB0000FBECDBFDF91CF911F910F91FF90EF909B
:101EC000DF90CF90BF90AF909F908F907F906F905A
:101ED0005F904F9008950F9300E00E94AA6B83E9F2
:101EE00090E00E9438BC22E0AC0160E0862F0E94A6
:101EF0002F7181E090E00E9438BC20E0AC0167E0E7
:101F0000822F0E942F711092F83D8091302E8823ED
:101F100039F020E048E750E461E0862F0E94EE703F
:101F20001092F83D6091F83D462F55278091302E54
:101F30009A01280F311D2E303105ECF48091302E9E
:101F4000480F511D8CE390E0489F9001499F300D50
:101F5000589F300D1124A9019091CA378FE0989FA6
:101F6000C0011124480F591F405D524C6F5F20E0A3
:101F700083E00E94EE708091F83D853069F4809195
:101F8000302E992705960D973CF420E04AE750E45F
:101F900066E081E00E94EE708091F83D8F5F809353
:101FA000F83D863008F4BECF80912F2E882399F417
:101FB0002091302E222331F401E04091730165E03D
:101FC000802F06C001E0202F4091730165E082E080
:101FD0000E940C32082F20912F2E213099F48091ED
:101FE000302E992707960F972CF000E0409173014F
:101FF00066E004C0022F4091730165E082E00E9418
:102000000C32082F0E3F51F48091302E8F5F809359
:10201000302E81E080932F2E85E00AC00D3F59F4C9
:102020008091302E81508093302E10922F2E82E09E
:102030008093730152CF0F3F39F000937301809169
:10204000302E800F992702C08FEF90E00F910895F6
:102050008F929F92AF92BF92CF92DF92EF92FF92B8
:102060000F931F93CF93DF93CDB7DEB764970FB66F
:10207000F894DEBF0FBECDBF882E99249092F83D14
:10208000282F332721503040BE016F5F7F4F492DED
:10209000E42FFF2753E0EE0FFF1F5A95E1F7E053BF
:1020A000FB4E849199278217930729F4FB01E90DD0
:1020B000F11D40839394842F8F5F482F883940F31C
:1020C0008093F83DFF240E94AA6B82E990E00E9471
:1020D00038BC22E0AC0160E0862F0E942F7181E0C5
:1020E00090E00E9438BC20E0AC0167E0822F0E94A3
:1020F0002F711092F83D80912E2E882339F020E028
:102100004CE750E461E0862F0E94EE701092F83D9B
:102110006091F83DE62FFF2780912E2E9F01280F1A
:10212000311DA92CBB242A153B050CF016C2809149
:102130002E2E6E010894C11CD11CEC0DFD1DE80F64
:10214000F11D90818CE3989FA00111248091CA37E2
:102150000FE0809FC0011124480F591F4057564E71
:102160006F5F20E083E00E94EE707091F83D8091F7
:102170002E2ED601A70FB11DFD01E80FF11D8081A4
:10218000E82FFF2793E0EE0FFF1F9A95E1F7EF523C
:10219000FB4E1491112309F06AC080912E2EA80FD6
:1021A000B11D8C91E82FFF2783E0EE0FFF1F8A956A
:1021B000E1F7EC52FB4E8491E0913C2EF0913D2EE4
:1021C000E80FF11D808199277F5FE12E012F23E029
:1021D00030E0AC01672F82E10E94347739E083164A
:1021E00009F0BBC16091F83D262F332780912E2E38
:1021F000A901480F511D4830510509F0AEC1809129
:102200002E2EF601E80FF11DE20FF31F8481E82F57
:10221000FF2703E0EE0FFF1F0A95E1F7EC52FB4E9C
:102220008491E0913C2EF0913D2EE80FF11D9081BC
:1022300080912E2EC80ED11CC20ED31EF6018481B1
:10224000E82FFF27B3E0EE0FFF1FBA95E1F7ED523D
:10225000FB4E849198236F5F992321F0212F4EE745
:1022600050E403C0212F40E850E481E176C01130F2
:1022700009F03FC080912E2EA80FB11D8C91E82F40
:10228000FF27A3E0EE0FFF1FAA95E1F7EC52FB4EEC
:102290008491E0913C2EF0913D2EE80FF11D1081CC
:1022A000183F60F4812F99277F5FEE240E2D23E0E5
:1022B00030E0AC01672F82E10E943477183F08F4C8
:1022C0004CC18091F83D8F5F20E042E850E4682FD8
:1022D00082E10E94EE7080E091E0811B91096091A3
:1022E000F83D6F5FEE240E2D21E030E0AC0184E17B
:1022F00032C11230A9F580912E2EFD01E80FF11D9B
:102300008081E82FFF2763E0EE0FFF1F6A95E1F75A
:10231000EC52FB4E8491E0913C2EF0913D2EE80F63
:10232000F11D208180912E2EA80FB11D8C91E82FD8
:10233000FF2753E0EE0FFF1F5A95E1F7ED52FB4EDA
:1023400084912823672F6F5F222321F020E045E846
:1023500050E402C049E850E482E10E94EE70FDC002
:10236000133009F046C0672F80912E2EA80FB11DA3
:102370008C91E82FFF2743E0EE0FFF1F4A95E1F70E
:10238000EC52FB4E8491E0913C2EF0913D2EE80FF3
:10239000F11D10811D3050F4812F99276F5FEE24BD
:1023A0000E2D23E030E0AC0182E116C01931B0F40B
:1023B0007F5F20E04DE850E4672F82E10E94EE70DD
:1023C000812F99270C976091F83D6F5FEE240E2DB9
:1023D00022E030E0AC0183E10E943477193109F04A
:1023E000BCC08091F83D8F5F20E04FE850E4682F3B
:1023F000B3CF1430C1F480912E2EA80FB11D8C9153
:10240000E82FFF2733E0EE0FFF1F3A95E1F7EC527C
:10241000FB4E8491E0913C2EF0913D2EE80FF11D92
:10242000808199271BC0153009F580912E2EA80FA9
:10243000B11D8C91E82FFF2723E0EE0FFF1F2A9597
:10244000E1F7EC52FB4E8491E0913C2EF0913D2E51
:10245000E80FF11D8081809FC00111247F5FEE2471
:102460000E2D23E030E0AC01672F74C0163009F068
:1024700074C0672F80912E2EFD01E80FF11D808121
:10248000E82FFF2793E0EE0FFF1F9A95E1F7EC523C
:10249000FB4E849140913C2E50913D2EFA01E80F65
:1024A000F11D2081222321F46F5F43E950E454CFD2
:1024B000213029F46F5F20E047E950E44DCF22300E
:1024C00029F46F5F20E04BE950E446CF233029F434
:1024D0006F5F20E04FE950E43FCF243029F46F5F75
:1024E00020E043EA50E438CF253029F46F5F20E044
:1024F00047EA50E431CF263029F46F5F20E04BEA01
:1025000050E42ACF273029F46F5F20E04FEA50E4EF
:1025100023CF672F6F5F283021F420E043EB50E496
:102520001BCF80912E2EA80FB11D8C91E82FFF2775
:1025300083E0EE0FFF1F8A95E1F7EC52FB4E84918A
:10254000480F511DFA0180819927EE240E2D23E0BA
:1025500030E0AC0182E10E9434778091F83D853013
:1025600089F480912E2E992705960894A108B10828
:102570008A159B053CF420E047EB50E466E081E0DF
:102580000E94EE708091F83D8F5F8093F83D863019
:1025900008F4BECD80912D2E8823E1F420912E2EBB
:1025A000222379F4F6E0F91530F401E0409172014C
:1025B00065E0802F0CC0022F40917201692D81E0EF
:1025C00006C001E0202F4091720165E082E00E9488
:1025D0000C32F82E40912D2E4130C1F480912E2ED8
:1025E00099270796292D33272817390734F400E057
:1025F000242F4091720166E005C0042F242F4091E2
:10260000720165E082E00E940C32F82E2EEFF21685
:1026100051F480912E2E8F5F80932E2E81E0809337
:102620002D2E85E00BC03DEFF31659F480912E2E30
:10263000815080932E2E10922D2E82E08093720175
:1026400042CD4FEFF41671F0F092720180912E2E70
:10265000FE013196E80FF11DEF0DF11D31978081DC
:10266000992702C08FEF90E064960FB6F894DEBF12
:102670000FBECDBFDF91CF911F910F91FF90EF90D3
:10268000DF90CF90BF90AF909F908F9008952F9242
:102690003F924F925F926F927F928F929F92AF92F2
:1026A000BF92CF92DF92EF92FF920F931F93CF933F
:1026B000DF93CDB7DEB721970FB6F894DEBF0FBE1C
:1026C000CDBFF82E0E94AA6BAF2CBB24850133E04E
:1026D000000F111F3A95E1F7F801EF52FB4E64909D
:1026E00081E990E00E9438BC22E0AC0160E0862FD6
:1026F0000E942F7181E090E00E9438BC20E0AC0184
:1027000067E0822F0E942F7186E0681699F08CE3B3
:10271000F89EA00111249091CA378FE0989FC001C4
:102720001124480F591F4057564E20E062E0822F77
:102730000E94EE70662009F0EFC0262D49EB50E4B0
:1027400064E0862F0E94EE70262D4BEC50E466E08C
:102750008CE00E94EE7082E090E00E9438BC262D52
:10276000AC0167E0862D0E942F71F801EE52FB4EFE
:102770009490F801ED52FB4ED490F801EC52FB4ED0
:102780008491E0913C2EF0913D2EE80FF11D708078
:1027900080912C2EF801E80FF11DEC52FB4E849035
:1027A000C72C892D9927E62C062D23E030E0AC01BB
:1027B00064E085E00E9434778D2D992723E030E096
:1027C000AC0164E089E00E943477882D992723E0EA
:1027D00030E0AC0164E081E10E9434774C2C552458
:1027E000EE240E2D23E030E0A20164E08E2D0E9445
:1027F0003477ED2CFF24C2019695982F8827979562
:102800008795B7010E94E2C601E026E0462F68E204
:1028100080E00E945F6E91E39D15B8F480E40E9411
:102820004238182F63E080E40E948638182B39F074
:102830000894411C511CE414F5040CF0C00E80E80F
:102840000E944238182F63E016C080E40E9442388C
:10285000182F62E080E40E948638182B39F0089423
:10286000411C511CE414F5040CF0C39480E80E9450
:102870004238182F62E080E80E948638182BE9F071
:102880004C2D55279A0121503040892D9927281722
:1028900039079CF05695542F442757954795CA0100
:1028A00080589040B7010E94E2C6CB0100E026E0CC
:1028B00040E868E20E945F6ECA9480E20E94653838
:1028C000882341F000E026E040E868E2802F0E9483
:1028D0005F6EC82C80E10E944D388823B1F0C71488
:1028E00009F404C403E0AA0CBB1C0A95E1F7E4ED6B
:1028F000F4E1AE0EBF1EF5018491E0913C2EF09103
:102900003D2EE80FF11DC082E7C380E20E944D38E2
:10291000882309F463CFEAC3F1E06F1609F042C1DE
:1029200020E040ED50E464E0862F0E94EE7020E04D
:1029300042EE50E466E08CE00E94EE7082E090E0AF
:102940000E9438BC20E0AC0167E0822F0E942F710A
:102950004501F801EE52FB4E4490F801ED52FB4E5A
:102960005490F801EC52FB4E8491E0913C2EF09192
:102970003D2EE80FF11D608080912C2EF801E80FAC
:10298000F11DEC52FB4E7490F62CCC24A72CBB24EA
:1029900087EF871598F42C2D47EE50E464E081E131
:1029A0000E94EE7080E091E08A199B09EC2C0C2DBE
:1029B00021E030E0AC0164E083E107C0EC2C0C2D99
:1029C00023E030E0A50164E081E10E94347797EFD5
:1029D0009F1518F411E0C12E01C0CC242F2C3324F4
:1029E000CC2009F062C0EC2C0C2D23E030E0A101DA
:1029F00064E08C2D0E943477A52CBB24C1019695F0
:102A0000982F882797958795B5010E94E2C601E027
:102A100026E0462F68E28C2D0E945F6E80E40E94C3
:102A20004238182F63E080E40E948638182B99F012
:102A30000894211C311CA214B3040CF0F00EE7EF33
:102A4000EF1548F40C2D26E040E868E28C2D0E943A
:102A50005F6EAFEFFA2E80E80E944238182F63E0D5
:102A600080E80E948638182B09F474C04F2D552732
:102A70009A0121503040842D9927281739070CF4EA
:102A800069C05695542F442757954795CA018058D9
:102A90009040B5010E94E2C6CB0100E026E040E88C
:102AA00068E20E945F6EFA9455C020E04CEE50E45C
:102AB00064E0822F0E94EE70C12CE1E0DE2EC2188D
:102AC000D308EE240E2D21E030E0A60164E082E080
:102AD0000E943477C60174E0880F991F7A95E1F758
:102AE00001E026E0482F68E28E2D0E945F6E80E4B0
:102AF0000E944238182F602F80E40E948638182BDD
:102B000041F0089421083108F8EF2F1631040CF039
:102B1000FA9480E80E944238182F61E080E80E9411
:102B20008638182BB9F08FEF90E08F19910900E0EB
:102B300026E040E868E28295807F0E945F6EF39411
:102B400049F40F2D26E040E868E28F2D0E945F6E69
:102B500067EFF62E80E20E946538882341F000E09E
:102B600026E040E868E2802F0E945F6EF72C80E14B
:102B70000E944D38882379F0F61409F4B7C253E067
:102B8000880C991C5A95E1F784ED94E1880E991E02
:102B9000F40184917DC180E20E944D38882309F4BC
:102BA00016CFA4C2F2E06F1609F095C08FE690E050
:102BB0000E9438BC20E0AC0164E083E00E942F71E9
:102BC00080E790E00E9438BC20E0AC0165E083E043
:102BD0000E942F7181E090E00E9438BC20E0AC019F
:102BE00067E0822F0E942F717501F801ED52FB4EB4
:102BF000D490F801EC52FB4E8491E0913C2EF09180
:102C00003D2EE80FF11DC08080912C2EF801E80FB9
:102C1000F11DEC52FB4E24910C2D213029F420E0C3
:102C20004FEE50E464E005C0222331F441EF50E45C
:102C300065E088E00E94EE70102F1D2159F020E021
:102C400043EF50E464E081E00E94EE7020E045EF45
:102C500050E40AC0212F47EF50E464E081E00E9475
:102C6000EE70212F49EF50E465E081E00E94EE70A4
:102C700080E80E944238882319F0112309F40D25B9
:102C800080E40E944238882321F0802F8D2109F0B2
:102C90000D2580E10E9442388823B1F00C1509F41B
:102CA00025C243E0EE0CFF1C4A95E1F784ED94E168
:102CB000E80EF91EF7018491E0913C2EF0913D2E33
:102CC000E80FF11D008308C280E20E944D3888237E
:102CD00009F4B2CF0BC2F3E06F1609F0E8C020E0B0
:102CE0004BEF50E464E0862F0E94EE7020E04DE050
:102CF00051E466E08CE00E94EE7082E090E00E9479
:102D000038BC20E0AC0167E0822F0E942F71650182
:102D1000F801EE52FB4E6490F801ED52FB4E7490B8
:102D2000F801EC52FB4E8491E0913C2EF0913D2E47
:102D3000E80FF11D808080912C2EF801E80FF11D25
:102D4000EC52FB4E9490F82C892D9927EE240E2DF1
:102D500023E030E0AC0164E081E10E9434774F2C45
:102D60005524A72CBB24C5010D978415950544F067
:102D7000EE240E2D23E030E0A20164E08E2D15C07C
:102D8000C50101978415950594F020E042E151E4D6
:102D900064E0822F0E94EE70C2010C97EE240E2D8B
:102DA00022E030E0AC0164E081E00E943477F71467
:102DB00039F420E044E151E464E0822F0E94EE7097
:102DC000C2019695982F882797958795B5010E94FF
:102DD000E2C601E026E0462F68E280E00E945F6ED6
:102DE00080E40E944238182F62E080E40E94863816
:102DF000182B39F00894411C511CA414B5040CF094
:102E0000F00E80E80E944238182F62E080E80E94AD
:102E10008638182BE9F04F2D55279A012150304064
:102E2000862D9927281739079CF05695542F44274B
:102E300057954795CA0180589040B5010E94E2C657
:102E4000CB0100E026E040E868E20E945F6EFA9461
:102E500080E20E946538882341F000E026E040E8E7
:102E600068E2802F0E945F6EF92C80E10E944D384D
:102E70008823B1F0F81409F439C193E0CC0CDD1CBF
:102E80009A95E1F784ED94E1C80ED91EF60184917C
:102E9000E0913C2EF0913D2EE80FF11DF0821CC117
:102EA00080E20E944D38882309F459CF1FC1F4E015
:102EB0006F1609F09EC020E048E151E467E0822FE0
:102EC0000E94EE708F2D8D558983823050F48FE1F2
:102ED00090E00E9438BC20E0AC0166E085E00E94F2
:102EE0002F717501F801EC52FB4E8491E0913C2E5C
:102EF000F0913D2EE80FF11D1081D12E00E01092CF
:102F0000F83D812F99273091F83D032E02C0959509
:102F100087950A94E2F780FF04C020E04EE251E476
:102F200003C020E040E351E464E088E0831B0E949A
:102F3000EE708091F83D8F5F8093F83D883008F304
:102F4000C02EC39420E042E351E465E08C2D0E9442
:102F5000EE7080E80E944238882359F020E044E374
:102F600051E465E08C2D0E94EE700C2D083009F4C0
:102F700000E09981923050F480E40E946538882303
:102F800029F0112311F010E001C01AEA80E40E9438
:102F90004D38882361F027E030E0201B310981E0C3
:102FA00090E002C0880F991F2A95E2F7182780E168
:102FB0000E944D388823B1F01D1509F497C083E0B5
:102FC000EE0CFF1C8A95E1F7E4EDF4E1EE0EFF1E36
:102FD000F7018491E0913C2EF0913D2EE80FF11D18
:102FE00010837AC080E20E944D38882309F487CF8D
:102FF0007DC0F5E06F1609F07DC082E090E00E9490
:1030000038BC20E0AC0167E0822F0E942F7175016F
:10301000F801EC52FB4E8491E0913C2EF0913D2E54
:10302000E80FF11DC08021E040E150E063E270E074
:1030300086E690E00E941076BC2CDC2CDB1451F06C
:103040004FE0D49EC001112400E09C0163E286E6BB
:103050000E941976DB2C8FE0B89E9001112401E0CC
:10306000482F63E286E60E94197680E40E94423887
:10307000182F602F80E40E948638182B29F0B00E9C
:1030800088E1B81609F4BB2480E80E944238182F62
:1030900061E080E80E948638182B29F0BB2011F4EB
:1030A00008E1B02EBA9480E10E944D388823C1F027
:1030B000BC14E1F013E0EE0CFF1C1A95E1F7E4ED0F
:1030C000F4E1EE0EFF1EF7018491E0913C2EF091A9
:1030D0003D2EE80FF11DB08281E080932B2E06C0BB
:1030E00080E20E944D38882309F4A8CF80EF0E9427
:1030F0004238A2C0F6E06F1609F09EC06501FF24B9
:103100009F2C8F2CB1E07B2E81E090E00E9438BC98
:103110002F2DAC0167E08F2D0E942F71EE24992096
:1031200039F02E2D46E351E461E0862F0E94EE70C7
:10313000AA24BB24492C55248501040D151D0930F2
:10314000110594F4C801A4E0880F991FAA95E1F72E
:10315000800F911F895C9B4E3E2D3F5F20E0AC01AC
:10316000632F83E00E94EE7085E0E81651F408308A
:1031700011053CF420E048E351E466E081E00E9460
:10318000EE70E3940894A11CB11C95E09E1590F696
:10319000882059F4992031F401E0292D472D692F19
:1031A000802F18C001E0202F12C0E1E08E16A9F494
:1031B00087E090E0480E591E9AE0491651042CF021
:1031C00000E0282D472D66E004C0082D282D472D4E
:1031D00065E082E00E946132F82EEEEFFE1631F4D7
:1031E0009394F1E08F2EE5E07E2E98CFFDEFFF1651
:1031F00029F49A94882472E0772E90CF8CEFF816F9
:10320000D9F099E09F1508F489CFF90CFA9463E09E
:10321000CC0CDD1C6A95E1F7E4EDF4E1CE0EDF1E87
:10322000F6018491E0913C2EF0913D2EE80FF11DC6
:10323000F08281E080932B2E21960FB6F894DEBFAA
:103240000FBECDBFDF91CF911F910F91FF90EF90F7
:10325000DF90CF90BF90AF909F908F907F906F90B6
:103260005F904F903F902F9008951F93CF93DF93DF
:10327000CDB7DEB721970FB6F894DEBF0FBECDBF36
:10328000898383E58093A02A12E310929F2B80917B
:103290009F2B8823B9F58CE790E09F938F938091C3
:1032A0003C2E90913D2E9F938F9381E090E09F93D1
:1032B0008F93CE0101969F938F9382E08F9381E04D
:1032C0008F9383E78F930E94404184E190E0909335
:1032D000512E8093502E8DB79EB70B960FB6F89453
:1032E0009EBF0FBE8DBF8091502E9091512E892B85
:1032F000D1F7115080919F2B882311F4112359F697
:10330000112341F00E949242E0919C2BF0919D2B61
:10331000808117C083E890E00E9438BC212FAC0167
:1033200062E0812F0E942F7184E690E09093512EED
:103330008093502E8091502E9091512E892BD1F751
:103340008FEF89838981992721960FB6F894DEBF84
:103350000FBECDBFDF91CF911F9108951F93CF93E3
:10336000DF93CDB7DEB721970FB6F894DEBF0FBE5F
:10337000CDBF898381E58093A02A12E310929F2B11
:1033800080919F2B882361F581E090E09F938F933C
:10339000CE0101969F938F9381E08F938F9381E766
:1033A0008F930E94404184E190E09093512E80934E
:1033B000502E8DB79EB707960FB6F8949EBF0FBEDE
:1033C0008DBF8091502E9091512E892BD1F71150A5
:1033D00080919F2B882311F41123B1F6112369F0FA
:1033E0000E949242E0919C2BF0919D2B81918983C8
:1033F000F0933D2EE0933C2E18C083E890E00E94AD
:1034000038BC212FAC0162E0812F0E942F7184E62D
:1034100090E09093512E8093502E8091502E909159
:10342000512E892BD1F78FEF898389819927219696
:103430000FB6F894DEBF0FBECDBFDF91CF911F91C5
:103440000895EF920F930E94AA6B84E990E00E9486
:1034500038BC22E0AC0160E0862F0E942F7181E031
:1034600090E00E9438BC20E0AC0167E0822F0E940F
:103470002F7181E080932C2E80912C2E863010F5B8
:1034800080912C2E0E94AE998F3F61F19927EE24F6
:103490000E2D21E030E0AC0160912C2E83E00E94E3
:1034A000347780913C2E90913D2E81599F4F2E2D47
:1034B000AC0160912C2E85E00E94B57080912C2E7D
:1034C0008F5FD8CF8CE890E00E9438BC20E0AC0140
:1034D00066E083E00E942F718FEF0E94AE99282F43
:1034E0008F3F19F48FEF90E00AC041E066E0842F2F
:1034F0000E94C73180932C2E80912C2E99270F91FA
:10350000EF900895EF920F931F93CF93C3E015E0D0
:103510000E94AA6B8CE890E00E9438BC20E0AC01CD
:1035200061E0822F0E942F718DE890E00E9438BCEC
:1035300020E0AC016C2F822F0E942F718EE890E06A
:103540000E9438BC20E0AC0167E0822F0E942F71FE
:103550008C2F9927EE240E2D21E030E0AC0163E0A2
:1035600085E00E943477812F992721E030E0AC017B
:1035700063E08EE00E94347780E80E94423888231E
:1035800021F0CF5FC63009F4C1E080E40E944238E8
:10359000882321F01F5F163009F411E080E10E94BA
:1035A0004238882309F471C020E04AE351E465E021
:1035B000822F0E94EE708FE890E00E9438BC20E0DD
:1035C000AC0165E0822F0E942F7184E090E00E94A0
:1035D00038BC20E0AC0167E08CE00E942F7180E1F4
:1035E0000E944238082F8823C1F18C2F0E94AE9987
:1035F0008C17B9F4812F0E943599811791F420E03E
:103600004DE451E465E0822F0E94EE7080E990E085
:103610000E9438BC20E0AC0165E0822F0E942F712F
:103620000FC08EE190E00E9438BC20E0AC0165E064
:10363000822F0E942F714EE065E086E00E944C715F
:1036400084E690E09093512E8093502E8091502EDE
:103650009091512E892BD1F721C080E20E944238EF
:10366000882309F4BCCF80EF0E94423845E165E031
:10367000802F0E944C718EE890E00E9438BC202F71
:10368000AC0167E0802F0E942F7180E20E944238D7
:10369000882309F45DCF80EF0E944238CF911F91BB
:1036A0000F91EF900895EF920F93CF930E942A43CA
:1036B0000E94219A80932C2E80912C2E8F3F09F40A
:1036C0002FC180912C2E863019F40E94829A28C135
:1036D0000E94AA6B86E890E00E9438BC22E0AC0110
:1036E00060E0862F0E942F7180912C2E805D22E059
:1036F000482F60E08FE00E94866F87E890E00E948C
:1037000038BC20E0AC0162E083E00E942F7188E8C1
:1037100090E00E9438BC20E0AC0163E0862F0E945C
:103720002F7181E090E00E9438BC20E0AC0167E09E
:10373000822F0E942F7100E0202F42E063E0842F4F
:103740000E940C32C82F8F3F09F4EAC0833009F081
:103750003DC080912C2E0E94AE9980912C2E0E940B
:10376000359990912C2E891799F445E162E0802FCC
:103770000E944C7145E16C2F802F0E944C7189E8AA
:1037800090E00E9438BC202FAC0162E085E012C0BE
:1037900045E162E080E00E944C7145E16C2F80E0E1
:1037A0000E944C718EE190E00E9438BC20E0AC0198
:1037B00064E0822F0E942F7120E23EE484EF91E0CA
:1037C0000197F1F721503040C9F7AAC080912C2E03
:1037D0008F3F09F4A5C080912C2E0E94AE998F3F97
:1037E00009F49EC01092302E10922F2E81E080930B
:1037F000730110922B2E0E946B8FC82F8F3F89F080
:1038000010922E2E10922D2E81E0809372018C2F1B
:103810000E942890082F8F3F11F00E9447930F3F7E
:10382000B1F7CF3F41F780912B2E813009F078C05E
:103830000E94AA6B8AE890E00E9438BC22E0AC01AA
:1038400060E0862F0E942F7180912C2E805D22E0F7
:10385000482F60E089E00E94866F80912C2E992786
:10386000EE240E2D21E030E0AC016E2D89E00E94A7
:1038700034778FE690E00E9438BC2E2DAC0162E0D8
:1038800083E00E942F7180E790E00E9438BC2E2DCB
:10389000AC0163E0862F0E942F7181E090E00E94CE
:1038A00038BC2E2DAC0167E08E2D0E942F712E2D7D
:1038B00042E063E0842F0E940C32823089F58091CF
:1038C0002C2E0E94359990912C2E891799F48BE813
:1038D00090E00E9438BC2E2DAC0164E083E00E9491
:1038E0002F7189E890E00E9438BC2E2DAC0165E074
:1038F00083E008C08EE190E00E9438BC20E0AC017B
:1039000064E0822F0E942F7184E690E09093512E04
:103910008093502E8091502E9091512E892BD1F76B
:10392000CF910F91EF9008956F927F928F929F9217
:10393000AF92BF92CF92DF92EF92FF920F931F93BD
:10394000CF93DF93662436E9732E84ED91E0909354
:103950008900809388000E94AA6B62E083E691E46C
:103960000E94BE70262D49E751E465E087E00E9481
:10397000EE70262D4BE751E465E080E10E94EE7089
:1039800083E090E00E9438BC262DAC0167E0862DD4
:103990000E942F71262D4EE751E467E082E10E94DC
:1039A000EE7001E028E048E767E183E00E94717172
:1039B0002FE147E1642F842F0E949C6D2FE14BE2A1
:1039C00067E1842F0E949C6D28E043E067E18DE36E
:1039D0000E945F6E2FE143E567E1842F0E949C6D9A
:1039E0002FE147E667E1842F0E949C6DE62C062DAF
:1039F00023E030E040E050E065E084E00E9434776E
:103A000023E030E046E950E065E08CE00E94D378A6
:103A100080E40E944238882339F463E080E40E9405
:103A20008638882309F459C080EE871508F455C0FC
:103A300085E9871570F186E990E087199109AA2731
:103A400097FDA095BA2FBC01CD010E94CEC4DC0128
:103A5000CB012DEC3CEC4CE45FE3BC01CD010E94BA
:103A6000BBC5DC01CB019C01AD0160E070E08CE7DF
:103A700092E40E94C7C3DC01CB01BC01CD010E94CE
:103A8000A0C4DC01CB0100E026E041E068E10E9437
:103A90005F6E73948BE4781691F084E6781679F073
:103AA0008DE7781661F086E9781649F08FEA781686
:103AB00031F088EC781619F081EE781639F440E090
:103AC00060E870E088EC90E00E942A3680EE87156E
:103AD00008F069C021EE722E66C080E80E9442386C
:103AE000882339F463E080E80E948638882309F44B
:103AF0005CC08BE4871508F058C086E9871590F5FF
:103B0000872D992786599040AA2797FDA095BA2F0F
:103B1000BC01CD010E94CEC4DC01CB012DEC3CECFC
:103B20004CE45FE3BC01CD010E94BBC57B018C016D
:103B30000E94A0C45B016C0120E030E04CE752E43D
:103B4000C801B7010E94C8C3DC01CB01BC01CD0193
:103B50000E94A0C4DC01CB0100E026E04A2D68E110
:103B60000E945F6E7A948BE4781691F084E6781662
:103B700079F08DE7781661F086E9781649F08FEADA
:103B8000781631F088EC781619F081EE781639F451
:103B900040E060E870E088EC90E00E942A368BE418
:103BA000871508F0782E63941DC080E10E9442388A
:103BB0008823C1F000E026E046E768E184E00E9447
:103BC0005F6E01E028E043E067E18DE30E945F6EF5
:103BD00096E9792E40E060E870E088EC90E00E9481
:103BE0002A36600E662009F4D4C06624C72DDD276E
:103BF00085E98715C8F5C659D040CE01AA2797FD9B
:103C0000A095BA2FCA56DF4FBC01CD010E94CEC489
:103C1000DC01CB012DEC3CEC4CE45FE3BC01CD01BD
:103C20000E94BBC5DC01CB01BC01CD010E94A0C438
:103C3000DC01CB0101E026E0482F68E18FE30E9420
:103C40005F6ECC0FDD1FCC52D140E62C062D23E059
:103C500030E0AE0165E084E00E94347701E028E0C6
:103C600042E067E18EE345C086E9882E912C8C1AEC
:103C70009D0AC401AA2797FDA095BA2FBC01CD01CA
:103C80000E94CEC4DC01CB012DEC3CEC4CE45FE3A4
:103C9000BC01CD010E94BBC57B018C010E94A0C468
:103CA0005B016C01A801970160E070E08CE792E491
:103CB0000E94C7C3DC01CB01BC01CD010E94A0C49E
:103CC000DC01CB0101E026E04A2D68E10E945F6E35
:103CD000C401880D991DE62C062D23E030E0AC01CF
:103CE00065E084E00E94347701E028E042E067E18B
:103CF0008DE30E945F6EE72CFF2400E023E030E0BC
:103D0000A70165E08CE00E94D37801E02FE143E059
:103D100067E1842F0E949C6D2FE147E1642F842F7F
:103D20000E949C6D2FE14BE267E1842F0E949C6D05
:103D30002FE143E567E1842F0E949C6D2FE147E668
:103D400067E1842F0E949C6D2FE14BE767E1842F90
:103D50000E949C6DC701AA2797FDA095BA2FBC01B0
:103D6000CD010E94CEC4DC01CB0120E030E048E46C
:103D700050E4BC01CD010E94BBC5DC01CB01BC01FC
:103D8000CD010E94A0C4DC01CB01909389008093F7
:103D9000880080E20E944238882309F439CE80EFFF
:103DA0000E944238DF91CF911F910F91FF90EF90C9
:103DB000DF90CF90BF90AF909F908F907F906F904B
:103DC00008950E94AA6B22E042ED51E563E080E095
:103DD0000E94EE7022E048EE51E564E080E00E942F
:103DE000EE7020E137E284EF91E00197F1F7215086
:103DF0003040C9F70895BF92CF92DF92EF92FF92C1
:103E00000F931F93CF93C82FB62EF42E122FC82EC8
:103E1000DD24D092133EC092123E0E94AA6B812FE5
:103E200099270E9438BC20E0AC0162E0822F0E94FA
:103E30002F71EE240E2D23E030E0A60162E080E138
:103E40000E94277882E090E00E9438BC2E2DAC01C1
:103E500067E08E2D0E942F7180E40E9442388823F3
:103E600031F463E080E40E948638882389F0CF151E
:103E700078F481E08093332EC80F8C2F9927EE249D
:103E80000E2D23E030E0AC0162E080E10E94277853
:103E900080E80E944238882331F463E080E80E9481
:103EA0008638882389F0BC1678F481E08093332E1D
:103EB000C1508C2F9927EE240E2D23E030E0AC0169
:103EC00062E080E10E94277880E10E944238182F4A
:103ED000882319F08C2F99270EC080E20E94423867
:103EE000882309F4B9CF80EF0E9442381093332E13
:103EF0008091123E9927CF911F910F91FF90EF90E3
:103F0000DF90CF90BF900895DF92EF92FF920F93D2
:103F10001F93CF93C82FD62EF42E122F0E94AA6B78
:103F2000812F99270E9438BC20E0AC0162E0822FEB
:103F30000E942F718C2F99279093133E8093123EED
:103F4000EE240E2D23E030E0AC0162E080E10E941F
:103F5000347782E090E00E9438BC2E2DAC0167E0FF
:103F60008E2D0E942F7180E40E944238882331F404
:103F700062E080E40E948638882389F0CF1578F4C7
:103F800081E08093332EC80F8C2F9927EE240E2DBD
:103F900023E030E0AC0162E080E10E94347780E809
:103FA0000E944238882331F462E080E80E9486381B
:103FB000882389F0DC1678F481E08093332EC15099
:103FC0008C2F9927EE240E2D23E030E0AC0162E027
:103FD00080E10E94347780E10E944238182F8823C4
:103FE00019F08C2F99270EC080E20E944238882356
:103FF00009F4B9CF80EF0E9442381093332E80919C
:10400000123E9927CF911F910F91FF90EF90DF9073
:104010000895AF92BF92CF92DF92EF920F931F93CA
:10402000CF93DF93EC015B016A01122F0E94AA6B10
:10403000812F99270E9438BC20E0AC0162E0822FDA
:104040000E942F71D093133EC093123EEE240E2D8A
:1040500025E030E0AE0162E080E10E94347782E04A
:1040600090E00E9438BC2E2DAC0167E08E2D0E949E
:104070002F7180E40E944238882331F463E080E4A9
:104080000E948638882381F0CC15DD0568F481E034
:104090008093332E2196EE240E2D25E030E0AE01E4
:1040A00062E080E10E94347780E80E9442388823F1
:1040B00031F463E080E80E948638882381F0AC16F2
:1040C000BD0668F481E08093332E2197EE240E2DF7
:1040D00025E030E0AE0162E080E10E94347780E1CB
:1040E0000E944238182F882311F0AE010FC080E2E1
:1040F0000E944238882309F4BCCF80EF0E944238E6
:104100001093332E4091123E5091133ECA01DF911D
:10411000CF911F910F91EF90DF90CF90BF90AF9014
:104120000895FF920F931F93CF93F82E082F112716
:104130001093133E0093123E0E94AA6B84E390E01A
:104140000E9438BC20E0AC0161E0822F0E942F71F8
:1041500085E390E00E9438BC20E0AC0162E0822F51
:104160000E942F71C091AD37CC2309F056C084E373
:1041700090E00E9438BC2C2FAC0161E08C2F0E9493
:104180002F7186E390E00E9438BC2C2FAC0162E0D6
:104190008C2F0E942F7187E390E00E9438BC2C2F57
:1041A000AC0161E08C2F0E942F7188E390E00E94A7
:1041B00038BC2C2FAC0162E08C2F0E942F7189E358
:1041C00090E00E9438BC2C2FAC0161E08C2F0E9443
:1041D0002F718AE390E00E9438BC2C2FAC0162E082
:1041E0008C2F0E942F718BE390E00E9438BC2C2F03
:1041F000AC0161E08C2F0E942F718CE190E00E9455
:1042000038BC2C2FAC0167E08CE00E942F7180E25B
:104210000E9442388823D9F380C00115110521F08E
:104220000130110549F012C020E04DEF51E562E088
:104230008EE00E94EE700AC082E590E00E9438BCD9
:1042400020E0AC0162E08EE00E942F7182E090E0FD
:104250000E9438BC20E0AC0167E0822F0E942F71E1
:10426000C091AD37C13009F052C080E40E9442389D
:10427000882391F0FF2081F4C093332EFC2E82E539
:1042800090E00E9438BC20E0AC0162E08EE00E9429
:104290002F7186E00E94B25780E80E94423888233E
:1042A00081F081E0F81669F4F092332EFF242F2D6F
:1042B00043E052E562E08EE00E94EE7085E00E94ED
:1042C000B25780E10E944238882309F18CE390E0E4
:1042D0000E9438BC20E0AC0164E0822F0E942F7164
:1042E0008DE390E00E9438BC20E0AC0165E0822FB5
:1042F0000E942F7142E167E080E00E944C7180E1F2
:104300000E9442388823D9F38F2D99270EC080E26E
:104310000E944238882309F4A3CF80EF0E944238DC
:104320001092332E8091123E9927CF911F910F91B9
:10433000FF9008951F93CF93DF93182FC82FDD2789
:10434000D093133EC093123E0E94AA6B89E690E080
:104350000E9438BC20E0AC0162E0822F0E942F71E5
:10436000209719F0219739F010C083E590E005C03F
:10437000812F992751C084E590E00E9438BC20E04D
:10438000AC0162E08FE00E942F7182E090E00E9419
:1043900038BC20E0AC0167E0822F0E942F7180E4DE
:1043A0000E944238882381F0112371F481E08093C8
:1043B000332E182F84E590E00E9438BC20E0AC0139
:1043C00062E08FE00E942F7180E80E9442388823CB
:1043D00079F0113069F41093332E10E083E590E00A
:1043E0000E9438BC212FAC0162E08FE00E942F7147
:1043F00080E10E944238C82F882309F0B9CF80E2BB
:104400000E944238882359F280EF0E944238C093BC
:10441000332E8091123E9927DF91CF911F910895FD
:104420000F931F93CF93DF93082F122FC82FDD27F1
:10443000D093133EC093123E0E94AA6B812F9927FE
:104440000E9438BC20E0AC0162E0822F0E942F71F4
:10445000209719F0219739F010C08CE290E005C048
:10446000802F992751C08BE290E00E9438BC20E059
:10447000AC0162E081E10E942F7182E090E00E9435
:1044800038BC20E0AC0167E0822F0E942F7180E4ED
:104490000E944238882379F0002369F401E00093F8
:1044A000332E8BE290E00E9438BC20E0AC0162E049
:1044B00081E10E942F7180E80E944238882381F0B8
:1044C000013071F400E081E08093332E8CE290E0C3
:1044D0000E9438BC202FAC0162E081E10E942F7164
:1044E00080E10E944238C82F882309F0B9CF80E2CA
:1044F0000E944238882359F280EF0E944238C093CC
:10450000332E8091123E9927DF91CF911F910F9109
:1045100008950F931F93CF93DF93082F122FC82F67
:10452000DD27D093133EC093123E0E94AA6B812FC9
:1045300099270E9438BC20E0AC0162E0822F0E94E3
:104540002F71209719F0219739F010C080E790E083
:1045500005C0802F992751C08FE690E00E9438BC9B
:1045600020E0AC0162E081E10E942F7182E090E0E6
:104570000E9438BC20E0AC0167E0822F0E942F71BE
:1045800080E40E944238882379F0002369F401E036
:104590000093332E8FE690E00E9438BC20E0AC01FF
:1045A00062E081E10E942F7180E80E9442388823F6
:1045B00081F0013071F400E081E08093332E80E7D8
:1045C00090E00E9438BC202FAC0162E081E10E94A3
:1045D0002F7180E10E944238C82F882309F0B9CF9B
:1045E00080E20E944238882359F280EF0E944238CC
:1045F000C093332E8091123E9927DF91CF911F9166
:104600000F910895EF92FF920F931F93CF93DF9333
:10461000082FF62EE42E122FC82FDD27D093133E3D
:10462000C093123E0E94AA6B812F99270E9438BC2A
:1046300020E0AC0162E0822F0E942F71C230D105D0
:10464000C9F0C330D1052CF4209761F0219771F0A7
:1046500027C0C430D105B1F0C430D1057CF0259716
:10466000C1F01EC020E049E052E516C020E040E164
:1046700052E512C020E047E152E50EC020E04EE1D5
:1046800052E50AC020E046E252E506C0802F992795
:104690009EC020E04DE252E562E08FE00E94EE70A5
:1046A00082E090E00E9438BC20E0AC0167E0822FFD
:1046B0000E942F7180E40E9442388823B9F10E15C0
:1046C000A8F581E08093332E080F802F9927823040
:1046D0009105C9F0833091052CF4009761F00197A2
:1046E00071F024C084309105B1F0843091057CF0E4
:1046F0000597A9F01BC020E044E352E513C020E079
:104700004BE352E50FC020E042E452E50BC020E04D
:1047100049E452E507C020E041E552E503C020E04E
:1047200048E552E562E08FE00E94EE7080E80E946A
:1047300042388823B9F1F016A8F581E08093332E32
:104740000150802F992782309105C9F0833091055F
:104750002CF4009761F0019771F024C0843091052A
:10476000B1F0843091057CF00597A9F01BC020E0E2
:104770004FE552E513C020E046E652E50FC020E0C9
:104780004DE652E50BC020E044E752E507C020E0CB
:104790004CE752E503C020E043E852E562E08FE0D9
:1047A0000E94EE7080E10E944238C82F882309F0F1
:1047B0006DCF80E20E944238882309F47BCF80EFDE
:1047C0000E944238C093332E8091123E9927DF9188
:1047D000CF911F910F91FF90EF900895EF92FF926C
:1047E0000F931F93CF93DF93082FF62EE42E122FF3
:1047F000C82FDD27D093133EC093123E0E94AA6BB0
:10480000812F99270E9438BC20E0AC0162E0822F02
:104810000E942F71C130D10579F0C230D1051CF44E
:10482000CD2B39F01CC0C230D10549F0239769F077
:1048300016C089E590E00BC08AE590E008C08BE5E2
:1048400090E005C0802F992787C08CE590E00E94FA
:1048500038BC20E0AC0162E08AE00E942F7182E067
:1048600090E00E9438BC20E0AC0167E0822F0E94FB
:104870002F7180E40E944238882351F10E1540F5D3
:1048800081E08093332E080F802F99278130910586
:1048900079F0823091051CF4892B39F019C08230EF
:1048A000910549F0039751F013C089E590E008C0E5
:1048B0008AE590E005C08BE590E002C08CE590E0D1
:1048C0000E9438BC20E0AC0162E08AE00E942F71B7
:1048D00080E80E944238882351F1F01640F581E0CB
:1048E0008093332E0150802F99278130910579F0E4
:1048F000823091051CF4892B39F019C08230910562
:1049000049F0039751F013C089E590E008C08AE5AB
:1049100090E005C08BE590E002C08CE590E00E943D
:1049200038BC20E0AC0162E08AE00E942F7180E197
:104930000E944238C82F882309F084CF80E20E9469
:104940004238882309F495CF80EF0E944238C09303
:10495000332E8091123E9927DF91CF911F910F91B5
:10496000FF90EF9008950F931F93CF93DF93082F3D
:10497000122FC82FDD27D093133EC093123E0E9402
:10498000AA6B812F99270E9438BC20E0AC0162E01D
:10499000822F0E942F71209719F0249721F00DC0CB
:1049A00084E590E002C085E590E00E9438BC20E0FC
:1049B000AC0162E08EE00E942F7182E090E00E94E4
:1049C00038BC20E0AC0167E0822F0E942F7180E4A8
:1049D0000E944238882369F0002359F404E085E5F9
:1049E00090E00E9438BC20E0AC0162E08EE00E94C2
:1049F0002F7180E80E944238882369F0043059F40E
:104A000000E084E590E00E9438BC202FAC0162E019
:104A10008EE00E942F7180E10E944238C82F8823C7
:104A2000D9F081E08093332EF8942B98002329F459
:104A300081EA0E949C6B80EC04C080EA0E949C6B1F
:104A400088EC0E949C6B2B9A78940093103E0E94F5
:104A5000D55F802F99270EC080E20E9442388823BC
:104A600009F4B5CF80EF0E944238C093332E809175
:104A7000123E9927DF91CF911F910F9108950F93C7
:104A80001F93CF93DF93082F122FC82FDD27D093CA
:104A9000133EC093123E0E94AA6B812F99270E9459
:104AA00038BC20E0AC0162E0822F0E942F71209779
:104AB00019F0249721F00DC084E590E002C085E54F
:104AC00090E00E9438BC20E0AC0162E08EE00E94E1
:104AD0002F7182E090E00E9438BC20E0AC0167E0DA
:104AE000822F0E942F7180E40E944238882369F04F
:104AF000002359F404E085E590E00E9438BC20E0F2
:104B0000AC0162E08EE00E942F7180E80E94423882
:104B1000882369F0043059F400E084E590E00E94B5
:104B200038BC202FAC0162E08EE00E942F7180E142
:104B30000E944238C82F8823A9F081E08093332E49
:104B4000F8942B98002311F486EA01C087EA0E94AA
:104B50009C6B2B9A7894009373370E94D55F802FBB
:104B6000992710C080E20E944238882309F4BBCF05
:104B700080EF0E944238C093332E8091123E809382
:104B800073379927DF91CF911F910F910895BF92AD
:104B9000CF92DF92EF92FF920F931F93CF93C82F84
:104BA000B62EF42E122FC82EDD24D092133EC092C2
:104BB000123E0E94AA6B812F99270E9438BC20E0E8
:104BC000AC0162E0822F0E942F71EE240E2D23E0B3
:104BD00030E0A60162E080E10E94347782E090E05C
:104BE0000E9438BC2E2DAC0167E08E2D0E942F71E3
:104BF000CC2EDD24EE240E2D23E030E0A60162E071
:104C000080E10E943477CC0CDD1C01E026E04C2DC5
:104C100060E28E2D0E945F6E80E40E9442388823FD
:104C200031F462E080E40E9486388823C1F0CF1519
:104C3000B0F4CF5FCF1548F0CF2D40E060E870E0D2
:104C400088EC90E00E942A360AC0F8942B9881E8FC
:104C50000E949C6B8C2F0E949C6B2B9A789480E80E
:104C60000E944238882331F462E080E80E9486384E
:104C7000882301F1BC16F0F48C2F880F00E026E0A9
:104C800040E860E282500E945F6EC150CB1541F453
:104C9000402F60E870E088EC90E00E942A360AC05D
:104CA000F8942B9881E80E949C6B8C2F0E949C6B3F
:104CB0002B9A7894CC2EDD24EE240E2D23E030E0C8
:104CC000A60162E080E10E94347780E10E944238D0
:104CD000882349F081E08093332EC09307380E94E7
:104CE000D55FA60120C080E20E944238882309F4E3
:104CF0007FCF80EF0E944238F8942B9881E80E9481
:104D00009C6B8091123E0E949C6B2B9A789410921F
:104D1000332E8091123E809307380E94D55F809198
:104D2000123E482F5527CA01CF911F910F91FF9036
:104D3000EF90DF90CF90BF900895BF92CF92DF9217
:104D4000EF92FF920F931F93CF93C82FB62EF42E9E
:104D5000122FC82EDD24D092133EC092123EC601FF
:104D6000AA2797FDA095BA2FBC01CD010E94CEC401
:104D7000DC01CB0123E333E343E250E4BC01CD018A
:104D80000E94BBC5DC01CB01BC01CD010E94A0C4C7
:104D9000DC01CB018093B3000E94AA6B812F99277D
:104DA0000E9438BC20E0AC0162E0822F0E942F718B
:104DB000EE240E2D23E030E0A60162E080E10E94A7
:104DC00034772E2D4AE852E562E081E10E94EE70D0
:104DD00082E090E00E9438BC2E2DAC0167E08E2D61
:104DE0000E942F71CC2EDD24EE240E2D23E030E026
:104DF000A60162E080E10E943477C6019695982F63
:104E000088279795879564E670E00E94E2C601E0E6
:104E100026E0462F60E28E2D0E945F6E80E40E94A5
:104E20004238882331F463E080E40E948638882386
:104E300061F1CF1550F5CF5FCF1548F0CF2D40E091
:104E400060E870E088EC90E00E942A361EC08C2F4B
:104E50009927AA2797FDA095BA2FBC01CD010E94E2
:104E6000CEC4DC01CB0123E333E343E250E4BC01D5
:104E7000CD010E94BBC5DC01CB01BC01CD010E946C
:104E8000A0C4DC01CB018093B30080E80E944238CB
:104E9000882339F463E080E80E948638882309F487
:104EA0003FC0BC16E8F58C2F99279695982F882738
:104EB000979587958058904064E670E00E94E2C61E
:104EC000CB0100E026E040E860E20E945F6EC15046
:104ED000CB1541F4402F60E870E088EC90E00E9430
:104EE0002A361EC08C2F9927AA2797FDA095BA2F86
:104EF000BC01CD010E94CEC4DC01CB0123E333E32E
:104F000043E250E4BC01CD010E94BBC5DC01CB01F2
:104F1000BC01CD010E94A0C4DC01CB018093B30091
:104F200080E10E944238182F882339F181E0809374
:104F3000332E0C2F1127C801AA2797FDA095BA2F51
:104F4000BC01CD010E94CEC4DC01CB0123E333E3DD
:104F500043E250E4BC01CD010E94BBC5DC01CB01A2
:104F6000BC01CD010E94A0C4DC01CB018093B30041
:104F7000C09380370E94D55F3AC080E20E944238D9
:104F8000882309F42FCF80EF0E9442381093332EEC
:104F90000091123E1091133EC801AA2797FDA095DB
:104FA000BA2FBC01CD010E94CEC417FF06C020E07D
:104FB00030E040E857E40E94C8C323E333E343E210
:104FC00050E40E94BBC5DC01CB01BC01CD010E94B5
:104FD000A0C4DC01CB018093B3008091123E80938A
:104FE00080370E94D55F8091123E082F1127C8019B
:104FF000CF911F910F91FF90EF90DF90CF90BF90D6
:1050000008950E94AA6B80EF0E94423887E590E0E5
:105010000E9438BC20E0AC0162E0822F0E942F7118
:1050200088E590E00E9438BC20E0AC0163E0822F6C
:105030000E942F7186E590E00E9438BC20E0AC0110
:1050400067E08CE00E942F7180E10E944238882343
:1050500019F00E944262089580E20E94423888233B
:1050600099F380EF0E94423808959F92AF92BF92C9
:10507000CF92DF92EF92FF920F931F93CF93DF9324
:10508000CC249C2C71E0A72E0E94AA6BC092D12F39
:10509000C092332EC092322EBC2C0E94AA6B8DE59A
:1050A00090E00E9438BC22E0AC0160E0862F0E94B4
:1050B0002F7181E090E00E9438BC20E0AC0167E0F5
:1050C000822F0E942F71DD24CC2039F02D2D4CE849
:1050D00052E561E0862F0E94EE70EE24FF240C2D35
:1050E0001127E701C00FD11FC830D105D4F488E4DF
:1050F00090E0C89FA001C99F500DD89F500D11246A
:105100009091CA3782E1989FC0011124480F591F1E
:105110004E5C534B8D2D8F5F20E0682F83E00E9403
:10512000EE7085E0D81649F427973CF420E04EE86D
:1051300052E566E081E00E94EE70D3940894E11C91
:10514000F11C85E08D1558F6992059F4CC2031F4E6
:1051500001E02C2D4A2D682F802F15C001E0202F53
:105160000FC081E0981691F4095F1F4F09301105B7
:105170002CF000E0292D4A2D66E004C0092D292DD0
:105180004A2D65E082E00E940C32B82E8EEFB816F0
:1051900031F4C39461E0962E55E0A52E94CF8DEFA7
:1051A000B81629F4CA94992442E0A42E8CCF8FEF2C
:1051B000B81641F48091332E813009F09CC00E94D2
:1051C000D55F99C0AB2C0B2D1127EC2CFF24E801E7
:1051D000CE0DDF1DC130D10549F42EE542E060E07F
:1051E000809181370E9410A280938137C230D1050F
:1051F00049F425E642E060E08091A8370E9410A2C1
:105200008093A837C330D10549F42FE543E060E02F
:105210008091CA370E94EEA38093CA37C430D1056B
:1052200049F420E64EEF60E0809109380E94849FA7
:1052300080930938259749F421E644E660E080919F
:1052400080370E949DA6809380379091332E9130B5
:1052500031F48091322E882311F49093322EC801BC
:105260008E0D9F1D069749F422E64FE360E0809182
:1052700007380E94C7A5809307389091332E91304C
:1052800031F48091322E882311F49093322EC8018C
:105290008E0D9F1D079799F423E644E060E080910E
:1052A00073370E943FA5809373379091332E9130CE
:1052B00031F48091322E882311F49093322E0E0D0A
:1052C0001F1D0830110509F0E8CE24E644E060E037
:1052D0008091103E0E94B3A48093103E9091332E93
:1052E000913009F0DACE8091322E882309F0D5CEA4
:1052F0009093322ED2CEDF91CF911F910F91FF90DC
:10530000EF90DF90CF90BF90AF909F9008959F92C5
:10531000AF92BF92CF92DF92EF92FF920F931F93C3
:10532000CF93DF93CC249C2CB1E0AB2EC092D12F35
:10533000C092332EBC2C0E94AA6B0E94AA6B81ECF7
:1053400090E00E9438BC22E0AC0160E0862F0E9411
:105350002F7181E090E00E9438BC20E0AC0167E052
:10536000822F0E942F71DD24CC2039F02D2D40E9B1
:1053700052E561E0862F0E94EE70EE24FF240C2D92
:105380001127E701C00FD11FC330D105D4F488E441
:1053900090E0C89FA001C99F500DD89F500D1124C7
:1053A0009091CA3782E1989FC0011124480F591F7C
:1053B0004E5A5B4B8D2D8F5F20E0682F83E00E945B
:1053C000EE7085E0D81649F422973CF420E042E9DB
:1053D00052E566E081E00E94EE70D3940894E11CEF
:1053E000F11C95E09D1558F6992059F4CC2031F424
:1053F0000C2D2C2D4A2D63E081E015C001E0202FFB
:105400000FC081E0981691F4095F1F4F0430110519
:105410002CF000E0292D4A2D66E004C0092D292D2D
:105420004A2D65E082E00E940C32B82E9EEFB9163C
:1054300031F4C394A1E09A2EF5E0AF2E94CF8DEF16
:10544000B81629F4CA949924E2E0AE2E8CCF9FEFCF
:10545000B91641F48091332E813009F03FC00E948B
:10546000D55F3CC0AB2C8B2D8C0D912D911DEC018B
:10547000019779F422EC40E65AEE6AEF70E08091F1
:105480000A3890910B380E9409A090930B388093B2
:105490000A38C230D10579F423EC44E650E060E0EC
:1054A00070E080917137909172370E9409A09093BB
:1054B000723780937137239709F03FCF24EC44E192
:1054C00050E061E070E08091C5379091C6370E944E
:1054D00009A09093C6378093C5372FCFDF91CF9126
:1054E0001F910F91FF90EF90DF90CF90BF90AF9002
:1054F0009F9008959F92AF92BF92CF92DF92EF92CA
:10550000FF920F931F93CF93DF93CC249C2C81E0C9
:10551000A82EBC2CC092D12FC092332E0E94AA6B11
:105520000E94AA6B22E044E952E560E0862F0E94C7
:10553000EE7081E090E00E9438BC20E0AC0167E0B2
:10554000822F0E942F71DD24CC2039F02D2D4AEAC4
:1055500052E561E0862F0E94EE70EE24FF240C2DB0
:105560001127E701C00FD11FC930D105D4F488E459
:1055700090E0C89FA001C99F500DD89F500D1124E5
:105580009091CA3782E1989FC0011124480F591F9A
:105590004655564B8D2D8F5F20E0682F83E00E948B
:1055A000EE7085E0D81649F428973CF420E04CEAE8
:1055B00052E566E081E00E94EE70D3940894E11C0D
:1055C000F11C95E09D1558F6992059F4CC2031F442
:1055D00001E02C2D4A2D692F802F15C001E0202FCE
:1055E0000FC081E0981691F4095F1F4F0A30110532
:1055F0002CF000E0292D4A2D66E004C0092D292D4C
:105600004A2D65E082E00E940C32B82E9EEFB9165A
:1056100031F4C39401E0902E15E0A12E94CF8DEFCC
:10562000B81629F4CA949924C2E0AC2E8CCF9FEF0F
:10563000B91681F48091332E813009F072C08091C7
:10564000AD37813021F48091D2370E94FF4C0E9407
:10565000D55F67C0AB2C8B2D8C0D912D911DEC016E
:10566000019749F42CE641E060E08091AD370E945B
:1056700089A28093AD37C230D10549F427E645E0D1
:1056800060E08091D9370E94849F8093D937C330DE
:10569000D10549F428E64FE760E08091AA370E94DF
:1056A000849F8093AA37C430D10531F48091D137DB
:1056B0000E949AA18093D137C530D10549F42AE6DA
:1056C0004FE760E08091A5370E94849F8093A537C3
:1056D000C630D10549F42BE64FE760E08091AB3747
:1056E0000E94849F8093AB37C730D10569F420ECCA
:1056F00045E060E08091D2370E9402A38093D237C8
:105700008091D2378093EA2BC830D10521F4809163
:10571000D2370E94FF4C299709F002CF0E94EB5923
:10572000FFCEDF91CF911F910F91FF90EF90DF900F
:10573000CF90BF90AF909F9008959F92AF92BF92ED
:10574000CF92DF92EF92FF920F931F93CF93DF934D
:10575000EC01E62EB42E890131E0932EF92CAA2417
:105760000E94AA6B22E0A8016A2D8A2D0E94EE7089
:105770001A2DAE14D0F42BEFC22E2DE3D22E8F2D86
:10578000F39420E0488163E00E94866F8F2DF394AC
:1057900020E04EEA52E563E00E94EE708991F60146
:1057A00081936F011F5F1E1550F301E02AE0422F25
:1057B00066E183E00E94717120E040EB52E566E013
:1057C000822F0E94EE7020E04FEB52E567E0822FBF
:1057D0000E94EE70F1E0BF1609F068C09AE0E4E0C4
:1057E000FEE380813197803209F05DC09150C9F7A6
:1057F00080E40E944238882331F462E080E40E9411
:105800008638882341F1EA2DFF27E550F24C80814C
:105810008A3708F58F5F8083803210F480E28083BE
:10582000808181528F3010F480E3808380818A539D
:10583000873010F481E4808380818B55863010F4AA
:1058400081E6808320E0408163E0892D0E94866F9D
:1058500081E08093332E80E80E944238882339F417
:1058600062E080E80E948638882309F46CC0EA2D43
:10587000FF27E550F24C8081813208F464C08150EA
:1058800080838B55863010F48AE5808380818A532B
:10589000873010F489E38083808181528F3008F053
:1058A00049C080E246C09093113EA2CF82E0B81674
:1058B00009F049C080E40E944238882331F461E055
:1058C00080E40E9486388823E1F0EA2DFF27E55026
:1058D000F24C80818933A8F48F5F8083803210F48A
:1058E00080E28083808181528F3010F480E3808356
:1058F00020E0408163E0892D0E94866F81E08093E3
:10590000332E80E80E944238882331F461E080E839
:105910000E9486388823B9F0EA2DFF27E550F24C23
:105920008081813380F0815080838A53873010F4E6
:1059300089E3808320E0408163E0892D0E94866FA7
:1059400081E08093332E80E20E9465388823F9F04D
:10595000E1E0BE1631F4EA2DFF27E550F24C80E27B
:1059600008C0F2E0BF1631F4EA2DFF27E550F24CF3
:1059700080E38083EA2DFF27E550F24C20E0408150
:1059800063E0892D0E94866F81E08093332E80E250
:105990000E944D38882309F443C081E0B81611F401
:1059A0008AE004C0E2E0BE1619F484E08093143E5D
:1059B000892D8695992702962091143E3327281722
:1059C0003907B4F486E0989EC001112400E02AE073
:1059D000422F66E183500E94717191E0992E092D4A
:1059E0002AE0422F66E183E00E947171AA2418C068
:1059F00016E0919EC001112400E02AE0422F66E1EA
:105A000083500E947171F2E09F0E919EC00111249B
:105A100001E02AE0422F66E183500E947171A00EDE
:105A200080E10E944238882309F4D4CE81E090E0DE
:105A3000DF91CF911F910F91FF90EF90DF90CF906A
:105A4000BF90AF909F9008956F927F928F929F9298
:105A5000AF92BF92CF92DF92EF92FF920F931F937C
:105A6000CF93DF9377246090EF2B972CA1E08A2EC1
:105A7000B72C7092D12F7092332E0E94AA6B0E9485
:105A8000AA6B22E044ED52E560E0862F0E94EE70A2
:105A900081E090E00E9438BC20E0AC0167E0822FFA
:105AA0000E942F71AA24772039F02A2D4AEE52E560
:105AB00061E0862F0E94EE70CC24DD24E72CFF24C9
:105AC000C6018E0D9F1DC62DDD278C179D0704F581
:105AD0008C01F5E0000F111FFA95E1F7080F191F6F
:105AE000080F191F4EE050E06AED77E3C801865EAB
:105AF0009E4C0E9472C2A8014A5F5E4C6A2D6F5F85
:105B0000892B11F422E001C020E083E00E942F7174
:105B100085E0A81679F485E090E0E80EF91E21975B
:105B2000EC16FD063CF420E04CEE52E566E081E028
:105B30000E94EE70A3940894C11CD11C95E09A15A4
:105B400008F0BCCF9920A1F4772079F486E086157F
:105B500030F401E0292D482D692F802F1EC0092D1A
:105B6000292D482D662D81E018C001E0202F12C09C
:105B700091E09916A9F4872D99270796262D3327AA
:105B8000281739072CF400E0292D482D66E004C0C1
:105B9000092D292D482D65E082E00E940C32B82E97
:105BA0008EEFB81631F47394E1E09E2E75E0872EE7
:105BB00079CF9DEFB91629F47A94992462E0862E64
:105BC00071CF8FEFB81639F48091332E8130A9F55B
:105BD0000E94D55F32C08B2CBB2009F450CF2B2DF7
:105BE0003327AAEDB7E3F90155E0EE0FFF1F5A95F1
:105BF000E1F7E20FF31FE20FF31FE850FF4C9DE0C7
:105C000081918D93915097FFFBCFAEEAB7E3F901F5
:105C100045E0EE0FFF1F4A95E1F7E20FF31FE20F99
:105C2000F31FEC51FF4C93E181918D93915097FFBD
:105C3000FBCF81E08093332E22CFDF91CF911F9154
:105C40000F91FF90EF90DF90CF90BF90AF909F901B
:105C50008F907F906F9008954F925F926F927F9296
:105C60008F929F92AF92BF92CF92DF92EF92FF926C
:105C70000F931F93CF93DF93CDB7DEB765970FB622
:105C8000F894DEBF0FBECDBF6624562C81E0482EAF
:105C90006092D12F6092332E762C0E94AA6B0E94C4
:105CA000AA6B81E790E00E9438BC22E0AC0160E082
:105CB000862F0E942F7181E090E00E9438BC20E086
:105CC000AC0167E0822F0E942F71BB24662039F05F
:105CD0002B2D4EEE52E561E0862F0E94EE70CC2413
:105CE000DD24E62CFF2486010E0D1F1D0530110555
:105CF000D4F488E490E0089FA001099F500D189FFC
:105D0000500D11249091CA3782E1989FC00111244F
:105D1000480F591F4E5B574B8B2D8F5F20E0682F2C
:105D200083E00E94EE7085E0B81651F4043011054E
:105D30003CF420E040EF52E566E081E00E94EE7026
:105D4000B3940894C11CD11C95E09B1550F65520C6
:105D500059F4662031F4052D252D442D692F81E05D
:105D600018C001E0202F12C0E1E05E16A9F487E020
:105D700090E0E80EF91E96E0E916F1042CF000E040
:105D8000252D442D66E004C0052D252D442D65E00C
:105D900082E00E940C32782EEEEF7E1609F4B4C039
:105DA000FDEF7F1609F4ADC08FEF781609F4CAC075
:105DB0001091332E113071F48091A9370E94FF5257
:105DC000892B19F01093C83702C01092C8370E946F
:105DD000D55FB8C0472CA72CBB24862C99248501FD
:105DE000080D191D0130110549F424E741E060E078
:105DF0008091A9370E9489A28093A93702301105AA
:105E0000E9F5DE011196E5E7F7E369E081918D930D
:105E1000615067FFFBCF6AE01B8622EF32E541E06D
:105E2000CE0101960E949DAB8091332E813031F5D9
:105E300010E08091113E181768F4E12FFF27DF0171
:105E4000A550B24C8C91EB58F84C80830E94D55FE2
:105E50001F5FEFCF8091113E8A3080F4982F082F7A
:105E600011270B58184C80E2F80181938F019D8B0C
:105E70000E94D55F9D899F5F9A30A8F3C501880D68
:105E8000991D039759F5DE011196E4EDF7E363E000
:105E900081918D93615067FFFBCF64E01D8228E004
:105EA00033E542E0CE0101960E949DAB8091332EF6
:105EB0008130A1F404EDC02E07E3D02E1BEFE12EBC
:105EC0001DE3F12E13E0F70181917F01F60181932B
:105ED0006F010E94D55F115017FFF5CFC501880DE6
:105EE000991D049729F50E94FF52019789F420E03B
:105EF0004EE153E563E0822F0E94EE700E945F5FE7
:105F000017C06A94552466CF6394B1E05B2E62CFCC
:105F100020E049E253E563E0822F0E94EE70109288
:105F2000C83740E060E470E088EE93E00E942A36D3
:105F3000A80CB91CF5E0AF16B10409F0B0CE0E9470
:105F4000F258ADCE65960FB6F894DEBF0FBECDBF4A
:105F5000DF91CF911F910F91FF90EF90DF90CF9045
:105F6000BF90AF909F908F907F906F905F904F9079
:105F700008957F928F929F92AF92BF92CF92DF92BD
:105F8000EF92FF920F931F93CF93DF93BB247B2C51
:105F900071E0872EAB2CB092D12FB092332E9B2C78
:105FA0000E94AA6B0E94AA6B85E990E00E9438BC0F
:105FB00022E0AC0160E0862F0E942F7181E090E02A
:105FC0000E9438BC20E0AC0167E0822F0E942F7154
:105FD000DD24BB2039F02D2D47E353E561E0862F0A
:105FE0000E94EE70EE24FF240B2D1127E701C00F55
:105FF000D11FC630D105D4F488E490E0C89FA00139
:10600000C99F500DD89F500D11249091CA3782E13D
:10601000989FC0011124480F591F4E5F594B8D2D79
:106020008F5F20E0682F83E00E94EE7085E0D81635
:1060300049F425973CF420E049E353E566E081E02C
:106040000E94EE70D3940894E11CF11CE5E0ED157C
:1060500058F6772059F4BB2031F40B2D2B2D482D09
:1060600066E081E015C001E0202F0FC0F1E07F164F
:1060700091F4095F1F4F073011052CF000E0272D28
:10608000482D66E004C0072D272D482D65E082E0ED
:106090000E940C32982E8EEF981631F4B39461E082
:1060A000762E55E0852E94CFEDEF9E1629F4BA9406
:1060B000772442E0842E8CCFFFEF9F1679F48091F5
:1060C000332E813009F00CC2AA2009F409C20E94C3
:1060D000F1490E94FF520E94BC4802C2892CE92C5F
:1060E000FF24CB2CDD24C7018C0D9D1D0197C9F425
:1060F0000091EF2B002399F40E94AA6B202F4BE311
:1061000053E5602F802F0E94EE700E94F14931E02C
:10611000A32E0E94A2560E94D0560E94BC480E9404
:1061200024ADE701CC0DDD1DC230D105A9F40E94DC
:10613000AA6B20E04BE453E5622F822F0E94EE70A1
:106140000E94F14921E0A22E0E94A2560E94D05640
:106150000E94BC480E9424AD249779F427E941E0CD
:1061600060E08091CB370E9489A28093CB378091E9
:10617000332E813011F40E94D55FC7018C0D9D1D17
:106180000597F1F50E94AA6B86E990E00E9438BC61
:1061900022E0AC0160E0862F0E942F718DE190E03B
:1061A0000E9438BC20E0AC0167E082E10E942F71C0
:1061B00020E04BE553E561E0822F0E94EE7020E085
:1061C00043E653E564E0822F0E94EE7020E04EEA41
:1061D00057E362E0822F0E942F71C0E00AED17E3BF
:1061E00020E0F80141918F0165E08C2F0E94866FBD
:1061F000CF5FCC30A8F380E10E9442388823D9F3E6
:10620000EC0CFD1CF6E0EF16F10409F0CBCE0E9479
:10621000AA6B8DE190E00E9438BC20E0AC0167E001
:1062200082E10E942F7122E04EEA57E360E0862F60
:106230000E942F710E94F14991E0A92E8091AC3704
:106240008A1511F40E94A2568AED97E30E94085520
:10625000892B49F020E048E653E56A2D822F0E9401
:10626000EE70A092D02A8091D02A882309F41DC113
:1062700022E042E753E563E080E00E94EE70809107
:10628000163E9091173EA091183EB091193EBC0168
:10629000CD0120E836E948E950E00E9417C7DA014D
:1062A000C901EE240E2D22E030E0AC0164E081E073
:1062B0000E9434772E2D47E853E564E083E00E9486
:1062C000EE708091163E9091173EA091183EB091CD
:1062D000193EBC01CD0128EE33E040E050E00E94C1
:1062E00017C7CA01B90120E137E240E050E00E943F
:1062F00017C7DC01CB0101E024E030E0AC0164E031
:10630000862F0E9434778091163E9091173EA0917F
:10631000183EB091193EBC01CD012AE030E040E0CA
:1063200050E00E9417C7CA01B90124E630E040E0FE
:1063300050E00E9417C7DC01CB0122E030E0AC0145
:1063400064E088E00E9434778091313E9091323E43
:10635000A091333EB091343EBC01CD0120E836E936
:1063600048E950E00E9417C7DA01C9010E2D22E06A
:1063700030E0AC0164E08CE00E9434772E2D49E8D7
:1063800053E564E08EE00E94EE708091313E909182
:10639000323EA091333EB091343EBC01CD0128EE97
:1063A00033E040E050E00E9417C7CA01B90120E184
:1063B00037E240E050E00E9417C7DC01CB0101E06A
:1063C00024E030E0AC0164E08FE00E9434778091FB
:1063D000313E9091323EA091333EB091343EBC01AB
:1063E000CD012AE030E040E050E00E9417C7CA012A
:1063F000B90124E630E040E050E00E9417C7DC011C
:10640000CB0122E030E0AC0164E083E10E9434770C
:106410002E2D4BE853E562E08E2D0E94EE702E2D5E
:1064200044E751E062E08AE00E942F712E2D46E998
:1064300053E566E08E2D0E94EE7080911A3E9927FA
:1064400087FD909522E030E0AC0166E08DE00E948F
:10645000347780E10E944238882309F410CF45E167
:10646000602F8E2D0E944C7145E162E08E2D0E94BE
:106470004C7145E163E08E2D0E944C7145E164E072
:106480008E2D0E944C7145E165E08E2D0E944C716D
:1064900045E166E08E2D0E944C712E2D43EA53E5B6
:1064A00063E08E2D0E94EE700BC0282F4FEA53E55B
:1064B0006A2D0E94EE7080E10E9442388823D9F351
:1064C0001092D02A0E944355892B39F420E043ECE6
:1064D00053E563E0822F0E94EE700E94BC4862CDBB
:1064E000DF91CF911F910F91FF90EF90DF90CF90B0
:1064F000BF90AF909F908F907F9008951F93CF9300
:10650000DF93182FC82FDD27D093133EC093123E80
:106510000E94AA6B86E790E00E9438BC20E0AC01A4
:1065200062E0822F0E942F71209719F0219769F065
:1065300013C020E047ED53E50BC081E08093332E7C
:1065400010936E37812F992744C020E04CED53E51E
:1065500062E08FE00E94EE7082E090E00E9438BC22
:1065600020E0AC0167E0822F0E942F7180E40E943E
:106570004238882351F0112341F411E020E041EE2C
:1065800053E562E08FE00E94EE7080E80E9442389E
:10659000882351F0113041F410E0212F46EE53E5ED
:1065A00062E08FE00E94EE7080E10E944238C82FC6
:1065B000882319F680E20E9442388823B9F280EFDE
:1065C0000E944238C093332E8091123E80936E37E2
:1065D0009927DF91CF911F910895AF92BF92CF92EB
:1065E000DF92EF920F93CF93DF93EC015B016A018F
:1065F0000E94AA6B87E790E00E9438BC20E0AC01C3
:1066000062E0822F0E942F7189E790E00E9438BCDF
:1066100020E0AC0165E0822F0E942F718AE790E0B4
:106620000E9438BC20E0AC0166E0822F0E942F71EE
:10663000D093FA3DC093F93DEE240E2D24E030E0D6
:10664000AE0162E080E10E94347782E090E00E9437
:1066500038BC2E2DAC0167E08E2D0E942F7180E496
:106660000E944238882331F462E080E40E94863838
:106670008823B1F0C6010A97C817D90788F481E0CA
:106680008093332E2A96D0937037C0936F37EE24C1
:106690000E2D24E030E0AE0162E080E10E9434770C
:1066A00080E80E944238882331F462E080E80E944A
:1066B00086388823A1F0AC16BD0688F481E080936B
:1066C000332E2A97D0937037C0936F37EE240E2D58
:1066D00024E030E0AE0162E080E10E94347780E1A6
:1066E0000E944238E82E882311F0AE0128C00E9493
:1066F000A97B0E2D20E030E04091042E5091052E14
:1067000063E088E00E94D3782E2D4BEE53E563E0E2
:10671000862F0E94EE7080E20E944238882309F49E
:106720009ECF80EF0E944238E092332E8091F93D57
:106730009091FA3D9093703780936F37AC01CA0106
:10674000DF91CF910F91EF90DF90CF90BF90AF90FE
:1067500008959F92AF92BF92CF92DF92EF92FF92F5
:106760000F931F93CF93DF93CC249C2CB1E0AB2EDF
:10677000C092D12FC092332EBC2C0E94AA6B0E94D3
:10678000AA6B85E790E00E9438BC22E0AC0160E093
:10679000862F0E942F7181E090E00E9438BC20E09B
:1067A000AC0167E0822F0E942F71DD24CC2039F0EC
:1067B0002D2D40EF53E561E0862F0E94EE70EE2410
:1067C000FF240C2D1127E701C00FD11FC230D105C6
:1067D000D4F488E490E0C89FA001C99F500DD89FD1
:1067E000500D11249091CA3782E1989FC001112465
:1067F000480F591F4E54584B8D2D8F5F20E0682F46
:1068000083E00E94EE7085E0D81649F421973CF4AD
:1068100020E042EF53E566E081E00E94EE70D39401
:106820000894E11CF11C85E08D1558F6992059F467
:10683000CC2031F40C2D2C2D4A2D62E081E015C0C6
:1068400001E0202F0FC081E0981691F4095F1F4FDF
:10685000033011052CF000E0292D4A2D66E004C01C
:10686000092D292D4A2D65E082E00E940C32B82EB8
:106870008EEFB81631F4C394A1E09A2EF5E0AF2E56
:1068800094CF8DEFB81629F4CA949924E2E0AE2E85
:106890008CCF8FEFB81639F48091332E8130B1F55B
:1068A0000E94D55F33C0AB2CCB2DDD270C2D1127DB
:1068B000CE01800F911F019771F441E060E080915B
:1068C0006E370E947EB280936E378091332E813076
:1068D00011F40E94D55FC00FD11F229709F04FCF4E
:1068E0004FE057E260E070E080916F379091703731
:1068F0000E94EDB29093703780936F378091332E62
:10690000813009F03CCF0E94D55F39CFDF91CF9124
:106910001F910F91FF90EF90DF90CF90BF90AF90BD
:106920009F9008950F931F93CF93DF93082F122FFB
:10693000C82FDD27D093133EC093123E0E94AA6B4E
:10694000812F99270E9438BC20E0AC0162E0822FA1
:106950000E942F71C130D10521F0C330D10529F13A
:1069600034C021E043E050E063E170E089E590E06D
:106970000E94BB7120E043E050E063E170E085E6F7
:1069800090E00E94647221E043E050E063E170E037
:1069900085E690E010C081E08093332E0093A73706
:1069A0000E94D55F802F992777C021E0AE0163E177
:1069B00070E089E590E00E94BB7121E0AE0163E1E7
:1069C00070E085E690E00E94647282E090E00E94B0
:1069D00038BC20E0AC0167E0822F0E942F7180E478
:1069E0000E9442388823A9F0013099F403E021E0A5
:1069F00043E050E063E170E089E590E00E94BB7104
:106A000021E043E050E063E170E085E690E00E9421
:106A1000647280E80E944238882339F1033029F5F6
:106A200001E0202F43E050E063E170E089E590E071
:106A30000E94BB7120E043E050E063E170E085E636
:106A400090E00E946472202F43E050E063E170E028
:106A500085E690E00E94BB71202F41E050E063E1A9
:106A600070E085E690E00E94647280E10E94423806
:106A7000C82F882309F08FCF80E20E9442388823F4
:106A800009F4ADCF80EF0E944238C093332E80913D
:106A9000123E8093A7379927DF91CF911F910F91D5
:106AA00008959F92AF92BF92CF92DF92EF92FF92A2
:106AB0000F931F93CF93DF93CC249C2C81E0A82EBF
:106AC000C092D12FC092332EBC2C0E94AA6B0E9480
:106AD000AA6B86EB90E00E9438BC22E0AC0160E03B
:106AE000862F0E942F7181E090E00E9438BC20E048
:106AF000AC0167E0822F0E942F71DD24CC2039F099
:106B00002D2D44EF53E561E0862F0E94EE70EE24B8
:106B1000FF240C2D1127E701C00FD11FCA30D1056A
:106B2000D4F488E490E0C89FA001C99F500DD89F7D
:106B3000500D11249091CA3782E1989FC001112411
:106B4000480F591F4E575E4B8D2D8F5F20E0682FE9
:106B500083E00E94EE7085E0D81649F429973CF452
:106B600020E046EF53E566E081E00E94EE70D394AA
:106B70000894E11CF11C95E09D1558F6992059F4F4
:106B8000CC2031F401E02C2D4A2D692F802F15C027
:106B900001E0202F0FC081E0981691F4095F1F4F8C
:106BA0000B3011052CF000E0292D4A2D66E004C0C1
:106BB000092D292D4A2D65E082E00E940C32B82E65
:106BC0009EEFB91631F4C39401E0902E15E0A12E8A
:106BD00094CF8DEFB81629F4CA949924C2E0AC2E54
:106BE0008CCF9FEFB91641F48091332E813009F09C
:106BF00087C00E94D55F84C0AB2C8B2D8C0D912D4E
:106C0000911DEC01019749F42EEB42E060E0809188
:106C100066370E94849F80936637C230D10549F45D
:106C200028EB43E061E08091A7370E9492B4809303
:106C3000A737C330D10549F427EB41E060E08091EC
:106C4000A6370E9489A28093A637C430D10549F4A3
:106C500029EB41E060E0809108380E9489A280938E
:106C60000838C530D10549F42AEB47EF60E0809140
:106C7000CC370E94FB9E8093CC37C630D10549F4B7
:106C80002BEB41E060E0809174370E9489A28093F1
:106C90007437C730D10549F42CEB41E060E08091B6
:106CA000C3370E9489A28093C337C830D10549F405
:106CB0002BE747EF60E280914E2E0E94FB9E80936F
:106CC0004E2EC930D10579F42DEB40E355E760E055
:106CD00070E080916737909168370E9409A0909387
:106CE0006837809367372A9709F0F1CE2FEB41E0A0
:106CF00060E08091C4370E9489A28093C437E7CEB8
:106D0000DF91CF911F910F91FF90EF90DF90CF9087
:106D1000BF90AF909F9008958F929F92AF92BF9235
:106D2000CF92DF92EF92FF920F931F93CF93DF9357
:106D3000BB248B2C41E0942E0E94AA6BB092D12FE1
:106D4000B092332EAB2C0E94AA6B22E048EF53E5A1
:106D500060E0862F0E94EE7081E090E00E9438BCD7
:106D600020E0AC0167E0822F0E942F71DD24BB2060
:106D700039F02D2D4EE054E561E0862F0E94EE7033
:106D8000EE24FF240B2D1127E701C00FD11FCC30BB
:106D9000D105D4F488E490E0C89FA001C99F500DAC
:106DA000D89F500D11249091CA3782E1989FC0015D
:106DB0001124480F591F4E58514B8D2D8F5F20E0E5
:106DC000682F83E00E94EE7085E0D81649F42B9777
:106DD0003CF420E040E154E566E081E00E94EE7082
:106DE000D3940894E11CF11C85E08D1558F6882099
:106DF00059F4BB2031F401E02B2D492D682F802F51
:106E000015C001E0202F0FC081E0881691F4095FC2
:106E10001F4F0D3011052CF000E0282D492D66E0A4
:106E200004C0082D282D492D65E082E00E940C3217
:106E3000A82E8EEFA81631F4B39431E0832E25E00E
:106E4000922E94CF8DEFA81629F4BA94882492E05C
:106E5000992E8CCF8FEFA81641F48091332E81307C
:106E600009F094C00E94D55F91C09A2CCA2CDD24F1
:106E7000EB2CFF24C6018E0D9F1D019761F48091BC
:106E8000D42F0E9491A08093D42F8091332E8130F3
:106E900011F48093312EE601CE0DDF1DC230D105F5
:106EA00011F40E9435A82397D9F46091AD37662379
:106EB000A9F42CE641E08091AD370E9489A280932D
:106EC000AD378091332E813059F48091AD378130C8
:106ED00039F48091D2370E94FF4C02C00E947AAAF6
:106EE000C6018E0D9F1D049719F51091A937112326
:106EF000E9F421E741E0612F8091A9370E9489A23E
:106F00008093A9378091332E813091F4C091A937B5
:106F1000C13071F40E94FF52892B19F0C093C83719
:106F200002C01093C8370E94D55F02C00E942CAEE9
:106F3000E601CE0DDF1DC630D10511F40E9451B51A
:106F4000C730D10511F40E94B9AFC830D10511F492
:106F50000E9487A9C930D10511F40E94A9B3CA3093
:106F6000D10511F40E94A934CB30D10549F426E6AD
:106F700041E060E08091D3370E94849F8093D337B3
:106F80002C9709F0E0CE0E9401A8DDCEDF91CF91D1
:106F90001F910F91FF90EF90DF90CF90BF90AF9037
:106FA0009F908F900895CF92DF92EF92FF920F9370
:106FB0001F93CF93DF93CDB7DEB72E970FB6F8941C
:106FC000DEBF0FBECDBF0E94AA6B80919F2A823088
:106FD000B9F481EA90E00E9438BC20E0AC0163E0A3
:106FE000822F0E942F7184E690E09093512E80931F
:106FF000502E8091502E9091512E892BD1F7F9C1AE
:107000000E942A438FEF0E94AE998F3F99F482EA43
:1070100090E00E9438BC20E0AC01622F822F0E94D9
:107020002F7120E23EE484EF91E00197F1F72150C7
:107030003040C9F7E0913C2EF0913D2EE359FF4FCF
:107040008081ED56F0408093F23D85858093F03D40
:10705000E259FF4F80818093F13D0E94FC428FE412
:107060008093A02A1E8601E010E01F930F939EE0FC
:10707000C92ED12CCC0EDD1EDF92CF9281E0F82EEE
:10708000FF921F9284E68F930E9440418AE08E8790
:107090001F930F93DF92CF92FF9282E08F938FE640
:1070A0008F930E94404110E088EC90E09093512E25
:1070B0008093502E8CE291E09093532E8093522E29
:1070C0008DB79EB70E960FB6F8949EBF0FBE8DBFBC
:1070D00080919F2B882309F477C188EC90E09093EE
:1070E000512E8093502E0E94924280919C2B909121
:1070F0009D2B9093F43D8093F33D8091342E81300D
:1071000011F40E94AA6B1092342EE091F33DF0919D
:10711000F43D85819681A781B0858D839E83AF8361
:10712000B88781819281A381B48189839A83AB835B
:10713000BC8311E0412F63E080E00E94778343E04D
:1071400067E080E00E94778344E067E08DE00E9482
:10715000778345E062E08CE00E94778349E067E056
:10716000862F0E94778320E042E154E5612F822F31
:107170000E94EE704AE0612F88E00E94778320E051
:107180004BE154E5622F822F0E94EE704BE060E0ED
:1071900086E00E94778344E160E080E10E9477838B
:1071A00020E042E254E563E08BE00E94EE704EE0A6
:1071B00063E081E10E94778342E162E080E00E9427
:1071C000778320E048E254E564E0822F0E94EE706D
:1071D0008D819E81AF81B885BC01CD0120E836E963
:1071E00048E950E00E9417C7DA01C901EE240E2DCC
:1071F00022E030E0AC0164E083E00E9434772E2D81
:107200004CE254E564E085E00E94EE708D819E8141
:10721000AF81B885BC01CD0128EE33E040E050E0FD
:107220000E9417C7CA01B90120E137E240E050E0EF
:107230000E9417C7DC01CB01012F24E030E0AC0134
:1072400064E086E00E9434778D819E81AF81B885AD
:10725000BC01CD012AE030E040E050E00E9417C7B9
:10726000CA01B90124E630E040E050E00E9417C7AF
:10727000DC01CB0122E030E0AC0164E08AE00E9456
:10728000347789819A81AB81BC81BC01CD0120E832
:1072900036E948E950E00E9417C7DA01C9010E2D0E
:1072A00022E030E0AC0164E08CE00E9434772E2DC7
:1072B0004EE254E564E08EE00E94EE7089819A818E
:1072C000AB81BC81BC01CD0128EE33E040E050E051
:1072D0000E9417C7CA01B90120E137E240E050E03F
:1072E0000E9417C7DC01CB01012F24E030E0AC0184
:1072F00064E08FE00E94347789819A81AB81BC8100
:10730000BC01CD012AE030E040E050E00E9417C708
:10731000CA01B90124E630E040E050E00E9417C7FE
:10732000DC01CB0122E030E0AC0164E083E10E94AB
:10733000347722E040E354E565E08E2D0E94EE7044
:10734000E091F33DF091F43D91AD80914E2E981770
:1073500038F44E2D60E270E088EB9BE00E942A3604
:10736000E091F33DF091F43D91AD80914E2E89175F
:1073700030F442E060E070E0CB010E942A361092C7
:107380009F2B8091522E9091532E892BE9F48AE005
:107390008E8781E090E09F938F93DF92CF921F932F
:1073A00082E08F938FE68F930E9440418CE291E0C0
:1073B0009093532E8093522E8DB79EB707960FB69B
:1073C000F8949EBF0FBE8DBF8091502E9091512E8C
:1073D000892B39F4812F0E94AD8110E081E08093E8
:1073E000342E80E20E944238882309F471CE109234
:1073F000EF3D2E960FB6F894DEBF0FBECDBFDF91E6
:10740000CF911F910F91FF90EF90DF90CF90089553
:10741000AF92BF92CF92DF92EF92FF920F931F93A2
:10742000CF93DF93CDB7DEB722970FB6F894DEBFC8
:107430000FBECDBF5A016B014AE050E0BE016F5F45
:107440007F4F0E9407C17B018C01E981FA81808115
:107450008E3281F59F012F5F3F4F818129C0A1149A
:10746000B104C104D10431F1D801C70143E0880F50
:10747000991FAA1FBB1F4A95D1F78E0D9F1DA01FF4
:10748000B11FE80EF91E0A1F1B1FF90181919F0110
:107490009927C097AA2797FDA095BA2FE80EF91E45
:1074A0000A1F1B1F0894A108B108C108D1088081D8
:1074B0008823A9F6A114B104C104D10489F0F5010F
:1074C000EE0FFF1FEE0FFF1FEA5BFB4A2591359180
:1074D00045915491C801B7010E94A3C67B018C015C
:1074E000C801B70122960FB6F894DEBF0FBECDBF1C
:1074F000DF91CF911F910F91FF90EF90DF90CF9090
:10750000BF90AF9008958F929F92AF92BF92CF920B
:10751000DF92EF92FF920F931F93FC016B0190811A
:107520008AE0989FC00111242181820F911D805112
:1075300092404C01AA2497FCA094BA2C46E050E05B
:1075400060E070E0CF0102960E9408BADC01CB0136
:10755000BC01CD0126E030E040E050E00E9417C7BA
:1075600079018A01C501B40120E836E948E950E013
:107570000E94A3C64B015C018E0C9F1CA01EB11E75
:10758000F6018081833541F4B094A0949094809466
:10759000811C911CA11CB11CC501B4011F910F914C
:1075A000FF90EF90DF90CF90BF90AF909F908F9023
:1075B00008958F929F92AF92BF92CF92DF92EF92F7
:1075C000FF920F931F93FC016B0190818AE0989FBB
:1075D000900111248181280F311DC90153E0880FCA
:1075E000991F5A95E1F7820F931F820F931F2281F3
:1075F000820F911D805D94414C01AA2497FCA094B8
:10760000BA2C46E050E060E070E0CF0103960E94A3
:1076100008BADC01CB01BC01CD0126E030E040E03E
:1076200050E00E9417C779018A01C501B40120E822
:1076300036E948E950E00E94A3C64B015C018E0C7C
:107640009F1CA01EB11EF6018081873541F4B094C5
:10765000A09490948094811C911CA11CB11CC50124
:10766000B4011F910F91FF90EF90DF90CF90BF90EA
:10767000AF909F908F90089520E0322F4AE3DC0175
:10768000E22FFF27EC58FE4F8D9180832F5F313022
:1076900011F0333031F4E22FFF27EC58FE4F4083D6
:1076A0002F5F3F5F363060F3E22FFF27EC58FE4F2D
:1076B00010820895982F80538A3010F499270895E6
:1076C000892F8156863010F4975505C0892F815433
:1076D000863020F49753892F9927089580E090E011
:1076E0000895EF92FF920F931F93CF93DF93EE24B1
:1076F000FE2CE091F32BE13009F046C0809105317A
:10770000882309F441C09E2F80910531E817A8F421
:107710008091D72F8A3289F0E92FFF27EA52F04D66
:107720008081F8269F5F80910531981730F4E92F0A
:10773000FF27EA52F04D8081EDCF80910531282F4F
:107740003327E92FFF27CF01039628173907E4F0E5
:10775000EF01CA52D04D89810E945ABB082F1127D0
:1077600074E0000F111F7A95E1F78A810E945ABBDD
:10777000802B8F1549F4188267ED7FE28DE690E348
:107780000E946BC261E0E62E1092F32B8E2D99279A
:10779000DF91CF911F910F91FF90EF9008950F937C
:1077A0001F93CF93DF930E9471BB882309F45BC0C2
:1077B0006DE771E08DE690E30E9456C26FE771E0DD
:1077C0000E9462C2EC01009709F04DC065E871E0CB
:1077D0000E9456C20E943CBB6DE771E0CE010E9440
:1077E00056C26DE771E0CE010E9456C28C016DE772
:1077F00071E0CE010E9456C2B8010E9483BADC013A
:10780000CB018093163E9093173EA093183EB09301
:10781000193E6DE771E0CE010E9456C28C016DE702
:1078200071E0CE010E9456C2B8010E94D9BADC01B3
:10783000CB018093313E9093323EA093333EB09380
:10784000343E6DE771E0CE010E9456C2FC0180819A
:10785000803349F06DE771E0CE010E9456C20E946C
:107860000CC280931A3EDF91CF911F910F91089522
:107870002091CA37FC01EE0FFF1FEE0FFF1FE80F2C
:10788000F91FE20FF11DEE0FFF1FE651FD4D828142
:10789000938108950E94AA6B8FE290E00E9438BC09
:1078A00020E0AC0167E08CE00E942F7180E090E066
:1078B0000E9438BC20E0AC0162E0822F0E942F7150
:1078C00080E20E944238882389F380EF0E94423888
:1078D0000895AF92BF92CF92DF92EF92FF920F93F3
:1078E0001F93CF93DF938091362EE82FFF27EE0F63
:1078F000FF1FDF01A35BB14CEB5CF14C0190F08109
:10790000E02DCD91DC91CE17DF070CF05DC0C639BC
:10791000D1050CF059C006E910E0C8018E1B9F0B81
:10792000AA2797FDA095BA2FBC01CD010E94CEC415
:10793000DC01CB0120E030E040E05FE3BC01CD01A1
:107940000E94BBC5DC01CB019C01AD0160E070E091
:107950008CE792E40E94C7C3DC01CB01BC01CD01DE
:107960000E94A0C46B017C01B090372EB3940C1B15
:107970001D0BC801AA2797FDA095BA2FBC01CD0108
:107980000E94CEC4DC01CB0120E030E040E05FE3A8
:10799000BC01CD010E94BBC5DC01CB019C01AD0146
:1079A00060E070E08CE792E40E94C7C3DC01CB0189
:1079B000BC01CD010E94A0C4DC01CB0100E024E0A9
:1079C0004C2D6B2D0E945F6E8091362EE82FFF2785
:1079D000EE0FFF1FDF01A35BB14CEB5CF14CC081EC
:1079E000D1818D919C91C817D9070CF05AC0873965
:1079F00091050CF456C086599040AA2797FDA09592
:107A0000BA2FBC01CD010E94CEC4DC01CB0120E025
:107A100030E040E05FE3BC01CD010E94BBC5DC016A
:107A2000CB0120E030E04CE752E4BC01CD010E94E4
:107A3000C8C3DC01CB01BC01CD010E94A0C46B0115
:107A40007C011091372E1F5FC659D040CE01AA2766
:107A500097FDA095BA2FBC01CD010E94CEC4DC01D8
:107A6000CB0120E030E040E05FE3BC01CD010E94AB
:107A7000BBC5DC01CB0120E030E04CE752E4BC01A7
:107A8000CD010E94C8C3DC01CB01BC01CD010E9425
:107A9000A0C4DC01CB0100E024E04C2D612F0E944A
:107AA0005F6E8091362EE82FFF27EE0FFF1FEB5CF5
:107AB000F14C0190F081E02DC091372EE639F105AF
:107AC00024F1E659F040CF01AA2797FDA095BA2FDF
:107AD000BC01CD010E94CEC4DC01CB0120E030E02E
:107AE00040E05FE3BC01CD010E94BBC5DC01CB01DE
:107AF000BC01CD010E94A0C4DC01CB01CF5F01E03D
:107B000024E0482F6C2F8FE331C086E990E08E1B74
:107B10009F0BAA2797FDA095BA2FBC01CD010E940B
:107B2000CEC4DC01CB0120E030E040E05FE3BC01EB
:107B3000CD010E94BBC57B018C010E94A0C45B01EA
:107B40006C01CF5FA801970160E070E08CE792E4E0
:107B50000E94C7C3DC01CB01BC01CD010E94A0C4BF
:107B6000DC01CB0101E024E04A2D6C2F0E945F6E06
:107B700026E042E06091372E8EE30E945F6E909186
:107B8000372E892F8A5F01E0282F43E0692F842F49
:107B90000E949C6D9091372E892F8A5F282F47E194
:107BA000692F842F0E949C6D9091372E892F8A5FB8
:107BB000282F4BE2692F842F0E949C6D9091372EC5
:107BC000892F8A5F282F43E5692F842F0E949C6D9F
:107BD0009091372E892F8A5F282F47E6692F842FAF
:107BE0000E949C6D9091372E892F8A5F282F4BE73A
:107BF000692F842F0E949C6DDF91CF911F910F916F
:107C0000FF90EF90DF90CF90BF90AF900895CF930B
:107C1000DF93A5E7BFE28CE0FD0111928A95E9F7B9
:107C2000ED0194E0E5E3FEE3808132968659899385
:107C3000915097FFF9CF8CE090E09F938F93BF9383
:107C4000AF9381E08F938F9389E78F930E94404198
:107C50008DB79EB707960FB6F8949EBF0FBE8DBF27
:107C6000DF91CF910895DF92EF92FF920F931F93D0
:107C7000CF93DF93CDB7DEB764970FB6F894DEBF2E
:107C80000FBECDBF43E050E066E970E085E39EE3C0
:107C90000E945BC2FE01319685E0DF011D928A954C
:107CA000E9F780E480937C0080917C00807E809363
:107CB0007C0082E390E09093512E8093502E80912F
:107CC000502E9091512E892BD1F787EC80937A001A
:107CD00080917A0086FDFCCF8091780090917900A8
:107CE00096958795969587959070938782878D3620
:107CF00091051CF48CE690E005C08439910524F0D0
:107D000084E990E09387828780917C00807E826006
:107D100080937C0080917A00806480937A008091C7
:107D20007A0086FDFCCF349680917800909179009E
:107D300096958795969587959070938782878D36CF
:107D400091051CF48CE690E005C08439910524F07F
:107D500084E990E093878287DD2480917C00807E97
:107D600080937C0080917A00806480937A000E94E6
:107D7000AA6B62E08EE69CE50E94BE7083E090E014
:107D80000E9438BC2D2DAC0167E08D2D0E942F7113
:107D90002D2D43E85CE567E082E10E94EE70EE2461
:107DA000FF2414E08E2D845F8093372E01E026E0BF
:107DB00048E7682F83E00E9471719091372E892FD8
:107DC0008A5F282F47E1692F842F0E949C6D909134
:107DD000372E892F8A5F282F4BE2692F842F0E942C
:107DE0009C6D26E042E06091372E8EE30E945F6E2C
:107DF0009091372E892F8A5F282F43E5692F842F92
:107E00000E949C6D9091372E892F8A5F282F47E61C
:107E1000692F842F0E949C6D1150E8E0F0E0EE0E77
:107E2000FF1E17FFBFCF86E990E09093363E809308
:107E3000353E1A82198290933A3E8093393E1E82D3
:107E40001D8290933E3E80933D3E1A8619860FEF29
:107E500080917A0086FD05C11091352E812F9927DA
:107E60004D2D5527042E02C0959587950A94E2F76B
:107E7000DE011196BA01640F751F80FF15C0A60FB1
:107E8000B71F809178009091790096958795969587
:107E90008795FD0122853385281B31096B5C714C68
:107EA000DB012D933C9315C080917800909179006F
:107EB00096958795969587959070A60FB71FFD01AB
:107EC00022853385821B930B6B5C714CDB018D9398
:107ED0009C93FA01E40FF51FEB5CF14C80819181DA
:107EE000BFEF89389B071CF488E89FEF05C08837EF
:107EF000910524F088E790E091838083DD2021F0D4
:107F0000E2E0DE1609F04EC0FA01E40FF51FBE01F3
:107F10006F5F7F4FDF01A60FB71FEB5CF14C8081D5
:107F2000918197FD079623E0959587952A95E1F72E
:107F3000FC0197FF04C0EE27FF27E81BF90B8E9F7B
:107F400090018F9F300D9E9F300D1124C9012D91FE
:107F50003C911197280F391F11963C932E9384EC76
:107F6000213038071CF480E094EC05C020503C43DD
:107F700024F080E09CE38D939C93FA01E40FF51FBD
:107F8000DF01AB5CB14CE60FF71F0190F081E02DF3
:107F9000F7FF02C0E158FF4FEE0FEF2FEE1FFF0B70
:107FA000ED93FC934D2D5527FA01E40FF51FEB5C83
:107FB000F14C808191818A569F4F918380838F31CC
:107FC00091051CF48EE190E005C08E50914024F0A4
:107FD0008EE091E091838083FA01E40FF51FDF01C9
:107FE000A35BB14CEB5CF14C208131818D919C9174
:107FF0002817390741F081E090E002C0880F991FEF
:108000004A95E2F7082BD394B3E0DB16E9F413FFAB
:1080100003C0039906C002C0039B03C08EE091E039
:1080200002C08EE190E090933C3E80933B3E2091D5
:108030003B3E30913C3E8091533E9091543E2817F8
:10804000390709F00860DD2480917C00807E9D2D39
:108050009F71892B80937C0080917A00806480934B
:108060007A0080E40E944238882331F463E080E49F
:108070000E948638882351F080913D3E90913E3E8B
:10808000E1E08F309E0714F4019613C080E80E944F
:108090004238882331F463E080E80E9486388823E0
:1080A00071F080913D3E90913E3E8E3191053CF0C5
:1080B000019790933E3E80933D3E006126C080E153
:1080C0000E944238882309F186E990E09093363E79
:1080D0008093353E1A82198290933A3E8093393EBE
:1080E0001E821D8290933E3E80933D3E1A861986E5
:1080F00088EC90E09093A62A8093A52A80E890E0EF
:10810000909301018093000103C0002309F466C02D
:108110008CE08093372E1092362E0E9469BC80919D
:10812000362EE82FFF27EE0FFF1FDF01AB5CB14CAF
:108130008D919C91E35BF14C918380838091373EDC
:108140009091383E9093503E80934F3E8CE18093C7
:10815000372E82E08093362E0E9469BC8091362EA5
:10816000E82FFF27EE0FFF1FDF01AB5CB14C8D91B5
:108170009C91E35BF14C9183808384E28093372E62
:1081800083E08093362E0E9469BC8091362EE82FC2
:10819000FF27EE0FFF1FDF01AB5CB14C8D919C916F
:1081A000E35BF14C918380838CE28093372E84E0F3
:1081B0008093362E0E9469BC8091362EE82FFF27CF
:1081C000EE0FFF1FDF01AB5CB14C8D919C91E35B27
:1081D000F14C9183808300E00E9407BE80E20E9400
:1081E0004238882309F434CE80EF0E9442380E943E
:1081F0009C7B64960FB6F894DEBF0FBECDBFDF91B7
:10820000CF911F910F91FF90EF90DF900895A0E024
:10821000B0E0EDE0F1EC0C943FC78C012B01EA01DA
:10822000EE246115710519F0FB019183808320977D
:1082300049F0CE010297839728F060E070E080E07B
:1082400090E0E5C0F801F1908F018F2D99270E94F1
:1082500032C7892BB9F7FDE2FF1619F441E0E42E8D
:1082600003C0FBE2FF1619F4F801F1908F0120978B
:1082700019F0C031D10591F4F0E3FF1679F4F8015B
:108280008081883711F0883549F4F801F1800E5F5C
:108290001F4FC0E1D0E0F2E0EF2A0AC0209741F47E
:1082A00080E3F81619F4C8E0D0E002C0CAE0D0E0DC
:1082B000C830D105E9F0C930D10524F4C230D10568
:1082C000E9F022C0CA30D10521F0C031D10551F00A
:1082D0001BC03CECA32E3CECB32E3CECC32E3CE08C
:1082E000D32E1FC0A12CB12CC12C28E0D22E19C036
:1082F000A12CB12CC12C90E1D92E13C0A12CB12CF2
:10830000C12C80E4D82E0DC09E01442737FD409536
:10831000542F60E070E080E090E80E94F5C65901BB
:108320006A0120E030E040E050E060E03E01882457
:1083300077FC8094982C8F2D80538A3010F4F82E7F
:108340000DC08F2D81548A3118F4E9ECFE0E06C061
:108350008F2D81568A3148F5F9EAFF0E8F2D992726
:108360008C179D0714F567FD1CC0A216B306C40642
:10837000D506A0F0CA01B901A40193010E94A3C6C9
:108380009B01AC012F0D311D411D511D213080E09D
:10839000380780E0480780E8580710F06FEF01C009
:1083A00061E0F801F1908F01C6CF4114510461F0F2
:1083B000662319F00150104004C0E1FE05C00250D0
:1083C0001040F201118300838E2D992767FF07C0AB
:1083D00080FF11C020E030E040E050E810C080FF96
:1083E00008C050954095309521953F4F4F4F5F4FB6
:1083F0000CC057FF0AC02FEF3FEF4FEF5FE782E25D
:1084000090E09093583E8093573ECA01B901E0E155
:10841000CDB7DEB70C945BC7FC0188279927E89499
:1084200021912032E9F3293010F02E30C8F32B329D
:1084300041F02D3239F4689404C00E9499C3820F30
:10844000911D219120532A30C0F31EF490958195FF
:108450009F4F0895FB01DC010D900020E9F7119773
:1084600005900D920020E1F70895FB01DC010590D5
:108470000D920020E1F70895FB0155915523A9F0D5
:10848000BF01DC014D9145174111E1F759F4CD01D0
:108490000590002049F04D9140154111C9F3FB01B1
:1084A0004111EFCF81E090E00197089548E35EE24B
:1084B0000E9480C20895DC0101C06D93415050407C
:1084C000E0F70895FB01DC018D9101908019011006
:1084D000D9F3990B0895FB01DC0101900D92002066
:1084E000E1F70895FB01DC014150504030F08D91DF
:1084F0000190801919F40020B9F7881B990B089591
:10850000009731F4DA018D919C91009709F40EC027
:10851000DC01FB013D912191222319F03217C9F3AF
:10852000FACF332331F4DA011D921C928827992760
:1085300008951197AF93BF93FB013D91219132179D
:1085400071F4332321F488279927119702C01E92D2
:108550001196FA01A193B0839F918F9108952223E0
:1085600069F7EACFA0E0B0E0E8EBF2EC0C9445C785
:108570006C017B01EA01590121978FEFCF3FD807AA
:1085800089F086010894C11CD11CC7010894E11C24
:10859000F11CF5010995F80180832197FFEFCF3F8A
:1085A000DF0779F7EAE0CDB7DEB70C9461C7AF9289
:1085B000BF92CF92DF92EF92FF920F931F936C01C5
:1085C0005B01FB010995E82EC6010196F5010995AD
:1085D000F82EC6010296F5010995082FC6010396EB
:1085E000F5010995182FC801B7011F910F91FF9050
:1085F000EF90DF90CF90BF90AF900895CF92DF9231
:10860000EF92FF920F931F937C016B01FB01099581
:10861000082FC7010196F6010995182FC8011F916F
:108620000F91FF90EF90DF90CF900895A0E0B0E021
:10863000ECE1F3EC0C9447C78C017B01EA01690182
:1086400021978FEFCF3FD80771F0F70121917F017C
:10865000C8010F5F1F4F622FF60109952197FFEFA9
:10866000CF3FDF0791F7E8E0CDB7DEB70C9463C7E3
:10867000AF92BF92CF92DF92EF92FF920F931F9330
:108680008C016A017B015901642FF90109956D2D57
:10869000C8010196F50109956E2DC8010296F501F4
:1086A00009956F2DC8010396F50109951F910F914A
:1086B000FF90EF90DF90CF90BF90AF900895CF9252
:1086C000DF92EF92FF920F931F936C018B017A015F
:1086D000FA010995812F9927682FC6010196F701A4
:1086E00009951F910F91FF90EF90DF90CF90089523
:1086F000FB019F01E8944230C4F04532B4F44A30A3
:1087000029F497FB1EF4909581959F4F642F77274E
:108710000E94CEC6805D8A330CF0895D8193CB01C7
:108720000097A1F716F45DE251931082C9010C94F1
:10873000B7C37AE0979F902D879F802D910D1124CC
:108740000895FB019F01423074F0453264F4642FB8
:1087500077270E94CEC6805D8A330CF0895D8193B5
:10876000CB010097A1F71082C9010C94B7C3DC01BB
:10877000FC01672F71917723E1F7329704C07C9158
:108780006D9370836291AE17BF07C8F30895505878
:10879000BB27AA270ED0A0C169D130F06ED120F03E
:1087A00031F49F3F11F41EF45EC10EF4E095E7FB37
:1087B00054C1E92FB3D180F3BA1762077307840756
:1087C000950718F071F49EF5CBC10EF4E0950B2ED1
:1087D000BA2FA02D0B01B90190010C01CA01A00113
:1087E0001124FF27591B99F0593F50F4503E68F16E
:1087F0001A16F040A22F232F342F4427585FF3CFAF
:10880000469537952795A795F0405395C9F77EF47F
:108810001F16BA0B620B730B840BBAF09150A1F0C8
:10882000FF0FBB1F661F771F881FC2F70EC0BA0F4E
:10883000621F731F841F48F4879577956795B795D6
:10884000F7959E3F08F0B3CF9395880F08F09927CE
:10885000EE0F979587950895DCD008F481E0089590
:1088600014D1E3954AC10CD037C107D140F0FED0F6
:1088700030F021F45F3F19F0F0C0511172C1F3C024
:108880004DD198F39923C9F35523B1F3951B550B9B
:10889000BB27AA2762177307840738F09F5F5F4FD3
:1088A000220F331F441FAA1FA9F333D00E2E3AF014
:1088B000E0E830D091505040E695001CCAF729D02E
:1088C000FE2F27D0660F771F881FBB1F261737077D
:1088D0004807AB07B0E809F0BB0B802DBF01FF27AD
:1088E00093585F4F2AF09E3F510568F0B6C039C1DA
:1088F0005F3FECF3983EDCF3869577956795B795E7
:10890000F7959F5FC9F7880F911D9695879597F901
:108910000895E1E0660F771F881FBB1F621773077A
:108920008407BA0720F0621B730B840BBA0BEE1F8F
:1089300088F7E095089504D06894B11112C10895A4
:10894000F5D088F09F5790F0B92F9927B751A0F034
:10895000D1F0660F771F881F991F1AF0BA95C9F7D3
:1089600012C0B13081F0FCD0B1E00895F9C0672F9A
:10897000782F8827B85F39F0B93FCCF38695779583
:108980006795B395D9F73EF490958095709561956C
:108990007F4F8F4F9F4F0895E89409C097FB3EF497
:1089A00090958095709561957F4F8F4F9F4F99233C
:1089B000A9F0F92F96E9BB279395F69587957795BA
:1089C0006795B795F111F8CFFAF4BB0F11F460FF7A
:1089D0001BC06F5F7F4F8F4F9F4F16C0882311F0D2
:1089E00096E911C0772321F09EE8872F762F05C0E6
:1089F000662371F096E8862F70E060E02AF09A9581
:108A0000660F771F881FDAF7880F9695879597F975
:108A10000895990F0008550FAA0BE0E8FEEF16160F
:108A20001706E807F907C0F012161306E407F50762
:108A300098F0621B730B840B950B39F40A2661F0D6
:108A4000232B242B252B21F408950A2609F4A14079
:108A5000A6958FEF811D811D089597F99F6780E886
:108A600070E060E008959FEF80EC089500240A9480
:108A70001616170618060906089500240A941216F9
:108A80001306140605060895EECF50D0E8F3E894D7
:108A9000E0E0BB279F57F0F02AED3FE049EC06C02D
:108AA000EE0FBB0F661F771F881F28F0B23A6207D0
:108AB0007307840728F0B25A620B730B840BE3959B
:108AC0009A9572F7803830F49A95BB0F661F771F1E
:108AD000881FD2F79048F5C0092E0394000C11F4BA
:108AE000882352F0BB0F40F4BF2B11F460FF04C089
:108AF0006F5F7F4F8F4F9F4F0895EF93E0FF06C04A
:108B0000A2EA2AED3FE049EC5FEB53DEE5DF0F9090
:108B1000039401FC9058EEEEF0E0DFC057FD905852
:108B2000440F551F59F05F3F71F04795880F97FB31
:108B3000991F61F09F3F79F08795089512161306EB
:108B40001406551FF2CF4695F1DF08C0161617061A
:108B50001806991FF1CF869571056105089408954F
:108B6000E894BB2766277727CB0197F9089551DF53
:108B700008F48FEF08950BD0AFCF78DF28F07DDFBA
:108B800018F0952309F069CF6ECF1124EACFC6DF24
:108B9000A0F3959FD1F3950F50E0551F629FF00110
:108BA000729FBB27F00DB11D639FAA27F00DB11D69
:108BB000AA1F649F6627B00DA11D661F829F2227F2
:108BC000B00DA11D621F739FB00DA11D621F839F79
:108BD000A00D611D221F749F3327A00D611D231F4F
:108BE000849F600D211D822F762F6A2F11249F579D
:108BF00050408AF0E1F088234AF0EE0FFF1FBB1FC0
:108C0000661F771F881F91505040A9F79E3F51055E
:108C100070F023CFA6CF5F3FECF3983EDCF3869550
:108C200077956795B795F795E7959F5FC1F7FE2B09
:108C3000880F911D9695879597F9089577DFE0F055
:108C40009E37D8F09639B8F49E3848F4672F782FBD
:108C50008827985FF9CF869577956795939595398D
:108C6000D0F3B62FB1706B0F711D811D20F4879565
:108C700077956795939508C022C073CF9F9305DFC2
:108C80000F9007FCEE5F39CF882371F4772321F032
:108C90009850872B762F07C0662311F499270DC0B3
:108CA0009051862B70E060E02AF09A95660F771F4E
:108CB000881FDAF7880F9695879597F908959F3F53
:108CC00031F0915020F4879577956795B795880F87
:108CD000911D9695879597F908959F938F937F930C
:108CE0006F93FF93EF939B01AC0145DFEF91FF91F1
:108CF00005D02F913F914F915F913DCFDF93CF935F
:108D00001F930F93FF92EF92DF927B018C01689487
:108D100005C0DA2EEF013BDFFE01E894A591259115
:108D2000359145915591AEF3EF0143DDFE01970179
:108D3000A801DA9479F7DF90EF90FF900F911F91DF
:108D4000CF91DF910895629FD001739FF001829FC0
:108D5000E00DF11D649FE00DF11D929FF00D839FCA
:108D6000F00D749FF00D659FF00D9927729FB00D67
:108D7000E11DF91F639FB00DE11DF91FBD01CF017A
:108D800011240895991B79E004C0991F961708F0E3
:108D9000961B881F7A95C9F780950895AA1BBB1B5F
:108DA00051E107C0AA1FBB1FA617B70710F0A61BEB
:108DB000B70B881F991F5A95A9F780959095BC010C
:108DC000CD01089597FB092E07260AD077FD04D020
:108DD000E5DF06D000201AF4709561957F4F089565
:108DE000F6F7909581959F4F0895A1E21A2EAA1B40
:108DF000BB1BFD010DC0AA1FBB1FEE1FFF1FA2174B
:108E0000B307E407F50720F0A21BB30BE40BF50B47
:108E1000661F771F881F991F1A9469F760957095D0
:108E2000809590959B01AC01BD01CF01089597FB02
:108E3000092E05260ED057FD04D0D7DF0AD0001C1E
:108E400038F450954095309521953F4F4F4F5F4FE7
:108E50000895F6F790958095709561957F4F8F4FA7
:108E60009F4F0895911106C0803219F089508550A6
:108E7000D0F708959927882708952F923F924F920F
:108E80005F926F927F928F929F92AF92BF92CF929A
:108E9000DF92EF92FF920F931F93CF93DF93CDB7A3
:108EA000DEB7CA1BDB0B0FB6F894DEBF0FBECDBF1B
:108EB00009942A88398848885F846E847D848C84EC
:108EC0009B84AA84B984C884DF80EE80FD800C81F5
:108ED0001B81AA81B981CE0FD11D0FB6F894DEBFD8
:0A8EE0000FBECDBFED010895FFCFD6
:108EEA00FFFF1E000A0001016400014D6F746F72DA
:108EFA003B56657273696F6E3B536574706F696E2A
:108F0A007420686967683B536574706F696E742072
:108F1A006C6F773B53746174653B526561644D6F46
:108F2A0064653B43757272656E743B4D6178505748
:108F3A004D3B54656D70657261747572650D003BC9
:108F4A00000D000A000A24020101D62F070609FFB4
:108F5A00FFFF010147503A54693A6D65002C0047FA
:108F6A0050474741002E004E6F7420666F726D6144
:108F7A0074206861726469736B20433F00201A2071
:108F8A00202020201B20202020456E6465202020E0
:108F9A004F4B00201A20202020201B202020206553
:108FAA006E64202020204F4B00201A2020202020F1
:108FBA001B2020202066696E202020204F4B002095
:108FCA001A20202020201B2020202045696E64655D
:108FDA0020204F4B0020182020202020192020205C
:108FEA0020456E64652020204F4B00201820202049
:108FFA0020201920202020656E64202020204F4B3D
:10900A000020182020202020192020202066696EA8
:10901A00202020204F4B002018202020202019201B
:10902A0020202045696E646520204F4B00201820BF
:10903A00202020201920202020456E646520002051
:10904A001820202020201920202020656E6420204E
:10905A000020182020202020192020202066696E58
:10906A002020002018202020202019202020204500
:10907A00696E646500456E64652020204F4B00656B
:10908A006E64202020204F4B0066696E202020202D
:10909A004F4B0045696E646520204F4B00456E6456
:1090AA006520496E666F00656E642020696E666F82
:1090BA000066696E2020696E666F0045696E6420DD
:1090CA00496E666F00546173746520312053656B75
:1090DA00756E6465004B65657020746865206275FD
:1090EA0074746F6E004D61696E74656E657A206C7A
:1090FA006520626F75746F6E00486F7564206465D1
:10910A00206B6E6F70202020006C616E6720666590
:10911A00737468616C74656E2E0070726573736522
:10912A006420666F722031207365636F6E64006518
:10913A006E666F6E6365652070656E642E203120E1
:10914A007365630031207365636F6E646520696EB1
:10915A0067656472756B742E0056657262696E6417
:10916A00756E67207A756D204D4B206973740043C4
:10917A006F6E6E656374696F6E20746F204D4B203D
:10918A00697300436F6E6E6578696F6E20E0204DDB
:10919A004B206573740056657262696E64696E6706
:1091AA00206D6574204D4B206973006175662057E8
:1091BA00693233322065696E67657374656C6C74E5
:1091CA000073657420746F205769323332006D69F9
:1091DA0073206120576932333200696E6765737490
:1091EA00656C64206F70205769323332006175668E
:1091FA00204B6162656C2065696E67657374656C86
:10920A006C740073657420746F206B6162656C20E6
:10921A006F6E20535632006D69732061206B616254
:10922A00656C207375722053563200766961206B23
:10923A006162656C76657262696E64696E67005018
:10924A006F727461626C6573204B6F707465722003
:10925A00546F6F6C00506F727461626C65204B6F53
:10926A007074657220546F6F6C200066FC72204621
:10927A00432056657220302E38386D00666F722092
:10928A0046432056657220302E38386D00706F754F
:10929A00722046432056657220302E38386D0056AB
:1092AA006F6F722046432056657220302E38386D13
:1092BA0000474E552047504C204C6963656E7365D4
:1092CA000041546D656761203634340041546D6540
:1092DA00676120363434500041546D65676120312E
:1092EA003238345000486172647761726520312ED9
:1092FA003200486172647761726520312E325700FC
:10930A00486172647761726520312E330048617258
:10931A00647761726520312E335700486172647731
:10932A0061726520332E39002020204C65747A74CE
:10933A006520506F736974696F6E202020002020A9
:10934A00206C617374202020706F736974696F6E6A
:10935A00202020002020206465726E6965726520D5
:10936A00706F736974696F6E20002020204C6161F0
:10937A007473746520706F736974696520202000A6
:10938A00204272656974656E677220204CE46E67CC
:10939A00656E67722000206C61746974756465205B
:1093AA00206C6F6E6769747564652000627265650A
:1093BA0064746567722E206C656E67746567722EB9
:1093CA0020006CF6736368656E2020202020202020
:1093DA00207765697465720064656C657465202020
:1093EA0020202020202020206578697420007375B1
:1093FA00707072696D657220202020202020706CA8
:10940A007573200077697373656E202020202020F1
:10941A002020207665726465720020202020476F24
:10942A006F676C652045696E676162652020200060
:10943A0020202020476F6F676C6520496E70757415
:10944A0020202020200020202020202067656CF684
:10945A0073636874202020202020200020202020F0
:10946A00202064656C6574656420202020202020FB
:10947A0020002020202020207375707072696D658D
:10948A002020202020202000202020202020676566
:10949A007769737420202020202020202000537513
:1094AA006368652046432E2E2E20202020007365F7
:1094BA0061726368696E672046432E2E2E006368C8
:1094CA0065726368616E742046432E2E2E007A6F91
:1094DA00656B2046432E2E2E202020202000456E2C
:1094EA0064652000656E6420200066696E20200095
:1094FA0045696E6465004F6B2020006F6B20200069
:10950A0067756564004665686C657220200065723F
:10951A00726F72202020006427657272657572006E
:10952A00666F75742020202000616B7469762000B4
:10953A0061637469762000616374696673006163AC
:10954A0074696566004643206E69636874206765BE
:10955A0066756E64656E21004643206E6F742066E0
:10956A006F756E6421004643207061732074726FB8
:10957A0075766521004643206E69657420676576B5
:10958A006F6E64656E2100504B542D546F6F6C20C2
:10959A00474E552047504C00676566756E64656E88
:1095AA003A2000666F756E643A200074726F7576A1
:1095BA00E9733A20006765766F6E64656E3A20003B
:1095CA00466C696768742D4374726C004E617669E3
:1095DA002D4374726C0056657273696F6E3A20007F
:1095EA005665727369653A202000657277617274F4
:1095FA006574006578706563746564006174746588
:10960A006E64757300766572776163687400676566
:10961A0066756E64656E00666F756E642020200044
:10962A0074726F7576657320006765766F6E646510
:10963A006E00504B542D546F6F6C206E7572206DF6
:10964A00697400504B542D546F6F6C206F6E6C7997
:10965A00207769746800504B5420756E697175657E
:10966A006D656E74206176656300504B542D546F9E
:10967A006F6C20616C6C65656E206D657400464385
:10968A0020536F66747761726520006B6F6D70612D
:10969A00746962656C00636F6D70617469626C6590
:1096AA0000636F6D70617469626C657300636F6DDE
:1096BA007061746962656C0045696E2020004F6EA6
:1096CA0020202000556E2020200041616E202000BD
:1096DA004175732020004F666620200044752020C3
:1096EA002000556974202000455343002020504B28
:1096FA005420617573736368616C74656E3F0020F2
:10970A002073687574646F776E20504B54203F0045
:10971A0020206465736163746976657220504B54C6
:10972A00203F002020504B54207569747363686190
:10973A006B656C656E203F004E65696E2020204A7D
:10974A0061006E6F20202020796573006E6F6E2095
:10975A0020206F7569004E6565202020204A61002F
:10976A0056657262696E6465205043206D69742083
:10977A00504B54202000436F6E6E65637420504333
:10978A0020746F20504B542D555342006173736FF0
:10979A0063696572205043206120504B542D555304
:1097AA00420056657262696E64205043206D65748A
:1097BA0020504B54202020004472FC636B65202704
:1097CA0053746172742720616D20504B540050729B
:1097DA006573732027537461727427206F6E20504B
:1097EA004B54200070726573736520276C616E6339
:1097FA00657227206120504B54004472756B2027F4
:10980A00537461727427206F7020504B54202000CB
:10981A002020202020202020202020456E64652042
:10982A0053746172740020202020202020202020E0
:10983A0020456E6420205374617274002020202019
:10984A0020202020202066696E20206C616E6365CE
:10985A0072002020202020202020202045696E64CC
:10986A0065205374617274002050432D51756963E9
:10987A006B2D56657262696E64756E6720002050A2
:10988A00432D517569636B2D436F6E6E6563746901
:10989A006F6E20002050432D636F6E6E6578696F7E
:1098AA006E20726170696465200020536E656C6C6D
:1098BA00652050432D76657262696E64696E670031
:1098CA0056657262696E64652064617320504B54F8
:1098DA00206D697400436F6E6E65637420504B543B
:1098EA002077697468204D4B00636F6E6E656374F0
:1098FA00657A20504B54206120204D4B00566572EA
:10990A0062696E6420504B5420200064656D204DBE
:10991A004B20FC6265723A002020206F7665722027
:10992A002020203A002020612070726F706F73200F
:10993A003A002020206D657420202020203A0064FF
:10994A00656D204D4B20FC6265723A20204B6162A6
:10995A00656C2C20006F7665723A204B6162656CEB
:10996A0000612070726F706F733A204361626C6598
:10997A00004D4B207669613A206B6162656C20204C
:10998A0020202020202000657320697374206B65D5
:10999A00696E2057692E3233320074686572652009
:1099AA006973206E6F2057692E323332006C206E35
:1099BA0027796120706173206465200065722069CF
:1099CA0073206765656E2077692E32333220004D29
:1099DA006F64756C2065696E6765626175742E00C7
:1099EA006275696C7420696E2E006D6F64756C65A2
:1099FA0020696E7465677265205769323332006D6B
:109A0A006F64756C6520696E6765626F7577642E21
:109A1A000057656E6E20646F63682C2064616E6EF9
:109A2A00206269747465006966207965732C2074F4
:109A3A0068656E20666972737400536920766F7563
:109A4A0073206C6520666169746573007A6F206A99
:109A5A00612C2064616E2061756220656572737481
:109A6A0000646173204D6F64756C207A756572733A
:109A7A007420696D202000616374697661746520C1
:109A8A006D6F64756C20696E0061637469766572C6
:109A9A00206C65206D6F64756C65006465206D6F60
:109AAA0064756C6520616B7469766572656E0053C6
:109ABA00657475706D656EFC20616B746976696595
:109ACA0072656E2E0053657475706D656E750064EF
:109ADA00616E73206D656E7520646520636F6E66B6
:109AEA0069672E00696E2068657420536574757005
:109AFA006D656E752E00536965206DFC7373656E16
:109B0A002064617320504B5400596F752068617648
:109B1A006520746F00566F757320646576657A00E8
:109B2A0055206D6F657420646520504B54006A653A
:109B3A00747A74206E6575207374617274656E210F
:109B4A00007265737461727420504B5400726564BC
:109B5A00656D617272657220504B54006E75206F8C
:109B6A00706E69657577207374617274656E210011
:109B7A00457320697374206B65696E2042544D2DBC
:109B8A00323232005468657265206973206E6F2024
:109B9A0042544D2D32323200457220697320676576
:109BAA00656E2042544D2D323232004D6F64756C11
:109BBA002065696E676562617574004D6F64756CC6
:109BCA00206275696C7420696E006D6F64756C65CE
:109BDA0020696E74656772652042544D32323200D4
:109BEA00204D4B2D5553422046756E6B74696F6E2E
:109BFA002000204D4B2D5553422046756E637469E3
:109C0A006F6E2000204D4B2D55534220666F6E63B8
:109C1A0074696F6E2000204D4B2D555342204675B6
:109C2A006E63746965202000204254202D2D3E2049
:109C3A004B6162656C20616E204643202000204201
:109C4A0054202D2D3E204B6162656C20746F204696
:109C5A0043202000204254202D2D3E204361626C77
:109C6A0065206120204643202000204254202D2DCB
:109C7A003E206B6162656C206E6161722046430012
:109C8A005043206D697420425420766572622E001A
:109C9A00636F6E6E65637420504320776974682021
:109CAA004254006173736F63696572205043206187
:109CBA002042540050432076696120425420766540
:109CCA0072626F6E64656E2E00504B542D4B61624A
:109CDA00656C20616E20464300504B542D4B6162E7
:109CEA00656C20746F20464300504B542D436162CB
:109CFA006C65206120464300504B542D6B616265B0
:109D0A006C206E61617220464300204254202D2D42
:109D1A003E2057692E323332202020202020200076
:109D2A0057692E32333220616E204643202020208C
:109D3A0020202020200057692E32333220746F20D1
:109D4A0046432020202020202020200057692E3240
:109D5A00333220612046432020202020202020204A
:109D6A00200057692E323332206E616172204643D9
:109D7A00202020202020200020555342202D2D3E37
:109D8A00204B6162656C20616E204643200020559D
:109D9A005342202D2D3E206361626C6520746F2032
:109DAA004643200020555342202D2D3E20636162F8
:109DBA006C652061204643202000555342202D2DFA
:109DCA003E206B6162656C206E61617220464300C1
:109DDA005043206D6974205553422076657262693A
:109DEA006E64656E2000636F6E6E65637420504307
:109DFA002077697468205553422020006173736F7D
:109E0A006369657220504320612055534220202007
:109E1A00200056657262696E64205043206D657435
:109E2A00205553422020200020555342202D2D3EFC
:109E3A002057692E323332202020202020004D4B1B
:109E4A002D546F6F6C207374617274656E00737435
:109E5A00617274204D4B2D546F6F6C0064656D6197
:109E6A007272616765204D4B2D546F6F6C002057DD
:109E7A00692E323332204B6F6E6669677572696577
:109E8A0072656E002057692E32333220436F6E6638
:109E9A00696775726174696F6E002057692E323373
:109EAA003220636F6E6669677572657220202000C2
:109EBA002057692E32333220436F6E666967757296
:109ECA0061746965200050726F6772616D6D2073ED
:109EDA0074617274656E2E20202020007374617282
:109EEA00742070726F6772616D200044E96D61724F
:109EFA00726572206C652070726F6772616D6D6534
:109F0A000073746172742070726F6772616D6D6133
:109F1A002E0042544D2D323232204B6F6E666967E5
:109F2A007572696572656E0042544D2D3232322067
:109F3A00636F6E66696775726174696F6E00425409
:109F4A004D2D32323220646520636F6E6669677503
:109F5A0072612E0042544D2D32323220636F6E668A
:109F6A006967757261746965004643203E204D4BEE
:109F7A002D555342203E2042544D2D323232004D4F
:109F8A004B2D55534220616E20504320616E7363FE
:109F9A00686C2E2000636F6E6E65637420504320D8
:109FAA00746F204D4B2D55534220006173736F63BC
:109FBA006965722050432061204D4B2D5553422034
:109FCA000056657262696E64205043206D65742084
:109FDA004D4B2D555342005A7769736368656E205D
:109FEA004D4B2D55534220756E64202000636F6ED1
:109FFA006E6563742063726F737365642063616254
:10A00A006C65006C6120636F6E6E6578696F6E2097
:10A01A00656E7472652050430054757373656E20C3
:10A02A004D4B2D55534220656E20504B5420005005
:10A03A004B542065696E2067656B7265757A746525
:10A04A0073202020006265747765656E204D4B2D64
:10A05A0055534220616E64202020006574204643D7
:10A06A0020756E206361626C652063726F69736527
:10A07A000065656E2067656B727569737465206B20
:10A08A006162656C2020004B6162656C20616E73B1
:10A09A0063686C69657373656E2E202000504B549B
:10A0AA002053563200200061616E736C75697465C5
:10A0BA006E2E004B6162656C006361626C650053D1
:10A0CA006C617665202020006573636C6176657328
:10A0DA00004E6F726D616C20006E6F726D616C2044
:10A0EA00004E6F726D2E2020005265766572736580
:10A0FA0000696E7665727365006765696E7665726A
:10A10A0000456E64202020204F4B0046696E2020B7
:10A11A0020204F4B0045696E642020204F4B0020C1
:10A12A00454550726F6D207769726B6C6963680080
:10A13A00205265616C792064656C657465002065E0
:10A14A006570726F6D207375707072696D65723F9C
:10A15A000020456570726F6D207765726B656C695A
:10A16A006A6B00206CF6736368656E3F0020454594
:10A17A0070726F6D3F002020202000207769737372
:10A18A00656E3F0064657574736368202020200043
:10A19A006765726D616E202020202000616C6C65FD
:10A1AA006D616E64652020006475697473202020D7
:10A1BA0020202000656E676C697363682020200088
:10A1CA00656E676C6973682020202000616E676C79
:10A1DA006169736520202000656E67656C732020B5
:10A1EA00202020006672616E7AF6736973636800D4
:10A1FA006672656E63682020202020006672616E98
:10A20A00E7616973652020006672616E7320202001
:10A21A0020202000686F6C6CE46E646973636800C8
:10A22A00647574636820202020202000686F6C6C9D
:10A23A00616E6461697365006E656465726C616EF6
:10A24A0064732000416E7A656967652045696E739B
:10A25A0074656C6C756E67656E0020446973706C0A
:10A26A0061792053657475702020202020202000F9
:10A27A0020642761666669636861676520636F6E3B
:10A28A006669672E2000446973706C617920696E73
:10A29A007374656C6C696E67656E2000496E666FD3
:10A2AA0073206265692053746172743A00496E665C
:10A2BA006F20617420737461727475702000496E26
:10A2CA00662E61752064656D617272616765004909
:10A2DA006E666F2062696A206F70737461727400AF
:10A2EA0053707261636865203A20004C616E67752D
:10A2FA006167653A20006C61206C616E6775653A2A
:10A30A0020005461616C3A20004C696368742061D2
:10A31A007573206E6163683A004C69676874206FD0
:10A32A0066662061667465723A00457874692E66BD
:10A33A0065757820702E6C65733A004C6963687491
:10A34A0020756974206E613A2020004C43442048ED
:10A35A00656C6C69676B2E3A002042726967687493
:10A36A006E657373203A00206C756D696E6F736940
:10A37A007465203A0020696E74656E736974656944
:10A38A00743A004C4344204B6F6E74726173743A92
:10A39A00004C434420636F6E74726173743A004CCC
:10A3AA004344204E6F726D2F496E763A20004C431B
:10A3BA0044204F7269656E742E3A2000524320463B
:10A3CA0065686C657270696570203A005243204571
:10A3DA0072726F726265657020203A004465627518
:10A3EA006720504B540057692054582F5258204325
:10A3FA0068616E3A005769204E6574572E2047727D
:10A40A00702E3A005769204E6574572E204D6F649E
:10A41A00653A0057692054582054696D656F757400
:10A42A003A0057692055415254204D545520202056
:10A43A003A0057692E3233322065696E6765626168
:10A44A0075743A0057692E323332206275696C741A
:10A45A0020696E203A0057692E32333220696E74B1
:10A46A006567726520203A0057692E3233322069B7
:10A47A006E6765626F7577643A004973742065691F
:10A48A006E2057692E3233322D4D6F64756C200061
:10A49A004973205769323332206D6F64756C0065D9
:10A4AA00737420756E206D6F64756C652000497336
:10A4BA002065722065656E2057692E323332006539
:10A4CA00696E6765626175743F006275696C7420B4
:10A4DA00696E3F00696E7465677265205769323329
:10A4EA00323F006D6F64756C6520696E6765626FD7
:10A4FA007577643F004A6120200079657320006FF8
:10A50A00756920004E65696E006E6F2020006E6FBF
:10A51A006E20004E656520002042544D32323220B2
:10A52A0045696E7374656C6C756E67656E00202084
:10A53A0042544D2D3232322073657474696E6773DA
:10A54A00202020004973742065696E2042544D2DE5
:10A55A003232322D4D6F64756C0049732042544D6E
:10A56A002D323232204D6F64756C0049732065724A
:10A57A002065656E2042544D2D32323200696E7468
:10A58A00656772652042544D3232323F0042544D63
:10A59A003232322065696E6765626175743A0042CB
:10A5AA00544D323232206275696C7420696E203AD9
:10A5BA000042544D32323220696E746567726520EA
:10A5CA00203A0042544D32323220696E6765626F1A
:10A5DA007577643A0020504B5420416B6B752045C7
:10A5EA00696E7374656C6C756E670020504B5420ED
:10A5FA0041636375205365747570202020202020E4
:10A60A0000504B5420416B6B757479703A2000509E
:10A61A004B5420416363757479703A2000504B544F
:10A62A002041636375747970653A2000416B6B75DC
:10A63A002055204F66667365743A2000416363753E
:10A64A002055204F66667365743A20004F6666731C
:10A65A006574207665727374656C6C656E206269C8
:10A66A00730061646A757374206F6666736574201B
:10A67A00756E74696C00446563616C616765206C12
:10A68A0027616A757374657220004F666673657414
:10A69A00206166726567656C656E20746F7400640C
:10A6AA006965205370616E6E756E67207061737391
:10A6BA007400766F6C7461676520666974730061F3
:10A6CA00206C612074656E73696F6E006465207317
:10A6DA0070616E6E696E67206A756973742069733A
:10A6EA002E004C6F77426174205761726E20563A81
:10A6FA00004C6F7742617420616C61726D203A0080
:10A70A00560046004C004800420044004100470001
:10A71A0052004E6900546100526F004B6F00436F44
:10A72A00004645484C45523A20446174656E766548
:10A73A00726C75737420004552524F523A2044612C
:10A74A007461206C6F73740070657274652064653F
:10A75A0020646F6E6E6565730076657262696E64F9
:10A76A00696E672076657262726F6B656E20004C47
:10A77A0065747A74652062656B616E6E7465004CEF
:10A78A00617374206B6E6F776E20004465726E6918
:10A79A0065726520706F736974696F6E004C6161D0
:10A7AA007473742062656B656E646500506F7369BB
:10A7BA0074696F6E2000706F736974696F6E200020
:10A7CA00706F736974696520002045696E737465DA
:10A7DA006C6C756E67656E2020202020202000207A
:10A7EA0053657474696E6720202020202020202061
:10A7FA00202020200020506172616D65747265739B
:10A80A00202020202020202020200020496E737440
:10A81A00656C6C696E67656E2020202020202020E0
:10A82A0000E46E6465726E006368616E6765006C51
:10A83A0065206368616E67656D656E740076657222
:10A84A00616E646572696E6700616B7469766965C9
:10A85A0072656E0061637469766174650061637420
:10A86A00697665720061637469766572656E006106
:10A87A006B74697669657274006163746976617470
:10A88A006564006163746976656500676561637410
:10A89A00697665657264002053657474696E672011
:10A8AA00782073706569636865726E3F00207374FF
:10A8BA006F72652073657474696E673F0020526514
:10A8CA00676C616765206D61676173696E3F00201F
:10A8DA00696E7374656C6C2E6F7020746520736C6E
:10A8EA0061616E3F0047657370656963686572747C
:10A8FA0020756E640073746F72656420616E640003
:10A90A0073746F636B6573206574006F706765732A
:10A91A006C6167656E20656E004B6F706965726564
:10A92A002053657474696E6700636F70792073656C
:10A93A007474696E677300706172616D65747265B3
:10A94A007320646520636F706965006B6F70696559
:10A95A00657220696E7374656C2E0020766F6E20A6
:10A96A00207820206E616368202079002066726F4B
:10A97A006D207820746F2079002064657320782018
:10A98A0061707265732079002076616E2078206E7E
:10A99A0061207900766F6E2020206E616368202026
:10A9AA00456E64652020204F4B0066726F6D202033
:10A9BA00746F20202020656E64202020204F4B00D9
:10A9CA0064657320202061707265732066696E2049
:10A9DA002020204F4B0076616E2020206E612020BF
:10A9EA00202065696E646520204F4B005769726BA1
:10A9FA006C696368206B6F70696572656E3F00727F
:10AA0A0065616C6C7920636F70793F007672616959
:10AA1A006D656E7420636F7069653F006563687465
:10AA2A00206B6F7069653F004B6F706965727420A7
:10AA3A00756E6420616B7469766965727400636F00
:10AA4A007069656420616E642061637469766174FB
:10AA5A0065642000636F70696573206574206163A3
:10AA6A0074696673004B6F706965EB6E20656E20C2
:10AA7A0061637469656600C46E64657265204569C0
:10AA8A006E7374656C6C756E67656E20002020208D
:10AA9A006368616E67652073657474696E67732095
:10AAAA002020006D6F646966696572206C65732089
:10AABA007265676C6167657300696E7374656C6C47
:10AACA00696E67656E2077696A7A6967656E0020C4
:10AADA0057E4686C6520506172616D657465722017
:10AAEA0020202020002073656C65637420706172D9
:10AAFA00616D65746572732020200073656C6563EF
:10AB0A0074696F6E6E657A20506172616D65742E1C
:10AB1A000053656C65637465657220506172616D7E
:10AB2A00657465727320002057E4686C652053656C
:10AB3A006974652020202020202020200020202049
:10AB4A00202073656C65637420706167652020201E
:10AB5A0020200053656C656374696F6E6E657A2098
:10AB6A006C6120706167652000202053656C656305
:10AB7A007465657220706167696E6120202000200B
:10AB8A0057E4686C652053657474696E673A2020CF
:10AB9A002020202000202073656C65637420736573
:10ABAA007474696E6720202020200053656C6563E9
:10ABBA0074696F6E6E657A2073657474696E672046
:10ABCA0000202053656C6563746565722073657433
:10ABDA0074696E6720200020204750532045696E13
:10ABEA007374656C6C756E67656E2020002020207A
:10ABFA00204750532073657474696E677320202050
:10AC0A00202000676577E4686C74657320475053A9
:10AC1A0020476572E47420200073656C656374656F
:10AC2A006420475053206465766963652020004795
:10AC3A00505320456D70662E65696E736368616C4A
:10AC4A0074656E3F00726563656976652047505387
:10AC5A00206F6E3F202020202020006D6178204840
:10AC6A00F6686520202020203A006D617820416C2A
:10AC7A00746974756465203A006D6178204765735C
:10AC8A006368772E20203A006D61782053706565DD
:10AC9A0064202020203A006D617820456E74666534
:10ACAA00726E2E203A006D61782044697374616E69
:10ACBA006365203A006D696E205370616E6E756E21
:10ACCA0067203A006D696E20566F6C746167652063
:10ACDA00203A006D6178205A65697420202020206E
:10ACEA003A006D61782054696D6520202020203A51
:10ACFA00006D6178205374726F6D202020203A0015
:10AD0A006D61782043757272656E7420203A004531
:10AD1A006E742E4B6170617A6974E4743A005573EB
:10AD2A0065644361706163697479203A004C6F6E9F
:10AD3A00672E203A004C61742E20203A004E75721C
:10AD4A00206D6974204E4320212020004F6E6C79BB
:10AD5A002077697468204E432021004B65696E652F
:10AD6A0020536574696E67732021212020004E6F7D
:10AD7A002073657474696E6773207265616421213A
:10AD8A00004E6F6E20506172616D657472E87321B6
:10AD9A002120200048F66865202061757320004153
:10ADAA006C74692E206F66662000416C74692E6689
:10ADBA00696E69720048F6686520626567722E00DE
:10ADCA00416C74692E4C696D697400566172696FC1
:10ADDA00206175732000566172696F206F66662064
:10ADEA0000566172696F2066696E69005661726900
:10ADFA006F2048F6686500566172696F20416C746D
:10AE0A002E0020202020202020202000436172656F
:10AE1A002046726565004C454431004C4544320079
:10AE2A004E61766920206175732020004E61766933
:10AE3A0020206F6666202000506F732E2068616C98
:10AE4A0074656E00506F732E20486F6C642020006A
:10AE5A00506F732E2064757265722000436F6D699E
:10AE6A006E6720486F6D65005265746F7572652054
:10AE7A00202020004A757374696572656E0043610B
:10AE8A006C6962726174650043616C6962726167C0
:10AE9A00650053746172742020202000446570613B
:10AEAA007274202020004265747269656220200055
:10AEBA0052756E202020202020004D617263686543
:10AECA0072202000466C696567656E202000466C1A
:10AEDA007920202020202000466F6C6572202020D7
:10AEEA0020004C616E64756E672020004C616E64B0
:10AEFA00696E672020004170706F6E746572200061
:10AF0A00416B6B75206C656572004C6F77204261EE
:10AF1A00742E20004C6F772042617420200020207C
:10AF2A004F534420416E7A6569676520536574758D
:10AF3A007020200020204F53442073637265656E91
:10AF4A00207365747570202020004F7574312F327C
:10AF5A00206E656769657274203A004F7574312FE7
:10AF6A003220696E7665727465643A004F75743181
:10AF7A002F3220466F726D61743A004F7574312F0B
:10AF8A003220666F726D61743A006E6F7420696D5B
:10AF9A00706C656D656E7465643A006D2E20536938
:10AFAA006E6B72617465206D2F733A006D2E666147
:10AFBA006C6C7370656564206D2F733A005661720C
:10AFCA00696F6D6574657220426565703A007661D5
:10AFDA0072696F6D6574657220626565703A0048C2
:10AFEA006F6D65736963687420766F6E204D4B3A96
:10AFFA0000686F6D65766965772066726F6D204DA2
:10B00A004B3A006D4168205761726E756E67203E3B
:10B01A00203A006D4168207761726E696E67203E42
:10B02A00203A004F534420416E7A6569676576611C
:10B03A00723A004F53442073637265656E6D6F6494
:10B04A00653A004D4B20566F6C742042616C6B65FB
:10B05A006E3A004D4B20766F6C7420626172677293
:10B06A006170683A00426175642057693233322F41
:10B07A0042543A0020466F6C6C6F77204D6520531E
:10B08A006574757020200020202020205265667289
:10B09A0065736820203A00476573636877696E6450
:10B0AA0069676B6569743A002020202053706565D2
:10B0BA00642020202020203A00546F6C6572616E53
:10B0CA007A205261646975733A0015008701870115
:10B0DA008701870115009D01B301C901DF01150030
:10B0EA00F5010B022102370215004D025F027102BF
:10B0FA008302150095029F02A902B3021500BD0240
:10B10A00C702D102DB021500E502F50205031903A5
:10B11A00150029033A034F036403150079038F03CB
:10B12A00A303B6031500CB03E103EE03FA031500EC
:10B13A000D04230437044B0415005F0475047504D9
:10B14A00750415008B049C04AD04BF041500D104DA
:10B15A00D104D104D1041500E104E104E104E104BD
:10B16A001500EC04EC04EC04EC041500F804F804F3
:10B17A00F804F8041500050505050505050515007B
:10B18A0012051205120512051500200520052005D5
:10B19A00200515002D052D052D052D0515003B054E
:10B1AA003B053B053B05150048055E0574058A0508
:10B1BA001500A005B605B605CC051500E205F8058B
:10B1CA000E06240615003A065006500650061500CB
:10B1DA0066067C069206A8061500BE06CE06DE06A0
:10B1EA00EE061500FE0604070A07100715001607E3
:10B1FA001B071B072007150025072E0737074007DF
:10B20A0015004907500757075E07150065077807B5
:10B21A00860795071500A707A707A707A707150019
:10B22A00B807C307CB07D5071500E007E007E00713
:10B23A00E0071500EC07EC07EC07EC071500F6072A
:10B24A00F607F607000815000A0813081C0825085F
:10B25A0015002E08370840084908150052086308E7
:10B26A0076088A0815009E089E089E089E08150002
:10B27A00AB08B608C108CD081500D808DE08E408EE
:10B28A00EA081500F008F608FC0802091500080982
:10B29A0008090809080915000C091F09300943099A
:10B2AA001500580962096C09760915008009960982
:10B2BA00AC09C2091500D809EE09040A1A0A1500D0
:10B2CA00300A460A5C0A720A1500880A9E0AB40AFB
:10B2DA00CA0A1500E00AF50A090B1D0B15002B0B0B
:10B2EA00380B450B520B15005F0B750B810B910B3D
:10B2FA001500A70BBA0BCD0BDC0B1500EF0B000CDE
:10B30A000A0C1F0C1500310C470C5A0C6C0C15005A
:10B31A00810C970CA90CBB0C1500CF0CE50CEF0C9B
:10B32A00040D1500160D290D350D400D15004E0D95
:10B33A00610D6D0D7C0D1500900DA40DCD0BB80D92
:10B34A001500CB0DDB0DEA0D1F0C1500000E120EB9
:10B35A00240E360E1500480E5E0E740E8A0E150067
:10B36A00A00EB00EC30ED40E1500E90EF90E090F89
:10B37A00180F15002A0F2A0F2A0F2A0F1500400F3F
:10B38A00560F6C0F820F1500980FAE0FC40FDA0F0D
:10B39A001500F00F06101C10321015004810481046
:10B3AA004810481015005E106E107C106E101500C3
:10B3BA008E10A410BA10D0101500E610FC100B1154
:10B3CA0021111500321148115E11741115008911ED
:10B3DA0089118911891115009F11B511CB11E1113C
:10B3EA001500F7110D122312391215004F126512AA
:10B3FA007B1291121500A712BD12C512C7121500B1
:10B40A00D312D912D912D3121500DF12DF12E812A1
:10B41A00DF121500F112F112F912011315000913C6
:10B42A001113111319131500950221132B13351338
:10B43A0015003F1350135E137113150083138D13F8
:10B44A0096139B131500A413B013BC13C81315004D
:10B45A00D413E013EC13F8131500041410141C147D
:10B46A0028141500341440144C145814150064148C
:10B47A007A149014A6141500BC14CD14DE14EF141B
:10B48A00150000150B151615221515002915391565
:10B49A004A155B1515006B15791587159515150055
:10B4AA00A315B115B115B1151500BF15BF15BF15F7
:10B4BA00BF151500CE15CE15CE15CE151500DC1507
:10B4CA00EC15EC15EC151500FC15FC15FC15FC1516
:10B4DA001500061606160616061615001516151672
:10B4EA0015161516150024162416241624161500EA
:10B4FA003316331633163316150042164216421601
:10B50A0042161500521664167616881615009A16F3
:10B51A00B016BF16CE161500DF16EA16F416031774
:10B52A00150015171A171F171517150024172917AD
:10B53A002E173317150038174E174E174E171500CA
:10B54A0064177A17BF168B171500DF16EA169D17B0
:10B55A0003171500AD17BF17D117E3171500F51715
:10B56A000B180B180B18150021182F182F183D1837
:10B57A0015004C185C185C185C18150021182F1857
:10B58A002F183D1815006C1882189618AA1815005D
:10B59A00BF18D218DF18EC1815000219021902197F
:10B5AA001119150020192219241922191500261912
:10B5BA0028192A192C191500241924192E192419A5
:10B5CA001500301930192A19301915003219321993
:10B5DA00351932191500381938193819381915005A
:10B5EA003B193E193E193E19150041195719681998
:10B5FA00791915008F199F19AB19BD191500CC19A6
:10B60A00D619D619E0191500E919FF19151A2B1AB6
:10B61A001500411A481A4F1A5D1A1500691A741A48
:10B62A007D1A851A15008F1A991AA31AAB1A1500D2
:10B63A00B71ACD1ADD1AEF1A1500051B151B201BA8
:10B64A002B1B1500391B491B571B6B1B15007B1B3A
:10B65A008C1B991BA81B1500B41BCA1BE01BF61BED
:10B66A0015000C1C1F1C2C1C3C1C1500481C5E1CC5
:10B67A00741C851C1500971CAD1CC31CD91C150015
:10B68A00EF1C051D1B1D311D1500471D5D1D731D7A
:10B69A00891D15009F1DB51DCB1DE11D1500F71D48
:10B6AA000D1E0D1E0D1E1500231E391E391E391EB4
:10B6BA0015004F1E651E651E651E15007B1E8A1E1F
:10B6CA008A1E8A1E1500991EA81EA81EA81E1500ED
:10B6DA00B71EC61EC61EC61E1500D51EE41EE41ED3
:10B6EA00E41E1500F31E021F021F021F1500111F80
:10B6FA00201F201F201F15002F1F3E1F3E1F3E1F09
:10B70A0015004D1F4D1F4D1F4D1F1500551F551F6D
:10B71A00551F551F15005D1F6C1F6C1F6C1F1500F0
:10B72A007B1F8E1FA11F8E1F1500B41FBF1FCA1FAC
:10B73A00BF1F1500D51FE01FE01FE01F1500EB1FFC
:10B74A00F61F0120F61F15000C20172017201720BE
:10B75A001500222022202220222015002C202C2015
:10B76A002C202C2015009613961396139613150069
:10B77A00362036203620362015003B203B203B2041
:10B78A003B20150040204C204C204C20150058200E
:10B79A0064207020642015007C207C2088207C2076
:10B7AA0015002220222022202220150094209E20EB
:10B7BA00A8209E201500B220B220BC20B22015007D
:10B7CA00C620D020DA20D0201500E420EE20F82070
:10B7DA00EE20150002210C2116210C211500202132
:10B7EA002A212A21342115003E2154215421542191
:10B7FA0015006A217B217B217B2115008C219B214D
:10B80A009B219B211500AA21AA21AA21AA21150060
:10B81A00BB21CC21CC21CC211500DD21EE21EE214A
:10B82A00EE211500FF2111221122112215002322D7
:10B83A003322332233221500432253225322532226
:10B84A001500632273227322732215008522852232
:10B85A00852285221500942294229422942215008E
:10B86A00A722A722A722A7221500B722C822C822E8
:0EB87A00C8221500D922D922D922D9220200D3
:00000001FF
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/LICENSE.TXT
0,0 → 1,340
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
 
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
Preamble
 
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
 
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
 
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
 
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
 
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
 
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
 
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
 
The precise terms and conditions for copying, distribution and
modification follow.
 
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
 
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
 
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
 
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
 
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
 
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
 
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
 
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
 
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
 
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
 
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
 
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
 
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
 
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
 
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
 
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
 
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
 
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
 
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
 
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
 
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
 
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
 
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
 
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
 
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
 
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
 
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
 
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
 
NO WARRANTY
 
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
 
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
 
END OF TERMS AND CONDITIONS
 
How to Apply These Terms to Your New Programs
 
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
 
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
 
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
 
Also add information on how to contact you by electronic and paper mail.
 
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
 
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
 
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
 
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
 
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
 
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
 
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/Makefile
0,0 → 1,418
#
# v1_2 = all versions below 1.3
# v1_3 = differend LED Pins, 2nd Uart
#
 
# Version der Software
Version = 3.6.3a_MartinR
#// martinR: verschoben
 
LANGUAGE = de
 
#HWVERSION = v1_2
#HWVERSION = v1_3
HWVERSION = v3_9
 
ifeq ($(HWVERSION), v1_2)
MCU = atmega644
TARGET = PKT_$(Version)_HW_1_2_$(LANGUAGE)
endif
ifeq ($(HWVERSION), v1_3)
MCU = atmega644p
TARGET = PKT_$(Version)_HW_1_3_$(LANGUAGE)
endif
ifeq ($(HWVERSION), v3_9)
MCU = atmega1284p
#MCU = atmega644p
TARGET = PKT_$(Version)_HW_3_9_$(LANGUAGE)
endif
F_CPU = 20000000
# FUSE_SETTINGS = -U lfuse:w:0xe6:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m
 
 
 
 
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
 
 
 
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
 
##########################################################################################################
# List C source files here. (C dependencies are automatically generated.)
SRC = main.c menu.c timer.c tools.c twimaster.c uart1.c usart.c motortest.c
SRC += HAL_HW1_2.c HAL_HW1_3.c HAL_HW3_9.c Wi232.c bluetooth.c connect.c debug.c display.c
SRC += eeprom.c error.c error_driver.c fifo.c font8x6.c gps.c lcd.c lipo.c osd.c parameter.c servo.c setup.c
SRC += followme.c tracking.c Font8x8.c messages.c
SRC += stick.c
##########################################################################################################
 
 
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =
 
 
 
# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
EXTRAINCDIRS =
 
 
# Optional compiler flags.
# -g: generate debugging information (for GDB, or for COFF conversion)
# -O*: optimization level
# -f...: tuning, see gcc manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create assembler listing
CFLAGS = -O$(OPT)
CFLAGS += -funsigned-char
CFLAGS += -funsigned-bitfields
CFLAGS += -fpack-struct
CFLAGS += -fshort-enums
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 
 
# Compiler flag to set the C Standard level.
# Unremark just one line below to set the language standard to use.
# c89 = "ANSI" C
# gnu89 = c89 plus GCC extensions
# c99 = ISO C99 standard (not yet fully implemented)
# gnu99 = c99 plus GCC extensions
#CFLAGS += -std=c89
#CFLAGS += -std=gnu89
#CFLAGS += -std=c99
CFLAGS += -std=gnu99
 
CFLAGS += -DF_CPU=$(F_CPU)
ifeq ($(HWVERSION), v1_2)
CFLAGS += -DHWVERSION1_2
endif
ifeq ($(HWVERSION), v1_3)
CFLAGS += -DHWVERSION1_3
endif
ifeq ($(HWVERSION), v3_9)
CFLAGS += -DHWVERSION3_9
endif
 
ifeq ($(LANGUAGE), de)
CFLAGS += -DLANGUAGE_DE
endif
ifeq ($(LANGUAGE), en)
CFLAGS += -DLANGUAGE_EN
endif
ifeq ($(LANGUAGE), fr)
CFLAGS += -DLANGUAGE_FR
endif
 
 
 
# Optional assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
 
 
 
# Optional linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
 
# Additional libraries
 
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
 
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
 
# -lm = math library
LDFLAGS += -lm
 
 
##LDFLAGS += -T./linkerfile/avr5.x
 
 
 
# Programming support using avrdude. Settings and variables.
 
# Programming hardware:
#
# Type: avrdude -c ?
# to get a full listing.
#
AVRDUDE_PROGRAMMER = STK500v2
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden
 
AVRDUDE_PORT = /dev/cu.SLAB_USBtoUART # programmer connected to serial device
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port
#AVRDUDE_PORT = usb # programmer connected to USB
 
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
AVRDUDE_WRITE_FUSE = $(FUSE_SETTINGS)
AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
 
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
#AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER)
 
# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE += -y
 
# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
AVRDUDE_FLAGS += -V
 
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_FLAGS += -v -v
 
# ---------------------------------------------------------------------------
# Define directories, if needed.
#DIRAVR = c:/winavr
#DIRAVRBIN = $(DIRAVR)/bin
#DIRAVRUTILS = $(DIRAVR)/utils/bin
#DIRINC = .
#DIRLIB = $(DIRAVR)/avr/lib
 
 
# Define programs and commands.
SHELL = sh
 
CC = avr-gcc
 
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
 
# Programming support using avrdude.
AVRDUDE = avrdude
 
REMOVE = rm -f
COPY = cp
 
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
##ELFSIZE = $(SIZE) -A $(TARGET).elf
ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf
 
# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
 
 
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
 
# Define all listing files.
LST = $(SRC:.c=.lst) $(ASRC:.S=.lst)
 
# Combine all necessary flags and optional flags.
# Add target processor to flags.
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS)
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
 
 
# Default target.
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
$(TARGET).lss $(TARGET).sym sizeafter finished end
 
 
# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)
 
finished:
@echo $(MSG_ERRORS_NONE)
 
end:
@echo $(MSG_END)
@echo
 
 
# Display size of file.
sizebefore:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
 
sizeafter:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi
 
 
 
# Display compiler version information.
gccversion :
@$(CC) --version
 
 
# Convert ELF to COFF for use in debugging / simulating in
# AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
 
 
coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
 
 
extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
 
 
 
 
# Program the device.
flash: $(TARGET).hex
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)
eeprom: $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_EEPROM)
fuse:
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FUSE)
 
reset:
$(AVRDUDE) $(AVRDUDE_FLAGS)
 
 
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
 
%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
 
# Create extended listing file from ELF output file.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@
 
# Create a symbol table from ELF output file.
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
avr-nm -n $< > $@
 
 
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
 
 
# Compile: create object files from C source files.
%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@
 
 
# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@
 
 
# Assemble: create object files from assembler source files.
%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@
 
 
# Target: clean project.
clean: begin clean_list finished end
 
clean_list :
@echo
@echo $(MSG_CLEANING)
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
@echo
 
 
# Automatically generate C source code dependencies.
# (Code originally taken from the GNU make user manual and modified
# (See README.txt Credits).)
#
# Note that this will work with sh (bash) and sed that is shipped with WinAVR
# (see the SHELL variable defined above).
# This may not work with other shells or other seds.
#
%.d: %.c
@set -e; $(CC) -MM $(ALL_CFLAGS) $< \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
[ -s $@ ] || rm -f $@
 
 
# Remove the '-' if you want to see the dependency files generated.
-include $(SRC:.c=.d)
 
 
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff clean clean_list flash eeprom fuse reset
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/PKT_363a_MartinR.pnproj
0,0 → 1,0
<Project name="PKT_363a_MartinR"><File path="bluetooth.c"></File><File path="bluetooth.h"></File><File path="connect.c"></File><File path="connect.h"></File><File path="cpu.h"></File><File path="debug.c"></File><File path="debug.h"></File><File path="display.c"></File><File path="display.h"></File><File path="eeprom.c"></File><File path="eeprom.h"></File><File path="error.c"></File><File path="error.h"></File><File path="error_driver.c"></File><File path="error_driver.h"></File><File path="fifo.c"></File><File path="fifo.h"></File><File path="followme.c"></File><File path="followme.h"></File><File path="font8x6.c"></File><File path="font8x6.h"></File><File path="Font8x8.c"></File><File path="Font8x8.h"></File><File path="gps.c"></File><File path="gps.h"></File><File path="HAL_HW1_2.c"></File><File path="HAL_HW1_2.h"></File><File path="HAL_HW1_3.c"></File><File path="HAL_HW1_3.h"></File><File path="HAL_HW3_9.c"></File><File path="HAL_HW3_9.h"></File><File path="lcd.c"></File><File path="lcd.h"></File><File path="LICENSE.TXT"></File><File path="lipo.c"></File><File path="lipo.h"></File><File path="main.c"></File><File path="main.h"></File><File path="Makefile"></File><File path="menu.c"></File><File path="menu.h"></File><File path="messages.c"></File><File path="messages.h"></File><File path="mk-data-structs.h"></File><File path="motortest.c"></File><File path="motortest.h"></File><File path="osd.c"></File><File path="osd.h"></File><File path="parameter.c"></File><File path="parameter.h"></File><File path="parameter_names.h"></File><File path="servo.c"></File><File path="servo.h"></File><File path="setup.c"></File><File path="setup.h"></File><File path="stick.c"></File><File path="stick.h"></File><File path="timer.c"></File><File path="timer.h"></File><File path="TODO.txt"></File><File path="tools.c"></File><File path="tools.h"></File><File path="tracking.c"></File><File path="tracking.h"></File><File path="twimaster.c"></File><File path="twimaster.h"></File><File path="types.h"></File><File path="uart1.c"></File><File path="uart1.h"></File><File path="usart.c"></File><File path="usart.h"></File><File path="waypoints.c"></File><File path="waypoints.h"></File><File path="Wi232.c"></File><File path="Wi232.h"></File></Project>
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/PKT_363a_MartinR.pnps
0,0 → 1,0
<pd><ViewState><e p="PKT_363a_MartinR" x="true"></e></ViewState></pd>
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/PKT_3_63a_MartinR_HW_1_2_de.map
0,0 → 1,2505
Archive member included because of file (symbol)
 
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
lcd.o (__subsf3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o) (__addsf3x)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
osd.o (__ltsf2)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
lcd.o (cos)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
lcd.o (__divsf3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o) (__divsf3x)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
lcd.o (__fixsfsi)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
HAL_HW1_2.o (__fixunssfsi)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
HAL_HW1_2.o (__floatsisf)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o) (__fp_cmp)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_inf)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_nan)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_pscA)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_pscB)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o) (__fp_rempio2)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o) (__fp_round)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o) (__fp_sinus)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_split3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_zero)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
osd.o (__gtsf2)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
HAL_HW1_2.o (__mulsf3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o) (__mulsf3x)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
lcd.o (round)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
lcd.o (sin)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o) (__fp_mintl)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o) (__fp_mpack)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o) (__fp_powsodd)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o) (__fp_powser)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
lcd.o (__mulsi3)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
usart.o (__udivmodqi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
timer.o (__udivmodhi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
motortest.o (__divmodhi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
main.o (__udivmodsi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
lcd.o (__divmodsi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o (exit)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
main.o (__do_copy_data)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
main.o (__do_clear_bss)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
eeprom.o (strcpy_P)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
motortest.o (memset)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
eeprom.o (__eerd_block)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
eeprom.o (__eerd_dword)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
eeprom.o (__eerd_word)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
eeprom.o (__eewr_block)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
eeprom.o (__eewr_dword)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
eeprom.o (__eewr_word)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
motortest.o (itoa)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
lcd.o (utoa)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o) (strrev)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o) (__prologue_saves__)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o) (__epilogue_restores__)
 
Allocating common symbols
Common symbol size file
 
OSD_ScreenMode 0x1 eeprom.o
Display_on 0x1 timer.o
OSD_mAh_Warning 0x2 eeprom.o
display_page_counter
0x1 lcd.o
LastLongitude 0x4 eeprom.o
rxd_buffer 0xb4 usart.o
LCD_ORIENTATION 0x1 eeprom.o
Element 0x1 osd.o
PKT_Accutyp 0x1 eeprom.o
U02SV2 0x1 eeprom.o
timer 0x2 timer.o
abo_timer 0x2 timer.o
Lipo_UOffset 0x2 eeprom.o
BattLowVoltageWarning
0x1 osd.o
version 0x2 main.o
FM_Speed 0x2 eeprom.o
display_buffer 0x400 lcd.o
display_buffer_counter
0x1 lcd.o
LCD_DisplayMode 0x1 eeprom.o
OSD_VarioBeep 0x1 eeprom.o
i2c_state 0x1 motortest.o
mmode 0x1 motortest.o
Pre16 0x2 setup.o
accumulator 0x4 main.o
mk_param_struct 0x2 main.o
bt_name 0xb eeprom.o
LCD_Helligkeit 0x1 eeprom.o
PKT_StartInfo 0x1 eeprom.o
PKTWayPointDirectory
0x23 eeprom.o
last5pos 0x5b osd.o
WiTXTO 0x1 eeprom.o
OSD_active 0x1 osd.o
EditString 0x15 setup.o
OSD_InvertOut 0x1 eeprom.o
MotorTest 0x10 main.o
OSD_LEDform 0x1 eeprom.o
OSD_RCErrorbeep 0x1 eeprom.o
UseBT 0x1 eeprom.o
WiNetworkGroup 0x1 eeprom.o
display_mode 0x1 lcd.o
USBBT 0x1 eeprom.o
WiUartMTU 0x1 eeprom.o
BTIsSlave 0x1 eeprom.o
UseWi 0x1 eeprom.o
LCD_Orientation 0x1 setup.o
gps_UsedDevName 0x14 eeprom.o
buffer 0x1e usart.o
gps_UsedGPSMouse 0x1 eeprom.o
v 0x1 motortest.o
OSD_HomeMKView 0x1 eeprom.o
rx_byte 0x1 usart.o
OSD_LipoBar 0x1 eeprom.o
FM_Radius 0x2 eeprom.o
PKT_IdleBeep 0x1 eeprom.o
Flags_GlobalConfig 0x1 osd.o
ii 0x1 parameter.o
BTIsSet 0x1 eeprom.o
line_buffer 0x80 lcd.o
WiIsSet 0x1 eeprom.o
Flags_GlobalConfig3
0x1 osd.o
DisplayLanguage 0x1 eeprom.o
gps_UseGPS 0x1 eeprom.o
display_buffer_pointer
0x2 lcd.o
OSD_Fallspeed 0x1 eeprom.o
String_Buffer 0x5 timer.o
Flags_ExtraConfig 0x1 osd.o
bt_name_len 0x1 setup.o
lcd_xpos 0x1 lcd.o
samples 0x2 main.o
MK_LowBat 0x1 main.o
LastLatitude 0x4 eeprom.o
txd_buffer 0x3c usart.o
WiNetworkMode 0x1 eeprom.o
BLConfig 0x8 twimaster.o
Motor 0x60 twimaster.o
PKT_Baudrate 0x1 eeprom.o
Debug 0x1 eeprom.o
bt_pin 0x5 eeprom.o
WiTXRXChannel 0x1 eeprom.o
gps_UsedMac 0xe eeprom.o
Vin 0x4 main.o
m 0x1 motortest.o
lcd_ypos 0x1 lcd.o
naviData 0x2 osd.o
Pre 0x2 setup.o
cells 0x1 osd.o
length_tmp 0x1 setup.o
PKTWayPoint 0x1f eeprom.o
LCD_Kontrast 0x1 eeprom.o
OSD_SendOSD 0x1 eeprom.o
DisplayTimeout 0x1 eeprom.o
heading_home 0x2 osd.o
volt_avg 0x2 main.o
FM_Refresh 0x2 eeprom.o
spalte 0x1 setup.o
 
Memory Configuration
 
Name Origin Length Attributes
text 0x00000000 0x00020000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
fuse 0x00820000 0x00000400 rw !x
lock 0x00830000 0x00000400 rw !x
signature 0x00840000 0x00000400 rw !x
*default* 0x00000000 0xffffffff
 
Linker script and memory map
 
Address of section .data set to 0x800100
LOAD C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
LOAD main.o
LOAD menu.o
LOAD timer.o
LOAD tools.o
LOAD twimaster.o
LOAD uart1.o
LOAD usart.o
LOAD motortest.o
LOAD HAL_HW1_2.o
LOAD HAL_HW1_3.o
LOAD HAL_HW3_9.o
LOAD Wi232.o
LOAD bluetooth.o
LOAD connect.o
LOAD debug.o
LOAD display.o
LOAD eeprom.o
LOAD error.o
LOAD error_driver.o
LOAD fifo.o
LOAD font8x6.o
LOAD gps.o
LOAD lcd.o
LOAD lipo.o
LOAD osd.o
LOAD parameter.o
LOAD servo.o
LOAD setup.o
LOAD followme.o
LOAD tracking.o
LOAD Font8x8.o
LOAD messages.o
LOAD C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a
LOAD C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a
LOAD C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a
LOAD C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a
 
.hash
*(.hash)
 
.dynsym
*(.dynsym)
 
.dynstr
*(.dynstr)
 
.gnu.version
*(.gnu.version)
 
.gnu.version_d
*(.gnu.version_d)
 
.gnu.version_r
*(.gnu.version_r)
 
.rel.init
*(.rel.init)
 
.rela.init
*(.rela.init)
 
.rel.text
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
 
.rela.text
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
 
.rel.fini
*(.rel.fini)
 
.rela.fini
*(.rela.fini)
 
.rel.rodata
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
 
.rela.rodata
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
 
.rel.data
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
 
.rela.data
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
 
.rel.ctors
*(.rel.ctors)
 
.rela.ctors
*(.rela.ctors)
 
.rel.dtors
*(.rel.dtors)
 
.rela.dtors
*(.rela.dtors)
 
.rel.got
*(.rel.got)
 
.rela.got
*(.rela.got)
 
.rel.bss
*(.rel.bss)
 
.rela.bss
*(.rela.bss)
 
.rel.plt
*(.rel.plt)
 
.rela.plt
*(.rela.plt)
 
.text 0x00000000 0x11c82
*(.vectors)
.vectors 0x00000000 0x70 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
0x00000000 __vectors
0x00000000 __vector_default
*(.vectors)
*(.progmem.gcc*)
.progmem.gcc_sw_table
0x00000070 0x34 osd.o
.progmem.gcc_fplib
0x000000a4 0x1e C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
*(.progmem*)
.progmem.data 0x000000c2 0x24 main.o
.progmem.data 0x000000e6 0x6c8 menu.o
0x0000047c param_menuitems_nc
0x0000035c param_menuitems_fc
0x000001ac param_menuitems_no
0x000000e6 param_copyright
.progmem.data 0x000007ae 0x1f2 tools.o
0x000007ae tools_menuitems_pkt
.progmem.data 0x000009a0 0xe6 motortest.o
.progmem.data 0x00000a86 0xc3 display.o
.progmem.data 0x00000b49 0x66 eeprom.o
.progmem.data 0x00000baf 0x300 font8x6.o
0x00000baf font8x6
.progmem.data 0x00000eaf 0x26 lcd.o
.progmem.data 0x00000ed5 0xb9 osd.o
0x00000ed5 directions_p
0x00000eee str_SW
0x00000efd rose
0x00000ef1 str_S
0x00000ee8 str_NW
0x00000efa str_NE
0x00000ef4 str_SE
0x00000ee5 str_N
0x00000eeb str_W
0x00000ef7 str_E
.progmem.data 0x00000f8e 0x2d2c parameter.o
0x00003887 param_pages
0x00000f8e param_items_rx
0x00001027 param_config
0x000014e7 param_names
.progmem.data 0x00003cba 0x111c setup.o
0x00003f8a param_menuitems_FOLLOWME
0x000044e2 param_menuitems_wi
0x0000413a param_menuitems_GPS
0x0000476a param_menuitems_lcd
0x0000437a param_menuitems_bt
0x00003cba param_menuitems_OSD
0x000049aa param_menuitems_pkt
0x000042ea param_menuitems_Accu
.progmem.data 0x00004dd6 0x34 followme.o
.progmem.data 0x00004e0a 0x800 Font8x8.o
0x00004e0a Font8x8
0x0000560a . = ALIGN (0x2)
0x0000560a __trampolines_start = .
*(.trampolines)
.trampolines 0x0000560a 0x0 linker stubs
*(.trampolines*)
0x0000560a __trampolines_end = .
*(.jumptables)
*(.jumptables*)
*(.lowtext)
*(.lowtext*)
0x0000560a __ctors_start = .
*(.ctors)
0x0000560a __ctors_end = .
0x0000560a __dtors_start = .
*(.dtors)
0x0000560a __dtors_end = .
SORT(*)(.ctors)
SORT(*)(.dtors)
*(.init0)
.init0 0x0000560a 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
0x0000560a __init
*(.init0)
*(.init1)
.init1 0x0000560a 0x12 main.o
0x0000560a wdt_init
*(.init1)
*(.init2)
.init2 0x0000561c 0xc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
*(.init2)
*(.init3)
*(.init3)
*(.init4)
.init4 0x00005628 0x16 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
0x00005628 __do_copy_data
.init4 0x0000563e 0x10 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
0x0000563e __do_clear_bss
*(.init4)
*(.init5)
*(.init5)
*(.init6)
*(.init6)
*(.init7)
*(.init7)
*(.init8)
*(.init8)
*(.init9)
.init9 0x0000564e 0x8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
*(.init9)
*(.text)
.text 0x00005656 0x4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
0x00005656 __vector_22
0x00005656 __vector_1
0x00005656 __vector_24
0x00005656 __vector_12
0x00005656 __bad_interrupt
0x00005656 __vector_6
0x00005656 __vector_3
0x00005656 __vector_23
0x00005656 __vector_25
0x00005656 __vector_11
0x00005656 __vector_13
0x00005656 __vector_17
0x00005656 __vector_19
0x00005656 __vector_7
0x00005656 __vector_27
0x00005656 __vector_5
0x00005656 __vector_4
0x00005656 __vector_2
0x00005656 __vector_21
0x00005656 __vector_15
0x00005656 __vector_8
0x00005656 __vector_14
0x00005656 __vector_18
.text 0x0000565a 0x688 main.o
0x0000565a main
.text 0x00005ce2 0x7c6 menu.o
0x00005ce2 menu_set_cursor
0x00005e40 menu_choose3
0x00005d96 menu_choose2
0x00005f2a Show_Error_HW
0x00005d0c menu_choose
0x000060c4 main_menu
0x000063ee Update_PKT
0x00005f6a Show_Version
.text 0x000064a8 0x4a2 timer.o
0x000068ea get_key_long
0x000064e2 Timer2_Init
0x00006860 SetDelay
0x0000692c get_key_long_rpt_sp
0x000068d4 get_key_rpt
0x00006872 CheckDelay
0x0000688a Delay_ms
0x00006908 get_key_long_rpt
0x0000650a __vector_9
0x000068ba get_key_short
0x0000655e set_beep
0x000068a4 get_key_press
0x000064a8 Timer1_Init
0x00006524 __vector_10
0x000065be __vector_16
0x0000653e Timer0_Init
.text 0x0000694a 0x260 tools.o
0x0000694a PKT_Tools
0x00006ae0 PC_Fast_Connect
0x00006ba8 Test_HB
.text 0x00006baa 0x7d0 twimaster.o
0x00006c18 I2C_Reset
0x00006bcc I2C_Init
0x00006baa RAM_Checksum
0x00007228 I2C_WriteBLConfig
0x00007374 I2C_ReadBLConfig
0x00006c5c __vector_26
.text 0x0000737a 0x0 uart1.o
.text 0x0000737a 0x920 usart.o
0x0000770e USART_putc
0x000076ee USART_DisableTXD
0x00007b36 SwitchToFC
0x0000771e USART_puts
0x00007686 USART_Init
0x00007b1c SwitchToWi232
0x00007c24 SwitchToGPS
0x00007bae SwitchToMAG
0x00007988 USART_request_mk_data
0x00007a06 Decode64
0x000075ce USART_getc
0x00007628 uart_getc_nb
0x0000773c USART_puts_p
0x000076fe USART_EnableTXD
0x00007762 SendOutData
0x0000737a __vector_20
0x00007ada SwitchToNC
.text 0x00007c9a 0x9c0 motortest.o
0x00007eee motor_test
0x00007c9a SendMotorData
0x00007cf2 Search_BL
0x00007e8c motor
.text 0x0000865a 0xae HAL_HW1_2.o
0x0000865a set_D_LIGHT
0x00008662 InitHWPorts
0x00008700 clr_D_LIGHT
.text 0x00008708 0x0 HAL_HW1_3.o
.text 0x00008708 0x0 HAL_HW3_9.o
.text 0x00008708 0x0 Wi232.o
.text 0x00008708 0x0 bluetooth.o
.text 0x00008708 0x0 connect.o
.text 0x00008708 0x0 debug.o
.text 0x00008708 0x278 display.o
0x00008708 display_data
.text 0x00008980 0xf1a eeprom.o
0x00008a3e ReadLastPosition
0x00008aba WriteParameter
0x000089f4 WriteBTSlaveFlag
0x00008f94 Delete_EEPROM
0x00008a1a WriteBTMasterFlag
0x000089a8 WriteWiInitFlag
0x0000961e EEWayPointList_Clear
0x000089ce WriteBTInitFlag
0x000091fc ReadParameter
0x00008a80 WriteLastPosition
.text 0x0000989a 0x30 error.o
0x000098b6 send_pgm
0x0000989a _send_msg
.text 0x000098ca 0x0 error_driver.o
.text 0x000098ca 0x2ba fifo.o
0x000098de fifo_getcount
0x00009aa2 fifo_search
0x00009b3a fifo_strstr_pgm
0x00009918 fifo_read
0x000098ca fifo_init
0x00009b2e fifo_cmp_pgm
0x000098e6 fifo_is_empty
0x00009970 fifo_write
0x000098fc fifo_is_full
0x000099be fifo_clear
.text 0x00009b84 0x0 font8x6.o
.text 0x00009b84 0x0 gps.o
.text 0x00009b84 0x1dc0 lcd.o
0x00009ba0 lcd_cls
0x0000a6aa lcd_puts_at
0x0000a5b6 lcd_print_at
0x00009c06 wait_1ms
0x00009ef2 lcd_plot
0x00009b84 send_byte
0x0000b180 lcd_print_hex_at
0x0000b668 write_ndigit_number_s_10th
0x0000a698 lcd_printpns_at
0x0000a54c print_display_at
0x0000a7c2 lcd_circle
0x00009f84 lcd_line
0x0000a358 lcd_putc
0x00009ed8 new_line
0x0000a2e6 lcd_printpj
0x00009e66 paste_line
0x0000a18e lcd_putc_jeti
0x0000b49a write_ndigit_number_u_10th
0x0000a346 lcd_printpj_at
0x0000a628 lcd_printp_at
0x00009df4 copy_line
0x0000aa3c lcd_circ_line
0x0000b7c0 write_time
0x0000b170 hdigit
0x0000b244 lcd_write_number_u
0x0000a6e4 lcd_cls_line
0x0000a55c lcd_print
0x0000b2a4 lcd_write_number_u_at
0x0000b1d4 lcd_print_hex
0x00009d8a scroll
0x0000a914 lcd_fcircle
0x0000a50c print_display
0x0000a63a lcd_printpns
0x00009d40 set_adress
0x00009c3a LCD_Init
0x0000b830 write_gps_pos
0x0000a10a lcd_frect
0x00009c10 wait_ms
0x0000b07e lcd_ecirc_line
0x0000accc lcd_ellipse
0x0000b098 lcd_view_font
0x0000b3a8 write_ndigit_number_s
0x0000b06c lcd_ecircle
0x0000b5f2 write_ndigit_number_u_100th
0x0000a72e lcd_rect
0x0000b2b4 write_ndigit_number_u
0x00009b92 lcd_command
0x0000ab86 lcd_ellipse_line
0x0000a5c8 lcd_printp
.text 0x0000b944 0x0 lipo.o
.text 0x0000b944 0x2680 osd.o
0x0000c72e lcd_o_circle
0x0000b9d2 heading_conv
0x0000bcf6 draw_homesymbol
0x0000b944 CheckMKLipo
0x0000bdce draw_targetsymbol
0x0000d4d6 osd
0x0000c09a print_position
0x0000ba46 draw_compass
0x0000c790 lcd_o_circ_line
0x0000c7dc OSD_Screen_Element
0x0000c448 OSD_Timeout
0x0000be66 print_statistics
0x0000ba94 draw_variometer
0x0000c27c Show_LastPosition
.text 0x0000dfc4 0x1a52 parameter.o
0x0000f44a load_setting
0x0000f530 display_settings_menu
0x0000f794 edit_parameter
0x0000f5f2 copy_setting
0x0000dfc4 display_section_menu
0x0000e13e display_param_menu
0x0000f358 write_setting
0x0000e77c edit_param
.text 0x0000fa16 0x2 servo.o
0x0000fa16 servo_test
.text 0x0000fa18 0x1422 setup.o
0x0000fa18 Show_Error_HW12
0x0000fb5e Edit_Int_Value
0x0000ff5c Edit_Baudrate
0x000109c2 Display_Setup
0x0000fe6a Edit_YesNo
0x0001095a Reset_EEprom
0x000103d6 Edit_DisplayMode
0x00010692 Edit_DisplayHelligkeit
0x0000fd78 Edit_OnOff
0x0000fa4c Edit_Int10th_Value
0x00010134 Edit_Language
0x0000fc68 Edit_Int16_Value
0x00010c66 PKT_Setup
0x000104e6 Edit_DisplayKontrast
0x000102be Edit_Orientation
.text 0x00010e3a 0x46a followme.o
0x00010e3a FollowMe
.text 0x000112a4 0x0 tracking.o
.text 0x000112a4 0x0 Font8x8.o
.text 0x000112a4 0x62 messages.o
0x000112a4 strGet
0x000112c8 Test_Language
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.text 0x00011306 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.text 0x00011306 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
0x00011306 strcpy_P
.text 0x00011314 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
0x00011314 memset
.text 0x00011322 0x4a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
0x00011322 __eerd_block
.text 0x0001136c 0x4e C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
0x0001136c __eerd_dword
.text 0x000113ba 0x30 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
0x000113ba __eerd_word
.text 0x000113ea 0x44 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
0x000113ea __eewr_block
.text 0x0001142e 0x4e C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
0x0001142e __eewr_dword
.text 0x0001147c 0x32 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
0x0001147c __eewr_word
.text 0x000114ae 0x42 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
0x000114ae itoa
.text 0x000114f0 0x2c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
0x000114f0 utoa
.text 0x0001151c 0x20 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
0x0001151c strrev
.text 0x0001153c 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
.text 0x0001153c 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
0x0001153c . = ALIGN (0x2)
*(.text.*)
.text.fplib 0x0001153c 0xa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
0x0001153c __subsf3
0x0001153e __addsf3
.text.fplib 0x00011546 0xc0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
0x00011560 __addsf3x
.text.fplib 0x00011606 0x8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
0x00011606 __lesf2
0x00011606 __nesf2
0x00011606 __eqsf2
0x00011606 __cmpsf2
0x00011606 __ltsf2
.text.fplib 0x0001160e 0x6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
0x0001160e cos
.text.fplib 0x00011614 0x4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
0x00011614 __divsf3
.text.fplib 0x00011618 0xcc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
0x0001162e __divsf3x
0x00011632 __divsf3_pse
.text.fplib 0x000116e4 0xa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
0x000116e4 __fixsfsi
.text.fplib 0x000116ee 0x58 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
0x000116ee __fixunssfsi
.text.fplib 0x00011746 0x7a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
0x0001174a __floatsisf
0x00011746 __floatunsisf
.text.fplib 0x000117c0 0x48 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
0x000117c0 __fp_cmp
.text.fplib 0x00011808 0xc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
0x00011808 __fp_inf
.text.fplib 0x00011814 0x6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
0x00011814 __fp_nan
.text.fplib 0x0001181a 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
0x0001181a __fp_pscA
.text.fplib 0x00011828 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
0x00011828 __fp_pscB
.text.fplib 0x00011836 0x50 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
0x00011838 __fp_rempio2
.text.fplib 0x00011886 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
0x00011886 __fp_round
.text.fplib 0x000118a8 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
0x000118a8 __fp_sinus
.text.fplib 0x000118ca 0x44 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
0x000118ca __fp_split3
0x000118da __fp_splitA
.text.fplib 0x0001190e 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
0x0001190e __fp_zero
0x00011910 __fp_szero
.text.fplib 0x0001191c 0x8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
0x0001191c __gtsf2
0x0001191c __gesf2
.text.fplib 0x00011924 0x4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
0x00011924 __mulsf3
.text.fplib 0x00011928 0xc2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
0x00011940 __mulsf3_pse
0x0001193c __mulsf3x
.text.fplib 0x000119ea 0x40 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
0x000119ea round
.text.fplib 0x00011a2a 0xc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
0x00011a2a sin
.text.fplib 0x00011a36 0x36 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
0x00011a36 __fp_mintl
.text.fplib 0x00011a6c 0x1c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
0x00011a70 __fp_mpack_finite
0x00011a6c __fp_mpack
.text.fplib 0x00011a88 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
0x00011a88 __fp_powsodd
.text.fplib 0x00011aaa 0x4a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
0x00011aaa __fp_powser
.text.libgcc 0x00011af4 0x3e C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
0x00011af4 __mulsi3
.text.libgcc 0x00011b32 0x18 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
0x00011b32 __udivmodqi4
.text.libgcc 0x00011b4a 0x28 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
0x00011b4a __udivmodhi4
.text.libgcc 0x00011b72 0x26 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
0x00011b72 __divmodhi4
0x00011b72 _div
.text.libgcc 0x00011b98 0x44 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
0x00011b98 __udivmodsi4
.text.libgcc 0x00011bdc 0x36 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
0x00011bdc __divmodsi4
.text.libgcc 0x00011c12 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.text.libgcc 0x00011c12 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.text.libgcc 0x00011c12 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.text.libgcc 0x00011c12 0x38 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
0x00011c12 __prologue_saves__
.text.libgcc 0x00011c4a 0x36 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
0x00011c4a __epilogue_restores__
0x00011c80 . = ALIGN (0x2)
*(.fini9)
.fini9 0x00011c80 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
0x00011c80 exit
0x00011c80 _exit
*(.fini9)
*(.fini8)
*(.fini8)
*(.fini7)
*(.fini7)
*(.fini6)
*(.fini6)
*(.fini5)
*(.fini5)
*(.fini4)
*(.fini4)
*(.fini3)
*(.fini3)
*(.fini2)
*(.fini2)
*(.fini1)
*(.fini1)
*(.fini0)
.fini0 0x00011c80 0x2 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
*(.fini0)
0x00011c82 _etext = .
 
.data 0x00800100 0x2982 load address 0x00011c82
0x00800100 PROVIDE (__data_start, .)
*(.data)
.data 0x00800100 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
.data 0x00800100 0x0 main.o
.data 0x00800100 0x0 menu.o
.data 0x00800100 0x7 timer.o
0x00800104 WarnTime
0x00800100 BeepMuster
0x00800102 PoffTime
.data 0x00800107 0x0 tools.o
.data 0x00800107 0x3 twimaster.o
0x00800107 RequiredMotors
0x00800108 I2CTimeout
.data 0x0080010a 0x0 uart1.o
.data 0x0080010a 0x1 usart.o
0x0080010a txd_complete
.data 0x0080010b 0x5a motortest.o
.data 0x00800165 0x0 HAL_HW1_2.o
.data 0x00800165 0x0 HAL_HW1_3.o
.data 0x00800165 0x0 HAL_HW3_9.o
.data 0x00800165 0x0 Wi232.o
.data 0x00800165 0x0 bluetooth.o
.data 0x00800165 0x0 connect.o
.data 0x00800165 0x0 debug.o
.data 0x00800165 0x0 display.o
.data 0x00800165 0x0 eeprom.o
.data 0x00800165 0x0 error.o
.data 0x00800165 0x0 error_driver.o
.data 0x00800165 0x0 fifo.o
.data 0x00800165 0x0 font8x6.o
.data 0x00800165 0x0 gps.o
.data 0x00800165 0x0 lcd.o
.data 0x00800165 0x0 lipo.o
.data 0x00800165 0x6 osd.o
0x0080016a min_UBat
0x00800165 Vario_Threshold_Value
0x00800169 last_UBat
0x00800167 Vario_Beep_Up_Interval
0x00800168 last_RC_Quality
0x00800166 Vario_Beep_Down_Interval
.data 0x0080016b 0x2 parameter.o
0x0080016c target_pos
0x0080016b target_pos2
.data 0x0080016d 0x0 servo.o
.data 0x0080016d 0x0 setup.o
.data 0x0080016d 0x0 followme.o
.data 0x0080016d 0x0 tracking.o
.data 0x0080016d 0x0 Font8x8.o
.data 0x0080016d 0x2915 messages.o
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
*(.data*)
*(.rodata)
*(.rodata*)
*(.gnu.linkonce.d*)
0x00802a82 . = ALIGN (0x2)
0x00802a82 _edata = .
0x00802a82 PROVIDE (__data_end, .)
 
.bss 0x00802a82 0x800
0x00802a82 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
.bss 0x00802a82 0x3 main.o
0x00802a84 mode
0x00802a82 current_hardware
0x00802a83 hardware
.bss 0x00802a85 0x0 menu.o
.bss 0x00802a85 0x1e timer.o
0x00802a8d WarnCount
0x00802a8f IdleTimer
0x00802a93 repeat_speed
0x00802a89 BeepTime
0x00802a96 key_rpt
0x00802a85 CountMilliseconds
0x00802a94 key_rpts
0x00802a95 key_lrpt
0x00802a87 BeepPrio
0x00802a98 key_press
0x00802a8b WarnToggle
0x00802a97 key_long
0x00802a91 DisplayTime
0x00802a99 key_state
.bss 0x00802aa3 0x0 tools.o
.bss 0x00802aa3 0x11 twimaster.o
0x00802aac motor_write
0x00802aa7 BLFlags
0x00802aae twi_state
0x00802aa9 MissingMotor
0x00802aa8 MotorenEin
0x00802aab motor_read
0x00802aad dac_channel
0x00802aaa I2C_TransferActive
0x00802aa5 BLConfig_WriteMask
0x00802aa3 BLConfig_ReadMask
.bss 0x00802ab4 0x0 uart1.o
.bss 0x00802ab4 0x51 usart.o
0x00802abc ReceivedBytes
0x00802abd rxd_buffer_locked
0x00802ab7 stat_crc_error
0x00802aba pRxData
0x00802ab9 RxDataLen
0x00802ab5 stat_overflow_error
0x00802ab4 rxFlag
.bss 0x00802b05 0x1 motortest.o
0x00802b05 motor_addr
.bss 0x00802b06 0x0 HAL_HW1_2.o
.bss 0x00802b06 0x0 HAL_HW1_3.o
.bss 0x00802b06 0x0 HAL_HW3_9.o
.bss 0x00802b06 0x0 Wi232.o
.bss 0x00802b06 0x0 bluetooth.o
.bss 0x00802b06 0x0 connect.o
.bss 0x00802b06 0x0 debug.o
.bss 0x00802b06 0x0 display.o
.bss 0x00802b06 0x0 eeprom.o
.bss 0x00802b06 0x0 error.o
.bss 0x00802b06 0x0 error_driver.o
.bss 0x00802b06 0x0 fifo.o
.bss 0x00802b06 0x0 font8x6.o
.bss 0x00802b06 0x0 gps.o
.bss 0x00802b06 0x0 lcd.o
.bss 0x00802b06 0x0 lipo.o
.bss 0x00802b06 0x19 osd.o
0x00802b09 COSD_FLAGS2
0x00802b07 CellIsChecked
0x00802b0a NextWP
0x00802b0b OldWP
0x00802b13 max_Current
0x00802b1d old_hh
0x00802b0e Vario_Beep_Up
0x00802b11 max_Capacity
0x00802b0f ftimer
0x00802b19 max_GroundSpeed
0x00802b06 AkkuWarnThreshold
0x00802b0d Vario_Beep_Down
0x00802b1b max_Altimeter
0x00802b08 error
0x00802b17 max_Distance
0x00802b0c Vario_Threshold
0x00802b15 max_FlyingTime
.bss 0x00802b1f 0x6 parameter.o
0x00802b21 pmode
0x00802b22 offset2
0x00802b1f changes
0x00802b20 setting
0x00802b24 offset
0x00802b23 dmode
.bss 0x00802b25 0x0 servo.o
.bss 0x00802b25 0x3 setup.o
0x00802b25 PKT_Change
0x00802b26 LCD_Change
0x00802b27 edit
.bss 0x00802b28 0x1 followme.o
0x00802b28 FM_error
.bss 0x00802b29 0x0 tracking.o
.bss 0x00802b29 0x0 Font8x8.o
.bss 0x00802b29 0x0 messages.o
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
*(.bss*)
*(COMMON)
COMMON 0x00802b29 0x21 main.o
0x00802b29 version
0x00802b2b accumulator
0x00802b2f mk_param_struct
0x00802b31 MotorTest
0x00802b41 samples
0x00802b43 MK_LowBat
0x00802b44 Vin
0x00802b48 volt_avg
COMMON 0x00802b4a 0xa timer.o
0x00802b4a Display_on
0x00802b4b timer
0x00802b4d abo_timer
0x00802b4f String_Buffer
COMMON 0x00802b54 0x68 twimaster.o
0x00802b54 BLConfig
0x00802b5c Motor
COMMON 0x00802bbc 0x10f usart.o
0x00802bbc rxd_buffer
0x00802c70 buffer
0x00802c8e rx_byte
0x00802c8f txd_buffer
COMMON 0x00802ccb 0x4 motortest.o
0x00802ccb i2c_state
0x00802ccc mmode
0x00802ccd v
0x00802cce m
COMMON 0x00802ccf 0xa8 eeprom.o
0x00802ccf OSD_ScreenMode
0x00802cd0 OSD_mAh_Warning
0x00802cd2 LastLongitude
0x00802cd6 LCD_ORIENTATION
0x00802cd7 PKT_Accutyp
0x00802cd8 U02SV2
0x00802cd9 Lipo_UOffset
0x00802cdb FM_Speed
0x00802cdd LCD_DisplayMode
0x00802cde OSD_VarioBeep
0x00802cdf bt_name
0x00802cea LCD_Helligkeit
0x00802ceb PKT_StartInfo
0x00802cec PKTWayPointDirectory
0x00802d0f WiTXTO
0x00802d10 OSD_InvertOut
0x00802d11 OSD_LEDform
0x00802d12 OSD_RCErrorbeep
0x00802d13 UseBT
0x00802d14 WiNetworkGroup
0x00802d15 USBBT
0x00802d16 WiUartMTU
0x00802d17 BTIsSlave
0x00802d18 UseWi
0x00802d19 gps_UsedDevName
0x00802d2d gps_UsedGPSMouse
0x00802d2e OSD_HomeMKView
0x00802d2f OSD_LipoBar
0x00802d30 FM_Radius
0x00802d32 PKT_IdleBeep
0x00802d33 BTIsSet
0x00802d34 WiIsSet
0x00802d35 DisplayLanguage
0x00802d36 gps_UseGPS
0x00802d37 OSD_Fallspeed
0x00802d38 LastLatitude
0x00802d3c WiNetworkMode
0x00802d3d PKT_Baudrate
0x00802d3e Debug
0x00802d3f bt_pin
0x00802d44 WiTXRXChannel
0x00802d45 gps_UsedMac
0x00802d53 PKTWayPoint
0x00802d72 LCD_Kontrast
0x00802d73 OSD_SendOSD
0x00802d74 DisplayTimeout
0x00802d75 FM_Refresh
COMMON 0x00802d77 0x487 lcd.o
0x00802d77 display_page_counter
0x00802d78 display_buffer
0x00803178 display_buffer_counter
0x00803179 display_mode
0x0080317a line_buffer
0x008031fa display_buffer_pointer
0x008031fc lcd_xpos
0x008031fd lcd_ypos
COMMON 0x008031fe 0x66 osd.o
0x008031fe Element
0x008031ff BattLowVoltageWarning
0x00803200 last5pos
0x0080325b OSD_active
0x0080325c Flags_GlobalConfig
0x0080325d Flags_GlobalConfig3
0x0080325e Flags_ExtraConfig
0x0080325f naviData
0x00803261 cells
0x00803262 heading_home
COMMON 0x00803264 0x1 parameter.o
0x00803264 ii
COMMON 0x00803265 0x1d setup.o
0x00803265 Pre16
0x00803267 EditString
0x0080327c LCD_Orientation
0x0080327d bt_name_len
0x0080327e Pre
0x00803280 length_tmp
0x00803281 spalte
0x00803282 PROVIDE (__bss_end, .)
0x00011c82 __data_load_start = LOADADDR (.data)
0x00014604 __data_load_end = (__data_load_start + SIZEOF (.data))
 
.noinit 0x00803282 0x0
0x00803282 PROVIDE (__noinit_start, .)
*(.noinit*)
0x00803282 PROVIDE (__noinit_end, .)
0x00803282 _end = .
0x00803282 PROVIDE (__heap_start, .)
 
.eeprom 0x00810000 0x7c0
*(.eeprom*)
.eeprom 0x00810000 0x7c0 eeprom.o
0x00810028 EE_LCD_Helligkeit
0x00810015 EE_OSD_VarioBeep
0x00810005 EE_LastLongitude
0x00810021 EE_WiIsSet
0x00810034 EE_BTPin
0x00810022 EE_BTIsSlave
0x00810014 EE_OSD_HomeMKView
0x00810025 EE_Debug
0x00810044 EE_gps_UsedDevName
0x00810011 EE_OSD_ScreenMode
0x00810023 EE_UseBT
0x00810024 EE_UseWi
0x00810031 EE_DisplayLanguage
0x0081000f EE_PKT_Baudrate
0x00810030 EE_WiTXRXChannel
0x00810017 EE_OSD_SendOSD
0x0081001e EE_PKT_StartInfo
0x0081002e EE_WiNetworkMode
0x00810067 EE_gps_UsedGPSMouse
0x00810066 EE_gps_UseGPS
0x0081000d EE_FM_Refresh
0x00810032 EE_DisplayTimeout
0x0081001c EE_Lipo_UOffset
0x00810019 EE_OSD_InvertOut
0x00810058 EE_gps_UsedMac
0x00810020 EE_BTIsSet
0x0081002b EE_LCD_Orientation
0x00810018 EE_OSD_LEDform
0x00810009 EE_FM_Radius
0x00810117 EEWayPointList
0x0081002f EE_WiNetworkGroup
0x0081002d EE_WiTXTO
0x00810001 EE_LastLatitude
0x00810039 EE_BTName
0x0081001b EE_PKT_Accutyp
0x00810027 EE_USBBT
0x0081002c EE_WiUartMTU
0x00810016 EE_OSD_Fallspeed
0x00810033 EE_LowBat
0x0081001a EE_OSD_RCErrorbeep
0x00810026 EE_U02SV2
0x0081001f EE_PKT_IdleBeep
0x00810012 EE_OSD_mAh_Warning
0x00810000 EE_PKTVersion
0x00810068 EEWPDirectory
0x00810010 EE_OSD_LipoBar
0x0081000b EE_FM_Speed
0x0081002a EE_LCD_DisplayMode
0x00810029 EE_LCD_Kontrast
0x008107c0 __eeprom_end = .
 
.fuse
*(.fuse)
*(.lfuse)
*(.hfuse)
*(.efuse)
 
.lock
*(.lock*)
 
.signature
*(.signature*)
 
.stab 0x00000000 0x3390
*(.stab)
.stab 0x00000000 0x6b4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
.stab 0x000006b4 0x78 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
0x84 (size before relaxing)
.stab 0x0000072c 0x4bc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
0x4c8 (size before relaxing)
.stab 0x00000be8 0x90 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
0x9c (size before relaxing)
.stab 0x00000c78 0x54 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
0x60 (size before relaxing)
.stab 0x00000ccc 0x48 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
0x54 (size before relaxing)
.stab 0x00000d14 0x510 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
0x51c (size before relaxing)
.stab 0x00001224 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
0x78 (size before relaxing)
.stab 0x00001290 0x240 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
0x24c (size before relaxing)
.stab 0x000014d0 0x318 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
0x324 (size before relaxing)
.stab 0x000017e8 0x1e0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
0x1ec (size before relaxing)
.stab 0x000019c8 0x78 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
0x84 (size before relaxing)
.stab 0x00001a40 0x54 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
0x60 (size before relaxing)
.stab 0x00001a94 0x84 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
0x90 (size before relaxing)
.stab 0x00001b18 0x84 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
0x90 (size before relaxing)
.stab 0x00001b9c 0x21c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
0x228 (size before relaxing)
.stab 0x00001db8 0xfc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
0x108 (size before relaxing)
.stab 0x00001eb4 0xfc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
0x108 (size before relaxing)
.stab 0x00001fb0 0x1d4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
0x1e0 (size before relaxing)
.stab 0x00002184 0x90 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
0x9c (size before relaxing)
.stab 0x00002214 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
0x78 (size before relaxing)
.stab 0x00002280 0x48 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
0x54 (size before relaxing)
.stab 0x000022c8 0x4d4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
0x4e0 (size before relaxing)
.stab 0x0000279c 0x1b0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
0x1bc (size before relaxing)
.stab 0x0000294c 0x78 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
0x84 (size before relaxing)
.stab 0x000029c4 0x174 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
0x180 (size before relaxing)
.stab 0x00002b38 0xe4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
0xf0 (size before relaxing)
.stab 0x00002c1c 0xfc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
0x108 (size before relaxing)
.stab 0x00002d18 0x1ec C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
0x1f8 (size before relaxing)
.stab 0x00002f04 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
0x78 (size before relaxing)
.stab 0x00002f70 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
0x78 (size before relaxing)
.stab 0x00002fdc 0x1b0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
0x1bc (size before relaxing)
.stab 0x0000318c 0x12c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
0x138 (size before relaxing)
.stab 0x000032b8 0xd8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
0xe4 (size before relaxing)
 
.stabstr 0x00000000 0xa06
*(.stabstr)
.stabstr 0x00000000 0xa06 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
 
.stab.excl
*(.stab.excl)
 
.stab.exclstr
*(.stab.exclstr)
 
.stab.index
*(.stab.index)
 
.stab.indexstr
*(.stab.indexstr)
 
.comment
*(.comment)
 
.debug
*(.debug)
 
.line
*(.line)
 
.debug_srcinfo
*(.debug_srcinfo)
 
.debug_sfnames
*(.debug_sfnames)
 
.debug_aranges 0x00000000 0x78
*(.debug_aranges)
.debug_aranges
0x00000000 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_aranges
0x00000014 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_aranges
0x00000028 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_aranges
0x0000003c 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_aranges
0x00000050 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_aranges
0x00000064 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_pubnames
0x00000000 0xd0
*(.debug_pubnames)
.debug_pubnames
0x00000000 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_pubnames
0x00000023 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_pubnames
0x00000046 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_pubnames
0x00000068 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_pubnames
0x0000008b 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_pubnames
0x000000ae 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_info 0x00000000 0x6af
*(.debug_info)
.debug_info 0x00000000 0xfd C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_info 0x000000fd 0x153 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_info 0x00000250 0x131 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_info 0x00000381 0xf9 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_info 0x0000047a 0x151 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_info 0x000005cb 0xe4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
*(.gnu.linkonce.wi.*)
 
.debug_abbrev 0x00000000 0x404
*(.debug_abbrev)
.debug_abbrev 0x00000000 0x9a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_abbrev 0x0000009a 0xc6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_abbrev 0x00000160 0xc6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_abbrev 0x00000226 0x91 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_abbrev 0x000002b7 0xc8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_abbrev 0x0000037f 0x85 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_line 0x00000000 0x520
*(.debug_line)
.debug_line 0x00000000 0xd5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_line 0x000000d5 0xe7 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_line 0x000001bc 0xda C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_line 0x00000296 0xd5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_line 0x0000036b 0xe1 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_line 0x0000044c 0xd4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_frame
*(.debug_frame)
 
.debug_str 0x00000000 0x1b9
*(.debug_str)
.debug_str 0x00000000 0xb5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
0xe9 (size before relaxing)
.debug_str 0x000000b5 0x40 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
0xf6 (size before relaxing)
.debug_str 0x000000f5 0x34 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
0xf3 (size before relaxing)
.debug_str 0x00000129 0x32 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
0xe9 (size before relaxing)
.debug_str 0x0000015b 0x33 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
0xf7 (size before relaxing)
.debug_str 0x0000018e 0x2b C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
0xea (size before relaxing)
 
.debug_loc
*(.debug_loc)
 
.debug_macinfo
*(.debug_macinfo)
OUTPUT(PKT_3_63a_MartinR_HW_1_2_de.elf elf32-avr)
LOAD linker stubs
 
Cross Reference Table
 
Symbol File
AkkuWarnThreshold osd.o
BLConfig twimaster.o
BLConfig_ReadMask twimaster.o
BLConfig_WriteMask twimaster.o
BLFlags twimaster.o
motortest.o
BTIsSet eeprom.o
BTIsSlave eeprom.o
BattLowVoltageWarning osd.o
BeepMuster timer.o
HAL_HW1_2.o
BeepPrio timer.o
BeepTime timer.o
HAL_HW1_2.o
COSD_FLAGS2 osd.o
CellIsChecked osd.o
CheckDelay timer.o
motortest.o
twimaster.o
CheckMKLipo osd.o
CountMilliseconds timer.o
Debug setup.o
eeprom.o
menu.o
main.o
Decode64 usart.o
followme.o
parameter.o
osd.o
display.o
main.o
Delay_ms timer.o
Delete_EEPROM eeprom.o
setup.o
DisplayLanguage messages.o
setup.o
parameter.o
eeprom.o
tools.o
menu.o
DisplayTime timer.o
DisplayTimeout setup.o
eeprom.o
timer.o
Display_Setup setup.o
Display_on HAL_HW1_2.o
timer.o
EEWPDirectory eeprom.o
EEWayPointList eeprom.o
EEWayPointList_Clear eeprom.o
EE_BTIsSet eeprom.o
EE_BTIsSlave eeprom.o
EE_BTName eeprom.o
EE_BTPin eeprom.o
EE_Debug eeprom.o
EE_DisplayLanguage eeprom.o
EE_DisplayTimeout eeprom.o
EE_FM_Radius eeprom.o
EE_FM_Refresh eeprom.o
EE_FM_Speed eeprom.o
EE_LCD_DisplayMode eeprom.o
EE_LCD_Helligkeit eeprom.o
EE_LCD_Kontrast eeprom.o
EE_LCD_Orientation eeprom.o
EE_LastLatitude eeprom.o
EE_LastLongitude eeprom.o
EE_Lipo_UOffset eeprom.o
EE_LowBat eeprom.o
EE_OSD_Fallspeed eeprom.o
EE_OSD_HomeMKView eeprom.o
EE_OSD_InvertOut eeprom.o
EE_OSD_LEDform eeprom.o
EE_OSD_LipoBar eeprom.o
EE_OSD_RCErrorbeep eeprom.o
EE_OSD_ScreenMode eeprom.o
EE_OSD_SendOSD eeprom.o
EE_OSD_VarioBeep eeprom.o
EE_OSD_mAh_Warning eeprom.o
EE_PKTVersion eeprom.o
EE_PKT_Accutyp eeprom.o
EE_PKT_Baudrate eeprom.o
EE_PKT_IdleBeep eeprom.o
EE_PKT_StartInfo eeprom.o
EE_U02SV2 eeprom.o
EE_USBBT eeprom.o
EE_UseBT eeprom.o
EE_UseWi eeprom.o
EE_WiIsSet eeprom.o
EE_WiNetworkGroup eeprom.o
EE_WiNetworkMode eeprom.o
EE_WiTXRXChannel eeprom.o
EE_WiTXTO eeprom.o
EE_WiUartMTU eeprom.o
EE_gps_UseGPS eeprom.o
EE_gps_UsedDevName eeprom.o
EE_gps_UsedGPSMouse eeprom.o
EE_gps_UsedMac eeprom.o
EditString setup.o
Edit_Baudrate setup.o
Edit_DisplayHelligkeit setup.o
Edit_DisplayKontrast setup.o
Edit_DisplayMode setup.o
Edit_Int10th_Value setup.o
Edit_Int16_Value setup.o
Edit_Int_Value setup.o
Edit_Language setup.o
Edit_OnOff setup.o
Edit_Orientation setup.o
Edit_YesNo setup.o
Element followme.o
osd.o
FM_Radius eeprom.o
FM_Refresh eeprom.o
FM_Speed eeprom.o
FM_error followme.o
Flags_ExtraConfig followme.o
osd.o
Flags_GlobalConfig followme.o
osd.o
Flags_GlobalConfig3 followme.o
osd.o
FollowMe followme.o
menu.o
Font8x8 Font8x8.o
lcd.o
I2CTimeout twimaster.o
I2C_Init twimaster.o
I2C_ReadBLConfig twimaster.o
I2C_Reset twimaster.o
I2C_TransferActive twimaster.o
motortest.o
I2C_WriteBLConfig twimaster.o
IdleTimer timer.o
InitHWPorts HAL_HW1_2.o
main.o
LCD_Change setup.o
LCD_DisplayMode setup.o
lcd.o
eeprom.o
LCD_Helligkeit setup.o
lcd.o
eeprom.o
HAL_HW1_2.o
LCD_Init lcd.o
HAL_HW1_2.o
LCD_Kontrast setup.o
lcd.o
eeprom.o
LCD_ORIENTATION lcd.o
eeprom.o
LCD_Orientation setup.o
LastLatitude eeprom.o
main.o
LastLongitude eeprom.o
main.o
Lipo_UOffset eeprom.o
MK_LowBat messages.o
followme.o
setup.o
parameter.o
osd.o
lipo.o
lcd.o
eeprom.o
connect.o
Wi232.o
HAL_HW1_2.o
usart.o
twimaster.o
tools.o
timer.o
menu.o
main.o
MissingMotor twimaster.o
Motor motortest.o
twimaster.o
MotorTest HAL_HW1_2.o
motortest.o
twimaster.o
main.o
MotorenEin twimaster.o
motortest.o
New_Baudrate eeprom.o
NextWP osd.o
OSD_Fallspeed osd.o
eeprom.o
OSD_HomeMKView osd.o
eeprom.o
OSD_InvertOut osd.o
eeprom.o
OSD_LEDform osd.o
eeprom.o
OSD_LipoBar osd.o
eeprom.o
OSD_RCErrorbeep setup.o
osd.o
eeprom.o
OSD_ScreenMode osd.o
eeprom.o
OSD_Screen_Element osd.o
followme.o
OSD_SendOSD eeprom.o
usart.o
OSD_Setup setup.o
OSD_Timeout osd.o
followme.o
OSD_VarioBeep osd.o
eeprom.o
OSD_active followme.o
osd.o
usart.o
OSD_mAh_Warning osd.o
eeprom.o
OldWP osd.o
Old_Baudrate eeprom.o
PC_Fast_Connect tools.o
PKTWayPoint eeprom.o
PKTWayPointDirectory eeprom.o
PKT_Accutyp eeprom.o
PKT_Baudrate eeprom.o
PKT_Change setup.o
PKT_IdleBeep eeprom.o
timer.o
PKT_Setup setup.o
tools.o
menu.o
PKT_StartInfo setup.o
eeprom.o
main.o
PKT_Tools tools.o
menu.o
PoffTime timer.o
Pre setup.o
Pre16 setup.o
RAM_Checksum twimaster.o
ReadLastPosition eeprom.o
main.o
ReadParameter eeprom.o
HAL_HW1_2.o
ReceivedBytes usart.o
RequiredMotors twimaster.o
Reset_EEprom setup.o
RxDataLen usart.o
Search_BL motortest.o
SendMotorData motortest.o
SendOutData usart.o
followme.o
parameter.o
osd.o
display.o
motortest.o
main.o
SetDelay timer.o
motortest.o
twimaster.o
Show_Error_HW menu.o
tools.o
Show_Error_HW12 setup.o
Show_LastPosition osd.o
Show_Version menu.o
tools.o
String_Buffer timer.o
SwitchToFC usart.o
followme.o
parameter.o
osd.o
display.o
motortest.o
main.o
SwitchToGPS usart.o
SwitchToMAG usart.o
SwitchToNC usart.o
followme.o
osd.o
display.o
SwitchToWi232 usart.o
Test_HB tools.o
Test_Language messages.o
menu.o
Timer0_Init timer.o
HAL_HW1_2.o
Timer1_Init timer.o
HAL_HW1_2.o
Timer2_Init timer.o
HAL_HW1_2.o
U02SV2 eeprom.o
USART_DisableTXD usart.o
USART_EnableTXD usart.o
USART_Init usart.o
HAL_HW1_2.o
USART_getc usart.o
USART_putc usart.o
main.o
USART_puts usart.o
motortest.o
USART_puts_p usart.o
USART_request_mk_data usart.o
USBBT eeprom.o
Update_PKT menu.o
setup.o
UseBT eeprom.o
UseWi eeprom.o
Vario_Beep_Down osd.o
Vario_Beep_Down_Interval osd.o
Vario_Beep_Up osd.o
Vario_Beep_Up_Interval osd.o
Vario_Threshold osd.o
Vario_Threshold_Value osd.o
Vin setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
WarnCount timer.o
WarnTime timer.o
WarnToggle timer.o
WiIsSet eeprom.o
WiNetworkGroup eeprom.o
WiNetworkMode eeprom.o
WiTXRXChannel eeprom.o
WiTXTO eeprom.o
WiUartMTU eeprom.o
WriteBTInitFlag eeprom.o
WriteBTMasterFlag eeprom.o
WriteBTSlaveFlag eeprom.o
WriteLastPosition eeprom.o
osd.o
main.o
WriteParameter eeprom.o
setup.o
WriteWiInitFlag eeprom.o
__addsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
setup.o
lcd.o
__addsf3x C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
__bad_interrupt C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__bss_end C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
__bss_start C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
__cmpsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__data_end C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
__data_load_start C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
__data_start C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
__divmodhi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
setup.o
parameter.o
osd.o
motortest.o
__divmodsi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
followme.o
lcd.o
__divsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
osd.o
lcd.o
__divsf3_pse C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
__divsf3x C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
__do_clear_bss C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
messages.o
Font8x8.o
tracking.o
followme.o
setup.o
servo.o
parameter.o
osd.o
lipo.o
lcd.o
gps.o
font8x6.o
fifo.o
error_driver.o
error.o
eeprom.o
display.o
debug.o
connect.o
bluetooth.o
Wi232.o
HAL_HW3_9.o
HAL_HW1_3.o
HAL_HW1_2.o
motortest.o
usart.o
uart1.o
twimaster.o
tools.o
timer.o
menu.o
main.o
__do_copy_data C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
messages.o
Font8x8.o
tracking.o
followme.o
setup.o
servo.o
parameter.o
osd.o
lipo.o
lcd.o
gps.o
font8x6.o
fifo.o
error_driver.o
error.o
eeprom.o
display.o
debug.o
connect.o
bluetooth.o
Wi232.o
HAL_HW3_9.o
HAL_HW1_3.o
HAL_HW1_2.o
motortest.o
usart.o
uart1.o
twimaster.o
tools.o
timer.o
menu.o
main.o
__eerd_block C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
eeprom.o
__eerd_dword C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
eeprom.o
__eerd_word C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
eeprom.o
__eewr_block C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
eeprom.o
__eewr_dword C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
eeprom.o
__eewr_word C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
eeprom.o
__epilogue_restores__ C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
__eqsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__fixsfsi C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
osd.o
lcd.o
__fixunssfsi C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
setup.o
lcd.o
HAL_HW1_2.o
__floatsisf C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
setup.o
osd.o
lcd.o
HAL_HW1_2.o
__floatunsisf C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
__fp_cmp C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__fp_inf C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_mintl C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
__fp_mpack C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
__fp_mpack_finite C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
__fp_nan C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_powser C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
__fp_powsodd C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
__fp_pscA C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_pscB C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_rempio2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
__fp_round C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
__fp_sinus C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
__fp_split3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_splitA C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
__fp_szero C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
__fp_zero C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__gesf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
__gtsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
osd.o
__heap_end C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__init C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__lesf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__ltsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
osd.o
__mulsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
setup.o
osd.o
lcd.o
HAL_HW1_2.o
__mulsf3_pse C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
__mulsf3x C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
__mulsi3 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
lcd.o
__nesf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__prologue_saves__ C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
__stack C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
main.o
__subsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
lcd.o
__udivmodhi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
osd.o
lcd.o
fifo.o
timer.o
__udivmodqi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
osd.o
lcd.o
usart.o
__udivmodsi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
osd.o
main.o
__vector_1 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_10 timer.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_11 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_12 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_13 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_15 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_16 timer.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_17 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_18 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_19 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_20 usart.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_21 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_24 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_25 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_26 twimaster.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_27 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_7 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_9 timer.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vector_default C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
__vectors C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
_div C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
_exit C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
_send_msg error.o
abo_timer followme.o
osd.o
timer.o
accumulator setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
bt_name eeprom.o
bt_name_len setup.o
bt_pin eeprom.o
buffer motortest.o
usart.o
cells osd.o
changes parameter.o
clr_D_LIGHT HAL_HW1_2.o
timer.o
copy_line lcd.o
copy_setting parameter.o
cos C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
lcd.o
current_hardware main.o
display.o
motortest.o
usart.o
dac_channel twimaster.o
directions_p osd.o
display_buffer lcd.o
display_buffer_counter lcd.o
display_buffer_pointer lcd.o
display_data display.o
menu.o
display_debug menu.o
display_mode lcd.o
display_page_counter lcd.o
display_param_menu parameter.o
display_section_menu parameter.o
display_settings_menu parameter.o
dmode parameter.o
draw_compass osd.o
draw_homesymbol osd.o
draw_targetsymbol osd.o
draw_variometer osd.o
edit setup.o
edit_param parameter.o
edit_parameter parameter.o
menu.o
error osd.o
exit C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
fifo_clear fifo.o
fifo_cmp_pgm fifo.o
fifo_getcount fifo.o
fifo_init fifo.o
fifo_is_empty fifo.o
fifo_is_full fifo.o
fifo_read fifo.o
fifo_search fifo.o
fifo_strstr_pgm fifo.o
fifo_write fifo.o
font8x6 font8x6.o
lcd.o
ftimer osd.o
get_key_long timer.o
parameter.o
menu.o
get_key_long_rpt timer.o
get_key_long_rpt_sp timer.o
setup.o
parameter.o
display.o
motortest.o
menu.o
get_key_press timer.o
messages.o
followme.o
setup.o
parameter.o
osd.o
display.o
motortest.o
tools.o
menu.o
main.o
get_key_rpt timer.o
get_key_short timer.o
parameter.o
eeprom.o
tools.o
menu.o
gps_UseGPS eeprom.o
gps_UsedDevName eeprom.o
gps_UsedGPSMouse eeprom.o
gps_UsedMac eeprom.o
hardware main.o
followme.o
osd.o
display.o
motortest.o
usart.o
menu.o
hdigit lcd.o
heading_conv osd.o
heading_home followme.o
osd.o
i2c_state motortest.o
ii parameter.o
itoa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
lcd.o
motortest.o
key_long timer.o
key_lrpt timer.o
key_press timer.o
key_rpt timer.o
key_rpts timer.o
key_state timer.o
last5pos osd.o
last_RC_Quality osd.o
last_UBat osd.o
lcd_circ_line lcd.o
lcd_circle lcd.o
osd.o
lcd_cls lcd.o
messages.o
followme.o
setup.o
parameter.o
osd.o
eeprom.o
display.o
motortest.o
tools.o
menu.o
main.o
lcd_cls_line lcd.o
parameter.o
motortest.o
main.o
lcd_command lcd.o
lcd_ecirc_line lcd.o
parameter.o
lcd_ecircle lcd.o
parameter.o
lcd_ellipse lcd.o
osd.o
lcd_ellipse_line lcd.o
osd.o
lcd_fcircle lcd.o
osd.o
lcd_frect lcd.o
setup.o
parameter.o
osd.o
motortest.o
main.o
lcd_line lcd.o
osd.o
lcd_o_circ_line osd.o
lcd_o_circle osd.o
lcd_plot lcd.o
osd.o
lcd_print lcd.o
lcd_print_at lcd.o
parameter.o
lcd_print_hex lcd.o
lcd_print_hex_at lcd.o
motortest.o
lcd_printp lcd.o
eeprom.o
motortest.o
lcd_printp_at lcd.o
followme.o
setup.o
parameter.o
osd.o
eeprom.o
display.o
motortest.o
tools.o
menu.o
main.o
lcd_printpj lcd.o
lcd_printpj_at lcd.o
lcd_printpns lcd.o
lcd_printpns_at lcd.o
osd.o
lcd_putc lcd.o
parameter.o
osd.o
lcd_putc_jeti lcd.o
osd.o
lcd_puts_at lcd.o
messages.o
followme.o
setup.o
parameter.o
osd.o
display.o
motortest.o
tools.o
menu.o
main.o
lcd_rect lcd.o
osd.o
lcd_view_font lcd.o
lcd_write_number_u lcd.o
main.o
lcd_write_number_u_at lcd.o
main.o
lcd_xpos lcd.o
lcd_ypos lcd.o
length_tmp setup.o
line_buffer lcd.o
load_setting parameter.o
followme.o
osd.o
main.o
m motortest.o
main main.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644.o
main_menu menu.o
main.o
max_Altimeter osd.o
max_Capacity osd.o
max_Current osd.o
max_Distance osd.o
max_FlyingTime osd.o
max_GroundSpeed osd.o
memset C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
motortest.o
menu_choose menu.o
parameter.o
menu_choose2 menu.o
setup.o
parameter.o
tools.o
menu_choose3 menu.o
parameter.o
menu_set_cursor menu.o
min_UBat osd.o
mk_param_struct followme.o
parameter.o
osd.o
main.o
mmode setup.o
motortest.o
mode main.o
followme.o
parameter.o
osd.o
display.o
usart.o
motor motortest.o
motor_addr motortest.o
motor_read twimaster.o
motortest.o
motor_test motortest.o
tools.o
menu.o
motor_write twimaster.o
motortest.o
naviData followme.o
osd.o
new_line lcd.o
offset parameter.o
offset2 parameter.o
old_hh osd.o
osd osd.o
menu.o
pRxData usart.o
followme.o
parameter.o
osd.o
main.o
param_config parameter.o
param_copyright menu.o
param_items_rx parameter.o
param_menuitems_Accu setup.o
param_menuitems_FOLLOWME setup.o
param_menuitems_GPS setup.o
param_menuitems_OSD setup.o
param_menuitems_bt setup.o
param_menuitems_fc menu.o
param_menuitems_lcd setup.o
param_menuitems_nc menu.o
param_menuitems_no menu.o
param_menuitems_pkt setup.o
param_menuitems_wi setup.o
param_names parameter.o
param_pages parameter.o
paste_line lcd.o
pmode parameter.o
print_display lcd.o
print_display_at lcd.o
display.o
print_position osd.o
print_statistics osd.o
repeat_speed timer.o
rose osd.o
round C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
lcd.o
rxFlag usart.o
rx_byte usart.o
rxd_buffer display.o
usart.o
main.o
rxd_buffer_locked usart.o
followme.o
parameter.o
osd.o
display.o
main.o
samples setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
scroll lcd.o
send_byte lcd.o
setup.o
send_pgm error.o
servo_test servo.o
tools.o
menu.o
set_D_LIGHT HAL_HW1_2.o
timer.o
set_adress lcd.o
set_beep timer.o
followme.o
setup.o
osd.o
eeprom.o
main.o
setting parameter.o
sin C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
lcd.o
spalte setup.o
stat_crc_error usart.o
stat_overflow_error usart.o
strGet messages.o
followme.o
setup.o
parameter.o
osd.o
display.o
motortest.o
tools.o
menu.o
main.o
str_E osd.o
str_N osd.o
str_NE osd.o
str_NW osd.o
str_S osd.o
str_SE osd.o
str_SW osd.o
str_W osd.o
strcpy_P C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
eeprom.o
strrev C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
target_pos parameter.o
target_pos2 parameter.o
timer followme.o
parameter.o
osd.o
display.o
motortest.o
timer.o
main.o
tools_menuitems_pkt tools.o
twi_state twimaster.o
motortest.o
txd_buffer usart.o
txd_complete usart.o
uart1_putc usart.o
uart_getc_nb usart.o
utoa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
lcd.o
v motortest.o
version main.o
volt_avg setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
wait_1ms lcd.o
wait_ms lcd.o
wdt_init main.o
write_gps_pos lcd.o
write_ndigit_number_s lcd.o
osd.o
write_ndigit_number_s_10th lcd.o
osd.o
write_ndigit_number_u lcd.o
followme.o
setup.o
parameter.o
osd.o
motortest.o
main.o
write_ndigit_number_u_100th lcd.o
write_ndigit_number_u_10th lcd.o
setup.o
osd.o
write_setting parameter.o
write_time lcd.o
osd.o
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/PKT_3_63a_MartinR_HW_1_3_de.map
0,0 → 1,2513
Archive member included because of file (symbol)
 
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
lcd.o (__subsf3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o) (__addsf3x)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
osd.o (__ltsf2)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
lcd.o (cos)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
lcd.o (__divsf3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o) (__divsf3x)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
lcd.o (__fixsfsi)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
HAL_HW1_3.o (__fixunssfsi)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
HAL_HW1_3.o (__floatsisf)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o) (__fp_cmp)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_inf)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_nan)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_pscA)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_pscB)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o) (__fp_rempio2)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o) (__fp_round)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o) (__fp_sinus)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_split3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o) (__fp_zero)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
osd.o (__gtsf2)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
HAL_HW1_3.o (__mulsf3)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o) (__mulsf3x)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
lcd.o (round)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
lcd.o (sin)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o) (__fp_mintl)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o) (__fp_mpack)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o) (__fp_powsodd)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o) (__fp_powser)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
lcd.o (__mulsi3)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
usart.o (__udivmodqi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
timer.o (__udivmodhi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
motortest.o (__divmodhi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
main.o (__udivmodsi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
lcd.o (__divmodsi4)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o (exit)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
main.o (__do_copy_data)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
main.o (__do_clear_bss)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
eeprom.o (strcpy_P)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
motortest.o (memset)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
eeprom.o (__eerd_block)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
eeprom.o (__eerd_dword)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
eeprom.o (__eerd_word)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
eeprom.o (__eewr_block)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
eeprom.o (__eewr_dword)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
eeprom.o (__eewr_word)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
motortest.o (itoa)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
lcd.o (utoa)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o) (strrev)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o) (__prologue_saves__)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o) (__epilogue_restores__)
 
Allocating common symbols
Common symbol size file
 
OSD_ScreenMode 0x1 eeprom.o
Display_on 0x1 timer.o
OSD_mAh_Warning 0x2 eeprom.o
display_page_counter
0x1 lcd.o
LastLongitude 0x4 eeprom.o
rxd_buffer 0xb4 usart.o
LCD_ORIENTATION 0x1 eeprom.o
Element 0x1 osd.o
PKT_Accutyp 0x1 eeprom.o
U02SV2 0x1 eeprom.o
timer 0x2 timer.o
abo_timer 0x2 timer.o
Lipo_UOffset 0x2 eeprom.o
BattLowVoltageWarning
0x1 osd.o
version 0x2 main.o
FM_Speed 0x2 eeprom.o
display_buffer 0x400 lcd.o
display_buffer_counter
0x1 lcd.o
LCD_DisplayMode 0x1 eeprom.o
OSD_VarioBeep 0x1 eeprom.o
i2c_state 0x1 motortest.o
mmode 0x1 motortest.o
Pre16 0x2 setup.o
accumulator 0x4 main.o
mk_param_struct 0x2 main.o
bt_name 0xb eeprom.o
LCD_Helligkeit 0x1 eeprom.o
PKT_StartInfo 0x1 eeprom.o
PKTWayPointDirectory
0x23 eeprom.o
last5pos 0x5b osd.o
WiTXTO 0x1 eeprom.o
OSD_active 0x1 osd.o
EditString 0x15 setup.o
OSD_InvertOut 0x1 eeprom.o
MotorTest 0x10 main.o
OSD_LEDform 0x1 eeprom.o
OSD_RCErrorbeep 0x1 eeprom.o
UseBT 0x1 eeprom.o
WiNetworkGroup 0x1 eeprom.o
display_mode 0x1 lcd.o
USBBT 0x1 eeprom.o
WiUartMTU 0x1 eeprom.o
BTIsSlave 0x1 eeprom.o
UseWi 0x1 eeprom.o
LCD_Orientation 0x1 setup.o
gps_UsedDevName 0x14 eeprom.o
buffer 0x1e usart.o
gps_UsedGPSMouse 0x1 eeprom.o
v 0x1 motortest.o
OSD_HomeMKView 0x1 eeprom.o
rx_byte 0x1 usart.o
OSD_LipoBar 0x1 eeprom.o
FM_Radius 0x2 eeprom.o
PKT_IdleBeep 0x1 eeprom.o
Flags_GlobalConfig 0x1 osd.o
ii 0x1 parameter.o
BTIsSet 0x1 eeprom.o
line_buffer 0x80 lcd.o
WiIsSet 0x1 eeprom.o
Flags_GlobalConfig3
0x1 osd.o
DisplayLanguage 0x1 eeprom.o
gps_UseGPS 0x1 eeprom.o
display_buffer_pointer
0x2 lcd.o
OSD_Fallspeed 0x1 eeprom.o
String_Buffer 0x5 timer.o
Flags_ExtraConfig 0x1 osd.o
bt_name_len 0x1 setup.o
lcd_xpos 0x1 lcd.o
samples 0x2 main.o
MK_LowBat 0x1 main.o
LastLatitude 0x4 eeprom.o
txd_buffer 0x3c usart.o
WiNetworkMode 0x1 eeprom.o
BLConfig 0x8 twimaster.o
Motor 0x60 twimaster.o
PKT_Baudrate 0x1 eeprom.o
Debug 0x1 eeprom.o
bt_pin 0x5 eeprom.o
WiTXRXChannel 0x1 eeprom.o
gps_UsedMac 0xe eeprom.o
Vin 0x4 main.o
m 0x1 motortest.o
lcd_ypos 0x1 lcd.o
naviData 0x2 osd.o
Pre 0x2 setup.o
cells 0x1 osd.o
length_tmp 0x1 setup.o
PKTWayPoint 0x1f eeprom.o
LCD_Kontrast 0x1 eeprom.o
OSD_SendOSD 0x1 eeprom.o
DisplayTimeout 0x1 eeprom.o
heading_home 0x2 osd.o
volt_avg 0x2 main.o
FM_Refresh 0x2 eeprom.o
spalte 0x1 setup.o
 
Memory Configuration
 
Name Origin Length Attributes
text 0x00000000 0x00020000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
fuse 0x00820000 0x00000400 rw !x
lock 0x00830000 0x00000400 rw !x
signature 0x00840000 0x00000400 rw !x
*default* 0x00000000 0xffffffff
 
Linker script and memory map
 
Address of section .data set to 0x800100
LOAD C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
LOAD main.o
LOAD menu.o
LOAD timer.o
LOAD tools.o
LOAD twimaster.o
LOAD uart1.o
LOAD usart.o
LOAD motortest.o
LOAD HAL_HW1_2.o
LOAD HAL_HW1_3.o
LOAD HAL_HW3_9.o
LOAD Wi232.o
LOAD bluetooth.o
LOAD connect.o
LOAD debug.o
LOAD display.o
LOAD eeprom.o
LOAD error.o
LOAD error_driver.o
LOAD fifo.o
LOAD font8x6.o
LOAD gps.o
LOAD lcd.o
LOAD lipo.o
LOAD osd.o
LOAD parameter.o
LOAD servo.o
LOAD setup.o
LOAD followme.o
LOAD tracking.o
LOAD Font8x8.o
LOAD messages.o
LOAD C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a
LOAD C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a
LOAD C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a
LOAD C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a
 
.hash
*(.hash)
 
.dynsym
*(.dynsym)
 
.dynstr
*(.dynstr)
 
.gnu.version
*(.gnu.version)
 
.gnu.version_d
*(.gnu.version_d)
 
.gnu.version_r
*(.gnu.version_r)
 
.rel.init
*(.rel.init)
 
.rela.init
*(.rela.init)
 
.rel.text
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
 
.rela.text
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
 
.rel.fini
*(.rel.fini)
 
.rela.fini
*(.rela.fini)
 
.rel.rodata
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
 
.rela.rodata
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
 
.rel.data
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
 
.rela.data
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
 
.rel.ctors
*(.rel.ctors)
 
.rela.ctors
*(.rela.ctors)
 
.rel.dtors
*(.rel.dtors)
 
.rela.dtors
*(.rela.dtors)
 
.rel.got
*(.rel.got)
 
.rela.got
*(.rela.got)
 
.rel.bss
*(.rel.bss)
 
.rela.bss
*(.rela.bss)
 
.rel.plt
*(.rel.plt)
 
.rela.plt
*(.rela.plt)
 
.text 0x00000000 0x11cb4
*(.vectors)
.vectors 0x00000000 0x7c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
0x00000000 __vectors
0x00000000 __vector_default
*(.vectors)
*(.progmem.gcc*)
.progmem.gcc_sw_table
0x0000007c 0x34 osd.o
.progmem.gcc_fplib
0x000000b0 0x1e C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
*(.progmem*)
.progmem.data 0x000000ce 0x24 main.o
.progmem.data 0x000000f2 0x6c8 menu.o
0x00000488 param_menuitems_nc
0x00000368 param_menuitems_fc
0x000001b8 param_menuitems_no
0x000000f2 param_copyright
.progmem.data 0x000007ba 0x1f2 tools.o
0x000007ba tools_menuitems_pkt
.progmem.data 0x000009ac 0xe6 motortest.o
.progmem.data 0x00000a92 0xc3 display.o
.progmem.data 0x00000b55 0x66 eeprom.o
.progmem.data 0x00000bbb 0x300 font8x6.o
0x00000bbb font8x6
.progmem.data 0x00000ebb 0x26 lcd.o
.progmem.data 0x00000ee1 0xb9 osd.o
0x00000ee1 directions_p
0x00000efa str_SW
0x00000f09 rose
0x00000efd str_S
0x00000ef4 str_NW
0x00000f06 str_NE
0x00000f00 str_SE
0x00000ef1 str_N
0x00000ef7 str_W
0x00000f03 str_E
.progmem.data 0x00000f9a 0x2d2c parameter.o
0x00003893 param_pages
0x00000f9a param_items_rx
0x00001033 param_config
0x000014f3 param_names
.progmem.data 0x00003cc6 0x111c setup.o
0x00003f96 param_menuitems_FOLLOWME
0x000044ee param_menuitems_wi
0x00004146 param_menuitems_GPS
0x00004776 param_menuitems_lcd
0x00004386 param_menuitems_bt
0x00003cc6 param_menuitems_OSD
0x000049b6 param_menuitems_pkt
0x000042f6 param_menuitems_Accu
.progmem.data 0x00004de2 0x34 followme.o
.progmem.data 0x00004e16 0x800 Font8x8.o
0x00004e16 Font8x8
0x00005616 . = ALIGN (0x2)
0x00005616 __trampolines_start = .
*(.trampolines)
.trampolines 0x00005616 0x0 linker stubs
*(.trampolines*)
0x00005616 __trampolines_end = .
*(.jumptables)
*(.jumptables*)
*(.lowtext)
*(.lowtext*)
0x00005616 __ctors_start = .
*(.ctors)
0x00005616 __ctors_end = .
0x00005616 __dtors_start = .
*(.dtors)
0x00005616 __dtors_end = .
SORT(*)(.ctors)
SORT(*)(.dtors)
*(.init0)
.init0 0x00005616 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
0x00005616 __init
*(.init0)
*(.init1)
.init1 0x00005616 0x12 main.o
0x00005616 wdt_init
*(.init1)
*(.init2)
.init2 0x00005628 0xc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
*(.init2)
*(.init3)
*(.init3)
*(.init4)
.init4 0x00005634 0x16 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
0x00005634 __do_copy_data
.init4 0x0000564a 0x10 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
0x0000564a __do_clear_bss
*(.init4)
*(.init5)
*(.init5)
*(.init6)
*(.init6)
*(.init7)
*(.init7)
*(.init8)
*(.init8)
*(.init9)
.init9 0x0000565a 0x8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
*(.init9)
*(.text)
.text 0x00005662 0x4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
0x00005662 __vector_22
0x00005662 __vector_28
0x00005662 __vector_1
0x00005662 __vector_24
0x00005662 __vector_12
0x00005662 __bad_interrupt
0x00005662 __vector_6
0x00005662 __vector_3
0x00005662 __vector_23
0x00005662 __vector_30
0x00005662 __vector_25
0x00005662 __vector_11
0x00005662 __vector_13
0x00005662 __vector_17
0x00005662 __vector_19
0x00005662 __vector_7
0x00005662 __vector_27
0x00005662 __vector_5
0x00005662 __vector_4
0x00005662 __vector_2
0x00005662 __vector_21
0x00005662 __vector_15
0x00005662 __vector_29
0x00005662 __vector_8
0x00005662 __vector_14
0x00005662 __vector_18
.text 0x00005666 0x688 main.o
0x00005666 main
.text 0x00005cee 0x7c6 menu.o
0x00005cee menu_set_cursor
0x00005e4c menu_choose3
0x00005da2 menu_choose2
0x00005f36 Show_Error_HW
0x00005d18 menu_choose
0x000060d0 main_menu
0x000063fa Update_PKT
0x00005f76 Show_Version
.text 0x000064b4 0x4a2 timer.o
0x000068f6 get_key_long
0x000064ee Timer2_Init
0x0000686c SetDelay
0x00006938 get_key_long_rpt_sp
0x000068e0 get_key_rpt
0x0000687e CheckDelay
0x00006896 Delay_ms
0x00006914 get_key_long_rpt
0x00006516 __vector_9
0x000068c6 get_key_short
0x0000656a set_beep
0x000068b0 get_key_press
0x000064b4 Timer1_Init
0x00006530 __vector_10
0x000065ca __vector_16
0x0000654a Timer0_Init
.text 0x00006956 0x260 tools.o
0x00006956 PKT_Tools
0x00006aec PC_Fast_Connect
0x00006bb4 Test_HB
.text 0x00006bb6 0x7d0 twimaster.o
0x00006c24 I2C_Reset
0x00006bd8 I2C_Init
0x00006bb6 RAM_Checksum
0x00007234 I2C_WriteBLConfig
0x00007380 I2C_ReadBLConfig
0x00006c68 __vector_26
.text 0x00007386 0x0 uart1.o
.text 0x00007386 0x920 usart.o
0x0000771a USART_putc
0x000076fa USART_DisableTXD
0x00007b42 SwitchToFC
0x0000772a USART_puts
0x00007692 USART_Init
0x00007b28 SwitchToWi232
0x00007c30 SwitchToGPS
0x00007bba SwitchToMAG
0x00007994 USART_request_mk_data
0x00007a12 Decode64
0x000075da USART_getc
0x00007634 uart_getc_nb
0x00007748 USART_puts_p
0x0000770a USART_EnableTXD
0x0000776e SendOutData
0x00007386 __vector_20
0x00007ae6 SwitchToNC
.text 0x00007ca6 0x9c0 motortest.o
0x00007efa motor_test
0x00007ca6 SendMotorData
0x00007cfe Search_BL
0x00007e98 motor
.text 0x00008666 0x0 HAL_HW1_2.o
.text 0x00008666 0xd4 HAL_HW1_3.o
0x00008666 set_D_LIGHT
0x0000866e InitHWPorts
0x00008732 clr_D_LIGHT
.text 0x0000873a 0x0 HAL_HW3_9.o
.text 0x0000873a 0x0 Wi232.o
.text 0x0000873a 0x0 bluetooth.o
.text 0x0000873a 0x0 connect.o
.text 0x0000873a 0x0 debug.o
.text 0x0000873a 0x278 display.o
0x0000873a display_data
.text 0x000089b2 0xf1a eeprom.o
0x00008a70 ReadLastPosition
0x00008aec WriteParameter
0x00008a26 WriteBTSlaveFlag
0x00008fc6 Delete_EEPROM
0x00008a4c WriteBTMasterFlag
0x000089da WriteWiInitFlag
0x00009650 EEWayPointList_Clear
0x00008a00 WriteBTInitFlag
0x0000922e ReadParameter
0x00008ab2 WriteLastPosition
.text 0x000098cc 0x30 error.o
0x000098e8 send_pgm
0x000098cc _send_msg
.text 0x000098fc 0x0 error_driver.o
.text 0x000098fc 0x2ba fifo.o
0x00009910 fifo_getcount
0x00009ad4 fifo_search
0x00009b6c fifo_strstr_pgm
0x0000994a fifo_read
0x000098fc fifo_init
0x00009b60 fifo_cmp_pgm
0x00009918 fifo_is_empty
0x000099a2 fifo_write
0x0000992e fifo_is_full
0x000099f0 fifo_clear
.text 0x00009bb6 0x0 font8x6.o
.text 0x00009bb6 0x0 gps.o
.text 0x00009bb6 0x1dc0 lcd.o
0x00009bd2 lcd_cls
0x0000a6dc lcd_puts_at
0x0000a5e8 lcd_print_at
0x00009c38 wait_1ms
0x00009f24 lcd_plot
0x00009bb6 send_byte
0x0000b1b2 lcd_print_hex_at
0x0000b69a write_ndigit_number_s_10th
0x0000a6ca lcd_printpns_at
0x0000a57e print_display_at
0x0000a7f4 lcd_circle
0x00009fb6 lcd_line
0x0000a38a lcd_putc
0x00009f0a new_line
0x0000a318 lcd_printpj
0x00009e98 paste_line
0x0000a1c0 lcd_putc_jeti
0x0000b4cc write_ndigit_number_u_10th
0x0000a378 lcd_printpj_at
0x0000a65a lcd_printp_at
0x00009e26 copy_line
0x0000aa6e lcd_circ_line
0x0000b7f2 write_time
0x0000b1a2 hdigit
0x0000b276 lcd_write_number_u
0x0000a716 lcd_cls_line
0x0000a58e lcd_print
0x0000b2d6 lcd_write_number_u_at
0x0000b206 lcd_print_hex
0x00009dbc scroll
0x0000a946 lcd_fcircle
0x0000a53e print_display
0x0000a66c lcd_printpns
0x00009d72 set_adress
0x00009c6c LCD_Init
0x0000b862 write_gps_pos
0x0000a13c lcd_frect
0x00009c42 wait_ms
0x0000b0b0 lcd_ecirc_line
0x0000acfe lcd_ellipse
0x0000b0ca lcd_view_font
0x0000b3da write_ndigit_number_s
0x0000b09e lcd_ecircle
0x0000b624 write_ndigit_number_u_100th
0x0000a760 lcd_rect
0x0000b2e6 write_ndigit_number_u
0x00009bc4 lcd_command
0x0000abb8 lcd_ellipse_line
0x0000a5fa lcd_printp
.text 0x0000b976 0x0 lipo.o
.text 0x0000b976 0x2680 osd.o
0x0000c760 lcd_o_circle
0x0000ba04 heading_conv
0x0000bd28 draw_homesymbol
0x0000b976 CheckMKLipo
0x0000be00 draw_targetsymbol
0x0000d508 osd
0x0000c0cc print_position
0x0000ba78 draw_compass
0x0000c7c2 lcd_o_circ_line
0x0000c80e OSD_Screen_Element
0x0000c47a OSD_Timeout
0x0000be98 print_statistics
0x0000bac6 draw_variometer
0x0000c2ae Show_LastPosition
.text 0x0000dff6 0x1a52 parameter.o
0x0000f47c load_setting
0x0000f562 display_settings_menu
0x0000f7c6 edit_parameter
0x0000f624 copy_setting
0x0000dff6 display_section_menu
0x0000e170 display_param_menu
0x0000f38a write_setting
0x0000e7ae edit_param
.text 0x0000fa48 0x2 servo.o
0x0000fa48 servo_test
.text 0x0000fa4a 0x1422 setup.o
0x0000fa4a Show_Error_HW12
0x0000fb90 Edit_Int_Value
0x0000ff8e Edit_Baudrate
0x000109f4 Display_Setup
0x0000fe9c Edit_YesNo
0x0001098c Reset_EEprom
0x00010408 Edit_DisplayMode
0x000106c4 Edit_DisplayHelligkeit
0x0000fdaa Edit_OnOff
0x0000fa7e Edit_Int10th_Value
0x00010166 Edit_Language
0x0000fc9a Edit_Int16_Value
0x00010c98 PKT_Setup
0x00010518 Edit_DisplayKontrast
0x000102f0 Edit_Orientation
.text 0x00010e6c 0x46a followme.o
0x00010e6c FollowMe
.text 0x000112d6 0x0 tracking.o
.text 0x000112d6 0x0 Font8x8.o
.text 0x000112d6 0x62 messages.o
0x000112d6 strGet
0x000112fa Test_Language
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.text 0x00011338 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.text 0x00011338 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
0x00011338 strcpy_P
.text 0x00011346 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
0x00011346 memset
.text 0x00011354 0x4a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
0x00011354 __eerd_block
.text 0x0001139e 0x4e C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
0x0001139e __eerd_dword
.text 0x000113ec 0x30 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
0x000113ec __eerd_word
.text 0x0001141c 0x44 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
0x0001141c __eewr_block
.text 0x00011460 0x4e C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
0x00011460 __eewr_dword
.text 0x000114ae 0x32 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
0x000114ae __eewr_word
.text 0x000114e0 0x42 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
0x000114e0 itoa
.text 0x00011522 0x2c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
0x00011522 utoa
.text 0x0001154e 0x20 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
0x0001154e strrev
.text 0x0001156e 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
.text 0x0001156e 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
0x0001156e . = ALIGN (0x2)
*(.text.*)
.text.fplib 0x0001156e 0xa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
0x0001156e __subsf3
0x00011570 __addsf3
.text.fplib 0x00011578 0xc0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
0x00011592 __addsf3x
.text.fplib 0x00011638 0x8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
0x00011638 __lesf2
0x00011638 __nesf2
0x00011638 __eqsf2
0x00011638 __cmpsf2
0x00011638 __ltsf2
.text.fplib 0x00011640 0x6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
0x00011640 cos
.text.fplib 0x00011646 0x4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
0x00011646 __divsf3
.text.fplib 0x0001164a 0xcc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
0x00011660 __divsf3x
0x00011664 __divsf3_pse
.text.fplib 0x00011716 0xa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
0x00011716 __fixsfsi
.text.fplib 0x00011720 0x58 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
0x00011720 __fixunssfsi
.text.fplib 0x00011778 0x7a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
0x0001177c __floatsisf
0x00011778 __floatunsisf
.text.fplib 0x000117f2 0x48 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
0x000117f2 __fp_cmp
.text.fplib 0x0001183a 0xc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
0x0001183a __fp_inf
.text.fplib 0x00011846 0x6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
0x00011846 __fp_nan
.text.fplib 0x0001184c 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
0x0001184c __fp_pscA
.text.fplib 0x0001185a 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
0x0001185a __fp_pscB
.text.fplib 0x00011868 0x50 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
0x0001186a __fp_rempio2
.text.fplib 0x000118b8 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
0x000118b8 __fp_round
.text.fplib 0x000118da 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
0x000118da __fp_sinus
.text.fplib 0x000118fc 0x44 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
0x000118fc __fp_split3
0x0001190c __fp_splitA
.text.fplib 0x00011940 0xe C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
0x00011940 __fp_zero
0x00011942 __fp_szero
.text.fplib 0x0001194e 0x8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
0x0001194e __gtsf2
0x0001194e __gesf2
.text.fplib 0x00011956 0x4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
0x00011956 __mulsf3
.text.fplib 0x0001195a 0xc2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
0x00011972 __mulsf3_pse
0x0001196e __mulsf3x
.text.fplib 0x00011a1c 0x40 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
0x00011a1c round
.text.fplib 0x00011a5c 0xc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
0x00011a5c sin
.text.fplib 0x00011a68 0x36 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
0x00011a68 __fp_mintl
.text.fplib 0x00011a9e 0x1c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
0x00011aa2 __fp_mpack_finite
0x00011a9e __fp_mpack
.text.fplib 0x00011aba 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
0x00011aba __fp_powsodd
.text.fplib 0x00011adc 0x4a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
0x00011adc __fp_powser
.text.libgcc 0x00011b26 0x3e C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
0x00011b26 __mulsi3
.text.libgcc 0x00011b64 0x18 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
0x00011b64 __udivmodqi4
.text.libgcc 0x00011b7c 0x28 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
0x00011b7c __udivmodhi4
.text.libgcc 0x00011ba4 0x26 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
0x00011ba4 __divmodhi4
0x00011ba4 _div
.text.libgcc 0x00011bca 0x44 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
0x00011bca __udivmodsi4
.text.libgcc 0x00011c0e 0x36 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
0x00011c0e __divmodsi4
.text.libgcc 0x00011c44 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.text.libgcc 0x00011c44 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.text.libgcc 0x00011c44 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.text.libgcc 0x00011c44 0x38 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
0x00011c44 __prologue_saves__
.text.libgcc 0x00011c7c 0x36 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
0x00011c7c __epilogue_restores__
0x00011cb2 . = ALIGN (0x2)
*(.fini9)
.fini9 0x00011cb2 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
0x00011cb2 exit
0x00011cb2 _exit
*(.fini9)
*(.fini8)
*(.fini8)
*(.fini7)
*(.fini7)
*(.fini6)
*(.fini6)
*(.fini5)
*(.fini5)
*(.fini4)
*(.fini4)
*(.fini3)
*(.fini3)
*(.fini2)
*(.fini2)
*(.fini1)
*(.fini1)
*(.fini0)
.fini0 0x00011cb2 0x2 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
*(.fini0)
0x00011cb4 _etext = .
 
.data 0x00800100 0x2982 load address 0x00011cb4
0x00800100 PROVIDE (__data_start, .)
*(.data)
.data 0x00800100 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
.data 0x00800100 0x0 main.o
.data 0x00800100 0x0 menu.o
.data 0x00800100 0x7 timer.o
0x00800104 WarnTime
0x00800100 BeepMuster
0x00800102 PoffTime
.data 0x00800107 0x0 tools.o
.data 0x00800107 0x3 twimaster.o
0x00800107 RequiredMotors
0x00800108 I2CTimeout
.data 0x0080010a 0x0 uart1.o
.data 0x0080010a 0x1 usart.o
0x0080010a txd_complete
.data 0x0080010b 0x5a motortest.o
.data 0x00800165 0x0 HAL_HW1_2.o
.data 0x00800165 0x0 HAL_HW1_3.o
.data 0x00800165 0x0 HAL_HW3_9.o
.data 0x00800165 0x0 Wi232.o
.data 0x00800165 0x0 bluetooth.o
.data 0x00800165 0x0 connect.o
.data 0x00800165 0x0 debug.o
.data 0x00800165 0x0 display.o
.data 0x00800165 0x0 eeprom.o
.data 0x00800165 0x0 error.o
.data 0x00800165 0x0 error_driver.o
.data 0x00800165 0x0 fifo.o
.data 0x00800165 0x0 font8x6.o
.data 0x00800165 0x0 gps.o
.data 0x00800165 0x0 lcd.o
.data 0x00800165 0x0 lipo.o
.data 0x00800165 0x6 osd.o
0x0080016a min_UBat
0x00800165 Vario_Threshold_Value
0x00800169 last_UBat
0x00800167 Vario_Beep_Up_Interval
0x00800168 last_RC_Quality
0x00800166 Vario_Beep_Down_Interval
.data 0x0080016b 0x2 parameter.o
0x0080016c target_pos
0x0080016b target_pos2
.data 0x0080016d 0x0 servo.o
.data 0x0080016d 0x0 setup.o
.data 0x0080016d 0x0 followme.o
.data 0x0080016d 0x0 tracking.o
.data 0x0080016d 0x0 Font8x8.o
.data 0x0080016d 0x2915 messages.o
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
.data 0x00802a82 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
*(.data*)
*(.rodata)
*(.rodata*)
*(.gnu.linkonce.d*)
0x00802a82 . = ALIGN (0x2)
0x00802a82 _edata = .
0x00802a82 PROVIDE (__data_end, .)
 
.bss 0x00802a82 0x800
0x00802a82 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x00802a82 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
.bss 0x00802a82 0x3 main.o
0x00802a84 mode
0x00802a82 current_hardware
0x00802a83 hardware
.bss 0x00802a85 0x0 menu.o
.bss 0x00802a85 0x1e timer.o
0x00802a8d WarnCount
0x00802a8f IdleTimer
0x00802a93 repeat_speed
0x00802a89 BeepTime
0x00802a96 key_rpt
0x00802a85 CountMilliseconds
0x00802a94 key_rpts
0x00802a95 key_lrpt
0x00802a87 BeepPrio
0x00802a98 key_press
0x00802a8b WarnToggle
0x00802a97 key_long
0x00802a91 DisplayTime
0x00802a99 key_state
.bss 0x00802aa3 0x0 tools.o
.bss 0x00802aa3 0x11 twimaster.o
0x00802aac motor_write
0x00802aa7 BLFlags
0x00802aae twi_state
0x00802aa9 MissingMotor
0x00802aa8 MotorenEin
0x00802aab motor_read
0x00802aad dac_channel
0x00802aaa I2C_TransferActive
0x00802aa5 BLConfig_WriteMask
0x00802aa3 BLConfig_ReadMask
.bss 0x00802ab4 0x0 uart1.o
.bss 0x00802ab4 0x51 usart.o
0x00802abc ReceivedBytes
0x00802abd rxd_buffer_locked
0x00802ab7 stat_crc_error
0x00802aba pRxData
0x00802ab9 RxDataLen
0x00802ab5 stat_overflow_error
0x00802ab4 rxFlag
.bss 0x00802b05 0x1 motortest.o
0x00802b05 motor_addr
.bss 0x00802b06 0x0 HAL_HW1_2.o
.bss 0x00802b06 0x0 HAL_HW1_3.o
.bss 0x00802b06 0x0 HAL_HW3_9.o
.bss 0x00802b06 0x0 Wi232.o
.bss 0x00802b06 0x0 bluetooth.o
.bss 0x00802b06 0x0 connect.o
.bss 0x00802b06 0x0 debug.o
.bss 0x00802b06 0x0 display.o
.bss 0x00802b06 0x0 eeprom.o
.bss 0x00802b06 0x0 error.o
.bss 0x00802b06 0x0 error_driver.o
.bss 0x00802b06 0x0 fifo.o
.bss 0x00802b06 0x0 font8x6.o
.bss 0x00802b06 0x0 gps.o
.bss 0x00802b06 0x0 lcd.o
.bss 0x00802b06 0x0 lipo.o
.bss 0x00802b06 0x19 osd.o
0x00802b09 COSD_FLAGS2
0x00802b07 CellIsChecked
0x00802b0a NextWP
0x00802b0b OldWP
0x00802b13 max_Current
0x00802b1d old_hh
0x00802b0e Vario_Beep_Up
0x00802b11 max_Capacity
0x00802b0f ftimer
0x00802b19 max_GroundSpeed
0x00802b06 AkkuWarnThreshold
0x00802b0d Vario_Beep_Down
0x00802b1b max_Altimeter
0x00802b08 error
0x00802b17 max_Distance
0x00802b0c Vario_Threshold
0x00802b15 max_FlyingTime
.bss 0x00802b1f 0x6 parameter.o
0x00802b21 pmode
0x00802b22 offset2
0x00802b1f changes
0x00802b20 setting
0x00802b24 offset
0x00802b23 dmode
.bss 0x00802b25 0x0 servo.o
.bss 0x00802b25 0x3 setup.o
0x00802b25 PKT_Change
0x00802b26 LCD_Change
0x00802b27 edit
.bss 0x00802b28 0x1 followme.o
0x00802b28 FM_error
.bss 0x00802b29 0x0 tracking.o
.bss 0x00802b29 0x0 Font8x8.o
.bss 0x00802b29 0x0 messages.o
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
.bss 0x00802b29 0x0 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
*(.bss*)
*(COMMON)
COMMON 0x00802b29 0x21 main.o
0x00802b29 version
0x00802b2b accumulator
0x00802b2f mk_param_struct
0x00802b31 MotorTest
0x00802b41 samples
0x00802b43 MK_LowBat
0x00802b44 Vin
0x00802b48 volt_avg
COMMON 0x00802b4a 0xa timer.o
0x00802b4a Display_on
0x00802b4b timer
0x00802b4d abo_timer
0x00802b4f String_Buffer
COMMON 0x00802b54 0x68 twimaster.o
0x00802b54 BLConfig
0x00802b5c Motor
COMMON 0x00802bbc 0x10f usart.o
0x00802bbc rxd_buffer
0x00802c70 buffer
0x00802c8e rx_byte
0x00802c8f txd_buffer
COMMON 0x00802ccb 0x4 motortest.o
0x00802ccb i2c_state
0x00802ccc mmode
0x00802ccd v
0x00802cce m
COMMON 0x00802ccf 0xa8 eeprom.o
0x00802ccf OSD_ScreenMode
0x00802cd0 OSD_mAh_Warning
0x00802cd2 LastLongitude
0x00802cd6 LCD_ORIENTATION
0x00802cd7 PKT_Accutyp
0x00802cd8 U02SV2
0x00802cd9 Lipo_UOffset
0x00802cdb FM_Speed
0x00802cdd LCD_DisplayMode
0x00802cde OSD_VarioBeep
0x00802cdf bt_name
0x00802cea LCD_Helligkeit
0x00802ceb PKT_StartInfo
0x00802cec PKTWayPointDirectory
0x00802d0f WiTXTO
0x00802d10 OSD_InvertOut
0x00802d11 OSD_LEDform
0x00802d12 OSD_RCErrorbeep
0x00802d13 UseBT
0x00802d14 WiNetworkGroup
0x00802d15 USBBT
0x00802d16 WiUartMTU
0x00802d17 BTIsSlave
0x00802d18 UseWi
0x00802d19 gps_UsedDevName
0x00802d2d gps_UsedGPSMouse
0x00802d2e OSD_HomeMKView
0x00802d2f OSD_LipoBar
0x00802d30 FM_Radius
0x00802d32 PKT_IdleBeep
0x00802d33 BTIsSet
0x00802d34 WiIsSet
0x00802d35 DisplayLanguage
0x00802d36 gps_UseGPS
0x00802d37 OSD_Fallspeed
0x00802d38 LastLatitude
0x00802d3c WiNetworkMode
0x00802d3d PKT_Baudrate
0x00802d3e Debug
0x00802d3f bt_pin
0x00802d44 WiTXRXChannel
0x00802d45 gps_UsedMac
0x00802d53 PKTWayPoint
0x00802d72 LCD_Kontrast
0x00802d73 OSD_SendOSD
0x00802d74 DisplayTimeout
0x00802d75 FM_Refresh
COMMON 0x00802d77 0x487 lcd.o
0x00802d77 display_page_counter
0x00802d78 display_buffer
0x00803178 display_buffer_counter
0x00803179 display_mode
0x0080317a line_buffer
0x008031fa display_buffer_pointer
0x008031fc lcd_xpos
0x008031fd lcd_ypos
COMMON 0x008031fe 0x66 osd.o
0x008031fe Element
0x008031ff BattLowVoltageWarning
0x00803200 last5pos
0x0080325b OSD_active
0x0080325c Flags_GlobalConfig
0x0080325d Flags_GlobalConfig3
0x0080325e Flags_ExtraConfig
0x0080325f naviData
0x00803261 cells
0x00803262 heading_home
COMMON 0x00803264 0x1 parameter.o
0x00803264 ii
COMMON 0x00803265 0x1d setup.o
0x00803265 Pre16
0x00803267 EditString
0x0080327c LCD_Orientation
0x0080327d bt_name_len
0x0080327e Pre
0x00803280 length_tmp
0x00803281 spalte
0x00803282 PROVIDE (__bss_end, .)
0x00011cb4 __data_load_start = LOADADDR (.data)
0x00014636 __data_load_end = (__data_load_start + SIZEOF (.data))
 
.noinit 0x00803282 0x0
0x00803282 PROVIDE (__noinit_start, .)
*(.noinit*)
0x00803282 PROVIDE (__noinit_end, .)
0x00803282 _end = .
0x00803282 PROVIDE (__heap_start, .)
 
.eeprom 0x00810000 0x7c0
*(.eeprom*)
.eeprom 0x00810000 0x7c0 eeprom.o
0x00810028 EE_LCD_Helligkeit
0x00810015 EE_OSD_VarioBeep
0x00810005 EE_LastLongitude
0x00810021 EE_WiIsSet
0x00810034 EE_BTPin
0x00810022 EE_BTIsSlave
0x00810014 EE_OSD_HomeMKView
0x00810025 EE_Debug
0x00810044 EE_gps_UsedDevName
0x00810011 EE_OSD_ScreenMode
0x00810023 EE_UseBT
0x00810024 EE_UseWi
0x00810031 EE_DisplayLanguage
0x0081000f EE_PKT_Baudrate
0x00810030 EE_WiTXRXChannel
0x00810017 EE_OSD_SendOSD
0x0081001e EE_PKT_StartInfo
0x0081002e EE_WiNetworkMode
0x00810067 EE_gps_UsedGPSMouse
0x00810066 EE_gps_UseGPS
0x0081000d EE_FM_Refresh
0x00810032 EE_DisplayTimeout
0x0081001c EE_Lipo_UOffset
0x00810019 EE_OSD_InvertOut
0x00810058 EE_gps_UsedMac
0x00810020 EE_BTIsSet
0x0081002b EE_LCD_Orientation
0x00810018 EE_OSD_LEDform
0x00810009 EE_FM_Radius
0x00810117 EEWayPointList
0x0081002f EE_WiNetworkGroup
0x0081002d EE_WiTXTO
0x00810001 EE_LastLatitude
0x00810039 EE_BTName
0x0081001b EE_PKT_Accutyp
0x00810027 EE_USBBT
0x0081002c EE_WiUartMTU
0x00810016 EE_OSD_Fallspeed
0x00810033 EE_LowBat
0x0081001a EE_OSD_RCErrorbeep
0x00810026 EE_U02SV2
0x0081001f EE_PKT_IdleBeep
0x00810012 EE_OSD_mAh_Warning
0x00810000 EE_PKTVersion
0x00810068 EEWPDirectory
0x00810010 EE_OSD_LipoBar
0x0081000b EE_FM_Speed
0x0081002a EE_LCD_DisplayMode
0x00810029 EE_LCD_Kontrast
0x008107c0 __eeprom_end = .
 
.fuse
*(.fuse)
*(.lfuse)
*(.hfuse)
*(.efuse)
 
.lock
*(.lock*)
 
.signature
*(.signature*)
 
.stab 0x00000000 0x3390
*(.stab)
.stab 0x00000000 0x6b4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
.stab 0x000006b4 0x78 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
0x84 (size before relaxing)
.stab 0x0000072c 0x4bc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
0x4c8 (size before relaxing)
.stab 0x00000be8 0x90 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
0x9c (size before relaxing)
.stab 0x00000c78 0x54 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
0x60 (size before relaxing)
.stab 0x00000ccc 0x48 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
0x54 (size before relaxing)
.stab 0x00000d14 0x510 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
0x51c (size before relaxing)
.stab 0x00001224 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
0x78 (size before relaxing)
.stab 0x00001290 0x240 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
0x24c (size before relaxing)
.stab 0x000014d0 0x318 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
0x324 (size before relaxing)
.stab 0x000017e8 0x1e0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
0x1ec (size before relaxing)
.stab 0x000019c8 0x78 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
0x84 (size before relaxing)
.stab 0x00001a40 0x54 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
0x60 (size before relaxing)
.stab 0x00001a94 0x84 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
0x90 (size before relaxing)
.stab 0x00001b18 0x84 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
0x90 (size before relaxing)
.stab 0x00001b9c 0x21c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
0x228 (size before relaxing)
.stab 0x00001db8 0xfc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
0x108 (size before relaxing)
.stab 0x00001eb4 0xfc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
0x108 (size before relaxing)
.stab 0x00001fb0 0x1d4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
0x1e0 (size before relaxing)
.stab 0x00002184 0x90 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
0x9c (size before relaxing)
.stab 0x00002214 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
0x78 (size before relaxing)
.stab 0x00002280 0x48 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
0x54 (size before relaxing)
.stab 0x000022c8 0x4d4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
0x4e0 (size before relaxing)
.stab 0x0000279c 0x1b0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
0x1bc (size before relaxing)
.stab 0x0000294c 0x78 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
0x84 (size before relaxing)
.stab 0x000029c4 0x174 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
0x180 (size before relaxing)
.stab 0x00002b38 0xe4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
0xf0 (size before relaxing)
.stab 0x00002c1c 0xfc C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
0x108 (size before relaxing)
.stab 0x00002d18 0x1ec C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
0x1f8 (size before relaxing)
.stab 0x00002f04 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
0x78 (size before relaxing)
.stab 0x00002f70 0x6c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
0x78 (size before relaxing)
.stab 0x00002fdc 0x1b0 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
0x1bc (size before relaxing)
.stab 0x0000318c 0x12c C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
0x138 (size before relaxing)
.stab 0x000032b8 0xd8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
0xe4 (size before relaxing)
 
.stabstr 0x00000000 0xa06
*(.stabstr)
.stabstr 0x00000000 0xa06 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
 
.stab.excl
*(.stab.excl)
 
.stab.exclstr
*(.stab.exclstr)
 
.stab.index
*(.stab.index)
 
.stab.indexstr
*(.stab.indexstr)
 
.comment
*(.comment)
 
.debug
*(.debug)
 
.line
*(.line)
 
.debug_srcinfo
*(.debug_srcinfo)
 
.debug_sfnames
*(.debug_sfnames)
 
.debug_aranges 0x00000000 0x78
*(.debug_aranges)
.debug_aranges
0x00000000 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_aranges
0x00000014 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_aranges
0x00000028 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_aranges
0x0000003c 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_aranges
0x00000050 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_aranges
0x00000064 0x14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_pubnames
0x00000000 0xd0
*(.debug_pubnames)
.debug_pubnames
0x00000000 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_pubnames
0x00000023 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_pubnames
0x00000046 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_pubnames
0x00000068 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_pubnames
0x0000008b 0x23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_pubnames
0x000000ae 0x22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_info 0x00000000 0x6af
*(.debug_info)
.debug_info 0x00000000 0xfd C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_info 0x000000fd 0x153 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_info 0x00000250 0x131 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_info 0x00000381 0xf9 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_info 0x0000047a 0x151 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_info 0x000005cb 0xe4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
*(.gnu.linkonce.wi.*)
 
.debug_abbrev 0x00000000 0x404
*(.debug_abbrev)
.debug_abbrev 0x00000000 0x9a C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_abbrev 0x0000009a 0xc6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_abbrev 0x00000160 0xc6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_abbrev 0x00000226 0x91 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_abbrev 0x000002b7 0xc8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_abbrev 0x0000037f 0x85 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_line 0x00000000 0x520
*(.debug_line)
.debug_line 0x00000000 0xd5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
.debug_line 0x000000d5 0xe7 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
.debug_line 0x000001bc 0xda C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
.debug_line 0x00000296 0xd5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
.debug_line 0x0000036b 0xe1 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
.debug_line 0x0000044c 0xd4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
 
.debug_frame
*(.debug_frame)
 
.debug_str 0x00000000 0x1b9
*(.debug_str)
.debug_str 0x00000000 0xb5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
0xe9 (size before relaxing)
.debug_str 0x000000b5 0x40 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
0xf6 (size before relaxing)
.debug_str 0x000000f5 0x34 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
0xf3 (size before relaxing)
.debug_str 0x00000129 0x32 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
0xe9 (size before relaxing)
.debug_str 0x0000015b 0x33 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
0xf7 (size before relaxing)
.debug_str 0x0000018e 0x2b C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
0xea (size before relaxing)
 
.debug_loc
*(.debug_loc)
 
.debug_macinfo
*(.debug_macinfo)
OUTPUT(PKT_3_63a_MartinR_HW_1_3_de.elf elf32-avr)
LOAD linker stubs
 
Cross Reference Table
 
Symbol File
AkkuWarnThreshold osd.o
BLConfig twimaster.o
BLConfig_ReadMask twimaster.o
BLConfig_WriteMask twimaster.o
BLFlags twimaster.o
motortest.o
BTIsSet eeprom.o
BTIsSlave eeprom.o
BattLowVoltageWarning osd.o
BeepMuster timer.o
HAL_HW1_3.o
BeepPrio timer.o
BeepTime timer.o
HAL_HW1_3.o
COSD_FLAGS2 osd.o
CellIsChecked osd.o
CheckDelay timer.o
motortest.o
twimaster.o
CheckMKLipo osd.o
CountMilliseconds timer.o
Debug setup.o
eeprom.o
menu.o
main.o
Decode64 usart.o
followme.o
parameter.o
osd.o
display.o
main.o
Delay_ms timer.o
Delete_EEPROM eeprom.o
setup.o
DisplayLanguage messages.o
setup.o
parameter.o
eeprom.o
tools.o
menu.o
DisplayTime timer.o
DisplayTimeout setup.o
eeprom.o
timer.o
Display_Setup setup.o
Display_on HAL_HW1_3.o
timer.o
EEWPDirectory eeprom.o
EEWayPointList eeprom.o
EEWayPointList_Clear eeprom.o
EE_BTIsSet eeprom.o
EE_BTIsSlave eeprom.o
EE_BTName eeprom.o
EE_BTPin eeprom.o
EE_Debug eeprom.o
EE_DisplayLanguage eeprom.o
EE_DisplayTimeout eeprom.o
EE_FM_Radius eeprom.o
EE_FM_Refresh eeprom.o
EE_FM_Speed eeprom.o
EE_LCD_DisplayMode eeprom.o
EE_LCD_Helligkeit eeprom.o
EE_LCD_Kontrast eeprom.o
EE_LCD_Orientation eeprom.o
EE_LastLatitude eeprom.o
EE_LastLongitude eeprom.o
EE_Lipo_UOffset eeprom.o
EE_LowBat eeprom.o
EE_OSD_Fallspeed eeprom.o
EE_OSD_HomeMKView eeprom.o
EE_OSD_InvertOut eeprom.o
EE_OSD_LEDform eeprom.o
EE_OSD_LipoBar eeprom.o
EE_OSD_RCErrorbeep eeprom.o
EE_OSD_ScreenMode eeprom.o
EE_OSD_SendOSD eeprom.o
EE_OSD_VarioBeep eeprom.o
EE_OSD_mAh_Warning eeprom.o
EE_PKTVersion eeprom.o
EE_PKT_Accutyp eeprom.o
EE_PKT_Baudrate eeprom.o
EE_PKT_IdleBeep eeprom.o
EE_PKT_StartInfo eeprom.o
EE_U02SV2 eeprom.o
EE_USBBT eeprom.o
EE_UseBT eeprom.o
EE_UseWi eeprom.o
EE_WiIsSet eeprom.o
EE_WiNetworkGroup eeprom.o
EE_WiNetworkMode eeprom.o
EE_WiTXRXChannel eeprom.o
EE_WiTXTO eeprom.o
EE_WiUartMTU eeprom.o
EE_gps_UseGPS eeprom.o
EE_gps_UsedDevName eeprom.o
EE_gps_UsedGPSMouse eeprom.o
EE_gps_UsedMac eeprom.o
EditString setup.o
Edit_Baudrate setup.o
Edit_DisplayHelligkeit setup.o
Edit_DisplayKontrast setup.o
Edit_DisplayMode setup.o
Edit_Int10th_Value setup.o
Edit_Int16_Value setup.o
Edit_Int_Value setup.o
Edit_Language setup.o
Edit_OnOff setup.o
Edit_Orientation setup.o
Edit_YesNo setup.o
Element followme.o
osd.o
FM_Radius eeprom.o
FM_Refresh eeprom.o
FM_Speed eeprom.o
FM_error followme.o
Flags_ExtraConfig followme.o
osd.o
Flags_GlobalConfig followme.o
osd.o
Flags_GlobalConfig3 followme.o
osd.o
FollowMe followme.o
menu.o
Font8x8 Font8x8.o
lcd.o
I2CTimeout twimaster.o
I2C_Init twimaster.o
I2C_ReadBLConfig twimaster.o
I2C_Reset twimaster.o
I2C_TransferActive twimaster.o
motortest.o
I2C_WriteBLConfig twimaster.o
IdleTimer timer.o
InitHWPorts HAL_HW1_3.o
main.o
LCD_Change setup.o
LCD_DisplayMode setup.o
lcd.o
eeprom.o
LCD_Helligkeit setup.o
lcd.o
eeprom.o
HAL_HW1_3.o
LCD_Init lcd.o
HAL_HW1_3.o
LCD_Kontrast setup.o
lcd.o
eeprom.o
LCD_ORIENTATION lcd.o
eeprom.o
LCD_Orientation setup.o
LastLatitude eeprom.o
main.o
LastLongitude eeprom.o
main.o
Lipo_UOffset eeprom.o
MK_LowBat messages.o
followme.o
setup.o
parameter.o
osd.o
lipo.o
lcd.o
eeprom.o
connect.o
Wi232.o
HAL_HW1_3.o
usart.o
twimaster.o
tools.o
timer.o
menu.o
main.o
MissingMotor twimaster.o
Motor motortest.o
twimaster.o
MotorTest HAL_HW1_3.o
motortest.o
twimaster.o
main.o
MotorenEin twimaster.o
motortest.o
New_Baudrate eeprom.o
NextWP osd.o
OSD_Fallspeed osd.o
eeprom.o
OSD_HomeMKView osd.o
eeprom.o
OSD_InvertOut osd.o
eeprom.o
OSD_LEDform osd.o
eeprom.o
OSD_LipoBar osd.o
eeprom.o
OSD_RCErrorbeep setup.o
osd.o
eeprom.o
OSD_ScreenMode osd.o
eeprom.o
OSD_Screen_Element osd.o
followme.o
OSD_SendOSD eeprom.o
usart.o
OSD_Setup setup.o
OSD_Timeout osd.o
followme.o
OSD_VarioBeep osd.o
eeprom.o
OSD_active followme.o
osd.o
usart.o
OSD_mAh_Warning osd.o
eeprom.o
OldWP osd.o
Old_Baudrate eeprom.o
PC_Fast_Connect tools.o
PKTWayPoint eeprom.o
PKTWayPointDirectory eeprom.o
PKT_Accutyp eeprom.o
PKT_Baudrate eeprom.o
PKT_Change setup.o
PKT_IdleBeep eeprom.o
timer.o
PKT_Setup setup.o
tools.o
menu.o
PKT_StartInfo setup.o
eeprom.o
main.o
PKT_Tools tools.o
menu.o
PoffTime timer.o
Pre setup.o
Pre16 setup.o
RAM_Checksum twimaster.o
ReadLastPosition eeprom.o
main.o
ReadParameter eeprom.o
HAL_HW1_3.o
ReceivedBytes usart.o
RequiredMotors twimaster.o
Reset_EEprom setup.o
RxDataLen usart.o
Search_BL motortest.o
SendMotorData motortest.o
SendOutData usart.o
followme.o
parameter.o
osd.o
display.o
motortest.o
main.o
SetDelay timer.o
motortest.o
twimaster.o
Show_Error_HW menu.o
tools.o
Show_Error_HW12 setup.o
Show_LastPosition osd.o
Show_Version menu.o
tools.o
String_Buffer timer.o
SwitchToFC usart.o
followme.o
parameter.o
osd.o
display.o
motortest.o
main.o
SwitchToGPS usart.o
SwitchToMAG usart.o
SwitchToNC usart.o
followme.o
osd.o
display.o
SwitchToWi232 usart.o
Test_HB tools.o
Test_Language messages.o
menu.o
Timer0_Init timer.o
HAL_HW1_3.o
Timer1_Init timer.o
HAL_HW1_3.o
Timer2_Init timer.o
HAL_HW1_3.o
U02SV2 eeprom.o
USART_DisableTXD usart.o
USART_EnableTXD usart.o
USART_Init usart.o
HAL_HW1_3.o
USART_getc usart.o
USART_putc usart.o
main.o
USART_puts usart.o
USART_puts_p usart.o
USART_request_mk_data usart.o
USBBT eeprom.o
Update_PKT menu.o
setup.o
UseBT eeprom.o
UseWi eeprom.o
Vario_Beep_Down osd.o
Vario_Beep_Down_Interval osd.o
Vario_Beep_Up osd.o
Vario_Beep_Up_Interval osd.o
Vario_Threshold osd.o
Vario_Threshold_Value osd.o
Vin setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
WarnCount timer.o
WarnTime timer.o
WarnToggle timer.o
WiIsSet eeprom.o
WiNetworkGroup eeprom.o
WiNetworkMode eeprom.o
WiTXRXChannel eeprom.o
WiTXTO eeprom.o
WiUartMTU eeprom.o
WriteBTInitFlag eeprom.o
WriteBTMasterFlag eeprom.o
WriteBTSlaveFlag eeprom.o
WriteLastPosition eeprom.o
osd.o
main.o
WriteParameter eeprom.o
setup.o
WriteWiInitFlag eeprom.o
__addsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
setup.o
lcd.o
__addsf3x C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
__bad_interrupt C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__bss_end C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
__bss_start C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
__cmpsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__data_end C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
__data_load_start C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
__data_start C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
__divmodhi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
setup.o
parameter.o
osd.o
motortest.o
__divmodsi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
followme.o
lcd.o
__divsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
osd.o
lcd.o
__divsf3_pse C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
__divsf3x C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
__do_clear_bss C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_clear_bss.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
messages.o
Font8x8.o
tracking.o
followme.o
setup.o
servo.o
parameter.o
osd.o
lipo.o
lcd.o
gps.o
font8x6.o
fifo.o
error_driver.o
error.o
eeprom.o
display.o
debug.o
connect.o
bluetooth.o
Wi232.o
HAL_HW3_9.o
HAL_HW1_3.o
HAL_HW1_2.o
motortest.o
usart.o
uart1.o
twimaster.o
tools.o
timer.o
menu.o
main.o
__do_copy_data C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_copy_data.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
messages.o
Font8x8.o
tracking.o
followme.o
setup.o
servo.o
parameter.o
osd.o
lipo.o
lcd.o
gps.o
font8x6.o
fifo.o
error_driver.o
error.o
eeprom.o
display.o
debug.o
connect.o
bluetooth.o
Wi232.o
HAL_HW3_9.o
HAL_HW1_3.o
HAL_HW1_2.o
motortest.o
usart.o
uart1.o
twimaster.o
tools.o
timer.o
menu.o
main.o
__eerd_block C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
eeprom.o
__eerd_dword C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_dword.o)
eeprom.o
__eerd_word C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_word.o)
eeprom.o
__eewr_block C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
eeprom.o
__eewr_dword C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_dword.o)
eeprom.o
__eewr_word C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_word.o)
eeprom.o
__epilogue_restores__ C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_epilogue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
__eqsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__fixsfsi C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
osd.o
lcd.o
__fixunssfsi C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
setup.o
lcd.o
HAL_HW1_3.o
__floatsisf C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
setup.o
osd.o
lcd.o
HAL_HW1_3.o
__floatunsisf C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(floatsisf.o)
__fp_cmp C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_cmp.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__fp_inf C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_inf.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_mintl C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mintl.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
__fp_mpack C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
__fp_mpack_finite C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_mpack.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
__fp_nan C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_nan.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_powser C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
__fp_powsodd C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
__fp_pscA C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscA.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_pscB C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_pscB.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_rempio2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
__fp_round C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
__fp_sinus C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_sinus.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
__fp_split3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__fp_splitA C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_split3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_rempio2.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
__fp_szero C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixsfsi.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(divsf3x.o)
__fp_zero C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_zero.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fixunssfsi.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3x.o)
__gesf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
__gtsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(gesf2.o)
osd.o
__heap_end C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__init C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__lesf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__ltsf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
osd.o
__mulsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powsodd.o)
setup.o
osd.o
lcd.o
HAL_HW1_3.o
__mulsf3_pse C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
__mulsf3x C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3x.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(fp_powser.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(mulsf3.o)
__mulsi3 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_mulsi3.o)
lcd.o
__nesf2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cmpsf2.o)
__prologue_saves__ C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_prologue.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eewr_block.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(eerd_block.o)
__stack C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
main.o
__subsf3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(addsf3.o)
lcd.o
__udivmodhi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodhi4.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
osd.o
lcd.o
fifo.o
timer.o
__udivmodqi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodqi4.o)
osd.o
lcd.o
usart.o
__udivmodsi4 C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_udivmodsi4.o)
C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodsi4.o)
osd.o
main.o
__vector_1 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_10 timer.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_11 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_12 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_13 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_14 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_15 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_16 timer.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_17 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_18 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_19 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_2 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_20 usart.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_21 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_22 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_23 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_24 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_25 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_26 twimaster.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_27 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_28 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_29 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_3 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_30 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_4 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_5 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_6 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_7 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_8 C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_9 timer.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vector_default C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
__vectors C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
_div C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_divmodhi4.o)
_exit C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
_send_msg error.o
abo_timer followme.o
osd.o
timer.o
accumulator setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
bt_name eeprom.o
bt_name_len setup.o
bt_pin eeprom.o
buffer motortest.o
usart.o
cells osd.o
changes parameter.o
clr_D_LIGHT HAL_HW1_3.o
timer.o
copy_line lcd.o
copy_setting parameter.o
cos C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(cos.o)
lcd.o
current_hardware main.o
display.o
motortest.o
usart.o
dac_channel twimaster.o
directions_p osd.o
display_buffer lcd.o
display_buffer_counter lcd.o
display_buffer_pointer lcd.o
display_data display.o
menu.o
display_debug menu.o
display_mode lcd.o
display_page_counter lcd.o
display_param_menu parameter.o
display_section_menu parameter.o
display_settings_menu parameter.o
dmode parameter.o
draw_compass osd.o
draw_homesymbol osd.o
draw_targetsymbol osd.o
draw_variometer osd.o
edit setup.o
edit_param parameter.o
edit_parameter parameter.o
menu.o
error osd.o
exit C:/WinAVR_20060421/lib/gcc/avr/3.4.6/avr5\libgcc.a(_exit.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
fifo_clear fifo.o
fifo_cmp_pgm fifo.o
fifo_getcount fifo.o
fifo_init fifo.o
fifo_is_empty fifo.o
fifo_is_full fifo.o
fifo_read fifo.o
fifo_search fifo.o
fifo_strstr_pgm fifo.o
fifo_write fifo.o
font8x6 font8x6.o
lcd.o
ftimer osd.o
get_key_long timer.o
parameter.o
menu.o
get_key_long_rpt timer.o
get_key_long_rpt_sp timer.o
setup.o
parameter.o
display.o
motortest.o
menu.o
get_key_press timer.o
messages.o
followme.o
setup.o
parameter.o
osd.o
display.o
motortest.o
tools.o
menu.o
main.o
get_key_rpt timer.o
get_key_short timer.o
parameter.o
eeprom.o
tools.o
menu.o
gps_UseGPS eeprom.o
gps_UsedDevName eeprom.o
gps_UsedGPSMouse eeprom.o
gps_UsedMac eeprom.o
hardware main.o
followme.o
osd.o
display.o
motortest.o
usart.o
menu.o
hdigit lcd.o
heading_conv osd.o
heading_home followme.o
osd.o
i2c_state motortest.o
ii parameter.o
itoa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
lcd.o
motortest.o
key_long timer.o
key_lrpt timer.o
key_press timer.o
key_rpt timer.o
key_rpts timer.o
key_state timer.o
last5pos osd.o
last_RC_Quality osd.o
last_UBat osd.o
lcd_circ_line lcd.o
lcd_circle lcd.o
osd.o
lcd_cls lcd.o
messages.o
followme.o
setup.o
parameter.o
osd.o
eeprom.o
display.o
motortest.o
tools.o
menu.o
main.o
lcd_cls_line lcd.o
parameter.o
motortest.o
main.o
lcd_command lcd.o
lcd_ecirc_line lcd.o
parameter.o
lcd_ecircle lcd.o
parameter.o
lcd_ellipse lcd.o
osd.o
lcd_ellipse_line lcd.o
osd.o
lcd_fcircle lcd.o
osd.o
lcd_frect lcd.o
setup.o
parameter.o
osd.o
motortest.o
main.o
lcd_line lcd.o
osd.o
lcd_o_circ_line osd.o
lcd_o_circle osd.o
lcd_plot lcd.o
osd.o
lcd_print lcd.o
lcd_print_at lcd.o
parameter.o
lcd_print_hex lcd.o
lcd_print_hex_at lcd.o
motortest.o
lcd_printp lcd.o
eeprom.o
motortest.o
lcd_printp_at lcd.o
followme.o
setup.o
parameter.o
osd.o
eeprom.o
display.o
motortest.o
tools.o
menu.o
main.o
lcd_printpj lcd.o
lcd_printpj_at lcd.o
lcd_printpns lcd.o
lcd_printpns_at lcd.o
osd.o
lcd_putc lcd.o
parameter.o
osd.o
lcd_putc_jeti lcd.o
osd.o
lcd_puts_at lcd.o
messages.o
followme.o
setup.o
parameter.o
osd.o
display.o
motortest.o
tools.o
menu.o
main.o
lcd_rect lcd.o
osd.o
lcd_view_font lcd.o
lcd_write_number_u lcd.o
main.o
lcd_write_number_u_at lcd.o
main.o
lcd_xpos lcd.o
lcd_ypos lcd.o
length_tmp setup.o
line_buffer lcd.o
load_setting parameter.o
followme.o
osd.o
main.o
m motortest.o
main main.o
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm644p.o
main_menu menu.o
main.o
max_Altimeter osd.o
max_Capacity osd.o
max_Current osd.o
max_Distance osd.o
max_FlyingTime osd.o
max_GroundSpeed osd.o
memset C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(memset.o)
motortest.o
menu_choose menu.o
parameter.o
menu_choose2 menu.o
setup.o
parameter.o
tools.o
menu_choose3 menu.o
parameter.o
menu_set_cursor menu.o
min_UBat osd.o
mk_param_struct followme.o
parameter.o
osd.o
main.o
mmode setup.o
motortest.o
mode main.o
followme.o
parameter.o
osd.o
display.o
usart.o
motor motortest.o
motor_addr motortest.o
motor_read twimaster.o
motortest.o
motor_test motortest.o
tools.o
menu.o
motor_write twimaster.o
motortest.o
naviData followme.o
osd.o
new_line lcd.o
offset parameter.o
offset2 parameter.o
old_hh osd.o
osd osd.o
menu.o
pRxData usart.o
followme.o
parameter.o
osd.o
main.o
param_config parameter.o
param_copyright menu.o
param_items_rx parameter.o
param_menuitems_Accu setup.o
param_menuitems_FOLLOWME setup.o
param_menuitems_GPS setup.o
param_menuitems_OSD setup.o
param_menuitems_bt setup.o
param_menuitems_fc menu.o
param_menuitems_lcd setup.o
param_menuitems_nc menu.o
param_menuitems_no menu.o
param_menuitems_pkt setup.o
param_menuitems_wi setup.o
param_names parameter.o
param_pages parameter.o
paste_line lcd.o
pmode parameter.o
print_display lcd.o
print_display_at lcd.o
display.o
print_position osd.o
print_statistics osd.o
repeat_speed timer.o
rose osd.o
round C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(round.o)
lcd.o
rxFlag usart.o
rx_byte usart.o
rxd_buffer display.o
usart.o
main.o
rxd_buffer_locked usart.o
followme.o
parameter.o
osd.o
display.o
main.o
samples setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
scroll lcd.o
send_byte lcd.o
setup.o
send_pgm error.o
servo_test servo.o
tools.o
menu.o
set_D_LIGHT HAL_HW1_3.o
timer.o
set_adress lcd.o
set_beep timer.o
followme.o
setup.o
osd.o
eeprom.o
main.o
setting parameter.o
sin C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libm.a(sin.o)
lcd.o
spalte setup.o
stat_crc_error usart.o
stat_overflow_error usart.o
strGet messages.o
followme.o
setup.o
parameter.o
osd.o
display.o
motortest.o
tools.o
menu.o
main.o
str_E osd.o
str_N osd.o
str_NE osd.o
str_NW osd.o
str_S osd.o
str_SE osd.o
str_SW osd.o
str_W osd.o
strcpy_P C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strcpy_P.o)
eeprom.o
strrev C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(strrev.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(itoa.o)
target_pos parameter.o
target_pos2 parameter.o
timer followme.o
parameter.o
osd.o
display.o
motortest.o
timer.o
main.o
tools_menuitems_pkt tools.o
twi_state twimaster.o
motortest.o
txd_buffer usart.o
txd_complete usart.o
uart1_init HAL_HW1_3.o
uart1_putc HAL_HW1_3.o
usart.o
uart1_puts motortest.o
uart_getc_nb usart.o
utoa C:/WinAVR_20060421/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(utoa.o)
lcd.o
v motortest.o
version main.o
volt_avg setup.o
lipo.o
connect.o
tools.o
menu.o
main.o
wait_1ms lcd.o
wait_ms lcd.o
wdt_init main.o
write_gps_pos lcd.o
write_ndigit_number_s lcd.o
osd.o
write_ndigit_number_s_10th lcd.o
osd.o
write_ndigit_number_u lcd.o
followme.o
setup.o
parameter.o
osd.o
motortest.o
main.o
write_ndigit_number_u_100th lcd.o
write_ndigit_number_u_10th lcd.o
setup.o
osd.o
write_setting parameter.o
write_time lcd.o
osd.o
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/TODO.txt
0,0 → 1,12
24.8.2011 Cebra
Waypointlisten speichern und zum MK übertragen
Menüs überarbeiten um die Varianten der Schnittstellen einfacher handhaben zu können
Touchsreen entfällt, bring keine wirklichen Vorteile, kostet nur viel Speicher
 
22.7.2011 Cebra
 
HArdwareplatine mit Stick und Schalter zum Steuern der seriellen Kanäle.
 
22.6.2011 Cebra
- erl. I2C Motortest für BL-Controller
- erl. zur Zeit sind durch einen Layoutfehler noch die Tasten vertauscht, in timer.h zu ändern
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/Wi232.c
0,0 → 1,679
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include "lcd.h"
#include "usart.h"
#include "uart1.h"
#include "main.h"
#include "Wi232.h"
#include "timer.h"
#include "eeprom.h"
 
 
 
 
 
#if defined HWVERSION1_3W || defined HWVERSION3_9 || defined HWVERSION1_2W
 
uint8_t Wi232_hardware = 0;
uint8_t InitErr=0;
uint8_t Wi232_Baudrate = 0; //Merkzelle für aktuelle Baudrate
uint8_t New_Baudrate = 0; //Merkzelle für zu setzende Baudrate
uint8_t Old_Baudrate = 0; //Merkzelle für alte Baudrate
 
 
void SetUart0_Wi232(uint8_t Baudrate)
{
switch (Baudrate)
{
case Wi232_2400: USART_Init( UART_BAUD_SELECT(2400,F_CPU) ); break; /* erstmal mit 2400 versuchen*/
case Wi232_9600: USART_Init( UART_BAUD_SELECT(9600,F_CPU) ); break; /* erstmal mit 9600 versuchen*/
case Wi232_19200: USART_Init( UART_BAUD_SELECT(19200,F_CPU) ); break; /* erstmal mit 19200 versuchen*/
case Wi232_38400: USART_Init( UART_BAUD_SELECT(38400,F_CPU) ); break; /* erstmal mit 38400 versuchen*/
case Wi232_57600: USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); break; /* erstmal mit 57600 versuchen*/
// case Wi232_115200: USART_Init( UART_BAUD_SELECT(115200,F_CPU) ); break; /* erstmal mit 115200 versuchen*/
// Macro erechnet falschen Wert (9,85 = 9) für 115200 Baud mit 20Mhz Quarz, zu grosse Abweichung
 
#warning "Baurate prüfen wenn kein 20 Mhz Quarz verwendet wird"
 
case Wi232_115200: USART_Init( 10 ); break; /* erstmal mit 115200 versuchen*/
}
}
void SetUart1_Wi232(uint8_t Baudrate)
{
switch (Baudrate)
{
case Wi232_2400: uart1_init( UART_BAUD_SELECT(2400,F_CPU) ); break; /* erstmal mit 2400 versuchen*/
case Wi232_9600: uart1_init( UART_BAUD_SELECT(9600,F_CPU) ); break; /* erstmal mit 9600 versuchen*/
case Wi232_19200: uart1_init( UART_BAUD_SELECT(19200,F_CPU) ); break; /* erstmal mit 19200 versuchen*/
case Wi232_38400: uart1_init( UART_BAUD_SELECT(38400,F_CPU) ); break; /* erstmal mit 38400 versuchen*/
case Wi232_57600: uart1_init( UART_BAUD_SELECT(57600,F_CPU) ); break; /* erstmal mit 57600 versuchen*/
// case Wi232_115200: uart1_init( UART_BAUD_SELECT(115200,F_CPU) ); break; /* erstmal mit 115200 versuchen*/
case Wi232_115200: uart1_init( 10 ); break; /* erstmal mit 115200 versuchen*/
}
}
 
 
 
/*************************************************************************
Function: discoverWI232()
Purpose: check if Wi232 available
Returns: Version or 0 = timeout
 
**************************************************************************/
void discoverWi232(uint8_t Baudrate)
 
{
int16_t RegisterWi232;
 
SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
set_WI232CMD();
_delay_ms(200);
lcd_cls();
SetUart0_Wi232( Baudrate);
 
// switch (PKT_Baudrate)
// {
// case Wi232_2400: USART_Init( UART_BAUD_SELECT(2400,F_CPU) ); break; /* erstmal mit 2400 versuchen*/
// case Wi232_9600: USART_Init( UART_BAUD_SELECT(9600,F_CPU) ); break; /* erstmal mit 9600 versuchen*/
// case Wi232_19200: USART_Init( UART_BAUD_SELECT(19200,F_CPU) ); break; /* erstmal mit 19200 versuchen*/
// case Wi232_38400: USART_Init( UART_BAUD_SELECT(38400,F_CPU) ); break; /* erstmal mit 38400 versuchen*/
// case Wi232_57600: USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); break; /* erstmal mit 57600 versuchen*/
// case Wi232_115200: USART_Init( UART_BAUD_SELECT(115200,F_CPU) ); break; /* erstmal mit 115200 versuchen*/
// }
 
lcd_printpns_at (0, 0, PSTR("search Wi.232 Modul"),0);
RegisterWi232 = ReadWi232(regDiscover);
lcd_print_hex_at(18,0,RegisterWi232,0);
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{ Wi232_hardware = 1; // Wi232 mit aktueller Baudrate gefunden
Wi232_Baudrate = PKT_Baudrate;}
 
if (RegisterWi232 == 0) // nicht gefunden, dann alle Baudraten durchsuchen
{
USART_Init( UART_BAUD_SELECT(2400,F_CPU) ); /* neues Modul mit 2400 suchen*/
lcd_printpns_at (0, 1, PSTR(" with 2400 Baud "),0);
RegisterWi232 = ReadWi232(regDiscover);
lcd_print_hex_at(18,1,RegisterWi232,0);
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{ Wi232_hardware = 2;
Wi232_Baudrate = Wi232_2400; }
 
if (RegisterWi232 == 0)
{
USART_Init( UART_BAUD_SELECT(9600,F_CPU) ); /* 9600 suchen*/
lcd_printpns_at (0, 2, PSTR(" with 9600 Baud "),0);
RegisterWi232 = ReadWi232(regDiscover);
lcd_print_hex_at(18,2,RegisterWi232,0);
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{ Wi232_hardware = 2;
Wi232_Baudrate = Wi232_9600; }
}
 
if (RegisterWi232 == 0)
{
USART_Init( UART_BAUD_SELECT(19200,F_CPU) ); /* 19200 suchen*/
lcd_printpns_at (0, 3, PSTR(" with 19200 Baud "),0);
RegisterWi232 = ReadWi232(regDiscover);
lcd_print_hex_at(18,3,RegisterWi232,0);
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{ Wi232_hardware = 2;
Wi232_Baudrate = Wi232_19200; }
}
if (RegisterWi232 == 0)
{
USART_Init( UART_BAUD_SELECT(38400,F_CPU) ); /* 38400 suchen*/
lcd_printpns_at (0, 4, PSTR(" with 38400 Baud"),0);
RegisterWi232 = ReadWi232(regDiscover);
lcd_print_hex_at(18,4,RegisterWi232,0);
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{ Wi232_hardware = 2;
Wi232_Baudrate = Wi232_38400; }
}
if (RegisterWi232 == 0 )
{
USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); /* mit 57600 suchen*/
lcd_printpns_at (0, 5, PSTR(" with 57600 Baud"),0);
RegisterWi232 = ReadWi232(regDiscover);
lcd_print_hex_at(18,5,RegisterWi232,0);
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{ Wi232_hardware = 2;
Wi232_Baudrate = Wi232_57600; }
}
if (RegisterWi232 == 0)
{
USART_Init( UART_BAUD_SELECT(115200,F_CPU) ); /* 115200 suchen*/
lcd_printpns_at (0, 6, PSTR(" with 115200 Baud"),0);
RegisterWi232 = ReadWi232(regDiscover);
lcd_print_hex_at(18,6,RegisterWi232,0);
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{ Wi232_hardware = 2;
Wi232_Baudrate = Wi232_115200; }
}
 
_delay_ms(2000);
 
}
 
if (RegisterWi232 == 0)
{
lcd_cls();
lcd_printpns_at (0, 0, PSTR("no Wi.232 found"),0);
Wi232_hardware = 0;
_delay_ms(2000);
}
 
if (RegisterWi232 == 0xFF)
{
lcd_cls();
lcd_printpns_at (0, 0, PSTR("Wi.232 Sytaxerror "),0);
set_beep ( 1000, 0x0040, BeepNormal);
_delay_ms(2000);
RegisterWi232 = 0;
}
 
if (RegisterWi232 > 0 && RegisterWi232 < 0xFF)
{
lcd_cls();
if (Wi232_hardware ==1) // alles ok , Baudrate Wi232 passt
lcd_printpns_at (0, 0, PSTR("Wi.232 found "),0);
 
if (Wi232_hardware ==2) // Wi232 gefunden, aber falsche Baudrate
{
WiIsSet= false; //wenn hier 2400 gefunden wurde, ist Wi232 nicht initialisiert
lcd_printpns_at (0, 0, PSTR("Wi.232 wrong Baudrate"),0);
if (WriteWi232(regNVDATARATE,PKT_Baudrate)!=0) /* NV-Ram auf PKT-Baudrate setzen*/
{
lcd_printpns_at (0, 1, PSTR("Error set NV-RAM"),0);
set_beep ( 1000, 0x0040, BeepNormal);
_delay_ms(2000);
}
else
{
_delay_ms(1000);
lcd_printpns_at (0, 1, PSTR("NV-RAM is set to "),0);
lcd_printpns_at (0, 2, PSTR("given Baudrate"),0);
_delay_ms(2000);
}
 
if (WriteWi232(regDATARATE,PKT_Baudrate)!=0) /* Ram auf PKT_Baudrate setzen*/
{
lcd_printpns_at (0, 3, PSTR("Error set RAM "),0);
set_beep ( 1000, 0x0040, BeepNormal);
_delay_ms(2000);
}
else
{
_delay_ms(1000);
lcd_printpns_at (0, 1, PSTR("RAM is set to "),0);
lcd_printpns_at (0, 2, PSTR("given Baudrate"),0);
_delay_ms(2000);
}
 
SetUart0_Wi232(PKT_Baudrate);
Old_Baudrate = PKT_Baudrate;
 
}
lcd_cls_line (0,1,21);
lcd_printpns_at (0, 1, PSTR("Version:"),0);
lcd_print_hex_at(9,1,RegisterWi232,0);
}
clr_WI232CMD();
}
 
 
/*************************************************************************
Function: InitWI232()
Purpose: set Wi232Register for Mikrokopter
Returns: 0 = ACK, FF = NAK
 
**************************************************************************/
void InitWi232(uint8_t Baudrate)
{
 
uint8_t i = 0;
#ifdef HWVERSION3_9
Change_Output(Uart02Wi); // Verbindung zu Wi232 herstellen
#endif
 
discoverWi232(Old_Baudrate); // Check if Wi232 available
 
if (Wi232_hardware != 0)
{
lcd_printpns_at (0, 2, PSTR("Init Wi232 wait...."),0);
set_WI232CMD();
_delay_ms(200);
SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
// USART_Init( UART_BAUD_SELECT(57600,F_CPU) ); /* erstmal mit 57600 versuchen*/
 
if (WriteWi232(regNETGRP,126)!=0) /*damit Wi232 nix mehr vom Kopter schickt erstmal Networkgroup ins Nirwana setzen */
lcd_printpns_at (i++,4,PSTR("."),0);
// InitErr =12;
// Grund:
//If RF packets are received while the CMD line is active,
//they are still processed and presented to the module’s UART for transmission.
 
// wenn sich ein EEPROM-Wert ändert wird auch das Ram beschrieben damit die Änderung sofort wirksam wird
if (WriteWi232(regNVTXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(1); /*TX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regTXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(2);/*TX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVRXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(3);/* RX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regRXCHANNEL,WiTXRXChannel)!=0)
InitErrorWi232(4);/* RX Channel*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVSLPMODE ,Sleep_Awake)!=0)
InitErrorWi232(5);/* Sleepmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVPWRMODE,WbModeP15)!=0)
InitErrorWi232(6);/* Transceiver Mode/Powermode */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVTXTO,WiTXTO)!=0)
InitErrorWi232(7);/* UART Timeout */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regTXTO,WiTXTO)!=0)
InitErrorWi232(8);/* UART Timeout */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVUARTMTU,WiUartMTU)!=0)
InitErrorWi232(9);/* UART Buffer*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regUARTMTU,WiUartMTU)!=0)
InitErrorWi232(10);/* UART Buffer*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVNETMODE,WiNetworkMode)!=0)
InitErrorWi232(11);/* Networkmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNETMODE,WiNetworkMode)!=0)
InitErrorWi232(12);/* Networkmode*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVUSECRC ,CRC_Enable)!=0)
InitErrorWi232(13);/* CRC*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVCSMAMODE,CSMA_En)!=0)
InitErrorWi232(14);/* CSMA*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVNETGRP,WiNetworkGroup)!=0)
InitErrorWi232(15);/* Networkgroup */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNETGRP,WiNetworkGroup)!=0)
InitErrorWi232(15);/* Networkgroup */
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regNVDATARATE,New_Baudrate)!=0)
InitErrorWi232(16);/* Baudrate*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
if (WriteWi232(regDATARATE,New_Baudrate)!=0)
InitErrorWi232(17);/* Baudrate*/
lcd_printpns_at (i++,4,PSTR("."),0);
 
 
clr_WI232CMD();
 
if (InitErr !=0)
{
lcd_printpns_at (0, 2, PSTR("Wi232 InitError "),0);
lcd_print_hex(InitErr,0);
set_beep ( 1000, 0x0040, BeepNormal);
_delay_ms(2000);
}
else
{
lcd_printpns_at (0, 2, PSTR("Wi232 Init ok...."),0);
WriteWiInitFlag(); // Init merken
}
// USART_Init (UART_BAUD_SELECT(PKT_Baudrate,F_CPU));
SetUart0_Wi232(PKT_Baudrate);
Old_Baudrate = PKT_Baudrate;
_delay_ms(2000);
}
}
 
/*************************************************************************
Function: InitErrorWI232()
Purpose: Show Wi232 Error, Value
Returns:
**************************************************************************/
void InitErrorWi232(uint8_t Error)
{
 
lcd_printpns_at (0, 3, PSTR("Wi232 InitError "),0);
lcd_print_hex(Error,0);
InitErr=Error;
set_beep ( 500, 0x0040, BeepNormal);
_delay_ms(500);
 
}
 
 
 
 
/*************************************************************************
Function: WriteWI232()
Purpose: set Register to Wi232, Register, Value
Returns: 0 = ACK, FF = NAK
ACHTUNG nur für Value <0x80
**************************************************************************/
int16_t WriteWi232(uint8_t Wi232Register, uint8_t RegisterValue)
 
{
uint8_t timeout=10;
uint8_t tc=0;
unsigned int v;
 
USART_putc(0xff);
USART_putc(0x02);
USART_putc(Wi232Register);
USART_putc(RegisterValue);
// lcd_print_hex(Wi232Register,0);
// lcd_print_hex(RegisterValue,0);
 
do
{
v = USART_getc(); /*ACK erwartet*/
_delay_ms(100);
tc ++;
}
while (v==0 && tc!=timeout);
 
// lcd_print_hex(v,0);
if (v != 0x06)
{
lcd_printpns_at (0, 2, PSTR("Wi.232 NAK"),0);
set_beep ( 1000, 0x0040, BeepNormal);
_delay_ms(2000);
return 0xFF;
}
 
if (v==0x06)
return 0;
 
return 0xFF;
}
 
 
/*************************************************************************
Function: ReadWI232()
Purpose: send Readcommand to Wi232,
Returns: Registervalue, 0 = timeout 0xFF = Syntaxerror
 
**************************************************************************/
int16_t ReadWi232(uint16_t Wi232Register)
 
{
uint8_t timeout=10;
uint8_t tc=0;
 
 
unsigned int v;
 
v = USART_getc(); /*Zeichen löschen*/
USART_putc(0xff);
USART_putc(0x02);
USART_putc(0xfe);
USART_putc(Wi232Register);
_delay_ms(50);
// lcd_printpns_at (0, 2, PSTR("read Wi232"),0);
 
 
do
{
v = USART_getc(); /*ACK erwartet*/
_delay_ms(100);
tc ++;
}
while (v==0 && tc!=timeout);
 
if (tc == timeout)
return 0; /* Timeout*/
 
if (v != 0x06)
return 0xFF; /* Syntaxerror*/
 
lcd_print_hex(v,0);
v = USART_getc(); /*Register*/
// lcd_print_hex(v,0);
v = USART_getc(); /*Value*/
// lcd_print_hex(v,0);
 
return v;
 
}
 
 
 
/*************************************************************************
Function: EscapeString()
Purpose:
Returns:
Quelle: Radiotronix Wi.232 Manual
**************************************************************************/
 
 
int EscapeString(char *src, char src_len, char *dest)
{
// The following function copies and encodes the first
// src_len characters from *src into *dest. This
// encoding is necessary for Wi.232 command formats.
// The resulting string is null terminated. The size
// of this string is the function return value.
// ---------------------------------------------------
uint8_t src_idx, dest_idx;
// Save space for the command header and size bytes
// ------------------------------------------------
dest_idx = 2;
// Loop through source string and copy/encode
// ------------------------------------------
for (src_idx = 0; src_idx < src_len; src_idx++)
{
if (src[src_idx] > 127)
{
dest[dest_idx++] = 0xFE;
}
dest[dest_idx++] = (src[src_idx] & 0x7F);
}
// Add null terminator
// -------------------
dest[dest_idx] = 0;
// Add command header
// ------------------
dest[0] = 0xFF;
dest[1] = dest_idx-2;
 
// Return escape string size
// -------------------------
return dest_idx;
}
 
 
//#if defined HWVERSION1_3W || defined HWVERSION3_9
/*************************************************************************
Function: Wi232USB()
Purpose: Connect Wi232 Programmmode to PKT USB,
Returns:
 
**************************************************************************/
void Wi232_USB(void)
 
 
{
unsigned int c0,c1;
 
if (Wi232_hardware==1)
{
// USART_Init (UART_BAUD_SELECT(57600,F_CPU));
// uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init (UART_BAUD_SELECT(2400,F_CPU));
// uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
}
 
if (Wi232_hardware==2)
{
USART_Init (UART_BAUD_SELECT(2400,F_CPU));
uart1_init( UART_BAUD_SELECT(2400,F_CPU) );
}
 
lcd_cls ();
// SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
 
set_WI232CMD();
 
lcd_printpns_at (0, 0, PSTR("Wi.232 Konfiguration "),0);
lcd_printpns_at (0, 1, PSTR("PC mit USB verbinden"),0);
lcd_printpns_at (0, 2, PSTR("Wi.232"),0);
lcd_printpns_at (0, 3, PSTR("Programm starten"),0);
lcd_printpns_at (17, 7, PSTR("Exit"),0);
 
c1 = 0;
 
for(;;)
{
c0 = uart1_getc(); /* from USB*/
if ( c0 & UART_NO_DATA )
{
c1 = USART_getc();
 
if (c1 == 0)
{}
else
{
// lcd_print_hex(c1,0);
uart1_putc (c1); /*to USB*/;
}
}
else
{
USART_putc(c0 ); /* to Wi232*/
// lcd_print_hex(c0,0);
// _delay_ms(1);
}
 
if ((get_key_press (1 << KEY_ENTER)))
{
clr_WI232CMD();
// uart1_init( UART_BAUD_SELECT(57600,F_CPU) );
// USART_Init( UART_BAUD_SELECT(57600,F_CPU) );
// SwitchToFC();
return;
}
 
}
}
/*************************************************************************
Function: Wi232_FC()
Purpose: Connect Wi232 to PKT USB, Transparent
Returns:
 
**************************************************************************/
void Wi232_FC(void)
 
 
{
unsigned int c0,c1;
 
 
// USART_Init (UART_BAUD_SELECT(PKT_Baudrate,F_CPU));
// uart1_init( UART_BAUD_SELECT(PKT_Baudrate,F_CPU) );
//TODO: SetUart0_Wi232(PKT_Baudrate);
// SetUart1_Wi232(PKT_Baudrate);
 
 
lcd_cls ();
// SwitchToWi232(); /* Serielle Kanäle Wi232 mit USB verbinden*/
 
 
lcd_printpns_at (0, 0, PSTR("Wi.232 to FC "),0);
lcd_printpns_at (0, 1, PSTR("PC mit USB verbinden"),0);
lcd_printpns_at (0, 2, PSTR("und Mikrokoptertool"),0);
lcd_printpns_at (0, 3, PSTR("starten"),0);
lcd_printpns_at (17, 7, PSTR("Exit"),0);
 
c1 = 0;
 
for(;;)
{
c0 = uart1_getc(); /* from USB*/
if ( c0 & UART_NO_DATA )
{
c1 = USART_getc();
if (c1 == 0)
{}
else
{
// lcd_print_hex(c1,0);
uart1_putc (c1); /*to USB*/;
 
}
}
else
{
USART_putc(c0 ); /* to Wi232*/
// lcd_print_hex(c0,0);
// _delay_ms(1);
}
 
if ((get_key_press (1 << KEY_ENTER)))
{
return;
}
}
}
 
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/Wi232.h
0,0 → 1,178
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef WI232_H_
#define WI232_H_
 
 
void discoverWi232(uint8_t Baudrate);
void InitWi232(uint8_t Baudrate);
int16_t WriteWi232(uint8_t Wi232Register, uint8_t RegisterValue);
int16_t ReadWi232(uint16_t Wi232Register);
void InitErrorWi232(uint8_t Error);
extern uint8_t Wi232_hardware;
extern uint8_t New_Baudrate; //Merkzelle für zu setzende Baudrate
extern uint8_t Old_Baudrate; //Merkzelle für alte Baudrate
 
// Non-volatile Registers
// Name Address Description Default
#define regNVTXCHANNEL 0x00 // Transmit channel setting ## 0 ##
#define regNVRXCHANNEL 0x01 // Receive channel setting ## 0 ##
#define regNVPWRMODE 0x02 // Operating mode settings ## +13 dBm widebandmode ##
#define regNVDATARATE 0x03 // UART data rate ## 2400bps ##
#define regNVNETMODE 0x04 // Network mode (Normal/Slave) ## Normal ##
#define regNVTXTO 0x05 // Transmit wait timeout ## ~16ms ##
#define regNVNETGRP 0x06 // Network group ID ## 0x00 ##
#define regNVUSECRC 0x08 // Enable/Disable CRC ## Enabled ##
#define regNVUARTMTU 0x09 // Minimum transmission unit. ## 64 bytes ##
#define regNVSHOWVER 0x0A // Enable/Disable start-up message ## Enabled ##
#define regNVCSMAMODE 0x0B // Enable/Disable CSMA ## Enabled ##
#define regNVSLPMODE 0x0D // Power state of module ## Awake ##
#define regNVACKONWAKE 0x0E // Send ACK character to host on wake
 
 
// Non-volatile Read Only Registers
// Name Address Description
#define regMAC0 0x22 // These registers form the unique 48-bit MAC address.
#define regMAC1 0x23 // MAC
#define regMAC2 0x24 // MAC
#define regOUI0 0x25 // MAC
#define regOUI1 0x26 // MAC
#define regOUI2 0x27 // MAC
 
#define regDiscover 0x78 // Versionsregister
 
 
// Volatile Read/Write Registers
// Name Address Description
#define regTXCHANNEL 0x4B // Transmit channel setting
#define regRXCHANNEL 0x4C // Receive channel setting
#define regPWRMODE 0x4D // Operating mode settings
#define regDATARATE 0x4E // UART data rate
#define regNETMODE 0x4F // Network mode (Normal or Slave)
#define regTXTO 0x50 // Transmit wait timeout
#define regNETGRP 0x51 // Network group ID
#define regUSECRC 0x53 // Enable/Disable CRC
#define regUARTMTU 0x54 // Minimum transmission unit.
#define regSHOWVER 0x55 // Enable/Disable start-up message
#define regCSMAMODE 0x56 // Enable/disable CSMA
#define regSLPMODE 0x58 // Power state of module
#define regACKONWAKE 0x59 // Send ACK character to host on wake
 
 
// Wideband Channels
// regNVTXCHAN (0x00) regTXCHAN (0x4B)
// Channel Number Frequency
#define wChan0 0x00 // 868.300 MHz
#define wChan1 0x01 // 868.95 MHz ## MK ##
 
// Narrowband Channels
// regNVRXCHAN (0x01) regRXCHAN (0x4C)
// Channel Number Frequency
#define nChan0 0x00 // 868.225 MHz
#define nChan1 0x01 // 868.375 MHz ## MK ##
#define nChan2 0x02 // 868.850 MHz
#define nChan3 0x03 // 869.050 MHz
#define nChan4 0x04 // 869.525 MHz
#define nChan5 0x05 // 869.850 MHz
 
// Power Mode
// regNVPWRMODE (0x02) regPWRMODE (0x4D)
// PM1 PM1 PM0 Mode
#define NbModeN0 0x00 // 0 0 0 Narrowband Mode 0dBm power setting (typical)
#define WbModeP5 0x01 // 0 0 1 Wideband Mode +5dBm power setting (typical)
#define WbModeP10 0x02 // 0 1 0 Wideband Mode +10dBm power setting (typical)
#define WbModeP15 0x03 // 0 1 1 Wideband Mode +15dBm power setting (typical) ## MK ##
#define WbModeN0 0x04 // 1 0 0 Wideband Mode 0dBm power setting (typical)
#define NbModeP5 0x05 // 1 0 1 Narrowband Mode +5dBm power setting (typical)
#define NbModeP10 0x06 // 1 1 0 Narrowband Mode +10dBm power setting (typical)
#define NbModeP15 0x07 // 1 1 1 Narrowband Mode +15dBm power setting (typical)
 
// Wi232 UART Baudrate
// regNVDATARATE (0x03) regDATARATE (0x4E)
// Baud Rate BR2 BR1 BR0
#define Wi232_2400 0x00 // 0 0 0* (default 2400)
#define Wi232_9600 0x01 // 0 0 1
#define Wi232_19200 0x02 // 0 1 0
#define Wi232_38400 0x03 // 0 1 1
#define Wi232_57600 0x04 // 1 0 0 ## MK ##
#define Wi232_115200 0x05 // 1 0 1
#define Wi232_10400 0x06 // 1 1 0
#define Wi232_31250 0x07 // 1 1 1
 
// NetworkMode
// regNVNETMODE (0x04) regNETMODE (0x4F)
#define NetMode_Slave 0x00 // Slavemode
#define NetMode_Normal 0x01 // Normalmode (default)
 
// Transmit Wait Timeout
// regNVTXTO (0x05) regTXTO (0x50)
#define TWaitTimeFull 0x00 // full Buffer required
#define TWaitTime16 0x10 // 16 ms Delay (default)
 
// Network Group
// regNVNETGRP (0x06) regNETGRP (0x51)
#define NetWorkGroup 66 // default = 0, valid 0-127 ## MK = 66 ##
 
// CRC Control
// regNVUSECRC (0x08) regUSECRC (0x53)
#define CRC_Disable 0x00 // no CRC check
#define CRC_Enable 0x01 // CRC check (default)
 
// UART minimum transmission unit
// regNVUARTMTU (0x09) regUARTMTU (0x54)
#define UartMTU64 64 // default=64, valid 1-144
 
// Verbose mode
// regNVSHOWVER (0x0A)
#define ShowVers_Dis 0x00 // do not show Startupmessage ## MK = 66 ##
#define ShowVers_En 0x01 // show Startupmessage (default)
 
// CSMA enable
// regNVCSMAMODE (0x0B) regCSMAMODE (0x56)
#define CSMA_Dis 0x00 // disable CSMA Carrier-sense multiple access
#define CSMA_En 0x01 // enable CSMA (default)
 
// Sleep control
// regNVSLPMODE (0x0D) regSLPMODE (0x58)
#define Sleep_Awake 0x00 // Sleepmode = Awake (default)
#define Sleep 0x01 // Sleepmode = Sleep
#define Sleep_Stby 0x02 // Sleepmode = Standby
 
// ACK on Wake
// regNVACKONWAKE (0x0D) regACKONWAKE (0x59)
#define ACKwake_Dis 0x00 // disable ACK on Wake
#define ACKwake_En 0x01 // enable ACK on Wake (default)
 
 
#endif // WI232_H_
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/bluetooth.c
0,0 → 1,1228
/**
* source for the Bluetooth driver
* @file bluetooth.c
* @author Linus Lotz<lotz@in.tum.de>
* @author Salomon Sickert
*/
 
 
 
#include "cpu.h"
#include <string.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "bluetooth.h"
#include "main.h"
#ifdef HWVERSION3_9
#include "uart1.h"
#include "usart.h"
#include "timer.h"
#include "fifo.h"
#include "error.h"
#include "lcd.h"
#include "eeprom.h"
#include "error.h"
#include "setup.h"
#include "bluetooth.h"
#include "tracking.h"
 
 
//#define SaveMem
 
//
// Baudrate for the UART-connection to the BTM-222 on SQUIRREL
//
 
#define SQUIRREL
 
#ifdef SQUIRREL
#define UART_BAUD_RATE 19200
#endif
 
#ifdef NUT
#define UART_BAUD_RATE 19200
#endif
 
 
typedef enum {
BT_RAW,
BT_DATA,
BT_CMD,
BT_NOECHO,
BT_NOANSWER
} communication_mode_t;
 
#define BT_CMD_TIMEOUT_MS 2000
 
typedef enum {
BT_TEST, // AT
BT_CONNECT, // ATA
BT_DISCONNECT, // ATH
BT_CLEAR_ADDRESS, // ATD0
BT_SET_ADDRESS, // ATD=_____
BT_FIND_DEVICES, // ATF?
BT_DISABLE_AUTOCONNECT, // ATO1
BT_SET_MASTER, // ATR0
BT_SET_SLAVE, // ATR1
BT_SET_PIN, // ATP=1234
BT_SET_2400, // ATL* Baudrate 2400
BT_SET_9600, // ATL1 Baudrate 9600
BT_SET_19200, // ATL2 Baudrate 19200
BT_SET_38400, // ATL3 Baudrate 38400
BT_SET_57600, // ATL4 Baudrate 57600
BT_SET_115200, // ATL5 Baudrate 115200
BT_SET_NOANSWER, // ATQ1 Rückmeldungen aus
BT_SET_NOECHO, // ATE0 ECHO deaktivieren
BT_SET_ANSWER, // ATQ0 Rückmeldungen
BT_SET_ECHO, // ATE1 ECHO aktivieren
BT_SET_DEFAULT, // Defaultwerte setzen
BT_SET_NAME, // Devicename
BT_SET_DISPWRDOWN // disable auto Powerdown
} bt_cmd_t;
 
 
#define IN_FIFO_SIZE 512
 
 
static uint8_t bt_buffer[IN_FIFO_SIZE];
static fifo_t in_fifo;
 
char rx_buffer[RXD_BUFFER_SIZE];
volatile uint8_t rx_len;
volatile uint8_t rx_ready = 0;
uint8_t rx_GPS;
static char start = '$';
static char end = '\n';
 
char data_decode[RXD_BUFFER_SIZE];
volatile uint16_t rx_timeout;
 
 
static bt_mode_t bt_mode = BLUETOOTH_SLAVE;
static communication_mode_t comm_mode = BT_CMD;
 
uint8_t i = 0;
uint8_t NoEcho = 0;
uint8_t NoAnswer = 0;
 
uint8_t bt_devicecount = 0;
 
uint8_t bt_rxerror = 0;
 
device_info device_list[NUTS_LIST];
 
// Set a timeout of Y ms and a Conditon X, which have to be true while timeout
#define while_timeout(X, Y) for(uint16_t __timeout = 0; __timeout++ <= Y && (X); Delay_MS(Y ? 1 : 0))
 
//--------------------------------------------------------------
void Delay_MS(int count)
{
for (int i = 0; i < count; i++)
_delay_ms(1);
}
 
 
//--------------------------------------------------------------
void uart_receive(void)
{
unsigned int uart_data;
 
while (!fifo_is_full(&in_fifo))
{
uart_data = uart1_getc();
 
// USART_puts(".");
 
switch (uart_data & 0xFF00) {
// Framing Error detected, i.e no stop bit detected
case UART_FRAME_ERROR:
#ifdef DEBUG
warn_pgm(PSTR("FRM ERR"));
#endif
bt_rxerror++;
return;
 
// Overrun, a character already presend in the UART UDR register was
// not read by the interrupt handler before the next character arrived,
// one or more received characters have been dropped
//
case UART_OVERRUN_ERROR:
#ifdef DEBUG
warn_pgm(PSTR("OVR ERR"));
#endif
bt_rxerror++;
return;
 
// We are not reading the receive buffer fast enough,
// one or more received character have been dropped
//
case UART_BUFFER_OVERFLOW:
#ifdef DEBUG
warn_pgm(PSTR("BUF ERR"));
#endif
bt_rxerror++;
return;
 
// UART Inputbuffer empty, nothing to do
case UART_NO_DATA:
return;
 
default:
{
fifo_write(&in_fifo, uart_data);
#ifdef DEBUG
USART_putc(uart_data);
#endif
}
}
}
#ifdef DEBUG
warn_pgm(PSTR("FIFO OVR ERR"));
#endif
}
 
 
//--------------------------------------------------------------
static void uart_send(const char *data, const uint8_t length)
{
#ifdef DEBUG
debug_pgm(PSTR("bt_uart_send"));
#endif
 
char echo;
 
lcd_printp_at (i++, 1, PSTR("."), 0);
for (uint8_t i = 0; i < length; i++)
{
 
#ifdef DEBUG
USART_putc((data[i])); //test
#endif
// debug_pgm(PSTR("bt_init_S"));
 
if (uart1_putc(data[i]) == 0)
{
#ifdef DEBUG
warn_pgm(PSTR("UART: Remote not ready"));
#endif
return;
}
 
if (comm_mode == BT_RAW)
_delay_ms(50);
 
if (comm_mode == BT_DATA)
_delay_ms(1);
 
if (comm_mode == BT_NOECHO)
_delay_ms(1);
 
if (comm_mode == BT_CMD)
{
uint8_t x = 0;
for (; x < 3; x++)
{
// // while_timeout(X, Y) for(uint16_t __timeout = 0; __timeout++ <= Y && (X); _delay_ms(Y ? 1 : 0))
// while_timeout(fifo_is_empty(&in_fifo), 200)
for(uint16_t __timeout = 0; __timeout++ <= 200 && (fifo_is_empty(&in_fifo)); _delay_ms(200 ? 1 : 0))
{
uart_receive();
}
 
fifo_read(&in_fifo, &echo);
 
if (echo != data[i]) {
if (uart1_putc(data[i]) == 0)
{
warn_pgm(PSTR ("UART: Remote not ready"));
return;
}
}
else
break;
}
 
if (x == 3)
{
error_putc(data[i]);
error_pgm(PSTR("BT: WRONG ECHO"));
}
}
}
}
 
 
//--------------------------------------------------------------
static uint16_t send_cmd(const bt_cmd_t command, const char *data)
{
uint16_t CommandDelay=0; // nach BTM222 Kommandos verschiedene Verzögerungszeiten bevor es weitergehen kann
 
// _delay_ms(500); // org 500 300 zu wenig
char full_command[20]; // Maximum command size
 
switch (command)
{
case BT_SET_PIN:
strcpy_P(full_command, PSTR("ATP="));
for (uint8_t i = 0; i < bt_pin_length; i++)
{
full_command[i+4] = bt_pin[i];
}
full_command[(bt_pin_length+4)] =0;
CommandDelay = 100; //100ms
break;
 
case BT_SET_DEFAULT:
strcpy_P(full_command, PSTR("ATZ0"));
CommandDelay = 1000;
break;
 
 
case BT_SET_2400:
strcpy_P(full_command, PSTR("ATL*"));
CommandDelay = 100;
break;
 
case BT_SET_9600:
strcpy_P(full_command, PSTR("ATL1"));
CommandDelay = 100;
break;
 
case BT_SET_19200:
strcpy_P(full_command, PSTR("ATL2"));
CommandDelay = 100;
break;
 
case BT_SET_38400:
strcpy_P(full_command, PSTR("ATL3"));
CommandDelay = 100;
break;
 
case BT_SET_57600:
strcpy_P(full_command, PSTR("ATL4"));
CommandDelay = 100;
break;
 
case BT_SET_115200:
strcpy_P(full_command, PSTR("ATL5"));
CommandDelay = 100;
break;
 
case BT_SET_NOANSWER:
strcpy_P(full_command, PSTR("ATQ1"));
CommandDelay = 100;
break;
 
case BT_SET_NOECHO:
strcpy_P(full_command, PSTR("ATE0"));
CommandDelay = 100;
break;
 
case BT_SET_ANSWER:
strcpy_P(full_command, PSTR("ATQ0"));
CommandDelay = 100;
break;
 
case BT_SET_ECHO:
strcpy_P(full_command, PSTR("ATE1"));
CommandDelay = 100;
break;
 
case BT_TEST:
strcpy_P(full_command, PSTR("AT"));
CommandDelay = 100;
break;
 
case BT_CONNECT:
strcpy_P(full_command, PSTR("ATA"));
CommandDelay = 100;
break;
 
case BT_DISCONNECT:
strcpy_P(full_command, PSTR("ATH"));
CommandDelay = 100;
break;
 
case BT_CLEAR_ADDRESS:
strcpy_P(full_command, PSTR("ATD0"));
CommandDelay = 100;
break;
 
case BT_SET_ADDRESS:
strcpy_P(full_command, PSTR("ATD="));
memcpy((full_command + strlen(full_command)), data, 12);
full_command[16] = 0;
CommandDelay = 100;
break;
 
case BT_FIND_DEVICES:
strcpy_P(full_command, PSTR("ATF?"));
CommandDelay = 100;
break;
 
case BT_DISABLE_AUTOCONNECT:
strcpy_P(full_command, PSTR("ATO1"));
CommandDelay = 3500;
break;
 
case BT_SET_MASTER:
strcpy_P(full_command, PSTR("ATR0"));
CommandDelay = 3000;
break;
 
case BT_SET_SLAVE:
strcpy_P(full_command, PSTR("ATR1"));
CommandDelay = 3000;
break;
 
case BT_SET_NAME:
strcpy_P(full_command, PSTR("ATN="));
for (uint8_t i = 0; i < bt_name_len; i++)
{
full_command[i + 4] = bt_name[i];
}
full_command[(bt_name_len + 4)] = 0;
CommandDelay = 100;
break;
 
case BT_SET_DISPWRDOWN:
strcpy_P(full_command, PSTR("ATS1"));
CommandDelay = 100;
break;
 
default:
warn_pgm(PSTR("CMD UNK"));
return false;
}
 
strcat_P(full_command, PSTR("\r"));
 
// throw away your television
uart_receive();
fifo_clear(&in_fifo);
// debug_pgm(PSTR("bt_init3"));
// send command
uart_send(full_command, strlen(full_command));
 
if (command== BT_SET_NOECHO)
{
_delay_ms(CommandDelay);
return true;
}
 
if (command== BT_SET_NOANSWER)
{
_delay_ms(CommandDelay);
return true;
}
 
if (command== BT_SET_ECHO)
{
_delay_ms(CommandDelay);
return true;
}
if (command== BT_SET_ANSWER)
{
_delay_ms(CommandDelay);
return true;
}
// get response
while_timeout(true, BT_CMD_TIMEOUT_MS)
{
uart_receive();
if (fifo_strstr_pgm(&in_fifo, PSTR("OK\r\n")))
{
info_pgm(PSTR("CMD SEND: OK"));
_delay_ms(CommandDelay);
return true;
}
 
if (fifo_strstr_pgm(&in_fifo, PSTR("ERROR\r\n")))
{
#ifdef DEBUG
info_pgm(PSTR("CMD SEND: Error"));
#endif
return false;
}
}
 
#ifdef DEBUG
if (command != BT_TEST)
warn_pgm(PSTR("CMD SEND: TIMEOUT"));
#endif
 
 
return false;
}
 
 
//--------------------------------------------------------------
void test(void)
{
comm_mode = BT_RAW;
for (uint8_t i = 0; i < 2; i++)
if (send_cmd(BT_TEST, NULL))
break;
comm_mode = BT_CMD;
}
 
 
#ifndef SaveMem
 
//--------------------------------------------------------------
static void clean_line(void)
{
while_timeout(true, 50)
uart_receive();
fifo_strstr_pgm(&in_fifo, PSTR("\r\n"));
}
 
static communication_mode_t update_comm_mode(uint16_t timeout_ms)
{
while_timeout(true, timeout_ms)
{
uart_receive();
 
if (fifo_strstr_pgm(&in_fifo, PSTR("DISCONNECT")))
{
clean_line();
test();
comm_mode = BT_CMD;
return comm_mode;
}
 
if (fifo_strstr_pgm(&in_fifo, PSTR("CONNECT")))
{
_delay_ms(100); //don't delete this, else there will be no success!!!!!!!!!
comm_mode = BT_DATA;
return comm_mode;
}
 
if (fifo_strstr_pgm (&in_fifo, PSTR("Time out,Fail to connect!")))
{
clean_line();
#ifdef DEBUG
debug_pgm(PSTR("CONNECT FAILED"));
#endif
test();
comm_mode = BT_CMD;
return comm_mode;
}
}
 
return comm_mode;
}
#endif
 
 
//--------------------------------------------------------------
uint16_t bt_init(void)
{
uint8_t init_error = false;
uint8_t BT_found = 0;
i = 0;
 
set_BTOn();
 
lcd_cls();
lcd_printp_at (0, 0, PSTR("BT initialisieren.."), 0);
// _delay_ms(200);
 
for (uint8_t z = (bt_name_length); z > 0; z--)
{
if (bt_name[z - 1] != ' ')
{
bt_name_len = z;
break;
}
}
 
uart1_init(UART_BAUD_SELECT(57600, F_CPU));
fifo_init(&in_fifo, bt_buffer, IN_FIFO_SIZE);
_delay_ms(100);
// debug_pgm(PSTR("bt_init"));
// uart_receive();
// debug_pgm(PSTR("bt_init1"));
fifo_clear(&in_fifo);
send_cmd(BT_TEST, NULL);
comm_mode = BT_NOECHO;
send_cmd(BT_SET_ECHO, NULL);
send_cmd(BT_SET_ANSWER, NULL);
 
// debug_pgm(PSTR("bt_init2"));
#ifdef DEBUG
debug_pgm(PSTR("Check with 57600"));
#endif
// send_cmd(BT_TEST, NULL); // Schrott löschen
 
if (send_cmd(BT_TEST, NULL)) // Test mit 57600
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 57600 Baud"));
#endif
BT_found = 1;
}
 
if (BT_found == 0)
{
#ifdef DEBUG
debug_pgm(PSTR("Check with 19200"));
#endif
uart1_init(UART_BAUD_SELECT(19200, F_CPU));// Test mit 19200
_delay_ms(100);
send_cmd(BT_TEST, NULL); // Schrott löschen
send_cmd(BT_SET_ANSWER, NULL);
send_cmd(BT_SET_ECHO, NULL);
 
if (send_cmd(BT_TEST, NULL))
{
debug_pgm(PSTR("19200 OK"));
if (send_cmd(BT_TEST, NULL))
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 19200 Baud"));
#endif
BT_found = 2;
}
}
}
 
if (BT_found == 0)
{
#ifdef DEBUG
debug_pgm(PSTR("Check with 9600"));
#endif
uart1_init(UART_BAUD_SELECT(9600, F_CPU));//test mit 9600
_delay_ms(100);
send_cmd(BT_TEST, NULL);
send_cmd(BT_SET_ANSWER, NULL);
send_cmd(BT_SET_ECHO, NULL);
if (send_cmd(BT_TEST, NULL));
{
#ifdef DEBUG
debug_pgm(PSTR("9600 OK"));
#endif
if (send_cmd(BT_TEST, NULL))
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 9600 Baud"));
#endif
BT_found = 3;
}
}
}
 
 
if (BT_found == 0)
{
#ifdef DEBUG
debug_pgm(PSTR("Check with 4800"));
#endif
uart1_init(UART_BAUD_SELECT(4800, F_CPU));//test mit 4800
_delay_ms(100);
send_cmd(BT_TEST, NULL);
send_cmd(BT_SET_ANSWER, NULL);
send_cmd(BT_SET_ECHO, NULL);
if (send_cmd(BT_TEST, NULL));
{
#ifdef DEBUG
debug_pgm(PSTR("4800 OK"));
#endif
if (send_cmd(BT_TEST, NULL))
{
#ifdef DEBUG
debug_pgm(PSTR("BT found 4800 Baud"));
#endif
BT_found = 4;
}
}
}
 
if (BT_found > 0)
{
/* Set comm_mode to CMD */
comm_mode = BT_CMD;
// test();
// if (BTIsSlave==false)
// {
/* Set BTM Baudrate */
if (!(send_cmd(BT_SET_57600, NULL)))
init_error = true;
uart1_init(UART_BAUD_SELECT(57600, F_CPU));
_delay_ms(100);
// test();
/* Clear remote address */
if(!(send_cmd(BT_CLEAR_ADDRESS, NULL)))
init_error = true;
// test();
/* Set BTM to SLAVE */
if (!(send_cmd(BT_SET_SLAVE, NULL)))
init_error = true;
// test();
/* Set BTM PIN */
if(!(send_cmd(BT_SET_PIN, NULL)))
init_error = true;
// test();
/* Set BTM Name */
if(!(send_cmd(BT_SET_NAME, NULL)))
init_error = true;
_delay_ms(300);
// test();
if(!(send_cmd(BT_SET_DISPWRDOWN, NULL)))
init_error = true;
// }
// test();
/* Set BTM Echo aus */
send_cmd(BT_SET_NOECHO, NULL);
// test();
comm_mode = BT_NOECHO;
/* Set BTM Answer aus */
send_cmd(BT_SET_NOANSWER, NULL);
// test();
 
bt_mode = BLUETOOTH_SLAVE;
 
set_BTOff();
 
 
if (!init_error)
{
WriteBTInitFlag(); // Init merken
WriteBTSlaveFlag();
return true;
}
else
return false;
}
else
{
set_BTOff();
return false;
}
 
}
 
 
#ifndef SaveMem
 
//--------------------------------------------------------------
uint16_t bt_set_mode(const bt_mode_t mode)
{
// if (update_comm_mode(0) == BT_DATA) // 30.1.2012 CB
// return false;
 
if (mode == bt_mode)
return true;
 
if (mode == BLUETOOTH_MASTER)
if (send_cmd(BT_SET_MASTER, NULL))
{
bt_mode = BLUETOOTH_MASTER;
// test();
send_cmd(BT_DISABLE_AUTOCONNECT, NULL);
debug_pgm(PSTR("bt_setmode: Master is set"));
WriteBTMasterFlag();
 
 
}
 
if (mode == BLUETOOTH_SLAVE)
{
if (send_cmd(BT_SET_SLAVE, NULL))
{
bt_mode = BLUETOOTH_SLAVE;
debug_pgm(PSTR("bt_setmode: Slave is set"));
}
send_cmd(BT_SET_NOECHO, NULL);
comm_mode = BT_NOECHO;
/* Set BTM Answer aus */
send_cmd(BT_SET_NOANSWER, NULL);
 
bt_mode = BLUETOOTH_SLAVE;
WriteBTSlaveFlag();
}
// test();
return mode == bt_mode;
}
 
 
//--------------------------------------------------------------
uint16_t bt_receive(void *data, uint8_t length, uint16_t timeout_ms)
{
uint8_t rec_length = 0;
uint8_t i = 0;
 
// while_timeout(true, timeout_ms);
for(uint16_t __timeout = 0; __timeout++ <= true && (timeout_ms); _delay_ms(true ? 1 : 0))
{
if (i == length)
return true;
 
uart_receive();
 
if (fifo_is_empty(&in_fifo))
continue;
 
if (update_comm_mode(0) != BT_DATA)
{
#ifdef DEBUG
debug_pgm(PSTR("not connected"));
#endif
return false;
}
// We have a connection
if (timeout_ms == 0)
timeout_ms += 2000;
 
if (fifo_is_empty(&in_fifo))
continue;
 
// Find starting point of packet
if (!rec_length)
{
fifo_read(&in_fifo, (char *)&rec_length);
 
if (rec_length != length)
{
rec_length = 0;
}
else
{
// You've got mail!
timeout_ms += 2000;
}
}
else
{
fifo_read(&in_fifo, (char *)data + i);
i++;
}
}
return false;
}
 
#endif
 
#ifndef SaveMem
 
 
//--------------------------------------------------------------
uint16_t bt_send(void *data, const uint8_t length)
{
if (update_comm_mode(0) == BT_CMD)
return false;
 
uart_send((const char *)&length, 1);
uart_send((char *)data, length);
return (update_comm_mode(0) == BT_DATA);
}
 
 
#ifdef SQUIRREL
 
//--------------------------------------------------------------
uint16_t bt_connect(const char *address)
{
fifo_init(&in_fifo, bt_buffer, IN_FIFO_SIZE);
uart_receive();
fifo_clear(&in_fifo);
 
// Maybe we already disconnected???
if (BT_DATA == update_comm_mode(0))
{
#ifdef DEBUG
debug_pgm(PSTR("We are still connected..."));
#endif
return false;
}
test();
 
 
/*
if (!send_cmd(BT_DISABLE_AUTOCONNECT, address))
return false;
*/
 
test();
#ifdef DEBUG
debug_pgm (PSTR ("SET_ADD"));
#endif
 
if (!send_cmd(BT_SET_ADDRESS, address))
return false;
 
test();
#ifdef DEBUG
debug_pgm (PSTR ("CONNECT"));
#endif
 
if (!send_cmd(BT_CONNECT, NULL))
return false;
#ifdef DEBUG
debug_pgm (PSTR ("WAIT FOR COMM"));
#endif
return (BT_DATA == update_comm_mode(60000));
}
 
 
//--------------------------------------------------------------
uint16_t bt_disconnect(void)
{
 
 
if (BT_CMD == update_comm_mode(0))
{
fifo_clear(&in_fifo);
return true;
}
 
// Switch to online cmd mode
for (uint8_t i = 0; i < 4; i++)
{
const char plus = '+';
uart_send(&plus, 1);
_delay_ms(1000);
}
 
comm_mode = BT_CMD;
 
if (!send_cmd(BT_DISCONNECT, NULL))
return false;
 
// test();
if (!send_cmd(BT_CLEAR_ADDRESS, NULL))
return false;
// test();
 
if (BT_CMD == update_comm_mode(10000))
{
fifo_clear(&in_fifo);
return true;
}
#ifdef DEBUG
debug_pgm(PSTR("Still in DATA??"));
#endif
return false;
 
}
 
/*
 
BTM-222 Softwareversion 4.35
Inquiry Results:
111111111222222222233333333334
01234567890123456789012345678901234567890
 
1 LE091452 0024-2C-BEB0CA
2 E71 c 0024-7C-3EC9B9
 
BTM-222 Softwareversion 6.26
Inquiry Results:
1 E71 c 0024-7C-3EC9B9 N.A.
2 LE091452 0024-2C-BEB0CA N.A.
 
*/
 
 
//--------------------------------------------------------------
void copy_mac(const char *src, char *dst)
{
uint8_t off = 0;
 
for (uint8_t i = 0; i < 40; i++)
{
if (src[i] == '-') if (src[i+3] == '-')// MAC Adresse suchen
{
off = i-4;
break;
}
}
 
for (uint8_t i = 0; i < 14; i++)
{
if (src[i + off] == '-')
off++;
 
dst[i] = src[i + off];
}
}
//--------------------------------------------------------------
void copy_DevName(const char *src, char *dst)
{
uint8_t off = 0;
 
 
for (uint8_t i = 0; i < 14; i++)
{
if (src[i] == ' ') if (src[i+1] == ' ') break; // nach zwei Leerzeichen ist der Name zuende
dst[i] = src[i + off];
}
}
 
//--------------------------------------------------------------
uint16_t bt_discover(char result[8][12])
 
 
{
 
 
// if (!bt_set_mode(BLUETOOTH_MASTER))
// return false;
 
if (!send_cmd(BT_FIND_DEVICES, NULL))
return false;
 
char buffer[255]; //oversized, but who cares?
char *bufferhead = buffer;
uint16_t pos = 0;
uint16_t Timeout = 28000;
uint16_t pos1 = 0;
uint16_t posC = 0;
#ifdef DEBUG
debug_pgm(PSTR("discover2"));
#endif
do
{
uart_receive();
Timeout--;
pos1++;
posC++;
_delay_ms(1);
write_ndigit_number_u(0,5,fifo_getcount(&in_fifo),5,0,0);
if (posC ==1000)
{
lcd_printp_at (i++, 1, PSTR("."), 0);
posC = 0;
 
}
 
 
if (fifo_is_full(&in_fifo)) break;
#ifdef DEBUG
if (fifo_search(&in_fifo, PSTR("Found."))) debug_pgm(PSTR("Suchen ende1"));
#endif
}
 
// while (((Timeout > 0) ||(!fifo_strstr_pgm(&in_fifo, PSTR("Inquiry Results:\r\n")))) && (!fifo_strstr_pgm(&in_fifo, PSTR("Found"))));
while ((Timeout > 0)||(!fifo_strstr_pgm(&in_fifo, PSTR("Inquiry Results:\r\n"))));
#ifdef DEBUG
debug_pgm(PSTR("Suchen ende2"));
 
 
if (Timeout == 0) debug_pgm(PSTR("Timeout"));
 
if (fifo_is_full(&in_fifo)) debug_pgm(PSTR("Fifo Overrun, zuviele BT Devices"));
#endif
while (!fifo_is_empty(&in_fifo))
{
// Get next line
while (!fifo_cmp_pgm(&in_fifo, PSTR("\r\n")))
{
fifo_read(&in_fifo, bufferhead);
bufferhead++;
}
// terminate string
*bufferhead = 0;
 
//reset bufferhead
bufferhead = buffer;
 
if (strlen(buffer) == 0)
continue; //the empty line before end of inquiry
 
if (strstr_P(buffer, PSTR("Inquiry End")))
// if (searchend)
{
fifo_clear(&in_fifo);
// test();
return true;
}
 
 
copy_DevName(&buffer[3],device_list[pos].DevName);
device_list[pos].DevName[14] = 0; // Stringende
 
copy_mac(&buffer[3], device_list[pos].mac);
 
// for (uint16_t i = 0; i < 15; i++)
// {
//
//// USART_putc((device_list[pos].DevName[i]));
// lcd_print_hex((device_list[pos].DevName[i]),0);
// }
// USART_putc('\n');
//
//
// for (uint16_t i = 0; i < 12; i++)
// {
//
// USART_putc((device_list[pos].mac[i]));
//
// }
//
// USART_putc('\n');
// USART_putc('\r');
pos++;
}
 
return false;
}
 
device_info device_list[NUTS_LIST];
 
void bt_downlink_init(void)
{
 
 
fifo_init(&in_fifo, bt_buffer, IN_FIFO_SIZE);
_delay_ms(100);
// debug_pgm(PSTR("bt_init"));
uart_receive();
fifo_clear(&in_fifo);
// send_cmd(BT_TEST, NULL);
debug_pgm(PSTR("Downlink_init Start"));
// if (BTIsSlave == true) // nur Init wenn BT ist Slave
// {
comm_mode = BT_NOECHO;
 
if (!send_cmd (BT_SET_ECHO,NULL)) {
debug_pgm(PSTR("Downlink_init:Couldn't set Echo!"));
 
}
 
comm_mode = BT_CMD;
if (!send_cmd(BT_SET_ANSWER,NULL)) {
debug_pgm(PSTR("Downlink_init:Couldn't set Answer!"));
 
}
// send_cmd(BT_TEST, NULL);
 
if (!bt_set_mode(BLUETOOTH_MASTER)==BLUETOOTH_MASTER)
 
{
// debug_pgm(PSTR("Downlink_init:Couldn't set master!"));
// return;
}
#ifdef DEBUG
debug_pgm(PSTR("Downlink_init:master set is "));
#endif
 
WriteBTMasterFlag(); // Master merken
 
}
 
 
void bt_searchDevice(void) //Bluetoothgeräte suchen
 
{
 
char result[8][12];
 
 
 
for (uint8_t i = 0; i < 8; i++) // alte Liste löschen
for (uint8_t j = 0; j < 12; j++)
result[i][j] = 0;
#ifdef DEBUG
debug_pgm(PSTR("Search Device:BT_discover"));
#endif
if (bt_discover(result))
{
bt_devicecount = 0;
#ifdef DEBUG
debug_pgm(PSTR("Search Device:Search ok"));
#endif
for (uint8_t i = 0; i < 8; i++)
{
if (valid(i))
bt_devicecount++;
else break;
}
}
#ifdef DEBUG
else
 
debug_pgm(PSTR("Search Device:Search failed"));
#endif
// }
 
}
 
 
//--------------------------------------------------------------
uint16_t bt_receiveNMEA(void)
{
 
char received;
static uint8_t line_flag = 1;
static char* ptr_write = rx_buffer;
 
uart_receive();
 
if (fifo_is_empty(&in_fifo))
// continue;
// break;
return true;
 
 
 
if (update_comm_mode(0) != BT_DATA)
{
#ifdef DEBUG
debug_pgm(PSTR("not connected"));
#endif
return false;
}
 
// We have a connection
// if (timeout_ms == 0)
// timeout_ms += 2000;
 
if (fifo_is_empty(&in_fifo))
// continue;
// break;
return true;
 
fifo_read(&in_fifo, &received);
// Find starting point of packet
if (rx_ready == 0)
{
if ((received == start) && line_flag)
{ // start '$'
line_flag = 0; // New line has begun
ptr_write = rx_buffer; // Begin at start of buffer
rx_len = 0;
}
if (line_flag == 0)
{ // Are we receiving a line?
*ptr_write = received; // Add current byte
rx_len++;
 
// GPS Datensatzende
 
if (received == end)
{ // End of MK-GPS or NMEA-line?
line_flag = 1; // Yes, start new line
rx_ready = 1; // Lock buffer until line has been processed
}
 
 
}
 
ptr_write++;
if(rx_len == RXD_BUFFER_SIZE) line_flag = 1; // Line too long? Try again
}//if (rx_ready == 0)
return true;
}
//
// return false;
//}
 
//#endif
 
 
 
 
#endif
#endif
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/bluetooth.h
0,0 → 1,144
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _BLUETOOTH_H_
#define _BLUETOOTH_H_
 
#include <avr/io.h>
//#include <common.h>
 
 
#define SQUIRREL
#define NUTS_LIST 16
#define EXTENSIONS_LIST 16
#define RXD_BUFFER_SIZE 150
//void InitBT(void);
 
extern char rx_buffer[RXD_BUFFER_SIZE];
extern volatile uint8_t rx_len;
extern volatile uint8_t rx_ready;
extern uint8_t rx_GPS;
//extern static char start = '$';
//extern static char end = '\n';
extern char data_decode[RXD_BUFFER_SIZE];
extern volatile uint16_t rx_timeout;
extern uint8_t bt_rxerror;
 
typedef struct _device_info device_info;
 
// device info struct, holds mac , class and extensions + values of a device
struct _device_info
{
char DevName[20];
char mac[14];
 
// uint8_t class;
// uint8_t extension_types[EXTENSIONS_LIST];
// uint16_t values_cache[EXTENSIONS_LIST];
};
extern uint8_t bt_devicecount;
extern device_info device_list[NUTS_LIST];
 
#define valid(num) (num < NUTS_LIST && (device_list[num].mac[0] != 0 || device_list[num].mac[1] != 0 || device_list[num].mac[2] != 0 || device_list[num].mac[3] != 0 || device_list[num].mac[4] != 0 || device_list[num].mac[5] != 0 || device_list[num].mac[6] != 0 || device_list[num].mac[7] != 0 || device_list[num].mac[8] != 0 || device_list[num].mac[9] != 0 || device_list[num].mac[10] != 0 || device_list[num].mac[11] != 0))
 
extern uint16_t bt_receiveNMEA(void);
 
//extern static communication_mode_t update_comm_mode(uint16_t timeout_ms);
 
// Bluetooth mode ENUM
typedef enum
{
BLUETOOTH_MASTER, // < Master Mode (to create outgoinng connections).
BLUETOOTH_SLAVE // < Slave Mode (to wait for incoming connections).
} bt_mode_t;
 
 
// init bluetooth driver
// @return always true
//
//extern uint16_t bt_init (void (*upate_percentage) (uint16_t));
extern uint16_t bt_init (void);
 
// Set the Bluetooth mode
// @param mode bt_mode_t Bluetooth Mode ENUM (BLUETOOTH_MASTER or BLUETOOTH_SLAVE)
// @return true if mode change was succesful, false if not
//
extern uint16_t bt_set_mode (const bt_mode_t mode);
 
// recieve data over bluetooth
// @param data pointer to memory for data storage
// @param length value of length after call holds the actual recived data length
// @param timeout_ms timeout in ms after the recive function aborts and returns with false
// @return false if recived length > length parameter or it timeouted, true otherwise
//
extern uint16_t bt_receive (void * data, uint8_t length, uint16_t timeout_ms);
 
// send data over bluetooth
// @param data pointer to the data to send
// @param length length of the data to be send
// @return true if sendingn was successful, false otherwise
//
extern uint16_t bt_send (void * data, const uint8_t length);
 
// squirrelt only functions
#ifdef SQUIRREL
 
// open bluetoot connection (only one at a time possible)
// @param address connection is opened to this device mac address
// @return true if connection was established, false otherwise
//
extern uint16_t bt_connect (const char *address);
 
// closes bluetooth connection
// @return false if failed, true otherwise
//
extern uint16_t bt_disconnect (void);
 
// discover bluetooth devices
// @param result in a 2 dimensional array first index are devicecs (max 8) second is mac address string
// @param update_callback to inform of progress (in % from 0 to 100)
// @return true if successful, false if error occured
//
extern uint16_t bt_discover (char result[8][12]);
//extern uint16_t bt_discover (char result[8][12], void (*update_callback)(const uint16_t progress));
 
extern void bt_downlink_init(void); // Auf Master stellen für Devicesuche und GPS Empfang
 
extern void bt_searchDevice(void); //Bluetoothgeräte suchen
 
#endif // SQUIRREL
 
 
#endif
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/connect.c
0,0 → 1,403
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/pgmspace.h>
#include "lcd.h"
#include "timer.h"
#include "eeprom.h"
#include "messages.h"
#include "lipo.h"
#include "main.h"
 
#if defined HWVERSION3_9
//--------------------------------------------------------------
void Change_Output(uint8_t UartMode) // Schaltet die Rx/Tx Richtungen
{
// hiermit werden die 74HTC125 (IC5) Gatter geschaltet
clr_USB2FC(); // PC2 aus
clr_USB2Wi(); // PB0 aus
clr_Uart02FC(); // PC6 aus
clr_Uart02Wi(); // PC5 aus
 
 
switch (UartMode)
{
case USB2FC:
UCSR1B &= ~(1<<RXEN1);
UCSR1B &= ~(1<<TXEN1);
UCSR1B &= ~(1<<RXCIE1);
 
DDRD &= ~(1<<DDD2); // Pins auf Eingang setzen
DDRD &= ~(1<<DDD3);
PORTD &= ~(1<<PIND2); // Pullup aus // MartinR: von PD auf PIND geändert
PORTD &= ~(1<<PIND3); // MartinR: von PD auf PIND geändert
 
set_USB2FC();
break;
 
case Uart02Wi:
set_Uart02Wi();
break;
 
case Uart02FC:
set_Uart02FC();
break;
 
case USB2Wi:
UCSR1B &= ~(1<<RXEN1);
UCSR1B &= ~(1<<TXEN1);
UCSR1B &= ~(1<<RXCIE1);
 
DDRD &= ~(1<<DDD2); // Pins auf Eingang setzen
DDRD &= ~(1<<DDD3);
PORTD &= ~(1<<PIND2); // Pullup aus // MartinR: von PD auf PIND geändert
PORTD &= ~(1<<PIND3); // MartinR: von PD auf PIND geändert
 
set_USB2Wi();
break;
}
 
}
 
 
//--------------------------------------------------------------
// Function: BT2FC()
// Purpose: Connect BT direct to FC-Kabel (SV2 as MKUSB)
// Returns:
//--------------------------------------------------------------
void Port_BT2FC(void)
{
lcd_cls ();
 
if(UseBT == true)
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" BT --> Kabel an FC "), 2);
lcd_puts_at(0, 1, strGet(CONNECT15), 0);
// lcd_printp_at (0, 3, PSTR("PC mit BT verb."), 0);
lcd_puts_at(0, 3, strGet(CONNECT16), 0);
// lcd_printp_at (0, 4, PSTR("PKT-Kabel an FC"), 0);
lcd_puts_at(0, 4, strGet(CONNECT17), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten"), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
set_BTOn();
 
Change_Output(USB2FC);
do
{
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_BTOff();
return;
}
else
{
// lcd_printp_at (0, 0, PSTR("Es ist kein BTM-222 "), 0);
// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
lcd_puts_at(0, 1, strGet(CONNECT12), 0);
lcd_puts_at(0, 1, strGet(CONNECT13), 0);
lcd_puts_at(0, 2, strGet(CONNECT7), 0);
lcd_puts_at(0, 3, strGet(CONNECT8), 0);
lcd_puts_at(0, 4, strGet(CONNECT9), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
return;
}
}
 
 
//--------------------------------------------------------------
// Function: BT2Wi()
// Purpose: Connect BT direct to Wi.232
// Returns:
//--------------------------------------------------------------
void Port_BT2Wi(void)
{
 
lcd_cls ();
 
// if((UseBT == true) && (UseWi == true))6.1.2012 CB Abfrage entfernt, damit die Funktion auch ohne Module geht
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" BT --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT18), 2);
// lcd_printp_at (0, 3, PSTR("PC mit BT verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT16), 0);
// lcd_printp_at (0, 4, PSTR("Wi.232 an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT19), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
 
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
set_BTOn();
 
Change_Output(USB2Wi);
do
{
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_BTOff();
return;
}
// else
// {
//// lcd_printp_at (0, 0, PSTR("Es ist kein BTM-222 "), 0);
//// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
//// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
//// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
//// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
//
// lcd_puts_at(0, 0, strGet(CONNECT12), 0);
// lcd_puts_at(0, 1, strGet(CONNECT13), 0);
// lcd_puts_at(0, 2, strGet(CONNECT7), 0);
// lcd_puts_at(0, 3, strGet(CONNECT8), 0);
// lcd_puts_at(0, 4, strGet(CONNECT9), 0);
// lcd_puts_at(12, 7, strGet(ENDE), 0);
//// lcd_printp_at (12, 7, PSTR("Ende"), 0);
//
// while(!get_key_press (1 << KEY_ESC));
// get_key_press(KEY_ALL);
//
// return;
// }
}
 
 
//--------------------------------------------------------------
// Function: FC2CFG_BT()
// Purpose: Connect FC (Tx1 Pin3, Rx1 Pin4) direct to BT
// Returns:
//--------------------------------------------------------------
void Port_FC2CFG_BT(void)
{
 
lcd_cls ();
lcd_printp_at (0, 0, PSTR("BTM-222 Konfigurieren"), 2);
lcd_printp_at (0, 1, PSTR("FC > MK-USB > BTM-222"), 2);
lcd_printp_at (0, 3, PSTR("MK-USB an PC anschl. "), 0);
lcd_printp_at (0, 4, PSTR("Zwischen MK-USB und "), 0);
lcd_printp_at (0, 5, PSTR("PKT ein gekreuztes "), 0);
lcd_printp_at (0, 6, PSTR("Kabel anschliessen. "), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
set_BTOn();
Change_Output(USB2FC);
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
set_BTOff();
return;
}
 
 
//--------------------------------------------------------------
// Function: USB2FC()
// Purpose: Connect USB direct to FC-Kabel (SV2 as MKUSB)
// Returns:
//--------------------------------------------------------------
void Port_USB2FC(void)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Kabel an FC "), 2);
lcd_puts_at(0, 1, strGet(CONNECT20), 0);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
// lcd_printp_at (0, 4, PSTR("PKT-Kabel an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT17), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
Change_Output(USB2FC);
do
{
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
 
//--------------------------------------------------------------
// Function: USB2Wi()
// Purpose: Connect USB direct to Wi.232
// Returns:
//--------------------------------------------------------------
void Port_USB2Wi(void)
{
 
lcd_cls ();
// if(UseWi == true) // 6.1.2012 CB Abfrage entfernt, damit die Funktion auch ohne Module geht
{
// lcd_printp_at (0, 0, PSTR(" MK-USB Funktion "), 2);
lcd_puts_at(0, 0, strGet(CONNECT14), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT22), 2);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden "), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
// lcd_printp_at (0, 4, PSTR("Wi.232 an FC "), 0);
lcd_puts_at(0, 4, strGet(CONNECT19), 0);
// lcd_printp_at (0, 5, PSTR("MK-Tool starten "), 0);
lcd_puts_at(0, 5, strGet(CONNECT23), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
Change_Output(USB2Wi);
do
{
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
}
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
// else
// {
//// lcd_printp_at (0, 0, PSTR("Es ist kein Wi.232 "), 0);
//// lcd_printp_at (0, 1, PSTR("Modul eingebaut! "), 0);
//// lcd_printp_at (0, 3, PSTR("Wenn doch, dann bitte"), 0);
//// lcd_printp_at (0, 4, PSTR("das Modul zuerst im "), 0);
//// lcd_printp_at (0, 5, PSTR("Setupmenü aktivieren."), 0);
//// lcd_printp_at (12, 7, PSTR("Ende"), 0);
// lcd_puts_at(0, 0, strGet(CONNECT5), 0);
// lcd_puts_at(0, 1, strGet(CONNECT6), 0);
// lcd_puts_at(0, 2, strGet(CONNECT7), 0);
// lcd_puts_at(0, 3, strGet(CONNECT8), 0);
// lcd_puts_at(0, 4, strGet(CONNECT9), 0);
// lcd_puts_at(12, 7, strGet(ENDE), 0);
// while(!get_key_press (1 << KEY_ESC));
// get_key_press(KEY_ALL);
//
// return;
// }
}
 
//--------------------------------------------------------------
// Function: USB2CFG_Wi()
// Purpose: Connect USB direct to Wi.232 in Progmode
// Returns:
//--------------------------------------------------------------
void Port_USB2CFG_Wi(void)
{
 
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wi.232 Konfigurieren"), 2);
lcd_puts_at(0, 0, strGet(CONNECT24), 2);
// lcd_printp_at (0, 1, PSTR(" USB --> Wi.232 "), 2);
lcd_puts_at(0, 1, strGet(CONNECT22), 2);
// lcd_printp_at (0, 3, PSTR("PC mit USB verbinden."), 0);
lcd_puts_at(0, 3, strGet(CONNECT21), 0);
lcd_printp_at (0, 4, PSTR("Radiotronix Wi.232DTS"), 0);
lcd_printp_at (0, 5, PSTR("Evaluation (868MHz) "), 0);
// lcd_printp_at (0, 6, PSTR("Programm starten. "), 0);
lcd_puts_at(0, 6, strGet(CONNECT25), 0);
lcd_puts_at(12, 7, strGet(ESC), 0);
// lcd_printp_at (12, 7, PSTR("Esc"), 0);
 
Change_Output(USB2Wi);
 
set_WI232CMD(); // Port D6 = CMD
 
while(!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
clr_WI232CMD(); // Port D6 = CMD
 
if (U02SV2 == 1)
Change_Output(Uart02FC);
else
Change_Output(Uart02Wi);
 
return;
}
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/connect.h
0,0 → 1,48
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _CONNECT_H
#define _CONNECT_H
 
void Change_Output(uint8_t UartMode);
 
void Port_BT2Wi(void);
void Port_BT2FC(void);
void Port_FC2CFG_BT(void);
 
void Port_USB2FC(void);
void Port_USB2Wi(void);
void Port_USB2CFG_Wi(void);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/cpu.h
0,0 → 1,41
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _CPU_H
#define _CPU_H
 
// Quarz Frequenz in Hz
//#define F_CPU 20000000UL // MartinR: in Makefile
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/debug.c
0,0 → 1,375
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <string.h>
 
#include "main.h"
//#include "menu.h"
#include "lcd.h"
#include "usart.h"
#include "debug.h"
#include "timer.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
 
#ifdef HWVERSION3_9
 
 
#define TIMEOUT 200 // 2 sec
#define ANALOGTIME 20 // 200 ms
 
// WARNING: this work for NC & FC only
// if current_hardware == MK3MAG or MKGPS the access is outside of the array...
uint8_t AnalogNames[2][32][16 + 1]; // 32 names, 16 characters + 1 0x00
uint8_t AnalogNamesRead[2] = {0,0};
 
//--------------------------------------------------------------
//
void GetAnalogNames (void)
{
uint8_t i = AnalogNamesRead[current_hardware - 1];
uint8_t t = 0;
 
lcd_cls ();
lcd_printp_at (0, 3, PSTR("Reading"), 0);
lcd_printp_at (0, 4, PSTR("Analog Names: "), 0);
 
mode = 'A'; // read Names
_delay_ms(200);
rxd_buffer_locked = FALSE;
 
timer = ANALOGTIME;
 
while (i < 32)
{
SendOutData ('a', ADDRESS_ANY, 1, &i, 1);
while (!rxd_buffer_locked && timer);
if (timer)
{
Decode64 ();
if (i == *pRxData)
{
write_ndigit_number_u(14, 4, i, 2, 0,0);
memcpy (AnalogNames[current_hardware - 1][*pRxData], (uint8_t *) pRxData + 1, 16);
AnalogNames[current_hardware - 1][*pRxData][16] = 0;
i++;
t = 0;
}
else
{
_delay_ms (100);
}
 
timer = ANALOGTIME;
rxd_buffer_locked = FALSE;
}
else
{ // timeout occured
t++;
timer = ANALOGTIME;
 
if (t >= 50)
{
lcd_printp_at (0, 2, PSTR("ERROR: no data"), 0);
 
timer = 100;
while (timer > 0);
break;
}
}
}
 
AnalogNamesRead[current_hardware - 1] = i;
 
#if 0
if (timer)
{
for (page = 0; page < 5; page++)
{
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
}
while (!get_key_press (1 << KEY_ESC)); // ESC
get_key_press(KEY_ALL);
}
}
//return;
#endif
}
 
 
//--------------------------------------------------------------
//
void display_debug (void)
{
uint8_t i = 0;
uint8_t tmp_dat;
uint8_t page = 0;
 
DebugData_t *DebugData;
 
lcd_cls ();
 
timer = TIMEOUT;
 
if (AnalogNamesRead[current_hardware - 1] < 32)
{
GetAnalogNames ();
}
 
if (!timer)
{
return;
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
 
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
abo_timer = ABO_TIMEOUT;
 
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
 
do
{
if (rxd_buffer_locked)
{
Decode64 ();
DebugData = (DebugData_t *) pRxData;
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_write_number_u_at (5, 7, page + 1);
switch (current_hardware)
{
case FC:
lcd_printp_at (3, 7, PSTR("FC"), 0);
lcd_printp_at (19, 7, PSTR("NC"), 0);
break;
 
case NC:
lcd_printp_at (3, 7, PSTR("NC"), 0);
lcd_printp_at (19, 7, PSTR("FC"), 0);
break;
 
default:
lcd_printp_at (19, 7, PSTR("?"), 0);
break;
}
 
for (i = 0; i < 7; i++)
{
//lcd_print_at (0, i, AnalogNames[i + page * 7], 0);
uint8_t size =0;
if( DebugData->Analog[i + page * 7] < -9999)
{
size = 6;
}
else if ( DebugData->Analog[i + page * 7] < -999)
{
size = 5;
}
else if ( DebugData->Analog[i + page * 7] < -99)
{
size = 4;
}
else if ( DebugData->Analog[i + page * 7] < 999)
{
size = 3;
}
else if ( DebugData->Analog[i + page * 7] < 9999)
{
size = 4;
}
else
{
size = 5;
}
write_ndigit_number_s (21-size, i, DebugData->Analog[i + page * 7], size, 0,0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
timer = TIMEOUT;
rxd_buffer_locked = FALSE;
}
 
if (!abo_timer)
{ // renew abo every 3 sec
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
abo_timer = ABO_TIMEOUT;
}
 
if (get_key_press (1 << KEY_MINUS))
{
page--;
if (page > 4)
{
page = 4;
}
lcd_cls ();
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
else if (get_key_press (1 << KEY_PLUS))
{
page++;
if (page > 4)
{
page = 0;
}
lcd_cls ();
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
if ((hardware == NC) && get_key_press (1 << KEY_ENTER))
{
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
_delay_ms (200);
 
if (current_hardware == NC)
{
SwitchToFC();
 
timer = TIMEOUT;
}
else
{
SwitchToNC();
 
timer = TIMEOUT;
}
 
_delay_ms (200);
 
if (AnalogNamesRead[current_hardware - 1] < 32)
{
GetAnalogNames ();
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
 
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
lcd_cls ();
page = 0;
 
for (i = 0; i < 7; i++)
{
lcd_print_at (0, i, AnalogNames[current_hardware - 1][i + page * 7], 0);
if (page == 4 && i > 3)
{
for (i = 4; i < 7; i++) // Linie 4, 5, 6 loeschen
{
lcd_cls_line (0, i, 21);
}
i = 7;
}
}
}
}
while (!get_key_press (1 << KEY_ESC) && timer); // ESC
get_key_press(KEY_ALL);
 
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
if (!timer)
{ // timeout occured
lcd_cls ();
lcd_printp_at (0, 2, PSTR("ERROR: no data"), 0);
 
timer = 100;
while (timer > 0);
}
SwitchToNC();
}
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/debug.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _DEBUG_H
#define _DEBUG_H
 
extern uint8_t AnalogNamesRead[2];
 
void display_debug(void);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/display.c
0,0 → 1,180
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
 
#include "main.h"
#include "lcd.h"
#include "usart.h"
#include "timer.h"
#include "messages.h"
 
#include "mk-data-structs.h"
 
#define TIMEOUT 500 // 5 sec
 
 
void display_data (void)
{
uint8_t cmd;
uint8_t flag = 0;;
 
mode = 'H';
 
lcd_cls ();
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
if (current_hardware == NC)
{
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
}
else
{
if (hardware == FC)
{
lcd_printp_at (0, 0, PSTR(" Display "), 2);
lcd_printp_at (19, 7, PSTR(" "), 0);
}
else
{
lcd_printp_at (0, 0, PSTR(" Flight-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("NC"), 0);
}
}
 
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
cmd = 0xfc; // Home = first page
 
do
{
SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
cmd = 0xff;
//LED6_TOGGLE;
_delay_ms (250);
 
if (rxd_buffer_locked)
{
Decode64 ();
flag = 1;
 
if (!hardware)
{ // hardware was not detected at startup
hardware = rxd_buffer[1] - 'a';
if (hardware == NC)
{
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
current_hardware = NC;
}
else
{
lcd_printp_at (0, 0, PSTR(" Display "), 2);
lcd_printp_at (19, 7, PSTR(" "), 0);
current_hardware = FC;
}
}
 
#if 0
rxd_buffer[24] = 0;
 
lcd_print_at (0, rxd_buffer[3] + 1, (uint8_t *) &rxd_buffer[4], 0);
#else
rxd_buffer[83] = 0;
 
print_display_at (0, 2, (uint8_t *) &rxd_buffer[3]);
#endif
 
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
}
 
if (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
cmd = 0xfe; // next page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
else if (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
cmd = 0xfd; // previous page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
else if ((hardware == NC) && get_key_press (1 << KEY_ENTER))
{
if (current_hardware == NC)
{
SwitchToFC();
 
//timer = TIMEOUT;
lcd_printp_at (0, 0, PSTR(" Flight-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("NC"), 0);
}
else
{
SwitchToNC();
 
//timer = TIMEOUT;
lcd_printp_at (0, 0, PSTR(" Navi-Ctrl Display "), 2);
lcd_printp_at (19, 7, PSTR("FC"), 0);
}
cmd = 0xfc; // Home = first page
//SendOutData('h', ADDRESS_ANY, 1, &cmd, 1);
//cmd = 0;
}
}
while (!get_key_press (1 << KEY_ESC) && timer);
get_key_press(KEY_ALL);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
if (!timer)
{ // timeout occured
if (flag)
{
lcd_cls ();
}
lcd_printp_at (0, 2, PSTR("Fehler: Keine Daten"), 0);
 
timer = 100;
while (timer > 0);
}
SwitchToNC();
}
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/display.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _DISPLAY_H
#define _DISPLAY_H
 
void display_data (void);
 
#endif
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/eeprom.c
0,0 → 1,482
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <avr/eeprom.h>
#include <stdbool.h>
#include <avr/wdt.h>
#include "lcd.h"
#include "main.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "mk-data-structs.h"
#include "connect.h"
 
 
//--------------------------------------------------------------
//
 
uint8_t EE_LowBat EEMEM = 137; // 13,7V
uint8_t EE_DisplayTimeout EEMEM = 0; // Display immer an
uint8_t EE_DisplayLanguage EEMEM = 254; // Default ungesetzt
uint8_t EE_WiTXRXChannel EEMEM = 1; // Kanal 1 MK Standard
uint8_t EE_WiNetworkGroup EEMEM = 66; // Gruppe 66 MK Standard
uint8_t EE_WiNetworkMode EEMEM = NetMode_Normal; // MK Standard;
uint8_t EE_WiTXTO EEMEM = TWaitTime16; // MK Standard
uint8_t EE_WiUartMTU EEMEM = UartMTU64; // MK Standard
uint8_t EE_LCD_Orientation EEMEM = 0; // normale Ansicht
uint8_t EE_LCD_DisplayMode EEMEM = 0; // Normal
uint8_t EE_LCD_Kontrast EEMEM = 27; // Kontrast normal
uint8_t EE_LCD_Helligkeit EEMEM = 100; // Helligkeit in %gkeit in %
uint8_t EE_USBBT EEMEM = 0; // USB Betrieb
uint8_t EE_U02SV2 EEMEM = 1; // SV2 (Kabel) Standard
uint8_t EE_Debug EEMEM = 0; // kein Debug
uint8_t EE_UseWi EEMEM = true; // Wi.232 eingebaut?
uint8_t EE_UseBT EEMEM = true; // BT-222 eingebaut?
uint8_t EE_BTIsSlave EEMEM = true; // BT-222 Slave gesetzt?
uint8_t EE_WiIsSet EEMEM = false; // Flag für die Initialisierung Wi232
uint8_t EE_BTIsSet EEMEM = false; // Flag für die Initialisierung Bluetooth
uint8_t EE_PKT_IdleBeep EEMEM = 0; // kein Piepsen bei Inaktivität
uint8_t EE_PKT_StartInfo EEMEM = true; // Startinformationen anzeigen
uint16_t EE_Lipo_UOffset EEMEM = 0; // Offset für die Lipospannugsmessung
uint8_t EE_PKT_Accutyp EEMEM = true; // True = Lipo, False = LiON
uint8_t EE_OSD_RCErrorbeep EEMEM = true; //Empfangsausffallwarnung im OSD Screen
uint8_t EE_OSD_InvertOut EEMEM = false; // Invertierte Anzeige Out1 und Out2
uint8_t EE_OSD_LEDform EEMEM = 1; // Form der Anzeige ( + oder schwarz)
uint8_t EE_OSD_SendOSD EEMEM = false; // Sende OSD-Daten an SV2
uint8_t EE_OSD_Fallspeed EEMEM = 0; // Maximal Sinkrate, für Warnmeldung
uint8_t EE_OSD_VarioBeep EEMEM = 1; // Vario Beep im OSD Screen
uint8_t EE_OSD_HomeMKView EEMEM = true; // Home Circle from MK-View
uint16_t EE_OSD_mAh_Warning EEMEM = 10000; //Warnschwelle für mAh
uint8_t EE_OSD_ScreenMode EEMEM = 0; //Variante des OSD-Screen
uint8_t EE_OSD_LipoBar EEMEM = 0; //Bargraphanzeige für MK Lipo
uint8_t EE_PKT_Baudrate EEMEM = Wi232_57600; // Baudrate für BT und Wi232, siehe Wi223.h
uint16_t EE_FM_Refresh EEMEM = 500; // FollowMe interval
uint16_t EE_FM_Speed EEMEM = 30; // FollowMe Speed in m/s *0.1
uint16_t EE_FM_Radius EEMEM = 5; // Waypoint Tolerance Radius in meter
 
uint8_t EEMEM EE_BTPin[bt_pin_length + 1];
uint8_t EEMEM EE_BTName[bt_name_length + 1];
 
uint8_t EEMEM EE_gps_UsedDevName[20]; // benutztes GPS Device Name
uint8_t EEMEM EE_gps_UsedMac[14]; // benutztes GPS Device Mac Adresse
uint8_t EEMEM EE_gps_UseGPS; // ist GPS aktiv?
uint8_t EEMEM EE_gps_UsedGPSMouse; // GPS Maustyp
 
uint32_t EE_LastLongitude EEMEM = 0;
uint32_t EE_LastLatitude EEMEM = 0;
 
WPListDirectory EEWPDirectory[NumberOfWPLists] EEMEM;
WayPoints EEWayPointList[NumberOfWaypoints] EEMEM;
 
 
uint8_t EE_PKTVersion EEMEM = EEpromVersion;
 
 
volatile uint8_t DisplayTimeout;
volatile uint8_t DisplayLanguage;
volatile uint8_t WiTXRXChannel;
volatile uint8_t WiNetworkGroup;
volatile uint8_t WiNetworkMode;
volatile uint8_t WiTXTO;
volatile uint8_t WiUartMTU;
volatile uint8_t LCD_ORIENTATION;
volatile uint8_t LCD_DisplayMode;
volatile uint8_t LCD_Kontrast;
volatile uint8_t LCD_Helligkeit;
volatile uint8_t USBBT;
volatile uint8_t U02SV2;
volatile uint8_t Debug;
volatile uint8_t UseWi; // Wi232 wird genutzt
volatile uint8_t UseBT; // BT wird genutzt
 
volatile uint8_t WiIsSet; // Wi232 ist initialisiert
volatile uint8_t BTIsSet; // BT ist initialisiert
volatile uint8_t BTIsSlave; // Slave Flag
char bt_pin[bt_pin_length + 1]; // BT Pinnummer
char bt_name[bt_name_length + 1]; // BT Name
 
char gps_UsedDevName[20]; // benutztes GPS Device Name
char gps_UsedMac[14]; // benutztes GPS Device Mac Adresse
volatile uint8_t gps_UseGPS; // ist GPS aktiv?
volatile uint8_t gps_UsedGPSMouse; // GPS Maustyp
 
volatile uint32_t LastLongitude; // Letzte Position
volatile uint32_t LastLatitude;
volatile uint8_t PKT_IdleBeep;
volatile uint8_t PKT_StartInfo;
volatile uint16_t Lipo_UOffset; // Offset für die Lipospannugsmessung
volatile uint8_t PKT_Accutyp; // verwendeter Akkutyp
volatile uint8_t OSD_RCErrorbeep; //Empfangsausffallwarnung im OSD Screen
volatile uint8_t OSD_InvertOut; // Out1/2 invertiert anzeigen
volatile uint8_t OSD_LEDform; // Form der Anzeige ( + oder schwarz)
volatile uint8_t OSD_SendOSD; // OSD Daten an SV2 senden
volatile uint8_t OSD_Fallspeed; // maximale Sinkrate
volatile uint8_t OSD_VarioBeep; // Vario Beep im OSD Screen
volatile uint8_t OSD_HomeMKView; // Home Circle from MK-View
volatile uint16_t OSD_mAh_Warning; // mAh Warnschwelle
volatile uint8_t OSD_ScreenMode; //Variante des OSD-Screen
volatile uint8_t OSD_LipoBar; //Bargraphanzeige für MK Lipo
volatile uint8_t PKT_Baudrate; // Baudrate für BT und Wi232
volatile uint16_t FM_Refresh; // FollowMe interval
volatile uint16_t FM_Speed; // FollowMe Speed in m/s *0.1
volatile uint16_t FM_Radius; // Waypoint Tolerance Radius in meter
volatile WayPoints PKTWayPoint; // Waypointdaten für einen Waypoint
volatile WPListDirectory PKTWayPointDirectory; // Inhaltsverzeichnis der Listen
 
 
 
//--------------------------------------------------------------
//
void WriteWiInitFlag(void)
{
WiIsSet = true;
eeprom_write_byte(&EE_WiIsSet, WiIsSet);
 
}
 
 
//--------------------------------------------------------------
//
void WriteBTInitFlag(void)
{
BTIsSet = true;
eeprom_write_byte(&EE_BTIsSet, BTIsSet);
 
}
//--------------------------------------------------------------
//
void WriteBTSlaveFlag(void)
{
BTIsSlave = true;
eeprom_write_byte(&EE_BTIsSlave, BTIsSlave);
 
}
//--------------------------------------------------------------
//
void WriteBTMasterFlag(void)
{
BTIsSlave = false;
eeprom_write_byte(&EE_BTIsSlave, BTIsSlave);
 
}
//--------------------------------------------------------------
//
void ReadLastPosition(void)
 
{
LastLongitude = eeprom_read_dword(&EE_LastLongitude);
LastLatitude = eeprom_read_dword(&EE_LastLatitude);
}
 
 
//--------------------------------------------------------------
//
void WriteLastPosition(uint32_t ELongitude,uint32_t ELatitude)
 
{
 
eeprom_write_dword(&EE_LastLongitude,ELongitude);
eeprom_write_dword(&EE_LastLatitude,ELatitude);
}
 
 
//--------------------------------------------------------------
//
void ReadParameter (void)
{
if (eeprom_read_byte(&EE_PKTVersion) == EEpromVersion)
 
{
MK_LowBat = eeprom_read_byte (&EE_LowBat);
DisplayTimeout = eeprom_read_byte (&EE_DisplayTimeout);
DisplayLanguage = eeprom_read_byte (&EE_DisplayLanguage);
WiTXRXChannel = eeprom_read_byte (&EE_WiTXRXChannel);
WiNetworkGroup = eeprom_read_byte (&EE_WiNetworkGroup);
WiNetworkMode = eeprom_read_byte (&EE_WiNetworkMode);
WiTXTO = eeprom_read_byte (&EE_WiTXTO);
WiUartMTU = eeprom_read_byte (&EE_WiUartMTU);
LCD_ORIENTATION = eeprom_read_byte (&EE_LCD_Orientation);
LCD_DisplayMode = eeprom_read_byte (&EE_LCD_DisplayMode);
LCD_Kontrast = eeprom_read_byte (&EE_LCD_Kontrast);
LCD_Helligkeit = eeprom_read_byte (&EE_LCD_Helligkeit);
USBBT = eeprom_read_byte (&EE_USBBT);
U02SV2 = eeprom_read_byte (&EE_U02SV2);
Debug = eeprom_read_byte (&EE_Debug);
UseWi = eeprom_read_byte (&EE_UseWi);
UseBT = eeprom_read_byte (&EE_UseBT);
WiIsSet = eeprom_read_byte (&EE_WiIsSet);
BTIsSet = eeprom_read_byte (&EE_BTIsSet);
BTIsSlave = eeprom_read_byte (&EE_BTIsSlave);
PKT_IdleBeep = eeprom_read_byte (&EE_PKT_IdleBeep);
PKT_StartInfo = eeprom_read_byte (&EE_PKT_StartInfo);
Lipo_UOffset = eeprom_read_word (&EE_Lipo_UOffset);
PKT_Accutyp = eeprom_read_byte (&EE_PKT_Accutyp);
OSD_RCErrorbeep = eeprom_read_byte (&EE_OSD_RCErrorbeep);
OSD_InvertOut = eeprom_read_byte (&EE_OSD_InvertOut);
OSD_LEDform = eeprom_read_byte (&EE_OSD_LEDform);
OSD_SendOSD = eeprom_read_byte (&EE_OSD_SendOSD);
OSD_Fallspeed = eeprom_read_byte (&EE_OSD_Fallspeed);
OSD_VarioBeep = eeprom_read_byte (&EE_OSD_VarioBeep);
OSD_HomeMKView = eeprom_read_byte (&EE_OSD_HomeMKView);
OSD_mAh_Warning = eeprom_read_word (&EE_OSD_mAh_Warning);
OSD_ScreenMode = eeprom_read_byte (&EE_OSD_ScreenMode);
OSD_LipoBar = eeprom_read_byte (&EE_OSD_LipoBar);
PKT_Baudrate = eeprom_read_byte (&EE_PKT_Baudrate);
FM_Refresh = eeprom_read_word (&EE_FM_Refresh);
FM_Speed = eeprom_read_word (&EE_FM_Speed);
FM_Radius = eeprom_read_word (&EE_FM_Radius);
 
New_Baudrate = PKT_Baudrate; // Merkzellen setzen
Old_Baudrate = PKT_Baudrate;
eeprom_read_block ((void*)&bt_pin, (const void*)&EE_BTPin, bt_pin_length);
eeprom_read_block ((void*)&bt_name, (const void*)&EE_BTName, bt_name_length);
eeprom_read_block ((void*)&gps_UsedDevName, (const void*)&EE_gps_UsedDevName, 20);
eeprom_read_block ((void*)&gps_UsedMac, (const void*)&EE_gps_UsedMac, 14);
gps_UseGPS = eeprom_read_byte (&EE_gps_UseGPS);
gps_UsedGPSMouse = eeprom_read_byte (&EE_gps_UsedGPSMouse);
LastLongitude = eeprom_read_dword (&EE_LastLongitude);
LastLatitude = eeprom_read_dword (&EE_LastLatitude);
}
 
else
Delete_EEPROM();
 
}
 
//--------------------------------------------------------------
void Delete_EEPROM(void)
{
// EEPROM auf Default setzen
 
lcd_cls();
lcd_printp_at (0, 0, PSTR(" EEPROM Parameter "), 2);
lcd_printp_at (0, 1, PSTR("werden auf"), 0);
lcd_printp_at (0, 2, PSTR("Standardwerte gesetzt"), 0);
 
MK_LowBat = 137; // 13,7V
DisplayTimeout = 0; // Display immer an
DisplayLanguage = 1; // default englisch
WiTXRXChannel = 1; // Kanal 1 MK Standard
WiNetworkGroup = 66; // Gruppe 66 MK Standard
WiNetworkMode = NetMode_Normal; // MK Standard
WiTXTO = TWaitTime16; // MK Standard
WiUartMTU = UartMTU64; // MK Standard
LCD_ORIENTATION = 0; // normale Ansicht
LCD_DisplayMode = 0; // Normal
LCD_Kontrast = 20; // Kontrast normal
LCD_Helligkeit = 100; // Helligkeit in %
USBBT = 0; // USB Betrieb
U02SV2 = 0; // SV2 (Kabel) Standard
Debug = 0; // kein Debug
UseWi = true; // Wi.232 eingebaut?
UseBT = true; // BT-222 eingebaut?
WiIsSet = false; // Flag für die Initialisierung Wi232
BTIsSet = false; // Flag für die Initialisierung Bluetooth
BTIsSlave = true; // Slave Flag setzen
PKT_IdleBeep = 0; // kein Piepsen bei Inaktivität
PKT_StartInfo = true; // Startnformationen anzeigen
PKT_Accutyp = true; // True = Lipo, False= LiON
OSD_RCErrorbeep = true; // OSD Receiveerrorbeep
OSD_InvertOut = false; // LED Anzeige invertiren
OSD_LEDform = 1; // Form der Anzeige ( + oder schwarz)
OSD_SendOSD = false; // OSD Daten an SV2
OSD_Fallspeed = 40; // maximale Sinkrate
OSD_VarioBeep = 1; // Vario Beep ein
OSD_HomeMKView = true; // Home Circle from MK View
OSD_mAh_Warning = 10000; //mAh Warnschwelle
OSD_ScreenMode = 0; // Variante des OSD Screen
OSD_LipoBar = 0; //Bargraphanzeige für MK Lipo
PKT_Baudrate = Wi232_57600; //Baudrate für BT und Wi232
Lipo_UOffset = 6000; // Offset für PKT-Lipomessung
FM_Refresh = 500; // FollowMe interval
FM_Speed = 30; // FollowMe Speed in m/s *0.1
FM_Radius = 5; // Waypoint Tolerance Radius in meter
 
 
LastLongitude = 88199720;
LastLatitude = 522039630;
eeprom_write_dword(&EE_LastLongitude,LastLongitude);
eeprom_write_dword(&EE_LastLatitude,LastLatitude);
 
strcpy_P(bt_pin, PSTR("0000"));
eeprom_write_block ((const void*)&bt_pin, (void*)&EE_BTPin, bt_pin_length);
 
strcpy_P(bt_name, PSTR("PKT Cebra ")); // Wenn Name kürzer als "bt_name_length" mit Leerzeichen auffüllen
eeprom_write_block ((const void*)&bt_name, (void*)&EE_BTName, bt_name_length);
 
for(uint8_t i = 0; i < 20; i++)
{
gps_UsedDevName[i] = 0; // benutztes GPS Device Name
}
for(uint8_t i = 0; i < 14; i++)
{
gps_UsedMac[i] = '0'; // benutztes GPS Device Mac Adresse
}
gps_UseGPS = false; // ist GPS aktiv?
gps_UsedGPSMouse = 0;
 
eeprom_write_byte(&EE_WiIsSet,WiIsSet);
eeprom_write_byte(&EE_BTIsSet,BTIsSet);
eeprom_write_byte(&EE_PKTVersion,EEpromVersion);
 
WriteParameter();
 
// lcd_printp_at (0, 4, PSTR("Waypoints loeschen"), 0);
// EEWayPointList_Clear();
 
lcd_printp_at (0, 6, PSTR("!!Check Parameter!! "), 0);
lcd_printp_at (18, 7, PSTR("OK"), 0);
set_beep ( 200, 0x0080, BeepNormal);
do{}
while (!(get_key_short (1 << KEY_ENTER)));
// _delay_ms(500);
//#if defined HWVERSION3_9
// clr_V_On();
//#else
//
// wdt_enable( WDTO_250MS );
// while (1)
// {;}
//#endif
}
 
 
//--------------------------------------------------------------
//
void WriteParameter (void)
{
eeprom_write_byte (&EE_LowBat, MK_LowBat);
eeprom_write_byte (&EE_DisplayTimeout, DisplayTimeout);
eeprom_write_byte (&EE_DisplayLanguage, DisplayLanguage);
eeprom_write_byte (&EE_WiTXRXChannel, WiTXRXChannel);
eeprom_write_byte (&EE_WiNetworkGroup, WiNetworkGroup);
eeprom_write_byte (&EE_WiNetworkMode, WiNetworkMode);
eeprom_write_byte (&EE_WiTXTO, WiTXTO);
eeprom_write_byte (&EE_WiUartMTU, WiUartMTU);
eeprom_write_byte (&EE_LCD_Orientation, LCD_ORIENTATION);
eeprom_write_byte (&EE_LCD_DisplayMode, LCD_DisplayMode);
eeprom_write_byte (&EE_LCD_Kontrast, LCD_Kontrast);
eeprom_write_byte (&EE_LCD_Helligkeit, LCD_Helligkeit);
eeprom_write_byte (&EE_USBBT, USBBT);
eeprom_write_byte (&EE_U02SV2, U02SV2);
eeprom_write_byte (&EE_Debug, Debug);
eeprom_write_byte (&EE_UseWi, UseWi);
eeprom_write_byte (&EE_UseBT, UseBT);
eeprom_write_byte (&EE_WiIsSet, WiIsSet);
eeprom_write_byte (&EE_BTIsSet, BTIsSet);
eeprom_write_byte (&EE_BTIsSlave, BTIsSlave);
eeprom_write_byte (&EE_PKT_IdleBeep, PKT_IdleBeep);
eeprom_write_byte (&EE_PKT_StartInfo, PKT_StartInfo);
eeprom_write_word (&EE_Lipo_UOffset,Lipo_UOffset);
eeprom_write_byte (&EE_PKT_Accutyp, PKT_Accutyp);
eeprom_write_byte (&EE_OSD_RCErrorbeep, OSD_RCErrorbeep);
eeprom_write_byte (&EE_OSD_InvertOut, OSD_InvertOut);
eeprom_write_byte (&EE_OSD_LEDform, OSD_LEDform);
eeprom_write_byte (&EE_OSD_SendOSD, OSD_SendOSD);
eeprom_write_byte (&EE_OSD_Fallspeed, OSD_Fallspeed);
eeprom_write_byte (&EE_OSD_VarioBeep, OSD_VarioBeep);
eeprom_write_byte (&EE_OSD_HomeMKView, OSD_HomeMKView);
eeprom_write_word (&EE_OSD_mAh_Warning, OSD_mAh_Warning);
eeprom_write_byte (&EE_OSD_ScreenMode, OSD_ScreenMode);
eeprom_write_byte (&EE_OSD_LipoBar, OSD_LipoBar);
eeprom_write_byte (&EE_PKT_Baudrate, PKT_Baudrate);
eeprom_write_word (&EE_FM_Refresh,FM_Refresh);
eeprom_write_word (&EE_FM_Speed,FM_Speed);
eeprom_write_word (&EE_FM_Radius,FM_Radius);
 
eeprom_write_block ((const void*)&bt_pin, (void*)&EE_BTPin, bt_pin_length);
eeprom_write_block ((const void*)&bt_name, (void*)&EE_BTName, bt_name_length);
 
eeprom_write_block ((const void*)&gps_UsedDevName, (void*)&EE_gps_UsedDevName, 20);
eeprom_write_block ((const void*)&gps_UsedMac, (void*)&EE_gps_UsedMac, 14);
eeprom_write_byte (&EE_gps_UseGPS,gps_UseGPS);
eeprom_write_byte (&EE_gps_UsedGPSMouse,gps_UsedGPSMouse);
 
}
 
 
 
 
//--------------------------------------------------------------
//
void EEWayPointList_Clear(void) // löschen der Waypointliste im EEProm
{
uint8_t i;
PKTWayPoint.Waypoint.Position.Latitude = 0;
PKTWayPoint.Waypoint.Position.Longitude = 0;
PKTWayPoint.Waypoint.Position.Altitude = 0;
PKTWayPoint.Waypoint.Heading = 361;
 
for(i = 0; i < MAX_WPLIST_LEN; i++)
{
PKTWayPointDirectory.WPList.WPDirectory[i] = 0;
}
 
for(i = 0; i < NumberOfWaypoints; i++)
{
lcd_printp (PSTR("."), 0);
eeprom_write_byte (&EEWayPointList[i].WPIndex, i);
eeprom_write_byte (&EEWayPointList[i].Waypoint.Position.Status, INVALID);
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Latitude, (void*)&EEWayPointList[i].Waypoint.Position.Latitude, sizeof(EEWayPointList[i].Waypoint.Position.Latitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Longitude, (void*)&EEWayPointList[i].Waypoint.Position.Longitude, sizeof(EEWayPointList[i].Waypoint.Position.Longitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Position.Altitude, (void*)&EEWayPointList[i].Waypoint.Position.Altitude, sizeof(EEWayPointList[i].Waypoint.Position.Altitude));
eeprom_write_block ((const void*)&PKTWayPoint.Waypoint.Heading, (void*)&EEWayPointList[i].Waypoint.Heading, sizeof(EEWayPointList[i].Waypoint.Heading));
 
eeprom_write_byte (&EEWayPointList[i].Waypoint.ToleranceRadius, 0); // in meters, if the MK is within that range around the target, then the next target is triggered
eeprom_write_byte (&EEWayPointList[i].Waypoint.HoldTime, 0); // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
eeprom_write_byte (&EEWayPointList[i].Waypoint.Type, POINT_TYPE_INVALID);
eeprom_write_byte (&EEWayPointList[i].Waypoint.Event_Flag, 0); // future implementation
eeprom_write_byte (&EEWayPointList[i].Waypoint.AltitudeRate, 0); // no change of setpoint
}
 
for(i = 0; i < NumberOfWPLists; i++)
{
lcd_printp (PSTR("."), 0);
eeprom_write_byte (&EEWPDirectory[i].WPList.WPListnumber, i);
eeprom_write_byte (&EEWPDirectory[i].WPList.WPListAktiv, false);
eeprom_write_byte (&EEWPDirectory[i].WPList.POI_CAM_NICK_CTR, 0);
eeprom_write_byte (&EEWPDirectory[i].WPList.UsePOI, 0);
eeprom_write_block ((const void*)&PKTWayPointDirectory.WPList.WPDirectory, (void*)&EEWPDirectory[i].WPList.WPDirectory, sizeof(EEWPDirectory[i].WPList.WPDirectory));
 
}
lcd_printp (PSTR("\r\n"), 0);
 
}
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/eeprom.h
0,0 → 1,172
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _EEPROM_H
#define _EEPROM_H
 
#include <stdbool.h>
#include "mk-data-structs.h"
#include "connect.h"
 
 
 
 
//[General]
//FileVersion = 2
//NumberOfWaypoints = 15
//UsePOI = 0
//POI_CAM_NICK_CTRL = 0
 
//[POI]
//Altitude = 1
//Latitude = 46.7140763
//Longitude = 19.2507334
 
//[Waypoint1]
//Latitude = 46.7145686
//Longitude = 19.2515702
//Radius = 10
//Altitude = 15
//ClimbRate = 0
//DelayTime = 4
//WP_Event_Channel_Value = 96
//Heading = 180
 
 
#define EEpromVersion 0x70 //wird nach jeder Parametererweiterung hochgezählt
 
#define NumberOfWaypoints 55 //Anzahl der Waypoints in der EEPromliste
#define NumberOfWPLists 5 //Anzahl WP Listen im PKT
#define bt_pin_length 4
#define bt_name_length 10
 
 
#define POINT_TYPE_INVALID 255
#define POINT_TYPE_WP 0
#define POINT_TYPE_POI 1
#define INVALID 0x00
#define MAX_WPLIST_LEN 31
 
 
 
 
 
typedef struct
{
uint8_t WPIndex; // Index in der EEpromliste
Point_t Waypoint; // Waypoint
} WayPoints;
 
typedef struct
{
uint8_t WPListnumber; // Nummer der WP Liste im PKT
uint8_t WPListAktiv; // Liste aktiv
uint8_t WPDirectory[31]; // Enthält die Indexe der Waypoints im EEPROM
uint8_t UsePOI;
uint8_t POI_CAM_NICK_CTR;
 
} WPListHeader;
 
typedef struct
{
WPListHeader WPList; // Waypointliste im PKT
} WPListDirectory;
 
 
 
 
 
 
void ReadParameter (void);
void WriteParameter (void);
void ReadLastPosition(void);
void WriteLastPosition(uint32_t ELongitude,uint32_t ELatitude);
void WriteWiInitFlag(void);
void WriteBTInitFlag(void);
void WriteBTSlaveFlag(void);
void WriteBTMasterFlag(void);
void Delete_EEPROM(void);
void EEWayPointList_Clear(void); // l�schen der Waypointliste im EEProm
 
 
uint8_t MK_LowBat;
extern volatile uint8_t LCD_ORIENTATION;
extern volatile uint8_t LCD_DisplayMode;
extern volatile uint8_t LCD_Kontrast;
extern volatile uint8_t LCD_Helligkeit;
extern volatile uint8_t DisplayTimeout;
extern volatile uint8_t DisplayLanguage;
extern volatile uint8_t WiTXRXChannel;
extern volatile uint8_t WiNetworkGroup;
extern volatile uint8_t WiNetworkMode;
extern volatile uint8_t WiTXTO;
extern volatile uint8_t WiUartMTU;
extern volatile uint8_t USBBT;
extern volatile uint8_t U02SV2;
extern volatile uint8_t Debug;
extern volatile uint8_t UseWi; // Wi232 wird genutzt
extern volatile uint8_t UseBT; // BT wird genutzt
extern volatile uint8_t WiIsSet; // Wi232 ist initialisiert
extern volatile uint8_t BTIsSet; // BT ist initialisiert
extern volatile uint8_t BTIsSlave; // BT ist Slave
extern char bt_pin[bt_pin_length + 1]; // BT Pinnummer
extern char bt_name[bt_name_length + 1]; // BT Name
extern char gps_UsedDevName[20]; // benutztes GPS Device Name
extern char gps_UsedMac[14]; // benutztes GPS Device Mac Adresse
extern volatile uint8_t gps_UseGPS; // ist GPS aktiv?
extern volatile uint8_t gps_UsedGPSMouse;
extern volatile uint32_t LastLongitude;
extern volatile uint32_t LastLatitude;
extern volatile uint8_t PKT_IdleBeep;
extern volatile uint8_t PKT_StartInfo;
extern volatile uint16_t Lipo_UOffset; // Offset für die Lipospannugsmessung
extern volatile uint8_t PKT_Accutyp;
extern volatile uint8_t OSD_RCErrorbeep;
extern volatile uint8_t OSD_InvertOut; // Out1/2 invertiert anzeigen
extern volatile uint8_t OSD_LEDform; // Form der Anzeige ( + oder schwarz)
extern volatile uint8_t OSD_SendOSD; // OSD Daten an SV2 senden
extern volatile uint8_t OSD_Fallspeed; // maximale Sinkrate
extern volatile uint8_t OSD_VarioBeep; // Vario Beep im OSD Screen
extern volatile uint8_t OSD_HomeMKView; // Home Circle from MK-View
extern volatile uint16_t OSD_mAh_Warning; // mAh Warnschwelle
extern volatile uint8_t OSD_ScreenMode; //Variante des OSD-Screen
extern volatile uint8_t OSD_LipoBar; //Bargraphanzeige für MK Lipo
extern volatile uint8_t PKT_Baudrate; // Baudrate für BT und Wi232
extern volatile uint16_t FM_Refresh; // FollowMe interval
extern volatile uint16_t FM_Speed; // FollowMe Speed in m/s *0.1
extern volatile uint16_t FM_Radius; // Waypoint Tolerance Radius in meter
 
 
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/error.c
0,0 → 1,207
/*
___ ___ ___ ___ _____
/ /\ /__/\ / /\ /__/\ / /::\
/ /::\ | |::\ / /::\ \ \:\ / /:/\:\
/ /:/\:\ ___ ___ | |:|:\ / /:/\:\ \ \:\ / /:/ \:\
/ /:/~/::\ /__/\ / /\ __|__|:|\:\ / /:/ \:\ _____\__\:\ /__/:/ \__\:|
/__/:/ /:/\:\ \ \:\ / /:/ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\ \ \:\ / /:/
\ \:\/:/__\/ \ \:\ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/ \ \:\ /:/
\ \::/ \ \:\/:/ \ \:\ \ \:\ /:/ \ \:\ ~~~ \ \:\/:/
\ \:\ \ \::/ \ \:\ \ \:\/:/ \ \:\ \ \::/
\ \:\ \__\/ \ \:\ \ \::/ \ \:\ \__\/
\__\/ \__\/ \__\/ \__\/
___ ___ ___ ___ ___ ___
/ /\ / /\ /__/\ /__/\ / /\ /__/\
/ /:/ / /::\ | |::\ | |::\ / /::\ \ \:\
/ /:/ / /:/\:\ | |:|:\ | |:|:\ / /:/\:\ \ \:\
/ /:/ ___ / /:/ \:\ __|__|:|\:\ __|__|:|\:\ / /:/ \:\ _____\__\:\
/__/:/ / /\ /__/:/ \__\:\ /__/::::| \:\ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\
\ \:\ / /:/ \ \:\ / /:/ \ \:\~~\__\/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/
\ \:\ /:/ \ \:\ /:/ \ \:\ \ \:\ \ \:\ /:/ \ \:\ ~~~
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\ \ \:\/:/ \ \:\
\ \::/ \ \::/ \ \:\ \ \:\ \ \::/ \ \:\
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
 
 
**
* Error handling functions
*/
 
#include <stdbool.h>
//#include "ftdi.h"
 
#include <avr/pgmspace.h>
#include "error_driver.h"
#include "main.h"
 
//--------------------------------------------------------------
inline void _send_msg(const char *msg)
{
for (uint8_t i=0; i<255 && msg[i]!='\0'; i++)
{
errordriver_write_c(msg[i]);
}
errordriver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void send_pgm(const prog_char *msg)
{
uint8_t myByte;
myByte = pgm_read_byte(msg);
for(int i = 1; myByte != '\0'; i++)
{
errordriver_write_c(myByte);
myByte = pgm_read_byte(msg+i);
}
}
 
#ifdef DEBUG
 
 
//--------------------------------------------------------------
void error_init(void)
{
error_driver_Init();
}
 
 
//--------------------------------------------------------------
void error_putc(const char c)
{
errordriver_write_c(c);
}
 
 
//--------------------------------------------------------------
void assert (bool condition, const char *msg)
{
if (!condition)
{
send_pgm(PSTR("ASS:"));
_send_msg(msg);
}
}
 
 
//--------------------------------------------------------------
void info (const char *msg)
{
send_pgm(PSTR("INF:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void warn (const char *msg)
{
send_pgm(PSTR("WARN:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void debug (const char *msg)
{
send_pgm(PSTR("DBG:"));
_send_msg(msg);
}
 
 
//--------------------------------------------------------------
void Error (const char *msg)
{
send_pgm(PSTR("ERR:"));
_send_msg(msg);
}
#endif
 
#ifdef DEBUG
 
//--------------------------------------------------------------
void assert_pgm(bool condition, const prog_char *msg)
{
if (condition) {
send_pgm(PSTR("ASS:"));
send_pgm(msg);
errordriver_write_c('\n');
}
}
 
 
//--------------------------------------------------------------
void info_pgm(const prog_char *msg)
{
send_pgm(PSTR("INF:"));
send_pgm(msg);
errordriver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void warn_pgm(const prog_char *msg)
{
send_pgm(PSTR("WARN:"));
send_pgm(msg);
errordriver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void error_pgm(const prog_char *msg)
{
send_pgm(PSTR("ERR:"));
send_pgm(msg);
errordriver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void debug_pgm(const prog_char *msg)
{
send_pgm(PSTR("DBG:"));
send_pgm(msg);
errordriver_write_c('\n');
}
 
 
//--------------------------------------------------------------
void print_hex(uint8_t num)
{
if (num<10)
error_putc(num+48);
else
{
switch (num)
{
case 10:
error_putc('A'); break;
case 11:
error_putc('B'); break;
case 12:
error_putc('C'); break;
case 13:
error_putc('D'); break;
case 14:
error_putc('E'); break;
case 15:
error_putc('F'); break;
default:
error_putc('#'); break;
}
}
}
 
 
//--------------------------------------------------------------
void byte_to_hex(uint8_t byte)
{
uint8_t b2 = (byte & 0x0F);
uint8_t b1 = ((byte & 0xF0)>>4);
print_hex(b1);
print_hex(b2);
}
 
#endif
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/error.h
0,0 → 1,79
/*
___ ___ ___ ___ _____
/ /\ /__/\ / /\ /__/\ / /::\
/ /::\ | |::\ / /::\ \ \:\ / /:/\:\
/ /:/\:\ ___ ___ | |:|:\ / /:/\:\ \ \:\ / /:/ \:\
/ /:/~/::\ /__/\ / /\ __|__|:|\:\ / /:/ \:\ _____\__\:\ /__/:/ \__\:|
/__/:/ /:/\:\ \ \:\ / /:/ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\ \ \:\ / /:/
\ \:\/:/__\/ \ \:\ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/ \ \:\ /:/
\ \::/ \ \:\/:/ \ \:\ \ \:\ /:/ \ \:\ ~~~ \ \:\/:/
\ \:\ \ \::/ \ \:\ \ \:\/:/ \ \:\ \ \::/
\ \:\ \__\/ \ \:\ \ \::/ \ \:\ \__\/
\__\/ \__\/ \__\/ \__\/
___ ___ ___ ___ ___ ___
/ /\ / /\ /__/\ /__/\ / /\ /__/\
/ /:/ / /::\ | |::\ | |::\ / /::\ \ \:\
/ /:/ / /:/\:\ | |:|:\ | |:|:\ / /:/\:\ \ \:\
/ /:/ ___ / /:/ \:\ __|__|:|\:\ __|__|:|\:\ / /:/ \:\ _____\__\:\
/__/:/ / /\ /__/:/ \__\:\ /__/::::| \:\ /__/::::| \:\ /__/:/ \__\:\ /__/::::::::\
\ \:\ / /:/ \ \:\ / /:/ \ \:\~~\__\/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\~~\~~\/
\ \:\ /:/ \ \:\ /:/ \ \:\ \ \:\ \ \:\ /:/ \ \:\ ~~~
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\ \ \:\/:/ \ \:\
\ \::/ \ \::/ \ \:\ \ \:\ \ \::/ \ \:\
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
 
 
*
* Error handling functions.
*/
 
#ifndef __ERROR__
#define __ERROR__
 
#include <avr/pgmspace.h>
#include <stdbool.h>
#include "main.h"
 
 
#ifdef DEBUG
 
void error_init(void);
 
void error_putc(const char c);
 
void assert (bool condition, const char *msg);
void info (const char *msg);
void warn(const char *msg);
void debug(const char *msg);
void Error(const char *msg);
 
void assert_pgm(bool condition, const prog_char *msg);
void info_pgm (const prog_char *msg);
void warn_pgm(const prog_char *msg);
void debug_pgm(const prog_char *msg);
void error_pgm(const prog_char *msg);
 
void byte_to_hex(uint8_t byte);
 
#else
 
#define error_init() {}
 
 
#define error_putc(c) {}
 
#define assert(cond, msg) {}
#define info(msg) {}
#define warn(msg) {}
#define debug(msg) {}
#define error(msg) {}
 
#define assert_pgm(cond, msg) {}
#define info_pgm(msg) {}
#define warn_pgm(msg) {}
#define debug_pgm(msg) {}
#define error_pgm(msg) {}
#define byte_to_hex(byte) {}
#endif
 
#endif //__ERROR__
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/error_driver.c
0,0 → 1,27
 
 
#include <avr/pgmspace.h>
#include <stdbool.h>
//#include "cpu.h"
#include "error_driver.h"
#include "main.h"
 
#ifdef DEBUG
 
#include "usart.h"
#include "uart1.h"
 
 
void errordriver_write_c(uint8_t c)
 
 
{
USART_putc(c);
}
 
void error_driver_Init(void)
{
// USART_Init(UART_BAUD_SELECT(USART_BAUD,F_CPU));
}
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/error_driver.h
0,0 → 1,22
/*
* Functions to write error message to FTDI or USART
*/
 
#ifndef __ERROR_DRIVER__
#define __ERROR_DRIVER__
 
#include <avr/io.h>
#include "main.h"
 
 
 
#ifdef DEBUG
extern void errordriver_write_c(uint8_t c);
extern void error_driver_Init(void);
#else
#define errordriver_write_c(c) {}
#define error_driver_init() {}
#endif
 
 
#endif //__ERROR_DRIVER__
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/fifo.c
0,0 → 1,148
/**
* a simple Fifo
* @file fifo.c
* @author Pascal Schnurr
*/
 
#include "fifo.h"
//#if defined HWVERSION1_3W || defined HWVERSION3_9 || defined HWVERSION1_2W
 
 
//--------------------------------------------------------------
void fifo_init (fifo_t * fifo, uint8_t * buffer, uint16_t size)
{
fifo->size = size;
fifo->buffer = buffer;
fifo->head = 0;
fifo->count = 0;
}
//--------------------------------------------------------------
uint16_t fifo_getcount (const fifo_t * fifo)
{
 
return fifo->count;
}
//--------------------------------------------------------------
bool fifo_is_empty (const fifo_t * fifo)
{
return (fifo->count == 0);
}
 
//--------------------------------------------------------------
bool fifo_is_full (const fifo_t * fifo)
{
return (fifo->size - fifo->count == 0);
}
 
//--------------------------------------------------------------
bool fifo_read (fifo_t * fifo, char *data)
{
if (fifo_is_empty (fifo))
return false;
 
uint8_t *head = fifo->buffer + fifo->head;
 
*data = (char) * head;
 
fifo->head = ( (fifo->head + 1) % fifo->size);
 
fifo->count--;
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_write (fifo_t * fifo, const char data)
{
if (fifo_is_full (fifo))
return false;
 
uint8_t *end = fifo->buffer + ( (fifo->head + fifo->count) % fifo->size);
 
*end = (uint8_t) data;
 
fifo->count++;
 
return true;
}
 
//--------------------------------------------------------------
bool fifo_clear (fifo_t * fifo)
{
fifo->count = 0;
fifo->head = 0;
return true;
}
 
//--------------------------------------------------------------
static bool fifo_cmp_pgm_at (fifo_t * fifo, const prog_char * pgm, const uint16_t index)
{
uint16_t i;
uint8_t fifo_byte;
uint8_t pgm_byte;
 
for (i = 0; pgm_read_byte (pgm + i) != 0; i++)
{
if (fifo->count <= (i + index))
return false;
 
pgm_byte = pgm_read_byte (pgm + i);
 
fifo_byte = * (fifo->buffer + ( (fifo->head + i + index) % fifo->size));
 
if (fifo_byte != pgm_byte)
return false;
}
 
// We found the string, lets move the pointer
fifo->head = ( (fifo->head + i + index) % fifo->size);
 
fifo->count -= (i + index);
 
return true;
}
//--------------------------------------------------------------
bool fifo_search (fifo_t * fifo, const prog_char * pgm)
{
uint16_t i;
uint8_t fifo_byte;
uint8_t pgm_byte;
 
for (i = 0; pgm_read_byte (pgm + i) != 0; i++)
{
if (fifo->count <= i)
return false;
 
pgm_byte = pgm_read_byte (pgm + i);
 
fifo_byte = * (fifo->buffer + ( (fifo->head + i) % fifo->size));
 
if (fifo_byte != pgm_byte)
return false;
}
 
// // We found the string, lets move the pointer
// fifo->head = ( (fifo->head + i + index) % fifo->size);
//
// fifo->count -= (i + index);
 
return true;
}
//--------------------------------------------------------------
bool fifo_cmp_pgm (fifo_t * fifo, const prog_char * pgm)
{
return fifo_cmp_pgm_at (fifo, pgm, 0);
}
 
//--------------------------------------------------------------
bool fifo_strstr_pgm (fifo_t * fifo, const prog_char * pgm)
{
for (uint16_t i = 0; i < fifo->count; i++)
{
if (fifo_cmp_pgm_at (fifo, pgm, i))
return true;
}
 
return false;
}
//#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/fifo.h
0,0 → 1,93
/**
* a simple Fifo
* @file fifo.h
* @author Pascal Schnurr
*/
 
#include <avr/pgmspace.h>
#include <stdbool.h>
#ifndef _FIFO_H_
#define _FIFO_H_
 
/**
*fifo data structure all vital fifo information
*/
typedef struct
{
uint16_t count; /**< current number of elements */
uint16_t head; /**< position of the head element */
uint16_t size; /**< size equals max number of entrys*/
uint8_t* buffer; /**< pointer to memory area where the fifo is to be saved */
} fifo_t;
 
uint16_t fifo_getcount (const fifo_t * fifo);
 
/** \brief initialize of a fifo
* sets all the information in your given fifo structure
* @param fifo pointer to an allocated fifo_t structure
* @param buffer pointer to an a allocated memory space for the fifo of size = sizeof(uint8_t) * size
* @param size max number of entrys the fifo will hold
*/
void fifo_init (fifo_t *fifo, uint8_t *buffer, uint16_t size);
 
/** \brief checks if fifo is empty
* @param fifo pointer to your initialized fifo_t structure
* @return true if empty otherwise false
*/
bool fifo_is_empty (const fifo_t *fifo);
 
/** \brief checks if fifo is full
* @param fifo pointer to your initialized fifo_t structure
* @return true if full otherwise false
*/
bool fifo_is_full (const fifo_t *fifo);
 
/** \brief clears the fifo
* resets your fifo structure to 0 elements
* @param fifo pointer to your initialized fifo_t structure
* @return always true (never fails)
*/
bool fifo_clear (fifo_t *fifo);
 
/** \brief reads head of fifo
* reads the first element and removes it
* @param fifo pointer to your initialized fifo_t structure
* @return false if fifo is empty false otherwise
*/
bool fifo_read (fifo_t *fifo, char *data);
 
/** \brief inserts a char into the fifo
* adds a char to the end of the fifo
* @param fifo pointer to your initialized fifo_t structure
* @param data the char data to be inserted
* @return false if fifo is full true otherwise
*/
bool fifo_write (fifo_t *fifo, const char data);
 
/** \brief compares first elements with prog_char string
* if pgm equals the first elements of the fifo these elements are removed
* @param fifo pointer to your initialized fifo_t structure
* @param pgm a prog_char string for comparison
* @return true if pgm is equal to the first entrys in the fifo, false otherwise
*/
bool fifo_cmp_pgm (fifo_t* fifo, const prog_char* pgm);
 
/** \brief searches a string in the whole fifo
* starts at the beginning and searches for the pgm string in the fifo,
*
* @param fifo pointer to your initialized fifo_t structure
* @param pgm a prog_char with the search string
* @return true if found, false otherwise
*/
bool fifo_search (fifo_t * fifo, const prog_char * pgm);
 
/** \brief searches a string in the whole fifo
* starts at the beginning and searches for the pgm string in the fifo,
* if they are found previous entrys and the string are removed from the fifo
* @param fifo pointer to your initialized fifo_t structure
* @param pgm a prog_char with the search string
* @return true if found, false otherwise
*/
bool fifo_strstr_pgm (fifo_t *fifo, const prog_char *pgm);
 
#endif /* _FIFO_H_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/followme.c
0,0 → 1,318
/*
* FollowMe.c
*
* Created on: 18.05.2012
* Author: cebra
*/
/*****************************************************************************
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
 
#include "main.h"
#include "followme.h"
#include "osd.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#include "eeprom.h"
#include "messages.h"
#include "parameter.h"
#include "mk-data-structs.h"
 
#define COSD_WASFLYING 4
#define TIMEOUT 200 // 2 sec
 
// global definitions and global vars
NaviData_t *naviData;
mk_param_struct_t *mk_param_struct;
//uint16_t old_hh = 0;
uint8_t Flags_ExtraConfig;
uint8_t Flags_GlobalConfig;
uint8_t Flags_GlobalConfig3;
unsigned char Element;
uint16_t heading_home;
 
// Hier Höhenanzeigefehler Korrigieren
#define AltimeterAdjust 1.5
 
 
// Positionen der Anzeigeelemente im Bildschirm
#define OSD_ALTITUDE_CONTROL 1
#define OSD_ALTITUDE 2
#define OSD_BATTERY_LEVEL 3
#define OSD_CAPACITY 4
#define OSD_CARE_FREE 5
#define OSD_COMPASS_DEGREE 6
#define OSD_COMPASS_DIRECTION 7
#define OSD_COMPASS_ROSE 8
#define OSD_CURRENT 9
#define OSD_FLYING_TIME 10
#define OSD_GROUND_SPEED 11
#define OSD_HOME_CIRCLE 12
#define OSD_HOME_DEGREE 13
#define OSD_HOME_DISTANCE 14
#define OSD_LED1_OUTPUT 15
#define OSD_LED2_OUTPUT 16
#define OSD_MANUELL 17
#define OSD_NAVI_MODE 18
#define OSD_RC_INTENSITY 19
#define OSD_SATS_IN_USE 20
#define OSD_STATUS_FLAGS 21
#define OSD_VARIOMETER 22
 
// Flags
//uint8_t COSD_FLAGS2 = 0;
//
//GPS_Pos_t last5pos[7];
uint8_t FM_error = 0;
 
//--------------------------------------------------------------
void FollowMe (void)
{
uint8_t flag;
uint8_t tmp_dat;
// uint8_t OSD_Mode;
// uint8_t info_3D = 0;
uint8_t status;
 
// Clear statistics
// max_Altimeter = 0;
// max_GroundSpeed = 0;
// max_Distance = 0;
// min_UBat = 255;
// max_FlyingTime = 0;
 
// flags from last round to check for changes
uint8_t old_FCFlags = 0;
 
// uint8_t old_AngleNick = 0;
// uint8_t old_AngleRoll = 0;
lcd_cls();
 
 
 
 
 
 
if (hardware == FC)
{
lcd_puts_at(0, 3, strGet(ONLY_NC), 0); // Nur mit NC
timer = 100;
while (timer > 0);
 
return;
}
 
SwitchToFC();
 
status = load_setting(0xff);
if(status == 255)
{
lcd_puts_at(0, 0, strGet(NO_SETTINGS), 0); // Keine Setings
_delay_ms(2000);
}
Flags_ExtraConfig = mk_param_struct->ExtraConfig;
Flags_GlobalConfig = mk_param_struct->GlobalConfig;
Flags_GlobalConfig3 = mk_param_struct->GlobalConfig3;
 
SwitchToNC();
 
mode = 'O';
 
// disable debug...
// RS232_request_mk_data (0, 'd', 0);
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
// OSD_active = true; // benötigt für Navidata Ausgabe an SV2
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
flag = 0;
timer = TIMEOUT;
abo_timer = ABO_TIMEOUT;
 
do
{
if (rxd_buffer_locked)
{
timer = TIMEOUT;
Decode64 ();
naviData = (NaviData_t *) pRxData;
 
if(FM_error == 1)
lcd_cls();
 
FM_error = 0;
GPS_Pos_t currpos;
currpos.Latitude = naviData->CurrentPosition.Latitude;
currpos.Longitude = naviData->CurrentPosition.Longitude;
 
 
flag = 1;
 
 
{
 
 
// Altitude Control
OSD_Screen_Element (0, 3, OSD_ALTITUDE_CONTROL);
//
// // Altitude
// OSD_Screen_Element (11, 3, OSD_ALTITUDE);
 
// Battery level
OSD_Screen_Element (0, 7, OSD_BATTERY_LEVEL);
 
// Capacity
OSD_Screen_Element (13, 7, OSD_CAPACITY);
 
// Care Free
OSD_Screen_Element (12, 2, OSD_CARE_FREE);
 
// // Compass Degree
// OSD_Screen_Element (13, 0, OSD_COMPASS_DEGREE);
//
// // Compass Direction
// OSD_Screen_Element (18, 0, OSD_COMPASS_DIRECTION);
//
// // Compass Rose
// OSD_Screen_Element (12, 1, OSD_COMPASS_ROSE);
 
// Current
OSD_Screen_Element (7, 7, OSD_CURRENT);
 
// Flying time
lcd_printp_at (0, 1, PSTR("Flytime:"), 0);
OSD_Screen_Element (8, 1, OSD_FLYING_TIME);
 
// Ground Speed
lcd_printp_at (0, 0, PSTR("Speed:"), 0);
OSD_Screen_Element (6, 0, OSD_GROUND_SPEED);
// Sats in use
OSD_Screen_Element (16, 0, OSD_SATS_IN_USE);
 
// // Home Circle
// OSD_Screen_Element (16, 4, OSD_HOME_CIRCLE);
//
// // Home Degree
// OSD_Screen_Element (12, 4, OSD_HOME_DEGREE);
 
// Home Distance
lcd_printp_at (11, 3, PSTR("Dist:"), 0);
OSD_Screen_Element (17, 3, OSD_HOME_DISTANCE);
//
// // LED1 Output
// OSD_Screen_Element (0, 6, OSD_LED1_OUTPUT);
//
// // LED2 Output
// OSD_Screen_Element (5, 6, OSD_LED2_OUTPUT);
 
// Manuell
// OSD_Screen_Element (7, 0, OSD_MANUELL);
 
// Navi Mode
OSD_Screen_Element (0, 2, OSD_NAVI_MODE);
 
// RC Intensity
// OSD_Screen_Element (11, 6, OSD_RC_INTENSITY);
 
 
// Status Flags
// OSD_Screen_Element (0, 2, OSD_STATUS_FLAGS);
 
// // Variometer
// OSD_Screen_Element (9, 0, OSD_VARIOMETER);
 
lcd_printp_at (0, 4, PSTR("MK:"), 0);
write_ndigit_number_u (3, 4, (uint16_t)(currpos.Latitude/10000000), 2, 0,0);
lcd_printp_at (5, 4, PSTR("."), 0);
write_ndigit_number_u (6, 4, (uint16_t)((currpos.Latitude/1000) % 10000), 4, 1,0);
write_ndigit_number_u (10, 4, (uint16_t)((currpos.Latitude/10) % 100), 2, 1,0);
 
 
write_ndigit_number_u (12, 4, (uint16_t)(currpos.Longitude/10000000), 2, 0,0);
lcd_printp_at (14, 4, PSTR("."), 0);
write_ndigit_number_u (15, 4, (uint16_t)((currpos.Longitude/1000) % 10000), 4, 1,0);
write_ndigit_number_u (19, 4, (uint16_t)((currpos.Longitude/10) % 100), 2, 1,0);
 
lcd_printp_at (0, 5, PSTR("!!!not implemented!!!"), 2);
 
// Akku Warnung
if (naviData->UBat < MK_LowBat)
{ //Beeper ein
set_beep ( 3000, 0x0020, BeepNormal);
}
if (naviData->UBat > MK_LowBat) //bei kurzzeitigen Schwankungen Beeper erst wieder aus wenn UBat 0,2 V höher als Warnschwelle
{ //Beeper aus
set_beep ( 0, 0, BeepOff);
}
// Akku Warnung Ende
 
old_FCFlags = naviData->FCStatusFlags;
 
rxd_buffer_locked = FALSE;
}
 
 
if (!abo_timer)
{ // renew abo every 3 sec
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
abo_timer = ABO_TIMEOUT;
}
}
if (!timer)
{
OSD_Timeout(flag);
flag = 0;
FM_error = 1;
}
}
 
while (!get_key_press (1 << KEY_ESC));
OSD_active = false;
 
}
 
 
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/followme.h
0,0 → 1,13
/*
* FollowMe.h
*
* Created on: 18.05.2012
* Author: cebra
*/
 
#ifndef FOLLOWME_H_
#define FOLLOWME_H_
 
void FollowMe (void);
 
#endif /* FOLLOWME_H_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/font8x6.c
0,0 → 1,172
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - font provided by Claas Anders "CaScAdE" Rathje *
* - umlauts and special characters by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#include <avr/pgmspace.h>
 
// one byte is a column
// bit 7 is the bottom
//
// 123456
// L 1 | XXX |
// O 2 |X X |
// W 4 |X X |
// 8 | XXX |
// H 1 |X X |
// I 2 |X X |
// G 4 | XXX |
// H 8 | |
//
// 0x36,0x49,0x49,0x49,0x36,0x00
//
 
//prog_uint8_t font8x6[128][6] = // führt zu Fehler mit AVR-GCC 4.5.1 21.2.2012 Cebra
const uint8_t font8x6[128][6] PROGMEM =
{
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 0 00 (not useable)
{ 0x78,0x15,0x14,0x15,0x78,0x00 }, // ASCII - 1 01 'Ä'
{ 0x20,0x55,0x54,0x55,0x78,0x00 }, // ASCII - 2 02 'ä'
{ 0x38,0x45,0x44,0x45,0x38,0x00 }, // ASCII - 3 03 'Ö'
{ 0x30,0x49,0x48,0x49,0x30,0x00 }, // ASCII - 4 04 'ö'
{ 0x3c,0x41,0x40,0x41,0x3c,0x00 }, // ASCII - 5 05 'Ü'
{ 0x38,0x41,0x40,0x21,0x78,0x00 }, // ASCII - 6 06 'ü'
{ 0x7e,0x15,0x15,0x15,0x0a,0x00 }, // ASCII - 7 07 'ß'
{ 0x22,0x17,0x0F,0x17,0x22,0x00 }, // ASCII - 8 08 SAT Symbol
{ 0x00,0x84,0x82,0xFF,0x82,0x84 }, // ASCII - 9 09 Altitude Symbol
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 10 0A (not useable)
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 11 0B
{ 0x10,0x38,0x54,0x10,0x10,0x1e }, // ASCII - 12 0C Enter Symbol
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 13 0D (not useable)
{ 0x10,0x10,0x10,0x10,0x10,0x10 }, // ASCII - 14 0E hor. line
{ 0x10,0x10,0x10,0x7c,0x10,0x10 }, // ASCII - 15 0F hor. line with tick mark
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 16 10
{ 0x08,0x14,0x00,0x00,0x14,0x08 }, // ASCII - 17 11 <> Change
{ 0x10,0x08,0x04,0x04,0x08,0x10 }, // ASCII - 18 12 /\ Up
{ 0x08,0x10,0x20,0x20,0x10,0x08 }, // ASCII - 19 13 \/ Down
{ 0x00,0x08,0x14,0x22,0x41,0x00 }, // ASCII - 20 14 < Left
{ 0x00,0x41,0x22,0x14,0x08,0x00 }, // ASCII - 21 15 > Right
{ 0x04,0x02,0x7f,0x02,0x04,0x00 }, // ASCII - 22 16 /|\ Arrow up
{ 0x10,0x20,0x7f,0x20,0x10,0x00 }, // ASCII - 23 17 \|/ Arrow down
{ 0x10,0x38,0x54,0x10,0x10,0x10 }, // ASCII - 24 18 <- Arrow left
{ 0x10,0x10,0x10,0x54,0x38,0x10 }, // ASCII - 25 19 -> Arrow right
{ 0x10,0x18,0x1c,0x1c,0x18,0x10 }, // ASCII - 26 1A ^ Triangle up
{ 0x08,0x18,0x38,0x38,0x18,0x08 }, // ASCII - 27 1B v Triangle down
{ 0x00,0x08,0x1c,0x3e,0x7f,0x00 }, // ASCII - 28 1C < Triangle left
{ 0x00,0x7f,0x3e,0x1c,0x08,0x00 }, // ASCII - 29 1D > Triangle right
{ 0x06,0x09,0x09,0x09,0x06,0x00 }, // ASCII - 30 1E '°'
{ 0x06,0x49,0x7d,0x49,0x06,0x00 }, // ASCII - 31 1F Antenne
 
{ 0x00,0x00,0x00,0x00,0x00,0x00 }, // ASCII - 32 20 ' '
{ 0x00,0x00,0x2f,0x00,0x00,0x00 }, // ASCII - 33 21 '!'
{ 0x00,0x07,0x00,0x07,0x00,0x00 }, // ASCII - 34 22 '"'
{ 0x14,0x7f,0x14,0x7f,0x14,0x00 }, // ASCII - 35 23 '#'
{ 0x24,0x2a,0x6b,0x2a,0x12,0x00 }, // ASCII - 36 24 '$'
{ 0x23,0x13,0x08,0x64,0x62,0x00 }, // ASCII - 37 25 '%'
{ 0x36,0x49,0x55,0x22,0x50,0x00 }, // ASCII - 38 26 '&'
{ 0x00,0x05,0x03,0x00,0x00,0x00 }, // ASCII - 39 27 '''
{ 0x00,0x1c,0x22,0x41,0x00,0x00 }, // ASCII - 40 28 '('
{ 0x00,0x41,0x22,0x1c,0x00,0x00 }, // ASCII - 41 29 ')'
{ 0x14,0x08,0x3e,0x08,0x14,0x00 }, // ASCII - 42 2a '*'
{ 0x08,0x08,0x3e,0x08,0x08,0x00 }, // ASCII - 43 2b '+'
{ 0x00,0x50,0x30,0x00,0x00,0x00 }, // ASCII - 44 2c ','
{ 0x08,0x08,0x08,0x08,0x08,0x00 }, // ASCII - 45 2d '-'
{ 0x00,0x60,0x60,0x00,0x00,0x00 }, // ASCII - 46 2e '.'
{ 0x20,0x10,0x08,0x04,0x02,0x00 }, // ASCII - 47 2f '/'
{ 0x3e,0x51,0x49,0x45,0x3e,0x00 }, // ASCII - 48 30 '0'
{ 0x00,0x42,0x7f,0x40,0x00,0x00 }, // ASCII - 49 31 '1'
{ 0x42,0x61,0x51,0x49,0x46,0x00 }, // ASCII - 50 32 '2'
{ 0x21,0x41,0x45,0x4b,0x31,0x00 }, // ASCII - 51 33 '3'
{ 0x18,0x14,0x12,0x7f,0x10,0x00 }, // ASCII - 52 34 '4'
{ 0x27,0x45,0x45,0x45,0x39,0x00 }, // ASCII - 53 35 '5'
{ 0x3c,0x4a,0x49,0x49,0x30,0x00 }, // ASCII - 54 36 '6'
{ 0x03,0x01,0x71,0x09,0x07,0x00 }, // ASCII - 55 37 '7'
{ 0x36,0x49,0x49,0x49,0x36,0x00 }, // ASCII - 56 38 '8'
{ 0x06,0x49,0x49,0x29,0x1e,0x00 }, // ASCII - 57 39 '9'
{ 0x00,0x36,0x36,0x00,0x00,0x00 }, // ASCII - 58 3a ':'
{ 0x00,0x56,0x36,0x00,0x00,0x00 }, // ASCII - 59 3b ';'
{ 0x08,0x14,0x22,0x41,0x00,0x00 }, // ASCII - 60 3c '<'
{ 0x14,0x14,0x14,0x14,0x14,0x00 }, // ASCII - 61 3d '='
{ 0x00,0x41,0x22,0x14,0x08,0x00 }, // ASCII - 62 3e '>'
{ 0x02,0x01,0x51,0x09,0x06,0x00 }, // ASCII - 63 3f '?'
{ 0x32,0x49,0x79,0x41,0x3e,0x00 }, // ASCII - 64 40 '@'
{ 0x7e,0x11,0x11,0x11,0x7e,0x00 }, // ASCII - 65 41 'A'
{ 0x7f,0x49,0x49,0x49,0x36,0x00 }, // ASCII - 66 42 'B'
{ 0x3e,0x41,0x41,0x41,0x22,0x00 }, // ASCII - 67 43 'C'
{ 0x7f,0x41,0x41,0x22,0x1c,0x00 }, // ASCII - 68 44 'D'
{ 0x7f,0x49,0x49,0x49,0x41,0x00 }, // ASCII - 69 45 'E'
{ 0x7f,0x09,0x09,0x09,0x01,0x00 }, // ASCII - 70 46 'F'
{ 0x3e,0x41,0x49,0x49,0x7a,0x00 }, // ASCII - 71 47 'G'
{ 0x7f,0x08,0x08,0x08,0x7f,0x00 }, // ASCII - 72 48 'H'
{ 0x00,0x41,0x7f,0x41,0x00,0x00 }, // ASCII - 73 49 'I'
{ 0x20,0x40,0x41,0x3f,0x01,0x00 }, // ASCII - 74 4a 'J'
{ 0x7f,0x08,0x14,0x22,0x41,0x00 }, // ASCII - 75 4b 'K'
{ 0x7f,0x40,0x40,0x40,0x40,0x00 }, // ASCII - 76 4c 'L'
{ 0x7f,0x02,0x0c,0x02,0x7f,0x00 }, // ASCII - 77 4d 'M'
{ 0x7f,0x04,0x08,0x10,0x7f,0x00 }, // ASCII - 78 4e 'N'
{ 0x3e,0x41,0x41,0x41,0x3e,0x00 }, // ASCII - 79 4f 'O'
{ 0x7f,0x09,0x09,0x09,0x06,0x00 }, // ASCII - 80 50 'P'
{ 0x3e,0x41,0x51,0x21,0x5e,0x00 }, // ASCII - 81 51 'Q'
{ 0x7f,0x09,0x19,0x29,0x46,0x00 }, // ASCII - 82 52 'R'
{ 0x46,0x49,0x49,0x49,0x31,0x00 }, // ASCII - 83 53 'S'
{ 0x01,0x01,0x7f,0x01,0x01,0x00 }, // ASCII - 84 54 'T'
{ 0x3f,0x40,0x40,0x40,0x3f,0x00 }, // ASCII - 85 55 'U'
{ 0x1f,0x20,0x40,0x20,0x1f,0x00 }, // ASCII - 86 56 'V'
{ 0x3f,0x40,0x38,0x40,0x3f,0x00 }, // ASCII - 87 57 'W'
{ 0x63,0x14,0x08,0x14,0x63,0x00 }, // ASCII - 88 58 'X'
{ 0x07,0x08,0x70,0x08,0x07,0x00 }, // ASCII - 89 59 'Y'
{ 0x61,0x51,0x49,0x45,0x43,0x00 }, // ASCII - 90 5a 'Z'
{ 0x7f,0x41,0x41,0x00,0x00,0x00 }, // ASCII - 91 5b '['
{ 0x02,0x04,0x08,0x10,0x20,0x00 }, // ASCII - 92 5c '\'
{ 0x00,0x41,0x41,0x7f,0x00,0x00 }, // ASCII - 93 5d ']'
{ 0x04,0x02,0x01,0x02,0x04,0x00 }, // ASCII - 94 5e '^'
{ 0x40,0x40,0x40,0x40,0x40,0x00 }, // ASCII - 95 5f '_'
{ 0x00,0x01,0x02,0x04,0x00,0x00 }, // ASCII - 96 60 '`'
{ 0x20,0x54,0x54,0x54,0x78,0x00 }, // ASCII - 97 61 'a'
{ 0x7f,0x48,0x44,0x44,0x38,0x00 }, // ASCII - 98 62 'b'
{ 0x38,0x44,0x44,0x44,0x20,0x00 }, // ASCII - 99 63 'c'
{ 0x38,0x44,0x44,0x48,0x7f,0x00 }, // ASCII - 100 64 'd'
{ 0x38,0x54,0x54,0x54,0x18,0x00 }, // ASCII - 101 65 'e'
{ 0x08,0x7e,0x09,0x01,0x02,0x00 }, // ASCII - 102 66 'f'
{ 0x0c,0x52,0x52,0x52,0x3e,0x00 }, // ASCII - 103 67 'g'
{ 0x7f,0x08,0x04,0x04,0x78,0x00 }, // ASCII - 104 68 'h'
{ 0x00,0x44,0x7d,0x40,0x00,0x00 }, // ASCII - 105 69 'i'
{ 0x20,0x40,0x44,0x3d,0x00,0x00 }, // ASCII - 106 6a 'j'
{ 0x7f,0x10,0x28,0x44,0x00,0x00 }, // ASCII - 107 6b 'k'
{ 0x00,0x41,0x7f,0x40,0x00,0x00 }, // ASCII - 108 6c 'l'
{ 0x7c,0x04,0x18,0x04,0x78,0x00 }, // ASCII - 109 6d 'm'
{ 0x7c,0x08,0x04,0x04,0x78,0x00 }, // ASCII - 110 6e 'n'
{ 0x38,0x44,0x44,0x44,0x38,0x00 }, // ASCII - 111 6f 'o'
{ 0x7c,0x14,0x14,0x14,0x08,0x00 }, // ASCII - 112 70 'p'
{ 0x08,0x14,0x14,0x18,0x7c,0x00 }, // ASCII - 113 71 'q'
{ 0x7c,0x08,0x04,0x04,0x08,0x00 }, // ASCII - 114 72 'r'
{ 0x48,0x54,0x54,0x54,0x20,0x00 }, // ASCII - 115 73 's'
{ 0x04,0x3f,0x44,0x40,0x20,0x00 }, // ASCII - 116 74 't'
{ 0x3c,0x40,0x40,0x20,0x7c,0x00 }, // ASCII - 117 75 'u'
{ 0x1c,0x20,0x40,0x20,0x1c,0x00 }, // ASCII - 118 76 'v'
{ 0x3c,0x40,0x38,0x40,0x3c,0x00 }, // ASCII - 119 77 'w'
{ 0x44,0x28,0x10,0x28,0x44,0x00 }, // ASCII - 120 78 'x'
{ 0x0c,0x50,0x50,0x50,0x3c,0x00 }, // ASCII - 121 79 'y'
{ 0x44,0x64,0x54,0x4c,0x44,0x00 }, // ASCII - 122 7a 'z'
{ 0x00,0x08,0x36,0x41,0x00,0x00 }, // ASCII - 123 7b '{'
{ 0x00,0x00,0x7f,0x00,0x00,0x00 }, // ASCII - 124 7c '|'
{ 0x00,0x41,0x36,0x08,0x00,0x00 }, // ASCII - 125 7d '}'
{ 0x08,0x08,0x2a,0x1c,0x08,0x00 }, // ASCII - 126 7e ->
{ 0x08,0x1c,0x2a,0x08,0x08,0x00 }, // ASCII - 127 7f <-
};
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/font8x6.h
0,0 → 1,30
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - font provided by Claas Anders "CaScAdE" Rathje *
* - umlauts and special characters by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#ifndef _FONT8X6_H
#define _FONT8X6_H
 
#include <avr/pgmspace.h>
 
//extern prog_uint8_t font8x6[128][6];
extern const uint8_t font8x6[128][6];
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/gps.c
0,0 → 1,366
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
 
#include "main.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#if defined HWVERSION1_3W || defined HWVERSION3_9 || defined HWVERSION1_2W
#define TIMEOUT 200 // 2 sec
 
uint8_t ck_a = 0;
uint8_t ck_b = 0;
uint8_t UBX_class = 0;
uint8_t UBX_id = 0;
uint8_t UBX_buffer[250];
uint8_t UBX_payload_counter = 0;
 
void checksum(uint8_t);
void UBX_process(void);
uint32_t join_4_bytes(uint8_t*);
 
uint8_t display_mode = 0;
 
 
//--------------------------------------------------------------
void gps(void)
{
lcd_cls();
display_mode = 2;
 
if (hardware == FC)
{
lcd_printp_at(0, 3, PSTR("Nur mit NC !"), 0);
timer = 100;
while (timer > 0);
return;
}
 
 
if(current_hardware != NC)
SwitchToNC();
 
SwitchToGPS();
 
uint8_t mode = 0;
 
// SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
timer = TIMEOUT;
uint8_t data = 0;
uint8_t length = 0;
uint8_t UBX_ck_a = 0;
do
{
// if (rxFlag == 1)
if (uart_getc_nb(&data))
{
//rxFlag = 0;
//data = rx_byte;
timer = TIMEOUT;
 
switch(mode)
{
case 0: // init 1
if(data == 0xB5)
{
UBX_payload_counter = 0;
UBX_id = 0;
UBX_class = 0;
ck_a = 0;
ck_b = 0;
mode++;
}
break;
 
case 1: // init 2
if(data == 0x62)
mode++;
else
mode = 0;
break;
 
case 2: //class
if(data != 1)
mode = 0;
else
{
checksum(data);
UBX_class = data;
mode++;
}
break;
 
case 3: // id
if((data != 48)&&(data != 6)&&(data != 18)&&(data != 2))
mode = 0;
else
{
UBX_id = data;
checksum(data);
mode++;
}
break;
 
case 4: // length lo
if(data > 250)
mode = 0;
else
{
checksum(data);
length = data;
mode++;
}
break;
 
case 5: // length hi
if(data != 0)
mode = 0;
else
{
checksum(data);
mode++;
}
break;
 
case 6: // length hi
length--;
UBX_buffer[UBX_payload_counter] = data;
checksum(data);
UBX_payload_counter++;
if(length==0)
{
mode++;
};
break;
 
case 7: // check lo
mode++;
UBX_ck_a = data;
break;
 
case 8: // check hi
mode=0;
if((UBX_ck_a == ck_a) && (data == ck_b))
UBX_process();
 
}
 
 
// write_ndigit_number_u (14, 0, data, 3, 0);
}
 
}
while (!get_key_press (1 << KEY_ESC) && timer);
get_key_press(KEY_ALL);
 
SwitchToNC();
 
 
}
 
 
//--------------------------------------------------------------
void UBX_process()
{
 
if ((get_key_press (1 << KEY_MINUS))||(display_mode == 2))
{
if (display_mode != 1)
{
lcd_cls();
lcd_printp_at (0,0, PSTR("Fix Type : "), 0);
lcd_printp_at (0,1, PSTR("Sat : "), 0);
lcd_printp_at (0,2, PSTR("Accuracy : "), 0);
lcd_printp_at (0,3, PSTR("PDOP : "), 0);
lcd_printp_at (0,4, PSTR("Speed : "), 0);
lcd_printp_at (0,5, PSTR("Long : "), 0);
lcd_printp_at (0,6, PSTR("Lat : "), 0);
lcd_printp_at (0,7, PSTR("Alt : "), 0);
}
display_mode = 1;
}
 
if((UBX_class == 1) && (UBX_id == 48)&&(display_mode == 0))
{
uint8_t channels = UBX_buffer[4];
 
uint8_t i = 0;
for(i = 0; i < channels; i++)
{
if (i > 15)
break;
 
uint8_t line;
uint8_t col;
 
if (i > 7)
{
line = i-7;
col = 11;
}
else
col = 0; line = i;
 
write_ndigit_number_u (col, line, UBX_buffer[9 + 12*i], 3, 0,0);
write_ndigit_number_u (col+4, line, UBX_buffer[12 + 12*i], 2, 0,0);
 
if((UBX_buffer[10 + 12*i] & 3) == 3)
lcd_printp_at (col+7,line, PSTR("O"), 0);
else if((UBX_buffer[10 + 12*i] & 1) == 1)
lcd_printp_at (col+7,line, PSTR("X"), 0);
else if(UBX_buffer[11 + 12*i] > 4)
lcd_printp_at (col+7,line, PSTR("x"), 0);
else if(UBX_buffer[11 + 12*i] > 1)
lcd_printp_at (col+7,line, PSTR("-"), 0);
else
lcd_printp_at (col+7,line, PSTR(" "), 0);
 
}
}
 
if(display_mode == 1)
{
if((UBX_class == 1) && (UBX_id == 6)) //SVINFO
{
switch (UBX_buffer[10])
{
case 4:
 
case 3:
lcd_printp_at (11,0, PSTR("3D"), 0);
break;
 
case 2:
lcd_printp_at (11,0, PSTR("2D"), 0);
break;
 
default:
lcd_printp_at (11,0, PSTR("no"), 0);
}
 
if((UBX_buffer[11] & 3) == 3)
lcd_printp_at (17,0, PSTR("D"), 0);
else
lcd_printp_at (17,0, PSTR(" "), 0);
 
if((UBX_buffer[11] & 1) == 1)
lcd_printp_at (14,0, PSTR("ok"), 0);
else
lcd_printp_at (14,0, PSTR(" "), 0);
 
// lcd_write_number_u_at (11, 1, UBX_buffer[47]);
write_ndigit_number_u (11, 1, UBX_buffer[47], 2,0,0);
 
uint16_t acc = (uint16_t)join_4_bytes(&UBX_buffer[24]);
write_ndigit_number_u (11, 2, acc, 5, 0,0);
lcd_printp_at (17,2, PSTR("cm"), 0);
 
uint16_t pdop = UBX_buffer[44]+UBX_buffer[45]*255;
write_ndigit_number_u (11, 3, pdop/100, 2, 0,0);
lcd_printp_at (13,3, PSTR("."), 0);
write_ndigit_number_u (14, 3, (pdop % 100),2, 1,0);
}
 
if((UBX_class == 1) && (UBX_id == 18)) //VELNED
{
uint16_t speed = (uint16_t)((join_4_bytes(&UBX_buffer[20])*60*60)/100000);
write_ndigit_number_u (11, 4, speed, 3, 0,0);
lcd_printp_at (15,4, PSTR("km/h"), 0);
 
}
 
if((UBX_class == 1) && (UBX_id == 2)) //POSLLH
{
uint32_t lon = join_4_bytes(&UBX_buffer[4]);
write_ndigit_number_u (10, 5, (uint16_t)(lon/10000000), 2, 0,0);
lcd_printp_at (12,5, PSTR("."), 0);
write_ndigit_number_u (13, 5, (uint16_t)((lon/1000) % 10000), 4, 1,0);
write_ndigit_number_u (17, 5, (uint16_t)((lon/10) % 100), 2, 1,0);
 
uint32_t lat = join_4_bytes(&UBX_buffer[8]);
write_ndigit_number_u (10, 6, (uint16_t)(lat/10000000), 2, 0,0);
lcd_printp_at (12,6, PSTR("."), 0);
write_ndigit_number_u (13, 6, (uint16_t)((lat/1000) % 10000), 4, 1,0);
write_ndigit_number_u (17, 6, (uint16_t)((lat/10) % 100), 2, 1,0);
 
uint16_t height = (uint16_t)(join_4_bytes(&UBX_buffer[16])/1000);
write_ndigit_number_u (11, 7, height, 4, 0,0);
lcd_printp_at (16,7, PSTR("m"), 0);
 
}
}
}
 
 
//--------------------------------------------------------------
union long_union
{
uint32_t dword;
uint8_t byte[4];
} longUnion;
 
 
//--------------------------------------------------------------
union int_union
{
uint16_t dword;
uint8_t byte[2];
} intUnion;
 
 
//--------------------------------------------------------------
uint32_t join_4_bytes(uint8_t Buffer[])
{
longUnion.byte[0] = *Buffer;
longUnion.byte[1] = *(Buffer+1);
longUnion.byte[2] = *(Buffer+2);
longUnion.byte[3] = *(Buffer+3);
return (longUnion.dword);
}
 
 
//--------------------------------------------------------------
void checksum(uint8_t data)
{
ck_a += data;
ck_b += ck_a;
}
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/gps.h
0,0 → 1,40
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _GPS_H
#define _GPS_H
 
void gps (void);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/lcd.c
0,0 → 1,1378
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - original LCD control by Thomas "thkais" Kaiser *
* - special number formating routines taken from C-OSD *
* from Claas Anders "CaScAdE" Rathje *
* - some extension, ellipse and circ_line by Peter "woggle" Mack *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
#include "font8x6.h"
#include "Font8x8.h"
#include "eeprom.h"
#include "lcd.h"
#include "HAL_HW3_9.h"
 
 
#define DISP_W 128
#define DISP_H 64
 
#define DISP_BUFFER ((DISP_H * DISP_W) / 8)
#define LINE_BUFFER (((DISP_H/8) * DISP_W) / 8)
 
#define Jeti 1 // Jeti Routinen
 
volatile uint8_t display_buffer[DISP_BUFFER]; // Display-Puffer, weil nicht zurückgelesen werden kann
volatile uint8_t line_buffer[LINE_BUFFER]; // Zeilen-Puffer, weil nicht zurückgelesen werden kann
 
volatile uint16_t display_buffer_pointer; // Pointer auf das aktuell übertragene Byte
volatile uint8_t display_buffer_counter; // Hilfszähler zur Selektierung der Page
volatile uint8_t display_page_counter; // aktuelle Page-Nummer
volatile uint8_t display_mode; // Modus für State-Machine
volatile uint8_t LCD_ORIENTATION;
 
// DOG: 128 x 64 with 6x8 Font => 21 x 8
// MAX7456: 30 x 16
 
uint8_t lcd_xpos;
uint8_t lcd_ypos;
 
 
//-----------------------------------------------------------
void send_byte (uint8_t data)
{
clr_cs ();
SPDR = data;
while (!(SPSR & (1<<SPIF)));
//SPSR = SPSR;
set_cs ();
}
 
 
//-----------------------------------------------------------
// * Writes one command byte
// * cmd - the command byte
//
void lcd_command(uint8_t cmd)
{
// LCD_SELECT();
// LCD_CMD();
// spi_write(cmd);
// LCD_UNSELECT();
clr_cs ();
SPDR = cmd;
while (!(SPSR & (1<<SPIF)));
//SPSR = SPSR;
set_cs ();
}
 
 
//-----------------------------------------------------------
void lcd_cls (void)
{
uint16_t i, j;
 
// memset (display_buffer, 0, 1024);
for (i = 0; i < DISP_BUFFER; i++)
display_buffer[i] = 0x00;
for (i = 0; i < 8; i++)
{
clr_A0 ();
send_byte (0xB0 + i); //1011xxxx
send_byte (0x10); //00010000
// send_byte(0x04); //00000100 gedreht plus 4 Byte
// send_byte(0x00); //00000000
send_byte (LCD_ORIENTATION); //00000000
 
set_A0 ();
for (j = 0; j < 128; j++)
send_byte (0x00);
}
 
lcd_xpos = 0;
lcd_ypos = 0;
}
 
 
//-----------------------------------------------------------
void lcd_cls_line (uint8_t x, uint8_t y, uint8_t w)
{
uint8_t lcd_width;
uint8_t lcd_zpos;
uint8_t i;
uint8_t max = 21;
lcd_width = w;
lcd_xpos = x;
lcd_ypos = y;
 
if ((lcd_xpos + lcd_width) > max)
lcd_width = max - lcd_xpos;
 
lcd_zpos = lcd_xpos + lcd_width;
 
for (i = lcd_xpos; i < lcd_zpos; i++)
lcd_putc (i, lcd_ypos, 0x20, 0);
}
 
 
//-----------------------------------------------------------
void wait_1ms (void)
{
_delay_ms (1);
}
 
 
//-----------------------------------------------------------
void wait_ms (uint16_t time)
{
uint16_t i;
 
for (i = 0; i < time; i++)
wait_1ms ();
}
 
 
//-----------------------------------------------------------
void LCD_Init (uint8_t LCD_Mode) // LCD_Mode 0= Default Mode 1= EEPROM-Parameter)
{
lcd_xpos = 0;
lcd_ypos = 0;
 
// DDRB = 0xFF;
 
// SPI max. speed
// the DOGM128 lcd controller can work at 20 MHz
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << CPOL);
SPSR = (1 << SPI2X);
 
set_cs ();
clr_reset ();
wait_ms (10);
set_reset ();
 
clr_cs ();
clr_A0 ();
 
send_byte (0x40); //Display start line = 0
if (LCD_Mode == 1)
{
if (LCD_ORIENTATION == 0)
{
send_byte (0xA1); // A1 normal A0 reverse(original)
send_byte (0xC0); // C0 normal C8 reverse(original)
}
else
{
send_byte (0xA0); // A1 normal A0 reverse(original)
send_byte (0xC8); // C0 normal C8 reverse(original)
}
}
else
{
send_byte (0xA1); // A1 normal A0 reverse(original)
send_byte (0xC0); // C0 normal C8 reverse(original)
}
if (LCD_Mode == 1)
{
if (LCD_DisplayMode == 0)
send_byte (0xA6); //Display normal, not mirrored
else
send_byte (0xA7); //Display reverse, not mirrored
}
else
send_byte (0xA6);
 
 
send_byte (0xA2); //Set bias 1/9 (Duty 1/65)
send_byte (0x2F); //Booster, regulator and follower on
send_byte (0xF8); //Set internal booster to 4x
send_byte (0x00); //Set internal booster to 4x
send_byte (0x27); //resistor ratio set
 
if (LCD_Mode == 1)
{
send_byte (0x81); //Electronic volume register set
send_byte (LCD_Kontrast); //Electronic volume register set
}
else
{
send_byte (0x81);
send_byte (0x16);
}
 
send_byte (0xAC); //Cursor
send_byte (0x00); //No Cursor
send_byte (0xAF); //No indicator
 
if (LCD_Mode == 1)
{
// Helligkeit setzen
OCR2A = LCD_Helligkeit * 2.55;
}
else
{
OCR2A = 255;
}
 
lcd_cls ();
}
 
 
//-----------------------------------------------------------
void set_adress (uint16_t adress, uint8_t data)
{
uint8_t page;
uint8_t column;
 
page = adress >> 7;
 
clr_A0 ();
send_byte (0xB0 + page);
 
column = (adress & 0x7F) + LCD_ORIENTATION;
 
send_byte (0x10 + (column >> 4));
send_byte (column & 0x0F);
 
set_A0 ();
send_byte (data);
}
 
 
//-----------------------------------------------------------
void scroll (void)
{
uint16_t adress;
 
for (adress = 0; adress < 896; adress++)
{
display_buffer[adress] = display_buffer[adress + 128];
set_adress (adress, display_buffer[adress]);
}
 
for (adress = 896; adress < 1024; adress++)
{
display_buffer[adress] = 0;
set_adress (adress, 0);
}
}
 
 
//-----------------------------------------------------------
// sicher eine Zeile für die Statusanzeige
void copy_line (uint8_t y)
{
uint8_t i;
uint16_t adress;
 
adress = y * 128 + 0 * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6*21; i++)
{
line_buffer[i] = display_buffer[adress+i];
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
// holt gesicherte Zeile wieder zurück
void paste_line (uint8_t y)
{
uint8_t i;
uint16_t adress;
 
adress = y * 128 + 0 * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6*21; i++)
{
display_buffer[adress+i] =line_buffer[i];
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
void lcd_puts_at(uint8_t x, uint8_t y,const char *s, uint8_t mode )
{
while (*s)
{
lcd_putc(x, y, *s++, mode);
x++;
}
 
}/* lcd_puts */
 
 
//-----------------------------------------------------------
void lcd_putc (uint8_t x, uint8_t y, uint8_t c, uint8_t mode)
{
uint8_t ch;
uint8_t i;
uint16_t adress;
 
if (mode == 2)
lcd_frect ((x*6),(y*8),5,7,1); // invertierte Darstellung
 
if (mode == 3) lcd_putc_jeti (x, y, c,0);
else
if (mode == 4) lcd_putc_jeti (x, y, c,2);
else
{
 
switch (c)
{ // ISO 8859-1
 
case 0xc4: // Ä
c = 0x01;
break;
 
case 0xe4: // ä
c = 0x02;
break;
 
case 0xd6: // Ö
c = 0x03;
break;
 
case 0xf6: // ö
c = 0x04;
break;
 
case 0xdc: // Ü
c = 0x05;
break;
 
case 0xfc: // ü
c = 0x06;
break;
 
case 0xdf: // ß
//c = 0x07;
c = 0x1e; // ° (used by Jeti)
break;
}
 
c &= 0x7f;
 
adress = y * 128 + x * 6;
adress &= 0x3FF;
 
for (i = 0; i < 6; i++)
{
ch = pgm_read_byte (&font8x6[0][0] + i + c * 6);
 
switch (mode)
{
 
case 0:
display_buffer[adress+i] = ch;
break;
 
case 1:
display_buffer[adress+i] |= ch;
break;
 
case 2:
display_buffer[adress+i] ^= ch;
break;
 
case 3:
display_buffer[adress+i] &= ch;
break;
 
case 4:
display_buffer[adress+i] &= ~ch;
break;
}
 
set_adress (adress + i, display_buffer[adress + i]);
}
}
}
 
 
#if Jeti
//-----------------------------------------------------------
void lcd_putc_jeti (uint8_t x, uint8_t y, uint8_t c, uint8_t mode)
{
uint8_t ch;
uint8_t i;
uint16_t adress;
if (mode == 2)
lcd_frect ((x*8),(y*8),8,8,1); // invertierte Darstellung
switch (c)
{
 
case 0x7e:
c = 0x1a; // ->
break;
 
case 0x7f:
c = 0x1b; // <-
break;
 
case 0xdf:
c = 0xf8; // °
break;
}
 
adress = y * 128 + x * 8;
adress &= 0x3FF;
 
for (i = 0; i < 8; i++)
{
ch = pgm_read_byte (&Font8x8[0][0] + i + c * 8);
 
switch (mode)
{
 
case 0:
display_buffer[adress+i] = ch;
break;
 
case 1:
display_buffer[adress+i] |= ch;
break;
 
case 2:
display_buffer[adress+i] ^= ch;
break;
 
case 3:
display_buffer[adress+i] &= ch;
break;
 
case 4:
display_buffer[adress+i] &= ~ch;
break;
}
 
set_adress (adress + i, display_buffer[adress + i]);
}
}
 
 
//-----------------------------------------------------------
void lcd_printpj (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc_jeti (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 20)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpj_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printpj (text, mode);
}
#endif
 
 
//-----------------------------------------------------------
void new_line (void)
{
lcd_ypos++;
 
if (lcd_ypos > 7)
{
scroll ();
lcd_ypos = 7;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpns (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
// new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printpns_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printpns (text, mode);
}
 
 
//-----------------------------------------------------------
void lcd_printp (const char *text, uint8_t mode)
{
while (pgm_read_byte(text))
{
switch (pgm_read_byte(text))
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, pgm_read_byte(text), mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_printp_at (uint8_t x, uint8_t y, const char *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_printp (text, mode);
}
 
 
//-----------------------------------------------------------
void lcd_print (uint8_t *text, uint8_t mode)
{
while (*text)
{
switch (*text)
{
 
case 0x0D:
lcd_xpos = 0;
break;
 
case 0x0A:
new_line();
break;
 
default:
lcd_putc (lcd_xpos, lcd_ypos, *text, mode);
lcd_xpos++;
if (lcd_xpos > 21)
{
lcd_xpos = 0;
new_line ();
}
break;
}
text++;
}
}
 
 
//-----------------------------------------------------------
void lcd_print_at (uint8_t x, uint8_t y, uint8_t *text, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_print (text, mode);
}
 
 
//-----------------------------------------------------------
void print_display (uint8_t *text)
{
while (*text)
{
lcd_putc (lcd_xpos, lcd_ypos, *text, 0);
lcd_xpos++;
if (lcd_xpos >= 20)
{
lcd_xpos = 0;
new_line ();
}
text++;
}
}
 
 
//-----------------------------------------------------------
void print_display_at (uint8_t x, uint8_t y, uint8_t *text)
{
lcd_xpos = x;
lcd_ypos = y;
print_display (text);
}
 
 
//-----------------------------------------------------------
// + Plot (set one Pixel)
//-----------------------------------------------------------
// mode:
// 0=Clear, 1=Set, 2=XOR
void lcd_plot (uint8_t xpos, uint8_t ypos, uint8_t mode)
{
uint16_t adress;
uint8_t mask;
 
if ((xpos < DISP_W) && (ypos < DISP_H))
{
adress = (ypos / 8) * DISP_W + xpos; // adress = 0/8 * 128 + 0 = 0
mask = 1 << (ypos & 0x07); // mask = 1<<0 = 1
adress &= DISP_BUFFER - 1;
switch (mode)
{
 
case 0:
display_buffer[adress] &= ~mask;
break;
 
case 1:
display_buffer[adress] |= mask;
break;
 
case 2:
display_buffer[adress] ^= mask;
break;
}
set_adress (adress, display_buffer[adress]);
}
}
 
 
//-----------------------------------------------------------
// + Line (draws a line from x1,y1 to x2,y2
// + Based on Bresenham line-Algorithm
// + found in the internet, modified by thkais 2007
//-----------------------------------------------------------
 
void lcd_line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uint8_t mode)
{
int x, y, count, xs, ys, xm, ym;
 
x = (int) x1;
y = (int) y1;
xs = (int) x2 - (int) x1;
ys = (int) y2 - (int) y1;
if (xs < 0)
xm = -1;
else
if (xs > 0)
xm = 1;
else
xm = 0;
if (ys < 0)
ym = -1;
else
if (ys > 0)
ym = 1;
else
ym = 0;
if (xs < 0)
xs = -xs;
 
if (ys < 0)
ys = -ys;
 
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
 
if (xs > ys) // Flat Line <45 degrees
{
count = -(xs / 2);
while (x != x2)
{
count = count + ys;
x = x + xm;
if (count > 0)
{
y = y + ym;
count = count - xs;
}
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
}
}
else // Line >=45 degrees
{
count =- (ys / 2);
while (y != y2)
{
count = count + xs;
y = y + ym;
if (count > 0)
{
x = x + xm;
count = count - ys;
}
lcd_plot ((unsigned char) x, (unsigned char) y, mode);
}
}
}
 
 
//-----------------------------------------------------------
// + Filled rectangle
// + x1, y1 = upper left corner
//-----------------------------------------------------------
 
void lcd_frect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode)
{
uint16_t x2, y2;
uint16_t i;
 
if (x1 >= DISP_W)
x1 = DISP_W - 1;
 
if (y1 >= DISP_H)
y1 = DISP_H - 1;
 
x2 = x1 + widthx;
y2 = y1 + widthy;
 
if (x2 > DISP_W)
x2 = DISP_W;
 
if (y2 > DISP_H)
y2 = DISP_H;
 
for (i = y1; i <= y2; i++)
{
lcd_line (x1, i, x2, i, mode);
}
}
 
 
//-----------------------------------------------------------
// + outline of rectangle
// + x1, y1 = upper left corner
//-----------------------------------------------------------
 
void lcd_rect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode)
{
uint16_t x2, y2;
 
if (x1 >= DISP_W)
x1 = DISP_W - 1;
if (y1 >= DISP_H)
y1 = DISP_H - 1;
x2 = x1 + widthx;
y2 = y1 + widthy;
 
if (x2 > DISP_W)
x2 = DISP_W;
 
if (y2 > DISP_H)
y2 = DISP_H;
 
lcd_line (x1, y1, x2, y1, mode);
lcd_line (x2, y1, x2, y2, mode);
lcd_line (x2, y2, x1, y2, mode);
lcd_line (x1, y2, x1, y1, mode);
}
 
 
//-----------------------------------------------------------
// + outline of a circle
// + Based on Bresenham-algorithm found in wikipedia
// + modified by thkais (2007)
//-----------------------------------------------------------
 
void lcd_circle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode)
{
int16_t f = 1 - radius;
int16_t ddF_x = 0;
int16_t ddF_y = -2 * radius;
int16_t x = 0;
int16_t y = radius;
 
lcd_plot (x0, y0 + radius, mode);
lcd_plot (x0, y0 - radius, mode);
lcd_plot (x0 + radius, y0, mode);
lcd_plot (x0 - radius, y0, mode);
 
while (x < y)
{
if (f >= 0)
{
y --;
ddF_y += 2;
f += ddF_y;
}
x ++;
ddF_x += 2;
f += ddF_x + 1;
 
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 - x, y0 + y, mode);
 
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 - y, mode);
 
lcd_plot (x0 + y, y0 + x, mode);
lcd_plot (x0 - y, y0 + x, mode);
 
lcd_plot (x0 + y, y0 - x, mode);
lcd_plot (x0 - y, y0 - x, mode);
}
}
 
 
//-----------------------------------------------------------
// + filled Circle
// + modified circle-algorithm thkais (2007)
//-----------------------------------------------------------
 
void lcd_fcircle (int16_t x0, int16_t y0, int16_t radius,uint8_t mode)
{
int16_t f = 1 - radius;
int16_t ddF_x = 0;
int16_t ddF_y = -2 * radius;
int16_t x = 0;
int16_t y = radius;
 
lcd_line (x0, y0 + radius, x0, y0 - radius, mode);
 
lcd_line (x0 + radius, y0, x0 - radius, y0, mode);
 
while (x < y)
{
if (f >= 0)
{
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x + 1;
 
lcd_line (x0 + x, y0 + y, x0 - x, y0 + y, mode);
lcd_line (x0 + x, y0 - y, x0 - x, y0 - y, mode);
lcd_line (x0 + y, y0 + x, x0 - y, y0 + x, mode);
lcd_line (x0 + y, y0 - x, x0 - y, y0 - x, mode);
}
}
 
 
//-----------------------------------------------------------
//
void lcd_circ_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode)
{
uint8_t xc, yc;
double deg_rad;
 
deg_rad = (deg * M_PI) / 180.0;
 
yc = y - (uint8_t) round (cos (deg_rad) * (double) r);
xc = x + (uint8_t) round (sin (deg_rad) * (double) r);
lcd_line (x, y, xc, yc, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ellipse_line (uint8_t x, uint8_t y, uint8_t rx, uint8_t ry, uint16_t deg, uint8_t mode)
{
uint8_t xc, yc;
double deg_rad;
 
deg_rad = (deg * M_PI) / 180.0;
 
yc = y - (uint8_t) round (cos (deg_rad) * (double) ry);
xc = x + (uint8_t) round (sin (deg_rad) * (double) rx);
lcd_line (x, y, xc, yc, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ellipse (int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint8_t mode)
{
const int16_t rx2 = rx * rx;
const int16_t ry2 = ry * ry;
int16_t F = round (ry2 - rx2 * ry + 0.25 * rx2);
int16_t ddF_x = 0;
int16_t ddF_y = 2 * rx2 * ry;
int16_t x = 0;
int16_t y = ry;
 
lcd_plot (x0, y0 + ry, mode);
lcd_plot (x0, y0 - ry, mode);
lcd_plot (x0 + rx, y0, mode);
lcd_plot (x0 - rx, y0, mode);
// while ( 2*ry2*x < 2*rx2*y ) { we can use ddF_x and ddF_y
while (ddF_x < ddF_y)
{
if(F >= 0)
{
y -= 1; // south
ddF_y -= 2 * rx2;
F -= ddF_y;
}
x += 1; // east
ddF_x += 2 * ry2;
F += ddF_x + ry2;
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 + y, mode);
lcd_plot (x0 - x, y0 - y, mode);
}
F = round (ry2 * (x + 0.5) * (x + 0.5) + rx2 * (y - 1) * (y - 1) - rx2 * ry2);
while(y > 0)
{
if(F <= 0)
{
x += 1; // east
ddF_x += 2 * ry2;
F += ddF_x;
}
y -= 1; // south
ddF_y -= 2 * rx2;
F += rx2 - ddF_y;
lcd_plot (x0 + x, y0 + y, mode);
lcd_plot (x0 + x, y0 - y, mode);
lcd_plot (x0 - x, y0 + y, mode);
lcd_plot (x0 - x, y0 - y, mode);
}
}
 
 
//-----------------------------------------------------------
//
void lcd_ecircle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode)
{
lcd_ellipse (x0, y0, radius + 3, radius, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_ecirc_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode)
{
lcd_ellipse_line(x, y, r + 3, r, deg, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_view_font (uint8_t page)
{
int x;
int y;
 
lcd_cls ();
lcd_printp (PSTR(" 0123456789ABCDEF\r\n"), 0);
lcd_printpns_at (0, 7, PSTR(" \x1a \x1b Exit"), 0);
 
lcd_ypos = 2;
for (y = page * 4 ; y < (page * 4 + 4); y++)
{
if (y < 10)
{
lcd_putc (0, lcd_ypos, '0' + y, 0);
}
else
{
lcd_putc (0, lcd_ypos, 'A' + y - 10, 0);
}
lcd_xpos = 2;
for (x = 0; x < 16; x++)
{
lcd_putc (lcd_xpos, lcd_ypos, y * 16 + x, 0);
lcd_xpos++;
}
lcd_ypos++;
}
}
 
 
//-----------------------------------------------------------
uint8_t hdigit (uint8_t d)
{
if (d < 10)
{
return '0' + d;
}
else
{
return 'A' + d - 10;
}
}
 
 
//-----------------------------------------------------------
void lcd_print_hex_at (uint8_t x, uint8_t y, uint8_t h, uint8_t mode)
{
lcd_xpos = x;
lcd_ypos = y;
 
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h >> 4), mode);
lcd_putc (lcd_xpos, lcd_ypos, hdigit (h & 0x0f), mode);
}
 
 
//-----------------------------------------------------------
void lcd_print_hex (uint8_t h, uint8_t mode)
{
// lcd_xpos = x;
// lcd_ypos = y;
 
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h >> 4), mode);
lcd_putc (lcd_xpos++, lcd_ypos, hdigit (h & 0x0f), mode);
lcd_putc (lcd_xpos++, lcd_ypos, ' ', mode);
}
 
 
//-----------------------------------------------------------
void lcd_write_number_u (uint8_t number)
{
uint8_t num = 100;
uint8_t started = 0;
 
while (num > 0)
{
uint8_t b = number / num;
if (b > 0 || started || num == 1)
{
lcd_putc (lcd_xpos++, lcd_ypos, '0' + b, 0);
started = 1;
}
number -= b * num;
 
num /= 10;
}
}
 
 
//-----------------------------------------------------------
void lcd_write_number_u_at (uint8_t x, uint8_t y, uint8_t number)
{
lcd_xpos = x;
lcd_ypos = y;
lcd_write_number_u (number);
}
 
 
//-----------------------------------------------------------
// Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_u (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad, uint8_t mode)
{
char s[7];
 
utoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', mode);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad==1)
{
lcd_putc (x++, y, '0', mode);
}
else
{
lcd_putc (x++, y, ' ', mode);
}
}
lcd_print_at(x, y, (uint8_t*)s, mode);
}
 
//-----------------------------------------------------------
// Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_s (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad, uint8_t mode)
{
char s[7];
 
itoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', mode);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', mode);
}
else
{
lcd_putc (x++, y, ' ', mode);
}
}
lcd_print_at(x, y, (uint8_t*)s, mode);
}
 
 
//-----------------------------------------------------------
// Write only some digits of a unsigned <number> at <x>/<y> to MAX7456 display memory
// as /10th of the value
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_u_10th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad, uint8_t mode)
{
char s[7];
 
itoa(number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', mode);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', mode);
}
else
{
lcd_putc (x++, y, ' ', mode);
}
}
 
char rest = s[len - 1];
 
s[len - 1] = 0;
 
if (len == 1)
{
lcd_putc (x-1, y, '0', mode);
}
else if (len == 2 && s[0] == '-')
{
lcd_putc (x-1, y, '-', mode);
lcd_putc (x, y, '0', mode);
}
else
{
lcd_print_at(x, y, (uint8_t*)s, mode);
}
x += len - 1;
lcd_putc (x++, y, '.', mode);
lcd_putc (x++, y, rest, mode);
}
 
 
//-----------------------------------------------------------
void write_ndigit_number_u_100th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad)
{
uint8_t num = 100;
 
while (num > 0)
{
uint8_t b = number / num;
 
if ((num / 10) == 1)
{
lcd_putc (x++, y, '.', 0);
}
lcd_putc (x++, y, '0' + b, 0);
number -= b * num;
 
num /= 10;
}
}
 
 
//-----------------------------------------------------------
// Write only some digits of a signed <number> at <x>/<y> to MAX7456 display memory
// as /10th of the value
// <num> represents the largest multiple of 10 that will still be displayable as
// the first digit, so num = 10 will be 0-99 and so on
// <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
//
void write_ndigit_number_s_10th (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad, uint8_t mode)
{
char s[7];
 
itoa (number, s, 10 );
 
uint8_t len = strlen(s);
 
if (length < len)
{
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (x++, y, '*', mode);
}
return;
}
 
for (uint8_t i = 0; i < length - len; i++)
{
if (pad)
{
lcd_putc (x++, y, '0', mode);
}
else
{
lcd_putc (x++, y, ' ', mode);
}
}
 
char rest = s[len - 1];
 
s[len - 1] = 0;
 
if (len == 1)
{
lcd_putc (x-1, y, '0', mode);
}
else if (len == 2 && s[0] == '-')
{
lcd_putc (x-1, y, '-', mode);
lcd_putc (x, y, '0', mode);
}
else
{
lcd_print_at(x, y, (uint8_t*)s, mode);
}
x += len - 1;
lcd_putc (x++, y, '.', mode);
lcd_putc (x++, y, rest, mode);
}
 
 
//-----------------------------------------------------------
// write <seconds> as human readable time at <x>/<y> to MAX7456 display mem
//
void write_time (uint8_t x, uint8_t y, uint16_t seconds)
{
uint16_t min = seconds / 60;
seconds -= min * 60;
write_ndigit_number_u (x, y, min, 2, 0,0);
lcd_putc (x + 2, y, ':', 0);
write_ndigit_number_u (x + 3, y, seconds, 2, 1,0);
}
 
 
//-----------------------------------------------------------
// wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
//
void write_gps_pos (uint8_t x, uint8_t y, int32_t position)
{
if (position < 0)
{
position ^= ~0;
position++;
lcd_putc (x++, y, '-', 0);
}
else
{
lcd_putc (x++, y, ' ', 0);
}
write_ndigit_number_u (x, y, (uint16_t) (position / (int32_t) 10000000), 3, 1,0);
lcd_putc (x + 3, y, '.', 0);
position = position - ((position / (int32_t) 10000000) * (int32_t) 10000000);
write_ndigit_number_u (x + 4, y, (uint16_t) (position / (int32_t) 1000), 4, 1,0);
position = position - ((uint16_t) (position / (int32_t) 1000) * (int32_t) 1000);
write_ndigit_number_u (x + 8, y, (uint16_t) position, 3, 1,0);
lcd_putc (x + 11, y, 0x1e, 0); // degree symbol
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/lcd.h
0,0 → 1,275
/*****************************************************************************
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* - original LCD control by Thomas "thkais" Kaiser *
* - special number formating routines taken from C-OSD *
* from Claas Anders "CaScAdE" Rathje *
* - some extension, ellipse and circ_line by Peter "woggle" Mack *
* Thanks to Oliver Schwaneberg for adding several functions to this library!*
* *
* Author: Jan Michel (jan at mueschelsoft dot de) *
* License: GNU General Public License, version 3 *
* Version: v0.93 September 2010 *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
*****************************************************************************/
 
#ifndef _LCD_H
#define _LCD_H
 
/*
 
//-----------------------------------------------------------------------------
// Command Codes
//-----------------------------------------------------------------------------
//1: Display on/off
#define LCD_DISPLAY_ON 0xAF //switch display on
#define LCD_DISPLAY_OFF 0xAE //switch display off
 
//2: display start line set (lower 6 bits select first line on lcd from 64 lines in memory)
#define LCD_START_LINE 0x40
 
//3: Page address set (lower 4 bits select one of 8 pages)
#define LCD_PAGE_ADDRESS 0xB0
 
//4: column address (lower 4 bits are upper / lower nibble of column address)
#define LCD_COL_ADDRESS_MSB 0x10
#define LCD_COL_ADDRESS_LSB 0x00 //second part of column address
 
//8: select orientation (black side of the display should be further away from viewer)
#define LCD_BOTTOMVIEW 0xA1 //6 o'clock view
#define LCD_TOPVIEW 0xA0 //12 o'clock view
 
//9: select normal (white background, black pixels) or reverse (black background, white pixels) mode
#define LCD_DISPLAY_POSITIVE 0xA6 //not inverted mode
#define LCD_DISPLAY_INVERTED 0xA7 //inverted display
 
//10: show memory content or switch all pixels on
#define LCD_SHOW_NORMAL 0xA4 //show dram content
#define LCD_SHOW_ALL_POINTS 0xA5 //show all points
 
//11: lcd bias set
#define LCD_BIAS_1_9 0xA2
#define LCD_BIAS_1_7 0xA3
 
//14: Reset Controller
#define LCD_RESET_CMD 0xE2
 
//15: output mode select (turns display upside-down)
#define LCD_SCAN_DIR_NORMAL 0xC0 //normal scan direction
#define LCD_SCAN_DIR_REVERSE 0xC8 //reversed scan direction
 
//16: power control set (lower 3 bits select operating mode)
//Bit 0: Voltage follower on/off - Bit 1: Voltage regulator on/off - Bit 2: Booster circuit on/off
#define LCD_POWER_CONTROL 0x28 //base command
#define LCD_POWER_LOW_POWER 0x2F
#define LCD_POWER_WIDE_RANGE 0x2F
#define LCD_POWER_LOW_VOLTAGE 0x2B
 
//17: voltage regulator resistor ratio set (lower 3 bits select ratio)
//selects lcd voltage - 000 is low (~ -2V), 111 is high (~ - 10V), also depending on volume mode. Datasheet suggests 011
#define LCD_VOLTAGE 0x20
 
//18: Volume mode set (2-byte command, lower 6 bits in second word select value, datasheet suggests 0x1F)
#define LCD_VOLUME_MODE_1 0x81
#define LCD_VOLUME_MODE_2 0x00
 
//#if DISPLAY_TYPE == 128 || DISPLAY_TYPE == 132
//19: static indicator (2-byte command), first on/off, then blinking mode
#define LCD_INDICATOR_ON 0xAD //static indicator on
#define LCD_INDICATOR_OFF 0xAC //static indicator off
#define LCD_INDICATOR_MODE_OFF 0x00
#define LCD_INDICATOR_MODE_1HZ 0x01
#define LCD_INDICATOR_MODE_2HZ 0x10
#define LCD_INDICATOR_MODE_ON 0x11
 
//20: booster ratio set (2-byte command)
#define LCD_BOOSTER_SET 0xF8 //set booster ratio
#define LCD_BOOSTER_234 0x00 //2x-4x
#define LCD_BOOSTER_5 0x01 //5x
#define LCD_BOOSTER_6 0x03 //6x
//#endif
 
//22: NOP command
#define LCD_NOP 0xE3
 
//#if DISPLAY_TYPE == 102
////25: advanced program control
//#define LCD_ADV_PROG_CTRL 0xFA
//#define LCD_ADV_PROG_CTRL2 0x10
//#endif
 
//-----------------------------------------------------------------------------
// Makros to execute commands
//-----------------------------------------------------------------------------
 
#define LCD_SWITCH_ON() lcd_command(LCD_DISPLAY_ON)
#define LCD_SWITCH_OFF() lcd_command(LCD_DISPLAY_OFF)
#define LCD_SET_FIRST_LINE(i) lcd_command(LCD_START_LINE | ((i) & 0x3F))
#define LCD_SET_PAGE_ADDR(i) lcd_command(LCD_PAGE_ADDRESS | ((i) & 0x0F))
#define LCD_SET_COLUMN_ADDR(i) lcd_command(LCD_COL_ADDRESS_MSB | ((i>>4) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_LSB | ((i) & 0x0F))
#define LCD_GOTO_ADDRESS(page,col); lcd_command(LCD_PAGE_ADDRESS | ((page) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_MSB | ((col>>4) & 0x0F)); \
lcd_command(LCD_COL_ADDRESS_LSB | ((col) & 0x0F));
 
#define LCD_SET_BOTTOM_VIEW() lcd_command(LCD_BOTTOMVIEW)
#define LCD_SET_TOP_VIEW() lcd_command(LCD_TOPVIEW)
#define LCD_SET_MODE_POSITIVE() lcd_command(LCD_DISPLAY_POSITIVE)
#define LCD_SET_MODE_INVERTED() lcd_command(LCD_DISPLAY_INVERTED)
#define LCD_SHOW_ALL_PIXELS_ON() lcd_command(LCD_SHOW_ALL_POINTS)
#define LCD_SHOW_ALL_PIXELS_OFF() lcd_command(LCD_SHOW_NORMAL)
#define LCD_SET_BIAS_RATIO_1_7() lcd_command(LCD_BIAS_1_7)
#define LCD_SET_BIAS_RATIO_1_9() lcd_command(LCD_BIAS_1_9)
#define LCD_SEND_RESET() lcd_command(LCD_RESET_CMD)
#define LCD_ORIENTATION_NORMAL() lcd_command(LCD_SCAN_DIR_NORMAL)
#define LCD_ORIENTATION_UPSIDEDOWN() lcd_command(LCD_SCAN_DIR_REVERSE)
#define LCD_SET_POWER_CONTROL(i) lcd_command(LCD_POWER_CONTROL | ((i) & 0x07))
#define LCD_SET_LOW_POWER() lcd_command(LCD_POWER_LOW_POWER)
#define LCD_SET_WIDE_RANGE() lcd_command(LCD_POWER_WIDE_RANGE)
#define LCD_SET_LOW_VOLTAGE() lcd_command(LCD_POWER_LOW_VOLTAGE)
#define LCD_SET_BIAS_VOLTAGE(i) lcd_command(LCD_VOLTAGE | ((i) & 0x07))
#define LCD_SET_VOLUME_MODE(i) lcd_command(LCD_VOLUME_MODE_1); \
lcd_command(LCD_VOLUME_MODE_2 | ((i) & 0x3F))
 
//#if DISPLAY_TYPE == 128 || DISPLAY_TYPE == 132
#define LCD_SET_INDICATOR_OFF() lcd_command(LCD_INDICATOR_OFF); \
lcd_command(LCD_INDICATOR_MODE_OFF)
#define LCD_SET_INDICATOR_STATIC() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_ON)
#define LCD_SET_INDICATOR_1HZ() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_1HZ)
#define LCD_SET_INDICATOR_2HZ() lcd_command(LCD_INDICATOR_ON); \
lcd_command(LCD_INDICATOR_MODE_2HZ)
#define LCD_SET_INDICATOR(i,j) lcd_command(LCD_INDICATOR_OFF | ((i) & 1)); \
lcd_command(((j) & 2))
#define LCD_SLEEP_MODE lcd_command(LCD_INDICATOR_OFF); \
lcd_command(LCD_DISPLAY_OFF); \
lcd_command(LCD_SHOW_ALL_POINTS)
//#endif
 
//#if DISPLAY_TYPE == 102
//#define LCD_TEMPCOMP_HIGH 0x80
//#define LCD_COLWRAP 0x02
//#define LCD_PAGEWRAP 0x01
//#define LCD_SET_ADV_PROG_CTRL(i) lcd_command(LCD_ADV_PROG_CTRL);
// lcd_command(LCD_ADV_PROG_CTRL2 & i)
//#endif
 
*/
 
 
 
extern volatile uint8_t LCD_ORIENTATION;
 
//#define LCD_LINES 8
//#define LCD_COLS 21
 
extern uint8_t lcd_xpos;
extern uint8_t lcd_ypos;
 
void lcd_command(uint8_t cmd);
void send_byte (uint8_t data);
void LCD_Init (uint8_t LCD_Mode);
void new_line (void);
void lcd_puts_at(uint8_t x, uint8_t y,const char *s, uint8_t mode );
void lcd_putc (uint8_t x, uint8_t y, uint8_t c, uint8_t mode);
void send_byte (uint8_t data);
void lcd_print (uint8_t *text, uint8_t mode);
void lcd_print_at (uint8_t x, uint8_t y, uint8_t *text, uint8_t mode);
void lcd_printp (const char *text, uint8_t mode);
void lcd_printp_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
void lcd_printpns (const char *text, uint8_t mode);
void lcd_printpns_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
void lcd_cls (void);
void lcd_cls_line (uint8_t x, uint8_t y, uint8_t w);
 
void print_display (uint8_t *text);
void print_display_at (uint8_t x, uint8_t y, uint8_t *text);
void copy_line (uint8_t y);
void paste_line (uint8_t y);
 
// Jeti
void lcd_putc_jeti (uint8_t x, uint8_t y, uint8_t c, uint8_t mode);
void lcd_printpj (const char *text, uint8_t mode);
void lcd_printpj_at (uint8_t x, uint8_t y, const char *text, uint8_t mode);
 
void lcd_plot (uint8_t x, uint8_t y, uint8_t mode);
void lcd_line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uint8_t mode);
void lcd_rect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode);
void lcd_frect (uint8_t x1, uint8_t y1, uint8_t widthx, uint8_t widthy, uint8_t mode);
void lcd_circle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode);
void lcd_fcircle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode);
void lcd_circ_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode);
 
void lcd_ellipse (int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint8_t mode);
void lcd_ellipse_line (uint8_t x, uint8_t y, uint8_t rx, uint8_t ry, uint16_t deg, uint8_t mode);
 
void lcd_ecircle (int16_t x0, int16_t y0, int16_t radius, uint8_t mode);
void lcd_ecirc_line (uint8_t x, uint8_t y, uint8_t r, uint16_t deg, uint8_t mode);
 
void lcd_view_font (uint8_t page);
void lcd_print_hex_at (uint8_t x, uint8_t y, uint8_t h, uint8_t mode);
 
void lcd_write_number_u (uint8_t number);
void lcd_write_number_u_at (uint8_t x, uint8_t y, uint8_t number);
void lcd_print_hex (uint8_t h, uint8_t mode);
/**
* Write only some digits of a unsigned <number> at <x>/<y>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad,uint8_t mode);
 
/**
* Write only some digits of a signed <number> at <x>/<y>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
 
void write_ndigit_number_s (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad, uint8_t mode);
 
/**
* Write only some digits of a unsigned <number> at <x>/<y> as /10th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_u_10th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad, uint8_t mode);
 
/**
* Write only some digits of a unsigned <number> at <x>/<y> as /100th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_u_100th (uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad);
 
/**
* Write only some digits of a signed <number> at <x>/<y> as /10th of the value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 00.7 instead of .7
*/
void write_ndigit_number_s_10th (uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad, uint8_t mode);
 
/**
* write <seconds> as human readable time at <x>/<y>
*/
void write_time (uint8_t x, uint8_t y, uint16_t seconds);
 
/**
* wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
*/
void write_gps_pos (uint8_t x, uint8_t y, int32_t position);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/lipo.c
0,0 → 1,150
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include "main.h"
#include "lcd.h"
#include "lipo.h"
#include "eeprom.h"
#if defined HWVERSION1_3W || defined HWVERSION3_9 || defined HWVERSION1_2W
// Global variables
double accumulator = 0; //!< Accumulated 10-bit samples
double Vin = 0; //!< 16-bit float number result
short temp = 0; //!< Temporary variable
short samples = 0; //!< Number of conversions
uint16_t volt_avg = 0;
 
 
//! ADC interrupt routine
 
ISR (ADC_vect)
{
accumulator += ADCW;
samples++;
if(samples>4095)
{
oversampled();
}
}
 
 
 
//--------------------------------------------------------------
//
void ADC_Init (void) // MartinR: wird in HAL_HW3_9 aufgerufen
{
ADMUX = (0<<REFS1) | (1<<REFS0); // externe 5V Referenzspannung nutzen
ADMUX = (ADMUX & ~(0x1F)) | (1 & 0x1F); // ADC1 verwenden
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // ADC Enable, Interrupt Enable, ADC Start, Auto Trigger, Prescaler 128
}
 
 
/*! Error compensation, Scaling 16-bit result, Rounding up
, Calculate 16-bit result, Resets variables
 
Quelle AVR121: Enhancing ADC resolution by versampling
 
*/
void oversampled(void) // MartinR: wird vom Interrupt aufgerufen
{
cli();
accumulator += Lipo_UOffset; //5150 Offset error compensation
 
// accumulator *= 0.9993; // Gain error compensation
accumulator *= 0.9600; //0.9800 Gain error compensation
temp=(int)accumulator%64;
accumulator/=64; // Scaling the answer
if(temp>=32)
{
accumulator += 1; // Round up
}
 
// Vin = (accumulator/65536)*4.910; // Calculating 16-bit result
 
Vin =accumulator/7.5;
volt_avg = Vin;
// write_ndigit_number_u(0, 3, Vin, 5, 0);
// write_ndigit_number_u(0, 4, volt_avg, 5, 0);
samples = 0;
accumulator = 0;
 
sei();
}
 
 
void show_Lipo(void) // MartinR: wird an verschiedenen Stellen aufgerufen
{
 
uint16_t Balken = 0;
 
 
lcd_rect(103,2,1,3,1);
if (volt_avg < 320)
{
Balken = 0;
lcd_frect(106 + Balken-1, 2, 19-Balken, 3, 0); // löschen
}
 
 
if (PKT_Accutyp == true) //LiPO Akku
{
lcd_rect(104, 0, 23, 7, 1); // Rahmen
if (volt_avg >= 420) Balken = 19;
if ((volt_avg > 320) && (volt_avg < 420)) Balken = (volt_avg-320)/5;
lcd_frect(106 + Balken+1, 2, 19-Balken, 3, 0); // löschen
}
 
if (PKT_Accutyp == false) // LiON Akku
{
lcd_rect(104, 0, 22, 7, 1); // Rahmen
if (volt_avg >= 410) Balken = 18;
if ((volt_avg > 320) && (volt_avg < 410)) Balken = ((volt_avg-320)/5);
lcd_frect(106 + Balken+1, 2, 18-Balken, 3, 0); // löschen
}
 
 
if (Balken > 0) lcd_frect(106, 2, Balken, 3, 1); // Füllung
 
}
 
#endif
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/lipo.h
0,0 → 1,50
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef _LIPO_H
#define _LIPO_H
 
 
short samples; //!< Number of conversions
double Vin;
double accumulator;
 
uint16_t volt_avg;
 
void ADC_Init (void);
void oversampled(void);
void show_Lipo(void);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/main.c
0,0 → 1,381
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
 
//************************************************************************************
// Watchdog integrieren und abschalten, wird für Bootloader benötigt
// !!muss hier stehen bleiben!!
 
//--------------------------------------------------------------
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
 
//--------------------------------------------------------------
void wdt_init(void)
{
MCUSR = 0;
wdt_disable();
return;
}
 
//************************************************************************************
// erst ab hier weitere #includes
 
 
#include "lipo.h"
#include "main.h"
#include "lcd.h"
#include "usart.h"
 
#include "uart1.h"
#include "mk-data-structs.h"
#include "parameter.h"
#include "menu.h"
#include "display.h"
#include "timer.h"
#include "eeprom.h"
#include "Wi232.h"
#include "twimaster.h"
#include "messages.h"
 
//#define MTEST 0 // Menu Test (skip FC/NC detection)
 
Version_t *version;
 
volatile uint8_t mode = 0;
uint8_t hardware = 0;
uint8_t current_hardware = 0;
mk_param_struct_t *mk_param_struct;
 
 
//--------------------------------------------------------------
int main (void)
{
#ifndef DEBUG
uint8_t timeout;
uint8_t val =0;
uint8_t spalte =0;
#endif
 
InitHWPorts(); // Hardwareanhängige Ports konfigurieren
// dafür wird je nach Hardware die HAL_HWxxx verwendet
// Define dazu in der main.h
 
hardware = NO;
current_hardware = 0;
 
 
if (PKT_StartInfo == true)
{
lcd_cls ();
// lcd_printp_at (0,0,PSTR("Portables Kopter Tool"), 0);
lcd_puts_at(0, 0, strGet(START_MSG1), 0);
lcd_puts_at(0, 1, strGet(START_MSG2), 0);
// lcd_printp_at (0,1,PSTR("für FC Ver "), 0);
// lcd_printp_at (11,1,PSTR(FC_Version),0);
// lcd_printp_at (0,3,PSTR("GNU GPL License"), 0);
lcd_puts_at(0, 3, strGet(GNU_GPL), 0);
 
#ifdef HWVERSION1_2
// lcd_printp_at (0,4,PSTR("Hardware 1.2"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
lcd_puts_at(0, 4, strGet(HW12), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
#endif
 
#ifdef HWVERSION1_2W
// lcd_printp_at (0,4,PSTR("Hardware 1.2W"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644"), 0);
lcd_puts_at(0, 4, strGet(HW12W), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644), 0);
#endif
 
#ifdef HWVERSION1_3
// lcd_printp_at (0,4,PSTR("Hardware 1.3"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
lcd_puts_at(0, 4, strGet(HW13), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
#endif
 
#ifdef HWVERSION1_3W
// lcd_printp_at (0,4,PSTR("Hardware 1.3W"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 644P"), 0);
lcd_puts_at(0, 4, strGet(HW13W), 0);
lcd_puts_at(0, 5, strGet(ATMEGA644P), 0);
#endif
 
#ifdef HWVERSION3_9
// lcd_printp_at (0,4,PSTR("Hardware 3.9"), 0);
// lcd_printp_at (0,5,PSTR("ATmega 1284P"), 0);
lcd_puts_at(0, 4, strGet(HW39), 0);
lcd_puts_at(0, 5, strGet(ATMEGA1284P), 0);
#endif
 
_delay_ms(1500);
}
 
#ifndef DEBUG
 
ReadLastPosition ();
 
if (LastLongitude>0x00000000 && LastLatitude>0x00000000)
{
lcd_cls ();
// lcd_printp_at (0, 4, PSTR(" Letzte Position "), 2);
// lcd_printp_at (0, 5, PSTR(" Breitengr Längengr "), 2);
// lcd_printp_at (0, 7, PSTR("löschen weiter"), 0);
lcd_puts_at(0, 0, strGet(START_LASTPOS), 2);
lcd_puts_at(0, 1, strGet(START_LASTPOS3), 2);
lcd_puts_at(0, 2, strGet(START_LASTPOS1), 2);
lcd_puts_at(0, 7, strGet(START_LASTPOS2), 0);
 
 
write_ndigit_number_u (1, 4, (uint16_t)(LastLatitude/10000000), 2, 0,0);
lcd_printp_at (3, 4, PSTR("."), 0);
write_ndigit_number_u (4, 4, (uint16_t)((LastLatitude/1000) % 10000), 4, 1,0);
write_ndigit_number_u (8, 4, (uint16_t)((LastLatitude/10) % 100), 2, 1,0);
 
 
write_ndigit_number_u (12, 4, (uint16_t)(LastLongitude/10000000), 2, 0,0);
lcd_printp_at (14, 4, PSTR("."), 0);
write_ndigit_number_u (15, 4, (uint16_t)((LastLongitude/1000) % 10000), 4, 1,0);
write_ndigit_number_u (19, 4, (uint16_t)((LastLongitude/10) % 100), 2, 1,0);
 
for (;;)
{
if (get_key_press (1 << KEY_MINUS))
{
WriteLastPosition(0x00000000,0x00000000); // Löschen
lcd_frect (0, (8*4), 128, 8, 0); // Zeile löschen (x, y, l, h, in Pixel)
lcd_frect (0, (8*5), 128, 8, 0);
// lcd_printp_at (0,5,PSTR(" gelöscht "), 0);
lcd_puts_at(0, 5, strGet(START_LASTPOSDEL), 0);
 
lcd_cls_line (0, 6, 21);
lcd_cls_line (0, 7, 21);
 
_delay_ms(1000);
break;
}
if (get_key_press (1 << KEY_ENTER))
{
lcd_cls_line (0, 4, 21);
lcd_cls_line (0, 5, 21);
lcd_cls_line (0, 6, 21);
lcd_cls_line (0, 7, 21);
break;
}
}
}
#endif
 
// switch to NC
USART_putc (0x1b);
USART_putc (0x1b);
USART_putc (0x55);
USART_putc (0xaa);
USART_putc (0x00);
 
mode = 'V';
 
#ifndef DEBUG
 
do
{
timeout = 50;
 
lcd_cls();
// lcd_printp_at (0,4,PSTR("Suche FC..."), 0);
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(0, 4, strGet(START_SEARCHFC), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
while (!rxd_buffer_locked && timeout)
{
SendOutData('v', ADDRESS_ANY, 0);
 
timer = 20;
 
while (timer > 0);
timeout--;
 
if (spalte <= 20)
{
lcd_printp_at (spalte,6,PSTR("?"),0);
spalte++;
}
else
{
lcd_cls_line (0,6,21);
spalte=0;
}
 
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
for (;;)
{
Debug = 0;
hardware = NO;
main_menu ();
}
}
 
}
 
if(timeout == 0)
{
// lcd_printp_at (0,5,PSTR("FC nicht gefunden!"), 0);
lcd_puts_at(0, 5, strGet(START_FCNOTFOUND), 0);
timer = 90;
while (timer > 0);
}
}
while(timeout == 0);
 
if (timeout != 0)
Decode64 ();
 
version = (Version_t *) pRxData;
 
if (PKT_StartInfo == true)
{
lcd_cls ();
// lcd_printp (PSTR("PKT-Tool GNU GPL\r\n"), 0);
// lcd_printp (PSTR("gefunden:\r\n\n"), 0);
lcd_puts_at(0, 0, strGet(START_FCFOUND), 0);
lcd_puts_at(0, 1, strGet(START_FCFOUND1), 0);
 
}
 
if ((rxd_buffer[1] - 'a') == ADDRESS_FC)
{
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Flight-Ctrl\r\n"), 0);
lcd_puts_at(0, 2, strGet(START_FCFOUND2), 0);
}
hardware = FC;
current_hardware = hardware;
}
else if ((rxd_buffer[1] - 'a') == ADDRESS_NC)
{
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Navi-Ctrl\r\n"), 0);
lcd_puts_at(0, 2, strGet(START_FCFOUND3), 0);
}
hardware = NC;
current_hardware = hardware;
}
 
if (PKT_StartInfo == true)
{
// lcd_printp (PSTR("Version: "), 0);
lcd_puts_at(0, 3, strGet(START_VERSIONCHECK), 0);
lcd_write_number_u_at (9, 3, version->SWMajor);
lcd_printp_at (10,3,PSTR("."), 0);
lcd_write_number_u_at (11,3,version->SWMinor);
lcd_write_number_u_at (14,3, version->SWPatch + 'a');
_delay_ms(2500);
}
SwitchToFC();
#else
if (PKT_StartInfo == true)
{
lcd_cls ();
lcd_printp (PSTR("PKT-Test DEBUG\r\n"), 0);
_delay_ms(1500);
}
 
#endif
 
 
#ifndef DEBUG
 
// EEprom Version / Struktur prüfen
// val = load_setting(1); // Parameterset 1 holen
val = load_setting(0xff); // aktuelles Parameterset holen
if (mk_param_struct->Revision != EEProm_Version)
{
lcd_cls ();
 
lcd_printp_at (0, 0, PSTR("EEPromRev "), 0);
lcd_write_number_u (EEProm_Version);
 
lcd_puts_at(13, 0, strGet(START_VERSIONCHECK1), 0);
// lcd_printp (PSTR("erwartet\r\n"), 0);
 
lcd_printp_at (0, 2, PSTR("EEPromRev "), 0);
lcd_write_number_u (mk_param_struct->Revision);
 
lcd_puts_at(13, 2, strGet(START_VERSIONCHECK2), 0);
// lcd_printp (PSTR(" gefunden\r\n"), 0);
 
// lcd_printp (PSTR("PKT-Tool nur mit\r\n"), 0);
// lcd_printp (PSTR("FC Software "), 0);
lcd_puts_at(0, 4, strGet(START_VERSIONCHECK3), 0);
lcd_puts_at(0, 5, strGet(START_VERSIONCHECK4), 0);
 
// lcd_printp (PSTR(FC_Version), 0);
lcd_printp_at (12, 5, PSTR(FC_Version), 0);
 
// lcd_printp (PSTR("\r\nkompatibel"), 0);
lcd_puts_at(0, 6, strGet(START_VERSIONCHECK5), 0);
hardware = NO;
set_beep ( 1500, 0x0040, BeepNormal);
 
_delay_ms(4000);
}
 
#endif
mode = 0;
rxd_buffer_locked = FALSE;
 
timer = 50;
while (timer > 0);
 
for (;;)
{
main_menu ();
}
}
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/main.h
0,0 → 1,127
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2012 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2012 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
/**
* @Author Cebra
*
* ${tags}
*/
//**
// *
// *
// *
//
/*
* File name: $HeadURL: http://mikrokopter.de/mikrosvn/Projects/Transportables_Koptertool/branch/GPL_PKT_V3_5_8a_FC086/main.h $
* Revision: $Revision: 1496 $
* Last modified: $Date: 2012-01-15 21:31:25 +0100 (So, 15 Jan 2012) $
* Last modified by: $Author: $
* $Id: main.h 1496 2012-01-15 20:31:25Z $
*/
#ifndef _MAIN_H
#define _MAIN_H
 
// Version der Software
#define PKTSWVersion "3.6.3a" // PKT Version
 
 
//#define DEBUG
 
 
// Fusebits für Hardware 1.2 D7 DC FC
// Fusebits für Hardware 1.3
// Fusebits für Hardware 3.x D7 DC FC
// avrdude -pm1284p -cavr109 -P/dev/ttyUSB1 -b115200 -V -Uflash:w:Dateiname.hex:a
 
 
// hier die entsprechende Hardwareversion der Leiterplatte einstellen
 
// MartinR: Hardwareversion jetzt in der makefile !!!!!!!!!!!!!
 
//#define HWVERSION1_2 // Hardware sebseb7
//#define HWVERSION1_2W // Hardware sebseb7 mit Wi232 Support
//#define HWVERSION1_3 // Hardware sebseb7
//#define HWVERSION1_3W // Hardware sebseb7 mit Wi232 Support
 
//#define HWVERSION3_9 // Hardware Cebra Oktober 2011 ATmega1284P
 
 
 
//#define ohne_Lipo // MartinR zur Abschaltung der Lipo-Überwachung
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
#include "HAL_HW1_2.h"
#endif
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
 
#if defined HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
 
#define NO 0
#define NC 1
#define FC 2
#define MK3MAG 3
#define MKGPS 4
#define Wi232 5
 
#define ENABLE_PWM
 
 
 
// Menueleiste am unteren Rand definieren
//
// 11 <> Change
//
// 12 /\ Up 13 \/ Down 14 < Left 15 > Right
//
// 16 /|\ Arrow up 17 \|/ Arrow down 18 <- Arrow left 19 -> Arrow right
//
// 1A ^ Triangle up 1B v Triangle down 1C < Triangle left 1D > Triangle right
//
// "01 234567 8901234567890"
// "|O |||||O |||||O|||||O|"
//
//#define KEY_LINE_1 " \x1a \x1b Ende OK"
//#define KEY_LINE_2 " \x18 \x19 Ende OK"
//#define KEY_LINE_3 " \x18 \x19 Ende"
 
 
extern volatile uint8_t mode;
extern uint8_t hardware;
extern uint8_t current_hardware;
 
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/menu.c
0,0 → 1,726
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
 
#include "main.h"
#include "lcd.h"
#include "parameter.h"
#include "menu.h"
#include "display.h"
#include "debug.h"
#include "timer.h"
#include "osd.h"
#include "motortest.h"
#include "gps.h"
#include "eeprom.h"
#include "setup.h"
#include "uart1.h"
#include "mk-data-structs.h"
#include "Wi232.h"
#include "servo.h"
#include "tools.h"
#include "connect.h"
#include "lipo.h"
#include "messages.h"
#include "bluetooth.h"
#include "followme.h"
#include "stick.h" // MartinR
 
 
// #define ITEMS_NC 8 //MartinR: so war es
#define ITEMS_NC 9 //MartinR:
 
prog_char param_menuitems_nc[ITEMS_NC][NUM_LANG][18]= // zeilen,zeichen+1
 
 
// German, English, French, Netherlands
/* // MartinR: so war es
{
{"OSD ","OSD ","OSD ","OSD "},
{"3D Lage ","3D angeles ","3D location ","3D locatie "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameters \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
*/
// MartinR: geändert
{
{"Joystick ","Joystick ","Joystick ","Joystick "},
{"OSD ","OSD ","OSD ","OSD "},
{"3D Lage ","3D angeles ","3D location ","3D locatie "},
{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_FC 5
 
prog_char param_menuitems_fc[ITEMS_FC][NUM_LANG][18]= // zeilen,zeichen+1
{
{"Joystick ","Joystick ","Joystick ","Joystick "},
//{"OSD ","OSD ","OSD ","OSD "},
//{"3D Lage ","3D angeles ","3D location ","3D locatie "},
//{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
//{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
//#define ITEMS_NO 6 // MartinR: so war es
#define ITEMS_NO 2 // MartinR:
 
prog_char param_menuitems_no[ITEMS_NO][NUM_LANG][18]= // zeilen,zeichen+1
/* // MartinR: so war es
{
{"BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester "},
{"Servo Tester ","Servo Tester ","Servo Tester ","Servo Tester "},
{"PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter "},
{"PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter "},
{"PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d"},
{"PKT Version ","PKT Version ","PKT Version ","PKT Versie "},
};
*/
// MartinR: geändert
{
{"Joystick ","Joystick ","Joystick ","Joystick "},
//{"OSD ","OSD ","OSD ","OSD "},
//{"3D Lage ","3D angeles ","3D location ","3D locatie "},
//{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
//{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
//{"MK Display ","MK Display ","MK Display ","MK Display "},
//{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
//{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_CR 9
 
prog_char param_copyright[ITEMS_CR][22]= // zeilen,zeichen+1
{
" ",
"(C) GNU GPL License ",
" NO WARRANTY ",
" ",
"2008 Thomas Kaiser ",
"2009-2010 Peter Mack ",
"2010 Sebastian Boehm ",
"2012 Chr. Brandtner &",
" Harald Bongartz ",
};
 
 
//--------------------------------------------------------------
// print cursor
void menu_set_cursor (uint8_t before, uint8_t line, uint8_t pos)
{
lcd_printp_at (pos, before, PSTR(" "), 0);
lcd_printp_at (pos, line, PSTR("\x1d"), 0);
}
 
 
// F�r Seting-Auswahl ------------------------------------------
//
uint8_t menu_choose (uint8_t min, uint8_t max, uint8_t pos, uint8_t start)
{
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
line = max;
// line = min; // Wenn wiederholen soll
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
line = min;
// line = max; // Wenn wiederholen soll
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r Setup und Parameter ------------------------------------------
//
uint8_t menu_choose2 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r das Hauptmenue ------------------------------------------
//
uint8_t menu_choose3 (uint8_t min, uint8_t max,uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
menu_set_cursor (line, line, pos);
 
do
{
 
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (get_key_long (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 250;
}
 
if(get_key_long (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return 251;
}
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 252;
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
#ifdef HWVERSION3_9
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
#endif
}
while (!(get_key_short (1 << KEY_ENTER)));
 
return line;
}
 
//--------------------------------------------------------------
//
void main_menu (void)
{
uint8_t ii = 0;
uint8_t offset = 0;
uint8_t size = 0;
uint8_t Save_hardware = 0;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val =0;
 
Save_hardware = hardware;
#ifdef HWVERSION3_9
#ifndef ohne_Lipo // MartinR
// MartinR: von HAL_HW3_9.c hierher verschoben
ADC_Init(); // ADC für Lipomessung
#endif
#endif
 
get_key_press(KEY_ALL);
 
while(1)
{
if (Debug==1)
hardware = NC;
if (Debug==0)
hardware = Save_hardware;
if(hardware == NO)
size = ITEMS_NO ;
if(hardware == NC)
size = ITEMS_NC ;
if(hardware == FC)
size = ITEMS_FC ;
 
lcd_cls ();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0, PSTR(FC_Version), 2);
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
 
 
while(2)
{
 
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
{
if(hardware == NC)
lcd_printp_at(3,ii+1,param_menuitems_nc[ii+offset][DisplayLanguage], 0);
else if(hardware == FC)
lcd_printp_at(3,ii+1,param_menuitems_fc[ii+offset][DisplayLanguage], 0);
else
lcd_printp_at(3,ii+1,param_menuitems_no[ii+offset][DisplayLanguage], 0);
}
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
#ifdef HWVERSION3_9
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
#endif
}
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose3 (1, 5, target_pos,0,1); //menu_choose3 (min, max, start, return_at_start, return_at_end)
else
val = menu_choose3 (1, size, target_pos,0,0);
}
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose3 (2, 6, target_pos,1,0);
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(val == 254)
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
offset--;
dmode = 0;
target_pos = 2;
}
#if defined HWVERSION3_9
else if(val == 252)
{
 
lcd_cls();
// lcd_printp_at (0, 2, PSTR(" PKT ausschalten?"),0);
lcd_puts_at(0, 2, strGet(SHUTDOWN), 0);
// lcd_printp_at (12, 7, PSTR("Nein Ja"),0);
lcd_puts_at(12, 7, strGet(YESNO), 0);
while(1)
{
if (get_key_press (1 << KEY_ENTER))
clr_V_On(); // Spannung abschalten
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
lcd_cls();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0,PSTR(FC_Version), 2);
// show_Lipo();
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
break;
}
}
}
else if(val == 251)
{
PC_Fast_Connect();
return;
}
#endif
else if(val == 250)
{
// Test_HB();
Test_Language();
return;
}
else
break;
}
 
target_pos = val;
// MartinR: !!!!!!!!!!!!!!!!!!!
#ifdef HWVERSION3_9
if(hardware == NC)
{
if((val+offset) == 1 )
joystick();
if((val+offset) == 2 )
osd(OSD_Mode);
if((val+offset) == 3 )
osd(THREE_D_Mode);
if((val+offset) == 4 )
gps();
if((val+offset) == 5 )
FollowMe();
if((val+offset) == 6 )
display_data();
if((val+offset) == 7 )
edit_parameter();
 
if((val+offset) == 8 )
//TODO: Debug an FC087 anpassen
display_debug();
 
if((val+offset) == 9 )
PKT_Tools();
}
#endif
 
if(hardware == FC)
{
if((val+offset) == 1 )
joystick();
if((val+offset) == 2 )
display_data();
if((val+offset) == 3 )
edit_parameter();
if((val+offset) == 4 )
//TODO: Debug an FC087 anpassen
display_debug();
if((val+offset) == 5 )
PKT_Tools();
}
 
 
if(hardware == NO)
{
/* // MartinR: so war es
if((val+offset) == 1 )
motor_test(FC_Mode);
if((val+offset) == 2 )
servo_test();
#ifdef HWVERSION3_9
if (U02SV2 == 0)
{
if((val+offset) == 3 )
{
if (BTIsSlave==true)
{
Port_BT2Wi();
}
else
{
bt_set_mode(BLUETOOTH_SLAVE);
Port_BT2Wi();
}
}
if((val+offset) == 4 )
Port_USB2Wi();
}
else if (U02SV2 == 1)
{
if((val+offset) == 3 )
 
{
if (BTIsSlave==true)
{
Port_BT2FC();
}
else
{
bt_set_mode(BLUETOOTH_SLAVE);
Port_BT2FC();
 
}
}
 
if((val+offset) == 4 )
Port_USB2FC();
}
#else
if((val+offset) == 3 )
Show_Error_HW();
if((val+offset) == 4 )
Show_Error_HW();
#endif
if((val+offset) == 5 )
PKT_Setup();
if((val+offset) == 6 )
Show_Version();
*/
if((val+offset) == 1 )
joystick();
if((val+offset) == 2 )
PKT_Tools();
}
 
 
}
}
 
 
//--------------------------------------------------------------
//
void Update_PKT (void)
{
lcd_cls();
lcd_printp_at (0, 0, PSTR(" PKT Update "),2);
// lcd_printp_at (0, 1, PSTR("Connect PC to PKT-USB"),0);
lcd_puts_at(0, 1, strGet(UPDATE1), 0);
// lcd_printp_at (0, 2, PSTR("Press 'Start' on PKT "),0);
lcd_puts_at(0, 2, strGet(UPDATE2), 0);
lcd_printp_at (0, 3, PSTR("Start avrdude.exe "),0);
lcd_printp_at (0, 4, PSTR("-pm1284p -cavr109 "),0);
lcd_printp_at (0, 5, PSTR("-Pcom? -b115200 "),0);
lcd_printp_at (0, 6, PSTR("-Uflash:w:FILE.hex:a "),0);
// avrdude -pm1284p -cavr109 -P/dev/ttyUSB1 -b115200 -V -Uflash:w:Dateiname.hex:a
 
// lcd_printp_at (0, 7, PSTR(" Ende Start"), 0);
lcd_puts_at(0, 7, strGet(ENDSTART), 0);
 
do
{
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
}
while (!(get_key_press (1 << KEY_ENTER)));
{
 
// start bootloader with Reset, Hold KEY_ENTER*/
wdt_enable( WDTO_250MS );
while (1)
{;}
}
}
 
 
//--------------------------------------------------------------
//
void Show_Error_HW (void)
{
lcd_cls ();
lcd_printp_at (0, 2, PSTR(" Mit dieser Hardware"), 0);
lcd_printp_at (0, 3, PSTR(" nicht möglich!"), 0);
lcd_printp_at (12, 7, PSTR("Ende"), 0);
 
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
 
 
//--------------------------------------------------------------
//
void Show_Version (void)
{
uint8_t ii = 0;
uint8_t size = ITEMS_CR;
uint8_t page = 0;
 
lcd_cls ();
 
lcd_printp_at (0, 0, PSTR("PKT Tool V. "), 2);
lcd_printp_at (13,0, PSTR(PKTSWVersion),2);
// lcdPuts(Msg(MSG_VERSION1));
// lcd_printp_at (0, 0, Msg(MSG_VERSION1), 2);
// lcd_printp_at (0, 1, PSTR("für FC ver "), 2);
// lcd_printp_at (12,1, PSTR(FC_Version),2);
lcd_printp_at (0, 1, PSTR(" "), 2); //um die ganze Zeile schwarz zu füllen.
lcd_puts_at(0, 1, strGet(START_MSG2), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
for(ii = 0;ii < 3 ; ii++)
if((ii + page) < size)
lcd_printp_at(0,ii + 3,param_copyright[ii + page], 0);
 
if (page == 0)
{
lcd_printp_at (0, 2, PSTR(" "), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page > 0 && page < (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page >= (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR(" "), 0);
}
 
 
if (get_key_press (1 << KEY_PLUS))
if (page < size - 3)
page++;
 
if (get_key_press (1 << KEY_MINUS))
if (page > 0)
page--;
 
if (get_key_press (1 << KEY_ESC) || get_key_press (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return;
}
}
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/menu.c.bak
0,0 → 1,726
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
 
#include "main.h"
#include "lcd.h"
#include "parameter.h"
#include "menu.h"
#include "display.h"
#include "debug.h"
#include "timer.h"
#include "osd.h"
#include "motortest.h"
#include "gps.h"
#include "eeprom.h"
#include "setup.h"
#include "uart1.h"
#include "mk-data-structs.h"
#include "Wi232.h"
#include "servo.h"
#include "tools.h"
#include "connect.h"
#include "lipo.h"
#include "messages.h"
#include "bluetooth.h"
#include "followme.h"
#include "stick.h" // MartinR
 
 
// #define ITEMS_NC 8 //MartinR: so war es
#define ITEMS_NC 9 //MartinR:
 
prog_char param_menuitems_nc[ITEMS_NC][NUM_LANG][18]= // zeilen,zeichen+1
 
 
// German, English, French, Netherlands
/* // MartinR: so war es
{
{"OSD ","OSD ","OSD ","OSD "},
{"3D Lage ","3D angeles ","3D location ","3D locatie "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameters \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
*/
// MartinR: geändert
{
{"Joystick ","Joystick ","Joystick ","Joystick "},
{"OSD ","OSD ","OSD ","OSD "},
{"3D Lage ","3D angeles ","3D location ","3D locatie "},
{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_FC 5
 
prog_char param_menuitems_fc[ITEMS_FC][NUM_LANG][18]= // zeilen,zeichen+1
{
{"Joystick ","Joystick ","Joystick ","Joystick "},
//{"OSD ","OSD ","OSD ","OSD "},
//{"3D Lage ","3D angeles ","3D location ","3D locatie "},
//{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
//{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
{"MK Display ","MK Display ","MK Display ","MK Display "},
{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
//#define ITEMS_NO 6 // MartinR: so war es
#define ITEMS_NO 2 // MartinR:
 
prog_char param_menuitems_no[ITEMS_NO][NUM_LANG][18]= // zeilen,zeichen+1
/* // MartinR: so war es
{
{"BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester ","BL-Ctrl. Tester "},
{"Servo Tester ","Servo Tester ","Servo Tester ","Servo Tester "},
{"PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter "},
{"PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter "},
{"PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d"},
{"PKT Version ","PKT Version ","PKT Version ","PKT Versie "},
};
*/
// MartinR: geändert
{
{"Joystick ","Joystick ","Joystick ","Joystick "},
//{"OSD ","OSD ","OSD ","OSD "},
//{"3D Lage ","3D angeles ","3D location ","3D locatie "},
//{"GPS Info ","GPS Info ","GPS Info ","GPS Info "},
//{"Follow Me ","Follow Me ","Follow Me ","Follow Me "},
//{"MK Display ","MK Display ","MK Display ","MK Display "},
//{"Parameter \x1d","Parameter \x1d","Parameter \x1d","Parameter \x1d"},
//{"Debug Data ","Debug Data ","Debug Data ","Debug Data "},
{"PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d","PKT Tools \x1d"},
};
 
 
#define ITEMS_CR 9
 
prog_char param_copyright[ITEMS_CR][22]= // zeilen,zeichen+1
{
" ",
"(C) GNU GPL License ",
" NO WARRANTY ",
" ",
"2008 Thomas Kaiser ",
"2009-2010 Peter Mack ",
"2010 Sebastian Boehm ",
"2012 Chr. Brandtner &",
" Harald Bongartz ",
};
 
 
//--------------------------------------------------------------
// print cursor
void menu_set_cursor (uint8_t before, uint8_t line, uint8_t pos)
{
lcd_printp_at (pos, before, PSTR(" "), 0);
lcd_printp_at (pos, line, PSTR("\x1d"), 0);
}
 
 
// F�r Seting-Auswahl ------------------------------------------
//
uint8_t menu_choose (uint8_t min, uint8_t max, uint8_t pos, uint8_t start)
{
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
line = max;
// line = min; // Wenn wiederholen soll
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
line = min;
// line = max; // Wenn wiederholen soll
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r Setup und Parameter ------------------------------------------
//
uint8_t menu_choose2 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
uint8_t k;
 
menu_set_cursor (line, line, pos);
 
do
{
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
}
while (!(k = get_key_press ((1 << KEY_ENTER) | (1 << KEY_ESC))));
 
if (k & (1 << KEY_ESC))
line = 255;
 
return line;
}
 
// F�r das Hauptmenue ------------------------------------------
//
uint8_t menu_choose3 (uint8_t min, uint8_t max,uint8_t start, uint8_t return_at_start, uint8_t return_at_end)
{
uint8_t pos = 1;
uint8_t line = start;
uint8_t before = start;
 
menu_set_cursor (line, line, pos);
 
do
{
 
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if (line < max)
line ++;
else
{
if(return_at_end == 1)
return 254;
else
line = max;
// line = min; // Wenn wiederholen soll
}
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if (line > min)
line --;
else
{
if(return_at_start == 1)
return 253;
else
line = min;
// line = max; // Wenn wiederholen soll
}
}
 
if (get_key_long (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 250;
}
 
if(get_key_long (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return 251;
}
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return 252;
}
 
if (line != before)
{
menu_set_cursor (before, line, pos);
before = line;
}
#ifdef HWVERSION3_9
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
#endif
}
while (!(get_key_short (1 << KEY_ENTER)));
 
return line;
}
 
//--------------------------------------------------------------
//
void main_menu (void)
{
uint8_t ii = 0;
uint8_t offset = 0;
uint8_t size = 0;
uint8_t Save_hardware = 0;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val =0;
 
Save_hardware = hardware;
#ifdef HWVERSION3_9
#ifndef ohne_Lipo // MartinR
// MartinR: von HAL_HW3_9.c hierher verschoben
ADC_Init(); // ADC für Lipomessung
#endif
#endif
 
get_key_press(KEY_ALL);
 
while(1)
{
if (Debug==1)
hardware = NC;
if (Debug==0)
hardware = Save_hardware;
if(hardware == NO)
size = ITEMS_NO ;
if(hardware == FC)
size = ITEMS_FC ;
if(hardware == NC)
size = ITEMS_FC ;
 
 
lcd_cls ();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0, PSTR(FC_Version), 2);
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
 
 
while(2)
{
 
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
{
if(hardware == NC)
lcd_printp_at(3,ii+1,param_menuitems_nc[ii+offset][DisplayLanguage], 0);
else if(hardware == FC)
lcd_printp_at(3,ii+1,param_menuitems_fc[ii+offset][DisplayLanguage], 0);
else
lcd_printp_at(3,ii+1,param_menuitems_no[ii+offset][DisplayLanguage], 0);
}
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
#ifdef HWVERSION3_9
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
#endif
}
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose3 (1, 5, target_pos,0,1); //menu_choose3 (min, max, start, return_at_start, return_at_end)
else
val = menu_choose3 (1, size, target_pos,0,0);
}
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose3 (2, 6, target_pos,1,0);
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(val == 254)
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
offset--;
dmode = 0;
target_pos = 2;
}
#if defined HWVERSION3_9
else if(val == 252)
{
 
lcd_cls();
// lcd_printp_at (0, 2, PSTR(" PKT ausschalten?"),0);
lcd_puts_at(0, 2, strGet(SHUTDOWN), 0);
// lcd_printp_at (12, 7, PSTR("Nein Ja"),0);
lcd_puts_at(12, 7, strGet(YESNO), 0);
while(1)
{
if (get_key_press (1 << KEY_ENTER))
clr_V_On(); // Spannung abschalten
 
if (get_key_short (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
lcd_cls();
lcd_printp_at (0, 0, PSTR("PKT-Tool FC "), 2);
lcd_printp_at (12, 0,PSTR(FC_Version), 2);
// show_Lipo();
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_printp_at (12, 7, PSTR("Aus "), 0);
lcd_puts_at(12, 7, strGet(OFF), 0);
break;
}
}
}
else if(val == 251)
{
PC_Fast_Connect();
return;
}
#endif
else if(val == 250)
{
// Test_HB();
Test_Language();
return;
}
else
break;
}
 
target_pos = val;
// MartinR: !!!!!!!!!!!!!!!!!!!
#ifdef HWVERSION3_9
if(hardware == NC)
{
if((val+offset) == 1 )
joystick();
if((val+offset) == 2 )
osd(OSD_Mode);
if((val+offset) == 3 )
osd(THREE_D_Mode);
if((val+offset) == 4 )
gps();
if((val+offset) == 5 )
FollowMe();
if((val+offset) == 6 )
display_data();
if((val+offset) == 7 )
edit_parameter();
 
if((val+offset) == 8 )
//TODO: Debug an FC087 anpassen
display_debug();
 
if((val+offset) == 9 )
PKT_Tools();
}
#endif
 
if(hardware == FC)
{
if((val+offset) == 1 )
joystick();
if((val+offset) == 2 )
display_data();
if((val+offset) == 3 )
edit_parameter();
if((val+offset) == 4 )
//TODO: Debug an FC087 anpassen
display_debug();
if((val+offset) == 5 )
PKT_Tools();
}
 
 
if(hardware == NO)
{
/* // MartinR: so war es
if((val+offset) == 1 )
motor_test(FC_Mode);
if((val+offset) == 2 )
servo_test();
#ifdef HWVERSION3_9
if (U02SV2 == 0)
{
if((val+offset) == 3 )
{
if (BTIsSlave==true)
{
Port_BT2Wi();
}
else
{
bt_set_mode(BLUETOOTH_SLAVE);
Port_BT2Wi();
}
}
if((val+offset) == 4 )
Port_USB2Wi();
}
else if (U02SV2 == 1)
{
if((val+offset) == 3 )
 
{
if (BTIsSlave==true)
{
Port_BT2FC();
}
else
{
bt_set_mode(BLUETOOTH_SLAVE);
Port_BT2FC();
 
}
}
 
if((val+offset) == 4 )
Port_USB2FC();
}
#else
if((val+offset) == 3 )
Show_Error_HW();
if((val+offset) == 4 )
Show_Error_HW();
#endif
if((val+offset) == 5 )
PKT_Setup();
if((val+offset) == 6 )
Show_Version();
*/
if((val+offset) == 1 )
joystick();
if((val+offset) == 2 )
PKT_Tools();
}
 
 
}
}
 
 
//--------------------------------------------------------------
//
void Update_PKT (void)
{
lcd_cls();
lcd_printp_at (0, 0, PSTR(" PKT Update "),2);
// lcd_printp_at (0, 1, PSTR("Connect PC to PKT-USB"),0);
lcd_puts_at(0, 1, strGet(UPDATE1), 0);
// lcd_printp_at (0, 2, PSTR("Press 'Start' on PKT "),0);
lcd_puts_at(0, 2, strGet(UPDATE2), 0);
lcd_printp_at (0, 3, PSTR("Start avrdude.exe "),0);
lcd_printp_at (0, 4, PSTR("-pm1284p -cavr109 "),0);
lcd_printp_at (0, 5, PSTR("-Pcom? -b115200 "),0);
lcd_printp_at (0, 6, PSTR("-Uflash:w:FILE.hex:a "),0);
// avrdude -pm1284p -cavr109 -P/dev/ttyUSB1 -b115200 -V -Uflash:w:Dateiname.hex:a
 
// lcd_printp_at (0, 7, PSTR(" Ende Start"), 0);
lcd_puts_at(0, 7, strGet(ENDSTART), 0);
 
do
{
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
}
while (!(get_key_press (1 << KEY_ENTER)));
{
 
// start bootloader with Reset, Hold KEY_ENTER*/
wdt_enable( WDTO_250MS );
while (1)
{;}
}
}
 
 
//--------------------------------------------------------------
//
void Show_Error_HW (void)
{
lcd_cls ();
lcd_printp_at (0, 2, PSTR(" Mit dieser Hardware"), 0);
lcd_printp_at (0, 3, PSTR(" nicht möglich!"), 0);
lcd_printp_at (12, 7, PSTR("Ende"), 0);
 
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
 
 
//--------------------------------------------------------------
//
void Show_Version (void)
{
uint8_t ii = 0;
uint8_t size = ITEMS_CR;
uint8_t page = 0;
 
lcd_cls ();
 
lcd_printp_at (0, 0, PSTR("PKT Tool V. "), 2);
lcd_printp_at (13,0, PSTR(PKTSWVersion),2);
// lcdPuts(Msg(MSG_VERSION1));
// lcd_printp_at (0, 0, Msg(MSG_VERSION1), 2);
// lcd_printp_at (0, 1, PSTR("für FC ver "), 2);
// lcd_printp_at (12,1, PSTR(FC_Version),2);
lcd_printp_at (0, 1, PSTR(" "), 2); //um die ganze Zeile schwarz zu füllen.
lcd_puts_at(0, 1, strGet(START_MSG2), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
for(ii = 0;ii < 3 ; ii++)
if((ii + page) < size)
lcd_printp_at(0,ii + 3,param_copyright[ii + page], 0);
 
if (page == 0)
{
lcd_printp_at (0, 2, PSTR(" "), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page > 0 && page < (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR("\x13"), 0);
}
 
if (page >= (size - 3))
{
lcd_printp_at (0, 2, PSTR("\x12"), 0);
lcd_printp_at (0, 6, PSTR(" "), 0);
}
 
 
if (get_key_press (1 << KEY_PLUS))
if (page < size - 3)
page++;
 
if (get_key_press (1 << KEY_MINUS))
if (page > 0)
page--;
 
if (get_key_press (1 << KEY_ESC) || get_key_press (1 << KEY_ENTER))
{
get_key_press(KEY_ALL);
return;
}
}
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/menu.h
0,0 → 1,55
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef MENU_H
#define MENU_H
 
#define CURSOR_COL 1 // column where the menu cursor is displayed
#define MENU_LINE 1 // starting line of menu
#define MENU_COL 3 // column where the menu starts
#define OSD_Mode 1 // OSD Anzeige als OSD
#define THREE_D_Mode 3 // OSD Anzeige in 3D Position
 
void main_menu (void);
void Show_Version (void);
void Show_Error_HW (void);
void Update_PKT (void);
void PC_Fast_Connect (void);
 
 
uint8_t menu_choose (uint8_t min, uint8_t max, uint8_t pos, uint8_t start);
uint8_t menu_choose2 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end);
uint8_t menu_choose3 (uint8_t min, uint8_t max, uint8_t start, uint8_t return_at_start, uint8_t return_at_end);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/messages.c
0,0 → 1,2101
/****************************************************************************************
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Languagesupport: *
* http://www.netrino.com/Embedded-Systems/How-To/Firmware-Internationalization *
* Nigel Jones *
****************************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "main.h"
#include "lcd.h"
#include "timer.h"
#include "eeprom.h"
#include "messages.h"
 
 
 
 
typedef enum
{
GERMAN,
ENGLISH,
FRENCH,
NETHERLAND,
LAST_LANGUAGE,
 
} LANGUAGE;
 
 
 
typedef struct
{
/*
* Maximum length
*/
int const len;
 
/*
* Array of pointers to language-specific string
*/
char const * const text[LAST_LANGUAGE];
 
} STRING;
 
 
//--------------------------------------------------------------------------------------------------------------------
// Typdefinitionen für alle verwendeten Strings, LAST_STR muss am Ende stehen bleiben
//typedef enum
//TESTSTRING, KEYLINE1, KEYLINE2, KEYLINE3, KEYLINE4, KEYLINE5, BOOT1, BOOT2, BOOT_WI1, BOOT_WI2, BOOT_SV, START_MSG1, START_MSG2, GNU_GPL, ATMEGA644,
//ATMEGA644P, ATMEGA1284P, HW12, HW12W, HW13, HW13W, HW39, START_LASTPOS, START_LASTPOS1, START_LASTPOS2, START_LASTPOS3, START_LASTPOSDEL,
//START_SEARCHFC, ENDE, OK, FEHLER, AKTIV, START_FCNOTFOUND, START_FCFOUND, START_FCFOUND1, START_FCFOUND2, START_FCFOUND3, START_VERSIONCHECK,
//START_VERSIONCHECK1, START_VERSIONCHECK2, START_VERSIONCHECK3, START_VERSIONCHECK4, START_VERSIONCHECK5, ON, OFF, ESC, SHUTDOWN, YESNO,
//UPDATE1, UPDATE2, ENDSTART, TOOLS1, CONNECT1, CONNECT2, CONNECT4, CONNECT5, CONNECT6, CONNECT7, CONNECT8, CONNECT9, CONNECT10, CONNECT11, CONNECT12,
//CONNECT13, CONNECT14, CONNECT15, CONNECT16, CONNECT17, CONNECT18, CONNECT19, CONNECT20, CONNECT21, CONNECT22, CONNECT23, CONNECT24, CONNECT25,
//CONNECT26, CONNECT27, CONNECT28, CONNECT29, CONNECT30, CONNECT31, KABEL, SLAVE, NORMAL, REVERSE, ENDOK, EEPROM1, EEPROM2, DEUTSCH, ENGLISCH, FRANCE,
//NETHERL, DISPLAY1, DISPLAY2, DISPLAY3, DISPLAY4, DISPLAY5, DISPLAY6, DISPLAY7, DISPLAY8, DISPLAY9, DEBUGPKT, WITXRX, WINETWG, WINETWM, WITIMEOUT,
//WIUART, WI2321, WI2322, WI2323, YES, NOO, BT1, BT2, BT3, BT4, LIPO1, LIPO2, LIPO3, LIPO4, LIPO5, LIPO6, LOWBAT, OSD_3D_V, OSD_3D_H, OSD_3D_L,
//OSD_3D_R, OSD_3D_NICK, OSD_3D_ROLL, OSD_3D_COMPASS, OSD_ERROR, OSD_POS1, OSD_POS2, PARA_SETTINGS, PARA_CHANGE, PARA_AKTIVI, PARA_AKTIV,
//PARA_SAVESETT, PARA_SETTSAVED, PARA_COPY, PARA_FROMTO, PARA_ENDE, PARA_COPYQ, PARA_COPYACTIV, PARA_CHANGESETT, PARA_SELECT, PARA_SEITE,
//PARA_SELSETT, GPS1, GPS2, GPS3, STATS_ITEM_0, STATS_ITEM_1, STATS_ITEM_2, STATS_ITEM_3, STATS_ITEM_4, STATS_ITEM_5, STATS_ITEM_6, STATS_ITEM_7,
//STATS_ITEM_8, ONLY_NC, NO_SETTINGS, OSD_ALTI_0, OSD_ALTI_1, OSD_VARIO_0, OSD_VARIO_1, OSD_CARE_FREE_0, OSD_CARE_FREE_1, OSD_LED0, OSD_LED1, OSD_LED2,
//OSD_NAVI_MODE_0, OSD_NAVI_MODE_1, OSD_NAVI_MODE_2, OSD_FLAGS_0, OSD_FLAGS_1, OSD_FLAGS_2, OSD_FLAGS_3, OSD_FLAGS_4, OSD_FLAGS_5, OSD_FLAGS_6,
//OSD_Screen, OSD_Invert_Out, OSD_LED_Form, OSD_Send_OSD, LAST_STR,
 
 
 
static const STRING strings[LAST_STR] =
{
{ /*TESTSTRING*/
21,
{
"Not format hardisk C?", /* German */
"Not format hardisk C?", /* English*/
"Not format hardisk C?", /* French */
"Not format hardisk C?", /* Dutch */
 
}
},
 
{ /*KEYLINE1*/
21,
{
" \x1a \x1b Ende OK", /* German */
" \x1a \x1b end OK", /* English*/
" \x1a \x1b fin OK", /* French */
" \x1a \x1b Einde OK", /* Dutch */
 
}
},
 
{ /*KEYLINE2*/
21,
{
" \x18 \x19 Ende OK", /* German */
" \x18 \x19 end OK", /* English*/
" \x18 \x19 fin OK", /* French */
" \x18 \x19 Einde OK", /* Dutch */
 
}
},
 
{ /*KEYLINE3*/
21,
{
" \x18 \x19 Ende ", /* German */
" \x18 \x19 end ", /* English*/
" \x18 \x19 fin ", /* French */
" \x18 \x19 Einde", /* Dutch */
 
}
},
 
{ /*KEYLINE4*/
21,
{
"Ende OK", /* German */
"end OK", /* English*/
"fin OK", /* French */
"Einde OK", /* Dutch */
 
}
},
 
{ /*KEYLINE5*/
21,
{
"Ende Info", /* German */
"end info", /* English*/
"fin info", /* French */
"Eind Info", /* Dutch */
 
}
},
 
{ /*BOOT1*/
21,
{
"Taste 1 Sekunde", /* German */
"Keep the button", /* English*/
"Maintenez le bouton", /* French */
"Houd de knop ", /* Dutch */
 
}
},
 
{ /* BOOT2*/
21,
{
"lang festhalten.", /* German */
"pressed for 1 second", /* English*/
"enfoncee pend. 1 sec", /* French */
"1 seconde ingedrukt.", /* Dutch */
}
},
 
{ /*BOOT_WI1*/
21,
{
"Verbindung zum MK ist", /* German */
"Connection to MK is", /* English*/
"Connexion à MK est", /* French */
"Verbinding met MK is", /* Dutch */
 
}
},
 
{ /* BOOT_WI2*/
21,
{
"auf Wi232 eingestellt", /* German */
"set to Wi232", /* English*/
"mis a Wi232", /* French */
"ingesteld op Wi232", /* Dutch */
}
},
 
{ /*BOOTSV1*/
21,
{
"auf Kabel eingestellt", /* German */
"set to kabel on SV2", /* English*/
"mis a kabel sur SV2", /* French */
"via kabelverbinding", /* Dutch */
 
}
},
 
{ /*START_MSG1 */
21,
{
"Portables Kopter Tool", /* German */
"Portable Kopter Tool ", /* English*/
"Portable Kopter Tool ", /* French */
"Portable Kopter Tool ", /* Dutch */
 
}
},
 
{ /*START_MSG2 */
21,
{
"für FC Ver "FC_Version, /* German */
"for FC Ver "FC_Version, /* English*/
"pour FC Ver "FC_Version, /* French */
"Voor FC Ver "FC_Version, /* Dutch */
}
},
 
{ /* GNU/GPL */
21,
{
"GNU GPL License", /* German */
"GNU GPL License", /* English*/
"GNU GPL License", /* French */
"GNU GPL License", /* Dutch */
}
},
 
{ /**/
21,
{
"ATmega 644", /* German */
"ATmega 644", /* English*/
"ATmega 644", /* French */
"ATmega 644", /* Dutch */
}
},
 
{ /**/
21,
{
"ATmega 644P", /* German */
"ATmega 644P", /* English*/
"ATmega 644P", /* French */
"ATmega 644P", /* Dutch */
}
},
 
{ /**/
21,
{
"ATmega 1284P", /* German */
"ATmega 1284P", /* English*/
"ATmega 1284P", /* French */
"ATmega 1284P", /* Dutch */
}
},
 
{ /**/
21,
{
"Hardware 1.2", /* German */
"Hardware 1.2", /* English*/
"Hardware 1.2", /* French */
"Hardware 1.2", /* Dutch */
}
},
 
{ /**/
21,
{
"Hardware 1.2W", /* German */
"Hardware 1.2W", /* English*/
"Hardware 1.2W", /* French */
"Hardware 1.2W", /* Dutch */
}
},
 
{ /**/
21,
{
"Hardware 1.3", /* German */
"Hardware 1.3", /* English*/
"Hardware 1.3", /* French */
"Hardware 1.3", /* Dutch */
}
},
 
{ /**/
21,
{
"Hardware 1.3W", /* German */
"Hardware 1.3W", /* English*/
"Hardware 1.3W", /* French */
"Hardware 1.3W", /* Dutch */
}
},
 
{ /**/
21,
{
"Hardware 3.9", /* German */
"Hardware 3.9", /* English*/
"Hardware 3.9", /* French */
"Hardware 3.9", /* Dutch */
}
},
 
{ /*START_LASTPOS*/
21,
{
" Letzte Position ", /* German */
" last position ", /* English*/
" derniere position ", /* French */
" Laatste positie ", /* Dutch */
}
},
 
{ /*START_LASTPOS1*/
21,
{
" Breitengr Längengr ", /* German */
" latitude longitude ", /* English*/
" latitude longitude ", /* French */
"breedtegr. lengtegr. ", /* Dutch */
}
},
 
{ /*START_LASTPOS2*/
21,
{
"löschen weiter", /* German */
"delete exit ", /* English*/
"supprimer plus ", /* French */
"wissen verder", /* Dutch */
}
},
 
{ /*START_LASTPOS3*/
21,
{
" Google Eingabe ", /* German */
" Google Input ", /* English*/
" Google Input ", /* French */
" Google Input ", /* Dutch */
}
},
 
{ /*START_LASTPOSDEL*/
21,
{
" gelöscht ", /* German */
" deleted ", /* English*/
" supprime ", /* French */
" gewist ", /* Dutch */
}
},
 
{ /*START_SEARCHFC*/
21,
{
"Suche FC... ", /* German */
"searching FC...", /* English*/
"cherchant FC...", /* French */
"zoek FC... ", /* Dutch */
}
},
 
{ /*ENDE*/
21,
{
"Ende ", /* German */
"end ", /* English*/
"fin ", /* French */
"Einde", /* Dutch */
}
},
 
{ /*OK*/
21,
{
"Ok ", /* German */
"ok ", /* English*/
"ok ", /* French */
"gued", /* Dutch */
}
},
 
{ /*FEHLER*/
21,
{
"Fehler ", /* German */
"error ", /* English*/
"d'erreur", /* French */
"fout ", /* Dutch */
}
},
 
{ /*AKTIV*/
21,
{
"aktiv ", /* German */
"activ ", /* English*/
"actifs", /* French */
"actief", /* Dutch */
}
},
 
 
{ /*START_FCNOTFOUND*/
21,
{
"FC nicht gefunden!", /* German */
"FC not found!", /* English*/
"FC pas trouve!", /* French */
"FC niet gevonden!", /* Dutch */
}
},
 
{ /*START_FCFOUND*/
21,
{
"PKT-Tool GNU GPL", /* German */
"PKT-Tool GNU GPL", /* English*/
"PKT-Tool GNU GPL", /* French */
"PKT-Tool GNU GPL", /* Dutch */
}
},
 
{ /*START_FCFOUND1*/
21,
{
"gefunden: ", /* German */
"found: ", /* English*/
"trouvés: ", /* French */
"gevonden: ", /* Dutch */
}
},
 
{ /*START_FCFOUND2*/
21,
{
"Flight-Ctrl", /* German */
"Flight-Ctrl", /* English*/
"Flight-Ctrl", /* French */
"Flight-Ctrl", /* Dutch */
}
},
 
{ /*START_FCFOUND3*/
21,
{
"Navi-Ctrl", /* German */
"Navi-Ctrl", /* English*/
"Navi-Ctrl", /* French */
"Navi-Ctrl", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK*/
21,
{
"Version: ", /* German */
"Version: ", /* English*/
"Version: ", /* French */
"Versie: ", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK1*/
21,
{
"erwartet", /* German */
"expected", /* English*/
"attendus", /* French */
"verwacht", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK2*/
21,
{
"gefunden", /* German */
"found ", /* English*/
"trouves ", /* French */
"gevonden", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK3*/
21,
{
"PKT-Tool nur mit", /* German */
"PKT-Tool only with", /* English*/
"PKT uniquement avec", /* French */
"PKT-Tool alleen met", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK4*/
21,
{
"FC Software ", /* German */
"FC Software ", /* English*/
"FC Software ", /* French */
"FC Software ", /* Dutch */
}
},
 
{ /*START_VERSIONCHECK5*/
21,
{
"kompatibel", /* German */
"compatible", /* English*/
"compatibles", /* French */
"compatibel", /* Dutch */
}
},
 
{ /*ON*/
21,
{
"Ein ", /* German */
"On ", /* English*/
"Un ", /* French */
"Aan ", /* Dutch */
}
},
 
{ /*AUS*/
21,
{
"Aus ", /* German */
"Off ", /* English*/
"Du ", /* French */
"Uit ", /* Dutch */
}
},
 
{ /*ESC*/
21,
{
"ESC", /* German */
"ESC", /* English*/
"ESC", /* French */
"ESC", /* Dutch */
}
},
 
{ /*SHUTDOWN*/
21,
{
" PKT ausschalten?", /* German */
" shutdown PKT ?", /* English*/
" desactiver PKT ?", /* French */
" PKT uitschakelen ?", /* Dutch */
}
},
 
{ /*YES NO*/
21,
{
"Nein Ja", /* German */
"no yes", /* English*/
"non oui", /* French */
"Nee Ja", /* Dutch */
}
},
 
{ /*UPDATE1*/
21,
{
"Verbinde PC mit PKT ", /* German */
"Connect PC to PKT-USB", /* English*/
"associer PC a PKT-USB", /* French */
"Verbind PC met PKT ", /* Dutch */
}
},
 
{ /*UPDATE2*/
21,
{
"Drücke 'Start' am PKT", /* German */
"Press 'Start' on PKT ", /* English*/
"presse 'lancer' a PKT", /* French */
"Druk 'Start' op PKT ", /* Dutch */
}
},
 
{ /*ENDSTART*/
21,
{
" Ende Start", /* German */
" End Start", /* English*/
" fin lancer", /* French */
" Einde Start", /* Dutch */
}
},
 
{ /*TOOLS1*/
21,
{
" PC-Quick-Verbindung ", /* German */
" PC-Quick-Connection ", /* English*/
" PC-connexion rapide ", /* French */
" Snelle PC-verbinding", /* Dutch */
}
},
 
{ /*CONNECT1,*/
21,
{
"Verbinde das PKT mit", /* German */
"Connect PKT with MK", /* English*/
"connectez PKT a MK", /* French */
"Verbind PKT ", /* Dutch */
}
},
 
{ /*CONNECT2*/
21,
{
"dem MK über:", /* German */
" over :", /* English*/
" a propos :", /* French */
" met :", /* Dutch */
}
},
 
{ /*CONNECT4,*/
21,
{
"dem MK über: Kabel, ", /* German */
"over: Kabel", /* English*/
"a propos: Cable", /* French */
"MK via: kabel ", /* Dutch */
}
},
 
{ /*CONNECT5*/
21,
{
"es ist kein Wi.232", /* German */
"there is no Wi.232", /* English*/
"l n'ya pas de ", /* French */
"er is geen wi.232 ", /* Dutch */
}
},
 
{ /*CONNECT6*/
21,
{
"Modul eingebaut.", /* German */
"built in.", /* English*/
"module integre Wi232", /* French */
"module ingebouwd.", /* Dutch */
}
},
 
{ /*CONNECT7,*/
21,
{
"Wenn doch, dann bitte", /* German */
"if yes, then first", /* English*/
"Si vous le faites", /* French */
"zo ja, dan aub eerst", /* Dutch */
}
},
 
{ /*CONNECT8*/
21,
{
"das Modul zuerst im ", /* German */
"activate modul in", /* English*/
"activer le module", /* French */
"de module aktiveren", /* Dutch */
}
},
 
{ /*CONNECT9*/
21,
{
"Setupmenü aktivieren.", /* German */
"Setupmenu", /* English*/
"dans menu de config.", /* French */
"in het Setupmenu.", /* Dutch */
}
},
 
{ /*CONNECT10*/
21,
{
"Sie müssen das PKT", /* German */
"You have to", /* English*/
"Vous devez", /* French */
"U moet de PKT", /* Dutch */
}
},
 
{ /*CONNECT11*/
21,
{
"jetzt neu starten!", /* German */
"restart PKT", /* English*/
"redemarrer PKT", /* French */
"nu opnieuw starten!", /* Dutch */
}
},
 
{ /*CONNECT12*/
21,
{
"Es ist kein BTM-222", /* German */
"There is no BTM-222", /* English*/
"l n'ya pas de ", /* French */
"Er is geen BTM-222", /* Dutch */
}
},
 
{ /*CONNECT13*/
21,
{
"Modul eingebaut", /* German */
"Modul built in", /* English*/
"module integre BTM222", /* French */
"module ingebouwd.", /* Dutch */
}
},
 
{ /*CONNECT14*/
21,
{
" MK-USB Funktion ", /* German */
" MK-USB Function ", /* English*/
" MK-USB fonction ", /* French */
" MK-USB Functie ", /* Dutch */
}
},
 
{ /*CONNECT15*/
21,
{
" BT --> Kabel an FC ", /* German */
" BT --> Kabel to FC ", /* English*/
" BT --> Cable a FC ", /* French */
" BT --> kabel naar FC", /* Dutch */
}
},
 
{ /*CONNECT16*/
21,
{
"PC mit BT verb.", /* German */
"connect PC with BT", /* English*/
"associer PC a BT", /* French */
"PC via BT verbonden.", /* Dutch */
}
},
 
{ /*CONNECT17*/
21,
{
"PKT-Kabel an FC", /* German */
"PKT-Kabel to FC", /* English*/
"PKT-Cable a FC", /* French */
"PKT-kabel naar FC", /* Dutch */
}
},
 
{ /*CONNECT18*/
21,
{
" BT --> Wi.232 ", /* German */
" BT --> Wi.232 ", /* English*/
" BT --> Wi.232 ", /* French */
" BT --> Wi.232 ", /* Dutch */
}
},
 
{ /*CONNECT19*/
21,
{
"Wi.232 an FC ", /* German */
"Wi.232 to FC ", /* English*/
"Wi.232 a FC ", /* French */
"Wi.232 naar FC ", /* Dutch */
}
},
 
{ /*CONNECT20*/
21,
{
" USB --> Kabel an FC ", /* German */
" USB --> cable to FC ", /* English*/
" USB --> cable a FC ", /* French */
"USB --> kabel naar FC", /* Dutch */
}
},
 
{ /*CONNECT21*/
21,
{
"PC mit USB verbinden ", /* German */
"connect PC with USB ", /* English*/
"associer PC a USB ", /* French */
"Verbind PC met USB ", /* Dutch */
}
},
 
{ /*CONNECT22*/
21,
{
" USB --> Wi.232 ", /* German */
" USB --> Wi.232 ", /* English*/
" USB --> Wi.232 ", /* French */
" USB --> Wi.232 ", /* Dutch */
}
},
 
{ /*CONNECT23*/
21,
{
"MK-Tool starten", /* German */
"start MK-Tool", /* English*/
"demarrage MK-Tool", /* French */
"start MK-Tool", /* Dutch */
}
},
 
{ /*CONNECT24*/
21,
{
" Wi.232 Konfigurieren", /* German */
" Wi.232 Configuration", /* English*/
" Wi.232 configurer ", /* French */
" Wi.232 Configuratie ", /* Dutch */
}
},
 
{ /*CONNECT25*/
21,
{
"Programm starten. ", /* German */
"start program ", /* English*/
"Démarrer le programme", /* French */
"start programma.", /* Dutch */
}
},
 
{ /*CONNECT26*/
21,
{
"BTM-222 Konfigurieren", /* German */
"BTM-222 configuration", /* English*/
"BTM-222 de configura.", /* French */
"BTM-222 configuratie", /* Dutch */
}
},
 
{ /*CONNECT27*/
21,
{
"FC > MK-USB > BTM-222", /* German */
"FC > MK-USB > BTM-222", /* English*/
"FC > MK-USB > BTM-222", /* French */
"FC > MK-USB > BTM-222", /* Dutch */
}
},
 
{ /*CONNECT28*/
21,
{
"MK-USB an PC anschl. ", /* German */
"connect PC to MK-USB ", /* English*/
"associer PC a MK-USB ", /* French */
"Verbind PC met MK-USB", /* Dutch */
}
},
 
{ /*CONNECT29*/
21,
{
"Zwischen MK-USB und ", /* German */
"connect crossed cable", /* English*/
"la connexion entre PC", /* French */
"Tussen MK-USB en PKT ", /* Dutch */
}
},
 
{ /*CONNECT30*/
21,
{
"PKT ein gekreuztes ", /* German */
"between MK-USB and ", /* English*/
"et FC un cable croise", /* French */
"een gekruiste kabel ", /* Dutch */
}
},
 
{ /*CONNECT31*/
21,
{
"Kabel anschliessen. ", /* German */
"PKT SV2", /* English*/
" ", /* French */
"aansluiten.", /* Dutch */
}
},
 
{ /*Kabel*/
21,
{
"Kabel", /* German */
"cable", /* English*/
"cable", /* French */
"Kabel", /* Dutch */
}
},
 
{ /*SLAVE*/
21,
{
"Slave ", /* German */
"Slave ", /* English*/
"esclaves", /* French */
"Slave ", /* Dutch */
}
},
 
{ /*NORMAL*/
21,
{
"Normal ", /* German */
"Normal ", /* English*/
"normal ", /* French */
"Norm. ", /* Dutch */
}
},
 
{ /*Reverse*/
21,
{
"Reverse", /* German */
"inverse", /* English*/
"inverse", /* French */
"geinver", /* Dutch */
}
},
 
{ /*ENDOK*/
21,
{
"Ende OK", /* German */
"End OK", /* English*/
"Fin OK", /* French */
"Eind OK", /* Dutch */
}
},
 
{ /*EEPROM1*/
21,
{
" EEProm wirklich", /* German */
" Realy delete", /* English*/
" eeprom supprimer?", /* French */
" Eeprom werkelijk", /* Dutch */
}
},
 
{ /*EEPROM2*/
21,
{
" löschen?", /* German */
" EEprom?", /* English*/
" ", /* French */
" wissen?", /* Dutch */
}
},
 
{ /*DEUTSCH*/
21,
{
"deutsch ", /* German */
"german ", /* English*/
"allemande ", /* French */
"duits ", /* Dutch */
}
},
 
{ /*ENGLISCH*/
21,
{
"englisch ", /* German */
"english ", /* English*/
"anglaise ", /* French */
"engels ", /* Dutch */
}
},
 
{ /*FRANCE*/
21,
{
"französisch", /* German */
"french " , /* English*/
"française ", /* French */
"frans ", /* Dutch */
}
},
 
{ /*NETHERL*/
21,
{
"holländisch", /* German */
"dutch ", /* English*/
"hollandaise", /* French */
"nederlands ", /* Dutch */
}
},
 
{ /*DISPLAY1*/
21,
{
"Anzeige Einstellungen", /* German */
" Display Setup ", /* English*/
" d'affichage config. ", /* French */
"Display instellingen ", /* Dutch */
}
},
 
{ /*DISPLAY2*/
21,
{
"Infos bei Start:", /* German */
"Info at startup ", /* English*/
"Inf.au demarrage", /* French */
"Info bij opstart", /* Dutch */
}
},
 
{ /*DISPLAY3*/
21,
{
"Sprache : ", /* German */
"Language: ", /* English*/
"la langue: ", /* French */
"Taal: ", /* Dutch */
}
},
 
{ /*DISPLAY4*/
21,
{
"Licht aus nach:", /* German */
"Light off after:", /* English*/
"Exti.feux p.les:", /* French */
"Licht uit na: ", /* Dutch */
}
},
 
{ /*DISPLAY5*/
21,
{
"LCD Helligk.:", /* German */
" Brightness :", /* English*/
" luminosite :", /* French */
" intensiteit:", /* Dutch */
}
},
 
{ /*DISPLAY6*/
21,
{
"LCD Kontrast:", /* German */
"LCD contrast:", /* English*/
"LCD contrast:", /* French */
"LCD contrast:", /* Dutch */
}
},
 
{ /*DISPLAY7*/
21,
{
"LCD Norm/Inv: ", /* German */
"LCD Norm/Inv: ", /* English*/
"LCD Norm/Inv: ", /* French */
"LCD Norm/Inv: ", /* Dutch */
}
},
 
{ /*DISPLAY8*/
21,
{
"LCD Orient.: ", /* German */
"LCD Orient.: ", /* English*/
"LCD Orient.: ", /* French */
"LCD Orient.: ", /* Dutch */
}
},
 
{ /*DISPLAY9*/
21,
{
"RC Fehlerpiep :", /* German */
"RC Errorbeep :", /* English*/
"RC Errorbeep :", /* French */
"RC Errorbeep :", /* Dutch */
}
},
 
{ /*DEBUGPKT*/
21,
{
"Debug PKT", /* German */
"Debug PKT", /* English*/
"Debug PKT", /* French */
"Debug PKT", /* Dutch */
}
},
 
{ /*WITXRX*/
21,
{
"Wi TX/RX Chan:", /* German */
"Wi TX/RX Chan:", /* English*/
"Wi TX/RX Chan:", /* French */
"Wi TX/RX Chan:", /* Dutch */
}
},
 
{ /*WINETG*/
21,
{
"Wi NetW. Grp.:", /* German */
"Wi NetW. Grp.:", /* English*/
"Wi NetW. Grp.:", /* French */
"Wi NetW. Grp.:", /* Dutch */
}
},
 
{ /*WINETM*/
21,
{
"Wi NetW. Mode:", /* German */
"Wi NetW. Mode:", /* English*/
"Wi NetW. Mode:", /* French */
"Wi NetW. Mode:", /* Dutch */
}
},
 
 
{ /*WITIMEOUT*/
21,
{
"Wi TX Timeout:", /* German */
"Wi TX Timeout:", /* English*/
"Wi TX Timeout:", /* French */
"Wi TX Timeout:", /* Dutch */
}
},
 
{ /*WIUART*/
21,
{
"Wi UART MTU :", /* German */
"Wi UART MTU :", /* English*/
"Wi UART MTU :", /* French */
"Wi UART MTU :", /* Dutch */
}
},
 
{ /*WI2321*/
21,
{
"Wi.232 eingebaut:", /* German */
"Wi.232 built in :", /* English*/
"Wi.232 integre :", /* French */
"Wi.232 ingebouwd:", /* Dutch */
}
},
 
{ /*WI2322*/
21,
{
"Ist ein Wi.232-Modul ", /* German */
"Is Wi232 modul", /* English*/
"est un module ", /* French */
"Is er een Wi.232", /* Dutch */
}
},
 
{ /*WI2323*/
21,
{
"eingebaut?", /* German */
"built in?", /* English*/
"integre Wi232?", /* French */
"module ingebouwd?", /* Dutch */
}
},
 
{ /*YES*/
21,
{
"Ja ", /* German */
"yes ", /* English*/
"oui ", /* French */
"Ja ", /* Dutch */
}
},
 
{ /*NO*/
21,
{
"Nein", /* German */
"no ", /* English*/
"non ", /* French */
"Nee ", /* Dutch */
}
},
 
{ /*BT1*/
21,
{
" BTM222 Einstellungen", /* German */
" BTM-222 settings ", /* English*/
" BTM-222 settings ", /* French */
" BTM-222 settings ", /* Dutch */
}
},
 
{ /*BT2*/
21,
{
"Ist ein BTM-222-Modul", /* German */
"Is BTM-222 Modul", /* English*/
"est un module ", /* French */
"Is er een BTM-222", /* Dutch */
}
},
 
{ /*BT3*/
21,
{
"eingebaut?", /* German */
"built in?", /* English*/
"integre BTM222?", /* French */
"module ingebouwd?", /* Dutch */
}
},
 
{ /*BT4*/
21,
{
"BTM222 eingebaut:", /* German */
"BTM222 built in :", /* English*/
"BTM222 integre :", /* French */
"BTM222 ingebouwd:", /* Dutch */
}
},
 
 
{ /*LIPO1*/
21,
{
" PKT Akku Einstellung", /* German */
" PKT Accu Setup ", /* English*/
" PKT Accu Setup ", /* French */
" PKT Accu Setup ", /* Dutch */
}
},
 
{ /*LIPO2*/
21,
{
"PKT Akkutyp: ", /* German */
"PKT Accutyp: ", /* English*/
"PKT Accutyp: ", /* French */
"PKT Accutype: ", /* Dutch */
}
},
 
{ /*LIPO3*/
21,
{
"Akku U Offset: ", /* German */
"Accu U Offset: ", /* English*/
"Accu U Offset: ", /* French */
"Accu U Offset: ", /* Dutch */
}
},
 
{ /*LIPO4*/
21,
{
"PKT Akkutyp: ", /* German */
"PKT Accutyp: ", /* English*/
"PKT Accutyp: ", /* French */
"PKT Accutype: ", /* Dutch */
}
},
 
{ /*LIPO5*/
21,
{
"Offset verstellen bis", /* German */
"adjust offset until", /* English*/
"Decalage l'ajuster ", /* French */
"Offset afregelen tot", /* Dutch */
}
},
 
{ /*LIPO6*/
21,
{
"die Spannung passt", /* German */
"voltage fits", /* English*/
"a la tension", /* French */
"de spanning juist is.", /* Dutch */
}
},
 
{ /*LOWBAT*/
21,
{
"LowBat Warn V:", /* German */
"LowBat Warn V:", /* English*/
"LowBat Warn V:", /* French */
"LowBat alarm :", /* Dutch */
}
},
 
{ /*OSD_3D_V, vorne*/
21,
{
"V", /* German */
"F", /* English*/
"L", /* French */
"F", /* Dutch */
}
},
 
{ /*OSD_3D_H, hinten*/
21,
{
"H", /* German */
"B", /* English*/
"D", /* French */
"A", /* Dutch */
}
},
 
{ /*OSD_3D_L, links*/
21,
{
"L", /* German */
"L", /* English*/
"G", /* French */
"L", /* Dutch */
}
},
 
{ /*OSD_3D_R, rechts*/
21,
{
"R", /* German */
"R", /* English*/
"D", /* French */
"R", /* Dutch */
}
},
 
{ /*OSD_3D_NICK, Ni*/
21,
{
"Ni", /* German */
"Ni", /* English*/
"Ta", /* French */
"Ni", /* Dutch */
}
},
 
{ /*OSD_3D_ROLL, Ro*/
21,
{
"Ro", /* German */
"Ro", /* English*/
"Ro", /* French */
"Ro", /* Dutch */
}
},
 
{ /*OSD_3D_COMPASS, Ko*/
21,
{
"Ko", /* German */
"Co", /* English*/
"Co", /* French */
"Co", /* Dutch */
}
},
 
{ /*OSD_ERROR*/
21,
{
"FEHLER: Datenverlust ", /* German */
"ERROR: Data lost", /* English*/
"perte de donnees", /* French */
"verbinding verbroken ", /* Dutch */
}
},
 
{ /*OSD_POS1*/
21,
{
"Letzte bekannte", /* German */
"Last known ", /* English*/
"Derniere position", /* French */
"Laatst bekende", /* Dutch */
}
},
 
{ /*OSD_POS2*/
21,
{
"Position ", /* German */
"position ", /* English*/
"position ", /* French */
"positie ", /* Dutch */
}
},
 
{ /*PARA_SETTINGS*/
21,
{
" Einstellungen ", /* German */
" Setting ", /* English*/
" Parametres ", /* French */
" Instellingen ", /* Dutch */
}
},
 
{ /*PARA_CHANGE*/
21,
{
"ändern", /* German */
"change", /* English*/
"le changement", /* French */
"verandering", /* Dutch */
}
},
 
{ /*PARA_AKTIVI*/
21,
{
"aktivieren", /* German */
"activate", /* English*/
"activer", /* French */
"activeren", /* Dutch */
}
},
 
{ /*PARA_AKTIV*/
21,
{
"aktiviert", /* German */
"activated", /* English*/
"activee", /* French */
"geactiveerd", /* Dutch */
}
},
 
{ /*PARA_SAVESETT*/
21,
{
" Setting x speichern?", /* German */
" store setting?", /* English*/
" Reglage magasin?", /* French */
" instell.op te slaan?", /* Dutch */
}
},
 
{ /*PARA_SETTSAVED*/
21,
{
"Gespeichert und", /* German */
"stored and", /* English*/
"stockes et", /* French */
"opgeslagen en", /* Dutch */
}
},
 
{ /*PARA_COPY*/
21,
{
"Kopiere Setting", /* German */
"copy settings", /* English*/
"parametres de copie", /* French */
"kopieer instel.", /* Dutch */
}
},
 
{ /*PARA_FROMTO*/
21,
{
" von x nach y", /* German */
" from x to y", /* English*/
" des x apres y", /* French */
" van x na y", /* Dutch */
}
},
 
{ /*PARA_ENDE*/
21,
{
"von nach Ende OK", /* German */
"from to end OK", /* English*/
"des apres fin OK", /* French */
"van na einde OK", /* Dutch */
}
},
 
{ /*PARA_COPYQ*/
21,
{
"Wirklich kopieren?", /* German */
"really copy?", /* English*/
"vraiment copie?", /* French */
"echt kopie?", /* Dutch */
}
},
 
{ /*PARA_COPYACTIV*/
21,
{
"Kopiert und aktiviert", /* German */
"copied and activated ", /* English*/
"copies et actifs", /* French */
"Kopieën en actief", /* Dutch */
}
},
 
{ /*PARA_CHANGESETT*/
21,
{
"Ändere Einstellungen ", /* German */
" change settings ", /* English*/
"modifier les reglages", /* French */
"instellingen wijzigen", /* Dutch */
}
},
 
{ /*PARA_SELECT*/
21,
{
" Wähle Parameter ", /* German */
" select parameters ", /* English*/
"selectionnez Paramet.", /* French */
"Selecteer Parameters ", /* Dutch */
}
},
 
{ /*PARA_SEITE*/
21,
{
" Wähle Seite ", /* German */
" select page ", /* English*/
"Selectionnez la page ", /* French */
" Selecteer pagina ", /* Dutch */
}
},
 
{ /*PARA_SELSETT*/
21,
{
" Wähle Setting: ", /* German */
" select setting ", /* English*/
"Selectionnez setting ", /* French */
" Selecteer setting ", /* Dutch */
}
},
 
{ /*GPS1*/
21,
{
" GPS Einstellungen ", /* German */
" GPS settings ", /* English*/
" GPS settings ", /* French */
" GPS settings ", /* Dutch */
}
},
 
{ /*GPS2*/
21,
{
"gewähltes GPS Gerät ", /* German */
"selected GPS device ", /* English*/
"selected GPS device ", /* French */
"selected GPS device ", /* Dutch */
}
},
 
{ /*GPS3*/
21,
{
"GPS Empf.einschalten?", /* German */
"receive GPS on? ", /* English*/
"receive GPS on? ", /* French */
"receive GPS on? ", /* Dutch */
}
},
 
{ /*STATS_ITEM_0*/
21,
{
"max Höhe :", /* German */
"max Altitude :", /* English*/
"max Altitude :", /* French */
"max Altitude :", /* Dutch */
}
},
 
{ /*STATS_ITEM_1*/
21,
{
"max Geschw. :", /* German */
"max Speed :", /* English*/
"max Speed :", /* French */
"max Speed :", /* Dutch */
}
},
 
{ /*STATS_ITEM_2*/
21,
{
"max Entfern. :", /* German */
"max Distance :", /* English*/
"max Distance :", /* French */
"max Distance :", /* Dutch */
}
},
 
{ /*STATS_ITEM_3*/
21,
{
"min Spannung :", /* German */
"min Voltage :", /* English*/
"min Voltage :", /* French */
"min Voltage :", /* Dutch */
}
},
 
{ /*STATS_ITEM_4*/
21,
{
"max Zeit :", /* German */
"max Time :", /* English*/
"max Time :", /* French */
"max Time :", /* Dutch */
}
},
 
{ /*STATS_ITEM_5*/
21,
{
"max Strom :", /* German */
"max Current :", /* English*/
"max Current :", /* French */
"max Current :", /* Dutch */
}
},
 
{ /*STATS_ITEM_6*/
21,
{
"Ent.Kapazität:", /* German */
"UsedCapacity :", /* English*/
"UsedCapacity :", /* French */
"UsedCapacity :", /* Dutch */
}
},
 
{ /*STATS_ITEM_7*/
21,
{
"Long. :", /* German */
"Long. :", /* English*/
"Long. :", /* French */
"Long. :", /* Dutch */
}
},
 
{ /*STATS_ITEM_8*/
21,
{
"Lat. :", /* German */
"Lat. :", /* English*/
"Lat. :", /* French */
"Lat. :", /* Dutch */
}
},
 
{ /*ONLY_NC*/
21,
{
"Nur mit NC ! ", /* German */
"Only with NC !", /* English*/
"Only with NC !", /* French */
"Only with NC !", /* Dutch */
}
},
 
{ /*NO_SETTINGS*/
21,
{
"Keine Setings !! " , /* German */
"No settings read!!" , /* English*/
"Non Parametrès!! " , /* French */
"No settings read!!" , /* Dutch */
}
},
 
{ /*OSD_ALTI_0*/
21,
{
"Höhe aus ", /* German */
"Alti. off ", /* English*/
"Alti.finir", /* French */
"Alti. off ", /* Dutch */
}
},
 
{ /*OSD_ALTI_1*/
21,
{
"Höhe begr.", /* German */
"Alti.Limit", /* English*/
"Alti.Limit", /* French */
"Alti.Limit", /* Dutch */
}
},
 
{ /*OSD_VARIO_0*/
21,
{
"Vario aus ", /* German */
"Vario off ", /* English*/
"Vario fini", /* French */
"Vario off ", /* Dutch */
}
},
 
{ /*OSD_VARIO_1*/
21,
{
"Vario Höhe", /* German */
"Vario Alt.", /* English*/
"Vario Alt.", /* French */
"Vario Alt.", /* Dutch */
}
},
 
{ /*OSD_CARE_FREE_0*/
21,
{
" ", /* German */
" ", /* English*/
" ", /* French */
" ", /* Dutch */
}
},
 
{ /*OSD_CARE_FREE_1*/
21,
{
"Care Free", /* German */
"Care Free", /* English*/
"Care Free", /* French */
"Care Free", /* Dutch */
}
},
 
{ /*OSD_LED0*/
21,
{
" ", /* German */
" ", /* English*/
" ", /* French */
" ", /* Dutch */
}
},
 
{ /*OSD_LED1*/
21,
{
"LED1", /* German */
"LED1", /* English*/
"LED1", /* French */
"LED1", /* Dutch */
}
},
 
{ /*OSD_LED2*/
21,
{
"LED2", /* German */
"LED2", /* English*/
"LED2", /* French */
"LED2", /* Dutch */
}
},
 
{ /*OSD_NAVI_MODE_0*/
21,
{
"Navi aus ", /* German */
"Navi off ", /* English*/
"Navi off ", /* French */
"Navi off ", /* Dutch */
}
},
 
{ /*OSD_NAVI_MODE_1*/
21,
{
"Pos. halten", /* German */
"Pos. Hold ", /* English*/
"Pos. durer ", /* French */
"Pos. Hold ", /* Dutch */
}
},
 
{ /*OSD_NAVI_MODE_2*/
21,
{
"Coming Home", /* German */
"Coming Home", /* English*/
"Retoure ", /* French */
"Coming Home", /* Dutch */
}
},
 
{ /*OSD_FLAGS_0*/
21,
{
" ", /* German */
" ", /* English*/
" ", /* French */
" ", /* Dutch */
}
},
 
{ /*OSD_FLAGS_1*/
21,
{
"Justieren", /* German */
"Calibrate", /* English*/
"Calibrage", /* French */
"Calibrate", /* Dutch */
}
},
 
{ /*OSD_FLAGS_2*/
21,
{
"Start ", /* German */
"Start ", /* English*/
"Depart ", /* French */
"Start ", /* Dutch */
}
},
 
{ /*OSD_FLAGS_3*/
21,
{
"Betrieb ", /* German */
"Run ", /* English*/
"Marcher ", /* French */
"Run ", /* Dutch */
}
},
 
{ /*OSD_FLAGS_4*/
21,
{
"Fliegen ", /* German */
"Fly ", /* English*/
"Foler ", /* French */
"Fly ", /* Dutch */
}
},
 
{ /*OSD_FLAGS_5*/
21,
{
"Landung ", /* German */
"Landing ", /* English*/
"Apponter ", /* French */
"Landing ", /* Dutch */
}
},
 
{ /*OSD_FLAGS_6*/
21,
{
"Akku leer", /* German */
"Low Bat. ", /* English*/
"Low Bat. ", /* French */
"Low Bat ", /* Dutch */
}
},
 
{ /*OSD_Screen*/
21,
{
" OSD Anzeige Setup ", /* German */
" OSD screen setup ", /* English*/
" OSD screen setup ", /* French */
" OSD screen setup ", /* Dutch */
}
},
 
{ /*OSD_Invert_Out*/
21,
{
"Out1/2 negiert :", /* German */
"Out1/2 inverted:", /* English*/
"Out1/2 inverted:", /* French */
"Out1/2 inverted:", /* Dutch */
}
},
 
{ /*OSD_LED_Form*/
21,
{
"Out1/2 Format:", /* German */
"Out1/2 format:", /* English*/
"Out1/2 format:", /* French */
"Out1/2 format:", /* Dutch */
}
},
 
{ /*OSD_Send_OSD*/
21,
{
// "Navidata an SV2:", /* German */
// "Navidata to SV2:", /* English*/
// "Navidata to SV2:", /* French */
// "Navidata to SV2:", /* Dutch */
"not implemented:", /* German */
"not implemented:", /* English*/
"not implemented:", /* French */
"not implemented:", /* Dutch */
}
},
{ /*OSD_Fallspeed*/
21,
{
"m. Sinkrate m/s:", /* German */
"m.fallspeed m/s:", /* English*/
"m.fallspeed m/s:", /* French */
"m.fallspeed m/s:", /* Dutch */
}
},
{ /*OSD_VARIOBEEP*/
21,
{
"Variometer Beep:", /* German */
"variometer beep:", /* English*/
"variometer beep:", /* French */
"variometer beep:", /* Dutch */
}
},
{ /*OSD_HOMEMKVIEW*/
21,
{
"Homesicht von MK:", /* German */
"homeview from MK:", /* English*/
"homeview from MK:", /* French */
"homeview from MK:", /* Dutch */
}
},
{ /*OSD_MAHWARNING*/
21,
{
"mAh Warnung > :", /* German */
"mAh warning > :", /* English*/
"mAh warning > :", /* French */
"mAh warning > :", /* Dutch */
}
},
{ /*OSD_SCREENMODE*/
21,
{
"OSD Anzeigevar:", /* German */
"OSD screenmode:", /* English*/
"OSD screenmode:", /* French */
"OSD screenmode:", /* Dutch */
}
},
{ /*OSD_LIPOBAR*/
21,
{
"MK Volt Balken:", /* German */
"MK volt bargraph:", /* English*/
"MK volt bargraph:", /* French */
"MK volt bargraph:", /* Dutch */
 
}
},
{ /*PKT_BAUDRATE*/
21,
{
"Baud Wi232/BT:", /* German */
"Baud Wi232/BT:", /* English*/
"Baud Wi232/BT:", /* French */
"Baud Wi232/BT:", /* Dutch */
 
}
},
{ /*FOLLOWME_0*/
21,
{
" Follow Me Setup ", /* German */
" Follow Me Setup ", /* English*/
" Follow Me Setup ", /* French */
" Follow Me Setup ", /* Dutch */
 
}
 
},
{ /*FOLLOWME_1*/
21,
{
" Refresh :", /* German */
" Refresh :", /* English*/
" Refresh :", /* French */
" Refresh :", /* Dutch */
 
}
 
},
{ /*FOLLOWME_2*/
21,
{
"Geschwindigkeit:", /* German */
" Speed :", /* English*/
" Speed :", /* French */
" Speed :", /* Dutch */
 
}
 
},
{ /*FOLLOWME_3*/
21,
{
"Toleranz Radius:", /* German */
"Toleranz Radius:", /* English*/
"Toleranz Radius:", /* French */
"Toleranz Radius:", /* Dutch */
 
}
 
}
};
 
 
char const * strGet(int str_no)
{
return strings[str_no].text[DisplayLanguage];
}
 
 
 
 
void Test_Language (void) // bleibt für Tests
{
lcd_cls();
lcd_puts_at(12, 7, strGet(YESNO),0);
 
do
{
lcd_puts_at(0, 2, strGet(TESTSTRING), 0);
}
while(!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/messages.h
0,0 → 1,56
/****************************************************************************************
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Languagesupport: *
* http://www.netrino.com/Embedded-Systems/How-To/Firmware-Internationalization *
* Nigel Jones *
****************************************************************************************/
 
#ifndef MESSAGES_H
#define MESSAGES_H
 
 
//---------------------------------------------------------------------------------------------------------------------
// Typdefinitionen für alle verwendeten Strings, LAST_STR muss am Ende stehen bleiben
typedef enum
{
TESTSTRING, KEYLINE1, KEYLINE2, KEYLINE3, KEYLINE4, KEYLINE5, BOOT1, BOOT2, BOOT_WI1, BOOT_WI2, BOOT_SV, START_MSG1, START_MSG2, GNU_GPL, ATMEGA644,
ATMEGA644P, ATMEGA1284P, HW12, HW12W, HW13, HW13W, HW39, START_LASTPOS, START_LASTPOS1, START_LASTPOS2, START_LASTPOS3, START_LASTPOSDEL,
START_SEARCHFC, ENDE, OK, FEHLER, AKTIV, START_FCNOTFOUND, START_FCFOUND, START_FCFOUND1, START_FCFOUND2, START_FCFOUND3, START_VERSIONCHECK,
START_VERSIONCHECK1, START_VERSIONCHECK2, START_VERSIONCHECK3, START_VERSIONCHECK4, START_VERSIONCHECK5, ON, OFF, ESC, SHUTDOWN, YESNO,
UPDATE1, UPDATE2, ENDSTART, TOOLS1, CONNECT1, CONNECT2, CONNECT4, CONNECT5, CONNECT6, CONNECT7, CONNECT8, CONNECT9, CONNECT10, CONNECT11, CONNECT12,
CONNECT13, CONNECT14, CONNECT15, CONNECT16, CONNECT17, CONNECT18, CONNECT19, CONNECT20, CONNECT21, CONNECT22, CONNECT23, CONNECT24, CONNECT25,
CONNECT26, CONNECT27, CONNECT28, CONNECT29, CONNECT30, CONNECT31, KABEL, SLAVE, NORMAL, REVERSE, ENDOK, EEPROM1, EEPROM2, DEUTSCH, ENGLISCH, FRANCE,
NETHERL, DISPLAY1, DISPLAY2, DISPLAY3, DISPLAY4, DISPLAY5, DISPLAY6, DISPLAY7, DISPLAY8, DISPLAY9, DEBUGPKT, WITXRX, WINETWG, WINETWM, WITIMEOUT,
WIUART, WI2321, WI2322, WI2323, YES, NOO, BT1, BT2, BT3, BT4, LIPO1, LIPO2, LIPO3, LIPO4, LIPO5, LIPO6, LOWBAT, OSD_3D_V, OSD_3D_H, OSD_3D_L,
OSD_3D_R, OSD_3D_NICK, OSD_3D_ROLL, OSD_3D_COMPASS, OSD_ERROR, OSD_POS1, OSD_POS2, PARA_SETTINGS, PARA_CHANGE, PARA_AKTIVI, PARA_AKTIV,
PARA_SAVESETT, PARA_SETTSAVED, PARA_COPY, PARA_FROMTO, PARA_ENDE, PARA_COPYQ, PARA_COPYACTIV, PARA_CHANGESETT, PARA_SELECT, PARA_SEITE,
PARA_SELSETT, GPS1, GPS2, GPS3, STATS_ITEM_0, STATS_ITEM_1, STATS_ITEM_2, STATS_ITEM_3, STATS_ITEM_4, STATS_ITEM_5, STATS_ITEM_6, STATS_ITEM_7,
STATS_ITEM_8, ONLY_NC, NO_SETTINGS, OSD_ALTI_0, OSD_ALTI_1, OSD_VARIO_0, OSD_VARIO_1, OSD_CARE_FREE_0, OSD_CARE_FREE_1, OSD_LED0, OSD_LED1, OSD_LED2,
OSD_NAVI_MODE_0, OSD_NAVI_MODE_1, OSD_NAVI_MODE_2, OSD_FLAGS_0, OSD_FLAGS_1, OSD_FLAGS_2, OSD_FLAGS_3, OSD_FLAGS_4, OSD_FLAGS_5, OSD_FLAGS_6,
OSD_Screen, OSD_Invert_Out, OSD_LED_Form, OSD_Send_OSD,FALLSPEED,OSD_VARIOBEEP,OSD_HOMEMKVIEW,OSD_MAHWARNING,OSD_SCREENMODE,OSD_LIPOBAR,PKT_BAUDRATE,
FOLLOWME_0, FOLLOWME_1,FOLLOWME_2,FOLLOWME_3, LAST_STR,
} STR;
 
#define NUM_LANG 4 // German, English, French, Netherlands
 
char const * strGet(int str_no);
void Test_Language (void); // bleibt für Tests
 
 
#endif /* _MESSAGES_H_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/mk-data-structs.h
0,0 → 1,449
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _MK_DATA_STRUCTS_H
#define _MK_DATA_STRUCTS_H
 
 
// FC Version 0.88M
#define EEProm_Version 91 // FC EEProm Revision / Struktur FC 0.87
#define FC_Version "0.88m" //Softwareversion der FC
 
 
#define u8 uint8_t
#define s8 int8_t
#define u16 uint16_t
#define s16 int16_t
#define u32 uint32_t
#define s32 int32_t
 
#define NUMBER_OF_DEBUG_DATAS 32
#define ANALOG_NAME_LENGTH 16
 
// Version of supported serial protocol
#define MIN_VERSION 7
#define MAX_VERSION 10
 
// Setting index
#define SETTING_1 1
#define SETTING_2 2
#define SETTING_3 3
#define SETTING_4 4
#define SETTING_5 5
#define SETTING_CURRENT 0xff
 
 
// MikroKopter defines
// taken from
// FC Software eeprom.h
//
 
//GlobalConfig3 aus FC/eeprom.h
#define CFG3_NO_SDCARD_NO_START 0x01
#define CFG3_DPH_MAX_RADIUS 0x02
#define CFG3_VARIO_FAILSAFE 0x04
#define CFG3_MOTOR_SWITCH_MODE 0x08 //FC0.88L 7.5.12
#define CFG3_NO_GPSFIX_NO_START 0x10 //FC0.88L 7.5.12
 
//GlobalConfig
#define CFG_HOEHENREGELUNG 0x01
#define CFG_HOEHEN_SCHALTER 0x02
#define CFG_HEADING_HOLD 0x04
#define CFG_KOMPASS_AKTIV 0x08
#define CFG_KOMPASS_FIX 0x10
#define CFG_GPS_AKTIV 0x20
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40
#define CFG_DREHRATEN_BEGRENZER 0x80
 
//Bitconfig MAsk
#define CFG_LOOP_OBEN 0x01
#define CFG_LOOP_UNTEN 0x02
#define CFG_LOOP_LINKS 0x04
#define CFG_LOOP_RECHTS 0x08
#define CFG_MOTOR_BLINK1 0x10
#define CFG_MOTOR_OFF_LED1 0x20
#define CFG_MOTOR_OFF_LED2 0x40
#define CFG_MOTOR_BLINK2 0x80
 
// ExtraConfig
#define CFG2_HEIGHT_LIMIT 0x01
#define CFG2_VARIO_BEEP 0x02
#define CFG_SENSITIVE_RC 0x04
#define CFG_3_3V_REFERENCE 0x08
#define CFG_NO_RCOFF_BEEPING 0x10
#define CFG_GPS_AID 0x20
#define CFG_LEARNABLE_CAREFREE 0x40
#define CFG_IGNORE_MAG_ERR_AT_STARTUP 0x80
 
// bit mask for ParamSet.Config0
#define CFG0_AIRPRESS_SENSOR 0x01
#define CFG0_HEIGHT_SWITCH 0x02
#define CFG0_HEADING_HOLD 0x04
#define CFG0_COMPASS_ACTIVE 0x08
#define CFG0_COMPASS_FIX 0x10
#define CFG0_GPS_ACTIVE 0x20
#define CFG0_AXIS_COUPLING_ACTIVE 0x40
#define CFG0_ROTARY_RATE_LIMITER 0x80
 
// defines for the receiver selection
#define RECEIVER_PPM 0
#define RECEIVER_SPEKTRUM 1
#define RECEIVER_SPEKTRUM_HI_RES 2
#define RECEIVER_SPEKTRUM_LOW_RES 3
#define RECEIVER_JETI 4
#define RECEIVER_ACT_DSL 5
#define RECEIVER_HOTT 6
#define RECEIVER_SBUS 7
#define RECEIVER_USER 8
#define RECEIVER_UNKNOWN 0xFF
 
// MikroKopter Flags
// taken from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.73d%2Ffc.h
//alt 0.86
//#define FCFLAG_MOTOR_RUN 0x01
//#define FCFLAG_FLY 0x02
//#define FCFLAG_CALIBRATE 0x04
//#define FCFLAG_START 0x08
//#define FCFLAG_NOTLANDUNG 0x10
//#define FCFLAG_LOWBAT 0x20
//#define FCFLAG_SPI_RX_ERR 0x40
//#define FCFLAG_I2CERR 0x80
// FC_StatusFlags 0.88
#define FC_STATUS_MOTOR_RUN 0x01
#define FC_STATUS_FLY 0x02
#define FC_STATUS_CALIBRATE 0x04
#define FC_STATUS_START 0x08
#define FC_STATUS_EMERGENCY_LANDING 0x10
#define FC_STATUS_LOWBAT 0x20
#define FC_STATUS_VARIO_TRIM_UP 0x40
#define FC_STATUS_VARIO_TRIM_DOWN 0x80
 
// FC_StatusFlags2
#define FC_STATUS2_CAREFREE 0x01
#define FC_STATUS2_ALTITUDE_CONTROL 0x02
#define FC_STATUS2_RC_FAILSAVE_ACTIVE 0x04
#define FC_STATUS2_OUT1_ACTIVE 0x08
#define FC_STATUS2_OUT2_ACTIVE 0x10
 
// NaviCtrl Flags
// taken from
// http://mikrocontroller.cco-ev.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
#define NC_FLAG_FREE 0x01
#define NC_FLAG_PH 0x02
#define NC_FLAG_CH 0x04
#define NC_FLAG_RANGE_LIMIT 0x08
#define NC_FLAG_NOSERIALLINK 0x10
#define NC_FLAG_TARGET_REACHED 0x20
#define NC_FLAG_MANUAL_CONTROL 0x40
#define NC_FLAG_GPS_OK 0x80
 
typedef struct
{
unsigned char SWMajor;
unsigned char SWMinor;
unsigned char ProtoMajor;
unsigned char ProtoMinor;
unsigned char SWPatch;
unsigned char HardwareError[5];
} __attribute__((packed)) Version_t;
 
 
// FC Debug Struct
// portions taken and adapted from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.h
//
typedef struct // 0.86
{
uint8_t Digital[2];
// NC: unsigned; FC: signed !!!!
int16_t Analog[32]; // Debugvalues
} __attribute__((packed)) DebugData_t;
 
//******************************************************************
// uart1.h NC 0.87, zur Zeit hier nicht verwendet 28.01.2012 CB
 
#define AMPEL_FC 0x01
#define AMPEL_BL 0x02
#define AMPEL_NC 0x04
#define AMPEL_COMPASS 0x08
 
 
typedef struct //0.87
{
u8 StatusGreen;
u8 StatusRed;
u16 Analog[32]; // Debugwerte
} __attribute__((packed)) DebugOut_t;
//******************************************************************
 
 
// NaviCtrl OSD Structs
// portions taken and adapted from
// http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
 
typedef struct //NC uart1.h
{
s16 AngleNick; // in 0.1 deg
s16 AngleRoll; // in 0.1 deg
s16 Heading; // in 0.1 deg
u8 StickNick;
u8 StickRoll;
u8 StickYaw;
u8 StickGas;
u8 reserve[4];
} __attribute__((packed)) Data3D_t;
 
 
 
typedef struct
{
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
u8 Status; // validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct
{
u16 Distance; // distance to target in cm
s16 Bearing; // course to target in deg
} __attribute__((packed)) GPS_PosDev_t;
 
 
// aus NC waypoint.h
typedef struct
{
GPS_Pos_t Position; // the gps position of the waypoint, see ubx.h for details
s16 Heading; // orientation, 0 no action, 1...360 fix heading, neg. = Index to POI in WP List
u8 ToleranceRadius; // in meters, if the MK is within that range around the target, then the next target is triggered
u8 HoldTime; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
u8 Event_Flag; // future implementation
u8 Index; // to indentify different waypoints, workaround for bad communications PC <-> NC
u8 Type; // typeof Waypoint
u8 WP_EventChannelValue; //
u8 AltitudeRate; // rate to change the setpoint
u8 Speed; // rate to change the Position
u8 CamAngle; // Camera servo angle
u8 reserve[6]; // reserve
} __attribute__((packed)) Point_t;
 
 
// NaviCtrl struct
// taken from
// http://mikrocontroller.cco-ev.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.15c%2Fuart1.h
//
#define NAVIDATA_VERSION 5
 
typedef struct
{
u8 Version; // version of the data structure
GPS_Pos_t CurrentPosition; // see ubx.h for details
GPS_Pos_t TargetPosition;
GPS_PosDev_t TargetPositionDeviation;
GPS_Pos_t HomePosition;
GPS_PosDev_t HomePositionDeviation;
u8 WaypointIndex; // index of current waypoints running from 0 to WaypointNumber-1
u8 WaypointNumber; // number of stored waypoints
u8 SatsInUse; // number of satellites used for position solution
s16 Altimeter; // hight according to air pressure
s16 Variometer; // climb(+) and sink(-) rate
u16 FlyingTime; // in seconds
u8 UBat; // Battery Voltage in 0.1 Volts
u16 GroundSpeed; // speed over ground in cm/s (2D)
s16 Heading; // current flight direction in ° as angle to north
s16 CompassHeading; // current compass value in °
s8 AngleNick; // current Nick angle in 1°
s8 AngleRoll; // current Rick angle in 1°
u8 RC_Quality; // RC_Quality
u8 FCStatusFlags; // Flags from FC
u8 NCFlags; // Flags from NC
u8 Errorcode; // 0 --> okay
u8 OperatingRadius; // current operation radius around the Home Position in m
s16 TopSpeed; // velocity in vertical direction in cm/s
u8 TargetHoldTime; // time in s to stay at the given target, counts down to 0 if target has been reached
u8 FCStatusFlags2; // StatusFlags2 (since version 5 added)
s16 SetpointAltitude; // setpoint for altitude
u8 Gas; // for future use
u16 Current; // actual current in 0.1A steps
u16 UsedCapacity; // used capacity in mAh
} __attribute__((packed)) NaviData_t;
 
 
typedef struct
{
uint8_t Version; // the version of the BL (0 = old)
uint8_t SetPoint; // written by attitude controller
uint8_t SetPointLowerBits; // for higher Resolution of new BLs
uint8_t State; // 7 bit for I2C error counter, highest bit indicates if motor is present
uint8_t ReadMode; // select data to read
// the following bytes must be exactly in that order!
uint8_t Current; // in 0.1 A steps, read back from BL
uint8_t MaxPWM; // read back from BL -> is less than 255 if BL is in current limit, not running (250) or starting (40)
int8_t Temperature; // old BL-Ctrl will return a 255 here, the new version the temp. in �C
} __attribute__((packed)) MotorData_t;
 
typedef struct
{
uint8_t Revision; // must be BL_REVISION
uint8_t SetMask; // settings mask
uint8_t PwmScaling; // maximum value of control pwm, acts like a thrust limit
uint8_t CurrentLimit; // current limit in A
uint8_t TempLimit; // in �C
uint8_t CurrentScaling; // scaling factor for current measurement
uint8_t BitConfig; // see defines above
uint8_t crc; // checksum
} __attribute__((packed)) BLConfig_t;
 
 
// Aus FC eeprom.h
//
typedef struct
{
unsigned char Revision;
unsigned char Kanalbelegung[12]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv
unsigned char Hoehe_MinGas; // Wert : 0-100
unsigned char Luftdruck_D; // Wert : 0-250
unsigned char MaxHoehe; // Wert : 0-32
unsigned char Hoehe_P; // Wert : 0-32
unsigned char Hoehe_Verstaerkung; // Wert : 0-50
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250
unsigned char Hoehe_HoverBand; // Wert : 0-250
unsigned char Hoehe_GPS_Z; // Wert : 0-250
unsigned char Hoehe_StickNeutralPoint;// Wert : 0-250
unsigned char Stick_P; // Wert : 1-6
unsigned char Stick_D; // Wert : 0-64
unsigned char StickGier_P; // Wert : 1-20
unsigned char Gas_Min; // Wert : 0-32
unsigned char Gas_Max; // Wert : 33-250
unsigned char GyroAccFaktor; // Wert : 1-64
unsigned char KompassWirkung; // Wert : 0-32
unsigned char Gyro_P; // Wert : 10-250
unsigned char Gyro_I; // Wert : 0-250
unsigned char Gyro_D; // Wert : 0-250
unsigned char Gyro_Gier_P; // Wert : 10-250
unsigned char Gyro_Gier_I; // Wert : 0-250
unsigned char Gyro_Stability; // Wert : 0-16
unsigned char UnterspannungsWarnung; // Wert : 0-250
unsigned char NotGas; // Wert : 0-250 //Gaswert bei EmpÀngsverlust
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen
unsigned char Receiver; // 0= Summensignal, 1= Spektrum, 2 =Jeti, 3=ACT DSL, 4=ACT S3D
unsigned char I_Faktor; // Wert : 0-250
unsigned char UserParam1; // Wert : 0-250
unsigned char UserParam2; // Wert : 0-250
unsigned char UserParam3; // Wert : 0-250
unsigned char UserParam4; // Wert : 0-250
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag
//--- Seit V0.75
unsigned char ServoRollControl; // Wert : 0-250 // Stellung des Servos
unsigned char ServoRollComp; // Wert : 0-250
unsigned char ServoRollMin; // Wert : 0-250
unsigned char ServoRollMax; // Wert : 0-250
//---
unsigned char ServoNickRefresh; // Speed of the Servo
unsigned char ServoManualControlSpeed;//
unsigned char CamOrientation; //
unsigned char Servo3; // Value or mapping of the Servo Output
unsigned char Servo4; // Value or mapping of the Servo Output
unsigned char Servo5; // Value or mapping of the Servo Output
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas wÀhrend Looping
unsigned char LoopThreshold; // Wert: 0-250 Schwelle fÃŒr Stickausschlag
unsigned char LoopHysterese; // Wert: 0-250 Hysterese fÃŒr Stickausschlag
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung)
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung)
unsigned char Driftkomp;
unsigned char DynamicStability;
unsigned char UserParam5; // Wert : 0-250
unsigned char UserParam6; // Wert : 0-250
unsigned char UserParam7; // Wert : 0-250
unsigned char UserParam8; // Wert : 0-250
//---Output ---------------------------------------------
unsigned char J16Bitmask; // for the J16 Output
unsigned char J16Timing; // for the J16 Output
unsigned char J17Bitmask; // for the J17 Output
unsigned char J17Timing; // for the J17 Output
// seit version V0.75c
unsigned char WARN_J16_Bitmask; // for the J16 Output
unsigned char WARN_J17_Bitmask; // for the J17 Output
//---NaviCtrl---------------------------------------------
unsigned char NaviGpsModeControl; // Parameters for the Naviboard
unsigned char NaviGpsGain;
unsigned char NaviGpsP;
unsigned char NaviGpsI;
unsigned char NaviGpsD;
unsigned char NaviGpsPLimit;
unsigned char NaviGpsILimit;
unsigned char NaviGpsDLimit;
unsigned char NaviGpsACC;
unsigned char NaviGpsMinSat;
unsigned char NaviStickThreshold;
unsigned char NaviWindCorrection;
unsigned char NaviAccCompensation; // New since 0.86 -> was: SpeedCompensation
unsigned char NaviOperatingRadius;
unsigned char NaviAngleLimitation;
unsigned char NaviPH_LoginTime;
//---Ext.Ctrl---------------------------------------------
unsigned char ExternalControl; // for serial Control
//---CareFree---------------------------------------------
unsigned char OrientationAngle; // Where is the front-direction?
unsigned char CareFreeModeControl; // switch for CareFree
unsigned char MotorSafetySwitch;
unsigned char MotorSmooth;
unsigned char ComingHomeAltitude;
unsigned char FailSafeTime;
unsigned char MaxAltitude;
unsigned char FailsafeChannel; // if the value of this channel is > 100, the MK reports "RC-Lost"
unsigned char ServoFilterNick;
unsigned char ServoFilterRoll;
//------------------------------------------------
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt
unsigned char ServoCompInvert; // // 0x01 = Nick, 0x02 = Roll 0 oder 1 // WICHTIG!!! am Ende lassen
unsigned char ExtraConfig; // bitcodiert
unsigned char GlobalConfig3; // bitcodiert
char Name[12];
unsigned char crc; // must be the last byte! // MUST BE THE LAST BYTE!
} __attribute__((packed)) mk_param_struct_t;
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/motortest.c
0,0 → 1,419
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include "main.h"
#include "motortest.h"
#include "lcd.h"
#include "timer.h"
#include "twimaster.h"
//#include "menu.h"
#include "uart1.h"
#include "usart.h"
#include "messages.h"
 
 
 
 
uint8_t m;
uint8_t mmode; // 0=Value 1=Motor
uint8_t v;
 
volatile uint8_t i2c_state;
volatile uint8_t motor_addr = 0;
 
 
//--------------------------------------------------------------
// Senden der Motorwerte per I2C-Bus
//
void SendMotorData(uint8_t m,uint8_t v)
{
if (m==0)
 
for(m=0;m<MAX_MOTORS;m++) // alle Motoren
{
// Motor[m].SetPoint = MotorTest[m];
Motor[m].SetPoint = v;
Motor[m].SetPointLowerBits = 0;
 
// Motor[i].SetPoint = MotorTest[i] / 4; // testing the high resolution
// Motor[i].SetPointLowerBits = MotorTest[i] % 4;
 
}
else
{
Motor[m-1].SetPoint = v;
Motor[m-1].SetPointLowerBits = 0;
}
 
 
 
if(I2C_TransferActive)
I2C_TransferActive = 0; // enable for the next time
else
{
motor_write = 0;
I2C_Start(TWI_STATE_MOTOR_TX); //Start I2C Interrupt Mode
}
}
 
 
//--------------------------------------------------------------
//
void Search_BL (void)
{
uint8_t i = 0;
unsigned int timer;
lcd_cls ();
MotorenEin =0;
MotorTest[i] = 0;
 
lcd_printp (PSTR("Suche BL-Ctrl"), 0);
 
// Check connected BL-Ctrls
BLFlags |= BLFLAG_READ_VERSION;
motor_read = 0; // read the first I2C-Data
 
SendMotorData(0,0);
timer = SetDelay(1);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
timer = SetDelay(1);
for(i=0; i < MAX_MOTORS; i++)
{
 
SendMotorData(i,0);
 
 
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
 
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK)
{
 
lcd_printp_at (0, 1, PSTR("Found BL-Ctrl:"), 0);
lcd_print_hex_at (18,1,i,0);
 
lcd_printp_at (0, 2, PSTR("Version:"), 0);
lcd_print_hex_at (8,2,Motor[i].Version,0);
lcd_printp_at (11, 2, PSTR("SetPoi:"), 0);
lcd_print_hex_at (18,2,Motor[i].SetPoint,0);
 
lcd_printp_at (0, 3, PSTR("SetPoiL:"), 0);
lcd_print_hex_at (8,3,Motor[i].SetPointLowerBits,0);
lcd_printp_at (11, 3, PSTR("State :"), 0);
lcd_print_hex_at (18,3,Motor[i].State,0);
 
lcd_printp_at (0, 4, PSTR("ReadMod:"), 0);
lcd_print_hex_at (8,4,Motor[i].ReadMode,0);
lcd_printp_at (11, 4, PSTR("Currnt:"), 0);
lcd_print_hex_at (18,4,Motor[i].Current,0);
 
lcd_printp_at (0, 5, PSTR("MaxPWM :"), 0);
lcd_print_hex_at (8,5,Motor[i].MaxPWM,0);
lcd_printp_at (11, 5, PSTR("Temp :"), 0);
write_ndigit_number_u (18,5,Motor[i].Temperature,3,1,0);
}
 
} //End For I
}
 
 
//--------------------------------------------------------------
//
void motor (uint8_t m,uint8_t v)
{
memset (buffer, 0, 16);
 
if(m == 0)
{
memset (buffer, v, 16);
}
else
{
buffer[m-1] = v;
}
 
SendOutData('t', ADDRESS_FC, 1, buffer, 16);
}
 
//--------------------------------------------------------------
//
void motor_test (uint8_t MotorMode)
{
 
lcd_cls ();
mmode = 1; // 1=Motor
m = 1;
v = 0;
char buffer[7];
unsigned int SerLoop;
SerLoop = 10;
 
if (MotorMode == I2C_Mode)
{
Search_BL();
do
{
lcd_printp_at (11, 7, PSTR("Ende Check"), 0);
if (get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
}
while (!get_key_press (1 << KEY_ENTER));
}
 
lcd_cls();
lcd_printp (PSTR(" BL-Ctrl Test "), 2);
lcd_printp_at (2, 2, PSTR("Motor: 1"), 0);
lcd_printp_at (2, 3, PSTR("Value: 0"), 0);
lcd_frect ((8*1), (8*5), (0 * (14*8)) / 255, 6, 1);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_printp_at (18, 7, PSTR("\x1a \x1b"), 0);
lcd_printp_at (0, 2, PSTR("\x1d"), 0);
 
#if defined HWVERSION1_3W || defined HWVERSION1_3 || defined HWVERSION3_9
if (MotorMode == I2C_Mode)
uart1_puts("Motor;Version;Setpoint high;Setpoint low;State;ReadMode;Current;MaxPWM;Temperature\r");
#endif
#if defined HWVERSION1_2W || defined HWVERSION1_2
if (MotorMode == I2C_Mode)
USART_puts("Motor;Version;Setpoint high;Setpoint low;State;ReadMode;Current;MaxPWM;Temperature\r");
#endif
 
if (MotorMode == FC_Mode)
{
if (hardware == NC && current_hardware == NC)
{
SwitchToFC();
}
}
do
{
// mmode 0=Value 1=Motor
 
if ((mmode == 0) && (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (v < 254))
{
v++;
write_ndigit_number_u (9, 3, v, 3, 0,0);
if (MotorMode == FC_Mode)
lcd_frect ((8*1), (8*5), (v * (14*8)) / 255, 6, 1);
}
 
if ((mmode == 0) && (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (v > 0))
{
if (MotorMode == FC_Mode)
lcd_frect (((v * (14*8) / 255) + 8), (8*5), ((14*8) / 255), 6, 0);
 
v--;
write_ndigit_number_u (9, 3, v, 3, 0,0);
if (MotorMode == FC_Mode)
lcd_frect ((8*1), (8*5), (v * (14*8)) / 255, 6, 1);
}
 
if ((mmode == 1) && (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (m < 16))
{
m++;
write_ndigit_number_u (9, 2, m, 3, 0,0);
}
 
if ((mmode == 1) && (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (m > 0))
{
m--;
if(m > 0)
write_ndigit_number_u (9, 2, m, 3, 0,0);
if(m == 0)
lcd_printp_at (9, 2, PSTR("All"), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
if (MotorMode == I2C_Mode)
{
if (v > 0)
{
m = 0;
v=0;
lcd_frect ((8*1), (8*5), (0 * (14*8)) / 255, 6, 1);
lcd_cls_line (0, 5, 21);
if(m > 0) write_ndigit_number_u (9, 2, m, 3, 0,0);
if(m == 0) lcd_printp_at (9, 2, PSTR("All"), 0);
write_ndigit_number_u (9, 3, v, 3, 0,0);
SendMotorData(m,v);
timer = SetDelay(1);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
}
 
if(mmode == 0) // 0=Value
{
lcd_printp_at (0, 2, PSTR("\x1d"), 0);
lcd_printp_at (0, 3, PSTR(" "), 0);
mmode = 1; // 1=Motor
}
else
{
lcd_printp_at (0, 2, PSTR(" "), 0);
lcd_printp_at (0, 3, PSTR("\x1d"), 0);
mmode = 0; // 0=Value
}
}
//if (get_key_press (1 << KEY_ENTER))//
 
if (MotorMode == I2C_Mode)
{
SendMotorData(m,v);
timer = SetDelay(1);
lcd_printp_at (0, 3, PSTR("SetPoint :"), 0);
 
write_ndigit_number_u (13,3,Motor[m-1].SetPoint,3,0,0);
lcd_printp_at (0, 4, PSTR("Current :"), 0);
lcd_print_hex_at (13,4,Motor[m-1].Current,0);
write_ndigit_number_u (13,4,Motor[m-1].Current,3,0,0);
lcd_printp_at (0, 5, PSTR("Temperature:"), 0);
write_ndigit_number_u (13,5,Motor[m-1].Temperature,3,0,0);
lcd_printp_at (0, 6, PSTR("Version:"), 0);
lcd_print_hex_at (8,6,Motor[m-1].Version,0);
lcd_printp_at (11, 6, PSTR("State :"), 0);
lcd_print_hex_at (18,6,Motor[m-1].State,0);
 
#if defined HWVERSION1_3W || defined HWVERSION1_3 || defined HWVERSION3_9
 
if (Motor[m-1].SetPoint > 0)
{
if (SerLoop == 0)
{
itoa( m-1, buffer, 10); // convert interger into string (decimal format)
uart1_puts(buffer); // and transmit string to UART
uart1_puts(";");
itoa( Motor[m-1].Version, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].SetPoint, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].SetPointLowerBits, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].State, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].ReadMode, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].Current, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].MaxPWM, buffer, 10); //
uart1_puts(buffer);
uart1_puts(";");
itoa( Motor[m-1].Temperature, buffer, 10); //
uart1_puts(buffer);
uart1_puts("\r");
uart1_puts("\n");
SerLoop =200;
}
else
SerLoop--;
}
 
#endif
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
 
if (Motor[m-1].SetPoint > 0)
{
if (SerLoop == 0)
{
itoa( m-1, buffer, 10); // convert interger into string (decimal format)
USART_puts(buffer); // and transmit string to UART
USART_puts(";");
itoa( Motor[m-1].Version, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].SetPoint, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].SetPointLowerBits, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].State, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].ReadMode, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].Current, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].MaxPWM, buffer, 10); //
USART_puts(buffer);
USART_puts(";");
itoa( Motor[m-1].Temperature, buffer, 10); //
USART_puts(buffer);
USART_puts("\r");
USART_puts("\n");
SerLoop =200;
}
else
SerLoop--;
}
 
#endif
 
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
else
motor (m,v); //if (MotorMode == I2C_Mode)//
 
}
while (!get_key_press (1 << KEY_ESC));
 
get_key_press(KEY_ALL);
 
if (MotorMode == FC_Mode)
{
motor(0,0); // switch all engines off at exit
}
 
}
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/motortest.h
0,0 → 1,46
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _MOTORTEST_H
#define _MOTORTEST_H
 
#define I2C_Mode 1 // Motortest Lokal
#define FC_Mode 2 // Motortest ueber FC
 
 
 
void motor_test (uint8_t MotorMode);
void SendMotorData(uint8_t m,uint8_t v);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/osd.c
0,0 → 1,1627
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
 
#include "main.h"
#include "osd.h"
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#include "eeprom.h"
#include "messages.h"
#include "parameter.h"
#include "mk-data-structs.h"
 
#define COSD_WASFLYING 4
#define TIMEOUT 200 // 2 sec
 
// global definitions and global vars
NaviData_t *naviData;
mk_param_struct_t *mk_param_struct;
uint16_t old_hh = 0;
uint8_t Flags_ExtraConfig;
uint8_t Flags_GlobalConfig;
uint8_t Flags_GlobalConfig3;
unsigned char Element;
uint16_t heading_home;
 
// Hier Höhenanzeigefehler Korrigieren
#define AltimeterAdjust 1.5
 
// stats for after flight
int16_t max_Altimeter = 0;
uint16_t max_GroundSpeed = 0;
int16_t max_Distance = 0;
uint8_t min_UBat = 255;
uint16_t max_FlyingTime = 0;
uint16_t max_Current = 0;
uint16_t max_Capacity = 0;
 
// cache old vars for blinking attribute, checkup is faster than full
// attribute write each time
volatile uint8_t last_UBat = 255;
volatile uint8_t last_RC_Quality = 255;
 
volatile uint16_t ftimer = 0;
volatile uint8_t OSD_active;
 
uint8_t Vario_Beep_Up = 0;
uint8_t Vario_Beep_Down = 0;
uint8_t Vario_Beep_Up_Interval = 9;
uint8_t Vario_Beep_Down_Interval = 6;
uint8_t Vario_Threshold = 0;
uint8_t Vario_Threshold_Value = 7;
uint8_t OldWP=0;
uint8_t NextWP = 0;
 
 
 
 
//char* rose = "-+-N-+-O-+-S-+-W-+-N-+-O-+-S-+-W-+-N-+-O-+-S-+-W";
const char rose[48] PROGMEM = {
0x0e, 0x0f, 0x0e, 'N', 0x0e, 0x0f, 0x0e, 'O', 0x0e, 0x0f, 0x0e, 'S',
0x0e, 0x0f, 0x0e, 'W', 0x0e, 0x0f, 0x0e, 'N', 0x0e, 0x0f, 0x0e, 'O',
0x0e, 0x0f, 0x0e, 'S', 0x0e, 0x0f, 0x0e, 'W', 0x0e, 0x0f, 0x0e, 'N',
0x0e, 0x0f, 0x0e, 'O', 0x0e, 0x0f, 0x0e, 'S', 0x0e, 0x0f, 0x0e, 'W',
};
 
// the center is char 19 (north), we add the current heading in 8th
// which would be 22.5 degrees, but float would bloat up the code
// and *10 / 225 would take ages... so we take the uncorrect way
 
const char str_NE[] PROGMEM = "NE";
const char str_E[] PROGMEM = "E ";
const char str_SE[] PROGMEM = "SE";
const char str_S[] PROGMEM = "S ";
const char str_SW[] PROGMEM = "SW";
const char str_W[] PROGMEM = "W ";
const char str_NW[] PROGMEM = "NW";
const char str_N[] PROGMEM = "N ";
const char *directions_p[8] PROGMEM = {
str_NE,
str_E,
str_SE,
str_S,
str_SW,
str_W,
str_NW,
str_N
};
 
// Positionen der Anzeigeelemente im Bildschirm
#define OSD_ALTITUDE_CONTROL 1
#define OSD_ALTITUDE 2
#define OSD_BATTERY_LEVEL 3
#define OSD_CAPACITY 4
#define OSD_CARE_FREE 5
#define OSD_COMPASS_DEGREE 6
#define OSD_COMPASS_DIRECTION 7
#define OSD_COMPASS_ROSE 8
#define OSD_CURRENT 9
#define OSD_FLYING_TIME 10
#define OSD_GROUND_SPEED 11
#define OSD_HOME_CIRCLE 12
#define OSD_HOME_DEGREE 13
#define OSD_HOME_DISTANCE 14
#define OSD_LED1_OUTPUT 15
#define OSD_LED2_OUTPUT 16
#define OSD_MANUELL 17
#define OSD_NAVI_MODE 18
#define OSD_RC_INTENSITY 19
#define OSD_SATS_IN_USE 20
#define OSD_STATUS_FLAGS 21
#define OSD_VARIOMETER 22
#define OSD_TARGET 23
#define OSD_VARIOWERT 24
#define OSD_WAYPOINT 25
#define OSD_TARGET_DEGREE 26
 
#define MAX_CELL_VOLTAGE 43 // max cell volatage for LiPO
#define MIN_CELL_VOLTAGE 32 // min cell volatage for LiPO
 
// Flags
uint8_t COSD_FLAGS2 = 0;
 
GPS_Pos_t last5pos[7];
uint8_t error = 0;
uint8_t cells,BattLowVoltageWarning,CellIsChecked = 0;
uint8_t AkkuWarnThreshold = 0;
 
 
void CheckMKLipo(void) // Quelle Mikrokopter FC-Software Holger + Ingo
 
{
 
if(MK_LowBat < 50) // automatische Zellenerkennung
{
if (CellIsChecked <= 2) //Nur beim Start 1x prüfen
{
// up to 6s LiPo, less than 2s is technical impossible
for(cells = 2; cells < 7; cells++)
{
if(naviData->UBat < cells * MAX_CELL_VOLTAGE) break;
}
 
BattLowVoltageWarning = cells * MK_LowBat;
CellIsChecked++;
}
}
else BattLowVoltageWarning = MK_LowBat;
 
if (naviData->UBat < BattLowVoltageWarning)
{
 
if (AkkuWarnThreshold <= 4) AkkuWarnThreshold++;
else
 
{ //Beeper ein
 
set_beep ( 1000, 0x0020, BeepSevere);
 
// BeepTime = 3000;
// BeepMuster = 0x0020;
}
}
 
}
 
//--------------------------------------------------------------
// convert the <heading> gotton from NC into an index
uint8_t heading_conv (uint16_t heading)
{
if (heading > 23 && heading < 68)
return 0; //direction = "NE";
else if (heading > 67 && heading < 113)
return 1; //direction = "E ";
else if (heading > 112 && heading < 158)
return 2; //direction = "SE";
else if (heading > 157 && heading < 203)
return 3; //direction = "S ";
else if (heading > 202 && heading < 248)
return 4; //direction = "SW";
else if (heading > 247 && heading < 293)
return 5; //direction = "W ";
else if (heading > 292 && heading < 338)
return 6; //direction = "NW";
 
return 7; //direction = "N ";
}
 
//--------------------------------------------------------------
// draw a compass rose at <x>/<y> for <heading>
void draw_compass (uint8_t x, uint8_t y, uint16_t heading)
{
uint8_t front = 19 + (heading / 22);
for (uint8_t i = 0; i < 9; i++)
lcd_putc (x++, y, pgm_read_byte(&rose[front - 4 + i]), 0);
}
 
 
//--------------------------------------------------------------
// variometer
// draw variometer arrows at <x>/<y> according to <variometer>
//
void draw_variometer (uint8_t x, uint8_t y, uint8_t width, uint8_t hight, int16_t variometer)
{
x *= 6;
y *= 8;
y += 7;
 
lcd_rect (x, y - ((hight) / 2), width, hight, 1);
lcd_frect (x + 1, y - ((hight) / 2) + 1, width - 2, hight - 2, 0);
lcd_line (x, y, x + width, y, 1);
 
if (variometer > 0) // steigend
{
switch (variometer / 5)
{
case 0:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
break;
 
case 1:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
break;
 
case 2:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
lcd_frect (x + 2, y - 5, 6, 1, 1); // 10 > 14
break;
 
default:
lcd_line (x + 4, y - 1, x + 6, y - 1, 1); // 1 > 4
lcd_frect (x + 3, y - 3, 4, 1, 1); // 5 > 9
lcd_frect (x + 2, y - 5, 6, 1, 1); // 10 > 14
lcd_frect (x + 1, y - 6, 8, 1, 1); // 15 >
break;
}
}
else if (variometer < 0) // fallend
{
switch ((variometer) / -5)
{
case 0:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
break;
 
case 1:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
break;
 
case 2:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
lcd_frect (x + 2, y + 4, 6, 1, 1); // -10 > -14
break;
 
default:
lcd_line (x + 4, y + 1, x + 6, y + 1, 1); // - 1 > - 4
lcd_frect (x + 3, y + 2, 4, 1, 1); // - 5 > - 9
lcd_frect (x + 2, y + 4, 6, 1, 1); // -10 > -14
lcd_frect (x + 1, y + 5, 8, 1, 1); // -15 >
break;
}
}
}
//--------------------------------------------------------------
// Home symbol
// draw Homesymbol at <x>/<y>
//
void draw_homesymbol (uint8_t x, uint8_t y)
{
 
x *= 6;
y *= 8;
y += 7;
 
lcd_plot (x,y-4,1);
lcd_line (x+1,y-1,x+1,y-5,1);
lcd_plot (x+2,y-6,1);
lcd_plot (x+3,y-7,1);
lcd_plot (x+4,y-6,1);
lcd_line (x+5,y-1,x+5,y-5,1);
lcd_plot (x+6,y-4,1);
lcd_plot (x+3,y-1,1);
lcd_plot (x+3,y-2,1);
lcd_line (x+1,y,x+5,y,1);
 
}
//--------------------------------------------------------------
// Target symbol
// draw Targetsymbol at <x>/<y>
//
void draw_targetsymbol (uint8_t x, uint8_t y)
{
 
x *= 6;
y *= 8;
y += 7;
 
lcd_circle (x+3, y-3, 4, 1);
lcd_line (x,y-3,x+6,y-3,1);
lcd_line (x+3,y,x+3,y-6,1);
lcd_circle (x+3, y-3, 2, 1);
}
//--------------------------------------------------------------
void print_statistics (void)
{
uint8_t line = 0;
lcd_cls ();
lcd_puts_at(12, 7, strGet(ENDE), 0);
 
// max Altitude
lcd_puts_at (0, line, strGet(STATS_ITEM_0), 0);
write_ndigit_number_s (14, line, max_Altimeter / (30 / AltimeterAdjust), 4, 0,0);
lcd_putc (18, line, 'm', 0);
// max_GroundSpeed = 1;
// max Speed
lcd_puts_at (0, ++line, strGet(STATS_ITEM_1), 0);
write_ndigit_number_u (15, line, (uint16_t) (((uint32_t) max_GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0,0);
lcd_printp_at(18, line, PSTR("kmh"), 0);
 
// max Distance
// max_Distance = 64512;
lcd_puts_at (0, ++line, strGet(STATS_ITEM_2), 0);
write_ndigit_number_u (15, line, max_Distance / 10, 4, 0,0);
lcd_putc (19, line, 'm', 0);
// max_FlyingTime = 3600;
// max time
lcd_puts_at (0, ++line, strGet(STATS_ITEM_4), 0);
write_time (14, line, max_FlyingTime);
lcd_putc (19, line, 'm', 0);
 
// min voltage
lcd_puts_at (0, ++line, strGet(STATS_ITEM_3), 0);
write_ndigit_number_u_10th (14, line, min_UBat, 3, 0,0);
lcd_putc (18, line, 'V', 0);
 
#if 1
// max_Current = 1000;
// max Current
lcd_puts_at (0, ++line, strGet(STATS_ITEM_5), 0);
write_ndigit_number_u_10th (14, line, max_Current, 4, 0,0);
lcd_putc (19, line, 'A', 0);
 
// Used Capacity
lcd_puts_at (0, ++line, strGet(STATS_ITEM_6), 0);
write_ndigit_number_u (14, line, max_Capacity, 4, 0,0);
lcd_printp_at(18, line, PSTR("mAh"), 0);
#else
// longitude
lcd_puts_at (0, ++line, strGet(STATS_ITEM_7), 0);
write_gps_pos (8, line, naviData->CurrentPosition.Longitude);
 
// latitude
lcd_puts_at (0, ++line, strGet(STATS_ITEM_8), 0);
write_gps_pos (8, line, naviData->CurrentPosition.Latitude);
#endif
 
while (!get_key_press (1 << KEY_ESC))
timer = TIMEOUT;
 
COSD_FLAGS2 &= ~COSD_WASFLYING;
get_key_press(KEY_ALL);
lcd_cls();
}
 
//--------------------------------------------------------------
void print_position (void)
{
lcd_cls ();
lcd_puts_at(0, 0, strGet(START_LASTPOS1), 2); // Breitengr Längengr
lcd_puts_at(12, 7, strGet(ENDE), 0);
uint8_t ij =0;
 
for(ij=0;ij<6;ij++)
{
uint32_t lon = last5pos[ij].Latitude;
write_ndigit_number_u (1, ij+1, (uint16_t)(lon/10000000), 2, 0,0);
lcd_printp_at (3, ij+1, PSTR("."), 0);
write_ndigit_number_u (4, ij+1, (uint16_t)((lon/1000) % 10000), 4, 1,0);
write_ndigit_number_u (8, ij+1, (uint16_t)((lon/10) % 100), 2, 1,0);
 
uint32_t lat = last5pos[ij].Longitude;
write_ndigit_number_u (12, ij+1, (uint16_t)(lat/10000000), 2, 0,0);
lcd_printp_at (14, ij+1, PSTR("."), 0);
write_ndigit_number_u (15, ij+1, (uint16_t)((lat/1000) % 10000), 4, 1,0);
write_ndigit_number_u (19, ij+1, (uint16_t)((lat/10) % 100), 2, 1,0);
}
 
while (!get_key_press (1 << KEY_ESC))
timer = TIMEOUT;
 
get_key_press(KEY_ALL);
lcd_cls();
}
 
//--------------------------------------------------------------
void Show_LastPosition(void)
{
lcd_puts_at(0, 2, strGet(OSD_POS1), 0);
lcd_puts_at(0, 3, strGet(OSD_POS2), 0);
lcd_puts_at(0, 5, strGet(START_LASTPOS1), 0);
uint32_t lon = last5pos[0].Latitude;
write_ndigit_number_u (1, 6, (uint16_t)(lon/10000000), 2, 0,0);
lcd_printp_at (3, 6, PSTR("."), 0);
write_ndigit_number_u (4, 6, (uint16_t)((lon/1000) % 10000), 4, 1,0);
write_ndigit_number_u (8, 6, (uint16_t)((lon/10) % 100), 2, 1,0);
 
uint32_t lat = last5pos[0].Longitude;
write_ndigit_number_u (12, 6, (uint16_t)(lat/10000000), 2, 0,0);
lcd_printp_at (14, 6, PSTR("."), 0);
write_ndigit_number_u (15, 6, (uint16_t)((lat/1000) % 10000), 4, 1,0);
write_ndigit_number_u (19, 6, (uint16_t)((lat/10) % 100), 2, 1,0);
 
}
 
//--------------------------------------------------------------
void OSD_Timeout(uint8_t flag)
{
 
// uint8_t flag;
uint8_t tmp_dat;
// flag = 0;
timer = TIMEOUT;
// disable OSD Data from NC
// RS232_request_mk_data (1, 'o', 0);
// tmp_dat = 0;
// SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
mode = 0;
rxd_buffer_locked = FALSE;
 
 
// Bei Verbindungsverlusst werden hier die letzten bekannten Koordinaten ausgegeben!!!
if (flag)
{
// Falls Spannungswarnung an war Beeper aus//
 
set_beep ( 0, 0, BeepOff);
 
lcd_cls ();
WriteLastPosition(last5pos[0].Longitude,last5pos[0].Latitude); // im EEprom speichern
lcd_puts_at(0, 0, strGet(OSD_ERROR), 2); // ERROR: Datenverlust
lcd_puts_at(0, 2, strGet(OSD_POS1), 0); // Letzte bekannte
lcd_puts_at(0, 3, strGet(OSD_POS2), 0); // Position gespeichert.
lcd_puts_at(0, 5, strGet(START_LASTPOS1), 0); // Breitengr Längengr
// lcd_puts_at(12, 7, strGet(ENDE), 0);
// lcd_puts_at(19, 7, strGet(OK), 0);
// if (OSD_RCErrorbeep==true)
// {
set_beep ( 250, 0x0040, BeepNormal);
 
// }
error = 1;
 
uint32_t lon = last5pos[0].Latitude;
write_ndigit_number_u (1, 6, (uint16_t)(lon/10000000), 2, 0,0);
lcd_printp_at (3, 6, PSTR("."), 0);
write_ndigit_number_u (4, 6, (uint16_t)((lon/1000) % 10000), 4, 1,0);
write_ndigit_number_u (8, 6, (uint16_t)((lon/10) % 100), 2, 1,0);
 
uint32_t lat = last5pos[0].Longitude;
write_ndigit_number_u (12, 6, (uint16_t)(lat/10000000), 2, 0,0);
lcd_printp_at (14, 6, PSTR("."), 0);
write_ndigit_number_u (15, 6, (uint16_t)((lat/1000) % 10000), 4, 1,0);
write_ndigit_number_u (19, 6, (uint16_t)((lat/10) % 100), 2, 1,0);
 
// while (!get_key_press (1 << KEY_ENTER));
// _delay_ms(1000);
timer = TIMEOUT;
// lcd_cls();
// return;
 
 
}
else
{
lcd_puts_at(0, 0, strGet(OSD_ERROR), 2);
Show_LastPosition();
if (OSD_RCErrorbeep==true) set_beep ( 200, 0x0080, BeepNormal);
 
 
// _delay_ms(2000);
}
 
SwitchToNC();
 
mode = 'O';
 
// disable debug...
// RS232_request_mk_data (0, 'd', 0);
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
 
}
 
 
 
 
//-----------------------------------------------------------
//
void lcd_o_circle (int16_t x, int16_t y, int16_t breite, uint8_t mode)
{
breite *= 6;
int16_t radius = breite / 2;
x += 2;
x *= 6;
x += 2;
y += 1;
y *= 8;
y += 3;
 
lcd_ellipse (x, y, radius - 3, radius - 5, mode);
}
 
 
//-----------------------------------------------------------
//
void lcd_o_circ_line (uint8_t x, uint8_t y, uint8_t breite, uint16_t deg, uint8_t mode)
{
breite *= 6;
int16_t radius = breite / 3;
x += 2;
x *= 6;
x += 2;
y += 1;
y *= 8;
y += 3;
 
lcd_ellipse_line(x, y, radius, radius, deg, mode);
}
 
 
//--------------------------------------------------------------
void osd (uint8_t ShowMode)
{
uint8_t flag;
uint8_t tmp_dat;
uint8_t OSD_Mode;
uint8_t info_3D = 0;
uint8_t status;
 
 
 
// Clear statistics
max_Altimeter = 0;
max_GroundSpeed = 0;
max_Distance = 0;
min_UBat = 255;
max_FlyingTime = 0;
CellIsChecked = 0;
cells = 0;
AkkuWarnThreshold=0;
OldWP=0;
NextWP = false;
 
// flags from last round to check for changes
uint8_t old_FCFlags = 0;
 
uint8_t old_AngleNick = 0;
uint8_t old_AngleRoll = 0;
lcd_cls();
OSD_Mode = ShowMode;
 
if (hardware == FC)
{
lcd_puts_at(0, 3, strGet(ONLY_NC), 0); // Nur mit NC
timer = 100;
while (timer > 0);
 
return;
}
 
SwitchToFC();
 
status = load_setting(0xff);
if(status == 255)
{
lcd_puts_at(0, 0, strGet(NO_SETTINGS), 0); // Keine Setings
_delay_ms(2000);
}
Flags_ExtraConfig = mk_param_struct->ExtraConfig;
Flags_GlobalConfig = mk_param_struct->GlobalConfig;
Flags_GlobalConfig3 = mk_param_struct->GlobalConfig3;
 
SwitchToNC();
 
mode = 'O';
 
// disable debug...
// RS232_request_mk_data (0, 'd', 0);
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
OSD_active = true; // benötigt für Navidata Ausgabe an SV2
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
flag = 0;
timer = TIMEOUT;
abo_timer = ABO_TIMEOUT;
//?? lcd_putc (10,5,0x18,1);
 
 
do
{
if (rxd_buffer_locked)
{
timer = TIMEOUT;
Decode64 ();
naviData = (NaviData_t *) pRxData;
 
if(error == 1)
lcd_cls();
 
error = 0;
GPS_Pos_t currpos;
currpos.Latitude = naviData->CurrentPosition.Latitude;
currpos.Longitude = naviData->CurrentPosition.Longitude;
 
if((currpos.Latitude != last5pos[0].Latitude)&&(currpos.Longitude != last5pos[0].Longitude))
{
last5pos[6] = last5pos[5];
last5pos[5] = last5pos[4];
last5pos[4] = last5pos[3];
last5pos[3] = last5pos[2];
last5pos[2] = last5pos[1];
last5pos[1] = last5pos[0];
last5pos[0] = currpos;
}
 
flag = 1;
 
if (OSD_Mode == 1)
{
if (naviData->FCStatusFlags & FC_STATUS_MOTOR_RUN)
{ // should be engines running
// motors are on, assume we were/are flying
COSD_FLAGS2 |= COSD_WASFLYING;
}
else
{ // stats
if ((COSD_FLAGS2 & COSD_WASFLYING) | (get_key_press (1 << KEY_ENTER)))
{
print_statistics ();
// draw_homesymbol(9,5);
// draw_targetsymbol(9,6);
 
}
 
if (get_key_press (1 << KEY_PLUS))
{
print_position ();
// draw_homesymbol(9,5);
// draw_targetsymbol(9,6);
 
}
}
 
// Altitude Control
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 3, OSD_ALTITUDE_CONTROL); break;
case 1 : break;
case 2 : OSD_Screen_Element (0, 1, OSD_ALTITUDE_CONTROL);break;
break;
}
 
 
// Altitude
 
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (11, 3, OSD_ALTITUDE); break;
case 1 : OSD_Screen_Element (1, 1, OSD_ALTITUDE); break;
case 2 : OSD_Screen_Element (1, 4, OSD_ALTITUDE); break;
break;
}
// Battery level
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 7, OSD_BATTERY_LEVEL); break;
case 1 : OSD_Screen_Element (0, 7, OSD_BATTERY_LEVEL); break;
case 2 : OSD_Screen_Element (13, 7, OSD_BATTERY_LEVEL); break;
break;
}
 
// Capacity
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (13, 7, OSD_CAPACITY); break;
case 1 : OSD_Screen_Element (13, 7, OSD_CAPACITY); break;
case 2 : OSD_Screen_Element (0, 7, OSD_CAPACITY); break;
break;
}
 
 
// Current
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (8, 7, OSD_CURRENT); break;
case 1 : OSD_Screen_Element (8, 7, OSD_CURRENT); break;
case 2 : OSD_Screen_Element (8, 7, OSD_CURRENT); break;
break;
}
 
 
// Care Free
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 5, OSD_CARE_FREE); break;
case 1 : break;
case 2 : OSD_Screen_Element (0, 3, OSD_CARE_FREE); break;
break;
}
 
 
// Compass Degree
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (13, 0, OSD_COMPASS_DEGREE); break;
case 1 : OSD_Screen_Element (13, 0, OSD_COMPASS_DEGREE); break;
case 2 : OSD_Screen_Element (12, 3, OSD_COMPASS_DEGREE);break;
break;
}
 
 
// Compass Direction
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (18, 0, OSD_COMPASS_DIRECTION); break;
case 1 : OSD_Screen_Element (18, 0, OSD_COMPASS_DIRECTION); break;
case 2 : break;
break;
}
 
 
// Compass Rose
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (12, 1, OSD_COMPASS_ROSE); break;
case 1 : OSD_Screen_Element (12, 1, OSD_COMPASS_ROSE); break;
case 2 : break;
break;
}
 
 
 
 
// Flying time
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 1, OSD_FLYING_TIME); break;
case 1 : OSD_Screen_Element (7, 6, OSD_FLYING_TIME); break;
case 2 : OSD_Screen_Element (15, 5, OSD_FLYING_TIME); break;
break;
}
 
 
// Ground Speed
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 0, OSD_GROUND_SPEED); break;
case 1 : OSD_Screen_Element (0, 0, OSD_GROUND_SPEED); break;
case 2 : break;
break;
}
 
 
// Home Circle
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (16, 4, OSD_HOME_CIRCLE); break;
case 1 : OSD_Screen_Element (1, 3, OSD_HOME_CIRCLE); break;
case 2 : OSD_Screen_Element (16, 0, OSD_HOME_CIRCLE); break;
break;
}
 
 
// Home Degree
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (12, 4, OSD_HOME_DEGREE); break;
case 1 : OSD_Screen_Element (8, 3, OSD_HOME_DEGREE); break;
case 2 : OSD_Screen_Element (11, 5, OSD_HOME_DEGREE); break;
break;
}
 
 
// Home Distance
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (10, 5, OSD_HOME_DISTANCE); break;
case 1 : OSD_Screen_Element (7, 2, OSD_HOME_DISTANCE); break;
case 2 : OSD_Screen_Element (0, 5, OSD_HOME_DISTANCE); break;
break;
}
 
 
// Target Distance
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (10, 6, OSD_TARGET); break;
case 1 : break;
case 2 : OSD_Screen_Element (0, 6, OSD_TARGET); break;
break;
}
// Target Bearing
switch (OSD_ScreenMode)
{
case 0 : break;
case 1 : break;
case 2 : OSD_Screen_Element (11, 6, OSD_TARGET_DEGREE); break;
break;
}
// Waypointnumber
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (5, 6, OSD_WAYPOINT); break;
case 1 : break;
case 2 : break;
 
break;
}
 
// LED1 Output
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 6, OSD_LED1_OUTPUT); break;
case 1 : break;
case 2 : OSD_Screen_Element (12, 2, OSD_LED1_OUTPUT); break;
break;
}
 
 
 
// LED2 Output
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (3, 6, OSD_LED2_OUTPUT); break;
case 1 : break;
case 2 : OSD_Screen_Element (14, 2, OSD_LED2_OUTPUT); break;
break;
}
 
// Manuell
// OSD_Screen_Element (7, 0, OSD_MANUELL);
 
// Navi Mode
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 4, OSD_NAVI_MODE); break;
case 1 : OSD_Screen_Element (8, 5, OSD_NAVI_MODE); break;
case 2 : OSD_Screen_Element (0, 2, OSD_NAVI_MODE); break;
break;
}
 
 
// RC Intensity
 
switch (OSD_ScreenMode)
{
case 0 : break;
case 1 : OSD_Screen_Element (15, 6, OSD_RC_INTENSITY);break;
case 2 : break;
break;
}
// Variometer Wert
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (11, 2, OSD_VARIOWERT); break;
case 1 : OSD_Screen_Element (14, 2, OSD_VARIOWERT); break;
case 2 : OSD_Screen_Element (8, 4, OSD_VARIOWERT); break;
break;
}
 
 
// Sats in use
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (18, 2, OSD_SATS_IN_USE); break;
case 1 : OSD_Screen_Element (8, 4, OSD_SATS_IN_USE); break;
case 2 : OSD_Screen_Element (10, 0, OSD_SATS_IN_USE); break;
break;
}
 
 
// Status Flags
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (0, 2, OSD_STATUS_FLAGS); break;
case 1 : break;
case 2 : OSD_Screen_Element (0, 0, OSD_STATUS_FLAGS); break;
break;
}
 
 
// Variometer Grafik
switch (OSD_ScreenMode)
{
case 0 : OSD_Screen_Element (9, 0, OSD_VARIOMETER); break;
case 1 : OSD_Screen_Element (9, 0, OSD_VARIOMETER); break;
case 2 : break;
break;
}
 
 
 
// Akku Warnung
CheckMKLipo();
 
// if (naviData->UBat > MK_LowBat) //bei kurzzeitigen Schwankungen Beeper erst wieder aus wenn UBat 0,2 V höher als Warnschwelle
// { //Beeper aus
// BeepTime = 0;
// BeepMuster = 0xFFFF;
// }
// Akku Warnung Ende
 
// remember statistics (only when engines running)
if (naviData->FCStatusFlags & FC_STATUS_MOTOR_RUN)
{
if (naviData->Altimeter > max_Altimeter) max_Altimeter = naviData->Altimeter;
if (naviData->GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData->GroundSpeed;
if (naviData->HomePositionDeviation.Distance > max_Distance) max_Distance = naviData->HomePositionDeviation.Distance;
if (naviData->UBat < min_UBat) min_UBat = naviData->UBat;
if (naviData->FlyingTime > max_FlyingTime) max_FlyingTime = naviData->FlyingTime;
if (naviData->Current > max_Current) max_Current = naviData->Current;
if (naviData->UsedCapacity > max_Capacity) max_Capacity = naviData->UsedCapacity;
}
 
// remember last values
last_RC_Quality = naviData->RC_Quality;
last_UBat = naviData->UBat;
old_FCFlags = naviData->FCStatusFlags;
 
rxd_buffer_locked = FALSE;
}
// 3D Lage anzeige beginnt hier -----------------------------------
else if (OSD_Mode == 3)
{
uint16_t head_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
 
lcd_cls ();
 
lcd_line(26,32,100,32,1); // horizontal //
lcd_line(63,0,63,63,1); // vertical //
lcd_puts_at(12, 7, strGet(KEYLINE5), 0);
 
// 45' Angel
lcd_line(61,11,65,11,1); // -- //
lcd_line(40,30,40,34,1); // | //
lcd_line(86,30,86,34,1); // | //
lcd_line(61,53,65,53,1); // -- //
 
if (info_3D == 1)
{
lcd_puts_at(9, 0, strGet(OSD_3D_V), 0); // V
lcd_puts_at(3, 3, strGet(OSD_3D_L), 0); // L
lcd_puts_at(17, 3, strGet(OSD_3D_R), 0); // R
lcd_puts_at(9, 7, strGet(OSD_3D_H), 0); // H
 
lcd_puts_at(0, 0, strGet(OSD_3D_NICK), 0); // Ni
write_ndigit_number_s (2, 0, naviData->AngleNick, 3, 0,0);
lcd_putc (5, 0, 0x1e, 0); // degree symbol
 
lcd_puts_at(0, 7, strGet(OSD_3D_ROLL), 0); // Ro
write_ndigit_number_s (2, 7, naviData->AngleRoll, 3, 0,0);
lcd_putc (5, 7, 0x1e, 0); // degree symbol
 
lcd_puts_at(13, 0, strGet(OSD_3D_COMPASS), 0);
// write_ndigit_number_s (15, 0,head_home, 3, 0);
write_ndigit_number_u (15, 0, naviData->CompassHeading, 3, 0,0);
lcd_putc (18, 0, 0x1e, 0); // degree symbol
lcd_printp_at (19, 0, (const char *) (pgm_read_word ( &(directions_p[heading_conv(naviData->CompassHeading)]))), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
info_3D++;
if (info_3D > 1)
info_3D = 0;
}
 
uint8_t Nick = ((-naviData->AngleNick/2)+32);
uint8_t Roll = ((-naviData->AngleRoll/2)+63);
 
lcd_ellipse(old_AngleRoll,old_AngleNick, 9, 8, 0);
lcd_ellipse_line (old_AngleRoll, old_AngleNick, 8, 7, old_hh, 0);
 
lcd_ellipse(Roll, Nick, 9, 8, 1);
lcd_ellipse_line (Roll, Nick, 8, 7, head_home, 1);
 
old_hh = head_home;
old_AngleNick = Nick;
old_AngleRoll = Roll;
// remember last values
last_RC_Quality = naviData->RC_Quality;
last_UBat = naviData->UBat;
old_FCFlags = naviData->FCStatusFlags;
rxd_buffer_locked = FALSE;
}
 
if (!abo_timer)
{ // renew abo every 3 sec
// request OSD Data from NC every 100ms
// RS232_request_mk_data (1, 'o', 100);
tmp_dat = 10;
SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
 
abo_timer = ABO_TIMEOUT;
}
}
if (!timer)
{
OSD_Timeout(flag);
flag = 0;
error = 1;
 
}
}
 
while (!get_key_press (1 << KEY_ESC));
OSD_active = false;
 
}
 
 
//-----------------------------------------------------------
//
void OSD_Screen_Element (uint8_t x, uint8_t y, uint8_t Element)
{
uint8_t FC_Fallspeed;
uint16_t Balken = 0;
 
switch (Element)
{
case OSD_ALTITUDE_CONTROL:
if (Flags_ExtraConfig & CFG2_HEIGHT_LIMIT)
{
if (naviData->FCStatusFlags2 & FC_STATUS2_ALTITUDE_CONTROL)
lcd_puts_at (x, y, strGet(OSD_ALTI_1), 0); // Höhe begr.
else
lcd_puts_at (x, y, strGet(OSD_ALTI_0), 0); // Höhe aus
}
else
{
if (naviData->FCStatusFlags2 & FC_STATUS2_ALTITUDE_CONTROL)
lcd_puts_at (x, y, strGet(OSD_VARIO_1), 0); // Vario Höhe
else
lcd_puts_at (x, y, strGet(OSD_VARIO_0), 0); // Vario aus
}
break;
 
case OSD_ALTITUDE:
//note:lephisto:according to several sources it's /30
if (naviData->Altimeter > (300 / AltimeterAdjust) || naviData->Altimeter < (-300 / AltimeterAdjust)) // above 10m only write full meters
write_ndigit_number_s (x, y, naviData->Altimeter / (30 / AltimeterAdjust), 4, 0,0);
else // up to 10m write meters.dm
write_ndigit_number_s_10th (x, y, naviData->Altimeter / (3 / AltimeterAdjust), 3, 0,0);
 
lcd_printp_at (x+4, y, PSTR("m"), 0);
lcd_putc (x+5, y, 0x09, 0);
 
break;
 
case OSD_BATTERY_LEVEL:
 
{
if ((OSD_LipoBar==1) &&(cells>0)) // LipobargraphAnzeige nur wenn Anzahl der Lipozellen bekannt sind
{
{
if (naviData->UBat < BattLowVoltageWarning)
 
{
write_ndigit_number_u (x+6, y, cells, 1, 0,2);
lcd_printp_at (x+7, y, PSTR("S"), 2);
}
else
{
write_ndigit_number_u (x+6, y, cells, 1, 0,0);
lcd_printp_at (x+7, y, PSTR("S"), 0);
}
}
 
if (cells==3)
 
{
 
lcd_rect(x*6, y*8, 28, 7, 1); // Rahmen
Balken = ((naviData->UBat-(cells*MIN_CELL_VOLTAGE))*10)/12;
if ((Balken > 0) && (Balken <28)) lcd_frect((x*6)+1, (y*8)+1, Balken, 5, 1); // Füllung
if (Balken <= 26) lcd_frect(Balken+(x*6)+1, (y*8)+1, 26-Balken, 5, 0); // löschen
}
 
if (cells==4 ||cells==5 )
{
lcd_rect(x*6, y*8, 30, 7, 1); // Rahmen
if (cells == 4) Balken = ((naviData->UBat-(cells*MIN_CELL_VOLTAGE))*10)/15;
if (cells == 5) Balken = ((naviData->UBat-(cells*MIN_CELL_VOLTAGE))*10)/19;
if ((Balken > 0) && (Balken <=29)) lcd_frect((x*6)+1, (y*8)+1, Balken, 5, 1); // Füllung
if (Balken <= 27) lcd_frect(Balken+(x*6)+1, (y*8)+1, 28-Balken, 5, 0); // löschen
}
 
}
if (OSD_LipoBar==0 )
{ // nur Textanzeige
 
switch (OSD_ScreenMode)
{
case 0 :
case 1 :
{
if (naviData->UBat < BattLowVoltageWarning)
{
write_ndigit_number_u_10th (x, y, naviData->UBat, 3, 0,2);
lcd_printp_at (x+4, y, PSTR("V"), 2);
}
else
{
write_ndigit_number_u_10th (x, y, naviData->UBat , 3, 0,0);
lcd_printp_at (x+4, y, PSTR("V"), 0);
}
break;
}
case 2 :
{
if (naviData->UBat < BattLowVoltageWarning)
{
write_ndigit_number_u_10th (x-2, y, naviData->UBat, 3, 0,4);
lcd_putc_jeti (x+2, y, 'V', 2);
}
else
{
write_ndigit_number_u_10th (x-2, y, naviData->UBat , 3, 0,3);
lcd_putc_jeti (x+2, y, 'V', 0);
}
break;
}
//break;
}
}
}
break;
 
case OSD_CAPACITY:
if (naviData->UsedCapacity > OSD_mAh_Warning)
{
write_ndigit_number_u (x, y, naviData->UsedCapacity, 5, 0,2);
lcd_printp_at (x+5, y, PSTR("mAh"), 2);
// BeepTime = 3000;
// BeepMuster = 0x0020;
}
else
{
write_ndigit_number_u (x, y, naviData->UsedCapacity, 5, 0,0);
lcd_printp_at (x+5, y, PSTR("mAh"), 0);
}
 
break;
 
case OSD_CARE_FREE:
if (naviData->FCStatusFlags2 & FC_STATUS2_CAREFREE)
lcd_puts_at (x, y, strGet(OSD_CARE_FREE_1), 0);
else
lcd_puts_at (x, y, strGet(OSD_CARE_FREE_0), 0); // Clear
break;
 
case OSD_COMPASS_DEGREE:
 
 
switch (OSD_ScreenMode)
{
case 0: case 1 :
{
write_ndigit_number_u (x, y, naviData->CompassHeading, 3, 0,0);
lcd_putc (x+3, y, 0x1E, 0); // degree symbol
break;
}
case 2 :
{
write_ndigit_number_u (x, y, naviData->CompassHeading, 3, 0,3);
lcd_putc (x+8, y, 0x1E, 0); // degree symbol
break;
}
break;
}
break;
 
 
 
case OSD_COMPASS_DIRECTION:
lcd_printp_at (x, y, (const char *) (pgm_read_word ( &(directions_p[heading_conv(naviData->CompassHeading)]))), 0);
break;
 
case OSD_COMPASS_ROSE:
draw_compass (x, y, naviData->CompassHeading);
break;
 
case OSD_CURRENT:
write_ndigit_number_u_10th (x, y, naviData->Current, 3, 0,0);
lcd_printp_at (x+4, y, PSTR("A"), 0);
break;
 
case OSD_FLYING_TIME:
write_time (x, y, naviData->FlyingTime);
lcd_printp_at (x+5, y, PSTR("m"), 0);
break;
 
case OSD_GROUND_SPEED:
write_ndigit_number_u (x, y, (uint16_t) (((uint32_t) naviData->GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0,0);
lcd_printp_at (x+3, y, PSTR("Kmh"), 0);
break;
 
case OSD_HOME_CIRCLE:
 
switch (OSD_ScreenMode)
{
case 0 :
{
lcd_o_circle(x, y, 5, 1);
if (OSD_HomeMKView)
heading_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
else
heading_home = (naviData->CompassHeading- naviData->HomePositionDeviation.Bearing + 360 ) % 360;
lcd_o_circ_line (x, y, 5, old_hh, 0);
old_hh = heading_home;
lcd_o_circ_line (x, y, 5, heading_home, 1);
break;
}
case 1 :
{
lcd_o_circle(x, y, 7, 1);
if (OSD_HomeMKView)
heading_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
else
heading_home = (naviData->CompassHeading- naviData->HomePositionDeviation.Bearing + 360 ) % 360;
lcd_o_circ_line (x, y, 7, old_hh, 0);
old_hh = heading_home;
lcd_o_circ_line (x, y, 7, heading_home, 1);
break;
}
case 2 :
{
lcd_o_circle(x, y, 5, 1);
if (OSD_HomeMKView)
heading_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
else
heading_home = (naviData->CompassHeading- naviData->HomePositionDeviation.Bearing + 360 ) % 360;
lcd_o_circ_line (x, y, 5, old_hh, 0);
old_hh = heading_home;
lcd_o_circ_line (x, y, 5, heading_home, 1);
break;
}
 
 
 
break;
}
 
break;
 
case OSD_HOME_DEGREE:
write_ndigit_number_u (x, y, heading_home, 3, 0,0);
lcd_putc (x+3, y, 0x1e, 0); // degree symbol
break;
 
 
 
case OSD_TARGET_DEGREE:
 
switch (OSD_ScreenMode)
{
case 0: case 1 :
{
write_ndigit_number_u (x, y, naviData->TargetPositionDeviation.Bearing/ 10, 3, 0,0);
lcd_putc (x+3, y, 0x1e, 0); // degree symbol
break;
}
case 2 :
{
write_ndigit_number_u (x, y, naviData->TargetPositionDeviation.Bearing/ 10, 3, 0,0);
lcd_putc (x+3, y, 0x1e, 0); // degree symbol
break;
}
break;
}
break;
 
case OSD_HOME_DISTANCE:
 
 
switch (OSD_ScreenMode)
{
case 0: case 1 :
{
write_ndigit_number_u (x, y, naviData->HomePositionDeviation.Distance / 10, 3, 0,0);
lcd_putc (x+3, y, 'm', 0);
draw_homesymbol(x+4,y);
break;
}
case 2 :
{
lcd_printp_at (x, y, PSTR("Home"), 0);
write_ndigit_number_u (x+5, y, naviData->HomePositionDeviation.Distance / 10, 3, 0,0);
lcd_printp_at (x+8, y, PSTR("m -"), 0);
break;
}
break;
}
break;
 
case OSD_TARGET:
switch (OSD_ScreenMode)
{
case 0: case 1 :
{
write_ndigit_number_u (x, y, naviData->TargetPositionDeviation.Distance / 10, 3, 0,0);
lcd_putc (x+3, y, 'm', 0);
draw_targetsymbol(x+4,y);
break;
}
case 2 :
{
lcd_printp_at (x, y, PSTR("Ziel"), 0);
write_ndigit_number_u (x+5, y, naviData->TargetPositionDeviation.Distance / 10, 3, 0,0);
lcd_printp_at (x+8, y, PSTR("m -"), 0);
break;
}
break;
}
break;
case OSD_WAYPOINT:
if (!OldWP == naviData->WaypointIndex)
{
// BeepTime = 500;
// BeepMuster = 0x0080;
OldWP = naviData->WaypointIndex;
NextWP = true;
}
if ((NextWP==true)&& naviData->NCFlags & NC_FLAG_TARGET_REACHED)
{
set_beep ( 500, 0x0080, BeepNormal);
NextWP = false;
}
write_ndigit_number_u (x+2, y, naviData->WaypointIndex , 2, 0,0);
 
lcd_printp_at (x, y, PSTR("WP"), 0);
 
break;
 
case OSD_LED1_OUTPUT:
 
 
if (!OSD_InvertOut)
{
if (naviData->FCStatusFlags2 & FC_STATUS2_OUT1_ACTIVE)
{
lcd_fcircle (x * 6 + 5, y * 8 + 3, OSD_LEDform, 0);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
else
{
lcd_fcircle (x * 6 + 5, y * 8 + 3, OSD_LEDform, 1);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
}
else
{
if (naviData->FCStatusFlags2 & FC_STATUS2_OUT1_ACTIVE)
{
lcd_fcircle (x * 6 + 5, y * 8 + 3,OSD_LEDform, 1);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
else
{
lcd_fcircle (x * 6 + 5, y * 8 + 3, OSD_LEDform, 0);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
}
break;
 
case OSD_LED2_OUTPUT:
 
if (!OSD_InvertOut)
{
if (naviData->FCStatusFlags2 & FC_STATUS2_OUT2_ACTIVE)
{
lcd_fcircle (x * 6 + 5, y * 8 + 3, OSD_LEDform, 0);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
else
{
lcd_fcircle (x * 6 + 5, y * 8 + 3, OSD_LEDform, 1);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
}
else
{
if (naviData->FCStatusFlags2 & FC_STATUS2_OUT2_ACTIVE)
{
lcd_fcircle (x * 6 + 5, y * 8 + 3, OSD_LEDform, 1);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
else
{
lcd_fcircle (x * 6 + 5, y * 8 + 3, OSD_LEDform, 0);
lcd_circle (x * 6 + 5, y * 8 + 3, 3, 1);
}
}
break;
 
case OSD_MANUELL:
if (naviData->NCFlags & NC_FLAG_MANUAL_CONTROL)
lcd_putc (x, y, 'M', 0); // rc transmitter
else
lcd_putc (x, y, 'X', 0); // clear
break;
 
case OSD_NAVI_MODE:
if (naviData->NCFlags & NC_FLAG_FREE)
lcd_puts_at (x, y, strGet(OSD_NAVI_MODE_0), 0); // Navi aus
else if (naviData->NCFlags & NC_FLAG_PH)
lcd_puts_at (x, y, strGet(OSD_NAVI_MODE_1), 0); // Pos. Hold
else if (naviData->NCFlags & NC_FLAG_CH)
lcd_puts_at (x, y, strGet(OSD_NAVI_MODE_2), 0); // Coming Home
break;
 
case OSD_RC_INTENSITY:
write_ndigit_number_u (x, y, naviData->RC_Quality, 3, 0,0);
lcd_printp_at (x+3, y, PSTR("\x1F"), 0); // RC-transmitter
if (naviData->NCFlags & NC_FLAG_NOSERIALLINK)
{
lcd_printpns_at(x+3, y, PSTR(" "), 0); // Clear
}
else
{
lcd_printpns_at(x+3, y, PSTR("PC"), 0);
}
break;
 
case OSD_SATS_IN_USE:
 
 
 
 
switch (OSD_ScreenMode)
{
case 0: case 1 :
{
if (naviData->NCFlags & NC_FLAG_GPS_OK)
{
write_ndigit_number_u (x, y, naviData->SatsInUse, 2, 0,0);
lcd_putc (x+2, y, 0x08, 0);
}
else
{
write_ndigit_number_u (x, y, naviData->SatsInUse, 2, 0,2);
lcd_putc (x+2, y, 0x08, 2);
}
break;
}
case 2 :
{
if (naviData->NCFlags & NC_FLAG_GPS_OK)
{
write_ndigit_number_u (x, y, naviData->SatsInUse, 2, 0,0);
lcd_printp_at (x+2, y, PSTR(" Sat"), 0);
}
else
{
write_ndigit_number_u (x, y, naviData->SatsInUse, 2, 0,2);
lcd_printp_at (x+2, y, PSTR(" Sat"),2);
}
break;
}
break;
}
break;
 
 
case OSD_STATUS_FLAGS:
// FC_StatusFlags 0.88
// #define FC_STATUS_MOTOR_RUN 0x01
// #define FC_STATUS_FLY 0x02
// #define FC_STATUS_CALIBRATE 0x04
// #define FC_STATUS_START 0x08
// #define FC_STATUS_EMERGENCY_LANDING 0x10
// #define FC_STATUS_LOWBAT 0x20
// #define FC_STATUS_VARIO_TRIM_UP 0x40
// #define FC_STATUS_VARIO_TRIM_DOWN 0x80
 
if (naviData->FCStatusFlags & FC_STATUS_CALIBRATE)
lcd_puts_at (x, y, strGet(OSD_FLAGS_1), 0); // Calibrate
else if (naviData->FCStatusFlags & FC_STATUS_START)
lcd_puts_at (x, y, strGet(OSD_FLAGS_2), 0); // Start
else if (naviData->FCStatusFlags & FC_STATUS_MOTOR_RUN)
lcd_puts_at (x, y, strGet(OSD_FLAGS_3), 0); // Run
else if (naviData->FCStatusFlags & FC_STATUS_FLY)
lcd_puts_at (x, y, strGet(OSD_FLAGS_4), 0); // Fly
else if (naviData->FCStatusFlags & FC_STATUS_EMERGENCY_LANDING)
lcd_puts_at (x, y, strGet(OSD_FLAGS_5), 0); // Landing
else if (naviData->FCStatusFlags & FC_STATUS_LOWBAT)
lcd_puts_at (x, y, strGet(OSD_FLAGS_6), 0); // LowBat
else
// lcd_printp_at (x, y, PSTR(" "), 0); // Clear
lcd_puts_at (x, y, strGet(OSD_FLAGS_0), 0); // Clear
 
break;
 
case OSD_VARIOMETER:
draw_variometer (x, y, 10, 14, naviData->Variometer);
break;
 
case OSD_VARIOWERT:
 
FC_Fallspeed = (unsigned int)naviData->Variometer;
FC_Fallspeed = 255-FC_Fallspeed;
 
if (OSD_VarioBeep && (naviData->FCStatusFlags & FC_STATUS_MOTOR_RUN) && (naviData->FCStatusFlags2 & FC_STATUS2_ALTITUDE_CONTROL))
{ //start Beep
if (naviData->Variometer <0) // MK fällt
{
Vario_Beep_Up = 0; // Up Beep freischalten
Vario_Threshold++;
if ((Vario_Beep_Down == 0) && (Vario_Threshold >= Vario_Threshold_Value))
{
 
set_beep ( 300, 0xffff, BeepNormal);
Vario_Threshold = Vario_Threshold_Value; // auf Maximalwert begrenzen
}
Vario_Beep_Down++; // Interval hochzählen in dem nicht gepiept wird
if (Vario_Beep_Down == Vario_Beep_Down_Interval) Vario_Beep_Down = 0;
}
 
if (naviData->Variometer == 0) Vario_Threshold = 0; //Startverzögerung löschen
 
if (naviData->Variometer >0 ) // MK steigt
{
Vario_Beep_Down = 0; // Down Beep freischalten
Vario_Threshold++;
 
if ((Vario_Beep_Up == 0) && (Vario_Threshold >= Vario_Threshold_Value))
{
set_beep ( 100, 0xffff, BeepNormal);
Vario_Threshold = Vario_Threshold_Value; // auf Maximalwert begrenzen
}
Vario_Beep_Up++; // Interval hochzählen in dem nicht gepiept wird
if (Vario_Beep_Up == Vario_Beep_Up_Interval) Vario_Beep_Up = 0;
}
} // end Beep
 
if (naviData->Variometer < 0)
{
if (FC_Fallspeed > OSD_Fallspeed)
 
{
write_ndigit_number_s_10th (x, y, naviData->Variometer, 3,0,2);
lcd_printpns_at(x+4, y, PSTR("m/s"), 2);
set_beep ( 1000, 0x0060, BeepNormal);
}
else
{
write_ndigit_number_s_10th (x, y, naviData->Variometer, 3,0,0);
lcd_printpns_at(x+4, y, PSTR("m/s"), 0);
}
}
else
{
write_ndigit_number_s_10th (x, y, naviData->Variometer, 3,0,0);
lcd_printpns_at(x+4, y, PSTR("m/s"), 0);
}
 
break;
 
}
 
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/osd.h
0,0 → 1,45
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _OSD_H
#define _OSD_H
 
void osd (uint8_t ShowMode);
void vario_beep_output (void);
void OSD_Timeout(uint8_t flag);
void OSD_Screen_Element (uint8_t x, uint8_t y, uint8_t Element);
void CheckMKLipo(void);
extern volatile uint8_t OSD_active;
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/parameter.c
0,0 → 1,1430
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
#include "lcd.h"
#include "timer.h"
#include "usart.h"
#include "mk-data-structs.h"
#include "parameter.h"
#include "menu.h"
#include "eeprom.h"
#include "parameter_names.h"
#include "messages.h"
 
#define TIMEOUT 500 // 5 sec
 
uint8_t display_settings_menu (void);
uint8_t display_param_menu (uint8_t);
uint8_t load_setting (uint8_t);
uint8_t write_setting (uint8_t);
uint8_t display_section_menu(void);
void edit_param(uint8_t);
void copy_setting(void);
 
 
mk_param_struct_t *mk_param_struct;
 
uint8_t ii;
volatile uint8_t offset = 0;
volatile uint8_t dmode = 0;
volatile uint8_t target_pos = 1;
volatile uint8_t offset2 = 0;
volatile uint8_t pmode = 0;
volatile uint8_t target_pos2 = 1;
volatile uint8_t setting = 0;
uint8_t changes = 0;
 
#define OFFSETOF(type, field) ((unsigned int) &(((type *) 0)->field))
 
#define MKOSO(field) (uint8_t)OFFSETOF(mk_param_struct_t, field)
 
 
 
//--------------------------------------------------------------
// Typ == (0 ohne Poti, 1 mit Poti, 2 bitfield, 3 serCh, 4 LEDmask, 5 Angle, 6 Empfaenger),
// |||
// Group, Typ, Min, Max, Struct-Name(Value), Default1, Default2, Default3+4+5,
// 0 1 2 3 4 5 6 7
// | | | | | | | |
// | | | / | | | /
// | | | / | | | /
// | | | / | | | /
// | | / / | | | /
// | | / / | | | /
// | / / / | | / /
// | / / / | | / /
// | / / / | | / /
// | / / / | | / /
// | / / / | | / /
// | | / / | | / /
// | | | | | | / /
// | | | | | | / /
// | | | | | | | /
// | | | | | | | /
// | | | | | | | |
// | | | | | | | |
// 0,0,1,12, MKOSO(Kanalbelegung)+2 , 1,1,1, // gas
 
 
 
prog_uchar param_config[8*PARAM_COUNT]=
{
// group 0 (kanaele) 1-15
 
0,0,1,12, MKOSO(Kanalbelegung)+2 , 1,1,1, // gas
0,0,1,12, MKOSO(Kanalbelegung)+3 , 4,4,4, // gier
0,0,1,12, MKOSO(Kanalbelegung)+0 , 3,3,3, // nick
0,0,1,12, MKOSO(Kanalbelegung)+1 , 2,2,2, // roll
0,3,1,25, MKOSO(Kanalbelegung)+4 , 5,5,5, // poti1
0,3,1,25, MKOSO(Kanalbelegung)+5 , 6,6,6, // poti2
0,3,1,25, MKOSO(Kanalbelegung)+6 , 7,7,7, // poti3
0,3,1,25, MKOSO(Kanalbelegung)+7 , 8,8,8, // poti4
0,3,1,25, MKOSO(Kanalbelegung)+8 , 9,9,9, // poti5
0,3,1,25, MKOSO(Kanalbelegung)+9 , 10,10,10, // poti6
0,3,1,25, MKOSO(Kanalbelegung)+10, 11,11,11, // poti7
0,3,1,25, MKOSO(Kanalbelegung)+11, 12,12,12, // poti8
0,0,0,12, MKOSO(MotorSafetySwitch), 0,0,0, // Motor Sicherungsswitch
0,2,0,CFG3_MOTOR_SWITCH_MODE , MKOSO(GlobalConfig3), 0,0,0, // kein Start ohne GPS Fix
0,2,0,CFG_SENSITIVE_RC, MKOSO(ExtraConfig), 0,0,0, // erweiterte signal pruefung
0,6,0,6, MKOSO(Receiver), 1,1,1,
 
 
// group 1 (main) 16-23
 
1,2,0,CFG_HOEHENREGELUNG, MKOSO(GlobalConfig), 0,0,0, // hoehenregler
1,2,0,CFG_GPS_AKTIV, MKOSO(GlobalConfig), 1,1,1, // gps
1,2,0,CFG_KOMPASS_AKTIV, MKOSO(GlobalConfig), 1,1,1, // kompass
1,2,0,CFG_KOMPASS_FIX, MKOSO(GlobalConfig), 0,0,0, // feste ausrichtung
1,2,0,CFG_SENSITIVE_RC, MKOSO(ExtraConfig), 0,0,0, // erweiterte signal pruefung
1,2,0,CFG_ACHSENKOPPLUNG_AKTIV, MKOSO(GlobalConfig), 1,1,1, // achsentkopplung
1,2,0,CFG_DREHRATEN_BEGRENZER, MKOSO(GlobalConfig), 0,0,0, // drehratenbregrenzung
1,2,0,CFG_HEADING_HOLD, MKOSO(GlobalConfig), 0,0,0, // heading hold
 
 
 
// group 2 (stick) 24-27
 
2,0,0,20, MKOSO(Stick_P), 10,8,6,
2,0,0,20, MKOSO(Stick_D), 16,16,10,
2,1,0,255, MKOSO(StickGier_P), 6,6,4,
2,1,0,255, MKOSO(ExternalControl), 0,0,0,
 
 
// group3 : looping 28-36
 
3,2,0,CFG_LOOP_OBEN, MKOSO(BitConfig), 0,0,0, // oben
3,2,0,CFG_LOOP_UNTEN, MKOSO(BitConfig), 0,0,0, // unten
3,2,0,CFG_LOOP_LINKS, MKOSO(BitConfig), 0,0,0, // links
3,2,0,CFG_LOOP_RECHTS, MKOSO(BitConfig), 0,0,0, // rechts
3,1,0,255, MKOSO(LoopGasLimit), 50,50,50,
3,0,0,247, MKOSO(LoopThreshold), 90,90,90,
3,0,0,247, MKOSO(LoopHysterese), 50,50,50,
3,0,0,247, MKOSO(WinkelUmschlagNick), 78,78,78,
3,0,0,247, MKOSO(WinkelUmschlagRoll), 78,78,78,
 
 
// group 4 (hoehe) 37-50
 
4,2,0,CFG_HOEHENREGELUNG, MKOSO(GlobalConfig), 0,0,0, // hoehenrelger
4,2,0,CFG2_HEIGHT_LIMIT, MKOSO(ExtraConfig), 0,0,0, // vario oder hoeenbergenzung
4,2,0,CFG_HOEHEN_SCHALTER, MKOSO(GlobalConfig), 1,1,1, // hoehenschalter
4,2,0,CFG2_VARIO_BEEP, MKOSO(ExtraConfig), 1,1,1, // variobeep
4,1,0,255, MKOSO(MaxHoehe), 255,255,255,
4,0,0,247, MKOSO(Hoehe_MinGas), 30,30,30,
4,1,0,255, MKOSO(Hoehe_P), 15,15,15,
4,1,0,255, MKOSO(Luftdruck_D), 30,30,30,
4,1,0,255, MKOSO(Hoehe_ACC_Wirkung), 0,0,0,
4,1,0,255, MKOSO(MaxAltitude), 150,150,150,
4,0,0,247, MKOSO(Hoehe_Verstaerkung), 15,15,15,
4,0,0,247, MKOSO(Hoehe_HoverBand), 8,8,8,
4,1,0,255, MKOSO(Hoehe_GPS_Z), 64,64,64,
4,0,0,160, MKOSO(Hoehe_StickNeutralPoint), 0,0,0,
 
 
// group 5 : kamera 51-68
 
5,1,0,255, MKOSO(ServoNickControl), 128,128,128,
5,0,0,247, MKOSO(ServoNickComp), 50,50,50,
5,2,0,0x01, MKOSO(ServoCompInvert), 0,0,0, // nick
5,0,0,247, MKOSO(ServoNickMin), 15,15,15,
5,0,0,247, MKOSO(ServoNickMax), 230,230,230,
5,0,0,25, MKOSO(ServoFilterNick), 0,0,0, //FC0.87
5,1,0,255, MKOSO(ServoRollControl), 128,128,128,
5,0,0,247, MKOSO(ServoRollComp), 85,85,85,
5,2,0,0x02, MKOSO(ServoCompInvert), 0,0,0, // roll
5,0,0,247, MKOSO(ServoRollMin), 70,70,70,
5,0,0,247, MKOSO(ServoRollMax), 220,220,220,
5,0,0,25, MKOSO(ServoFilterRoll), 0,0,0, //FC0.87
5,0,2,8, MKOSO(ServoNickRefresh), 4,4,4,
5,0,0,247, MKOSO(ServoManualControlSpeed), 60,60,60,
5,5,0,247, MKOSO(CamOrientation), 0,0,0,
5,1,0,255, MKOSO(Servo3), 125,125,125,
5,1,0,255, MKOSO(Servo4), 125,125,125,
5,1,0,255, MKOSO(Servo5), 125,125,125,
 
 
// group 6 : navictrl 67-85
 
6,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
6,1,0,255, MKOSO(NaviGpsModeControl), 254,254,254,
6,1,0,255, MKOSO(NaviGpsGain), 100,100,100,
6,0,0,247, MKOSO(NaviStickThreshold), 8,8,8,
6,0,0,247, MKOSO(NaviGpsMinSat), 6,6,6,
6,1,0,255, MKOSO(NaviGpsP), 90,90,90,
6,1,0,255, MKOSO(NaviGpsI), 90,90,90,
6,1,0,255, MKOSO(NaviGpsD), 90,90,90,
6,1,0,255, MKOSO(NaviGpsPLimit), 75,75,75,
6,1,0,255, MKOSO(NaviGpsILimit), 85,85,85,
6,1,0,255, MKOSO(NaviGpsDLimit), 75,75,75,
6,1,0,255, MKOSO(NaviGpsACC), 0,0,0,
6,1,0,255, MKOSO(NaviWindCorrection), 90,90,90,
6,1,0,255, MKOSO(NaviAccCompensation), 42,42,42,
6,1,0,255, MKOSO(NaviOperatingRadius), 245,245,245,
6,1,0,255, MKOSO(NaviAngleLimitation), 140,140,140,
6,0,0,247, MKOSO(NaviPH_LoginTime), 5,5,5,
6,2,0,CFG_GPS_AID, MKOSO(ExtraConfig), 0,0,0, // FC0.87dynamic ph
6,2,0,CFG3_DPH_MAX_RADIUS , MKOSO(GlobalConfig3), 0,0,0, // FC0.87
6,0,0,247, MKOSO(ComingHomeAltitude), 0,0,0,
 
 
// group 7 : ausgaenge 86-95
 
7,4,0,255, MKOSO(J16Bitmask), 95,95,95,
7,1,0,255, MKOSO(J16Timing), 20,20,20,
7,2,0,CFG_MOTOR_OFF_LED1, MKOSO(BitConfig), 0,0,0, // Motor_Off_Led1
7,2,0,CFG_MOTOR_BLINK1, MKOSO(BitConfig), 1,1,1, // Motor_Blink1
7,4,0,255, MKOSO(J17Bitmask), 243,243,243,
7,1,0,255, MKOSO(J17Timing), 20,20,20,
7,2,0,CFG_MOTOR_OFF_LED2, MKOSO(BitConfig), 0,0,0, // Motor_Off_Led2
7,2,0,CFG_MOTOR_BLINK2, MKOSO(BitConfig), 1,1,1, // Motor_Blink2
7,4,0,255, MKOSO(WARN_J16_Bitmask), 170,170,170,
7,4,0,255, MKOSO(WARN_J17_Bitmask), 170,170,170,
 
 
// group 8 : versch. 96-107
 
8,0,0,247, MKOSO(Gas_Min), 8,8,8,
8,0,0,247, MKOSO(Gas_Max), 230,230,230,
8,1,0,255, MKOSO(KompassWirkung), 64,64,64,
8,1,0,255, MKOSO(CareFreeModeControl), 0,0,0, // Carefree
8,2,0,CFG_LEARNABLE_CAREFREE, MKOSO(ExtraConfig), 0,0,0, // teachable Carefree
8,0,0,247, MKOSO(UnterspannungsWarnung), 33,33,33,
8,2,0,CFG_3_3V_REFERENCE, MKOSO(ExtraConfig), 0,0,0, // Voltage referenz
8,0,0,247, MKOSO(NotGasZeit), 90,90,90,
8,0,0,247, MKOSO(NotGas), 45,45,45,
8,0,0,247, MKOSO(FailSafeTime), 0,0,0, // Failsavetime
8,0,0,12, MKOSO(FailsafeChannel), 0,0,0, // FC0.87 Failsave Channel
8,2,0,CFG_NO_RCOFF_BEEPING, MKOSO(ExtraConfig), 0,0,0, // Kein Summer ohne Sender beim Start
8,2,0,CFG3_VARIO_FAILSAFE, MKOSO(GlobalConfig3), 0,0,0, //use vario Control for failsafe altitude
8,2,0,CFG_IGNORE_MAG_ERR_AT_STARTUP, MKOSO(ExtraConfig), 0,0,0, // Ignore Compass Error
8,2,0,CFG3_NO_SDCARD_NO_START , MKOSO(GlobalConfig3), 0,0,0, // nicht starten ohne SD Karte
8,2,0,CFG3_NO_GPSFIX_NO_START , MKOSO(GlobalConfig3), 0,0,0, // kein Start ohne GPS Fix
 
 
// group 9 : gyro 108-120
 
9,1,0,255, MKOSO(Gyro_P), 90,100,100,
9,1,0,255, MKOSO(Gyro_I), 120,120,120,
9,1,0,255, MKOSO(Gyro_D), 10,10,10,
9,1,0,255, MKOSO(Gyro_Gier_P), 90,100,100,
9,1,0,255, MKOSO(Gyro_Gier_I), 120,120,120,
9,1,0,255, MKOSO(DynamicStability), 70,70,70,
9,2,0,CFG_DREHRATEN_BEGRENZER, MKOSO(GlobalConfig), 0,0,0, // drehratenbregrenzung
9,0,0,247, MKOSO(GyroAccFaktor), 27,27,27,
9,0,0,247, MKOSO(GyroAccAbgleich), 32,32,32,
9,1,0,255, MKOSO(I_Faktor), 16,16,16,
9,0,0,247, MKOSO(Driftkomp), 0,0,0,
9,0,0,16, MKOSO(Gyro_Stability), 6,6,6,
9,0,0,247, MKOSO(MotorSmooth), 0,0,0,
 
 
// group 10: benutzer 121-128
 
10,1,0,255, MKOSO(UserParam1), 0,0,0,
10,1,0,255, MKOSO(UserParam2), 0,0,0,
10,1,0,255, MKOSO(UserParam3), 0,0,0,
10,1,0,255, MKOSO(UserParam4), 0,0,0,
10,1,0,255, MKOSO(UserParam5), 0,0,0,
10,1,0,255, MKOSO(UserParam6), 0,0,0,
10,1,0,255, MKOSO(UserParam7), 0,0,0,
10,1,0,255, MKOSO(UserParam8), 0,0,0,
 
 
// group 11: achskoppl 129-132
 
11,2,0,CFG_ACHSENKOPPLUNG_AKTIV, MKOSO(GlobalConfig), 0,0,0, // achsentkopplung
11,1,0,255, MKOSO(AchsKopplung1), 90,90,90,
11,1,0,255, MKOSO(AchsKopplung2), 55,55,55,
11,1,0,255, MKOSO(CouplingYawCorrection), 70,70,70,
 
 
// group 12: mixer 133
 
12,5,0,23,MKOSO(OrientationAngle), 0,0,0,
 
// group 13 (easy-setup) 134-144
 
13,2,0,0x01, MKOSO(GlobalConfig), 0,0,0, // hoehenrelger
13,1,0,255, MKOSO(MaxHoehe), 255,255,255,
13,0,0,160, MKOSO(Hoehe_StickNeutralPoint), 0,0,0,
13,2,0,0x20, MKOSO(GlobalConfig), 1,1,1, // gps
13,1,0,255, MKOSO(NaviGpsModeControl), 254,254,254,
13,2,0,0x20, MKOSO(ExtraConfig), 0,0,0, // dynamic ph
13,0,0,247, MKOSO(ComingHomeAltitude), 0,0,0,
13,1,0,255, MKOSO(CareFreeModeControl), 0,0,0, // Carefree
13,2,0,0x40, MKOSO(ExtraConfig), 0,0,0, // teachable Carefree
13,0,0,12, MKOSO(MotorSafetySwitch), 0,0,0, // Motor Sicherungsswitch
13,5,0,23, MKOSO(OrientationAngle), 0,0,0,
 
};
 
 
//--------------------------------------------------------------
#define ITEMS_RX 9
 
prog_char param_items_rx[ITEMS_RX][17]= // zeilen,zeichen+1
{
"PPM ",
"Spektrum ",
"Spektrum HiRes ",
"Spektrum LoRes ",
"Jeti ",
"ACT DSL ",
"HOTT ",
"Futuba SBUS ",
"User ",
};
 
 
 
 
 
//--------------------------------------------------------------
void edit_parameter(void)
{
SwitchToFC();
 
 
// uint8_t setting;
 
 
setting = display_settings_menu();
 
if(setting == 255)
return;
 
if(setting == 6)
{
copy_setting();
return;
}
 
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" Setting x "), 2);
lcd_puts_at(0, 0, strGet(PARA_SETTINGS), 2);
lcd_putc (15, 0, (setting + 48), 2); // ASCII ab 48 (hex 30) beginnt 0 - 9
// lcd_printp_at (3, 2, PSTR("ändern"), 0);
// lcd_printp_at (3, 3, PSTR("aktivieren"), 0);
lcd_puts_at(3, 2, strGet(PARA_CHANGE), 0);
lcd_puts_at(3, 3, strGet(PARA_AKTIVI), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
uint8_t val = menu_choose2 (2, 3, 2, 0, 0);
if (val == 255)
return;
if(val == 3)
{
load_setting(setting);
uint8_t setting_written = write_setting(setting);
if(setting_written == setting)
{
lcd_cls_line (0,2,21);
lcd_cls_line (0,3,21);
// lcd_printp_at (11, 0, PSTR("aktiviert"), 0);
lcd_puts_at(5, 2, strGet(PARA_AKTIV), 0);
}
else
{
lcd_cls_line (0,2,21);
lcd_cls_line (0,3,21);
// lcd_printp_at (0, 4, PSTR("Error"), 0);
lcd_puts_at(0, 4, strGet(FEHLER), 0);
}
_delay_ms(2000);
return;
}
 
if(setting == 255)
return;
 
uint8_t setting_loaded = load_setting(setting);
if(setting_loaded == 255)
return;
 
offset = 0;
dmode = 0;
target_pos = 1;
changes =0;
uint8_t group =0;
 
do
{
group = display_section_menu();
if(group != 255)
{
offset2 = 0;
pmode = 0;
target_pos2 = 1;
uint8_t param;
do
{
param = display_param_menu(group);
if(param != 255)
{
edit_param(param);
}
}
while(param != 255);
}
}
while(group != 255);
 
if(changes == 1)
{
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" Setting x speichern?"), 2);
lcd_puts_at(0, 0, strGet(PARA_SAVESETT), 2);
lcd_putc (9, 0, (setting + 48), 2); // ASCII ab 48 (hex 30) beginnt 0 - 9
write_ndigit_number_u(9, 0, setting, 1, 0,0);
// lcd_printp_at (3, 2, PSTR("Ja"), 0);
// lcd_printp_at (3, 3, PSTR("Nein"), 0);
 
lcd_puts_at(3, 2, strGet(YES), 0);
lcd_puts_at(3, 3, strGet(NOO), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
uint8_t val = menu_choose2 (2, 3, 2, 0, 0);
if(val == 2)
{
uint8_t setting_written = write_setting(setting);
if(setting_written == setting)
{
// lcd_printp_at (3, 4, PSTR("Gespeichert und"), 0);
lcd_puts_at(3, 4, strGet(PARA_SETTSAVED), 0);
// lcd_printp_at (3, 5, PSTR("Aktiviert"), 0);
lcd_puts_at(3, 5, strGet(PARA_AKTIV), 0);
}
else
{
// lcd_printp_at (0, 4, PSTR("Error"), 0);
lcd_puts_at(0, 4, strGet(FEHLER), 0);
}
timer = 100;
while (timer > 0);
 
}
}
}
 
 
//--------------------------------------------------------------
void copy_setting(void)
{
uint8_t fromsetting = 3;
uint8_t tosetting = 5;
 
lcd_cls();
 
// lcd_printp_at (0, 1, PSTR("Kopiere Setting"), 0);
// lcd_printp_at (0, 3, PSTR("von x nach y"), 0);
// lcd_printp_at (0, 7, PSTR("von nach Ende OK"), 0);
 
lcd_puts_at(0, 1, strGet(PARA_COPY), 0);
lcd_puts_at(0, 3, strGet(PARA_FROMTO), 0);
lcd_puts_at(0, 7, strGet(PARA_ENDE), 0);
 
do
{
write_ndigit_number_u(5,3,fromsetting, 1,0,0);
write_ndigit_number_u(14,3,tosetting, 1,0,0);
 
if(get_key_press (1 << KEY_MINUS))
{
fromsetting++;
if(fromsetting == 6) fromsetting = 1;
}
if(get_key_press (1 << KEY_PLUS))
{
tosetting++;
if(tosetting == 6) tosetting = 1;
}
if(get_key_press (1 << KEY_ENTER))
{
lcd_printp_at (0, 5, PSTR("Wirklich Kopieren?"), 0);
lcd_puts_at(0, 5, strGet(PARA_COPYQ), 0);
// lcd_printp_at (0, 7, PSTR(" Ende OK"), 0);
lcd_puts_at(12, 7, strGet(KEYLINE4), 0);
do
{
if(get_key_press (1 << KEY_ENTER))
{
uint8_t loaded = load_setting(fromsetting);
if(loaded == fromsetting)
{
uint8_t written = write_setting(tosetting);
if(written == tosetting)
{
lcd_printp_at (0, 5, PSTR("Kopiert und Aktiviert"), 0);
lcd_puts_at(0, 5, strGet(PARA_COPYACTIV), 0);
}
else
{
// lcd_printp_at (0, 5, PSTR("Fehler"), 0);
lcd_puts_at(0, 5, strGet(FEHLER), 0);
lcd_cls_line (6, 5, 14);
}
}
else
{
// lcd_printp_at (0, 5, PSTR("Fehler"), 0);
lcd_puts_at(0, 5, strGet(FEHLER), 0);
lcd_cls_line (6, 5, 14);
}
timer = 100;
while (timer > 0);
return;
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
lcd_cls_line (0, 5, 21);
// lcd_printp_at (0, 7, PSTR("von nach Ende OK"), 0);
lcd_puts_at(0, 7, strGet(PARA_ENDE), 0);
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
 
//--------------------------------------------------------------
void edit_param(uint8_t param)
{
lcd_cls();
uint8_t type = pgm_read_byte(param_config+(8*param)+1);
// lcd_printp_at (0, 0, PSTR(" Ändere Setting: "), 2);
lcd_puts_at(0, 0, strGet(PARA_CHANGESETT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
if(type != 6)
lcd_printp_at(0,2,param_names[param][DisplayLanguage], 0);
 
 
//-------------------------------------------------------
if(type == 0) // ohne poti
{
lcd_printp_at (4, 4, PSTR("( - ) (d: )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
write_ndigit_number_u (5, 4, min, 3, 0,0);
write_ndigit_number_u (9, 4, max, 3, 0,0);
write_ndigit_number_u (17, 4, defaultvalue, 3, 0,0);
 
do
{
write_ndigit_number_u (0, 4, newvalue, 3, 0,0);
lcd_frect ((8*0), (8*5), (newvalue * (16*8) / max), 6, 1);
 
if(max >= 50)
{
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 3))
{
if((newvalue-1) >= min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
else
{
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
if((newvalue-1) >= min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
 
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 1) // mit poti
{
lcd_printp_at (4, 4, PSTR("(0-247-P8)(d:Po )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
uint8_t mode = 0;
 
if(defaultvalue > 247)
{
lcd_printp_at (17, 4, PSTR("Po )"), 0);
write_ndigit_number_u (19, 4, 256-defaultvalue, 1, 0,0);
}
else
write_ndigit_number_u (17, 4, defaultvalue, 3, 0,0);
 
if(value > 247)
mode = 1;
 
do
{
if(newvalue > 247)
mode = 1;
else
mode = 0;
 
if(mode == 0)
{
write_ndigit_number_u (0, 4, newvalue, 3, 0,0);
lcd_frect ((8*0), (8*5), (newvalue * (16*8) / max), 6, 1);
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
if((newvalue+1) <= max)
newvalue++;
 
if(newvalue > 247)
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = 255;
}
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 3))
{
if((newvalue-1)>=min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
// lcd_frect ((newvalue * (16*8) / max), (8*5), ((16*8) / max), 6, 0);
newvalue--;
}
}
}
else
{
lcd_printp_at (0, 4, PSTR("Po"), 0);
write_ndigit_number_u (2, 4, 256 - newvalue, 1, 0,0);
lcd_frect ((8*0), (8*5), ((256 - newvalue) * (16*8) / 8), 6, 1);
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
if(newvalue - 1 > 247)
{
newvalue--;
}
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
lcd_frect (((255 - newvalue) * (16*8) / 8), (8*5), (16*8), 6, 0);
// lcd_frect (((255 - newvalue) * (16*8) / 8), (8*5), ((16*8) / 8), 6, 0);
newvalue++;
 
if(newvalue == 0)
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0); // balken löschen
newvalue = 247;
}
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 2) // ja/nein
{
// lcd_printp_at (3, 4, PSTR("Ja"), 0);
// lcd_printp_at (3, 5, PSTR("Nein"), 0);
lcd_puts_at(3, 4, strGet(YES), 0);
lcd_puts_at(3, 5, strGet(NOO), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
uint8_t bitmap = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
if(defaultvalue == 1)
lcd_printp_at (8, 4, PSTR("*"), 0);
if(defaultvalue == 0)
lcd_printp_at (8, 5, PSTR("*"), 0);
 
do
{
if(newvalue & bitmap)
{
lcd_printp_at (1, 4, PSTR("\x1d"), 0);
lcd_printp_at (1, 5, PSTR(" "), 0);
}
else
{
lcd_printp_at (1, 4, PSTR(" "), 0);
lcd_printp_at (1, 5, PSTR("\x1d"), 0);
}
 
if((get_key_press (1 << KEY_MINUS)) && (!(newvalue & bitmap)))
newvalue ^= bitmap;
 
if((get_key_press (1 << KEY_PLUS)) && (newvalue & bitmap))
newvalue ^= bitmap;
 
if(get_key_press (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 3) // serCH
{
lcd_printp_at (4, 4, PSTR("(1-S12/W) (d: )"), 0);
lcd_printp_at (12, 6, PSTR("Std."), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
uint8_t min = pgm_read_byte(param_config+(8*param)+2);
uint8_t max = pgm_read_byte(param_config+(8*param)+3);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t defaultvalue = pgm_read_byte(param_config+(8*param)+4 + setting ); // 5 - 7
uint8_t newvalue = value;
 
write_ndigit_number_u (17, 4, defaultvalue, 3, 0,0);
 
do
{
if (newvalue<=(max-13))
write_ndigit_number_u (0, 4, newvalue, 3, 0,0);
else
{
if (newvalue<=(max-1))
{
lcd_printp_at (0, 4, PSTR("S"), 0);
write_ndigit_number_u (1, 4, (newvalue-12), 2, 0,0);
}
}
if (newvalue==max)
lcd_printp_at (0, 4, PSTR("WPE"), 0);
 
lcd_frect ((8*0), (8*5), (newvalue * (16*8)) / max, 6, 1);
 
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 2))
{
if((newvalue+1) <= max)
newvalue++;
}
 
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 2))
{
if((newvalue-1)>=min)
{
lcd_frect (((newvalue - 1) * (16*8) / max), (8*5), (16*8), 6, 0);
newvalue--;
}
}
 
if(get_key_long (1 << KEY_ESC))
{
lcd_frect ((8*0), (8*5), (16*8), 6, 0);
newvalue = defaultvalue;
}
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 4) // led bitfeld
{
// TODO: Übersetzung
lcd_printp_at (0, 7, PSTR(" \x19 0\x11I Ende OK"), 0);
 
if (param == 93 || param == 94)
// lcd_printp_at (5, 6, PSTR("aktiv"), 0);
lcd_puts_at(5, 6, strGet(AKTIV), 0);
 
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
uint8_t newvalue = value;
uint8_t pos = 0;
 
do
{
 
for(ii = 0; ii < 8; ii++)
{
if(newvalue & (1 << ii))
lcd_printp_at (8-ii, 4,PSTR("1"),0);
else
lcd_printp_at (8-ii, 4,PSTR("0"),0);
}
lcd_printp_at (pos+1, 5,PSTR("\x12"),0);
 
if(get_key_press (1 << KEY_MINUS))
{
lcd_printp_at (pos+1, 5,PSTR(" "),0);
pos++;
if(pos == 8)
pos = 0;
}
 
if (param == 93 || param == 94)
{
if(get_key_long (1 << KEY_PLUS))
{
if (newvalue != 0)
newvalue = 0;
else
newvalue = 170;
}
}
 
if(get_key_short (1 << KEY_PLUS))
newvalue ^= (1<<(7-pos));
 
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes = 1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 5) // Angle
{
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
 
lcd_ecircle(102, 35, 16, 1);
 
uint8_t newvalue = value;
uint8_t oldvalue = newvalue;
do
{
 
if(oldvalue != newvalue) lcd_ecirc_line (102, 35, 15, oldvalue*15, 0);
oldvalue = newvalue;
lcd_ecirc_line (102, 35, 15, newvalue*15, 1);
 
 
if(get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 1))
{
newvalue++;
if(newvalue == 24)
newvalue = 0;
}
if(get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS), 1))
{
if(newvalue == 0)
newvalue = 24;
newvalue--;
}
if(get_key_short (1 << KEY_ENTER))
{
if(newvalue != value)
{
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
}
break;
}
}
while (!get_key_short (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
//-------------------------------------------------------
if(type == 6) // receiver
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4));
 
uint8_t newvalue = value + 1;
uint8_t val =0;
uint8_t ii = 0;
uint8_t offset = 0;
uint8_t dmode = 0;
uint8_t target_pos = 1;
 
uint8_t size = ITEMS_RX;
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
lcd_printp_at(3,ii+1,param_items_rx[ii+offset], 0);
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
}
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose3 (1, 5, target_pos,0,1); //menu_choose3 (min, max, start, return_at_start, return_at_end)
else
val = menu_choose3 (1, size, target_pos,0,0);
}
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
 
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose3 (2, 6, target_pos,1,0);
else
val = menu_choose3 (2, 5, target_pos,1,1);
}
if(val == 254) // überlauf unten
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253) // überlauf oben
{
offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 252) // ESC
return;
else if(val <= size)
{
newvalue = val + offset - 1;
*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*param)+4)) = newvalue;
changes=1;
return;
}
}
}
}
 
 
//--------------------------------------------------------------
uint8_t display_param_menu(uint8_t group)
{
uint8_t items[20];
 
uint8_t size=0;
for(ii = 0;ii < PARAM_COUNT; ii++)
{
if(pgm_read_byte(param_config+(8*ii)) == (group-1))
{
items[size] = ii;
size++;
}
}
 
uint8_t val =0 ;
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wähle Parameter: "), 2);
lcd_puts_at(0, 0, strGet(PARA_SELECT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
ii = 0;
if(offset2 > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset2) < size)
{
lcd_printp_at(3,ii+1,param_names[items[ii+offset2]][DisplayLanguage], 0);
// this reads the the offset in the struct from the pgm configuration table and then reads the value from the struct
 
uint8_t type = pgm_read_byte(param_config+(8*items[ii+offset2])+1);
 
if(type == 0)
{
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0,0);
if (group == 9) // % Anzeige für Notgas wenn Variohöhe für Notgas verwendet wird
{
if (ii+offset2 == 8)
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[(ii+offset2)+4])+4)); // Abfrage Variohöhe Notgas
uint8_t bitmap = pgm_read_byte(param_config+(8*items[(ii+offset2)+4])+3); // Abfrage Variohöhe Notgas
if(value & bitmap)
lcd_printp_at(17,ii+1,PSTR("%"), 0);
else
lcd_printp_at(17,ii+1,PSTR(" "), 0);
}
}
}
if(type == 1)
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
 
if(value < 248)
write_ndigit_number_u (18, ii+1, value, 3, 0,0);
 
if(value >= 248)
{
lcd_printp_at (18, ii+1, PSTR(" P"), 0);
write_ndigit_number_u (20, ii+1, 256-value, 1, 0,0);
}
}
 
if(type == 2)
{
 
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
uint8_t bitmap = pgm_read_byte(param_config+(8*items[ii+offset2])+3);
if(value & bitmap)
lcd_printp_at (18, ii+1, PSTR(" J"), 0);
else
lcd_printp_at (18, ii+1, PSTR(" N"), 0);
 
}
 
if(type == 3)
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
if (value<=12)
write_ndigit_number_u (18, ii+1, value, 3, 0,0);
else
if (value<=(24))
{
lcd_printp_at (18, ii+1, PSTR("S"), 0);
write_ndigit_number_u (19, ii+1, (value-12), 2, 0,0);
}
 
if (value==25)
lcd_printp_at (18, ii+1, PSTR("WPE"), 0);
 
}
 
if(type == 4)
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0,0);
 
if(type == 5)
write_ndigit_number_u (18, ii+1, (*(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)))*15, 3, 0,0);
 
if(type == 6) // Empfänger Typ
{
uint8_t value = *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4));
 
if(value == 0)
lcd_printp_at (18, ii+1, PSTR("PPM"), 0);
else if(value == 1)
lcd_printp_at (18, ii+1, PSTR("Spe"), 0);
else if(value == 2)
lcd_printp_at (18, ii+1, PSTR("SpH"), 0);
else if(value == 3)
lcd_printp_at (18, ii+1, PSTR("SpL"), 0);
else if(value == 4)
lcd_printp_at (18, ii+1, PSTR("Jet"), 0);
else if(value == 5)
lcd_printp_at (18, ii+1, PSTR("ACT"), 0);
else if(value == 6)
lcd_printp_at (18, ii+1, PSTR("HoT"), 0);
else if(value == 7)
lcd_printp_at (18, ii+1, PSTR("SBU"), 0);
else if(value == 8)
lcd_printp_at (18, ii+1, PSTR("USR"), 0);
else
write_ndigit_number_u (18, ii+1, *(((uint8_t*)mk_param_struct) + pgm_read_byte(param_config+(8*items[ii+offset2])+4)), 3, 0,0);
 
}
}
 
if((ii == 5)&&(ii+offset2 < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(pmode == 0)
{
if(offset2 == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos2,0,1);
else
val = menu_choose2 (1, size, target_pos2,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos2,1,1);
 
}
if(pmode == 1)
{
if(offset2+7 > size)
val = menu_choose2 (2, 6, target_pos2,1,0);
else
val = menu_choose2 (2, 5, target_pos2,1,1);
 
}
 
if(val == 254)
{
offset2++;
pmode = 1;
target_pos2 = 5;
}
else if(val == 253)
{
offset2--;
pmode = 0;
target_pos2 = 2;
}
else
break;
 
}
 
if(val != 255)
{
target_pos2=val;
return items[val+offset2-1];
}
else
return val;
 
}
 
 
//--------------------------------------------------------------
uint8_t display_section_menu(void)
{
uint8_t size = PAGES;
 
uint8_t val =0;
 
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Wähle Seite: "), 2);
lcd_puts_at(0, 0, strGet(PARA_SEITE),2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
ii = 0;
if(offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+offset) < size)
lcd_printp_at(3,ii+1,param_pages[ii+offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
 
 
if(dmode == 0)
{
if(offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
if(dmode == 1)
{
if(offset+7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
 
if(val == 254)
{
offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
offset--;
dmode = 0;
target_pos = 2;
}
else
break;
 
}
 
if(val != 255)
{
target_pos=val;
return val+offset;
}
else
return val;
 
}
 
 
//--------------------------------------------------------------
uint8_t display_settings_menu (void)
{
uint8_t status;
 
lcd_cls ();
 
// lcd_printp_at (0, 0, PSTR(" Wähle Setting: "), 2);
lcd_puts_at(0, 0, strGet(PARA_SELSETT), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
 
for(setting=1;setting<6;setting++)
{
status = load_setting(setting);
if(status == 255)
return 255;
 
write_ndigit_number_u (3, setting, status, 1, 0,0);
lcd_print_at (5,setting,(uint8_t*)mk_param_struct->Name, 0);
}
// lcd_printp_at (3, 6, PSTR("Kopiere Setting"), 0);
lcd_puts_at(3, 6, strGet(PARA_COPY), 0);
 
status = load_setting(0xff);
if(status == 255)
return 255;
 
setting = menu_choose (1, 6, 1,status);
 
return setting;
}
 
 
//--------------------------------------------------------------
uint8_t load_setting(uint8_t setting)
{
mode = 'Q'; // Settings
uint8_t timeout = 50;
rxd_buffer_locked = FALSE;
 
while (!rxd_buffer_locked && timeout)
{
SendOutData ('q', ADDRESS_FC, 1, &setting, 1);
// _delay_ms(50);
timer = 20;
while (timer > 0);
timeout--;
}
 
if (timeout != 0)
{
Decode64 ();
setting = *pRxData;
mk_param_struct = (mk_param_struct_t *) (pRxData + 1) ;
}
else
{ // timeout occured
// lcd_printp_at (0, 2, PSTR("Fehler: keine Daten"), 0);
lcd_puts_at(0, 2, strGet(OSD_ERROR), 0);
timer = 100;
while (timer > 0);
setting = 255;
}
return setting;
}
 
 
//--------------------------------------------------------------
uint8_t write_setting(uint8_t setting)
{
mode = 'S'; // Settings
uint8_t timeout = 50;
rxd_buffer_locked = FALSE;
 
while (!rxd_buffer_locked && timeout)
{
SendOutData ('s', ADDRESS_FC, 2, &setting, 1, mk_param_struct, sizeof(mk_param_struct_t));
// _delay_ms(50);
timer = 20;
while (timer > 0);
timeout--;
}
 
if (timeout != 0)
{
Decode64 ();
setting = *pRxData;
}
else // timeout occured
{
// lcd_printp_at (0, 2, PSTR("Fehler: keine Daten"), 0);
lcd_puts_at(0, 2, strGet(OSD_ERROR), 0);
timer = 100;
while (timer > 0);
setting = 255;
}
 
return setting;
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/parameter.h
0,0 → 1,46
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
 
#ifndef _PARAMETER_H
#define _PARAMETER_H
#include "main.h"
 
 
void edit_parameter (void);
uint8_t load_setting(uint8_t setting);
 
 
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/parameter_names.h
0,0 → 1,277
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
 
#define PAGES 14
#define PARAM_COUNT 152 //152 FC088L
#define PARAM_LENGTH 15
#define PARAM_NUM_LANG 4
 
// German Englisch Französisch Holländisch
 
prog_char param_pages[PAGES][PARAM_NUM_LANG][PARAM_LENGTH]= // zeilen,zeichen+1
{
{"Kanäle ","Channel ","Canaux ","Kanaal "},
{"Konfiguration ","main ","Config ","Configuratie "},
{"Stick ","stick ","Manche ","Stick "},
{"Looping ","Looping ","Looping ","Looping "},
{"Höhe ","Altitude ","Altitude ","Hoogte "},
{"Kamera ","Camera ","Camera ","Camera "},
{"NaviCtrl ","NaviCtrl ","NaviCtrl ","NaviCtrl "},
{"Ausgänge ","Outputs ","Sorties ","Uitgangen "},
{"Verschiedenes ","Divers ","Divers ","Diversen "},
{"Gyro ","Gyro ","Gyro ","Gyro "},
{"Benutzer ","User ","Parametres ","Gebruiker "},
{"Achskopplung ","Coupl Axes ","Coupl Axes ","Koppeling Ass "},
{"Mixer-Setup ","Config Mix ","Config Mix ","Config. Mixer "},
{"Easy Setup ","Config Easy ","Config Easy ","Config. easy "},
 
 
 
};
 
 
//Namen
prog_char param_names[PARAM_COUNT][PARAM_NUM_LANG][PARAM_LENGTH]=
{
// group 0 (kanaele) 1-15
 
{"Gas ","Throttle ","Gaz ","Gas "},
{"Gier ","Gier ","Lacet ","Gier "},
{"Nick ","Nick ","Tangage ","Nick "},
{"Roll ","Roll ","Roulis ","Roll "},
{"Poti 1 ","Poti 1 ","Poti 1 ","Poti 1 "},
{"Poti 2 ","Poti 2 ","Poti 2 ","Poti 2 "},
{"Poti 3 ","Poti 3 ","Poti 3 ","Poti 3 "},
{"Poti 4 ","Poti 4 ","Poti 4 ","Poti 4 "},
{"Poti 5 ","Poti 5 ","Poti 5 ","Poti 5 "},
{"Poti 6 ","Poti 6 ","Poti 6 ","Poti 6 "},
{"Poti 7 ","Poti 7 ","Poti 7 ","Poti 7 "},
{"Poti 8 ","Poti 8 ","Poti 8 ","Poti 8 "},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Motor Swi.Mode","Motor Swi.Mode","Motor Swi.Mode","Motor Swi.Mode"},
{"Erw. Sig. Pr. ","Enh. Sig.Check","Recep Renforce","Uitg.Sig.Check"},
{"Empfänger Typ ","Receiver Type ","Type Recepteur","Ontvang. Type "},
 
 
// group 1 (main) 16-23
 
{"Höhenregeler ","Ctrl Altitude ","Ctrl Altitude ","Ctrl Hoogte "},
{"GPS ","GPS ","GPS ","GPS "},
{"Kompass ","Compass ","Compas ","Kompas "},
{"KompFest Ausr.","CompOrient.Fix","Maintien Cap ","Kompas vast "},
{"Erw. Sig. Pr. ","Sens.RcvSigVal","Ctrl Ren Recep","ExtRec Signaal"},
{"Achs(e.)koppl.","Axis Couping ","Decouplage Axe","As koppeling "},
{"Drehratenbegr.","RotRate limit.","Limit Vit. Rot","RotRate limit."},
{"Heading Hold ","Nick/Roll ","Orient. Fixe ","Koers vast "},
 
 
// group 2 (stick) 24-27
 
{"Nick/Roll P ","Nick/Roll P ","Roul/Tang P ","Nick/Roll P "},
{"Nick/Roll D ","Nick/Roll D ","Roul/Tang D ","Nick/Roll D "},
{"Gier P ","Gier P ","Lacet P ","Gier P "},
{"Externe Kontr.","Extern Ctrl ","Ctrl Externe ","Extern Control"},
 
 
// group3 : (looping) 28-36
 
{"Looping oben ","Looping up ","Looping Avant ","Looping omhoog"},
{"Looping unten ","Looping down ","Looping Arrier","Looping bened."},
{"Looping links ","Looping left ","Looping Gauche","Looping links "},
{"Looping rechts","Looping right ","Looping Droite","Looping rechts"},
{"Gas Limit ","Throttle Limit","Limite Gaz ","Gas Limiet "},
{"Ansprechschw. ","Resp. Thresh. ","Seuil Reponse ","Drempelwaarde "},
{"Hysterese ","Hysteresis ","Hysteresis ","Hysterese "},
{"Umkehrp. Nick ","Turnover Nick ","Invers Roulis ","Nick geinvert."},
{"Umkehrp. Roll ","Turnover Roll ","Invers Tangage","Roll geinvert."},
 
 
// group 4 (hoehe) 37-50
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Control"},
{"J:HBeg,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario","Y:LimH,N:Vario"},
{"Schalter f. H.","use Sw. f.Setp","Swith Hauteur ","Schak. Hoogte "},
{"akust. Vario ","acoustic Vario","Vario Acoustic","Akoest. Vario "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenste hoogt"},
{"Min. Gas ","min. throttle ","Gaz Min ","Minimaal gas "},
{"Höhe P ","Altitude P ","Altitude P ","Hoogte P "},
{"Luftdruck D ","Barometric D ","Pression D ","Barometr. D "},
{"Z-ACC ","ACC Z ","ACC Z ","ACC Z "},
{"Max. Höhe ","Max. Altitude ","Max. High ","Max. hoogte "},
{"Verstärkung/R ","gain/rate ","Gain/Frequence","Verst./rate "},
{"Schwebegas +/-","hoover varia. ","Var Vol Stat ","hoover varia. "},
{"GPS Z ","GPS Z ","GPS Z ","GPS Z "},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","stick neutr. P"},
 
 
// group 5 : (kamera) 51-68
 
{"Nick S. Anst. ","nick serv ctrl","Asserv Tangage","nick serv ctrl"},
{"Nick Kompens. ","nick compens. ","Comp Tangage ","nick compens. "},
{"Nick Umkehren ","nick inv. dir.","Inverser Roul ","nick inv.rich."},
{"Nick Servo min","nick servo min","Servo Min ","nick servo min"},
{"Nick Servo max","nick servo max","Servo Max ","nick servo max"},
{"Nick Serv Filt","Nick Serv Filt","Nick Serv Filt","Nick Serv Filt"}, //FC0.87
 
{"Roll S. Anst. ","roll serv ctrl","Asserv Roulis ","roll serv ctrl"},
{"Roll Kompens. ","roll compens. ","Comp Tangage ","roll compens. "},
{"Roll Umkehren ","roll inv. dir.","Inverser Tang ","roll omkeren "},
{"Roll Servo min","roll servo min","Servo Min ","roll servo min"},
{"Roll Servo max","roll servo max","Servo Max ","roll servo max"},
{"Roll Serv Filt","Roll Serv Filt","Roll Serv Filt","Roll Serv Filt"}, //FC0.87
 
{"Anst. Geschw. ","servo refresh ","Taux Refresh ","Servo refresh "},
{"Manuelle Gesch","manuell Speed ","Vitesse Man. ","Snelh.handbed."},
{"Cam Richtung ","Cam Orient ","Cam Orient ","Camera richt. "},
{"Servo 3 ","Servo 3 ","Servo 3 ","Servo 3 "},
{"Servo 4 ","Servo 4 ","Servo 4 ","Servo 4 "},
{"Servo 5 ","Servo 5 ","Servo 5 ","Servo 5 "},
// group 6 : (navictrl) 69-88 "CH Hoogte "
 
{"GPS ","enable GPS ","Activer GPS ","enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def Mode GPS ","GPS mode contr"},
{"GPS Verstärk. ","GPS Gain ","Gain GPS ","GPS versterk. "},
{"GPS St. Schw. ","GPS stick thre","Seuil Manche ","GPS st. dremp."},
{"Min. Sat. ","Min. Sat. ","Nbre Min. Sat.","Min. Sat. "},
{"GPS-P ","GPS-P ","GPS-P ","GPS-P "},
{"GPS-I ","GPS-I ","GPS-I ","GPS-I "},
{"GPS-D ","GPS-D ","GPS-D ","GPS-D "},
{"P Limit ","Limit P ","Limite P ","Limiet P "},
{"I Limit ","Limit I ","Limite I ","Limiet I "},
{"D Limit ","Limit D ","Limite D ","Limiet D "},
{"GPS Acc ","GPS Acc ","Accel GPS ","GPS Acc "},
{"GPS Windkorr. ","GPS Wind Corr.","Correct Vent ","GPS Wind Corr."},
{"Bremswirkung ","Speed compens.","Compens Vit ","Remwerking "},
{"GPS max. Rad. ","GPS max.radius","Rayon GPS Max ","GPS max.radius"},
{"GPS Winkel Li.","GPS angl.limit","Limit Angl GPS","GPS hoek lim. "},
{"PH Login time ","PH login time ","Tps Memoris ","PH login tijd "},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamische PH "},
{"GPS m. Rad dPH","GPS m. Rad dPH","GPS m. Rad dPH","GPS m. Rad dPH"}, //FC0.87
{"CH Höhe ","CH Altitude ","CH Altitude ","CH Hoogte "},
 
 
// group 7 : (ausgaenge) 89-98
 
{"LED1 Bitmaske ","Out1 Bitmask ","Bitmask S1 ","Uitg1 Bitpatr."},
{" Timing ","Out1 Timing ","Horloge S1 ","Uitg1 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"LED2 Bitmaske ","Out2 Bitmask ","Bitmask S2 ","Uitg2 Bitpatr."},
{" Timing ","Out2 Timing ","Horloge S2 ","Uitg2 Timing "},
{" sofort an","Activ ","Actif ","Direct aan "},
{" n.m.Motor","Act. wi. Motor","Actif Au Repos","Akt. motor uit"},
{"Out1 Vmin.Warn","Out1 undervolt","Al Undervoltag","Uitg1 ondersp."},
{"Out2 Vmin.Warn","Out2 undervolt","Al Undervoltag","Uitg2 ondersp."},
 
 
// group 8 : (verschiedenes) 99-113
 
{"Min. Gas ","min. throttle ","Gaz Min. ","minimaal gas "},
{"Max. Gas ","max. throttle ","Gaz Max. ","maximaal gas "},
{"Kompasswirkung","compass effect","Effet compas ","Kompas effect "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Unterspannung ","undervoltage ","Sous Tension ","Onderspanning "},
{"Volt Referenz ","Volt Referenz ","Tension Ref ","Ref. spanning "},
{"Not Gas Zeit ","Emerg.Thr.Time","Duree secours ","Nood gas tijd "},
{"Not Gas ","Emerg.Throttle","Gaz de secours","Nood gas "},
{"Fails. CH Time","Fails. CH Time","Fails. CH Time","Fails. CH Tijd"},
{"Fails. Channel","Fails. Channel","Fails. Channel","Fails. Channel"}, //FC 0.87
{"k.Summer o Sen","n beep act TX ","n beep act TX ","n beep act TX "}, // Pos Change FC0.87
{"Vario fail Alt","Vario fail Alt","Vario fail Alt","Vario fail Alt"}, //FC 0.87
{"Compass Error ","Compass Error ","Compass Error ","Kompas Error "},
{"k.Start o.SD-K","n st. wtho SD ","n st. wtho SD ","n st. wtho SD "}, //FC 0.87
{"k.Start o.GPS ","n st. wtho GPS","n st. wtho GPD","n st. wtho GPS"}, //FC 0.88L
 
// group 9 : (gyro) 114-126
 
{"Gyro P ","Gyro P ","Gyro P ","Gyro P "},
{"Gyro I ","Gyro I ","Gyro I ","Gyro I "},
{"Gyro D ","Gyro D ","Gyro D ","Gyro D "},
{"Gier P ","Lacet P ","Lacet P ","Gier P "},
{"Gier I ","Lacet I ","Lacet I ","Gier I "},
{"Dynamische St.","dynamic stabi.","Stab Dynamique","Dynamis. stab."},
{"Drehratenbeg. ","RotRate limit.","Limit Dit Rota","Toerental lim."},
{"ACC/Gyro Fak. ","ACC/Gyro Fact ","ACC/Gyro Fact ","ACC/Gyro Fact "},
{"ACC/Gyro Komp.","Comp ACC/Gyro ","Comp ACC/Gyro ","Comp ACC/Gyro "},
{"Hauptregler I ","Main I ","Regul Princ I ","Hoofdregel. I "},
{"Drifkompensat.","drift Compens.","Compens Deriv ","Drift compens."},
{"Gyro stab. ","Gyro stability","Gyro Stability","Gyro stabilit."},
{"Motor smooth ","Motor smooth ","Motor Smooth ","Motor smooth "},
 
 
// group 10: (benutzer) 127-134
 
{"Parameter 1 ","Parameter 1 ","Parameter 1 ","Parameter 1 "},
{"Parameter 2 ","Parameter 2 ","Parameter 2 ","Parameter 2 "},
{"Parameter 3 ","Parameter 3 ","Parameter 3 ","Parameter 3 "},
{"Parameter 4 ","Parameter 4 ","Parameter 4 ","Parameter 4 "},
{"Parameter 5 ","Parameter 5 ","Parameter 5 ","Parameter 5 "},
{"Parameter 6 ","Parameter 6 ","Parameter 6 ","Parameter 6 "},
{"Parameter 7 ","Parameter 7 ","Parameter 7 ","Parameter 7 "},
{"Parameter 8 ","Parameter 8 ","Parameter 8 ","Parameter 8 "},
 
 
// group 11: (achskopplung) 135-138
 
{"Achs(e.)koppl.","(De)Coupl Axes","(De)Coupl Axes","As koppeling "},
{"Gier pos. Kopp","Retroac lacet ","Retroac Lacet ","Gier pos. kop."},
{"Nick/Roll Kopp","Retro roul/tan","Retro Roul/Tan","Nick/Roll kop."},
{"Gier Korrektur","Correct lacet ","Correct Lacet ","Gier correctie"},
 
 
// group 12: (mixer) 139
 
{"Orientierung ","Orientierung ","Orientation "},
 
 
// group 13 (easy) 140-150
 
{"Höhenregelung ","Altitude Ctrl ","Ctrl Altitude ","Hoogte Contr. "},
{"Sollhöhe ","Setpoint ","Hauteur Max ","Gewenst.hoogte"},
{"Stick Neutr. P","stick neutr. P","Pos Neutre Man","Stick neutr. P"},
{"GPS ","enable GPS ","Activer GPS ","Enable GPS "},
{"GPS Modus St. ","GPS mode contr","Def mode GPS ","GPS mode contr"},
{"Dynamic PH ","Dynamic PH ","Dynamic PH ","Dynamic PH "},
{"CH Höhe ","CH High ","CH High ","CH hoogte "},
{"Carefree St. ","Carefree Ctrl ","Carefree Ctrl ","Carefree Ctrl "},
{"Teachable Care","Teachable Care","Teachable Care","Teachable Care"},
{"Motor Sich.Sch","Mot.Safety Sw.","Mot.Safety Sw.","Mot.saf.schak."},
{"Orientierung ","Orientation ","Orientierung ","Orientatie "},
 
};
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/servo.c
0,0 → 1,153
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
 
#include "lcd.h"
#include "timer.h"
#include "servo.h"
#include "messages.h"
 
#define SERVO_CORRECT 3.125
 
 
//--------------------------------------------------------------
//
void servo_test (void)
{
#ifdef HWVERSION3_9
uint8_t chg = 0;
uint8_t Pos = 150; // 1,5mS
 
OCR1A = 150 * SERVO_CORRECT; // Servomitte
 
lcd_cls ();
 
lcd_printp (PSTR(" Servo Tester "), 2);
lcd_printp_at (7, 5, PSTR("%"), 0);
lcd_printp_at (16, 5, PSTR("mS"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_3), 0);
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_printp_at (18, 7, PSTR("\x19O\x18"), 0);
 
lcd_rect(3, 23, 120, 8, 1); // +-150% Rahmen
lcd_line(23,23,23,31,1); // -100%
lcd_line(43,23,43,31,1); // -50%
lcd_frect(61, 23, 3, 8, 1); // 0%
lcd_line(83,23,83,31,1); // +50%
lcd_line(103,23,103,31,1); // +100%
 
write_ndigit_number_u (4, 5, 0, 3, 0,0); // Pulse width in %
write_ndigit_number_u_100th(12, 5, 150, 3, 0); // Pulse width in ms
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Pos < 225))
{
if (Pos < 150)
lcd_frect ((63 - ((150 - Pos) * 0.8)), 24, 1, 6, 0);
 
Pos++;
if (Pos == 75 || Pos == 100 || Pos == 125 || Pos == 150 || Pos == 175 || Pos == 200 || Pos == 225)
{
set_beep ( 200, 0x0080, BeepNormal);
}
 
if (Pos >= 225)
Pos = 225;
 
chg++;
}
else if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Pos > 75))
{
if (Pos > 150)
lcd_frect ((((Pos - 150) * 0.8) + 63), 24, ((Pos - 150) * 0.8), 6, 0);
 
Pos--;
if (Pos == 75 || Pos == 100 || Pos == 125 || Pos == 150 || Pos == 175 || Pos == 200 || Pos == 225)
{
set_beep ( 200, 0x0080, BeepNormal);
}
 
if (Pos <= 75)
Pos = 75;
 
chg++;
}
else if (get_key_press (1 << KEY_ENTER))
{
lcd_frect (4, 24, 118, 6, 0); // Balken löschen
lcd_frect(61, 23, 3, 8, 1); // 0%
Pos = 150;
set_beep ( 200, 0x0080, BeepNormal);
chg++;
}
 
if (chg)
{
chg = 0;
 
if (Pos >= 150)
{
lcd_frect (63, 24, ((Pos - 150) * 0.8), 6, 1);
write_ndigit_number_u (4, 5, ((Pos - 150) * 2), 3, 0,0); // Pulse width in %
lcd_frect(62, 23, 2, 8, 1); // 0%
}
else
{
lcd_frect (63 - ((150 - Pos) * 0.8), 24, ((150 - Pos) * 0.8), 6, 1);
write_ndigit_number_u (4, 5, ((150 - Pos) * 2), 3, 0,0); // Pulse width in %
lcd_frect(61, 23, 2, 8, 1); // 0%
}
write_ndigit_number_u_100th(12, 5, Pos, 3, 0); // Pulse width in ms
 
lcd_line(3, 23,3, 31,1); // -150%
lcd_line(23, 23,23, 31,1); // -100%
lcd_line(43, 23,43, 31,1); // -50%
lcd_line(83, 23,83, 31,1); // +50%
lcd_line(103,23,103,31,1); // +100%
lcd_line(123,23,123,31,1); // +150%
 
 
OCR1A = Pos * SERVO_CORRECT; // Servostellung
 
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
#endif
}
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/servo.h
0,0 → 1,40
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _SERVO_H
#define _SERVO_H
 
void servo_test (void);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/setup.c
0,0 → 1,2939
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>
#include "main.h"
#include "setup.h"
#include "lcd.h"
#include "eeprom.h"
#include "timer.h"
#include "menu.h"
#include "Wi232.h"
#include "bluetooth.h"
#include "connect.h"
#include "lipo.h"
#include "messages.h"
#include "eeprom.h"
#include "tracking.h"
#include "bluetooth.h"
#include "uart1.h"
 
 
 
uint8_t spalte;
uint8_t mmode;
uint8_t edit;
uint8_t LCD_Orientation;
uint8_t edit = 0;
uint8_t LCD_Change = 0;
uint8_t PKT_Change = 0;
uint16_t Pre;
uint16_t Pre16;
char EditString[21];
uint8_t bt_name_len;
uint8_t length_tmp;
 
//--------------------------------------------------------------
#define ITEMS_PKT 12
 
prog_char param_menuitems_pkt[ITEMS_PKT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Verbindung zum MK","connection to MK "," connexion a MK " ,"Aansluiting op MK"},
{"Anzeige \x1d","Display \x1d","d'affichage \x1d","Display \x1d"},
{"Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d"},
{"BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d"},
{"Antennen Track. \x1d","antenna tracking\x1d","antenna tracking\x1d","antenna tracking\x1d"},
{"OSD Anzeige \x1d","OSD screen \x1d","OSD screen \x1d","OSD screen \x1d"},
{"GPS \x1d","GPS \x1d","GPS \x1d","GPS \x1d"},
{"Follow Me \x1d","Follow Me \x1d","Follow Me \x1d","Follow Me \x1d"},
{"PKT-Akku \x1d","PKT-Accu \x1d","PKT-Accu \x1d","PKT-Accu \x1d"},
{"PKT Update ","PKT Update ","PKT Mise a jour ","PKT Update "},
{"Debug PKT ","Debug PKT ","Debug PKT ","Debug PKT "},
{"EEProm Reset ","EEProm Reset ","EEProm Reinitiali","EEProm Reset "},
};
 
#define ITEMS_LCD 8
 
prog_char param_menuitems_lcd[ITEMS_LCD][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Infos beim Start ","info at startup ","Infor. sur lancer","info bij opstart "},
{"OSD Empfangsausf.","OSD receive Error","OSD receive Error","OSD receive Error"},
{"Sprache ","language ","Langue ","taal "},
{"Licht aus nach...","light off after ","Lumiere au bout ","licht uit na "},
{"Helligkeit ","brightness ","luminosite ","helderheid "},
{"Kontrast ","contrast ","contraste ","contrast "},
{"Normal/Invers ","normal/inverted ","Normal / inverse ","Normal/inverted "},
{"Orientierung ","orientation ","orientation ","orientatie "},
 
};
 
#define ITEMS_WI 9
 
prog_char param_menuitems_wi[ITEMS_WI][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Modul eingebaut? ","module built in? ","Module installe ","Module geinstal.?"},
{"TX/RX Kanal ","TX/RX Channel ","TX/RX Channel ","TX/RX Channel "},
{"NetW. Gruppe ","NetW. Group ","NetW. Group ","NetW. Group "},
{"NetW. Mode ","NetW. Mode ","NetW. Mode ","NetW. Mode "},
{"TX Timeout ","TX Timeout ","TX Timeout ","TX Timeout "},
{"TX MTU ","TX MTU ","TX MTU ","TX MTU "},
{"Baudrate Wi232/BT","Baudrate Wi232/BT","Baudrate Wi232/BT","Baudrate Wi232/BT"},
{"Initialisieren ","initialize ","initialiser ","Initialize "},
{"Konfig. mit PC ","config. with PC ","Config. avec PC ","Config. met PC "},
};
 
 
#define ITEMS_BT 5
 
prog_char param_menuitems_bt[ITEMS_BT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"Modul eingebaut? ","module built in? ","Module installe ","module geinstall?"},
{"Name ","name ","Nom ","Naam "},
{"Pin ","pin ","Pin ","Pin "},
{"Initialisieren ","initialize ","initialiser ","Initialize "},
{"Konfig. mit PC ","config. with PC ","Config. avec PC ","Config. met PC "},
};
 
#define ITEMS_Accu 2
 
prog_char param_menuitems_Accu[ITEMS_Accu][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"PKT-Akkutyp ","PKT-Accutyp ","PKT-Type de batt.","PKT-batterij type"},
{"PKT Akku Messung ","PKT AccuMeasure ","batt. de mesure ","PKT batt. meting "},
};
 
#define ITEMS_GPS 6
 
prog_char param_menuitems_GPS[ITEMS_GPS][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"wähle GPS Maus ","select GPS mouse ","select GPS mouse ","select GPS mouse "},
{"Suche GPS Maus ","search GPS mouse ","search GPS mouse ","search GPS mouse "},
{"GPS Maus Typ ","GPS mouse typ ","GPS mouse typ ","GPS mouse typ "},
{"GPS Maus aktiv? ","GPS mouse activ? ","GPS mouse activ? ","GPS mouse activ? "},
{"Zeige GPS Device ","show GPS device ","show GPS device ","show GPS device "},
{"GPS Daten ","GPS data ","GPS data ","GPS data "},
 
};
 
#define ITEMS_FOLLOWME 3
 
prog_char param_menuitems_FOLLOWME[ITEMS_GPS][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"FollowMe Refresh","FollowMe Refresh","FollowMe Refresh","FollowMe Refresh"},
{"FollowMe Speed ","FollowMe Speed ","FollowMe Speed ","FollowMe Speed "},
{"Toleranz Radius ","Tolerance Radius","Tolerance Radius","Tolerance Radius"},
 
 
};
 
 
 
#define ITEMS_OSD 10
 
prog_char param_menuitems_OSD[ITEMS_OSD][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Dutch
{
{"OSD Anzeige Var. ","OSD screenmode ","OSD screenmode ","OSD screenmode "},
{"OUT1/2 Format ","OUT1/2 format ","OUT1/2 format ","OUT1/2 format "},
{"OUT1/2 Polarität ","OUT1/2 polarity ","OUT1/2 polarity ","OUT1/2 polarity "},
{"Navi Daten an SV2","Navi data to SV2 ","Navi data to SV2 ","Navi data to SV2 "},
{"Max. Sinkrate m/s","max fallspeed m/s","max fallspeed m/s","max fallspeed m/s"},
{"Variometer Beep ","Variometer beep ","Variometer beep ","Variometer beep "},
{"Home aus MK Sicht","home from MK view","home from MK view","home from MK view"},
{"MK LowBat Warnung","MK LowBat warning","MK LowBat Attent ","MK LoBat alarm "},
{"MK mAh Warnung","MK mAh warning ","MK mAh Attent ","MK mAh alarm "},
{"MK Volt Balken","MK volt bargraph ","MK volt bargraph ","MK volt bargraph "},
};
 
//--------------------------------------------------------------
void Show_Error_HW12(void)
{
lcd_cls();
lcd_printp_at (0,3,PSTR(" Mit Hardware 1.x "), 2);
lcd_printp_at (0,4,PSTR(" nicht möglich "), 2);
_delay_ms(1000);
 
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Int10th_Value(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u_10th (16, 2,Value, 3, 0,0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
{
edit = 1;
Value++;
write_ndigit_number_u_10th (16, 2,Value, 3, 0,0);
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
{
edit = 1;
Value--;
write_ndigit_number_u_10th (16, 2,Value, 3, 0,0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Int_Value(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
Pre = Value;
write_ndigit_number_u (16, 2, Value, 3, 0,0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max))
{
edit = 1;
Value++;
write_ndigit_number_u (16, 2,Value, 3, 0,0);
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
edit = 1;
Value--;
write_ndigit_number_u (16, 2,Value, 3, 0,0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
//--------------------------------------------------------------
uint16_t Edit_Int16_Value(uint16_t Value, uint16_t min, uint16_t max,uint8_t Text)
{
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
Pre = Value;
write_ndigit_number_u (16, 2, Value, 5, 0,0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
{
edit = 1;
Value++;
write_ndigit_number_u (16, 2,Value, 5, 0,0);
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
{
edit = 1;
Value--;
write_ndigit_number_u (16, 2,Value, 5, 0,0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
#if defined HWVERSION3_9
//--------------------------------------------------------------
uint8_t ChangeWi_SV2(uint8_t Value)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 1, PSTR("Verbinde das PKT mit"), 0);
// lcd_printp_at (0, 2, PSTR("dem MK über:"), 0);
lcd_puts_at(0, 1, strGet(CONNECT1), 0);
lcd_puts_at(0, 2, strGet(CONNECT2), 0);
 
if(UseWi == false)
{
// lcd_printp_at (0, 0, PSTR("Verbinde das PKT mit "), 0);
// lcd_printp_at (0, 1, PSTR("dem MK über: Kabel, "), 0);
// lcd_printp_at (0, 2, PSTR("da kein Wi.232 Modul "), 0);
// lcd_printp_at (0, 3, PSTR("eingebaut ist. "), 0);
// lcd_printp_at (0, 4, PSTR("Wenn doch, dann bitte"), 0);
// lcd_printp_at (0, 5, PSTR("das Modul zuerst im "), 0);
// lcd_printp_at (0, 6, PSTR("Setupmenü aktivieren."), 0);
lcd_puts_at(0, 1, strGet(CONNECT1), 0);
lcd_puts_at(0, 2, strGet(CONNECT4), 0);
lcd_puts_at(0, 1, strGet(CONNECT5), 0);
lcd_puts_at(0, 2, strGet(CONNECT6), 0);
lcd_puts_at(0, 1, strGet(CONNECT7), 0);
lcd_puts_at(0, 2, strGet(CONNECT8), 0);
lcd_puts_at(0, 1, strGet(CONNECT9), 0);
 
 
// lcd_printp_at (12, 7, PSTR("Ende"), 0);
lcd_puts_at(12, 7, strGet(ENDE), 0);
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
else
{
switch (Value)
{
case 0x0 :lcd_printp_at (14, 2, PSTR("Wi232"), 0);
break;
case 0x1 : lcd_puts_at(14, 2, strGet(KABEL), 0);
 
//lcd_printp_at (14, 2, PSTR("Kabel"), 0);
 
break;
break;
}
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if(UseWi == true)
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
edit = 1;
Value = 1;
// lcd_printp_at (14, 2, PSTR("Kabel"), 0);
lcd_puts_at(14, 2, strGet(KABEL), 0);
Change_Output(Uart02FC);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
edit = 1;
Value = 0;
lcd_printp_at (14, 2, PSTR("Wi232"), 0);
Change_Output(Uart02Wi);
}
 
if (get_key_press (1 << KEY_ENTER))
{
// lcd_printp_at (0, 4, PSTR("Sie müssen das PKT"), 0);
// lcd_printp_at (0, 5, PSTR("jetzt neu starten!"), 0);
lcd_puts_at(0, 4, strGet(CONNECT10), 0);
lcd_puts_at(0, 5, strGet(CONNECT11), 0);
lcd_cls_line (0, 7, 18);
while (!get_key_press (1 << KEY_ENTER));
return Value;
}
}
}
while (!get_key_press (1 << KEY_ESC));
}
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
#endif
 
#if defined HWVERSION3_9 || defined HWVERSION1_3W
 
//--------------------------------------------------------------
uint8_t Edit_Wi_NetMode_Value(uint8_t Value)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, PSTR("Wi NetW. Mode:"), 0);
lcd_puts_at(0, 2, strGet(WINETWM), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(15, 2, strGet(SLAVE), 0);//lcd_printp_at (15, 2, PSTR("Slave "), 0);
break;
case 0x1 :lcd_puts_at(15, 2, strGet(NORMAL), 0);//lcd_printp_at (15, 2, PSTR("Normal"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
edit = 1;
Value = NetMode_Normal;
// lcd_printp_at (15, 2, PSTR("Normal"), 0);
lcd_puts_at(15, 2, strGet(NORMAL), 0);
 
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
edit = 1;
Value = NetMode_Slave;
// lcd_printp_at (15, 2, PSTR("Slave "), 0);
lcd_puts_at(15, 2, strGet(SLAVE), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
#endif
 
//--------------------------------------------------------------
uint8_t Edit_OnOff(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
 
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2,Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case false :lcd_puts_at(17, 2, strGet(OFF), 0);//lcd_printp_at (17, 2, PSTR("Aus"), 0);
break;
case true :lcd_puts_at(17, 2, strGet(ON), 0);//cd_printp_at (17, 2, PSTR("Ein"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
edit =1;
// lcd_printp_at (17, 2, PSTR("Ein"), 0);
lcd_puts_at(17, 2, strGet(ON), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
edit =1;
// lcd_printp_at (17, 2, PSTR("Aus"), 0);
lcd_puts_at(17, 2, strGet(OFF), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
// edit = 1;
//
// PKT_StartInfo = Value;
// WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
// PKT_StartInfo = Pre;
return Pre;
}
 
}
 
//--------------------------------------------------------------
uint8_t Edit_YesNo(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
 
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2,Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case false :lcd_puts_at(17, 2, strGet(NOO), 0);//lcd_printp_at (17, 2, PSTR("Aus"), 0);
break;
case true :lcd_puts_at(17, 2, strGet(YES), 0);//cd_printp_at (17, 2, PSTR("Ein"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
edit = 1;
// lcd_printp_at (17, 2, PSTR("Ein"), 0);
lcd_puts_at(17, 2, strGet(YES), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
edit = 1;
// lcd_printp_at (17, 2, PSTR("Aus"), 0);
lcd_puts_at(17, 2, strGet(NOO), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
// edit = 1;
 
// PKT_StartInfo = Value;
// WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
// PKT_StartInfo = Pre;
return Pre;
}
 
}
 
//--------------------------------------------------------------
//uint8_t Edit_Baudrate(uint8_t Value, uint8_t min, uint8_t max,const char *Text)
uint8_t Edit_Baudrate(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
lcd_puts_at(0, 2,strGet(Text), 0);
switch (Value)
{
case 0x0 : lcd_printp_at(15, 2, PSTR("2400 "), 0);
break;
case 0x1 : lcd_printp_at(15, 2, PSTR("9600 "), 0);
break;
case 0x2 : lcd_printp_at(15, 2, PSTR("19200 "), 0);
break;
case 0x3 : lcd_printp_at(15, 2, PSTR("38400 "), 0);
break;
case 0x4 : lcd_printp_at(15, 2, PSTR("57600 "), 0);
break;
case 0x5 : lcd_printp_at(15, 2, PSTR("115200"), 0);
break;
break;
}
 
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value < max))
{
edit = 1;
Value++;
//baudrate = Value;
switch (Value)
{
case 0x0 : lcd_printp_at(15, 2, PSTR("2400 "), 0);
break;
case 0x1 : lcd_printp_at(15, 2, PSTR("9600 "), 0);
break;
case 0x2 : lcd_printp_at(15, 2, PSTR("19200 "), 0);
break;
case 0x3 : lcd_printp_at(15, 2, PSTR("38400 "), 0);
break;
case 0x4 : lcd_printp_at(15, 2, PSTR("57600 "), 0);
break;
case 0x5 : lcd_printp_at(15, 2, PSTR("115200"), 0);
break;
break;
}
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value > min))
{
edit = 1;
Value--;
//Baudrate = Value;
switch (Value)
{
case 0x0 : lcd_printp_at(15, 2, PSTR("2400 "), 0);
break;
case 0x1 : lcd_printp_at(15, 2, PSTR("9600 "), 0);
break;
case 0x2 : lcd_printp_at(15, 2, PSTR("19200 "), 0);
break;
case 0x3 : lcd_printp_at(15, 2, PSTR("38400 "), 0);
break;
case 0x4 : lcd_printp_at(15, 2, PSTR("57600 "), 0);
break;
case 0x5 : lcd_printp_at(15, 2, PSTR("115200"), 0);
break;
break;
}
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
//--------------------------------------------------------------
//uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,const char *Text)
uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2,strGet(Text), 0);
switch (Value)
{
case
0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value < max))
{
edit = 1;
Value++;
//DisplayLanguage = Value;
switch (Value)
{
case 0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value > min))
{
edit = 1;
Value--;
//DisplayLanguage = Value;
switch (Value)
{
case 0x0 : lcd_puts_at(10, 2, strGet(DEUTSCH), 0);//lcd_printp_at (14, 2, PSTR("Deutsch"), 0);
break;
case 0x1 : lcd_puts_at(10, 2, strGet(ENGLISCH), 0);//lcd_printp_at (14, 2, PSTR("English"), 0);
break;
case 0x2 : lcd_puts_at(10, 2, strGet(FRANCE), 0);//lcd_printp_at (14, 2, PSTR("France "), 0);
break;
case 0x3 : lcd_puts_at(10, 2, strGet(NETHERL), 0);//lcd_printp_at (14, 2, PSTR("Netherl"), 0);
break;
break;
}
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
 
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_Orientation(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(14, 2, strGet(NORMAL), 0);//lcd_printp_at (14, 2, PSTR("Normal "), 0);
break;
case 0x4 :lcd_puts_at(14, 2, strGet(REVERSE), 0);//lcd_printp_at (14, 2, PSTR("Reverse"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value=4;
// lcd_printp_at (14, 2, PSTR("Reverse"), 0);
lcd_puts_at(14, 2, strGet(REVERSE), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 4))
{
Value = 0;
// lcd_printp_at (14, 2, PSTR("Normal "), 0);
lcd_puts_at(14, 2, strGet(NORMAL), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
cli();
clr_A0 ();
 
if (Value == 0)
{
send_byte (0xA1); // normal
send_byte (0xC0); // normal
}
else
{
send_byte (0xA0); // reverse
send_byte (0xC8); // reverse
}
set_A0 ();
sei();
LCD_Orientation = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayMode(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
//lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case 0x0 :lcd_puts_at(14, 2, strGet(NORMAL), 0);//lcd_printp_at (14, 2, PSTR("Normal "), 0);
break;
case 0x4 :lcd_puts_at(14, 2, strGet(REVERSE), 0);//lcd_printp_at (14, 2, PSTR("Reverse"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value=4;
// lcd_printp_at (14, 2, PSTR("Inverse"), 0);
lcd_puts_at(14, 2, strGet(REVERSE), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 4))
{
Value=0;
// lcd_printp_at (14, 2, PSTR("Normal "), 0);
lcd_puts_at(14, 2, strGet(NORMAL), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
cli();
clr_A0 ();
 
if (Value == 0)
send_byte (0xA6); // normal
else
send_byte (0xA7); // inverse
 
set_A0 ();
sei();
LCD_DisplayMode = Value;
WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
LCD_DisplayMode = Pre;
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayKontrast(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u (16, 2, Value, 3, 0,0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
write_ndigit_number_u (16, 2,Value, 3, 0,0);
lcd_frect ((8*0), (8*4), (Value * (16*8) / 64), 6, 1);
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max))
{
Value++;
 
if (Value >= max)
{
Value = max;
set_beep ( 200, 0x0080, BeepNormal);
}
else
{
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Value); // Daten zum LCD senden
set_A0 ();
sei();
}
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
lcd_frect (((Value - 1) * (16*8) / 64), (8*4), (16*8), 6, 0);
Value--;
 
if (Value == min)
{
Value = min;
set_beep ( 200, 0x0080, BeepNormal);
}
else
{
// edit = 1;
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Value); // Daten zum LCD senden
set_A0 ();
sei();
}
}
write_ndigit_number_u (16, 2,Value, 3, 0,0);
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
LCD_Kontrast = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
cli();
clr_A0 ();
send_byte (0x81);
send_byte (Pre); // Daten zum LCD senden
set_A0 ();
sei();
edit = 0;
LCD_Kontrast = Pre;
WriteParameter();
return Pre;
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_DisplayHelligkeit(uint8_t Value, uint8_t min, uint8_t max, uint8_t Text)
{
float ValCorr = 2.55; // (Value * ValCorr) maximal 255
Pre = Value;
OCR2A = Value * ValCorr;
 
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(Text), 0);
write_ndigit_number_u (16, 2, Value, 3, 0,0);
lcd_printp_at (17, 2, PSTR("%"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
write_ndigit_number_u (16, 2,Value, 3, 0,0);
lcd_frect ((8*0), (8*4), (Value * (16*8) / 100), 6, 1);
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
{
Value++;
 
if (Value >= max)
{
Value = max;
set_beep ( 200, 0x0080, BeepNormal);
}
else
OCR2A = Value * ValCorr;
 
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
{
lcd_frect (((Value - 1) * (16*8) / 100), (8*4), (16*8), 6, 0);
Value--;
 
if (Value == min)
{
Value = min;
set_beep ( 200, 0x0080, BeepNormal);
}
else
OCR2A = Value * ValCorr;
 
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
OCR2A = Value * ValCorr;
LCD_Helligkeit = Value;
WriteParameter();
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
OCR2A = Pre * ValCorr;
LCD_Helligkeit = Pre;
WriteParameter();
return Pre;
}
}
 
 
//--------------------------------------------------------------
void Reset_EEprom(void)
{
lcd_cls();
get_key_press(KEY_ALL);
// lcd_printp_at (0, 2, PSTR(" EEProm wirklich"), 0);
// lcd_printp_at (0, 3, PSTR(" löschen?"), 0);
// lcd_printp_at (12, 7, PSTR("Ende OK"), 0);
lcd_puts_at(0, 2, strGet(EEPROM1), 0);
lcd_puts_at(0, 3, strGet(EEPROM2), 0);
lcd_puts_at(12, 7, strGet(ENDOK), 0);
 
 
do
{
 
if (get_key_press (1 << KEY_ENTER))
{
Delete_EEPROM();
return;
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
}
 
 
//--------------------------------------------------------------
void PKT_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_PKT;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
lcd_cls ();
mmode = 0;
edit= 0;
val = 0;
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" PKT-Setup "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0;ii < 6 ; ii++)
{
if((ii+Offset) < size)
lcd_printp_at(3,ii+1,param_menuitems_pkt[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+Offset < (size-1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset+7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
return;
}
return;
}
else
break;
}
target_pos = val;
 
//
// {"Verbindung zum MK","connection to MK "," connexion a MK " ,"Aansluiting op MK"},
// {"MK LowBat Warnung","MK LowBat warning","MK LowBat Attent", "MK LoBat alarm "},
// {"Anzeige \x1d","Display \x1d","d'affichage \x1d","Display \x1d"},
// {"Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d","Wi.232 \x1d"},
// {"BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d","BTM-222 \x1d"},
// {"Antennen Track. \x1d","antenna tracking\x1d","antenna tracking\x1d","antenna tracking\x1d"},
// {"OSD \x1d","OSD \x1d","OSD \x1d","OSD \x1d"},
// {"GPS \x1d","GPS \x1d","GPS \x1d","GPS \x1d"},
// "Follow Me \x1d"
// {"PKT-Akku \x1d","PKT-Accu \x1d","PKT-Accu \x1d","PKT-Accu \x1d"},
// {"PKT Update ","PKT Update ","PKT Mise a jour ","PKT Update "},
// {"Debug PKT ","Debug PKT ","Debug PKT ","Debug PKT "},
// {"EEProm Reset ","EEProm Reset ","EEProm Reinitiali","EEProm Reset "},
 
 
 
if((val + Offset) == 1)
{
#ifdef HWVERSION3_9
U02SV2 = ChangeWi_SV2(U02SV2);
 
if (edit == 1)
PKT_Change = 1;
 
#else
Show_Error_HW12();
#endif
}
 
 
if((val + Offset) == 2)
Display_Setup();
 
if((val + Offset) == 3)
{
#if defined HWVERSION3_9 || defined HWVERSION1_2W || defined HWVERSION1_3W
if(UseWi == false)
// Wi_Use();
{
UseWi = Edit_YesNo(UseWi,0,1,WI2321);
if (edit==1)
if (UseWi== true) InitWi232(PKT_Baudrate);
}
 
else
Wi_Setup();
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 4)
{
#ifdef HWVERSION3_9
if(UseBT == 0)
{
UseBT = Edit_YesNo(UseBT,0,1,BT1);
if (edit==1)
if (UseBT == 1)
{
if (bt_init()) BTIsSet = true; else BTIsSet = false;
WriteParameter();
}
}
else
BT_Setup();
#else
Show_Error_HW12();
#endif
}
 
if((val + Offset) == 5)
{
 
}
if((val + Offset) == 6)
{
OSD_Setup();
}
#ifdef HWVERSION3_9
if((val + Offset) == 7)
GPS_Setup();
 
if((val + Offset) == 8)
FollowMe_Setup();
 
 
 
if((val + Offset) == 9)
 
Accu_Setup();
#else
Show_Error_HW12();
#endif
if((val + Offset) == 10)
Update_PKT();
 
if((val + Offset) == 11)
Debug = Edit_Int_Value(Debug,0,1,DEBUGPKT);
 
if((val + Offset) == 12)
Reset_EEprom();
 
}
}
 
 
//--------------------------------------------------------------
void Display_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_LCD;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
lcd_cls ();
mmode = 0;
edit= 0;
LCD_Change = 0;
val = 0;
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" Display Setup "), 2);
lcd_puts_at(0, 0, strGet(DISPLAY1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1, 1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6 ; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_lcd[ii + Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii+Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos,1,0);
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
return;
}
return;
}
else
break;
}
target_pos = val;
 
if((val + Offset) == 1)
PKT_StartInfo = Edit_OnOff(PKT_StartInfo,0,2,DISPLAY2);
if((val + Offset) == 2)
OSD_RCErrorbeep = Edit_OnOff(OSD_RCErrorbeep,0,2,DISPLAY9);
 
if((val + Offset) == 3)
DisplayLanguage = Edit_Language(DisplayLanguage,0,3,DISPLAY3);
// Edit_Language(DisplayLanguage,0,3,DISPLAY3);
 
if((val + Offset) == 4)
DisplayTimeout = Edit_Int_Value(DisplayTimeout,0,254,DISPLAY4);
 
if((val + Offset) == 5)
LCD_Helligkeit = Edit_DisplayHelligkeit(LCD_Helligkeit,0,100,DISPLAY5);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
 
if((val + Offset) == 6)
LCD_Kontrast = Edit_DisplayKontrast(LCD_Kontrast,0,63,DISPLAY6);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
 
if((val + Offset) == 7)
{
LCD_DisplayMode = Edit_DisplayMode(LCD_DisplayMode,0,4,DISPLAY7);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
}
 
if((val + Offset) == 8)
{
LCD_Orientation = Edit_Orientation(LCD_Orientation,0,4,DISPLAY8);
if (edit == 1)
if(!LCD_Change)
LCD_Change =1;
}
 
 
 
 
}
}
 
#if defined HWVERSION3_9 || defined HWVERSION1_3W
////--------------------------------------------------------------
//void Wi_Use (void)
//{
// Pre = UseWi;
//
// lcd_cls ();
//
// lcd_cls ();
//// lcd_printp_at (0, 0, PSTR(" Wi.232 Setup "), 2);
//// lcd_printp_at (0, 2, PSTR("Ist ein Wi.232-Modul "), 0);
//// lcd_printp_at (0, 4, PSTR("eingebaut?"), 0);
// lcd_puts_at(0, 0, strGet(WI2321), 2);
// lcd_puts_at(0, 2, strGet(WI2322), 0);
// lcd_puts_at(0, 4, strGet(WI2323), 0);
//// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
//
// while(1)
// {
// if(UseWi == false)
//// lcd_printp_at (12, 4, PSTR("Nein"), 0);
// lcd_puts_at(12, 4, strGet(NOO), 0);
// else
// //lcd_printp_at (12, 4, PSTR("Ja "), 0);
// lcd_puts_at(12, 4, strGet(YES), 0);
//
// if(get_key_press (1 << KEY_MINUS))
// {
// UseWi = false;
// edit = 1;
// }
//
// if(get_key_press (1 << KEY_PLUS))
// {
// UseWi = true;
// edit = 1;
// }
//
// if(get_key_short (1 << KEY_ENTER))
// {
//// WiIsSet = false;
//// WriteParameter();
//// if(UseWi == true)
//// Wi_Setup();
// return;
// }
//
// if (get_key_press (1 << KEY_ESC))
// {
// get_key_press(KEY_ALL);
// UseWi = Pre;
// return;
// }
// }
//}
 
 
//--------------------------------------------------------------
void Wi_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_WI;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val = 0;
 
mmode = 0;
edit = 0;
// WiIsSet = true;
 
lcd_cls ();
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" Wi.232 Setup "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1, 1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii+1, param_menuitems_wi[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5)&&(ii + Offset < (size - 1)))
lcd_printp_at(1, 6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
if (UseWi==true) InitWi232(PKT_Baudrate);
WriteParameter();
}
 
return;
}
else
 
break;
}
target_pos = val;
 
if((val + Offset) == 1)
{
UseWi = Edit_YesNo(UseWi,0,1,WI2321);
}
 
if((val + Offset) == 2)
{
WiTXRXChannel = Edit_Int_Value(WiTXRXChannel, 0, 5,WITXRX);
 
}
 
if((val + Offset) == 3)
{
WiNetworkGroup = Edit_Int_Value(WiNetworkGroup, 0, 127, WINETWG);
 
 
}
 
if((val + Offset) == 4)
{
WiNetworkMode = Edit_Wi_NetMode_Value(WiNetworkMode);
 
 
}
 
if((val + Offset) == 5)
{
WiTXTO = Edit_Int_Value(WiTXTO,0,127,WITIMEOUT);
 
 
}
 
if((val + Offset) == 6)
{
WiUartMTU = Edit_Int_Value(WiUartMTU,0,127,WIUART);
 
 
}
 
if((val + Offset) == 7)
{
PKT_Baudrate = Edit_Baudrate(PKT_Baudrate,0,5,PKT_BAUDRATE);
New_Baudrate = PKT_Baudrate;
//TODO: //if (edit==1) bt_init();
}
 
 
 
if((val + Offset) == 8)
InitWi232(PKT_Baudrate);
#if defined HWVERSION3_9
if((val + Offset) == 9)
Port_USB2CFG_Wi();
#endif
}
}
#endif
 
#ifdef HWVERSION3_9
//--------------------------------------------------------------
//17.6.12 gelöschtCB, geändert durch HaraldB
//uint8_t Edit_String(const char *data, const uint8_t length, uint8_t type, const char *Text)
//{
// uint8_t y = 1;
// uint8_t x = 1;
// uint8_t I = 0;
//
// lcd_cls();
// lcd_printp_at (0, 0, Text, 2);
//
// for (uint8_t i = 0; i < length; i++)
// {
// lcd_putc (y++, 3, data[i], 0);
// lcd_printp_at (y++, 3, PSTR(" "), 0);
//
// EditString[i] = data[i];
// }
//
// lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
// lcd_printp_at (0, 6, PSTR(" C"), 0);
// lcd_printp_at (0, 7, PSTR(" \x17 \x16 \x19 OK"), 0);
//
// do
// {
// if (type == 1) // Name
// {
// for (uint8_t i = bt_name_length; i > 0; i--)
// {
// if (EditString[i - 1] != ' ')
// {
// bt_name_len = i;
// break;
// }
// }
//
// if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && EditString[I] < 'z')
// {
// EditString[I]++;
//
// if (EditString[I] >= 0x00 && EditString[I] < ' ')
// EditString[I] = ' ';
//
// if (EditString[I] > ' ' && EditString[I] < '0')
// EditString[I] = '0';
//
// if (EditString[I] > '9' && EditString[I] < 'A')
// EditString[I] = 'A';
//
// if (EditString[I] > 'Z' && EditString[I] < 'a')
// EditString[I] = 'a';
//
// lcd_putc (x, 3, EditString[I], 0);
// edit = 1;
// }
//
// if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && EditString[I] > ' ')
// {
// EditString[I]--;
//
// if (EditString[I] < 'a' && EditString[I] > 'Z')
// EditString[I] = 'Z';
//
// if (EditString[I] < 'A' && EditString[I] > '9')
// EditString[I] = '9';
//
// if (EditString[I] < '0' && EditString[I] > ' ')
// EditString[I] = ' ';
//
// lcd_putc (x, 3, EditString[I], 0);
// edit = 1;
// }
// }
// else if (type == 2) // PIN
// {
// if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (EditString[I] < '9'))
// {
// EditString[I]++;
// lcd_putc (x, 3, EditString[I], 0);
// edit = 1;
// }
//
// if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (EditString[I] > '0'))
// {
// EditString[I]--;
// lcd_putc (x, 3, EditString[I], 0);
// edit = 1;
// }
// }
//
// if (get_key_long (1 << KEY_ESC))
// {
// EditString[I] = ' '; // Zeichen l�schen
// lcd_putc (x, 3, EditString[I], 0);
// edit = 1;
// }
//
// if (get_key_short (1 << KEY_ESC))
// {
// if ((x / 2) + 2 > bt_name_length)
// {
// lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
// x = 1;
// lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
// I = 0;
// }
// else
// {
// lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
// x++;
// x++;
// lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
// I++; //Zeiger auf Zeichen
// }
// }
// }
// while (!get_key_press (1 << KEY_ENTER));
// {
// get_key_press(KEY_ALL);
// return 1;
// }
//}
 
uint8_t Edit_String(const char *data, const uint8_t length, uint8_t type, const char *Text)
{
uint8_t y = 1;
uint8_t x = 1;
uint8_t I = 0;
 
lcd_cls();
lcd_printp_at (0, 0, Text, 2);
 
for (uint8_t i = 0; i < length; i++)
{
lcd_putc (y++, 3, data[i], 0);
lcd_printp_at (y++, 3, PSTR(" "), 0);
 
EditString[i] = data[i];
}
 
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
lcd_printp_at (0, 6, PSTR(" C"), 0);
lcd_printp_at (0, 7, PSTR(" \x17 \x16 \x19 OK"), 0);
 
do
{
if (type == 1) // Name
{
for (uint8_t i = bt_name_length; i > 0; i--)
{
if (EditString[i - 1] != ' ')
{
bt_name_len = i;
break;
}
}
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && EditString[I] < 'z')
{
EditString[I]++;
 
//if (EditString[I] >= 0x00 && EditString[I] < ' ') // MartinR: Compilerwarnung
if (EditString[I] < ' ') // MartinR: geändert
EditString[I] = ' ';
 
if (EditString[I] > ' ' && EditString[I] < '0')
EditString[I] = '0';
 
if (EditString[I] > '9' && EditString[I] < 'A')
EditString[I] = 'A';
 
if (EditString[I] > 'Z' && EditString[I] < 'a')
EditString[I] = 'a';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && EditString[I] > ' ')
{
EditString[I]--;
 
if (EditString[I] < 'a' && EditString[I] > 'Z')
EditString[I] = 'Z';
 
if (EditString[I] < 'A' && EditString[I] > '9')
EditString[I] = '9';
 
if (EditString[I] < '0' && EditString[I] > ' ')
EditString[I] = ' ';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
}
else if (type == 2) // PIN
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (EditString[I] < '9'))
{
EditString[I]++;
 
//if (EditString[I] >= 0x00 && EditString[I] < ' ') // MartinR: Compilerwarnung
if (EditString[I] < ' ') // MartinR: geändert
EditString[I] = ' ';
if (EditString[I] > ' ' && EditString[I] < '0')
EditString[I] = '0';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (EditString[I] > '0'))
{
EditString[I]--;
 
if (EditString[I] < 'A' && EditString[I] > '9')
EditString[I] = '9';
 
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
}
 
if (get_key_long (1 << KEY_ESC))
{
if (type == 1) // Name
EditString[I] = ' '; // Zeichen l�schen
else if (type == 2) // Pin
EditString[I] = '0'; // Zeichen setzen
lcd_putc (x, 3, EditString[I], 0);
edit = 1;
}
 
if (get_key_short (1 << KEY_ESC))
{
if (type == 1)
length_tmp = bt_name_length;
else if (type == 2)
length_tmp = bt_pin_length;
 
if ((x / 2) + 2 > length_tmp)
{
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
x = 1;
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
I = 0;
}
else
{
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
x++;
x++;
lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
I++; //Zeiger auf Zeichen
}
}
}
while (!get_key_press (1 << KEY_ENTER));
{
return 1;
}
}
////--------------------------------------------------------------
//void BT_Use (void)
//{
// Pre = UseBT;
//
// lcd_cls ();
//
// lcd_cls ();
//// lcd_printp_at (0, 0, PSTR(" BTM-222 Setup "), 2);
//// lcd_printp_at (0, 2, PSTR("Ist ein BTM-222-Modul"), 0);
//// lcd_printp_at (0, 4, PSTR("eingebaut?"), 0);
// lcd_puts_at(0, 0, strGet(BT1), 2);
// lcd_puts_at(0, 2, strGet(BT2), 0);
// lcd_puts_at(0, 4, strGet(BT3), 0);
//// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
//
// while(1)
// {
// if(UseBT == false)
//// lcd_printp_at (12, 4, PSTR("Nein"), 0);
// lcd_puts_at(12, 4, strGet(NOO), 0);
// else
//// lcd_printp_at (12, 4, PSTR("Ja "), 0);
// lcd_puts_at(12, 4, strGet(YES), 0);
// if(get_key_press (1 << KEY_MINUS))
// UseBT = false;
//
// if(get_key_press (1 << KEY_PLUS))
// UseBT = true;
//
// if(get_key_short (1 << KEY_ENTER))
// {
//// BTIsSet = false;
// WriteParameter();
// if(UseBT == true)
// BT_Setup();
// return;
// }
//
// if (get_key_press (1 << KEY_ESC))
// {
// get_key_press(KEY_ALL);
// UseBT = Pre;
// return;
// }
// }
//}
#ifdef HWVERSION3_9
void BT_SelectDevice (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = bt_devicecount;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val = 0;
 
mmode = 0;
edit = 0;
 
 
lcd_cls ();
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" BT select Device "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1, 1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
{
if (strncmp (device_list[ii + Offset].mac, gps_UsedMac, 14) == 0)
{
lcd_puts_at(3, ii+1, device_list[ii + Offset].DevName, 2);
}
else
{
lcd_puts_at(3, ii+1, device_list[ii + Offset].DevName, 0);
}
}
 
if((ii == 5)&&(ii + Offset < (size - 1)))
lcd_printp_at(1, 6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos,0,1);
else
val = menu_choose2 (1, size, target_pos,0,0);
 
}
else
val = menu_choose2 (2, 5, target_pos,1,1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
}
 
return;
}
else
 
break;
}
target_pos = val;
 
if(val > 0 )
{
for(uint8_t i = 0; i < 14; i++)
{
gps_UsedMac[i] = device_list[val-1].mac[i];
}
for(uint8_t i = 0; i < 20; i++)
{
gps_UsedDevName[i] = device_list[val-1].DevName[i];
}
edit = 1;
}
}
}
#endif
 
//--------------------------------------------------------------
//
void BT_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_BT;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
char string[20];
 
mmode = 0;
edit = 0;
val = 0;
// BTIsSet = true;
 
lcd_cls ();
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" BTM-222 Setup "), 2);
lcd_puts_at(0, 0, strGet(BT1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_bt[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
// if (edit == 1)
// {
// if (UseBT == 1);
// if (bt_init()) BTIsSet = true; else BTIsSet = false;
// WriteParameter();
// return;
// }
return;
}
else
 
if (edit == 1)
{
if (UseBT == 1);
if (bt_init()) BTIsSet = true; else BTIsSet = false;
WriteParameter();
return;
}
 
 
 
 
break;
}
 
target_pos = val;
if((val + Offset) == 1)
// BT_Use();
UseBT = Edit_YesNo(UseBT,0,1,BT4);
 
if((val + Offset) == 2)
{
for (uint8_t i = 0; i < bt_name_length; i++)
{
string[i] = bt_name[i];
}
string[bt_name_length] = 0;
Edit_String(string, bt_name_length, 1, PSTR(" Bluetooth Name "));
if (edit == 1)
{
for (uint8_t i = 0; i < bt_name_len; i++)
{
bt_name[i] = EditString[i];
WriteParameter();
}
 
if (bt_name_len < 10)
{
for (uint8_t i = bt_name_len; i < 10; i++)
{
bt_name[i] = ' ';
WriteParameter();
}
}
}
}
 
if((val + Offset) == 3)
{
for (uint8_t i = 0; i < bt_pin_length; i++)
{
string[i] = bt_pin[i];
}
string[bt_pin_length] = 0;
Edit_String(string, bt_pin_length, 2, PSTR(" Bluetooth Pin "));
if (edit == 1)
{
for (uint8_t i = 0; i < bt_pin_length; i++)
{
bt_pin[i] = EditString[i];
WriteParameter();
}
}
}
 
if((val + Offset) == 4)
{
// if (edit == 1)
// if(BTIsSet)
// BTIsSet = false;
 
if (bt_init() == true)
{
lcd_printp_at (0, 3, PSTR("BT Init ok"), 0);
WriteBTInitFlag();
}
else
{
lcd_printp_at (0, 3, PSTR("BT Init Error"), 0);
BTIsSet = false;
set_beep ( 1000, 0x0040, BeepNormal);
 
}
}
 
if((val + Offset) == 5)
Port_FC2CFG_BT();
 
 
}
}
 
 
void GPS_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_GPS;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
uint8_t BT_WhasOn = 0;
 
mmode = 0;
edit = 0;
val = 0;
lcd_cls ();
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" PKT Accu Setup "), 2);
lcd_puts_at(0, 0, strGet(GPS1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_GPS[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
// WriteParameter();
if (BT_WhasOn)
{
set_BTOn();
// bt_set_mode(SLAVE);
bt_init();
set_BTOff();
}
 
return;
}
return;
}
else
break;
}
 
target_pos = val;
//
// {"Suche GPS Maus ","search GPS mouse ","search GPS mouse ","search GPS mouse "},
// {"GPS Maus Typ ","GPS mouse typ ","GPS mouse typ ","GPS mouse typ "},
// {"GPS Maus aktiv? ","GPS mouse activ? ","GPS mouse activ? ","GPS mouse activ? "},
// {"Zeige GPS Device ","show GPS device ","show GPS device ","show GPS device "},
//
 
if((val + Offset) == 1)
{
if (bt_devicecount ==0)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR("wähle BT Device"), 0);
set_BTOn();
BT_WhasOn = true;
// _delay_ms(2000);
bt_downlink_init();
bt_searchDevice();
set_BTOff();
BT_SelectDevice();
}
else
BT_SelectDevice();
// if (edit == 1) WriteParameter();
}
 
if((val + Offset) == 2)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR("suche BT Device"), 0);
set_BTOn();
// _delay_ms(2000);
BT_WhasOn = true;
bt_downlink_init();
bt_searchDevice();
set_BTOff();
BT_SelectDevice();
}
if((val + Offset) == 4)
{
gps_UseGPS = Edit_YesNo(gps_UseGPS,0,1,GPS3);
if (edit == 1) WriteParameter();
}
 
if((val + Offset) == 5)
{
lcd_cls ();
lcd_puts_at(0, 0, strGet(GPS2), 2);
lcd_puts_at(18, 7, strGet(OK), 0);
lcd_printp_at (0, 1, PSTR("Device:"), 0);
lcd_printp_at (0, 4, PSTR("MAC:"), 0);
 
lcd_puts_at (0, 2,gps_UsedDevName, 0);
 
for(uint8_t i = 0; i < 12; i++)
{
lcd_putc (i, 5, gps_UsedMac[i],0);
}
 
while (!get_key_press (1 << KEY_ENTER));
 
}
 
 
if((val + Offset) == 6)
{
lcd_cls ();
lcd_puts_at(18, 7, strGet(OK), 0);
lcd_puts_at (0, 0,gps_UsedDevName, 2);
set_BTOn();
BT_WhasOn = true;
if (BTIsSlave==true)
{
bt_downlink_init();
}
if (bt_connect(gps_UsedMac))
{
lcd_printp_at (0, 1, PSTR("connected"), 0);
receiveNMEA = true;
}
if (receiveNMEA)
{
lcd_printp_at (0, 3, PSTR(" Latitude Longitude"), 2);
do
{
// if (!bt_receiveNMEA()) break;
//// Tracking_NMEA();
 
write_ndigit_number_u (1, 4, (uint16_t)(NMEAlatitude/10000000), 2, 0,0);
lcd_printp_at (3, 4, PSTR("."), 0);
write_ndigit_number_u (4, 4, (uint16_t)((NMEAlatitude/1000) % 10000), 4, 1,0);
write_ndigit_number_u (8, 4, (uint16_t)((NMEAlatitude/10) % 100), 2, 1,0);
 
 
write_ndigit_number_u (12, 4, (uint16_t)(NMEAlongitude/10000000), 2, 0,0);
lcd_printp_at (14, 4, PSTR("."), 0);
write_ndigit_number_u (15, 4, (uint16_t)((NMEAlongitude/1000) % 10000), 4, 1,0);
write_ndigit_number_u (19, 4, (uint16_t)((NMEAlongitude/10) % 100), 2, 1,0);
lcd_printp_at (0, 2, PSTR("GPS Time: "), 0);
lcd_puts_at (10, 2, NMEATime, 0);
lcd_printp_at (0, 6, PSTR(" Satellite: "), 0);
write_ndigit_number_u (13, 6, NMEAsatsInUse, 2, 1,0);
// lcd_printp_at (0, 2, PSTR(" BT RX Error: "), 0);
// write_ndigit_number_u (13, 2, bt_rxerror, 3, 1);
 
}
 
while (!get_key_press (1 << KEY_ENTER));
 
lcd_cls_line(0,1,21);
lcd_cls_line(0,2,21);
lcd_cls_line(0,3,21);
lcd_cls_line(0,4,21);
lcd_cls_line(0,5,21);
lcd_cls_line(0,6,21);
lcd_printp_at (0, 3, PSTR("GPS trennen"), 0);
}
else
{
lcd_printp_at (0, 1, PSTR("Error at connecting"), 0);
while (!get_key_press (1 << KEY_ENTER));
}
receiveNMEA = false;
if (!bt_disconnect()) lcd_printp_at (0, 3, PSTR("Fehler beim Trennen"), 0);
 
set_BTOff();
 
}
 
 
}
}
 
 
 
 
//--------------------------------------------------------------
uint8_t Edit_PKT_Accu(uint8_t Value, uint8_t min, uint8_t max)
{
Pre = Value;
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(LIPO2), 0);
switch (Value)
{
case false :lcd_printp_at (15, 2, PSTR("LiIo"), 0);
break;
case true :lcd_printp_at (15, 2, PSTR("LiPo"), 0);
break;
break;
}
 
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 0))
{
Value = 1;
lcd_printp_at (15, 2, PSTR("LiPo"), 0);
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 1))
{
Value = 0;
lcd_printp_at (15, 2, PSTR("LiIo"), 0);
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
 
PKT_Accutyp = Value;
// WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
PKT_Accutyp = Pre;
return Pre;
}
 
}
 
//--------------------------------------------------------------
uint16_t Edit_LipoOffset(uint16_t Value, uint16_t min, uint16_t max)
{
lcd_cls();
// lcd_printp_at (0, 2, Text, 0);
lcd_puts_at(0, 2, strGet(LIPO3), 0);
lcd_puts_at(0, 5, strGet(LIPO5), 0);
lcd_puts_at(0, 6, strGet(LIPO6), 0);
// lcd_printp_at (0, 3, PSTR("Offset verstellen bis"), 0);
// lcd_printp_at (0, 4, PSTR("die Spannung passt"), 0);
Pre16 = Value;
write_ndigit_number_u (16, 2, Value, 4, 0,0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && (Value < max-10))
{
edit = 1;
Value = Value +10;
Lipo_UOffset = Value;
write_ndigit_number_u (16, 2,Value, 4, 0,0);
 
}
 
if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && (Value > min))
{
edit = 1;
Value=Value -10;
Lipo_UOffset = Value;
write_ndigit_number_u (16, 2,Value, 4, 0,0);
}
 
if (get_key_press (1 << KEY_ENTER))
return Value;
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
write_ndigit_number_u_100th(8, 3, volt_avg, 0, 0);
lcd_printp_at(3, 3, PSTR("Volt"), 0);
 
}
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
Lipo_UOffset = Pre16;
return Pre16;
}
}
 
//--------------------------------------------------------------
void Accu_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_Accu;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
mmode = 0;
edit = 0;
val = 0;
lcd_cls ();
 
while(1)
{
lcd_cls ();
// lcd_printp_at (0, 0, PSTR(" PKT Accu Setup "), 2);
lcd_puts_at(0, 0, strGet(LIPO1), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_Accu[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
 
return;
}
return;
}
else
break;
}
 
target_pos = val;
if((val + Offset) == 1)
{
PKT_Accutyp= Edit_PKT_Accu(PKT_Accutyp,0,1);
if (edit == 1) WriteParameter();
}
 
if((val + Offset) == 2)
{
Lipo_UOffset = Edit_LipoOffset(Lipo_UOffset,0,9999);
if (edit == 1) WriteParameter();
}
 
}
}
 
 
//--------------------------------------------------------------
uint8_t Edit_LED_Form (uint8_t Value, uint8_t min, uint8_t max, uint8_t Text)
{
Pre = Value;
lcd_cls();
lcd_puts_at(0, 2, strGet(Text), 0);
 
switch (Value)
{
case 0x1:
lcd_circle (14 * 6 + 5, 2 * 8 + 3, 3, 1); // kreis
 
lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 0); // löschen
lcd_circle (16 * 6 + 5, 2 * 8 + 3, 3, 1); // kreis
lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 1, 1); // plus
break;
case 0x3 :
lcd_circle (14 * 6 + 5, 2 * 8 + 3, 3, 1); // kreis
 
lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 1); // schwarz
break;
break;
}
 
lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
 
do
{
if ((get_key_press (1 << KEY_PLUS)) && (Value == 1))
{
Value = 3;
lcd_circle (14 * 6 + 5, 2 * 8 + 3, 3, 1); // kreis
 
lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 1); // schwarz
}
 
if ((get_key_press (1 << KEY_MINUS)) && (Value == 3))
{
Value = 1;
lcd_circle (14 * 6 + 5, 2 * 8 + 3, 3, 1); // kreis
 
lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 0); // löschen
lcd_circle (16 * 6 + 5, 2 * 8 + 3, 3, 1); // kreis
lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 1, 1); // plus
}
 
if (get_key_press (1 << KEY_ENTER))
{
edit = 1;
OSD_LEDform = Value;
WriteParameter();
 
return Value;
}
}
 
while (!get_key_press (1 << KEY_ESC));
{
get_key_press(KEY_ALL);
edit = 0;
OSD_LEDform = Pre;
return Pre;
}
}
 
 
//--------------------------------------------------------------
void OSD_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_OSD;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
mmode = 0;
edit = 0;
val = 0;
lcd_cls ();
 
while(1)
{
lcd_cls ();
lcd_puts_at(0, 0, strGet(OSD_Screen), 2);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_OSD[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
 
return;
}
return;
}
else
break;
}
 
target_pos = val;
if((val + Offset) == 1) OSD_ScreenMode = Edit_Int_Value(OSD_ScreenMode, 0, 2, OSD_SCREENMODE);
if((val + Offset) == 2) OSD_LEDform = Edit_LED_Form(OSD_LEDform, 1, 3, OSD_LED_Form);
if((val + Offset) == 3) OSD_InvertOut = Edit_YesNo(OSD_InvertOut, 0, 1, OSD_Invert_Out);
if((val + Offset) == 4) OSD_SendOSD = Edit_YesNo(OSD_SendOSD, 0, 1, OSD_Send_OSD);
if((val + Offset) == 5) OSD_Fallspeed = Edit_Int10th_Value(OSD_Fallspeed,0,247,FALLSPEED);
if((val + Offset) == 6) OSD_VarioBeep = Edit_YesNo(OSD_VarioBeep,0,1,OSD_VARIOBEEP);
if((val + Offset) == 7) OSD_HomeMKView = Edit_YesNo(OSD_HomeMKView,0,1,OSD_HOMEMKVIEW);
if((val + Offset) == 8) MK_LowBat = Edit_Int10th_Value(MK_LowBat,32,247,LOWBAT);
if((val + Offset) == 9) OSD_mAh_Warning = Edit_Int16_Value(OSD_mAh_Warning,0,30000,OSD_MAHWARNING);
if((val + Offset) == 10)OSD_LipoBar = Edit_YesNo(OSD_LipoBar, 0, 1, OSD_LIPOBAR);
 
 
}
}
//--------------------------------------------------------------
void FollowMe_Setup (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_FOLLOWME;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
mmode = 0;
edit = 0;
val = 0;
lcd_cls ();
 
while(1)
{
lcd_cls ();
lcd_puts_at(0, 0, strGet(FOLLOWME_0), 2);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(1)
{
ii = 0;
 
if(Offset > 0)
lcd_printp_at(1,1, PSTR("\x12"), 0);
 
for(ii = 0; ii < 6; ii++)
{
if((ii + Offset) < size)
lcd_printp_at(3, ii + 1, param_menuitems_FOLLOWME[ii+Offset][DisplayLanguage], 0);
 
if((ii == 5) && (ii + Offset < (size - 1)))
lcd_printp_at(1,6, PSTR("\x13"), 0);
 
}
 
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
val = menu_choose2 (1, 5, target_pos, 0, 1);
else
val = menu_choose2 (1, size, target_pos, 0, 0);
 
}
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
 
}
 
if(dmode == 1)
{
if(Offset + 7 > size)
val = menu_choose2 (2, 6, target_pos, 1, 0);
else
val = menu_choose2 (2, 5, target_pos, 1, 1);
}
 
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{ // Ende mit ESC, speichern
if (edit == 1)
{
WriteParameter();
 
return;
}
return;
}
else
break;
}
 
target_pos = val;
if((val + Offset) == 1) FM_Refresh = Edit_Int16_Value(FM_Refresh, 250, 60000, FOLLOWME_1);
if((val + Offset) == 2) FM_Speed = Edit_Int16_Value(FM_Speed, 0, 100, FOLLOWME_2);
if((val + Offset) == 3) FM_Radius = Edit_Int16_Value(FM_Radius, 1,20, FOLLOWME_3);
 
}
}
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/setup.h
0,0 → 1,56
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _setup_H
#define _setup_H
 
void PKT_Setup (void);
void Display_Setup (void);
void Wi_Use (void);
void Wi_Setup (void);
void BT_Use (void);
void BT_Setup (void);
void Show_Error_HW12(void);
void Accu_Setup (void);
void BT_SelectDevice (void);
void GPS_Setup (void);
void OSD_Setup (void);
void FollowMe_Setup (void);
 
uint8_t Edit_Language(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text);
 
extern uint8_t bt_name_len;
extern uint8_t length_tmp;
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/stick.c
0,0 → 1,383
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* Copyright (C) 2012 Martin Runkel *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
 
#include <string.h>
#include <stdlib.h>
 
#include "lcd.h"
#include "timer.h"
#include "servo.h"
#include "messages.h"
#include "lipo.h"
#include "stick.h"
 
#define SERVO_CORRECT 3.125
 
 
#include <util/delay.h>
#include <inttypes.h>
#include <stdlib.h>
 
#include "main.h"
#include "uart1.h"
#include "usart.h"
 
 
#define LIMIT_MIN_MAX(value, min, max) {if(value <= min) value = min; else if(value >= max) value = max;}
 
int16_t Pos_Stick[12]; // 1,5mS
int16_t Pos_alt[5]; //
 
uint8_t BalkenPos = 0;
uint8_t Stick_Display = 0;
uint8_t serialChannelRichtung = 0;
uint8_t serialChannelConfig = 2;
 
 
//--------------------------------------------------------------
//
void joystick (void)
{
// uint8_t chg = 0;
// uint8_t Pos_Stick = 150; // 1,5mS
// uint8_t Pos_alt = 150; //
//int16_t Pos_Stick[12]; // 1,5mS
uint8_t chg = 0;
//uint8_t BalkenPos = 0;
uint8_t Stick_Nr = 0;
//uint8_t Stick_Display = 0;
uint8_t i = 0;
 
memset (Pos_Stick, 150, 3); // füllt 3+1 Byte vom Pos_Stick[12] mit 150
//int16_t Pos_alt[5]; //
int16_t Poti_Summe[5]; //
memset (Poti_Summe, 0, 5); // füllt 3+1 Byte mit 0
int16_t Poti_Neutral[5]; //
 
 
// ADC- init
Stick_Nr = 0;
ADMUX = (1<<REFS0)|(0<<MUX0); // Multiplexer selection Register: AVCC with external capacitor at AREF pin , ADC1
ADMUX = (ADMUX & ~(0x1F)) | (Stick_Nr & 0x1F); // ADC[Stick_Nr] verwenden
timer = 50;
while (timer > 0);
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // ADC Enable, ADC Start, Prescaler 128
 
// Stick-Neutralposition bestimmen
 
while (ADCSRA & (1<<ADSC)); // wenn ADC fertig
Poti_Neutral[Stick_Nr] = ((ADCW>>2)&0xff);
LIMIT_MIN_MAX (Poti_Neutral[Stick_Nr],108,148);
Stick_Nr = 2 ;
ADMUX = (ADMUX & ~(0x1F)) | (Stick_Nr & 0x1F); // ADC[i] verwenden
// Stick_Nr 1,2,3 = Potis, Stick_Nr 1= Lipo
ADCSRA |= (1<<ADSC); // ADC Start
while (ADCSRA & (1<<ADSC)); // wenn ADC fertig
Poti_Neutral[Stick_Nr] = ((ADCW>>2)&0xff);
LIMIT_MIN_MAX (Poti_Neutral[Stick_Nr],108,148);
Stick_Nr = 0;
ADMUX = (ADMUX & ~(0x1F)) | (Stick_Nr & 0x1F); // ADC[i] verwenden
// Stick_Nr 1,2,3 = Potis, Stick_Nr 1= Lipo
ADCSRA |= (1<<ADSC); // ADC Start
 
 
 
//OCR1A = 150 * SERVO_CORRECT; // Servomitte
 
lcd_cls ();
// Kopfzeile und Rahmen zeichnen
lcd_printp (PSTR(" serielle Potis 1-5 "), 2);
//lcd_printp_at (7, 5, PSTR("%"), 0);
//lcd_printp_at (16, 5, PSTR("mS"), 0);
 
lcd_puts_at(0, 7, strGet(KEYLINE3), 0);
lcd_printp_at (18, 7, PSTR("\x19O\x18"), 0);
for (i=0 ; i< 5 ; i++)
{
BalkenPos = 12 + (i*8) ;
 
lcd_rect(3,BalkenPos, 120, 6, 1); // +-150% Rahmen
lcd_line(23,BalkenPos,23,(BalkenPos+6),1); // -100%
lcd_line(43,BalkenPos,43,(BalkenPos+6),1); // -50%
lcd_frect(62,BalkenPos, 2, 6, 1); // 0%
lcd_line(83,BalkenPos,83,(BalkenPos+6),1); // +50%
lcd_line(103,BalkenPos,103,(BalkenPos+6),1); // +100%
}
// Reset auf Mittelstellung
Pos_Stick[0] = 150;
Poti_Summe[0] = 0;
Pos_Stick[2] = 150;
Poti_Summe[2] = 0;
Pos_Stick[4] = 150;
Poti_Summe[4] = 0;
chg = 255;
 
do
{
if (!(ADCSRA & (1<<ADSC))) // wenn ADC fertig
{
//Pos_Stick[Stick_Nr] = 150 + 128 - ((ADCW>>2)&0xff);
if (serialChannelRichtung & (1<<Stick_Nr))
Pos_Stick[Stick_Nr] = Poti_Neutral[Stick_Nr] - ((ADCW>>2)&0xff);
else
Pos_Stick[Stick_Nr] = ((ADCW>>2)&0xff) - Poti_Neutral[Stick_Nr];
LIMIT_MIN_MAX (Pos_Stick[Stick_Nr],-120,120);
if ((Stick_Nr==0) || (Stick_Nr==2)) // nur die Potis 1,2 sind nicht neutralisierend
{
Poti_Summe[Stick_Nr] += (Pos_Stick[Stick_Nr]/8) * abs(Pos_Stick[Stick_Nr]/8);
LIMIT_MIN_MAX (Poti_Summe[Stick_Nr],-(120*128),(120*128));
Pos_Stick[Stick_Nr]= Poti_Summe[Stick_Nr] / 128; // nicht neutralisierend
}
Pos_Stick[Stick_Nr] += 150;
LIMIT_MIN_MAX (Pos_Stick[Stick_Nr],30,270); // war 75 , 225
if (Pos_Stick[Stick_Nr] != Pos_alt[Stick_Nr]) // nur bei Änderung
{
chg |= (1<<Stick_Nr) ;
//Pos_alt=Pos_Stick ; // verschoben
}
Stick_Nr ++ ;
//if (Stick_Nr==1) Stick_Nr=2; // Lipo überspringen
if (Stick_Nr==3) // Taster
{
// if (get_key_press (1 << KEY_EXT)) Pos_Stick[Stick_Nr] = 225;
if (serialChannelRichtung & (1<<Stick_Nr))
{
if (PINA & (1 << KEY_EXT)) Pos_Stick[Stick_Nr] = 30;
else Pos_Stick[Stick_Nr] = 270;
}
else
{
if (PINA & (1 << KEY_EXT)) Pos_Stick[Stick_Nr] = 270;
else Pos_Stick[Stick_Nr] = 30;
}
if (Pos_Stick[Stick_Nr] != Pos_alt[Stick_Nr])
{
chg |= (1<<Stick_Nr) ;
}
Stick_Nr=0;
}
/*
#ifndef ohne_Lipo // MartinR
Stick_Nr = 1; // MartinR AD-Kanal 1 überspringen wegen Lipo Überwachung
#endif
*/
ADMUX = (ADMUX & ~(0x1F)) | (Stick_Nr & 0x1F); // ADC[i] verwenden
// Stick_Nr 1,2,3 = Potis, Stick_Nr 0= Lipo
ADCSRA |= (1<<ADSC); // ADC Start
//serialPotis ();
}
 
if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Pos_Stick[4] < 271))
{
Pos_Stick[4] ++ ;
//LIMIT_MIN_MAX (Pos_Stick[Stick_Nr],30,270); // war 75 , 225
chg |= (1<<4) ;
}
else if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Pos_Stick[4] > 29))
{
Pos_Stick[4] -- ;
//LIMIT_MIN_MAX (Pos_Stick[Stick_Nr],30,270); // war 75 , 225
chg |= (1<<4) ;
}
else if (get_key_press (1 << KEY_ENTER))
{
/*
for (i=0 ; i< 4 ; i++)
{
BalkenPos = 12 + (i*8) ;
lcd_frect (4, (BalkenPos+1), 118, 4, 0); // Balken löschen
lcd_frect(62, BalkenPos, 2, 6, 1); // 0%
}
*/
Pos_Stick[0] = 150;
Poti_Summe[0] = 0;
Pos_Stick[2] = 150;
Poti_Summe[2] = 0;
Pos_Stick[4] = 150;
Poti_Summe[4] = 0;
BeepTime = 200;
BeepMuster = 0x0080;
chg = 255;
}
 
if (chg)
{
if (chg & (1<<0)); // Stick 1
{
BalkenPos = 12 + (0*8) ;
Stick_Display = 0;
Balken_Zeichnen () ;
Pos_alt[Stick_Display]=Pos_Stick[Stick_Display];
}
// Stick 2 = Lipo
if (chg & (1<<1)); // Stick 2
{
BalkenPos = 12 + (1*8) ;
Stick_Display = 1;
if (serialChannelConfig & (0<<1)) Balken_Zeichnen () ; // nur wenn keine Lipo-Spannung
Pos_alt[Stick_Display]=Pos_Stick[Stick_Display];
}
if (chg & (1<<2)); // Stick 3
{
BalkenPos = 12 + (2*8) ;
Stick_Display = 2;
Balken_Zeichnen () ;
Pos_alt[Stick_Display]=Pos_Stick[Stick_Display];
}
if (chg & (1<<3)); // Stick 4 = Taster
{
BalkenPos = 12 + (3*8) ;
Stick_Display = 3;
Balken_Zeichnen () ;
Pos_alt[Stick_Display]=Pos_Stick[Stick_Display];
}
if (chg & (1<<4)); // Stick 5 = Taster vom PKT
{
BalkenPos = 12 + (4*8) ;
Stick_Display = 4;
Balken_Zeichnen () ;
//OCR1A = (((Pos_Stick[Stick_Display]-150)/1.6)+150) * SERVO_CORRECT; // Servostellung , 1.6=0.8*0.5
Pos_alt[Stick_Display]=Pos_Stick[Stick_Display];
}
chg = 0;
serialPotis ();
}
}
while (!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
#ifdef HWVERSION3_9
#ifndef ohne_Lipo // MartinR
ADC_Init(); // ADC für Lipomessung wieder aktivieren
#endif
#endif
 
}
 
//--------------------------------------------------------------
//
void serialPotis (void)
{
uint8_t i = 0;
memset (buffer, 0, 12); // füllt die 12+1 Byte vom buffer mit 0
 
for (i=0 ; i< 5 ; i++)
{
buffer[i] = Pos_Stick[i]-150 ;
}
SendOutData('y', ADDRESS_FC, 1, buffer, 12);
}
//--------------------------------------------------------------
//
void Balken_Zeichnen (void)
{
// Balken löschen
if ((Pos_Stick[Stick_Display] > Pos_alt[Stick_Display])&&(Pos_alt[Stick_Display] < 150)) // Balken links löschen
lcd_frect ((63-((150 -Pos_alt[Stick_Display]) * 0.5)), (BalkenPos+1), (63-((150- Pos_Stick[Stick_Display]) * 0.5)), 4, 0);
if ((Pos_Stick[Stick_Display] < Pos_alt[Stick_Display])&&(Pos_alt[Stick_Display] > 150)) // Balken rechts löschen
lcd_frect ((63+((Pos_Stick[Stick_Display] - 150) * 0.5)), (BalkenPos+1), (63+((Pos_alt[Stick_Display] - 150) * 0.5)), 4, 0);
// Balken zeichnen
if (Pos_Stick[Stick_Display] >= 150)
{
lcd_frect (63, (BalkenPos+1), ((Pos_Stick[Stick_Display] - 150) * 0.5), 4, 1);
//write_ndigit_number_u (4, 5, ((Pos_Stick[Stick_Display] - 150) * 1.25), 3, 0, 0); // Pulse width in %
lcd_frect(62, (BalkenPos), 2, 6, 1); // 0%
}
else
{
lcd_frect (63 - ((150 - Pos_Stick[Stick_Display]) * 0.5), (BalkenPos+1), ((150 - Pos_Stick[Stick_Display]) * 0.5), 4, 1);
//write_ndigit_number_u (4, 5, ((150 - Pos_Stick[Stick_Display]) * 1.25), 3, 0, 0); // Pulse width in %
lcd_frect(62, (BalkenPos), 2, 6, 1); // 0%
}
// Raster zeichnen
lcd_line(3, BalkenPos,3, (BalkenPos+6),1); // -150%
lcd_line(23, BalkenPos,23, (BalkenPos+6),1); // -100%
lcd_line(43, BalkenPos,43, (BalkenPos+6),1); // -50%
lcd_line(83, BalkenPos,83, (BalkenPos+6),1); // +50%
lcd_line(103,BalkenPos,103,(BalkenPos+6),1); // +100%
lcd_line(123,BalkenPos,123,(BalkenPos+6),1); // +150%
}
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/stick.h
0,0 → 1,42
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _STICK_H
#define _STICK_H
 
void joystick (void);
void serialPotis (void);
void Balken_Zeichnen (void);
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/timer.c
0,0 → 1,567
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>
#include <inttypes.h>
 
 
#include "main.h"
#include "timer.h"
#include "eeprom.h"
#include "lcd.h"
#include "uart1.h"
#include "bluetooth.h"
#include "setup.h"
 
 
#if defined HWVERSION1_2W || defined HWVERSION1_2
#include "HAL_HW1_2.h"
#endif
 
#if defined HWVERSION1_3W || defined HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
 
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
 
volatile uint16_t timer;
volatile uint16_t abo_timer;
volatile static unsigned int tim_main;
 
uint8_t key_state = 0; // debounced and inverted key state:
// bit = 1: key pressed
uint8_t key_press = 0; // key press detect
uint8_t key_long = 0; // key long press
uint8_t key_rpt = 0; // key repeat
uint8_t key_lrpt = 0; // key long press and repeat
uint8_t key_rpts = 0; // key long press and speed repeat
uint8_t repeat_speed = 0;
 
uint16_t DisplayTime = 0; // Leuchtdauer
volatile uint16_t IdleTimer = 0; // InaktivitätsTimer
 
uint16_t WarnCount = 0; // Zähler der LIPO Warnzeit
uint16_t WarnToggle = 0; // Togglezähler zum blinken
uint16_t WarnTime = 10; // Länge der LIPO Warnzeit 10 Sek.
uint16_t PoffTime = 30; // Länge der Wartezeit vor Abschalten 30 Sek.
//uint8_t servo = 0;
 
 
 
volatile uint8_t Display_on;// Flag Display on/off
 
unsigned int BeepTime = 0;
unsigned int BeepMuster = 0xffff;
unsigned int BeepPrio = 0;
 
volatile unsigned int CountMilliseconds = 0;
 
// Size of Buffer for Converting unsigned int Value to ASCII
#define STRING_BUFFER_SIZE 5
 
// Buffer for Converting unsigned int Value to ASCII
char String_Buffer[STRING_BUFFER_SIZE];
 
 
//--------------------------------------------------------------
//
void Timer1_Init (void) // Timer 1-A
{
// löschen
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = 0;
 
// setzen
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << CS11) | (1 << CS10) | (1 << WGM13) | (1 << WGM12);
 
ICR1 = (F_CPU / 64) * 20 / 1000;
 
OCR1A = 470; // ca. Servomitte
}
 
 
//--------------------------------------------------------------
void Timer2_Init (void) // Displayhelligkeit
{
DDRD |= (1 << DDD7); // PD7 output
TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1); // non invers
TCCR2B |= (1 << CS20); // Prescaler 1/1
TIMSK2 |= (1 << OCIE2A) | (1 << OCIE2B);
 
OCR2A = 255;
}
 
 
#if defined HWVERSION1_2 || defined HWVERSION1_2W
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD &= ~(1 << PD7);
PORTC &= ~(1 << PC0);
PORTC &= ~(1 << PC1);
}
ISR(TIMER2_COMPB_vect)
{
PORTD |= (1 << PD7);
PORTC |= (1 << PC0);
PORTC |= (1 << PC1);
}
#endif
#if defined HWVERSION1_3 || defined HWVERSION1_3W
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD &= ~(1 << PD7);
PORTD &= ~(1 << PD6);
PORTC &= ~(1 << PC2);
}
ISR(TIMER2_COMPB_vect)
{
PORTD |= (1 << PD7);
PORTD |= (1 << PD6);
PORTC |= (1 << PC2);
}
#endif
#ifdef HWVERSION3_9
//--------------------------------------------------------------
ISR(TIMER2_COMPA_vect)
{
PORTD |= (1 << PIND7); // MartinR: von PD auf PIND geändert
}
ISR(TIMER2_COMPB_vect)
{
PORTD &= ~(1 << PIND7); // MartinR: von PD auf PIND geändert
}
#endif
 
 
//--------------------------------------------------------------
void Timer0_Init (void) // System (100Hz)
{
timer = 0;
 
TCCR0A = (1 << WGM01);
TCCR0B = (1 << CS02) | (1 << CS00);
OCR0A = (F_CPU / (100L * 1024L)) ;
 
TIMSK0 |= (1 << OCIE0A); // enable interrupt for OCR
}
 
 
//--------------------------------------------------------------
ISR(TIMER0_COMPA_vect) // Timer-Interrupt (100 Hz)
{
static uint8_t ct0 = 0;
static uint8_t ct1 = 0;
static uint8_t k_time_l = 0;
static uint8_t k_time_r = 0;
static uint8_t k_time_lr = 0;
static uint8_t k_time_rs = 0;
uint8_t i;
 
static unsigned char cnt_1ms = 1,cnt = 0;
unsigned char beeper_ein = 0;
// unsigned char pieper_ein = 0;
 
// Key handling by Peter Dannegger
// see www.mikrocontroller.net
 
i = key_state ^ ~KEY_PIN; // key changed ?
ct0 = ~(ct0 & i); // reset or count ct0
ct1 = ct0 ^ (ct1 & i); // reset or count ct1
i &= (ct0 & ct1); // count until roll over ?
key_state ^= i; // then toggle debounced state
key_press |= (key_state & i); // 0->1: key press detect
 
if (PKT_IdleBeep == 1)
{
IdleTimer ++; // nix zu tun? Timer hochzählen
if (IdleTimer == 12000) // Warnhinweis
{
set_beep ( 200, 0x0080, BeepNormal);
IdleTimer = 0;
}
}
 
if (!cnt--)
{
cnt = 9;
CountMilliseconds++;
cnt_1ms++;
}
 
if (i!=0)
{ // Displaylicht einschalten, und bzw. Timeoutzählerreset wenn Taste gedrückt wurde
if (Display_on == 0)
set_D_LIGHT();
 
 
Display_on = 1; // Flag Display on
DisplayTime = 0; // Timer Reset
IdleTimer = 0; // Idletimeout Reset
 
}
 
if (DisplayTimeout > 0)
{
if (Display_on == 1)
{
DisplayTime++;
if ((DisplayTime / 100) == DisplayTimeout) // ISR läuft mit 100Hz
{ // Displaylicht ausschalten
clr_D_LIGHT();
Display_on = 0; // Flag Display off
 
}
}
}
 
//--------------------------------------------------------------
#ifdef HWVERSION3_9
if (ADCSRA & ADIE) LipoCheck(); // Lipo prüfen // MartinR nicht wenn Stick aktiv
//LipoCheck(); // Lipo prüfen // MartinR: soe war es
#endif
 
//--------------------------------------------------------------
if (BeepTime)
{
if (BeepTime > 10)
BeepTime -= 10;
else
{
BeepTime = 0;
 
}
 
if (BeepTime & BeepMuster)
beeper_ein = 1;
else beeper_ein = 0;
 
 
}
else
{
beeper_ein = 0;
BeepMuster = 0xffff;
BeepPrio = BeepNormal;
}
 
if (beeper_ein==1)
set_BEEP();
else
clr_BEEP();
 
 
//--------------------------------------------------------------
if ((key_state & LONG_MASK) == 0) // check long key function
k_time_l = REPEAT_START; // start delay
 
if (--k_time_l == 0) // long countdown
key_long |= (key_state & LONG_MASK);
 
//--------------------------------------------------------------
if ((key_state & REPEAT_MASK) == 0) // check repeat function
k_time_r = 1; // kein delay
 
if (--k_time_r == 0)
{
k_time_r = REPEAT_NEXT; // repeat delay
key_rpt |= (key_state & REPEAT_MASK);
}
 
//--------------------------------------------------------------
if ((key_state & LONG_REPEAT_MASK) == 0) // check repeat function
k_time_lr = REPEAT_START; // start delay
 
if (--k_time_lr == 0)
{
k_time_lr = REPEAT_NEXT; // repeat delay
key_lrpt |= (key_state & LONG_REPEAT_MASK);
}
 
//--------------------------------------------------------------
if ((key_state & LONG_REPEAT_SP_MASK) == 0) // check repeatX function
k_time_rs = REPEAT_START; // start delay
 
if (--k_time_rs == 0) // repeat countdown
{
if (repeat_speed == 1)
{
k_time_rs = REPEAT_SPEED_1;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
else if (repeat_speed == 2)
{
k_time_rs = REPEAT_SPEED_2;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
else if (repeat_speed == 3)
{
k_time_rs = REPEAT_SPEED_3;
key_rpts |= (key_state & LONG_REPEAT_SP_MASK);
}
}
 
if (timer > 0)
timer --;
 
if (abo_timer > 0)
abo_timer --;
 
// if (receiveNMEA==true)
// {
// if (bt_receiveNMEA()) Tracking_NMEA();
//
// }
 
 
}
 
 
//--------------------------------------------------------------
#ifdef HWVERSION3_9
 
void LipoCheck (void) // Lowbatpin des Spannungswandlers prüfen
// LBO des LT1308 wechselt zum Ende der Batterielaufzeit häufig seinen Zustand in der Übergangsphase zum LowBat
// Die Akkuspannung schwankt auch abhängig vom momentanen Stromverbrauch
{
if (WarnToggle == 1) // Beim ersten Auftreten Warnung ausgeben, Rythmus 5/10 Sekunden
{
 
set_beep ( 1000, 0x0020, BeepNormal);
lcd_printp_at (0, 0, PSTR(" LIPO !!Warnung!! "), 2);
}
 
if (WarnToggle == WarnTime * 100)
WarnToggle = 0; // erstmal bis hier warnen
 
if (WarnToggle > 0)
WarnToggle++; // weiter hochzählen
 
if (PINC & (1 << LowBat)) // Kurzzeitige Unterspannung bearbeiten und Warnung ausgeben
{
WarnCount = 0;
// if (WarnCount > 0)
// WarnCount--; // Bei LIPO OK erstmal runterzählen, LT1308 überlegt sich noch genauer ob nun ok oder nicht
}
 
if (!(PINC & (1 << LowBat)) ) // LT1308 hat Unterspannung erkannt
{
WarnCount++; // solange LBO low ist Zähler hochzählen
if (WarnCount == 10 && WarnToggle == 0) // mit "10" etwas unempfindlicher gegen kurze Impulse machen
WarnToggle = 1; // Warnhinweis starten
}
 
if ((WarnCount) == PoffTime * 100)
clr_V_On(); // Spannung abschalten
}
 
#endif
 
 
//--------------------------------------------------------------
unsigned int SetDelay (unsigned int t)
{
return(CountMilliseconds + t + 1);
}
 
 
//--------------------------------------------------------------
char CheckDelay(unsigned int t)
{
return(((t - CountMilliseconds) & 0x8000) >> 9);
}
 
 
//--------------------------------------------------------------
void Delay_ms(unsigned int w)
{
unsigned int akt;
akt = SetDelay(w);
while (!CheckDelay(akt));
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_press (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_press; // read key(s)
key_press ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_short (uint8_t key_mask)
{
uint8_t ret;
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
ret = get_key_press (~key_state & key_mask);
 
SREG = sreg; // restore status register
 
return ret;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_long; // read key(s)
key_long ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return get_key_press (get_key_rpt (key_mask));
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_rpt (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_rpt; // read key(s)
key_rpt ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long_rpt (uint8_t key_mask)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_lrpt; // read key(s)
key_lrpt ^= key_mask; // clear key(s)
 
SREG = sreg; // restore status register
 
return get_key_rpt (~key_press^key_mask);
}
 
 
//--------------------------------------------------------------
//
uint8_t get_key_long_rpt_sp (uint8_t key_mask, uint8_t key_speed)
{
uint8_t sreg = SREG;
 
// disable all interrupts
cli();
 
key_mask &= key_rpts; // read key(s)
key_rpts ^= key_mask; // clear key(s)
 
repeat_speed = key_speed;
 
SREG = sreg; // restore status register
 
return key_mask;
}
 
void set_beep ( uint16_t Time, uint16_t Muster, uint8_t Prio)
{
 
if (Prio == BeepNormal)
{
if (BeepPrio == BeepNormal) // nur setzen wenn keine hohe Prio schon aktiv ist
{
BeepTime = Time;
BeepMuster = Muster;
}
}
 
if (Prio == BeepSevere)
{
if (!BeepPrio == BeepSevere)
{
BeepPrio = BeepSevere; // hohe Prio setzen
BeepTime = Time;
BeepMuster = Muster;
}
}
 
if (Prio == BeepOff)
{
BeepPrio = BeepNormal; // Beep hohe Prio aus
BeepTime = 0;
BeepMuster = 0;
}
 
 
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/timer.h
0,0 → 1,93
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* based on the key handling by Peter Dannegger *
* see www.mikrocontroller.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
#ifndef _TIMER_H
#define _TIMER_H
 
#include "cpu.h"
#include "main.h"
 
#define KEY_ALL ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define REPEAT_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_REPEAT_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
#define LONG_REPEAT_SP_MASK ((1 << KEY_PLUS) | (1 << KEY_MINUS) | (1 << KEY_ENTER) | (1 << KEY_ESC))
 
#define REPEAT_START 70 // after 700ms
#define REPEAT_NEXT 15 // every 150ms
#define REPEAT_SPEED_1 20 // every 200ms
#define REPEAT_SPEED_2 8 // every 80ms
#define REPEAT_SPEED_3 1 // every 10ms
 
#define BeepNormal 0 // Normal Beep
#define BeepSevere 1 // schwerer Fehler, Beep nicht unterbrechbar
#define BeepOff 2 // Beep aus
 
#define ABO_TIMEOUT 300 // 3 sec
extern volatile uint8_t Display_on;
extern volatile uint16_t IdleTimer;
 
extern volatile uint16_t timer;
extern volatile uint16_t abo_timer;
extern uint16_t WarnCount;
 
 
 
 
//extern volatile unsigned int BeepTime;
extern unsigned int BeepTime;
extern unsigned int BeepMuster;
 
void Timer0_Init (void); // Systeminterrupt
void Timer1_Init (void); // Servotester
void Timer2_Init (void); // Displayhelligkeit
 
uint8_t get_key_press (uint8_t key_mask); // sofort beim drücken
uint8_t get_key_short (uint8_t key_mask); // erst beim loslassen
uint8_t get_key_long (uint8_t key_mask); // verzögert
uint8_t get_key_rpt (uint8_t key_mask); // mit verzögerung
uint8_t get_key_long_rpt (uint8_t key_mask); //
uint8_t get_key_long_rpt_sp (uint8_t key_mask, uint8_t key_speed); // mit verzögerung und 3 versch. geschw.
void set_beep ( uint16_t Time, uint16_t Muster, uint8_t Prio);
extern volatile unsigned int CountMilliseconds;
 
 
void Delay_ms(unsigned int);
unsigned int SetDelay (unsigned int t);
char CheckDelay (unsigned int t);
void LipoCheck (void); // Lowbatpin des Spannungswandlers prüfen
 
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/tools.c
0,0 → 1,338
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <util/delay.h>
#include "main.h"
#include "setup.h"
#include "lcd.h"
#include "menu.h"
#include "servo.h"
#include "motortest.h"
#include "eeprom.h"
#include "timer.h"
#include "connect.h"
#ifdef HWVERSION3_9
#include "HAL_HW3_9.h"
#endif
#ifdef HWVERSION1_3
#include "HAL_HW1_3.h"
#endif
//#include "voltmeter.h"
#include "lipo.h"
#include "messages.h"
 
//--------------------------------------------------------------
#define ITEMS_PKT 6
 
prog_char tools_menuitems_pkt[ITEMS_PKT][NUM_LANG][18]= // zeilen,zeichen+1
// German, English, French, Netherlands
{
{"Motor Tester ","Motor Tester ","Motor Tester ","Motor Tester "},
{"Servo Tester ","Servo Tester ","Servo Tester ","Servo Tester "},
{"PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter ","PC BT > Kopter "},
{"PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter ","PC USB > Kopter "},
{"PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d","PKT Setup \x1d"},
{"PKT Version ","PKT Version ","PKT Version ","PKT Version "},
};
 
 
//--------------------------------------------------------------
void PKT_Tools (void)
{
uint8_t ii = 0;
uint8_t Offset = 0;
uint8_t size = 0;
size = ITEMS_PKT ;
uint8_t dmode = 0;
uint8_t target_pos = 1;
uint8_t val;
 
val = 0;
 
while(1)
{
lcd_cls ();
lcd_printp_at (0, 0, PSTR(" PKT-Tools "), 2);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(2)
{
ii = 0;
if(Offset > 0)
{
lcd_printp_at(1,1, PSTR("\x12"), 0);
}
for(ii = 0;ii < 6 ; ii++)
{
if((ii+Offset) < size)
{
lcd_printp_at(3,ii+1,tools_menuitems_pkt[ii+Offset][DisplayLanguage], 0);
}
if((ii == 5)&&(ii+Offset < (size-1)))
{
lcd_printp_at(1,6, PSTR("\x13"), 0);
}
}
if(dmode == 0)
{
if(Offset == 0)
{
if(size > 6)
{
val = menu_choose2 (1, 5, target_pos,0,1);
}
else
{
val = menu_choose2 (1, size, target_pos,0,0);
}
}
else
{
val = menu_choose2 (2, 5, target_pos,1,1);
}
}
if(dmode == 1)
{
if(Offset+7 > size)
{
val = menu_choose2 (2, 6, target_pos,1,0);
}
else
{
val = menu_choose2 (2, 5, target_pos,1,1);
}
}
if(val == 254)
{
Offset++;
dmode = 1;
target_pos = 5;
}
else if(val == 253)
{
Offset--;
dmode = 0;
target_pos = 2;
}
else if(val == 255)
{
return;
}
else
{
break;
}
 
}
target_pos = val;
 
if((val+Offset) == 1 )
motor_test(FC_Mode);
if((val+Offset) == 2 )
servo_test();
#ifdef HWVERSION3_9
if(U02SV2 == 0)
{
if((val+Offset) == 3 )
Port_BT2Wi();
if((val+Offset) == 4 )
Port_USB2Wi();
}
else if(U02SV2 == 1)
{
if((val+Offset) == 3 )
Port_BT2FC();
if((val+Offset) == 4 )
Port_USB2FC();
}
#else
if((val+Offset) == 3 )
Show_Error_HW();
if((val+Offset) == 4 )
Show_Error_HW();
#endif
if((val+Offset) == 5)
PKT_Setup();
if((val+Offset) == 6)
Show_Version();
}
}
 
 
//--------------------------------------------------------------
//
void PC_Fast_Connect (void)
 
{
uint8_t value = 1;
 
while(1)
{
 
lcd_cls();
// lcd_printp_at (0, 0, PSTR(" PC-Quick-Verbindung "), 2);
lcd_puts_at(0, 8, strGet(TOOLS1), 2);
lcd_printp_at (3, 3, PSTR("PC BT > Kopter"), 0);
lcd_printp_at (3, 4, PSTR("PC USB > Kopter"), 0);
// lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
// lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
 
while(2)
{
if(value == 1)
{
lcd_printp_at (1, 3, PSTR("\x1d"), 0);
lcd_printp_at (1, 4, PSTR(" "), 0);
}
else
{
lcd_printp_at (1, 3, PSTR(" "), 0);
lcd_printp_at (1, 4, PSTR("\x1d"), 0);
}
 
if(get_key_press (1 << KEY_MINUS))
value = 1;
 
if(get_key_press (1 << KEY_PLUS))
value = 2;
 
 
if(get_key_short (1 << KEY_ENTER))
 
{
#ifdef HWVERSION3_9
if(U02SV2 == 0)
{
if(value == 1)
Port_BT2Wi();
if(value == 2)
Port_USB2Wi();
}
else if(U02SV2 == 1)
{
if(value == 1)
Port_BT2FC();
if(value == 2)
Port_USB2FC();
}
#else
if(value == 1)
Show_Error_HW();
if(value == 2)
Show_Error_HW();
#endif
break;
}
 
if(get_key_press (1 << KEY_ESC))
{
get_key_press(KEY_ALL);
return;
}
 
}
}
}
 
 
void Test_HB (void) // bleibt für Tests
{
#ifdef HWVERSION3_9
// ADC_Init();
//
// uint16_t volt_avg = 0;
//// uint64_t volt_tmp = 0;
// uint16_t Balken = 0;
 
 
lcd_cls();
lcd_printp_at(12, 7, PSTR("Ende"), 0);
 
// lcd_rect(104, 0, 23, 8, 1); // Rahmen
 
do
{
//
//
if(samples>4095)
{
// write_ndigit_number_u(0, 4, accumulator, 5, 0);
oversampled();
volt_avg = Vin;
}
// // write_ndigit_number_u(0, 3, samples, 5, 0);
//
//// write_ndigit_number_u(0, 1, Vin, 5, 0);
// _delay_ms(50);
#ifndef ohne_Lipo // MartinR
show_Lipo();
#endif
write_ndigit_number_u_100th(5, 5, volt_avg, 0, 0);
lcd_printp_at(10, 5, PSTR("Volt"), 0);
//
//
//
write_ndigit_number_u(0, 6, Lipo_UOffset, 5, 0,0);
// write_ndigit_number_u(15, 6, WarnCount, 4, 0);
//// write_ndigit_number_u(10, 5, Vcorr, 4, 0);
 
 
if (get_key_press (1 << KEY_PLUS) | get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
{
Lipo_UOffset = Lipo_UOffset +10;
}
 
if (get_key_press (1 << KEY_MINUS) | get_key_long_rpt_sp ((1 << KEY_MINUS),3))
{
Lipo_UOffset = Lipo_UOffset -10;
}
//
}
 
 
while(!get_key_press (1 << KEY_ESC));
get_key_press(KEY_ALL);
return;
#endif
}
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/tools.h
0,0 → 1,41
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _tools_H
#define _tools_H
 
void PKT_Tools (void);
void Test_HB (void); // TestTool für Softwareentwicklung
 
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/tracking.c
0,0 → 1,203
/*
* tracking.c
*
* Created on: 13.02.2012
* Author: cebra
*/
 
#include "cpu.h"
#include <string.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "main.h"
#include "tracking.h"
#include <avr/pgmspace.h>
#include "fifo.h"
#include "bluetooth.h"
 
#ifdef HWVERSION3_9
 
#define MAX_POWER 10
#define getPower(x) (int32_t)pgm_read_dword(&powers[x])
const int32_t PROGMEM powers[MAX_POWER] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
 
HomePos_t MK_pos; // Home position of station
//GPS_Pos_t currentPos; // Current position of flying object
int8_t NMEAsatsInUse; // Number of satelites currently in use
int32_t NMEAlatitude, NMEAlongitude;
char NMEATime[9] = "GP:Ti:me";
//char NMEADate [6];
 
// Trying to avoid floating point maths here. Converts a floating point string to an integer with a smaller unit
// i.e. floatStrToInt("4.5", 2) = 4.5 * 1E2 = 450
int32_t floatStrToInt(const char *s, int32_t power1)
{ char *endPtr;
int32_t v = strtol(s, &endPtr, 10);
 
if (*endPtr == '.') {
for (s = endPtr + 1; *s && power1; s++) {
v = v * 10 + (*s - '0');
--power1;
}
}
if (power1) {
// Table to avoid multiple multiplications
v = v * getPower(power1);
}
return v;
}
 
// NMEA latitudes are in the form ddmm.mmmmm, we want an integer in 1E-7 degree steps
int32_t getLatitude(const char *s, const char *NS)
{ int32_t deg = (s[0] - '0') * 10 + s[1] - '0'; // First 2 chars are full degrees
int32_t min = floatStrToInt(&s[2], 6) / 6; // Minutes * 1E5 * 100 / 60 = Minutes * 1E6 / 6 = 1E-7 degree steps
 
deg = deg * 10000000 + min;
if (*NS == 'S') deg = -deg;
return deg;
}
 
 
// NMEA longitudes are in the form dddmm.mmmmm, we want an integer in 1E-7 degree steps
int32_t getLongitude(const char *s, const char *WE)
{ int32_t deg = ((s[0] - '0') * 10 + s[1] - '0') * 10 + s[2] - '0'; // First 3 chars are full degrees
int32_t min = floatStrToInt(&s[3], 6) / 6; // Minutes * 1E5 * 100 / 60 = Minutes * 1E6 / 6 = 1E-7 degree steps
 
deg = deg * 10000000 + min;
if (*WE == 'W') deg = -deg;
return deg;
}
 
void getNMEATime( const char *s)
{
uint8_t sem = 0;
uint8_t i;
 
for ( i=0;i < 6; i++ )
{
NMEATime[sem++] = s[i];
if (i==1 || i==3) NMEATime[sem++] = ':';
 
}
NMEATime[sem] = '\0';
}
 
 
 
 
//$GPGGA,191410.000,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45
// ^ ^ ^ ^ ^ ^ ^ ^
// | | | | | | | |
// | | | | | | | Höhe Geoid minus
// | | | | | | | Höhe Ellipsoid (WGS84)
// | | | | | | | in Metern (48.0,M)
// | | | | | | |
// | | | | | | Höhe über Meer (über Geoid)in Metern (351.5,M)
// | | | | | |
// | | | | | HDOP (horizontal dilution
// | | | | | of precision) Genauigkeit
// | | | | |
// | | | | Anzahl der erfassten Satelliten
// | | | |
// | | | Qualität der Messung
// | | | (0 = ungültig)
// | | | (1 = GPS)
// | | | (2 = DGPS)
// | | | (6 = geschätzt nur NMEA-0183 2.3)
// | | |
// | | Längengrad
// | |
// | Breitengrad
// |
// Uhrzeit
 
void Tracking_NMEA(void)
{
char *token;
 
 
if (decodeNMEA()) {
token = strtok((char*)data_decode, ",");
if (!strcmp(token, "GPGGA"))
{
// $GPGGA,220613.400,4843.5080,N,00922.9583,E,1,7,2.23,287.1,M,48.0,M,,
// Skip time
getNMEATime(strtok(0, ".")); //Zeit
 
strtok(0, ","); // Skip Rest von der Zeit
// Latitude
NMEAlatitude = getLatitude(strtok(0, ","), strtok(0, ",")); //N
// Longitude
NMEAlongitude = getLongitude(strtok(0, ","), strtok(0, ","));//E
// Signal valid? (Position Fix Indicator)
if (*strtok(0, ",") != '0')// Qualität
{
// Satellites in use
NMEAsatsInUse = atoi(strtok(0, ",")); //Anzahl Sats
 
// // Skip dilution
// strtok(0, ","); //Dilution
// // Altitude
// currentPos.Altitude = floatStrToInt(strtok(0, ","), 3);
// currentPos.Latitude = latitude;
// currentPos.Longitude = longitude;
//
// if ((coldstart) && (satsInUse > 5)) {
// // First position after reboot (or change of mode) will be the home position (facing north)
// MK_pos.Home_Lon = (double)currentPos.Longitude / 10000000.0;
// MK_pos.Home_Lat = (double)currentPos.Latitude / 10000000.0;
// MK_pos.Home_Lon7 = currentPos.Longitude;
// MK_pos.Home_Lat7 = currentPos.Latitude;
// MK_pos.Home_Alt = currentPos.Altitude;
// MK_pos.direction = 0;
// coldstart = 0;
// Double_Beep(DBEEPNMEAFIX, DBEEPMEAFIXP);
}
// do_tracking();
// }
}
}
// Displ_GPS(); // letzte empfangene Daten auch bei ausgeschalteter NMEA sichtbar
}
 
 
uint8_t hexDigitToInt(uint8_t digit)
{
if (digit >= '0' && digit <= '9') return digit - '0';
if (digit >= 'a' && digit <= 'f') return digit - 'a' + 10;
if (digit >= 'A' && digit <= 'F') return digit - 'A' + 10;
return 0;
}
 
 
uint8_t decodeNMEA(void)
{
uint8_t ret = 0;
uint8_t crc;
uint8_t tmpCRC = 0;
uint8_t i;
 
if (rx_ready == 1 && rx_len > 0) {
// Calculate checksum
for (i = 1; i < rx_len && rx_buffer[i] != '*'; i++) {
tmpCRC ^= rx_buffer[i];
}
if (rx_len >= i + 3) {
crc = hexDigitToInt(rx_buffer[i + 1]) << 4 | hexDigitToInt(rx_buffer[i + 2]);
if (crc == tmpCRC) {
rx_buffer[i] = 0;
strcpy(data_decode, &rx_buffer[1]); // Data without $, crc
ret = 1;
// wi232RX = 1; // So antenna-symbol will blink
// cli();
// rx_timeout = 0; // Got valid data, reset counter
// sei();
}
}
}
// if (rx_timeout < RX_TIME_OLD) wi232RX = 1;
rx_ready = 0; // Unlock buffer, next NMEA string can be received
return ret;
}
#endif
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/tracking.h
0,0 → 1,35
/*
* tracking.h
*
* Created on: 13.02.2012
* Author: cebra
*/
 
#ifndef TRACKING_H_
#define TRACKING_H_
 
 
 
 
 
 
typedef struct {
double Home_Lon; // in degrees
double Home_Lat; // in degrees
int32_t Home_Lon7; // in 1E-7 degrees
int32_t Home_Lat7; // in 1E-7 degrees
int32_t Home_Alt; // in mm
int16_t direction; // ermittelte Konstante aus Mittelposition Antenne geo.bearing - navi_data.CompassHeading
}__attribute__((packed)) HomePos_t;
 
extern int8_t NMEAsatsInUse; // Number of satelites currently in use
extern int32_t NMEAlatitude, NMEAlongitude;
extern char NMEATime[9];
 
void Tracking_NMEA(void);
uint8_t decodeNMEA(void);
 
 
 
 
#endif /* TRACKING_H_ */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/twimaster.c
0,0 → 1,511
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) Holger Buss, Ingo Busker
// + Nur f?r den privaten Gebrauch
// + www.MikroKopter.com
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt f?r das gesamte Projekt (Hardware, Software, Bin?rfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur f?r den privaten (nicht-kommerziellen) Gebrauch zul?ssig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Best?ckung und Verkauf von Platinen oder Baus?tzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder ver?ffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright m?ssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien ver?ffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gew?hr auf Fehlerfreiheit, Vollst?ndigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir ?bernehmen keinerlei Haftung f?r direkte oder indirekte Personen- oder Sachsch?den
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zul?ssig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/twi.h>
#include <util/delay.h>
#include "eeprom.h"
#include "twimaster.h"
#include "timer.h"
 
volatile uint8_t twi_state = TWI_STATE_MOTOR_TX;
volatile uint8_t dac_channel = 0;
volatile uint8_t motor_write = 0;
volatile uint8_t motor_read = 0;
volatile uint8_t I2C_TransferActive = 0;
 
volatile uint16_t I2CTimeout = 100;
 
uint8_t MissingMotor = 0;
uint8_t RequiredMotors = 1;
char MotorenEin = 0;
 
volatile uint8_t BLFlags = 0;
 
MotorData_t Motor[MAX_MOTORS];
 
// bit mask for witch BL the configuration should be sent
volatile uint16_t BLConfig_WriteMask = 0;
// bit mask for witch BL the configuration should be read
volatile uint16_t BLConfig_ReadMask = 0;
// buffer for BL Configuration
BLConfig_t BLConfig;
 
#define I2C_WriteByte(byte) {TWDR = byte; TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);}
#define I2C_ReceiveByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);}
#define I2C_ReceiveLastByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);}
 
#define SCL_CLOCK 200000L
#define I2C_TIMEOUT 30000
#define TWI_BASE_ADDRESS 0x52
 
 
 
 
uint8_t RAM_Checksum(uint8_t* pBuffer, uint16_t len)
{
uint8_t crc = 0xAA;
uint16_t i;
 
for(i=0; i<len; i++)
{
crc += pBuffer[i];
}
return crc;
}
 
 
 
 
//--------------------------------------------------------------
// Initialize I2C (TWI)
//
void I2C_Init(char clear)
{
uint8_t i;
uint8_t sreg = SREG;
cli();
 
// SDA is INPUT
DDRC &= ~(1<<DDC1);
// SCL is output
DDRC |= (1<<DDC0);
// pull up SDA
//PORTC |= (1<<PORTC0)|(1<<PORTC1);
 
// TWI Status Register
// prescaler 1 (TWPS1 = 0, TWPS0 = 0)
TWSR &= ~((1<<TWPS1)|(1<<TWPS0));
 
// set TWI Bit Rate Register
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
 
twi_state = TWI_STATE_MOTOR_TX;
motor_write = 0;
motor_read = 0;
 
if(clear) for(i=0; i < MAX_MOTORS; i++)
{
Motor[i].Version = 0;
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
Motor[i].State = 0;
Motor[i].ReadMode = BL_READMODE_STATUS;
Motor[i].Current = 0;
Motor[i].MaxPWM = 0;
Motor[i].Temperature = 0;
}
sei();
SREG = sreg;
}
 
 
//--------------------------------------------------------------
void I2C_Reset(void)
{
// stop i2c bus
I2C_Stop(TWI_STATE_MOTOR_TX);
TWCR = (1<<TWINT); // reset to original state incl. interrupt flag reset
TWAMR = 0;
TWAR = 0;
TWDR = 0;
TWSR = 0;
TWBR = 0;
I2C_TransferActive = 0;
I2C_Init(0);
I2C_WriteByte(0);
BLFlags |= BLFLAG_READ_VERSION;
}
 
 
//--------------------------------------------------------------
// I2C ISR
//
ISR (TWI_vect)
{
static uint8_t missing_motor = 0, motor_read_temperature = 0;
static uint8_t *pBuff = 0;
static uint8_t BuffLen = 0;
 
switch (twi_state++)
{
// Master Transmit
 
case 0: // TWI_STATE_MOTOR_TX
I2C_TransferActive = 1;
// skip motor if not used in mixer
// while((Mixer.Motor[motor_write][MIX_GAS] <= 0) && (motor_write < MAX_MOTORS)) motor_write++;
if(motor_write >= MAX_MOTORS) // writing finished, read now
{
BLConfig_WriteMask = 0; // reset configuration bitmask
motor_write = 0; // reset motor write counter for next cycle
twi_state = TWI_STATE_MOTOR_RX;
I2C_WriteByte(TWI_BASE_ADDRESS + TW_READ + (motor_read<<1) ); // select slave address in rx mode
}
else I2C_WriteByte(TWI_BASE_ADDRESS + TW_WRITE + (motor_write<<1) ); // select slave address in tx mode
break;
 
case 1: // Send Data to Slave
I2C_WriteByte(Motor[motor_write].SetPoint); // transmit setpoint
// if old version has been detected
if(!(Motor[motor_write].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
{
twi_state = 4; //jump over sending more data
}
// the new version has been detected
else if(!( (Motor[motor_write].SetPointLowerBits && (RequiredMotors < 7)) || BLConfig_WriteMask || BLConfig_ReadMask ) )
{ // or LowerBits are zero and no BlConfig should be sent (saves round trip time)
twi_state = 4; //jump over sending more data
}
break;
 
case 2: // lower bits of setpoint (higher resolution)
if ((0x0001<<motor_write) & BLConfig_ReadMask)
{
Motor[motor_write].ReadMode = BL_READMODE_CONFIG; // configuration request
}
else
{
Motor[motor_write].ReadMode = BL_READMODE_STATUS; // normal status request
}
// send read mode and the lower bits of setpoint
I2C_WriteByte((Motor[motor_write].ReadMode<<3)|(Motor[motor_write].SetPointLowerBits & 0x07));
// configuration tranmission request?
if((0x0001<<motor_write) & BLConfig_WriteMask)
{ // redirect tx pointer to configuration data
pBuff = (uint8_t*)&BLConfig; // select config for motor
BuffLen = sizeof(BLConfig_t);
}
else
{ // jump to end of transmission for that motor
twi_state = 4;
}
break;
 
case 3: // send configuration
I2C_WriteByte(*pBuff);
pBuff++;
if(--BuffLen > 0)
twi_state = 3; // if there are some bytes left
break;
 
case 4: // repeat case 0-4 for all motors
if(TWSR == TW_MT_DATA_NACK) // Data transmitted, NACK received
{
if(!missing_motor)
missing_motor = motor_write + 1;
 
if((Motor[motor_write].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK)
Motor[motor_write].State++; // increment error counter and handle overflow
}
I2C_Stop(TWI_STATE_MOTOR_TX);
I2CTimeout = 10;
motor_write++; // next motor
I2C_Start(TWI_STATE_MOTOR_TX); // Repeated start -> switch slave or switch Master Transmit -> Master Receive
break;
 
// Master Receive Data
case 5: // TWI_STATE_MOTOR_RX
if(TWSR != TW_MR_SLA_ACK) // SLA+R transmitted but no ACK received
{ // no response from the addressed slave received
Motor[motor_read].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit
if(++motor_read >= MAX_MOTORS)
{ // all motors read
motor_read = 0; // restart from beginning
BLConfig_ReadMask = 0; // reset read configuration bitmask
if(++motor_read_temperature >= MAX_MOTORS)
{
motor_read_temperature = 0;
BLFlags &= ~BLFLAG_READ_VERSION;
}
}
BLFlags |= BLFLAG_TX_COMPLETE;
I2C_Stop(TWI_STATE_MOTOR_TX);
I2C_TransferActive = 0;
}
else
{ // motor successfully addressed
Motor[motor_read].State |= MOTOR_STATE_PRESENT_MASK; // set present bit
if(Motor[motor_read].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)
{
// new BL found
switch(Motor[motor_read].ReadMode)
{
case BL_READMODE_CONFIG:
pBuff = (uint8_t*)&BLConfig;
BuffLen = sizeof(BLConfig_t);
break;
 
case BL_READMODE_STATUS:
pBuff = (uint8_t*)&(Motor[motor_read].Current);
if(motor_read == motor_read_temperature) BuffLen = 3; // read Current, MaxPwm & Temp
else BuffLen = 1;// read Current only
break;
}
}
else // old BL version
{
pBuff = (uint8_t*)&(Motor[motor_read].Current);
if((BLFlags & BLFLAG_READ_VERSION) || (motor_read == motor_read_temperature)) BuffLen = 2; // Current & MaxPwm
else BuffLen = 1; // read Current only
}
if(BuffLen == 1)
{
I2C_ReceiveLastByte(); // read last byte
}
else
{
I2C_ReceiveByte(); // read next byte
}
}
MissingMotor = missing_motor;
missing_motor = 0;
break;
 
case 6: // receive bytes
*pBuff = TWDR;
pBuff++;
BuffLen--;
if(BuffLen>1)
{
I2C_ReceiveByte(); // read next byte
}
else if (BuffLen == 1)
{
I2C_ReceiveLastByte(); // read last byte
}
else // nothing left
{
if(BLFlags & BLFLAG_READ_VERSION)
{
// if(!(FC_StatusFlags & FC_STATUS_MOTOR_RUN) && (Motor[motor_read].MaxPWM == 250) ) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK;
if((Motor[motor_read].MaxPWM == 250) ) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK;
else Motor[motor_read].Version = 0;
}
if(++motor_read >= MAX_MOTORS)
{
motor_read = 0; // restart from beginning
BLConfig_ReadMask = 0; // reset read configuration bitmask
if(++motor_read_temperature >= MAX_MOTORS)
{
motor_read_temperature = 0;
BLFlags &= ~BLFLAG_READ_VERSION;
}
}
I2C_Stop(TWI_STATE_MOTOR_TX);
BLFlags |= BLFLAG_TX_COMPLETE;
I2C_TransferActive = 0;
return;
}
twi_state = 6; // if there are some bytes left
break;
 
case 21:
I2C_WriteByte(0x80); // 2nd byte for all channels is 0x80
break;
 
case 22:
I2C_Stop(TWI_STATE_MOTOR_TX);
I2C_TransferActive = 0;
I2CTimeout = 10;
// repeat case 18...22 until all DAC Channels are updated
if(dac_channel < 2)
{
dac_channel ++; // jump to next channel
I2C_Start(TWI_STATE_GYRO_OFFSET_TX); // start transmission for next channel
}
else
{
dac_channel = 0; // reset dac channel counter
BLFlags |= BLFLAG_TX_COMPLETE;
}
break;
 
default:
I2C_Stop(TWI_STATE_MOTOR_TX);
BLFlags |= BLFLAG_TX_COMPLETE;
I2CTimeout = 10;
motor_write = 0;
motor_read = 0;
I2C_TransferActive = 0;
break;
}
 
}
 
 
//--------------------------------------------------------------
uint8_t I2C_WriteBLConfig(uint8_t motor)
{
uint8_t i;
uint16_t timer;
 
// if(MotorenEin || PC_MotortestActive)
// return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(MotorenEin)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(motor > MAX_MOTORS)
return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(motor)
{
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK))
return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL!
}
 
// check BL configuration to send
if(BLConfig.Revision != BLCONFIG_REVISION)
return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison
 
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1);
 
if(i != BLConfig.crc)
return(BLCONFIG_ERR_CHECKSUM); // bad checksum
 
timer = SetDelay(2000);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
// prepare the bitmask
if(!motor) // 0 means all
{
BLConfig_WriteMask = 0xFF; // all motors at once with the same configuration
}
else //only one specific motor
{
BLConfig_WriteMask = 0x0001<<(motor-1);
}
for(i = 0; i < MAX_MOTORS; i++)
{
if((0x0001<<i) & BLConfig_WriteMask)
{
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
}
}
 
motor_write = 0;
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms)
do
{
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}
while(BLConfig_WriteMask && !CheckDelay(timer)); // repeat until the BL config has been sent
 
if(BLConfig_WriteMask) return(BLCONFIG_ERR_MOTOR_NOT_EXIST);
return(BLCONFIG_SUCCESS);
}
 
 
//--------------------------------------------------------------
uint8_t I2C_ReadBLConfig(uint8_t motor)
{
uint8_t i;
uint16_t timer;
 
// if(MotorenEin || PC_MotortestActive)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(MotorenEin)
return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running!
 
if(motor > MAX_MOTORS)
return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(motor == 0)
return (BLCONFIG_ERR_READ_NOT_POSSIBLE);
 
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK))
return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist!
 
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK))
return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL!
 
timer = SetDelay(2000);
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
 
// prepare the bitmask
BLConfig_ReadMask = 0x0001<<(motor-1);
 
for(i = 0; i < MAX_MOTORS; i++)
{
if((0x0001<<i) & BLConfig_ReadMask)
{
Motor[i].SetPoint = 0;
Motor[i].SetPointLowerBits = 0;
}
}
 
motor_read = 0;
BLConfig.Revision = 0; // bad revision
BLConfig.crc = 0; // bad checksum
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms)
do
{
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer
}while(BLConfig_ReadMask && !CheckDelay(timer)); // repeat until the BL config has been received from all motors
// validate result
if(BLConfig.Revision != BLCONFIG_REVISION) return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1);
if(i != BLConfig.crc) return(BLCONFIG_ERR_CHECKSUM); // bad checksum
return(BLCONFIG_SUCCESS);
}
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/twimaster.h
0,0 → 1,80
#ifndef _I2C_MASTER_H
#define _I2C_MASTER_H
+
+#include <inttypes.h>
+#include "mk-data-structs.h"
+
+#define TWI_STATE_MOTOR_TX 0
+#define TWI_STATE_MOTOR_RX 5
+#define TWI_STATE_GYRO_OFFSET_TX 18
+
+extern volatile uint8_t twi_state;
+extern volatile uint8_t motor_write;
+extern volatile uint8_t motor_read;
+extern volatile uint8_t I2C_TransferActive;
+
+extern uint8_t MissingMotor;
+
+#define MAX_MOTORS 12
+#define MOTOR_STATE_PRESENT_MASK 0x80
+#define MOTOR_STATE_ERROR_MASK 0x7F
+#define MOTOR_STATE_NEW_PROTOCOL_MASK 0x01
+#define BLFLAG_TX_COMPLETE 0x01
+#define BLFLAG_READ_VERSION 0x02
+
+extern volatile uint8_t BLFlags;
+extern char MotorenEin;
+unsigned char MotorTest[16];
+#define BL_READMODE_STATUS 0
+#define BL_READMODE_CONFIG 16
+
+
+
+extern MotorData_t Motor[MAX_MOTORS];
+
+#define BLCONFIG_REVISION 2
+
+#define MASK_SET_PWM_SCALING 0x01
+#define MASK_SET_CURRENT_LIMIT 0x02
+#define MASK_SET_TEMP_LIMIT 0x04
+#define MASK_SET_CURRENT_SCALING 0x08
+#define MASK_SET_BITCONFIG 0x10
+#define MASK_RESET_CAPCOUNTER 0x20
+#define MASK_SET_DEFAULT_PARAMS 0x40
+#define MASK_SET_SAVE_EEPROM 0x80
+
+#define BITCONF_REVERSE_ROTATION 0x01
+#define BITCONF_RES1 0x02
+#define BITCONF_RES2 0x04
+#define BITCONF_RES3 0x08
+#define BITCONF_RES4 0x10
+#define BITCONF_RES5 0x20
+#define BITCONF_RES6 0x40
+#define BITCONF_RES7 0x80
+
+
+
+extern BLConfig_t BLConfig;
+
+extern volatile uint16_t I2CTimeout;
+
+void I2C_Init(char); // Initialize I2C
+#define I2C_Start(start_state) {twi_state = start_state; BLFlags &= ~BLFLAG_TX_COMPLETE; TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);}
+#define I2C_Stop(start_state) {twi_state = start_state; TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);}
+void I2C_Reset(void); // Reset I2C
+
+#define BLCONFIG_SUCCESS 0
+#define BLCONFIG_ERR_MOTOR_RUNNING 1
+#define BLCONFIG_ERR_MOTOR_NOT_EXIST 2
+#define BLCONFIG_ERR_HW_NOT_COMPATIBLE 3
+#define BLCONFIG_ERR_SW_NOT_COMPATIBLE 4
+#define BLCONFIG_ERR_CHECKSUM 5
+#define BLCONFIG_ERR_READ_NOT_POSSIBLE 6
+
+uint8_t I2C_WriteBLConfig(uint8_t motor);
+uint8_t I2C_ReadBLConfig(uint8_t motor);
+
+#endif
+
+
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/types.h
0,0 → 1,78
/**
*************************************************************************************************************
*
* \file types.h
* This file contains all generic type definitions that are used independendly of the project.
* The type definitions of this file should be used instead of the standard C-types to simplify
* porting of a particular software project.
*
* \author Ralf Hochhausen
* \date 22.04.2006
* \version 1.1
*
* (c) 2006 by Ralf Hochhausen (e-mail: micro@ralf-hochhausen.de)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* \b History:
*
* 22.04.2006 Ralf Hochhausen\n
* Revision 1.1\n
* Included GPL header
*
*************************************************************************************************************
*/
 
/**
* \defgroup TYPES Generic Type Definitions
* @{
*/
 
#ifndef __TYPES_H
#define __TYPES_H
 
#define NULL (void*)0 /**< NULL-pointer definition */
 
/**
* Boolean type enumeration
*
* \note
* Enumeration type is used here to simplify debugging of the software. Most debuggers will
* show the text "TRUE" or "FALSE" instead of "1" and "0". It should be noticed that
* enumeration types are normally 16bit wide => the compiler should be forced to use 8bit
* to safe RAM memory space if possible.
*
*/
typedef enum
{
FALSE, /**< FALSE -> 0 */
TRUE /**< TRUE -> 1 */
}BOOL;
 
/* Type definition of unsigned Datatypes */
typedef unsigned char uchar8; /**< 8Bit unsigned Datatype */
typedef unsigned int uint16; /**< 16Bit unsigned Datatype */
typedef unsigned long ulong32; /**< 32Bit unsigned Datatype */
 
/* Type definitions of signed Datatypes */
typedef signed char char8; /**< 8Bit signed Datatype */
typedef signed int int16; /**< 16Bit signed Datatype */
typedef signed long long32; /**< 32Bit signed Datatype */
 
/**
* @}
*/
 
#endif /* ifdef __TYPES_H */
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/uart1.c
0,0 → 1,328
/*************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: uart.c,v 1.6.2.2 2009/11/29 08:56:12 Peter Exp $
Software: AVR-GCC 4.1, AVR Libc 1.4.6 or higher
Hardware: any AVR with built-in UART,
License: GNU General Public License
 
DESCRIPTION:
An interrupt is generated when the UART has finished transmitting or
receiving a byte. The interrupt handling routines use circular buffers
for buffering received and transmitted data.
 
The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE variables define
the buffer size in bytes. Note that these variables must be a
power of 2.
 
USAGE:
Refere to the header file uart.h for a description of the routines.
See also example test_uart.c.
 
NOTES:
Based on Atmel Application Note AVR306
 
LICENSE:
Copyright (C) 2006 Peter Fleury
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
*************************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdbool.h>
#include "uart1.h"
#include "main.h"
#include "bluetooth.h"
#include "tracking.h"
//
// constants and macros
//
#if defined HWVERSION1_3W || defined HWVERSION3_9
 
// size of RX/TX buffers
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1)
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1)
 
#if ( UART_RX_BUFFER_SIZE & UART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
 
#if ( UART_TX_BUFFER_SIZE & UART_TX_BUFFER_MASK )
#error TX buffer size is not a power of 2
#endif
 
 
// ATmega with two USART
 
#define ATMEGA_USART1
 
#define UART1_STATUS UCSR1A
#define UART1_CONTROL UCSR1B
#define UART1_DATA UDR1
#define UART1_UDRIE UDRIE1
 
 
 
//
// module global variables
//
 
uint8_t receiveNMEA = false;
 
 
#if defined( ATMEGA_USART1 )
static volatile unsigned char UART1_TxBuf[UART_TX_BUFFER_SIZE];
static volatile unsigned char UART1_RxBuf[UART_RX_BUFFER_SIZE];
static volatile unsigned char UART1_TxHead;
static volatile unsigned char UART1_TxTail;
static volatile unsigned char UART1_RxHead;
static volatile unsigned char UART1_RxTail;
static volatile unsigned char UART1_LastRxError;
#endif
 
 
 
 
//
// these functions are only for ATmegas with two USART
//
 
 
#if defined( ATMEGA_USART1 )
 
//--------------------------------------------------------------
// Function: UART1 Receive Complete interrupt
// Purpose: called when the UART1 has received a character
//--------------------------------------------------------------
ISR(USART1_RX_vect)
{
unsigned char tmphead;
unsigned char data;
unsigned char usr;
unsigned char lastRxError;
 
 
// read UART status register and UART data register
usr = UART1_STATUS;
data = UART1_DATA;
 
lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) );
 
// calculate buffer index
tmphead = ( UART1_RxHead + 1) & UART_RX_BUFFER_MASK;
 
if ( tmphead == UART1_RxTail )
{
// error: receive buffer overflow
lastRxError = UART_BUFFER_OVERFLOW >> 8;
}
else
{
// store new index
UART1_RxHead = tmphead;
// store received data in buffer
UART1_RxBuf[tmphead] = data;
}
UART1_LastRxError = lastRxError;
 
#if defined HWVERSION3_9
 
if (receiveNMEA==true)
{
if (bt_receiveNMEA()) Tracking_NMEA();
 
}
#endif
}
 
 
//--------------------------------------------------------------
// Function: UART1 Data Register Empty interrupt
// Purpose: called when the UART1 is ready to transmit the next byte
//--------------------------------------------------------------
ISR(USART1_UDRE_vect)
{
unsigned char tmptail;
 
 
if ( UART1_TxHead != UART1_TxTail)
{
// calculate and store new buffer index
tmptail = (UART1_TxTail + 1) & UART_TX_BUFFER_MASK;
UART1_TxTail = tmptail;
// get one byte from buffer and write it to UART
UART1_DATA = UART1_TxBuf[tmptail]; // start transmission
}
else
{
// tx buffer empty, disable UDRE interrupt
UART1_CONTROL &= ~_BV(UART1_UDRIE);
}
}
 
 
//--------------------------------------------------------------
// Function: uart1_init()
// Purpose: initialize UART1 and set baudrate
// Input: baudrate using macro UART_BAUD_SELECT()
// Returns: none
//--------------------------------------------------------------
void uart1_init(unsigned int baudrate)
{
UART1_TxHead = 0;
UART1_TxTail = 0;
UART1_RxHead = 0;
UART1_RxTail = 0;
 
 
// Set baud rate
if ( baudrate & 0x8000 )
{
UART1_STATUS = (1<<U2X1); //Enable 2x speed
baudrate &= ~0x8000;
}
UBRR1H = (unsigned char)(baudrate>>8);
UBRR1L = (unsigned char) baudrate;
 
// Enable USART receiver and transmitter and receive complete interrupt
UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
 
// Set frame format: asynchronous, 8data, no parity, 1stop bit
#ifdef URSEL1
UCSR1C = (1<<URSEL1)|(3<<UCSZ10);
#else
UCSR1C = (3<<UCSZ10);
 
 
#endif
}
 
 
//--------------------------------------------------------------
// Function: uart1_getc()
// Purpose: return byte from ringbuffer
// Returns: lower byte: received byte from ringbuffer
// higher byte: last receive error
//--------------------------------------------------------------
unsigned int uart1_getc(void)
{
unsigned char tmptail;
unsigned char data;
 
 
if ( UART1_RxHead == UART1_RxTail )
{
return UART_NO_DATA; // no data available
}
 
// calculate /store buffer index
tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK;
UART1_RxTail = tmptail;
 
// get data from receive buffer
data = UART1_RxBuf[tmptail];
 
return (UART1_LastRxError << 8) + data;
 
}
 
 
//--------------------------------------------------------------
// Function: uart1_putc()
// Purpose: write byte to ringbuffer for transmitting via UART
// Input: byte to be transmitted
// Returns: 1 on succes, 0 if remote not ready
//--------------------------------------------------------------
int uart1_putc(unsigned char data)
{
unsigned char tmphead;
 
 
tmphead = (UART1_TxHead + 1) & UART_TX_BUFFER_MASK;
 
while ( tmphead == UART1_TxTail )
{;} // wait for free space in buffer
 
UART1_TxBuf[tmphead] = data;
UART1_TxHead = tmphead;
 
// enable UDRE interrupt
UART1_CONTROL |= _BV(UART1_UDRIE);
return (UART1_LastRxError << 8) + data;
}
 
 
//--------------------------------------------------------------
// Function: uart1_puts()
// Purpose: transmit string to UART1
// Input: string to be transmitted
// Returns: none
//--------------------------------------------------------------
void uart1_puts(const char *s )
{
while (*s)
uart1_putc(*s++);
}
 
 
//--------------------------------------------------------------
// Function: uart1_puts_p()
// Purpose: transmit string from program memory to UART1
// Input: program memory string to be transmitted
// Returns: none
//--------------------------------------------------------------
void uart1_puts_p(const char *progmem_s )
{
register char c;
while ( (c = pgm_read_byte(progmem_s++)) )
uart1_putc(c);
}
 
 
//--------------------------------------------------------------
// Function: uart1_available()
// Purpose: Determine the number of bytes waiting in the receive buffer
// Input: None
// Returns: Integer number of bytes in the receive buffer
//--------------------------------------------------------------
int uart1_available(void)
{
return (UART_RX_BUFFER_MASK + UART1_RxHead - UART1_RxTail) % UART_RX_BUFFER_MASK;
}
 
 
 
//--------------------------------------------------------------
// Function: uart1_flush()
// Purpose: Flush bytes waiting the receive buffer. Acutally ignores them.
// Input: None
// Returns: None
//--------------------------------------------------------------
void uart1_flush(void)
{
UART1_RxHead = UART1_RxTail;
}
 
 
 
 
 
 
 
 
 
#endif
#endif
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/uart1.h
0,0 → 1,173
/************************************************************************
Title: Interrupt UART library with receive/transmit circular buffers
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: uart.h,v 1.8.2.1 2007/07/01 11:14:38 peter Exp $
Software: AVR-GCC 4.1, AVR Libc 1.4
Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
License: GNU General Public License
Usage: see Doxygen manual
 
LICENSE:
Copyright (C) 2006 Peter Fleury
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
************************************************************************/
 
//
// @defgroup pfleury_uart UART Library
// @code #include <uart.h> @endcode
//
// @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.
//
// This library can be used to transmit and receive data through the built in UART.
//
// An interrupt is generated when the UART has finished transmitting or
// receiving a byte. The interrupt handling routines use circular buffers
// for buffering received and transmitted data.
//
// The UART_RX_BUFFER_SIZE and UART_TX_BUFFER_SIZE constants define
// the size of the circular buffers in bytes. Note that these constants must be a power of 2.
// You may need to adapt this constants to your target and your application by adding
// CDEFS += -DUART_RX_BUFFER_SIZE=nn -DUART_RX_BUFFER_SIZE=nn to your Makefile.
//
// @note Based on Atmel Application Note AVR306
// @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury
//
 
#ifndef UART_H
#define UART_H
 
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
#endif
 
 
// constants and macros
 
 
// @brief UART Baudrate Expression
// @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
// @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
//
#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16l)-1)
 
// @brief UART Baudrate Expression for ATmega double speed mode
// @param xtalcpu system clock in Mhz, e.g. 4000000L for 4Mhz
// @param baudrate baudrate in bps, e.g. 1200, 2400, 9600
//
#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) (((xtalCpu)/((baudRate)*8l)-1)|0x8000)
 
 
// Size of the circular receive buffer, must be power of 2
#ifndef UART_RX_BUFFER_SIZE
#define UART_RX_BUFFER_SIZE 128
#endif
 
// Size of the circular transmit buffer, must be power of 2
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 64
#endif
 
// test if the size of the circular buffers fits into SRAM
#if ( (UART_RX_BUFFER_SIZE+UART_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) )
#error "size of UART_RX_BUFFER_SIZE + UART_TX_BUFFER_SIZE larger than size of SRAM"
#endif
 
//global variable
extern uint8_t receiveNMEA;
 
 
// high byte error return code of uart_getc()
 
#define UART_FRAME_ERROR 0x0800 // Framing Error by UART
#define UART_OVERRUN_ERROR 0x0400 // Overrun condition by UART
#define UART_BUFFER_OVERFLOW 0x0200 // receive ringbuffer overflow
#define UART_NO_DATA 0x0100 // no receive data available
 
#define TRACKING_RSSI 1
#define TRACKING_GPS 2
#define TRACKING_MKCOCKPIT 3
#define TRACKING_NMEA 4
//
// function prototypes
//
 
//
// @brief Initialize UART and set baudrate
// @param baudrate Specify baudrate using macro UART_BAUD_SELECT()
// @return none
//
extern void uart_init(unsigned int baudrate);
 
 
//
// @brief Get received byte from ringbuffer
//
// Returns in the lower byte the received character and in the
// higher byte the last receive error.
// UART_NO_DATA is returned when no data is available.
//
// @param void
// @return lower byte: received byte from ringbuffer
// @return higher byte: last receive status
// - \b 0 successfully received data from UART
// - \b UART_NO_DATA
// <br>no receive data available
// - \b UART_BUFFER_OVERFLOW
// <br>Receive ringbuffer overflow.
// We are not reading the receive buffer fast enough,
// one or more received character have been dropped
// - \b UART_OVERRUN_ERROR
// <br>Overrun condition by UART.
// A character already present in the UART UDR register was
// not read by the interrupt handler before the next character arrived,
// one or more received characters have been dropped.
// - \b UART_FRAME_ERROR
// <br>Framing Error by UART
//
extern unsigned int uart_getc(void);
 
 
//
// @brief Put byte to ringbuffer for transmitting via UART
// @param data byte to be transmitted
// @return none
//
 
 
 
 
// @brief Initialize USART1 (only available on selected ATmegas) @see uart_init
extern void uart1_init(unsigned int baudrate);
 
// @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc
extern unsigned int uart1_getc(void);
 
// @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc
//extern void uart1_putc(unsigned char data);
extern int uart1_putc(unsigned char data);
 
// @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts
extern void uart1_puts(const char *s );
 
// @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p
extern void uart1_puts_p(const char *s );
 
// @brief Macro to automatically put a string constant into program memory
#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
 
extern char *utoa1(char* buffer, const unsigned int size, unsigned int value);
 
 
#endif // UART_H
 
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/usart.c
0,0 → 1,671
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#include "cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <stdarg.h>
 
#include "main.h"
#include "usart.h"
#include "lcd.h"
#include "timer.h"
#include "uart1.h"
#include "eeprom.h"
#include "osd.h"
 
 
uint8_t buffer[30];
 
volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
volatile uint8_t txd_complete = TRUE;
 
volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
volatile uint8_t rxd_buffer_locked = FALSE;
volatile uint8_t ReceivedBytes = 0;
volatile uint8_t *pRxData = 0;
volatile uint8_t RxDataLen = 0;
 
volatile uint16_t stat_crc_error = 0;
volatile uint16_t stat_overflow_error = 0;
 
volatile uint8_t rx_byte;
volatile uint8_t rxFlag = 0;
 
 
#define UART_RXBUFSIZE 64
#define UART_NO_DATA 0x0100 /* no receive data available */
 
volatile static uint8_t rxbuf[UART_RXBUFSIZE];
volatile static uint8_t *volatile rxhead, *volatile rxtail;
 
 
/*
 
//-----------------------------------------------------------------------------
// USART1 transmitter ISR
ISR (USART1_TX_vect)
{
static uint16_t ptr_txd1_buffer = 0;
uint8_t tmp_tx1;
 
if(!txd1_complete) // transmission not completed
{
ptr_txd1_buffer++; // [0] was already sent
tmp_tx1 = txd1_buffer[ptr_txd1_buffer];
// if terminating character or end of txd buffer was reached
if((tmp_tx1 == '\r') || (ptr_txd1_buffer == TXD_BUFFER_LEN))
{
ptr_txd1_buffer = 0; // reset txd pointer
txd1_complete = TRUE; // stop transmission
}
UDR1 = tmp_tx1; // send current byte will trigger this ISR again
}
// transmission completed
else ptr_txd1_buffer = 0;
}
 
*/
 
 
#ifdef USART_INT
//-----------------------------------------------------------------------------
// USART0 transmitter ISR
ISR (USART_TX_vect)
{
static uint16_t ptr_txd_buffer = 0;
uint8_t tmp_tx;
 
if(!txd_complete) // transmission not completed
{
ptr_txd_buffer++; // [0] was already sent
tmp_tx = txd_buffer[ptr_txd_buffer];
// if terminating character or end of txd buffer was reached
if((tmp_tx == '\r') || (ptr_txd_buffer == TXD_BUFFER_LEN))
{
ptr_txd_buffer = 0; // reset txd pointer
txd_complete = TRUE; // stop transmission
}
UDR = tmp_tx; // send current byte will trigger this ISR again
}
// transmission completed
else ptr_txd_buffer = 0;
}
#endif
 
 
 
 
 
//-----------------------------------------------------------------------------
//
 
//
//uint8_t uart_getc_nb(uint8_t *c)
//{
// if (rxhead==rxtail) return 0;
// *c = *rxtail;
// if (++rxtail == (rxbuf + UART_RXBUFSIZE)) rxtail = rxbuf;
// return 1;
//}
 
 
 
 
ISR (USART0_RX_vect)
{
static uint16_t crc;
static uint8_t ptr_rxd_buffer = 0;
uint8_t crc1, crc2;
uint8_t c;
// IdleTimer = 0;
if (current_hardware == Wi232)
{
// rx_byte = c;
// rxFlag = 1;
int diff;
uint8_t c;
c=UDR;
diff = rxhead - rxtail;
if (diff < 0) diff += UART_RXBUFSIZE;
if (diff < UART_RXBUFSIZE -1)
{
*rxhead = c;
++rxhead;
if (rxhead == (rxbuf + UART_RXBUFSIZE)) rxhead = rxbuf;
};
// USART_putc (c);
return;
}
 
 
if (current_hardware == MKGPS)
{
// rx_byte = c;
// rxFlag = 1;
int diff;
uint8_t c;
c=UDR;
diff = rxhead - rxtail;
if (diff < 0) diff += UART_RXBUFSIZE;
if (diff < UART_RXBUFSIZE -1)
{
*rxhead = c;
++rxhead;
if (rxhead == (rxbuf + UART_RXBUFSIZE)) rxhead = rxbuf;
};
 
return;
}
 
c = UDR; // catch the received byte
if (OSD_active && OSD_SendOSD) // Daten an SV2 senden
uart1_putc(c);
 
 
if (rxd_buffer_locked)
return; // if rxd buffer is locked immediately return
 
// the rxd buffer is unlocked
if ((ptr_rxd_buffer == 0) && (c == '#')) // if rxd buffer is empty and syncronisation character is received
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
crc = c; // init crc
}
else if (ptr_rxd_buffer < RXD_BUFFER_LEN) // collect incomming bytes
{
if(c != '\r') // no termination character
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
}
else // termination character was received
{
// the last 2 bytes are no subject for checksum calculation
// they are the checksum itself
crc -= rxd_buffer[ptr_rxd_buffer-2];
crc -= rxd_buffer[ptr_rxd_buffer-1];
// calculate checksum from transmitted data
crc %= 4096;
crc1 = '=' + crc / 64;
crc2 = '=' + crc % 64;
// compare checksum to transmitted checksum bytes
if((crc1 == rxd_buffer[ptr_rxd_buffer-2]) && (crc2 == rxd_buffer[ptr_rxd_buffer-1]))
{ // checksum valid
rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character
ReceivedBytes = ptr_rxd_buffer + 1;// store number of received bytes
if (mode == rxd_buffer[2])
{
rxd_buffer_locked = TRUE; // lock the rxd buffer
// if 2nd byte is an 'R' enable watchdog that will result in an reset
if(rxd_buffer[2] == 'R') {wdt_enable(WDTO_250MS);} // Reset-Commando
}
}
else
{ // checksum invalid
stat_crc_error++;
rxd_buffer_locked = FALSE; // unlock rxd buffer
}
ptr_rxd_buffer = 0; // reset rxd buffer pointer
}
}
else // rxd buffer overrun
{
stat_overflow_error++;
ptr_rxd_buffer = 0; // reset rxd buffer
rxd_buffer_locked = FALSE; // unlock rxd buffer
}
}
 
 
//-----------------------------------------------------------------------------
// Function: uart0_getc()
// Purpose: return byte from ringbuffer
// Returns: lower byte: received byte from ringbuffer
// higher byte: last receive error
//-----------------------------------------------------------------------------
char USART_getc(void)
{
char val;
 
// while(rxhead==rxtail) ;
if (rxhead==rxtail)
return val=0;
// IdleTimer = 0;
val = *rxtail;
if (++rxtail == (rxbuf + UART_RXBUFSIZE))
rxtail = rxbuf;
 
return val;
}
 
 
uint8_t uart_getc_nb(uint8_t *c)
{
if (rxhead==rxtail)
return 0;
// IdleTimer = 0;
*c = *rxtail;
if (++rxtail == (rxbuf + UART_RXBUFSIZE))
rxtail = rxbuf;
return 1;
}
//-----------------------------------------------------------------------------
//
 
 
 
 
 
//-----------------------------------------------------------------------------
//
void USART_Init (unsigned int baudrate)
{
// set clock divider
// #undef BAUD
// #define BAUD baudrate
// #include <util/setbaud.h>
// UBRRH = UBRRH_VALUE;
// UBRRL = UBRRL_VALUE;
 
//#ifndef F_CPU
///* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
// F_CPU im Makefile definiert werden, eine nochmalige Definition
// hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
// #ifndef/#endif
//
// Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
// verwendet wird und dort eine andere, nicht zur Hardware passende
// Taktrate eingestellt ist: Dann wird die folgende Definition
// nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
// von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
// noch nicht definiert: */
//#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
//#define F_CPU 18432000UL // Systemtakt in Hz - Definition als unsigned long beachten
// Ohne ergeben sich unten Fehler in der Berechnung
//#endif
//#define BAUD 115200UL // Baudrate
//
//// Berechnungen
//#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
//#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
//#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
//
//
//#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
// #error "Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!"
//#endif
 
 
UBRRH = (unsigned char)(baudrate>>8);
UBRRL = (unsigned char) baudrate;
// UBRRH = (unsigned char)(BAUD_REAL>>8);
// UBRRL = (unsigned char) BAUD_REAL;
 
#if USE_2X
UCSRA |= (1 << U2X); // enable double speed operation
#else
UCSRA &= ~(1 << U2X); // disable double speed operation
#endif
 
// set 8N1
#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega32__)
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
#else
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);
#endif
UCSRB &= ~(1 << UCSZ2);
 
// flush receive buffer
while ( UCSRA & (1 << RXC) ) UDR;
 
UCSRB |= (1 << RXEN) | (1 << TXEN);
#ifdef USART_INT
UCSRB |= (1 << RXCIE) | (1 << TXCIE);
#else
UCSRB |= (1 << RXCIE);
#endif
 
rxhead = rxtail = rxbuf;
 
}
 
 
 
 
 
//-----------------------------------------------------------------------------
// disable the txd pin of usart
void USART_DisableTXD (void)
{
#ifdef USART_INT
UCSRB &= ~(1 << TXCIE); // disable TX-Interrupt
#endif
UCSRB &= ~(1 << TXEN); // disable TX in USART
DDRB &= ~(1 << DDB3); // set TXD pin as input
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
}
 
//-----------------------------------------------------------------------------
// enable the txd pin of usart
void USART_EnableTXD (void)
{
DDRB |= (1 << DDB3); // set TXD pin as output
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
UCSRB |= (1 << TXEN); // enable TX in USART
#ifdef USART_INT
UCSRB |= (1 << TXCIE); // enable TX-Interrupt
#endif
}
 
//-----------------------------------------------------------------------------
// short script to directly send a request thorugh usart including en- and disabling it
// where <address> is the address of the receipient, <label> is which data set to request
// and <ms> represents the milliseconds delay between data
void USART_request_mk_data (uint8_t cmd, uint8_t addr, uint8_t ms)
{
USART_EnableTXD (); // re-enable TXD pin
 
unsigned char mstenth = ms/10;
SendOutData(cmd, addr, 1, &mstenth, 1);
// wait until command transmitted
while (txd_complete == FALSE);
 
USART_DisableTXD (); // disable TXD pin again
}
 
//-----------------------------------------------------------------------------
//
void USART_putc (char c)
{
#ifdef USART_INT
#else
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
#endif
}
 
 
 
//-----------------------------------------------------------------------------
//
void USART_puts (char *s)
{
#ifdef USART_INT
#else
while (*s)
{
USART_putc (*s);
s++;
}
#endif
}
 
//-----------------------------------------------------------------------------
//
void USART_puts_p (const char *s)
{
#ifdef USART_INT
#else
while (pgm_read_byte(s))
{
USART_putc (pgm_read_byte(s));
s++;
}
#endif
}
 
//-----------------------------------------------------------------------------
//
void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...) // uint8_t *pdata, uint8_t len, ...
{
va_list ap;
uint16_t pt = 0;
uint8_t a,b,c;
uint8_t ptr = 0;
uint16_t tmpCRC = 0;
 
uint8_t *pdata = 0;
int len = 0;
 
txd_buffer[pt++] = '#'; // Start character
txd_buffer[pt++] = 'a' + addr; // Address (a=0; b=1,...)
txd_buffer[pt++] = cmd; // Command
 
va_start(ap, numofbuffers);
if(numofbuffers)
{
pdata = va_arg (ap, uint8_t*);
len = va_arg (ap, int);
ptr = 0;
numofbuffers--;
}
 
while(len)
{
if(len)
{
a = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
a = 0;
 
if(len)
{
b = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
b = 0;
 
if(len)
{
c = pdata[ptr++];
len--;
if((!len) && numofbuffers)
{
pdata = va_arg(ap, uint8_t*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else
c = 0;
 
txd_buffer[pt++] = '=' + (a >> 2);
txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
txd_buffer[pt++] = '=' + ( c & 0x3f);
}
va_end(ap);
 
for(a = 0; a < pt; a++)
{
tmpCRC += txd_buffer[a];
}
tmpCRC %= 4096;
txd_buffer[pt++] = '=' + tmpCRC / 64;
txd_buffer[pt++] = '=' + tmpCRC % 64;
txd_buffer[pt++] = '\r';
 
txd_complete = FALSE;
#ifdef USART_INT
UDR = txd_buffer[0]; // initiates the transmittion (continued in the TXD ISR)
#else
for(a = 0; a < pt; a++)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = txd_buffer[a];
}
txd_complete = TRUE;
#endif
}
 
//-----------------------------------------------------------------------------
//
void Decode64 (void)
{
uint8_t a,b,c,d;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
 
while (len)
{
a = rxd_buffer[ptrIn++] - '=';
b = rxd_buffer[ptrIn++] - '=';
c = rxd_buffer[ptrIn++] - '=';
d = rxd_buffer[ptrIn++] - '=';
//if(ptrIn > ReceivedBytes - 3) break;
 
if (len--)
rxd_buffer[ptrOut++] = (a << 2) | (b >> 4);
else
break;
 
if (len--)
rxd_buffer[ptrOut++] = ((b & 0x0f) << 4) | (c >> 2);
else
break;
 
if (len--)
rxd_buffer[ptrOut++] = ((c & 0x03) << 6) | d;
else
break;
}
pRxData = &rxd_buffer[3];
RxDataLen = ptrOut - 3;
}
 
 
//-----------------------------------------------------------------------------
//
void SwitchToNC (void)
{
 
if(hardware == NC)
{
// switch to NC
USART_putc (0x1b);
USART_putc (0x1b);
USART_putc (0x55);
USART_putc (0xaa);
USART_putc (0x00);
current_hardware = NC;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
 
 
//-----------------------------------------------------------------------------
//
void SwitchToWi232 (void)
{
 
// if(hardware == NC)
{
// switch to Wi232
current_hardware = Wi232;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToFC (void)
{
uint8_t cmd;
 
if (current_hardware == NC)
{
// switch to FC
cmd = 0x00; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = FC;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToMAG (void)
{
uint8_t cmd;
 
if (current_hardware == NC)
{
// switch to MK3MAG
cmd = 0x01; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = MK3MAG;
_delay_ms (50);
}
}
 
//-----------------------------------------------------------------------------
//
void SwitchToGPS (void)
{
uint8_t cmd;
if (current_hardware == NC)
{
// switch to MKGPS
cmd = 0x02; // 0 = FC, 1 = MK3MAG, 2 = MKGPS
SendOutData('u', ADDRESS_NC, 1, &cmd, 1);
current_hardware = MKGPS;
_delay_ms (50);
}
}
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/usart.h
0,0 → 1,149
/*****************************************************************************
* Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de *
* Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net *
* Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
* Copyright (C) 2011 Harald Bongartz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* http://www.mikrokopter.de *
* Gregor "killagreg" Stobrawa for his version of the MK code *
* Thomas Kaiser "thkais" for the original project. See *
* http://www.ft-fanpage.de/mikrokopter/ *
* http://forum.mikrokopter.de/topic-4061-1.html *
* Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
* http://www.mylifesucks.de/oss/c-osd/ *
* Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
*****************************************************************************/
 
 
#ifndef _USART_H
#define _USART_H
 
//--------------------------------------------------------------
//
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
 
// addresses
#define ADDRESS_ANY 0
#define ADDRESS_FC 1
#define ADDRESS_NC 2
#define ADDRESS_MAG 3
 
// must be at least 4('#'+Addr+'CmdID'+'\r')+ (80 * 4)/3 = 111 bytes
#define TXD_BUFFER_LEN 60
#define RXD_BUFFER_LEN 180
 
// Baud rate of the USART
#define USART_BAUD 57600
//#define USART_BAUD 125000
 
//--------------------------------------------------------------
//
extern uint8_t buffer[30];
 
extern volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
extern volatile uint8_t txd_complete;
extern volatile uint8_t txd1_buffer[TXD_BUFFER_LEN];
extern volatile uint8_t txd1_complete;
extern volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
extern volatile uint8_t rxd_buffer_locked;
extern volatile uint8_t ReceivedBytes;
extern volatile uint8_t *pRxData;
extern volatile uint8_t RxDataLen;
 
extern volatile uint16_t stat_crc_error;
extern volatile uint16_t stat_overflow_error;
 
extern volatile uint8_t rxFlag;
extern volatile uint8_t rx_byte;
 
//--------------------------------------------------------------
//
void USART_Init (unsigned int baudrate);
void USART_DisableTXD (void);
void USART_EnableTXD (void);
void USART_request_mk_data (uint8_t cmd, uint8_t addr, uint8_t ms);
 
void USART_putc (char c);
void USART_puts (char *s);
void USART_puts_p (const char *s);
 
 
extern char USART_getc(void);
void SendOutData (uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...); // uint8_t *pdata, uint8_t len, ...
//void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, uint8_t *pdata, uint8_t len); // uint8_t *pdata, uint8_t len, ...
void Decode64 (void);
 
void SwitchToNC (void);
void SwitchToFC (void);
void SwitchToMAG (void);
void SwitchToGPS (void);
void SwitchToWi232 (void);
void debug1(void);
 
uint8_t uart_getc_nb(uint8_t*);
 
//--------------------------------------------------------------
//Anpassen der seriellen Schnittstellen Register
#define USART_RXC_vect USART0_RX_vect
//--------------------------------------------------------------
#define UCSRA UCSR0A
#define UCSRB UCSR0B
#define UCSRC UCSR0C
#define UDR UDR0
#define UBRRL UBRR0L
#define UBRRH UBRR0H
 
// UCSRA
#define RXC RXC0
#define TXC TXC0
#define UDRE UDRE0
#define FE FE0
#define UPE UPE0
#define U2X U2X0
#define MPCM MPCM0
 
// UCSRB
#define RXCIE RXCIE0
#define TXCIE TXCIE0
#define UDRIE UDRIE0
#define TXEN TXEN0
#define RXEN RXEN0
#define UCSZ2 UCSZ02
#define RXB8 RXB80
#define TXB8 TXB80
 
// UCSRC
#define UMSEL1 UMSEL01
#define UMSEL0 UMSEL00
#define UPM1 UPM01
#define UPM0 UPM00
#define USBS USBS0
#define UCSZ1 UCSZ01
#define UCSZ0 UCSZ00
#define UCPOL UCPOL0
 
 
#endif
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/waypoints.c
0,0 → 1,347
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <string.h>
#include "91x_lib.h"
#include "waypoints.h"
#include "uart1.h"
 
// the waypoints list
#define MAX_LIST_LEN 31
 
Point_t PointList[MAX_LIST_LEN];
u8 WPIndex = 0; // list index of GPS point representig the current WP, can be maximal WPCount
u8 POIIndex = 0; // list index of GPS Point representing the current POI, can be maximal WPCount
u8 WPCount = 0; // number of waypoints
u8 PointCount = 0; // number of wp in the list can be maximal equal to MAX_LIST_LEN
u8 POICount = 0;
 
u8 WPActive = FALSE;
 
u8 PointList_Init(void)
{
return PointList_Clear();
}
 
u8 PointList_Clear(void)
{
u8 i;
WPIndex = 0; // real list position are 1 ,2, 3 ...
POIIndex = 0; // real list position are 1 ,2, 3 ...
WPCount = 0; // no waypoints
POICount = 0;
PointCount = 0; // no contents
WPActive = FALSE;
NaviData.WaypointNumber = WPCount;
NaviData.WaypointIndex = 0;
 
for(i = 0; i < MAX_LIST_LEN; i++)
{
PointList[i].Position.Status = INVALID;
PointList[i].Position.Latitude = 0;
PointList[i].Position.Longitude = 0;
PointList[i].Position.Altitude = 0;
PointList[i].Heading = 361; // invalid value
PointList[i].ToleranceRadius = 0; // in meters, if the MK is within that range around the target, then the next target is triggered
PointList[i].HoldTime = 0; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
PointList[i].Type = POINT_TYPE_INVALID;
PointList[i].Event_Flag = 0; // future implementation
PointList[i].AltitudeRate = 0; // no change of setpoint
}
return TRUE;
}
 
u8 PointList_GetCount(void)
{
return PointCount; // number of points in the list
}
 
Point_t* PointList_GetAt(u8 index)
{
if((index > 0) && (index <= PointCount)) return(&(PointList[index-1])); // return pointer to this waypoint
else return(NULL);
}
 
u8 PointList_SetAt(Point_t* pPoint)
{
// if index is in range
if((pPoint->Index > 0) && (pPoint->Index <= MAX_LIST_LEN))
{
// check list entry before update
switch(PointList[pPoint->Index-1].Type)
{
case POINT_TYPE_INVALID: // was invalid
switch(pPoint->Type)
{
default:
case POINT_TYPE_INVALID:
// nothing to do
break;
 
case POINT_TYPE_WP:
WPCount++;
PointCount++;
break;
case POINT_TYPE_POI:
POICount++;
PointCount++;
break;
}
break;
case POINT_TYPE_WP: // was a waypoint
switch(pPoint->Type)
{
case POINT_TYPE_INVALID:
WPCount--;
PointCount--;
break;
 
default:
case POINT_TYPE_WP:
//nothing to do
break;
case POINT_TYPE_POI:
POICount++;
WPCount--;
break;
}
break;
case POINT_TYPE_POI: // was a poi
switch(pPoint->Type)
{
case POINT_TYPE_INVALID:
POICount--;
PointCount--;
break;
 
case POINT_TYPE_WP:
WPCount++;
POICount--;
break;
case POINT_TYPE_POI:
default:
// nothing to do
break;
}
break;
}
memcpy(&PointList[pPoint->Index-1], pPoint, sizeof(Point_t)); // copy data to list entry
NaviData.WaypointNumber = WPCount;
return pPoint->Index;
}
else return(0);
}
 
// returns the pointer to the first waypoint within the list
Point_t* PointList_WPBegin(void)
{
u8 i;
WPIndex = 0; // set list position invalid
 
if(WPActive == FALSE) return(NULL);
 
POIIndex = 0; // set invalid POI
if(PointCount > 0)
{
// search for first wp in list
for(i = 0; i <MAX_LIST_LEN; i++)
{
if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID))
{
WPIndex = i + 1;
break;
}
}
if(WPIndex) // found a WP in the list
{
NaviData.WaypointIndex = 1;
// update index to POI
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
}
else // some points in the list but no WP found
{
NaviData.WaypointIndex = 0;
//Check for an existing POI
for(i = 0; i < MAX_LIST_LEN; i++)
{
if((PointList[i].Type == POINT_TYPE_POI) && (PointList[i].Position.Status != INVALID))
{
POIIndex = i + 1;
break;
}
}
}
}
else // no point in the list
{
POIIndex = 0;
NaviData.WaypointIndex = 0;
}
 
if(WPIndex) return(&(PointList[WPIndex-1]));
else return(NULL);
}
 
// returns the last waypoint
Point_t* PointList_WPEnd(void)
{
u8 i;
WPIndex = 0; // set list position invalid
POIIndex = 0; // set invalid
 
if(WPActive == FALSE) return(NULL);
 
if(PointCount > 0)
{
// search backward!
for(i = 1; i <= MAX_LIST_LEN; i++)
{
if((PointList[MAX_LIST_LEN - i].Type == POINT_TYPE_WP) && (PointList[MAX_LIST_LEN - i].Position.Status != INVALID))
{
WPIndex = MAX_LIST_LEN - i + 1;
break;
}
}
if(WPIndex) // found a WP within the list
{
NaviData.WaypointIndex = WPCount;
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
}
else // list contains some points but no WP in the list
{
// search backward for a POI!
for(i = 1; i <= MAX_LIST_LEN; i++)
{
if((PointList[MAX_LIST_LEN - i].Type == POINT_TYPE_POI) && (PointList[MAX_LIST_LEN - i].Position.Status != INVALID))
{
POIIndex = MAX_LIST_LEN - i + 1;
break;
}
}
NaviData.WaypointIndex = 0;
}
}
else // no point in the list
{
POIIndex = 0;
NaviData.WaypointIndex = 0;
}
if(WPIndex) return(&(PointList[WPIndex-1]));
else return(NULL);
}
 
// returns a pointer to the next waypoint or NULL if the end of the list has been reached
Point_t* PointList_WPNext(void)
{
u8 wp_found = 0;
if(WPActive == FALSE) return(NULL);
if(WPIndex < MAX_LIST_LEN) // if there is a next entry in the list
{
u8 i;
for(i = WPIndex; i < MAX_LIST_LEN; i++) // start search for next at next list entry
{
if((PointList[i].Type == POINT_TYPE_WP) && (PointList[i].Position.Status != INVALID)) // jump over POIs
{
wp_found = i+1;
break;
}
}
}
if(wp_found)
{
WPIndex = wp_found; // update list position
NaviData.WaypointIndex++;
if(PointList[WPIndex-1].Heading < 0) POIIndex = (u8)(-PointList[WPIndex-1].Heading);
else POIIndex = 0;
return(&(PointList[WPIndex-1])); // return pointer to this waypoint
}
else
{ // no next wp found
NaviData.WaypointIndex = 0;
POIIndex = 0;
return(NULL);
}
}
 
void PointList_WPActive(u8 set)
{
if(set)
{
WPActive = TRUE;
PointList_WPBegin(); // uopdates POI index
}
else
{
WPActive = FALSE;
POIIndex = 0; // disable POI also
}
}
Point_t* PointList_GetPOI(void)
{
return PointList_GetAt(POIIndex);
}
 
/Transportables_Koptertool/branch/PKT_V363a_V088n_MartinR/waypoints.h
0,0 → 1,56
#ifndef _WAYPOINTS_H
#define _WAYPOINTS_H
 
//#include "ubx.h"
 
#define POINT_TYPE_INVALID 255
#define POINT_TYPE_WP 0
#define POINT_TYPE_POI 1
 
 
typedef struct
{
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
u8 Status;// validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct
{
GPS_Pos_t Position; // the gps position of the waypoint, see ubx.h for details
s16 Heading; // orientation, 0 no action, 1...360 fix heading, neg. = Index to POI in WP List
u8 ToleranceRadius; // in meters, if the MK is within that range around the target, then the next target is triggered
u8 HoldTime; // in seconds, if the was once in the tolerance area around a WP, this time defines the delay before the next WP is triggered
u8 Event_Flag; // future implementation
u8 Index; // to indentify different waypoints, workaround for bad communications PC <-> NC
u8 Type; // typeof Waypoint
u8 WP_EventChannelValue; //
u8 AltitudeRate; // rate to change the setpoint
u8 reserve[8]; // reserve
} __attribute__((packed)) Point_t;
 
// Init List, return TRUE on success
u8 PointList_Init(void);
// Clear List, return TRUE on success
u8 PointList_Clear(void);
// Returns number of points in the list
u8 PointList_GetCount(void);
// return pointer to point at position
Point_t* PointList_GetAt(u8 index);
// set a point in the list at index, returns its index on success, else 0
u8 PointList_SetAt(Point_t* pPoint);
// goto the first WP in the list and return pointer to it
Point_t* PointList_WPBegin(void);
// goto the last WP in the list and return pointer to it
Point_t* PointList_WPEnd(void);
// goto next WP in the list and return pointer to it
Point_t* PointList_WPNext(void);
// enables/disables waypoint function
void PointList_WPActive(u8 set);
// returns pointer to actual POI
Point_t* PointList_GetPOI(void);
 
 
#endif // _WAYPOINTS_H