Subversion Repositories NaviCtrl

Compare Revisions

Ignore whitespace Rev 779 → Rev 780

/trunk/eeprom.c
55,6 → 55,7
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "91x_lib.h"
#include "i2c.h"
#include "uart1.h"
64,6 → 65,7
#include "crc16.h"
#include "main.h"
#include "spi_slave.h"
#include "params.h"
 
 
// The EEPROM M24C64 (64k) ist connected via I2C1 interface to the controller.
325,6 → 327,30
}
}
 
void WriteBaroCalibrationToEEprom(void)
{
#define BARO_KOMPATIBLE 1
s16 data[2];
data[0] = LuftdruckTemperaturKompensation;
data[1] = data[0] + BARO_KOMPATIBLE;
EEPROM_WriteBlock(EEPROM_ADR_BARO_KALIBRATION,(u8 *)&data,4);
NCParams[NCPARAMS_BARO_KOMPENSATION] = LuftdruckTemperaturKompensation;
NCParamState[NCPARAMS_BARO_KOMPENSATION] = NCRARAM_STATE_VALID;
}
 
void ReadBaroCalibrationfromEEprom(void)
{
s16 data[2];
EEPROM_ReadBlock(EEPROM_ADR_BARO_KALIBRATION,(u8 *)&data,4);
if(data[0] + BARO_KOMPATIBLE == data[1])
{
LuftdruckTemperaturKompensation = data[0];
if(abs(LuftdruckTemperaturKompensation) > 250) LuftdruckTemperaturKompensation = 0;
}
 
NCParams[NCPARAMS_BARO_KOMPENSATION] = LuftdruckTemperaturKompensation;
NCParamState[NCPARAMS_BARO_KOMPENSATION] = NCRARAM_STATE_VALID;
if(LuftdruckTemperaturKompensation) UART1_PutString("\r\n Baro Temperature Calibration active\r\n");
}
 
 
/trunk/eeprom.h
2,6 → 2,7
#define __EEPROM_H
 
// two calibrtion sets for extern and intern sensor
#define EEPROM_ADR_BARO_KALIBRATION 46 // 46 - 49
#define EEPROM_ADR_MAG_CALIBRATION_INTERN 50
#define EEPROM_ADR_MAG_CALIBRATION_EXTERN 70
#define EEPROM_ADR_LICENSE_DATA_CRC 124// - 600
36,6 → 37,8
extern void ClearLicenseText(void);
extern u8 ReadOemNameFromEEPROM(void);
extern void WriteOemNameToEEPROM(void);
extern void WriteBaroCalibrationToEEprom(void);
extern void ReadBaroCalibrationfromEEprom(void);
 
#endif // EEPROM_H
 
/trunk/main.c
91,6 → 91,7
u8 TransmitAlsoToFC = 0;
#endif
u32 TimerCheckError;
u32 TimerSecond;
u8 ErrorCode = 0;
u16 BeepTime;
u8 NCFlags = 0;
116,6 → 117,8
u8 IamMaster = NOTHING; // for Master/Slave Redundance
u16 ToFC_Parachute_Off;
u8 IO1_Function = 0;
s16 LuftdruckTemperaturKompensation = 0, LuftdruckTemperaturOffset = 0;
u8 BaroCalState = 0;
 
//----------------------------------------------------------------------------------------------------
void SCU_Config(void)
577,6 → 580,50
TimerCheckError = SetDelay(1000);
}
 
// ++++++++++++++++++++++++++++++++++++++++++++++++
// + Baro Temperature offset
// ++++++++++++++++++++++++++++++++++++++++++++++++
if(!BaroCalState && LuftdruckTemperaturKompensation)
{
LuftdruckTemperaturOffset = (31 * (s32)LuftdruckTemperaturOffset + ((FC_Temperatur_raw - FC_StartTemperature*10) * LuftdruckTemperaturKompensation) / 100) / 32;
}
/*
DebugOut.Analog[] = FC_Temperatur_raw/10;
DebugOut.Analog[] = FC_Temperatur;
DebugOut.Analog[] = NaviData.Altimeter_5cm * 5;
DebugOut.Analog[] = LuftdruckTemperaturOffset;
*/
// ++++++++++++++++++++++++++++++++++++++++++++++++
// + one second timer
// ++++++++++++++++++++++++++++++++++++++++++++++++
if(CheckDelay(TimerSecond)) // one second Timer
{
TimerSecond += 1000;
 
if(FC.StatusFlags & FC_STATUS_FLY)
{
NaviData.FlyingTime++; // we want to count the battery-time
TimeSinceMotorStart++;
}
// ++++++++++++++++++++++++++++++++++++++++++++++++
// + FC 3.0 Temperature
// ++++++++++++++++++++++++++++++++++++++++++++++++
if(UART_VersionInfo.HWMajor >= 30)
{
if(FC_Temperatur == -1000 && FC_Temperatur_raw != -10000) // init
{
FC_Temperatur = FC_Temperatur_raw/10;
FC_StartTemperature = FC_Temperatur;
}
else
if(FC_Temperatur > FC_Temperatur_raw/10) FC_Temperatur--;
else
if(FC_Temperatur < FC_Temperatur_raw/10) FC_Temperatur++;
}
}
// ++++++++++++++++++++++++++++++++++++++++++++++++
 
 
// ---------------- Error Check Timing ----------------------------
if(CheckDelay(TimerCheckError) || (FC.StatusFlags & FC_STATUS_START && !(oldFcFlags & FC_STATUS_START))) // Timer or FY wants to start
{
605,12 → 652,6
 
if(!CheckDelay(SPI0_Timeout) || (DebugUART == UART1)) CheckErrors();
 
if(FC.StatusFlags & FC_STATUS_FLY)
{
NaviData.FlyingTime++; // we want to count the battery-time
TimeSinceMotorStart++;
}
 
if(EE_Parameter.Revision == 0) RequestConfigFromFC = 1;
if(SerialLinkOkay) SerialLinkOkay--;
if(SerialLinkOkay < 250 - 6) NCFlags |= NC_FLAG_NOSERIALLINK; // 6 seconds timeout for serial communication
693,6 → 734,7
//UART_VersionInfo.HWMajor = 30;
LED_GRN_ON;
TimerCheckError = SetDelay(3000);
TimerSecond = SetDelay(3500);
UART1_PutString("\r\n++++++++++++++++++++++++++++++++++++++++++");
UART1_PutString("\r\n Version information:");
 
750,6 → 792,7
{
EXT2_Init(); // External Output EXT2
CanbusInit();
ReadBaroCalibrationfromEEprom();
}
if(FromCamCtrl.CamStatus)
{
758,6 → 801,7
UART1_PutString(msg);
}
else if(Compass_I2CPort == NCMAG_PORT_INTERN) UART1_PutString(" No CamCtrl connected \r\n");
 
// ++++++++++++++++++++++++++++++++++++++++++++++
for (;;) // the endless main loop
{
/trunk/main.h
37,7 → 37,7
 
#define CAN_SLAVE_COMPATIBLE 2
#ifndef FOLLOW_ME
#define FC_SPI_COMPATIBLE 83 // <------------------
#define FC_SPI_COMPATIBLE 84 // <------------------
#else
#define FC_SPI_COMPATIBLE 0xFF
#endif
198,6 → 198,7
#define Poti7 FC.Poti[6]
#define Poti8 FC.Poti[7]
 
extern s16 LuftdruckTemperaturKompensation, LuftdruckTemperaturOffset;
extern u16 BeepTime;
extern u8 NCFlags;
extern u8 ClearFCStatusFlags;
333,6 → 334,7
extern s16 SimulatedDirection; // simulated compass direction
extern u16 ToFC_Parachute_Off; // forced Switch off via IO1
extern u8 IO1_Function;
extern u8 BaroCalState;
#define OEM_NAME_LENGHT 16
extern u8 OEM_String[OEM_NAME_LENGHT+1];
 
/trunk/menu.c
74,6 → 74,7
#include "canbus.h"
#include "triggerlog.h"
#include "CamCtrl.h"
#include "eeprom.h"
 
u8 DispPtr = 0;
s8 DisplayBuff[DISPLAYBUFFSIZE];
80,7 → 81,7
 
 
u8 MenuItem = 0;
u8 MaxMenuItem = 30;
u8 MaxMenuItem = 31;
 
void Menu_Putchar(char c)
{
698,7 → 699,87
}
}
break;
case 31: // Temperaturecompensation of the Barosensor
{
static s32 dT = 0, tAlt = 0, faktor = 0;
static s32 dP = 0, pAlt = 0;
static u8 stored = 0, heateroff_msg = 0;
 
if(BaroCalState)
{
dP = NaviData.Altimeter_5cm/2 - pAlt;
dT = FC_Temperatur - tAlt;
faktor = (dP * 100) / dT;
 
if(abs(dT) < 130) LCD_printfxy(0,0,"Warm up slowly")
else
if(FC.StatusFlags & FC_STATUS_MOTOR_RUN) LCD_printfxy(0,0,"Motors off! ")
else LCD_printfxy(0,0,"Wait... ");
 
if((abs(FC_Temperatur_raw/10 - tAlt) >= 250)) heateroff_msg = 1;
if((abs(FC_Temperatur_raw/10 - tAlt) <= 150)) heateroff_msg = 0;
if(heateroff_msg) LCD_printfxy(0,0,"Heater off! ");
 
LCD_printfxy(0,1,"T=%4dC dT=%3dC ",FC_Temperatur_raw/100,dT/10 );
LCD_printfxy(0,2,"P=%4dm dP=%3dm ",NaviData.Altimeter_5cm/20,dP/10 );
 
if(dT > 30) LCD_printfxy(0,3,"K=%4dcm/C ",faktor)
else LCD_printfxy(0,3," (cancel)",faktor);
 
if(abs(dT) > 120 && (abs(FC_Temperatur_raw/10 - FC_Temperatur) <= 5)) // kein Temperaturgradient und mehr als 12°C erwärmt
{
heateroff_msg = 0;
LCD_printfxy(12,3,"(save)");
LCD_printfxy(0,0,"Okay ");
 
if(Keys & KEY4) // Store
{
LuftdruckTemperaturKompensation = faktor;
WriteBaroCalibrationToEEprom();
BaroCalState = 0;
stored = 1;
}
}
else LCD_printfxy(15,3,"(--) ");
}
else
if(UART_VersionInfo.HWMajor >= 30)
{
LCD_printfxy(0,0,"Barometer");
LCD_printfxy(0,1,"Temperat.= %4d.%1dC ",FC_Temperatur_raw/100,abs(FC_Temperatur_raw%100)/10);
LCD_printfxy(0,2,"Faktor = %4dcm/C ",LuftdruckTemperaturKompensation);
//LCD_printfxy(0,3,"Offset =%4dcm ",LuftdruckTemperaturOffset);
if(stored) LCD_printfxy(0,3,"Stored ");
 
if((abs(FC_Temperatur_raw/10 - FC_Temperatur) <= 5)) // kein Temperaturgradient
{
LCD_printfxy(15,3,"(CAL)");
if(Keys & KEY4) // next step
{
pAlt = NaviData.Altimeter_5cm/2;
tAlt = FC_Temperatur_raw/10;
FC_Temperatur = FC_Temperatur_raw/10;
BaroCalState = 1;
stored = 0;
}
 
}
else LCD_printfxy(15,3,"(---)");
}
else
{
LCD_printfxy(0,0,"Barometer");
LCD_printfxy(0,1,"Temperat = ??C ");
LCD_printfxy(0,2,"Faktor = ?? cm/C");
LCD_printfxy(0,3,"Not supported");
}
 
if(Keys & KEY3) BaroCalState = 0; // cancel
}
break;
 
 
 
default:
//MaxMenuItem = MenuItem - 1;
MenuItem = 0;
/trunk/params.c
3,8 → 3,8
#include "spi_slave.h"
#include "waypoints.h"
 
s16 NCParams[255];
u8 NCParamState[255];
s16 NCParams[256];
u8 NCParamState[256];
 
void NCParams_Init(void)
{
26,6 → 26,11
 
switch(id)
{
case NCPARAMS_BARO_KOMPENSATION:
LuftdruckTemperaturKompensation = *pvalue;
WriteBaroCalibrationToEEprom();
break;
 
case NCPARAMS_FORCE_NEW_COMPASS_DIRECTION:
CAM_Orientation.UpdateMask |= FORCE_AZIMUTH_ROTATION;
// Break fehlt hier absichtlich
/trunk/params.h
1,6 → 1,9
#ifndef _PARAMS_H
#define _PARAMS_H
 
extern s16 NCParams[256];
extern u8 NCParamState[256];
 
// ids 0...255
#define NCPARAMS_GPS_TARGETSPEED 0
#define NCPARAMS_NEW_COMPASS_DIRECTION_SETPOINT 1
11,6 → 14,7
#define NCPARAMS_WP_EVENT_ONCE 6
#define NCPARAMS_WP_EVENT_FOREVER 7
#define NCPARAMS_FORCE_NEW_COMPASS_DIRECTION 8
#define NCPARAMS_BARO_KOMPENSATION 255
 
#define NCPARAM_STATE_UNDEFINED 0
#define NCRARAM_STATE_VALID 1
/trunk/spi_slave.c
521,6 → 521,8
ToFlightCtrl.Param.Byte[9] = ToFC_MaxWpListIndex;
ToFlightCtrl.Param.sInt[5] = GyroCompassCorrected / 10; // Bytes 10 & 11
ToFlightCtrl.Param.Byte[12] = CamCtrlCharacter;
ToFlightCtrl.Param.Byte[13] = BaroCalState;
ToFlightCtrl.Param.sInt[7] = LuftdruckTemperaturOffset; // Bytes 14 & 15
break;
 
case SPI_NCCMD_GPSINFO:
/trunk/ubx.c
311,6 → 311,8
GPSData.SatFix = UbxSol.GPSfix;
//if(Parameter.User3 > 100) { GPSData.NumOfSats = 0; GPSData.SatFix = 0;}
//if(Parameter.User3 > 100) { GPSData.SatFix = 0;}
//DebugOut.Analog[] = UbxPosLlh.Hacc;
//DebugOut.Analog[] = UbxPosLlh.Vacc;
GPSData.Position_Accuracy = UbxSol.PAcc; // in steps of 1cm
GPSData.Speed_Accuracy = UbxSol.SAcc; // in steps of 1cm/s
SetGPSTime(&SystemTime); // update system time