NM500 TEST PGM

Dependencies:   NM500Lib_Socket NM500_Test_Socket SDFileSystem_Socket mbed

main.cpp

Committer:
Nasungil
Date:
2017-05-29
Revision:
11:6a81bde51be5
Parent:
10:74e762848659
Child:
12:c8fbe49527e7

File content as of revision 11:6a81bde51be5:

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

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

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

int main() { 
    //NM500 & SD Card Init
    if(begin() == 0)
        printf("\n\nNM500 Init\n");
    else
        printf("\nInit error\n");          
    
    //time measure start
    t.start();
    
    //minif test
    write(NM_MINIF,3);
    int minif = read(NM_MINIF);

    //maxif test
    write(NM_MAXIF,10000);  
    int maxif = read(NM_MAXIF);
    
    //GCR test
    write(NM_GCR,5);
    int gcr = read(NM_GCR);
    //printf("gcr : %d",gcr);
     
    st.start();          
    //Neuron learn
    printf("Learn Start\n");
    int learn = data_learn();
    if(learn == 0x7fff)     //change
        learn = MAXNEURONS;
    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();
    st.stop();
    printf("Save Complete\n");
    printf("Save Time : %d ms\n",st.read_ms());
    st.reset();
    
    //forget
    forget();
    int forget = NCOUNT();
    
    //restore
    st.start();
    printf("Restore Start\n");
    int restore = SDToNeurons();
    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");
    int classify = data_classify();
    st.stop();
    printf("Classify Complete\n");
    printf("classify Time : %d ms\n",st.read_ms());
    
    
    printf("\n****************Tset Result****************\n");
    //minif result
    if(minif == 3)
        printf("MINIF # PASS\n");
    else
        printf("MINIF # FAIL\n");

    //maxif result
    if(maxif == 10000)
        printf("MAXIF # PASS\n");
    else
        printf("MAXIF # FAIL\n");
        
    //GCR result
    if(gcr == 5)
        printf("GCR # PASS\n");
    else
        printf("GCR # FAIL\n");
        
        
    //forget result
    if(forget == 0)
        printf("FORGET # PASS\n");
    else
        printf("FORGET # FAIL\n");
        
    //learn result
    if(learn == MAXNEURONS){
        printf("Daisy Chain # PASS\n");
        printf("Learn # PASS\n");
    }
        
    else if(learn == 2){
        printf("Daisy Chain # FAIL\n");
        printf("Learn # PASS\n");
    }
    else {
        printf("Daisy Chain # unknown\n");
        printf("# %d Neuron Learn FAIL\n",learn);        
    }
    
    //classify result
    if(classify == 1){
        printf("Classify # PASS\n");
        printf("Distance # PASS\n");
    }
    else if(classify == 2){
        printf("Classify # PASS\n");
        printf("Distance # FAIL\n");
    }
    else {
        printf("# %d Neuron Classify FAIL\n",classify);
        printf("Distance # PASS\n");
    }
    
    printf("POWER SAVE ON\n");
    write(NM_POWER_SAVE,0);
    t.stop();
    printf("Total Time : %d ms\n",t.read_ms());
             
             
        
        
}
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....
            for(int j =0;j<NEURONSIZE;j=j+2){   
                vector[j] = i>>8;          //upper bit save
                vector[j+1] = i;           //low bit save
            }
            //data learn
            ncnt = learn(vector, NEURONSIZE, i);    //input : data, neuronsize, cat,   return : ncount
            if(ncnt == 0x7fff)     //change
                ncnt = MAXNEURONS;
            //printf("ncount # %d\n",ncnt);
            
            if(ncnt == old_ncnt)    //ncount가 변화가 없으면  
                printf("\nNeuron Learn Fail # %d\n",ncnt);     
            else                    //ncount가 증가하였을 경우
                old_ncnt = ncnt;    //old ncount 갱신

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

int 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
        }

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

        if(nid!=cat){
            printf("Classify Fail # %d \n",nid);
            return cat;       //분류 실패
        }
        if(distance != 0){
            printf("Distance Fail \n");
            return 2;       //distance error
        }
    
    }
    printf("\n");  
    return 1;       //정상 분류
}