⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctrl_handler.c

📁 reference about wireless design which is helpful to everyone
💻 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 + -