Subversion Repositories NaviCtrl

Rev

Rev 693 | Rev 706 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ingob 1
/*#######################################################################################*/
2
/* !!! THIS IS NOT FREE SOFTWARE !!!                                                     */
3
/*#######################################################################################*/
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5
// + www.MikroKopter.com
6
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
360 holgerb 7
// + Software Nutzungsbedingungen (english version: see below)
8
// + der Fa. HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland - nachfolgend Lizenzgeber genannt -
9
// + Der Lizenzgeber räumt dem Kunden ein nicht-ausschließliches, zeitlich und räumlich* unbeschränktes Recht ein, die im den
489 killagreg 10
// + Mikrocontroller verwendete Firmware für die Hardware Flight-Ctrl, Navi-Ctrl, BL-Ctrl, MK3Mag & PC-Programm MikroKopter-Tool
360 holgerb 11
// + - nachfolgend Software genannt - nur für private Zwecke zu nutzen.
12
// + Der Einsatz dieser Software ist nur auf oder mit Produkten des Lizenzgebers zulässig.
1 ingob 13
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
360 holgerb 14
// + Die vom Lizenzgeber gelieferte Software ist urheberrechtlich geschützt. Alle Rechte an der Software sowie an sonstigen im
15
// + Rahmen der Vertragsanbahnung und Vertragsdurchführung überlassenen Unterlagen stehen im Verhältnis der Vertragspartner ausschließlich dem Lizenzgeber zu.
16
// + Die in der Software enthaltenen Copyright-Vermerke, Markenzeichen, andere Rechtsvorbehalte, Seriennummern sowie
17
// + sonstige der Programmidentifikation dienenden Merkmale dürfen vom Kunden nicht verändert oder unkenntlich gemacht werden.
18
// + Der Kunde trifft angemessene Vorkehrungen für den sicheren Einsatz der Software. Er wird die Software gründlich auf deren
19
// + Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt.
20
// + Die Haftung des Lizenzgebers wird - soweit gesetzlich zulässig - begrenzt in Höhe des typischen und vorhersehbaren
489 killagreg 21
// + Schadens. Die gesetzliche Haftung bei Personenschäden und nach dem Produkthaftungsgesetz bleibt unberührt. Dem Lizenzgeber steht jedoch der Einwand
360 holgerb 22
// + des Mitverschuldens offen.
23
// + Der Kunde trifft angemessene Vorkehrungen für den Fall, dass die Software ganz oder teilweise nicht ordnungsgemäß arbeitet.
24
// + Er wird die Software gründlich auf deren Verwendbarkeit zu dem von ihm beabsichtigten Zweck testen, bevor er diese operativ einsetzt.
25
// + Der Kunde wird er seine Daten vor Einsatz der Software nach dem Stand der Technik sichern.
26
// + Der Kunde ist darüber unterrichtet, dass der Lizenzgeber seine Daten im zur Vertragsdurchführung erforderlichen Umfang
27
// + und auf Grundlage der Datenschutzvorschriften erhebt, speichert, verarbeitet und, sofern notwendig, an Dritte übermittelt.
28
// + *) Die räumliche Nutzung bezieht sich nur auf den Einsatzort, nicht auf die Reichweite der programmierten Software.
29
// + #### ENDE DER NUTZUNGSBEDINGUNGEN ####'
30
// +  Hinweis: Informationen über erweiterte Nutzungsrechte (wie z.B. Nutzung für nicht-private Zwecke) sind auf Anfrage per Email an info(@)hisystems.de verfügbar.
1 ingob 31
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
360 holgerb 32
// + Software LICENSING TERMS
1 ingob 33
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
360 holgerb 34
// + of HiSystems GmbH, Flachsmeerstrasse 2, 26802 Moormerland, Germany - the Licensor -
489 killagreg 35
// + The Licensor grants the customer a non-exclusive license to use the microcontroller firmware of the Flight-Ctrl, Navi-Ctrl, BL-Ctrl, and MK3Mag hardware
360 holgerb 36
// + (the Software) exclusively for private purposes. The License is unrestricted with respect to time and territory*.
37
// + The Software may only be used with the Licensor's products.
38
// + The Software provided by the Licensor is protected by copyright. With respect to the relationship between the parties to this
39
// + agreement, all rights pertaining to the Software and other documents provided during the preparation and execution of this
40
// + agreement shall be the property of the Licensor.
41
// + The information contained in the Software copyright notices, trademarks, other legal reservations, serial numbers and other
42
// + features that can be used to identify the program may not be altered or defaced by the customer.
43
// + The customer shall be responsible for taking reasonable precautions
44
// + for the safe use of the Software. The customer shall test the Software thoroughly regarding its suitability for the
45
// + intended purpose before implementing it for actual operation. The Licensor's liability shall be limited to the extent of typical and
46
// + foreseeable damage to the extent permitted by law, notwithstanding statutory liability for bodily injury and product
47
// + liability. However, the Licensor shall be entitled to the defense of contributory negligence.
48
// + The customer will take adequate precautions in the case, that the software is not working properly. The customer will test
49
// + the software for his purpose before any operational usage. The customer will backup his data before using the software.
50
// + The customer understands that the Licensor collects, stores and processes, and, where required, forwards, customer data
51
// + to third parties to the extent necessary for executing the agreement, subject to applicable data protection and privacy regulations.
52
// + *) The territory aspect only refers to the place where the Software is used, not its programmed range.
53
// + #### END OF LICENSING TERMS ####
54
// + Note: For information on license extensions (e.g. commercial use), please contact us at info(@)hisystems.de.
1 ingob 55
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
41 ingob 56
//#define MCLK96MHZ
1 ingob 57
const unsigned long _Main_Crystal = 25000;
491 killagreg 58
//#include <stdio.h>
693 holgerb 59
#include <string.h>
41 ingob 60
#include "91x_lib.h"
61
#include "led.h"
62
#include "uart0.h"
63
#include "uart1.h"
64
#include "uart2.h"
215 killagreg 65
#include "gps.h"
489 killagreg 66
#include "i2c.h"
242 killagreg 67
#include "compass.h"
426 holgerb 68
#include "ncmag.h"
119 killagreg 69
#include "timer1.h"
70
#include "timer2.h"
134 killagreg 71
#include "analog.h"
41 ingob 72
#include "spi_slave.h"
73
#include "fat16.h"
74
#include "sdc.h"
82 killagreg 75
#include "logging.h"
156 killagreg 76
#include "params.h"
88 killagreg 77
#include "settings.h"
154 killagreg 78
#include "config.h"
1 ingob 79
#include "main.h"
250 ingob 80
#include "debug.h"
254 killagreg 81
#include "eeprom.h"
350 holgerb 82
#include "ssc.h"
362 holgerb 83
#include "sdc.h"
380 holgerb 84
#include "uart1.h"
688 holgerb 85
#include "canbus.h"
254 killagreg 86
 
427 killagreg 87
 
314 killagreg 88
#ifdef FOLLOW_ME
89
u8 TransmitAlsoToFC = 0;
90
#endif
41 ingob 91
u32 TimerCheckError;
489 killagreg 92
u8 ErrorCode = 0;
41 ingob 93
u16 BeepTime;
92 killagreg 94
u8  NCFlags = 0;
153 killagreg 95
s16 GeoMagDec = 0; // local magnetic declination in 0.1 deg
328 holgerb 96
u8 ErrorGpsFixLost = 0;
513 killagreg 97
u8 FromFC_LoadWP_List = 0, FromFC_Load_SinglePoint = 0, FromFC_Save_SinglePoint = 0;
531 holgerb 98
u8 ToFC_MaxWpListIndex = 4;
255 killagreg 99
u8 ClearFCStatusFlags = 0;
41 ingob 100
u8 StopNavigation = 0;
378 holgerb 101
volatile u32 PollingTimeout = 10000;
41 ingob 102
Param_t Parameter;
699 holgerb 103
Partner_t Partner;
78 holgerb 104
volatile FC_t FC;
378 holgerb 105
volatile u32 SPIWatchDog = 15000; // stop Navigation if this goes to zero
400 holgerb 106
volatile u32 SD_WatchDog = 15000; // stop Logging if this goes to zero
663 holgerb 107
u32 CountGpsProcessedIn5Sec = 50,CountNewGpsDataIn5Sec = 25, FreqGpsNavProcessed = 0, FreqNewGpsData = 0;
504 holgerb 108
u8 NewWPL_Name = 0;
532 holgerb 109
u32 MaxWP_Radius_in_m = 0;
41 ingob 110
s8 ErrorMSG[25];
699 holgerb 111
s8 PartnerErrorMSG[25] = "     ---                \0";
533 holgerb 112
u32 TimeSinceMotorStart = 0;
699 holgerb 113
u8 IamMaster = NOTHING; // for Master/Slave Redundance
41 ingob 114
 
1 ingob 115
//----------------------------------------------------------------------------------------------------
41 ingob 116
void SCU_Config(void)
1 ingob 117
{
41 ingob 118
        /* configure PLL and set it as master clock source */
119
        SCU_MCLKSourceConfig(SCU_MCLK_OSC);             // set master clock source to external oscillator clock (25MHz) before diabling the PLL
120
        SCU_PLLCmd(DISABLE);                                    // now disable the PLL
121
        #ifdef MCLK96MHZ
122
        SCU_BRCLKDivisorConfig(SCU_BRCLK_Div2); // set BRCLK to MCLK/2 = 48MHz
123
        SCU_PCLKDivisorConfig(SCU_PCLK_Div4);   // set PCLK     (APB bus clock) divisor to 4 (half Reference Clock)
124
        SCU_RCLKDivisorConfig(SCU_RCLK_Div2);   // set RCLK     (Reference Clock) divisor to 1 (full PPL clock)
125
        SCU_HCLKDivisorConfig(SCU_HCLK_Div2);   // set HCLK     (AHB bus clock) divisor to 1 (full Reference Clock)
126
        SCU_PLLFactorsConfig(192,25,2);                 // PLL = 96 MHz, Feedback Divider N=192, Pre-Divider M=25, Post-Divider P=2
127
        #else
128
        SCU_BRCLKDivisorConfig(SCU_BRCLK_Div1); // set BRCLK to MCLK = 48MHz
129
        SCU_PCLKDivisorConfig(SCU_PCLK_Div2);   // set PCLK     (APB bus clock) divisor to 2 (half Reference Clock)
130
        SCU_RCLKDivisorConfig(SCU_RCLK_Div1);   // set RCLK     (Reference Clock) divisor to 1 (full PPL clock)
131
        SCU_HCLKDivisorConfig(SCU_HCLK_Div1);   // set HCLK     (AHB bus clock) divisor to 1 (full Reference Clock)
132
        SCU_PLLFactorsConfig(192,25,3);                 // PLL = 48 MHz, Feedback Divider N=192, Pre-Divider M=25, Post-Divider P=3
133
        #endif
134
        SCU_PLLCmd(ENABLE);                                     // Enable PLL (is disabled by SCU_PLLFactorsConfig)
135
        SCU_MCLKSourceConfig(SCU_MCLK_PLL);     // set master clock source to PLL
136
}
1 ingob 137
 
41 ingob 138
//----------------------------------------------------------------------------------------------------
139
void GetNaviCtrlVersion(void)
1 ingob 140
{
41 ingob 141
        u8 msg[25];
270 killagreg 142
 
530 holgerb 143
        sprintf(msg,"\n\r NaviCtrl HW: V%d.%d SW: V%d.%02d%c", UART_VersionInfo.HWMajor/10, UART_VersionInfo.HWMajor%10, VERSION_MAJOR,  VERSION_MINOR, 'a'+ VERSION_PATCH);
110 killagreg 144
        UART1_PutString(msg);
1 ingob 145
}
146
 
147
//----------------------------------------------------------------------------------------------------
231 holgerb 148
 
