Add readable charging curve and SOC power table
This commit is contained in:
@@ -7,23 +7,36 @@ import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
/** Lightweight SOC/power charging curve, avoiding a heavy chart dependency on AAOS 9. */
|
||||
public final class ChargingGraphView extends View {
|
||||
private final Paint grid = new Paint(1), line = new Paint(1), text = new Paint(1);
|
||||
private final List<float[]> points = new ArrayList<>();
|
||||
public ChargingGraphView(Context c, AttributeSet a) { super(c,a); grid.setColor(0x3348C7D9); line.setColor(0xFFFFC857); line.setStrokeWidth(4); text.setColor(0xFFBDC4C6); text.setTextSize(24); }
|
||||
private final float[] socPower = new float[101];
|
||||
public ChargingGraphView(Context c, AttributeSet a) { super(c,a); java.util.Arrays.fill(socPower, Float.NaN); grid.setColor(0x5548C7D9); line.setColor(0xFFFFC857); line.setStrokeWidth(4); text.setColor(0xFFBDC4C6); text.setTextSize(20); }
|
||||
synchronized void add(Float soc, Float power) {
|
||||
if (soc == null || power == null || power >= 0) return;
|
||||
float p = Math.abs(power);
|
||||
if (!points.isEmpty() && Math.abs(points.get(points.size()-1)[0] - soc) < .1f) points.remove(points.size()-1);
|
||||
points.add(new float[]{soc,p}); if (points.size() > 500) points.remove(0); invalidate();
|
||||
points.add(new float[]{soc,p}); if (points.size() > 500) points.remove(0);
|
||||
socPower[Math.max(0, Math.min(100, Math.round(soc)))] = p; invalidate();
|
||||
}
|
||||
synchronized String tableText() {
|
||||
StringBuilder out = new StringBuilder("SOC Şarj gücü\n");
|
||||
boolean found = false;
|
||||
for (int soc=0; soc<=100; soc++) if (!Float.isNaN(socPower[soc])) {
|
||||
found = true;
|
||||
out.append(String.format(Locale.getDefault(), "%3d %% %6.1f kW\n", soc, socPower[soc]));
|
||||
}
|
||||
return found ? out.toString().trim() : "Henüz şarj ölçümü yok";
|
||||
}
|
||||
@Override protected synchronized void onDraw(Canvas c) {
|
||||
super.onDraw(c); float w=getWidth(), h=getHeight()-34;
|
||||
for(int i=0;i<=4;i++) c.drawLine(0,h*i/4,w,h*i/4,grid);
|
||||
c.drawText("SOC % → Şarj gücü (kW)",12,getHeight()-5,text);
|
||||
float max=20; for(float[] p:points) max=Math.max(max,p[1]);
|
||||
for(int i=1;i<points.size();i++){float[] a=points.get(i-1),b=points.get(i); c.drawLine(a[0]*w/100,h-a[1]*h/max,b[0]*w/100,h-b[1]*h/max,line);}
|
||||
super.onDraw(c); float left=58, right=getWidth()-12, top=12, bottom=getHeight()-38;
|
||||
float max=20; for(float[] p:points) max=Math.max(max,p[1]); max=(float)Math.ceil(max/20f)*20f;
|
||||
for(int i=0;i<=5;i++){float y=bottom-(bottom-top)*i/5f; c.drawLine(left,y,right,y,grid); c.drawText(String.format(Locale.US,"%.0f",max*i/5f),4,y+7,text);}
|
||||
for(int soc=0;soc<=100;soc+=20){float x=left+(right-left)*soc/100f; c.drawLine(x,top,x,bottom,grid); c.drawText(String.valueOf(soc),x-10,getHeight()-8,text);}
|
||||
c.drawText("kW",5,20,text); c.drawText("SOC %",right-52,getHeight()-8,text);
|
||||
for(int i=1;i<points.size();i++){float[] a=points.get(i-1),b=points.get(i); float ax=left+a[0]*(right-left)/100, ay=bottom-a[1]*(bottom-top)/max, bx=left+b[0]*(right-left)/100, by=bottom-b[1]*(bottom-top)/max; c.drawLine(ax,ay,bx,by,line); c.drawCircle(bx,by,4,line);}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
consumptionSpeed, consumptionTime, consumptionSoc;
|
||||
private Button consumptionReset;
|
||||
private TextView chargeStatus, chargeSoc, chargeVoltage, chargeCurrent, chargePower,
|
||||
chargeEnergy, chargeDuration;
|
||||
chargeEnergy, chargeDuration, chargeCurveTable;
|
||||
private ChargingGraphView chargeGraph;
|
||||
private long chargeStartMs, lastChargeMs;
|
||||
private double chargedKwh;
|
||||
@@ -883,6 +883,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
chargeEnergy = chargingPane.findViewById(R.id.charge_energy);
|
||||
chargeDuration = chargingPane.findViewById(R.id.charge_duration);
|
||||
chargeGraph = chargingPane.findViewById(R.id.charge_graph);
|
||||
chargeCurveTable = chargingPane.findViewById(R.id.charge_curve_table);
|
||||
}
|
||||
|
||||
private void refreshCharging(EnergySnapshot s) {
|
||||
@@ -905,7 +906,10 @@ public class MainActivity extends AppCompatActivity {
|
||||
chargeEnergy.setText(charging ? String.format(java.util.Locale.getDefault(), "%.2f kWh", chargedKwh) : "—");
|
||||
long sec = chargeStartMs == 0 ? 0 : (now-chargeStartMs)/1000;
|
||||
chargeDuration.setText(charging ? String.format(java.util.Locale.getDefault(), "%02d:%02d:%02d", sec/3600,(sec%3600)/60,sec%60) : "—");
|
||||
if (charging) chargeGraph.add(s.getSocPercent(), s.getBatteryPowerKw());
|
||||
if (charging) {
|
||||
chargeGraph.add(s.getSocPercent(), s.getBatteryPowerKw());
|
||||
chargeCurveTable.setText(chargeGraph.tableText());
|
||||
}
|
||||
}
|
||||
|
||||
private void refreshConsumption() {
|
||||
|
||||
Reference in New Issue
Block a user