#include "ticker.h" #include "lcd.h" #include "3052.h" #include <stdio.h> #define GETIRPULSE_TIMEOUT 5000 /* msec */ #define MAXONPULSEWIDTH 20000 /* usec */ #define MAXOFFPULSEWIDTH 10000 /* usec */ #define MAXPULSE 128 typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned long ulong; typedef struct { ushort onwidth; ushort offwidth; } PulseWidth; PulseWidth pw[MAXPULSE]; uchar npw; /* assuming MAXPULSE is less than 256 */ #define isIRSensorOn() (PA.DR.BYTE&0x20) #define FUNCTIONLED PB.DR.BIT.B3 #define getSWStatus() (PA.DR.BYTE^0x0f) #define STARTSW 0x08 #define PREVSW 0x02 #define NEXTSW 0x01 uchar getIRPulse() { ulong tm0,tm1; ulong timeout; FUNCTIONLED = 0; timeout = tick+(GETIRPULSE_TIMEOUT*1000/TICK); npw = 0; /* Wait for begin */ while(!isIRSensorOn()){ if(tick == timeout){ FUNCTIONLED = 1; return 0; } } tm0 = tick; FUNCTIONLED = 1; while(npw < MAXPULSE){ /* Wait for off */ timeout = tm0+(MAXONPULSEWIDTH/TICK); while(isIRSensorOn()){ if(tick == timeout) return npw; } tm1 = tick; pw[npw].onwidth = tm1-tm0; FUNCTIONLED = 0; /* Wait for on */ timeout = tm1+(MAXOFFPULSEWIDTH/TICK); while(!isIRSensorOn()){ if(tick == timeout){ pw[npw++].offwidth = 0; FUNCTIONLED = 1; return npw; } } tm0 = tick; pw[npw++].offwidth = tm0-tm1; FUNCTIONLED = 1; } return npw; } void displayPulse(uchar cpw) { char msg[32]; if(cpw >= npw){ LCDDisplay("",1); return; } sprintf(msg,"%2d:%6d/%6d",cpw+1,pw[cpw].onwidth*TICK,pw[cpw].offwidth*TICK); LCDDisplay(msg,1); } int main() { uchar swstatus; uchar cpw; char msg[32]; PA.DDR = 0x00; PB.DDR = 0xff; PB.DR.BYTE = 0xff; TickerInit(); LCDInit(); LCDDisplay("iR TEST",0); cpw = 0; while(1){ swstatus = getSWStatus(); if(swstatus&STARTSW){ LCDDisplay("Waiting...",0); LCDDisplay("",1); cpw = 0; if(!getIRPulse()){ LCDDisplay("Timeout",0); }else{ sprintf(msg,"Got %d pulses",npw); LCDDisplay(msg,0); displayPulse(cpw); } while(getSWStatus()&STARTSW) ; }else if(swstatus&PREVSW){ if(cpw > 0) cpw--; displayPulse(cpw); while(getSWStatus()&PREVSW) ; }else if(swstatus&NEXTSW){ if(cpw < npw-1) cpw++; displayPulse(cpw); while(getSWStatus()&NEXTSW) ; } } return 0; }