CRAC Team / SOMO_II

Dependents:   Somo_Project

Committer:
AlexisCollin
Date:
Wed Feb 26 16:23:48 2020 +0000
Revision:
5:1cfb8cd47e6d
Parent:
4:9fea24a02671
Child:
6:32eb30d2410f
probleme spam resolut

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;
AlexisCollin 4:9fea24a02671 38 can.filter(0x261, 0x261, CANAny, 0);
alustig3 0:a4f14eadd0df 39 }
alustig3 0:a4f14eadd0df 40
AlexisCollin 2:b95724a49517 41 void SOMO::playTrackName(char name[]) //Permet de jouer une musique via son nom
AlexisCollin 2:b95724a49517 42 {
alustig3 0:a4f14eadd0df 43 }
alustig3 0:a4f14eadd0df 44
alustig3 0:a4f14eadd0df 45 /*
AlexisCollin 2:b95724a49517 46 les fichiers mp3 doivent commencer par 001 jusqu'a 254 et ne doivent pas contenir plus de 5 lettres.
AlexisCollin 2:b95724a49517 47 The filenames should start with number between 001 and 099
alustig3 0:a4f14eadd0df 48 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 49 exemple : root/01/001left.mp3, root/01/002right.mp3, root/01/099abcde.mp3
alustig3 0:a4f14eadd0df 50 */
AlexisCollin 2:b95724a49517 51 void SOMO::playTrackNum(unsigned char repository, unsigned char track) //Joue une musique via son identifiant
AlexisCollin 2:b95724a49517 52 {
AlexisCollin 2:b95724a49517 53 calc_chksum=CHKSUM-(0x19+0x01)+1;
AlexisCollin 2:b95724a49517 54 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 55 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 56 unsigned char play2[8] = {0x7E, 0x19, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 57 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 58 {
AlexisCollin 2:b95724a49517 59 _serialSOMO.putc(play2[i]);
AlexisCollin 2:b95724a49517 60 }
AlexisCollin 2:b95724a49517 61 wait(0.2);
AlexisCollin 2:b95724a49517 62 calc_chksum=CHKSUM-(0x0F+repository+track)+1;
AlexisCollin 2:b95724a49517 63 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 64 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 65 unsigned char play[8] = {0x7E, 0x0F, 0x00, repository, track, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 66 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 67 {
alustig3 0:a4f14eadd0df 68 _serialSOMO.putc(play[i]);
alustig3 0:a4f14eadd0df 69 }
AlexisCollin 2:b95724a49517 70 wait(0.2);
alustig3 0:a4f14eadd0df 71 }
alustig3 0:a4f14eadd0df 72
AlexisCollin 2:b95724a49517 73 void SOMO::start() //Joue une musique via son identifiant
AlexisCollin 2:b95724a49517 74 {
AlexisCollin 2:b95724a49517 75 calc_chksum=CHKSUM-(0x19+0x01)+1;
AlexisCollin 2:b95724a49517 76 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 77 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 78 unsigned char play2[8] = {0x7E, 0x19, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 79 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 80 {
AlexisCollin 2:b95724a49517 81 _serialSOMO.putc(play2[i]);
AlexisCollin 2:b95724a49517 82 }
AlexisCollin 2:b95724a49517 83 wait(0.2);
AlexisCollin 2:b95724a49517 84 calc_chksum=CHKSUM-(0x0F+0x63+0x01)+1;
AlexisCollin 2:b95724a49517 85 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 86 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 87 unsigned char play1[8] = {0x7E, 0x0F, 0x00, 0x63, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 88 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 89 {
AlexisCollin 2:b95724a49517 90 _serialSOMO.putc(play1[i]);
AlexisCollin 2:b95724a49517 91 }
AlexisCollin 2:b95724a49517 92 wait(0.2);
AlexisCollin 2:b95724a49517 93 calc_chksum=CHKSUM-(0x0D)+1;
AlexisCollin 2:b95724a49517 94 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 95 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 96 unsigned char play3[8] = {0x7E, 0x0D, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 97 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 98 {
AlexisCollin 2:b95724a49517 99 _serialSOMO.putc(play3[i]);
AlexisCollin 2:b95724a49517 100 }
AlexisCollin 2:b95724a49517 101 wait(0.2);
AlexisCollin 2:b95724a49517 102 }
AlexisCollin 2:b95724a49517 103
AlexisCollin 2:b95724a49517 104 void SOMO::stopTrack() //stop la lecture de n'importe quelle musique
AlexisCollin 2:b95724a49517 105 {
AlexisCollin 2:b95724a49517 106 calc_chksum=CHKSUM-(0x16)+1;
AlexisCollin 2:b95724a49517 107 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 108 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 109 unsigned char stop[8] = {0x7E, 0x16, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 110 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 111 {
alustig3 0:a4f14eadd0df 112 _serialSOMO.putc(stop[i]);
alustig3 0:a4f14eadd0df 113 }
alustig3 0:a4f14eadd0df 114 }
alustig3 0:a4f14eadd0df 115
AlexisCollin 2:b95724a49517 116 void SOMO::volume(unsigned char vol) //change le volume (de 0 a 30)
AlexisCollin 2:b95724a49517 117 {
AlexisCollin 2:b95724a49517 118 if (vol>0 && vol<31)
AlexisCollin 2:b95724a49517 119 {
AlexisCollin 2:b95724a49517 120 calc_chksum=CHKSUM-(0x06 + vol)+1;
AlexisCollin 2:b95724a49517 121 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 122 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 123 unsigned char changeVol[8] = {0x7E, 0x06, 0x00, 0x00, vol, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 124 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 125 {
alustig3 0:a4f14eadd0df 126 _serialSOMO.putc(changeVol[i]);
alustig3 0:a4f14eadd0df 127 }
alustig3 0:a4f14eadd0df 128 }
alustig3 0:a4f14eadd0df 129 }
alustig3 0:a4f14eadd0df 130
AlexisCollin 2:b95724a49517 131 void SOMO::reset() //reset le module
AlexisCollin 2:b95724a49517 132 {
alustig3 0:a4f14eadd0df 133 unsigned char reset[8] = {0x7E, 0x0C, 0x00, 0x00, 0x00, 0xFF, 0xF4, 0xEF};
AlexisCollin 2:b95724a49517 134 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 135 {
alustig3 0:a4f14eadd0df 136 _serialSOMO.putc(reset[i]);
alustig3 0:a4f14eadd0df 137 }
alustig3 0:a4f14eadd0df 138 }
AlexisCollin 2:b95724a49517 139
AlexisCollin 2:b95724a49517 140 void SOMO::continuous(unsigned char repository, unsigned char track)
AlexisCollin 2:b95724a49517 141 {
AlexisCollin 2:b95724a49517 142 calc_chksum=CHKSUM-(0x0F+repository+track)+1;
AlexisCollin 2:b95724a49517 143 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 144 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 145 unsigned char play1[8] = {0x7E, 0x0F, 0x00, repository, track, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 146 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 147 {
AlexisCollin 2:b95724a49517 148 _serialSOMO.putc(play1[i]);
AlexisCollin 2:b95724a49517 149 }
AlexisCollin 2:b95724a49517 150 wait(0.2);
AlexisCollin 2:b95724a49517 151 calc_chksum=CHKSUM-(0x11+0x01)+1;
AlexisCollin 2:b95724a49517 152 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 153 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 154 unsigned char play2[8] = {0x7E, 0x11, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 155 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 156 {
AlexisCollin 2:b95724a49517 157 _serialSOMO.putc(play2[i]);
AlexisCollin 2:b95724a49517 158 }
AlexisCollin 2:b95724a49517 159 wait(0.2);
AlexisCollin 2:b95724a49517 160 calc_chksum=CHKSUM-(0x0D)+1;
AlexisCollin 2:b95724a49517 161 chksum[0]=0xFF&(calc_chksum>>8);
AlexisCollin 2:b95724a49517 162 chksum[1]=0xFF&(calc_chksum);
AlexisCollin 2:b95724a49517 163 unsigned char play[8] = {0x7E, 0x0D, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF};
AlexisCollin 2:b95724a49517 164 for (int i = 0; i <8; i++)
AlexisCollin 2:b95724a49517 165 {
AlexisCollin 2:b95724a49517 166 _serialSOMO.putc(play[i]);
AlexisCollin 2:b95724a49517 167 }
AlexisCollin 2:b95724a49517 168 wait(0.2);
AlexisCollin 2:b95724a49517 169 }
AlexisCollin 2:b95724a49517 170
AlexisCollin 2:b95724a49517 171 void Sender::send()
AlexisCollin 2:b95724a49517 172 {
AlexisCollin 2:b95724a49517 173 if(sendflag==1)
AlexisCollin 2:b95724a49517 174 {
AlexisCollin 2:b95724a49517 175 char data_can_sender = is_busy;
AlexisCollin 2:b95724a49517 176 if(can.write(CANMessage(myID, reinterpret_cast<char*>(&data_can_sender), (sizeof(data_can_sender)))))
AlexisCollin 2:b95724a49517 177 {
AlexisCollin 2:b95724a49517 178 sendflag = 0;
AlexisCollin 2:b95724a49517 179 }
AlexisCollin 2:b95724a49517 180 }
AlexisCollin 2:b95724a49517 181 }
AlexisCollin 2:b95724a49517 182
AlexisCollin 2:b95724a49517 183 int comm()
AlexisCollin 2:b95724a49517 184 {
AlexisCollin 2:b95724a49517 185 if(can.read(msg))
AlexisCollin 2:b95724a49517 186 {
AlexisCollin 2:b95724a49517 187 if(msg.id == 0x261)
AlexisCollin 2:b95724a49517 188 {
AlexisCollin 2:b95724a49517 189 commande = msg.data[0];
AlexisCollin 2:b95724a49517 190 message1 = msg.data[1];
AlexisCollin 2:b95724a49517 191 message2 = msg.data[2];
AlexisCollin 2:b95724a49517 192 data_can = (message2<<16)+(message1<<8)+(commande);
AlexisCollin 2:b95724a49517 193 sendflag = 1;
AlexisCollin 2:b95724a49517 194 if(((data_can)&0xFF)!=0x03)
AlexisCollin 2:b95724a49517 195 {
AlexisCollin 2:b95724a49517 196 if(((data_can)&0xFF)!=0x02)
AlexisCollin 2:b95724a49517 197 {
AlexisCollin 2:b95724a49517 198 if(((data_can)&0xFF)==0x01 || ((data_can)&0xFF)==0x04)
AlexisCollin 2:b95724a49517 199 {
AlexisCollin 2:b95724a49517 200 is_busy=0x01;
AlexisCollin 2:b95724a49517 201 }
AlexisCollin 2:b95724a49517 202 sender.send();
AlexisCollin 2:b95724a49517 203 }
AlexisCollin 2:b95724a49517 204 }
AlexisCollin 2:b95724a49517 205 else sendflag = 0;
AlexisCollin 2:b95724a49517 206 data_can = 0xFFFFFFFF & ((data_can << 8) + 0x01);
AlexisCollin 2:b95724a49517 207 wait_ms(0.2);
AlexisCollin 2:b95724a49517 208 }
AlexisCollin 5:1cfb8cd47e6d 209 else
AlexisCollin 5:1cfb8cd47e6d 210 {
AlexisCollin 5:1cfb8cd47e6d 211 sendflag=0;
AlexisCollin 5:1cfb8cd47e6d 212 data_can = 0x00000000;
AlexisCollin 5:1cfb8cd47e6d 213 }
AlexisCollin 2:b95724a49517 214 }
AlexisCollin 2:b95724a49517 215 else
AlexisCollin 2:b95724a49517 216 {
AlexisCollin 5:1cfb8cd47e6d 217 data_can = 0x00000000
AlexisCollin 2:b95724a49517 218 }
AlexisCollin 2:b95724a49517 219 if(can.rderror() || can.tderror())
AlexisCollin 2:b95724a49517 220 {
AlexisCollin 2:b95724a49517 221 can.reset();
AlexisCollin 2:b95724a49517 222 }
AlexisCollin 2:b95724a49517 223
AlexisCollin 2:b95724a49517 224 return data_can;
AlexisCollin 2:b95724a49517 225 }
AlexisCollin 2:b95724a49517 226
AlexisCollin 2:b95724a49517 227 void not_busy()
AlexisCollin 2:b95724a49517 228 {
AlexisCollin 2:b95724a49517 229 is_busy = 0x00;
AlexisCollin 2:b95724a49517 230 sendflag=1;
AlexisCollin 2:b95724a49517 231 sender.send();
AlexisCollin 2:b95724a49517 232 }