CRAC Team / SOMO_II

Dependents:   Somo_Project

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