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; //정상 분류 }