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

📄 practical_joke.c

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