Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2146 → Rev 2147

/Transportables_Koptertool/PKT/trunk/HAL_HW3_9.c
0,0 → 1,561
/*****************************************************************************
* 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*
*****************************************************************************/
 
//############################################################################
//# HISTORY HAL_HW3_9.c
//#
//#
//# 10.11.2014 cebra
//# - chg: Displaybeleuchtung aktiv einschalten beim Start
//#
//# 14.06.2014 OG
//# - chg: InitHWPorts() - umgestellt auf PKT_TitlePKTlipo(false) da eine
//# richtige LiPo-Anzeige im Startbildschirm zu diesem Zeitpunkt noch
//# nicht moeglich ist
//# - chg: InitHWPorts() - bt_init() umgestellt auf BTM222_Initalize()
//#
//# 11.06.2014 OG
//# - fix: InitHWPorts() einstellen der Sprache geht jetzt wieder
//#
//# 10.06.2014 OG
//# - chg: InitHWPorts() - umgestellt auf Wi232_Initalize()
//#
//# 08.06.2014 OG
//# - chg: InitHWPorts() - Aufruf von InitWi232() geaendert
//#
//# 28.05.2014 OG
//# - chg: InitHWPorts() - Bearbeiten der Sprache auskommentiert weil sich
//# Edit_generic() geaendert hat und notwendige Texte aus einem Menue
//# bezieht welches hier in der HAL nicht vorhanden ist
//#
//# 01.04.2014 OG
//# - chg: PCB_WiFlyPatch umbenannt zu PCB_SV2RxTxPatch
//#
//# 24.03.2014 OG
//# - chg: InitHWPorts(): den Begriff "WiFly" bzw. "WiFly Patch" geaendert
//# zu "SV2 Patch"
//#
//# 21.02.2014 OG
//# - chg: InitHWPorts() auf PKT_TitlePKTVersion() angepasst
//#
//# 20.02.2014 OG
//# - chg: InitHWPorts() Anzeige vom Startscreen ueberarbeitet
//# - chg: Code-Formatierung
//#
//# 30.01.2014 OG
//# - add: Unterstuetzung fuer USE_BLUETOOTH
//#
//# 29.01.2014 OG
//# - del: #include "display.h"
//#
//# 25.08.2013 Cebra
//# - add: #ifdef USE_TRACKING vor Servo_init
//#
//# 07.07.2013 OG
//# - add: DEBUG_SV2_EXTENSION in InitHWPorts() bzgl. Anzeige von "A:.. B:.." usw.
//#
//# 26.06.2013 OG
//# - del: Code zu USE_PKT_STARTINFO
//#
//# 26.06.2013 Cebra
//# - add: Modulumschaltung für WiFlypatch umgebaut
//# - chg: Wartezeit nach Einschalten von BT auf 3 Sekunden verlängert
//#
//# 22.06.2013 cebra
//# - chg: Fehler in CheckPCB führte zu fehlerhafter Lipomessung, alle Pins von Port A waren auf Eingang
//#
//# 13.06.2013 cebra
//# - chg: Displaybeleuchtung ohne Helligkeitssteuerung
//#
//# 15.05.2013 OG
//# - chg: define USE_PKT_STARTINFO ergaenzt (siehe main.h)
//#
//# 28.04.2013 OG
//# - add: Unterstuetzung von define USE_FONT_BIG (Layoutanpassung)
//#
//# 12.04.2013 Cebra
//# - chg: Fehler bei der Umschaltung Wi232/Kabelverbindung beim Start des PKT
//###########################################################################
 
 
#ifndef HAL_HW3_9_C_
#define HAL_HW3_9_C_
 
#include "cpu.h"
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdbool.h>
#include <stdlib.h>
 
#include "main.h"
 
//#if defined HWVERSION3_9
#include "eeprom/eeprom.h"
#include "messages.h"
#include "lcd/lcd.h"
#include "uart/usart.h"
#include "uart/uart1.h"
#include "timer/timer.h"
 
#include "wi232/Wi232.h"
#include "motortest/twimaster.h"
#include "bluetooth/bluetooth.h"
#include "bluetooth/error.h"
#include "connect.h"
#include "lipo/lipo.h"
#include "pkt/pkt.h"
#include "setup/setup.h"
#include "osd/osd.h"
#include "sound/pwmsine8bit.h"
#include "tracking/ng_servo.h"
 
 
 
volatile uint8_t USBBT;
volatile uint8_t U02SV2;
volatile uint8_t PCB_Version;
volatile uint8_t PCB_SV2RxTxPatch;
 
 
uint8_t PortA;
uint8_t PortB;
uint8_t PortC;
uint8_t PortD;
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void CheckPCB(void)
{
//
DDRA = 0x00;
DDRB = 0x00;
DDRC = 0x00;
DDRD = 0x00;
PortA = PINA;
PortB = PINB;
PortC = PINC;
PortD = PIND;
 
 
DDRC = 0x00;
PORTC &= ~(1<<PORTC7); // Pullup setzen
if (PINC & (1<<PINC7) ) PCB_Version = PKT39m; else PCB_Version = PKT39x;
PORTC &= ~(1<<PORTC0); // Pullup setzen
if (PINC & (1<<PINC0) ) PCB_SV2RxTxPatch = false; else PCB_SV2RxTxPatch = true;
PORTC |= (1<<PORTC0); // Pullup aus
 
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void InitHWPorts( void ) // Initialisierung der Hardware für die jeweilige Leiterplattenversion
{
int8_t yoffs;
 
CheckPCB(); // Version der Leiterplatte prüfen
 
if( PCB_SV2RxTxPatch )
{
DDRC |= (1<<DDC0)|(1<<DDC1); // Ausgang: C0 Reset BT, C1 Reset WiFly
PORTC &= ~((1<<BT_Reset)|(1<<WiFly_Reset)|(1<<USB_Reset)); // Erst alle Module ausschalten
}
 
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)
 
if( Config.Lipomessung == true )
{
DDRA &= ~(1<<DDA1); // Eingang: PKT Lipo Messung
//PORTA &= ~(1<<PORTA1);
}
 
DDRB = 0xFF; // alles Ausgaenge
 
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
 
if( PCB_SV2RxTxPatch ) clr_USBOn();
else _BTOn(); // Erstmal USB dektivieren, damit beim versehentlichen Einschalten USB im PC ruhig bleibt
 
 
DDRD |= (1<<DDD4)|(1<<DDD5)|(1<<DDD6)|(1<<DDD7); // Ausgang: PiepserTest, Servo, Wi232-CMD und Beleuchtung
PORTD |= (1<<PORTD6); // Wi232-CMD auf High schalten
set_D_LIGHT(); // Displaybeleuchtung an
 
 
set_V_On(); // Spannung mit T3 halten
Timer0_Init(); // system
 
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);
 
LCD_Init(0); // muss vor "ReadParameter" stehen
ReadParameter(); // aktuelle Werte aus EEProm auslesen
 
#ifdef USE_TRACKING
servoInit(SERVO_PERIODE);
#endif
 
//servoSetDefaultPos();
sei();
 
Old_Baudrate = Config.PKT_Baudrate;
SetBaudUart1( Config.PKT_Baudrate );
SetBaudUart0( Config.PKT_Baudrate );
 
// 10.11.2015 cebra
// TODO cebra: diese Stelle muss bei HW_Sound überarbeitet werden
// if( (Config.HWSound==0) && (PCB_Version == PKT39m) )
// {
// Timer2_Init(); // Displaybeleuchtung oder Soundmodul
// OCR2A = Config.LCD_Helligkeit * 2.55;
// }
 
 
 
 
#ifdef USE_SOUND
if (Config.HWSound==1) InitSound();
#endif
 
 
LCD_Init(1);
set_beep ( 400, 0x0080, BeepNormal);
 
