📄 ctrl_handler.c
字号:
#include "cc2511_app_ex_lib_headers.h"
#include "winamp_remote_control.h"
#include "RF04EB.h"
void ctrlInit(void) {
INIT_JOYSTICK();
INIT_BUTTON();
INIT_POT();
INIT_JOYSTICK_PUSH();
t4mgrSetupCallback(25, ctrlCheckInputCallback);
} // ctrlInit
void ctrlEnqueue(BYTE command, BYTE value) {
WINAMP_CONTROL_DATA __xdata *pWaCtrlData;
pWaCtrlData = (WINAMP_CONTROL_DATA __xdata *) fifoStartEnqueue(0);
pWaCtrlData->command = command;
pWaCtrlData->value = value;
fifoFinishedEnqueue(0);
} // ctrlEnqueue
void ctrlCheckJoystick(void) {
static UINT8 firstBackoff = JOYSTICK_FIRST_BACKOFF_DURATION;
static UINT8 repeatBackoff = JOYSTICK_REPEAT_BACKOFF_DURATION;
static BYTE lastCommand = DONGLE_CMD_NONE;
BYTE command;
switch (getJoystickDirection()) {
case LEFT :
command = DONGLE_CMD_REW5S;
break;
case RIGHT :
command = DONGLE_CMD_FFWD5S;
break;
case UP :
command = DONGLE_CMD_PREVIOUS_TRACK;
break;
case DOWN :
command = DONGLE_CMD_NEXT_TRACK;
break;
case CENTRED :
command = DONGLE_CMD_NONE;
break;
}
if (command != DONGLE_CMD_NONE) {
// Use any "positive edge" to reset the backoff mechanism
if (lastCommand == DONGLE_CMD_NONE) {
firstBackoff = JOYSTICK_FIRST_BACKOFF_DURATION;
repeatBackoff = JOYSTICK_REPEAT_BACKOFF_DURATION;
// Require two equal samples...
} else if (command == lastCommand) {
// First command
if (firstBackoff) {
if (firstBackoff == JOYSTICK_FIRST_BACKOFF_DURATION) {
ctrlEnqueue(command, 0);
}
firstBackoff--;
// Repeat command
} else {
if (repeatBackoff == JOYSTICK_REPEAT_BACKOFF_DURATION) {
ctrlEnqueue(command, 0);
}
if (repeatBackoff) {
repeatBackoff--;
} else {
repeatBackoff = JOYSTICK_REPEAT_BACKOFF_DURATION;
}
}
}
}
lastCommand = command;
} // ctrlCheckJoystick
void ctrlCheckButtons(void) {
static BYTE lastStatus = 0x00;
// S1 button toggles SHUFFLE
if (BUTTON_PRESSED()) {
if (!(lastStatus & CTRL_BUTTON_PUSHED_BM)) {
ctrlEnqueue(DONGLE_SET_SHUFFLE, !(waDispData.state & WDD_STATE_SHUFFLE_BM));
}
lastStatus |= CTRL_BUTTON_PUSHED_BM;
} else {
lastStatus &= ~CTRL_BUTTON_PUSHED_BM;
}
// Joystick button toggles PLAY/PAUSE
if (JOYSTICK_PRESSED()) {
if (!(lastStatus & CTRL_JOYSTICK_PUSHED_BM)) {
ctrlEnqueue((waDispData.state & WDD_STATE_PLAYING_BM) ? DONGLE_CMD_PAUSE : DONGLE_CMD_PLAY, 0);
}
lastStatus |= CTRL_JOYSTICK_PUSHED_BM;
} else {
lastStatus &= ~CTRL_JOYSTICK_PUSHED_BM;
}
} // ctrlCheckButtons
void ctrlCheckPotmeter(void) {
static INT16 lastValue = 0x00;
INT16 value;
//check potmeter
value = getPotValue();
// Has the volume changed?
if (((value - lastValue) > POTMETER_REQUIRED_DELTA) ||
((lastValue - value) > POTMETER_REQUIRED_DELTA) ||
((lastValue != value) && ((value == POTMETER_MIN_VALUE) || (value == POTMETER_MAX_VALUE)))) {
// Store the value for the next round
lastValue = value;
// Convert the potmeter value to Winamp volume
if (value < POTMETER_MIN_VALUE) value = POTMETER_MIN_VALUE;
if (value > POTMETER_MAX_VALUE) value = POTMETER_MAX_VALUE;
value -= POTMETER_MIN_VALUE;
value *= 255;
value /= POTMETER_MAX_VALUE - POTMETER_MIN_VALUE;
// Update the LCD display
rcData.volume = value;
rcData.refreshVolume = TRUE;
// Tell winamp
ctrlEnqueue(DONGLE_SET_VOLUME, value);
}
} // ctrlCheckPotmeter
void ctrlCheckInputCallback(void) {
static BYTE state = CTRL_STATE_JOYSTICK;
switch (state) {
case CTRL_STATE_JOYSTICK:
ctrlCheckJoystick();
state = CTRL_STATE_BUTTONS;
break;
case CTRL_STATE_BUTTONS:
ctrlCheckButtons();
state = CTRL_STATE_POTMETER;
break;
default:
ctrlCheckPotmeter();
state = CTRL_STATE_JOYSTICK;
break;
}
} // ctrlSampleCallback
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -