Меня спрашивают - как реализовать недостающие команды пульта?
Отвечаю...
Берем прошивку в прикрепленном архиве.
Она понимает старт игры и смену цвета команды.
Делаем по аналогии.
В файле ltag_ascetic.c
Находим кусок кода
Код:
switch(rx_event)//выясним, какое именно событие произошло
{
case RX_COMPLETE: //получен пакет
{
rx_event = NOT_EVENT;
if(!get_buffer_bit(0)) //если этот бит равен 0, то это пакет с данными (выстрел)
{
rx_packet = get_packet_value();
hit_processing(rx_packet);
rx_event = NOT_EVENT;
}
break;
}
case RX_MESSAGE_COMPLITE://принято сообщение
{
rx_event = NOT_EVENT;
if(get_buffer_bit(0)) //если этот бит равен 1, то это пакет с командой
{
ir_message = get_ir_message_from_buffer();//выдергиваем значения команды из буфера ИК приемника
if (ir_message.control_byte ==Valid_value )//сообщение принято корректно (контрольный байт принят без ошибок)
{
switch(ir_message.ID)//если имя команды
{
case Add_Health: //добавить "жизни"
{
//код для добавления жизни
break;
}
case Add_Rounds://добавить "патронов"
{
//код для добавления патронов
break;
}
case Change_color:
{
//код для смены цвета
if((ir_message.param>=0)&&(ir_message.param<=3))
{
eeprom_write_byte(&eeprom_team_id,ir_message.param );
set_team_color(team_id()); //Устанавливаем идентификатор (цвет) команды
for (uint8_t i=0; i <ir_message.param; i++ )
{
beep(1000, 2, 128);
timer2 = 0;
while (timer2 < 1000);
};
beep(1000, 2, 128);
}
else
{
//ошибка смены цвета
beep(1000, 3, 128);
beep(500, 3, 128); //Воспроизводим звук (частота, длительность, громкость)
beep(1000, 3, 128);
beep(500, 3, 128); //Воспроизводим звук (частота, длительность, громкость)
}
break;
}
case Command://какая то дополнительноя команда
{
switch(ir_message.param)//выясним, какая это командв
{
case 0x05://начать новую игру немедленно
{
if (simples_in_queue>1) //если звук выстрла воспроизводится
{
simples_in_queue=1;//закроем eeprom
while (eeprom_is_open);//дождемся, пока eerom закроется
}
init_var(); //инициализируем переменные
joystick_event=no_pressing; //очищаем события джойстика
keyboard_event=no_key_pressing;//очищаем события триггера
reload_key_event=no_key_pressing;//очищаем события перезарядки
rx_event = NOT_EVENT; //очищаем события ИК приемника
display_status();//обновляем информацию на дисплее
display_life(life);//отобразим уровень жизни на диодах
WOUND_LED_ON;
playstartsound();
//код обработки дополнительной команды
WOUND_LED_OFF;
break;
}
case 0x00://"выключить" игрока
{
break;
}
default: break;
}
break;
}
}
}
}
else//контрольный байт сообщения не корректный - ошибка приема
{
}
rx_event = NOT_EVENT;
break;
}
case RX_ERROR: //ошибка приема
{
if((!ir_error_ignore)&&(!eeprom_is_open))//если не надо игнорировать ошибку и звук не воспроизводиться уже
{
// cli();
BULLETS_OUT_LED_ON;
/*
timer2=0;
while(timer2 < 4000);
*/
play_sound_8();
BULLETS_OUT_LED_OFF;
}
rx_event = NOT_EVENT;
// sei();
break;
}
case NOT_EVENT: //ошибка приема
{
// cli();
// rx_event = NOT_EVENT;
// sei();
break;
}
}
}
Например, если хотите, чтобы таг реагировал на команды
#define Add_Health 0x80 //добавить жизнь
#define Add_Rounds 0x81 //добавить патроны
Добавьте код обработчика в фигурные скобки
Код:
{
case Add_Health: //добавить "жизни"
{
//код для добавления жизни
break;
}
case Add_Rounds://добавить "патронов"
{
//код для добавления патронов
break;
}
Коды команд определяются в файле
miles_protocol.h
#define Add_Health 0x80 //сообщение добавить жизни
#define Add_Rounds 0x81 //сообщение добавить патронов
#define Change_color 0xA9//сообщение сменить цвет команды
#define Command 0x83 //сообщение-команда
#define Valid_value 0xE8 //корректное значение контрольного байта сообщения
Например, хотим добавить команду - почеши пузо.
Определяем её в вышеназванном хедере, пусть её код - 0x33, например
#define Pocheshi_Puzo 0x33 //сообщение почеши пузо
#define Add_Health 0x80 //сообщение добавить жизни
#define Add_Rounds 0x81 //сообщение добавить патронов
#define Change_color 0xA9//сообщение сменить цвет команды
#define Command 0x83 //сообщение-команда
#define Valid_value 0xE8 //корректное значение контрольного байта сообщения
и добавляем обработчик в файл ltag_ascetic.c
{
case Pocheshi_Puzo: //почесать пузо
{
//код для чесания пуза
break;
}
case Add_Health: //добавить "жизни"
{
//код для добавления жизни
break;
}
case Add_Rounds://добавить "патронов"
{
//код для добавления патронов
break;
}
ID команд можно узнать, посмотрев описание протокола Милес Таг 2
Где то PDF тут валялся
Есть небольшая тонкость - сообщение не есть команда.
Оно может содержать в себе команду, если ID сообщения = 0x83
#define Command 0x83 //сообщение-команда
Кроме того - команды могут ещё иметь свои параметры.
В общем - надо знать протокол.