www.open-tager.ru

открытый лазертаг форум
Текущее время: 29 мар 2024, 18:44

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


Реклама

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


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



Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: 30 сен 2013, 09:32 
Не в сети
Аксакал форума
Аватар пользователя

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

Итак, переопределяем нашу перечисляемую переменную Rx_Event (события ИК-приемника) в файле types.h следующим образом
Цитата:
//Определим перечисляемый тип для событий ИК-приемника
enum Rx_Event {
NOT_EVENT, //нет событий
RX_COMPLETE, //принят пакет из 14 бит ("выстрел")
RX_ERROR, //ошибка приема пакета
RX_DATA_COMPLETE//приняты 16 бит данных или команда
};
typedef enum Rx_Event trx_event;


Теперь у нас будет новое событие при корректном принятии 16 бит данных RX_DATA_COMPLITE.
Если не ошибаюсь, команды пульта занимают два байта?
Пошел искать описание команд.

Ага, вот он, кажись
Изображение

Великолепно!
Так и есть!
Теперь надо сгенерировать наше новое событие в прерывании (файл isr.c).

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 09:50 
Не в сети
Аксакал форума

Зарегистрирован: 29 авг 2011, 11:08
Сообщений: 1849
Pingvin писал(а):
RX_DATA_COMPLITE;//приняты 16 бит данных или команда


Есть команды с более чем двумя байтами и есть режим клонирования, может быть сразу подумать о возможности дальнейшей реализации. Ограничив сейчас 16битами, будет трудно сделать клонирование потом.
http://www.lasertagparts.com/mtformat-2.htm

ЗЫ. Зачем нужно клонирование непонимаю (ниразу не видел в живую - LW неподдерживает ?), но народ просит как жутко нужную 8-)

_________________
"За 2 месяца максимум можно чертёж сделать, еще за 3 фундамент." (c) Номернабис


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 09:55 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
LTagKirov писал(а):
Pingvin писал(а):
RX_DATA_COMPLITE;//приняты 16 бит данных или команда


Есть команды с более чем двумя байтами и есть режим клонирования, может быть сразу подумать о возможности дальнейшей реализации. Ограничив сейчас 16битами, будет трудно сделать клонирование потом.
http://www.lasertagparts.com/mtformat-2.htm

ЗЫ. Зачем нужно клонирование непонимаю (ниразу не видел в живую - LW неподдерживает ?), но народ просит как жутко нужную 8-)


Не вопрос - узнаем, сколько бит занимает пакет "клонирование" и добавим ещё одно событие - RX_CLONE_COMPLETE

Можем сделать это прямо сейчас - спасибо!

Мы не ограничиваем себя 16 битами!
У нас буфер на 64 бита и можем увеличить как хотим!
Это просто идентификация пакета по его длинне и дополнительный контроль, не более.

Ну что же, добавим еще событие
Цитата:
///---------------------------------------------------------------------//


//Определим перечисляемый тип для событий ИК-приемника
enum Rx_Event {
NOT_EVENT, //нет событий
RX_COMPLETE, //принят пакет из 14 бит ("выстрел")
RX_ERROR, //ошибка приема пакета
RX_DATA_COMPLETE,//приняты 16 бит данных или команда
RX_CLONING_DATA_COMPLETE//принята структура для клонирования
};
typedef enum Rx_Event trx_event;




Теперь открываем файл isr.c, находим место, где у нас генерируются события ИК-приемника и меням
Цитата:
if (bit_in_rx_buff==14) rx_event = RX_COMPLETE; //Генерим событие "принят пакет"
else rx_event = RX_ERROR; //генерируем событие - "ошибка приёма"

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



Теперь компилируем, прошиваем девайс и смотрим - не потеряла ли наша прошивка работоспособность! :lol: :lol:

Не потеряла - поражения по прежнему фиксируются. ;)


Ну теперь событие мы имеем, нужно его обработать в главном цикле прошивки.

