/* * TinyIRReceiver.h * * * Copyright (C) 2021 Armin Joachimsmeyer * armin.joachimsmeyer@gmail.com * * This file is part of IRMP https://github.com/ukw100/IRMP. * This file is part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote. * * TinyIRReceiver is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef _TINY_IR_RECEIVER_H #define _TINY_IR_RECEIVER_H #include #include "LongUnion.h" /** \addtogroup TinyReceiver Minimal receiver for NEC protocol * @{ */ /* * This function is called if a complete command was received and must be implemented by the including file (user code) */ void handleReceivedTinyIRData(uint16_t aAddress, uint8_t aCommand, bool isRepeat); // LSB first, 1 start bit + 16 bit address + 8 bit data + 8 bit inverted data + 1 stop bit. // see: https://www.sbprojects.net/knowledge/ir/nec.php #define NEC_ADDRESS_BITS 16 // 16 bit address or 8 bit address and 8 bit inverted address #define NEC_COMMAND_BITS 16 // Command and inverted command #define NEC_BITS (NEC_ADDRESS_BITS + NEC_COMMAND_BITS) #define NEC_UNIT 560 #define NEC_HEADER_MARK (16 * NEC_UNIT) // 9000 #define NEC_HEADER_SPACE (8 * NEC_UNIT) // 4500 #define NEC_BIT_MARK NEC_UNIT #define NEC_ONE_SPACE (3 * NEC_UNIT) // 1690 #define NEC_ZERO_SPACE NEC_UNIT #define NEC_REPEAT_HEADER_SPACE (4 * NEC_UNIT) // 2250 #define NEC_REPEAT_PERIOD 110000 // Not used yet - Commands are repeated every 110 ms (measured from start to start) for as long as the key on the remote control is held down. /* * Macros for comparing timing values */ #define lowerValue25Percent(aDuration) (aDuration - (aDuration / 4)) #define upperValue25Percent(aDuration) (aDuration + (aDuration / 4)) #define lowerValue50Percent(aDuration) (aDuration / 2) // (aDuration - (aDuration / 2)) #define upperValue50Percent(aDuration) (aDuration + (aDuration / 2)) /* * The states for the state machine */ #define IR_RECEIVER_STATE_WAITING_FOR_START_MARK 0 #define IR_RECEIVER_STATE_WAITING_FOR_START_SPACE 1 #define IR_RECEIVER_STATE_WAITING_FOR_FIRST_DATA_MARK 2 #define IR_RECEIVER_STATE_WAITING_FOR_DATA_SPACE 3 #define IR_RECEIVER_STATE_WAITING_FOR_DATA_MARK 4 #define IR_RECEIVER_STATE_WAITING_FOR_STOP_MARK 5 /** * Control and data variables of the state machine for TinyReceiver */ struct TinyIRReceiverStruct { /* * State machine */ uint32_t LastChangeMicros; ///< microseconds of last Pin Change Interrupt. uint8_t IRReceiverState; ///< the state of the state machine. uint8_t IRRawDataBitCounter; /* * Data */ uint32_t IRRawDataMask; LongUnion IRRawData; bool IRRepeatDetected; }; /* * Can be used by the callback to transfer received data to main loop for further processing * E.g. with volatile struct TinyIRReceiverCallbackDataStruct sCallbackData; */ struct TinyIRReceiverCallbackDataStruct { uint16_t Address; uint8_t Command; bool isRepeat; bool justWritten; }; void initPCIInterruptForTinyReceiver(); void enablePCIInterruptForTinyReceiver(); void disablePCIInterruptForTinyReceiver(); bool isTinyReceiverIdle(); /** @}*/ #endif // _TINY_IR_RECEIVER_H