Спасибо.
В общем -понятно, чего надо.
1. Документация.
2. Команды пульта.
Предлагаю начать с более простого - научить "Аскета" понимать команды пульта.
И предлагаю сделать это вместе.
Надеюсь, после этого станет ясно, что добавлять новый функционал в прошивку не сложно.
Кратенько опишу ситуацию, как работает прошивка.
Есть так называемый "главный цикл" программы, который крутиться непрерывно и проверяет - какие же события возникли в системе.
А события у нас разные - нажатие кнопок, получение ИК-пакета, считывание кода ключа ТачМемори и прочее.
События, это не что иное, как глобальные переменные.
Все события возникают в прерываниях, а в главном цикле обрабатываются.
Предлагаю научить "Аскета" понимать какую-нибудь команду, например - "старт игры".
О событиях ИК-приемника нас информирует глобальная переменная перечисляемого типа
rx_eventОна может принимать три значения
NOT_EVENT; - нет никаких событий
RX_ERROR - ошибка приема
и
RX_COMPLETE - получен пакет, во время приема ошибок не выявлено.
Какие условия должны быть соблюдены, чтобы наступило событие , RX_COMPLETE?
1. Должен быть получен корректный старт-бит.
2. Во время приема бит и пауз не должно быть ошибок (их длительности должны соответствовать протоколу +/- погрешность ).
3. Должен быть зафиксирован тайм-аут (нет несущей определенное время), означающий конец передачи пакета.
4. Количество принятых бит должно быть не менее определенного количества, на данный момент - 13.
Все принятые биты записываются в буфер приемника - переменную
rx_bufferrx_buffer - байтовый массив, размером, определяемым макросом
RX_BUFFER_SIZE.
Макрос определен в файле
types.h таким образом
Код:
#define RX_BUFFER_SIZE 8 //Размер буфера приемника
То есть на данный момент буфер ИК-приемника может принять 64 бита.
Каждый принятый бит укладывается в буфер специальной функцией
set_buffer_bit(номер бита, значение);Значение может быть у бита либо 1 (true), либо 0 (false)/
Кроме того, функция учитывает особенности протокола, где первым идет старший бит, и заполняет буфер таким образом, чтобы биты встали на свои места.
Код:
void set_buffer_bit(uint8_t index, bool value){ //Çàäàåì çíà÷åíèå áèòó â áóôåðå ÈÊ-ïðèåìíèêà
uint8_t byte_index;
uint8_t bit_index;
byte_index = index/8; //Îïðåäåëÿåì, â êàêîì áàéòå íàõàäèòñÿ íóæíûé áèò
bit_index = index - (byte_index*8);//Îïðåäåëÿåì íîìåð áèòà â áàéòå
if(value)
{
rx_buffer[byte_index] |= (1<<(7-bit_index));
}
else {
rx_buffer[byte_index] &= ~(1<<(7-bit_index));
}
}
Чертова кодирова.
Что то я увлекся....
Количество принятых бит заносится в переменную
bit_in_rx_buffНесколько сумбурно излагаю, ну как то так.
Когда наступает событие RX_COMPLETE, обработчик первым делом проверяет, с каким значением прилетел бит с индексом [0].
Код:
if(!get_buffer_bit(0)) //åñëè ýòîò áèò ðàâåí 0, òî ýòî ïàêåò ñ äàííûìè (âûñòðåë)
{
И если значение этого бита 0, то это - выстрел!
А если 1 - то команда.
Так говорит протокол.
Внимание вопрос - что нужно сделать, чтобы реализовать поддержку команды пульта, допустим, "новая игра"?
Такое вот "домашнее задание"!