## Программирование контроллера ТРИК в TRIKStudio

### Подключение робота

Подробная инструкция по настройке и подключению робота к сети находится на вики проекта, Инструкция по настройке и подсоединению к контроллеру. Здесь будем считать, что робот и компьютер с TRIKStudio уже находятся в одной сети. В таком случае достаточно выбрать конструктор ТРИК в окне настроек и указать IP-адрес робота (его можно посмотреть в меню "Сеть" на роботе):

Указать IP-адрес робота можно и в окне конфигурации сенсоров прямо на главном окне TRIKStudio:

Этих действий достаточно для работы с ТРИК в режиме генерации, для работы интерпретатора необходимо ещё установить соединение с роботом, нажав на кнопку "Подключиться" на панели инструментов:

### Блоки ТРИК

Специализированные блоки для ТРИК делятся на несколько категорий:

- Действия – блоки, выполняющие какое-либо действие на роботе: включение моторов, проигрывание звука и т.д.
- Ожидания – блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т.д.
- Рисования на дисплее – блоки, используемые для вывода графики и текста на экран.

#### Действия

Название элемента | Пиктограмма | Описание
Играть звук |  | Проиграть на роботе заданный звуковой файл, который должен быть заранее загружен на робот. Путь до файла указывается относительно папки trik на роботе. Загрузить файл на робот можно, например, с помощью программы WinSCP
Моторы вперёд |  | Включить моторы по заданным портам с заданной мощностью. Порты задаются строками M1, M2, M3 и M4, разделенными запятыми. Мощность задается в процентах числом от -100 до 100, если задано отрицательное значение, мотор включается в режиме реверса. Так, на картинке изображена команда включения моторов на портах M3 и M4 с мощностью 100%.
Моторы назад |  | Включить моторы в режиме реверса по заданным портам с заданной мощностью. Параметры аналогичны параметрами блока "Моторы вперёд".
Моторы стоп |  | Выключить моторы по заданным портам.
Сбросить показания энкодера |  | Сбросить показания количества оборотов моторов по указанным портам.
Угловой сервомотор |  | Установить валы угловых сервомоторов на указанных портах в указанное положение (в градусах, от -90 до 90).
Сказать |  | Произнести с помощью динамика фразу, переданную в качестве аргумента блока.
Светодиод |  | Установить цвет светодиода на корпусе робота в указанный.
Системный вызов |  | Блок имеет булевый параметр "Код". Если он установлен в "Истина", содержимое параметра "Команда" генерируется напрямую в текст программы при генерации этого блока. Если он установлен в "Ложь", генерируется вызов консольной команды операционной системы. Например, команда, представленная на рисунке, перезагружает робот.
Включить видеокамеру |  | Включить видеокамеру на роботе в одном из трёх режимов: Сенсор линии – детектирует цветную линию в центре кадра и в дальнейшем возвращает отклонение центра линии от центра кадра, как число в интервале от -100 (влево) до 100 (вправо). Сенсор объекта – детектирует контрастный объект в центре кадра и в дальнейшем возвращает координаты его центра и диаметр в пикселах. Сенсор цвета – возвращает доминирующий цвет в центре кадра в виде его координат в цветовой шкале RGB.
Детектировать по камере |  | Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта. Камера должна быть включена в соответствующем режиме блоком "Включить видеокамеру"
Датчик линии в переменную |  | Помещает текущее показание датчика линии в указанную переменную. Камера должна быть включена в режиме датчика линии блоком "Включить видеокамеру" и проинициализирована блоком "Детектировать по камере"
Послать сообщение |  | Отправляет данное сообщение роботу с данным бортовым номером. Робот должен быть в той же сети, что и робот, отправляющий сообщение, и зарегистрирован как ведущий или ведомый с помощью меню "Настройки" -> "Сообщения" на роботе. Если роботов с данным бортовым номером в сети несколько, сообщение получат все они.
Отправить сообщение в задачу |  | Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке "Параллельные задачи". В качестве сообщения может быть любое выражение.
Записать в файл |  | Записывает значение данного выражения в заданный файл на роботе. Файл можно получить с робота, например, с помощью программы WinSCP под Windows или scp под Linux.
Удалить файл |  | Удаляет заданный файл на роботе.
Получить код кнопки |  | Сохраняет в указанную переменную код нажатой на роботе кнопки. Свойство "Ожидание" позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, в переменную кладётся -1.

#### Ожидания

