www.open-tager.ru

открытый лазертаг форум
Текущее время: 22 ноя 2024, 04:11

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


Реклама

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


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



Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 18 окт 2014, 10:09 
Не в сети
Новосел

Зарегистрирован: 01 мар 2013, 11:18
Сообщений: 91
Откуда: Мончегорск Мурманская обл.
Pingvin писал(а):
loner32 писал(а):
Pingvin писал(а):
Огромный такой сенкс! :) :lol:


нет я авто трассировку з делал настроив предварительно


Для автотрассировки - неплохо, однако! :?
Никогда не пользовался, да и не умею, честно сказать... :oops:


стоит попробовать :D


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

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 окт 2014, 12:34 
Не в сети
Новосел

Зарегистрирован: 01 мар 2013, 11:18
Сообщений: 91
Откуда: Мончегорск Мурманская обл.
Pingvin писал(а):
Обязательно! ;) :)


какие изменения надо внести в прошивку чтоб с помощью конфигуратора зашивать параметры жизни


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 окт 2014, 14:24 
Не в сети
Аксакал форума
Аватар пользователя

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


какие изменения надо внести в прошивку чтоб с помощью конфигуратора зашивать параметры жизни


Выпадет полчасика свободный - распишу.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 окт 2014, 14:27 
Не в сети
Аксакал форума
Аватар пользователя

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

Предлагаю использовать для чтения параметра команду
life_after_start?

А для записи параметра

life_after_start=


То есть, чтобы присвоить новое значение параметру, будем набирать в терминале

life_after_start=50

Это 50% задали.
А чтобы узнать текущее значение, будем набирать
life_after_start?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 окт 2014, 14:34 
Не в сети
Аксакал форума
Аватар пользователя

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

И находим там длинный список команд, которые понимает наш "Аскет"

