Project for playing a song on 2 meeds sending notes over I2C

Dependencies:   C12832 mbed

Committer:
jad19925
Date:
Thu Feb 13 23:29:28 2014 +0000
Revision:
7:b8f4ab589d16
Parent:
6:84c34161559e
Republished

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jad19925 0:db7b3841b98f 1 #include "mbed.h"
jad19925 0:db7b3841b98f 2 #include "C12832.h"
jad19925 1:feca2dfd8753 3 #include "mario.h"
jad19925 6:84c34161559e 4 #include "lovesme.h"
jad19925 0:db7b3841b98f 5
jad19925 7:b8f4ab589d16 6 //#define MASTER
jad19925 7:b8f4ab589d16 7 #define SLAVE
jad19925 2:c35c40bae96e 8
jad19925 0:db7b3841b98f 9 BusIn joy(p15,p12,p13,p16);
jad19925 0:db7b3841b98f 10 DigitalIn fire(p14);
jad19925 0:db7b3841b98f 11 PwmOut spkr(p26);
jad19925 0:db7b3841b98f 12 C12832 lcd(p5, p7, p6, p8, p11);
jad19925 5:432203c226ed 13 DigitalIn up(p15);
jad19925 0:db7b3841b98f 14 DigitalIn down(p12);
jad19925 3:eb63ba24e2bb 15 BusOut leds(LED1,LED2,LED3,LED4);
jad19925 0:db7b3841b98f 16
jad19925 4:bd0675c58f5e 17 #ifdef MASTER
jad19925 3:eb63ba24e2bb 18 I2C i2cPort(p9,p10);
jad19925 4:bd0675c58f5e 19 #endif
jad19925 4:bd0675c58f5e 20 #ifdef SLAVE
jad19925 4:bd0675c58f5e 21 I2CSlave slave(p9,p10);
jad19925 4:bd0675c58f5e 22 #endif
jad19925 3:eb63ba24e2bb 23 char note;
jad19925 3:eb63ba24e2bb 24 char length;
jad19925 4:bd0675c58f5e 25 const int slaveAddress = 0x42;
jad19925 5:432203c226ed 26 char received = 0;
jad19925 6:84c34161559e 27 float waitBase=1;
jad19925 0:db7b3841b98f 28
jad19925 0:db7b3841b98f 29 int main()
jad19925 0:db7b3841b98f 30 {
jad19925 4:bd0675c58f5e 31 #ifdef SLAVE
jad19925 4:bd0675c58f5e 32 slave.address(slaveAddress);
jad19925 4:bd0675c58f5e 33 #endif
jad19925 0:db7b3841b98f 34 lcd.cls();
jad19925 0:db7b3841b98f 35 lcd.printf("hello world");
jad19925 5:432203c226ed 36
jad19925 0:db7b3841b98f 37 while(1) {
jad19925 0:db7b3841b98f 38 if (fire) {
jad19925 0:db7b3841b98f 39 leds=0xf;
jad19925 6:84c34161559e 40 waitBase = 60.0/marioTempo;
jad19925 0:db7b3841b98f 41 for(int i=0;i<(sizeof(marioNotes)/sizeof(NoteName));i++){
jad19925 0:db7b3841b98f 42 if(marioNotes[i] == R) {
jad19925 0:db7b3841b98f 43 spkr=0.0;
jad19925 6:84c34161559e 44 wait(waitBase*marioBeats[i]/12);
jad19925 0:db7b3841b98f 45 }
jad19925 0:db7b3841b98f 46 else{
jad19925 1:feca2dfd8753 47 spkr.period(1/(notes[marioNotes[i]]));
jad19925 0:db7b3841b98f 48 spkr=.5;
jad19925 6:84c34161559e 49 wait(waitBase*marioBeats[i]/12);
jad19925 0:db7b3841b98f 50 spkr=0.0;
jad19925 0:db7b3841b98f 51 }
jad19925 0:db7b3841b98f 52 }
jad19925 0:db7b3841b98f 53 spkr=0.0;
jad19925 0:db7b3841b98f 54 //end speaker code
jad19925 5:432203c226ed 55 } else {
jad19925 1:feca2dfd8753 56 leds=joy;
jad19925 1:feca2dfd8753 57 #ifdef MASTER
jad19925 6:84c34161559e 58 waitBase = 60.0/marioTempo;
jad19925 5:432203c226ed 59 if(up) {
jad19925 5:432203c226ed 60 //master sends its song to slave
jad19925 4:bd0675c58f5e 61 i2cPort.start();
jad19925 4:bd0675c58f5e 62 //send address
jad19925 4:bd0675c58f5e 63 i2cPort.write(slaveAddress);
jad19925 4:bd0675c58f5e 64 //send tempo (BPM)
jad19925 4:bd0675c58f5e 65 //loop through song
jad19925 6:84c34161559e 66 for(int i=0;i<(sizeof(marioNotes)/sizeof(NoteName));i++){
jad19925 5:432203c226ed 67 if(marioNotes[i] == R) {
jad19925 5:432203c226ed 68 i2cPort.write(R);
jad19925 5:432203c226ed 69 spkr=0.0;
jad19925 6:84c34161559e 70 wait(waitBase*marioBeats[i]/12);
jad19925 5:432203c226ed 71 }
jad19925 5:432203c226ed 72 else{
jad19925 5:432203c226ed 73 i2cPort.write(marioNotes[i]);
jad19925 5:432203c226ed 74 spkr.period(1/(notes[marioNotes[i]]));
jad19925 5:432203c226ed 75 spkr=.5;
jad19925 6:84c34161559e 76 wait(waitBase*marioBeats[i]/12);
jad19925 5:432203c226ed 77 spkr=0.0;
jad19925 5:432203c226ed 78 }
jad19925 5:432203c226ed 79 }
jad19925 5:432203c226ed 80 spkr=0.0;
jad19925 5:432203c226ed 81 //send stop code
jad19925 5:432203c226ed 82 i2cPort.write(0xFF);
jad19925 5:432203c226ed 83 wait(.5);
jad19925 4:bd0675c58f5e 84 //close i2c port
jad19925 4:bd0675c58f5e 85 i2cPort.stop();
jad19925 5:432203c226ed 86 } else if(down) {
jad19925 5:432203c226ed 87 //slave should send it's song to master
jad19925 5:432203c226ed 88 i2cPort.start();
jad19925 5:432203c226ed 89 //send address with read command
jad19925 5:432203c226ed 90 i2cPort.write(slaveAddress|0x01);
jad19925 1:feca2dfd8753 91
jad19925 5:432203c226ed 92 do {
jad19925 5:432203c226ed 93 received = i2cPort.read(1);
jad19925 5:432203c226ed 94 spkr=0.0;
jad19925 5:432203c226ed 95 if(received == R) {
jad19925 5:432203c226ed 96 spkr=0.0;
jad19925 5:432203c226ed 97 }
jad19925 5:432203c226ed 98 else{
jad19925 5:432203c226ed 99 spkr.period(1/(notes[received]));
jad19925 5:432203c226ed 100 spkr=.5;
jad19925 5:432203c226ed 101 }
jad19925 5:432203c226ed 102 lcd.cls();
jad19925 5:432203c226ed 103 lcd.locate(0,0);
jad19925 5:432203c226ed 104 lcd.printf("Received: %d",received);
jad19925 5:432203c226ed 105 } while(received != 0xFF);
jad19925 5:432203c226ed 106
jad19925 5:432203c226ed 107 lcd.cls();
jad19925 5:432203c226ed 108 lcd.locate(0,0);
jad19925 5:432203c226ed 109 lcd.printf("done");
jad19925 5:432203c226ed 110 i2cPort.stop();
jad19925 1:feca2dfd8753 111 }
jad19925 4:bd0675c58f5e 112 #endif
jad19925 4:bd0675c58f5e 113 #ifdef SLAVE
jad19925 6:84c34161559e 114 waitBase = 60.0/lovesMeTempo;
jad19925 4:bd0675c58f5e 115 received = slave.receive();
jad19925 5:432203c226ed 116 if(I2CSlave::ReadAddressed==received) { //master is requesting slave song
jad19925 6:84c34161559e 117 for(int i=0;i<(sizeof(loveFrequency)/sizeof(NoteName));i++){
jad19925 6:84c34161559e 118 if(loveFrequency[i] == R) {
jad19925 5:432203c226ed 119 slave.write(R);
jad19925 5:432203c226ed 120 spkr=0.0;
jad19925 6:84c34161559e 121 wait(waitBase*loveBeat[i]/12);
jad19925 5:432203c226ed 122 }
jad19925 5:432203c226ed 123 else{
jad19925 6:84c34161559e 124 slave.write(loveFrequency[i]);
jad19925 6:84c34161559e 125 spkr.period(1/(notes[loveFrequency[i]]));
jad19925 5:432203c226ed 126 spkr=.5;
jad19925 6:84c34161559e 127 wait(waitBase*loveBeat[i]/12);
jad19925 5:432203c226ed 128 spkr=0.0;
jad19925 5:432203c226ed 129 }
jad19925 5:432203c226ed 130 }
jad19925 5:432203c226ed 131 spkr=0.0;
jad19925 5:432203c226ed 132 slave.write(0xFF);
jad19925 5:432203c226ed 133 slave.stop();
jad19925 4:bd0675c58f5e 134 }
jad19925 5:432203c226ed 135 else if(I2CSlave::WriteAddressed==received) { //master is sending its song
jad19925 5:432203c226ed 136 do {
jad19925 5:432203c226ed 137 received = slave.read();
jad19925 5:432203c226ed 138 spkr=0.0;
jad19925 5:432203c226ed 139 if(received == R) {
jad19925 5:432203c226ed 140 spkr=0.0;
jad19925 5:432203c226ed 141 }
jad19925 5:432203c226ed 142 else{
jad19925 5:432203c226ed 143 spkr.period(1/(notes[received]));
jad19925 5:432203c226ed 144 spkr=.5;
jad19925 5:432203c226ed 145 }
jad19925 5:432203c226ed 146 lcd.cls();
jad19925 5:432203c226ed 147 lcd.locate(0,0);
jad19925 5:432203c226ed 148 lcd.printf("Received: %d",received);
jad19925 5:432203c226ed 149 } while(received != 0xFF);
jad19925 4:bd0675c58f5e 150 lcd.cls();
jad19925 4:bd0675c58f5e 151 lcd.locate(0,0);
jad19925 5:432203c226ed 152 lcd.printf("done");
jad19925 5:432203c226ed 153 slave.stop();
jad19925 4:bd0675c58f5e 154 }
jad19925 5:432203c226ed 155 lcd.cls();
jad19925 5:432203c226ed 156 lcd.locate(0,0);
jad19925 5:432203c226ed 157 lcd.printf("%d",received);
jad19925 1:feca2dfd8753 158 #endif
jad19925 1:feca2dfd8753 159 }
jad19925 0:db7b3841b98f 160 }
jad19925 0:db7b3841b98f 161 }