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 | } |