Код:
const unsigned char command_0[] PROGMEM = "bullets_in_clip="; //
const unsigned char command_1[] PROGMEM = "bullets_in_clip?"; //
const unsigned char command_2[] PROGMEM = "protocol?";
const unsigned char command_3[] PROGMEM = "clips="; //
const unsigned char command_4[] PROGMEM = "clips?"; //
const unsigned char command_5[] PROGMEM = "prepare_to_write_block";
const unsigned char command_6[] PROGMEM = "read_block";
const unsigned char command_7[] PROGMEM = "sound_1_adress=";
const unsigned char command_8[] PROGMEM = "sound_1_adress?";
const unsigned char command_9[] PROGMEM = "sound_1_size=";
const unsigned char command_10[] PROGMEM = "sound_1_size?";
const unsigned char command_11[] PROGMEM = "sound_2_adress=";
const unsigned char command_12[] PROGMEM = "sound_2_adress?";
const unsigned char command_13[] PROGMEM = "sound_2_size=";
const unsigned char command_14[] PROGMEM = "sound_2_size?";
const unsigned char command_15[] PROGMEM = "sound_3_adress=";
const unsigned char command_16[] PROGMEM = "sound_3_adress?";
const unsigned char command_17[] PROGMEM = "sound_3_size=";
const unsigned char command_18[] PROGMEM = "sound_3_size?";
const unsigned char command_19[] PROGMEM = "sound_4_adress=";
const unsigned char command_20[] PROGMEM = "sound_4_adress?";
const unsigned char command_21[] PROGMEM = "sound_4_size=";
const unsigned char command_22[] PROGMEM = "sound_4_size?";
const unsigned char command_23[] PROGMEM = "sound_5_adress=";
const unsigned char command_24[] PROGMEM = "sound_5_adress?";
const unsigned char command_25[] PROGMEM = "sound_5_size=";
const unsigned char command_26[] PROGMEM = "sound_5_size?";
const unsigned char command_27[] PROGMEM = "sound_6_adress=";
const unsigned char command_28[] PROGMEM = "sound_6_adress?";
const unsigned char command_29[] PROGMEM = "sound_6_size=";
const unsigned char command_30[] PROGMEM = "sound_6_size?";
const unsigned char command_31[] PROGMEM = "play_sound";
const unsigned char command_32[] PROGMEM = "play_shot_sound";
const unsigned char command_33[] PROGMEM = "player_id=";
const unsigned char command_34[] PROGMEM = "player_id?";
const unsigned char command_35[] PROGMEM = "damage_index=";
const unsigned char command_36[] PROGMEM = "damage_index?";
const unsigned char command_37[] PROGMEM = "ir_power=";
const unsigned char command_38[] PROGMEM = "ir_power?";
const unsigned char command_39[] PROGMEM = "friendly_fire=";
const unsigned char command_40[] PROGMEM = "friendly_fire?";
const unsigned char command_41[] PROGMEM = "team_id=";
const unsigned char command_42[] PROGMEM = "team_id?";
const unsigned char command_43[] PROGMEM = "batt_full_voltage=";
const unsigned char command_44[] PROGMEM = "batt_full_voltage?";
const unsigned char command_45[] PROGMEM = "batt_low_voltage=";
const unsigned char command_46[] PROGMEM = "batt_low_voltage?";
const unsigned char command_47[] PROGMEM = "sound_7_adress=";
const unsigned char command_48[] PROGMEM = "sound_7_adress?";
const unsigned char command_49[] PROGMEM = "sound_7_size=";
const unsigned char command_50[] PROGMEM = "sound_7_size?";
const unsigned char command_51[] PROGMEM = "sound_8_adress=";
const unsigned char command_52[] PROGMEM = "sound_8_adress?";
const unsigned char command_53[] PROGMEM = "sound_8_size=";
const unsigned char command_54[] PROGMEM = "sound_8_size?";
const unsigned char command_55[] PROGMEM = "sound_9_adress=";
const unsigned char command_56[] PROGMEM = "sound_9_adress?";
const unsigned char command_57[] PROGMEM = "sound_9_size=";
const unsigned char command_58[] PROGMEM = "sound_9_size?";
const unsigned char command_59[] PROGMEM = "sound_10_adress=";
const unsigned char command_60[] PROGMEM = "sound_10_adress?";
const unsigned char command_61[] PROGMEM = "sound_10_size=";
const unsigned char command_62[] PROGMEM = "sound_10_size?";
const unsigned char command_63[] PROGMEM = "ir_carrier_frequency=";
const unsigned char command_64[] PROGMEM = "ir_carrier_frequency?";
const unsigned char command_65[] PROGMEM = "clear_tm";



Добавим в него две наши новые команды
const unsigned char command_66[] PROGMEM = "life_after_start?";
const unsigned char command_67[] PROGMEM = "life_after_start=";

они будут 66-ой и 67-ой командой.

Теперь список должен выглядеть так

Код:
const unsigned char command_0[] PROGMEM = "bullets_in_clip="; //
const unsigned char command_1[] PROGMEM = "bullets_in_clip?"; //
const unsigned char command_2[] PROGMEM = "protocol?";
const unsigned char command_3[] PROGMEM = "clips="; //
const unsigned char command_4[] PROGMEM = "clips?"; //
const unsigned char command_5[] PROGMEM = "prepare_to_write_block";
const unsigned char command_6[] PROGMEM = "read_block";
const unsigned char command_7[] PROGMEM = "sound_1_adress=";
const unsigned char command_8[] PROGMEM = "sound_1_adress?";
const unsigned char command_9[] PROGMEM = "sound_1_size=";
const unsigned char command_10[] PROGMEM = "sound_1_size?";
const unsigned char command_11[] PROGMEM = "sound_2_adress=";
const unsigned char command_12[] PROGMEM = "sound_2_adress?";
const unsigned char command_13[] PROGMEM = "sound_2_size=";
const unsigned char command_14[] PROGMEM = "sound_2_size?";
const unsigned char command_15[] PROGMEM = "sound_3_adress=";
const unsigned char command_16[] PROGMEM = "sound_3_adress?";
const unsigned char command_17[] PROGMEM = "sound_3_size=";
const unsigned char command_18[] PROGMEM = "sound_3_size?";
const unsigned char command_19[] PROGMEM = "sound_4_adress=";
const unsigned char command_20[] PROGMEM = "sound_4_adress?";
const unsigned char command_21[] PROGMEM = "sound_4_size=";
const unsigned char command_22[] PROGMEM = "sound_4_size?";
const unsigned char command_23[] PROGMEM = "sound_5_adress=";
const unsigned char command_24[] PROGMEM = "sound_5_adress?";
const unsigned char command_25[] PROGMEM = "sound_5_size=";
const unsigned char command_26[] PROGMEM = "sound_5_size?";
const unsigned char command_27[] PROGMEM = "sound_6_adress=";
const unsigned char command_28[] PROGMEM = "sound_6_adress?";
const unsigned char command_29[] PROGMEM = "sound_6_size=";
const unsigned char command_30[] PROGMEM = "sound_6_size?";
const unsigned char command_31[] PROGMEM = "play_sound";
const unsigned char command_32[] PROGMEM = "play_shot_sound";
const unsigned char command_33[] PROGMEM = "player_id=";
const unsigned char command_34[] PROGMEM = "player_id?";
const unsigned char command_35[] PROGMEM = "damage_index=";
const unsigned char command_36[] PROGMEM = "damage_index?";
const unsigned char command_37[] PROGMEM = "ir_power=";
const unsigned char command_38[] PROGMEM = "ir_power?";
const unsigned char command_39[] PROGMEM = "friendly_fire=";
const unsigned char command_40[] PROGMEM = "friendly_fire?";
const unsigned char command_41[] PROGMEM = "team_id=";
const unsigned char command_42[] PROGMEM = "team_id?";
const unsigned char command_43[] PROGMEM = "batt_full_voltage=";
const unsigned char command_44[] PROGMEM = "batt_full_voltage?";
const unsigned char command_45[] PROGMEM = "batt_low_voltage=";
const unsigned char command_46[] PROGMEM = "batt_low_voltage?";
const unsigned char command_47[] PROGMEM = "sound_7_adress=";
const unsigned char command_48[] PROGMEM = "sound_7_adress?";
const unsigned char command_49[] PROGMEM = "sound_7_size=";
const unsigned char command_50[] PROGMEM = "sound_7_size?";
const unsigned char command_51[] PROGMEM = "sound_8_adress=";
const unsigned char command_52[] PROGMEM = "sound_8_adress?";
const unsigned char command_53[] PROGMEM = "sound_8_size=";
const unsigned char command_54[] PROGMEM = "sound_8_size?";
const unsigned char command_55[] PROGMEM = "sound_9_adress=";
const unsigned char command_56[] PROGMEM = "sound_9_adress?";
const unsigned char command_57[] PROGMEM = "sound_9_size=";
const unsigned char command_58[] PROGMEM = "sound_9_size?";
const unsigned char command_59[] PROGMEM = "sound_10_adress=";
const unsigned char command_60[] PROGMEM = "sound_10_adress?";
const unsigned char command_61[] PROGMEM = "sound_10_size=";
const unsigned char command_62[] PROGMEM = "sound_10_size?";
const unsigned char command_63[] PROGMEM = "ir_carrier_frequency=";
const unsigned char command_64[] PROGMEM = "ir_carrier_frequency?";
const unsigned char command_65[] PROGMEM = "clear_tm";
const unsigned char command_66[] PROGMEM = "life_after_start?";
const unsigned char command_67[] PROGMEM = "life_after_start=";



Этот список - просто хранилище строк во флеш памяти.

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