Открываем файл ltag_ascetic.c и находим такой кусок кода
Цитата:
switch(rx_event)//выясним, какое именно событие произошло
{
case RX_COMPLETE: //получен пакет
{
// cli();
/*********************************************************
WOUND_LED_ON; //включаем вспомогательный светодиод
timer1=0;
while(timer1 < 35000);
WOUND_LED_OFF; //выключаем вспомогательный светодиод
************************************************************/




Этот switch проверяет, какое же событие произошло.

Цитата:
case RX_COMPLETE: //получен пакет
{


То что в фигурных скобках после этой строки выполняется при условии, что rx_event==RX_COMPLETE



А тут мы обрабатываем ошибку приема - просто мигаем светодиодом "пустая обойма"

Цитата:

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


А можем добавить звук пролитевшей мимо пули и воспроизвести - дойдем и до этого.

А если никакого события нет, то ничего и не делаем
Цитата:
case NOT_EVENT: //ошибка приема
{
// cli();
// rx_event = NOT_EVENT;
// sei();
break;
}



Одна тонкость - после обработки события мы должны присвоить переменной rx_event значение NOT_EVENT.
Иначе обработчик будет вызываться бесконечно, даже если новых событий не наступило в действительности.


Ну что, добавим новый case на случай приема команды? ;)
Нет ничего проще!
Перед case NOT_EVEN: вставим

Цитата:
case RX_DATA_COMPLETE:
{
//тут разместим код обработчика команды
rx_event = NOT_EVENT;// и не забудем сбросить событие!
break;
}


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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 10:55 
Не в сети
Аксакал форума
Аватар пользователя

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

Я предлагаю такую структуру
Цитата:

//-----------------------------------------------------

//Определим структуру для хранения полученной по ИК команды

typedef struct IR_Comand {
uint8_t name; //наименование команды
uint8_t param;//параметр команды
} tir_comand;






Откойте файл types.h и опишите её в любом месте (копи-паст ;) )

Теперь добавим к глобальным переменным новую переменную для принятой команды.

Открываем файл global_variables.c и добавляем
Цитата:
volatile tir_comand ir_comand; //принятая по ИК команда


volstile говорит компилятору - "не удаляй и не игнорируй эту переменную при оптимизации!"

Чтобы наша глобальная переменная была видна из других файлов проекта - экспортируем её.
Пропишем в файле ltag_ascetic.h следующее
Цитата:
export volatile tir_comand ir_comand; //принятая по ИК команда




Теперь не плохо бы написать фукцию, которая брала бы из буфера принятую команду и заносила её в нашу новую переменную.

Задекларируем нашу новую функцию в файле ltag_ascetic.h
Цитата:
tir_comand get_ir_comand(void);//получим из буфера ИК приемника команду


Функция вернет структуру, которую мы описали для нашей переменной ir_comsnd

Элементарно! ;)
В файле ltag_ascetic.c пишем реализацию функции
Цитата:
tir_comand get_ir_comand(void){//получим из буфера ИК приемника команду
tir_comand cmd_tmp; //создаем временную пересенную нужного типа
cmd_tmp.name = rx_buffer[0];//имя функции в первом принятом байте (индекс 0)
cmd_tmp.param= rx_buffer[1];//параметры функции во втором принятом байте (индекс 1)
return cmd_tmp;
}


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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 11:54 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Ну что же - пора писать обработчик!
Первым делом - ещё одна проверка "на вшивость" - убедимся, что принята именно команда, проверив первый принятый бик, как мы делали в обработчике выстрела.
Код:
   
                  case    RX_DATA_COMPLETE:
                  {
                        if(get_buffer_bit(0)) //если этот бит равен 1, то это пакет с командой
                        {
                           ir_comand = get_ir_comand();//выдергиваем значения команды из буфера ИК приемника
                        }
                  
                     //тут разместим код обработчика команды
                     rx_event = NOT_EVENT;// и не забудем сбросить событие!    
                     break;
                  }


Мы ещё раз убедились, что в буфере лежит именно команда и выдернули её в нашу переменную.
Дальше - интересно!
Теперь надо сравнивать первый байт с табличными значениями.
Можно это делать и в шеснадцатиричном представлении - но это не наглядно!
Давайте напишем макросы для имен команд.

Создадим и добавим в наш проект вайл с названием ir_commands.h
И в нем определяем макросы для всех интересующих нас команд
Цитата:
#define Add_Health 0x80
#define Add_Rounds 0x81
#define Command 0x83


Хотя, можно было их описать и в файле описания протокола милес - ну да Бог с ним, пусть будут в отдельном файле.

Подключим его в файле ltag_ascetic.c

