Получение данных о температуре SPI вне класса

Я пытаюсь написать класс «Температура», который обрабатывает связь с моим RaspberryPi через SPI для чтения некоторых данных о температуре. Цель состоит в том, чтобы иметь возможность вызывать метод GetTemp() из-за пределов моего класса Temperature, чтобы я мог использовать данные о температуре всякий раз, когда они мне нужны в остальной части моей программы.

Мой код настроен следующим образом:

public sealed class StartupTask : IBackgroundTask
{
    private BackgroundTaskDeferral deferral;

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        deferral = taskInstance.GetDeferral();

        Temperature t = new Temperature();

        //Want to be able to make a call like this throughout the rest of my program to get the temperature data whenever its needed
        var data = t.GetTemp();
    }
}

Температурный класс:

class Temperature
{
    private ThreadPoolTimer timer;
    private SpiDevice thermocouple;
    public byte[] temperatureData = null;

    public Temperature()
    {
        InitSpi();
        timer = ThreadPoolTimer.CreatePeriodicTimer(GetThermocoupleData, TimeSpan.FromMilliseconds(1000));

    }
    //Should return the most recent reading of data to outside of this class
    public byte[] GetTemp()
    {
        return temperatureData;
    }

    private async void InitSpi()
    {
        try
        {
            var settings = new SpiConnectionSettings(0);
            settings.ClockFrequency = 5000000;
            settings.Mode = SpiMode.Mode0;

            string spiAqs = SpiDevice.GetDeviceSelector("SPI0");
            var deviceInfo = await DeviceInformation.FindAllAsync(spiAqs);
            thermocouple = await SpiDevice.FromIdAsync(deviceInfo[0].Id, settings);
        }

        catch (Exception ex)
        {
            throw new Exception("SPI Initialization Failed", ex);
        }
    }

    private void GetThermocoupleData(ThreadPoolTimer timer)
    {
        byte[] readBuffer = new byte[4];
        thermocouple.Read(readBuffer);
        temperatureData = readBuffer;
    }
}

Когда я добавляю точку останова в GetThermocoupleData(), я вижу, что получаю правильные значения данных датчика. Однако, когда я вызываю t.GetTemp() из-за пределов моего класса, мое значение всегда равно нулю.

Может ли кто-нибудь помочь мне понять, что я делаю неправильно? Спасибо.


person Bert Wagner    schedule 26.06.2016    source источник


Ответы (1)


Функция GetThermocouplerData() должна быть вызвана хотя бы один раз для возврата данных. В вашем примере кода он не будет запущен до 1 секунды после создания экземпляра. Просто добавьте вызов GetThermocoupleData(null) в InitSpi в последней строке вашего блока try, чтобы он начинался уже с хотя бы 1 вызовом.

person Joel    schedule 26.06.2016
comment
Это направило меня на правильный путь, поэтому я отмечу это как ответ. Добавление GetThermocoupleData(null) в конце попытки {} InitSpi не сработало, но если я изменю значение temperatureData = new byte[4] и добавлю задержку/цикл в свой метод Run(), я получу свои данные обратно. Спасибо! - person Bert Wagner; 26.06.2016
comment
о черт, я не заметил, что метод Init был асинхронным. Вот почему мое предложение не сработало. Еще можно было запросить температуру до завершения выполнения init. Рад, что у тебя получилось. - person Joel; 26.06.2016