OSD_active = false; // keine OSD Ausgabe
 
ADC_Init(); // ADC für Lipomessung// MartinR: verschoben
 
 
//-------------------------
// beim ersten Start (oder nach Reset) Sprache abfragen
//-------------------------
if( Config.DisplayLanguage > NUM_LANG )
{
Config.DisplayLanguage = 1;
//Config.DisplayLanguage = Edit_generic( Config.DisplayLanguage, 0, 1, Language,1, NULL,NULL); // OG: ?? hierbei wird die falsche Sprache angezeigt - warum?
Config.DisplayLanguage = Edit_generic( 2, 0, 1, Language,1, NULL,NULL);
WriteParameter();
}
 
 
//-------------------------
// Anzeige Start-Screen
//-------------------------
PKT_TitlePKTlipo( false ); // Titel mit PKT-Version anzeigen (und clearscreen)
 
yoffs = 11;
 
if( PCB_SV2RxTxPatch )
{
lcdx_printp_center( 2, PSTR("SV2 Patch"), MNORMAL, 0,7); // "SV2 Patch" (ehemals "Wifly Patch")
yoffs = 5;
}
 
if( PCB_Version==PKT39m )
{
lcdx_printp_center( 1, PSTR("HW 3.9m (09.2011)"), MNORMAL, 0,yoffs);
}
 
if( PCB_Version==PKT39x )
{
lcdx_printp_center( 1, PSTR("HW 3.9x (11.2012)"), MNORMAL, 0,yoffs);
}
 
lcdx_printp_center( 5, strGet(BOOT1), MNORMAL, 0,2); // "Taste 1 Sekunde"
lcdx_printp_center( 6, strGet(BOOT2), MNORMAL, 0,4); // "festhalten!"
lcd_rect_round( 0, 5*8-2, 127, 2*8+8, 1, R2); // Rahmen
 
 
//-------------------------
//-------------------------
 
#ifdef DEBUG_SV2_EXTENSION
lcd_printpns_at (0, 7, PSTR("A:"),0);
lcd_print_hex(PortA,0);
lcd_printpns_at (5, 7, PSTR("B:"),0);
lcd_print_hex(PortB,0);
lcd_printpns_at (10, 7, PSTR("C:"),0);
lcd_print_hex(PortC,0);
lcd_printpns_at (15, 7, PSTR("D:"),0);
lcd_print_hex(PortD,0);
#endif
 
 
//_delay_ms(800);
_delay_ms(900);
 
if (PINA & (1<<PINA7)) // Spannung eingeschaltet lassen
clr_V_On();
 
 
_delay_ms(100);
 
set_beep ( 400, 0x0080, BeepNormal);
get_key_press(KEY_ALL);
 
#ifdef USE_SOUND
if (Config.HWSound==1);
{
playTone(505,100,Config.Volume);
playTone(515,100,Config.Volume);
playTone(525,100,Config.Volume);
playTone(535,100,Config.Volume);
playTone(525,100,Config.Volume);
playTone(515,100,Config.Volume);
playTone(505,100,Config.Volume);
}
#endif
 
//lcd_cls(); // 20.02.2014 OG
 
 
// servoSetPosition(1,0);
// _delay_ms(250);
// servoSetPosition(0,0);
// _delay_ms(250);
// servoSetPosition(1,400);
// _delay_ms(250);
// servoSetPosition(0,400);
// _delay_ms(250);
// servoSetPosition(1,0);
// _delay_ms(250);
// servoSetPosition(0,0);
// _delay_ms(250);
// servoSetPosition(1,400);
// _delay_ms(250);
// servoSetPosition(0,400);
 
 
set_BTOff();
//set_Modul_On(USB);
 
