www.open-tager.ru

открытый лазертаг форум
Текущее время: 27 ноя 2024, 13:52

Часовой пояс: UTC + 3 часа [ Летнее время ]


Реклама

Правила форума


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



Начать новую тему Ответить на тему  [ Сообщений: 5319 ]  На страницу Пред.  1 ... 369, 370, 371, 372, 373, 374, 375 ... 532  След.
Автор Сообщение
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 12:20 
Не в сети
Местный
Аватар пользователя

Зарегистрирован: 13 ноя 2012, 19:51
Сообщений: 339
Откуда: токмак
Отпуск самая лучшая часть работы! я уже 2 недели отгулял еще 2 отгуляю и опять год ждать. ((
Начну разбираться с прошивкой, может что и получится.
Если например пульт команды посылает тагер их понимает. То нужно где то в основном цикле прописать чтоб игра не начиналась пока не придет команда.
Где начинается основной цикл?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 12:26 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Nestr писал(а):
Отпуск самая лучшая часть работы! я уже 2 недели отгулял еще 2 отгуляю и опять год ждать. ((
Начну разбираться с прошивкой, может что и получится.
Если например пульт команды посылает тагер их понимает. То нужно где то в основном цикле прописать чтоб игра не начиналась пока не придет команда.
Где начинается основной цикл?


Начните с прерываний, там ловятся пакеты и генерируются события.
Вот кусок из "понимающей" прошивки (обработчик прерывания ISR(TIMER2_COMP_vect)
)
Код:
{//Фиксируем окончание приема по таймауту
         start_bit_received   = false;    //отменяем прием

         switch(bit_in_rx_buff)//проверим, сколько бит принято
         {
            case 14:
            {
               rx_event = RX_COMPLETE;         //Генерим событие "принят пакет"
               break;   
            }
            case 24:
            {
               rx_event =    RX_MESSAGE_COMPLITE;//принято сообщение;
               break;   
            }
            default:
            {
               rx_event = RX_ERROR;         //генерируем событие - "ошибка приёма"
            }
         }


Сложно понять чужие исходники, но попытайтесь.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 12:28 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
А вот обработка принятого пакета
Код:
   switch(rx_event)//выясним, какое именно событие произошло
               {
                  case RX_COMPLETE:    //получен пакет
                  {
                  //   cli();
                  /*********************************************************
                     WOUND_LED_ON; //включаем вспомогательный светодиод
                     timer1=0;
                     while(timer1 < 35000);
                     WOUND_LED_OFF;   //выключаем вспомогательный светодиод
                  ************************************************************/
                     
                     rx_event = NOT_EVENT;   
                     if(!get_buffer_bit(0)) //если этот бит равен 0, то это пакет с данными (выстрел)
                     {
                  
                        
   //                     uint8_t player_id;
                        rx_packet = get_packet_value();
//                        volatile int gg;
//                        gg++;

                        if ((rx_packet.team_id != team_id())||(eeprom_read_byte(&friendly_fire_enable)&&(rx_packet.player_id != eeprom_read_byte(&eeprom_player_id))))//"пуля" прилетела от игрока другой, не нашей, команды
                        {
                           WOUND_LED_ON; //включаем вспомогательный светодиод                  
                           lcd_bl_on();
                           display_hit_data();
                           playhitsound();

                           WOUND_LED_OFF;





                        if (life_in_percent > rx_packet.damage)
                           {
                              life_in_percent = life_in_percent-rx_packet.damage;
                              life = (life_in_percent*10)/125;
                              if ((life==0)&&(life_in_percent>0)) life=1;

                           }
                           else
                           {   
                              life = 0;
                              life_in_percent=0;
                              WOUND_LED_ON;
                              display_life(life);//отобразим уровень жизни на диодах
                              display_life_update();//отобразим уровень жизни на ЖКИ
                              volatile uint8_t keypress_cntr; //счетчик циклов, в течении которых курок был нажат
                              keypress_cntr = 0;
                              
                              
                              
                              if ((eeprom_read_byte(&eeprom_tm_serial_num.device_code)!=0)&&(eeprom_read_byte(&eeprom_tm_serial_num.device_code)!=0xFF))

                              /*если ТМ ключ уже занесён в память*/
                              {

                                 joystick_event=no_pressing;
                                 keyboard_event=no_key_pressing;
                                 tm_event=no_tm_event;
                                 uint8_t tm_valide;
                                 tm_valide=0;
                                 lcd_bl_off();
                                 
                                 
                                 while (!tm_valide)
                                 {//[while]
                                    lcd_clrscr();
                                    lcd_home();
                                    lcd_puts("Для активации");
                                    lcd_gotoxy(0, 1);
                                    lcd_puts("приложите ключ");
                                    while (tm_event == no_tm_event)
                                    {
                                       WOUND_LED_INVERT;
                                       timer2 = 0;
                                       while (timer2 < 1000);   
                                    
                                    };
                                    switch(tm_event)
                                    {//[switch]
                                       case no_tm_event:
                                       {
                                             
                                       }
                                       break;
               
                                       case tm_crc_error:
                                       {
                                          lcd_clrscr();
                                          lcd_home();
                                          lcd_puts("Ошибка CRC");
                                          timer2 = 0;
                                          while (timer2 < 6000){};
                                          tm_event=no_tm_event;
                                       }
                                       break;

                                       case tm_crc_ok:
                                       {
               
                                          if (tm_verification())    
                                          {    tm_valide=1;
                                             lcd_clrscr();
                                             lcd_home();
                                             lcd_puts("Удачи!");
                                             timer2 = 0;
                                             while (timer2 < 6000){};
            
                                             tm_event=no_tm_event;
                                             break;
                                          }   
                                          lcd_clrscr();
                                          lcd_home();
                                          lcd_puts("Не тот ключ");
                                          timer2 = 0;
                                          while (timer2 < 6000){};
                                       /*
                                          lcd_clrscr();
                                          lcd_home();
                                          lcd_puts("Для активации");
                                          lcd_gotoxy(0, 1);
                                          lcd_puts("приложи ключ");
                                       */
                                          tm_event=no_tm_event;
                                          
                                                      
                                       }

                                          break;
            
                                    }//[/switch]
                                 }//[while]
                              
                              }//end if
                           
                           else
                           {
                              
                              lcd_bl_off();
                              display_status();
                              while(keypress_cntr < 20)
                              {
                                 WOUND_LED_INVERT;
                                 timer2 = 0;
                                 while (timer2 < 1000);
                                 switch (FIRE_KEY_IN&FIRE_KEY_PIN) //проверяем, нажат ли курок
                                 {
                                    case 0:  keypress_cntr++ ; break;
                                    case FIRE_KEY_PIN: keypress_cntr = 0; break;
                                    default: keypress_cntr = 0;   
                                 }
                  
                              }

                           }   
                              
                              
                              WOUND_LED_OFF;
                              init_var();//"оживаем" - начинаем новую игру
                              joystick_event=no_pressing;
                              keyboard_event=no_key_pressing;
                              tm_event=no_tm_event;
                           //   display_status();
                           }
                        
                        display_life(life);//отобразим уровень жизни на диодах
//                        display_life_update();//отобразим уровень жизни на ЖКИ
                        lcd_bl_off();
                        display_status();
                        }

                           
                        



   //                     rx_player_id = rx_buffer[0];
   //                     rx_damage = get_damage_from_rx_paket();

                     

                     }
                     
                  
                  
                  //   sei();
                     break;
                  }
                  
                  
                  case RX_MESSAGE_COMPLITE://принято сообщение
                  {
                     
                     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 Command://какая то дополнительноя команда
                                    {
                                       
                              switch(ir_message.param)//выясним, какая это командв
                              {
                                 case 0x05://начать новую игру немедленно
                                 {
                                       init_var(); //инициализируем переменные
                                       joystick_event=no_pressing; //очищаем события джойстика
                                       keyboard_event=no_key_pressing;//очищаем события триггера
                                       reload_key_event=no_key_pressing;//очищаем события перезарядки
                                       rx_event = NOT_EVENT;   //очищаем события ИК приемника
                                       display_status();//обновляем информацию на дисплее
                                       
                                       WOUND_LED_ON;
                                       play_sound_6();
                                       //код обработки дополнительной команды
                                                WOUND_LED_OFF;
                                    
                                    break;
                                 }
                                 case 0x00://"выключить" игрока
                                 {
                                    
                                    
                                    break;
                                    
                                 }
                                 default: break;
                              
                              }
                              
                           
                              break;
                                    }
                                 }
                            }

                           }
                     else//контрольный байт сообщения не корректный - ошибка приема
                     {
                     }
                     
                     
                     
                     
                     rx_event = NOT_EVENT;
                     break;

                  }
                  case RX_ERROR:      //ошибка приема
                  {
                  //   cli();
                     BULLETS_OUT_LED_ON;
                     timer2=0;
                     while(timer2 < 4000);
                     BULLETS_OUT_LED_OFF;
                     rx_event = NOT_EVENT;   
                  //   sei();
                     break;
                  }
                  
                  case NOT_EVENT:      //ошибка приема
                  {
                  //   cli();
                  //   rx_event = NOT_EVENT;   
                  //   sei();
                     break;
                  }



               }



   }



Легко запутаться, вот обработка сообщения
Код:
 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 Command://какая то дополнительноя команда
                                    {
                                       
                              switch(ir_message.param)//выясним, какая это командв
                              {
                                 case 0x05://начать новую игру немедленно
                                 {
                                       init_var(); //инициализируем переменные
                                       joystick_event=no_pressing; //очищаем события джойстика
                                       keyboard_event=no_key_pressing;//очищаем события триггера
                                       reload_key_event=no_key_pressing;//очищаем события перезарядки
                                       rx_event = NOT_EVENT;   //очищаем события ИК приемника
                                       display_status();//обновляем информацию на дисплее
                                       
                                       WOUND_LED_ON;
                                       play_sound_6();
                                       //код обработки дополнительной команды
                                                WOUND_LED_OFF;
                                   
                                    break;
                                 }
                                 case 0x00://"выключить" игрока
                                 {
                                   
                                   
                                    break;
                                   
                                 }
                                 default: break;
                             
                              }
                             
                           
                              break;
                                    }
                                 }
                            }

                           }
                     else//контрольный байт сообщения не корректный - ошибка приема
                     {
                     }
                     
                     

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 12:35 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Но в прошивке с поддержкой блютус у меня обработчик принятого пакета аккуратней написан

