Subversion Repositories Projects

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1465 - 1
 
2
/****************************************************************/
3
/*                                                                                                                                                                                                                                                      */
4
/*                                                                               NG-Video 5,8GHz                                                                                                        */
5
/*                                                                                                                                                                                                                                                      */
6
/*                                                              Copyright (C) 2011 - gebad                                                                              */
7
/*                                                                                                                                                                                                                                                      */
8
/*      This code is distributed under the GNU Public License                           */
9
/*      which can be found at http://www.gnu.org/licenses/gpl.txt               */
10
/*                                                                                                                                                                                                                                                      */
11
/****************************************************************/
12
 
13
#include <avr/eeprom.h>
14
#include <stdlib.h>
15
#include <string.h>
16
#include "ngvideo.h"
17
#include "dogm.h"
18
#include "menue.h"
19
#include "mk.h"
20
 
21
uint8_t                         mk_UBat;                                                                                                                                // Battery Voltage in 0.1 Volts
22
uint16_t                        mk_dUsedCapacity = 0;
23
uint16_t                        mk_Ikorr;
24
 
25
uint8_t                         mk_akku_nr = AKKU_NR_MIN;
26
uint8_t                         mk_i_offset = MK_I_OFFSET;
27
uint8_t                         mk_i_faktor = MK_I_FAKTOR;
28
uint8_t                         mk_w_faktor = MK_W_FAKTOR;
29
mk_current_t    mk_current = {0, 0};
30
mk_lipo_t               mk_lipo = {0xff, AKKU_CAPACITY, 0, 0};  // Umk 255 ==> erste Inbetriebnahme keine Nachfrage Akku-Nr.
31
 
32
 
33
void store_LipoData(void)
34
{ uint32_t tmp_time_on;
35
 
36
        tmp_time_on = eeprom_read_dword(&ep_mk_lipo[mk_akku_nr].time_on);
37
        mk_timer = 0;
38
        if (tmp_time_on != mk_lipo.time_on)     {
39
                if (!MK_Motor_run) mk_lipo.UsedCapacity = mk_dUsedCapacity;
40
                eeprom_write_byte(&ep_mk_lipo[mk_akku_nr].Umk, mk_lipo.Umk);
41
                eeprom_write_word(&ep_mk_lipo[mk_akku_nr].UsedCapacity, mk_lipo.UsedCapacity);
42
                eeprom_write_dword(&ep_mk_lipo[mk_akku_nr].time_on, mk_lipo.time_on);
43
                eeprom_write_block(&mk_current,&ep_mk_current,sizeof(mk_current_t));
44
                Double_Beep(DBEEPWR, DBEEPWRP);
45
        }
46
}
47
 
48
 
49
#define I_MOTOR_OFF 6 // IR=280mA gemessen; IR vom MK Akku voll 500mA; I Motoren an 1,3A; Grenzwert für Erkennung Akkuwechsel zwischen 500 und 1200mA
50
void MK_ProcessLipo(NaviData_t *navi_data)
51
{ char tmp_pmenu[sizeof(pmenu)];
52
 
53
        mk_UBat = navi_data->UBat;
54
        // Spannung, Strom, Leistung sofort (ohne Motorstart) lesen
55
        if ((!MK_Motor_run) && (navi_data->Current <= I_MOTOR_OFF) && (mk_UBat > 0)) {
56
                if (mk_UBat < mk_lipo.Umk)
57
                        mk_lipo.Umk = mk_UBat;                          // Bei Ruhestrom, da je nach Last mk_UBat schwankend
58
                else
59
                        if (mk_UBat > (mk_lipo.Umk + 4)) {      // Bei Ruhestrom kleiner 501mA Akku gewechselt? IR=280mA gemessen, 400mV Hysterese
60
                                // Akku des MK wurde gegen einen geladenen ausgetauscht
61
                                mk_lipo.Umk = mk_UBat;
62
                                mk_timer = 0;
63
                                mk_dUsedCapacity = 0;
64
                                mk_lipo.UsedCapacity = 0;
65
                                mk_lipo.time_on = 0;
66
                                lcdClear();
67
                                // Funktion wird innhalb Task ausgeführt, auch innerhalb eines anderen Menüpunkes oder Eingabeaufforderung
68
                                strcpy(tmp_pmenu, pmenu);               // da bei Change_Value(...) ein Menüpunkt zurück
69
                                Menu_MK_BatteryChangeNr();      // eingeschobenes Menü, danach aber wieder zur ursprünglichen Anzeige! GPS ruft sich hier noch mal selbst auf!
70
                                strcpy(pmenu, tmp_pmenu);               // Sonst müsste vorherige aktuelle LCD-Anzeige zwischengespeichert werden.
71
                                /* irgendeine Eingabe-While-Schleife (Menue, Change..) zum Verlassen zwingen und mit Jump_Menu(pmenu)
72
                                         den gleichen Menüpunkt wieder aufrufen */
73
                                if (pmenu[0] == '\0')
74
                                        Displ_Main_Disp();
75
                                else
76
                                        exit_while = 1;                                         // wird nach möglichen while, innerhalb der Fkt. wieder auf 0 gesetzt
77
                                store_LipoData();
78
                        }
79
        }
80
        mk_timer = 1;           // MK-Timer auf on stellen
81
        if (mk_current.Count > 18000) {                                                         // ungefär 30 Minuten Mittelwert
82
                mk_current.Sum = (mk_current.Sum * 9)/10;       // um 10% verkleinern
83
                mk_current.Count = ((uint32_t)mk_current.Count * 9)/10;
84
        }
85
        if      (navi_data->Current >= MK_I_OFFSET_5) { // keine negativen Zwischenergebnisse zulassen
86
                mk_Ikorr = mk_i_offset + (uint32_t)(navi_data->Current - MK_I_OFFSET_5) * mk_i_faktor / 100;
87
                mk_current.Sum += mk_Ikorr;
88
                mk_current.Count++;
89
        }
90
        mk_dUsedCapacity = mk_lipo.UsedCapacity + (uint32_t)navi_data->UsedCapacity * mk_w_faktor / 100;
91
}