public LTC2943Service() : base((int)LTC2943_Constants.ADDRESS) { this.Enabled = this.InitSensor(); _batteryUnderChargeGpio = ProcessorPin.Gpio33;//GPIO33, led di carica GpioGlobalConnection.Add(_batteryUnderChargeGpio, false); GpioGlobalConnection.GlobalConnectionPin.PinStatusChanged += GlobalConnectionPin_PinStatusChanged; _chargeStatus = ChargeStatusType.NotCharging; _prescalerSelected = PRESCALER_1024; _batteryUnderChargeStatus = true; BATTERY_NOMINAL_VOLTAGE = 7.2; BATTERY_MAX_VOLTAGE = 8.38; }
private async Task ReadContinuosly(CancellationToken cancellationToken) { GaugeEventArgs eventArgs = new GaugeEventArgs(); ChargeStatusType previousStatus = ChargeStatusType.NotCharging; bool chargeCompleted = false; while (!cancellationToken.IsCancellationRequested) { try { //read values from module ElectricCurrent a = ReadCurrent(); ElectricPotentialDc v = ReadVoltage(); Temperature t = ReadTemperature(); byte s = ReadStatusRegister(); ElectricCharge c = ReadAccumulatedCharge(); //set status if (_batteryUnderChargeStatus) { if (a.Milliamperes < 0) { _chargeStatus = ChargeStatusType.Discharging; } else if (a.Milliamperes > 0 && a.Milliamperes <= 1 && v.Value > BATTERY_MAX_VOLTAGE) { _chargeStatus = ChargeStatusType.NotCharging; } else if (a.Milliamperes > 0 && a.Milliamperes <= 1 && v.Value >= BATTERY_NOMINAL_VOLTAGE) { _chargeStatus = ChargeStatusType.Completed; } } else { if (v.VoltsDc >= BATTERY_NOMINAL_VOLTAGE && a.Milliamperes > 10) { _chargeStatus = ChargeStatusType.Charging; } } //calculate remaining charge double remainingCharge = BATTERY_CAPACITY_MAH + (c.Coulombs * COULOMBS_TO_MILLIAMPEREHOUR) - QBATMAX; //mAh double remainingTime = Math.Abs(remainingCharge / a.Milliamperes); // hours double maxTime = Math.Abs(BATTERY_CAPACITY_MAH / a.Milliamperes); //hours double remainigPercentage = Math.Round(100 * remainingTime / maxTime, 2); switch (_chargeStatus) { case ChargeStatusType.Charging: remainingTime = maxTime - remainingTime; chargeCompleted = false; if ((s & 32) == 32 || eventArgs.Charge.Coulombs >= c.Coulombs) //during charging got overflow, set percentage to 99 and not save anything on db { remainigPercentage = 100; } break; case ChargeStatusType.Discharging: // if charge is too low, close app chargeCompleted = false; if (remainigPercentage <= 20) { Console.WriteLine("Close APP {0}", remainigPercentage); } if ((s & 32) == 32) //during discharging got overflow, set percentage to 99 and not save anything on db { remainigPercentage = 0; } break; case ChargeStatusType.Completed: if (!chargeCompleted) { SetChargingComplete(); chargeCompleted = true; SaveLastCharge(QBATMAX); } remainigPercentage = 100; break; case ChargeStatusType.NotCharging: chargeCompleted = false; break; } Console.WriteLine("{0} {1} {2} {3} {4} {5}", remainingCharge, remainingTime, maxTime, remainigPercentage, s, _chargeStatus); //aggiorna e scatena eventi if ((Math.Abs(remainigPercentage - eventArgs.ChargePercentage) >= 1) || previousStatus != _chargeStatus) { eventArgs.Charge = c; eventArgs.Current = a; eventArgs.Temperature = t; eventArgs.Voltage = v; eventArgs.ChargePercentage = remainigPercentage > 100 ? 100 : remainigPercentage; eventArgs.Status = s; eventArgs.RemainingTime = TimeSpan.FromHours(remainingTime); eventArgs.LedOn = !_batteryUnderChargeStatus; Console.WriteLine(string.Format("LTC: charge= {0}, status= {1}, %={2}, v={3}, a={4}, t={5}, cs={6}", c, s, remainigPercentage, v.Value, a.Milliamperes, t, _chargeStatus)); //save last charge to db. to be used at startup, next switch off/switch on SaveLastCharge(c.Value); previousStatus = _chargeStatus; OnGaugeChanged?.Invoke(eventArgs); } await Task.Delay(10000, cancellationToken); } catch (Exception e) { Console.WriteLine("Error: {0}, {1}", e.Message, e.InnerException.Message); } } Console.WriteLine("Stopping LTC2943 reading task."); }