/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/test.c |
---|
0,0 → 1,7 |
/* |
* test.c |
* |
* Created on: 15.01.2012 |
* Author: Cebra |
*/ |
Property changes: |
Added: svn:mime-type |
+text/plain |
\ No newline at end of property |
/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 |