Код:
#include "ir_commands.h"

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 12:15 
Не в сети
Аксакал форума

Зарегистрирован: 29 авг 2011, 11:08
Сообщений: 1849
Теперь надо расписать как для Ascet-а выполнить примерно такие команды (ниже), кто-то здесь уже спрашивал про перезапуск программы.


Псевдокод
Код:
            case MILES_CMD_NEWGAME:          // Новая игра, немедленно

               nextgame;        // немедленно

            break;


            case MILES_CMD_RESPAWN:          // Новая игра, отложенный старт

               StateGame = START_NEW_GAME;   

            break;


            case MILES_CMD_FULL_HEALTH:
                live_in_game = live;         // заполнить жисть 
                                                   // в игру не вводим
            break;


_________________
"За 2 месяца максимум можно чертёж сделать, еще за 3 фундамент." (c) Номернабис


Последний раз редактировалось LTagKirov 30 сен 2013, 12:17, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 12:17 
Не в сети
Аксакал форума
Аватар пользователя

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


Псевдокод
Код:

            case MILES_CMD_RESPAWN:          // Новая игра, отложенный старт

               StateNewGame = START_NEW_GAME;   

            break;


            case MILES_CMD_FULL_HEALTH:
                live_in_game = live;         // заполнить жисть 
                                                   // в игру не вводим
            break;


Все распишем! ;) :)
Все по порядку! :lol:

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 12:20 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Теперь надо распознать команду.
Вставляем очередной свич
Код:
      case    RX_DATA_COMPLETE:
                  {
                        if(get_buffer_bit(0)) //если этот бит равен 1, то это пакет с командой
                        {
                           ir_comand = get_ir_comand();//выдергиваем значения команды из буфера ИК приемника
                        
                           switch(ir_comand.name)//если имя команды
                           {
                              case Add_Health: //добавить "жизни"
                              {
                                 //код для добавления жизни
                                 break;
                              }
                              case Add_Rounds://добавить "патронов"
                              {
                                 //код для добавления патронов
                                 break;
                              }

                              case Command://какая то дополнительноя команда
                              {
                                    //код обработки дополнительной команды
                                 break;
                              }
                           }
                        
                        }
                  
                     //тут разместим код обработчика команды
                     rx_event = NOT_EVENT;// и не забудем сбросить событие!    
                     break;
                  }


Ну теперь бы пульт в руки, да проверить.
Но пульта нету. :(
Зато есть прошивка, при помощи которой я стартовал Лазерваровскую плату.

Однаго проблемка - второго девайса V3.0 у меня нет (прошивка "пульта" написана под эту версию). :(
Так что пока на этом придется остановиться. :?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 13:20 
Не в сети
Аксакал форума
Аватар пользователя

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

Так что не годится проверка количества принятых бит! :(
Если, конечно, хотим совместимости с оборудованием LW последней версии!
Будем думать. :?

Значит, не будем добавлять событие RX_DATA_COMPLETE
А команду будем распознавать по первому принятому биту!

P.S.
Скачал руководство с оф. сайта Лазервар.
В описании протокола ни слова о дополнительных битах контрольной суммы!
Теперь их нет, что ли?
Или как? :?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 сен 2013, 13:37 
Не в сети
Аксакал форума

Зарегистрирован: 29 авг 2011, 11:08
Сообщений: 1849
Pingvin писал(а):
Вспомнил - могут возникнуть косяки с оборудованием LW из-за того, что в последней версии прошивки они передают с выстрелом ещё и контрольную сумму!

Так что не годится проверка количества принятых бит! :(



Проверить первые n бит, а остальные выбросить - неполучится ?
LW вроде совместима с оригинальным Miles, он переваривает - Ascet тоже переварит

Код:
#define REMOTE_BITS_MAX_SHOT 14   // пакет выстрел  fb=0
#define REMOTE_BITS_MAX_CMD  24   // пакет управления 3 байта fb=1


PS. на их сайте о контрольной сумм упоминания нет http://www.laserwar.ru/index.php?do=sta ... erwar_v4_8 есть только третий байт, но это не CRC.
Возможно вы путаете их с LSD

_________________
"За 2 месяца максимум можно чертёж сделать, еще за 3 фундамент." (c) Номернабис


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу 1, 2, 3, 4, 5, 6  След.

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


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

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


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

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