main.cpp #include "mbed.h" #include "MIDI_sub2.h" int main(){ int i, j, p, counter; unsigned char adc_new; i = j = p = counter = 0; rx_top = rx_end = tx_top = tx_end = 0; adc_no = 0; MIDI.baud(115200); MIDI.attach(&rx_fifoset, MIDI.RxIrq); for(i=0; i<2; i++){ LED_set(i, 0); } for(i=0; i<4; i++){ adc_old[i] = 0; } while(1){ p++; if(p == 500){ LED_set(adc_no * 2, 1); LED_set(adc_no * 2 + 1, 0); } else if(p == 1000){ adc_new = ADC_get(adc_no * 2); if(adc_old[adc_no * 4] != adc_new){ adc_old[adc_no * 4] = adc_new; tx_fifoset(0xB0); tx_fifoset(adc_no * 4); tx_fifoset(adc_new); } adc_new = ADC_get(adc_no * 2 + 1); if(adc_old[adc_no * 4 + 1] != adc_new){ adc_old[adc_no * 4 + 1] = adc_new; tx_fifoset(0xB0); tx_fifoset(adc_no * 4 + 1); tx_fifoset(adc_new); } LED_set(adc_no * 2, 0); LED_set(adc_no * 2 + 1, 0); } else if(p == 1500){ LED_set(adc_no * 2, 0); LED_set(adc_no * 2 + 1, 1); } else if(p > 1999){ p = 0; adc_new = ADC_get(adc_no * 2); if(adc_old[adc_no * 4 + 2] != adc_new){ adc_old[adc_no * 4 + 2] = adc_new; tx_fifoset(0xB0); tx_fifoset(adc_no * 4 + 2); tx_fifoset(adc_new); } adc_new = ADC_get(adc_no * 2 + 1); if(adc_old[adc_no * 4 + 3] != adc_new){ adc_old[adc_no * 4 + 3] = adc_new; tx_fifoset(0xB0); tx_fifoset(adc_no * 4 + 3); tx_fifoset(adc_new); } LED_set(adc_no * 2, 0); LED_set(adc_no * 2 + 1, 0); adc_no++; if(adc_no > 1) adc_no = 0; } tx_fifo_check(); if(rx_fifo_check() == 1){ } if(++j > 1000000){ j = 0; counter = ++counter & 0x7F; tx_fifoset(0xC0); tx_fifoset(counter); } } } MIDI_sub2.h unsigned char rxFIFO[256], txFIFO[256], adc_old[32]; unsigned char rx_top, rx_end, tx_top, tx_end, status, keyno, dcb; int midi_message, adc_no; RawSerial MIDI(PA_2,PA_3); DigitalOut A_5(PB_8); DigitalOut A_4(PB_9); DigitalOut B_5(PC_7); DigitalOut B_4(PA_9); AnalogIn A_3(PA_7); AnalogIn A_2(PA_6); AnalogIn B_3(PA_5); AnalogIn B_2(PA_0); void LED_set(int num, int value){ switch(num){ case(0): A_5 = value; break; case(1): A_4 = value; break; case(2): B_5 = value; break; case(3): B_4 = value; break; } return; } unsigned char ADC_get(int num){ unsigned short data = 0; switch(num){ case(0): data = A_3.read_u16(); break; case(1): data = A_2.read_u16(); break; case(2): data = B_3.read_u16(); break; case(3): data = B_2.read_u16(); break; } return(data>>9); } int rx_fifo_check(void){ unsigned char data; if(rx_top != rx_end){ data = rxFIFO[rx_end]; ++rx_end &= 255; if (data > 127){ status = data; dcb = 0; return(0); } else if(status > 0xEF){ return(0); } else if( (status > 0xBF) && (status < 0xE0) ){ midi_message = (status<<16) + (data<<8); dcb = 0; return(1); } else if(dcb==0){ keyno = data; dcb++; return(0); } else{ midi_message = (status<<16) + (keyno<<8) + data; dcb = 0; return(1); } } return(0); } void rx_fifoset(void){ rxFIFO[rx_top] = MIDI.getc(); ++rx_top &= 255; return; } void tx_fifo_check(void){ if(MIDI.writeable() == 1){ if(tx_top != tx_end){ MIDI.putc(txFIFO[tx_end]); ++tx_end &= 255; } } return; } void tx_fifoset(unsigned char data){ txFIFO[tx_top] = data; ++tx_top &= 255; return; }