remote_nec.c 3.74 KB
#include "c_def.h"
#include "debug.h"
#include "oem.h"

#ifdef REMOTE_ENABLE

#include "regmap.h"

//#include "interrupt.h"
//#include "hw_gpio.h"
//#include "hw_timer.h"

//#include "app_gpio.h"
#include "remote.h"
#include "message.h"
#include "key_scan.h"
#include "app_main.h"
//#include "oem_string.h"
//#include <string.h>
#include "app_key.h"
//#include "app_ver.h"
//#include "hw_pll.h"
#include "mem_reloc.h"

#ifdef REMOTE_NEC_FORMAT


#define REMOTE_KEY_VALUE_DEBUG

void app_ir_message_send(int level, U32 time)   __INTERNAL_RAM_TEXT;

#if 0
#define LEADER_ON_PULSE_MIN (9000 - 900)
#define LEADER_ON_PULSE_MAX (9000 + 900)
#define LEADER_OFF_PULSE_MIN (4500 - 450)
#define LEADER_OFF_PULSE_MAX (4500 + 450)
#define LEADER_2T_PULSE_MIN (1600 - 160)
#define LEADER_2T_PULSE_MAX (1600 + 160)
#define LEADER_1T_PULSE_MIN (550 - 55)
#define LEADER_1T_PULSE_MAX (550 + 55)

#define LEADER_REPTAT_PULSE_MIN (2200 - 220)
#define LEADER_REPTAT_PULSE_MAX (2200 + 220)
#else
#define D_PERCENTS 10

#define LEADER_ON_PULSE REMOTE_TIME_US(9000)

#define LEADER_OFF_PULSE REMOTE_TIME_US(4500)

#define LEADER_2T_PULSE REMOTE_TIME_US(1600)

#define LEADER_1T_PULSE REMOTE_TIME_US(550)

#define LEADER_REPTAT_PULSE REMOTE_TIME_US(2200)
#endif

//static U32 pulse_width;

void app_ir_message_send(int level, U32 time)
{
	volatile U32 pulse_width;
	static U8 count;
	static U32 data;
#ifdef REMOTE_CONTROL_DEBUG
	DBG_Printf("IR_Message:%d,%d\n", level, time);
#endif

	pulse_width = time;// * RC_TB_VAL;

	switch (remote_state)
	{
	case RC_IDLE:
		if (!level)
		{
			remote_state = RC_LEADER_ON;
		}
		else
		{
			break;
		}

	case RC_LEADER_ON:
		if (pulse_width >= DOWN_TH(LEADER_ON_PULSE,D_PERCENTS) && pulse_width <= UP_TH(LEADER_ON_PULSE,D_PERCENTS))
		{
			remote_state = RC_LEADER_OFF;
#ifdef REMOTE_CONTROL_DEBUG
			DBG_Puts("RC L On ok\n\r");
#endif
		}
		else
		{
			remote_state = RC_IDLE;
#ifdef REMOTE_CONTROL_DEBUG
			DBG_RMTPrintf("RC L On Err:%d\n\r", pulse_width);
#endif
		}
		break;

	case RC_LEADER_OFF:
		if (pulse_width >= DOWN_TH(LEADER_OFF_PULSE,D_PERCENTS) && pulse_width <= UP_TH(LEADER_OFF_PULSE,D_PERCENTS))
		{
			remote_state = RC_DATA;
			data = 0;

			count = 0;
			remote_repeat_valid = FALSE;

#ifdef REMOTE_CONTROL_DEBUG
			DBG_Puts("RC L Off ok\n\r");
#endif
		}
		else
		{
			if (!level)
				break;

			if (pulse_width >= DOWN_TH(LEADER_REPTAT_PULSE,D_PERCENTS) && pulse_width <= UP_TH(LEADER_REPTAT_PULSE,D_PERCENTS))
			{
				if (remote_repeat_valid)
				{
					app_timer_remoteKeyUpTimer_set(150);
				}

#ifdef REMOTE_CONTROL_DEBUG
				DBG_Puts("RC RPT ok\n\r");
#endif
			}
			else
			{
#ifdef REMOTE_CONTROL_DEBUG
				DBG_RMTPrintf("RC L Off or RPT Err:%d\n\r", pulse_width);
#endif
			}

			remote_state = RC_DATA_END;
		}
		break;

	case RC_DATA:
		if (!level)
			break;
		count++;

		if (pulse_width >= DOWN_TH(LEADER_1T_PULSE,D_PERCENTS) && pulse_width <= UP_TH(LEADER_1T_PULSE,D_PERCENTS))
		{
			data <<= 1;
		}
		else
		{
			if (pulse_width >= DOWN_TH(LEADER_2T_PULSE,D_PERCENTS) && pulse_width <= UP_TH(LEADER_2T_PULSE,D_PERCENTS))
			{
				data = (data << 1) | 1;
			}
			else
			{
				remote_state = RC_IDLE;
				remote_repeat_valid = FALSE;

#ifdef REMOTE_CONTROL_DEBUG
				DBG_RMTPrintf("RC Data Err:%d %d %d\n\r", pulse_width,DOWN_TH(LEADER_1T_PULSE,D_PERCENTS),UP_TH(LEADER_1T_PULSE,D_PERCENTS));
#endif

				break;
			}
		}

		if (count == 32)
		{
			remote_state = RC_DATA_END;

#ifdef REMOTE_KEY_VALUE_DEBUG
			DBG_RMTPrintf("Custom-Data:0x%x\n\r", data);
#endif
			remote_repeat_valid = TRUE;

			app_ir_keypress(data);
		}
		break;

	case RC_DATA_END:
#ifdef REMOTE_CONTROL_DEBUG
		DBG_RMTPrintf("RC Data End:%d\n\r", pulse_width);
#endif
		remote_state = RC_IDLE;

	default:
		remote_state = RC_IDLE;
		break;
	}
}


#endif //REMOTE_NEC_FORMAT

#endif //REMOTE_ENABLE