Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2135 → Rev 2136

/Transportables_Koptertool/PKT/GPL_PKT_V3_85f/mk/mkdebugdata.c
0,0 → 1,416
/*****************************************************************************
* 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 mkdebugdata.c
//#
//# 04.06.2014 OG
//# komplett neues Layout
//# - chg: MK_DebugData(), GetAnalogNames() umgestellt auf PKT_Message_Datenverlust()
//# - chg: GetAnalogNames() Timeout reduziert
//# - add: #include "../lipo/lipo.h"
//# - add: #include "../pkt/pkt.h"
//# - add: #include <stdbool.h>
//#
//# 29.01.2014 OG
//# - chg: ehemals display_debug() jetzt MK_DebugData()
//# - chg: ehemals 'debug.c' jetzt 'mk/mkdebugdata.c'
//#
//# 03.04.2013 OG
//# - chg: define 'analognames' zu define 'USE_MKDEBUGDATA'
//# - add: Benutzer kann GetAnalogNames() via KEY_ESC abbrechen
//# - chg: Screen-Layout GetAnalogNames()
//# - chg: SwitchToNC/FC Reihenfolge
//#
//# 27.03.2013 OG
//# - chg: auf malloc umgestellt
//# - fix: diverse Anzeigefehler
//# - chg: teilweise redunten Code entfernt
//############################################################################
 
 
#include "../cpu.h"
#include <avr/io.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdbool.h>
#include <string.h>
#include "../main.h"
 
#ifdef USE_MKDEBUGDATA
 
#include "../lcd/lcd.h"
#include "../pkt/pkt.h"
#include "../lipo/lipo.h"
#include "../uart/usart.h"
#include "mkdebugdata.h"
#include "../timer/timer.h"
#include "../messages.h"
#include "../mk-data-structs.h"
 
 
//--------------------------------------------------------------
 
 
#define PAGELINES 5 // Anzahl der Zeilen pro Anzeigescreens
#define XOFFS 4
#define YOFFS 12
 
#define TIMEOUT 200 // 2 sec
#define ANALOGTIME 20 // 200 ms
 
#define MKDD_ANALOGNAME_SIZE 2*32*17 // MALLOC: 32 names, 16 characters + 1 0x00
 
// 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 *AnalogNames; // MALLOC: MKDD_ANALOGNAME_SIZE - 32 names, 16 characters + 1 0x00
 
uint8_t AnalogNamesRead[2] = {0,0};
 
static const char strFC[] PROGMEM = "FC";
static const char strNC[] PROGMEM = "NC";
 
 
//--------------------------------------------------------------
// Speicher wieder freigeben
//--------------------------------------------------------------
void MKDD_MemFree( void )
{
free( AnalogNames );
}
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void showTitle( void )
{
lcdx_printf_at_P( 0, 0, MINVERS, 0,0, PSTR(" %2S %16S"), (current_hardware==FC ? strFC : strNC), strGet(STR_DATA) ); // Titelzeile
show_Lipo();
}
 
 
 
//--------------------------------------------------------------
// lOk = GetAnalogNames()
//
// Return:
// true = OK
// false = User-Abort (KEY_ESC)
//--------------------------------------------------------------
uint8_t GetAnalogNames( void )
{
uint8_t i = AnalogNamesRead[current_hardware - 1];
uint8_t t = 0;
uint8_t lOk = TRUE;
int8_t yoffs = -2; // yoffs der Progress-Bar
 
lcd_cls ();
showTitle(); // Titel
lcdx_printf_center_P( 3, MNORMAL, 0,0, PSTR("%S %S %S"), strGet(STR_READING), (current_hardware==FC ? strFC : strNC), strGet(STR_LABELS) );
 
lcd_rect_round( 13, 40+yoffs, 102, 6, 1, R1); // Rahmen fuer Progress
lcd_printp_at(12, 7, strGet(ENDE), MNORMAL); // Keyline
 
 
mode = 'A'; // read Names
_delay_ms(200);
rxd_buffer_locked = FALSE;
 
timer = ANALOGTIME;
 
while( (i < 32) && lOk )
{
SendOutData ('a', ADDRESS_ANY, 1, &i, 1);
 
while( !rxd_buffer_locked && timer && lOk)
lOk = !get_key_press (1 << KEY_ESC);
 
if( timer )
{
Decode64 ();
if( i == *pRxData )
{
lcd_frect( 16, 42+yoffs, (i+1)*3, 2, 1); // Progress
 
memcpy( (uint8_t *) (AnalogNames+((current_hardware-1)*32*17)+(i*17)), (uint8_t *) pRxData + 1, 16);
*(AnalogNames+((current_hardware-1)*32*17)+(i*17)+16) = 0;
i++;
t = 0;
}
else
{
_delay_ms(100);
}
 
timer = ANALOGTIME;
rxd_buffer_locked = FALSE;
}
else if( lOk )
{ // timeout occured
t++;
timer = ANALOGTIME;
 
if( t >= 15 ) // timeout?
{
//PKT_Message_Datenverlust( timeout, beep)
PKT_Message_Datenverlust( 500, true); // 500 = 5 Sekunden
break;
}
}
else
{
lOk = !get_key_press( 1 << KEY_ESC );
}
}
 
if(lOk) AnalogNamesRead[current_hardware - 1] = i;
 
//_delay_ms(4000); // DEBUG
 
return lOk;
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void showLabels( uint8_t page)
{
uint8_t i = 0;
 
for( i = 0; i < PAGELINES; i++ )
{
if( (i + (page * PAGELINES)) >= 32 )
{
//lcdx_cls_rowwidth( y, width, mode, xoffs, yoffs )
lcdx_cls_rowwidth( i, 20, MNORMAL, XOFFS,YOFFS );
}
else
{
lcdx_print_at( 0, i, AnalogNames+((current_hardware-1)*32*17)+(i + page * PAGELINES)*17, MNORMAL, XOFFS,YOFFS);
}
}
}
 
 
//--------------------------------------------------------------
//
//--------------------------------------------------------------
void MK_DebugData(void)
{
uint8_t tmp_dat;
uint8_t i = 0;
uint8_t page = 0;
uint8_t pagemax = (32/PAGELINES);
uint8_t redraw = 2;
 
DebugData_t *DebugData;
 
 
// alloc ram
AnalogNames = malloc( MKDD_ANALOGNAME_SIZE );
 
if( !AnalogNames )
{
Show_PKTError_NoRAM();
return;
}
 
memset( AnalogNames, 0, MKDD_ANALOGNAME_SIZE ); // init: AnalogNames
AnalogNamesRead[0] = 0;
AnalogNamesRead[1] = 0;
 
SwitchToFC();
 
timer = TIMEOUT;
 
if( AnalogNamesRead[current_hardware - 1] < 32 )
{
if( !GetAnalogNames() )
{
MKDD_MemFree();
return;
}
}
 
if( !timer )
{
MKDD_MemFree();
return;
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
timer1 = 0;
 
tmp_dat = 10;
SendOutData( 'd', ADDRESS_ANY, 1, &tmp_dat, 1);
abo_timer = ABO_TIMEOUT;
 
 
do
{
//------------------------------------------
//------------------------------------------
if( redraw )
{
if( redraw==2 ) lcd_cls();
 
showTitle(); // Titelzeile
lcd_rect_round( 0, (1*8)+1, 127, (6*8)-4, 1, R2); // Rahmen fuer 5 Zeilen Display
 
showLabels( page );
 
lcd_printp_at( 0, 7, strGet(KEYLINE3), 0);
 
lcd_write_number_u_at (5, 7, page + 1);
lcd_printp_at( (current_hardware==FC ? 3 : 19), 7, strFC, 0);
lcd_printp_at( (current_hardware==FC ? 19 : 3), 7, strNC, 0);
 
redraw = false;
}
 
 
if( rxd_buffer_locked )
{
Decode64();
DebugData = (DebugData_t *) pRxData;
 
if( !timer1 )
{
for( i = 0; i < PAGELINES && (i + (page * PAGELINES)) < 32; i++)
{
writex_ndigit_number_s( 21-6, i, DebugData->Analog[i + page * PAGELINES], 5, 0, MNORMAL, XOFFS,YOFFS);
}
timer1 = 25; // Anzeigeverzoegerung damit es nicht flackert
}
 
rxd_buffer_locked = FALSE;
 
timer = TIMEOUT;
}
 
 
if( !abo_timer )
{ // renew abo every ... sec
tmp_dat = 10;
SendOutData( 'd', ADDRESS_ANY, 1, &tmp_dat, 1);
abo_timer = ABO_TIMEOUT;
}
 
 
//------------------------------------------
// PKT LiPo anzeigen
//------------------------------------------
show_Lipo();
 
 
//------------------------------------------
// Pruefe PKT Update oder andere PKT-Aktion
//------------------------------------------
if( PKT_CtrlHook() ) // Update vom Updatetool angefordert?
{
redraw = 2;
timer = TIMEOUT;
}
 
 
//------------------------------------------
// Tasten
//------------------------------------------
if( get_key_press(1 << KEY_MINUS) )
{
page--;
if( page > pagemax ) page = pagemax;
redraw = true;
}
 
if( get_key_press(1 << KEY_PLUS) )
{
page++;
if( page > pagemax ) page = 0;
redraw = true;
}
 
if( (hardware == NC) && get_key_press (1 << KEY_ENTER) )
{
if( current_hardware == NC ) SwitchToFC();
else SwitchToNC();
 
if( AnalogNamesRead[current_hardware - 1] < 32 )
{
if( !GetAnalogNames() )
{
MKDD_MemFree();
return;
}
}
 
mode = 'D'; // Debug Data
rxd_buffer_locked = FALSE;
timer = TIMEOUT;
 
tmp_dat = 10;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
 
//page = 0;
redraw = true;
}
}
while (!get_key_press(1 << KEY_ESC) && timer); // Taste: Ende oder Timeout
 
 
clear_key_all();
 
tmp_dat = 0;
SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1); // Request Debugdata abschalten
 
mode = 0;
rxd_buffer_locked = FALSE;
 
if( !timer )
{ // timeout occured
//PKT_Message_Datenverlust( timeout, beep)
PKT_Message_Datenverlust( 500, true); // 500 = 5 Sekunden
}
 
//SwitchToNC();
 
// free ram
MKDD_MemFree();
}
 
#endif // end: #ifdef USE_MKDEBUGDATA
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property