Добрый день, меня зовут Алексей, наша команда занимается разработкой игр и приложений.

Текущий год внес большие перемены в игровую индустрию.
Многие игровые компании покидают Россию, чтобы не лишиться заработков на
зарубежных площадках и, как следствие, своего бизнеса. Есть те, кто не планирует
уезжать из страны и подстраивается под текущие реалии, чтобы выжить. Мы относимся ко вторым. Об этом я хочу рассказать в данной статье и привести немного кода.

В одной из своих статей я уже вскользь упоминал о том, что наша игровая команда занимаемся проектом для бизнеса – системой бронирования переговорных комнат.

Изначально, этот проект позиционировался для нас как второстепенный, созданный под заказ, для одного из наших клиентов в начале 2020 года. Однако 2022 год заставил изменить к нему отношение.

система бронирования переговорных комнат
система бронирования переговорных комнат

Продажа лицензий позволяет нашей небольшой команде поддерживать положительный баланс, и продолжать работу над нашей текущей игрой Jaws & Claws.

Один из наших клиентов, обратился к нам с просьбой доработать систему, для ее взаимодействия с контурной подсветкой планшетов Philips 10BDL4151T.

Дорабатывать программное обеспечение под устаревшее оборудование бесперспективно и иногда требует больших трудозатрат. Но опыт работы в игровой индустрии, когда мы стараемся угодить нашим игрокам, сделал нас клиентоориентированной командой. Поэтому мы не хотели отказывать клиенту в выполнении данной работы.

Мы стали искать информацию, которая нам сможет помочь. Кроме примера работы с подсветкой на C#, мы дополнительно нашли документ, описывающий работу с устройствами Phillis через SICP протокол.

Этот документ развеял наши сомнения о том, что необходимо произвести данную доработку. Нет сомнений, что это поможет нам в дальнейшем при создании мультиплеера для нашей игры.

Когда я говорю знакомым, что доработка контурной подсветки поможет нам в работе над игрой, всегда слышу вопрос: «Что общего между лампочкой планшета и игрой в стиле файтинг-платформер?»

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

Для создания наших игр и приложений мы используем c++ и игровой движок cocos2d-x. Иногда это дает нам преимущество, иногда создает значительные ограничения и неудобства.

Теперь, когда описательная часть закончена, я предлагаю перейти к функциям, которые мы используем в нашем проекте для взаимодействия с контурной подсветкой планшетов Philips 10BDL4151T.

На текущей момент система использует пять вариантов подсветки:

  • выключено

  • красный

  • зеленый

  • желтый

  • серый

Цвет контурной подсветки устанавливается в функции по тегу.

// функция устанавливает цвет по тегу
void CPhilipsLight::_setLedColorByTag(int colorTag)
{
	if (!isAccess_ || colorTag_ == colorTag)
		return;

	colorTag_ = colorTag;

	switch (colorTag_)
	{
	case ColorTag::OFF:
		this->_setLedColor(Color3B::BLACK);
		break;
	case ColorTag::NOP:
		this->_setLedColor(Color3B(20, 20, 20));
		break;
	case ColorTag::FREE:
		this->_setLedColor(Color3B::GREEN);
		break;
	case ColorTag::BUSY:
		this->_setLedColor(Color3B::RED);
		break;
	case ColorTag::DISCONNECT:
		this->_setLedColor(Color3B::YELLOW);
		break;		
	default:
		break;
	}
}

Далее, когда установлен код цвета по его тегу, необходимо генерировать набор данных для их последующей передачи, по примеру из документа компании Philips.

Пример формирования данных для изменения цвета подсветки
Пример формирования данных для изменения цвета подсветки
// функция устанавливает цвет контурной подсветки планшета
void CPhilipsLight::_setLedColor(const Color3B &color)
{
	char chechSum = 0x09 ^ 0x01 ^ 0x00 ^ 0xF3 ^ 0x01 ^ color.r ^ color.g ^ color.b;
	char sendData[SizeData];
	sendData[0] = (char)0x09;
	sendData[1] = (char)0x01;
	sendData[2] = (char)0x00;
	sendData[3] = (char)0xF3;
	sendData[4] = (char)0x01;
	sendData[5] = (char)color.r;
	sendData[6] = (char)color.g;
	sendData[7] = (char)color.b;
	sendData[8] = chechSum;
	
	if (this->_setSendSoketDataLedColor(sendData, SizeData) < 0)
		isAccess_ = false;
}

После того, как набор данных был сформирован их необходимо отправить на порт 5000 сетевого интерфейса планшета. (ServerPort = 5000, ServerUrl = 127.0.0.1)

// функция отправляет запрос для установки цвета контурной подсветки планшета
int CPhilipsLight::_setSendSoketDataLedColor(const char *sendData, size_t len)
{
	int result = 0;
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if(sockfd == -1)
        return sockfd;

    struct sockaddr_in servaddr;
    bzero(&servaddr, sizeof(servaddr));

    struct hostent *hostent1 = gethostbyname(ServerUrl);
    if(!hostent1)
		return -1;
	
    memcpy(&(servaddr.sin_addr), hostent1->h_addr_list[0], hostent1->h_length);

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(ServerPort);

    if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) 
		return -1;
	
	// отправка данных для изменения цвета
	result = send(sockfd, sendData, len, 0);
	close(sockfd);
	
	return result;
}

Эта небольшая часть кода позволяет нам полноценно работать с контурной подсветкой планшета Philips.

Кроме этого, используя SICP протокол, можно менять настройки телевизоров Philips, например количество картинок в картинке. А также настройки другой техники от этого производителя. Я надеюсь, что приведенный мной код, кому-то в этом поможет.

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

В завершение приведу ссылку на страницу нашей игры в Steam.

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


  1. redfraction
    21.11.2022 12:12

    Че-то как-то, пост не о чем