mirror of
https://bitbucket.org/C_Classic/prgkbd.git
synced 2024-11-22 10:15:06 +01:00
Added support for push-and-hold
Keytype is selected by the use of KEYMODE_PRESS -> Then it is not push-and-hold, otherwise it is.
This commit is contained in:
parent
c90f7aee73
commit
6a254d677d
@ -14,14 +14,14 @@ static uchar newReport = 1; /* current report */
|
|||||||
uint16_t memAddr = 0;
|
uint16_t memAddr = 0;
|
||||||
uint8_t cMode = 0; // 0->Keyup 1->Keydown
|
uint8_t cMode = 0; // 0->Keyup 1->Keydown
|
||||||
uint8_t oldKey=0;
|
uint8_t oldKey=0;
|
||||||
uint8_t hasReleased=0;
|
uint8_t hasReleased=1;
|
||||||
uint8_t flag_keyPress=0;
|
uint8_t flag_keyPress=0;
|
||||||
|
uint8_t keyAction=0;
|
||||||
|
|
||||||
uint8_t keyType[16]; // Will contain whether the key has to be handled as a ...
|
uint8_t keyType[16]; // Will contain whether the key has to be handled as a ...
|
||||||
#define KEYTYPE_TEXT 0 // Text-Button (-> only button presses) or whether we need to pay attention to
|
#define KEYTYPE_TEXT 0 // Text-Button (-> only button presses) or whether we need to pay attention to
|
||||||
#define KEYTYPE_KEY 1 // push and release events
|
#define KEYTYPE_KEY 1 // push and release events
|
||||||
|
|
||||||
|
|
||||||
// MEMORY ARCHITECTURE (INTERNAL)
|
// MEMORY ARCHITECTURE (INTERNAL)
|
||||||
#define MEM_SERIAL_OFFSET 0
|
#define MEM_SERIAL_OFFSET 0
|
||||||
#define MEM_SERIAL_LENGTH 16
|
#define MEM_SERIAL_LENGTH 16
|
||||||
@ -44,6 +44,7 @@ uint8_t keyType[16]; // Will contain whether the key has to be handled as a ...
|
|||||||
#define CMD_IEEWRITE 7 //internal eeprom
|
#define CMD_IEEWRITE 7 //internal eeprom
|
||||||
#define CMD_IEEREAD 8 // int. eep.
|
#define CMD_IEEREAD 8 // int. eep.
|
||||||
#define CMD_EXEC 9 // execute from addr.
|
#define CMD_EXEC 9 // execute from addr.
|
||||||
|
#define CMD_INITKEYS 10 // Auto-detect keytypes
|
||||||
|
|
||||||
/*Keys[] 0-133 codes.pdf Page 53 (10. Table 12)
|
/*Keys[] 0-133 codes.pdf Page 53 (10. Table 12)
|
||||||
ModKeys 224-231 codes.pdf Page 59 (10. Table 12)
|
ModKeys 224-231 codes.pdf Page 59 (10. Table 12)
|
||||||
@ -58,6 +59,9 @@ ModKeys 224-231 codes.pdf Page 59 (10. Table 12)
|
|||||||
#define KEYMODE_DOWN 0
|
#define KEYMODE_DOWN 0
|
||||||
#define KEYMODE_PRESS 2 //push and release
|
#define KEYMODE_PRESS 2 //push and release
|
||||||
|
|
||||||
|
#define KEYACTION_DOWN 0
|
||||||
|
#define KEYACTION_UP 1
|
||||||
|
|
||||||
// Very slow programming?
|
// Very slow programming?
|
||||||
// -> Disable verifying the entered data in CMD_EEWRITE
|
// -> Disable verifying the entered data in CMD_EEWRITE
|
||||||
|
|
||||||
@ -170,7 +174,7 @@ static uchar reportBuffer[24];
|
|||||||
}
|
}
|
||||||
else if(rq->bRequest == CMD_SWVERSION) {
|
else if(rq->bRequest == CMD_SWVERSION) {
|
||||||
reportBuffer[0] = '0';
|
reportBuffer[0] = '0';
|
||||||
reportBuffer[1] = '1';
|
reportBuffer[1] = '2';
|
||||||
reportBuffer[2] = 'B';
|
reportBuffer[2] = 'B';
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
@ -218,6 +222,11 @@ static uchar reportBuffer[24];
|
|||||||
newReport = 0; //activate continued exec
|
newReport = 0; //activate continued exec
|
||||||
continueExecution(); // exec NOW
|
continueExecution(); // exec NOW
|
||||||
}
|
}
|
||||||
|
else if (rq->bRequest == CMD_INITKEYS) {
|
||||||
|
detectKeyType();
|
||||||
|
reportBuffer[0] = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -231,9 +240,9 @@ static void buildReport(void){
|
|||||||
else if (oldKey) { // One of the 16 keys was pressed
|
else if (oldKey) { // One of the 16 keys was pressed
|
||||||
//reportBuffer[2] = 125 + oldKey; // 1+getKey()
|
//reportBuffer[2] = 125 + oldKey; // 1+getKey()
|
||||||
// Set memAddr to the first byte of the pressed key
|
// Set memAddr to the first byte of the pressed key
|
||||||
memAddr = MEM_KEY_LENGTH*(oldKey-1);
|
//memAddr = MEM_KEY_LENGTH*(oldKey-1);
|
||||||
cMode = KEYMODE_PRESS; //default to keymode_press
|
//cMode = KEYMODE_PRESS; //default to keymode_press
|
||||||
oldKey = 0;
|
//oldKey = 0;
|
||||||
continueExecution();
|
continueExecution();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -251,18 +260,22 @@ void continueExecution() {
|
|||||||
uint8_t instr = EEReadByte(memAddr);
|
uint8_t instr = EEReadByte(memAddr);
|
||||||
if (instr == INSTR_BREAK) {
|
if (instr == INSTR_BREAK) {
|
||||||
// Release all keys (?)
|
// Release all keys (?)
|
||||||
uint8_t x;
|
if (keyType[oldKey-1] == KEYTYPE_TEXT) {
|
||||||
for (x=0; x < 8; x++) {
|
uint8_t x;
|
||||||
reportBuffer[x] = 0;
|
for (x=0; x < 8; x++) {
|
||||||
|
reportBuffer[x] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
newReport = 1; // done
|
newReport = 1; // done
|
||||||
newData = 1; //exit loop
|
newData = 1; //exit loop
|
||||||
}
|
}
|
||||||
else if (instr == INSTR_KEYUP) {
|
else if (instr == INSTR_KEYUP) {
|
||||||
cMode = KEYMODE_UP;
|
if ((keyType[oldKey-1] == KEYTYPE_TEXT) || keyAction == KEYACTION_DOWN) cMode = KEYMODE_UP;
|
||||||
|
else cMode = KEYMODE_DOWN; // When the key on the keyboard was released, we play everything back invertedly.
|
||||||
}
|
}
|
||||||
else if (instr == INSTR_KEYDOWN) {
|
else if (instr == INSTR_KEYDOWN) {
|
||||||
cMode = KEYMODE_DOWN;
|
if ((keyType[oldKey-1] == KEYTYPE_TEXT) || keyAction == KEYACTION_DOWN) cMode = KEYMODE_DOWN;
|
||||||
|
else cMode = KEYMODE_UP; // See four lines above.
|
||||||
}
|
}
|
||||||
else if (instr == INSTR_KEYPRESS) {
|
else if (instr == INSTR_KEYPRESS) {
|
||||||
cMode = KEYMODE_PRESS;
|
cMode = KEYMODE_PRESS;
|
||||||
@ -323,29 +336,30 @@ void continueExecution() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void detectKeyType() {
|
||||||
|
uint8_t keyId, x;
|
||||||
|
for (keyId=0;keyId < 16; ++keyId) {
|
||||||
|
for (x=0; x < MEM_KEY_LENGTH; ++x) {
|
||||||
|
uint8_t instr = EEReadByte(keyId*MEM_KEY_LENGTH+x);
|
||||||
|
if (instr == INSTR_KEYDOWN || instr == INSTR_KEYUP) { // If KEYPRESS is used at any time, it is a text-command
|
||||||
|
keyType[keyId] = KEYTYPE_KEY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (instr == INSTR_BREAK) { // If only KEYDOWN and KEYUP are used KEYDOWN it is a standard key
|
||||||
|
keyType[keyId] = KEYTYPE_TEXT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void keyboard(void) {
|
void keyboard(void) {
|
||||||
wdt_enable(WDTO_2S);
|
wdt_enable(WDTO_2S);
|
||||||
EEOpen(); // We open our eeprom
|
EEOpen(); // We open our eeprom
|
||||||
uchar i;
|
uchar i;
|
||||||
|
|
||||||
// First, we scan through the codes so we can determine the key types.
|
// First, we scan through the codes so we can determine the key types.
|
||||||
{
|
detectKeyType();
|
||||||
uint8_t keyId, x;
|
|
||||||
for (keyId=0;keyId < 16; ++keyId) {
|
|
||||||
for (x=0; x < MEM_KEY_LENGTH; ++x) {
|
|
||||||
uint8_t instr = EEReadByte(keyId*MEM_KEY_LENGTH+x);
|
|
||||||
if (instr == INSTR_KEYPRESS) { // If KEYPRESS is used at any time, it is a text-command
|
|
||||||
keyType[keyId] = KEYTYPE_TEXT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (instr == INSTR_BREAK) { // If only KEYDOWN and KEYUP are used KEYDOWN it is a standard key
|
|
||||||
keyType[keyId] = KEYTYPE_KEY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
cli();
|
cli();
|
||||||
usbInit();
|
usbInit();
|
||||||
@ -379,10 +393,31 @@ void keyboard(void) {
|
|||||||
|
|
||||||
void checkBtn() {
|
void checkBtn() {
|
||||||
if (newReport == 0) return; // ignore all keypresses if there's a current key in progress
|
if (newReport == 0) return; // ignore all keypresses if there's a current key in progress
|
||||||
if (getKey() == 0) hasReleased = 1;
|
if (getKey() != oldKey && getKey() == 0) {
|
||||||
if (getKey() != oldKey && hasReleased == 1) {
|
|
||||||
|
keyAction = KEYACTION_UP;
|
||||||
|
if (keyType[oldKey-1] == KEYTYPE_KEY && hasReleased == 0) {
|
||||||
|
newReport = 0;
|
||||||
|
hasReleased = 1;
|
||||||
|
memAddr = MEM_KEY_LENGTH*(oldKey-1);
|
||||||
|
cMode = KEYMODE_PRESS; //default to keymode_press
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
oldKey=0;
|
||||||
|
hasReleased = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_delay_ms(10); // Debounce switches
|
||||||
|
}
|
||||||
|
else if (getKey() != oldKey && hasReleased == 1) {
|
||||||
|
keyAction = KEYACTION_DOWN;
|
||||||
hasReleased = 0;
|
hasReleased = 0;
|
||||||
oldKey = getKey();
|
oldKey = getKey();
|
||||||
newReport = 0;
|
newReport = 0;
|
||||||
|
|
||||||
|
memAddr = MEM_KEY_LENGTH*(oldKey-1);
|
||||||
|
cMode = KEYMODE_PRESS; //default to keymode_press
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user