Bubot в деталях
Версия от 00:43, 3 апреля 2015; Разговоров Михаил (обсуждение | вклад) (added Category:Bubot using HotCat)
from buject.Buject import Buject
# импортируем необходимые модули питон, как минимум модуль базового класса
class BujectName(Buject):
# Buject Name - название Вашего класса может быть любым
# название не должно пересекаться с названиями других модулей и буботов
# Buject в качестве базового класса может выступать как базовый модуль
# так и любой другой сделанный на его основе.
# Например для всех моторов создан класс Motor который задает общий интрефейс для работы с данным типом устройств
# а для поддключения мотора скажем через контроллер PCA9685 мы создаем свой модуль унаследованный от модуля Motor
# в котором реализуем интерфес применительно к конкретному железу. Своеобразный драйвер устройства.
def __init__(self, user_config=None):
super(BujectName, self).__init__(user_config) # читаем конфиги
self.my_const_x = 'XXX' # определяете необходимые Вам константы.
# все настраиваемые параметры должны быть описаны в конфиге
def on_ready(self):
# метод вызвается перед запуском сервиса.
# в этот момент все параметры сервиса проиницилизированы
# небходимые сервисы уже запустились
# сервис подписан на все необходимые сообщения
return
def on_run(self):
# метод вызывается после запуска сервиса
return
def main_loop(self):
# основной цикл сервиса, частота определяется параметром max_fps
# отрицательное значение max_fps задает частоту не чаще одного раза в Х секунд
# метод автоматически один раз в мекунду обновляет параметры и статус модуля в разделяемой памяти
# если нужна большая частота обновления, рекомендуется это делать уже на событиях
return
def on_terminate(self):
# метод вызвается после остановки сервиса.
return
def incoming_event_XXX(self, message):
# мeтод вызывается при поступлении события XXX
return
def incoming_request_XXX(self, message):
# мeтод вызывается при поступлении сообщения XXX
return
def incoming_response_XXX(self, message):
# мeтод вызывается при поступлении ответа за запрос XXX
return
def action_XXX(self):
# Вы можете опреелить любые Ваши методы, хорошим тоном будет использование префикса,
# чтобы другие разработчики могли отличать пользовательские методы от методов фреймворка.
buject_config = self.config
# Вам доступны все параметры Вашего конфига в виде словаря
# для более удобного использования они продублированы в малых словарях
# param, status, bubot
bubot_param = self.bubot
buject_param = self.param
buject_status = self.status
# малые словари автоматически обновляются в разделяемой памяти и доступны другим сервисам
# особое внимание следует уделить служебным статусам характеризующим текущее состояние сервиса
buject_status = self.status['buject'] # статус ready, error, wait depend buject
buject_acton = self.status['action'] # чем в данный момент занимается сервис
self.send_status()
# принудительно обновление параметров и статусов сервиса в разделяемой памяти
self.get_status('bubot', 'buject')
# запрос параметров и статусов любого сервиса
# фреймворк предоставляет следующие мотоды для обмена информацией между сервисами
self.send_event('event_name', {'param_name':'param_value'}) #генерация события
self.send_request('request_name', {'param_name':'param_value'})
# отправка запроса, в метод передается только название и передаваемые параметры
# информацию о получателе запрос и названии запроса у получателя метод получит из конфига
self.send_response('request_data', 'response_data')
# отправка ответа на запроса,
# в метод передается запрос и данные для ответа
# запрос нужен для определения получателя ответа
return
{
"param": {
"name": {
"value": "BujectFAQ" // имя сервиса по умолчанию, обязателен
// если в системе булет запушен только один экземпляр этого модуля (сервис),
// то этого имени будет достаточно
},
"buject": {
"value": "BujectFAQ" // имя модуля, обязательно
},
"parent": {
"value": "Buject" // имя базового модуля, обязательно
},
"user_parameter_1": { // имя пользовательского параметра
"value": "default value", // значение по умолчанию
"description": "Пользовательский параметр 1", // описание параметра
"type": "int" // тип, используется при изменениии значения параметра
// через пользовательский интерфейс.
// поддерживаются int (приведение строки из поля ввода к числу).
// если type отсутствует то введенное в поле ввода значение
// будет сохранено как строка
}
},
"status": { // список параметров характеризующих состояние сервиса
// в отличие от параметров они никак не влияют на работу сервиса
// их значение вычисляется в процессе работы сервиса
// характерным примером статуса является FPS
"user_status_1": { // имя пользовательского статуса
"value": "default value", // инициализируется значением по умолчанию
"description": "user status 1", // описание статуса
"type": "unixtime" // тип, используется при визуализаиии значения
// в пользовательском интерфейсе.
// поддерживаются unixtime (форматирование в строку при выводе)
// если type отсутствует то значение выводится как есть
}
},
"depend_buject": {// список сервисов необходимых для запуска данного сервиса
"PCA9685": {} // напрмер данный сервис не будет запущен пока не стартует
// сервис с именем PCA9685 (status.buject = 'ready'
},
"incoming_request": { // список входящих запросов которые может обрабатывать модуль
"set_power": { // название запроса
"description": "Установить мощность мотораа", // описание
"param": { // список параметров принимаемых запросом, используется при отладке
// и конфигурировании робота через веб интерфейс
"param_name": { // состав и назначение аналогично param, см. выше
"value": "default value",
"description": "Пользовательский параметр 1",
"type": "int"
},
"response": 1 // указывается для информацировании о том что метода может быть направлен ответ
}
}
},
"outgoing_request": { // список запросов отправляемых сервисом
"set_power_move_motor": { // название запроса исходя из смысла действия, Установи мощность заднего мотора
"bubot": "other bubot", // указывается, если получателем запроса является другой бубот
"buject": "move_motor", // название сервиса получателя запроса, обязателен
"name": "set_power", // название запроса на стороне получателя, обязателен
"description": "Устанавливаем мощность заднего мотора",
"response": 1 // указывается если сервис будет ожидать ответа на этот запрос
}
},
"outgoing_event": { // список событий происодящих в модуле
"move_detected": { // название события
"description": "Обнаружено движение", // описание
"param": { // список параметров события, используется при отладке
// и конфигурировании робота через веб интерфейс - необязателен
"param_name": { // состав и назначение аналогично param, см. выше
"value": "default value",
"description": "Пользовательский параметр 1",
"type": "int"
}
}
}
},
"incoming_event": {
"room_move_detected": { // название события
"bubot": "other bubot", // указывается, если мы олучателем запроса является другой бубот
"buject": "room_control", // название сервиса получателя запроса, обязателен
"name": "move_detected", // название запроса на стороне получателя, обязателен
"description": "В комнате сработал датчик движения"
}
}
}