violator писал(а): ↑23 май 2022, 18:25
Насколько понял в LV не получится быть "ведомым", реагируя на обновленные данные айтрекера (и пр) :-(
.....
p.s. По поводу интервала запроса в 10мс не страшно, айтрекер выдает сырые данные с частотой ~90 сэмплов/с, с буфером интервал увеличится немного.
LabVIEW может быть и ведущим и ведомым, только для этого желательно разные циклы использовать, но не обязательно.
Использование Вами Event, это как раз и есть попытка сделать реакцию на внешние события, может в этом и есть смысл, но мне не совсем понятен, я сторонник того, что "хвост не виляет собакой".
10ms = 100 запросов/сек, у Вас буфер даже не обновиться, так что опрашивать чаще 10 раз в сек (100ms) наверное смысла нет.
Дело в том, что Вы неверное используете событие и да бы не усложнять программу, я предлагаю более простое решение.
1. При инициализации, Вы вызываете функцию
bool connectToSauronEye(int gazeBufferLength = 10) из dll, которая начинает опрашивать устройство и используя кольцевой буфер осреднять данные, размер буфера желательно ограничить (например 10 последних отсчетов). Этот буфер живет отдельно от
и данные в нем постоянно обновляются.
2. Когда Вам необходимы данные из буфера, Вы вызываете функцию
uint32_t getGazeData(), которая возвращает осредненные координаты курсора. Отображаете пользователю и т.д., Вам же потом захочется, что бы
еще что-то делала, а не только отображала положение курсора.
3. При отключении от устройства, вы вызываете функцию
bool disconnectFromSauronEye(), что останавливает буфер и выгружает все лишнее из памяти.
Опять же для упрощения получения данных, можно две координаты U16 (2byte) (думаю от 0 до 65 535 предостаточно для координат) объединить в одно число U32 (4byte) внутри функции, а в
обратно разделить, по этому тип функции uint32. Не думаю, что использование дробного типа double (8byte) для каждой координаты оправдано.