writing speed is detected, and the model mayhem sets backlight according to
speed
This commit is contained in:
parent
84a5f01eb3
commit
516089168d
@ -523,6 +523,49 @@ void sendString(char* string) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate an average value for the speed the keys are pressed in. The speed
|
||||
* value is sent to the keyboard interface, the keyboard decides what to do
|
||||
* with it.
|
||||
* \param updates number of updates since the last call (should be in the range
|
||||
* 0-1)
|
||||
*/
|
||||
void calculateSpeed(uint8_t updates) {
|
||||
static uint8_t callcounter = 0;
|
||||
static uint8_t speed = 0;
|
||||
callcounter++;
|
||||
if (updates > 0) {
|
||||
// a key has been pressed
|
||||
if (speed < 251) {
|
||||
// it can get hotter...
|
||||
if (callcounter < 8) {
|
||||
speed += 4;
|
||||
} else if (callcounter < 16) {
|
||||
speed += 3;
|
||||
} else if (callcounter < 24) {
|
||||
speed += 2;
|
||||
} else {
|
||||
speed += 1;
|
||||
}
|
||||
setSpeed(speed);
|
||||
}
|
||||
callcounter = 0;
|
||||
} else {
|
||||
// no key pressed...
|
||||
if (callcounter == 16) {
|
||||
// ... for a long time, decrease speed value
|
||||
if (speed > 10) {
|
||||
speed -= 10;
|
||||
setSpeed(speed);
|
||||
} else if (speed > 0) {
|
||||
speed = 0;
|
||||
setSpeed(speed);
|
||||
}
|
||||
callcounter = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Main function, containing the main loop that manages timer- and
|
||||
* USB-functionality.
|
||||
@ -531,6 +574,7 @@ void sendString(char* string) {
|
||||
int main(void) {
|
||||
uint8_t updateNeeded = 0;
|
||||
uint8_t idleCounter = 0;
|
||||
uint8_t updates = 0;
|
||||
wdt_enable(WDTO_2S);
|
||||
hardwareInit();
|
||||
usbInit();
|
||||
@ -545,10 +589,15 @@ int main(void) {
|
||||
usbPoll();
|
||||
|
||||
updateNeeded = scankeys(reportBuffer, oldReportBuffer, sizeof(reportBuffer)); // changes?
|
||||
if (updateNeeded) {
|
||||
updates++;
|
||||
}
|
||||
|
||||
// check timer if we need periodic reports
|
||||
if (TIFR & (1 << TOV0)) {
|
||||
TIFR = (1 << TOV0); // reset flag
|
||||
calculateSpeed(updates);
|
||||
updates = 0;
|
||||
if (idleRate != 0) { // do we need periodic reports?
|
||||
if(idleCounter > 4){ // yes, but not yet
|
||||
idleCounter -= 5; // 22ms in units of 4ms
|
||||
|
@ -106,6 +106,10 @@ void printMatrix(void) {
|
||||
sendString("---");
|
||||
}
|
||||
|
||||
void setSpeed(uint8_t speed) {
|
||||
// not used in this model/version
|
||||
}
|
||||
|
||||
void setLeds(uint8_t LEDstate) {
|
||||
if (LEDstate & LED_NUM) { // light up num lock
|
||||
PORTLEDS &= ~(1 << LEDNUM);
|
||||
|
@ -21,6 +21,13 @@ void hardwareInit(void);
|
||||
*/
|
||||
void printMatrix(void);
|
||||
|
||||
/**
|
||||
* This tells the current writing speed to the keyboard, for whatever it will
|
||||
* do with the value.
|
||||
* \param speed speed value between 0 and 255
|
||||
*/
|
||||
void setSpeed(uint8_t speed);
|
||||
|
||||
/**
|
||||
* This function sets the LEDs according to the given data.
|
||||
* \param LEDstate bitfield with LED info
|
||||
|
@ -70,6 +70,21 @@ void hardwareInit(void) {
|
||||
PORTLEDS &= ~((1 << LEDNUM) | (1 << LEDCAPS) | (1 << LEDSCROLL) | (1 << LEDCOMP));
|
||||
_delay_ms(50);
|
||||
PORTLEDS |= ((1 << LEDNUM) | (1 << LEDCAPS) | (1 << LEDSCROLL) | (1 << LEDCOMP));
|
||||
|
||||
// initialize timer for pulse width modulation on backlight LED ports
|
||||
// WGM13=1, WGM12=1, WGM11=1, WGM10=0 -> PWM mode 14
|
||||
// COM1A1=1, COM1B1=1 -> OC1A and OC1B are set at the bottom and cleared on
|
||||
// when the counter matches OCR1A or OCR1B
|
||||
// CS10=1 -> prescaler 1
|
||||
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
|
||||
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);
|
||||
|
||||
// the pwm counter counts from 0 to this value
|
||||
ICR1 = 0xffff;
|
||||
|
||||
// both LEDs are switched off on startup
|
||||
OCR1A = 0xffff; // red
|
||||
OCR1B = 0xffff; // green
|
||||
}
|
||||
|
||||
/**
|
||||
@ -101,6 +116,11 @@ void printMatrix(void) {
|
||||
sendString("---");
|
||||
}
|
||||
|
||||
void setSpeed(uint8_t speed) {
|
||||
OCR1A = 0xffff - (speed * speed);
|
||||
OCR1B = (speed * speed);
|
||||
}
|
||||
|
||||
void setLeds(uint8_t LEDstate) {
|
||||
if (LEDstate & LED_NUM) { // light up num lock
|
||||
PORTLEDS &= ~(1 << LEDNUM);
|
||||
|
@ -93,6 +93,10 @@ void printMatrix(void) {
|
||||
sendString("\n");
|
||||
}
|
||||
|
||||
void setSpeed(uint8_t speed) {
|
||||
// not used in this model/version
|
||||
}
|
||||
|
||||
void setLeds(uint8_t LEDstate) {
|
||||
if (LEDstate & LED_NUM) { // light up num lock
|
||||
PORTLEDS &= ~(1 << LEDNUM);
|
||||
|
Loading…
Reference in New Issue
Block a user