Index: trunk/fw_g473rct/SES/src/ah_counter.c
===================================================================
--- trunk/fw_g473rct/SES/src/ah_counter.c	(revision 31)
+++ trunk/fw_g473rct/SES/src/ah_counter.c	(revision 35)
@@ -17,4 +17,5 @@
 #include "wh_counter.h"
 #include "eeprom.h"
+#include "stdio.h"
 //	--- EXTERNE VARIABLEN --------------------------------------------------------
 
@@ -26,6 +27,7 @@
 
 //	--- LOKALE VARIABLEN - bitte hier dokumentieren ------------------------------
-int startMeasurement = 0;
+int startMeasurementDischarge = 0;
 int startMeasurementCEF = 0;
+
 //	--- LOKALE FUNKTIONS PROTOTYPEN ----------------------------------------------
 int getSocAhRated(void);
@@ -37,5 +39,9 @@
 void AH_COUNTER_Init(void)
 {
-  sys_data.s.values.mAs_AutoMode =   (int32_t)-sys_data.s.parameter.cellCapacity * 3600;;
+  sys_data.s.values.mAs_AutoMode =   (int32_t)-sys_data.s.parameter.cellCapacity * 3600;
+  sys_data.s.values.mAh_AutoMode =   (int32_t)-sys_data.s.parameter.cellCapacity ;
+
+  sys_data.s.values.mAs_AutoModeU =   (int32_t)-sys_data.s.parameter.cellCapacity * 3600;
+  sys_data.s.values.mAh_AutoModeU =   (int32_t)-sys_data.s.parameter.cellCapacity ;
 }
 
@@ -90,5 +96,5 @@
   static uint64_t totalDischarge = 0;
   static uint64_t totalCharge = 0;
-
+  
   int64_t cellCapacitySeconds =  (int64_t)sys_data.s.parameter.cellCapacity * 60 * 60; // Umrechnung mAh zu mAs
 
@@ -104,13 +110,13 @@
   {
 	  //99 --> 99% --> 0.99
-	  if (sys_data.s.values.calculatedCEFAh <= 0)
-	  {
-		cef =  sys_data.s.parameter.cef / 100.0;
-	  }
-	  else
-	  {
-		cef =  sys_data.s.values.calculatedCEFAh / 1000.0;
-	  }
-	  sys_data.s.values.batteryCurrentCorrected = realStrom * cef;
+	  //if (sys_data.s.values.calculatedCEFAh <= 0)
+	  //{
+		cef =  sys_data.s.parameter.cef / 1000.0;
+	  //}
+	  //else
+	  //{
+	  //	cef =  sys_data.s.values.calculatedCEFAh / 1000.0;
+	  //}
+	  sys_data.s.values.batteryCurrentCorrected = realStrom * cef * (sys_data.s.values.peukertRemoveCorrectionFaktor/1000.0);
   }
   else // if (realStrom < 0)
@@ -128,4 +134,5 @@
 		  calcPow = pow(iBatDivIbatNenn , peukert - 1.0);
 		  sys_data.s.values.batteryCurrentCorrected = (current * calcPow);
+
 	  }
 	  else sys_data.s.values.batteryCurrentCorrected = realStrom;
@@ -151,8 +158,27 @@
   sys_data.s.values.mAsCounter += sys_data.s.values.batteryCurrentCorrected;
   sys_data.s.values.mAs_AutoMode += sys_data.s.values.batteryCurrentCorrected;
+  
   sys_data.s.values.mAh_AutoMode = sys_data.s.values.mAs_AutoMode / 3600LL;
-  sys_data.s.values.ahCounterCEF_AutoMode +=  sys_data.s.values.batteryCurrentCorrected;
-  sys_data.s.values.whCounterCEF_AutoMode +=  sys_data.s.values.batteryCurrentCorrected * sys_data.s.values.batteryVoltage;
-
+  
+
+
+  if ((sys_data.s.values.soc > 0) || startMeasurementDischarge)
+  {
+	sys_data.s.values.mAsCounterUncorrected +=  realStrom;
+	sys_data.s.values.mAhCounterUncorrected = sys_data.s.values.mAsCounterUncorrected / 3600;
+  }
+
+  
+  sys_data.s.values.mAs_AutoModeU += sys_data.s.values.batteryCurrent;
+  sys_data.s.values.mAh_AutoModeU = sys_data.s.values.mAs_AutoModeU / 3600LL;
+  if (sys_data.s.values.mAh_AutoModeU != 0)
+  {
+	sys_data.s.values.peukertRemoveCorrectionFaktor = 1000 * sys_data.s.values.mAh_AutoMode /  sys_data.s.values.mAh_AutoModeU;
+  }
+  else
+  {
+	sys_data.s.values.peukertRemoveCorrectionFaktor=1000;
+  }
+  
   // Begrenzen, Batterie darf nicht über 100% gehen
   if (sys_data.s.values.mAsCounter > cellCapacitySeconds) sys_data.s.values.mAsCounter = cellCapacitySeconds;
@@ -161,4 +187,9 @@
   {
 	sys_data.s.values.mAs_AutoMode = 0;
+	sys_data.s.values.mAh_AutoMode = 0;
+	sys_data.s.values.mAs_AutoModeU = 0;
+	sys_data.s.values.mAh_AutoModeU = 0;
+
+
   }
 
@@ -169,4 +200,5 @@
   {
     batteryFullCounter++;
+	if (batteryFullCounter > sys_data.s.parameter.tBatFull) batteryFullCounter = sys_data.s.parameter.tBatFull;
   }
   else
@@ -175,20 +207,34 @@
   }
 
-  if (batteryFullCounter > sys_data.s.parameter.tBatFull)
+  if (batteryFullCounter >= sys_data.s.parameter.tBatFull)
   {
     sys_data.s.values.mAsCounter = cellCapacitySeconds;
 	sys_data.s.values.mAs_AutoMode = 0;
+	sys_data.s.values.mAh_AutoMode = 0;
 	// Here we can set Wh to max
 	WH_COUNTER_SetToMax();
 
 	//und wir starten eine neue Battery Kapazitäts und Energiemessung
-	startMeasurement = 1;
+	if (startMeasurementDischarge == 0)
+	{
+	   
+	  startMeasurementDischarge = 1;
+	}
 
 	if (startMeasurementCEF == 1)
 	{
-	  startMeasurementCEF=0;
-	  sys_data.s.values.calculatedCEFAh = 1000 * (sys_data.s.values.detectedCapacity * 3600) / sys_data.s.values.ahCounterCEF_AutoMode ;
-	  sys_data.s.values.calculatedCEFWh = 1000 * (sys_data.s.values.detectedEnergy * 3600) / sys_data.s.values.whCounterCEF_AutoMode;
+	  startMeasurementCEF = 0;
+	  sys_data.s.values.calculatedCEFAh = (1000LL * sys_data.s.values.detectedCapacityAtActualCRate * 3600LL) / sys_data.s.values.mAsCounterUncorrected ;
+	  sys_data.s.values.calculatedCEFWh = (1000LL * sys_data.s.values.detectedEnergyAtActualCRate * 3600LL) / sys_data.s.values.mWsCounterUncorrected;
+	  printf("Time %d: Batterie Full event mAhCarged=%d, tCharge=%d, cefAh=%d, cefWh=%d, u=%d, i=%d\r\n",sys_data.s.values.onTime, sys_data.s.values.mAhCounterUncorrected, sys_data.s.values.lastTimeVbatEmpty, sys_data.s.values.calculatedCEFAh, sys_data.s.values.calculatedCEFWh, sys_data.s.values.batteryVoltage, sys_data.s.values.batteryCurrent);
 	}
+	else {
+	  
+	  //Messung CEF ferig, halter Zähler auf 0 solange Batterie voll, damit die Messung der Kapazität/Energy bei aktuellen Entladestrom korrekt startet
+	  sys_data.s.values.mAsCounterUncorrected = 0;
+	  sys_data.s.values.mAhCounterUncorrected = 0;
+	  sys_data.s.values.mWsCounterUncorrected = 0;
+	}
+	
   }
 
@@ -202,18 +248,31 @@
     {
   	  cnt++;
-  	  if ((cnt >= 10) && (startMeasurement == 1)) // 5 Sekunden fest
+  	  if (cnt >= 10)  
   	  {
   		  cnt = 10; //sys_data.s.parameter.tBatFull;
 
-  		  if ((sys_data.s.values.lastTimeVbatFull >= 3600U) && (sys_data.s.values.lastTimeVbatFull <= 200U * 3600U)) 	// This line prevents from very high discharge-currents to be used to estimate battery capacity
+  		  if ( (startMeasurementDischarge == 1) && (sys_data.s.values.lastTimeVbatFull >= 1200U) && (sys_data.s.values.lastTimeVbatFull <= 200U * 3600U)) 	// This line prevents from very high discharge-currents to be used to estimate battery capacity
   		  {
   			  
   			  AH_COUNTER_SetDetectedAh();
   			  WH_COUNTER_SetDetectedEnergy();
-			  sys_data.s.values.ahCounterCEF_AutoMode = 0;
-			  sys_data.s.values.whCounterCEF_AutoMode = 0;
-  			  startMeasurement = 0;			  
-  		  }
+			  sys_data.s.values.detectedCapacityAtActualCRate = -sys_data.s.values.mAsCounterUncorrected / 3600;
+			  sys_data.s.values.detectedEnergyAtActualCRate = -sys_data.s.values.mWsCounterUncorrected /3600;	  	  
+			  printf("Time %d: Empty event(1), cn=%d, ca=%d, tDischarge=%d, u=%d, i=%d\r\n",sys_data.s.values.onTime, sys_data.s.values.detectedCapacity, sys_data.s.values.detectedCapacityAtActualCRate,  sys_data.s.values.lastTimeVbatFull, sys_data.s.values.batteryVoltage, sys_data.s.values.batteryCurrent);
+		  }
   		  sys_data.s.values.lastTimeVbatEmpty = 0U;
+
+		  
+		  //Messung wurde gespeichert (bzw. verworfen). Nächste Messung nach Aufladung
+		  startMeasurementDischarge = 0;
+		  			
+
+		  //Batterie ist Leer, wir können die Messung der Ladung beginnen
+		  startMeasurementCEF = 1;
+
+		  sys_data.s.values.mAsCounterUncorrected = 0;
+		  sys_data.s.values.mAhCounterUncorrected = 0;
+		  sys_data.s.values.mWsCounterUncorrected = 0;
+
   	  }
     }
@@ -231,17 +290,32 @@
     {
   	  cnt++;
-  	  if ((cnt >= 10) && (startMeasurement == 1)) // 5 Sekunden fest
+  	  if (cnt >= 10) 
   	  {
   		  cnt = 10; //sys_data.s.parameter.tBatFull;
 
-  		  if ((sys_data.s.values.lastTimeVbatFull >= 3600U) && (sys_data.s.values.lastTimeVbatFull <= 240U * 3600U)) 	// This line prevents from very high discharge-currents to be used to estimate battery capacity
+  		  if ( (startMeasurementDischarge == 1) && (sys_data.s.values.lastTimeVbatFull >= 3600U) && (sys_data.s.values.lastTimeVbatFull <= 240U * 3600U)) 	// This line prevents from very high discharge-currents to be used to estimate battery capacity
   		  {
   			  
-  			  AH_COUNTER_SetDetectedAh();
+			  AH_COUNTER_SetDetectedAh();
   			  WH_COUNTER_SetDetectedEnergy();
-  			  startMeasurement = 0;			  
-			  startMeasurementCEF = 1;
-  		  }
-  		  sys_data.s.values.lastTimeVbatEmpty = 0U;
+			  sys_data.s.values.detectedCapacityAtActualCRate = -sys_data.s.values.mAsCounterUncorrected/ 3600;
+			  sys_data.s.values.detectedEnergyAtActualCRate = -sys_data.s.values.mWsCounterUncorrected / 3600;	
+			  printf("Time %d: Empty event(2), cn=%d, ca=%d, tDischarge=%d, u=%d, i=%d\r\n",sys_data.s.values.onTime, sys_data.s.values.detectedCapacity, sys_data.s.values.detectedCapacityAtActualCRate,  sys_data.s.values.lastTimeVbatFull, sys_data.s.values.batteryVoltage, sys_data.s.values.batteryCurrent);
+		  }
+
+		  
+  		  
+		  sys_data.s.values.lastTimeVbatEmpty = 0U;
+		  
+		  //Messung wurde gespeichert (bzw. verworfen). Nächste Messung nach Aufladung
+		  startMeasurementDischarge = 0;		
+
+		  //Batterie leer wir können mit der Messung der Ladung beginnen
+		  startMeasurementCEF = 1;
+
+		  
+		  sys_data.s.values.mAsCounterUncorrected = 0;
+		  sys_data.s.values.mAhCounterUncorrected = 0;
+		  sys_data.s.values.mWsCounterUncorrected = 0;
   	  }
     }
@@ -262,3 +336,12 @@
 	  default: sys_data.s.values.soc = 0;
   }
+
+	sys_data.s.values.soc0 = getSocAhRated()/100;			  
+	sys_data.s.values.soc1 = getSocAhAuto()/100;				  
+	sys_data.s.values.soc2 = WH_COUNTER_GetSoCManual()/100;	  
+	sys_data.s.values.soc3 = WH_COUNTER_GetSoCAuto()/100;	  
+	sys_data.s.values.soc4 = WH_COUNTER_GetSoCAutoTemp()/100;  
+  
+
+
 }
Index: trunk/fw_g473rct/SES/src/eeprom.c
===================================================================
--- trunk/fw_g473rct/SES/src/eeprom.c	(revision 31)
+++ trunk/fw_g473rct/SES/src/eeprom.c	(revision 35)
@@ -217,5 +217,5 @@
 	// battery parameter
 
-	/* cef						*/											99,				// cef
+	/* cef						*/											990,			// cef %*10
 	/* peukert					*/											105,			// peukert
 	/* cellCapacity				*/											160000,			// cell Capacity in mAh
@@ -259,5 +259,5 @@
 
 	/* extraDischargeStrom_mA	*/											7,				// mA, current that LiPro consumes itself
-	/* cefW		*/															90,				// 90% cef for Wh calculations
+	/* cefW		*/															900,			// 90% cef for Wh calculations [%*10]
 	/* Battery Empty Detection Mode*/										1,				// Auto, from BMS
 	/* AUX MODE */															AUX_MODE_HEATER,// Heizung
Index: trunk/fw_g473rct/SES/src/sysdata.c
===================================================================
--- trunk/fw_g473rct/SES/src/sysdata.c	(revision 31)
+++ trunk/fw_g473rct/SES/src/sysdata.c	(revision 35)
@@ -58,3 +58,6 @@
 	sys_data.s.values.message[23] = 'z';
 
+	sys_data.s.values.peukertRemoveCorrectionFaktor = 1000; //1.000
+  
+
 }
Index: trunk/fw_g473rct/SES/src/wh_counter.c
===================================================================
--- trunk/fw_g473rct/SES/src/wh_counter.c	(revision 31)
+++ trunk/fw_g473rct/SES/src/wh_counter.c	(revision 35)
@@ -42,12 +42,12 @@
 
   double cefwh;
-  if (sys_data.s.values.calculatedCEFWh <= 0)
-  {
-	cefwh =  sys_data.s.parameter.cef / 100.0;
-  }
-  else
-  {
-	cefwh =  sys_data.s.values.calculatedCEFWh / 1000.0;
-  }
+//  if (sys_data.s.values.calculatedCEFWh <= 0)
+//  {
+	cefwh =  sys_data.s.parameter.cefW / 1000.0;
+ // }
+ // else
+ // {
+//	cefwh =  sys_data.s.values.calculatedCEFWh / 1000.0;
+//  }
   
   double realStrom;
@@ -57,5 +57,5 @@
   // bei Strom größer 0 -> Ladestrom CEF rechnen
   if (realStrom >= 0) {// 99 --> 99% --> 0.99
-    sys_data.s.values.correctedStromForChargeWhCnt = (realStrom * cefwh) ;    
+    sys_data.s.values.correctedStromForChargeWhCnt = (realStrom * cefwh * (sys_data.s.values.peukertRemoveCorrectionFaktor / 1000.0)) ;    
   } 
   else 
@@ -75,5 +75,9 @@
   sys_data.s.values.mWsCounter += p_mW; // Energy value for both positive and negative currents
   sys_data.s.values.mWs_AutoMode += p_mW;
-
+  
+  if (sys_data.s.values.soc > 0)
+  {
+	sys_data.s.values.mWsCounterUncorrected +=  ((int64_t) realStrom * sys_data.s.values.batteryVoltage )/ 1000LL;
+  }
 
   // Begrenzen, Batterie darf nicht über 100% gehen
