440 lines
13 KiB
C
440 lines
13 KiB
C
|
|
/* USER CODE BEGIN Header */
|
|||
|
|
/**
|
|||
|
|
******************************************************************************
|
|||
|
|
* @file nec_infrared.c
|
|||
|
|
* @author Motor Control SDK Team, Yuwell Software XiangenWang
|
|||
|
|
* @brief Voice Recognition Module Initialization Section,
|
|||
|
|
including peripheral initialization and message node insertion, etc.
|
|||
|
|
* @version 1.0
|
|||
|
|
* @changelog version 1.0 <EFBFBD><EFBFBD>ʼ<EFBFBD>汾 2025.11.13
|
|||
|
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
******************************************************************************
|
|||
|
|
* @attention
|
|||
|
|
*
|
|||
|
|
* <h2><center>© Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China.
|
|||
|
|
* All rights reserved.</center></h2>
|
|||
|
|
*
|
|||
|
|
* Redistribution and use in source and binary forms, with or without
|
|||
|
|
* modification, are permitted, provided that the following conditions are met:
|
|||
|
|
*
|
|||
|
|
* 1. Redistribution of source code must retain the above copyright notice,
|
|||
|
|
* this list of conditions and the following disclaimer.
|
|||
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|||
|
|
* this list of conditions and the following disclaimer in the documentation
|
|||
|
|
* and/or other materials provided with the distribution.
|
|||
|
|
* 3. Neither the name of Yuwell Software nor the names of other
|
|||
|
|
* contributors to this software may be used to endorse or promote products
|
|||
|
|
* derived from this software without specific written permission.
|
|||
|
|
* 4. This software, including modifications and/or derivative works of this
|
|||
|
|
* software, must execute solely and exclusively on microcontroller or
|
|||
|
|
* microprocessor devices manufactured by or for Yuwell Software.
|
|||
|
|
* 5. Redistribution and use of this software other than as permitted under
|
|||
|
|
* this license is void and will automatically terminate your rights under
|
|||
|
|
* this license.
|
|||
|
|
*
|
|||
|
|
* THIS SOFTWARE IS PROVIDED BY Yuwell Software AND CONTRIBUTORS "AS IS"
|
|||
|
|
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
|||
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|||
|
|
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
|
|||
|
|
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
|||
|
|
* SHALL Yuwell Software OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|||
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|||
|
|
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|||
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|||
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|||
|
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|
*
|
|||
|
|
******************************************************************************
|
|||
|
|
*/
|
|||
|
|
/* USER CODE END Header */
|
|||
|
|
#include "nec_infrared.h"
|
|||
|
|
#include "string.h"
|
|||
|
|
#include "fm33lg0xx_queue.h"
|
|||
|
|
#include "fm33lg0xx_event.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
#include "ht24lc02_eeprom.h"
|
|||
|
|
|
|||
|
|
/************************** ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> **************************/
|
|||
|
|
Infrared infrared_info; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD>壬״̬Ĭ<CCAC><C4AC>ΪIDLE
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/************************** ˽<>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> **************************/
|
|||
|
|
static uint32_t nec_calc_pulse_width(Infrared* info, uint32_t current_val);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param NONE
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>LPTIM32Ϊ1MHz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>64MHzϵͳʱ<EFBFBD>ӷ<EFBFBD>Ƶ64<EFBFBD><EFBFBD>
|
|||
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>LPTIM32<EFBFBD><EFBFBD><EFBFBD>벶<EFBFBD><EFBFBD>Ϊ˫<EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>NVIC<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>LPTIM32<EFBFBD>ж<EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
void nec_infrared_init(void)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
FL_LPTIM32_InitTypeDef timInit;
|
|||
|
|
FL_LPTIM32_IC_InitTypeDef timICInit;
|
|||
|
|
|
|||
|
|
FL_GPIO_InitTypeDef GPIO_InitStruct;
|
|||
|
|
|
|||
|
|
GPIO_InitStruct.pin = NEC_INFRARED_GPIO_PIN;
|
|||
|
|
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
|
|||
|
|
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
|
|||
|
|
GPIO_InitStruct.pull = FL_ENABLE;
|
|||
|
|
GPIO_InitStruct.remapPin = FL_DISABLE;
|
|||
|
|
GPIO_InitStruct.analogSwitch = FL_DISABLE;
|
|||
|
|
FL_GPIO_Init(NEC_INFRARED_GPIO_PORT, &GPIO_InitStruct);
|
|||
|
|
|
|||
|
|
|
|||
|
|
FL_LPTIM32_StructInit(&timInit);
|
|||
|
|
|
|||
|
|
timInit.clockSource = FL_CMU_LPTIM32_CLK_SOURCE_APBCLK; // ϵͳƵ<CDB3><C6B5>Ϊ64Mhz
|
|||
|
|
timInit.mode = FL_LPTIM32_OPERATION_MODE_NORMAL;
|
|||
|
|
timInit.prescalerClockSource = FL_LPTIM32_CLK_SOURCE_INTERNAL;
|
|||
|
|
timInit.prescaler = FL_LPTIM32_PSC_DIV64; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʷ<EFBFBD>ƵΪ1Mhz
|
|||
|
|
timInit.autoReload = 300000 - 1; // <20><><EFBFBD><EFBFBD>Ϊ500ms
|
|||
|
|
timInit.onePulseMode = FL_LPTIM32_ONE_PULSE_MODE_CONTINUOUS;
|
|||
|
|
timInit.triggerEdge = FL_LPTIM32_ETR_TRIGGER_EDGE_BOTH;
|
|||
|
|
timInit.countEdge = FL_LPTIM32_ETR_COUNT_EDGE_FALLING;
|
|||
|
|
|
|||
|
|
FL_LPTIM32_Init(LPTIM32, &timInit);
|
|||
|
|
|
|||
|
|
|
|||
|
|
timICInit.ICSource = FL_LPTIM32_IC1_CAPTURE_SOURCE_GROUP0;
|
|||
|
|
timICInit.ICEdge = FL_LPTIM32_IC_EDGE_FALLING; // ˫<><CBAB>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD>
|
|||
|
|
FL_LPTIM32_IC_Init(LPTIM32, FL_LPTIM32_CHANNEL_3, &timICInit);
|
|||
|
|
|
|||
|
|
FL_LPTIM32_ClearFlag_CC(LPTIM32, FL_LPTIM32_CHANNEL_3); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|||
|
|
FL_LPTIM32_ClearFlag_Update(LPTIM32);
|
|||
|
|
|
|||
|
|
FL_LPTIM32_EnableIT_CC(LPTIM32, FL_LPTIM32_CHANNEL_3); // <20>ж<EFBFBD>ʹ<EFBFBD><CAB9>
|
|||
|
|
FL_LPTIM32_EnableIT_Update(LPTIM32);
|
|||
|
|
|
|||
|
|
|
|||
|
|
NVIC_DisableIRQ(LPTIMx_IRQn); // ʹ<>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>NVIC
|
|||
|
|
NVIC_SetPriority(LPTIMx_IRQn,1); // <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
|||
|
|
NVIC_EnableIRQ(LPTIMx_IRQn);
|
|||
|
|
|
|||
|
|
FL_LPTIM32_Enable(LPTIM32); // ʹ<><CAB9>LPTIM32
|
|||
|
|
|
|||
|
|
infrared_info.ir_state = IR_STATE_IDLE;
|
|||
|
|
infrared_info.pulse_width_index = 0;
|
|||
|
|
infrared_info.code_464_ing = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param current_val: <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><EFBFBD>1MHz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>
|
|||
|
|
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰֵ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰֵ+500000-<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
|
* 2. 500000ΪLPTIM32<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>װֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.12.12
|
|||
|
|
*/
|
|||
|
|
static uint32_t nec_calc_pulse_width(Infrared* info, uint32_t current_val)
|
|||
|
|
{
|
|||
|
|
uint32_t pulse_width = 0;
|
|||
|
|
info->ic_value_last = info->ic_value_current;
|
|||
|
|
info->ic_value_current = current_val;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰֵ < <20><>һ<EFBFBD><D2BB>ֵ<EFBFBD><D6B5>
|
|||
|
|
if (info->ic_value_current >= info->ic_value_last)
|
|||
|
|
{
|
|||
|
|
pulse_width = info->ic_value_current - info->ic_value_last;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ = <20><>ǰֵ + (<28>Զ<EFBFBD><D4B6><EFBFBD>װֵ + 1) - <20><>һ<EFBFBD><D2BB>ֵ
|
|||
|
|
pulse_width = (info->ic_value_current + 500000)- info->ic_value_last;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return pulse_width;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>NEC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>
|
|||
|
|
* @note <EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD>NECЭ<EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>Чָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ͬ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ж<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>顢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǡ<EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
|
* @attention 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NECЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>32λ<EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ33<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
|
|||
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* 3. ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>漰ȫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豣֤ȫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰߳<EFBFBD>ȫ
|
|||
|
|
*/
|
|||
|
|
static void nec_command_decode(Infrared* info)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint8_t i = 0;
|
|||
|
|
info->received_data = 0;
|
|||
|
|
info->received_data_index = 0;
|
|||
|
|
|
|||
|
|
MsgQueueItem queue_item;
|
|||
|
|
MsgQueueItem filter_item;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if((info->pulse_width_array[0] > NEC_START_FALLING_MIN)&&(info->pulse_width_array[0] < NEC_START_FALLING_MAX))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
for(i = 1;i < 33; i++)
|
|||
|
|
{
|
|||
|
|
if((info->pulse_width_array[i] > NEC_DATA0_FALLING_MIN)&&(info->pulse_width_array[i] < NEC_DATA0_FALLING_MAX))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
info->received_data_index++;
|
|||
|
|
|
|||
|
|
}else if((info->pulse_width_array[i] > NEC_DATA1_FALLING_MIN)&&(info->pulse_width_array[i] < NEC_DATA1_FALLING_MAX))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
info->received_data += (1 << info->received_data_index++);
|
|||
|
|
|
|||
|
|
}else{
|
|||
|
|
|
|||
|
|
info->decode_error = true;
|
|||
|
|
|
|||
|
|
info->received_data = 0;
|
|||
|
|
info->received_data_index = 0;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
info->decode_error = false;
|
|||
|
|
|
|||
|
|
// vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
|
|||
|
|
// OK<4F><4B><EFBFBD><EFBFBD>˸һ<CBB8><D2BB>
|
|||
|
|
if(info->received_data == NEC_CODE_NUM_4)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if(info->code_464_ing == 2)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
vOxygenEventGroupSetBits(&global_event, EVENT_464_CLEAR); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
|
|
|||
|
|
info->code_464_ing = 0;
|
|||
|
|
|
|||
|
|
}else if(info->code_464_ing == 0){
|
|||
|
|
|
|||
|
|
info->code_464_ing = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<D0A3><D7BC>
|
|||
|
|
|
|||
|
|
vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
|
|||
|
|
|
|||
|
|
}else{
|
|||
|
|
|
|||
|
|
info->code_464_ing = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(info->received_data == NEC_CODE_NUM_6)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if(info->code_464_ing == 1)
|
|||
|
|
{
|
|||
|
|
vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
|
|||
|
|
info->code_464_ing = 2;
|
|||
|
|
|
|||
|
|
}else{
|
|||
|
|
|
|||
|
|
info->code_464_ing = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if PROGREMA_DEBUG_MODE
|
|||
|
|
|
|||
|
|
if(info->received_data == NEC_CODE_TIMER)
|
|||
|
|
{
|
|||
|
|
vOxygenEventGroupSetBits(&global_event, EVENT_OK_BLINK);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κβ<CEBA><CEB2><EFBFBD>
|
|||
|
|
queue_item.type = MSG_TYPE_HOUR_SAVE;
|
|||
|
|
queue_item.data.hour_meter.hour = 0;
|
|||
|
|
|
|||
|
|
modify_or_add_queue_node_by_type(&global_queue, MSG_TYPE_HOUR_SAVE, queue_item);
|
|||
|
|
|
|||
|
|
|
|||
|
|
queue_item.type = MSG_TYPE_MINUTE_SAVE;
|
|||
|
|
queue_item.data.hour_meter.minute = 0;
|
|||
|
|
|
|||
|
|
modify_or_add_queue_node_by_type(&global_queue, MSG_TYPE_MINUTE_SAVE, queue_item);
|
|||
|
|
|
|||
|
|
|
|||
|
|
ht24lc02_word_write(7200, INDEX_E4_ELEC_HIGH);
|
|||
|
|
ht24lc02_word_write(20, INDEX_E1_PRESS_LOW);
|
|||
|
|
ht24lc02_word_write(280, INDEX_E2_PRESS_HIGH);
|
|||
|
|
ht24lc02_word_write(180, INDEX_E7_220V_LOW);
|
|||
|
|
|
|||
|
|
filter_item.data.filter_server.last_clean_filter_hours = 0;
|
|||
|
|
filter_item.data.filter_server.last_replace_filter_hours = 0;
|
|||
|
|
filter_item.data.filter_server.clean_filter_time_need_stored = true;
|
|||
|
|
filter_item.data.filter_server.replace_filter_time_need_stored = true;
|
|||
|
|
|
|||
|
|
modify_or_add_queue_node_by_type(&global_queue, MSG_TYPE_FILTER_TIME_SAVE, filter_item);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>صIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @param Cap_Val: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NECЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>8λΪ1<EFBFBD>ֽڣ<EFBFBD>4<EFBFBD>ֽ<EFBFBD>Ϊһ֡<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>У<EFBFBD><EFBFBD>
|
|||
|
|
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULLʱֱ<EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
static void user_infrared_IRQHandle(Infrared* info, uint32_t Cap_Val)
|
|||
|
|
{
|
|||
|
|
if (info == NULL)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
info->pulse_width = nec_calc_pulse_width(info, Cap_Val); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if((info->pulse_width >= NEC_START_FALLING_MIN)&&(info->pulse_width <= NEC_START_FALLING_MAX))
|
|||
|
|
{
|
|||
|
|
memset(info->pulse_width_array, 0, sizeof(info->pulse_width_array));
|
|||
|
|
info->pulse_width_index = 0;
|
|||
|
|
|
|||
|
|
info->ir_state = IR_STATE_WAIT_DATA_END;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
info->pulse_width_array[info->pulse_width_index++] = info->pulse_width;
|
|||
|
|
info->clear_delay = 0;
|
|||
|
|
|
|||
|
|
|
|||
|
|
if(info->pulse_width_index >= 33)
|
|||
|
|
{
|
|||
|
|
info->pulse_width_index = 0;
|
|||
|
|
|
|||
|
|
info->ir_state = IR_STATE_IDLE;
|
|||
|
|
info->ok_count++;
|
|||
|
|
|
|||
|
|
// <20>Խ<EFBFBD><D4BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD><D0BD><EFBFBD>
|
|||
|
|
|
|||
|
|
nec_command_decode(info);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ң<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param info: ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źű<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ų<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10ʱ<EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
|
|||
|
|
* 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULLʱֱ<EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
|
|||
|
|
static void user_infrared_Updata_IRQHandle(Infrared* info)
|
|||
|
|
{
|
|||
|
|
if (info == NULL)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1.<2E><><EFBFBD><EFBFBD><E2B4A6>IDLEģʽ<C4A3><CABD> 2.<2E><><EFBFBD><EFBFBD>IR_STATE_WAIT_DATA_ENDģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>100ms<6D><73>
|
|||
|
|
|
|||
|
|
if((info->ir_state == IR_STATE_IDLE)&&(info->pulse_width_array[0] != 0))
|
|||
|
|
{
|
|||
|
|
memset(info->pulse_width_array, 0, sizeof(info->pulse_width_array));
|
|||
|
|
info->pulse_width_index = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(info->ir_state == IR_STATE_WAIT_DATA_END)
|
|||
|
|
{
|
|||
|
|
if(info->clear_delay >= 2)
|
|||
|
|
{
|
|||
|
|
memset(info->pulse_width_array, 0, sizeof(info->pulse_width_array));
|
|||
|
|
info->pulse_width_index = 0;
|
|||
|
|
|
|||
|
|
info->clear_delay = 0;
|
|||
|
|
info->ir_state = IR_STATE_IDLE;
|
|||
|
|
|
|||
|
|
}else{
|
|||
|
|
|
|||
|
|
info->clear_delay++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief LPTIM32<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @param NONE
|
|||
|
|
* @retval NONE
|
|||
|
|
* @note 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<EFBFBD>־<EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @author jarvis
|
|||
|
|
* @date 2025.11.25
|
|||
|
|
*/
|
|||
|
|
void LPTIM_IRQHandler(void)
|
|||
|
|
{
|
|||
|
|
uint32_t Cap_Val;
|
|||
|
|
|
|||
|
|
if(FL_LPTIM32_IsActiveFlag_CC(LPTIM32, FL_LPTIM32_CHANNEL_3))
|
|||
|
|
{
|
|||
|
|
FL_LPTIM32_ClearFlag_CC(LPTIM32, FL_LPTIM32_CHANNEL_3);
|
|||
|
|
|
|||
|
|
Cap_Val = FL_LPTIM32_ReadCaptureCH3(LPTIM32);
|
|||
|
|
|
|||
|
|
user_infrared_IRQHandle(&infrared_info, Cap_Val); // <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뺯<EFBFBD><EBBAAF>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if(FL_LPTIM32_IsActiveFlag_Update(LPTIM32))
|
|||
|
|
{
|
|||
|
|
FL_LPTIM32_ClearFlag_Update(LPTIM32);
|
|||
|
|
|
|||
|
|
user_infrared_Updata_IRQHandle(&infrared_info); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|