Название элемента | Пиктограмма | Описание
Ждать датчик касания |  | Ждать срабатывания датчика касания на указанном порту.
Ждать свет |  | Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным в значении параметра "Проценты". Еще один парамер — номер порта, к которому подключен сенсор цвета. Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра "Проценты". Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое соответствующим сенсором света, не будет больше, чем 60 процентов.
Ждать УЗ датчик расстояния |  | Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо с указанным в значении параметра "Расстояние" (расстояние задается в сантиметрах, от 0 до 300). Еще один парамер — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием. Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое сонаром, не будет больше, чем 40 см.
Ждать ИК датчик расстояния |  | Ждать, пока расстояние, возвращаемое инфракрасным сенсором расстояния, не будет сравнимо с указанным в значении параметра "Расстояние". По умолчанию на портах A1 и A2 расстояние задается в сантиметрах (от 0 до 100), к остальным подключение не рекомендуется, так как чистое значение с датчика будет обработано с ожиданием другого подключенного датчика. Еще один парамер — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием. Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое сонаром, не будет больше, чем 40 см.
Ждать энкодер |  | Ждать, пока показания счетчика количества оборотов на заданном порту не станут больше или меньше указанного в значении параметра "Предел оборотов".
Ждать нажатия кнопки |  | Ждать, пока не будет нажата указанная кнопка на корпусе робота.
Получить сообщение |  | Ждать получения сообщения через систему почтовых ящиков. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную. Свойство "Дождаться сообщения" позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, положив в переменную пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника, то есть, например, можно послать число в виде строки и принять его как число.
Ждать кнопки на пульте |  | Ждать нажатия на "магическую кнопку" на Android-пульте, подключённом к роботу. Кнопки имеют номера с 1 по 5.
Ждать нажатия на пульт |  | Ждать нажатия на одну из двух активных областей Android-пульта, подключённого к роботу. Координаты нажатия можно получить с помощью сенсорных переменных gamepadPad1 и gamepadPad2.
Ждать "руля" на пульте |  | Ждать нужного наклона Android-пульта, подключённого к роботу. Наклон регистрируется только если на пульте включён режим "руля", угол наклона кодируется числами от -100 (максимально влево) до 100 (максимально вправо). Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра "Угол". Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое "рулём", не будет больше 0
Ждать отключения пульта |  | Ждать, пока Android-пульт не отключится от робота. Если пульт не подключен, немедленно продолжает выполнение.
Ждать подключения пульта |  | Ждать, пока к роботу не подключится Android-пульт. Если пульт уже подключен, немедленнно продолжает выполнение.
Получить сообщение из другой задачи |  | Ждать получения сообщения из другой параллельной задачи. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную. Свойство "Дождаться сообщения" позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, положив в переменную пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника, то есть, например, можно послать число в виде строки и принять его как число.

#### Рисование на дисплее

Название элемента | Пиктограмма | Описание
Цвет кисти |  | Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.
Ширина кисти |  | Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.
Нарисовать точку |  | Нарисовать на экране точку в указанных координатах.
Нарисовать линию |  | Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.
Нарисовать прямоугольник |  | Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.
Нарисовать эллипс |  | Нарисовать на экране эллипс, вписанный в заданный прямоугольник.
Нарисовать дугу |  | Нарисовать на экране дугу, задающуюся координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована полная окружность.
Смайлик |  | Нарисовать на экране смайлик.
Грустный смайлик |  | Нарисовать на экране грустный смайлик.
Цвет фона |  | Задаёт цвет фона экрана.
Напечатать текст |  | Печатает заданную строку в заданном месте на экране робота. Значение свойства "Текст" по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран. Чтобы система считала, что это выражение на текстовом языке (это может быть полезно, например, при отладке значения переменных), поставьте галочку "Вычислять" в редакторе свойств.
Очистить экран |  | Стереть всё, что нарисовано на экране.

Описание блоков, общих для всех конструкторов, можно посмотреть в разделе Создание программ/Создание блоков.

### Сенсорные переменные

Название | Описание
accelerometer | Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z соответственно.
colorSensorR, colorSensorG, colorSensorB | Показания датчика цвета по видеокамере в центре кадра (интенсивность красного, зелёного и синего соответственно, от 0 до 255). Обновляются только когда датчик цвета включён и проинициализирован.
encoder1, encoder2, encoder3, encoder4 | Показания экодера на порту E1, E2, E3 или E4 соответственно.
buttonDown, buttonEnter, buttonEsc, buttonLeft, buttonRight, buttonUp | Состояние кнопок на корпусе робота: кнопки "Вниз", "Ввод", "Отмена", "Влево", "Питание", "Вправо", "Вверх" соответственно. 0 соответствует ненажатой кнопке, 1 – нажатой.
gamepadButton1, gamepadButton2, gamepadButton3, gamepadButton4, gamepadButton5 | Состояние кнопок на Android-пульте, кнопки с 1 по 5 соответственно. 0 соответствует ненажатой кнопке, 1 – нажатой.
gamepadConnected | Состояние подключения Android-пульта, 0 соответствует неподключенному пульту, 1 – подключенному.
gamepadPad1, gamepadPad2 | Координаты нажатия активных областей на Android-пульте. Каждая переменная хранит в себе массив из двух элементов, соответствующих x- и y-координате точки нажатия. Координаты изменяются в границах от (-100, -100) до (100, 100), где (-100, -100) соответствует левому верхнему углу активной области. В случае, если область не нажата, в переменной находится значение (-101, -101).
gamepadPad1Pressed, gamepadPad2Pressed | Содержат 1, если соответствующая активная область на Android-пульте нажата и 0, если нет. Координаты нажатия можно узнать с помощью переменных gamepadPad1 и gamepadPad2.
gamepadWheel | Содержат текущий наклон Android-пульта, если он подключён и на нём включён "руль". Наклон кодируется числами от -100 (крайнее левое положение) до 100 (крайнее правое положение). Если данных о положении "руля" нет, в переменной находится число -101.
gyroscope | Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.
lineSensor | Массив из трёх элементов: Координата линии датчика линии по видеокамере от -100 (крайнее левое положение линии в кадре) до 100 (крайнее правое положение). Обновляется только когда датчик линии включён и проинициализирован. Вероятность перекрёстка, возвращаемая датчиком линии по видеокамере. Определяется как процент точек внутри горизонтальной полосы в центре кадра, распознанных как линия. В диапазоне от 0 (таких точек нет) до 100 (все точки в горизонтальной полосе распознаны как линия). Обновляется только когда датчик линии включён и проинициализирован. Относительный размер линии, то есть количество точек в кадре, определённых как линия, от 0 (линии в кадре нет) до 100 (весь кадр распознан как линия). Обновляется только когда датчик линии включён и проинициализирован.
objectSensorX, objectSensorY, objectSensorSize | Показания датчика объекта по видеокамере: координаты X, Y распознанного объекта (относительно центра кадра, от -100 до 100) и размер объекта (от 0 до 100, 100 – объект занимает весь кадр). Обновляются только когда датчик объекта включён и проинициализирован.
sensorA1, sensorA2, sensorA3, sensorA4, sensorA5, sensorA6, sensorD1, sensorD2, sensorF1 | Показания датчиков на портах A1, A2, A3, A4, A5, A6, D1, D2, F1 соответственно.

### Текстовое программирование

#### Qt Script

Qt Script – интерпретируемый объектно-ориентированный язык с динамической типизацией, реализация стандарта ECMAScript (как и JavaScript, так что Qt Script можно рассматривать как диалект JavaScript). Подробное описание языка на русском можно найти, например, здесь: http://javascript.ru/ecma. При программировании на контроллере ТРИК используется библиотека, обеспечивающая взаимодействие скрипта с аппаратным обеспечением и некоторые расширения ECMAScript, описанные ниже.

Пример простой программы на Qt Script:

    brick.smile();
    script.wait(2000);

Здесь мы видим объект brick, у которого вызывается метод smile (нарисовать смайлик на экране) и объект script, у которого вызывается метод wait – ждать указанное количество миллисекунд. brick – объект, обеспечивающий взаимодействие скрипта с аппаратным обеспечением контроллера, script же отвечает за взаимодействие с операционной системой и управление исполнением скрипта. brick также предоставляет доступ к другим объектам, отвечающим за конкретные устройства, например, обращение к мотору на порту M1 выглядит так:

    brick.motor(M1).setPower(100);

Пример более сложной программы, движение по линии с двумя сенсорами света:

    var k = 1.3;
    var power = 50;

    var left = brick.sensor("A1").read();
    var right = brick.sensor("A2").read();
    while (true) {
    	var u = k * (brick.sensor(A1).read() - left - (brick.sensor(A2).read() - right));
    	brick.motor("M3").setPower(power + u);
    	brick.motor("M4").setPower(power - u);
    	script.wait(30);
    }

Здесь видны объявления переменных – тип для них не указывается, он соответствует значениям, помещаемым в переменную.

Одно из расширений стандартного ECMAScript, реализованное в Qt Script – возможность подписываться на события. Делается это с помощью функции connect, вызываемой от объекта-события, как в примере ниже. Там с помощью анонимной функции (описываемой с помощью ключевого слова function) скрипт подписывается на событие pad, соответствующее нажатию на одну из активных областей Android-пульта. На пульте их всего две, на какую именно из них нажали передаётся в параметре padId сигнала. x и y – координаты точки нажатия. Функция будет вызываться каждый раз, когда пользователь Android-пульт будет присылать сообщение, что на него нажали.

    gamepad.pad.connect(
    	function(padId, x, y) {
    		if (padId == 1) {
    			brick.motor("E1").setPower(y);
    			brick.motor("E2").setPower(-x);
    		}

    		if (padId == 2) {
    			brick.motor("M1").setPower(y + x);
    			brick.motor("M2").setPower(y - x);
    		}
    	}
    )

Подобный стиль программирования называется реактивным (система реагирует на события) и пока не поддержан при генерации по диаграмме из TRIKStudio. То есть генерируемый код никогда не содержит вызовов connect, реактивные программы можно писать только вручную. Для того, чтобы программа не завершилась сразу же, а осталась работать и ожидать событий, используется метод run объекта script. Для выхода из режима ожидания и завершения работы событийно-ориентированного скрипта используется метод stop объекта script. Пример полной событийно-ориентированной программы, которая ждёт нажатия на кнопку "Ввод" и выходит, приведён ниже.

    brick.keys().buttonPressed.connect(
    	function(code, value) {
    		if (code == KeysEnum.Enter && value == 1) {
    			print("'Enter' pressed, exiting");
    			script.quit();
    		}
    	}
    );

    script.run();

Доступ к функциональности среды выполнения предоставляется с помощью предопределённых объектов:

- brick
- script
- mailbox
- gamepad
- Threading

Список доступных методов и событий по классам и объектам приведён в таблице ниже.

##### Объект "brick"

Представляет контроллер, предоставляет доступ к устройствам робота, таким как моторы и датчики.

Название метода | Пример вызова | Описание
playSound | brick.playSound('media/sound.mp3'); | Проиграть звуковой файл. Принимает в качестве параметра имя файла, который должен быть предварительно загружен на робот (с путём, абсолютным или относительно папки trik на роботе).
say | brick.say('Привет, я ТРИК'); | Произнести переданную как параметр строку (на русском или английском языке).
stop | brick.stop(); | Останавливает все моторы и активные датчики (такие как датчик линии или датчик объекта), убирает нарисованное на дисплее.
motor | brick.motor("M1"); | Возвращает мотор (класс Motor, силовой или сервомотор) на указанном порту.
sensor | brick.sensor("A1"); | Возвращает сенсор (класс Sensor) на указанном порту.
accelerometer | brick.accelerometer(); | Возвращает акселерометр (класс Sensor3d).
gyroscope | brick.gyroscope(); | Возвращает гироскоп (класс Sensor3d).
lineSensor | brick.lineSensor(); | Возвращает датчик линии по видеокамере (класс LineSensor).
colorSensor | brick.colorSensor(); | Возвращает датчик цвета по видеокамере (класс ColorSensor).
objectSensor | brick.objectSensor(); | Возвращает датчик объекта по видеокамере (класс ObjectSensor).
encoder | brick.encoder('B1'); | Возвращает энкодер на указанном порту (класс Encoder).
battery | brick.battery(); | Возвращает объект, предоставляющий доступ к батарее (класс Battery).
keys | brick.keys(); | Возвращает объект, предоставляющий доступ к кнопкам на корпусе робота (класс Keys).
display | brick.display(); | Возвращает объект, предоставляющий доступ к дисплею робота (класс Display).
led | brick.led(); | Возвращает объект, предоставляющий доступ к светодиоду на корпусе робота (класс Led).

##### Объект "script"

Представляет методы управления выполнением скрипта и доступ к функциям операционной системы.

Название метода | Пример вызова | Описание
timer | script.timer(100); | Создаёт и возвращает таймер (класс QTimer), посылающий сигнал timeout каждые n миллисекунд, где n передаётся в качестве параметра.
wait | script.wait(1000); | Приостанавливает выполнение скрипта на переданное количество миллисекунд.
time | script.time(); | Возвращает временной штамп (число: количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу).
random | var a = script.random(0, 10); | Возвращает случайное число в диапазоне от первого до второго своего параметра.
run | script.run(); | Устанавливает флаг событийно-ориентированной программы. По окончанию работы скрипт не выгружается из памяти, а продолжает ждать наступления событий до тех пор, пока какой-либо из обработчиков не вызовет script.quit()
quit | script.quit(); | Устанавливает флаг окончания работы для событийно-ориентированной программы. Как только будет завершён текущий обработчик события, исполнение скрипта закончится.
system | script.system("reboot"); | Выполняет переданную в качестве параметра команду консоли операционной системы.
writeToFile | script.writeToFile('output.txt', 'Hello, world'); | Записывает значение второго параметра в файл, указанный в качестве первого параметра.
readAll | var lines = script.readAll('input.txt'); | Считывает всё содержимое указанного файла в массив строк.
removeFile | script.removeFile('file.txt'); | Удаляет указанный файл.

##### Объект "mailbox"

Реализует связь между роботами в сети посредством механизма почтовых ящиков.

Название метода | Пример вызова | Описание
connect | mailbox.connect("192.168.0.20", 8889); | Подключается к роботу с заданным IP-адресом по заданному порту, сообщает ему свой бортовой номер и регистрируется в сети "почтовых ящиков".
connect | mailbox.connect("192.168.0.20"); | Подключается к роботу с заданным IP-адресом и портом по умолчанию, сообщает ему свой бортовой номер и регистрируется в сети "почтовых ящиков".
send | mailbox.send(1, "Hello"); | Посылает роботу с указанным бортовым номером указанное сообщение.
send | mailbox.send("Hello"); | Посылает указанное сообщение всем зарегистрированным роботам в сети.
hasMessages | mailbox.hasMessages(); | Возвращает true, если роботу пришло новое сообщение.
receive | var message = mailbox.receive(); | Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.
myHullNumber | var x = mailbox.myHullNumber(); | Возвращает бортовой номер робота.
newMessage | mailbox.newMessage.connect(function(sender, message) { print(message); }); | Посылается, когда робот получает новое сообщение. Первый параметр – бортовой номер отправителя, второй – само сообщение.

##### Объект "gamepad"

Служит для работы с Android-пультом управления, https://play.google.com/store/apps/details?id=com.trik.gamepad.

Название метода | Пример вызова | Описание
reset | gamepad.reset(); | Сбрасывает запомненные события от Android-пульта.
buttonWasPressed | gamepad.buttonWasPressed(1); | Возвращает true, если на пульте была нажата кнопка с указанным номером. Сбрасывает запомненное нажатие для этой кнопки. Кнопки нумеруются от 1 до 5.
isPadPressed | gamepad.isPadPressed(1); | Возвращает, нажата ли в данный момент область управления на пульте. Области управления имеют номера 0 и 1.
padX | gamepad.padX(1); | Если указанная область управления на пульте нажата, возвращает текущую x-координату нажатия.
padY | gamepad.padY(1); | Если указанная область управления на пульте нажата, возвращает текущую y-координату нажатия.
wheel | gamepad.wheel(); | Если на пульте включён "руль" (события от акселерометра Android-устройства), возвращает текущий наклон Android-пульта. Наклон кодируется числом от -100 до 100, -100 соответствует крайнему левому положению "руля", 100 – крайнему правому.
padUp | gamepad.padUp.connect( function(padId, x, y) { brick.stop(); }); | Посылается, когда пользователь оторвал палец от области управления с указанным номером. В качестве параметров имеет номер области управления и координаты последнего известного положения пальца на ней.
wheelEvent | gamepad.wheelEvent.connect( function(percent) { brick.motor("E1").setPower(percent); }); | Посылается, когда на пульте включён "руль" (события от акселерометра Android-устройства) и пользователь повернул Android-устройство. В качестве параметра передаётся число от -100 до 100, -100 соответствует крайнему левому положению "руля", 100 – крайнему правому.
pad | gamepad.pad.connect(function(padId, x, y) { print(padId + ":" + x + "," + y); }); | Посылается, когда пользователь нажал на область управления на пульте или переместил палец по ней. В качестве параметров передаётся номер области управления и координаты нажатия (числа от -100 до 100, координата -100, -100 соответствует левому верхнему углу области управления).
button | gamepad.button.connect(function(button, pressed) { if (button == 1) brick.stop(); }); | Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта. Первый параметр – номер кнопки (от 1 до 5), второй – 1, если кнопка нажата, 0 – если кнопка отпущена.
disconnect | gamepad.button.disconnect(function() { brick.stop(); }); | Посылается при отключении пульта.

##### Объект "Threading"

Предоставляет управление параллельными потоками.

Название метода | Пример вызова | Описание
startThread | Threading.startThread("New thread id", "Function name"); | Запускает переданную в качестве параметра функцию в отдельном потоке. Обратите внимание, что при этом создаётся новая копия для всех глобальных переменных, так что если в одном потоке значение переменной меняется, в другом потоке оно остаётся старым.
killThread | Threading.killThread("Thread id"); | Заканчивает исполнение потока с заданным Thread id.
joinThread | Threading.joinThread("Thread id"); | Ожидает завершения всех потока с заданным Thread id.
sendMessage | Threading.sendMessage("Thread id", "New message"); | Посылает сообщение потоку с заданным Thread id.
receiveMessage | Threading.receiveMessage(wait); | Запрашивает принятое сообщение, если wait равен true, то ожидает пока не придет сообщение.

##### Класс "Battery"

Предоставляет доступ к информации о батарее или блоке питания.

Название метода | Пример вызова | Описание
readVoltage | brick.battery().readVoltage(); | Возвращает текущий вольтаж батареи (или блока питания) в вольтах.

##### Класс "ColorSensor"

Датчик цвета по видеокамере.

Название метода | Пример вызова | Описание
init | brick.colorSensor().init(true); | Включает видеокамеру и инициализирует её в режиме датчика цвета. Булевый параметр определяет, выводить ли на экран изображение с камеры (true – выводить).
read | brick.colorSensor().read(2, 2); | Возвращает массив с координатами доминирующего цвета в цветовой шкале RGB в указанном участке кадра. Кадр делится на квадраты сеткой, по умолчанию 3 на 3, размерность сетки можно задать в config.xml на роботе. Квадраты индексируются с 1, то есть (1, 1) – это левый верхний край кадра, (2, 2) – его центр. Возвращаемое значение – массив из трёх элементов от 0 до 255, индексирующийся с 0. Нулевой элемент содержит интенсивность красного (0 – совсем нет, 255 – очень много), первый – интенсивность зелёного, второй – интенсивность синего. Например, (0, 0, 0) – чёрный, (255, 255, 255) – белый, (255, 0, 0) – красный.
stop | brick.colorSensor().stop(); | Выключает видеокамеру и прекращает работу датчика.

##### Класс "LineSensor"

Датчик линии по видеокамере.

Название метода | Пример вызова | Описание
init | brick.lineSensor().init(true); | Включает видеокамеру и инициализирует её в режиме датчика линии. Булевый параметр определяет, выводить ли на экран изображение с камеры (true – выводить).
detect | brick.lineSensor().detect(); | Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии. После этого read() начинает возвращать данные для этой линии.
read | brick.lineSensor().read(); | Возвращает массив, в ячейках которого находятся следующие данные: в нулевой ячейке координата по оси x центра линии относительно центра кадра (от -100 до 100, -100 – центр линии на краю кадра слева); в первой ячейке – вероятность перекрёстка (число от 0 до 100, показывающее сколько точек цвета линии находится в горизонтальной полосе в центре кадра); во второй ячейке – относительный размер линии, число от 0 до 100. 100 – линия занимает почти весь кадр, 0 – линии нет на кадре.
stop | brick.lineSensor().stop(); | Выключает видеокамеру и прекращает работу датчика.

##### Класс "ObjectSensor"

Датчик объекта по видеокамере. Захватывает контрастный объект в центре кадра и возвращает его координаты и размер в кадре .

Название метода | Пример вызова | Описание
init | brick.objectSensor().init(true); | Включает видеокамеру и инициализирует её в режиме датчика объекта. Булевый параметр определяет, выводить ли на экран изображение с камеры (true – выводить).
detect | brick.objectSensor().detect(); | Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта. После этого read() начинает возвращать данные для объекта.
read | brick.objectSensor().read(); | Возвращает массив, в ячейках которого находятся следующие данные: в нулевой ячейке координата по оси x центра объекта относительно центра кадра (от -100 до 100, -100 – центр объекта на краю кадра слева); в первой ячейке – координата по оси y центра объекта относительно центра кадра (от -100 до 100, -100 – центр объекта на краю кадра сверху); во второй ячейке – относительный размер объекта, число от 0 до 100. 100 – объекта занимает почти весь кадр, 0 – объекта нет на кадре.
stop | brick.objectSensor().stop(); | Выключает видеокамеру и прекращает работу датчика.

##### Класс "Sensor"

Представляет сенсор (аналоговый или цифровой), подключающийся к портам A1, ..., A6, D1, D2, F1.

Название метода | Пример вызова | Описание
read | brick.sensor("A1").read(); | Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту. Возвращается приведённое значение, зависящее от конфигурации порта, которая описывается в файле config.xml в папке trik на роботе. Например, ИК-датчик расстояния возвращает значение в сантиметрах.
readRawData | brick.sensor("A1").readRawData(); | Возвращает текущее "сырое" показание сенсора (цифрового или аналогового), подключённого к данному порту. Диапазон значений зависит от конкретного сенсора и не учитывает конфигурацию робота (возвращаются физические показания сенсора, например, задержка принятого ультразвукового сигнала).

##### Класс "Sensor3d"

Представляет сенсор, возвращающий в качестве значения массив из трёх чисел (гироскоп или акселерометр).

Название метода | Пример вызова | Описание
read | brick.gyroscope().read(); | Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей.
newData | brick.gyroscope().newData.connect(function (x) { print(x[0]); }); | Сигнал, посылаемый сенсором, когда у него готовы новые данные. В качестве параметра передаётся массив из трёх элементов, соответствующих показаниям сенсора по каждой из осей.

##### Класс "Display"

Предоставляет доступ к дисплею робота.

Название метода | Пример вызова | Описание
showImage | brick.display().showImage('media/trik_smile_sad.png'); | Вывести на экран изображение, предварительно загруженное на робот. Параметр – имя файла с изображением (в форматах BMP, GIF, JPG, JPEG, PNG, PBM, PGM, PPM, TIFF, XBM, XPM), путь указывается либо абсолютным, либо относительно папки trik.
addLabel | brick.display().addLabel('Привет, мир!', 1, 1); | Вывести на экран переданный в качестве параметра текст в указанные координаты. Если в указанных координатах уже был текст, он будет заменён новым.
removeLabels | brick.display().removeLabels(); | Удаляет с экрана весь текст, добавленный на него вызовами метода addLabel().
setPainterColor | brick.display().setPainterColor("red"); | Устанавливает цвет кисти, которой рисуются графические примитивы. Возможные цвета таковы: white, red, darkRed, green, darkGreen, blue, darkBlue, cyan, darkCyan, magenta, darkMagenta, yellow, darkYellow, gray, darkGray, lightGray, black.
setPainterWidth | brick.display().setPainterWidth(5); | Устанавливает толщину кисти, которой рисуются графические примитивы, в пикселах.
drawLine | brick.display().drawLine(0, 0, 10, 10); | Рисует линию с началом и концом в заданных координатах.
drawPoint | brick.display().drawPoint(10, 10); | Рисует точку в заданных координатах.
drawRect | brick.display().drawRect(0, 0, 10, 10); | Рисует прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.
drawEllipse | brick.display().drawEllipse(0, 0, 10, 10); | Рисует эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.
drawArc | brick.display().drawArc(0, 0, 10, 10, 20, 50); | Рисует дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Последние два параметра – начальный и конечный угол, ограничивающие дугу.
setBackground | brick.display().setBackground("red"); | Устанавливает фон экрана в указанный цвет. Возможные цвета таковы: white, red, darkRed, green, darkGreen, blue, darkBlue, cyan, darkCyan, magenta, darkMagenta, yellow, darkYellow, gray, darkGray, lightGray, black.
hide | brick.display().hide(); | Закрывает и очищает окно для рисования.
clear | brick.display().clear(); | Очищает окно для рисования.
redraw | brick.display().redraw(); | Перерисовывает окно для рисования. Изменения в окне произойдут только после вызова этого метода.

##### Класс "Encoder"

Представляет энкодеры силовых моторов, подключающиеся к портам B1, B2, B3, B4.

Название метода | Пример вызова | Описание
read | brick.encoder("B1").read(); | Возвращает текущее показание энкодера в градусах на заданном порту.
readRawData | brick.encoder("B1").readRawData(); | Возвращает текущее показание энкодера в "тиках" на заданном порту.
reset | brick.encoder("B1").reset(); | Сбрасывает в 0 текущее показание энкодера.

##### Класс "Keys"

Служит для работы с кнопками на пульте робота.

Название метода | Пример вызова | Описание
reset | brick.keys().reset(); | Сбрасывает запомненные нажатия кнопок.
wasPressed | brick.keys().wasPressed(KeysEnum.Up); | Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки. Возможные варианты: KeysEnum.Left (код 105), KeysEnum.Up (код 103), KeysEnum.Down (код 108), KeysEnum.Enter (код 28), KeysEnum.Right (код 106), KeysEnum.Power (код 116), KeysEnum.Esc (код 1).
isPressed | brick.keys().isPressed(KeysEnum.Up); | Возвращает true, если кнопка с указанным кодом нажата в данный момент.
buttonPressed | brick.keys().buttonPressed.connect(function(code, value) { if (code == KeysEnum.Up) brick.stop(); }); | Посылается, когда кнопка с указанным кодом нажата или отпущена. Первый параметр – код кнопки, второй – 1, если кнопка нажата, 0, если отпущена.

##### Класс "Led"

Предоставляет управление светодиодом на корпусе робота.

Название метода | Пример вызова | Описание
red | brick.led().red(); | Включает светодиод в режим "красный".
green | brick.led().green(); | Включает светодиод в режим "зелёный".
orange | brick.led().orange(); | Включает светодиод в режим "оранжевый".
off | brick.led().off(); | Выключает светодиод.

##### Класс "Motor"

Предоставляет управление мотором робота (силовым или сервомотором).

Название метода | Пример вызова | Описание
setPower | brick.motor().setPower(100); | Включает мотор с указанной мощностью. Мощность задаётся в диапазоне от -100 ("полный назад") до 100 ("полный вперёд"). 0 соответствует "force break", то есть мотор останавливается, при этом он заблокирован и остаётся под напряжением.
power | var x = brick.motor().power(); | Возвращает текущую мощность мотора (от -100 до 100).
powerOff | brick.motor().powerOff(); | Выключает мотор.

#### F#

При программировании ТРИК на языке F# в качестве библиотеки поддержки времени выполнения используется библиотека TRIK-Sharp (https://github.com/kashmervil/trik-sharp), её описание и набор примеров доступны в Github-репозитории проекта. Познакомиться с языком F# и функциональным программированием вообще можно, например, с помощью книги Д. Сошникова "Программирование на F#" (http://www.ozon.ru/context/detail/id/6151130/). Обратите внимание, что для компиляции программ потребуется компилятор F# (устанавливаемый вместе со средой Microsoft Visual Studio версий не ниже 2010, отдельно его можно скачать отсюда: http://www.microsoft.com/en-us/download/details.aspx?id=44011), а исполнения программ на роботе должен быть установлен пакет mono, который не устанавливается по умолчанию.

#### Pascal

В качестве языка текстового программирования для ТРИК также может использоваться язык Паскаль (точнее, его диалект PascalABC.NET). Для этого должен быть установлен плагин поддержки Паскаля в TRIK Studio и компилятор PascalABC.NET, который можно скачать по ссылке http://pascalabc.net/ssyilki-dlya-skachivaniya. Достаточно консольного компилятора и необходимых компонент (PABCNETC.ZIP), если на компьютере установлен .NET Framework версии не ниже 4.5.1 или Mono. Путь до установленного компилятора (pabcnetc.exe) надо указать в настройках на вкладке "Роботы". При этом в этом же окне должна быть выставлена модель ТРИК версии 2015 года.

В качестве библиотеки поддержки времени выполнения для программ на Паскале, как и в случае с F#, тоже используется библиотека TRIK-Sharp (https://github.com/kashmervil/trik-sharp), а в качестве среды выполнения – виртуальная машина mono, установленная на роботе (поэтому программы, как и в случае с F#, могут запускаться несколько секунд, это вполне нормально).

Множество полезной информации о Паскале и его диалекте PascalABC.NET можно получить на сайте авторов этого компилятора, http://pascalabc.net/.

### Запуск программ

Для ТРИК существует несколько вариантов выполнения программ:

- пошаговая интерпретация диаграммы с посылкой команд в робота по Wi-Fi, или моделированием поведения робота с помощью двумерной модели
- загрузка и дальнейшее автономное исполнение программы на роботе без связи с компьютером.

#### Интерпретация по Wi-Fi

Чтобы запустить программу на выполнение, необходимо подключиться к роботу (как описано в разделе Подключение робота) и нажать кнопку "Выполнить" панели "Интерпретатор" или меню "Инструменты":

После этого интерпретатор ищет блок "Начало", с которого и начинается выполнение программы. Если такой блок на диаграмме не найден, будет выдано сообщение об ошибке. Для каждого функционального блока должна существовать ровно одна исходящая связь, по которой выполнение программы перейдет к следующему блоку. В противном случае будет выдано сообщение об ошибке.

Для того, чтобы остановить выполнение программы, нужно нажать кнопку "Прервать выполнение" панели "Интерпретатор" или меню "Инструменты"

#### Загрузка программы на робот

Для загрузки и немедленного запуска программы в режиме Qt Script достаточно подключиться к Wi-Fi-сети с роботом, указать его IP-адрес в окне настроек или на панели справа (подробнее см. в разделе Подключение робота) и нажать на кнопку "Загрузить и выполнить программу" (или выбрать соответствующий пункт меню):

Остановить исполняющуюся программу можно нажатием кнопки "Питание" на корпусе робота или кнопкой "Остановить робота" слева от кнопки "Загрузить и выполнить программу".

Справа от кнопки "Загрузить и выполнить программу" находятся кнопки

- Загрузить программу – загружает программу на робот, но не исполняет её. Программа может быть исполнена из меню "Файлы" на роботе.
- Генерировать код на Qt Script – не загружать программу на робот, а просто получить и открыть её представление на языке Qt Script. Программа может быть отредактирована (см. раздел Текстовое программирование – Qt Script) и загружена на робот нажатием кнопок "Загрузить программу" или "Загрузить и выполнить программу" при открытой текстовой вкладке.

Для работы в режиме генерации в F# требуется сначала указать компилятор F# в окне настроек на вкладке "Роботы":

Затем можно пользоваться кнопками на панели F#, функциональность которых аналогична кнопкам на панели Qt Script. Обратите внимание, что программы на F# могут стартовать довольно долго, порядка 8-10 секунд.

Не все диаграммы, работающие в режиме интерпретации, могут быть сгенерированы в код на текстовых языках. Связано это с тем, что современные текстовые языки не позволяют явно управлять потоком исполнения, и программа должна быть представима в виде последовательно исполняемых операторов, подпрограмм, условий и циклов, быть может, вложенных друг в друга. Визуальные языки дают большую свободу, поэтому не всегда хорошо отображаются на текстовые. Если в окне сообщений об ошибках при попытке генерации появляется сообщение "ОШИБКА: Данная диаграмма не может быть сгенерирована в структурированный код", следует попытаться реструктуризовать и упростить программу, чтобы упростить задачу генератору.