2016-09-26 7 views
0

Nous devons être en mesure de déterminer dans l'application s'exécutant sur l'unité portative que l'unité a été renvoyée sur la station d'accueil. Une méthode peut être d'observer si le niveau de charge de la batterie augmente, cette approche est vraiment une solution de contournement et échouera si la batterie est à 100% de charge.Comment déterminer par programmation qu'un Motorola MC55 MC65 MC67 se trouve dans la station d'accueil

Nous avons recherché sans succès les fichiers d'aide EMD.

Répondre

0

L'approche que je prends est à P/Invoke et vérifiez la PowerStatus de l'appareil pour que je créé une classe appelée PowerStatus:

public enum ACLineStatus { Offline = 0, Online = 1, Unknown = 255 } 
[Flags] 
public enum BatteryStatus { High = 1, Low = 2, Critical = 4, Charging = 8, NoSystemBattery = 128, Unknown =-1 } 

public class PowerStatus 
{ 
    private struct _SYSTEM_POWER_STATUS_EX 
    { 
     public byte ACLineStatus; 
     public byte BatteryFlag; 
     public byte BatteryLifePercent; 
     public byte Reserved1; 
     public uint BatteryLifeTime; 
     public uint BatteryFullLifeTime; 
     public byte Reserved2; 
     public byte BackupBatteryFlag; 
     public byte BackupBatteryLifePercent; 
     public byte Reserved3; 
     public uint BackupBatteryLifeTime; 
     public uint BackupBatteryFullLifeTime; 
    } 

    [DllImport("coredll")] 
    private static extern uint GetSystemPowerStatusEx(ref _SYSTEM_POWER_STATUS_EX lpSystemPowerStatus, 
     bool fUpdate); 

    public ACLineStatus ACLineStatus { get; set; } 
    public BatteryStatus BatteryStatus { get; set; } 
    public byte? BatteryLifePercent { get; set; } 
    public TimeSpan? BatteryLifeTime { get; set; } 
    public TimeSpan? BatteryFullLifeTime { get; set; } 
    public BatteryStatus BackupBatteryStatus { get; set; } 
    public byte? BackupBatteryLifePercent { get; set; } 
    public TimeSpan? BackupBatteryLifeTime { get; set; } 
    public TimeSpan? BackupBatteryFullLifeTime { get; set; } 

    private PowerStatus() 
    { 

    } 

    public static PowerStatus GetCurrent() 
    { 
     _SYSTEM_POWER_STATUS_EX powerStatus = new _SYSTEM_POWER_STATUS_EX(); 
     GetSystemPowerStatusEx(ref powerStatus, true); 

     return new PowerStatus 
     { 
      ACLineStatus = (ACLineStatus)powerStatus.ACLineStatus, 
      BatteryStatus = (BatteryStatus)powerStatus.BatteryFlag, 
      BatteryLifePercent = powerStatus.BatteryLifePercent.Between((byte)0, (byte)100) ? (byte?)powerStatus.BatteryLifePercent : null, 
      BatteryLifeTime = powerStatus.BatteryLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BatteryLifeTime) as TimeSpan? : null, 
      BatteryFullLifeTime = powerStatus.BatteryFullLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BatteryFullLifeTime) as TimeSpan? : null, 
      BackupBatteryStatus = (BatteryStatus)powerStatus.BackupBatteryFlag, 
      BackupBatteryLifePercent = powerStatus.BackupBatteryLifePercent.Between((byte)0, (byte)100) ? (byte?)powerStatus.BackupBatteryLifePercent : null, 
      BackupBatteryLifeTime = powerStatus.BackupBatteryLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BackupBatteryLifeTime) as TimeSpan? : null, 
      BackupBatteryFullLifeTime = powerStatus.BackupBatteryFullLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BackupBatteryFullLifeTime) as TimeSpan? : null 
     }; 
    } 
} 

puis dans mon « appareil » classe j'ai une minuterie qui déclenche un événement lorsque l'appareil est arrimé

public static event EventHandler DeviceDocked; 

    private static ACLineStatus _lastPowerState = PowerStatus.GetCurrent().ACLineStatus; 
    private static void timer_Tick(object state) 
    { 
     ACLineStatus powerState = PowerStatus.GetCurrent().ACLineStatus; 
     _timer.Change(Timeout.Infinite, Timeout.Infinite); 
     if (powerState == ACLineStatus.Online && _lastPowerState == ACLineStatus.Offline) 
     { 
      var e = DeviceDocked; 
      if (e != null) 
      { 
       e(null, EventArgs.Empty); 
      } 
     } 
     _lastPowerState = powerState; 
     _timer.Change(1000, Timeout.Infinite); 
    } 

ce PowerStatus.GetCurrent() est probablement tout ce que vous avez besoin .. J'espère que cela aide :)