CRAC Team / SOMO_II

Dependents:   Somo_Project

Committer:
AlexisCollin
Date:
Tue Feb 25 12:59:13 2020 +0000
Revision:
3:98ceb6357a56
Parent:
2:b95724a49517
Child:
4:9fea24a02671
somo2 test code spam can;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alustig3 0:a4f14eadd0df 1 // SOMO II sound module http://www.4dsystems.com.au/product/SOMO_II/
alustig3 0:a4f14eadd0df 2 // Datasheet http://www.4dsystems.com.au/productpages/SOMO-II/downloads/SOMO-II_datasheet_R_1_2.pdf
alustig3 0:a4f14eadd0df 3 #include "mbed.h"
alustig3 0:a4f14eadd0df 4 #include "SOMO.h"
AlexisCollin 2:b95724a49517 5 #include "CAN.h"
AlexisCollin 2:b95724a49517 6 #define CHKSUM 0xFFFF
AlexisCollin 2:b95724a49517 7 #define myID 0x261
AlexisCollin 2:b95724a49517 8
AlexisCollin 2:b95724a49517 9 Ticker ticker;
AlexisCollin 2:b95724a49517 10 CAN can(PA_11, PA_12);
AlexisCollin 2:b95724a49517 11 Sender sender(can);
AlexisCollin 2:b95724a49517 12 CANMessage msg;
AlexisCollin 2:b95724a49517 13
AlexisCollin 2:b95724a49517 14
AlexisCollin 2:b95724a49517 15
AlexisCollin 2:b95724a49517 16 bool sendflag = 0;
AlexisCollin 2:b95724a49517 17 int data_can = 0;
AlexisCollin 2:b95724a49517 18 char commande = 0;
AlexisCollin 2:b95724a49517 19 char message1 = 0;
AlexisCollin 2:b95724a49517 20 char message2 = 0;
AlexisCollin 2:b95724a49517 21 int calc_chksum;
AlexisCollin 2:b95724a49517 22 char chksum[2]={0,0};
AlexisCollin 2:b95724a49517 23 unsigned char is_busy = 0x00;
alustig3 0:a4f14eadd0df 24
AlexisCollin 2:b95724a49517 25 //construction
AlexisCollin 2:b95724a49517 26 SOMO::SOMO(PinName TXPin, PinName RXPin): _serialSOMO(TXPin,RXPin)
AlexisCollin 2:b95724a49517 27 {
alustig3 0:a4f14eadd0df 28 init();
alustig3 0:a4f14eadd0df 29 }
alustig3 0:a4f14eadd0df 30
alustig3 0:a4f14eadd0df 31
AlexisCollin 2:b95724a49517 32 void SOMO::init() //configure mbed pour la SOMO-II
AlexisCollin 2:b95724a49517 33 {
alustig3 0:a4f14eadd0df 34 _serialSOMO.baud(9600);
AlexisCollin 2:b95724a49517 35 can.frequency(1000000);
AlexisCollin 2:b95724a49517 36 ticker.attach(callback(&sender,&Sender::send), 1);
AlexisCollin 2:b95724a49517 37 sendflag = 0;
alustig3 0:a4f14eadd0df 38 }
alustig3 0:a4f14eadd0df 39
AlexisCollin 2:b95724a49517 40 void SOMO::playTrackName(char name[]) //Permet de jouer une musique via son nom
AlexisCollin 2:b95724a49517 41 {
alustig3 0:a4f14eadd0df 42 }
alustig3 0:a4f14eadd0df 43
alustig3 0:a4f14eadd0df 44 /*
AlexisCollin 2:b95724a49517 45 les fichiers mp3 doivent commencer par 001 jusqu'a 254 et ne doivent pas contenir plus de 5 lettres.
AlexisCollin 2:b95724a49517 46 The filenames should start with number between 001 and 099
alustig3 0:a4f14eadd0df 47 followed by up to 5 characters (the freakin' datasheet says up to 32 characters, don't listen to it, it's a liar and a con artist!)
AlexisCollin 2:b95724a49517 48 exemple : root/01/001left.mp3, root/01/002right.mp3, root/01/099abcde.mp3
alustig3 0:a4f14eadd0df 49 */
AlexisCollin 2:b95724a49517 50 void SOMO::playTrackNum(unsigned char repository, unsigned char track) //Joue une musique via son identifiant
AlexisCollin 2:b95724a49517 51 {
AlexisCollin 2:b95724a49517 52 calc_chksum=CHKSUM-(0x19+0x01)+1;
AlexisCollin 2:b95724a49517 53 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 54 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 55 unsigned char play2[8] = {0x7E, 0x19, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 56 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 57 {
AlexisCollin 2:b95724a49517 58 _serialSOMO.putc(play2[i]);
AlexisCollin 2:b95724a49517 59 }
AlexisCollin 2:b95724a49517 60 wait(0.2);
AlexisCollin 2:b95724a49517 61 calc_chksum=CHKSUM-(0x0F+repository+track)+1;
AlexisCollin 2:b95724a49517 62 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 63 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 64 unsigned char play[8] = {0x7E, 0x0F, 0x00, repository, track, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 65 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 66 {
alustig3 0:a4f14eadd0df 67 _serialSOMO.putc(play[i]);
alustig3 0:a4f14eadd0df 68 }
AlexisCollin 2:b95724a49517 69 wait(0.2);
alustig3 0:a4f14eadd0df 70 }
alustig3 0:a4f14eadd0df 71
AlexisCollin 2:b95724a49517 72 void SOMO::start() //Joue une musique via son identifiant
AlexisCollin 2:b95724a49517 73 {
AlexisCollin 2:b95724a49517 74 calc_chksum=CHKSUM-(0x19+0x01)+1;
AlexisCollin 2:b95724a49517 75 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 76 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 77 unsigned char play2[8] = {0x7E, 0x19, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 78 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 79 {
AlexisCollin 2:b95724a49517 80 _serialSOMO.putc(play2[i]);
AlexisCollin 2:b95724a49517 81 }
AlexisCollin 2:b95724a49517 82 wait(0.2);
AlexisCollin 2:b95724a49517 83 calc_chksum=CHKSUM-(0x0F+0x63+0x01)+1;
AlexisCollin 2:b95724a49517 84 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 85 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 86 unsigned char play1[8] = {0x7E, 0x0F, 0x00, 0x63, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 87 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 88 {
AlexisCollin 2:b95724a49517 89 _serialSOMO.putc(play1[i]);
AlexisCollin 2:b95724a49517 90 }
AlexisCollin 2:b95724a49517 91 wait(0.2);
AlexisCollin 2:b95724a49517 92 calc_chksum=CHKSUM-(0x0D)+1;
AlexisCollin 2:b95724a49517 93 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 94 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 95 unsigned char play3[8] = {0x7E, 0x0D, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 96 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 97 {
AlexisCollin 2:b95724a49517 98 _serialSOMO.putc(play3[i]);
AlexisCollin 2:b95724a49517 99 }
AlexisCollin 2:b95724a49517 100 wait(0.2);
AlexisCollin 2:b95724a49517 101 }
AlexisCollin 2:b95724a49517 102
AlexisCollin 2:b95724a49517 103 void SOMO::stopTrack() //stop la lecture de n'importe quelle musique
AlexisCollin 2:b95724a49517 104 {
AlexisCollin 2:b95724a49517 105 calc_chksum=CHKSUM-(0x16)+1;
AlexisCollin 2:b95724a49517 106 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 107 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 108 unsigned char stop[8] = {0x7E, 0x16, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 109 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 110 {
alustig3 0:a4f14eadd0df 111 _serialSOMO.putc(stop[i]);
alustig3 0:a4f14eadd0df 112 }
alustig3 0:a4f14eadd0df 113 }
alustig3 0:a4f14eadd0df 114
AlexisCollin 2:b95724a49517 115 void SOMO::volume(unsigned char vol) //change le volume (de 0 a 30)
AlexisCollin 2:b95724a49517 116 {
AlexisCollin 2:b95724a49517 117 if (vol>0 && vol<31)
AlexisCollin 2:b95724a49517 118 {
AlexisCollin 2:b95724a49517 119 calc_chksum=CHKSUM-(0x06 + vol)+1;
AlexisCollin 2:b95724a49517 120 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 121 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 122 unsigned char changeVol[8] = {0x7E, 0x06, 0x00, 0x00, vol, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 123 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 124 {
alustig3 0:a4f14eadd0df 125 _serialSOMO.putc(changeVol[i]);
alustig3 0:a4f14eadd0df 126 }
alustig3 0:a4f14eadd0df 127 }
alustig3 0:a4f14eadd0df 128 }
alustig3 0:a4f14eadd0df 129
AlexisCollin 2:b95724a49517 130 void SOMO::reset() //reset le module
AlexisCollin 2:b95724a49517 131 {
alustig3 0:a4f14eadd0df 132 unsigned char reset[8] = {0x7E, 0x0C, 0x00, 0x00, 0x00, 0xFF, 0xF4, 0xEF};
AlexisCollin 2:b95724a49517 133 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 134 {
alustig3 0:a4f14eadd0df 135 _serialSOMO.putc(reset[i]);
alustig3 0:a4f14eadd0df 136 }
alustig3 0:a4f14eadd0df 137 }
AlexisCollin 2:b95724a49517 138
AlexisCollin 2:b95724a49517 139 void SOMO::continuous(unsigned char repository, unsigned char track)
AlexisCollin 2:b95724a49517 140 {
AlexisCollin 2:b95724a49517 141 calc_chksum=CHKSUM-(0x0F+repository+track)+1;
AlexisCollin 2:b95724a49517 142 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 143 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 144 unsigned char play1[8] = {0x7E, 0x0F, 0x00, repository, track, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 145 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 146 {
AlexisCollin 2:b95724a49517 147 _serialSOMO.putc(play1[i]);
AlexisCollin 2:b95724a49517 148 }
AlexisCollin 2:b95724a49517 149 wait(0.2);
AlexisCollin 2:b95724a49517 150 calc_chksum=CHKSUM-(0x11+0x01)+1;
AlexisCollin 2:b95724a49517 151 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 152 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 153 unsigned char play2[8] = {0x7E, 0x11, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 154 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 155 {
AlexisCollin 2:b95724a49517 156 _serialSOMO.putc(play2[i]);
AlexisCollin 2:b95724a49517 157 }
AlexisCollin 2:b95724a49517 158 wait(0.2);
AlexisCollin 2:b95724a49517 159 calc_chksum=CHKSUM-(0x0D)+1;
AlexisCollin 2:b95724a49517 160 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 161 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 162 unsigned char play[8] = {0x7E, 0x0D, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 163 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 164 {
AlexisCollin 2:b95724a49517 165 _serialSOMO.putc(play[i]);
AlexisCollin 2:b95724a49517 166 }
AlexisCollin 2:b95724a49517 167 wait(0.2);
AlexisCollin 2:b95724a49517 168 }
AlexisCollin 2:b95724a49517 169
AlexisCollin 2:b95724a49517 170 void Sender::send()
AlexisCollin 2:b95724a49517 171 {
AlexisCollin 2:b95724a49517 172 if(sendflag==1)
AlexisCollin 2:b95724a49517 173 {
AlexisCollin 2:b95724a49517 174 char data_can_sender = is_busy;
AlexisCollin 2:b95724a49517 175 if(can.write(CANMessage(myID, reinterpret_cast<char*>(&data_can_sender), (sizeof(data_can_sender)))))
AlexisCollin 2:b95724a49517 176 {
AlexisCollin 2:b95724a49517 177 sendflag = 0;
AlexisCollin 2:b95724a49517 178 }
AlexisCollin 2:b95724a49517 179 }
AlexisCollin 2:b95724a49517 180 }
AlexisCollin 2:b95724a49517 181
AlexisCollin 2:b95724a49517 182 int comm()
AlexisCollin 2:b95724a49517 183 {
AlexisCollin 2:b95724a49517 184 if(can.read(msg))
AlexisCollin 2:b95724a49517 185 {
AlexisCollin 2:b95724a49517 186 if(msg.id == 0x261)
AlexisCollin 2:b95724a49517 187 {
AlexisCollin 2:b95724a49517 188 commande = msg.data[0];
AlexisCollin 2:b95724a49517 189 message1 = msg.data[1];
AlexisCollin 2:b95724a49517 190 message2 = msg.data[2];
AlexisCollin 2:b95724a49517 191 data_can = (message2<<16)+(message1<<8)+(commande);
AlexisCollin 2:b95724a49517 192 sendflag = 1;
AlexisCollin 2:b95724a49517 193 if(((data_can)&0xFF)!=0x03)
AlexisCollin 2:b95724a49517 194 {
AlexisCollin 2:b95724a49517 195 if(((data_can)&0xFF)!=0x02)
AlexisCollin 2:b95724a49517 196 {
AlexisCollin 2:b95724a49517 197 if(((data_can)&0xFF)==0x01 || ((data_can)&0xFF)==0x04)
AlexisCollin 2:b95724a49517 198 {
AlexisCollin 2:b95724a49517 199 is_busy=0x01;
AlexisCollin 2:b95724a49517 200 }
AlexisCollin 2:b95724a49517 201 sender.send();
AlexisCollin 2:b95724a49517 202 }
AlexisCollin 2:b95724a49517 203 }
AlexisCollin 2:b95724a49517 204 else sendflag = 0;
AlexisCollin 2:b95724a49517 205 data_can = 0xFFFFFFFF & ((data_can << 8) + 0x01);
AlexisCollin 2:b95724a49517 206 wait_ms(0.2);
AlexisCollin 2:b95724a49517 207 }
AlexisCollin 2:b95724a49517 208 else sendflag=0;
AlexisCollin 2:b95724a49517 209 }
AlexisCollin 2:b95724a49517 210 else
AlexisCollin 2:b95724a49517 211 {
AlexisCollin 3:98ceb6357a56 212 //data_can = 0xFFFFFFFF/* & ((data_can << 8) + 0x00)*/;
AlexisCollin 3:98ceb6357a56 213 data_can = 0x00000000/* & ((data_can << 8) + 0x00)*/;
AlexisCollin 2:b95724a49517 214 }
AlexisCollin 2:b95724a49517 215 if(can.rderror() || can.tderror())
AlexisCollin 2:b95724a49517 216 {
AlexisCollin 2:b95724a49517 217 can.reset();
AlexisCollin 2:b95724a49517 218 }
AlexisCollin 2:b95724a49517 219 //sender.send();
AlexisCollin 2:b95724a49517 220
AlexisCollin 2:b95724a49517 221 return data_can;
AlexisCollin 2:b95724a49517 222 }
AlexisCollin 2:b95724a49517 223
AlexisCollin 2:b95724a49517 224 void not_busy()
AlexisCollin 2:b95724a49517 225 {
AlexisCollin 2:b95724a49517 226 is_busy = 0x00;
AlexisCollin 2:b95724a49517 227 sendflag=1;
AlexisCollin 2:b95724a49517 228 sender.send();
AlexisCollin 2:b95724a49517 229 }