Ajustes de autonomia parado

This commit is contained in:
Diego Freitas 2025-12-10 16:46:52 -03:00
parent 3df756a69d
commit 561a299dae
3 changed files with 62 additions and 9 deletions

View File

@ -8,10 +8,11 @@ namespace AgroBase.Services
{
public class CoulombCounterService
{
public CoulombCounterService(double _max_Amp)
public CoulombCounterService(double _max_Amp, double w_m_base = 0.1167) // 3 km/h ~ 350 wh
{
double coulombsMax = _max_Amp * 3600;
CargaMaxima = coulombsMax;
WhPorMetroBase = w_m_base;
//double consumo = (Variaveis.OperacaoEmAndamento.DispSen?.Dados?.BateriaCargaConsumida ?? 0);
//Consumido = consumo < CargaMaxima ? consumo : 0;
Consumido = 0;
@ -88,6 +89,17 @@ namespace AgroBase.Services
}
public double WhPorMetro { get; private set; }
public double WhPorMetroBase { get; set; } // configurado externamente
public double WhPorMetroHistorico { get; private set; }
public double WhPorMetroReferencia
{
get
{
if (WhPorMetro > 0) return WhPorMetro;
if (WhPorMetroHistorico > 0) return WhPorMetroHistorico;
return WhPorMetroBase; // pode ser 0 se você não configurar
}
}
public double DistanciaMaximaTeorica_m { get; private set; }
public double DistanciaMaximaSegura_m { get; private set; }
public double DistanciaEstimadaRestante_m { get; private set; }
@ -212,10 +224,22 @@ namespace AgroBase.Services
WhPorMetro = 0;
}
// Calcula distâncias máxima teórica e segura
if (WhPorMetro > 0 && WhRestante > 0)
if (WhPorMetro > 0)
{
DistanciaMaximaTeorica_m = WhRestante / WhPorMetro;
// EMA simples
double alpha = 0.2; // suavização
if (WhPorMetroHistorico <= 0)
WhPorMetroHistorico = WhPorMetro;
else
WhPorMetroHistorico = WhPorMetroHistorico * (1 - alpha) + WhPorMetro * alpha;
}
// Calcula distâncias máxima teórica e segura
double consumoRef_WhPorMetro = WhPorMetroReferencia;
if (consumoRef_WhPorMetro > 0 && WhRestante > 0)
{
DistanciaMaximaTeorica_m = WhRestante / consumoRef_WhPorMetro;
double margem = FuncoesMatematicas.Clamp(MargemSegurancaAutonomia, 0.0, 0.9);
DistanciaMaximaSegura_m = DistanciaMaximaTeorica_m * (1.0 - margem);
@ -224,6 +248,7 @@ namespace AgroBase.Services
}
else
{
// aqui sim, caso extremo sem nada configurado
DistanciaMaximaTeorica_m = 0;
DistanciaMaximaSegura_m = 0;
}

View File

@ -8,12 +8,13 @@ namespace AgroBase.Services
{
public class HerbicideCounterService
{
public HerbicideCounterService(double capacidadeLitros, double densidadeProduto)
public HerbicideCounterService(double capacidadeLitros, double densidadeProduto, double l_m_base = 0.1188) // 3km/h ~ 3x 35 ml/s
{
CapacidadeLitros = capacidadeLitros;
VolumeAtual_L = 0;
VolumeConsumido_L = 0;
DensidadeProduto = densidadeProduto;
LPorMetroBase = l_m_base;
MargemSegurancaAutonomia = 0.30; // 30% por padrão
}
@ -80,6 +81,19 @@ namespace AgroBase.Services
/// </summary>
public double LPorMetro { get; private set; }
public double LPorMetroBase { get; set; }
public double LPorMetroHistorico { get; private set; }
public double LPorMetroReferencia
{
get
{
if (LPorMetro > 0) return LPorMetro;
if (LPorMetroHistorico > 0) return LPorMetroHistorico;
return LPorMetroBase;
}
}
/// <summary>
/// Distância máxima teórica que ainda pode ser pulverizada (sem margem), em metros.
/// </summary>
@ -232,6 +246,12 @@ namespace AgroBase.Services
if (_somaDistanciaJanela_m > 0 && _somaVolumeDistJanela_L > 0)
{
LPorMetro = _somaVolumeDistJanela_L / _somaDistanciaJanela_m;
double alpha = 0.2;
if (LPorMetroHistorico <= 0)
LPorMetroHistorico = LPorMetro;
else
LPorMetroHistorico = LPorMetroHistorico * (1 - alpha) + LPorMetro * alpha;
}
}
@ -279,13 +299,21 @@ namespace AgroBase.Services
}
// ----- Tempo máximo pulverizando (min) -----
if (VolumeAtual_L > 0 && LPorMinuto > 0)
double consumoRef_LPorMetro = LPorMetroReferencia;
if (VolumeAtual_L > 0 && consumoRef_LPorMetro > 0)
{
TempoEstimadoMinutosPulverizando = VolumeAtual_L / LPorMinuto;
DistanciaMaximaTeorica_m = VolumeAtual_L / consumoRef_LPorMetro;
double margem = FuncoesMatematicas.Clamp(MargemSegurancaAutonomia, 0.0, 0.9);
DistanciaMaximaSegura_m = DistanciaMaximaTeorica_m * (1.0 - margem);
if (DistanciaMaximaSegura_m < 0)
DistanciaMaximaSegura_m = 0;
}
else
{
TempoEstimadoMinutosPulverizando = 0;
DistanciaMaximaTeorica_m = 0;
DistanciaMaximaSegura_m = 0;
}
}

File diff suppressed because one or more lines are too long