Subversion Repositories Projects

Rev

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