自作楽器用音源モジュール作成(8)

2byteメッセージと、UARTが混ざらないようにちょっとプログラムを改良した。

ボタンやボリュームもつけて設定を用意しようと思ったが現時点では設定項目は皆無なのでひとまずこれで使うことにする。

#include <project.h>

#define MIDI_DATA_SIZE  8
#define UART_CH         3

uint8_t midiDataPtrOld[UART_CH] = {};
uint8_t midiDataPtr[UART_CH] = {};
uint8_t midiDataFrom = 0x0;
uint8_t midiData[UART_CH][MIDI_DATA_SIZE] = {};

volatile uint8_t isSetupMode = 0x0;
volatile uint8_t isPushOk = 0x0;
CY_ISR(ok_button_pushed){

}
CY_ISR(cancel_button_pushed){

}

uint16_t getVolumeData(){
    ADC_SAR_Seq_1_StartConvert();
    
    uint16 data =  ADC_SAR_Seq_1_GetResult16(0);
    if(data == 0xff) return 0x7ff;
    else return 0x7ff - data;
}
void uartMidiBypass(void) {
   uint8_t i,data;

   data = (uint8_t)UART_1_UartGetChar();
    if(data != 0){
        if(data & 0x80){
            midiDataPtr[1] = 0x0;
            midiDataFrom = 0x1;
        }
        if(midiDataPtr[1] < MIDI_DATA_SIZE) midiData[1][midiDataPtr[1]++] = data;   
    } 
    data = (uint8_t)UART_2_UartGetChar();
    if(data != 0){
        if(data & 0x80){
            midiDataPtr[2] = 0x0;
            midiDataFrom = 0x2;
        }
        if(midiDataPtr[2] < MIDI_DATA_SIZE) midiData[2][midiDataPtr[2]++] = data;
    }
    for(i = 0 ; i < UART_CH ; ++i){
        if(midiDataPtrOld[i] != midiDataPtr[i]){
            midiDataPtrOld[i] = midiDataPtr[i];
            if(midiDataPtr[i] == 2){ 
                if(((midiData[i][0] & 0xc0) == 0xc0) || ((midiData[i][0] & 0xc0) == 0xc0)){
                    UART_VS1053b_PutArray(midiData[i], 3);
                    midiDataPtr[i] = 0;
                }
            } else if(midiDataPtr[i] == 3){
                UART_VS1053b_PutArray(midiData[i], 3);
                midiDataPtr[i] = 0;

                if((midiData[i][0] & 0x90) == 0x90 || (midiData[i][0] & 0x80) == 0x80) {
                    LCD_Char_1_WriteControl(LCD_Char_1_CLEAR_DISPLAY);
                    LCD_Char_1_Position(0,0);
                    LCD_Char_1_PrintString("Note:");
                    LCD_Char_1_PrintNumber(midiData[i][1]);
                    LCD_Char_1_PrintString(" ");
                    LCD_Char_1_PrintNumber(midiData[i][2]);
                    LCD_Char_1_DrawHorizontalBG(1,0,16,midiData[i][2]);
                    
                } else {
                    LCD_Char_1_WriteControl(LCD_Char_1_CLEAR_DISPLAY);
                    LCD_Char_1_Position(0,0);
                    LCD_Char_1_PrintNumber(midiData[i][0]);
                    LCD_Char_1_PrintString(" ");
                    LCD_Char_1_PrintNumber(midiData[i][1]);
                    LCD_Char_1_PrintString(" ");
                    LCD_Char_1_PrintNumber(midiData[i][2]);
                }
            }
        }
    }
}

void setupControl(char* name, uint8_t menuCount, char* menuStr[], void (*pushed)(uint8_t)){
    LCD_Char_1_Position(0,0);
    LCD_Char_1_PrintString(name);
    
    uint8 select = getVolumeData() / (0x800 / menuCount + 1);
    LCD_Char_1_Position(1,0);
    if(menuStr != NULL) LCD_Char_1_PrintNumber(menuStr[select]);
    else LCD_Char_1_PrintNumber(select);
    
    if(isPushOk) {
        pushed(select);
    }
}

int main()
{
    CyDelay(1000);
    
    UART_VS1053b_Start();
    UART_1_Start();
    UART_2_Start();

    LCD_Char_1_Start();
    LCD_Char_1_Position(0,0);
    LCD_Char_1_PrintString("MIDI Sound Source");
    
    ADC_SAR_Seq_1_Start();
    
    isr_Button_1_StartEx(cancel_button_pushed);
    isr_Button_2_StartEx(ok_button_pushed);
    
    CyGlobalIntEnable; 
    
    while(1)
    {
        uartMidiBypass();
    }
}