if( (Config.UseWi == true) && (Config.WiIsSet == false) )
{
Wi232_Initalize(); // wenn Wi232 nicht initialisiert ist, dann jetzt tun
}
 
 
#ifdef USE_BLUETOOTH
if ((Config.UseBT == true) && (Config.BTIsSet == false)) // BT ausschalten
{
//lcd_cls();
BTM222_Initalize();
// set_USBOn();
}
bt_start();
#endif // end: #ifdef USE_BLUETOOTH
 
 
if( (Config.UseWi == true) && (Config.U02SV2 == 0) )
{
Change_Output(Uart02Wi); // Verbindung zu Wi232 herstellen
}
else
{
Change_Output(Uart02FC); // Verbindung zu SV" (Kabel) herstellen
}
 
} // InitHWPorts()
 
 
 
//#define set_BEEP() (PORTC &= ~(1 << Summer)) // Summer
//#define clr_BEEP() (PORTC |= (1 << Summer))
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void set_BEEP(void)
{
if (PCB_Version == PKT39m)
PORTC &= ~(1 << Summer); // Summer
if (PCB_Version == PKT39x)
PORTD &= ~(1 << SummerV2); // Summer
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void clr_BEEP(void)
{
if (PCB_Version == PKT39m)
PORTC |= (1 << Summer); // Summer
if (PCB_Version == PKT39x)
PORTD |= (1 << SummerV2); // Summer
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void set_D_LIGHT(void) /* Displaybeleuchtung ein*/
{
if (PCB_Version == PKT39m)
{
// if (Config.HWSound==0)
// {
// // PWM einschalten
// TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1);
// TCCR2B |= (1 << CS20);
// }
// else
clr_DISPLAYLIGHT();
}
 
if (PCB_Version == PKT39x)
{
// if (HWSound==0)
// {
// // PWM einschalten
// TCCR2A |= (1 << WGM21) | (1 << WGM20) | (1 << COM2A1);
// TCCR2B |= (1 << CS20);
// }
// else
clr_DISPLAYLIGHTV2();
}
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void clr_D_LIGHT(void) /* Displaybeleuchtung aus*/
{
if (PCB_Version == PKT39m)
{
// if (Config.HWSound==0)
// {
// // PWM ausschalten
// TCCR2A = 0;
// TCCR2B = 0;
// }
// else
 
set_DISPLAYLIGHT();
}
if (PCB_Version == PKT39x)
{
// if (HWSound==0)
// {
// // PWM ausschalten
// TCCR2A = 0;
// TCCR2B = 0;
// }
// else
set_DISPLAYLIGHTV2();
}
}
uint8_t BTIsOn=0;
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void set_Modul_On(uint8_t Modul) // Umschaltfunktionen für Leiterplatte 3.9x mit WiFlypatch
{
 
if (PCB_SV2RxTxPatch) PORTC &= ~((1<<BT_Reset)|(1<<WiFly_Reset)|(1<<USB_Reset)); // Erst alle Module ausschalten
 
switch (Modul)
{
case USB: if (PCB_SV2RxTxPatch) set_USBOn();
else set_USBOn();
BTIsOn = 0;
break;
 
case Bluetooth: if (PCB_SV2RxTxPatch) set_BTM222On();
else _BTOn();
if (BTIsOn == 0)
{
BTIsOn = 1;
_delay_ms(3000); // wait for BTM222 initialisation
}
break;
case Wlan: set_WiFlyOn();
BTIsOn = 0;
break;
}
 
 
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void set_BTOn(void)
{
if (BTIsOn == 0)
{
if (PCB_SV2RxTxPatch) set_Modul_On(Bluetooth);
else
{
_BTOn();
BTIsOn = 1;
_delay_ms(3000);
}
}
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void set_BTOff(void)
{
if( PCB_SV2RxTxPatch )
set_Modul_On(USB);
else
{
set_USBOn();
BTIsOn = 0;
}
}
 
 
 
#endif
//#endif // HAL_HW3_9_C_
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property