273 lines
7.5 KiB
C
273 lines
7.5 KiB
C
|
// Copyright 2019 Espressif Systems (Shanghai) PTE LTD
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include "esp_err.h"
|
||
|
|
||
|
#define IR_TOOLS_FLAGS_PROTO_EXT (1 << 0) /*!< Enable Extended IR protocol */
|
||
|
#define IR_TOOLS_FLAGS_INVERSE (1 << 1) /*!< Inverse the IR signal, i.e. take high level as low, and vice versa */
|
||
|
|
||
|
/**
|
||
|
* @brief IR device type
|
||
|
*
|
||
|
*/
|
||
|
typedef void *ir_dev_t;
|
||
|
|
||
|
/**
|
||
|
* @brief IR builder type
|
||
|
*
|
||
|
*/
|
||
|
typedef struct ir_builder_s ir_builder_t;
|
||
|
|
||
|
/**
|
||
|
* @brief IR parser type
|
||
|
*
|
||
|
*/
|
||
|
typedef struct ir_parser_s ir_parser_t;
|
||
|
|
||
|
/**
|
||
|
* @brief Type definition of IR builder
|
||
|
*
|
||
|
*/
|
||
|
struct ir_builder_s {
|
||
|
/**
|
||
|
* @brief Period time of sending repeat code
|
||
|
*
|
||
|
*/
|
||
|
uint32_t repeat_period_ms;
|
||
|
|
||
|
/**
|
||
|
* @brief Build frame header
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Build frame header successfully
|
||
|
* - ESP_FAIL: Build frame header failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*make_head)(ir_builder_t *builder);
|
||
|
|
||
|
/**
|
||
|
* @brief Build logic bit zero
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Build logic bit zero successfully
|
||
|
* - ESP_FAIL: Build logic bit zero failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*make_logic0)(ir_builder_t *builder);
|
||
|
|
||
|
/**
|
||
|
* @brief Build logic bit one
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
*
|
||
|
* @return
|
||
|
* ESP_OK: Build logic bit one successfully
|
||
|
* ESP_FAIL: Build logic bit one failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*make_logic1)(ir_builder_t *builder);
|
||
|
|
||
|
/**
|
||
|
* @brief Build frame tail
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Build frame tail successfully
|
||
|
* - ESP_FAIL: Build frame tail failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*make_end)(ir_builder_t *builder);
|
||
|
|
||
|
/**
|
||
|
* @brief Build a complete frame
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Build a complete frame successfully
|
||
|
* - ESP_FAIL: Build a complete frame failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*build_frame)(ir_builder_t *builder, uint32_t address, uint32_t command);
|
||
|
|
||
|
/**
|
||
|
* @brief Build a repeat frame
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Build a repeat frame successfully
|
||
|
* - ESP_FAIL: Build a repeat frame failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*build_repeat_frame)(ir_builder_t *builder);
|
||
|
|
||
|
/**
|
||
|
* @brief Get the result frame after a series of building steps
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
* @param[out] result: Result of frame building, which contains all of the raw data that could be send directly
|
||
|
* @param[out] length: Length of result data
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Get result data successfully
|
||
|
* - ESP_ERR_INVALID_ARG: Get result data failed because of invalid arguments
|
||
|
* - ESP_FAIL: Get result data failed because some other errors occurred
|
||
|
*/
|
||
|
esp_err_t (*get_result)(ir_builder_t *builder, void *result, uint32_t *length);
|
||
|
|
||
|
/**
|
||
|
* @brief Free resources used by IR builder
|
||
|
*
|
||
|
* @param[in] builder: Handle of IR builder
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Free resources successfully
|
||
|
* - ESP_FAIL: Free resources failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*del)(ir_builder_t *builder);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Type definition of IR parser
|
||
|
*
|
||
|
*/
|
||
|
struct ir_parser_s {
|
||
|
/**
|
||
|
* @brief Input raw data to IR parser
|
||
|
*
|
||
|
* @param[in] parser: Handle of IR parser
|
||
|
* @param[in] raw_data: Raw data which need decoding by IR parser
|
||
|
* @param[in] length: Length of raw data
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Input raw data successfully
|
||
|
* - ESP_ERR_INVALID_ARG: Input raw data failed because of invalid argument
|
||
|
* - ESP_FAIL: Input raw data failed because some other error occurred
|
||
|
*/
|
||
|
esp_err_t (*input)(ir_parser_t *parser, void *raw_data, uint32_t length);
|
||
|
|
||
|
/**
|
||
|
* @brief Get the scan code after decoding of raw data
|
||
|
*
|
||
|
* @param[in] parser: Handle of IR parser
|
||
|
* @param[out] address: Address of the scan code
|
||
|
* @param[out] command: Command of the scan code
|
||
|
* @param[out] repeat: Indicate if it's a repeat code
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Get scan code successfully
|
||
|
* - ESP_ERR_INVALID_ARG: Get scan code failed because of invalid arguments
|
||
|
* - ESP_FAIL: Get scan code failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*get_scan_code)(ir_parser_t *parser, uint32_t *address, uint32_t *command, bool *repeat);
|
||
|
|
||
|
/**
|
||
|
* @brief Free resources used by IR parser
|
||
|
*
|
||
|
* @param[in] parser: Handle of IR parser
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_OK: Free resource successfully
|
||
|
* - ESP_FAIL: Free resources fail failed because some error occurred
|
||
|
*/
|
||
|
esp_err_t (*del)(ir_parser_t *parser);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Configuration type of IR builder
|
||
|
*
|
||
|
*/
|
||
|
typedef struct {
|
||
|
uint32_t buffer_size; /*!< Size of the internal buffer used by IR builder */
|
||
|
ir_dev_t dev_hdl; /*!< IR device handle */
|
||
|
uint32_t flags; /*!< Flags for IR builder, different flags will enable different features */
|
||
|
} ir_builder_config_t;
|
||
|
|
||
|
/**
|
||
|
* @brief Configuration type of IR parser
|
||
|
*
|
||
|
*/
|
||
|
typedef struct {
|
||
|
ir_dev_t dev_hdl; /*!< IR device handle */
|
||
|
uint32_t flags; /*!< Flags for IR parser, different flags will enable different features */
|
||
|
uint32_t margin_us; /*!< Timing parameter, indicating the tolerance to environment noise */
|
||
|
} ir_parser_config_t;
|
||
|
|
||
|
/**
|
||
|
* @brief Default configuration for IR builder
|
||
|
*
|
||
|
*/
|
||
|
#define IR_BUILDER_DEFAULT_CONFIG(dev) \
|
||
|
{ \
|
||
|
.buffer_size = 64, \
|
||
|
.dev_hdl = dev, \
|
||
|
.flags = 0, \
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Default configuration for IR parser
|
||
|
*
|
||
|
*/
|
||
|
#define IR_PARSER_DEFAULT_CONFIG(dev) \
|
||
|
{ \
|
||
|
.dev_hdl = dev, \
|
||
|
.flags = 0, \
|
||
|
.margin_us = 200, \
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Creat a NEC protocol builder
|
||
|
*
|
||
|
* @param config: configuration of NEC builder
|
||
|
* @return
|
||
|
* Handle of NEC builder or NULL
|
||
|
*/
|
||
|
ir_builder_t *ir_builder_rmt_new_nec(const ir_builder_config_t *config);
|
||
|
|
||
|
/**
|
||
|
* @brief Creat a RC5 protocol builder
|
||
|
*
|
||
|
* @param config: configuration of RC5 builder
|
||
|
* @return
|
||
|
* Handle of RC5 builder or NULL
|
||
|
*/
|
||
|
ir_builder_t *ir_builder_rmt_new_rc5(const ir_builder_config_t *config);
|
||
|
|
||
|
/**
|
||
|
* @brief Creat a NEC protocol parser
|
||
|
*
|
||
|
* @param config: configuration of NEC parser
|
||
|
* @return
|
||
|
* Handle of NEC parser or NULL
|
||
|
*/
|
||
|
ir_parser_t *ir_parser_rmt_new_nec(const ir_parser_config_t *config);
|
||
|
|
||
|
/**
|
||
|
* @brief Creat a RC5 protocol parser
|
||
|
*
|
||
|
* @param config: configuration of RC5 parser
|
||
|
* @return
|
||
|
* Handle of RC5 parser or NULL
|
||
|
*/
|
||
|
ir_parser_t *ir_parser_rmt_new_rc5(const ir_parser_config_t *config);
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|