Последний раз редактировалось Pingvin 18 окт 2014, 16:11, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 окт 2014, 16:08 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Чуть ниже находится массив с указателями на строки, в которых хранятся команды.
Код:
const unsigned char* commandsPointers[] PROGMEM =
{command_0,
command_1,
command_2,
command_3,
command_4,
.......
command_62,
command_63,
command_64,
command_65
};


Добавим в этот массив указатели на наши новые команды


Код:
const unsigned char* commandsPointers[] PROGMEM =
{command_0,
command_1,
command_2,
command_3,
command_4,
.......
command_62,
command_63,
command_64,
command_65,
command_66,
command_67

};

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


Последний раз редактировалось Pingvin 19 окт 2014, 05:28, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 окт 2014, 16:29 
Не в сети
Аксакал форума
Аватар пользователя

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

command_xx_slot

где xx - это номер команды, которую данный обработчик и обрабатывает (простите за тафталогию).

То есть нам нужно написать две функции

command_66_slot()
command_67_slot()

Ну давайте уж запишем их после уже имеющихся обработчиков.

Выглядеть наши функции-обработчики будут так

Код:
void command_66_slot(void){//life_after_start?
USART_SendStr(int_to_str(eeprom_read_byte(&life_after_start),0));
USART_SendStrP(ok_string);
}


Все просто - на запрос о значении переменной считываем его из eeprom, преобразуем в строку и посылаем по UART

Код:
void command_67_slot(void){//life_after_start=
get_int_argument_value(&life_after_start, 0, 100);
}


Функция
get_int_argument_value(&life_after_start, 0, 100);
Считает из буфера UART передаваемое новое значение параметра, сравнит его с минимальным допустимым значением (второй аргумент функции) и с максимально допустимым значением (третий аргумент функции) и если новое значение параметра укладывается в заданные рамки - запишет полученное значение по адресу нашей переменной (первый аргумент функции)

Если передаваемое новое значение не укладывается в допустимые значения, функция выдаст в UART строку
"ERROR:parameter out of range";

Если забудем указать аргумент команды, то будет ошибка
"ERROR:parameter is not specified";


Все просто! ;) :)

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


Последний раз редактировалось Pingvin 18 окт 2014, 19:44, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 окт 2014, 16:35 
Не в сети
Аксакал форума
Аватар пользователя

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

Отвечаю - функция

parsing_command(void)

Эта функция запускается каждый раз, когда в буфер UART поступает новая строка (получен служебный символ перевода коретки - \r)

Найдите её в файле ltag_ascetic.c

Код:
void parsing_command(void)
{
uint8_t cmd_index;
DisableRxInt();
cmd_index = get_command_index();
switch(cmd_index)
{
case 0: command_0_slot();
break;
case 1: command_1_slot();
break;
case 2: command_2_slot();
break;
case 3: command_3_slot();
break;
case 4: command_4_slot();
break;
case 5: command_5_slot();
break;
.....
case 61: command_61_slot();
break;
case 62: command_62_slot();
break;
case 63: command_63_slot();
break;
case 64: command_64_slot();
break;
case 65: command_65_slot();
break;
default:
{
USART_SendStrP(unknown_command_error);
}
}
cr_received = false;
USART_FlushRxBuf();
}




Что она делает?

Первым делом ищет в буфере строки, указатели на которые перечислены в уже известном нам массиве
commandsPointers[]

для этого вызывается функция
cmd_index = get_command_index();

где cmd_index примет целое значение, равное порядковуму номеру указателя найденой строки в массиве commandsPointers[]

То есть для наших команд индексы будут равны 66 и 67 соответственно.

Подправим функцию parsing_command()

