sxa
Dependents: MP3333 B18_MP3_PLAYER B18_MP3_PLAYER B18_MP3_PLAYER
player.cpp@3:934d5e72990a, 2015-12-09 (annotated)
- Committer:
- PKnevermind
- Date:
- Wed Dec 09 08:32:13 2015 +0000
- Revision:
- 3:934d5e72990a
- Parent:
- 2:6f21eae5f456
VS1053
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
PKnevermind | 0:928e5b21896c | 1 | #include "player.h" |
PKnevermind | 0:928e5b21896c | 2 | #include "SDFileSystem.h" |
PKnevermind | 3:934d5e72990a | 3 | #include "MPU9250.h" |
PKnevermind | 3:934d5e72990a | 4 | #include "SPI_TFT_ILI9341.h" |
PKnevermind | 3:934d5e72990a | 5 | #include "stdio.h" |
PKnevermind | 3:934d5e72990a | 6 | #include "string" |
PKnevermind | 3:934d5e72990a | 7 | #include "Arial12x12.h" |
PKnevermind | 3:934d5e72990a | 8 | #include "Arial24x23.h" |
PKnevermind | 3:934d5e72990a | 9 | #include "Arial28x28.h" |
PKnevermind | 3:934d5e72990a | 10 | #include "font_big.h" |
PKnevermind | 0:928e5b21896c | 11 | |
PKnevermind | 2:6f21eae5f456 | 12 | SDFileSystem sd(D11, D12, D13, D9, "sd"); // the pinout on the mbed Cool |
PKnevermind | 2:6f21eae5f456 | 13 | vs10xx vs1053(D11, D12, D13, D6, D7, D2, D8 );//mosi,miso,sclk,xcs,xdcs,dreq,xreset |
PKnevermind | 3:934d5e72990a | 14 | DigitalOut red(A0); |
PKnevermind | 3:934d5e72990a | 15 | DigitalOut green(A2); |
PKnevermind | 3:934d5e72990a | 16 | DigitalOut blue(A1); |
PKnevermind | 3:934d5e72990a | 17 | DigitalIn Mode(A5); |
PKnevermind | 0:928e5b21896c | 18 | |
PKnevermind | 3:934d5e72990a | 19 | MPU9250 mpu9250; |
PKnevermind | 0:928e5b21896c | 20 | playerStatetype playerState; |
PKnevermind | 0:928e5b21896c | 21 | ctrlStatetype ctrlState; |
PKnevermind | 2:6f21eae5f456 | 22 | static unsigned char fileBuf[65536]; |
PKnevermind | 0:928e5b21896c | 23 | unsigned char *bufptr; |
PKnevermind | 0:928e5b21896c | 24 | |
PKnevermind | 3:934d5e72990a | 25 | extern unsigned char p1[]; |
PKnevermind | 3:934d5e72990a | 26 | extern unsigned char p2[]; |
PKnevermind | 3:934d5e72990a | 27 | extern unsigned char p3[]; |
PKnevermind | 3:934d5e72990a | 28 | |
PKnevermind | 0:928e5b21896c | 29 | char list[20][50]; //song list |
PKnevermind | 0:928e5b21896c | 30 | char index = 0; //song play index |
PKnevermind | 0:928e5b21896c | 31 | char index_MAX; //how many song in all |
PKnevermind | 0:928e5b21896c | 32 | unsigned char vlume = 0x40; //vlume |
PKnevermind | 0:928e5b21896c | 33 | unsigned char vlumeflag = 0; //set vlume flag |
PKnevermind | 3:934d5e72990a | 34 | float sum = 0; |
PKnevermind | 3:934d5e72990a | 35 | uint32_t sumCount = 0; |
PKnevermind | 3:934d5e72990a | 36 | char buffer[14]; |
PKnevermind | 3:934d5e72990a | 37 | uint8_t dato_leido[2]; |
PKnevermind | 3:934d5e72990a | 38 | uint8_t whoami; |
PKnevermind | 3:934d5e72990a | 39 | Timer t; |
PKnevermind | 3:934d5e72990a | 40 | int check = 0; |
PKnevermind | 3:934d5e72990a | 41 | |
PKnevermind | 3:934d5e72990a | 42 | int mark=20; |
PKnevermind | 3:934d5e72990a | 43 | SPI_TFT_ILI9341 TFT(PA_7,PA_6,PA_5,PA_13,PA_14,PA_15,"TFT"); // mosi, miso, sclk, cs, reset, dc |
PKnevermind | 3:934d5e72990a | 44 | |
PKnevermind | 0:928e5b21896c | 45 | |
PKnevermind | 0:928e5b21896c | 46 | void Player::begin(void) |
PKnevermind | 0:928e5b21896c | 47 | { |
PKnevermind | 0:928e5b21896c | 48 | DirHandle *dir; |
PKnevermind | 0:928e5b21896c | 49 | struct dirent *ptr; |
PKnevermind | 0:928e5b21896c | 50 | FileHandle *fp; |
PKnevermind | 0:928e5b21896c | 51 | |
PKnevermind | 0:928e5b21896c | 52 | vs1053.reset(); |
PKnevermind | 0:928e5b21896c | 53 | dir = opendir("/sd"); |
PKnevermind | 0:928e5b21896c | 54 | printf("\r\n**********playing list**********\r\n"); |
PKnevermind | 0:928e5b21896c | 55 | unsigned char i = 0,j=0; |
PKnevermind | 0:928e5b21896c | 56 | while(((ptr = dir->readdir()) != NULL)&&(i <20)) { |
PKnevermind | 0:928e5b21896c | 57 | if(strstr(ptr->d_name,".mp3")||strstr(ptr->d_name,".MP3")) { |
PKnevermind | 0:928e5b21896c | 58 | fp =sd.open(ptr->d_name, O_RDONLY); |
PKnevermind | 0:928e5b21896c | 59 | if(fp != NULL) { |
PKnevermind | 0:928e5b21896c | 60 | char *byte = ptr->d_name; |
PKnevermind | 0:928e5b21896c | 61 | j=0; |
PKnevermind | 0:928e5b21896c | 62 | while(*byte) { |
PKnevermind | 0:928e5b21896c | 63 | list[i][j++] = *byte++; |
PKnevermind | 0:928e5b21896c | 64 | } |
PKnevermind | 3:934d5e72990a | 65 | printf("%2d . %s\r\n", i+1,list[i++]); |
PKnevermind | 0:928e5b21896c | 66 | fp->close(); |
PKnevermind | 0:928e5b21896c | 67 | } |
PKnevermind | 0:928e5b21896c | 68 | } |
PKnevermind | 0:928e5b21896c | 69 | } |
PKnevermind | 0:928e5b21896c | 70 | index_MAX = i-1; |
PKnevermind | 0:928e5b21896c | 71 | dir->closedir(); |
PKnevermind | 0:928e5b21896c | 72 | printf("\r\n"); |
PKnevermind | 0:928e5b21896c | 73 | } |
PKnevermind | 0:928e5b21896c | 74 | |
PKnevermind | 0:928e5b21896c | 75 | /* This function plays back an audio file. */ |
PKnevermind | 0:928e5b21896c | 76 | void Player::playFile(char *file) |
PKnevermind | 0:928e5b21896c | 77 | { |
PKnevermind | 0:928e5b21896c | 78 | int bytes; // How many bytes in buffer left |
PKnevermind | 0:928e5b21896c | 79 | int n; |
PKnevermind | 3:934d5e72990a | 80 | int x=0; |
PKnevermind | 3:934d5e72990a | 81 | check = mode(); |
PKnevermind | 0:928e5b21896c | 82 | |
PKnevermind | 0:928e5b21896c | 83 | playerState = PS_PLAY; |
PKnevermind | 3:934d5e72990a | 84 | GREEN(); |
PKnevermind | 0:928e5b21896c | 85 | vs1053.setFreq(24000000); //hight speed |
PKnevermind | 0:928e5b21896c | 86 | FileHandle *fp =sd.open(file, O_RDONLY); |
PKnevermind | 0:928e5b21896c | 87 | if(fp == NULL) { |
PKnevermind | 0:928e5b21896c | 88 | printf("Could not open %s\r\n",file); |
PKnevermind | 0:928e5b21896c | 89 | |
PKnevermind | 0:928e5b21896c | 90 | } else { |
PKnevermind | 0:928e5b21896c | 91 | |
PKnevermind | 0:928e5b21896c | 92 | /* Main playback loop */ |
PKnevermind | 2:6f21eae5f456 | 93 | while((bytes = fp->read(fileBuf,32000)) > 0) { |
PKnevermind | 0:928e5b21896c | 94 | bufptr = fileBuf; |
PKnevermind | 0:928e5b21896c | 95 | |
PKnevermind | 0:928e5b21896c | 96 | // actual audio data gets sent to VS10xx. |
PKnevermind | 0:928e5b21896c | 97 | while(bytes > 0) { |
PKnevermind | 3:934d5e72990a | 98 | n = (bytes < 32)?bytes:32; |
PKnevermind | 0:928e5b21896c | 99 | vs1053.writeData(bufptr,n); |
PKnevermind | 0:928e5b21896c | 100 | bytes -= n; |
PKnevermind | 0:928e5b21896c | 101 | bufptr += n; |
PKnevermind | 2:6f21eae5f456 | 102 | if(playerState == PS_STOP)break; |
PKnevermind | 3:934d5e72990a | 103 | else if(mode() != check){ |
PKnevermind | 3:934d5e72990a | 104 | check = mode(); |
PKnevermind | 3:934d5e72990a | 105 | if(mode() == 0)letplay(); |
PKnevermind | 3:934d5e72990a | 106 | else print_list(); |
PKnevermind | 3:934d5e72990a | 107 | } |
PKnevermind | 3:934d5e72990a | 108 | else if(!mode()) { |
PKnevermind | 3:934d5e72990a | 109 | if(getGY()>50){ |
PKnevermind | 3:934d5e72990a | 110 | playerState = PS_PAUSE; |
PKnevermind | 3:934d5e72990a | 111 | cry(); |
PKnevermind | 3:934d5e72990a | 112 | } |
PKnevermind | 3:934d5e72990a | 113 | else if(getGX()<-30) { |
PKnevermind | 3:934d5e72990a | 114 | playerState = PS_STOP; |
PKnevermind | 3:934d5e72990a | 115 | angry(); |
PKnevermind | 3:934d5e72990a | 116 | x = 1; |
PKnevermind | 3:934d5e72990a | 117 | } else if(getGX()>30) { |
PKnevermind | 3:934d5e72990a | 118 | playerState = PS_STOP; |
PKnevermind | 3:934d5e72990a | 119 | angry(); |
PKnevermind | 3:934d5e72990a | 120 | x = 2; |
PKnevermind | 3:934d5e72990a | 121 | } |
PKnevermind | 3:934d5e72990a | 122 | } |
PKnevermind | 3:934d5e72990a | 123 | while(playerState == PS_PAUSE) { |
PKnevermind | 3:934d5e72990a | 124 | wait(0.2); |
PKnevermind | 3:934d5e72990a | 125 | RED(); |
PKnevermind | 3:934d5e72990a | 126 | if(getGY()<-50){ |
PKnevermind | 3:934d5e72990a | 127 | playerState = PS_PLAY; |
PKnevermind | 3:934d5e72990a | 128 | GREEN(); |
PKnevermind | 3:934d5e72990a | 129 | } |
PKnevermind | 3:934d5e72990a | 130 | } |
PKnevermind | 0:928e5b21896c | 131 | } |
PKnevermind | 2:6f21eae5f456 | 132 | if(playerState == PS_STOP)break; |
PKnevermind | 0:928e5b21896c | 133 | } |
PKnevermind | 0:928e5b21896c | 134 | fp->close(); |
PKnevermind | 0:928e5b21896c | 135 | vs1053.softReset(); |
PKnevermind | 0:928e5b21896c | 136 | } |
PKnevermind | 3:934d5e72990a | 137 | if(x == 1|| x==0){ |
PKnevermind | 3:934d5e72990a | 138 | wait(0.6); |
PKnevermind | 3:934d5e72990a | 139 | if(index != index_MAX)index++; |
PKnevermind | 3:934d5e72990a | 140 | else index = 0; |
PKnevermind | 3:934d5e72990a | 141 | } |
PKnevermind | 3:934d5e72990a | 142 | else if(x == 2){ |
PKnevermind | 3:934d5e72990a | 143 | wait(0.6); |
PKnevermind | 3:934d5e72990a | 144 | if(index != 0)index--; |
PKnevermind | 3:934d5e72990a | 145 | else index = index_MAX; |
PKnevermind | 3:934d5e72990a | 146 | } |
PKnevermind | 0:928e5b21896c | 147 | } |
PKnevermind | 0:928e5b21896c | 148 | |
PKnevermind | 0:928e5b21896c | 149 | void Set32(unsigned char *d, unsigned int n) |
PKnevermind | 0:928e5b21896c | 150 | { |
PKnevermind | 0:928e5b21896c | 151 | int i; |
PKnevermind | 0:928e5b21896c | 152 | for (i=0; i<4; i++) { |
PKnevermind | 0:928e5b21896c | 153 | *d++ = (unsigned char)n; |
PKnevermind | 0:928e5b21896c | 154 | n >>= 8; |
PKnevermind | 0:928e5b21896c | 155 | } |
PKnevermind | 0:928e5b21896c | 156 | } |
PKnevermind | 3:934d5e72990a | 157 | |
PKnevermind | 3:934d5e72990a | 158 | void Player::RED() |
PKnevermind | 3:934d5e72990a | 159 | { |
PKnevermind | 3:934d5e72990a | 160 | red = 1; |
PKnevermind | 3:934d5e72990a | 161 | green = 0; |
PKnevermind | 3:934d5e72990a | 162 | blue = 0; |
PKnevermind | 3:934d5e72990a | 163 | } |
PKnevermind | 3:934d5e72990a | 164 | |
PKnevermind | 3:934d5e72990a | 165 | void Player::GREEN() |
PKnevermind | 3:934d5e72990a | 166 | { |
PKnevermind | 3:934d5e72990a | 167 | red = 0 ; |
PKnevermind | 3:934d5e72990a | 168 | green = 1; |
PKnevermind | 3:934d5e72990a | 169 | blue = 0; |
PKnevermind | 3:934d5e72990a | 170 | } |
PKnevermind | 3:934d5e72990a | 171 | |
PKnevermind | 3:934d5e72990a | 172 | void Player::BLUE() |
PKnevermind | 3:934d5e72990a | 173 | { |
PKnevermind | 3:934d5e72990a | 174 | red = 0; |
PKnevermind | 3:934d5e72990a | 175 | green = 0; |
PKnevermind | 3:934d5e72990a | 176 | blue = 1; |
PKnevermind | 3:934d5e72990a | 177 | } |
PKnevermind | 3:934d5e72990a | 178 | |
PKnevermind | 3:934d5e72990a | 179 | int Player::getGY() |
PKnevermind | 3:934d5e72990a | 180 | { |
PKnevermind | 3:934d5e72990a | 181 | // If intPin goes high, all data registers have new data |
PKnevermind | 3:934d5e72990a | 182 | if(mpu9250.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) { // On interrupt, check if data ready interrupt |
PKnevermind | 3:934d5e72990a | 183 | |
PKnevermind | 3:934d5e72990a | 184 | mpu9250.readAccelData(accelCount); // Read the x/y/z adc values |
PKnevermind | 3:934d5e72990a | 185 | // Now we'll calculate the accleration value into actual g's |
PKnevermind | 3:934d5e72990a | 186 | if (I2Cstate != 0) //error on I2C |
PKnevermind | 3:934d5e72990a | 187 | printf("I2C error ocurred while reading accelerometer data. I2Cstate = %d \n\r", I2Cstate); |
PKnevermind | 3:934d5e72990a | 188 | else { // I2C read or write ok |
PKnevermind | 3:934d5e72990a | 189 | I2Cstate = 1; |
PKnevermind | 3:934d5e72990a | 190 | ax = (float)accelCount[0]*aRes - accelBias[0]; // get actual g value, this depends on scale being set |
PKnevermind | 3:934d5e72990a | 191 | ay = (float)accelCount[1]*aRes - accelBias[1]; |
PKnevermind | 3:934d5e72990a | 192 | az = (float)accelCount[2]*aRes - accelBias[2]; |
PKnevermind | 3:934d5e72990a | 193 | } |
PKnevermind | 3:934d5e72990a | 194 | |
PKnevermind | 3:934d5e72990a | 195 | mpu9250.readGyroData(gyroCount); // Read the x/y/z adc values |
PKnevermind | 3:934d5e72990a | 196 | // Calculate the gyro value into actual degrees per second |
PKnevermind | 3:934d5e72990a | 197 | if (I2Cstate != 0) //error on I2C |
PKnevermind | 3:934d5e72990a | 198 | printf("I2C error ocurred while reading gyrometer data. I2Cstate = %d \n\r", I2Cstate); |
PKnevermind | 3:934d5e72990a | 199 | else { // I2C read or write ok |
PKnevermind | 3:934d5e72990a | 200 | I2Cstate = 1; |
PKnevermind | 3:934d5e72990a | 201 | gx = (float)gyroCount[0]*gRes - gyroBias[0]; // get actual gyro value, this depends on scale being set |
PKnevermind | 3:934d5e72990a | 202 | gy = (float)gyroCount[1]*gRes - gyroBias[1]; |
PKnevermind | 3:934d5e72990a | 203 | gz = (float)gyroCount[2]*gRes - gyroBias[2]; |
PKnevermind | 3:934d5e72990a | 204 | } |
PKnevermind | 3:934d5e72990a | 205 | |
PKnevermind | 3:934d5e72990a | 206 | mpu9250.readMagData(magCount); // Read the x/y/z adc values |
PKnevermind | 3:934d5e72990a | 207 | // Calculate the magnetometer values in milliGauss |
PKnevermind | 3:934d5e72990a | 208 | // Include factory calibration per data sheet and user environmental corrections |
PKnevermind | 3:934d5e72990a | 209 | if (I2Cstate != 0) //error on I2C |
PKnevermind | 3:934d5e72990a | 210 | printf("I2C error ocurred while reading magnetometer data. I2Cstate = %d \n\r", I2Cstate); |
PKnevermind | 3:934d5e72990a | 211 | else { // I2C read or write ok |
PKnevermind | 3:934d5e72990a | 212 | I2Cstate = 1; |
PKnevermind | 3:934d5e72990a | 213 | mx = (float)magCount[0]*mRes*magCalibration[0] - magbias[0]; // get actual magnetometer value, this depends on scale being set |
PKnevermind | 3:934d5e72990a | 214 | my = (float)magCount[1]*mRes*magCalibration[1] - magbias[1]; |
PKnevermind | 3:934d5e72990a | 215 | mz = (float)magCount[2]*mRes*magCalibration[2] - magbias[2]; |
PKnevermind | 3:934d5e72990a | 216 | } |
PKnevermind | 3:934d5e72990a | 217 | |
PKnevermind | 3:934d5e72990a | 218 | mpu9250.getCompassOrientation(orientation); |
PKnevermind | 3:934d5e72990a | 219 | } |
PKnevermind | 3:934d5e72990a | 220 | |
PKnevermind | 3:934d5e72990a | 221 | //Now = t.read_us(); |
PKnevermind | 3:934d5e72990a | 222 | //deltat = (float)((Now - lastUpdate)/1000000.0f) ; // set integration time by time elapsed since last filter update |
PKnevermind | 3:934d5e72990a | 223 | //lastUpdate = Now; |
PKnevermind | 3:934d5e72990a | 224 | //sum += deltat; |
PKnevermind | 3:934d5e72990a | 225 | //sumCount++; |
PKnevermind | 3:934d5e72990a | 226 | |
PKnevermind | 3:934d5e72990a | 227 | // Pass gyro rate as rad/s |
PKnevermind | 3:934d5e72990a | 228 | // mpu9250.MadgwickQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f, my, mx, mz); |
PKnevermind | 3:934d5e72990a | 229 | mpu9250.MahonyQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f, my, mx, mz); |
PKnevermind | 3:934d5e72990a | 230 | |
PKnevermind | 3:934d5e72990a | 231 | return gy; |
PKnevermind | 3:934d5e72990a | 232 | } |
PKnevermind | 3:934d5e72990a | 233 | |
PKnevermind | 3:934d5e72990a | 234 | int Player::getGX() |
PKnevermind | 3:934d5e72990a | 235 | { |
PKnevermind | 3:934d5e72990a | 236 | // If intPin goes high, all data registers have new data |
PKnevermind | 3:934d5e72990a | 237 | if(mpu9250.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) { // On interrupt, check if data ready interrupt |
PKnevermind | 3:934d5e72990a | 238 | |
PKnevermind | 3:934d5e72990a | 239 | mpu9250.readAccelData(accelCount); // Read the x/y/z adc values |
PKnevermind | 3:934d5e72990a | 240 | // Now we'll calculate the accleration value into actual g's |
PKnevermind | 3:934d5e72990a | 241 | if (I2Cstate != 0) //error on I2C |
PKnevermind | 3:934d5e72990a | 242 | printf("I2C error ocurred while reading accelerometer data. I2Cstate = %d \n\r", I2Cstate); |
PKnevermind | 3:934d5e72990a | 243 | else { // I2C read or write ok |
PKnevermind | 3:934d5e72990a | 244 | I2Cstate = 1; |
PKnevermind | 3:934d5e72990a | 245 | ax = (float)accelCount[0]*aRes - accelBias[0]; // get actual g value, this depends on scale being set |
PKnevermind | 3:934d5e72990a | 246 | ay = (float)accelCount[1]*aRes - accelBias[1]; |
PKnevermind | 3:934d5e72990a | 247 | az = (float)accelCount[2]*aRes - accelBias[2]; |
PKnevermind | 3:934d5e72990a | 248 | } |
PKnevermind | 3:934d5e72990a | 249 | |
PKnevermind | 3:934d5e72990a | 250 | mpu9250.readGyroData(gyroCount); // Read the x/y/z adc values |
PKnevermind | 3:934d5e72990a | 251 | // Calculate the gyro value into actual degrees per second |
PKnevermind | 3:934d5e72990a | 252 | if (I2Cstate != 0) //error on I2C |
PKnevermind | 3:934d5e72990a | 253 | printf("I2C error ocurred while reading gyrometer data. I2Cstate = %d \n\r", I2Cstate); |
PKnevermind | 3:934d5e72990a | 254 | else { // I2C read or write ok |
PKnevermind | 3:934d5e72990a | 255 | I2Cstate = 1; |
PKnevermind | 3:934d5e72990a | 256 | gx = (float)gyroCount[0]*gRes - gyroBias[0]; // get actual gyro value, this depends on scale being set |
PKnevermind | 3:934d5e72990a | 257 | gy = (float)gyroCount[1]*gRes - gyroBias[1]; |
PKnevermind | 3:934d5e72990a | 258 | gz = (float)gyroCount[2]*gRes - gyroBias[2]; |
PKnevermind | 3:934d5e72990a | 259 | } |
PKnevermind | 3:934d5e72990a | 260 | |
PKnevermind | 3:934d5e72990a | 261 | mpu9250.readMagData(magCount); // Read the x/y/z adc values |
PKnevermind | 3:934d5e72990a | 262 | // Calculate the magnetometer values in milliGauss |
PKnevermind | 3:934d5e72990a | 263 | // Include factory calibration per data sheet and user environmental corrections |
PKnevermind | 3:934d5e72990a | 264 | if (I2Cstate != 0) //error on I2C |
PKnevermind | 3:934d5e72990a | 265 | printf("I2C error ocurred while reading magnetometer data. I2Cstate = %d \n\r", I2Cstate); |
PKnevermind | 3:934d5e72990a | 266 | else { // I2C read or write ok |
PKnevermind | 3:934d5e72990a | 267 | I2Cstate = 1; |
PKnevermind | 3:934d5e72990a | 268 | mx = (float)magCount[0]*mRes*magCalibration[0] - magbias[0]; // get actual magnetometer value, this depends on scale being set |
PKnevermind | 3:934d5e72990a | 269 | my = (float)magCount[1]*mRes*magCalibration[1] - magbias[1]; |
PKnevermind | 3:934d5e72990a | 270 | mz = (float)magCount[2]*mRes*magCalibration[2] - magbias[2]; |
PKnevermind | 3:934d5e72990a | 271 | } |
PKnevermind | 3:934d5e72990a | 272 | |
PKnevermind | 3:934d5e72990a | 273 | mpu9250.getCompassOrientation(orientation); |
PKnevermind | 3:934d5e72990a | 274 | } |
PKnevermind | 3:934d5e72990a | 275 | |
PKnevermind | 3:934d5e72990a | 276 | //Now = t.read_us(); |
PKnevermind | 3:934d5e72990a | 277 | //deltat = (float)((Now - lastUpdate)/1000000.0f) ; // set integration time by time elapsed since last filter update |
PKnevermind | 3:934d5e72990a | 278 | //lastUpdate = Now; |
PKnevermind | 3:934d5e72990a | 279 | //sum += deltat; |
PKnevermind | 3:934d5e72990a | 280 | //sumCount++; |
PKnevermind | 3:934d5e72990a | 281 | |
PKnevermind | 3:934d5e72990a | 282 | // Pass gyro rate as rad/s |
PKnevermind | 3:934d5e72990a | 283 | // mpu9250.MadgwickQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f, my, mx, mz); |
PKnevermind | 3:934d5e72990a | 284 | mpu9250.MahonyQuaternionUpdate(ax, ay, az, gx*PI/180.0f, gy*PI/180.0f, gz*PI/180.0f, my, mx, mz); |
PKnevermind | 3:934d5e72990a | 285 | |
PKnevermind | 3:934d5e72990a | 286 | return gx; |
PKnevermind | 3:934d5e72990a | 287 | } |
PKnevermind | 3:934d5e72990a | 288 | |
PKnevermind | 3:934d5e72990a | 289 | void Player::setup() |
PKnevermind | 3:934d5e72990a | 290 | { |
PKnevermind | 3:934d5e72990a | 291 | //___ Set up I2C: use fast (400 kHz) I2C ___ |
PKnevermind | 3:934d5e72990a | 292 | i2c.frequency(400000); |
PKnevermind | 3:934d5e72990a | 293 | |
PKnevermind | 3:934d5e72990a | 294 | printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock); |
PKnevermind | 3:934d5e72990a | 295 | |
PKnevermind | 3:934d5e72990a | 296 | t.start(); // Timer ON |
PKnevermind | 3:934d5e72990a | 297 | |
PKnevermind | 3:934d5e72990a | 298 | // Read the WHO_AM_I register, this is a good test of communication |
PKnevermind | 3:934d5e72990a | 299 | whoami = mpu9250.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250); |
PKnevermind | 3:934d5e72990a | 300 | |
PKnevermind | 3:934d5e72990a | 301 | printf("I AM 0x%x\n\r", whoami); |
PKnevermind | 3:934d5e72990a | 302 | printf("I SHOULD BE 0x71\n\r"); |
PKnevermind | 3:934d5e72990a | 303 | if (I2Cstate != 0) // error on I2C |
PKnevermind | 3:934d5e72990a | 304 | printf("I2C failure while reading WHO_AM_I register"); |
PKnevermind | 3:934d5e72990a | 305 | |
PKnevermind | 3:934d5e72990a | 306 | if (whoami == 0x71) { // WHO_AM_I should always be 0x71 |
PKnevermind | 3:934d5e72990a | 307 | printf("MPU9250 WHO_AM_I is 0x%x\n\r", whoami); |
PKnevermind | 3:934d5e72990a | 308 | printf("MPU9250 is online...\n\r"); |
PKnevermind | 3:934d5e72990a | 309 | sprintf(buffer, "0x%x", whoami); |
PKnevermind | 3:934d5e72990a | 310 | wait(1); |
PKnevermind | 3:934d5e72990a | 311 | |
PKnevermind | 3:934d5e72990a | 312 | mpu9250.resetMPU9250(); // Reset registers to default in preparation for device calibration |
PKnevermind | 3:934d5e72990a | 313 | |
PKnevermind | 3:934d5e72990a | 314 | mpu9250.MPU9250SelfTest(SelfTest); // Start by performing self test and reporting values (accelerometer and gyroscope self test) |
PKnevermind | 3:934d5e72990a | 315 | |
PKnevermind | 3:934d5e72990a | 316 | mpu9250.calibrateMPU9250(gyroBias, accelBias); // Calibrate gyro and accelerometer, load biases in bias registers |
PKnevermind | 3:934d5e72990a | 317 | |
PKnevermind | 3:934d5e72990a | 318 | wait(2); |
PKnevermind | 3:934d5e72990a | 319 | |
PKnevermind | 3:934d5e72990a | 320 | // Initialize device for active mode read of acclerometer, gyroscope, and temperature |
PKnevermind | 3:934d5e72990a | 321 | mpu9250.initMPU9250(); |
PKnevermind | 3:934d5e72990a | 322 | |
PKnevermind | 3:934d5e72990a | 323 | |
PKnevermind | 3:934d5e72990a | 324 | // Initialize device for active mode read of magnetometer, 16 bit resolution, 100Hz. |
PKnevermind | 3:934d5e72990a | 325 | mpu9250.initAK8963(magCalibration); |
PKnevermind | 3:934d5e72990a | 326 | wait(1); |
PKnevermind | 3:934d5e72990a | 327 | } |
PKnevermind | 3:934d5e72990a | 328 | |
PKnevermind | 3:934d5e72990a | 329 | else { // Connection failure |
PKnevermind | 3:934d5e72990a | 330 | while(1) ; // Loop forever if communication doesn't happen |
PKnevermind | 3:934d5e72990a | 331 | } |
PKnevermind | 3:934d5e72990a | 332 | |
PKnevermind | 3:934d5e72990a | 333 | mpu9250.getAres(); // Get accelerometer sensitivity |
PKnevermind | 3:934d5e72990a | 334 | mpu9250.getGres(); // Get gyro sensitivity |
PKnevermind | 3:934d5e72990a | 335 | mpu9250.getMres(); // Get magnetometer sensitivity |
PKnevermind | 3:934d5e72990a | 336 | magbias[0] = +470.; // User environmental x-axis correction in milliGauss, should be automatically calculated |
PKnevermind | 3:934d5e72990a | 337 | magbias[1] = +120.; // User environmental x-axis correction in milliGauss |
PKnevermind | 3:934d5e72990a | 338 | magbias[2] = +125.; // User environmental x-axis correction in milliGauss |
PKnevermind | 3:934d5e72990a | 339 | } |
PKnevermind | 3:934d5e72990a | 340 | |
PKnevermind | 3:934d5e72990a | 341 | int Player::mode() |
PKnevermind | 3:934d5e72990a | 342 | { |
PKnevermind | 3:934d5e72990a | 343 | int m = Mode.read(); |
PKnevermind | 3:934d5e72990a | 344 | return m; |
PKnevermind | 3:934d5e72990a | 345 | } |
PKnevermind | 3:934d5e72990a | 346 | |
PKnevermind | 3:934d5e72990a | 347 | void Player::letplay() |
PKnevermind | 3:934d5e72990a | 348 | { |
PKnevermind | 3:934d5e72990a | 349 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 350 | TFT.foreground(White); |
PKnevermind | 3:934d5e72990a | 351 | TFT.background(Black); |
PKnevermind | 3:934d5e72990a | 352 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 353 | TFT.set_orientation(1); |
PKnevermind | 3:934d5e72990a | 354 | TFT.Bitmap(60,1,200,173,p1); |
PKnevermind | 3:934d5e72990a | 355 | } |
PKnevermind | 3:934d5e72990a | 356 | |
PKnevermind | 3:934d5e72990a | 357 | void Player::angry() |
PKnevermind | 3:934d5e72990a | 358 | { |
PKnevermind | 3:934d5e72990a | 359 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 360 | TFT.foreground(White); |
PKnevermind | 3:934d5e72990a | 361 | TFT.background(Black); |
PKnevermind | 3:934d5e72990a | 362 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 363 | TFT.set_orientation(1); |
PKnevermind | 3:934d5e72990a | 364 | TFT.Bitmap(60,1,200,173,p2); |
PKnevermind | 3:934d5e72990a | 365 | } |
PKnevermind | 3:934d5e72990a | 366 | |
PKnevermind | 3:934d5e72990a | 367 | void Player::cry() |
PKnevermind | 3:934d5e72990a | 368 | { |
PKnevermind | 3:934d5e72990a | 369 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 370 | TFT.foreground(White); |
PKnevermind | 3:934d5e72990a | 371 | TFT.background(Black); |
PKnevermind | 3:934d5e72990a | 372 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 373 | TFT.set_orientation(1); |
PKnevermind | 3:934d5e72990a | 374 | TFT.Bitmap(60,1,200,173,p3); |
PKnevermind | 3:934d5e72990a | 375 | } |
PKnevermind | 3:934d5e72990a | 376 | |
PKnevermind | 3:934d5e72990a | 377 | void Player::print_list() |
PKnevermind | 3:934d5e72990a | 378 | { |
PKnevermind | 3:934d5e72990a | 379 | int a=0,b=0; |
PKnevermind | 3:934d5e72990a | 380 | TFT.claim(stdout); |
PKnevermind | 3:934d5e72990a | 381 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 382 | TFT.foreground(White); |
PKnevermind | 3:934d5e72990a | 383 | TFT.background(Black); |
PKnevermind | 3:934d5e72990a | 384 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 385 | |
PKnevermind | 3:934d5e72990a | 386 | TFT.set_orientation(3); |
PKnevermind | 3:934d5e72990a | 387 | TFT.set_font((unsigned char*) Arial28x28); |
PKnevermind | 3:934d5e72990a | 388 | TFT.locate(150,120); |
PKnevermind | 3:934d5e72990a | 389 | TFT.printf("Manual Mode:"); |
PKnevermind | 3:934d5e72990a | 390 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 391 | TFT.set_orientation(3); |
PKnevermind | 3:934d5e72990a | 392 | TFT.set_font((unsigned char*) Arial12x12); |
PKnevermind | 3:934d5e72990a | 393 | //list[5]='\0'; |
PKnevermind | 3:934d5e72990a | 394 | do { |
PKnevermind | 3:934d5e72990a | 395 | TFT.locate(5,b); |
PKnevermind | 3:934d5e72990a | 396 | TFT.printf("%2d . %s\r\n", a+1,list[a]); |
PKnevermind | 3:934d5e72990a | 397 | a++; |
PKnevermind | 3:934d5e72990a | 398 | b=b+23; |
PKnevermind | 3:934d5e72990a | 399 | } while(a<5); |
PKnevermind | 3:934d5e72990a | 400 | } |
PKnevermind | 3:934d5e72990a | 401 | |
PKnevermind | 3:934d5e72990a | 402 | void Player::select_list() |
PKnevermind | 3:934d5e72990a | 403 | { |
PKnevermind | 3:934d5e72990a | 404 | if(mark>=96) { |
PKnevermind | 3:934d5e72990a | 405 | mark=10; |
PKnevermind | 3:934d5e72990a | 406 | } |
PKnevermind | 3:934d5e72990a | 407 | TFT.cls(); |
PKnevermind | 3:934d5e72990a | 408 | print_list(); |
PKnevermind | 3:934d5e72990a | 409 | TFT.set_orientation(0); |
PKnevermind | 3:934d5e72990a | 410 | TFT.fillcircle(mark,20,10,Red); |
PKnevermind | 3:934d5e72990a | 411 | |
PKnevermind | 3:934d5e72990a | 412 | mark=mark+23; |
PKnevermind | 3:934d5e72990a | 413 | } |