Now with added rickrolling. A program to mess with people. Intended for small boards with built in USB sockets that connect direct to the CPU and can easily be hidden behind a computer (e.g. the mBuino).

Dependencies:   USBDevice mbed

Pretends to be a USB mouse and keyboard and has some predefined functions for various things (do a google image search on a set keyword every 5 minutes, move the mouse in a circle, keep turning the capslock key on etc...)

The default is to rickroll the user. It turns caps lock on, when the user turns it off again the program will turns the volume up to max and load a youtube video of Rick Astley. For the next 45 seconds the mouse will do some circles to make it harder to stop the video. It will then wait 10 minutes and loop back to the start.

As google used to say: Don't be evil. But there is nothing wrong with being a little bit naughty.

Committer:
AndyA
Date:
Thu Jan 14 17:00:53 2016 +0000
Revision:
2:15eab46e805b
Parent:
1:f2747e954f10
Added max volume command. Changed default to rickrolling when they turn capslock off.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 0:499d030c3e22 1 #include "mbed.h"
AndyA 0:499d030c3e22 2 #include "USBMouseKeyboard.h"
AndyA 1:f2747e954f10 3 #include "searchText.h"
AndyA 0:499d030c3e22 4
AndyA 1:f2747e954f10 5
AndyA 1:f2747e954f10 6 /*
AndyA 1:f2747e954f10 7 Magic key combos
AndyA 0:499d030c3e22 8
AndyA 1:f2747e954f10 9 r + logo - open run box
AndyA 1:f2747e954f10 10 m + logo - minimise all
AndyA 1:f2747e954f10 11 m + logo + shift - maximise all
AndyA 1:f2747e954f10 12 right arrow + logo + shift - move current window right one monitor
AndyA 1:f2747e954f10 13 l + logo - lock screen
AndyA 1:f2747e954f10 14 */
AndyA 0:499d030c3e22 15
AndyA 1:f2747e954f10 16 #define KEY_ENTER 0x0a
AndyA 0:499d030c3e22 17
AndyA 0:499d030c3e22 18 // turn off all LEDs (some boards they glow a bit if you don't).
AndyA 0:499d030c3e22 19 // you may need to remove some depending on the board.
AndyA 1:f2747e954f10 20 //BusOut LEDs(LED1, LED2, LED3, LED4, LED5, LED6, LED7);
AndyA 1:f2747e954f10 21 int LEDs;
AndyA 1:f2747e954f10 22 USBMouseKeyboard keyboard;
AndyA 1:f2747e954f10 23
AndyA 1:f2747e954f10 24
AndyA 1:f2747e954f10 25 /// Run image searches at interval seconds for given number of repeats or -1 to run forever
AndyA 1:f2747e954f10 26 void startSearches(float interval, int number);
AndyA 1:f2747e954f10 27
AndyA 2:15eab46e805b 28 void runCommand(char *address);
AndyA 2:15eab46e805b 29
AndyA 1:f2747e954f10 30 // enter a keyboard string
AndyA 1:f2747e954f10 31 void sendString(const char *str);
AndyA 1:f2747e954f10 32
AndyA 1:f2747e954f10 33 // draw a mouse circle
AndyA 1:f2747e954f10 34 void drawCircle(float radius, float time, bool dir=true);
AndyA 1:f2747e954f10 35
AndyA 1:f2747e954f10 36 // draw a mouse line
AndyA 1:f2747e954f10 37 void drawLine(float length, float time, bool horizontal=true, bool direction=true);
AndyA 1:f2747e954f10 38
AndyA 1:f2747e954f10 39 // Turn caps lock on n seconds after they turn it off.
AndyA 1:f2747e954f10 40 void forceCaps(float delay, float checkPeriod=0.5);
AndyA 1:f2747e954f10 41
AndyA 2:15eab46e805b 42 void maxVolume();
AndyA 2:15eab46e805b 43 void capsOn();
AndyA 1:f2747e954f10 44
AndyA 1:f2747e954f10 45 main()
AndyA 1:f2747e954f10 46 {
AndyA 1:f2747e954f10 47 LEDs = 0;
AndyA 1:f2747e954f10 48 wait(10);
AndyA 1:f2747e954f10 49 while (true) {
AndyA 2:15eab46e805b 50 capsOn();
AndyA 2:15eab46e805b 51 while ((keyboard.lockStatus() & 0x02) == 0x02) {
AndyA 2:15eab46e805b 52 wait(1);
AndyA 2:15eab46e805b 53 }
AndyA 2:15eab46e805b 54 maxVolume();
AndyA 2:15eab46e805b 55 runCommand("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
AndyA 2:15eab46e805b 56 drawCircle(80,15);
AndyA 2:15eab46e805b 57 drawCircle(100,15);
AndyA 2:15eab46e805b 58 drawCircle(120,15);
AndyA 2:15eab46e805b 59 wait(60*5);
AndyA 1:f2747e954f10 60 }
AndyA 1:f2747e954f10 61 }
AndyA 1:f2747e954f10 62
AndyA 1:f2747e954f10 63 int searchCount;
AndyA 1:f2747e954f10 64 int searchStop;
AndyA 1:f2747e954f10 65 Ticker searchTicker;
AndyA 1:f2747e954f10 66
AndyA 1:f2747e954f10 67 void doNextSearch()
AndyA 1:f2747e954f10 68 {
AndyA 1:f2747e954f10 69 static int searchIndex = 0;
AndyA 1:f2747e954f10 70 keyboard.keyCode('r',KEY_LOGO); // windows key an R
AndyA 1:f2747e954f10 71 wait(0.1); // delay to give the run box a chance to come up.
AndyA 1:f2747e954f10 72 sendString(searchPrefix);
AndyA 1:f2747e954f10 73 sendString( searches[searchIndex++] );
AndyA 1:f2747e954f10 74 sendString(searchSuffix);
AndyA 1:f2747e954f10 75 wait(0.05); // delay to give the run box a chance to come up.
AndyA 1:f2747e954f10 76 keyboard.putc(0x0a); // hit enter
AndyA 1:f2747e954f10 77 if (searchIndex == searchStringCount)
AndyA 1:f2747e954f10 78 searchIndex = 0;
AndyA 1:f2747e954f10 79
AndyA 1:f2747e954f10 80 searchCount++;
AndyA 1:f2747e954f10 81 if (searchCount == searchStop)
AndyA 1:f2747e954f10 82 searchTicker.attach(NULL,0);
AndyA 1:f2747e954f10 83 }
AndyA 1:f2747e954f10 84
AndyA 1:f2747e954f10 85 void startSearches(float interval, int number)
AndyA 1:f2747e954f10 86 {
AndyA 1:f2747e954f10 87 searchCount = 0;
AndyA 1:f2747e954f10 88 searchStop = number;
AndyA 1:f2747e954f10 89 searchTicker.attach(doNextSearch,interval);
AndyA 1:f2747e954f10 90 }
AndyA 0:499d030c3e22 91
AndyA 2:15eab46e805b 92 void runCommand(char *address)
AndyA 2:15eab46e805b 93 {
AndyA 2:15eab46e805b 94 keyboard.keyCode('r',KEY_LOGO); // windows key an R
AndyA 2:15eab46e805b 95 wait(0.1); // delay to give the run box a chance to come up.
AndyA 2:15eab46e805b 96 sendString(address);
AndyA 2:15eab46e805b 97 wait(0.05);
AndyA 2:15eab46e805b 98 keyboard.putc(0x0a); // hit enter
AndyA 2:15eab46e805b 99 }
AndyA 2:15eab46e805b 100
AndyA 0:499d030c3e22 101 void sendString(const char *str)
AndyA 0:499d030c3e22 102 {
AndyA 0:499d030c3e22 103 while (*str != 0) {
AndyA 0:499d030c3e22 104 keyboard.putc(*str);
AndyA 0:499d030c3e22 105 str++;
AndyA 0:499d030c3e22 106 }
AndyA 0:499d030c3e22 107 }
AndyA 0:499d030c3e22 108
AndyA 2:15eab46e805b 109 void maxVolume()
AndyA 2:15eab46e805b 110 {
AndyA 2:15eab46e805b 111 for (int i = 0; i<50; i++) {
AndyA 2:15eab46e805b 112 keyboard.mediaControl(KEY_VOLUME_UP);
AndyA 2:15eab46e805b 113 }
AndyA 2:15eab46e805b 114 }
AndyA 2:15eab46e805b 115
AndyA 1:f2747e954f10 116 void drawCircle(float radius, float time, bool dir)
AndyA 0:499d030c3e22 117 {
AndyA 0:499d030c3e22 118
AndyA 0:499d030c3e22 119 const float timeStep = 0.05;
AndyA 0:499d030c3e22 120 float currentx = 0;
AndyA 0:499d030c3e22 121 float currenty = radius;
AndyA 0:499d030c3e22 122 int steps = time/timeStep;
AndyA 0:499d030c3e22 123 float angleDelta = 2*3.14159265359 / steps;
AndyA 0:499d030c3e22 124 float xPos,yPos;
AndyA 0:499d030c3e22 125
AndyA 0:499d030c3e22 126 if (!dir)
AndyA 0:499d030c3e22 127 angleDelta = -angleDelta;
AndyA 0:499d030c3e22 128
AndyA 0:499d030c3e22 129
AndyA 0:499d030c3e22 130 for (int i = 0; i<steps; i++) {
AndyA 0:499d030c3e22 131 xPos = radius*sin(angleDelta*i);
AndyA 0:499d030c3e22 132 yPos = radius*cos(angleDelta*i);
AndyA 0:499d030c3e22 133 int xDelta = ((xPos - currentx) > 0)?(xPos - currentx) + 0.5 : (xPos - currentx) - 0.5 ;
AndyA 0:499d030c3e22 134 int yDelta = ((yPos - currenty) > 0)?(yPos - currenty) + 0.5 : (yPos - currenty) - 0.5 ;
AndyA 0:499d030c3e22 135 keyboard.move(xDelta,yDelta);
AndyA 0:499d030c3e22 136 currentx += xDelta;
AndyA 0:499d030c3e22 137 currenty += yDelta;
AndyA 0:499d030c3e22 138 wait(timeStep);
AndyA 0:499d030c3e22 139 }
AndyA 0:499d030c3e22 140 }
AndyA 0:499d030c3e22 141
AndyA 1:f2747e954f10 142 void drawLine(float length, float time, bool horizontal, bool direction)
AndyA 0:499d030c3e22 143 {
AndyA 0:499d030c3e22 144
AndyA 0:499d030c3e22 145 const float timeStep = 0.05;
AndyA 0:499d030c3e22 146 float currentPos = 0;
AndyA 0:499d030c3e22 147 int steps = time/timeStep;
AndyA 0:499d030c3e22 148 float stepSize = length / steps;
AndyA 0:499d030c3e22 149 float movement;
AndyA 0:499d030c3e22 150
AndyA 0:499d030c3e22 151 if (!direction)
AndyA 0:499d030c3e22 152 stepSize = -stepSize;
AndyA 0:499d030c3e22 153
AndyA 0:499d030c3e22 154 for (int i = 0; i<steps; i++) {
AndyA 0:499d030c3e22 155
AndyA 0:499d030c3e22 156 movement = stepSize*i - currentPos;
AndyA 0:499d030c3e22 157 int moveDelta;
AndyA 0:499d030c3e22 158 if (movement>0)
AndyA 0:499d030c3e22 159 moveDelta = movement+0.5;
AndyA 0:499d030c3e22 160 else
AndyA 0:499d030c3e22 161 moveDelta = movement-0.5;
AndyA 0:499d030c3e22 162
AndyA 0:499d030c3e22 163 if (horizontal)
AndyA 0:499d030c3e22 164 keyboard.move(moveDelta,0);
AndyA 0:499d030c3e22 165 else
AndyA 0:499d030c3e22 166 keyboard.move(0,moveDelta);
AndyA 0:499d030c3e22 167
AndyA 0:499d030c3e22 168 currentPos += moveDelta;
AndyA 0:499d030c3e22 169 wait(timeStep);
AndyA 0:499d030c3e22 170 }
AndyA 0:499d030c3e22 171 }
AndyA 0:499d030c3e22 172
AndyA 1:f2747e954f10 173 Ticker capLockTick;
AndyA 1:f2747e954f10 174 Timeout capLockTimer;
AndyA 1:f2747e954f10 175 bool capsTimerActive = false;
AndyA 1:f2747e954f10 176 float capsWaitPeriod = 60;
AndyA 1:f2747e954f10 177
AndyA 1:f2747e954f10 178 void capsOn(void)
AndyA 0:499d030c3e22 179 {
AndyA 1:f2747e954f10 180 capsTimerActive = false;
AndyA 1:f2747e954f10 181 if ((keyboard.lockStatus() & 0x02) == 0)
AndyA 1:f2747e954f10 182 keyboard.keyCode(KEY_CAPS_LOCK);
AndyA 0:499d030c3e22 183 }
AndyA 0:499d030c3e22 184
AndyA 1:f2747e954f10 185 void checkCapsLock(void)
AndyA 0:499d030c3e22 186 {
AndyA 1:f2747e954f10 187 LEDs = keyboard.lockStatus();
AndyA 1:f2747e954f10 188 if ((keyboard.lockStatus() & 0x02) == 0) {
AndyA 1:f2747e954f10 189 if (!capsTimerActive) {
AndyA 1:f2747e954f10 190 capLockTimer.attach(capsOn,capsWaitPeriod);
AndyA 1:f2747e954f10 191 capsTimerActive = true;
AndyA 1:f2747e954f10 192 }
AndyA 1:f2747e954f10 193 } else {
AndyA 1:f2747e954f10 194 if (capsTimerActive) {
AndyA 1:f2747e954f10 195 capLockTimer.detach();
AndyA 1:f2747e954f10 196 capsTimerActive = false;
AndyA 1:f2747e954f10 197 }
AndyA 0:499d030c3e22 198 }
AndyA 0:499d030c3e22 199 }
AndyA 1:f2747e954f10 200
AndyA 2:15eab46e805b 201 void forceCaps(float delay, float checkPeriod)
AndyA 2:15eab46e805b 202 {
AndyA 1:f2747e954f10 203 if (checkPeriod == 0)
AndyA 2:15eab46e805b 204 capLockTick.attach(NULL,0);
AndyA 2:15eab46e805b 205 else {
AndyA 2:15eab46e805b 206 capsWaitPeriod = delay;
AndyA 2:15eab46e805b 207 capLockTick.attach(checkCapsLock,checkPeriod);
AndyA 1:f2747e954f10 208 }
AndyA 2:15eab46e805b 209 }