Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SOMO.cpp
- Committer:
- AlexisCollin
- Date:
- 2020-02-25
- Revision:
- 2:b95724a49517
- Parent:
- 0:a4f14eadd0df
- Child:
- 3:98ceb6357a56
File content as of revision 2:b95724a49517:
// SOMO II sound module http://www.4dsystems.com.au/product/SOMO_II/ // Datasheet http://www.4dsystems.com.au/productpages/SOMO-II/downloads/SOMO-II_datasheet_R_1_2.pdf #include "mbed.h" #include "SOMO.h" #include "CAN.h" #define CHKSUM 0xFFFF #define myID 0x261 Ticker ticker; CAN can(PA_11, PA_12); Sender sender(can); CANMessage msg; bool sendflag = 0; int data_can = 0; char commande = 0; char message1 = 0; char message2 = 0; int calc_chksum; char chksum[2]={0,0}; unsigned char is_busy = 0x00; //construction SOMO::SOMO(PinName TXPin, PinName RXPin): _serialSOMO(TXPin,RXPin) { init(); } void SOMO::init() //configure mbed pour la SOMO-II { _serialSOMO.baud(9600); can.frequency(1000000); ticker.attach(callback(&sender,&Sender::send), 1); sendflag = 0; } void SOMO::playTrackName(char name[]) //Permet de jouer une musique via son nom { } /* les fichiers mp3 doivent commencer par 001 jusqu'a 254 et ne doivent pas contenir plus de 5 lettres. The filenames should start with number between 001 and 099 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!) exemple : root/01/001left.mp3, root/01/002right.mp3, root/01/099abcde.mp3 */ void SOMO::playTrackNum(unsigned char repository, unsigned char track) //Joue une musique via son identifiant { calc_chksum=CHKSUM-(0x19+0x01)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play2[8] = {0x7E, 0x19, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play2[i]); } wait(0.2); calc_chksum=CHKSUM-(0x0F+repository+track)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play[8] = {0x7E, 0x0F, 0x00, repository, track, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play[i]); } wait(0.2); } void SOMO::start() //Joue une musique via son identifiant { calc_chksum=CHKSUM-(0x19+0x01)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play2[8] = {0x7E, 0x19, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play2[i]); } wait(0.2); calc_chksum=CHKSUM-(0x0F+0x63+0x01)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play1[8] = {0x7E, 0x0F, 0x00, 0x63, 0x01, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play1[i]); } wait(0.2); calc_chksum=CHKSUM-(0x0D)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play3[8] = {0x7E, 0x0D, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play3[i]); } wait(0.2); } void SOMO::stopTrack() //stop la lecture de n'importe quelle musique { calc_chksum=CHKSUM-(0x16)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char stop[8] = {0x7E, 0x16, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(stop[i]); } } void SOMO::volume(unsigned char vol) //change le volume (de 0 a 30) { if (vol>0 && vol<31) { calc_chksum=CHKSUM-(0x06 + vol)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char changeVol[8] = {0x7E, 0x06, 0x00, 0x00, vol, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(changeVol[i]); } } } void SOMO::reset() //reset le module { unsigned char reset[8] = {0x7E, 0x0C, 0x00, 0x00, 0x00, 0xFF, 0xF4, 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(reset[i]); } } void SOMO::continuous(unsigned char repository, unsigned char track) { calc_chksum=CHKSUM-(0x0F+repository+track)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play1[8] = {0x7E, 0x0F, 0x00, repository, track, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play1[i]); } wait(0.2); calc_chksum=CHKSUM-(0x11+0x01)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play2[8] = {0x7E, 0x11, 0x00, 0x00, 0x01, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play2[i]); } wait(0.2); calc_chksum=CHKSUM-(0x0D)+1; chksum[0]=0xFF&(calc_chksum>>8); chksum[1]=0xFF&(calc_chksum); unsigned char play[8] = {0x7E, 0x0D, 0x00, 0x00, 0x00, chksum[0], chksum[1], 0xEF}; for (int i = 0; i <8; i++) { _serialSOMO.putc(play[i]); } wait(0.2); } void Sender::send() { if(sendflag==1) { char data_can_sender = is_busy; if(can.write(CANMessage(myID, reinterpret_cast<char*>(&data_can_sender), (sizeof(data_can_sender))))) { sendflag = 0; } } } int comm() { if(can.read(msg)) { if(msg.id == 0x261) { commande = msg.data[0]; message1 = msg.data[1]; message2 = msg.data[2]; data_can = (message2<<16)+(message1<<8)+(commande); sendflag = 1; if(((data_can)&0xFF)!=0x03) { if(((data_can)&0xFF)!=0x02) { if(((data_can)&0xFF)==0x01 || ((data_can)&0xFF)==0x04) { is_busy=0x01; } sender.send(); } } else sendflag = 0; data_can = 0xFFFFFFFF & ((data_can << 8) + 0x01); wait_ms(0.2); } else sendflag=0; } else { data_can = 0xFFFFFFFF & ((data_can << 8) + 0x00); } if(can.rderror() || can.tderror()) { can.reset(); } //sender.send(); return data_can; } void not_busy() { is_busy = 0x00; sendflag=1; sender.send(); }