Как программно определить, что Motorola MC55 MC65 MC67 находится в подставке

Нам нужно иметь возможность определить в приложении, работающем на портативном устройстве, что устройство было возвращено в базовую станцию.

Хотя одним из методов может быть наблюдение за повышением уровня заряда батареи, этот подход на самом деле является обходным путем и не сработает, если батарея заряжена на 100%.

Мы безуспешно искали файлы справки EMD.


person DumbestGuyOnSaturn    schedule 26.09.2016    source источник


Ответы (1)


Подход, который я использую, заключается в 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(), вероятно, все, что вам нужно. Надеюсь, это поможет :)

person DaveHutchy    schedule 05.10.2016