www.open-tager.ru http://www.open-tager.ru/forum/ |
|
Прошивка "Аскет" - добавление настроек параметра целого типа http://www.open-tager.ru/forum/viewtopic.php?f=5&t=3910 |
Страница 3 из 4 |
Автор: | loner32 [ 18 окт 2014, 10:09 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Pingvin писал(а): loner32 писал(а): Pingvin писал(а): Огромный такой сенкс! нет я авто трассировку з делал настроив предварительно Для автотрассировки - неплохо, однако! Никогда не пользовался, да и не умею, честно сказать... стоит попробовать |
Автор: | Pingvin [ 18 окт 2014, 10:10 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Обязательно! |
Автор: | loner32 [ 18 окт 2014, 12:34 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Pingvin писал(а): Обязательно! какие изменения надо внести в прошивку чтоб с помощью конфигуратора зашивать параметры жизни |
Автор: | Pingvin [ 18 окт 2014, 14:24 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
loner32 писал(а): Pingvin писал(а): Обязательно! какие изменения надо внести в прошивку чтоб с помощью конфигуратора зашивать параметры жизни Выпадет полчасика свободный - распишу. |
Автор: | Pingvin [ 18 окт 2014, 14:27 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Давайте теперь научим "Аскета" понимать команды, которые он получает по UART (COM-порт), которыми мы будем считывать и устанавливать наш новый параметр life_after_start Предлагаю использовать для чтения параметра команду life_after_start? А для записи параметра life_after_start= То есть, чтобы присвоить новое значение параметру, будем набирать в терминале life_after_start=50 Это 50% задали. А чтобы узнать текущее значение, будем набирать life_after_start? |
Автор: | Pingvin [ 18 окт 2014, 14:34 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Открываем файл 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:08 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Чуть ниже находится массив с указателями на строки, в которых хранятся команды. Код: 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 [ 18 окт 2014, 16:29 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Теперь давайте напишем функции-обработчики наших команд. Все функции-обработчики команд в прошивке "Аскета" имеют типизированные названия 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, 16:35 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
Теперь вопрос - кто же и когда будет вызывать наши функции-обработчики новых команд? Отвечаю - функция 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, 18:19 ] |
Заголовок сообщения: | Re: Прошивка "Аскет" - добавление настроек параметра целого |
А как же быть с Аскет-конфигуратором? Неужели придется его переписывать? Он же ничего не знает о наших новых командах? Не знает -- узнает! И для этого не надо в нем ничего переписывать! Надо просто добавить наши новые команды в описание протокола. Строка-описание протокола находится в файле 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-порт команду на присвоение значения этому параметру и следом новое значение, взятое из ячейки. Но это уже тема отельного разговора.... |
Страница 3 из 4 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |