Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 45 → Rev 46

/branches/V0.60_GPS_BETA_martosi/GPS.c
0,0 → 1,287
//------------------------------------------------------------------------------
// _ _
// | | | |
// ___ _ __ ___ ___ _ _ ___| |_ ___ ___| |__
// / _ \ '_ ` _ \/ __| | | / __| __/ _ \/ __| '_ \.
// | __/ | | | | \__ \ |_| \__ \ || __/ (__| | | |
// \___|_| |_| |_|___/\__, |___/\__\___|\___|_| |_|
// __/ |
// |___/ Engineering
//
// Filename: GPS.c
// Description:
//
// Author: Martin Steppuhn
// History: 15.06.2007 Initial version
//
//------------------------------------------------------------------------------
 
 
/**** Includes ****************************************************************/
 
#include "std_c.h"
#include "main.h"
#include "fc.h"
#include "gps_ubx.h"
 
/**** Preprocessing directives (#define) **************************************/
 
/**** Type definitions (typedef) **********************************************/
 
/**** Global constants ********************************************************/
 
/**** Global variables ********************************************************/
 
signed int GPS_Nick = 0;
signed int GPS_Roll = 0;
 
/**** Local constants ********************************************************/
 
/**** Local variables *********************************************************/
 
signed int test_nick = 0;
signed int test_roll = 0;
long GpsAktuell_X = 0;
long GpsAktuell_Y = 0;
long GpsZiel_X = 0;
long GpsZiel_Y = 0;
long gps_dx;
long gps_dy;
long gps_vx;
long gps_vy;
bool gps_hold;
uint8 print_pos;
 
/**** Local function prototypes ***********************************************/
 
void print_uint16(uint16 value,uint8 width);
void print_int16(int16 value,uint8 width);
void print_string(char *s);
 
//------------------------------------------------------------------------------
// Name: GPS_Neutral
// Function:
//
// Parameter:
// Return:
//------------------------------------------------------------------------------
void GPS_Neutral(void)
{
GpsZiel_X = GpsAktuell_X;
GpsZiel_Y = GpsAktuell_Y;
GPS_Nick = 0;
GPS_Roll = 0;
 
// LED_GPS_DATA_OFF;
//LED_GPS_FIX_OFF;
//LED_GPS_DATA_ON;
}
 
//------------------------------------------------------------------------------
// Name: gps_trace
// Function:
//
// Parameter:
// Return:
//------------------------------------------------------------------------------
void gps_trace(void)
{
print_pos = 0;
 
print_uint16(nav_sol.gpsfix,1);
print_string(" ");
print_int16(gps_dy,7);
print_int16(gps_dx,7);
 
print_string(" | ");
 
print_int16(gps_vy,7);
print_int16(gps_vx,7);
 
print_string(" | ");
 
print_int16(GPS_Roll,7);
print_int16(GPS_Nick,7);
 
 
print_string(" # ");
 
print_int16(StickRoll,7);
print_int16(StickNick,7);
 
 
print_string("\r\n");
UebertragungAbgeschlossen = 0;
UDR = SendeBuffer[0]; // Start
}
 
//------------------------------------------------------------------------------
// Name: gps_main
// Function:
//
// Parameter:
// Return:
//------------------------------------------------------------------------------
void GPS_Main(void)
{
if((Poti3 > 125) && (nav_sol.gpsfix) && (gps_hold == false)) // Enable Hold
{
GpsZiel_X = GpsAktuell_X;
GpsZiel_Y = GpsAktuell_Y;
gps_hold = true;
}
 
if(Poti3 < 125) // Disable Hold
{
GpsZiel_X = 0;
GpsZiel_Y = 0;
GPS_Nick = 0;
GPS_Roll = 0;
 
gps_hold = false;
}
 
 
 
 
if(ubx.update)
{
ubx.update = false;
ubx_decode(&ubx);
if(nav_sol.update)
{
//trace_nav_sol();
nav_sol.update = false;
if(nav_sol.gpsfix)
{
LED_GPS_FIX_TOGGLE;
LED_GPS_DATA_OFF;
}
else
{
LED_GPS_DATA_TOGGLE;
LED_GPS_FIX_OFF;
}
//=== new Position ====================
 
GpsAktuell_X = nav_sol.ecef_x;
GpsAktuell_Y = nav_sol.ecef_y;
 
gps_dx = GpsZiel_X - GpsAktuell_X; // Süden +
gps_dy = GpsZiel_Y - GpsAktuell_Y; // Osten +
 
 
gps_vx = -nav_sol.ecefvx; // cm/s ECEF X velocity
gps_vy = -nav_sol.ecefvy; // cm/s ECEF Y velocity
if(gps_hold)
{
GPS_Nick = ((gps_dx * Poti1) / 512) + ((gps_vx * Poti2) / 128);
GPS_Roll = ((gps_dy * Poti1) / 512) + ((gps_vy * Poti2) / 128);
}
else
{
GPS_Nick = 0;
GPS_Roll = 0;
}
 
//=====================================
}
gps_trace();
}
}
 
 
 
//==============================================================================
//==============================================================================
//==============================================================================
//
//==============================================================================
//==============================================================================
//==============================================================================
 
 
//------------------------------------------------------------------------------
// Name:
// Function:
//
// Parameter:
// Return:
//------------------------------------------------------------------------------
void print_uint16(uint16 value,uint8 width)
{
uint8 i,s[10];
 
for (i = 0; i < width; i++)
{
s[width - i - 1] = '0' + (value % 10);
value /= 10;
}
for (i=0; i<(width - 1); i++) // Overwrite trailing Zeros
{
if (s[i] == '0') s[i] = ' ';
else break;
}
for (i=0; i<width; i++) SendeBuffer[print_pos++] = s[i]; // Output String
// for (i=0; i<width; i++) putchar(s[i]); // Output String
 
}
 
//------------------------------------------------------------------------------
// Name:
// Function:
//
// Parameter:
// Return:
//------------------------------------------------------------------------------
void print_int16(int16 value,uint8 width)
{
uint8 i,s[10];
bool neg;
 
neg = false;
if(value < 0) { value = -value; neg = true; }
 
for (i = 0; i < width; i++)
{
s[width - i - 1] = '0' + (value % 10);
value /= 10;
}
 
for (i=0; i<(width - 1); i++) // Overwrite trailing Zeros
{
if (s[i] == '0') s[i] = ' ';
else
{
if(neg) s[i-1] = '-';
break;
}
}
for (i=0; i<width; i++) SendeBuffer[print_pos++] = s[i]; // Output String
// for (i=0; i<width; i++) putchar(s[i]); // Output String
}
 
//------------------------------------------------------------------------------
// Name:
// Function:
//
// Parameter:
// Return:
//------------------------------------------------------------------------------
void print_string(char *s)
{
while(*s)
{
SendeBuffer[print_pos++] = *s;
s++;
}
}