00001 /************************************************** 00002 * Irda driver 00003 * Function: Driver for irda bit signal reveice 00004 * and process. 00005 * File: irda.c 00006 * Author: Book Chen 00007 * 2008.08.08 00008 **************************************************** 00009 */ 00010 #include "..\inc\includes.h" 00011 00012 // Irda state machine 00013 #define StartState 0 00014 #define CustomCodeState 1 00015 #define CustomCodeBState 2 00016 #define DataCodeState 3 00017 #define DataCodeBState 4 00018 #define RepeatKeyState 5 00019 00020 //Irda input bit type 00021 #define cIrdaNull 0 00022 #define cIrdaStart 1 00023 #define cIrdaData0 2 00024 #define cIrdaData1 3 00025 #define cIrdaStopBit 4 00026 #define cIrdaStopLeaderCode 5 00027 00028 struct IRDA_CONTROL data IrdaCtrl; 00029 void F_IrdaPutKey(); 00030 00031 void F_IrdaPowerOnInit(void) LargeReentrant{ 00032 // For IRDA time counter 00033 TMOD|=0x10; // Timer1 in mode 1...16 bit 00034 TL1=0x00; // 00035 TH1=0x00; // 00036 TR1=0; // Timer 1 start to count. 00037 ET1=0; // Timer 1 is baudrate generator, disable timer interrupt 00038 // Irda use external int 0 00039 //PX0=1; // Irda interrupt has high priority 00040 IT0=1; // Interrupt trigger level...negitive edge tirgger 00041 EX0=1; 00042 } 00043 void F_IrdaBitProc(void){ 00044 INT8U ucTemp; 00045 if(IrdaCtrl.Status&cIrdaSignalinput){ // Has a irda signal in 00046 ucTemp=IrdaCtrl.Type; // Assign signal type...start, bit 0, bit 1,stop 00047 IrdaCtrl.Status&=~cIrdaSignalinput; // Negect flag of irda signal 00048 } 00049 else return; 00050 if(ucTemp==cIrdaNull) return; // No irda bit 00051 if(ucTemp==cIrdaStopBit) return; // No irda bit 00052 if(ucTemp==cIrdaStopLeaderCode) IrdaCtrl.State=RepeatKeyState; // Repeat key code 00053 switch(IrdaCtrl.State){ // Assigb bit to irda signal buffer 00054 case StartState: 00055 if(ucTemp==cIrdaStart){ 00056 IrdaCtrl.State=CustomCodeState; 00057 IrdaCtrl.CustomCode[0]=0; 00058 IrdaCtrl.CustomCode[1]=0; 00059 IrdaCtrl.DataCode[0]=0; 00060 IrdaCtrl.DataCode[1]=0; 00061 IrdaCtrl.BitCount=0; 00062 } 00063 return; 00064 case CustomCodeState: 00065 if(ucTemp==cIrdaData0){ 00066 IrdaCtrl.CustomCode[0]<<=1; 00067 IrdaCtrl.CustomCode[0]&=0xFE; 00068 IrdaCtrl.BitCount++; 00069 if(IrdaCtrl.BitCount==8){ 00070 IrdaCtrl.State=CustomCodeBState; 00071 IrdaCtrl.BitCount=0; 00072 } 00073 } 00074 else if(ucTemp==cIrdaData1){ 00075 IrdaCtrl.CustomCode[0]<<=1; 00076 IrdaCtrl.CustomCode[0]|=0x01; 00077 IrdaCtrl.BitCount++; 00078 if(IrdaCtrl.BitCount==8){ 00079 IrdaCtrl.State=CustomCodeBState; 00080 IrdaCtrl.BitCount=0; 00081 } 00082 } 00083 else{ 00084 IrdaCtrl.State=StartState; 00085 } 00086 return; 00087 case CustomCodeBState: 00088 if(ucTemp==cIrdaData0){ 00089 IrdaCtrl.CustomCode[1]<<=1; 00090 IrdaCtrl.CustomCode[1]&=0xFE; 00091 IrdaCtrl.BitCount++; 00092 if(IrdaCtrl.BitCount==8){ 00093 IrdaCtrl.State=DataCodeState; 00094 IrdaCtrl.BitCount=0; 00095 } 00096 } 00097 else if(ucTemp==cIrdaData1){ 00098 IrdaCtrl.CustomCode[1]<<=1; 00099 IrdaCtrl.CustomCode[1]|=0x01; 00100 IrdaCtrl.BitCount++; 00101 if(IrdaCtrl.BitCount==8){ 00102 IrdaCtrl.State=DataCodeState; 00103 IrdaCtrl.BitCount=0; 00104 } 00105 } 00106 else{ 00107 IrdaCtrl.State=StartState; 00108 } 00109 return; 00110 case DataCodeState: 00111 if(ucTemp==cIrdaData0){ 00112 IrdaCtrl.DataCode[0]<<=1; 00113 IrdaCtrl.DataCode[0]&=0xFE; 00114 IrdaCtrl.BitCount++; 00115 if(IrdaCtrl.BitCount==8){ 00116 IrdaCtrl.State=DataCodeBState; 00117 IrdaCtrl.BitCount=0; 00118 } 00119 } 00120 else if(ucTemp==cIrdaData1){ 00121 IrdaCtrl.DataCode[0]<<=1; 00122 IrdaCtrl.DataCode[0]|=0x01; 00123 IrdaCtrl.BitCount++; 00124 if(IrdaCtrl.BitCount==8){ 00125 IrdaCtrl.State=DataCodeBState; 00126 IrdaCtrl.BitCount=0; 00127 } 00128 } 00129 else{ 00130 IrdaCtrl.State=StartState; 00131 } 00132 return; 00133 case DataCodeBState: 00134 if(ucTemp==cIrdaData0){ 00135 IrdaCtrl.DataCode[1]<<=1; 00136 IrdaCtrl.DataCode[1]&=0xFE; 00137 IrdaCtrl.BitCount++; 00138 if(IrdaCtrl.BitCount==8){ 00139 F_IrdaPutKey(); 00140 IrdaCtrl.State=StartState; 00141 IrdaCtrl.BitCount=0; 00142 } 00143 } 00144 else if(ucTemp==cIrdaData1){ 00145 IrdaCtrl.DataCode[1]<<=1; 00146 IrdaCtrl.DataCode[1]|=0x01; 00147 IrdaCtrl.BitCount++; 00148 if(IrdaCtrl.BitCount==8){ 00149 F_IrdaPutKey(); 00150 IrdaCtrl.State=StartState; // wait fot next irda key input 00151 IrdaCtrl.BitCount=0; 00152 } 00153 } 00154 else{ 00155 IrdaCtrl.State=StartState; 00156 } 00157 return; 00158 case RepeatKeyState: // repeat key 00159 /*if(IrdaCtrl.KeyInPut==4){ 00160 if(IrdaCtrl.KeyInGet==0){;} // Too many input keys, skip this key 00161 else{ 00162 IrdaCtrl.KeyCode[0]=IrdaCtrl.KeyCode[4]; 00163 IrdaCtrl.KeyInPut=0; 00164 } 00165 } 00166 else if((IrdaCtrl.KeyInPut+1)!=IrdaCtrl.KeyInGet){ 00167 IrdaCtrl.KeyCode[IrdaKeyBuff.KeyInPut+1]=IrdaCtrl.DataCode[IrdaKeyBuff.KeyInPut]; 00168 IrdaCtrl.KeyInPut++; 00169 } 00170 */ 00171 IrdaCtrl.BitCount=0; 00172 IrdaCtrl.State=StartState; 00173 return; 00174 } 00175 } 00176 void F_IrdaPutKey() LargeReentrant{ // Put an Irda Key to key buffer 00177 if((IrdaCtrl.CustomCode[0]==0x61)&&(IrdaCtrl.CustomCode[1]==0xD6)){ //SUMC 00178 if(IrdaCtrl.KeyInPut==(IRDA_KEY_BUFFER_SIZE-1)){ 00179 if(IrdaCtrl.KeyInGet==0){;} // Too many input keys, skip this key 00180 else{ 00181 IrdaCtrl.KeyInPut=0; 00182 IrdaCtrl.KeyInBuffer[0]=IrdaCtrl.DataCode[0]; 00183 } 00184 } 00185 else{ 00186 if((IrdaCtrl.KeyInPut+1)!=IrdaCtrl.KeyInGet){ 00187 IrdaCtrl.KeyInPut++; 00188 IrdaCtrl.KeyInBuffer[IrdaCtrl.KeyInPut]=IrdaCtrl.DataCode[0]; 00189 } 00190 } 00191 } 00192 } 00193 INT8U F_IrdaGetKey() LargeReentrant{ // Get a key from Ir key buffer 00194 if(IrdaCtrl.KeyInGet!=IrdaCtrl.KeyInPut){ 00195 if(IrdaCtrl.KeyInGet==(IRDA_KEY_BUFFER_SIZE-1)){ 00196 IrdaCtrl.KeyInGet=0; 00197 return IrdaCtrl.KeyInBuffer[0]; 00198 } 00199 else{ 00200 IrdaCtrl.KeyInGet++; 00201 return IrdaCtrl.KeyInBuffer[IrdaCtrl.KeyInGet]; 00202 } 00203 } 00204 return 0xFF; 00205 } 00206 00207 INT8U F_IrdaCheckKeyInBuffer() LargeReentrant{ // check key in buffer status 00208 if(IrdaCtrl.KeyInPut<(IRDA_KEY_BUFFER_SIZE-1)){ 00209 if((IrdaCtrl.KeyInPut+1)==IrdaCtrl.KeyInGet) return IRDA_KEY_BUFFER_FULL; 00210 else if(IrdaCtrl.KeyInGet!=IrdaCtrl.KeyInPut) return IRDA_KEY_BUFFER_NOT_FULL; 00211 else return IRDA_KEY_BUFFER_EMPTY; 00212 } 00213 else{ 00214 if(IrdaCtrl.KeyInGet==0) return IRDA_KEY_BUFFER_FULL; 00215 else if(IrdaCtrl.KeyInGet!=IrdaCtrl.KeyInPut) return IRDA_KEY_BUFFER_NOT_FULL; 00216 else if(IrdaCtrl.KeyInGet==(IRDA_KEY_BUFFER_SIZE-1)) return IRDA_KEY_BUFFER_EMPTY; 00217 } 00218 } 00219 00220 void F_IrdaGetSignalType() LargeReentrant{ 00221 if((IrdaCtrl.unTime.uc[0]>=46)&&((IrdaCtrl.unTime.uc[0]<=50))){ 00222 IrdaCtrl.Type=cIrdaStart; 00223 } 00224 else if((IrdaCtrl.unTime.uc[0]>=3)&&((IrdaCtrl.unTime.uc[0]<=5))){ 00225 IrdaCtrl.Type=cIrdaData0; 00226 } 00227 else if((IrdaCtrl.unTime.uc[0]>=7)&&((IrdaCtrl.unTime.uc[0]<=9))){ 00228 IrdaCtrl.Type=cIrdaData1; 00229 } 00230 else if((IrdaCtrl.unTime.uc[0]>=38)&&((IrdaCtrl.unTime.uc[0]<=42))){ 00231 IrdaCtrl.Type=cIrdaStopLeaderCode; 00232 } 00233 else if((IrdaCtrl.unTime.uc[0]>=112)&&((IrdaCtrl.unTime.uc[0]<=216))){ 00234 IrdaCtrl.Type=cIrdaStopBit; 00235 } 00236 else IrdaCtrl.Type=cIrdaNull; 00237 } 00238