簡體   English   中英

如何以編程方式確定Motorola MC55 MC65 MC67在通訊座中

[英]How to Programmatically Determine that a Motorola MC55 MC65 MC67 Is in the Cradle

我們需要能夠在手持設備上運行的應用程序中確定該設備已返回到通訊座。

雖然一種方法可能是觀察電池電量是否增加,但是這種方法確實是一種解決方法,如果電池100%充電會失敗。

我們未能搜索EMD幫助文件。

我采用的方法是P / Invoke並檢查設備的PowerStatus,因此我創建了一個稱為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
        };
    }
}

然后在“設備”類中,我有一個計時器,當設備停靠時會觸發一個事件

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

PowerStatus.GetCurrent()可能就是您所需要的。.我希望這會有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM