Dependencies:   mbed

main.cpp

Committer:
faker
Date:
2011-06-13
Revision:
0:adfbd02222d4

File content as of revision 0:adfbd02222d4:

/*****************************************************/
/* MBED MULTI EFFECTOR                               */
/*                                                   */
/*                                                   */
/*****************************************************/

#include "mbed.h"
#include "EffectParam.h"
#include "TextLCD.h"
#include "R_Sw_Check.h"
#include "Distotion_Unit.h"
#include "Delay_Unit.h"

//Serial debug(USBTX, USBRX); // tx, rx

LocalFileSystem local("local");
Ticker      sampling;

AnalogIn    Ain(p17);                                   // Audio Input
AnalogOut   Aout(p18);                                  // Audio Output
TextLCD     lcd(p24, p25, p26, p27, p28, p29, p30);     // rs, rw, e, d0, d1, d2, d3)
DigitalIn   Rsw0A(p5);                                  // Rotary SW 0
DigitalIn   Rsw0B(p6);
DigitalIn   Rsw1A(p7);                                  // Rotary SW 1
DigitalIn   Rsw1B(p8);
DigitalIn   Rsw2A(p9);                                  // Rotary SW 2
DigitalIn   Rsw2B(p10);
DigitalIn   Rsw3A(p11);                                 // Rotary SW 3
DigitalIn   Rsw3B(p12);
DigitalOut  busyFlag(p13);                              // Effect Proc Busy Flag

/*******************************/
/* For Test Signal             */
/*******************************/
#define     TEST_SIGNAL_ENABLE      (0)                 // 1 : Internal SinWave for Debug
#define     TEST_SIGNAL_FREQ        (1000.0)            // Frequency [Hz]    
#define     TEST_SIGNAL_AMP         (30000.0)           // Amplitude
#define     PAI                     (3.14159)

/*******************************/
/* For ADC & DAC Setting       */
/*******************************/
#define     SAMPLING_TIME           (25.0)              // ADC Sampling Rate [us]
volatile unsigned int   *g_usiAd0cr, *g_usiAd0dr2;      // ADC Reg
unsigned int            *g_usiDacr;                     // DAC Reg

/*******************************/
/* Gloval Valinat              */
/*******************************/
unsigned int    g_usiFinalOut;                                              // DAC Out Final Data
int             g_ssBuff[10];                                               // Audio Data Buff
float           g_fTestWaveT;                                               // Test Sin Wave Phase
int             g_iBankNo = 0;                                              // Parameter Patch Bank No
int             g_iProgNo = 0;                                              // Parameter Patch Program No
int             g_iFlag = 0;                                                // Pacth Write Flag
int             g_iProgPatch[BANK_MAX_NUM][PROGNO_MAX_NUM][PP_MAX_NUM];     // Parameter Data


/*******************************/
/* Function                    */
/*******************************/
int  main(void);
void effectProcess(void);                       // Effect Process Function
void paramCheck(int*, int*);                    // Paramter Range Check 
void param1Change(int*, int*, int*, int*);      // Process for Changed Rotary SW1 
void param2Change(int*, int*, int*, int*);      // Process for Changed Rotary SW2
void param3Change(int*, int*, int*, int*);      // Process for Changed Rotary SW3
void param4Change(int*, int*, int*, int*);      // Process for Changed Rotary SW4

void progWrite(int*);                           // 
void distParamChange(int*, int*);               // Change Parameter for Ditotion
void delayParamChange(int*, int*);              // Change PArameter for Delay

void progPatchWite(int);                        // Paramter Write for Flash ROM 
void ProgramPatchChange(int, int);              // 

/*******************************/
/* Effect Process              */
/*******************************/
void effectProcess() {
    busyFlag = 1;
    // Line Out
    *g_usiDacr = g_usiFinalOut;
    // ADC Start
    *g_usiAd0cr = 0x01200204;

#if (TEST_SIGNAL_ENABLE == 1)                           // Test Signal Sin Wave
    g_ssBuff[0] = TEST_SIGNAL_AMP * sin(g_fTestWaveT);
    g_fTestWaveT = g_fTestWaveT + 2.0 * PAI * SAMPLING_TIME * TEST_SIGNAL_FREQ  / 1e6;
    if (g_fTestWaveT >= (2.0 * PAI))g_fTestWaveT = 0;
#endif

    //
    // Effect Func
    //

    g_ssBuff[1] = distotion(g_ssBuff[0]);               // Call Distotion Function
    g_ssBuff[2] = delay(g_ssBuff[1]);                   // CAll Delay Function

    //
    // Effect Func
    //

#if (TEST_SIGNAL_ENABLE == 0)
    while (1) {
        if ((*g_usiAd0dr2 & 0x80000000) != 0)break; // ADC Done ?
    }
    g_ssBuff[0] = (int)(*g_usiAd0dr2 & 0x0000FFF0) - 32768;
#endif

    g_usiFinalOut = 0x00010000 | (g_ssBuff[2] + 32768);

    busyFlag = 0;
}




/*******************************/
/* MAIN                        */
/*******************************/
int main() {

    int     i ,j ,k;
    int     iTemp1, iTemp2;
    int     iParamSwPol[4];
    int     iRsw1Num, iRsw2Num, iRsw3Num, iRsw4Num;
    char    str1[256], str2[256];

    iRsw1Num = iRsw2Num = iRsw3Num = iRsw4Num = 0;

    // LCD INIT
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("Multi Effector");
    lcd.locate(1,1);
    lcd.printf("Mode:");
    param1Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num);

    // Program Patch File Open
    FILE *fp = fopen("/local/prm.txt", "r");
    if(!fp) {
        progPatchWite(1);       // No File
    }else{
        // Read Patch from File
        fgets(str1, 256, fp);
        fgets(str2, 256, fp);
        for(i=0;i<BANK_MAX_NUM;i++){
            for(j=0;j<PROGNO_MAX_NUM;j++){
                fscanf(fp, "%5d%5d", &iTemp1, &iTemp2);
                for(k=0;k<PP_MAX_NUM;k++){
                    fscanf(fp, "%5d", &g_iProgPatch[i][j][k]);
                }
            }
        }
        fclose(fp);
    }

    // ADC & DAC SETTING
    g_usiAd0cr     = (unsigned int*)0x40034000;
    g_usiAd0dr2    = (unsigned int*)0x40034018;
    g_usiDacr      = (unsigned int*)0x4008C000;

    // SAMPLING TIMER START
    sampling.attach_us(&effectProcess, SAMPLING_TIME);

    // Rotary SW State Check
    while (1) {
        switch (ucRotarySwPol(Rsw0A, Rsw0B, Rsw1A, Rsw1B, Rsw2A, Rsw2B, Rsw3A, Rsw3B, iParamSwPol)) {
            case 0:
                iRsw1Num += iParamSwPol[0];
                param1Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num);
                break;
            case 1:
                iRsw2Num += iParamSwPol[1];
                param2Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num);
                break;
            case 2:
                iRsw3Num += iParamSwPol[2];
                param3Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num);
                break;
            case 3:
                iRsw4Num += iParamSwPol[3];
                param4Change(&iRsw1Num, &iRsw2Num, &iRsw3Num, &iRsw4Num);
                break;
            default:
                break;
        }
    }
}


/*******************************/
/* Param Check                 */
/*******************************/
void paramCheck(int* iParam, int iMaxValue) {

    if(*iParam >= iMaxValue)*iParam = 0;
    if(*iParam < 0)*iParam = iMaxValue - 1;

}


/*******************************/
/* Param1 Change               */
/*******************************/
void param1Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) {

    paramCheck(iParam1, MODE_MAX_NUM);

    lcd.locate(6,1);
    lcd.printf("              ");
    lcd.locate(0,2);
    lcd.printf("                    ");
    lcd.locate(0,3);
    lcd.printf("                    ");
    
    switch (*iParam1) {
        case MODE_PLAY:
            lcd.locate(6,1);
            lcd.printf("PLAY");
            lcd.locate(2,2);
            lcd.printf(" Bank PrgNo");
            *iParam2 = g_iBankNo;
            *iParam3 = g_iProgNo;
            break;
        case MODE_EDIT:
            lcd.locate(6,1);
            lcd.printf("EDIT");
            lcd.locate(2,2);
            lcd.printf("Effct Param Value");
            *iParam2 = *iParam3 = 0;
            break;
        case MODE_PROGWRITE:
            lcd.locate(6,1);
            lcd.printf("Prog Write");
            lcd.locate(2,2);
            lcd.printf(" Bank PrgNo Write");
            *iParam2 = g_iBankNo;
            *iParam3 = g_iProgNo;
            break;
        default:
            break;
    }
    
    param2Change(iParam1, iParam2, iParam3, iParam4);
    
}


/*******************************/
/* Param2 Change               */
/*******************************/
void param2Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) {

    lcd.locate(0,3);
    lcd.printf("        ");

    switch (*iParam1) {
        case MODE_PLAY:
            paramCheck(iParam2, BANK_MAX_NUM);
            g_iBankNo = *iParam2;
            *iParam3 = g_iProgNo;
            break;
        case MODE_EDIT:
            paramCheck(iParam2, EFFECT_MAX_NUM);
            *iParam3 = 0;
            break;
        case MODE_PROGWRITE:
            paramCheck(iParam2, BANK_MAX_NUM);
            g_iBankNo = *iParam2;
            *iParam3 = g_iProgNo;
            *iParam4 = 0;
            g_iFlag = 0;
        default:
            break;
    }

    if ((*iParam1 == MODE_PLAY) || (*iParam1 == MODE_PROGWRITE)) {
        lcd.locate(6,3);
        lcd.printf("%d",*iParam2);
    }

    if (*iParam1 == MODE_EDIT) {
        switch (*iParam2) {
            case EFFECT_DIST:
                lcd.locate(2,3);
                lcd.printf(" DIST");
                break;
            case EFFECT_DELAY:
                lcd.locate(2,3);
                lcd.printf("DELAY");
                break;
            default:
                break;
        }
    }
    
    param3Change(iParam1, iParam2, iParam3, iParam4);
    
}


/*******************************/
/* Param3 Change               */
/*******************************/
void param3Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) {

    lcd.locate(8,3);
    lcd.printf("     ");

    switch (*iParam1) {
        case MODE_PLAY:
            paramCheck(iParam3, PROGNO_MAX_NUM);
            g_iProgNo = *iParam3;
            break;
        case MODE_EDIT:
            switch (*iParam2) {
                case EFFECT_DIST:
                    paramCheck(iParam3, DIST_PARAM_MAX_NUM);
                    switch (*iParam3) {
                        case DIST_PARAM_BYPASS:     *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_BYPASS];
                                                    break;
                        case DIST_PARAM_MODE:       *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_MODE];
                                                    break;
                        case DIST_PARAM_INPUTGAIN:  *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_INPUTGAIN];
                                                    break;
                        case DIST_PARAM_CLIPLEVEL:  *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_CLIPLEVEL];
                                                    break;
                        case DIST_PARAM_OUTPUTGAIN: *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_OUTPUTGAIN];
                                                    break;
                        default:                    break;   
                    }
                    distParamChange(iParam3, iParam4);
                    break;
                case EFFECT_DELAY:
                    paramCheck(iParam3, DLY_PARAM_MAX_NUM);
                    switch (*iParam3) {
                        case DLY_PARAM_BYPASS:      *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_BYPASS];
                                                    break;
                        case DLY_PARAM_DELAYTIME:   *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_DELAYTIME];
                                                    break;
                        case DLY_PARAM_FBGAIN:      *iParam4 = g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_FBGAIN];
                                                    break;
                        default:                    break;                    
                    }
                    delayParamChange(iParam3, iParam4);
                    break;
                default:
                    break;
            }
            break;
        case MODE_PROGWRITE:
            paramCheck(iParam3, PROGNO_MAX_NUM);
            g_iProgNo = *iParam3;
            *iParam4 = 0;
            g_iFlag = 0;
            progWrite(iParam4);
            break;
        default:
            break;
    }

    if ((*iParam1 == MODE_PLAY) || (*iParam1 == MODE_PROGWRITE)) {
        lcd.locate(12,3);
        lcd.printf("%d",*iParam3);
    }

}


/*******************************/
/* Param4 Change               */
/*******************************/
void param4Change(int* iParam1, int* iParam2, int* iParam3, int* iParam4) {

    lcd.locate(14,3);
    lcd.printf("      ");

    switch (*iParam1) {
        case MODE_EDIT:
            switch (*iParam2) {
                case EFFECT_DIST:
                    distParamChange(iParam3, iParam4);
                    break;
                case EFFECT_DELAY:
                    delayParamChange(iParam3, iParam4);
                    break;
                default:
                    break;
            }
            break;
        case MODE_PROGWRITE:
            progWrite(iParam4);
            break;
        default:
            break;
    }

}


/*******************************/
/* Distotion Param Change      */
/*******************************/
void distParamChange(int* iParam3, int* iParam4) {

    lcd.locate(8,3);
    lcd.printf("           ");
    lcd.locate(8,3);

    switch (*iParam3) {
        case DIST_PARAM_BYPASS:     
            paramCheck(iParam4, DIST_VALUE_BYPASS_MAX);
            g_iDistBypass = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_BYPASS] = *iParam4;
            if(g_iDistBypass == 0){
                lcd.printf("BYPSS   OFF");
            }else{
                lcd.printf("BYPSS    ON");
            }
            break;
        case DIST_PARAM_MODE:       
            paramCheck(iParam4, DIST_VALUE_MODE_MAX);
            g_iDistMode = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_MODE] = *iParam4;
            lcd.printf(" MODE    %d", *iParam4);
            break;
        case DIST_PARAM_INPUTGAIN: 
            paramCheck(iParam4, DIST_VALUE_INPUTGAIN_MAX);
            g_iDistInputGain = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_INPUTGAIN] = *iParam4;
            lcd.printf("INP.G   %d", *iParam4);
            break;
        case DIST_PARAM_CLIPLEVEL:  
            paramCheck(iParam4, DIST_VALUE_CLIPLEVEL_MAX);
            g_iDistClipLevel = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_CLIPLEVEL] = *iParam4;
            lcd.printf("CLP.L   %d", *iParam4);
            break;
        case DIST_PARAM_OUTPUTGAIN: 
            paramCheck(iParam4, DIST_VALUE_OUTPUTGAIN_MAX);
            g_iDistOutputGain = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DIST_PARAM_OUTPUTGAIN] = *iParam4;
            lcd.printf("OUT.G   %d", *iParam4);
            break;
        default:                    
            break;

    }
}

/*******************************/
/* Delay Param Change          */
/*******************************/
void delayParamChange(int* iParam3, int* iParam4) {

    lcd.locate(8,3);
    lcd.printf("           ");
    lcd.locate(8,3);

    switch (*iParam3) {
        case DLY_PARAM_BYPASS:      
            paramCheck(iParam4, DLY_VALUE_BYPASS_MAX);
            g_iDelayBypass = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_BYPASS] = *iParam4;
            if(g_iDelayBypass == 0){
                lcd.printf("BYPSS   OFF");
            }else{
                lcd.printf("BYPSS    ON");
            }
            break;
        case DLY_PARAM_DELAYTIME:   
            paramCheck(iParam4, DLY_VALUE_DELAYTIME_MAX);
            g_iDelayTime = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_DELAYTIME] = *iParam4;
            lcd.printf("DLY.T   %d", *iParam4);
            break;
        case DLY_PARAM_FBGAIN:      
            paramCheck(iParam4, DLY_VALUE_FBGAIN_MAX);
            g_iDelayFeedBackLevel = *iParam4;
            //g_iProgPatch[g_iBankNo][g_iProgNo][PP_DLY_PARAM_FBGAIN] = *iParam4;
            lcd.printf(" FB.G   %d", *iParam4);
            break;
        default:                    
            break;

    }
}

/*******************************/
/* Program Patch Write         */
/*******************************/
void progWrite(int* param){

    if(g_iFlag == 0){
        if((*param > 24) || (*param < -24)){
            lcd.locate(14,3);
            lcd.printf(" Done");
            ProgramPatchChange(g_iBankNo, g_iProgNo);
            progPatchWite(0);        
            g_iFlag = 1;
        }else{
            lcd.locate(14,3);
            lcd.printf("Unexe");
        }
    }else{
       lcd.locate(14,3);
       lcd.printf(" Done"); 
    }
}


/*******************************/
/* Program Patch Wite          */
/*******************************/
void progPatchWite(int iFlag){
   
    int i, j, k;
    
    FILE *fp = fopen("/local/prm.txt", "w");  
    if(!fp) {
        while(1){
            lcd.cls();
            wait(0.5);
            lcd.locate(1,1);
            lcd.printf("SYSTEM ERROR #2000");
            wait(0.5);
        }
    }
   
   fprintf(fp, " BANK PROG ---- DISTOTION ---  ----- DELAY ------\n");
   fprintf(fp, "            BYP MODE  ING C.Lv OUTG  BYP TIME   FB\n");
   for(i=0;i<BANK_MAX_NUM;i++){
       for(j=0;j<PROGNO_MAX_NUM;j++){
           if(iFlag == 1)ProgramPatchChange(i, j);           
           fprintf(fp, "%5d%5d", i, j);
           for(k=0;k<PP_MAX_NUM;k++){
               fprintf(fp, "%5d\0", g_iProgPatch[i][j][k]);
           }
           fprintf(fp, "\n");
       }
   }
    
   fclose(fp);
}


/*******************************/
/* Program Patch Chanege       */
/*******************************/
void ProgramPatchChange(int iBank, int iProg){

    // Distotion Param
    g_iProgPatch[iBank][iProg][PP_DIST_PARAM_BYPASS]        = g_iDistBypass;
    g_iProgPatch[iBank][iProg][PP_DIST_PARAM_MODE]          = g_iDistMode;
    g_iProgPatch[iBank][iProg][PP_DIST_PARAM_INPUTGAIN]     = g_iDistInputGain;
    g_iProgPatch[iBank][iProg][PP_DIST_PARAM_CLIPLEVEL]     = g_iDistClipLevel;
    g_iProgPatch[iBank][iProg][PP_DIST_PARAM_OUTPUTGAIN]    = g_iDistOutputGain;
    
    // Delay Param
    g_iProgPatch[iBank][iProg][PP_DLY_PARAM_BYPASS]         = g_iDelayBypass;
    g_iProgPatch[iBank][iProg][PP_DLY_PARAM_DELAYTIME]      = g_iDelayTime;
    g_iProgPatch[iBank][iProg][PP_DLY_PARAM_FBGAIN]         = g_iDelayFeedBackLevel;
    
}