Код:
   switch(rx_event)//выясним, какое именно событие произошло
               {
                  case RX_COMPLETE:    //получен пакет
                  {
                  //   cli();
                  /*********************************************************
                     WOUND_LED_ON; //включаем вспомогательный светодиод
                     timer1=0;
                     while(timer1 < 35000);
                     WOUND_LED_OFF;   //выключаем вспомогательный светодиод
                  ************************************************************/
                     
                     rx_event = NOT_EVENT;   
                     if(!get_buffer_bit(0)) //если этот бит равен 0, то это пакет с данными (выстрел)
                     {
                  
                        
   //                     uint8_t player_id;
                        rx_packet = get_packet_value();
//                        volatile int gg;
//                        gg++;


                        hit_processing(rx_packet);
                        rx_event = NOT_EVENT;

                     }
                     
                  
                  
                  //   sei();
                     break;
                  }
                  
                  case RX_ERROR:      //ошибка приема
                  {
                  //   cli();
                     BULLETS_OUT_LED_ON;
                     timer2=0;
                     while(timer2 < 4000);
                     BULLETS_OUT_LED_OFF;
                     rx_event = NOT_EVENT;   
                  //   sei();
                     break;
                  }
                  
                  case NOT_EVENT:      //ошибка приема
                  {
                  //   cli();
                  //   rx_event = NOT_EVENT;   
                  //   sei();
                     break;
                  }



               }



   }

