📄 practical_joke.c
字号:
#include "cc2511_app_ex_lib_headers.h"
#include "simple_hid_eb.h"
#include "RF04EB.h"
#include "lcd.h"
#define NUMBER_OF_MENY_ITEMS 3
#define TEXT1_WRITE_TO_SCRN 0
#define TEXT1_SHAKING_MICE 1
#define TEXT1_ALT_TAB 2
#define TEXT2_START 0
#define TEXT2_STOP 1
#define TEXT2_SENDING 2
#define TEXT2_ALT_TAB 3
const __code char pjLcdInit[2][16] = {{'U', 's', 'e', ' ', 'J', 'o', 'y', 's', 't', 'i', 'c', 'k', ' ', 't', 'o', ' '},
{'t', 'o', ' ', 's', 'e', 'l', 'e', 'c', 't', ' ', 'j', 'o', 'k', 'e', ' ', ' '}};
char __code const pjLcdMenuLine1[3][16] = {{'W', 'r', 'i', 't', 'e', ' ', 't', 'o', ' ', 's', 'c', 'r', 'e', 'e', 'n', ' '},
{'M', 'o', 'v', 'i', 'n', 'g', ' ', 'm', 'i', 'c', 'e', ' ', ' ', ' ', ' ', ' '},
{'C', 'h', 'a', 'n', 'g', 'e', ' ', 'W', 'i', 'n', 'd', 'o', 'w', ' ', ' ', ' '}};
char __code const pjLcdMenuLine2[4][16] = {{'S', '1', ' ', 't', 'o', ' ', 's', 't', 'a', 'r', 't', ' ', ' ', ' ', ' ', ' '},
{'S', '1', ' ', 't', 'o', ' ', 's', 't', 'o', 'p', ' ', ' ', ' ', ' ', ' ', ' '},
{'S', 'e', 'n', 'd', 'i', 'n', 'g', '.', '.', '.', ' ', ' ', ' ', ' ', ' ', ' '},
{'A', 'L', 'T', '-', 'T', 'A', 'B', ' ', 'P', 'u', 's', 'h', ' ', 'S', '1', ' '}};
BYTE __code const pjTextToSend[] = {HID_RETURN, HID_RETURN, HID_A, HID_N, HID_Y, HID_B, HID_O, HID_D, HID_Y, HID_SPACEBAR, HID_H, HID_O, HID_M, HID_E, HID_RETURN};
void pjChangeLcdText(BYTE selectedFunction);
void pjPerformeAction(BYTE selectedFunction);
void pjSendPacket(void);
extern RF_PACKET __xdata * pRfTxBuffer;
extern volatile BOOL radioReadyToSend;
extern BYTE dongleAddress; //device address of the USB dongle.
extern volatile BOOL ackTimeout;
void practicalJoke(void)
{
JOYSTICK_DIRECTION prevJoyDir;
JOYSTICK_DIRECTION lastThreeJoyDir[3];
BYTE selectedFunction;
lcdUpdate((__xdata char *) &pjLcdInit[0][0], (__xdata char *) &pjLcdInit[1][0]);
radioReadyToSend = TRUE;
selectedFunction = 0;
while(getPotValue() > POT_EXIT_PJ) //check if potentiometer is turned anticlockwise
{
lastThreeJoyDir[2] = lastThreeJoyDir[1];//Joystick is analog and may be unstable, want three equal before excepting
lastThreeJoyDir[1] = lastThreeJoyDir[0];
lastThreeJoyDir[0] = getJoystickDirection();
if((lastThreeJoyDir[2] == lastThreeJoyDir[1]) && (lastThreeJoyDir[1] == lastThreeJoyDir[0]))
{
switch (lastThreeJoyDir[0])
{
case UP :
if(prevJoyDir == CENTRED)
{
if(selectedFunction > 0) { selectedFunction--; }
else { selectedFunction = NUMBER_OF_MENY_ITEMS - 1; }
pjChangeLcdText(selectedFunction);
}
prevJoyDir = UP;
break;
case DOWN :
if(prevJoyDir == CENTRED)
{
if(selectedFunction < NUMBER_OF_MENY_ITEMS - 1) { selectedFunction++; }
else { selectedFunction = 0; }
pjChangeLcdText(selectedFunction);
}
prevJoyDir = DOWN;
break;
default :
prevJoyDir = CENTRED;
break;
}
}
if(buttonPushed())
{
pjPerformeAction(selectedFunction);
}
halWait(1);
}
rfruStopRadio();
radioReadyToSend = TRUE;
ackTimeout = FALSE;
}
void pjChangeLcdText(BYTE selectedFunction)
{
switch (selectedFunction)
{
case 0 :
lcdUpdate((__xdata char *) &pjLcdMenuLine1[TEXT1_WRITE_TO_SCRN][0], (__xdata char *) &pjLcdMenuLine2[TEXT2_START][0]);
break ;
case 1:
lcdUpdate((__xdata char *) &pjLcdMenuLine1[TEXT1_SHAKING_MICE][0], (__xdata char *) &pjLcdMenuLine2[TEXT2_START][0]);
break;
case 2:
lcdUpdate((__xdata char *) &pjLcdMenuLine1[TEXT1_ALT_TAB][0], (__xdata char *) &pjLcdMenuLine2[TEXT2_ALT_TAB][0]);
break;
}
}
void pjPerformeAction(BYTE selectedFunction)
{
BYTE i;
switch (selectedFunction)
{
case 0 :
lcdUpdateLine(LINE2, (__xdata char *) &pjLcdMenuLine2[TEXT2_SENDING][0]);
//write text to screen
pRfTxBuffer->length = 9; //3 byte payload and 6 byte header (required by RF module)
pRfTxBuffer->destAddress = dongleAddress;
pRfTxBuffer->flag = RF_ACK_REQUEST;
pRfTxBuffer->data[0] = KEYBORD_DATA;//we are sending keyboard data.
pRfTxBuffer->data[1] = 0;
for(i = 0; i < sizeof(pjTextToSend); i++)
{
pRfTxBuffer->data[2] = pjTextToSend[i];
pjSendPacket();
halWait(5);
}
lcdUpdateLine(LINE2, (__xdata char *) &pjLcdMenuLine2[TEXT2_START][0]);
break ;
case 1:
lcdUpdateLine(LINE2, (__xdata char *) &pjLcdMenuLine2[TEXT2_STOP][0]);
pRfTxBuffer->length = 11; //5 byte payload and 6 byte header (required by RF module)
pRfTxBuffer->destAddress = dongleAddress;
pRfTxBuffer->flag |= RF_ACK_REQUEST;
pRfTxBuffer->data[0] = MICE_DATA;//we are sending mice data.
pRfTxBuffer->data[1] = 0;
pRfTxBuffer->data[2] = 0x02;
pRfTxBuffer->data[3] = 0;
pRfTxBuffer->data[4] = 0;
while(!buttonPushed())
{
pjSendPacket();
}
lcdUpdateLine(LINE2, (__xdata char *) &pjLcdMenuLine2[TEXT2_START][0]);
break;
case 2:
lcdUpdateLine(LINE2, (__xdata char *) &pjLcdMenuLine2[TEXT2_SENDING][0]);
pRfTxBuffer->length = 9; //3 byte payload and 6 byte header (required by RF module)
pRfTxBuffer->destAddress = dongleAddress;
pRfTxBuffer->flag = RF_ACK_REQUEST;
pRfTxBuffer->data[0] = KEYBORD_DATA;//we are sending keyboard data.
pRfTxBuffer->data[1] = 0x04;//left Alt
pRfTxBuffer->data[2] = HID_TAB;
pjSendPacket();
lcdUpdateLine(LINE2, (__xdata char *) &pjLcdMenuLine2[TEXT2_ALT_TAB][0]);
break;
}
}
void pjSendPacket(void)
{
BYTE retries;
for(retries = 0; retries < 30; retries++)
{
radioReadyToSend = FALSE;
rfruSendDataPacket(pRfTxBuffer);//send packet.
while((radioReadyToSend == FALSE) && (ackTimeout == FALSE));//wait for ack or ack timeout
if(ackTimeout)
{
halWait(2);
rfruSendDataPacket(pRfTxBuffer);//retry
ackTimeout = FALSE;
}
else
{
retries = 30;//packet sent, exit retry loop
}
}
radioReadyToSend = TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -