uint8_t getOemKey() { return keyOEM; } | uint8_t getOemKey() { return keyOEM; } | ||||
void attachPress(void (*f)(int unicode)) { keyPressedFunction = f; } | void attachPress(void (*f)(int unicode)) { keyPressedFunction = f; } | ||||
void attachRelease(void (*f)(int unicode)) { keyReleasedFunction = f; } | void attachRelease(void (*f)(int unicode)) { keyReleasedFunction = f; } | ||||
void attachRawPress(void (*f)(uint8_t keycode)) { rawKeyPressedFunction = f; } | |||||
void attachRawRelease(void (*f)(uint8_t keycode)) { rawKeyReleasedFunction = f; } | |||||
void LEDS(uint8_t leds); | void LEDS(uint8_t leds); | ||||
uint8_t LEDS() {return leds_.byte;} | uint8_t LEDS() {return leds_.byte;} | ||||
void updateLEDS(void); | void updateLEDS(void); | ||||
void key_release(uint32_t mod, uint32_t key); | void key_release(uint32_t mod, uint32_t key); | ||||
void (*keyPressedFunction)(int unicode); | void (*keyPressedFunction)(int unicode); | ||||
void (*keyReleasedFunction)(int unicode); | void (*keyReleasedFunction)(int unicode); | ||||
void (*rawKeyPressedFunction)(uint8_t keycode) = nullptr; | |||||
void (*rawKeyReleasedFunction)(uint8_t keycode) = nullptr; | |||||
Pipe_t *datapipe; | Pipe_t *datapipe; | ||||
setup_t setup; | setup_t setup; | ||||
uint8_t report[8]; | uint8_t report[8]; |
uint32_t key = prev_report[i]; | uint32_t key = prev_report[i]; | ||||
if (key >= 4 && !contains(key, report)) { | if (key >= 4 && !contains(key, report)) { | ||||
key_release(prev_report[0], key); | key_release(prev_report[0], key); | ||||
if (rawKeyReleasedFunction) { | |||||
rawKeyReleasedFunction(key); | |||||
} | |||||
} | |||||
} | |||||
if (rawKeyReleasedFunction) { | |||||
// each modifier key is represented by a bit in the first byte | |||||
for (int i = 0; i < 8; ++i) | |||||
{ | |||||
uint8_t keybit = 1 << i; | |||||
if ((prev_report[0] & keybit) && !(report[0] & keybit)) { | |||||
rawKeyReleasedFunction(103 + i); | |||||
} | |||||
} | } | ||||
} | } | ||||
for (int i=2; i < 8; i++) { | for (int i=2; i < 8; i++) { | ||||
uint32_t key = report[i]; | uint32_t key = report[i]; | ||||
if (key >= 4 && !contains(key, prev_report)) { | if (key >= 4 && !contains(key, prev_report)) { | ||||
key_press(report[0], key); | key_press(report[0], key); | ||||
if (rawKeyPressedFunction) { | |||||
rawKeyPressedFunction(key); | |||||
} | |||||
} | |||||
} | |||||
if (rawKeyPressedFunction) { | |||||
for (int i = 0; i < 8; ++i) | |||||
{ | |||||
uint8_t keybit = 1 << i; | |||||
if (!(prev_report[0] & keybit) && (report[0] & keybit)) { | |||||
rawKeyPressedFunction(103 + i); | |||||
} | |||||
} | } | ||||
} | } | ||||
memcpy(prev_report, report, 8); | memcpy(prev_report, report, 8); |