亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? stereo_headset_buttons.c

?? bluelab 3.52 里面的立體聲程序源代碼
?? C
字號:
/*
    This file was autogenerated by buttonparse
*/

#include "stereo_headset_buttons.h"

#include <pio.h>
#include <app/message/system_message.h>
#include <panic.h>
#include <ps.h>
#include <stdlib.h>

enum { internal_timer_message = 0, double_press_timer, pio_external_changed };

static InternalState encode(uint32 pressed)
{
	switch(pressed)
	{
		case (1UL<<6) : return sUP;
		case (1UL<<5) : return sDOWN;
		case (1UL<<3) : return sMFB;
		case (1UL<<7) : return sPLAY_PAUSE;
		case (1UL<<8) : return sFORWARD;
		case (1UL<<10) : return sBACKWARD;
		case (1UL<<8)|(1UL<<10) : return sFORWARD_BACKWARD;
		default : return Unknown;
	}
}

typedef struct
{
	unsigned release:1;
	unsigned double_tap:1;
	unsigned timeout:15;
	MessageId id;
} EnterMessage;

/* Messages sent on state entry */
static const EnterMessage enter_messages_sUP[] = { { 0, 0, 0, BUTTON_VOL_UP } };

static const EnterMessage enter_messages_sDOWN[] = { { 0, 0, 0, BUTTON_VOL_DOWN } };

static const EnterMessage enter_messages_sMFB[] = { { 0, 0, 0, BUTTON_MFB_PRESS },
												{ 1, 0, 0, BUTTON_MFB_SHORT } };

static const EnterMessage enter_messages_sPLAY_PAUSE[] = { { 0, 0, 0, BUTTON_PLAY_PAUSE_PRESS },
												{ 1, 0, 0, BUTTON_PLAY_PAUSE_SHORT },
												{ 0, 1, 200, BUTTON_PLAY_PAUSE_DOUBLE } };

static const EnterMessage enter_messages_sFORWARD[] = { { 0, 0, 0, BUTTON_FORWARD_PRESS },
												{ 1, 0, 0, BUTTON_FORWARD_RELEASE } };

static const EnterMessage enter_messages_sBACKWARD[] = { { 0, 0, 0, BUTTON_BACKWARD_PRESS },
												{ 1, 0, 0, BUTTON_BACKWARD_RELEASE } };

static const struct
{
	uint16 count; const EnterMessage *send;
} enter_messages[] = {
	{ 1, enter_messages_sUP },
	{ 1, enter_messages_sDOWN },
	{ 2, enter_messages_sMFB },
	{ 3, enter_messages_sPLAY_PAUSE },
	{ 2, enter_messages_sFORWARD },
	{ 2, enter_messages_sBACKWARD },
	{ 0, 0 }
};

static void send_enter_messages(PioState *pioState, InternalState state)
{
	uint16 init_count = enter_messages[state].count;
	uint16 count = init_count;
	const EnterMessage *p = enter_messages[state].send;
	while(count--)
	{
		if (p->double_tap)
		{
			if (pioState->double_press == state)
			{
				if (MessageCancelAll(&pioState->task, double_press_timer))
				{
					pioState->store_held = Unknown;
					MessageSend(pioState->client, p->id, 0);
				}
				else
					MessageSendLater(&pioState->task, double_press_timer, 0, p->timeout);
			}
			else
			{
				pioState->double_press = state;
				(void) MessageCancelAll(&pioState->task, double_press_timer);
				MessageSendLater(&pioState->task, double_press_timer, 0, p->timeout);
			}
		}
		else
		if (!p->release)
			MessageSend(pioState->client, p->id, 0);
		else
		{
			pioState->store_held = state;
			pioState->store_count = init_count - (count + 1);
		}
		p++;
	}
}

/* Timed messages to be sent to the client */
typedef struct
{
	unsigned repeat:1;
	unsigned msec:15; /* Limit to 32767ms. Sounds reasonable. */
	unsigned msecRepeat:15;
	unsigned release:1;
	MessageId id;
} TimedMessage;

static const TimedMessage timed_messages_sUP[] =
{
	{ 1, 500, 0, 0, BUTTON_VOL_UP }
};
static const TimedMessage timed_messages_sDOWN[] =
{
	{ 1, 500, 0, 0, BUTTON_VOL_DOWN }
};
static const TimedMessage timed_messages_sMFB[] =
{
	{ 0, 2000, 0, 0, BUTTON_MFB_LONG_HELD },
	{ 0, 2000, 0, 1, BUTTON_MFB_LONG_RELEASE },
	{ 0, 5000, 0, 0, BUTTON_MFB_VERY_LONG }
};
static const TimedMessage timed_messages_sPLAY_PAUSE[] =
{
	{ 0, 2000, 0, 0, BUTTON_PLAY_PAUSE_LONG }
};
static const TimedMessage timed_messages_sFORWARD_BACKWARD[] =
{
	{ 0, 10000, 0, 0, BUTTON_FORWARD_BACKWARD_HELD }
};

static const struct
{
	uint16 count;
	const TimedMessage *send;
} timed_messages[] =
{
	{ 1, timed_messages_sUP },
	{ 1, timed_messages_sDOWN },
	{ 3, timed_messages_sMFB },
	{ 1, timed_messages_sPLAY_PAUSE },
	{ 0, 0 },
	{ 0, 0 },
	{ 1, timed_messages_sFORWARD_BACKWARD }
};

static void send_timed_message(PioState *pioState, const TimedMessage *p, int hold_repeat)
{
	const TimedMessage **m = (const TimedMessage **) PanicNull(malloc(sizeof(const TimedMessage *)));
	*m = p;
	if (hold_repeat)
		MessageSendLater(&pioState->task, internal_timer_message, m, p->msecRepeat);
	else
		MessageSendLater(&pioState->task, internal_timer_message, m, p->msec);
}

static void send_timed_messages(PioState *pioState, InternalState state)
{
	uint16 count = timed_messages[state].count;
	const TimedMessage *p = timed_messages[state].send;
	while(count--) send_timed_message(pioState, p++, 0);
}

static void pioChanged(Task task, PioState *pioState, uint16 pio_bits, uint16 external_bits)
{
	InternalState next;
	uint16 raw_bits = 0;
	uint32 mState = pio_bits | (uint32)external_bits << 16;

	mState &= ~ (1<<13|1<<15);
	raw_bits = (pio_bits & (1<<13|1<<15));
	if (raw_bits != pioState->pio_raw_bits)
	{
		PIO_RAW_T *message = malloc(sizeof(PIO_RAW_T));
		message->pio = raw_bits;
		MessageSend(pioState->client, PIO_RAW, message);
		pioState->pio_raw_bits = raw_bits;
	}
	next = encode(mState);

	if ((pioState->store_held != Unknown) && (next != pioState->store_held))
	{
		uint32 changed = mState ^ pioState->store_bits;
		uint32 released = changed & pioState->store_bits;
		if (released == pioState->store_bits)
		{
			const EnterMessage *p = enter_messages[pioState->store_held].send;
			MessageSend(pioState->client, p[pioState->store_count].id, 0);
		}
		pioState->store_held = Unknown;
	}

	if (pioState->timed_id)
	{
		MessageSend(pioState->client, pioState->timed_id, 0);
		pioState->timed_id = 0;
	}

	(void) MessageCancelAll(task, internal_timer_message);
	if(next != Unknown)
	{
		send_enter_messages(pioState, next);
		send_timed_messages(pioState, next);
	}
	pioState->store_bits = mState;
	pioState->pio_bits = pio_bits;
	pioState->external_bits = external_bits;
}

typedef struct { uint16 xor; uint16 and;} PioExternalMessage;

static void pioHandler(Task task, MessageId id, Message data)
{
	PioState *pioState = (PioState *) task;
	switch(id)
	{
	case internal_timer_message:
	{
		const TimedMessage **m = (const TimedMessage **) data;
		const TimedMessage *p = *m;
		if (p->release)
			pioState->timed_id = p->id;
		else
		{
			MessageSend(pioState->client, p->id, 0);
			pioState->timed_id = 0;
		}
		pioState->store_held = Unknown;
		if(p->repeat)
		{
			if(p->msecRepeat)
				send_timed_message(pioState, p, 1);
			else
				send_timed_message(pioState, p, 0);
		}
	}
	break;
	case MESSAGE_PIO_CHANGED:
	{
		const MessagePioChanged *m = (const MessagePioChanged *)data;
		pioChanged(task, pioState, m->state^pioState->pskey_wakeup, pioState->external_bits);
	}
	break;
	case pio_external_changed:
	{
		const PioExternalMessage *m = (const PioExternalMessage *)data;
		pioChanged(task, pioState, pioState->pio_bits, m->xor ^ (pioState->external_bits & ~m->and));
	}
	break;
	case double_press_timer:
	default:
		break;
	}
}

void pioExternal(PioState *pioState, uint16 external_and, uint16 external_xor)
{
	PioExternalMessage *m = malloc(sizeof(PioExternalMessage));

	m->xor = external_xor;
	m->and = external_and;
	MessageSend(&pioState->task, pio_external_changed, m);
}

void pioInit(PioState *pioState, Task client)
{
	MessagePioChanged *m = malloc(sizeof(MessagePioChanged));
	uint16 pio_get = PioGet();
	uint16 pskey_wakeup = 0xFFFF;
	PsFullRetrieve(PSKEY_PIO_WAKEUP_STATE, &pskey_wakeup, sizeof(pskey_wakeup));

	pskey_wakeup = ~pskey_wakeup;
	pioState->task.handler = pioHandler;
	pioState->client       = client;
	pioState->store_held = Unknown;
	pioState->double_press = Unknown;
	pioState->store_count = 0;
	pioState->store_bits = 0;
	pioState->pio_bits = 0;
	pioState->external_bits = 0;
	pioState->timed_id = 0;
	pioState->pskey_wakeup = pskey_wakeup;
	(void) MessagePioTask(&pioState->task);
	PioDebounce((1<<3)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<10)|(1<<13)|(1<<15), 2, 20);

	pioState->pio_raw_bits = ~(pio_get^pskey_wakeup) & ((1<<13)|(1<<15));

	m->state = pio_get & ((1<<3)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<10)|(1<<13)|(1<<15));
	m->time  = 0;
	MessageSend(&pioState->task, MESSAGE_PIO_CHANGED, m);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲aaa精品| 国内精品视频666| 一级日本不卡的影视| 一区二区国产盗摄色噜噜| 亚洲综合无码一区二区| 亚洲自拍另类综合| 一区二区三区日韩| 五月婷婷综合网| 久久国产三级精品| 国产suv精品一区二区三区| 91丨国产丨九色丨pron| 欧美精品高清视频| 精品91自产拍在线观看一区| 欧美激情在线免费观看| 亚洲国产一区二区三区青草影视| 免费观看成人av| 大白屁股一区二区视频| 欧美日韩一二三区| 国产精品初高中害羞小美女文| 亚洲成人黄色影院| 丁香天五香天堂综合| 欧美一卡2卡三卡4卡5免费| 自拍视频在线观看一区二区| 国内精品视频一区二区三区八戒| 欧美午夜影院一区| 一区二区三区在线影院| 国产suv一区二区三区88区| 日韩精品在线一区| 日本午夜一本久久久综合| 欧美日韩三级在线| 一区二区三区在线免费观看| 美女网站色91| 欧美日韩精品是欧美日韩精品| 一区二区三区在线视频免费| 色88888久久久久久影院按摩| 国产精品久久久久久妇女6080| 国产麻豆成人传媒免费观看| 精品播放一区二区| 国产成人综合在线观看| 中文字幕欧美国产| av中文字幕亚洲| 亚洲欧美成人一区二区三区| 色婷婷久久久综合中文字幕| 中文字幕精品综合| 福利一区在线观看| 亚洲视频在线观看三级| 欧洲亚洲国产日韩| 天天影视色香欲综合网老头| 日韩午夜小视频| 精品一区二区三区久久久| 久久―日本道色综合久久| 成人综合婷婷国产精品久久免费| 亚洲天堂免费在线观看视频| 91九色02白丝porn| 男男gaygay亚洲| 国产精品天干天干在线综合| 日本韩国欧美一区| 久久精品国产色蜜蜜麻豆| 国产精品久久久久婷婷二区次| 色狠狠色噜噜噜综合网| 九色综合狠狠综合久久| 亚洲国产精品ⅴa在线观看| 在线观看视频欧美| 国产麻豆日韩欧美久久| 一区二区高清免费观看影视大全 | 国产一区二区不卡老阿姨| 欧美高清在线精品一区| 在线不卡中文字幕| 成人午夜短视频| 蜜桃精品视频在线观看| 综合久久久久综合| 久久影院午夜论| 欧美精品电影在线播放| 色综合视频一区二区三区高清| 国产在线视频不卡二| 麻豆精品蜜桃视频网站| 一区二区三区精品视频在线| 国产婷婷色一区二区三区四区| 欧美日韩中文一区| 91麻豆免费观看| 成人中文字幕在线| 国产一区二区三区免费| 日韩av一二三| 日韩综合一区二区| 亚洲图片欧美色图| 亚洲国产一区二区三区青草影视| 国产精品美女一区二区三区 | 国产精品网站在线观看| 国产欧美一区二区精品性色超碰| 欧美一区三区四区| 91麻豆精品国产91久久久 | 欧美最猛性xxxxx直播| 99国内精品久久| av在线播放不卡| 91色porny在线视频| 日本韩国欧美三级| 欧美日韩大陆在线| 精品国产第一区二区三区观看体验 | 久久久久国产精品免费免费搜索| 久久久国产精品午夜一区ai换脸| 国产亚洲人成网站| 中文字幕欧美一| 亚洲综合色婷婷| 欧美96一区二区免费视频| 国产麻豆精品久久一二三| av中文一区二区三区| 欧美精品自拍偷拍动漫精品| 精品久久久久香蕉网| 中文字幕高清不卡| 三级影片在线观看欧美日韩一区二区 | 欧美丰满少妇xxxxx高潮对白| 日韩欧美中文字幕精品| 综合色中文字幕| 日韩影院免费视频| 成人中文字幕合集| 91精品久久久久久久99蜜桃| 国产无一区二区| 亚洲午夜精品网| 国产精品夜夜爽| 欧美高清一级片在线| 国产视频不卡一区| 秋霞电影一区二区| 99久久精品免费看国产| 在线播放国产精品二区一二区四区 | 亚洲精品写真福利| 九色porny丨国产精品| 在线视频一区二区三区| 国产午夜精品福利| 麻豆国产欧美一区二区三区| 91黄色免费版| 国产精品国产三级国产三级人妇 | 中文在线资源观看网站视频免费不卡| 亚洲一区二区三区自拍| 不卡影院免费观看| 久久综合久久综合久久综合| 首页亚洲欧美制服丝腿| 色综合av在线| 国产精品麻豆久久久| 国产成人亚洲综合色影视| 日韩一区二区三区免费观看| 亚洲午夜精品在线| 日韩美一区二区三区| 亚洲精品欧美激情| 色婷婷av一区二区三区软件 | 日本91福利区| 欧美一级片在线看| 蜜臀久久99精品久久久久久9 | 欧美日韩二区三区| 视频一区视频二区在线观看| 欧美三级欧美一级| 亚洲大尺度视频在线观看| 91 com成人网| 国产在线日韩欧美| 欧美国产综合一区二区| 91在线小视频| 五月婷婷欧美视频| 精品国产伦一区二区三区观看体验 | 人人狠狠综合久久亚洲| 欧美一级精品大片| 国产精品自拍在线| 国产精品不卡一区二区三区| 95精品视频在线| 亚洲一级不卡视频| 日韩欧美在线网站| 国产成人免费视频| 亚洲五月六月丁香激情| 精品国产制服丝袜高跟| 国产不卡视频在线播放| 亚洲一区在线视频| 久久毛片高清国产| 欧洲国内综合视频| 国产在线播放一区二区三区| 亚洲美女少妇撒尿| 国产午夜亚洲精品午夜鲁丝片 | 国产精品一级片| 亚洲一区二区四区蜜桃| wwww国产精品欧美| 欧洲色大大久久| 成人动漫一区二区| 狠狠色丁香婷综合久久| 一区二区三区精品在线| 国产亚洲精品资源在线26u| 欧美日韩午夜在线| 成人高清视频在线观看| 另类欧美日韩国产在线| 亚洲色图制服诱惑| 日韩欧美视频一区| 不卡的av中国片| 国产在线播精品第三| 亚洲成av人片在线| 中文字幕一区二区三区四区| 日韩视频在线永久播放| 91麻豆国产香蕉久久精品| 久久国产剧场电影| 亚洲一区在线视频| 久久亚洲欧美国产精品乐播| 日本丰满少妇一区二区三区| 国产91高潮流白浆在线麻豆 | 高清不卡一区二区| 美腿丝袜一区二区三区|