CRAC Team / SOMO_II

Dependents:   Somo_Project

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();
}