remote_Panasonic.c 4.5 KB
#include "os_config.h"

#include "c_def.h"
#include "debug.h"
#include "oem.h"

#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_ENABLE

#ifdef REMOTE_PANASONIC_FORMAT
void app_ir_message_send(int level, U32 time)   __INTERNAL_RAM_TEXT;
//#define SWAP_HIG_BIT_TO_LOW_BIT

#ifdef SWAP_HIG_BIT_TO_LOW_BIT
#define PANASONIC_MARK_CODE 0x2002
#define PAPASONICS_MODE1 0xA00050F
#define PAPASONICS_MODE2 0xA00151F
#else
#define PANASONIC_MARK_CODE 0x4004
#define PAPASONICS_MODE1 0x5000A0F
#define PAPASONICS_MODE2 0x5008A8F
#endif


//Counter incr = RC_TB_DEN/RC_TB_NUM

#define LEADER_ON_PULSE_MIN (3500 - 350)
#define LEADER_ON_PULSE_MAX (3500 + 350)
#define LEADER_OFF_PULSE_MIN (1700 - 170)
#define LEADER_OFF_PULSE_MAX (1700 + 170)
#define LEADER_2T_PULSE_MIN (1200 - 120)
#define LEADER_2T_PULSE_MAX (1200 + 120)
#define LEADER_1T_PULSE_MIN (400 - 40)
#define LEADER_1T_PULSE_MAX (400 + 40)

#define LEADER_REPTAT_PULSE_MIN (1200 - 220)
#define LEADER_REPTAT_PULSE_MAX (1200 + 220)


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,%x\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 > LEADER_ON_PULSE_MIN && pulse_width < LEADER_ON_PULSE_MAX)
		{
			remote_state = RC_LEADER_OFF;
#ifdef REMOTE_CONTROL_DEBUG
			DBG_Puts("RC L On ok\n\r");
#endif
		}
		else
		{
			remote_state = RC_IDLE;
			remote_repeat_valid = FALSE;
#ifdef REMOTE_CONTROL_DEBUG
			DBG_RMTPrintf("RC L On Err:%d\n\r", pulse_width);
#endif
		}
		break;

	case RC_LEADER_OFF:
		if (pulse_width > LEADER_OFF_PULSE_MIN && pulse_width < LEADER_OFF_PULSE_MAX)
		{
			remote_state = RC_DATA;
			data = 0;

			count = 0;

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

	case RC_DATA:
		if (!level)
			break;

		count++;

		if (pulse_width > LEADER_1T_PULSE_MIN && pulse_width < LEADER_1T_PULSE_MAX)
		{
#ifdef SWAP_HIG_BIT_TO_LOW_BIT
//empty
#else
			data <<= 1;
#endif
		}
		else
		{
			if (pulse_width > LEADER_2T_PULSE_MIN && pulse_width < LEADER_2T_PULSE_MAX)
			{
#ifdef SWAP_HIG_BIT_TO_LOW_BIT
				data = (data | (1 << (count - 17)));
#else
				data = (data << 1) | 1;
#endif
			}
			else
			{
				remote_state = RC_IDLE;
				remote_repeat_valid = FALSE;

#ifdef REMOTE_CONTROL_DEBUG
				DBG_RMTPrintf("panasonic Data Err:%d\n\r", pulse_width);
#endif

				break;
			}
		}
		if (count == 16)
		{
#ifdef SWAP_HIG_BIT_TO_LOW_BIT
			data >>= 16;
#endif
			if (data != PANASONIC_MARK_CODE)
			{
#ifdef REMOTE_KEY_VALUE_DEBUG
				DBG_Printf("customer code err:0x%x\n\r", data);
#endif

				remote_state = RC_IDLE;
				remote_data = APP_KEY_INVALID;

				break;
			}
			else
			{
#ifdef REMOTE_KEY_VALUE_DEBUG
				DBG_RMTPrintf("customer code ok:0x%x\n\r", data);
#endif
			}

			data = 0;
		}
		if (count == 48)
		{
			if (remote_repeat_valid)
			{
#ifdef REMOTE_KEY_VALUE_DEBUG
				DBG_RMTPrintf("PANASONIC Data:0x%x\n\r", data);
#endif
				remote_state = RC_DATA_END;
				if ((remote_data == data))
				{
					app_timer_remoteKeyUpTimer_set(175);

#ifdef REMOTE_CONTROL_DEBUG
					DBG_Puts("P RPT\n\r");
#endif
				}
				else
				{

					app_timer_remoteKeyUpTimer_set(25);
					remote_repeat_valid = FALSE;

#ifdef REMOTE_CONTROL_DEBUG
					DBG_Puts("P RPT err\n\r");
#endif
				}
			}
			else
			{
#ifdef REMOTE_KEY_VALUE_DEBUG
				DBG_RMTPrintf("Pansonic Data:0x%x\n\r", data);
#endif
				if ((data == PAPASONICS_MODE1) || (data == PAPASONICS_MODE2))
				{
					if (data == PAPASONICS_MODE1)
					{
						//mode1
						//DBG_Printf("Panasonic IR MODE 1\n\r");
					}
					else
					{
						//mode2
						//DBG_Printf("Panasonic IR MODE 2\n\r");
					}
				}
				remote_state = RC_DATA_END;

				remote_repeat_valid = TRUE;
				remote_data = data;

				app_ir_keypress(data);
			}
		}
		break;

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

	default:
		remote_state = RC_IDLE;
		break;
	}
}

#endif //REMOTE_MIXED_FORMAT

#endif //REMOTE_ENABLE