CURRENT ISSUE
Contests
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
}
|