mbed tokyotech

Dependencies:   C12832 EthernetInterface HTTPClient USBDevice mbed-rtos mbed Speaker

Committer:
Mickemoj
Date:
Thu Feb 11 01:46:42 2016 +0000
Revision:
4:52109f4cb132
Parent:
3:6d2b9fcb8fa8
Program dies after gameover screen, probably due to tickhandler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mickemoj 0:d5e6ab0403f0 1 #include "mbed.h"
Mickemoj 0:d5e6ab0403f0 2 #include "HTTPClient.h"
Mickemoj 0:d5e6ab0403f0 3 #include "C12832.h"
Mickemoj 0:d5e6ab0403f0 4 #include "EthernetInterface.h"
Mickemoj 0:d5e6ab0403f0 5 #include <string>
Mickemoj 0:d5e6ab0403f0 6 #include <stdlib.h> /* srand, rand */
Mickemoj 0:d5e6ab0403f0 7 #include "rtos.h"
Mickemoj 0:d5e6ab0403f0 8 #include <sstream>
Mickemoj 0:d5e6ab0403f0 9 #include "USBAudio.h"
RiiQQe 3:6d2b9fcb8fa8 10 #include "Speaker.h"
Mickemoj 0:d5e6ab0403f0 11
Mickemoj 0:d5e6ab0403f0 12 /*
Mickemoj 0:d5e6ab0403f0 13 Account: mbedTokyoTech
Mickemoj 0:d5e6ab0403f0 14 Psswd: kalle123
Mickemoj 0:d5e6ab0403f0 15 Email: ricli877@student.liu.se
Mickemoj 0:d5e6ab0403f0 16
Mickemoj 0:d5e6ab0403f0 17 $consumerKey = 'XHO3e2fiS44d5i7xc6mvtvDdZ';
Mickemoj 0:d5e6ab0403f0 18 $consumerSecret = '9U4WOjRnpM5Pj0Qv4f6406jTRfN65YY5GeE5PRXHuhPfSiWhEN';
Mickemoj 0:d5e6ab0403f0 19 $accessToken = '4761221959-n4ojXEYR4DZSA4eeqt1WetVHHrZWTUNLJJ9ql3o';
Mickemoj 0:d5e6ab0403f0 20 $accessTokenSecret = 'SXM05FPIW9SUgTYYgpk4buPcypwXIsLDIY3TRns01WRJP';
Mickemoj 0:d5e6ab0403f0 21 */
Mickemoj 0:d5e6ab0403f0 22
Mickemoj 0:d5e6ab0403f0 23 // frequency: 48 kHz
Mickemoj 0:d5e6ab0403f0 24 #define FREQ 48000
Mickemoj 0:d5e6ab0403f0 25
Mickemoj 0:d5e6ab0403f0 26 // 1 channel: mono
Mickemoj 0:d5e6ab0403f0 27 #define NB_CHA 1
Mickemoj 0:d5e6ab0403f0 28
Mickemoj 0:d5e6ab0403f0 29 // Length of an audio packet: each ms, we receive 48 * 16bits ->48 * 2 bytes. As there is one channel, the length will be 48 * 2 * 1
Mickemoj 0:d5e6ab0403f0 30 #define AUDIO_LENGTH_PACKET 48 * 2 * 1
Mickemoj 0:d5e6ab0403f0 31
Mickemoj 4:52109f4cb132 32 RawSerial pc(USBTX, USBRX);
Mickemoj 0:d5e6ab0403f0 33
Mickemoj 0:d5e6ab0403f0 34 //Variables for audio streaming
Mickemoj 0:d5e6ab0403f0 35
Mickemoj 0:d5e6ab0403f0 36 // USBAudio
Mickemoj 4:52109f4cb132 37 USBAudio audio(FREQ, NB_CHA, 8000, 1, 0x7180, 0x7500);
Mickemoj 0:d5e6ab0403f0 38
Mickemoj 0:d5e6ab0403f0 39 // Ticker to send data to the speaker at the required frequency
Mickemoj 0:d5e6ab0403f0 40 Ticker tic;
Mickemoj 0:d5e6ab0403f0 41
Mickemoj 0:d5e6ab0403f0 42 // Buffer where one audio packet will be stored (LENGTH_AUDIO_PACKET/2 because we are storing int16 and not uint8)
Mickemoj 0:d5e6ab0403f0 43 int16_t buf2[AUDIO_LENGTH_PACKET/2];
Mickemoj 0:d5e6ab0403f0 44
Mickemoj 0:d5e6ab0403f0 45 // Show if an audio packet is available
Mickemoj 0:d5e6ab0403f0 46 volatile bool available = false;
Mickemoj 0:d5e6ab0403f0 47
Mickemoj 0:d5e6ab0403f0 48 // Index of the value which will be send to the speaker
Mickemoj 0:d5e6ab0403f0 49 int index_buf = 0;
Mickemoj 0:d5e6ab0403f0 50
Mickemoj 0:d5e6ab0403f0 51 // Previous value sent to the speaker
Mickemoj 0:d5e6ab0403f0 52 uint16_t p_val = 0;
Mickemoj 1:bc8574ad00b3 53
Mickemoj 1:bc8574ad00b3 54 // Speaker connected to the AnalogOut output. The audio stream received over USb will be sent to the speaker
Mickemoj 1:bc8574ad00b3 55 AnalogOut speaker(p18);
Mickemoj 0:d5e6ab0403f0 56
Mickemoj 0:d5e6ab0403f0 57 DigitalIn button(p14);
Mickemoj 0:d5e6ab0403f0 58
Mickemoj 0:d5e6ab0403f0 59 EthernetInterface eth;
Mickemoj 0:d5e6ab0403f0 60
Mickemoj 0:d5e6ab0403f0 61 C12832 lcd(p5, p7, p6, p8, p11);
Mickemoj 0:d5e6ab0403f0 62
Mickemoj 0:d5e6ab0403f0 63 HTTPClient http;
Mickemoj 0:d5e6ab0403f0 64
Mickemoj 0:d5e6ab0403f0 65 BusIn joy(p15,p12,p13,p16);
Mickemoj 0:d5e6ab0403f0 66
Mickemoj 0:d5e6ab0403f0 67 Mutex locker;
RiiQQe 3:6d2b9fcb8fa8 68
RiiQQe 3:6d2b9fcb8fa8 69 Speaker speaker2(p26);
RiiQQe 3:6d2b9fcb8fa8 70
Mickemoj 4:52109f4cb132 71 int toggle_flag = 1;
Mickemoj 4:52109f4cb132 72
Mickemoj 0:d5e6ab0403f0 73 // sting buffers for tweeting
Mickemoj 0:d5e6ab0403f0 74 char str[512];
Mickemoj 0:d5e6ab0403f0 75 char buf[512];
Mickemoj 0:d5e6ab0403f0 76
Mickemoj 0:d5e6ab0403f0 77 int enX[17] = {75,37,19,93,59,21,80,65,27,45,47,49,54,94,62,104,28};
Mickemoj 0:d5e6ab0403f0 78 int enY[19] = {30,16,25,5,15,22,13,7,6,23,24,2,28,21,20,14,17,19,3};
Mickemoj 0:d5e6ab0403f0 79
Mickemoj 0:d5e6ab0403f0 80 int foodX[23] = {2,38,105,109,99,30,97,26,5,40,121,24,101,69,84,48,34,9,118,29,25,70,1};
Mickemoj 0:d5e6ab0403f0 81 int foodY[13] = {11,29,2,23,6,24,28,5,1,27,9,7,13};
Mickemoj 0:d5e6ab0403f0 82
Mickemoj 0:d5e6ab0403f0 83 //Stuff for the snakegame + joystick
Mickemoj 0:d5e6ab0403f0 84 int score = 0;
Mickemoj 0:d5e6ab0403f0 85 int s2 = 0;
Mickemoj 0:d5e6ab0403f0 86 int xPos = 50, yPos = 10;
Mickemoj 0:d5e6ab0403f0 87 int xDim = 128, yDim = 32;
Mickemoj 0:d5e6ab0403f0 88 int step = 4;
Mickemoj 0:d5e6ab0403f0 89 int xFood = foodX[0], yFood = foodY[0], xKiller=enX[0], yKiller=enY[0];
Mickemoj 0:d5e6ab0403f0 90 int foodIndex = 1;
Mickemoj 0:d5e6ab0403f0 91 int enemyIndex = 1;
Mickemoj 0:d5e6ab0403f0 92
Mickemoj 0:d5e6ab0403f0 93 bool gameOver = false;
RiiQQe 3:6d2b9fcb8fa8 94 bool gameOverScreen = false;
Mickemoj 0:d5e6ab0403f0 95
Mickemoj 0:d5e6ab0403f0 96
Mickemoj 0:d5e6ab0403f0 97 int k = 0;
Mickemoj 0:d5e6ab0403f0 98
Mickemoj 0:d5e6ab0403f0 99 int i = 0, j = 0;
Mickemoj 0:d5e6ab0403f0 100
Mickemoj 0:d5e6ab0403f0 101 bool hit2 = false;
Mickemoj 0:d5e6ab0403f0 102 //Function that checks if the food was eaten, returns true if it was.
Mickemoj 0:d5e6ab0403f0 103 bool hitFood(){
Mickemoj 0:d5e6ab0403f0 104 if(abs(xFood - i) < 5 && abs(yFood - j) < 5) {
Mickemoj 0:d5e6ab0403f0 105 score = score + 1;
Mickemoj 0:d5e6ab0403f0 106 return true;
Mickemoj 0:d5e6ab0403f0 107 }
Mickemoj 0:d5e6ab0403f0 108 return false;
Mickemoj 0:d5e6ab0403f0 109 }
Mickemoj 0:d5e6ab0403f0 110 bool hitEnemy(){
Mickemoj 0:d5e6ab0403f0 111 if(abs(xKiller - i) < 5 && abs(yKiller - j) < 5) {
Mickemoj 0:d5e6ab0403f0 112 return true;
Mickemoj 0:d5e6ab0403f0 113 }
Mickemoj 0:d5e6ab0403f0 114 return false;
Mickemoj 0:d5e6ab0403f0 115 }
Mickemoj 0:d5e6ab0403f0 116 //Function that creates new food
Mickemoj 0:d5e6ab0403f0 117 void createNewFood(){
Mickemoj 0:d5e6ab0403f0 118 xFood = foodX [foodIndex % sizeof(foodX)];
Mickemoj 0:d5e6ab0403f0 119 yFood = foodY [foodIndex % sizeof(foodY)];
Mickemoj 0:d5e6ab0403f0 120
Mickemoj 0:d5e6ab0403f0 121 xKiller = enX[enemyIndex % sizeof(enX)];
Mickemoj 0:d5e6ab0403f0 122 yKiller = enY[enemyIndex % sizeof(enY)];
Mickemoj 0:d5e6ab0403f0 123
Mickemoj 0:d5e6ab0403f0 124 while(abs(xKiller - xFood) < 5 || abs(yKiller - yFood) < 5){
Mickemoj 0:d5e6ab0403f0 125 enemyIndex = enemyIndex + 1;
Mickemoj 0:d5e6ab0403f0 126 xKiller = enX[enemyIndex % sizeof(enX)];
Mickemoj 0:d5e6ab0403f0 127 yKiller = enY[enemyIndex % sizeof(enY)];
Mickemoj 0:d5e6ab0403f0 128 }
Mickemoj 0:d5e6ab0403f0 129
Mickemoj 0:d5e6ab0403f0 130 foodIndex = foodIndex + 1;
Mickemoj 0:d5e6ab0403f0 131 enemyIndex = enemyIndex + 1;
Mickemoj 0:d5e6ab0403f0 132 }
Mickemoj 0:d5e6ab0403f0 133
Mickemoj 0:d5e6ab0403f0 134 void setUpGame() {
Mickemoj 0:d5e6ab0403f0 135 score = 0;
Mickemoj 0:d5e6ab0403f0 136 xPos = 50, yPos = 10;
Mickemoj 0:d5e6ab0403f0 137 xDim = 128, yDim = 32;
Mickemoj 0:d5e6ab0403f0 138 step = 4;
Mickemoj 0:d5e6ab0403f0 139 xFood = foodX[0], yFood = foodY[0], xKiller=enX[0], yKiller=enY[0];
Mickemoj 0:d5e6ab0403f0 140 foodIndex = 1;
Mickemoj 0:d5e6ab0403f0 141 enemyIndex = 1;
Mickemoj 0:d5e6ab0403f0 142 }
RiiQQe 3:6d2b9fcb8fa8 143
RiiQQe 3:6d2b9fcb8fa8 144 void gameOverFun(){
Mickemoj 4:52109f4cb132 145 //speaker2.PlayNote(969.0, 0.5, 1.0);
Mickemoj 4:52109f4cb132 146 //speaker2.PlayNote(800.0, 0.5, 1.0);
RiiQQe 3:6d2b9fcb8fa8 147 lcd.cls();
RiiQQe 3:6d2b9fcb8fa8 148 lcd.locate(xDim / 2 - 10, yDim / 2);
RiiQQe 3:6d2b9fcb8fa8 149 lcd.printf("Game Over");
RiiQQe 3:6d2b9fcb8fa8 150 }
Mickemoj 0:d5e6ab0403f0 151
Mickemoj 0:d5e6ab0403f0 152 //Function that actually draws the snake and handles the user input
Mickemoj 0:d5e6ab0403f0 153 void playSnake(void const *args)
Mickemoj 0:d5e6ab0403f0 154 {
Mickemoj 0:d5e6ab0403f0 155 while(true) {
Mickemoj 1:bc8574ad00b3 156 if(gameOver){
Mickemoj 1:bc8574ad00b3 157 Thread::wait(10000);
Mickemoj 1:bc8574ad00b3 158 }
Mickemoj 1:bc8574ad00b3 159
RiiQQe 3:6d2b9fcb8fa8 160 if (!gameOver && !gameOverScreen) {
Mickemoj 0:d5e6ab0403f0 161 //locker.lock();
Mickemoj 0:d5e6ab0403f0 162 setUpGame();
RiiQQe 3:6d2b9fcb8fa8 163
RiiQQe 3:6d2b9fcb8fa8 164 while(!gameOverScreen) {
Mickemoj 4:52109f4cb132 165 //pc.printf("Inne");
Mickemoj 0:d5e6ab0403f0 166 //Handles joystick-input
RiiQQe 3:6d2b9fcb8fa8 167
Mickemoj 0:d5e6ab0403f0 168 if(joy) {
Mickemoj 0:d5e6ab0403f0 169 if(joy == 0x4) { //Right Left
Mickemoj 0:d5e6ab0403f0 170 k=0;
Mickemoj 0:d5e6ab0403f0 171 i = i - step;
Mickemoj 0:d5e6ab0403f0 172 if(i < 0) i = xDim + i;
Mickemoj 0:d5e6ab0403f0 173 } else if(joy == 0x8) { //Right Left
Mickemoj 0:d5e6ab0403f0 174 k=1;
Mickemoj 0:d5e6ab0403f0 175 i = (i + step) % xDim;
Mickemoj 0:d5e6ab0403f0 176 } else if(joy == 0x1) { //Up Down
Mickemoj 0:d5e6ab0403f0 177 k=2;
Mickemoj 0:d5e6ab0403f0 178 j = j - step;
Mickemoj 0:d5e6ab0403f0 179 if(j < 0) j = yDim + j;
Mickemoj 0:d5e6ab0403f0 180 } else if(joy == 0x2) { //Up Down
Mickemoj 0:d5e6ab0403f0 181 k=3;
Mickemoj 0:d5e6ab0403f0 182 j = (j + step) % yDim;
Mickemoj 0:d5e6ab0403f0 183 }
Mickemoj 0:d5e6ab0403f0 184 }else {
Mickemoj 0:d5e6ab0403f0 185 if(k == 0) {
Mickemoj 0:d5e6ab0403f0 186 i = i - step;
Mickemoj 0:d5e6ab0403f0 187 if(i < 0) i = xDim + i;
Mickemoj 0:d5e6ab0403f0 188 } else if(k == 1) {
Mickemoj 0:d5e6ab0403f0 189 i = (i + step) % xDim;
Mickemoj 0:d5e6ab0403f0 190 } else if(k == 2) {
Mickemoj 0:d5e6ab0403f0 191 j = j - step;
Mickemoj 0:d5e6ab0403f0 192 if(j < 0) j = yDim + j;
Mickemoj 0:d5e6ab0403f0 193 } else if(k == 3) {
Mickemoj 0:d5e6ab0403f0 194 j = (j + step) % yDim;
Mickemoj 0:d5e6ab0403f0 195 }
Mickemoj 0:d5e6ab0403f0 196 }
Mickemoj 0:d5e6ab0403f0 197 lcd.cls();
Mickemoj 0:d5e6ab0403f0 198 lcd.locate(i,j);
Mickemoj 0:d5e6ab0403f0 199
Mickemoj 0:d5e6ab0403f0 200 int r = 3;
Mickemoj 0:d5e6ab0403f0 201 //To move the score to not interfere with game
Mickemoj 0:d5e6ab0403f0 202 if(i < xDim / 2) lcd.locate(xDim-10, 10);
Mickemoj 0:d5e6ab0403f0 203 else lcd.locate(10,10);
Mickemoj 0:d5e6ab0403f0 204 lcd.printf("%i", score);
Mickemoj 0:d5e6ab0403f0 205
Mickemoj 0:d5e6ab0403f0 206 //Draw snake
Mickemoj 0:d5e6ab0403f0 207 lcd.fillcircle(i, j, r, 1);
Mickemoj 0:d5e6ab0403f0 208
Mickemoj 0:d5e6ab0403f0 209 //Draw enemy
Mickemoj 0:d5e6ab0403f0 210 lcd.locate(xKiller,yKiller);
Mickemoj 0:d5e6ab0403f0 211 lcd.printf("X");
Mickemoj 0:d5e6ab0403f0 212 bool hitE = hitEnemy();
Mickemoj 0:d5e6ab0403f0 213
Mickemoj 0:d5e6ab0403f0 214 //Draw food
Mickemoj 0:d5e6ab0403f0 215 lcd.fillcircle(xFood, yFood, 2, 1);
Mickemoj 0:d5e6ab0403f0 216 hit2 = hitFood();
Mickemoj 0:d5e6ab0403f0 217
Mickemoj 0:d5e6ab0403f0 218 //To see if food was eaten
Mickemoj 0:d5e6ab0403f0 219 if(hit2)
Mickemoj 0:d5e6ab0403f0 220 createNewFood();
Mickemoj 0:d5e6ab0403f0 221 else if(hitE){
Mickemoj 4:52109f4cb132 222 //tic.detach();
Mickemoj 0:d5e6ab0403f0 223 gameOver = true;
RiiQQe 3:6d2b9fcb8fa8 224 gameOverScreen = true;
RiiQQe 3:6d2b9fcb8fa8 225 gameOverFun();
Mickemoj 0:d5e6ab0403f0 226 }
Mickemoj 0:d5e6ab0403f0 227 Thread::wait(50); // Used to control the speed of the game
Mickemoj 0:d5e6ab0403f0 228 }
Mickemoj 0:d5e6ab0403f0 229 }
Mickemoj 0:d5e6ab0403f0 230 }
Mickemoj 0:d5e6ab0403f0 231 }
Mickemoj 0:d5e6ab0403f0 232
Mickemoj 0:d5e6ab0403f0 233 // Replace all occurrences of s2 with s3 in s1
Mickemoj 0:d5e6ab0403f0 234 void rep(std::string &s1, const char * s2, const char * s3) {
Mickemoj 0:d5e6ab0403f0 235 size_t index = 0;
Mickemoj 0:d5e6ab0403f0 236 while (index < s1.size()) {
Mickemoj 0:d5e6ab0403f0 237 index = s1.find(s2, index);
Mickemoj 0:d5e6ab0403f0 238 if (index == std::string::npos) break;
Mickemoj 0:d5e6ab0403f0 239 s1.replace(index, strlen(s2), s3);
Mickemoj 0:d5e6ab0403f0 240 index += strlen(s3);
Mickemoj 0:d5e6ab0403f0 241 }
Mickemoj 0:d5e6ab0403f0 242 }
Mickemoj 0:d5e6ab0403f0 243
Mickemoj 0:d5e6ab0403f0 244 // Tweet msg
Mickemoj 0:d5e6ab0403f0 245 void tweet(std::string msg) {
Mickemoj 0:d5e6ab0403f0 246 std::string url ("http://www.rickardlindstedt.com/proxy.php?msg=");
Mickemoj 1:bc8574ad00b3 247 //pc.printf("Message: %s\n", msg.c_str());
Mickemoj 1:bc8574ad00b3 248 //pc.printf("\nTrying to post data...\n");
Mickemoj 0:d5e6ab0403f0 249
Mickemoj 0:d5e6ab0403f0 250 // replace special characters with URL-safe ones
RiiQQe 3:6d2b9fcb8fa8 251 rep(msg, " ", "%20");
Mickemoj 0:d5e6ab0403f0 252 rep(msg, "#", "%23");
RiiQQe 3:6d2b9fcb8fa8 253 rep(msg, ":", "%3A");
RiiQQe 3:6d2b9fcb8fa8 254
Mickemoj 0:d5e6ab0403f0 255
Mickemoj 0:d5e6ab0403f0 256 url = url + msg;
Mickemoj 0:d5e6ab0403f0 257
Mickemoj 1:bc8574ad00b3 258 //pc.printf("URL: %s\n", url.c_str());
Mickemoj 4:52109f4cb132 259 //pc.printf("i tweet3");
Mickemoj 0:d5e6ab0403f0 260 // send HTTP request
Mickemoj 0:d5e6ab0403f0 261 int ret = http.get(url.c_str(), str, 128);
Mickemoj 4:52109f4cb132 262 //pc.printf("i tweet4");
Mickemoj 0:d5e6ab0403f0 263 if (ret == HTTP_OK)
Mickemoj 0:d5e6ab0403f0 264 {
Mickemoj 4:52109f4cb132 265 //pc.printf("Success!\n");
Mickemoj 0:d5e6ab0403f0 266 }
Mickemoj 0:d5e6ab0403f0 267 else
Mickemoj 0:d5e6ab0403f0 268 {
Mickemoj 4:52109f4cb132 269 //pc.printf("Error #%d\n", ret);
Mickemoj 0:d5e6ab0403f0 270 }
RiiQQe 3:6d2b9fcb8fa8 271
RiiQQe 3:6d2b9fcb8fa8 272 //Used to restart game
RiiQQe 3:6d2b9fcb8fa8 273 setUpGame();
Mickemoj 4:52109f4cb132 274 //pc.printf("Response code: %d\n", http.getHTTPResponseCode());
Mickemoj 1:bc8574ad00b3 275
Mickemoj 0:d5e6ab0403f0 276 }
Mickemoj 0:d5e6ab0403f0 277
Mickemoj 0:d5e6ab0403f0 278 // Set up ethernet network interface
Mickemoj 0:d5e6ab0403f0 279 void setUpNetwork() {
Mickemoj 0:d5e6ab0403f0 280 eth.init();
Mickemoj 0:d5e6ab0403f0 281 eth.connect();
Mickemoj 1:bc8574ad00b3 282 //pc.printf("IP: %s", eth.getIPAddress());
Mickemoj 0:d5e6ab0403f0 283 }
Mickemoj 0:d5e6ab0403f0 284
Mickemoj 0:d5e6ab0403f0 285 void tweetHighscore(void const *args){
Mickemoj 1:bc8574ad00b3 286 //tic.detach();
Mickemoj 4:52109f4cb132 287 //available = false;
Mickemoj 0:d5e6ab0403f0 288 setUpNetwork();
Mickemoj 0:d5e6ab0403f0 289 while(true) {
Mickemoj 0:d5e6ab0403f0 290 //locker.lock();
Mickemoj 0:d5e6ab0403f0 291 if (gameOver) {
Mickemoj 4:52109f4cb132 292 //pc.printf("I game over");
Mickemoj 1:bc8574ad00b3 293 //tic.detach();
Mickemoj 0:d5e6ab0403f0 294 std::string msg;
Mickemoj 0:d5e6ab0403f0 295 ostringstream convert;
Mickemoj 0:d5e6ab0403f0 296 convert << "Score: " << score << ", " << xKiller;
Mickemoj 0:d5e6ab0403f0 297 msg = convert.str();
Mickemoj 0:d5e6ab0403f0 298 tweet(msg);
Mickemoj 4:52109f4cb132 299 //pc.printf("efter tweet(msg)");
Mickemoj 1:bc8574ad00b3 300 locker.lock();
Mickemoj 0:d5e6ab0403f0 301 gameOver = false;
RiiQQe 3:6d2b9fcb8fa8 302 bool kalle = true;
RiiQQe 3:6d2b9fcb8fa8 303 while(kalle){
RiiQQe 3:6d2b9fcb8fa8 304 if(joy) kalle = false;
RiiQQe 3:6d2b9fcb8fa8 305 }
RiiQQe 3:6d2b9fcb8fa8 306 gameOverScreen = false;
Mickemoj 1:bc8574ad00b3 307 locker.unlock();
Mickemoj 0:d5e6ab0403f0 308 }
Mickemoj 0:d5e6ab0403f0 309 //locker.unlock();
Mickemoj 0:d5e6ab0403f0 310 Thread::wait(1000);
Mickemoj 0:d5e6ab0403f0 311 }
Mickemoj 0:d5e6ab0403f0 312 }
Mickemoj 0:d5e6ab0403f0 313
Mickemoj 0:d5e6ab0403f0 314 // Function executed each 1/FREQ s
Mickemoj 4:52109f4cb132 315 void tic_handler() {
Mickemoj 0:d5e6ab0403f0 316 float speaker_value;
Mickemoj 0:d5e6ab0403f0 317
Mickemoj 0:d5e6ab0403f0 318 if (available) {
Mickemoj 0:d5e6ab0403f0 319 // Convert 2 bytes in float
Mickemoj 0:d5e6ab0403f0 320 speaker_value = (float)(buf2[index_buf]);
Mickemoj 0:d5e6ab0403f0 321
Mickemoj 0:d5e6ab0403f0 322 // Speaker_value between 0 and 65535
Mickemoj 0:d5e6ab0403f0 323 speaker_value += 32768.0;
Mickemoj 0:d5e6ab0403f0 324
Mickemoj 0:d5e6ab0403f0 325 // Adjust according to current volume
Mickemoj 0:d5e6ab0403f0 326 speaker_value *= audio.getVolume();
Mickemoj 0:d5e6ab0403f0 327
Mickemoj 0:d5e6ab0403f0 328
Mickemoj 0:d5e6ab0403f0 329 // As two bytes has been read, we move the index of two bytes
Mickemoj 0:d5e6ab0403f0 330 index_buf++;
Mickemoj 0:d5e6ab0403f0 331
Mickemoj 0:d5e6ab0403f0 332 // If we have read all the buffer, no more data available
Mickemoj 0:d5e6ab0403f0 333 if (index_buf == AUDIO_LENGTH_PACKET/2) {
Mickemoj 0:d5e6ab0403f0 334 index_buf = 0;
Mickemoj 0:d5e6ab0403f0 335 available = false;
Mickemoj 0:d5e6ab0403f0 336 }
Mickemoj 0:d5e6ab0403f0 337 } else {
Mickemoj 0:d5e6ab0403f0 338 speaker_value = p_val;
Mickemoj 0:d5e6ab0403f0 339 }
Mickemoj 0:d5e6ab0403f0 340
Mickemoj 0:d5e6ab0403f0 341 p_val = speaker_value;
Mickemoj 0:d5e6ab0403f0 342
Mickemoj 0:d5e6ab0403f0 343 // Send value to the speaker
Mickemoj 0:d5e6ab0403f0 344 speaker.write_u16((uint16_t)speaker_value);
Mickemoj 4:52109f4cb132 345 }
Mickemoj 1:bc8574ad00b3 346
Mickemoj 0:d5e6ab0403f0 347 int main()
Mickemoj 0:d5e6ab0403f0 348 {
Mickemoj 4:52109f4cb132 349
Mickemoj 0:d5e6ab0403f0 350 // Attach a function executed each 1/FREQ s
Mickemoj 4:52109f4cb132 351 tic.attach_us(tic_handler, 1000000.0/(float)FREQ);
Mickemoj 1:bc8574ad00b3 352 //pc.printf("hej");
Mickemoj 0:d5e6ab0403f0 353 createNewFood();
Mickemoj 1:bc8574ad00b3 354 //pc.printf("after create food");
Mickemoj 0:d5e6ab0403f0 355 Thread threadSnake(playSnake);
Mickemoj 0:d5e6ab0403f0 356 Thread threadTweet(tweetHighscore);
Mickemoj 1:bc8574ad00b3 357 //pc.printf("after threads");
Mickemoj 1:bc8574ad00b3 358
Mickemoj 1:bc8574ad00b3 359
Mickemoj 4:52109f4cb132 360 while (1) {
Mickemoj 0:d5e6ab0403f0 361 // Read an audio packet
Mickemoj 4:52109f4cb132 362 /*if(gameOver){
Mickemoj 4:52109f4cb132 363
Mickemoj 4:52109f4cb132 364 tic.detach();
Mickemoj 4:52109f4cb132 365
Mickemoj 4:52109f4cb132 366
Mickemoj 4:52109f4cb132 367 }*/
Mickemoj 1:bc8574ad00b3 368 audio.read((uint8_t *)buf2);
Mickemoj 1:bc8574ad00b3 369 available = true;
Mickemoj 1:bc8574ad00b3 370
Mickemoj 4:52109f4cb132 371 }
Mickemoj 4:52109f4cb132 372 /*while(true) {
Mickemoj 1:bc8574ad00b3 373 Thread::wait(500);
Mickemoj 4:52109f4cb132 374 }*/
Mickemoj 1:bc8574ad00b3 375 }