Two mini game with accelerometer 13M15330 Sangwon Yoo 13M38502 Hanyoung Kim
Dependencies: MMA7660 mbed-rtos mbed
main.cpp@0:68699c694bbf, 2014-02-14 (annotated)
- Committer:
- archmagic
- Date:
- Fri Feb 14 01:26:40 2014 +0000
- Revision:
- 0:68699c694bbf
AOS
Who changed what in which revision?
User | Revision | Line number | New 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 | } |