Добавим в свитч
Код:
   switch(cmd_index)
{
case 0: command_0_slot();
break;
case 1: command_1_slot();
break;
case 2: command_2_slot();
break;
case 3: command_3_slot();
break;
case 4: command_4_slot();
break;
case 5: command_5_slot();
break;
........
case 63: command_63_slot();
break;
case 64: command_64_slot();
break;
case 65: command_65_slot();
break;
default:
{



четыре строки строки

Код:
case 66: command_66_slot();
break;
case 67: command_67_slot();
break;



Теперь он будет выглядеть так

Код:
   switch(cmd_index)
{
case 0: command_0_slot();
break;
case 1: command_1_slot();
break;
case 2: command_2_slot();
break;
case 3: command_3_slot();
break;
case 4: command_4_slot();
break;
case 5: command_5_slot();
break;
........
case 63: command_63_slot();
break;
case 64: command_64_slot();
break;
case 65: command_65_slot();
break;
case 66: command_66_slot();
break;
case 67: command_67_slot();
break;



default:
{



Ну вот - теперь "Аскет" научился понимать две новые команды! ;) :)

Теперь, чтобы назначить новое значение параметру, например, задать, чтобы при старте игры "жизни" было 25% нужно набрать в терминале
life_after_start=25
и не забыть нажать "Enter" (отправить служебный символ возврата коретки).

Чтобы узнать текущее значение параметра, наберём
life_after_start?
тоже нажать "Enter"

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


Последний раз редактировалось Pingvin 18 окт 2014, 19:41, всего редактировалось 2 раз(а).

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

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

Не знает -- узнает! ;) :)
И для этого не надо в нем ничего переписывать!

Надо просто добавить наши новые команды в описание протокола.

Строка-описание протокола находится в файле commands.h

Найдите её

Код:
const unsigned char protocol[] PROGMEM =
"Патронов в магазине;int(0,90);bullets_in_clip?;bullets_in_clip=\r\n"
"Магазинов;int(0,100);clips?;clips=\r\n"
...
"Напряжение заряженной батареи;int(3000,45000);batt_full_voltage?;batt_full_voltage=\r\n"
"Напряжение разряженной батареи;int(2700,45000);batt_low_voltage?;batt_low_voltage=\r\n";


Здесь каждая строка описывает один из настраевымых параметров.

[Имя_параметра];[тип(миниальное_допустимое_значение,максимальное_допустимое_значение);[команда_для_чтения_параметра];[команда_для_присвоения_значения_параметру]

типов поддерживается пока два - целый тип и перечисляемый тип.

Наша новая переменная целого типа, поэтому добавим в описание протокола строку

"Жизнь после старта игры;int(0,100);life_after_start?;life_after_start=\r\n";

Код:
const unsigned char protocol[] PROGMEM =
"Патронов в магазине;int(0,90);bullets_in_clip?;bullets_in_clip=\r\n"
"Магазинов;int(0,100);clips?;clips=\r\n"
...
"Напряжение заряженной батареи;int(3000,45000);batt_full_voltage?;batt_full_voltage=\r\n"
"Напряжение разряженной батареи;int(2700,45000);batt_low_voltage?;batt_low_voltage=\r\n";
"Жизнь после старта игры;int(0,100);life_after_start?;life_after_start=\r\n";


Все!
Конфигуратор получит описание параметров от "Аскета" запросив протокол - отправив ему команду

protocol?

В ответ прилетят вышеописанные строки.
После этого конфигуратор в табличке с параметрами создаст строку для нашего нового параметра, в первой колонке будет его название,
во второй - считанное значение.
Ячейка во второй колонке будет доступна для редактирования, причем конфигуратор подберёт подходящий виджет для редактирования параметра и делегирует его в ячейку.
Для перечисляемый типов - выпадающий список с допустимыми значениями, для целых чисел - Spin Box
Когда мы нажмем кнопку "Записать параметры" - конфигуратор отправит в СОM-порт команду на присвоение значения этому параметру и следом новое значение, взятое из ячейки.

Но это уже тема отельного разговора....

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


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

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


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

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


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

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