www.open-tager.ru http://www.open-tager.ru/forum/ |
|
LTAscetik http://www.open-tager.ru/forum/viewtopic.php?f=5&t=1565 |
Страница 372 из 532 |
Автор: | Nestr [ 10 июл 2014, 12:20 ] |
Заголовок сообщения: | Re: LTAscetik |
Отпуск самая лучшая часть работы! я уже 2 недели отгулял еще 2 отгуляю и опять год ждать. (( Начну разбираться с прошивкой, может что и получится. Если например пульт команды посылает тагер их понимает. То нужно где то в основном цикле прописать чтоб игра не начиналась пока не придет команда. Где начинается основной цикл? |
Автор: | Pingvin [ 10 июл 2014, 12:26 ] |
Заголовок сообщения: | Re: LTAscetik |
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; //генерируем событие - "ошибка приёма" } } Сложно понять чужие исходники, но попытайтесь. |
Автор: | Pingvin [ 10 июл 2014, 12:28 ] |
Заголовок сообщения: | Re: LTAscetik |
А вот обработка принятого пакета Код: 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//контрольный байт сообщения не корректный - ошибка приема { } |
Автор: | Pingvin [ 10 июл 2014, 12:35 ] |
Заголовок сообщения: | Re: LTAscetik |
Но в прошивке с поддержкой блютус у меня обработчик принятого пакета аккуратней написан Код: 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; } } |
Автор: | Pingvin [ 10 июл 2014, 12:39 ] |
Заголовок сообщения: | Re: LTAscetik |
Сделаю на основе прошивки с BT понимающую пульт прошивку. Сюда же и новый алгоритм передачи пакета нужно добавить. |
Автор: | Nestr [ 10 июл 2014, 12:40 ] |
Заголовок сообщения: | Re: LTAscetik |
Получаем пакет (RX_COMPLETE) а как будет выглядет разбор етих пакетов?? что это пакет выстрела или это пакет старт игра. может в краце хоть |
Автор: | Pingvin [ 10 июл 2014, 12:43 ] |
Заголовок сообщения: | Re: LTAscetik |
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 //корректное значение контрольного байта сообщения |
Автор: | Pingvin [ 10 июл 2014, 13:01 ] |
Заголовок сообщения: | Re: LTAscetik |
Я сам все сделаю, если что. |
Автор: | Nestr [ 10 июл 2014, 13:09 ] |
Заголовок сообщения: | Re: LTAscetik |
А я постараюсь хоть немного разобраться в прошивке. переварю все что написано выше, дополнительно наверно почитаю за передачу пакетов. |
Автор: | Pingvin [ 10 июл 2014, 13:11 ] |
Заголовок сообщения: | Re: LTAscetik |
Базовые знания языка Си есть? Как работает оператор switсh() знаете? |
Страница 372 из 532 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |