Как улучшить частоту дискретизации датчика ускорения Gear S2

Я хочу рассчитать частоту дискретизации датчика ускорения на Samsung Gear S2. Используя следующий код в качестве примера https://developer.tizen.org/ko/community/code-snippet/native-code-snippet/simple-sensors-application-wearable?langredirect=1, я создал приложение.

Я регистрирую обратный вызов с 10 мс

    /* Register a callback if a sensor event is detected (sensor value changed) */
    ret = sensor_listener_set_event_cb((ad->listener), 10, on_sensor_event, ad);

и я рассчитываю частоту дискретизации с помощью

unsigned long long int timestampArray[1000000];
int i = 1;
unsigned int samplingFreq = 1;

/* Callback for whenever a sensor event is detected (such as value changed). It is called whenever such an event is detected */
void on_sensor_event(sensor_h sensor, sensor_event_s *event, void *data) {
appdata_s *ad = data;

char buf[1024]={0};
char tempbuf[1024]={0};

sensor_type_e type;
sensor_get_type(sensor, &type);

//Check the sensor type of the sensor event
if(type == (ad->type)){

    timestampArray[i] = event->timestamp/1000;
    if(i == 2)
    {
        samplingFreq = timestampArray[i]-timestampArray[i-1];
    }

    i++;

    snprintf(tempbuf, 1023, "F= %d<br/>", samplingFreq);
    strcat(buf, tempbuf);

    elm_object_text_set(ad->label, buf);
}
}

При этом частота дискретизации ускорения остается на уровне около 50 Гц (то есть один сэмпл каждые 19-20 мс).

Знаешь, почему я не могу опуститься ниже этого? (Моей целью будет 1 образец каждые 10 мс - минимально поддерживаемый)

Спасибо.

Это мой первый вопрос, поэтому я был бы рад получить идеи по улучшению.

Знание: C - новичок, Tizen - новичок


person ossx    schedule 20.04.2016    source источник
comment
OT: в snprintf сгенерированная строка имеет длину не более n-1, используйте sizeof tempbuf вместо 1023   -  person David Ranieri    schedule 20.04.2016


Ответы (1)


Функция, которую вы имеете в виду для интервала, не подходит. Скорее вы должны использовать следующую функцию для этой цели:

error = sensor_listener_set_interval(listener, 10);

or

error = sensor_listener_set_interval(listener, 100);

Вы можете проверить журнал, используя следующий код:

void on_sensor_event(sensor_h sensor, sensor_event_s * event, void * user_data) {

dlog_print(DLOG_DEBUG, LOG_TAG, "Sensor Called- %llu<br/>", event->timestamp / 1000);
// Select a specific sensor with a sensor handle

sensor_type_e type;
sensor_get_type(sensor,  & type);

switch (type) {
case SENSOR_ACCELEROMETER:
    dlog_print(DLOG_INFO, LOG_TAG, "sensor data read successfully");

    char buf[1024];
    char tempbuf[1024];
    snprintf(buf, 1023, "Sensor data read successfully detected.<br/>");

    for (int i = 0; i < event->value_count; i++) {
        snprintf(tempbuf, sizeof tempbuf, "Sensor value[%d] is - %f<br/>", i, event->values[i]);
        strcat(buf, tempbuf);
    }

    snprintf(tempbuf, sizeof tempbuf, "Sensor timestamp is - %llu<br/>", event->timestamp);
    strcat(buf, tempbuf);

    snprintf(tempbuf, sizeof tempbuf, "Sensor accuracy is - %d<br/>", event->accuracy);
    strcat(buf, tempbuf);
    elm_object_text_set(event_label, buf);

    break;
default:
    dlog_print(DLOG_ERROR, LOG_TAG, "Not an Accelerometer event");
}

}

Надеюсь, что это решение будет служить вашей цели.

person nafser33    schedule 28.04.2016