www.open-tager.ru http://open-tager.ru/forum/ |
|
LTAscet - расширяем функционал прошивки http://open-tager.ru/forum/viewtopic.php?f=5&t=2178 |
Страница 1 из 6 |
Автор: | Pingvin [ 30 сен 2013, 09:32 ] |
Заголовок сообщения: | LTAscet - расширяем функционал прошивки |
Перенесу сюда тему о прошивке. Буду ковырять исходники на глазах достопочтенной публики в режиме "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). |
Автор: | LTagKirov [ 30 сен 2013, 09:50 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
Pingvin писал(а): RX_DATA_COMPLITE;//приняты 16 бит данных или команда Есть команды с более чем двумя байтами и есть режим клонирования, может быть сразу подумать о возможности дальнейшей реализации. Ограничив сейчас 16битами, будет трудно сделать клонирование потом. http://www.lasertagparts.com/mtformat-2.htm ЗЫ. Зачем нужно клонирование непонимаю (ниразу не видел в живую - LW неподдерживает ?), но народ просит как жутко нужную |
Автор: | Pingvin [ 30 сен 2013, 09:55 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
LTagKirov писал(а): Pingvin писал(а): RX_DATA_COMPLITE;//приняты 16 бит данных или команда Есть команды с более чем двумя байтами и есть режим клонирования, может быть сразу подумать о возможности дальнейшей реализации. Ограничив сейчас 16битами, будет трудно сделать клонирование потом. http://www.lasertagparts.com/mtformat-2.htm ЗЫ. Зачем нужно клонирование непонимаю (ниразу не видел в живую - LW неподдерживает ?), но народ просит как жутко нужную Не вопрос - узнаем, сколько бит занимает пакет "клонирование" и добавим ещё одно событие - 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; //генерируем событие - "ошибка приёма" } Теперь компилируем, прошиваем девайс и смотрим - не потеряла ли наша прошивка работоспособность! Не потеряла - поражения по прежнему фиксируются. Ну теперь событие мы имеем, нужно его обработать в главном цикле прошивки. Открываем файл 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; } Все - можем писать код обработки команды! Но прежде чем писать обработку команды, неплохо бы придумать для команды структуру, с которой нам было бы удобно работать. Да и не работать же нам с буфером приемника напрямую - это чревато! Ведь пока мы обрабатываем команду, может прилететь новый пакет и затереть нашу команду, а мы об этом даже не узнаем, ведь это все сделает прерывание. |
Автор: | Pingvin [ 30 сен 2013, 10:55 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
Посмотрел я тут на описание команд - состоят они из двух байт. Первый байт как раз и указывает на команду, а второй - параметр команды. Я предлагаю такую структуру Цитата: //----------------------------------------------------- //Определим структуру для хранения полученной по ИК команды 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; } |
Автор: | Pingvin [ 30 сен 2013, 11:54 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
Ну что же - пора писать обработчик! Первым делом - ещё одна проверка "на вшивость" - убедимся, что принята именно команда, проверив первый принятый бик, как мы делали в обработчике выстрела. Код: 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"
|
Автор: | LTagKirov [ 30 сен 2013, 12:15 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
Теперь надо расписать как для 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; |
Автор: | Pingvin [ 30 сен 2013, 12:17 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
LTagKirov писал(а): Теперь надо расписать как для Ascet-а выполнить примерно такие команды (ниже), кто-то здесь уже спрашивал про перезапуск программы. Псевдокод Код: case MILES_CMD_RESPAWN: // Новая игра, отложенный старт StateNewGame = START_NEW_GAME; break; case MILES_CMD_FULL_HEALTH: live_in_game = live; // заполнить жисть // в игру не вводим break; Все распишем! Все по порядку! |
Автор: | Pingvin [ 30 сен 2013, 12:20 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
Теперь надо распознать команду. Вставляем очередной свич Код: 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 у меня нет (прошивка "пульта" написана под эту версию). Так что пока на этом придется остановиться. |
Автор: | Pingvin [ 30 сен 2013, 13:20 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
Вспомнил - могут возникнуть косяки с оборудованием LW из-за того, что в последней версии прошивки они передают с выстрелом ещё и контрольную сумму! Так что не годится проверка количества принятых бит! Если, конечно, хотим совместимости с оборудованием LW последней версии! Будем думать. Значит, не будем добавлять событие RX_DATA_COMPLETE А команду будем распознавать по первому принятому биту! P.S. Скачал руководство с оф. сайта Лазервар. В описании протокола ни слова о дополнительных битах контрольной суммы! Теперь их нет, что ли? Или как? |
Автор: | LTagKirov [ 30 сен 2013, 13:37 ] |
Заголовок сообщения: | Re: LTAscet - расширяем функционал прошивки |
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 |
Страница 1 из 6 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |