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