yoshinari kou
/
WW_SD_save_IRVer2
Save IR data
Diff: main.cpp
- Revision:
- 0:decd8d14cc06
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Aug 31 15:50:30 2011 +0000 @@ -0,0 +1,280 @@ +////////////////////////////////////// +// White Wizard Board (PAT.PEND) // +// Save IR data to microSD card. // +// // +// Nest Egg Inc. 2011/7/9 // +// // +////////////////////////////////////// +#include "mbed.h" +#include "SDFileSystem.h" + +#define SDch 0x05 +#define MAXdatanum 1000 +#define TimeLimit 3000 +#define pul38khz 0.0263 +#define pul38k_ON 0.0131 +#define pul38k_OFF 0.0 +//#define TEST 1 + +//prototype +void SDsave(int[], int[], int); +void send_pulse(int, int); + +SDFileSystem sd(p5, p6, p7, p8, "sd"); + +//DigitalIn IR(p9); + +InterruptIn IR(p9); + +DigitalOut myled1(LED1); +DigitalOut myled2(LED2); +DigitalOut myled3(LED3); +DigitalOut myled4(LED4); + +PwmOut Pulse_pin(p21); + +int trigger = 0; +int saved = 0; +int datanum = 0; +int i = 0; +int IRdata[MAXdatanum]; +int pulsetime[MAXdatanum]; + + +void triggerOn() { + trigger = 1; + IRdata[i] = 0; + pulsetime[i]=0; + + if(i < MAXdatanum){ + while(IR==0 && pulsetime[i]<=15000){ + ++pulsetime[i]; + wait_us(50); + + } + + if(pulsetime[i]>=15000){ + printf(" pulsetime[i] >= TimeLimit !\n"); + datanum = i; + i = MAXdatanum; + } + + ++i; + } +} + + +void triggerOff() { + trigger = 0; + pulsetime[i]=0; + IRdata[i] = 1; + + if(i < MAXdatanum){ + while(IR==1 && pulsetime[i]<=15000){ + ++pulsetime[i]; + wait_us(50); + + } + + if(pulsetime[i]>=15000){ + printf(" pulsetime[i] >= TimeLimit !\n"); + datanum = i; + i = MAXdatanum; + } + + ++i; + } +} + + +int main(){ + //Buffer is 100 pulses. + //int IRdata[MAXdatanum]; + //int pulsetime[MAXdatanum]; + //int i = 0; + + myled1 = 0; + myled2 = 0; + myled3 = 0; + myled4 = 0; + + myled1 = 1; + + IR.fall(&triggerOn); + IR.rise(&triggerOff); + + printf("start!\n"); + + while(1){ + IR.fall(&triggerOn); + IR.rise(&triggerOff); + + if(i >= MAXdatanum && i!= (MAXdatanum + 100)){ + printf("Save start!\n"); + SDsave(IRdata, pulsetime,datanum); + i = MAXdatanum + 100; + printf("Finish!"); + } + } +#ifdef TEST + +#else + while(1){ + + if(trigger == 0 && saved == 0){ //no signal + ; + }else if(trigger == 1 && saved == 0){ //"save" start + //IR.fall(NULL); + for(i = 0; i < MAXdatanum; ++i){ + pulsetime[i] = 0; //init + + if(IR == 1){ + //check signal type + IRdata[i] = 1; + + while(IR==1 && pulsetime[i]<=TimeLimit){ //while IR = 1 + //check time + ++pulsetime[i]; + wait_us(50); //count by 100 usec + } + + + }else{ + //check signal type + IRdata[i] = 0; + + while(IR==0 && pulsetime[i]<=TimeLimit){ //while IR = 0 + //check time + ++pulsetime[i]; + wait_us(50); //count by 100 usec + + } + + } + + datanum = i; + + if( pulsetime[i] >= TimeLimit){ + printf(" pulsetime[i] >= TimeLimit !\n"); + i = MAXdatanum; + } + + } + + SDsave(IRdata, pulsetime,datanum); + }else{ + ; + } + } +#endif + +#ifdef TEST + IRdata[0] = 1; + pulsetime[0] = 555; + IRdata[1] = 0; + pulsetime[1] = 777; + SDsave(IRdata, pulsetime,2); +#endif + + while(1){ + } + +} + +void SDsave(int IRdata1[], int pulsetime1[], int datanum1){ + + int j = 0; + + //channel No must be A4 A3 A2 A1 + sd.SetCh(SDch); //channel No 0101(=0x05), depend on your SPI module setting. (1:High 0:Low) + wait(1); + + printf("Start to save data\n"); + myled2 = 1; + + FILE *fp = fopen("/sd/IRDATA.csv", "w"); + if(fp == NULL) { + error("Could not open file to write\n"); + myled3 = 1; + } + +#ifdef TEST + fprintf(fp, "%d\n",datanum1); + fprintf(fp, "%d,%d,\n",IRdata1[0], pulsetime1[0]); + fprintf(fp, "%d,%d,\n",IRdata1[1], pulsetime1[1]); +#else + + fprintf(fp, "%d\n",datanum1); + for(j=0;j<datanum1;++j){ + fprintf(fp, "%d,%d,\n",IRdata1[j], pulsetime1[j]); + } +#endif + + + fclose(fp); + saved = 1; + printf("Saved!\n"); + + sd.SetCh(0x00); //not select + +//#ifdef TEST + wait(1); + sd.SetCh(SDch); //channel No 0101(=0x05), depend on your SPI module setting. (1:High 0:Low) + printf("again\n"); + int pHL = 0; + int t = 0; + FILE *fp1 = fopen("/sd/IRDATA.csv", "r"); + + datanum = 0; + + fscanf(fp1, "%d\n",&datanum1); //read from SD + printf("datanum, %d\n",datanum1); + + for(j=0;j<datanum1;++j){ + fscanf(fp1, "%d,%d,\n", &pHL, &t); //read from SD + + send_pulse(pHL,t); + + //printf("ans, %d,%d,\n", pHL, t); + } + + fclose(fp1); + printf("close fp1\n"); + +//#endif + + myled3 = 1; + myled4 = 1; +} + + +void send_pulse(int pHL, int t){ + + int k = 0; + int err = 0; + + Pulse_pin.period(pul38khz); + + if(pHL == 0){ + //38kHz pulse on + Pulse_pin.pulsewidth(pul38k_ON); + + }else if(pHL == 1){ + //38kHz pulse off + Pulse_pin.pulsewidth(pul38k_OFF); + + }else{ + Pulse_pin.pulsewidth(pul38k_OFF); + printf("\n\n-----Data format is incorrect!!-----\n pHL = %d, t = %d \n", pHL, t); + err = 1; + + } + + if(err == 0){ + for(k = 0; k < t; ++k){ + wait_us(50); + } + } + +} +