www.open-tager.ru
https://open-tager.ru/forum/

Прошивка "Аскет" - добавление настроек параметра целого типа
https://open-tager.ru/forum/viewtopic.php?f=5&t=3910
Страница 1 из 4

Автор:  Pingvin [ 17 окт 2014, 05:48 ]
Заголовок сообщения:  Прошивка "Аскет" - добавление настроек параметра целого типа

Поступило предложение добавить в настройки количество жизни при старте игры.
На данный момент этот параметр = 100% и не настраивается.
Давайте сделаем его настраиваемым.

Чтобы при выключении тага значение параметра не терялось, хранить его будем в энергонезависимой памяти - eeprom (внутренняя контроллера, есть у нас ещё и внешняя микруха для звука - не путать!)

Теперь определимся с максимальным значением, от этого будет зависеть, какой тип должна иметь наша переменная.
Предлагаю максимальное значение - 100 (проценты, как-никак).
Значит нам достаточно типа
uint8_t - беззнаковый, целый, 8 бит размером.

Автор:  Pingvin [ 17 окт 2014, 07:24 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

Теперь давайте дадим какое-либо осмысленное название переменной.
предлагаю
life_after_start

Ну все - давайте определим её.
Все глобальные переменный объявлены в файле
global_variables.c

Добавим туда строку

volatile EEMEM uint8_t life_after_start; //Количество "жизни" после запуска новой игры


Макрос EEMEM говорит компилятору, что переменная должна храниться в eeprom памяти контроллера

Теперь, чтобы наша переменная была видна и из других файлов прошивки мы должны её задекларировать в заголовочном файле
ltag_ascetic.h

Добавим в него строку
extern volatile EEMEM uint8_t life_after_start; //Количество "жизни" после запуска новой игры

макрос extern говорит компилятору, что переменная уже определена в другом файле, не надо её создавать при компиляции очередного файла. Иначе у нас будет столько переменных с именем life_after_start, сколько раз мы будем использовать в файлах
#include ltag_ascetic.h

И между ними не будет ничего общего, кроме названия.

Автор:  Pingvin [ 17 окт 2014, 07:35 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

eeprom такая штука, что не угадаешь, что там будет лежать после прошивки контроллера.
И по адресу нашей переменной может лежать недопустимое значение.
Поэтому проверим нашу новоиспеченную переменную до старта игры и настроек.
Есть функция, которая это делает, называется
void check_eeprom(void);//проверим корректность значений переменных, хранимых в eeprom

Подправим её - добавим проверку значения новой переменной
if (eeprom_read_byte(&life_after_start)>100) eeprom_write_byte(&life_after_start,100);

как видете, напрямую обращаться к переменной, находящейся в eeprom памяти контроллера мы не можем, для этого существуют функции для работы с eeprom
мы воспользовались для чтения функцией
eeprom_read_byte(...)

для записи

eeprom_write_byte(...)

Автор:  Pingvin [ 17 окт 2014, 11:03 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

Теперь нам надо дать пользователю возможность внести эту настройку с ЖКИ.

Для этого в прошивке предусмотрена функция
get_int_settings(char* text, uint8_t* var_adress, uint8_t max_value)

где первый параметр text - это тот текст, который будет отображаться на экранчике в верхней строке.
Сюда мы передадим название параметра - "Жизнь"
так как экранчик на 8 символов в строке, этот текст не должен быть длиннее.

второй параметр var_adress - адрес нашей переменной, чтобы получить адрес переменной, а не её значение, перед именем переменной ставиться знак &

третий параметр max_value - максимально допустимое значение, которое может принимать переменная. В нашем случае - 100

Все настройки выполняются в функции get_all_setings();

Добавим в неё строку
get_int_settings("Жизнь", &life_after_start, 100);

Код:
void get_all_setings(void)
{
   get_int_settings("ID игр.", &eeprom_player_id, 127); //нажата центральная кнопка
   set_player_id(eeprom_read_byte(&eeprom_player_id));   //Устанавливаем идентификатор игрока
   get_int_settings("ID ком.", &eeprom_team_id, 3); //нажата центральная кнопка
   set_team_color(team_id());   //Устанавливаем идентификатор (цвет) команды
   get_enum_settings("Урон", &eeprom_damage, &damage_value, Damage_100);
   set_gun_damage(gun_damage());      //Устанавливаем мощьность оружия (урон)
   get_enum_settings("IR_F KHz", &eeprom_ir_carr_freq, &ir_f0_value, freq_56KHz);   
   get_ir_protocol();
   reinit_timer2();
   get_int_settings("Патронов", &eeprom_bullets_in_clip, 90); //нажата центральная кнопка
   get_int_settings("Обойм", &eeprom_clips, 90);
   get_int_settings("Перез. с", &eeprom_reload_duration, 8);
   get_ir_power_settings();
   curr_ir_pin=eeprom_read_byte(&eeprom_curr_ir_pin);
   get_friendly_fire_settings();
        get_int_settings("Жизнь", &life_after_start, 100);

}

Автор:  Pingvin [ 17 окт 2014, 11:12 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

Ну и последний штрих.
Осталось перед стартом игры считать настройку из eeprom и присвоить её значение переменной.
На ЖКИ отображается значение жизни из глобальной переменной

life_in_percent

Все переменные инициируются в функции init_var(), найдите её в файле ltag_ascetic.c и вы увидите


life_in_percent = 100;//эту выводим на дисплей

Измените эту строку на

life_in_percent =eeprom_read_byte(&life_after_start);


Все!
Компилируем, прошиваем и в нашем меню настроек появляется новый пункт!

Но это мы только получили возможность настраивать уровень жизни при старте с ЖКИ.

Как сделать, чтобы конфигуратор умел так же работать с этой настройкой - в следующей статье.

Автор:  Pingvin [ 17 окт 2014, 11:51 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

Ну вот и баг обнаружен!

Дело в том, что функция init_var() вызывается раньше, чем invite() (там настройки выполняются)
Поэтому добавьте и после вызова функции invite() строку
life_in_percent =eeprom_read_byte(&life_after_start);

Это в файле ltag_ascetic.c где то в начале.

Это, конечно - косяк, но просто так поменять порядок вызова функций я боюсь - надо внимательно посмотреть, а то баги могут пойти - замучаешься отлавливать.

Но надо исправить, не кошерно так...

Автор:  Pingvin [ 17 окт 2014, 12:03 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

Вот прошивка к примеру - жизнь при старте можно настроить с ЖКИ.
Для релиза 3.1

Вложения:
LTAscet_3_1_BT_LCD8x2_wo_joistik_new_ir_tx_algoritm_RC_IRF0_switch_self_ricochet_ignore_ife_adj.zip [338 KiB]
Скачиваний: 521

Автор:  loner32 [ 17 окт 2014, 13:40 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

Pingvin писал(а):
Вот прошивка к примеру - жизнь при старте можно настроить с ЖКИ.
Для релиза 3.1


чтото не работает отправляб пакт выстрела с повреждением 1 жизнь сразуже убивает намертво хоть по умолчанию 100 жизни на 3.1

Автор:  Pingvin [ 17 окт 2014, 15:15 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

loner32 писал(а):
Pingvin писал(а):
Вот прошивка к примеру - жизнь при старте можно настроить с ЖКИ.
Для релиза 3.1


чтото не работает отправляб пакт выстрела с повреждением 1 жизнь сразуже убивает намертво хоть по умолчанию 100 жизни на 3.1

Проверял - вроде работало.
Из чего стреляли?

После прошивки в eeprom могли быть нули.
И жизнь при старте могла быть - 0.
Заходили в настройки?
Пишите подробней, что и как делали - не понятно ничего!

Автор:  loner32 [ 17 окт 2014, 17:34 ]
Заголовок сообщения:  Re: Прошивка "Аскет" - добавление настроек параметра целого

Pingvin писал(а):
loner32 писал(а):
Pingvin писал(а):
Вот прошивка к примеру - жизнь при старте можно настроить с ЖКИ.
Для релиза 3.1


чтото не работает отправляб пакт выстрела с повреждением 1 жизнь сразуже убивает намертво хоть по умолчанию 100 жизни на 3.1

Проверял - вроде работало.
Из чего стреляли?

После прошивки в eeprom могли быть нули.
И жизнь при старте могла быть - 0.
Заходили в настройки?
Пишите подробней, что и как делали - не понятно ничего!


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

Страница 1 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/