Меня спрашивают - как реализовать недостающие команды пульта?
Отвечаю...
Берем прошивку в прикрепленном архиве.
Она понимает старт игры и смену цвета команды.
Делаем по аналогии.
В файле 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 //сообщение-команда
Кроме того - команды могут ещё иметь свои параметры.
В общем - надо знать протокол.