Two mini game with accelerometer 13M15330 Sangwon Yoo 13M38502 Hanyoung Kim

Dependencies:   MMA7660 mbed-rtos mbed

Committer:
archmagic
Date:
Fri Feb 14 01:26:40 2014 +0000
Revision:
0:68699c694bbf
AOS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
archmagic 0:68699c694bbf 1 #include "mbed.h"
archmagic 0:68699c694bbf 2 #include "MMA7660.h"
archmagic 0:68699c694bbf 3 #include "rtos.h"
archmagic 0:68699c694bbf 4
archmagic 0:68699c694bbf 5
archmagic 0:68699c694bbf 6 #define DIM 3
archmagic 0:68699c694bbf 7 #define N 8
archmagic 0:68699c694bbf 8 #define NLEDS 4
archmagic 0:68699c694bbf 9
archmagic 0:68699c694bbf 10 MMA7660 accel(p28, p27);
archmagic 0:68699c694bbf 11 DigitalOut led[] = { LED1, LED2, LED3, LED4 };
archmagic 0:68699c694bbf 12
archmagic 0:68699c694bbf 13 DigitalIn button(p14);
archmagic 0:68699c694bbf 14 DigitalIn button2(p14);
archmagic 0:68699c694bbf 15 bool buttonValue = false;
archmagic 0:68699c694bbf 16
archmagic 0:68699c694bbf 17 MMA7660 acc(p28, p27);
archmagic 0:68699c694bbf 18 Serial pc(USBTX, USBRX);
archmagic 0:68699c694bbf 19 PwmOut speaker(p26);
archmagic 0:68699c694bbf 20 PinName led_pin[] = { LED1, LED2, LED3, LED4 };
archmagic 0:68699c694bbf 21 int led_period[] = { 5000, 10000, 15000, 20000 };
archmagic 0:68699c694bbf 22 int gps_x=0,gps_y=0;
archmagic 0:68699c694bbf 23 int timer_end=0;
archmagic 0:68699c694bbf 24
archmagic 0:68699c694bbf 25 float r[DIM], s[DIM], nv[DIM][N];
archmagic 0:68699c694bbf 26
archmagic 0:68699c694bbf 27
archmagic 0:68699c694bbf 28 void initialize_led(void const *led){
archmagic 0:68699c694bbf 29 *(DigitalOut *)led=1;
archmagic 0:68699c694bbf 30 }
archmagic 0:68699c694bbf 31 void initialize_led0(void const *led){
archmagic 0:68699c694bbf 32 *(DigitalOut *)led=0;
archmagic 0:68699c694bbf 33 }
archmagic 0:68699c694bbf 34
archmagic 0:68699c694bbf 35 void beamSound(void const *arg) {
archmagic 0:68699c694bbf 36
archmagic 0:68699c694bbf 37 for (float f = 2000; f > 100; f -= 50) {
archmagic 0:68699c694bbf 38 speaker.period(1.0 / f);
archmagic 0:68699c694bbf 39 speaker = 0.5;
archmagic 0:68699c694bbf 40 }
archmagic 0:68699c694bbf 41 Thread::wait(50);
archmagic 0:68699c694bbf 42 speaker = 0.0;
archmagic 0:68699c694bbf 43 }
archmagic 0:68699c694bbf 44
archmagic 0:68699c694bbf 45 void errorSound(void const *arg) {
archmagic 0:68699c694bbf 46
archmagic 0:68699c694bbf 47 for (float f = 2000; f > 100; f -= 50) {
archmagic 0:68699c694bbf 48 speaker.period(1.0 / f);
archmagic 0:68699c694bbf 49 speaker = 0.7;
archmagic 0:68699c694bbf 50 }
archmagic 0:68699c694bbf 51 Thread::wait(500);
archmagic 0:68699c694bbf 52 speaker = 0.0;
archmagic 0:68699c694bbf 53 }
archmagic 0:68699c694bbf 54
archmagic 0:68699c694bbf 55 void endSound(void const *arg) {
archmagic 0:68699c694bbf 56 for (float f = 2000; f > 100; f -= 50) {
archmagic 0:68699c694bbf 57 speaker.period(1.0 / f);
archmagic 0:68699c694bbf 58 speaker = 0.5;
archmagic 0:68699c694bbf 59 wait(0.01);
archmagic 0:68699c694bbf 60 }
archmagic 0:68699c694bbf 61 speaker = 0.0;
archmagic 0:68699c694bbf 62 }
archmagic 0:68699c694bbf 63
archmagic 0:68699c694bbf 64 void led_off(void const *led) {
archmagic 0:68699c694bbf 65 *(DigitalOut *)led = 0;
archmagic 0:68699c694bbf 66 }
archmagic 0:68699c694bbf 67
archmagic 0:68699c694bbf 68 void led_job(void const *arg){
archmagic 0:68699c694bbf 69 for (int i = 0; i < NLEDS; i++) {
archmagic 0:68699c694bbf 70 DigitalOut *led = new DigitalOut(led_pin[i]);
archmagic 0:68699c694bbf 71 initialize_led(led);
archmagic 0:68699c694bbf 72 }
archmagic 0:68699c694bbf 73
archmagic 0:68699c694bbf 74 for (int i = 0; i < NLEDS; i++) {
archmagic 0:68699c694bbf 75 DigitalOut *led = new DigitalOut(led_pin[i]);
archmagic 0:68699c694bbf 76 RtosTimer *timer =
archmagic 0:68699c694bbf 77 new RtosTimer(led_off, osTimerPeriodic, led);
archmagic 0:68699c694bbf 78 timer->start(led_period[i]);
archmagic 0:68699c694bbf 79 }
archmagic 0:68699c694bbf 80 while(true);
archmagic 0:68699c694bbf 81
archmagic 0:68699c694bbf 82 }
archmagic 0:68699c694bbf 83 void led_job_3(void const *arg){
archmagic 0:68699c694bbf 84 for (int i = 0; i < NLEDS; i++) {
archmagic 0:68699c694bbf 85 DigitalOut *led = new DigitalOut(led_pin[i]);
archmagic 0:68699c694bbf 86 initialize_led0(led);
archmagic 0:68699c694bbf 87 }
archmagic 0:68699c694bbf 88 while(true);
archmagic 0:68699c694bbf 89
archmagic 0:68699c694bbf 90 }
archmagic 0:68699c694bbf 91 void sound_job(void const *arg){
archmagic 0:68699c694bbf 92 //Thread::wait(5000);
archmagic 0:68699c694bbf 93 //beamSound((void *)1);
archmagic 0:68699c694bbf 94
archmagic 0:68699c694bbf 95 while(true);
archmagic 0:68699c694bbf 96
archmagic 0:68699c694bbf 97 }
archmagic 0:68699c694bbf 98 void end_job(void const *arg){
archmagic 0:68699c694bbf 99 Thread::wait(21000);
archmagic 0:68699c694bbf 100
archmagic 0:68699c694bbf 101 timer_end=1;
archmagic 0:68699c694bbf 102 while(true) wait(1000);
archmagic 0:68699c694bbf 103
archmagic 0:68699c694bbf 104 }
archmagic 0:68699c694bbf 105
archmagic 0:68699c694bbf 106
archmagic 0:68699c694bbf 107 int main() {
archmagic 0:68699c694bbf 108 int loop_count=0;
archmagic 0:68699c694bbf 109 int game=0;
archmagic 0:68699c694bbf 110 int rec_s=0;
archmagic 0:68699c694bbf 111
archmagic 0:68699c694bbf 112 bool b0 = false, b1 = false;
archmagic 0:68699c694bbf 113 bool b2 = false, b3 = false;
archmagic 0:68699c694bbf 114
archmagic 0:68699c694bbf 115 int old_pos = 0;
archmagic 0:68699c694bbf 116 accel.setActive(true);
archmagic 0:68699c694bbf 117 accel.setSampleRate(16);
archmagic 0:68699c694bbf 118 while(true) {
archmagic 0:68699c694bbf 119 float y = accel.y();
archmagic 0:68699c694bbf 120 int pos = y < 0 ? 2 : 0;
archmagic 0:68699c694bbf 121 if (pos != old_pos) {
archmagic 0:68699c694bbf 122 led[old_pos] = 0;
archmagic 0:68699c694bbf 123 led[old_pos+1] = 0;
archmagic 0:68699c694bbf 124 led[pos] = 1;
archmagic 0:68699c694bbf 125 led[pos+1] = 1;
archmagic 0:68699c694bbf 126 old_pos = pos;
archmagic 0:68699c694bbf 127 }
archmagic 0:68699c694bbf 128 b0 = b1;
archmagic 0:68699c694bbf 129 b1 = button;
archmagic 0:68699c694bbf 130 if (!b0 && b1) {
archmagic 0:68699c694bbf 131 game=pos+1;
archmagic 0:68699c694bbf 132 break;
archmagic 0:68699c694bbf 133 }
archmagic 0:68699c694bbf 134 }
archmagic 0:68699c694bbf 135
archmagic 0:68699c694bbf 136 if(game==1){
archmagic 0:68699c694bbf 137 Thread led_j(led_job);
archmagic 0:68699c694bbf 138 Thread sound_j(sound_job);
archmagic 0:68699c694bbf 139 //sound_job((void *)0);
archmagic 0:68699c694bbf 140 Thread end_j(end_job);
archmagic 0:68699c694bbf 141
archmagic 0:68699c694bbf 142 //end_job((void *)0);
archmagic 0:68699c694bbf 143 pc.baud(38600);
archmagic 0:68699c694bbf 144 int k = 0;
archmagic 0:68699c694bbf 145 int x=0,y=0;
archmagic 0:68699c694bbf 146 int rex=0, rey=0;
archmagic 0:68699c694bbf 147 int point_count=0;
archmagic 0:68699c694bbf 148 float v=0;
archmagic 0:68699c694bbf 149 srand(1);
archmagic 0:68699c694bbf 150 gps_x=rand()%226+15;
archmagic 0:68699c694bbf 151 gps_y=rand()%226+15;
archmagic 0:68699c694bbf 152
archmagic 0:68699c694bbf 153 while (timer_end==0) {
archmagic 0:68699c694bbf 154 unsigned char sum = 0;
archmagic 0:68699c694bbf 155 acc.readData(r);
archmagic 0:68699c694bbf 156 pc.putc(0);
archmagic 0:68699c694bbf 157 for (int i = 0; i < DIM; i++) {
archmagic 0:68699c694bbf 158 s[i] -= nv[i][k];
archmagic 0:68699c694bbf 159 s[i] += r[i];
archmagic 0:68699c694bbf 160 nv[i][k] = r[i];
archmagic 0:68699c694bbf 161 v = s[i] / N;
archmagic 0:68699c694bbf 162 unsigned char d = (char)((v+1) * 64);
archmagic 0:68699c694bbf 163
archmagic 0:68699c694bbf 164 if(i==0){
archmagic 0:68699c694bbf 165 x=(x+(d-64)/2);
archmagic 0:68699c694bbf 166 rex=(unsigned int)x%256;
archmagic 0:68699c694bbf 167 pc.putc(rex);
archmagic 0:68699c694bbf 168 //dx=(d-64)/10;
archmagic 0:68699c694bbf 169 //dx=d;
archmagic 0:68699c694bbf 170 }
archmagic 0:68699c694bbf 171 if(i==1){
archmagic 0:68699c694bbf 172 y=(y+(d-64)/2);
archmagic 0:68699c694bbf 173 rey=(unsigned int)y%256;
archmagic 0:68699c694bbf 174 pc.putc(rey);
archmagic 0:68699c694bbf 175 //dy=y;
archmagic 0:68699c694bbf 176 }
archmagic 0:68699c694bbf 177 if(i==2){
archmagic 0:68699c694bbf 178 pc.putc(10);
archmagic 0:68699c694bbf 179 }
archmagic 0:68699c694bbf 180 }
archmagic 0:68699c694bbf 181 sum=x+y+10;
archmagic 0:68699c694bbf 182 pc.putc(sum);
archmagic 0:68699c694bbf 183
archmagic 0:68699c694bbf 184 if((gps_x)<rex&&rex<(gps_x+20)){
archmagic 0:68699c694bbf 185 if((gps_y-15)<rey&&rey<(gps_y+5)){
archmagic 0:68699c694bbf 186 gps_x=rand()%226+15;
archmagic 0:68699c694bbf 187 gps_y=rand()%226+15;
archmagic 0:68699c694bbf 188
archmagic 0:68699c694bbf 189 point_count++;
archmagic 0:68699c694bbf 190 beamSound((void *)1);
archmagic 0:68699c694bbf 191 }
archmagic 0:68699c694bbf 192 }
archmagic 0:68699c694bbf 193
archmagic 0:68699c694bbf 194 pc.putc(gps_x);
archmagic 0:68699c694bbf 195 pc.putc(gps_y);
archmagic 0:68699c694bbf 196 pc.putc(point_count);
archmagic 0:68699c694bbf 197 rec_s=1;
archmagic 0:68699c694bbf 198 pc.putc(rec_s);
archmagic 0:68699c694bbf 199
archmagic 0:68699c694bbf 200 k = (k + 1) % N;
archmagic 0:68699c694bbf 201 wait(0.05);
archmagic 0:68699c694bbf 202 }
archmagic 0:68699c694bbf 203 }
archmagic 0:68699c694bbf 204 if(game==3){
archmagic 0:68699c694bbf 205 Thread led_j(led_job_3);
archmagic 0:68699c694bbf 206 Thread sound_j(sound_job);
archmagic 0:68699c694bbf 207 //sound_job((void *)0);
archmagic 0:68699c694bbf 208 //Thread end_j(end_job);
archmagic 0:68699c694bbf 209
archmagic 0:68699c694bbf 210 pc.baud(38600);
archmagic 0:68699c694bbf 211 int k = 0;
archmagic 0:68699c694bbf 212 int x=0,y=0;
archmagic 0:68699c694bbf 213 int rex=0, rey=0;
archmagic 0:68699c694bbf 214 int point_count=0;
archmagic 0:68699c694bbf 215 float v=0;
archmagic 0:68699c694bbf 216 srand(7);
archmagic 0:68699c694bbf 217 gps_x=rand()%226+15;
archmagic 0:68699c694bbf 218 gps_y=rand()%226+15;
archmagic 0:68699c694bbf 219
archmagic 0:68699c694bbf 220 while (timer_end==0) {
archmagic 0:68699c694bbf 221 unsigned char sum = 0;
archmagic 0:68699c694bbf 222 acc.readData(r);
archmagic 0:68699c694bbf 223 pc.putc(0);
archmagic 0:68699c694bbf 224 for (int i = 0; i < DIM; i++) {
archmagic 0:68699c694bbf 225 s[i] -= nv[i][k];
archmagic 0:68699c694bbf 226 s[i] += r[i];
archmagic 0:68699c694bbf 227 nv[i][k] = r[i];
archmagic 0:68699c694bbf 228 v = s[i] / N;
archmagic 0:68699c694bbf 229 unsigned char d = (char)((v+1) * 64);
archmagic 0:68699c694bbf 230
archmagic 0:68699c694bbf 231 if(i==0){
archmagic 0:68699c694bbf 232 x=(x+(d-64)/2);
archmagic 0:68699c694bbf 233 rex=(unsigned int)x%256;
archmagic 0:68699c694bbf 234 pc.putc(rex);
archmagic 0:68699c694bbf 235 //dx=(d-64)/10;
archmagic 0:68699c694bbf 236 //dx=d;
archmagic 0:68699c694bbf 237 }
archmagic 0:68699c694bbf 238 if(i==1){
archmagic 0:68699c694bbf 239 y=(y+(d-64)/2);
archmagic 0:68699c694bbf 240 rey=(unsigned int)y%256;
archmagic 0:68699c694bbf 241 pc.putc(rey);
archmagic 0:68699c694bbf 242 //dy=y;
archmagic 0:68699c694bbf 243 }
archmagic 0:68699c694bbf 244 if(i==2){
archmagic 0:68699c694bbf 245 pc.putc(10);
archmagic 0:68699c694bbf 246 }
archmagic 0:68699c694bbf 247 }
archmagic 0:68699c694bbf 248 sum=x+y+10;
archmagic 0:68699c694bbf 249 pc.putc(sum);
archmagic 0:68699c694bbf 250
archmagic 0:68699c694bbf 251 if((gps_x-rex)*(gps_x-rex)+(gps_y-rey)*(gps_y-rey)<4900){
archmagic 0:68699c694bbf 252 led[3]=1;
archmagic 0:68699c694bbf 253 }
archmagic 0:68699c694bbf 254 else led[3]=0;
archmagic 0:68699c694bbf 255 if((gps_x-rex)*(gps_x-rex)+(gps_y-rey)*(gps_y-rey)<2500){
archmagic 0:68699c694bbf 256 led[2]=1;
archmagic 0:68699c694bbf 257 }
archmagic 0:68699c694bbf 258 else led[2]=0;
archmagic 0:68699c694bbf 259 if((gps_x-rex)*(gps_x-rex)+(gps_y-rey)*(gps_y-rey)<900){
archmagic 0:68699c694bbf 260 led[1]=1;
archmagic 0:68699c694bbf 261 }
archmagic 0:68699c694bbf 262 else led[1]=0;
archmagic 0:68699c694bbf 263 if((gps_x-rex)*(gps_x-rex)+(gps_y-rey)*(gps_y-rey)<400){
archmagic 0:68699c694bbf 264 led[0]=1;
archmagic 0:68699c694bbf 265 }
archmagic 0:68699c694bbf 266 else led[0]=0;
archmagic 0:68699c694bbf 267
archmagic 0:68699c694bbf 268 if(button2) buttonValue = true;
archmagic 0:68699c694bbf 269 else buttonValue = false;
archmagic 0:68699c694bbf 270
archmagic 0:68699c694bbf 271 b3 = buttonValue;
archmagic 0:68699c694bbf 272
archmagic 0:68699c694bbf 273 if (!b2 && b3) {
archmagic 0:68699c694bbf 274 if(loop_count!=0){
archmagic 0:68699c694bbf 275 if((gps_x-rex)*(gps_x-rex)+(gps_y-rey)*(gps_y-rey)<400){
archmagic 0:68699c694bbf 276 timer_end=1;
archmagic 0:68699c694bbf 277 }
archmagic 0:68699c694bbf 278 //else{
archmagic 0:68699c694bbf 279 //beamSound((void *)1);
archmagic 0:68699c694bbf 280 //}
archmagic 0:68699c694bbf 281 }
archmagic 0:68699c694bbf 282 }
archmagic 0:68699c694bbf 283 loop_count=1;
archmagic 0:68699c694bbf 284
archmagic 0:68699c694bbf 285 pc.putc(gps_x);
archmagic 0:68699c694bbf 286 pc.putc(gps_y);
archmagic 0:68699c694bbf 287 pc.putc(point_count);
archmagic 0:68699c694bbf 288 rec_s=3;
archmagic 0:68699c694bbf 289 pc.putc(rec_s);
archmagic 0:68699c694bbf 290
archmagic 0:68699c694bbf 291
archmagic 0:68699c694bbf 292 k = (k + 1) % N;
archmagic 0:68699c694bbf 293 wait(0.05);
archmagic 0:68699c694bbf 294 }
archmagic 0:68699c694bbf 295 }
archmagic 0:68699c694bbf 296 endSound((void *)1);
archmagic 0:68699c694bbf 297 endSound((void *)1);
archmagic 0:68699c694bbf 298 endSound((void *)1);
archmagic 0:68699c694bbf 299 }