Blame |
Last modification |
View Log
| RSS feed
/****************************************************************/
/* */
/* NG-Video 5,8GHz */
/* */
/* Copyright (C) 2011 - gebad */
/* */
/* This code is distributed under the GNU Public License */
/* which can be found at http://www.gnu.org/licenses/gpl.txt */
/* */
/****************************************************************/
#include <avr/eeprom.h>
#include <stdlib.h>
#include <string.h>
#include "ngvideo.h"
#include "dogm.h"
#include "menue.h"
#include "mk.h"
uint8_t mk_UBat
; // Battery Voltage in 0.1 Volts
uint16_t mk_dUsedCapacity
= 0;
uint16_t mk_Ikorr
;
uint8_t mk_akku_nr
= AKKU_NR_MIN
;
uint8_t mk_i_offset
= MK_I_OFFSET
;
uint8_t mk_i_faktor
= MK_I_FAKTOR
;
uint8_t mk_w_faktor
= MK_W_FAKTOR
;
mk_current_t mk_current
= {0, 0};
mk_lipo_t mk_lipo
= {0xff, AKKU_CAPACITY
, 0, 0}; // Umk 255 ==> erste Inbetriebnahme keine Nachfrage Akku-Nr.
void store_LipoData
(void)
{ uint32_t tmp_time_on
;
tmp_time_on
= eeprom_read_dword
(&ep_mk_lipo
[mk_akku_nr
].
time_on);
mk_timer
= 0;
if (tmp_time_on
!= mk_lipo.
time_on) {
if (!MK_Motor_run
) mk_lipo.
UsedCapacity = mk_dUsedCapacity
;
eeprom_write_byte
(&ep_mk_lipo
[mk_akku_nr
].
Umk, mk_lipo.
Umk);
eeprom_write_word
(&ep_mk_lipo
[mk_akku_nr
].
UsedCapacity, mk_lipo.
UsedCapacity);
eeprom_write_dword
(&ep_mk_lipo
[mk_akku_nr
].
time_on, mk_lipo.
time_on);
eeprom_write_block
(&mk_current
,&ep_mk_current
,sizeof(mk_current_t
));
Double_Beep
(DBEEPWR
, DBEEPWRP
);
}
}
#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
void MK_ProcessLipo
(NaviData_t
*navi_data
)
{ char tmp_pmenu
[sizeof(pmenu
)];
mk_UBat
= navi_data
->UBat
;
// Spannung, Strom, Leistung sofort (ohne Motorstart) lesen
if ((!MK_Motor_run
) && (navi_data
->Current
<= I_MOTOR_OFF
) && (mk_UBat
> 0)) {
if (mk_UBat
< mk_lipo.
Umk)
mk_lipo.
Umk = mk_UBat
; // Bei Ruhestrom, da je nach Last mk_UBat schwankend
else
if (mk_UBat
> (mk_lipo.
Umk + 4)) { // Bei Ruhestrom kleiner 501mA Akku gewechselt? IR=280mA gemessen, 400mV Hysterese
// Akku des MK wurde gegen einen geladenen ausgetauscht
mk_lipo.
Umk = mk_UBat
;
mk_timer
= 0;
mk_dUsedCapacity
= 0;
mk_lipo.
UsedCapacity = 0;
mk_lipo.
time_on = 0;
lcdClear
();
// Funktion wird innhalb Task ausgeführt, auch innerhalb eines anderen Menüpunkes oder Eingabeaufforderung
strcpy(tmp_pmenu
, pmenu
); // da bei Change_Value(...) ein Menüpunkt zurück
Menu_MK_BatteryChangeNr
(); // eingeschobenes Menü, danach aber wieder zur ursprünglichen Anzeige! GPS ruft sich hier noch mal selbst auf!
strcpy(pmenu
, tmp_pmenu
); // Sonst müsste vorherige aktuelle LCD-Anzeige zwischengespeichert werden.
/* irgendeine Eingabe-While-Schleife (Menue, Change..) zum Verlassen zwingen und mit Jump_Menu(pmenu)
den gleichen Menüpunkt wieder aufrufen */
if (pmenu
[0] == '\0')
Displ_Main_Disp
();
else
exit_while
= 1; // wird nach möglichen while, innerhalb der Fkt. wieder auf 0 gesetzt
store_LipoData
();
}
}
mk_timer
= 1; // MK-Timer auf on stellen
if (mk_current.
Count > 18000) { // ungefär 30 Minuten Mittelwert
mk_current.
Sum = (mk_current.
Sum * 9)/10; // um 10% verkleinern
mk_current.
Count = ((uint32_t)mk_current.
Count * 9)/10;
}
if (navi_data
->Current
>= MK_I_OFFSET_5
) { // keine negativen Zwischenergebnisse zulassen
mk_Ikorr
= mk_i_offset
+ (uint32_t)(navi_data
->Current
- MK_I_OFFSET_5
) * mk_i_faktor
/ 100;
mk_current.
Sum += mk_Ikorr
;
mk_current.
Count++;
}
mk_dUsedCapacity
= mk_lipo.
UsedCapacity + (uint32_t)navi_data
->UsedCapacity
* mk_w_faktor
/ 100;
}