Я пытаюсь написать API, использующий преимущества оболочки python для NI-DAQmx, и мне нужно иметь глобальный список задач, которые можно редактировать в модуле.
Вот что До сих пор я пробовал:
1) Создан импортируемый словарь задач, который обновляется при каждом вызове ni-daqmx. Конечная точка функции обрабатывает данные из запроса HTTPS, я обещаю, что это не просто бессмысленная оболочка вокруг самой библиотеки ni-daqmx.
Например, при запуске создается следующее:
#./daq/__init.py__
import nidaqmx
# ... other stuff ...#
TASKS = {}
затем пользователь может создать задачу, вызвав эту конечную точку
#./daq/task/task.py
from daq import TASKS
# ...
def api_create_task_endpoint(task_id):
try:
task = nidaqmx.Task(new_task_name=task_id)
TASKS[task_id] = task
except Exception:
# handle it
Все до этого работает так, как должно. Я могу получить список задач, и задача остается открытой. Я также пытался явно вызвать task.control(nidaqmx.constants.TaskMode.TASK_RESERVE)
, но следующий код вызывает у меня ту же проблему, несмотря ни на что.
Когда я пытаюсь добавить каналы в задачу, она закрывается в конце вызова функции, независимо от того, как Я установил состояние.
#./daq/task/channels.py
from daq import TASKS
def api_add_channel_task_endpoint(task_id, channel_type, function):
# channel_type corresponds to ni-daqmx channel modules (e.g. ai_channels).
# function corresponds to callable functions (e.g. add_ai_voltage_chan)
# do some preliminary checks (e.g. task exists, channel type valid)
channels = get_chans_from_json_post()
with TASKS[task_id] as task:
getattr(getattr(task, channel_type), function)(channels)
# e.g. task.ai_channels.add_ai_voltage_chan("Dev1/ai0")
Это, очевидно, закрытие задачи. Когда я снова вызываю api_create_task_endpoint(task_id)
, я получаю DaqResourceWarning
, что задача была закрыта и больше не существует.
Я также попытался установить TaskMode, используя task.control
здесь, но безрезультатно.
Я хотел бы иметь возможность вносить изменения в задачу, сохраняя ее в общедоступном модуле TASKS
, но не могу держать задачу открытой достаточно долго, чтобы сделать это.
2) I также попытался реализовать это с помощью функции сохранения NI-MAX. Проблема в том, что задачи не могут быть сохранены, если они уже не содержат каналы, что я не обязательно хочу делать сразу после создания задачи.
Я попытался обойти это, добавив в api_create_task_endpoint()
некоторое поведение по умолчанию, которое просто добавляет случайный канал, который удаляется на первом канале, добавленном пользователем. Проблема в том, что я не могу найти документацию по способу удаления каналов из задачи после добавления их без GUI (это работает на CENTOS, поэтому GUI не запускается).
Большое спасибо за любую помощь!