WP7 Макет Microsoft.Devices.Sensors.Compass при использовании эмулятора - PullRequest
1 голос
/ 21 февраля 2012

Я хотел бы иметь возможность имитировать датчик компаса при запуске Windows Phone 7.1 в эмуляторе.

На данном этапе мне не особо важно, какие данные возвращает компас.Только то, что я могу работать против чего-то, когда использую эмулятор для проверки рассматриваемого кода.

Я знаю, что могу развернуть на своем разблокированном телефоне dev для проверки работоспособности компаса, но я нашел соединение черезZune программного обеспечения, чтобы бросить часто.

Обновление

Я рассмотрел создание своего собственного класса-оболочки, который мог бы имитировать компас при запуске отладочной сборки, и компас иначе не поддерживается.

Структура Microsoft.Devices.Sensors.CompassReading поставила меня в тупик.Поскольку это структура, в которой свойства могут быть установлены только внутри, я не могу наследовать ее, чтобы предоставить свои собственные значения обратно.Я посмотрел на , используя отражение для грубой силы некоторых значений в , но Silverlight не позволяет ему .

1 Ответ

2 голосов
/ 23 февраля 2012

как вы уже заметили, у меня была похожая проблема.когда я издевался над датчиком компаса, у меня также были трудности, потому что вы не можете наследовать от существующих классов и писать свою собственную логику.Поэтому я написал свой собственный интерфейс компаса, который является единственной функцией компаса, используемой моим приложением.Затем есть две реализации, одна оболочка для функциональных возможностей компаса WP7 и мой фиктивный компас.

Я могу показать вам некоторый код, но не раньше выходных, поскольку я не на своей машине атм.1004 * Редактировать:

Вы уже получили его, но для других людей, имеющих такую ​​же проблему, я добавлю свой код.Как я уже сказал, я написал интерфейс и две реализации, одну для телефона и макетную реализацию.

Интерфейс компаса

public interface ICompass
{
    #region Methods

    void Start();

    void Stop();

    #endregion

    #region Properties

    CompassData CurrentValue { get; }

    bool IsDataValid { get; }

    TimeSpan TimeBetweenUpdates { get; set; }

    #endregion

    #region Events

    event EventHandler<CalibrationEventArgs> Calibrate;

    event EventHandler<CompassDataChangedEventArgs> CurrentValueChanged;

    #endregion
}

Используемые данныеклассы и аргументы событий

public class CompassData
{
    public CompassData(double headingAccurancy, double magneticHeading, Vector3 magnetometerReading, DateTimeOffset timestamp, double trueHeading)
    {
        HeadingAccuracy = headingAccurancy;
        MagneticHeading = magneticHeading;
        MagnetometerReading = magnetometerReading;
        Timestamp = timestamp;
        TrueHeading = trueHeading;
    }

    public CompassData(CompassReading compassReading)
    {
        HeadingAccuracy = compassReading.HeadingAccuracy;
        MagneticHeading = compassReading.MagneticHeading;
        MagnetometerReading = compassReading.MagnetometerReading;
        Timestamp = compassReading.Timestamp;
        TrueHeading = compassReading.TrueHeading;
    }

    #region Properties

    public double HeadingAccuracy { get; private set; }

    public double MagneticHeading { get; private set; }

    public Vector3 MagnetometerReading { get; private set; }

    public DateTimeOffset Timestamp { get; private set; }

    public double TrueHeading { get; private set; }

    #endregion
}

public class CompassDataChangedEventArgs : EventArgs
{
    public CompassDataChangedEventArgs(CompassData compassData)
    {
        CompassData = compassData;
    }

    public CompassData CompassData { get; private set; }
}

Реализация WP7

public class DeviceCompass : ICompass
{
    private Compass _compass;

    #region Implementation of ICompass

    public void Start()
    {
        if(_compass == null)
        {
            _compass = new Compass {TimeBetweenUpdates = TimeBetweenUpdates};
            // get TimeBetweenUpdates because the device could have change it to another value
            TimeBetweenUpdates = _compass.TimeBetweenUpdates;
            // attach to events
            _compass.CurrentValueChanged += CompassCurrentValueChanged;
            _compass.Calibrate += CompassCalibrate;
        }
        _compass.Start();
    }

    public void Stop()
    {
        if(_compass != null)
        {
            _compass.Stop();
        }
    }

    public CompassData CurrentValue
    {
        get { return _compass != null ? new CompassData(_compass.CurrentValue) : default(CompassData); }
    }

    public bool IsDataValid
    {
        get { return _compass != null ? _compass.IsDataValid : false; }
    }

    public TimeSpan TimeBetweenUpdates { get; set; }

    public event EventHandler<CalibrationEventArgs> Calibrate;
    public event EventHandler<CompassDataChangedEventArgs> CurrentValueChanged;

    #endregion

    #region Private methods

    private void CompassCalibrate(object sender, CalibrationEventArgs e)
    {
        EventHandler<CalibrationEventArgs> calibrate = Calibrate;
        if (calibrate != null)
        {
            calibrate(sender, e);
        }
    }

    private void CompassCurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> e)
    {
        EventHandler<CompassDataChangedEventArgs> currentValueChanged = CurrentValueChanged;
        if (currentValueChanged != null)
        {
            currentValueChanged(sender, new CompassDataChangedEventArgs(new CompassData(e.SensorReading)));
        }
    }

    #endregion
}

Ложная реализация

public class MockCompass : ICompass
{
    private readonly Timer _timer;
    private CompassData _currentValue;
    private bool _isDataValid;
    private TimeSpan _timeBetweenUpdates;
    private bool _isStarted;
    private readonly Random _random;

    public MockCompass()
    {
        _random = new Random();
        _timer = new Timer(TimerEllapsed, null, Timeout.Infinite, Timeout.Infinite);
        _timeBetweenUpdates = new TimeSpan();
        _currentValue = new CompassData(0, 0, new Vector3(), new DateTimeOffset(), 0);
    }

    #region Implementation of ICompass

    public void Start()
    {
        _timer.Change(0, (int)TimeBetweenUpdates.TotalMilliseconds);
        _isStarted = true;
    }

    public void Stop()
    {
        _isStarted = false;
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
        _isDataValid = false;
    }

    public CompassData CurrentValue
    {
        get { return _currentValue; }
    }

    public bool IsDataValid
    {
        get { return _isDataValid; }
    }

    public TimeSpan TimeBetweenUpdates
    {
        get { return _timeBetweenUpdates; }
        set
        {
            _timeBetweenUpdates = value;
            if (_isStarted)
            {
                _timer.Change(0, (int) TimeBetweenUpdates.TotalMilliseconds);
            }
        }
    }

    public event EventHandler<CalibrationEventArgs> Calibrate;
    public event EventHandler<CompassDataChangedEventArgs> CurrentValueChanged;

    #endregion

    #region Private methods

    private void TimerEllapsed(object state)
    {
        _currentValue = new CompassData(_random.NextDouble()*5,
                                        (_currentValue.MagneticHeading + 0.1)%360,
                                        _currentValue.MagnetometerReading,
                                        new DateTimeOffset(DateTime.UtcNow),
                                        (_currentValue.TrueHeading + 0.1)%360);
        _isDataValid = true;
        EventHandler<CompassDataChangedEventArgs> currentValueChanged = CurrentValueChanged;
        if(currentValueChanged != null)
        {
            currentValueChanged(this, new CompassDataChangedEventArgs(_currentValue));
        }
    }

    #endregion

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...