41 ingob 149
void CheckErrors(void)
150
{
516 holgerb 151
    static s32 no_error_delay = 0;
328 holgerb 152
        s32 newErrorCode = 0;
232 killagreg 153
        UART_VersionInfo.HardwareError[0] = 0;
231 holgerb 154
 
489 killagreg 155
        if(CheckDelay(I2CBus(Compass_I2CPort)->Timeout) || (Compass_Heading < 0)) DebugOut.StatusRed |= AMPEL_COMPASS;
338 holgerb 156
        else DebugOut.StatusRed &= ~AMPEL_COMPASS; // MK3Mag green status
231 holgerb 157
 
338 holgerb 158
        if((FC.Error[1] & FC_ERROR1_I2C) || (FC.Error[1] & FC_ERROR1_BL_MISSING)) DebugOut.StatusRed |= AMPEL_BL;
159
        else DebugOut.StatusRed &= ~AMPEL_BL; // BL-Ctrl green status
232 killagreg 160
 
338 holgerb 161
        if(UART_VersionInfo.HardwareError[0] || UART_VersionInfo.HardwareError[1]) DebugOut.StatusRed |= AMPEL_NC;
162
        else DebugOut.StatusRed &= ~AMPEL_NC;
163
 
483 holgerb 164
 
489 killagreg 165
        if(CheckDelay(I2CBus(Compass_I2CPort)->Timeout))
41 ingob 166
        {
489 killagreg 167
                LED_RED_ON;
472 holgerb 168
                sprintf(ErrorMSG,"no compass communica");
489 killagreg 169
                //Reset Compass communication
501 holgerb 170
                if(Compass_I2CPort == NCMAG_PORT_EXTERN) I2CBus_Init(I2C0);     else I2CBus_Init(I2C1);
489 killagreg 171
                Compass_Init();
472 holgerb 172
                newErrorCode = 4;
41 ingob 173
                StopNavigation = 1;
472 holgerb 174
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_COMPASS_RX;
175
                DebugOut.StatusRed |= AMPEL_COMPASS;
41 ingob 176
        }
488 holgerb 177
        else if(CompassValueErrorCount > 30)
178
        {
179
                LED_RED_ON;
180
                sprintf(ErrorMSG,"compass sensor error");
181
                newErrorCode = 34;
182
                StopNavigation = 1;
183
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_COMPASS_VALUE;
501 holgerb 184
                if(Compass_I2CPort == NCMAG_PORT_EXTERN) I2CBus_Init(I2C0);     else I2CBus_Init(I2C1);
489 killagreg 185
                Compass_Init();
488 holgerb 186
        }
489 killagreg 187
        else if((FCCalibActive || CompassCalState) && FC_Version.Hardware)
188
        {
488 holgerb 189
                sprintf(ErrorMSG,"Calibrate... ");
489 killagreg 190
                newErrorCode = 0;
488 holgerb 191
                ErrorCode = 0;
192
                no_error_delay = 1;
489 killagreg 193
        }
194
        else if(CheckDelay(SPI0_Timeout))
483 holgerb 195
        {
489 killagreg 196
                LED_RED_ON;
472 holgerb 197
                sprintf(ErrorMSG,"no FC communication ");
198
                newErrorCode = 3;
199
                StopNavigation = 1;
200
                DebugOut.StatusGreen &= ~AMPEL_FC; // status of FC Present
201
                DebugOut.StatusGreen &= ~AMPEL_BL; // status of BL Present
202
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_SPI_RX;
203
        }
41 ingob 204
        else if(FC_Version.Compatible != FC_SPI_COMPATIBLE)
205
        {
206
                LED_RED_ON;
318 holgerb 207
#ifndef FOLLOW_ME
41 ingob 208
                sprintf(ErrorMSG,"FC not compatible ");
318 holgerb 209
#else
210
                sprintf(ErrorMSG,"! FollowMe only ! ");
211
#endif
328 holgerb 212
                newErrorCode = 1;
41 ingob 213
                StopNavigation = 1;
256 killagreg 214
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_FC_INCOMPATIBLE;
338 holgerb 215
                DebugOut.StatusRed |= AMPEL_NC;
41 ingob 216
        }
255 killagreg 217
        else if(FC.Error[0] & FC_ERROR0_GYRO_NICK)
231 holgerb 218
        {
219
                LED_RED_ON;
220
                sprintf(ErrorMSG,"ERR: FC Nick Gyro");
328 holgerb 221
                newErrorCode = 10;
232 killagreg 222
        }
255 killagreg 223
        else if(FC.Error[0] & FC_ERROR0_GYRO_ROLL)
231 holgerb 224
        {
225
                LED_RED_ON;
226
                sprintf(ErrorMSG,"ERR: FC Roll Gyro");
328 holgerb 227
                newErrorCode = 11;
232 killagreg 228
        }
255 killagreg 229
        else if(FC.Error[0] & FC_ERROR0_GYRO_YAW)
231 holgerb 230
        {
231
                LED_RED_ON;
232
                sprintf(ErrorMSG,"ERR: FC Yaw Gyro");
328 holgerb 233
                newErrorCode = 12;
232 killagreg 234
        }
255 killagreg 235
        else if(FC.Error[0] & FC_ERROR0_ACC_NICK)
231 holgerb 236
        {
237
                LED_RED_ON;
238
                sprintf(ErrorMSG,"ERR: FC Nick ACC");
328 holgerb 239
                newErrorCode = 13;
232 killagreg 240
        }
255 killagreg 241
        else if(FC.Error[0] & FC_ERROR0_ACC_ROLL)
231 holgerb 242
        {
243
                LED_RED_ON;
244
                sprintf(ErrorMSG,"ERR: FC Roll ACC");
328 holgerb 245
                newErrorCode = 14;
232 killagreg 246
        }
255 killagreg 247
        else if(FC.Error[0] & FC_ERROR0_ACC_TOP)
231 holgerb 248
        {
249
                LED_RED_ON;
327 holgerb 250
                sprintf(ErrorMSG,"ERR:FC Z-ACC");
328 holgerb 251
                newErrorCode = 15;
232 killagreg 252
        }
351 holgerb 253
        else if(NC_To_FC_Flags & NC_TO_FC_FLYING_RANGE)
254
        {
255
                LED_RED_ON;
256
                sprintf(ErrorMSG,"ERR:Flying range!");
257
                newErrorCode = 28;
258
        }
255 killagreg 259
        else if(FC.Error[0] & FC_ERROR0_PRESSURE)
231 holgerb 260
        {
489 killagreg 261
                LED_RED_ON;
327 holgerb 262
                sprintf(ErrorMSG,"ERR:Pressure sensor");
328 holgerb 263
                newErrorCode = 16;
232 killagreg 264
        }
255 killagreg 265
        else if(FC.Error[1] &  FC_ERROR1_I2C)
231 holgerb 266
        {
267
                LED_RED_ON;
327 holgerb 268
                sprintf(ErrorMSG,"ERR:I2C FC to BL");
328 holgerb 269
                newErrorCode = 17;
232 killagreg 270
        }
255 killagreg 271
        else if(FC.Error[1] &  FC_ERROR1_BL_MISSING)
231 holgerb 272
        {
273
                LED_RED_ON;
274
                sprintf(ErrorMSG,"ERR: Bl Missing");
328 holgerb 275
                newErrorCode = 18;
232 killagreg 276
        }
255 killagreg 277
        else if(FC.Error[1] &  FC_ERROR1_MIXER)
231 holgerb 278
        {
279
                LED_RED_ON;
280
                sprintf(ErrorMSG,"Mixer Error");
328 holgerb 281
                newErrorCode = 19;
232 killagreg 282
        }
350 holgerb 283
        else if(CheckDelay(UBX_Timeout) && Parameter.GlobalConfig & FC_CFG_GPS_AKTIV)
41 ingob 284
        {
285
                LED_RED_ON;
548 holgerb 286
                sprintf(ErrorMSG,"no GPS communication");
287
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_GPS_RX;
288
                UART_VersionInfo.Flags &= ~NC_VERSION_FLAG_GPS_PRESENT;
289
                newErrorCode = 5;
41 ingob 290
                StopNavigation = 1;
548 holgerb 291
//UBX_Setup();
292
//UBX_Timeout = SetDelay(500);
41 ingob 293
        }
426 holgerb 294
        else if(Compass_Heading < 0 && NCMAG_Present && !NCMAG_IsCalibrated)
295
        {
296
                LED_RED_ON;
297
                sprintf(ErrorMSG,"compass not calibr.");
298
                newErrorCode = 31;
299
                StopNavigation = 1;
300
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_COMPASS_VALUE;
301
        }
254 killagreg 302
        else if(Compass_Heading < 0)
41 ingob 303
        {
304
                LED_RED_ON;
305
                sprintf(ErrorMSG,"bad compass value ");
328 holgerb 306
                newErrorCode = 6;
41 ingob 307
                StopNavigation = 1;
256 killagreg 308
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_COMPASS_VALUE;
41 ingob 309
        }
255 killagreg 310
        else if((FC.Error[1] &  FC_ERROR1_SPI_RX))
199 killagreg 311
        {
312
                LED_RED_ON;
313
                sprintf(ErrorMSG,"FC spi rx error ");
328 holgerb 314
                newErrorCode = 8;
213 killagreg 315
                StopNavigation = 1;
199 killagreg 316
        }
255 killagreg 317
        else if(FC.Error[0] &  FC_ERROR0_CAREFREE)
231 holgerb 318
        {
319
                LED_RED_ON;
320
                sprintf(ErrorMSG,"FC: Carefree Error");
328 holgerb 321
                newErrorCode = 20;
232 killagreg 322
        }
255 killagreg 323
        else if(FC.Error[1] &  FC_ERROR1_PPM)
41 ingob 324
        {
325
                LED_RED_ON;
326
                sprintf(ErrorMSG,"RC Signal lost ");
328 holgerb 327
                newErrorCode = 7;
41 ingob 328
        }
489 killagreg 329
        else if(ErrorGpsFixLost)
328 holgerb 330
        {
489 killagreg 331
                LED_RED_ON;
332
                sprintf(ErrorMSG,"GPS Fix lost    ");
333
                newErrorCode = 21;
328 holgerb 334
        }
330 holgerb 335
        else if(ErrorDisturbedEarthMagnetField)
336
        {
489 killagreg 337
                LED_RED_ON;
338
                sprintf(ErrorMSG,"Magnet error    ");
339
                newErrorCode = 22;
340
                DebugOut.StatusRed |= AMPEL_COMPASS | AMPEL_NC;
341
                UART_VersionInfo.HardwareError[0] |= NC_ERROR0_COMPASS_VALUE;
330 holgerb 342
        }
533 holgerb 343
        else if(((ErrorCheck_BL_MinOfMaxPWM == 40 && (TimeSinceMotorStart > 3))  || (ErrorCheck_BL_MinOfMaxPWM == 39)) && !ErrorCode)
338 holgerb 344
        {
489 killagreg 345
                LED_RED_ON;
346
                sprintf(ErrorMSG,"ERR:Motor restart  ");
347
                newErrorCode = 23;
348
                DebugOut.StatusRed |= AMPEL_BL;
338 holgerb 349
        }
472 holgerb 350
        else if(BL_MinOfMaxPWM < 30 && !ErrorCode)
338 holgerb 351
        {
489 killagreg 352
                u16 i;
516 holgerb 353
                for(i = 0; i < 12; i++) if(Motor[i].MaxPWM == BL_MinOfMaxPWM) break;
489 killagreg 354
                LED_RED_ON;
355
                sprintf(ErrorMSG,"ERR:BL%2d Test:%2d ",i+1,BL_MinOfMaxPWM);
516 holgerb 356
                newErrorCode = 32;
357
                DebugOut.StatusRed |= AMPEL_BL;
472 holgerb 358
        }
533 holgerb 359
        else if(ErrorCheck_BL_MinOfMaxPWM < 248 && (TimeSinceMotorStart > 3) && !ErrorCode)
472 holgerb 360
        {
489 killagreg 361
                LED_RED_ON;
362
                sprintf(ErrorMSG,"ERR:BL Limitation   ");
363
                newErrorCode = 24;
364
                DebugOut.StatusRed |= AMPEL_BL;
338 holgerb 365
        }
491 killagreg 366
        else if((NCFlags & NC_FLAG_RANGE_LIMIT) && (FC.StatusFlags & FC_STATUS_FLY) && !ErrorCode)
348 holgerb 367
        {
489 killagreg 368
                LED_RED_ON;
532 holgerb 369
                sprintf(ErrorMSG,"ERR:GPS WP range ");
489 killagreg 370
                newErrorCode = 25;
371
                DebugOut.StatusRed |= AMPEL_NC;
348 holgerb 372
        }
397 holgerb 373
        else if((!SD_SWITCH || (SDCardInfo.Valid == 0)) && Parameter.GlobalConfig3 & CFG3_NO_SDCARD_NO_START && !(FC.StatusFlags & FC_STATUS_FLY))
350 holgerb 374
        {
489 killagreg 375
                LED_RED_ON;
376
                sprintf(ErrorMSG,"ERR:No SD-Card  ");
377
                newErrorCode = 26;
378
                DebugOut.StatusRed |= AMPEL_NC;
350 holgerb 379
        }
383 holgerb 380
        else if((SD_LoggingError || (SD_WatchDog < 2000 && SD_WatchDog != 0)) && Parameter.GlobalConfig3 & CFG3_NO_SDCARD_NO_START)
351 holgerb 381
        {
489 killagreg 382
                LED_RED_ON;
383
                sprintf(ErrorMSG,"ERR:SD Logging abort");
384
                newErrorCode = 27;
385
                DebugOut.StatusRed |= AMPEL_NC;
386
                SD_LoggingError = 0;
351 holgerb 387
        }
355 holgerb 388
        else if(((AbsoluteFlyingAltitude) && (NaviData.Altimeter / 20 >= AbsoluteFlyingAltitude)) && (FC.StatusFlags & FC_STATUS_FLY))
389
        {
489 killagreg 390
                LED_RED_ON;
391
                sprintf(ErrorMSG,"ERR:Max Altitude ");
392
                newErrorCode = 29;
393
                DebugOut.StatusRed |= AMPEL_NC;
355 holgerb 394
        }
516 holgerb 395
        else if(Parameter.GlobalConfig3 & CFG3_NO_GPSFIX_NO_START && !(NCFlags & NC_FLAG_GPS_OK) && ((FC.StatusFlags & (FC_STATUS_START | FC_STATUS_MOTOR_RUN)) || (FC.StickGas < -50 && FC.StickYaw < -50)))
489 killagreg 396
        {
397
                LED_RED_ON;
398
                sprintf(ErrorMSG,"No GPS Fix      ");
399
                newErrorCode = 30;
398 holgerb 400
        }
663 holgerb 401
        else if((FreqNewGpsData <= 35 || FreqNewGpsData > 60) && TimeSinceMotorStart > 15)
646 holgerb 402
        {
403
                LED_RED_ON;
659 holgerb 404
                sprintf(ErrorMSG,"GPS Update rate ");
405
                newErrorCode = 38;
646 holgerb 406
        }
615 holgerb 407
        else if(NC_GPS_ModeCharacter == 'F')
408
        {                                                                
409
                sprintf(ErrorMSG,"FAILSAFE pos.!  ");
410
                newErrorCode = 35;
411
        }
412
        else if(FC.StatusFlags3 & FC_STATUS3_REDUNDANCE_ERROR)
413
        {                                                                
414
                sprintf(ErrorMSG,"ERR:Redundancy  ");
415
                newErrorCode = 36;
416
        }
417
        else if(FC.StatusFlags3 & FC_STATUS3_REDUNDANCE_TEST)
418
        {                                                                
419
                sprintf(ErrorMSG,"Redundancy test ");
420
                newErrorCode = 37;
421
        }
699 holgerb 422
        else if(CanbusTimeOut == 1)
423
        {                                                                
424
                sprintf(ErrorMSG,"ERR: Canbus");
425
                newErrorCode = 39;
426
        }
41 ingob 427
        else // no error occured
428
        {
429
                StopNavigation = 0;
430
                LED_RED_OFF;
489 killagreg 431
                if(no_error_delay) { no_error_delay--;  }
432
                else
433
                {
434
                        sprintf(ErrorMSG,"No Error            ");
435
                        ErrorCode = 0;
436
                }
41 ingob 437
        }
328 holgerb 438
 
516 holgerb 439
    if(newErrorCode)
440
         {
441
          if(FC.StatusFlags & FC_STATUS_MOTOR_RUN) no_error_delay = 8; // delay the errors if the motors are running
442
          ErrorCode = newErrorCode;
443
         }
444
 FC.Error[0] = 0;
445
 FC.Error[1] = 0;
446
 FC.Error[2] = 0;
447
 FC.Error[3] = 0;
448
 FC.Error[4] = 0;
449
 ErrorGpsFixLost = 0;
530 holgerb 450
 ErrorCheck_BL_MinOfMaxPWM = BL_MinOfMaxPWM;
41 ingob 451
}
24 StephanB 452
 
693 holgerb 453
unsigned char RAM_Checksum(unsigned char* pBuffer, u16 len)
454
{
455
        u8 crc = 0xAA;
456
        u16 i;
457
        for(i=0; i<len; i++) crc += pBuffer[i];
458
        return crc;
459
}
378 holgerb 460
 
461
 
484 holgerb 462
u8 Polling(void)
378 holgerb 463
{
564 holgerb 464
        static u8 running = 0, oldFcFlags = 0, count5sec, TimeoutGPS_Process;
489 killagreg 465
        static u32 old_ms = 0;
466
 
516 holgerb 467
        if(running) {/*DebugOut.Analog[]++;*/ return(1);};
489 killagreg 468
        running = 1;
469
 
470
        if(CountMilliseconds != old_ms)  // 1 ms
471
        {
699 holgerb 472
                if(CanbusTimeOut >= 2) CanbusTimeOut--;
483 holgerb 473
                old_ms = CountMilliseconds;
474
                Compass_Update();               // update compass communication
475
                Analog_Update();                // get new ADC values
476
                CalcHeadFree();
688 holgerb 477
                if(UART_VersionInfo.HWMajor >= 30) ProcessCanBus();
564 holgerb 478
                if(!CheckDelay(SPI0_Timeout)) TimeoutGPS_Process = 0;
479
                else if(CountMilliseconds - SPI0_Timeout > 30000000L) SPI0_Timeout = CountMilliseconds; // avoid too long overflows
480
                if(++TimeoutGPS_Process >= 25)
481
                 {
482
                  GPS_Navigation(&GPSData, &(ToFlightCtrl.GPSStick)); // process the GPS data even if the FC is not connected
483
                  TimeoutGPS_Process = 0;
484
                 }
483 holgerb 485
        }
488 holgerb 486
 
489 killagreg 487
        SPI0_UpdateBuffer();    // also calls the GPS-functions
488
        UART0_ProcessRxData();  // GPS process request
489
        UART0_TransmitTxData(); // GPS send answer
490
        UART1_ProcessRxData();  // PC process request
491
        UART1_TransmitTxData(); // PC send answer
492
        UART2_TransmitTxData(); // FC send answer
493
 
533 holgerb 494
        if(!(FC.StatusFlags & FC_STATUS_MOTOR_RUN)) TimeSinceMotorStart = 0;
495
 
693 holgerb 496
        if(HugeBlockFromFC.WhoAmI == 1) // contains eeprom-Data
497
         {
498
      u8 crc1, crc2;
499
          crc1 = HugeBlockFromFC.Data[sizeof(EE_Parameter)-1];                                                  // contains the EE_Parameter.crc
500
          crc2 = RAM_Checksum((u8 *)(&HugeBlockFromFC.Data), sizeof(EE_Parameter)-1);   // calculates the current crc
501
          if(crc1 == crc2)
502
           {
503
                memcpy(&EE_Parameter, (u8 *) HugeBlockFromFC.Data, sizeof(EE_Parameter));
504
                RequestConfigFromFC = 0;
505
           }
506
                HugeBlockFromFC.WhoAmI = 0;
507
         }
508
 
663 holgerb 509
    if(FCCalibActive)
510
            {
511
             count5sec = 0;
512
             FreqNewGpsData = 50;
513
             CountNewGpsDataIn5Sec = 25;
514
             CountGpsProcessedIn5Sec = 0;
515
             TimerCheckError = SetDelay(1000);
516
            }
517
 
489 killagreg 518
        // ---------------- Error Check Timing ----------------------------
519
        if(CheckDelay(TimerCheckError) || (FC.StatusFlags & FC_STATUS_START && !(oldFcFlags & FC_STATUS_START))) // Timer or FY wants to start
520
        {
521
                if(CheckDelay(TimerCheckError))
380 holgerb 522
                {
489 killagreg 523
                        TimerCheckError = SetDelay(1000);
524
                        if(CompassValueErrorCount) CompassValueErrorCount--;
525
                        if(++count5sec == 5)
526
                        {
663 holgerb 527
                                FreqGpsNavProcessed = CountGpsProcessedIn5Sec * 2; //400 = 40Hz
528
                                FreqNewGpsData = CountNewGpsDataIn5Sec;                    // 50 = 5,0Hz
529
 
453 holgerb 530
                                count5sec = 0;
489 killagreg 531
                                CountGpsProcessedIn5Sec = 0;
659 holgerb 532
                                CountNewGpsDataIn5Sec = FreqNewGpsData / 2;
663 holgerb 533
                                ConfirmGpsUpdateRate(FreqNewGpsData);
489 killagreg 534
                        }
380 holgerb 535
                }
489 killagreg 536
                oldFcFlags = FC.StatusFlags;
564 holgerb 537
//              if(CheckDelay(SPI0_Timeout) && (DebugUART == UART1)) GPS_Navigation(&GPSData, &(ToFlightCtrl.GPSStick)); // process the GPS data even if the FC is not connected
489 killagreg 538
 
539
                if(!CheckDelay(SPI0_Timeout) || (DebugUART == UART1)) CheckErrors();
540
 
533 holgerb 541
                if(FC.StatusFlags & FC_STATUS_FLY)
542
                 {
543
                  NaviData.FlyingTime++; // we want to count the battery-time
544
                  TimeSinceMotorStart++;
545
                 }
546
 
489 killagreg 547
                if(SerialLinkOkay) SerialLinkOkay--;
594 holgerb 548
                if(SerialLinkOkay < 250 - 6) NCFlags |= NC_FLAG_NOSERIALLINK; // 6 seconds timeout for serial communication
489 killagreg 549
                else NCFlags &= ~NC_FLAG_NOSERIALLINK;
550
                if(StopNavigation && (Parameter.NaviGpsModeControl >=  50) && (Parameter.GlobalConfig & FC_CFG_GPS_AKTIV)) BeepTime = 1000;
551
        }
552
        running = 0;
514 holgerb 553
//      if(!PollingTimeout) DebugOut.Analog[17]++;
489 killagreg 554
        return(0);
378 holgerb 555
}
556
 
380 holgerb 557
// the handler will be cyclic called by the timer 1 ISR
558
// used is for critical timing parts that normaly would handled
559
// within the main loop that could block longer at logging activities
483 holgerb 560
void EXTIT3_IRQHandler(void)  // 1ms - Takt
154 killagreg 561
{
195 killagreg 562
        IENABLE;
154 killagreg 563
        VIC_ITCmd(EXTIT3_ITLine,DISABLE); // disable irq
489 killagreg 564
 
516 holgerb 565
        if(PollingTimeout == 0)
566
        {
567
                PollingTimeout = 5;
568
                //if(Polling() == 0) DebugOut.Analog[]++;
569
                Polling();
380 holgerb 570
        }
378 holgerb 571
 
572
        VIC_SWITCmd(EXTIT3_ITLine,DISABLE); // clear pending bit
195 killagreg 573
        VIC_ITCmd(EXTIT3_ITLine, ENABLE); // enable irq
574
        IDISABLE;
378 holgerb 575
        VIC1->VAR = 0xFF; // write any value to VIC0 Vector address register
154 killagreg 576
}
577
 
41 ingob 578
//----------------------------------------------------------------------------------------------------
579
int main(void)
580
{
489 killagreg 581
 
582
//      static u32 ftimer =0;
583
//      static u8 fstate = 0;
456 holgerb 584
//      static File_t* f = NULL;
489 killagreg 585
 
586
 
41 ingob 587
        /* Configure the system clocks */
588
        SCU_Config();
589
        /* init VIC (Vectored Interrupt Controller)     */
590
        SCU_AHBPeriphClockConfig(__VIC,ENABLE); // enable AHB bus clock for VIC
591
        SCU_AHBPeriphReset(__VIC, DISABLE);             // disable reset state for VIC
592
        VIC_DeInit();                                                   // deinitializes the VIC module registers to their default reset values.
196 killagreg 593
        VIC_InitDefaultVectors();
594
 
119 killagreg 595
        // initialize timer 1 for System Clock and delay rountines
41 ingob 596
        TIMER1_Init();
597
        // initialize the LEDs (needs Timer 1)
598
        Led_Init();
599
        // initialize the debug UART1
600
        UART1_Init();
110 killagreg 601
        UART1_PutString("\r\n---------------------------------------------");
120 killagreg 602
        // initialize timer 2 for servo outputs
180 killagreg 603
        //TIMER2_Init();
41 ingob 604
        // initialize UART2 to FLIGHTCTRL
605
        UART2_Init();
606
        // initialize UART0 (to MKGPS or MK3MAG)
607
        UART0_Init();
134 killagreg 608
        // initialize adc
609
        Analog_Init();
41 ingob 610
        // initialize SPI0 to FC
611
        SPI0_Init();
469 killagreg 612
        // initialize i2c busses (needs Timer 1)
489 killagreg 613
        I2CBus_Init(I2C0);
614
        I2CBus_Init(I2C1);
247 killagreg 615
        // initialize fat16 partition on sd card (needs Timer 1)
41 ingob 616
        Fat16_Init();
156 killagreg 617
        // initialize NC params
618
        NCParams_Init();
88 killagreg 619
        // initialize the settings
620
        Settings_Init();
92 killagreg 621
        // initialize logging (needs settings)
82 killagreg 622
        Logging_Init();
1 ingob 623
 
699 holgerb 624
if(UART_VersionInfo.HWMajor < 30) IamMaster = SLAVE; else IamMaster = MASTER;
625
 
626
//UART_VersionInfo.HWMajor = 30;
362 holgerb 627
        LED_GRN_ON;
41 ingob 628
        TimerCheckError = SetDelay(3000);
175 holgerb 629
        UART1_PutString("\r\n++++++++++++++++++++++++++++++++++++++++++");
110 killagreg 630
        UART1_PutString("\n\r Version information:");
116 killagreg 631
 
41 ingob 632
        GetNaviCtrlVersion();
338 holgerb 633
        DebugOut.StatusGreen = AMPEL_NC | AMPEL_COMPASS; // NC and MK3Mag
634
        DebugOut.StatusRed = 0x00;
400 holgerb 635
        UART1_PutString("\r\n++++++++++++++++++++++++++++++++++++++++++");
149 killagreg 636
 
516 holgerb 637
        Compass_Init();
270 killagreg 638
 
548 holgerb 639
        UBX_Setup(); // inits the GPS-Module via ubx
400 holgerb 640
        GPS_Init();
641
 
314 killagreg 642
#ifdef FOLLOW_ME
643
        TransmitAlsoToFC = 1;
644
        UART1_PutString("\r\n++++++++++++++++++++++++++++++++++++++++++");
645
        UART1_PutString("\n\r FOLLOW-ME Transmitter only!");
646
        UART1_PutString("\r\n++++++++++++++++++++++++++++++++++++++++++\r\n\r\n");
647
        TransmitAlsoToFC = 0;
648
#else
150 killagreg 649
        SPI0_GetFlightCtrlVersion();
650
        if(FC_Version.Compatible != FC_SPI_COMPATIBLE)
41 ingob 651
        {
461 holgerb 652
                UART1_PutString("\n\r Flight-Ctrl not compatible\n\r");
41 ingob 653
                LED_RED_ON;
654
        }
314 killagreg 655
#endif
528 holgerb 656
 
213 killagreg 657
        // ---------- Prepare the isr driven
154 killagreg 658
        // set to absolute lowest priority
516 holgerb 659
    VIC_Config(EXTIT3_ITLine, VIC_IRQ, PRIORITY_SW);
195 killagreg 660
        // enable interrupts
516 holgerb 661
    VIC_ITCmd(EXTIT3_ITLine, ENABLE);
244 killagreg 662
 
250 ingob 663
        Debug_OK("START");
362 holgerb 664
        UART1_PutString("\r\n");
380 holgerb 665
        fifo_purge(&UART1_rx_fifo); // flush the whole fifo init buffer
666
        LED_GRN_ON;
667
        LED_RED_OFF;
530 holgerb 668
    Settings_GetParamValue(PID_SEND_NMEA,(u16 *) &NMEA_Interval);
461 holgerb 669
        UART1_PutString("\r\n");
528 holgerb 670
 
487 holgerb 671
        CompassValueErrorCount = 0;
503 holgerb 672
        I2CBus(Compass_I2CPort)->Timeout = SetDelay(3000);
688 holgerb 673
 
674
        // Intilizes the Canbus
675
        if(UART_VersionInfo.HWMajor >= 30) CanbusInit();
528 holgerb 676
// ++++++++++++++++++++++++++++++++++++++++++++++
154 killagreg 677
        for (;;) // the endless main loop
41 ingob 678
        {
484 holgerb 679
                PollingTimeout = 5;
431 killagreg 680
                Polling();
500 holgerb 681
// ++++++++++++++++++++++++++++++++++++++++++++++
682
                if(FromFC_LoadWP_List)
516 holgerb 683
                {
684
                   WPL_Store.Index = (FromFC_LoadWP_List & ~0x80);
685
                   if(WPL_Store.Index <= ToFC_MaxWpListIndex)
686
                   {
513 killagreg 687
                                if(PointList_ReadFromFile(&WPL_Store) == WPL_OK)
688
                                {
689
                                        if(FromFC_LoadWP_List & 0x80)// -> load relative
516 holgerb 690
                                        {
540 holgerb 691
                                         u32 angle;
692
                                         angle = (360 + GyroCompassCorrected/10 + Parameter.OrientationAngle * 15) % 360;
513 killagreg 693
                                                if(NCFlags & NC_FLAG_FREE || NaviData.TargetPositionDeviation.Distance > 7*10)
516 holgerb 694
                                        {  // take actual position
540 holgerb 695
                                                if(!PointList_Move(1,&(GPSData.Position),angle)) PointList_Clear();     // try to move wp-list so that 1st entry matches the current position 
516 holgerb 696
                                                }
697
                                        else
513 killagreg 698
                                                {  // take last target position
540 holgerb 699
                                                if(!PointList_Move(1, &(NaviData.TargetPosition),angle)) PointList_Clear();     // try to move wp-list so that 1st entry matches the current position 
513 killagreg 700
                                                }
701
                                        }
702
                                        if(FC.StatusFlags & FC_STATUS_FLY) PointList_WPActive(TRUE);
703
                                        GPS_pWaypoint = PointList_WPBegin(); // updates POI index
519 holgerb 704
                                        SpeakWaypointRached = 1;        // Speak once when the last Point is reached
705
                                        SpeakNextWaypoint = 1;          // Speak once as soon as the Points are active
706
                                        NCFlags &= ~NC_FLAG_TARGET_REACHED;
513 killagreg 707
                                        BeepTime = 150;
708
                                }
709
                        }
710
                        FromFC_LoadWP_List = 0;
711
                }
712
// ++++++++++++++++++++++++++++++++++++++++++++++
713
                if(FromFC_Save_SinglePoint)
714
                {
715
                        WPL_Store.Index = FromFC_Save_SinglePoint;
516 holgerb 716
                        if(WPL_Store.Index <= ToFC_MaxWpListIndex) if(PointList_SaveSinglePoint(&WPL_Store) == WPL_OK) BeepTime = 150;
513 killagreg 717
                        FromFC_Save_SinglePoint = 0;
718
                }
719
// ++++++++++++++++++++++++++++++++++++++++++++++
720
                if(FromFC_Load_SinglePoint)
721
                {
516 holgerb 722
                   WPL_Store.Index = FromFC_Load_SinglePoint;
723
                   if(WPL_Store.Index <= ToFC_MaxWpListIndex)
724
                   {
513 killagreg 725
                        if(PointList_LoadSinglePoint(&WPL_Store) == WPL_OK)
502 killagreg 726
                        {
727
                                if(FC.StatusFlags & FC_STATUS_FLY) PointList_WPActive(TRUE);
728
                                GPS_pWaypoint = PointList_WPBegin(); // updates POI index
519 holgerb 729
                                SpeakWaypointRached = 1;        // Speak once when the last Point is reached
730
                                SpeakNextWaypoint = 1;          // Speak once as soon as the Points are active
731
                                NCFlags &= ~NC_FLAG_TARGET_REACHED;
502 killagreg 732
                                BeepTime = 150;
733
                        }
516 holgerb 734
                   }
513 killagreg 735
                        FromFC_Load_SinglePoint = 0;
504 holgerb 736
                }
500 holgerb 737
// ++++++++++++++++++++++++++++++++++++++++++++++
431 killagreg 738
                // ---------------- Logging  ---------------------------------------
489 killagreg 739
                if(SD_WatchDog)
431 killagreg 740
                {
741
                        SD_WatchDog = 30000;
742
                        if(SDCardInfo.Valid == 1) Logging_Update();  // could be block some time for at max. 2 seconds, therefore move time critical part of the mainloop into the ISR of timer 1
516 holgerb 743
                        else
744
                        {
745
                         ToFC_MaxWpListIndex = 0;
746
                         if(FC.StatusFlags & FC_STATUS_START) SD_LoggingError = 100;
503 holgerb 747
                        }
431 killagreg 748
                        if(!SD_WatchDog) UART1_PutString("\n\rSD-Watchdog - Logging aborted\n\r");
749
                }
489 killagreg 750
 
751
/*
324 killagreg 752
                if(CheckDelay(ftimer))
753
                {
754
 
431 killagreg 755
                        static s8 filename[35];
756
                        static u8 i = 0;
757
                        s8 dbgmsg[40];
324 killagreg 758
 
489 killagreg 759
 
760
 
324 killagreg 761
                        ftimer = SetDelay(100);
762
                        if(FC.Poti[3]>100 && fstate == 0)
763
                        {
764
                                fstate = 1;
431 killagreg 765
                                sprintf(filename, "/toast/toasta/toast%02i.txt",i++);
324 killagreg 766
                        }
767
                        else if(FC.Poti[3]<100 && fstate == 2)
768
                        {
769
                                fstate = 3;
770
                        }
771
 
772
                        switch(fstate)
773
                        {
774
                                case 1:
431 killagreg 775
                                        sprintf(dbgmsg,"\r\nStart writing file: %s", filename);
776
                                        Debug(dbgmsg);
324 killagreg 777
                                        f = fopen_(filename, 'a');
778
                                        if(f== NULL) Fat16_Init();
779
                                        fstate = 2;
780
                                        break;
781
 
782
                                case 2:
783
                                        fputs_("\r\ntest edins sdv dsivbds iv dsivb disbv idsv bisd bv d suiv dsibsivbdis fbvisdöb visdbvisdb vidbfibds ibv", f);
784
                                        break;
489 killagreg 785
 
324 killagreg 786
                                case 3:
431 killagreg 787
                                        sprintf(dbgmsg,"\r\nClosing file: %s", filename);
788
                                        Debug(dbgmsg);
324 killagreg 789
                                        fclose_(f);
790
                                        fstate = 0;
791
                                        break;
792
 
793
                                default:
794
                                        break;
795
                        }
796
                }
594 holgerb 797
*/                                                       
24 StephanB 798
        }
1 ingob 799
}
516 holgerb 800
//DebugOut.Analog[]