/* * File: ir_decoder.c * Date: 12.01.2013 * Denis Zheleznyakov aka ZiB @ http://ziblog.ru */ #include "main.h" struct ir_decoder_type ir_decoder; static uint16_t button_code_received; static uint32_t buffer_received_bits; static int8_t counter_intervals; static uint16_t interval_length_reference_minimum; static uint16_t interval_length_reference_maximum; //------------------------------------------------------------------------------ void ir_decoder_refresh(void) { uint16_t timer_value; // считываем длительность имсульса в тиках таймера timer_value = TIM2->CCR1H << 8; timer_value += TIM2->CCR1L; // начало посылки (импульc больше информационного или равен нулю) if ((timer_value > ((IR_DECODER_PULSE_MAXIMUM * 1000UL) / IR_DECODER_TIMER_TICK)) || (timer_value == 0)) { // обнуление приемного буффера buffer_received_bits = 0; // "сброс" счетика интервалов counter_intervals = (int8_t) (-IR_DECODER_NUMBER_OF_MISSING_INTERVAL); } else { // проверка максимальной длины посылки if (counter_intervals < IR_DECODER_COMMAND_LENGHT_MAXIMUM) { // декодирование посылки if (counter_intervals++ > 0) { // сравниваем с эталоном if ((timer_value < interval_length_reference_minimum) || (timer_value > interval_length_reference_maximum)) { buffer_received_bits++; } // сдвигаем данные buffer_received_bits <<= 1; } // запоминаем интервал interval_length_reference_minimum = timer_value; interval_length_reference_maximum = timer_value; // рассчитываем отклонение timer_value *= IR_DECODER_INTERVAL_REFERENCE_PERCENT; timer_value /= 100; // устанавливаем границы interval_length_reference_maximum += timer_value; interval_length_reference_minimum -= timer_value; } } } //------------------------------------------------------------------------------ void ir_decoder_refresh_timeout(void) { uint16_t hash = 0xFFFF; uint8_t data; uint16_t temp; uint8_t byte_number; if (!ir_decoder.is_received) { for (byte_number = 0; byte_number < 4; byte_number++) { data = (uint8_t) buffer_received_bits; buffer_received_bits >>= 8; data ^= (uint8_t) hash; data ^= (uint8_t) (data << 4); temp = ((uint16_t) data << 8) | (uint8_t) (hash >> 8); temp ^= data >> 4; temp ^= data << 3; hash = temp; } ir_decoder.hash_code_received = hash; ir_decoder.is_received = TRUE; } }