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.");
        }