NM500 TEST PGM

Dependencies:   NM500Lib_Socket NM500_Test_Socket SDFileSystem_Socket mbed

main.cpp

Committer:
Nasungil
Date:
2017-06-23
Revision:
12:c8fbe49527e7
Parent:
11:6a81bde51be5
Child:
13:e756b6e50853

File content as of revision 12:c8fbe49527e7:

#include "mbed.h"
#include "NM500.h"

int data_learn(void);
void data_classify(void);
void NSR_Test(void);

int id_fail     = 0;
int nsr_fail    = 0;

int CMN_Maxif   = 0;
int CMN_Nsr     = 0;
int CMN_Ncount  = 0;
int CMN_RC      = 0;
int CMN         = 0;

int Gcr1        = 0;
int Gcr2        = 0;
int Minif1      = 0;
int Minif2      = 0;
int Maxif1      = 0;
int Maxif2      = 0;
int Aif1        = 0;
int Aif2        = 0;
int Cat1        = 0;
int Cat2        = 0;

int Nid1        = 0;
int Nid2        = 0;
int Dist1       = 0;
int Dist2       = 0;

int Learn1      = 0;
int Learn2      = 0;

int Memory1     = 0;
int Memory2     = 0;

int NM1         = 0;
int NM2         = 0;

char array1[NEURONSIZE];
char array2[NEURONSIZE];

Timer t, st;
//Serial pc(SERIAL_TX, SERIAL_RX);
unsigned char vector[NEURONSIZE];

int main() { 

    //NM500 & SD Card Init
    if(begin() == 0){
        printf("\nTest Board V2.0 \n");
        printf("\n\nNM500 Init \n");
    }
    else{
        printf("\nInit error\n");
        //int forget = 1;
        error("\nFORGET error\n");
    } 
    
    //memory array init
    for(int i=0;i<NEURONSIZE;i=i+1){
        array1[i]=0x0a;
        array2[i]=0x05;         
    }
    NSR_Test();
      
    //time measure start
    t.start();
    //NCOUNT Test
    int ncount_fail = read(NM_NCOUNT);
    
    if(ncount_fail != 0){
        CMN_Ncount = 1;
        error("NCOUNT Fail\n");
    }
  
    //minif test
    write(NM_MINIF,3);
//    int minif = read(NM_MINIF);
//    if(minif != 3)
//        CMN_Minif = 1;

    //maxif test
    write(NM_MAXIF,10000);  
    int maxif = read(NM_MAXIF);
    if(maxif != 10000)
        CMN_Maxif = 1;
    
    //GCR test
    write(NM_GCR,5);
//    int gcr = read(NM_GCR);
//    //printf("gcr : %d",gcr);
//    if(gcr != 5)
//        CMN_Gcr = 1;
     
    st.start();          
    //Neuron learn
    printf("Learn Start\n");
    

    int daisy = data_learn();

    st.stop(); 
    printf("Learn Complete\n");
    printf("Learn Time : %d ms\n",st.read_ms());
    st.reset();
    
    //data save
    st.start();
    printf("Save Start\n");
    
    int save = NeuronToSD();
    if(save == 0xFFFF || save == 0x7FFF)     //change
        save = MAXNEURONS;
    st.stop();
    printf("Save Complete\n");
    printf("Save Time : %d ms\n",st.read_ms());
    st.reset();
    
    //forget
    forget();

    
    //restore
    st.start();
    printf("Restore Start\n");
    
    int restore = SDToNeurons();
    
    if(restore == 0xFFFF || restore == 0x7FFF)     //change
        restore = MAXNEURONS;
    st.stop();
    printf("Restore Complete\n");
    printf("Restore Time : %d ms\n",st.read_ms());
    st.reset();
    
    setKNN();
    //classify
    st.start();
    printf("Classify Start\n");

    data_classify();
    st.stop();
    printf("Classify Complete\n");
    printf("classify Time : %d ms\n",st.read_ms());
    
    
    printf("\n****************Test Result****************\n");
    //nsr result
     if(CMN_Nsr ==1){
        printf("NSR Register Fail\n");
        CMN++;
    }
        
    //NCOUNT Result
    if(CMN_Ncount ==1){
        printf("NCOUNT Register Fail\n");
        CMN++;
    }
        
    //MAXIF Result
    if(CMN_Maxif ==1){
        printf("MAXIF Register Fail\n");
        CMN++;
    }  
        
    //MINIF Result
    if(Minif1 ==1){
        printf("#1 NM500 MINIF Register Fail\n");
        NM1++;
    }
    if(Minif2 ==1){
        printf("#2 NM500 MINIF Register Fail\n");
        NM2++;
    }
    
    //learn result
    if(Learn1 == 1){
        printf("#1 NM500 Learn Function Fail\n");
        NM1++; 
    }
    if(Learn2 == 1){
        printf("#2 NM500 Learn Function Fail\n");
        NM2++; 
    }
    
    //Daisy Chain result
    if(daisy == 1){
        printf("#1 NM500 Daisy Chain Fail\n");
        NM1++; 
    } 
      
    //GCR result
    if(Gcr1 == 1){
        printf("#1 NM500 GCR Register Fail\n");
        NM1++;
    }
    if(Gcr2 == 1){
        printf("#2 NM500 GCR Register Fail\n");
        NM2++;
    }
    //AIF result
    if(Aif1 == 1){
        printf("#1 NM500 AIF Register Fail\n");
        NM1++;
    }
    if(Aif2 == 1){
        printf("#2 NM500 AIF Register Fail\n");
        NM2++;
    }
    //Cat result
    if(Cat1 == 1){
        printf("#1 NM500 CAT Register Fail\n");
        NM1++;
    }
    if(Cat2 == 1){
        printf("#2 NM500 CAT Register Fail\n");
        NM2++;
    }
    if(save != MAXNEURONS){
        printf("NM500 Learn Function Fail\n");
        CMN++;
    }
    if(restore != MAXNEURONS){
        printf("NM500 Restore Function Fail\n");
        CMN++;
    }
    //NID result
    if(Nid1 == 1){
        printf("#1 NM500 Nid Register Fail\n");
        NM1++;
    }
    if(Nid2 == 1){
        printf("#2 NM500 Nid Register Fail\n");
        NM2++;
    }
    
    //Dist result
    if(Dist1 == 1){
        printf("#1 NM500 Dist Register Fail\n");
        NM1++;
    }
    if(Dist2 == 1){
        printf("#2 NM500 Dist Register Fail\n");
        NM2++;
    }
    if(Memory1 == 1){
        printf("#1 NM500 Memory Fail\n");
        NM1++;
    }
    if(Memory2 == 1){
        printf("#2 NM500 Memory Fail\n");
        NM2++;
    }
    
    //final result
    if(NM1 >1)
        printf("#1 NM500 Fail\n");
    if(NM2 > 1)
        printf("#2 NM500 Fail\n");   
    if(CMN>1)
        printf("#1, #2 Fail\n");
    if(CMN == 0 && NM1 == 0 && NM2 == 0)
        printf("#1, #2 NM500 PASS\n");
        
    
            
            
//    //reset chain result
//    if(CMN_RC == 1)
//        printf("Reset Chain Register Fail\n");

  //  printf("POWER SAVE ON\n");
//    write(NM_POWER_SAVE,0);
    t.stop();
    printf("Total Time : %d ms\n",t.read_ms());
       
}
void NSR_Test(void)
{
    //KNN Mode setting
    setKNN();
    //read KNN Register
    int nsr = read(NM_NSR) & 0x20;
    if(nsr != 32)
        CMN_Nsr = 1;    //fail

    //RBF Mode setting
    setRBF();         
    nsr = read(NM_NSR) & 0x20;
    if(nsr != 0)
        CMN_Nsr = 1;    //fail

    int temp_nsr = read(NM_NSR);
    
    //SR Mode test
    write(NM_NSR, 0x10);
    nsr = read(NM_NSR) & 0x10;    
    if(nsr != 16)
        CMN_Nsr = 1;
    
    //Nomal Mode Test
    write(NM_NSR, temp_nsr);
    nsr = read(NM_NSR) & 0x10;
    if(nsr != 0)
        CMN_Nsr = 1; 
}
int data_learn(void)
{
    int ncnt=0,old_ncnt=0;  //ncount, old ncount
    
    //number of neuron 576*2
    for(int i=1;i<=MAXNEURONS;i++){ 
        // ex
        //      1.      0 1 0 1.... 
        //      2.      0 2 0 2.... 
        //      3.      0 3 0 3....
        //      .....
        //      255.    0 255 0 255....
        //      256.    1 0 1 0....
        //      257.    1 1 1 1....
        if(i%2 == 1){
            for(int j =0;j<DATA_CNT;j=j+2){   
                vector[j] = i>>8;          //upper bit save
                vector[j+1] = i;           //low bit save
            }
            for(int j =DATA_CNT;j<NEURONSIZE; j++){   
                vector[j] = array1[j];          //upper bit save
            }
        }
        else if(i%2==0){
            for(int j =0;j<DATA_CNT;j=j+2){   
                vector[j] = i>>8;          //upper bit save
                vector[j+1] = i;           //low bit save
            }
            for(int j =DATA_CNT;j<NEURONSIZE; j++){   
                vector[j] = array2[j];          //upper bit save
            }
        }
        
        //data learn
        ncnt = learn(vector, NEURONSIZE, i);    //input : data, neuronsize, cat,   return : ncount
        if(ncnt == 0xffff || ncnt == 0x7FFF)     //change
            ncnt = MAXNEURONS;
        //printf("ncount # %d\n",ncnt);
        
        if(ncnt == old_ncnt){    //ncount가 변화가 없으면  
            if(ncnt <=576){
                Learn1 = 1;
                error("\n Learn Fail NM500 #1\n");  
            }
            else{
                Learn2 = 1;
                error("\n Learn Fail NM500 #2\n");  
            }
        }   
        //ncount가 증가하였을 경우    
        else                 
            old_ncnt = ncnt;    //old ncount 갱신

        printf(".");
    } 
    printf("\n");
    printf("NCOUNT : %d\n",ncnt);
    //학습 완료 후 ncount가 MAXNEURONS보다 작을 경우
    if(ncnt == MAXNEURONS/2)
        return 1;       //데이지체인 불량
    else if( ncnt != MAXNEURONS)
        error("NCOUNT Fail\n");
    return 0;        //정상 출력
}

void data_classify(void)
{
    int distance, cat, nid;
    //number of neuron 1156
    for(int i=1;i<=MAXNEURONS;i++){          
        //test 벡터 생성
        //for(int j =0;j<NEURONSIZE;j=j+2){   //size of neuron 256
//            vector[j] = i>>8;               //upper bit save
//            vector[j+1] = i;                //low bit save
//        }
        if(i%2 == 1){
            for(int j =0;j<DATA_CNT;j=j+2){   
                vector[j] = i>>8;          //upper bit save
                vector[j+1] = i;           //low bit save
            }
            for(int j =DATA_CNT;j<NEURONSIZE; j++){   
                vector[j] = array1[j];          //upper bit save
            }
        }
        else if(i%2==0){
            for(int j =0;j<DATA_CNT;j=j+2){   
                vector[j] = i>>8;          //upper bit save
                vector[j+1] = i;           //low bit save
            }
            for(int j =DATA_CNT;j<NEURONSIZE; j++){   
                vector[j] = array2[j];          //upper bit save
            }
        }

        //input : data, data length      output : distance, category, Neuron ID      return 인식된 데이터 갯수
        int nsr = classify(vector, NEURONSIZE, &distance, &cat, &nid);
        id_fail = nsr & 0x70;
        if(id_fail == 0)
            nsr_fail = 1;
        
        printf(".");
//        printf(" neuron# %d \t", nid);
//        printf(" distance = %d,\t ", distance);
//        printf(" cat = %d\n", cat);

        //nid test
        //cat register pass AND (nid,cat diff)
        if((nid!=cat) && (Cat1==0 && Cat2==0)){
            if(nid < 576){
                Nid1 = 1;
                printf("\nNID Register Fail # %d\n",nid);
            }
            else{
                Nid2 = 1;
                printf("\nNID Register Fail # %d\n",nid);
            }
        }
        if(distance != 0){
            if(nid < 576){
                Dist1 = 1;
                printf("\nDistance Register Fail # %d, Distance # %d\n",nid,distance);
            }
            else{
                Dist2 = 1;
                printf("\nDistance Register Fail # %d, Distance # %d\n",nid,distance);
            }
        }
    
    }
    printf("\n");  

}