CURRENT ISSUE

Contests

bottom corner

Feature Article

Issue #201 April 2007
ATir Keyboard Interface
by Steven Savage

Start | System Overview | Keyboard | IR Remote Operation | ATir Hardware | Operation | Nice Solution | Sources & PDF

Listing 2—This algorithm reads the stream of scan codes and extracts the essentials. The ATtiny45 has a 256-byte EEPROM to store all macro data. Conservation is “key.”

void encode(uint8_t scancode){
static bool ext = false;	//extended key flag
static bool rel = false;	//key release flag
static bool lwc = false; //last (input) was a code byte (not ext or rel)

	static uint8_t lastcode = 0;
		switch (scancode){
		case 0xE0:
			if (lastcode && !ext){
				addKeyDown(lastcode);
				lastcode = 0;
			}
			ext = true;
			lwc = false;
			break;
		case 0xF0:
			rel = true;
			lwc = false;
			break;
		default:
			if (scancode==lastcode){
				if(rel){ //if release, its a keypress
					rel=false;
					if(ext){
						ext = false;
						addKeyPressExt(lastcode);
					}
					else{
						addKeyPress(lastcode);
					}
					lastcode = 0;
				}
				else{
					if(ext && lwc){
						addKeyDownExt(lastcode);
						ext = false;	
					}
				}
			}
			else{//scancode != lastcode
				if(lastcode){	//a key was pressed pending
					if(rel){
						rel=false;
						f(ext){
							ext = false;
							addKeyDownExt(lastcode);
							addKeyReleaseExt(scancode);
						}
						else{
							addKeyDown(lastcode);
							addKeyRelease(scancode);
						}
						lastcode=0;
					}
					else{
						if(ext){
							addKeyDownExt(lastcode);
						
							if(lwc)
								ext = false;
					}
					else{			
							addKeyDown(lastcode);
					}
				lastcode=scancode;
				}				  	          
			}
			else{	//key not pressed pending
					if(rel){
						rel = false;
						if(ext){
							ext = false;
							addKeyReleaseExt(scancode);
						}
						else{
							addKeyRelease(scancode);
						}
					lastcode=0;
					
					}
					else{

					lastcode=scancode;
					}
			}
		}
	lwc=true;
	}//end switch

}

 


bottom corner