Создание скриптов для X-Control Dispatcher

Как и обещал, я расскажу о том, как создавать скрипты для этой программы.
В прошлой статье было описано, как сделать голосовое управление, промежуточным модулем был xtask_manager, который, как я и писал, не удобен для кодеров. Попробуем заменить данный модуль скриптом.
Сам скрипт выполняется с помощью QtScript (подобие JavaScript).
Я не буду здесь описывать все функции и т.д., расскажу только о самых нужных, которые нужны для нашей задачи.

Думаю, Вы знаете, что в программе есть стандартные виджеты, вот они могут выполнять эти скрипты. Сам файл скрипта должен заходиться в папке «scripts», подключается он в дополнительных настройках стандартных виджетов:


Существует объект XObj, через который можно со скрипта получить доступ к объекту виджета, и работать с его методами, сигналами и т.д.

Методы объекта XObj
  • journalAdd(text, level). Функция, позволяющая выводить сообщение в журнал.
    Пример: journalAdd(«Скрипт запущен», 1);
  • getOtherWidget(widgetID). Функция для получения объекта XObj любого другого виджета по его ID.
  • getScriptObject(). Получить объект скрипта. Функция нужна для доступа к скрипту другого виджета. К примеру, в скрипе виджета1 есть объект «newObject», Вы хотите к нему обратиться со скрипта виджета2: getOtherWidget(«виджет1»).getScriptObject().newObject.
  • standartWidgetsLoaded. Сигнал, вызываемый после полной загрузки всех стандартных виджетов.
    Пример: XObj.standartWidgetsLoaded.connect(this, function() { Какие-то действия });
  • allLoaded. Сигнал, вызываемые после полной загрузки всех стандартных виджетов и модулей (включая расширения).
  • getComponent(p). Функция для получения объекта компонента стандартного виджета. p — это или строка с названием компонента, или число с порядковым номером компонента.

Методы объекта компонента (который мы получаем функцией getComponent(p))
  • setValue(v, sender). Установить значение. v — само значение, sender — это тот объект, который его установил (можно просто вставить XObj). Если компонент не имеет сэттэра, то значение сразу же установится на компонент, если имеет, тогда это значение будет передано сэттэру.
    Пример: setValue(10, XObj);
  • lastSetValue(). Получить последнее значение, которое было установлено на компонент (если есть сэттэр, то это то значение, которое ему установил сэттэр).
  • getValue(). Получить значение компонента. Если у него есть сэттэр, то данная функция вернет то значение, которое компонент передал сэттэру.
  • valueUpdated. Сигнал, вызывается после того, как значение компонента обновилось (к примеру, сэттэр установил новое).
  • returnValueUpdatedSignal. Сигнал, вызываемый после того, как компонент передал значение сэттэру. Если сэттэра нет, то не вызывается.

Пример использования для голосового управления:
var	vrec = XObj.getComponent("rec");	// компонент, который содержит принятую строку (распознанную)
var	vsyn = XObj.getComponent("syn");	// компонент для воспроизведения речи.

// Объекты для хранения компонентов других виджетв. 
// Нет гарантии, что эти компоненты будут загружены до загрузки этого виджета, поэтому их инициализируем 
// после загрузки всех виджетов и модулей.
var themperature = {};
var time = {};
var player = {};

XObj.allLoaded.connect(this, function() {
	
	// температура в доме и на улице
	themperature.home = XObj.getOtherWidget("weater").getComponent("t_home");
	themperature.out = XObj.getOtherWidget("weater").getComponent("t_outside");
	// время (часы и минуты)
	time.hours = XObj.getOtherWidget("AnalogClock").getComponent("h");
	time.min = XObj.getOtherWidget("AnalogClock").getComponent("m");
	// компонент для управления плеером
	player.key = XObj.getOtherWidget("player").getComponent("key");
	
	vrec.valueUpdated.connect(this, function() {
		var	speak = "";	// Строка для воспроизведения.
		
		switch (vrec.getValue()) {
			// Если сказали "обстановка", говорим время и температуру, 
			// если "привет", то говорим "Здравствуй!", затем время и температуру.
			case "привет": speak = "Здравствуй! ";
			case "обстановка": {
				speak += "Сейчас " + phrases.curentTime();
				speak += phrases.temperature();
			} break;
			
			// отдельно для температуры и времени
			case "температура": speak = phrases.temperature(); break;
			case "время": speak = phrases.curentTime(); break;
						
			// управление плеером
			case "музыка": player.key.setValue("59", XObj); break;
			case "останови музыку": player.key.setValue("35", XObj); break;
			case "следующий трек": player.key.setValue("32", XObj); break;
			case "предыдущий трек": player.key.setValue("33", XObj); break;
			case "звук": player.key.setValue("13", XObj); break;

			// Просто фразы в ответ, чисто для примера
			case "как ты":
			case "как дела": speak = "Вполне не плохо!"; break;
			case "я спать": speak = "Спокойной ночи!"; break;
			case "что я люблю": speak = "Кататься на велике"; break;
		}
		
		if (speak.length) vsyn.setValue(speak, XObj);	// Если строка не пустая, воспроизводим
	});
	
});

var phrases = {
	temperature: function() {
		return "Температура на улице " + themperature.out.getValue() + " градусов, в доме " + themperature.home.getValue() + ". ";
	},
	curentTime: function() {
		return parseInt(time.hours.getValue()) + " часов, " + parseInt(time.min.getValue()) + " минут. ";
	}
};


Да, и вдруг Вам таймер понадобится, делается он вот так:
var timer = new QTimer(this);
timer.interval = 5000; // set the time in milliseconds
timer.timeout.connect(this, function() {
    ...Действия...
});
timer.start();
 
  • +1
  • 24 апреля 2015, 19:14
  • MrMisha

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.