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.
Diff: SOMO.cpp
- Revision:
- 2:b95724a49517
- Parent:
- 0:a4f14eadd0df
- Child:
- 3:98ceb6357a56
--- a/SOMO.cpp Wed Apr 26 19:02:16 2017 +0000 +++ b/SOMO.cpp Tue Feb 25 12:52:32 2020 +0000 @@ -2,51 +2,227 @@ // 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; -//constructor -SOMO::SOMO(PinName TXPin, PinName RXPin): _serialSOMO(TXPin,RXPin){ +//construction +SOMO::SOMO(PinName TXPin, PinName RXPin): _serialSOMO(TXPin,RXPin) +{ init(); } -void SOMO::init(){ //configure the mbed for SOMO board +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[]){ //added so SOMO and smartWAV have same functions and can therefore be used interchangeably +void SOMO::playTrackName(char name[]) //Permet de jouer une musique via son nom +{ } /* -mp3 sound files should be placed in "01" folder in the root directory of SD card. The filenames should start with number between 001 and 099 +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!) -examples: root/01/001left.mp3, root/01/002right.mp3, root/01/099abcde.mp3 +exemple : root/01/001left.mp3, root/01/002right.mp3, root/01/099abcde.mp3 */ -void SOMO::playTrackNum(unsigned char track){ //play specific track number - unsigned char play[8] = {0x7E, 0x0F, 0x00, 0x01, track, 0xFF, (240-track), 0xEF}; - for (int i = 0; i <8; i++){ +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::stopTrack(){ //Stop playing any active song - unsigned char stop[8] = {0x7E, 0x16, 0x00, 0x00, 0x00, 0xFF, 0xEA, 0xEF}; - for (int i = 0; i <8; i++){ +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 volume between 0 and 30 - if (vol>0 && vol<31){ - unsigned char changeVol[8] = {0x7E, 0x06, 0x00, 0x00, vol, 0xFF, (250-vol), 0xEF}; - for (int i = 0; i <8; 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 SOMO module +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++){ + 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(); +} \ No newline at end of file