if (rxCount>0)//если буфер BT приемника не пустой
   {
      
      switch(parsing_bt_data())//проверим роиемный буфер
      {
         case RX_COMPLETE:    //получен пакет
         {
            if(!get_bt_buffer_bit(0)) //если этот бит равен 0, то это пакет с данными (выстрел)
            {
               bt_rx_packet = get_bt_packet_value();
               hit_processing(bt_rx_packet);
               USART_FlushRxBuf();
               bt_header_received=false;
            }

         }
         break;
         case RX_ERROR:      //ошибка приема
         {
         }
         break;
         case NOT_EVENT:      //нет ничего интересного ;-)
         {
         }
         break;
      }
   }   
   
   
   



_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 12:39 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Сделаю на основе прошивки с BT понимающую пульт прошивку.
Сюда же и новый алгоритм передачи пакета нужно добавить.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 12:40 
Не в сети
Местный
Аватар пользователя

Зарегистрирован: 13 ноя 2012, 19:51
Сообщений: 339
Откуда: токмак
Получаем пакет (RX_COMPLETE) а как будет выглядет разбор етих пакетов?? что это пакет выстрела или это пакет старт игра. может в краце хоть


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 12:43 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Nestr писал(а):
Получаем пакет (RX_COMPLETE) а как будет выглядет разбор етих пакетов?? что это пакет выстрела или это пакет старт игра. может в краце хоть

Только что выше привел кусок кода
case RX_MESSAGE_COMPLITE://принято сообщение
{

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 Command://какая то дополнительноя команда
{

switch(ir_message.param)//выясним, какая это командв
{
case 0x05://начать новую игру немедленно
{
init_var(); //инициализируем переменные
joystick_event=no_pressing; //очищаем события джойстика
keyboard_event=no_key_pressing;//очищаем события триггера
reload_key_event=no_key_pressing;//очищаем события перезарядки
rx_event = NOT_EVENT; //очищаем события ИК приемника
display_status();//обновляем информацию на дисплее

WOUND_LED_ON;
play_sound_6();
//код обработки дополнительной команды
WOUND_LED_OFF;

break;
}
case 0x00://"выключить" игрока
{


break;

}
default: break;

}




Вот определены некоторые команды

#define Add_Health 0x80 //сообщение добавить жизни
#define Add_Rounds 0x81 //сообщение добавить патронов
#define Command 0x83 //сообщение-команда
#define Valid_value 0xE8 //корректное значение контрольного байта сообщения

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 13:01 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Я сам все сделаю, если что.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 13:09 
Не в сети
Местный
Аватар пользователя

Зарегистрирован: 13 ноя 2012, 19:51
Сообщений: 339
Откуда: токмак
А я постараюсь хоть немного разобраться в прошивке. переварю все что написано выше, дополнительно наверно почитаю за передачу пакетов.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 10 июл 2014, 13:11 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Базовые знания языка Си есть?
Как работает оператор switсh() знаете?

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5319 ]  На страницу Пред.  1 ... 369, 370, 371, 372, 373, 374, 375 ... 532  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB