Skip to content

Commit

Permalink
Fix crash on soc estimator nil due to async api call
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed Aug 30, 2022
1 parent 7d3b649 commit a65d688
Showing 1 changed file with 36 additions and 24 deletions.
60 changes: 36 additions & 24 deletions core/loadpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -1465,41 +1465,53 @@ func (lp *LoadPoint) publishSoCAndRange() {
}

if lp.socPollAllowed() || lp.socProvidedByCharger() {
lp.socUpdated = lp.clock.Now()
var f float64
var err error

f, err := lp.socEstimator.SoC(lp.chargedEnergy)
if err == nil {
lp.vehicleSoc = math.Trunc(f)
lp.log.DEBUG.Printf("vehicle soc: %.0f%%", lp.vehicleSoc)
lp.publish("vehicleSoC", lp.vehicleSoc)
// guard for socEstimator removed by api
if se := lp.socEstimator; se != nil {
lp.socUpdated = lp.clock.Now()
f, err = se.SoC(lp.chargedEnergy)
} else {
return
}

if lp.charging() {
lp.setRemainingDuration(lp.socEstimator.RemainingChargeDuration(lp.chargePower, lp.SoC.target))
if err != nil {
if errors.Is(err, api.ErrMustRetry) {
lp.socUpdated = time.Time{}
} else {
lp.setRemainingDuration(-1)
lp.log.ERROR.Printf("vehicle soc: %v", err)
}

lp.setRemainingEnergy(1e3 * lp.socEstimator.RemainingChargeEnergy(lp.SoC.target))
return
}

// range
if vs, ok := lp.vehicle.(api.VehicleRange); ok {
if rng, err := vs.Range(); err == nil {
lp.log.DEBUG.Printf("vehicle range: %dkm", rng)
lp.publish("vehicleRange", rng)
}
}
lp.vehicleSoc = math.Trunc(f)
lp.log.DEBUG.Printf("vehicle soc: %.0f%%", lp.vehicleSoc)
lp.publish("vehicleSoC", lp.vehicleSoc)

// trigger message after variables are updated
lp.bus.Publish(evVehicleSoC, f)
} else {
if errors.Is(err, api.ErrMustRetry) {
lp.socUpdated = time.Time{}
if se := lp.socEstimator; se != nil {
if lp.charging() {
lp.setRemainingDuration(se.RemainingChargeDuration(lp.chargePower, lp.SoC.target))
} else {
lp.log.ERROR.Printf("vehicle soc: %v", err)
lp.setRemainingDuration(-1)
}
}

return
if se := lp.socEstimator; se != nil {
lp.setRemainingEnergy(1e3 * se.RemainingChargeEnergy(lp.SoC.target))
}

// range
if vs, ok := lp.vehicle.(api.VehicleRange); ok {
if rng, err := vs.Range(); err == nil {
lp.log.DEBUG.Printf("vehicle range: %dkm", rng)
lp.publish("vehicleRange", rng)
}
}

// trigger message after variables are updated
lp.bus.Publish(evVehicleSoC, f)
}
}

Expand Down

0 comments on commit a65d688

Please sign in to comment.