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
|
Автор: | 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/ |