Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d5a8b048a | ||
|
|
978fa700d8 | ||
|
|
03766619d5 | ||
|
|
3d7428a333 | ||
|
|
60ca50808f | ||
|
|
0a8d529d74 | ||
|
|
c418608c1e | ||
|
|
956e0bb4b8 | ||
|
|
218d51094e | ||
|
|
36d35959c8 | ||
|
|
0210447c82 | ||
|
|
7fef5ca240 | ||
|
|
8906e62c1f | ||
|
|
5953af3215 | ||
|
|
e36cbdc786 | ||
|
|
3f3a1cc9f3 | ||
|
|
8dd85f73b3 | ||
|
|
3d6919c3dc | ||
|
|
db8b547b7d | ||
|
|
77445afac5 | ||
|
|
b9bf310b0f | ||
|
|
1f9ee8b990 | ||
|
|
090b4a81b9 | ||
|
|
7eeb8932a1 | ||
|
|
876377e945 | ||
|
|
3bbf11d110 | ||
|
|
3204dec096 | ||
|
|
d5def73f6e | ||
|
|
d7881f3504 | ||
|
|
57fdce91bf | ||
|
|
40b4f27b03 | ||
|
|
c197d080c4 | ||
|
|
df73b74b55 | ||
|
|
d49e4543b3 | ||
|
|
a120bbc4de | ||
|
|
3f886a3efe | ||
|
|
08c1997db1 | ||
|
|
9c2dde98e2 | ||
|
|
08283f6124 | ||
|
|
7a44ad83fc | ||
|
|
6380f83190 | ||
|
|
76e0d23887 | ||
|
|
bad56a4f2b | ||
|
|
b8564f5dd0 | ||
|
|
998ddbb122 | ||
|
|
c0095710a7 | ||
|
|
682555faac | ||
|
|
6dc215cd67 | ||
|
|
5272218ac9 | ||
|
|
0592d23b74 | ||
|
|
b5e7589bf9 | ||
|
|
3d00f38586 |
No files matched your search
@@ -123,21 +123,23 @@ If you define these options you will enable the associated feature, which may in
|
|||||||
## Behaviors That Can Be Configured
|
## Behaviors That Can Be Configured
|
||||||
|
|
||||||
* `#define TAPPING_TERM 200`
|
* `#define TAPPING_TERM 200`
|
||||||
* how long before a tap becomes a hold
|
* how long before a tap becomes a hold, if set above 500, a key tapped during the tapping term will turn it into a hold too
|
||||||
* `#define RETRO_TAPPING`
|
* `#define RETRO_TAPPING`
|
||||||
* tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
|
* tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
|
||||||
* `#define TAPPING_TOGGLE 2`
|
* `#define TAPPING_TOGGLE 2`
|
||||||
* how many taps before triggering the toggle
|
* how many taps before triggering the toggle
|
||||||
* `#define PERMISSIVE_HOLD`
|
* `#define PERMISSIVE_HOLD`
|
||||||
* makes tap and hold keys work better for fast typers who don't want tapping term set above 500
|
* makes tap and hold keys work better for fast typers who don't want tapping term set above 500
|
||||||
|
* `#define IGNORE_MOD_TAP_INTERRUPT`
|
||||||
|
* makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
|
||||||
|
* `#define TAPPING_FORCE_HOLD`
|
||||||
|
* makes it possible to use a dual role key as modifier shortly after having been tapped
|
||||||
* `#define LEADER_TIMEOUT 300`
|
* `#define LEADER_TIMEOUT 300`
|
||||||
* how long before the leader key times out
|
* how long before the leader key times out
|
||||||
* `#define ONESHOT_TIMEOUT 300`
|
* `#define ONESHOT_TIMEOUT 300`
|
||||||
* how long before oneshot times out
|
* how long before oneshot times out
|
||||||
* `#define ONESHOT_TAP_TOGGLE 2`
|
* `#define ONESHOT_TAP_TOGGLE 2`
|
||||||
* how many taps before oneshot toggle is triggered
|
* how many taps before oneshot toggle is triggered
|
||||||
* `#define IGNORE_MOD_TAP_INTERRUPT`
|
|
||||||
* makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
|
|
||||||
* `#define QMK_KEYS_PER_SCAN 4`
|
* `#define QMK_KEYS_PER_SCAN 4`
|
||||||
* Allows sending more than one key per scan. By default, only one key event gets
|
* Allows sending more than one key per scan. By default, only one key event gets
|
||||||
sent via `process_record()` per scan. This has little impact on most typing, but
|
sent via `process_record()` per scan. This has little impact on most typing, but
|
||||||
|
|||||||
@@ -104,3 +104,17 @@ brew install dfu-programmer
|
|||||||
brew install gcc-arm-none-eabi
|
brew install gcc-arm-none-eabi
|
||||||
brew install avrdude
|
brew install avrdude
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### avr-gcc 8.1 and LUFA
|
||||||
|
|
||||||
|
If you updated your avr-gcc to above 7 you may see errors involving LUFA. For example:
|
||||||
|
|
||||||
|
`lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h:380:5: error: 'const' attribute on function returning 'void'`
|
||||||
|
|
||||||
|
For now, you need to rollback avr-gcc to 7 in brew.
|
||||||
|
|
||||||
|
```
|
||||||
|
brew uninstall --force avr-gcc
|
||||||
|
brew install avr-gcc@7
|
||||||
|
brew link avr-gcc@7
|
||||||
|
```
|
||||||
@@ -175,3 +175,31 @@ Example: (Tapping Term = 200ms)
|
|||||||
- SHFT_T(KC_A) Up
|
- SHFT_T(KC_A) Up
|
||||||
|
|
||||||
With defaults, if above is typed within tapping term, this will emit `ax`. With permissive hold, if above is typed within tapping term, this will emit `X` (so, Shift+X).
|
With defaults, if above is typed within tapping term, this will emit `ax`. With permissive hold, if above is typed within tapping term, this will emit `X` (so, Shift+X).
|
||||||
|
|
||||||
|
# Mod tap interrupt
|
||||||
|
|
||||||
|
When a dual role key used for a modifier is quickly followed by another keys, it is interpreted as held even before the tapping term elapsed. This is a problem if a key is used for example inside a rolling combo because the second key will be pressed before the first key is released.
|
||||||
|
|
||||||
|
For example, when trying to type the rolling combo "zx" and z being configured to send Ctrl when hold, z rapidly followed by x actually sends Ctrl-x. That's bad.
|
||||||
|
|
||||||
|
You can disable this behavior by defining `IGNORE_MOD_TAP_INTERRUPT` in `config.h`.
|
||||||
|
|
||||||
|
Note that this only concerns modifiers and not layer switching keys.
|
||||||
|
|
||||||
|
# Hold after tap
|
||||||
|
|
||||||
|
When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key. If you prefer to hold a modifier instead, define `TAPPING_FORCE_HOLD` in `config.h`.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
- SHFT_T(KC_A) Down
|
||||||
|
- SHFT_T(KC_A) Up
|
||||||
|
- SHFT_T(KC_A) Down
|
||||||
|
- wait more than tapping term...
|
||||||
|
- SHFT_T(KC_A) Up
|
||||||
|
|
||||||
|
With default settings, `a` will be sent on the first release, then `a` will be sent on the second press allowing the computer to trigger its auto repeat function.
|
||||||
|
|
||||||
|
With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allowing to use it as a modifier shortly after having used it as a tap.
|
||||||
|
|
||||||
|
!> `TAPPING_FORCE_HOLD` will break anything that uses tapping toggles (Such as the `TT` layer keycode, and the One Shot Tapping Toggle).
|
||||||
@@ -56,7 +56,7 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands:
|
|||||||
brew tap osx-cross/avr
|
brew tap osx-cross/avr
|
||||||
brew tap PX4/homebrew-px4
|
brew tap PX4/homebrew-px4
|
||||||
brew update
|
brew update
|
||||||
brew install avr-gcc
|
brew install avr-gcc@7
|
||||||
brew install dfu-programmer
|
brew install dfu-programmer
|
||||||
brew install gcc-arm-none-eabi
|
brew install gcc-arm-none-eabi
|
||||||
brew install avrdude
|
brew install avrdude
|
||||||
|
|||||||
+131
-62
@@ -6,6 +6,7 @@
|
|||||||
#include <util/twi.h>
|
#include <util/twi.h>
|
||||||
|
|
||||||
#include "i2c_master.h"
|
#include "i2c_master.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
#define F_SCL 400000UL // SCL frequency
|
#define F_SCL 400000UL // SCL frequency
|
||||||
#define Prescaler 1
|
#define Prescaler 1
|
||||||
@@ -13,137 +14,205 @@
|
|||||||
|
|
||||||
void i2c_init(void)
|
void i2c_init(void)
|
||||||
{
|
{
|
||||||
|
TWSR = 0; /* no prescaler */
|
||||||
TWBR = (uint8_t)TWBR_val;
|
TWBR = (uint8_t)TWBR_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_start(uint8_t address)
|
i2c_status_t i2c_start(uint8_t address, uint16_t timeout)
|
||||||
{
|
{
|
||||||
// reset TWI control register
|
// reset TWI control register
|
||||||
TWCR = 0;
|
TWCR = 0;
|
||||||
// transmit START condition
|
// transmit START condition
|
||||||
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
||||||
// wait for end of transmission
|
|
||||||
while( !(TWCR & (1<<TWINT)) );
|
uint16_t timeout_timer = timer_read();
|
||||||
|
while( !(TWCR & (1<<TWINT)) ) {
|
||||||
|
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
|
||||||
|
return I2C_STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// check if the start condition was successfully transmitted
|
// check if the start condition was successfully transmitted
|
||||||
if((TWSR & 0xF8) != TW_START){ return 1; }
|
if(((TW_STATUS & 0xF8) != TW_START) && ((TW_STATUS & 0xF8) != TW_REP_START)){ return I2C_STATUS_ERROR; }
|
||||||
|
|
||||||
// load slave address into data register
|
// load slave address into data register
|
||||||
TWDR = address;
|
TWDR = address;
|
||||||
// start transmission of address
|
// start transmission of address
|
||||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||||
// wait for end of transmission
|
|
||||||
while( !(TWCR & (1<<TWINT)) );
|
timeout_timer = timer_read();
|
||||||
|
while( !(TWCR & (1<<TWINT)) ) {
|
||||||
|
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
|
||||||
|
return I2C_STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// check if the device has acknowledged the READ / WRITE mode
|
// check if the device has acknowledged the READ / WRITE mode
|
||||||
uint8_t twst = TW_STATUS & 0xF8;
|
uint8_t twst = TW_STATUS & 0xF8;
|
||||||
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
|
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return I2C_STATUS_ERROR;
|
||||||
|
|
||||||
return 0;
|
return I2C_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_write(uint8_t data)
|
i2c_status_t i2c_write(uint8_t data, uint16_t timeout)
|
||||||
{
|
{
|
||||||
// load data into data register
|
// load data into data register
|
||||||
TWDR = data;
|
TWDR = data;
|
||||||
// start transmission of data
|
// start transmission of data
|
||||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||||
// wait for end of transmission
|
|
||||||
while( !(TWCR & (1<<TWINT)) );
|
|
||||||
|
|
||||||
if( (TWSR & 0xF8) != TW_MT_DATA_ACK ){ return 1; }
|
uint16_t timeout_timer = timer_read();
|
||||||
|
while( !(TWCR & (1<<TWINT)) ) {
|
||||||
|
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
|
||||||
|
return I2C_STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
if( (TW_STATUS & 0xF8) != TW_MT_DATA_ACK ){ return I2C_STATUS_ERROR; }
|
||||||
|
|
||||||
|
return I2C_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_read_ack(void)
|
int16_t i2c_read_ack(uint16_t timeout)
|
||||||
{
|
{
|
||||||
|
|
||||||
// start TWI module and acknowledge data after reception
|
// start TWI module and acknowledge data after reception
|
||||||
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
|
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
|
||||||
// wait for end of transmission
|
|
||||||
while( !(TWCR & (1<<TWINT)) );
|
uint16_t timeout_timer = timer_read();
|
||||||
|
while( !(TWCR & (1<<TWINT)) ) {
|
||||||
|
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
|
||||||
|
return I2C_STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// return received data from TWDR
|
// return received data from TWDR
|
||||||
return TWDR;
|
return TWDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_read_nack(void)
|
int16_t i2c_read_nack(uint16_t timeout)
|
||||||
{
|
{
|
||||||
|
|
||||||
// start receiving without acknowledging reception
|
// start receiving without acknowledging reception
|
||||||
TWCR = (1<<TWINT) | (1<<TWEN);
|
TWCR = (1<<TWINT) | (1<<TWEN);
|
||||||
// wait for end of transmission
|
|
||||||
while( !(TWCR & (1<<TWINT)) );
|
uint16_t timeout_timer = timer_read();
|
||||||
|
while( !(TWCR & (1<<TWINT)) ) {
|
||||||
|
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
|
||||||
|
return I2C_STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// return received data from TWDR
|
// return received data from TWDR
|
||||||
return TWDR;
|
return TWDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length)
|
i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
|
||||||
{
|
{
|
||||||
if (i2c_start(address | I2C_WRITE)) return 1;
|
i2c_status_t status = i2c_start(address | I2C_WRITE, timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
for (uint16_t i = 0; i < length; i++)
|
for (uint16_t i = 0; i < length; i++) {
|
||||||
{
|
status = i2c_write(data[i], timeout);
|
||||||
if (i2c_write(data[i])) return 1;
|
if (status) return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_stop();
|
status = i2c_stop(timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
return 0;
|
return I2C_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length)
|
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)
|
||||||
{
|
{
|
||||||
if (i2c_start(address | I2C_READ)) return 1;
|
i2c_status_t status = i2c_start(address | I2C_READ, timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
for (uint16_t i = 0; i < (length-1); i++)
|
for (uint16_t i = 0; i < (length-1); i++) {
|
||||||
{
|
status = i2c_read_ack(timeout);
|
||||||
data[i] = i2c_read_ack();
|
if (status >= 0) {
|
||||||
}
|
data[i] = status;
|
||||||
data[(length-1)] = i2c_read_nack();
|
} else {
|
||||||
|
return status;
|
||||||
i2c_stop();
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length)
|
|
||||||
{
|
|
||||||
if (i2c_start(devaddr | 0x00)) return 1;
|
|
||||||
|
|
||||||
i2c_write(regaddr);
|
|
||||||
|
|
||||||
for (uint16_t i = 0; i < length; i++)
|
|
||||||
{
|
|
||||||
if (i2c_write(data[i])) return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_stop();
|
status = i2c_read_nack(timeout);
|
||||||
|
if (status >= 0 ) {
|
||||||
|
data[(length-1)] = status;
|
||||||
|
} else {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
status = i2c_stop(timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
|
return I2C_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length)
|
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
|
||||||
{
|
{
|
||||||
if (i2c_start(devaddr)) return 1;
|
i2c_status_t status = i2c_start(devaddr | 0x00, timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
i2c_write(regaddr);
|
status = i2c_write(regaddr, timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
if (i2c_start(devaddr | 0x01)) return 1;
|
for (uint16_t i = 0; i < length; i++) {
|
||||||
|
status = i2c_write(data[i], timeout);
|
||||||
for (uint16_t i = 0; i < (length-1); i++)
|
if (status) return status;
|
||||||
{
|
|
||||||
data[i] = i2c_read_ack();
|
|
||||||
}
|
}
|
||||||
data[(length-1)] = i2c_read_nack();
|
|
||||||
|
|
||||||
i2c_stop();
|
status = i2c_stop(timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
return 0;
|
return I2C_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void i2c_stop(void)
|
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)
|
||||||
|
{
|
||||||
|
i2c_status_t status = i2c_start(devaddr, timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
|
status = i2c_write(regaddr, timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
|
status = i2c_start(devaddr | 0x01, timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < (length-1); i++) {
|
||||||
|
status = i2c_read_ack(timeout);
|
||||||
|
if (status >= 0) {
|
||||||
|
data[i] = status;
|
||||||
|
} else {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = i2c_read_nack(timeout);
|
||||||
|
if (status >= 0 ) {
|
||||||
|
data[(length-1)] = status;
|
||||||
|
} else {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = i2c_stop(timeout);
|
||||||
|
if (status) return status;
|
||||||
|
|
||||||
|
return I2C_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_status_t i2c_stop(uint16_t timeout)
|
||||||
{
|
{
|
||||||
// transmit STOP condition
|
// transmit STOP condition
|
||||||
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
||||||
|
|
||||||
|
uint16_t timeout_timer = timer_read();
|
||||||
|
while(TWCR & (1<<TWSTO)) {
|
||||||
|
if ((timeout != I2C_TIMEOUT_INFINITE) && ((timer_read() - timeout_timer) >= timeout)) {
|
||||||
|
return I2C_STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return I2C_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -8,15 +8,24 @@
|
|||||||
#define I2C_READ 0x01
|
#define I2C_READ 0x01
|
||||||
#define I2C_WRITE 0x00
|
#define I2C_WRITE 0x00
|
||||||
|
|
||||||
|
typedef int16_t i2c_status_t;
|
||||||
|
|
||||||
|
#define I2C_STATUS_SUCCESS (0)
|
||||||
|
#define I2C_STATUS_ERROR (-1)
|
||||||
|
#define I2C_STATUS_TIMEOUT (-2)
|
||||||
|
|
||||||
|
#define I2C_TIMEOUT_IMMEDIATE (0)
|
||||||
|
#define I2C_TIMEOUT_INFINITE (0xFFFF)
|
||||||
|
|
||||||
void i2c_init(void);
|
void i2c_init(void);
|
||||||
uint8_t i2c_start(uint8_t address);
|
i2c_status_t i2c_start(uint8_t address, uint16_t timeout);
|
||||||
uint8_t i2c_write(uint8_t data);
|
i2c_status_t i2c_write(uint8_t data, uint16_t timeout);
|
||||||
uint8_t i2c_read_ack(void);
|
int16_t i2c_read_ack(uint16_t timeout);
|
||||||
uint8_t i2c_read_nack(void);
|
int16_t i2c_read_nack(uint16_t timeout);
|
||||||
uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length);
|
i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length);
|
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length);
|
i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length);
|
i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);
|
||||||
void i2c_stop(void);
|
i2c_status_t i2c_stop(uint16_t timeout);
|
||||||
|
|
||||||
#endif // I2C_MASTER_H
|
#endif // I2C_MASTER_H
|
||||||
@@ -49,6 +49,14 @@
|
|||||||
#define ISSI_COMMANDREGISTER 0xFD
|
#define ISSI_COMMANDREGISTER 0xFD
|
||||||
#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
|
#define ISSI_BANK_FUNCTIONREG 0x0B // helpfully called 'page nine'
|
||||||
|
|
||||||
|
#ifndef ISSI_TIMEOUT
|
||||||
|
#define ISSI_TIMEOUT 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ISSI_PERSISTENCE
|
||||||
|
#define ISSI_PERSISTENCE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// Transfer buffer for TWITransmitData()
|
// Transfer buffer for TWITransmitData()
|
||||||
uint8_t g_twi_transfer_buffer[20];
|
uint8_t g_twi_transfer_buffer[20];
|
||||||
|
|
||||||
@@ -83,8 +91,14 @@ void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data )
|
|||||||
g_twi_transfer_buffer[0] = reg;
|
g_twi_transfer_buffer[0] = reg;
|
||||||
g_twi_transfer_buffer[1] = data;
|
g_twi_transfer_buffer[1] = data;
|
||||||
|
|
||||||
//Transmit data until succesful
|
#if ISSI_PERSISTENCE > 0
|
||||||
while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0);
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
||||||
@@ -95,20 +109,24 @@ void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer )
|
|||||||
// g_twi_transfer_buffer[] is 20 bytes
|
// g_twi_transfer_buffer[] is 20 bytes
|
||||||
|
|
||||||
// iterate over the pwm_buffer contents at 16 byte intervals
|
// iterate over the pwm_buffer contents at 16 byte intervals
|
||||||
for ( int i = 0; i < 144; i += 16 )
|
for ( int i = 0; i < 144; i += 16 ) {
|
||||||
{
|
|
||||||
// set the first register, e.g. 0x24, 0x34, 0x44, etc.
|
// set the first register, e.g. 0x24, 0x34, 0x44, etc.
|
||||||
g_twi_transfer_buffer[0] = 0x24 + i;
|
g_twi_transfer_buffer[0] = 0x24 + i;
|
||||||
// copy the data from i to i+15
|
// copy the data from i to i+15
|
||||||
// device will auto-increment register for data after the first byte
|
// device will auto-increment register for data after the first byte
|
||||||
// thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer
|
// thus this sets registers 0x24-0x33, 0x34-0x43, etc. in one transfer
|
||||||
for ( int j = 0; j < 16; j++ )
|
for ( int j = 0; j < 16; j++ ) {
|
||||||
{
|
|
||||||
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
|
||||||
}
|
}
|
||||||
|
|
||||||
//Transmit buffer until succesful
|
#if ISSI_PERSISTENCE > 0
|
||||||
while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0);
|
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
|
||||||
|
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,6 +183,7 @@ void IS31FL3731_init( uint8_t addr )
|
|||||||
// most usage after initialization is just writing PWM buffers in bank 0
|
// most usage after initialization is just writing PWM buffers in bank 0
|
||||||
// as there's not much point in double-buffering
|
// as there's not much point in double-buffering
|
||||||
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 );
|
IS31FL3731_write_register( addr, ISSI_COMMANDREGISTER, 0 );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
void IS31FL3731_set_color( int index, uint8_t red, uint8_t green, uint8_t blue )
|
||||||
@@ -217,7 +236,6 @@ void IS31FL3731_set_led_control_register( uint8_t index, bool red, bool green, b
|
|||||||
|
|
||||||
g_led_control_registers_update_required = true;
|
g_led_control_registers_update_required = true;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )
|
void IS31FL3731_update_pwm_buffers( uint8_t addr1, uint8_t addr2 )
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/* Copyright 2018 MechMerlin
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "al1.h"
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
matrix_scan_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
return process_record_user(keycode, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led) {
|
||||||
|
CONFIG_LED_IO;
|
||||||
|
print_dec(usb_led);
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK))
|
||||||
|
PORTB &= ~(1<<7);
|
||||||
|
else
|
||||||
|
PORTB |= (1<<7);
|
||||||
|
|
||||||
|
if (usb_led & (1<<USB_LED_NUM_LOCK))
|
||||||
|
PORTD &= ~(1<<0);
|
||||||
|
else
|
||||||
|
PORTD |= (1<<0);
|
||||||
|
|
||||||
|
if (usb_led & (1<<USB_LED_SCROLL_LOCK))
|
||||||
|
PORTD &= ~(1<<1);
|
||||||
|
else
|
||||||
|
PORTD |= (1<<1);
|
||||||
|
led_set_user(usb_led);
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/* Copyright 2018 MechMerlin
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef AL1_H
|
||||||
|
#define AL1_H
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
#define CONFIG_LED_IO \
|
||||||
|
DDRB |= (1<<7) | (1<<6); \
|
||||||
|
DDRD |= (1<<0) | (1<<1);
|
||||||
|
|
||||||
|
|
||||||
|
#define LAYOUT( \
|
||||||
|
K500, K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K415, K414,\
|
||||||
|
K501, K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K215, K413,\
|
||||||
|
K502, K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \
|
||||||
|
K503, K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K412,\
|
||||||
|
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411 \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015}, \
|
||||||
|
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115}, \
|
||||||
|
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215}, \
|
||||||
|
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315}, \
|
||||||
|
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415}, \
|
||||||
|
{ K500, K501, K502, K503, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LAYOUT_split_bs( \
|
||||||
|
K500, K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K512, K012, K013, K014, K015, K415, K414, \
|
||||||
|
K501, K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K215, K413,\
|
||||||
|
K502, K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \
|
||||||
|
K503, K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K412,\
|
||||||
|
K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411 \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015}, \
|
||||||
|
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115}, \
|
||||||
|
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215}, \
|
||||||
|
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315}, \
|
||||||
|
{ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415}, \
|
||||||
|
{ K500, K501, K502, K503, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K512, KC_NO, KC_NO, KC_NO} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2018 MechMerlin
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6050
|
||||||
|
#define DEVICE_VER 0x0104
|
||||||
|
#define MANUFACTURER Alsoran
|
||||||
|
#define PRODUCT AL1
|
||||||
|
#define DESCRIPTION A custom keyboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 7
|
||||||
|
#define MATRIX_COLS 20
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keyboard Matrix Assignments
|
||||||
|
*
|
||||||
|
* Change this to how you wired your keyboard
|
||||||
|
* COLS: AVR pins used for columns, left to right
|
||||||
|
* ROWS: AVR pins used for rows, top to bottom
|
||||||
|
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
||||||
|
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
#define BACKLIGHT_PIN B6
|
||||||
|
#define BACKLIGHT_BREATHING
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
|
|
||||||
|
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||||
|
#define DEBOUNCING_DELAY 5
|
||||||
|
|
||||||
|
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
||||||
|
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
|
||||||
|
*/
|
||||||
|
// #define GRAVE_ESC_CTRL_OVERRIDE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force NKRO
|
||||||
|
*
|
||||||
|
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
||||||
|
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
||||||
|
* makefile for this to work.)
|
||||||
|
*
|
||||||
|
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
||||||
|
* until the next keyboard reset.
|
||||||
|
*
|
||||||
|
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
||||||
|
* fully operational during normal computer usage.
|
||||||
|
*
|
||||||
|
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
||||||
|
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
||||||
|
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
||||||
|
* power-up.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//#define FORCE_NKRO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Magic Key Options
|
||||||
|
*
|
||||||
|
* Magic keys are hotkey commands that allow control over firmware functions of
|
||||||
|
* the keyboard. They are best used in combination with the HID Listen program,
|
||||||
|
* found here: https://www.pjrc.com/teensy/hid_listen.html
|
||||||
|
*
|
||||||
|
* The options below allow the magic key functionality to be changed. This is
|
||||||
|
* useful if your keyboard/keypad is missing keys and you want magic key support.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* key combination for magic key command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* control how magic key switches layers */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
|
||||||
|
|
||||||
|
/* override magic key keymap */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
|
||||||
|
//#define MAGIC_KEY_HELP1 H
|
||||||
|
//#define MAGIC_KEY_HELP2 SLASH
|
||||||
|
//#define MAGIC_KEY_DEBUG D
|
||||||
|
//#define MAGIC_KEY_DEBUG_MATRIX X
|
||||||
|
//#define MAGIC_KEY_DEBUG_KBD K
|
||||||
|
//#define MAGIC_KEY_DEBUG_MOUSE M
|
||||||
|
//#define MAGIC_KEY_VERSION V
|
||||||
|
//#define MAGIC_KEY_STATUS S
|
||||||
|
//#define MAGIC_KEY_CONSOLE C
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT1 ESC
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
|
||||||
|
//#define MAGIC_KEY_LAYER0 0
|
||||||
|
//#define MAGIC_KEY_LAYER1 1
|
||||||
|
//#define MAGIC_KEY_LAYER2 2
|
||||||
|
//#define MAGIC_KEY_LAYER3 3
|
||||||
|
//#define MAGIC_KEY_LAYER4 4
|
||||||
|
//#define MAGIC_KEY_LAYER5 5
|
||||||
|
//#define MAGIC_KEY_LAYER6 6
|
||||||
|
//#define MAGIC_KEY_LAYER7 7
|
||||||
|
//#define MAGIC_KEY_LAYER8 8
|
||||||
|
//#define MAGIC_KEY_LAYER9 9
|
||||||
|
//#define MAGIC_KEY_BOOTLOADER PAUSE
|
||||||
|
//#define MAGIC_KEY_LOCK CAPS
|
||||||
|
//#define MAGIC_KEY_EEPROM E
|
||||||
|
//#define MAGIC_KEY_NKRO N
|
||||||
|
//#define MAGIC_KEY_SLEEP_LED Z
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MIDI options
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Prevent use of disabled MIDI features in the keymap */
|
||||||
|
//#define MIDI_ENABLE_STRICT 1
|
||||||
|
|
||||||
|
/* enable basic MIDI features:
|
||||||
|
- MIDI notes can be sent when in Music mode is on
|
||||||
|
*/
|
||||||
|
//#define MIDI_BASIC
|
||||||
|
|
||||||
|
/* enable advanced MIDI features:
|
||||||
|
- MIDI notes can be added to the keymap
|
||||||
|
- Octave shift and transpose
|
||||||
|
- Virtual sustain, portamento, and modulation wheel
|
||||||
|
- etc.
|
||||||
|
*/
|
||||||
|
//#define MIDI_ADVANCED
|
||||||
|
|
||||||
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "AL1",
|
||||||
|
"url": "",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"width": 20.5,
|
||||||
|
"height": 5.25,
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Insert", "x":15.25, "y":0}, {"label":"Num Lock", "x":16.5, "y":0}, {"label":"/", "x":17.5, "y":0}, {"label":"*", "x":18.5, "y":0}, {"label":"-", "x":19.5, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Delete", "x":15.25, "y":1}, {"label":"7", "x":16.5, "y":1}, {"label":"8", "x":17.5, "y":1}, {"label":"9", "x":18.5, "y":1}, {"label":"+", "x":19.5, "y":1, "h":2}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"4", "x":16.5, "y":2}, {"label":"5", "x":17.5, "y":2}, {"label":"6", "x":18.5, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"1", "x":16.5, "y":3}, {"label":"2", "x":17.5, "y":3}, {"label":"3", "x":18.5, "y":3}, {"label":"Enter", "x":19.5, "y":3, "h":2}, {"label":"\u2191", "x":15.25, "y":3.25}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4}, {"label":"Alt", "x":2.25, "y":4, "w":1.25}, {"x":3.5, "y":4, "w":7}, {"label":"Alt", "x":10.5, "y":4, "w":1.25}, {"label":"Win", "x":11.75, "y":4}, {"label":"Menu", "x":12.75, "y":4, "w":1.25}, {"label":"0", "x":17.5, "y":4}, {"label":".", "x":18.5, "y":4}, {"label":"\u2190", "x":14.25, "y":4.25}, {"label":"\u2193", "x":15.25, "y":4.25}, {"label":"\u2192", "x":16.25, "y":4.25}]
|
||||||
|
},
|
||||||
|
|
||||||
|
"LAYOUT_split_bs": {
|
||||||
|
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Insert", "x":15.25, "y":0}, {"label":"Num Lock", "x":16.5, "y":0}, {"label":"/", "x":17.5, "y":0}, {"label":"*", "x":18.5, "y":0}, {"label":"-", "x":19.5, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Delete", "x":15.25, "y":1}, {"label":"7", "x":16.5, "y":1}, {"label":"8", "x":17.5, "y":1}, {"label":"9", "x":18.5, "y":1}, {"label":"+", "x":19.5, "y":1, "h":2}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"4", "x":16.5, "y":2}, {"label":"5", "x":17.5, "y":2}, {"label":"6", "x":18.5, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"1", "x":16.5, "y":3}, {"label":"2", "x":17.5, "y":3}, {"label":"3", "x":18.5, "y":3}, {"label":"Enter", "x":19.5, "y":3, "h":2}, {"label":"\u2191", "x":15.25, "y":3.25}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4}, {"label":"Alt", "x":2.25, "y":4, "w":1.25}, {"x":3.5, "y":4, "w":7}, {"label":"Alt", "x":10.5, "y":4, "w":1.25}, {"label":"Win", "x":11.75, "y":4}, {"label":"Menu", "x":12.75, "y":4, "w":1.25}, {"label":"0", "x":17.5, "y":4}, {"label":".", "x":18.5, "y":4}, {"label":"\u2190", "x":14.25, "y":4.25}, {"label":"\u2193", "x":15.25, "y":4.25}, {"label":"\u2192", "x":16.25, "y":4.25}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
/* Copyright 2018 MechMerlin
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = LAYOUT(\
|
||||||
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,\
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DELETE, KC_P7, KC_P8, KC_P9, KC_PPLS,\
|
||||||
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_FN0, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_FN0, KC_RGUI, KC_RCTRL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT ),
|
||||||
|
|
||||||
|
[1] = LAYOUT(\
|
||||||
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_INS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,\
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DELETE, KC_P7, KC_P8, KC_P9, KC_PPLS,\
|
||||||
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_FN0, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_FN0, KC_RGUI, KC_RCTRL, KC_FN1, KC_FN2, KC_FN3, KC_P0, KC_PDOT ),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
} else {
|
||||||
|
unregister_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_user(uint8_t usb_led) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# The default keymap for al1
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
#include "al1.h"
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = LAYOUT_split_bs(\
|
||||||
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRAVE, KC_BSPC, KC_INS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DELETE, KC_P7, KC_P8, KC_P9, KC_PPLS,\
|
||||||
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_FN0, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_FN0, KC_RGUI, KC_RCTRL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT ),
|
||||||
|
[1] = LAYOUT_split_bs(\
|
||||||
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_GRAVE, KC_DELETE, KC_INS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DELETE, KC_P7, KC_P8, KC_P9, KC_PPLS,\
|
||||||
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_FN0, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_FN0, KC_RGUI, KC_RCTRL, KC_FN1, KC_FN2, KC_FN3, KC_P0, KC_PDOT ),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
} else {
|
||||||
|
unregister_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_user(uint8_t usb_led) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include "print.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "matrix.h"
|
||||||
|
|
||||||
|
#ifndef DEBOUNCING_DELAY
|
||||||
|
# define DEBOUNCING_DELAY 5
|
||||||
|
#endif
|
||||||
|
static uint8_t debouncing = DEBOUNCING_DELAY;
|
||||||
|
|
||||||
|
static matrix_row_t matrix[MATRIX_ROWS];
|
||||||
|
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
|
||||||
|
|
||||||
|
static uint8_t read_rows(void);
|
||||||
|
static void init_rows(void);
|
||||||
|
static void unselect_cols(void);
|
||||||
|
static void select_col(uint8_t col);
|
||||||
|
|
||||||
|
inline uint8_t matrix_rows(void) {
|
||||||
|
return MATRIX_ROWS;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint8_t matrix_cols(void) {
|
||||||
|
return MATRIX_COLS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void matrix_init(void) {
|
||||||
|
// initialize row and col
|
||||||
|
unselect_cols();
|
||||||
|
init_rows();
|
||||||
|
|
||||||
|
// initialize matrix state: all keys off
|
||||||
|
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
|
||||||
|
matrix[i] = 0;
|
||||||
|
matrix_debouncing[i] = 0;
|
||||||
|
}
|
||||||
|
matrix_init_quantum();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_scan(void) {
|
||||||
|
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
|
||||||
|
select_col(col);
|
||||||
|
_delay_us(3);
|
||||||
|
uint8_t rows = read_rows();
|
||||||
|
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||||
|
bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<<col);
|
||||||
|
bool curr_bit = rows & (1<<row);
|
||||||
|
if (prev_bit != curr_bit) {
|
||||||
|
matrix_debouncing[row] ^= ((matrix_row_t)1<<col);
|
||||||
|
debouncing = DEBOUNCING_DELAY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unselect_cols();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debouncing) {
|
||||||
|
if (--debouncing) {
|
||||||
|
_delay_ms(1);
|
||||||
|
} else {
|
||||||
|
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
||||||
|
matrix[i] = matrix_debouncing[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
matrix_scan_quantum();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool matrix_is_modified(void) {
|
||||||
|
if (debouncing)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool matrix_is_on(uint8_t row, uint8_t col) {
|
||||||
|
return (matrix[row] & ((matrix_row_t)1<<col));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline matrix_row_t matrix_get_row(uint8_t row) {
|
||||||
|
return matrix[row];
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_print(void) {
|
||||||
|
print("\nr/c 0123456789ABCDEF\n");
|
||||||
|
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
|
||||||
|
xprintf("%02X: %032lb\n", row, bitrev32(matrix_get_row(row)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_key_count(void) {
|
||||||
|
uint8_t count = 0;
|
||||||
|
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
||||||
|
count += bitpop32(matrix[i]);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Row pin configuration
|
||||||
|
*
|
||||||
|
* row: 0 1 2 3 4 5
|
||||||
|
* pin: C7 B1 B2 C6 B4 B5
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void init_rows(void)
|
||||||
|
{
|
||||||
|
DDRC &= ~0b11000000;
|
||||||
|
DDRB &= ~0b00110110;
|
||||||
|
PORTC |= 0b11000000;
|
||||||
|
PORTB |= 0b00110110;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t read_rows(void) {
|
||||||
|
return (PINC&(1<<PC7) ? 0 : (1<<0)) |
|
||||||
|
(PINB&(1<<PB1) ? 0 : (1<<1)) |
|
||||||
|
(PINB&(1<<PB2) ? 0 : (1<<2)) |
|
||||||
|
(PINC&(1<<PC6) ? 0 : (1<<3)) |
|
||||||
|
(PINB&(1<<PB4) ? 0 : (1<<4)) |
|
||||||
|
(PINB&(1<<PB5) ? 0 : (1<<5));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Row pin configuration
|
||||||
|
* pin: D3 D7 D6 D5 D4
|
||||||
|
* row: off 0 x x x x
|
||||||
|
* 0 1 0 0 0 0
|
||||||
|
* 1 1 0 0 0 1
|
||||||
|
* 2 1 0 0 1 0
|
||||||
|
* 3 1 0 0 1 1
|
||||||
|
* 4 1 0 1 0 0
|
||||||
|
* 5 1 0 1 0 1
|
||||||
|
* 6 1 0 1 1 0
|
||||||
|
* 7 1 0 1 1 1
|
||||||
|
* 8 1 1 0 0 0
|
||||||
|
* 9 1 1 0 0 1
|
||||||
|
* 10 1 1 0 1 0
|
||||||
|
* 11 1 1 0 1 1
|
||||||
|
* 12 1 1 1 0 0
|
||||||
|
* 13 1 1 1 0 1
|
||||||
|
* 14 1 1 1 1 0
|
||||||
|
* 15 1 1 1 1 1
|
||||||
|
*/
|
||||||
|
static void unselect_cols(void)
|
||||||
|
{
|
||||||
|
// output high(DDR:1, PORT:1) to unselect
|
||||||
|
DDRB |= (1 << PD3);
|
||||||
|
PORTB |= (1 << PD3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void select_col(uint8_t col) {
|
||||||
|
DDRD |= (1<<PD3 | 1<<PD4 | 1<<PD5 | 1<<PD6 | 1<<PD7);
|
||||||
|
|
||||||
|
PORTD &= ~(1<<PD3);
|
||||||
|
|
||||||
|
if (col & (1<<0)) {
|
||||||
|
PORTD |= (1<<PD4);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PORTD &= ~(1<<PD4);
|
||||||
|
}
|
||||||
|
if (col & (1<<1)) {
|
||||||
|
PORTD |= (1<<PD5);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PORTD &= ~(1<<PD5);
|
||||||
|
}
|
||||||
|
if (col & (1<<2)) {
|
||||||
|
PORTD |= (1<<PD6);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PORTD &= ~(1<<PD6);
|
||||||
|
}
|
||||||
|
if (col & (1<<3)) {
|
||||||
|
PORTD |= (1<<PD7);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PORTD &= ~(1<<PD7);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# TriangleLabs AL1
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin), [Olivia](https://github.com/olivia)
|
||||||
|
Hardware Supported: AL1 PCB
|
||||||
|
Hardware Availability: [GroupBuy](https://geekhack.org/index.php?topic=93258.0)
|
||||||
|
|
||||||
|
Ported from [TriangleLab](https://github.com/TriangleLab)'s repo: https://github.com/TriangleLab/AL1-Firmware/tree/master/keyboards/al1
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make al1:default
|
||||||
|
make al1:splitbs
|
||||||
|
|
||||||
|
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1286
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# change yes to no to disable
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
NKRO_ENABLE = no # USB Nkey Rollover
|
||||||
|
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||||
|
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||||
|
UNICODE_ENABLE = no # Unicode
|
||||||
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
|
|
||||||
|
CUSTOM_MATRIX = yes
|
||||||
|
SRC += matrix.c
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
#define PERMISSIVE_HOLD
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
# Overview
|
||||||
|
|
||||||
|
A Balance 12 layout for the Atreus keyboard.
|
||||||
|
|
||||||
|
Balance 12 was created by Sasha Viminitz. Please see [this page](https://mathematicalmulticore.wordpress.com/the-keyboard-layout-project/)
|
||||||
|
for some background on the design of the layout.
|
||||||
|
|
||||||
|
* The variant used here is a mirror of the original for left-handers
|
||||||
|
* The central column of punctuation keys has been moved elsewhere
|
||||||
|
* Home positions for the left and right forefingers are *T* and *A* respectively
|
||||||
|
|
||||||
|
## To build/flash
|
||||||
|
|
||||||
|
> make atreus:yttyx:avrdude
|
||||||
|
|
||||||
|
## Layers
|
||||||
|
|
||||||
|
### Base:
|
||||||
|
|
||||||
|
.----------------------------------. .------------------------------.
|
||||||
|
| P | L | C | D | W | | U | O | Y | K | Q |
|
||||||
|
+------+------+------+-----+-------| |------+-----+-----+-----+-----|
|
||||||
|
| N | R | S | T | M | | A | E | I | H | V |
|
||||||
|
+------+------+------+-----+-------| |------+-----+-----+-----+-----|
|
||||||
|
| Z | J | F | G | B | | , | . | ; | X | - |
|
||||||
|
+------+------+------+-----+-------+---------+------+-----+-----+-----+-----|
|
||||||
|
| Shft | Ctl | Alt | BS | Space | L1 | R1 | Shft | R2 | Win | Ctl | Alt |
|
||||||
|
'---------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
### L1:
|
||||||
|
|
||||||
|
.---------------------------------. .--------------------------------.
|
||||||
|
| 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
|
||||||
|
|------+------+------+----+-------| |------+----+-----+------+-------|
|
||||||
|
| Tab | ? | = | - | _ | | ' | " | + | * | Enter |
|
||||||
|
|------+------+------+----+-------| |------+----+-----+------+-------|
|
||||||
|
| Esc | ! | & | | | | , | . | ; | | - |
|
||||||
|
|------+------+------+----+-------+---------+------+----+-----+------+-------|
|
||||||
|
| Shft | Ctrl | Alt | Bk | Space | L1 | R1 | Shft | R2 | Sup | Ctrl | Alt |
|
||||||
|
'----------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
### R1:
|
||||||
|
|
||||||
|
.---------------------------------. .-------------------------------.
|
||||||
|
| < | > | { | } | @ | | $ | £ | | | R3 |
|
||||||
|
+------+------+-----+-----|-------| |------+----+-----+------+------|
|
||||||
|
| [ | ] | ( | ) | # | | ' | " | ~ | ` | Caps |
|
||||||
|
|------+------+-----+-----+-------| |------+----+-----+------+------|
|
||||||
|
| / | \ | ^ | | | % | | , | . | ; | | PScn |
|
||||||
|
|------+------+-----+-----+-------+---------+------+----+-----+------+------|
|
||||||
|
| Shft | Ctrl | Alt | Del | Space | L1 | R1 | Shft | R2 | Sup | Ctrl | Alt |
|
||||||
|
'---------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
### R2:
|
||||||
|
|
||||||
|
.-----------------------------------. .--------------------.-----------------.
|
||||||
|
| F12 | F11 | F10 | F9 | Copy | | Home | Up | End | PgUp | Insert |
|
||||||
|
|------+------+------+------+-------| |------+------+------+------+----------|
|
||||||
|
| F8 | F7 | F6 | F5 | Paste | | Left | Down | Right| PgDn | Enter |
|
||||||
|
|------+------+------+------+-------| |------+------+------+------+----------|
|
||||||
|
| F4 | F3 | F2 | F1 | Cut | | ^Tab | | Tab | | |
|
||||||
|
|------+------+------+------+-------+---------+------+------+------+------+----------|
|
||||||
|
| Shft | Ctrl | Alt | Del | Undo | L1 | R1 | Shft | R2 | Sup | Ctrl | WinRight |
|
||||||
|
'------------------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
### R3:
|
||||||
|
|
||||||
|
.----------------------------. .------------------------.
|
||||||
|
| RESET | | | | | | | | | | R3 |
|
||||||
|
|-------+----+-----+----+----| |----+----+----+----+----|
|
||||||
|
| | | | | | | | | | | |
|
||||||
|
|-------+----+-----+----+----| |----+----+----+----+----|
|
||||||
|
| | | | | | | | | | | |
|
||||||
|
|-------+----+-----+----+----+---------+----+----+----+----+----|
|
||||||
|
| | | | | | | | | | | | |
|
||||||
|
'---------------------------------------------------------------'
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#define ONESHOT_TIMEOUT 500 // Time (in ms) before the one shot key is released
|
||||||
|
|
||||||
|
// Disable some options to reduce firmware size
|
||||||
|
#define NO_PRINT
|
||||||
|
#define NO_ACTION_TAPPING
|
||||||
|
#define NO_ACTION_MACRO
|
||||||
|
#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
enum layers {
|
||||||
|
BASE, // Balance Twelve
|
||||||
|
L1, // (momentary)
|
||||||
|
R1, // (momentary)
|
||||||
|
R2, // (momentary)
|
||||||
|
R3 // (momentary)
|
||||||
|
};
|
||||||
|
|
||||||
|
#define xxxxxxx KC_NO
|
||||||
|
#define _______ KC_TRNS
|
||||||
|
|
||||||
|
// Aliases from replicaJunction's atreus layout
|
||||||
|
#define KCX_LST LSFT(KC_TAB)
|
||||||
|
#define KX_COPY LCTL(KC_C)
|
||||||
|
#define KX_CUT LCTL(KC_X)
|
||||||
|
#define KX_PAST LCTL(KC_V)
|
||||||
|
#define KX_UNDO LCTL(KC_Z)
|
||||||
|
|
||||||
|
#define KX_AT LSFT(KC_QUOT)
|
||||||
|
#define KX_PIPE LSFT(KC_NUBS)
|
||||||
|
#define KX_WINR LSFT(LGUI(KC_RGHT)) // Move window to next monitor (Windows)
|
||||||
|
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][ MATRIX_ROWS ][ MATRIX_COLS ] = {
|
||||||
|
|
||||||
|
/* Balance Twelve mirror variant (left-handed)
|
||||||
|
.--------------------------------. .------------------------------.
|
||||||
|
| P | L | C | D | W | | U | O | Y | K | Q |
|
||||||
|
+------+------+-----+----+-------| |------+----+-----+------+-----|
|
||||||
|
| N | R | S | T | M | | A | E | I | H | V |
|
||||||
|
+------+------+-----+----+-------| |------+----+-----+------+-----|
|
||||||
|
| Z | J | F | G | B | | , | . | ; | X | - |
|
||||||
|
+------+------+-----+----+-------+---------+------+----+-----+------+-----|
|
||||||
|
| Shft | Ctrl | Alt | Bk | Space | L1 | R1 | Shft | R2 | Win | Ctrl | Alt |
|
||||||
|
'-------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[BASE] = LAYOUT(
|
||||||
|
KC_P, KC_L, KC_C, KC_D, KC_W, KC_U, KC_O, KC_Y, KC_K, KC_Q,
|
||||||
|
KC_N, KC_R, KC_S, KC_T, KC_M, KC_A, KC_E, KC_I, KC_H, KC_V,
|
||||||
|
KC_Z, KC_J, KC_F, KC_G, KC_B, KC_COMM, KC_DOT, KC_SCLN, KC_X, KC_MINS,
|
||||||
|
KC_LSFT, KC_LCTL, KC_LALT, KC_BSPC, KC_SPC, MO(L1), MO(R1), OSM(MOD_LSFT), MO(R2), KC_LWIN, KC_RCTL, KC_RALT
|
||||||
|
),
|
||||||
|
|
||||||
|
/* L1
|
||||||
|
.---------------------------------. .--------------------------------.
|
||||||
|
| 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
|
||||||
|
|------+------+------+----+-------| |------+----+-----+------+-------|
|
||||||
|
| Tab | ? | = | - | _ | | ' | " | + | * | Enter |
|
||||||
|
|------+------+------+----+-------| |------+----+-----+------+-------|
|
||||||
|
| Esc | ! | & | | | | , | . | ; | | - |
|
||||||
|
|------+------+------+----+-------+---------+------+----+-----+------+-------|
|
||||||
|
| Shft | Ctrl | Alt | Bk | Space | L1 | R1 | Shft | R2 | Sup | Ctrl | Alt |
|
||||||
|
'----------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[L1] = LAYOUT(
|
||||||
|
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
|
||||||
|
KC_TAB, KC_QUES, KC_EQL, KC_MINS, KC_UNDS, KC_QUOT, LSFT(KC_2), KC_PLUS, KC_ASTR, KC_ENT,
|
||||||
|
KC_ESC, KC_EXLM, KC_AMPR, xxxxxxx, xxxxxxx, _______, _______, _______, xxxxxxx, _______,
|
||||||
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
|
||||||
|
),
|
||||||
|
|
||||||
|
/* R1
|
||||||
|
.---------------------------------. .-------------------------------.
|
||||||
|
| < | > | { | } | @ | | $ | £ | | | R3 |
|
||||||
|
+------+------+-----+-----|-------| |------+----+-----+------+------|
|
||||||
|
| [ | ] | ( | ) | # | | ' | " | ~ | ` | Caps |
|
||||||
|
|------+------+-----+-----+-------| |------+----+-----+------+------|
|
||||||
|
| / | \ | ^ | | | % | | , | . | ; | | PScn |
|
||||||
|
|------+------+-----+-----+-------+---------+------+----+-----+------+------|
|
||||||
|
| Shft | Ctrl | Alt | Del | Space | L1 | R1 | Shft | R2 | Sup | Ctrl | Alt |
|
||||||
|
'---------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[R1] = LAYOUT(
|
||||||
|
KC_LABK, KC_RABK, KC_LCBR, KC_RCBR, KX_AT, KC_DLR, KC_HASH, xxxxxxx, xxxxxxx, MO(R3),
|
||||||
|
KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_NUHS, KC_QUOT, LSFT(KC_2), LSFT(KC_NUHS), KC_GRV, KC_CAPS,
|
||||||
|
KC_SLSH, KC_NUBS, KC_CIRC, KX_PIPE, KC_PERC, _______, _______, _______, xxxxxxx, KC_PSCR,
|
||||||
|
_______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______
|
||||||
|
),
|
||||||
|
|
||||||
|
/* R2
|
||||||
|
.-----------------------------------. .--------------------.-----------------.
|
||||||
|
| F12 | F11 | F10 | F9 | Copy | | Home | Up | End | PgUp | Insert |
|
||||||
|
|------+------+------+------+-------| |------+------+------+------+----------|
|
||||||
|
| F8 | F7 | F6 | F5 | Paste | | Left | Down | Right| PgDn | Enter |
|
||||||
|
|------+------+------+------+-------| |------+------+------+------+----------|
|
||||||
|
| F4 | F3 | F2 | F1 | Cut | | ^Tab | | Tab | | |
|
||||||
|
|------+------+------+------+-------+---------+------+------+------+------+----------|
|
||||||
|
| Shft | Ctrl | Alt | Del | Undo | L1 | R1 | Shft | R2 | Sup | Ctrl | WinRight |
|
||||||
|
'------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[R2] = LAYOUT(
|
||||||
|
KC_F12, KC_F11, KC_F10, KC_F9, KX_COPY, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_INS,
|
||||||
|
KC_F8, KC_F7, KC_F6, KC_F5, KX_PAST, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_ENT,
|
||||||
|
KC_F4, KC_F3, KC_F2, KC_F1, KX_CUT, KCX_LST, xxxxxxx, KC_TAB, xxxxxxx, xxxxxxx,
|
||||||
|
_______, _______, _______, KC_DEL, KX_UNDO, _______, _______, _______, _______, _______, _______, KX_WINR
|
||||||
|
),
|
||||||
|
|
||||||
|
/* R3
|
||||||
|
.----------------------------. .------------------------.
|
||||||
|
| RESET | | | | | | | | | | R3 |
|
||||||
|
|-------+----+-----+----+----| |----+----+----+----+----|
|
||||||
|
| | | | | | | | | | | |
|
||||||
|
|-------+----+-----+----+----| |----+----+----+----+----|
|
||||||
|
| | | | | | | | | | | |
|
||||||
|
|-------+----+-----+----+----+---------+----+----+----+----+----|
|
||||||
|
| | | | | | | | | | | | |
|
||||||
|
'---------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[R3] = LAYOUT(
|
||||||
|
RESET, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, _______,
|
||||||
|
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||||
|
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
|
||||||
|
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#include "../config.h"
|
||||||
|
|
||||||
|
#define TAPPING_TERM 600 // ms
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/* Copyright 2018 MechMerlin
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "cod67.h"
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
// put your keyboard start-up code here
|
||||||
|
// runs once when the firmware starts up
|
||||||
|
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
// put your looping keyboard code here
|
||||||
|
// runs every cycle (a lot)
|
||||||
|
|
||||||
|
matrix_scan_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
// put your per-action keyboard code here
|
||||||
|
// runs for every action, just before processing by the firmware
|
||||||
|
|
||||||
|
return process_record_user(keycode, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led) {
|
||||||
|
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
||||||
|
|
||||||
|
led_set_user(usb_led);
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/* Copyright 2018 MechMerlin
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef COD67_H
|
||||||
|
#define COD67_H
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
#define LAYOUT( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||||
|
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||||
|
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
|
||||||
|
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
|
||||||
|
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D }, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2018 MechMerlin
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x0000
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER Gray
|
||||||
|
#define PRODUCT cod67
|
||||||
|
#define DESCRIPTION 60% Custom Keyboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 5
|
||||||
|
#define MATRIX_COLS 14
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keyboard Matrix Assignments
|
||||||
|
*
|
||||||
|
* Change this to how you wired your keyboard
|
||||||
|
* COLS: AVR pins used for columns, left to right
|
||||||
|
* ROWS: AVR pins used for rows, top to bottom
|
||||||
|
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
||||||
|
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define MATRIX_ROW_PINS { C7, C6, B6, B5, B4 }
|
||||||
|
#define MATRIX_COL_PINS { D7, F7, F6, F5, F4, F1, F0, E6, B0, B7, D0, D1, D2, D3 }
|
||||||
|
#define UNUSED_PINS
|
||||||
|
|
||||||
|
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
#define BACKLIGHT_PIN D4
|
||||||
|
#define BACKLIGHT_LEVELS 3
|
||||||
|
|
||||||
|
|
||||||
|
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||||
|
#define DEBOUNCING_DELAY 5
|
||||||
|
|
||||||
|
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
||||||
|
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
|
||||||
|
*/
|
||||||
|
// #define GRAVE_ESC_CTRL_OVERRIDE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force NKRO
|
||||||
|
*
|
||||||
|
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
||||||
|
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
||||||
|
* makefile for this to work.)
|
||||||
|
*
|
||||||
|
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
||||||
|
* until the next keyboard reset.
|
||||||
|
*
|
||||||
|
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
||||||
|
* fully operational during normal computer usage.
|
||||||
|
*
|
||||||
|
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
||||||
|
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
||||||
|
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
||||||
|
* power-up.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//#define FORCE_NKRO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Magic Key Options
|
||||||
|
*
|
||||||
|
* Magic keys are hotkey commands that allow control over firmware functions of
|
||||||
|
* the keyboard. They are best used in combination with the HID Listen program,
|
||||||
|
* found here: https://www.pjrc.com/teensy/hid_listen.html
|
||||||
|
*
|
||||||
|
* The options below allow the magic key functionality to be changed. This is
|
||||||
|
* useful if your keyboard/keypad is missing keys and you want magic key support.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* key combination for magic key command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* control how magic key switches layers */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
|
||||||
|
|
||||||
|
/* override magic key keymap */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
|
||||||
|
//#define MAGIC_KEY_HELP1 H
|
||||||
|
//#define MAGIC_KEY_HELP2 SLASH
|
||||||
|
//#define MAGIC_KEY_DEBUG D
|
||||||
|
//#define MAGIC_KEY_DEBUG_MATRIX X
|
||||||
|
//#define MAGIC_KEY_DEBUG_KBD K
|
||||||
|
//#define MAGIC_KEY_DEBUG_MOUSE M
|
||||||
|
//#define MAGIC_KEY_VERSION V
|
||||||
|
//#define MAGIC_KEY_STATUS S
|
||||||
|
//#define MAGIC_KEY_CONSOLE C
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT1 ESC
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
|
||||||
|
//#define MAGIC_KEY_LAYER0 0
|
||||||
|
//#define MAGIC_KEY_LAYER1 1
|
||||||
|
//#define MAGIC_KEY_LAYER2 2
|
||||||
|
//#define MAGIC_KEY_LAYER3 3
|
||||||
|
//#define MAGIC_KEY_LAYER4 4
|
||||||
|
//#define MAGIC_KEY_LAYER5 5
|
||||||
|
//#define MAGIC_KEY_LAYER6 6
|
||||||
|
//#define MAGIC_KEY_LAYER7 7
|
||||||
|
//#define MAGIC_KEY_LAYER8 8
|
||||||
|
//#define MAGIC_KEY_LAYER9 9
|
||||||
|
//#define MAGIC_KEY_BOOTLOADER PAUSE
|
||||||
|
//#define MAGIC_KEY_LOCK CAPS
|
||||||
|
//#define MAGIC_KEY_EEPROM E
|
||||||
|
//#define MAGIC_KEY_NKRO N
|
||||||
|
//#define MAGIC_KEY_SLEEP_LED Z
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MIDI options
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Prevent use of disabled MIDI features in the keymap */
|
||||||
|
//#define MIDI_ENABLE_STRICT 1
|
||||||
|
|
||||||
|
/* enable basic MIDI features:
|
||||||
|
- MIDI notes can be sent when in Music mode is on
|
||||||
|
*/
|
||||||
|
//#define MIDI_BASIC
|
||||||
|
|
||||||
|
/* enable advanced MIDI features:
|
||||||
|
- MIDI notes can be added to the keymap
|
||||||
|
- Octave shift and transpose
|
||||||
|
- Virtual sustain, portamento, and modulation wheel
|
||||||
|
- etc.
|
||||||
|
*/
|
||||||
|
//#define MIDI_ADVANCED
|
||||||
|
|
||||||
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "COD67",
|
||||||
|
"url": "",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"width": 15,
|
||||||
|
"height": 5,
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"x":13, "y":3}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4}, {"label":"Win", "x":1, "y":4}, {"label":"Alt", "x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4, "w":2}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/* Copyright 2018 MechMerlin
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
|
LAYOUT(
|
||||||
|
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||||
|
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM fn_actions[] = {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||||
|
{
|
||||||
|
// MACRODOWN only works in this function
|
||||||
|
switch(id) {
|
||||||
|
case 0:
|
||||||
|
if (record->event.pressed) {
|
||||||
|
register_code(KC_RSFT);
|
||||||
|
} else {
|
||||||
|
unregister_code(KC_RSFT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MACRO_NONE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_user(void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_user(uint8_t usb_led) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# The default keymap for cod67
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# Gray COD67
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The Gray COD67 is a 60% keyboard with a modern and bold design. It features 20 RGB Underglow LED lights and a unique diffuser placement. The COD67 has the most stunning RGB light strip for a custom mechanical keyboard. It also features a center mounted USB C port.
|
||||||
|
|
||||||
|
There were only 75 units made worldwide.
|
||||||
|
|
||||||
|
Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
|
||||||
|
Hardware Supported: Gray COD67
|
||||||
|
Hardware Availability: [Zfrontier](https://en.zfrontier.com/products/cod67)
|
||||||
|
|
||||||
|
At this time, flashing ONLY works on Windows systems.
|
||||||
|
|
||||||
|
To put in bootloader mode, hold the `Esc` key while plugging in the USB cable.
|
||||||
|
|
||||||
|
The COD67 will show up as a drive.
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make cod67:default:bin
|
||||||
|
|
||||||
|
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
|
||||||
|
|
||||||
|
Rename the resulting `.bin` file to `cod67.bin`.
|
||||||
|
|
||||||
|
Drag and drop `cod67.bin` to the drive, overwriting the previous `cod67.bin` stored on it.
|
||||||
|
|
||||||
|
Press the `Esc` key again to reset the board. You are now ready to type!
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
The backlight pin is attached to a non PWM pin `D4` so backlight is only on/off.
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1286
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# change yes to no to disable
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
NKRO_ENABLE = no # USB Nkey Rollover
|
||||||
|
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||||
|
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||||
|
UNICODE_ENABLE = no # Unicode
|
||||||
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
@@ -40,13 +40,13 @@
|
|||||||
*/
|
*/
|
||||||
// The first section contains all of the arguments
|
// The first section contains all of the arguments
|
||||||
// The second converts the arguments into a two-dimensional array
|
// The second converts the arguments into a two-dimensional array
|
||||||
#define KEYMAP( \
|
#define LAYOUT_ortho_6x4( \
|
||||||
k00, k01, k02, k03, \
|
k00, k01, k02, k03, \
|
||||||
k10, k11, k12, k13, \
|
k10, k11, k12, k13, \
|
||||||
k20, k21, k22, k23, \
|
k20, k21, k22, k23, \
|
||||||
k30, k31, k32, k33, \
|
k30, k31, k32, k33, \
|
||||||
k40, k41, k42, k43, \
|
k40, k41, k42, k43, \
|
||||||
k50, k51, k52, k53 \
|
k50, k51, k52, k53 \
|
||||||
) \
|
) \
|
||||||
{ \
|
{ \
|
||||||
{k00, k01, k02, k03}, \
|
{k00, k01, k02, k03}, \
|
||||||
@@ -54,14 +54,27 @@
|
|||||||
{k20, k21, k22, k23}, \
|
{k20, k21, k22, k23}, \
|
||||||
{k30, k31, k32, k33}, \
|
{k30, k31, k32, k33}, \
|
||||||
{k40, k41, k42, k43}, \
|
{k40, k41, k42, k43}, \
|
||||||
{k50, k51, k52, k53} \
|
{k50, k51, k52, k53} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LAYOUT_numpad_6x4( \
|
||||||
|
k00, k01, k02, k03, \
|
||||||
|
k10, k11, k12, k13, \
|
||||||
|
k20, k21, k22, \
|
||||||
|
k30, k31, k32, k23, \
|
||||||
|
k40, k41, k42, \
|
||||||
|
k50, k52, k43 \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
{k00, k01, k02, k03}, \
|
||||||
|
{k10, k11, k12, k13}, \
|
||||||
|
{k20, k21, k22, k23}, \
|
||||||
|
{k30, k31, k32, KC_NO}, \
|
||||||
|
{k40, k41, k42, k43}, \
|
||||||
|
{k50, KC_NO, k52, KC_NO} \
|
||||||
}
|
}
|
||||||
void matrix_init_user(void);
|
void matrix_init_user(void);
|
||||||
void matrix_scan_user(void);
|
void matrix_scan_user(void);
|
||||||
/*
|
|
||||||
inline void cospad_bl_led_on(void) { DDRF |= (1<<7); PORTF &= ~(1<<7); }
|
|
||||||
inline void cospad_bl_led_off(void) { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void cospad_bl_led_on(void) { PORTF &= ~(1<<7); }
|
inline void cospad_bl_led_on(void) { PORTF &= ~(1<<7); }
|
||||||
inline void cospad_bl_led_off(void) { PORTF |= (1<<7); }
|
inline void cospad_bl_led_off(void) { PORTF |= (1<<7); }
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "",
|
||||||
|
"url": "",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"width": 4,
|
||||||
|
"height": 6,
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT_numpad_6x4": {
|
||||||
|
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Tab", "x":1, "y":0}, {"label":"Fn", "x":2, "y":0}, {"label":"Back", "x":3, "y":0}, {"label":"Num Lock", "x":0, "y":1}, {"label":"/", "x":1, "y":1}, {"label":"*", "x":2, "y":1}, {"label":"-", "x":3, "y":1}, {"label":"7", "x":0, "y":2}, {"label":"8", "x":1, "y":2}, {"label":"9", "x":2, "y":2}, {"label":"+", "x":3, "y":2, "h":2}, {"label":"4", "x":0, "y":3}, {"label":"5", "x":1, "y":3}, {"label":"6", "x":2, "y":3}, {"label":"1", "x":0, "y":4}, {"label":"2", "x":1, "y":4}, {"label":"3", "x":2, "y":4}, {"label":"Enter", "x":3, "y":4, "h":2}, {"label":"0", "x":0, "y":5, "w":2}, {"label":".", "x":2, "y":5}]
|
||||||
|
},
|
||||||
|
|
||||||
|
"LAYOUT_ortho_6x4": {
|
||||||
|
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Tab", "x":1, "y":0}, {"label":"Fn", "x":2, "y":0}, {"label":"Back", "x":3, "y":0}, {"label":"Num Lock", "x":0, "y":1}, {"label":"/", "x":1, "y":1}, {"label":"*", "x":2, "y":1}, {"label":"-", "x":3, "y":1}, {"label":"7", "x":0, "y":2}, {"label":"8", "x":1, "y":2}, {"label":"9", "x":2, "y":2}, {"label":"+", "x":3, "y":2}, {"label":"4", "x":0, "y":3}, {"label":"5", "x":1, "y":3}, {"label":"6", "x":2, "y":3}, {"x":3, "y":3}, {"label":"1", "x":0, "y":4}, {"label":"2", "x":1, "y":4}, {"label":"3", "x":2, "y":4}, {"label":"Enter", "x":3, "y":4}, {"label":"0", "x":0, "y":5}, {"x":1, "y":5}, {"label":".", "x":2, "y":5}, {"x":3, "y":5}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "cospad.h"
|
#include QMK_KEYBOARD_H
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
#ifdef RGBLIGHT_ENABLE
|
||||||
@@ -31,13 +31,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
* `-------------------'
|
* `-------------------'
|
||||||
*/
|
*/
|
||||||
|
|
||||||
[_BL] = KEYMAP(
|
[_BL] = LAYOUT_numpad_6x4(
|
||||||
KC_ESC, KC_TAB, MO(_FL), KC_BSPC, \
|
KC_ESC, KC_TAB, MO(_FL), KC_BSPC, \
|
||||||
KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
|
KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
|
||||||
KC_P7, KC_P8, KC_P9, KC_PPLS, \
|
KC_P7, KC_P8, KC_P9, \
|
||||||
KC_P4, KC_P5, KC_P6, KC_NO, \
|
KC_P4, KC_P5, KC_P6, KC_PPLS, \
|
||||||
KC_P1, KC_P2, KC_P3, KC_PENT, \
|
KC_P1, KC_P2, KC_P3, \
|
||||||
KC_P0, KC_NO, KC_PDOT, KC_NO),
|
KC_P0, KC_PDOT, KC_PENT),
|
||||||
|
|
||||||
/* Keymap _FL: Function Layer
|
/* Keymap _FL: Function Layer
|
||||||
* ,-------------------.
|
* ,-------------------.
|
||||||
@@ -54,13 +54,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
* | 0 |RST | |
|
* | 0 |RST | |
|
||||||
* `-------------------'
|
* `-------------------'
|
||||||
*/
|
*/
|
||||||
[_FL] = KEYMAP(
|
[_FL] = LAYOUT_numpad_6x4(
|
||||||
RGB_TOG, KC_TAB, KC_TRNS, KC_BSPC, \
|
RGB_TOG, KC_TAB, KC_TRNS, KC_BSPC, \
|
||||||
RGB_MOD, RGB_M_P, BL_TOGG, KC_PMNS, \
|
RGB_MOD, RGB_M_P, BL_TOGG, KC_PMNS, \
|
||||||
RGB_HUD, RGB_HUI, BL_ON, KC_PPLS, \
|
RGB_HUD, RGB_HUI, BL_ON, \
|
||||||
RGB_SAD, RGB_SAI, BL_OFF, KC_NO, \
|
RGB_SAD, RGB_SAI, BL_OFF, KC_PPLS, \
|
||||||
RGB_VAD, RGB_VAI, KC_P3, KC_PENT, \
|
RGB_VAD, RGB_VAI, KC_P3, \
|
||||||
KC_P0, KC_NO, RESET, KC_NO),
|
KC_P0, RESET, KC_PENT),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#ifndef CONFIG_KEYMAP_H
|
||||||
|
#define CONFIG_KEYMAP_H
|
||||||
|
|
||||||
|
#include "../../config.h"
|
||||||
|
|
||||||
|
// Fix KC_GESC conflict with Cmd+Alt+Esc on macos
|
||||||
|
#define GRAVE_ESC_GUI_OVERRIDE
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
#define ______ KC_TRNS
|
||||||
|
#define _BL 0
|
||||||
|
#define _FL 1
|
||||||
|
#define _ML 2
|
||||||
|
|
||||||
|
enum my_keycodes {
|
||||||
|
BR_UP = SAFE_RANGE,
|
||||||
|
BR_DOWN
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* ,-----------------------------------------------------------------------------------------.
|
||||||
|
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | _FL | A | S | D | F | G | H | J | K | L | ; | ' | Enter |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | Shift | Z | X | C | V | B | N | M | , | . | / | _ML | Up |Shift|
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | Ctrl | Alt | Gui | Space |Gui/_ML| Alt | Left| Down|Right|
|
||||||
|
* `-----------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_BL] = LAYOUT_2_shifts(
|
||||||
|
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC,
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
|
||||||
|
MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
|
||||||
|
KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_ML), KC_UP, KC_RSFT,
|
||||||
|
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, LM(_ML, MOD_RGUI), KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||||
|
|
||||||
|
/* ,-----------------------------------------------------------------------------------------.
|
||||||
|
* | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | | UP | | | | | Reset |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | Left| Down|Right| | | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | | |
|
||||||
|
* `-----------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_FL] = LAYOUT(
|
||||||
|
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ______, KC_DEL,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, ______, KC_UP, ______, ______, ______, ______, RESET,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, KC_LEFT, KC_DOWN, KC_RIGHT, ______, ______, ______,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______),
|
||||||
|
|
||||||
|
/* ,-----------------------------------------------------------------------------------------.
|
||||||
|
* | | BR- | BR+ | F3 | F4 | | |PREV |PLAY |NEXT |MUTE | V- | V+ | Eject |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | | | | | | | |
|
||||||
|
* |-----------------------------------------------------------------------------------------+
|
||||||
|
* | | | | | | | | | |
|
||||||
|
* `-----------------------------------------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_ML] = LAYOUT(
|
||||||
|
______, BR_DOWN, BR_UP, ______, ______, KC_F5, KC_F6, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, ______, KC_MEDIA_EJECT,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
|
||||||
|
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______),
|
||||||
|
};
|
||||||
|
|
||||||
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
uint8_t key;
|
||||||
|
switch (keycode) {
|
||||||
|
case BR_DOWN:
|
||||||
|
case BR_UP:
|
||||||
|
// Clear the RGUI modifier placed by LM for _ML layer as brightness don't
|
||||||
|
// work with modifiers.
|
||||||
|
key = (keycode == BR_DOWN) ? KC_SLCK : KC_PAUS;
|
||||||
|
if (record->event.pressed) {
|
||||||
|
unregister_mods(MOD_RGUI);
|
||||||
|
add_key(key);
|
||||||
|
send_keyboard_report();
|
||||||
|
} else {
|
||||||
|
del_key(key);
|
||||||
|
send_keyboard_report();
|
||||||
|
}
|
||||||
|
return false; // Skip all further processing of this key
|
||||||
|
default:
|
||||||
|
return true; // Process all other keycodes normally
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# Macos keymap with arrow
|
||||||
|
|
||||||
|
This is a keymap for DZ60 configured with arrows using the layout below:
|
||||||
|
|
||||||
|
[](http://www.keyboard-layout-editor.com/#/gists/07d924064c77c0ff43de6b8a9519f931)
|
||||||
|
|
||||||
|
My build used the following components:
|
||||||
|
* DZ60 PCB
|
||||||
|
* [Stainless steel alu plate option A with 2U left shift](https://www.aliexpress.com/item/Alu-plate-dz60-plate-for-DIY-mechanical-keyboard/32827595666.html) (optional)
|
||||||
|
* [YMDK customized 61 64 68 ANSI keyset](https://www.amazon.com/Customized-Keyset-Profile-Mechanical-Keyboard/dp/B0777LMKKK)
|
||||||
|
* 60 Cherry MX Clear for the main keys + 10 Cherry MX Grey for the large keys
|
||||||
|
* [The wood case for DZ60](https://www.aliexpress.com/item/GH60-Keyboard-Wood-Case-PCB-Board-Position-Plate-Satellite-Axis-And-Walnut-Wood-Wrist-Rest-For/32836566852.html) (optional)
|
||||||
|
|
||||||
|
## Base Layer
|
||||||
|
|
||||||
|
```
|
||||||
|
,-----------------------------------------------------------------------------------------.
|
||||||
|
| Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| _FL | A | S | D | F | G | H | J | K | L | ; | ' | Enter |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| Shift | Z | X | C | V | B | N | M | , | . | / | _ML | Up |Shift|
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| Ctrl | Alt | Cmd | Space |Cmd/_ML| Alt | Left| Down|Right|
|
||||||
|
`-----------------------------------------------------------------------------------------'
|
||||||
|
```
|
||||||
|
|
||||||
|
* The escape key use `KC_GESC` to get grave accent on any letter with ``Alt+Esc`` and `` ` `` alone with the ``Hyper+Esc``. The `~` is obtained with `Shift+Esc`. `GRAVE_ESC_GUI_OVERRIDE` is define so `Cmd+Alt+Esc` can still work.
|
||||||
|
* The `Caps-Lock` (`Hyper`) key switch to the function layer (`_FL`).
|
||||||
|
* The right `Cmd` key is used to switch to the media layer (`_ML`) when used with keys mapped on that layer (the top row). Any other keys just act as a `Cmd+` that key.
|
||||||
|
|
||||||
|
## Function Layer (_FL)
|
||||||
|
|
||||||
|
```
|
||||||
|
,-----------------------------------------------------------------------------------------.
|
||||||
|
| ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | | UP | | | | | Reset |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | Left| Down|Right| | | |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | | |
|
||||||
|
`-----------------------------------------------------------------------------------------'
|
||||||
|
```
|
||||||
|
|
||||||
|
The function layer is activated by the `Caps-Lock` (`Hyper`) key to access `F` keys. In addition, the `IJKL` are mapped as cursor keys on that layer.
|
||||||
|
|
||||||
|
## Media Layer (_ML)
|
||||||
|
|
||||||
|
```
|
||||||
|
,-----------------------------------------------------------------------------------------.
|
||||||
|
| | BR- | BR+ | F3 | F4 | | |PREV |PLAY |NEXT |MUTE | V- | V+ | Eject |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | | | | | | |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | | | | | | | |
|
||||||
|
|-----------------------------------------------------------------------------------------+
|
||||||
|
| | | | | | | | | |
|
||||||
|
`-----------------------------------------------------------------------------------------'
|
||||||
|
```
|
||||||
|
|
||||||
|
The media layer is activated by the right `Cmd` (`FN`) key. It contains the typical macos media keys on the top row. Blank keys act as `Cmd+` that key on the base layer.
|
||||||
|
|
||||||
|
|
||||||
@@ -1,53 +1 @@
|
|||||||
#include "e6v2.h"
|
#include "e6v2.h"
|
||||||
|
|
||||||
void matrix_init_kb(void) {
|
|
||||||
// put your keyboard start-up code here
|
|
||||||
// runs once when the firmware starts up
|
|
||||||
|
|
||||||
matrix_init_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
void matrix_scan_kb(void) {
|
|
||||||
// put your looping keyboard code here
|
|
||||||
// runs every cycle (a lot)
|
|
||||||
|
|
||||||
matrix_scan_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
// put your per-action keyboard code here
|
|
||||||
// runs for every action, just before processing by the firmware
|
|
||||||
|
|
||||||
return process_record_user(keycode, record);
|
|
||||||
}
|
|
||||||
|
|
||||||
void led_set_kb(uint8_t usb_led) {
|
|
||||||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
|
||||||
DDRB |= (1<<6);
|
|
||||||
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
|
||||||
// output low
|
|
||||||
DDRB |= (1<<2);
|
|
||||||
PORTB &= ~(1<<2);
|
|
||||||
} else {
|
|
||||||
// Hi-Z
|
|
||||||
DDRB &= ~(1<<2);
|
|
||||||
PORTB &= ~(1<<2);
|
|
||||||
}
|
|
||||||
// DDRB |= (1<<7);
|
|
||||||
// DDRB |= (1<<1);
|
|
||||||
// DDRB |= (1<<3);
|
|
||||||
// DDRE |= (1<<6);
|
|
||||||
if (usb_led == 0){
|
|
||||||
PORTB |= (1<<6);
|
|
||||||
// PORTB |= (1<<7);
|
|
||||||
// PORTB |= (1<<1);
|
|
||||||
// PORTB |= (1<<3);
|
|
||||||
// PORTE |= (1<<6);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
PORTB &= ~(1<<6);
|
|
||||||
// PORTB &= ~(1<<7);
|
|
||||||
}
|
|
||||||
|
|
||||||
led_set_user(usb_led);
|
|
||||||
}
|
|
||||||
+6
-58
@@ -3,64 +3,12 @@
|
|||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
#define LAYOUT( \
|
#ifdef KEYBOARD_e6v2_oe
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
|
#include "oe.h"
|
||||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
#endif
|
||||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
|
||||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
|
||||||
K40, K41, K42, K46, K4A, K4B, K4C, K4D \
|
|
||||||
)\
|
|
||||||
{\
|
|
||||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
|
|
||||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
|
||||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO }, \
|
|
||||||
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO }, \
|
|
||||||
{ K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, KC_NO }, \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LAYOUT_60_ansi( \
|
#ifdef KEYBOARD_e6v2_le
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
#include "le.h"
|
||||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
#endif
|
||||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
|
||||||
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
|
|
||||||
K40, K41, K42, K46, K4A, K4B, K4C, K4D \
|
|
||||||
)\
|
|
||||||
{\
|
|
||||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, KC_NO }, \
|
|
||||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
|
||||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \
|
|
||||||
{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO, KC_NO }, \
|
|
||||||
{ K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, KC_NO }, \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LAYOUT_hhkb( \
|
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
|
||||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
|
||||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
|
||||||
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
|
||||||
K41, K42, K46, K4B, K4C \
|
|
||||||
)\
|
|
||||||
{\
|
|
||||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, KC_NO }, \
|
|
||||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
|
||||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \
|
|
||||||
{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO }, \
|
|
||||||
{ KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, KC_NO }, \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LAYOUT_hhkb_splits( \
|
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E,\
|
|
||||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
|
||||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
|
||||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
|
||||||
K41, K42, K46, K4B, K4C \
|
|
||||||
)\
|
|
||||||
{\
|
|
||||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
|
|
||||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
|
||||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \
|
|
||||||
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO }, \
|
|
||||||
{ KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, KC_NO }, \
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -1 +0,0 @@
|
|||||||
#include "../../config.h"
|
|
||||||
Whitespace-only changes.
@@ -1 +0,0 @@
|
|||||||
#include "../../config.h"
|
|
||||||
Whitespace-only changes.
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x6060
|
||||||
|
#define DEVICE_VER 0x0002
|
||||||
|
#define MANUFACTURER Exclusive / E-Team
|
||||||
|
#define PRODUCT E6-V2 LE
|
||||||
|
#define DESCRIPTION E6-V2 LE QMK PCB (Mid-Port)
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 5
|
||||||
|
#define MATRIX_COLS 15
|
||||||
|
|
||||||
|
/* QMK E6-V2 PCB default pin-out */
|
||||||
|
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4 }
|
||||||
|
#define MATRIX_COL_PINS { B5, D0, D1, D2, D3, D4, D5, D6, D7, C6, C7, F4, F5, F6, F7 }
|
||||||
|
#define UNUSED_PINS
|
||||||
|
|
||||||
|
#define RGB_DI_PIN E6
|
||||||
|
#ifdef RGB_DI_PIN
|
||||||
|
#define RGBLIGHT_ANIMATIONS
|
||||||
|
#define RGBLED_NUM 12
|
||||||
|
#define RGBLIGHT_HUE_STEP 12
|
||||||
|
#define RGBLIGHT_SAT_STEP 12
|
||||||
|
#define RGBLIGHT_VAL_STEP 12
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BACKLIGHT_PIN B6
|
||||||
|
#ifdef BACKLIGHT_PIN
|
||||||
|
#define BACKLIGHT_LEVELS 2
|
||||||
|
#define BACKLIGHT_BREAHTING
|
||||||
|
#define BREATHING_PERIOD 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
#define DEBOUNCING_DELAY 5
|
||||||
|
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "E6-V2 LE",
|
||||||
|
"url": "",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"width": 15,
|
||||||
|
"height": 5,
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.75}, {"label":"Ctrl", "x":1.75, "y":4, "w":1.25}, {"label":"Win", "x":3, "y":4, "w":1.25}, {"label":"Alt", "x":4.25, "y":4, "w":1.25}, {"x":5.5, "y":4, "w":2.75}, {"x":8.25, "y":4, "w":1.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[0] = LAYOUT(
|
||||||
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL,
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
|
||||||
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
|
||||||
|
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL,
|
||||||
|
KC_LCTL, KC_LGUI, KC_LALT, KC_MENU, KC_SPACE, KC_SPACE, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
|
||||||
|
),
|
||||||
|
};
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#include "le.h"
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
// put your keyboard start-up code here
|
||||||
|
// runs once when the firmware starts up
|
||||||
|
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
// put your looping keyboard code here
|
||||||
|
// runs every cycle (a lot)
|
||||||
|
|
||||||
|
matrix_scan_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
// put your per-action keyboard code here
|
||||||
|
// runs for every action, just before processing by the firmware
|
||||||
|
|
||||||
|
return process_record_user(keycode, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led) {
|
||||||
|
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
||||||
|
DDRB |= (1<<6);
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
// output low
|
||||||
|
DDRB |= (1<<2);
|
||||||
|
PORTB &= ~(1<<2);
|
||||||
|
} else {
|
||||||
|
// Hi-Z
|
||||||
|
DDRB &= ~(1<<2);
|
||||||
|
PORTB &= ~(1<<2);
|
||||||
|
}
|
||||||
|
// DDRB |= (1<<7);
|
||||||
|
// DDRB |= (1<<1);
|
||||||
|
// DDRB |= (1<<3);
|
||||||
|
// DDRE |= (1<<6);
|
||||||
|
if (usb_led == 0){
|
||||||
|
PORTB |= (1<<6);
|
||||||
|
// PORTB |= (1<<7);
|
||||||
|
// PORTB |= (1<<1);
|
||||||
|
// PORTB |= (1<<3);
|
||||||
|
// PORTE |= (1<<6);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
PORTB &= ~(1<<6);
|
||||||
|
// PORTB &= ~(1<<7);
|
||||||
|
}
|
||||||
|
|
||||||
|
led_set_user(usb_led);
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef LE_H
|
||||||
|
#define LE_H
|
||||||
|
|
||||||
|
#include "../e6v2.h"
|
||||||
|
|
||||||
|
#define LAYOUT( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
|
||||||
|
K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \
|
||||||
|
K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||||
|
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
|
||||||
|
K40, K42, K43, K44, K47, K49, K4A, K4B, K4C, K4D, K4E \
|
||||||
|
)\
|
||||||
|
{\
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
|
||||||
|
{ K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
|
||||||
|
{ K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO }, \
|
||||||
|
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
|
||||||
|
{ K40, KC_NO, K42, K43, K44, KC_NO, KC_NO, K47, KC_NO, K49, K4A, K4B, K4C, K4D, K4E }, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# E6-V2 Last Edition (LE)
|
||||||
|
|
||||||
|
These docs are for the QMK version of the PCB. [More info on qmk.fm](http://qmk.fm/)
|
||||||
|
|
||||||
|
Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
|
||||||
|
Hardware Supported: E6-V2 LE Mid Port rev.qmk
|
||||||
|
Hardware Availability: [geekhack.org/index.php?topic=90787.0](https://geekhack.org/index.php?topic=90787.0)
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make e6v2/le:default
|
||||||
|
|
||||||
|
Or to make and flash:
|
||||||
|
|
||||||
|
make e6v2/le:default:dfu
|
||||||
|
|
||||||
|
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1287
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# change yes to no to disable
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||||
|
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
|
||||||
|
RGBLIGHT_ENABLE = yes
|
||||||
|
MIDI_ENABLE = no # MIDI controls
|
||||||
|
UNICODE_ENABLE = no # Unicode
|
||||||
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
File renamed without changes.
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"keyboard_name": "E6-V2",
|
"keyboard_name": "E6-V2 OE",
|
||||||
"url": "",
|
"url": "",
|
||||||
"maintainer": "qmk",
|
"maintainer": "qmk",
|
||||||
"width": 15,
|
"width": 15,
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,53 @@
|
|||||||
|
#include "oe.h"
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
// put your keyboard start-up code here
|
||||||
|
// runs once when the firmware starts up
|
||||||
|
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matrix_scan_kb(void) {
|
||||||
|
// put your looping keyboard code here
|
||||||
|
// runs every cycle (a lot)
|
||||||
|
|
||||||
|
matrix_scan_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
// put your per-action keyboard code here
|
||||||
|
// runs for every action, just before processing by the firmware
|
||||||
|
|
||||||
|
return process_record_user(keycode, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led) {
|
||||||
|
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
||||||
|
DDRB |= (1<<6);
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
// output low
|
||||||
|
DDRB |= (1<<2);
|
||||||
|
PORTB &= ~(1<<2);
|
||||||
|
} else {
|
||||||
|
// Hi-Z
|
||||||
|
DDRB &= ~(1<<2);
|
||||||
|
PORTB &= ~(1<<2);
|
||||||
|
}
|
||||||
|
// DDRB |= (1<<7);
|
||||||
|
// DDRB |= (1<<1);
|
||||||
|
// DDRB |= (1<<3);
|
||||||
|
// DDRE |= (1<<6);
|
||||||
|
if (usb_led == 0){
|
||||||
|
PORTB |= (1<<6);
|
||||||
|
// PORTB |= (1<<7);
|
||||||
|
// PORTB |= (1<<1);
|
||||||
|
// PORTB |= (1<<3);
|
||||||
|
// PORTE |= (1<<6);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
PORTB &= ~(1<<6);
|
||||||
|
// PORTB &= ~(1<<7);
|
||||||
|
}
|
||||||
|
|
||||||
|
led_set_user(usb_led);
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
#ifndef OE_H
|
||||||
|
#define OE_H
|
||||||
|
|
||||||
|
#include "../e6v2.h"
|
||||||
|
|
||||||
|
#define LAYOUT( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||||
|
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||||
|
K40, K41, K42, K46, K4A, K4B, K4C, K4D \
|
||||||
|
)\
|
||||||
|
{\
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO }, \
|
||||||
|
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO }, \
|
||||||
|
{ K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, KC_NO }, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LAYOUT_60_ansi( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
|
||||||
|
K40, K41, K42, K46, K4A, K4B, K4C, K4D \
|
||||||
|
)\
|
||||||
|
{\
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, KC_NO }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \
|
||||||
|
{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO, KC_NO }, \
|
||||||
|
{ K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, KC_NO }, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LAYOUT_hhkb( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||||
|
K41, K42, K46, K4B, K4C \
|
||||||
|
)\
|
||||||
|
{\
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, KC_NO }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \
|
||||||
|
{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO }, \
|
||||||
|
{ KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, KC_NO }, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LAYOUT_hhkb_splits( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E,\
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||||
|
K41, K42, K46, K4B, K4C \
|
||||||
|
)\
|
||||||
|
{\
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \
|
||||||
|
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO }, \
|
||||||
|
{ KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, KC_NO }, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# E6-V2 Original Edition (OE)
|
||||||
|
|
||||||
|
These docs are for the QMK version of the PCB. [More info on qmk.fm](http://qmk.fm/)
|
||||||
|
|
||||||
|
Keyboard Maintainer: [amnesia0287](https://github.com/amnesia0287)
|
||||||
|
Hardware Supported: E6-V2 OE Mid Port rev.qmk
|
||||||
|
Hardware Availability: [geekhack.org/index.php?topic=90787.0](https://geekhack.org/index.php?topic=90787.0)
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make e6v2/oe:default
|
||||||
|
|
||||||
|
Or to make and flash:
|
||||||
|
|
||||||
|
make e6v2/oe:default:dfu
|
||||||
|
|
||||||
|
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1287
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# change yes to no to disable
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||||
|
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
|
||||||
|
RGBLIGHT_ENABLE = yes
|
||||||
|
MIDI_ENABLE = no # MIDI controls
|
||||||
|
UNICODE_ENABLE = no # Unicode
|
||||||
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
|
|
||||||
|
LAYOUTS = 60_ansi
|
||||||
@@ -1,18 +1,9 @@
|
|||||||
E6-V2
|
# E6-V2
|
||||||
===
|
|
||||||
|
|
||||||
These docs are for the QMK version of the PCB. [More info on qmk.fm](http://qmk.fm/)
|
These docs are for the QMK version of the PCB. [More info on qmk.fm](http://qmk.fm/)
|
||||||
|
|
||||||
Keyboard Maintainer: [amnesia0287](https://github.com/amnesia0287)
|
The E6V2 has been available with either a bootmapper client or QMK powered PCB. During the second round, the QMK powered PCB was redesigned and used different ports and a different switch matrix.
|
||||||
Hardware Supported: E6-V2 Mid Port rev.qmk
|
|
||||||
Hardware Availability: [geekhack.org/index.php?topic=90787.0](https://geekhack.org/index.php?topic=90787.0)
|
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
Please use the appropriate version when making your firmware.
|
||||||
|
|
||||||
make e6v2:default
|
|
||||||
|
|
||||||
Or to make and flash:
|
|
||||||
|
|
||||||
make e6v2:default:dfu
|
|
||||||
|
|
||||||
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
|
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
|
||||||
+1
-70
@@ -1,70 +1 @@
|
|||||||
# MCU name
|
DEFAULT_FOLDER = e6v2/oe
|
||||||
#MCU = at90usb1287
|
|
||||||
MCU = atmega32u4
|
|
||||||
|
|
||||||
# Processor frequency.
|
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
|
||||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
|
||||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
|
||||||
# automatically to create a 32-bit value in your source code.
|
|
||||||
#
|
|
||||||
# This will be an integer division of F_USB below, as it is sourced by
|
|
||||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
|
||||||
# does not *change* the processor frequency - it should merely be updated to
|
|
||||||
# reflect the processor speed set externally so that the code can use accurate
|
|
||||||
# software delays.
|
|
||||||
F_CPU = 16000000
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# LUFA specific
|
|
||||||
#
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
|
||||||
ARCH = AVR8
|
|
||||||
|
|
||||||
# Input clock frequency.
|
|
||||||
# This will define a symbol, F_USB, in all source code files equal to the
|
|
||||||
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
|
||||||
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
|
||||||
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
|
||||||
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
|
||||||
# at the end, this will be done automatically to create a 32-bit value in your
|
|
||||||
# source code.
|
|
||||||
#
|
|
||||||
# If no clock division is performed on the input clock inside the AVR (via the
|
|
||||||
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
|
||||||
F_USB = $(F_CPU)
|
|
||||||
|
|
||||||
# Interrupt driven control endpoint task(+60)
|
|
||||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
|
||||||
|
|
||||||
|
|
||||||
# Boot Section Size in *bytes*
|
|
||||||
# Teensy halfKay 512
|
|
||||||
# Teensy++ halfKay 1024
|
|
||||||
# Atmel DFU loader 4096
|
|
||||||
# LUFA bootloader 4096
|
|
||||||
# USBaspLoader 2048
|
|
||||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
|
||||||
|
|
||||||
|
|
||||||
# Build Options
|
|
||||||
# change yes to no to disable
|
|
||||||
#
|
|
||||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
|
||||||
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
|
||||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
|
||||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
|
||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
|
||||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
|
||||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
|
||||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
|
|
||||||
RGBLIGHT_ENABLE = yes
|
|
||||||
MIDI_ENABLE = no # MIDI controls
|
|
||||||
UNICODE_ENABLE = no # Unicode
|
|
||||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
|
||||||
AUDIO_ENABLE = no # Audio output on port C6
|
|
||||||
|
|
||||||
LAYOUTS = 60_ansi
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2012 Jun Wako <wakojun@gmail.com>
|
Copyright 2017 Danny Nguyen <danny@keeb.io>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -31,6 +31,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
#include "backlight.h"
|
||||||
|
extern backlight_config_t backlight_config;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USE_I2C
|
#ifdef USE_I2C
|
||||||
# include "i2c.h"
|
# include "i2c.h"
|
||||||
#else // USE_SERIAL
|
#else // USE_SERIAL
|
||||||
@@ -58,6 +63,8 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS];
|
|||||||
|
|
||||||
#define ERROR_DISCONNECT_COUNT 5
|
#define ERROR_DISCONNECT_COUNT 5
|
||||||
|
|
||||||
|
#define SERIAL_LED_ADDR 0x00
|
||||||
|
|
||||||
#define ROWS_PER_HAND (MATRIX_ROWS/2)
|
#define ROWS_PER_HAND (MATRIX_ROWS/2)
|
||||||
|
|
||||||
static uint8_t error_count = 0;
|
static uint8_t error_count = 0;
|
||||||
@@ -201,6 +208,15 @@ int i2c_transaction(void) {
|
|||||||
err = i2c_master_write(0x00);
|
err = i2c_master_write(0x00);
|
||||||
if (err) goto i2c_error;
|
if (err) goto i2c_error;
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
// Write backlight level for slave to read
|
||||||
|
err = i2c_master_write(backlight_config.enable ? backlight_config.level : 0);
|
||||||
|
#else
|
||||||
|
// Write zero, so our byte index is the same
|
||||||
|
err = i2c_master_write(0x00);
|
||||||
|
#endif
|
||||||
|
if (err) goto i2c_error;
|
||||||
|
|
||||||
// Start read
|
// Start read
|
||||||
err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
|
err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
|
||||||
if (err) goto i2c_error;
|
if (err) goto i2c_error;
|
||||||
@@ -233,6 +249,11 @@ int serial_transaction(void) {
|
|||||||
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
||||||
matrix[slaveOffset+i] = serial_slave_buffer[i];
|
matrix[slaveOffset+i] = serial_slave_buffer[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
// Write backlight level for slave to read
|
||||||
|
serial_master_buffer[SERIAL_LED_ADDR] = backlight_config.enable ? backlight_config.level : 0;
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -273,13 +294,22 @@ void matrix_slave_scan(void) {
|
|||||||
int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
|
int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
|
||||||
|
|
||||||
#ifdef USE_I2C
|
#ifdef USE_I2C
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
// Read backlight level sent from master and update level on slave
|
||||||
|
backlight_set(i2c_slave_buffer[0]);
|
||||||
|
#endif
|
||||||
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
||||||
i2c_slave_buffer[i] = matrix[offset+i];
|
i2c_slave_buffer[i+1] = matrix[offset+i];
|
||||||
}
|
}
|
||||||
#else // USE_SERIAL
|
#else // USE_SERIAL
|
||||||
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
for (int i = 0; i < ROWS_PER_HAND; ++i) {
|
||||||
serial_slave_buffer[i] = matrix[offset+i];
|
serial_slave_buffer[i] = matrix[offset+i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BACKLIGHT_ENABLE
|
||||||
|
// Read backlight level sent from master and update level on slave
|
||||||
|
backlight_set(serial_master_buffer[SERIAL_LED_ADDR]);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#ifdef BACKLIGHT_ENABLE
|
#ifdef BACKLIGHT_ENABLE
|
||||||
#define BACKLIGHT_PIN B6
|
#define BACKLIGHT_PIN B6
|
||||||
#define BACKLIGHT_LEVELS 7
|
#define BACKLIGHT_LEVELS 7
|
||||||
#define BACKLIGHT_BREATHING
|
// #define BACKLIGHT_BREATHING
|
||||||
#define BREATHING_PERIOD 4
|
// #define BREATHING_PERIOD 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set 0 if debouncing isn't needed */
|
/* Set 0 if debouncing isn't needed */
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ The ErgoDone is a modified version of the ErgoDox, made by K.T.E.C., with pre-so
|
|||||||
|
|
||||||
# Building the firmware
|
# Building the firmware
|
||||||
|
|
||||||
[Install the build tools.](https://docs.qmk.fm/getting_started_build_tools.html)
|
[Install the build tools.](https://docs.qmk.fm/#/getting_started_build_tools)
|
||||||
|
|
||||||
In the root directory of the repository, build the firmware with a command like:
|
In the root directory of the repository, build the firmware with a command like:
|
||||||
|
|
||||||
make ergodone:default
|
make ergodone:default
|
||||||
|
|
||||||
For more information on the layout option and other ones, see the [`make` guide](https://docs.qmk.fm/getting_started_make_guide.html).
|
For more information on the layout option and other ones, see the [`make` guide](https://docs.qmk.fm/#/getting_started_make_guide).
|
||||||
|
|
||||||
# Flashing the firmware onto the keyboard
|
# Flashing the firmware onto the keyboard
|
||||||
|
|
||||||
|
|||||||
@@ -81,10 +81,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
/* fix space cadet rollover issue */
|
/* fix space cadet rollover issue */
|
||||||
#define DISABLE_SPACE_CADET_ROLLOVER
|
#define DISABLE_SPACE_CADET_ROLLOVER
|
||||||
|
|
||||||
// #define RGB_MIDI
|
// #define RGBW_BB_TWI
|
||||||
#define RGBW_BB_TWI
|
|
||||||
|
|
||||||
#define RGBW 1
|
// #define RGBW 1
|
||||||
|
|
||||||
/* "debounce" is measured in keyboard scans. Some users reported
|
/* "debounce" is measured in keyboard scans. Some users reported
|
||||||
* needing values as high as 15, which was at the time around 50ms.
|
* needing values as high as 15, which was at the time around 50ms.
|
||||||
@@ -102,6 +101,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#define USB_MAX_POWER_CONSUMPTION 500
|
#define USB_MAX_POWER_CONSUMPTION 500
|
||||||
|
|
||||||
|
// RGB backlight
|
||||||
|
#define DRIVER_ADDR_1 0b1110100
|
||||||
|
#define DRIVER_ADDR_2 0b1110111
|
||||||
|
#define DRIVER_COUNT 2
|
||||||
|
#define DRIVER_1_LED_TOTAL 24
|
||||||
|
#define DRIVER_2_LED_TOTAL 24
|
||||||
|
#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL
|
||||||
|
#define RGB_MATRIX_SKIP_FRAMES 10
|
||||||
|
|
||||||
// #define RGBLIGHT_COLOR_LAYER_0 0x00, 0x00, 0xFF
|
// #define RGBLIGHT_COLOR_LAYER_0 0x00, 0x00, 0xFF
|
||||||
/* #define RGBLIGHT_COLOR_LAYER_1 0x00, 0x00, 0xFF */
|
/* #define RGBLIGHT_COLOR_LAYER_1 0x00, 0x00, 0xFF */
|
||||||
/* #define RGBLIGHT_COLOR_LAYER_2 0xFF, 0x00, 0x00 */
|
/* #define RGBLIGHT_COLOR_LAYER_2 0xFF, 0x00, 0x00 */
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
#include "i2cmaster.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline void ergodox_board_led_on(void);
|
extern inline void ergodox_board_led_on(void);
|
||||||
extern inline void ergodox_right_led_1_on(void);
|
extern inline void ergodox_right_led_1_on(void);
|
||||||
@@ -24,9 +22,8 @@ extern inline void ergodox_right_led_set(uint8_t led, uint8_t n);
|
|||||||
|
|
||||||
extern inline void ergodox_led_all_set(uint8_t n);
|
extern inline void ergodox_led_all_set(uint8_t n);
|
||||||
|
|
||||||
|
|
||||||
bool i2c_initialized = 0;
|
bool i2c_initialized = 0;
|
||||||
uint8_t mcp23018_status = 0x20;
|
i2c_status_t mcp23018_status = 0x20;
|
||||||
|
|
||||||
void matrix_init_kb(void) {
|
void matrix_init_kb(void) {
|
||||||
// keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
|
// keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
|
||||||
@@ -114,33 +111,36 @@ uint8_t init_mcp23018(void) {
|
|||||||
// uint8_t sreg_prev;
|
// uint8_t sreg_prev;
|
||||||
// sreg_prev=SREG;
|
// sreg_prev=SREG;
|
||||||
// cli();
|
// cli();
|
||||||
|
|
||||||
if (i2c_initialized == 0) {
|
if (i2c_initialized == 0) {
|
||||||
i2c_init(); // on pins D(1,0)
|
i2c_init(); // on pins D(1,0)
|
||||||
i2c_initialized = true;
|
i2c_initialized = true;
|
||||||
_delay_ms(1000);
|
_delay_ms(1000);
|
||||||
}
|
}
|
||||||
|
// i2c_init(); // on pins D(1,0)
|
||||||
|
// _delay_ms(1000);
|
||||||
|
|
||||||
// set pin direction
|
// set pin direction
|
||||||
// - unused : input : 1
|
// - unused : input : 1
|
||||||
// - input : input : 1
|
// - input : input : 1
|
||||||
// - driving : output : 0
|
// - driving : output : 0
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(IODIRA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
i2c_stop();
|
i2c_stop(ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
|
|
||||||
// set pull-up
|
// set pull-up
|
||||||
// - unused : on : 1
|
// - unused : on : 1
|
||||||
// - input : on : 1
|
// - input : on : 1
|
||||||
// - driving : off : 0
|
// - driving : off : 0
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(GPPUA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(0b00000000, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(0b00111111, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
i2c_stop();
|
i2c_stop(ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
|
|
||||||
#ifdef LEFT_LEDS
|
#ifdef LEFT_LEDS
|
||||||
if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
|
if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
|
||||||
@@ -164,22 +164,22 @@ uint8_t ergodox_left_leds_update(void) {
|
|||||||
// - unused : hi-Z : 1
|
// - unused : hi-Z : 1
|
||||||
// - input : hi-Z : 1
|
// - input : hi-Z : 1
|
||||||
// - driving : hi-Z : 1
|
// - driving : hi-Z : 1
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE);
|
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
if (mcp23018_status) goto out;
|
if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(OLATA);
|
mcp23018_status = i2c_write(OLATA, ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
if (mcp23018_status) goto out;
|
if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(0b11111111
|
mcp23018_status = i2c_write(0b11111111
|
||||||
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
|
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT),
|
||||||
);
|
ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
if (mcp23018_status) goto out;
|
if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(0b11111111
|
mcp23018_status = i2c_write(0b11111111
|
||||||
& ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
|
& ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
|
||||||
& ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
|
& ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT),
|
||||||
);
|
ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
if (mcp23018_status) goto out;
|
if (mcp23018_status) goto out;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
i2c_stop();
|
i2c_stop(ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
return mcp23018_status;
|
return mcp23018_status;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -207,3 +207,130 @@ const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
{{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
|
{{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RGB_MATRIX_ENABLE
|
||||||
|
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||||
|
/* driver
|
||||||
|
* | R location
|
||||||
|
* | | G location
|
||||||
|
* | | | B location
|
||||||
|
* | | | | */
|
||||||
|
{0, C3_1, C2_1, C4_1}, // LED1 on right
|
||||||
|
{0, C6_1, C5_1, C7_1}, // LED2
|
||||||
|
{0, C4_2, C3_2, C5_2}, // LED3
|
||||||
|
{0, C7_2, C6_2, C8_2}, // LED4
|
||||||
|
{0, C2_3, C1_3, C3_3}, // LED5
|
||||||
|
{0, C5_3, C4_3, C6_3}, // LED6
|
||||||
|
{0, C8_3, C7_3, C9_3}, // LED7
|
||||||
|
{0, C2_4, C1_4, C3_4}, // LED8
|
||||||
|
{0, C6_4, C5_4, C7_4}, // LED9
|
||||||
|
{0, C2_5, C1_5, C3_5}, // LED10
|
||||||
|
{0, C7_5, C6_5, C8_5}, // LED11
|
||||||
|
{0, C2_6, C1_6, C3_6}, // LED12
|
||||||
|
{0, C5_6, C4_6, C6_6}, // LED13
|
||||||
|
{0, C8_6, C7_6, C9_6}, // LED14
|
||||||
|
{0, C2_7, C1_7, C3_7}, // LED15
|
||||||
|
{0, C5_7, C4_7, C6_7}, // LED16
|
||||||
|
{0, C2_8, C1_8, C3_8}, // LED17
|
||||||
|
{0, C5_8, C4_8, C6_8}, // LED18
|
||||||
|
|
||||||
|
{0, C3_9, C2_9, C4_9}, // LED19
|
||||||
|
{0, C6_9, C5_9, C7_9}, // LED20
|
||||||
|
{0, C4_10, C3_10, C5_10}, // LED21
|
||||||
|
{0, C7_10, C6_10, C8_10}, // LED22
|
||||||
|
{0, C2_11, C1_11, C3_11}, // LED23
|
||||||
|
{0, C5_11, C4_11, C6_11}, // LED24
|
||||||
|
|
||||||
|
{1, C3_1, C2_1, C4_1}, // LED1 on left
|
||||||
|
{1, C6_1, C5_1, C7_1}, // LED2
|
||||||
|
{1, C4_2, C3_2, C5_2}, // LED3
|
||||||
|
{1, C7_2, C6_2, C8_2}, // LED4
|
||||||
|
{1, C2_3, C1_3, C3_3}, // LED5
|
||||||
|
{1, C5_3, C4_3, C6_3}, // LED6
|
||||||
|
{1, C8_3, C7_3, C9_3}, // LED7
|
||||||
|
{1, C2_4, C1_4, C3_4}, // LED8
|
||||||
|
{1, C6_4, C5_4, C7_4}, // LED9
|
||||||
|
{1, C2_5, C1_5, C3_5}, // LED10
|
||||||
|
{1, C7_5, C6_5, C8_5}, // LED11
|
||||||
|
{1, C2_6, C1_6, C3_6}, // LED12
|
||||||
|
{1, C5_6, C4_6, C6_6}, // LED13
|
||||||
|
{1, C8_6, C7_6, C9_6}, // LED14
|
||||||
|
{1, C2_7, C1_7, C3_7}, // LED15
|
||||||
|
{1, C5_7, C4_7, C6_7}, // LED16
|
||||||
|
{1, C2_8, C1_8, C3_8}, // LED17
|
||||||
|
{1, C5_8, C4_8, C6_8}, // LED18
|
||||||
|
|
||||||
|
{1, C3_9, C2_9, C4_9}, // LED19
|
||||||
|
{1, C6_9, C5_9, C7_9}, // LED20
|
||||||
|
{1, C4_10, C3_10, C5_10}, // LED21
|
||||||
|
{1, C7_10, C6_10, C8_10}, // LED22
|
||||||
|
{1, C2_11, C1_11, C3_11}, // LED23
|
||||||
|
{1, C5_11, C4_11, C6_11} // LED24
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = {
|
||||||
|
|
||||||
|
/*{row | col << 4}
|
||||||
|
| {x=0..224, y=0..64}
|
||||||
|
| | modifier
|
||||||
|
| | | */
|
||||||
|
{{0|(0<<4)}, {24.9*5, 16*0}, 0}, // LED 1 on right
|
||||||
|
{{0|(1<<4)}, {24.9*6, 16*0}, 0}, // LED 2
|
||||||
|
{{0|(2<<4)}, {24.9*7, 16*0}, 0}, // LED 3
|
||||||
|
{{0|(3<<4)}, {24.9*8, 16*0}, 0}, // LED 4
|
||||||
|
{{0|(4<<4)}, {24.9*9, 16*0}, 0}, // LED 5
|
||||||
|
|
||||||
|
{{1|(5<<4)}, {24.9*5, 16*1}, 0}, // LED 6
|
||||||
|
{{1|(6<<4)}, {24.9*6, 16*1}, 0}, // LED 7
|
||||||
|
{{1|(7<<4)}, {24.9*7, 16*1}, 0}, // LED 8
|
||||||
|
{{1|(8<<4)}, {24.9*8, 16*1}, 0}, // LED 9
|
||||||
|
{{1|(9<<4)}, {24.9*9, 16*1}, 0}, // LED 10
|
||||||
|
|
||||||
|
{{2|(5<<4)}, {24.9*5, 16*2}, 0}, // LED 11
|
||||||
|
{{2|(6<<4)}, {24.9*6, 16*2}, 0}, // LED 12
|
||||||
|
{{2|(7<<4)}, {24.9*7, 16*2}, 0}, // LED 13
|
||||||
|
{{2|(8<<4)}, {24.9*8, 16*2}, 0}, // LED 14
|
||||||
|
{{2|(9<<4)}, {24.9*9, 16*2}, 0}, // LED 15
|
||||||
|
|
||||||
|
{{3|(5<<4)}, {24.9*5, 16*2}, 0}, // LED 16
|
||||||
|
{{3|(6<<4)}, {24.9*6, 16*2}, 0}, // LED 17
|
||||||
|
{{3|(7<<4)}, {24.9*7, 16*2}, 0}, // LED 18
|
||||||
|
{{3|(8<<4)}, {24.9*8, 16*2}, 0}, // LED 19
|
||||||
|
{{3|(9<<4)}, {24.9*9, 16*2}, 0}, // LED 20
|
||||||
|
|
||||||
|
{{4|(6<<4)}, {24.9*6, 16*2}, 0}, // LED 21
|
||||||
|
{{4|(7<<4)}, {24.9*7, 16*2}, 0}, // LED 22
|
||||||
|
{{4|(8<<4)}, {24.9*8, 16*2}, 0}, // LED 23
|
||||||
|
{{4|(9<<4)}, {24.9*9, 16*2}, 0}, // LED 24
|
||||||
|
|
||||||
|
{{0|(0<<4)}, {24.9*4, 16*0}, 0}, // LED 1 on left
|
||||||
|
{{0|(1<<4)}, {24.9*3, 16*0}, 0}, // LED 2
|
||||||
|
{{0|(2<<4)}, {24.9*2, 16*0}, 0}, // LED 3
|
||||||
|
{{0|(3<<4)}, {24.9*1, 16*0}, 0}, // LED 4
|
||||||
|
{{0|(4<<4)}, {24.9*0, 16*0}, 0}, // LED 5
|
||||||
|
|
||||||
|
{{1|(5<<4)}, {24.9*4, 16*1}, 0}, // LED 6
|
||||||
|
{{1|(6<<4)}, {24.9*3, 16*1}, 0}, // LED 7
|
||||||
|
{{1|(7<<4)}, {24.9*2, 16*1}, 0}, // LED 8
|
||||||
|
{{1|(8<<4)}, {24.9*1, 16*1}, 0}, // LED 9
|
||||||
|
{{1|(9<<4)}, {24.9*0, 16*1}, 0}, // LED 10
|
||||||
|
|
||||||
|
{{2|(5<<4)}, {24.9*4, 16*2}, 0}, // LED 11
|
||||||
|
{{2|(6<<4)}, {24.9*3, 16*2}, 0}, // LED 12
|
||||||
|
{{2|(7<<4)}, {24.9*2, 16*2}, 0}, // LED 13
|
||||||
|
{{2|(8<<4)}, {24.9*1, 16*2}, 0}, // LED 14
|
||||||
|
{{2|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 15
|
||||||
|
|
||||||
|
{{3|(5<<4)}, {24.9*4, 16*2}, 0}, // LED 16
|
||||||
|
{{3|(6<<4)}, {24.9*3, 16*2}, 0}, // LED 17
|
||||||
|
{{3|(7<<4)}, {24.9*2, 16*2}, 0}, // LED 18
|
||||||
|
{{3|(8<<4)}, {24.9*1, 16*2}, 0}, // LED 19
|
||||||
|
{{3|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 20
|
||||||
|
|
||||||
|
{{4|(6<<4)}, {24.9*3, 16*2}, 0}, // LED 21
|
||||||
|
{{4|(7<<4)}, {24.9*2, 16*2}, 0}, // LED 22
|
||||||
|
{{4|(8<<4)}, {24.9*1, 16*2}, 0}, // LED 23
|
||||||
|
{{4|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 24
|
||||||
|
};
|
||||||
|
#endif
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "i2cmaster.h"
|
#include "i2c_master.h"
|
||||||
#include <util/delay.h>
|
#include <util/delay.h>
|
||||||
|
|
||||||
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
|
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
|
||||||
@@ -23,7 +23,8 @@
|
|||||||
#define OLATA 0x14 // output latch register
|
#define OLATA 0x14 // output latch register
|
||||||
#define OLATB 0x15
|
#define OLATB 0x15
|
||||||
|
|
||||||
extern uint8_t mcp23018_status;
|
extern i2c_status_t mcp23018_status;
|
||||||
|
#define ERGODOX_EZ_I2C_TIMEOUT 100
|
||||||
|
|
||||||
void init_ergodox(void);
|
void init_ergodox(void);
|
||||||
void ergodox_blink_all_leds(void);
|
void ergodox_blink_all_leds(void);
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "matrix.h"
|
#include "matrix.h"
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
#include "i2cmaster.h"
|
|
||||||
#ifdef DEBUG_MATRIX_SCAN_RATE
|
#ifdef DEBUG_MATRIX_SCAN_RATE
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -70,6 +69,7 @@ static void unselect_rows(void);
|
|||||||
static void select_row(uint8_t row);
|
static void select_row(uint8_t row);
|
||||||
|
|
||||||
static uint8_t mcp23018_reset_loop;
|
static uint8_t mcp23018_reset_loop;
|
||||||
|
// static uint16_t mcp23018_reset_loop;
|
||||||
|
|
||||||
#ifdef DEBUG_MATRIX_SCAN_RATE
|
#ifdef DEBUG_MATRIX_SCAN_RATE
|
||||||
uint32_t matrix_timer;
|
uint32_t matrix_timer;
|
||||||
@@ -177,6 +177,7 @@ uint8_t matrix_scan(void)
|
|||||||
{
|
{
|
||||||
if (mcp23018_status) { // if there was an error
|
if (mcp23018_status) { // if there was an error
|
||||||
if (++mcp23018_reset_loop == 0) {
|
if (++mcp23018_reset_loop == 0) {
|
||||||
|
// if (++mcp23018_reset_loop >= 1300) {
|
||||||
// since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
|
// since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
|
||||||
// this will be approx bit more frequent than once per second
|
// this will be approx bit more frequent than once per second
|
||||||
print("trying to reset mcp23018\n");
|
print("trying to reset mcp23018\n");
|
||||||
@@ -294,13 +295,14 @@ static matrix_row_t read_cols(uint8_t row)
|
|||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
uint8_t data = 0;
|
uint8_t data = 0;
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(GPIOB); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(GPIOB, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_READ); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_start(I2C_ADDR_READ, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
data = i2c_readNak();
|
mcp23018_status = i2c_read_nack(ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status < 0) goto out;
|
||||||
data = ~data;
|
data = ~((uint8_t)mcp23018_status);
|
||||||
|
mcp23018_status = I2C_STATUS_SUCCESS;
|
||||||
out:
|
out:
|
||||||
i2c_stop();
|
i2c_stop(ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -349,11 +351,11 @@ static void select_row(uint8_t row)
|
|||||||
} else {
|
} else {
|
||||||
// set active row low : 0
|
// set active row low : 0
|
||||||
// set other rows hi-Z : 1
|
// set other rows hi-Z : 1
|
||||||
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(GPIOA, ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
mcp23018_status = i2c_write(0xFF & ~(1<<row)); if (mcp23018_status) goto out;
|
mcp23018_status = i2c_write(0xFF & ~(1<<row), ERGODOX_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
|
||||||
out:
|
out:
|
||||||
i2c_stop();
|
i2c_stop(ERGODOX_EZ_I2C_TIMEOUT);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// select on teensy
|
// select on teensy
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
# # project specific files
|
# # project specific files
|
||||||
SRC = twimaster.c \
|
SRC = matrix.c \
|
||||||
matrix.c
|
i2c_master.c
|
||||||
|
|
||||||
# MCU name
|
# MCU name
|
||||||
MCU = atmega32u4
|
MCU = atmega32u4
|
||||||
@@ -82,6 +82,7 @@ UNICODE_ENABLE = yes # Unicode
|
|||||||
SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard
|
SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard
|
||||||
SLEEP_LED_ENABLE = no
|
SLEEP_LED_ENABLE = no
|
||||||
API_SYSEX_ENABLE = no
|
API_SYSEX_ENABLE = no
|
||||||
RGBLIGHT_ENABLE = yes
|
RGBLIGHT_ENABLE = no
|
||||||
|
RGB_MATRIX_ENABLE = yes
|
||||||
|
|
||||||
LAYOUTS = ergodox
|
LAYOUTS = ergodox
|
||||||
@@ -21,6 +21,7 @@ enum custom_keycodes {
|
|||||||
#define XXXXXXX KC_NO
|
#define XXXXXXX KC_NO
|
||||||
#define KC_FN1 MO(_FN1)
|
#define KC_FN1 MO(_FN1)
|
||||||
#define KC_FN2 MO(_FN2)
|
#define KC_FN2 MO(_FN2)
|
||||||
|
#define KC_ESFN1 LT(_FN1, KC_ESC)
|
||||||
#define KC_SPFN1 LT(_FN1, KC_SPACE)
|
#define KC_SPFN1 LT(_FN1, KC_SPACE)
|
||||||
#define KC_SPFN2 LT(_FN2, KC_SPACE)
|
#define KC_SPFN2 LT(_FN2, KC_SPACE)
|
||||||
#define KC_BSFN1 LT(_FN1, KC_BSPC)
|
#define KC_BSFN1 LT(_FN1, KC_BSPC)
|
||||||
|
|||||||
@@ -510,7 +510,14 @@ void music_scale_user(void)
|
|||||||
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
|
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
|
||||||
#ifdef SSD1306OLED
|
#ifdef SSD1306OLED
|
||||||
|
|
||||||
|
// hook point for 'led_test' keymap
|
||||||
|
// 'default' keymap's led_test_init() is empty function, do nothing
|
||||||
|
// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35);
|
||||||
|
__attribute__ ((weak))
|
||||||
|
void led_test_init(void) {}
|
||||||
|
|
||||||
void matrix_scan_user(void) {
|
void matrix_scan_user(void) {
|
||||||
|
led_test_init();
|
||||||
iota_gfx_task(); // this is what updates the display continuously
|
iota_gfx_task(); // this is what updates the display continuously
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,618 +1 @@
|
|||||||
#include QMK_KEYBOARD_H
|
#include "../default/keymap.c"
|
||||||
#include "bootloader.h"
|
|
||||||
#ifdef PROTOCOL_LUFA
|
|
||||||
#include "lufa.h"
|
|
||||||
#include "split_util.h"
|
|
||||||
#endif
|
|
||||||
#ifdef AUDIO_ENABLE
|
|
||||||
#include "audio.h"
|
|
||||||
#endif
|
|
||||||
#ifdef SSD1306OLED
|
|
||||||
#include "ssd1306.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern keymap_config_t keymap_config;
|
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
//Following line allows macro to read current RGB settings
|
|
||||||
extern rgblight_config_t rgblight_config;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern uint8_t is_master;
|
|
||||||
|
|
||||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
|
||||||
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
|
||||||
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
|
||||||
// entirely and just use numbers.
|
|
||||||
#define _QWERTY 0
|
|
||||||
#define _COLEMAK 1
|
|
||||||
#define _DVORAK 2
|
|
||||||
#define _LOWER 3
|
|
||||||
#define _RAISE 4
|
|
||||||
#define _ADJUST 6
|
|
||||||
|
|
||||||
enum custom_keycodes {
|
|
||||||
QWERTY = SAFE_RANGE,
|
|
||||||
COLEMAK,
|
|
||||||
DVORAK,
|
|
||||||
LOWER,
|
|
||||||
RAISE,
|
|
||||||
ADJUST,
|
|
||||||
BACKLIT,
|
|
||||||
EISU,
|
|
||||||
KANA,
|
|
||||||
RGBRST
|
|
||||||
};
|
|
||||||
|
|
||||||
enum macro_keycodes {
|
|
||||||
KC_SAMPLEMACRO,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Fillers to make layering more clear
|
|
||||||
#define _______ KC_TRNS
|
|
||||||
#define XXXXXXX KC_NO
|
|
||||||
//Macros
|
|
||||||
#define M_SAMPLE M(KC_SAMPLEMACRO)
|
|
||||||
|
|
||||||
#if HELIX_ROWS == 5
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
|
|
||||||
/* Qwerty
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_QWERTY] = LAYOUT( \
|
|
||||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
|
|
||||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
|
|
||||||
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
|
|
||||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
|
|
||||||
ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Colemak
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_COLEMAK] = LAYOUT( \
|
|
||||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
|
|
||||||
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \
|
|
||||||
KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \
|
|
||||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
|
|
||||||
ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Dvorak
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_DVORAK] = LAYOUT( \
|
|
||||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
|
|
||||||
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \
|
|
||||||
KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
|
|
||||||
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LBRC, KC_RBRC, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \
|
|
||||||
ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Lower
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_LOWER] = LAYOUT( \
|
|
||||||
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
|
|
||||||
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
|
|
||||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
|
|
||||||
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_LPRN, KC_RPRN, KC_F12, _______, _______, KC_HOME, KC_END, _______, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Raise
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_RAISE] = LAYOUT( \
|
|
||||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
|
|
||||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
|
|
||||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
|
|
||||||
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Adjust (Lower + Raise)
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | Reset|RGBRST| | | | | | | | | | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ |
|
|
||||||
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | | | MODE | HUE- | SAT- | VAL- |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_ADJUST] = LAYOUT( \
|
|
||||||
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \
|
|
||||||
_______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
|
|
||||||
_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
#elif HELIX_ROWS == 4
|
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
|
|
||||||
/* Qwerty
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter |
|
|
||||||
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
|
|
||||||
* |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_QWERTY] = LAYOUT( \
|
|
||||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
|
|
||||||
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
|
|
||||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
|
|
||||||
ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Colemak
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter |
|
|
||||||
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
|
|
||||||
* |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_COLEMAK] = LAYOUT( \
|
|
||||||
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \
|
|
||||||
KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \
|
|
||||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
|
|
||||||
ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Dvorak
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter |
|
|
||||||
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
|
|
||||||
* |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_DVORAK] = LAYOUT( \
|
|
||||||
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \
|
|
||||||
KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
|
|
||||||
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \
|
|
||||||
ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Lower
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | F7 | F8 | F9 | F10 | F11 | | F12 | | | Home | End | |
|
|
||||||
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_LOWER] = LAYOUT( \
|
|
||||||
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
|
|
||||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
|
|
||||||
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_HOME, KC_END, _______, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Raise
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | F7 | F8 | F9 | F10 | F11 | | F12 | | |PageDn|PageUp| |
|
|
||||||
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_RAISE] = LAYOUT( \
|
|
||||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
|
|
||||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
|
|
||||||
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
|
|
||||||
),
|
|
||||||
|
|
||||||
/* Adjust (Lower + Raise)
|
|
||||||
* ,-----------------------------------------. ,-----------------------------------------.
|
|
||||||
* | | Reset| | | | | | | | | | | Del |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | |
|
|
||||||
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ |
|
|
||||||
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
|
|
||||||
* | | | | | | | | | | | MODE | HUE- | SAT- | VAL- |
|
|
||||||
* `-------------------------------------------------------------------------------------------------'
|
|
||||||
*/
|
|
||||||
[_ADJUST] = LAYOUT( \
|
|
||||||
_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
|
|
||||||
_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \
|
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
#error "undefined keymaps"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef AUDIO_ENABLE
|
|
||||||
|
|
||||||
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
|
|
||||||
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
|
|
||||||
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
|
|
||||||
float tone_plover[][2] = SONG(PLOVER_SOUND);
|
|
||||||
float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
|
|
||||||
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// define variables for reactive RGB
|
|
||||||
bool TOG_STATUS = false;
|
|
||||||
int RGB_current_mode;
|
|
||||||
|
|
||||||
void persistent_default_layer_set(uint16_t default_layer) {
|
|
||||||
eeconfig_update_default_layer(default_layer);
|
|
||||||
default_layer_set(default_layer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setting ADJUST layer RGB back to default
|
|
||||||
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
|
|
||||||
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
//rgblight_mode(RGB_current_mode);
|
|
||||||
#endif
|
|
||||||
layer_on(layer3);
|
|
||||||
} else {
|
|
||||||
layer_off(layer3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|
||||||
switch (keycode) {
|
|
||||||
case QWERTY:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
#ifdef AUDIO_ENABLE
|
|
||||||
PLAY_SONG(tone_qwerty);
|
|
||||||
#endif
|
|
||||||
persistent_default_layer_set(1UL<<_QWERTY);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case COLEMAK:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
#ifdef AUDIO_ENABLE
|
|
||||||
PLAY_SONG(tone_colemak);
|
|
||||||
#endif
|
|
||||||
persistent_default_layer_set(1UL<<_COLEMAK);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case DVORAK:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
#ifdef AUDIO_ENABLE
|
|
||||||
PLAY_SONG(tone_dvorak);
|
|
||||||
#endif
|
|
||||||
persistent_default_layer_set(1UL<<_DVORAK);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case LOWER:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
//not sure how to have keyboard check mode and set it to a variable, so my work around
|
|
||||||
//uses another variable that would be set to true after the first time a reactive key is pressed.
|
|
||||||
if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
|
|
||||||
} else {
|
|
||||||
TOG_STATUS = !TOG_STATUS;
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
//rgblight_mode(16);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
layer_on(_LOWER);
|
|
||||||
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
||||||
} else {
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
//rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change
|
|
||||||
#endif
|
|
||||||
TOG_STATUS = false;
|
|
||||||
layer_off(_LOWER);
|
|
||||||
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case RAISE:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
//not sure how to have keyboard check mode and set it to a variable, so my work around
|
|
||||||
//uses another variable that would be set to true after the first time a reactive key is pressed.
|
|
||||||
if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
|
|
||||||
} else {
|
|
||||||
TOG_STATUS = !TOG_STATUS;
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
//rgblight_mode(15);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
layer_on(_RAISE);
|
|
||||||
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
||||||
} else {
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
//rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change
|
|
||||||
#endif
|
|
||||||
layer_off(_RAISE);
|
|
||||||
TOG_STATUS = false;
|
|
||||||
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case ADJUST:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
layer_on(_ADJUST);
|
|
||||||
} else {
|
|
||||||
layer_off(_ADJUST);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
|
|
||||||
case RGB_MOD:
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
if (record->event.pressed) {
|
|
||||||
rgblight_mode(RGB_current_mode);
|
|
||||||
rgblight_step();
|
|
||||||
RGB_current_mode = rgblight_config.mode;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case EISU:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
if(keymap_config.swap_lalt_lgui==false){
|
|
||||||
register_code(KC_LANG2);
|
|
||||||
}else{
|
|
||||||
SEND_STRING(SS_LALT("`"));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
unregister_code(KC_LANG2);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case KANA:
|
|
||||||
if (record->event.pressed) {
|
|
||||||
if(keymap_config.swap_lalt_lgui==false){
|
|
||||||
register_code(KC_LANG1);
|
|
||||||
}else{
|
|
||||||
SEND_STRING(SS_LALT("`"));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
unregister_code(KC_LANG1);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case RGBRST:
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
if (record->event.pressed) {
|
|
||||||
eeconfig_update_rgblight_default();
|
|
||||||
rgblight_enable();
|
|
||||||
RGB_current_mode = rgblight_config.mode;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void matrix_init_user(void) {
|
|
||||||
#ifdef AUDIO_ENABLE
|
|
||||||
startup_user();
|
|
||||||
#endif
|
|
||||||
#ifdef RGBLIGHT_ENABLE
|
|
||||||
RGB_current_mode = rgblight_config.mode;
|
|
||||||
#endif
|
|
||||||
//SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
|
|
||||||
#ifdef SSD1306OLED
|
|
||||||
iota_gfx_init(!has_usb()); // turns on the display
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef AUDIO_ENABLE
|
|
||||||
|
|
||||||
void startup_user()
|
|
||||||
{
|
|
||||||
_delay_ms(20); // gets rid of tick
|
|
||||||
}
|
|
||||||
|
|
||||||
void shutdown_user()
|
|
||||||
{
|
|
||||||
_delay_ms(150);
|
|
||||||
stop_all_notes();
|
|
||||||
}
|
|
||||||
|
|
||||||
void music_on_user(void)
|
|
||||||
{
|
|
||||||
music_scale_user();
|
|
||||||
}
|
|
||||||
|
|
||||||
void music_scale_user(void)
|
|
||||||
{
|
|
||||||
PLAY_SONG(music_scale);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
|
|
||||||
#ifdef SSD1306OLED
|
|
||||||
|
|
||||||
void matrix_scan_user(void) {
|
|
||||||
static int scan_count = 0;
|
|
||||||
if( scan_count == 2 ) {
|
|
||||||
rgblight_enable();
|
|
||||||
rgblight_mode(35);
|
|
||||||
}
|
|
||||||
if( scan_count < 3 ) scan_count ++;
|
|
||||||
iota_gfx_task(); // this is what updates the display continuously
|
|
||||||
}
|
|
||||||
|
|
||||||
void matrix_update(struct CharacterMatrix *dest,
|
|
||||||
const struct CharacterMatrix *source) {
|
|
||||||
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
|
|
||||||
memcpy(dest->display, source->display, sizeof(dest->display));
|
|
||||||
dest->dirty = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//assign the right code to your layers for OLED display
|
|
||||||
#define L_BASE 0
|
|
||||||
#define L_LOWER 8
|
|
||||||
#define L_RAISE 16
|
|
||||||
#define L_FNLAYER 64
|
|
||||||
#define L_NUMLAY 128
|
|
||||||
#define L_NLOWER 136
|
|
||||||
#define L_NFNLAYER 192
|
|
||||||
#define L_MOUSECURSOR 256
|
|
||||||
#define L_ADJUST 65536
|
|
||||||
#define L_ADJUST_TRI 65560
|
|
||||||
|
|
||||||
static void render_logo(struct CharacterMatrix *matrix) {
|
|
||||||
|
|
||||||
static char logo[]={
|
|
||||||
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
|
|
||||||
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
|
|
||||||
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
|
|
||||||
0};
|
|
||||||
matrix_write(matrix, logo);
|
|
||||||
//matrix_write_P(&matrix, PSTR(" Split keyboard kit"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void render_status(struct CharacterMatrix *matrix) {
|
|
||||||
|
|
||||||
// Render to mode icon
|
|
||||||
static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
|
|
||||||
if(keymap_config.swap_lalt_lgui==false){
|
|
||||||
matrix_write(matrix, logo[0][0]);
|
|
||||||
matrix_write_P(matrix, PSTR("\n"));
|
|
||||||
matrix_write(matrix, logo[0][1]);
|
|
||||||
}else{
|
|
||||||
matrix_write(matrix, logo[1][0]);
|
|
||||||
matrix_write_P(matrix, PSTR("\n"));
|
|
||||||
matrix_write(matrix, logo[1][1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
|
|
||||||
char buf[40];
|
|
||||||
snprintf(buf,sizeof(buf), "Undef-%ld", layer_state);
|
|
||||||
matrix_write_P(matrix, PSTR("\nLayer: "));
|
|
||||||
switch (layer_state) {
|
|
||||||
case L_BASE:
|
|
||||||
matrix_write_P(matrix, PSTR("Default"));
|
|
||||||
break;
|
|
||||||
case L_RAISE:
|
|
||||||
matrix_write_P(matrix, PSTR("Raise"));
|
|
||||||
break;
|
|
||||||
case L_LOWER:
|
|
||||||
matrix_write_P(matrix, PSTR("Lower"));
|
|
||||||
break;
|
|
||||||
case L_ADJUST:
|
|
||||||
case L_ADJUST_TRI:
|
|
||||||
matrix_write_P(matrix, PSTR("Adjust"));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
matrix_write(matrix, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Host Keyboard LED Status
|
|
||||||
char led[40];
|
|
||||||
snprintf(led, sizeof(led), "\n%s %s %s",
|
|
||||||
(host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : " ",
|
|
||||||
(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : " ",
|
|
||||||
(host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : " ");
|
|
||||||
matrix_write(matrix, led);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void iota_gfx_task_user(void) {
|
|
||||||
struct CharacterMatrix matrix;
|
|
||||||
|
|
||||||
#if DEBUG_TO_SCREEN
|
|
||||||
if (debug_enable) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
matrix_clear(&matrix);
|
|
||||||
if(is_master){
|
|
||||||
render_status(&matrix);
|
|
||||||
}else{
|
|
||||||
render_logo(&matrix);
|
|
||||||
}
|
|
||||||
matrix_update(&display, &matrix);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
void led_test_init(void) {
|
||||||
|
static int scan_count = 0;
|
||||||
|
if( scan_count == 2 ) {
|
||||||
|
rgblight_enable_noeeprom();
|
||||||
|
rgblight_mode_noeeprom(35);
|
||||||
|
}
|
||||||
|
if( scan_count < 3 ) scan_count ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
// when qmk/qmk_firmware PullRequest #3113 available.
|
||||||
|
// can use this?
|
||||||
|
void startup_user(void) {
|
||||||
|
rgblight_enable_noeeprom();
|
||||||
|
rgblight_mode_noeeprom(35);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -1,763 +0,0 @@
|
|||||||
/* Copyright 2016-2017 Yang Liu
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include <math.h>
|
|
||||||
#include <avr/eeprom.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include <util/delay.h>
|
|
||||||
#include "progmem.h"
|
|
||||||
#include "timer.h"
|
|
||||||
#include "rgblight.h"
|
|
||||||
#include "debug.h"
|
|
||||||
#include "led_tables.h"
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_LIMIT_VAL
|
|
||||||
#define RGBLIGHT_LIMIT_VAL 255
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MIN(a,b) (((a)<(b))?(a):(b))
|
|
||||||
#define MAX(a,b) (((a)>(b))?(a):(b))
|
|
||||||
|
|
||||||
__attribute__ ((weak))
|
|
||||||
const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5};
|
|
||||||
__attribute__ ((weak))
|
|
||||||
const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30};
|
|
||||||
__attribute__ ((weak))
|
|
||||||
const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20};
|
|
||||||
__attribute__ ((weak))
|
|
||||||
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20};
|
|
||||||
__attribute__ ((weak))
|
|
||||||
const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31};
|
|
||||||
__attribute__ ((weak))
|
|
||||||
const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90};
|
|
||||||
__attribute__ ((weak))
|
|
||||||
const uint16_t RGBLED_RGBCYCLIC_INTERVALS[] PROGMEM = {1024};
|
|
||||||
|
|
||||||
rgblight_config_t rgblight_config;
|
|
||||||
|
|
||||||
LED_TYPE led[RGBLED_NUM];
|
|
||||||
uint8_t rgblight_inited = 0;
|
|
||||||
bool rgblight_timer_enabled = false;
|
|
||||||
|
|
||||||
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) {
|
|
||||||
uint8_t r = 0, g = 0, b = 0, base, color;
|
|
||||||
|
|
||||||
if (val > RGBLIGHT_LIMIT_VAL) {
|
|
||||||
val=RGBLIGHT_LIMIT_VAL; // limit the val
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sat == 0) { // Acromatic color (gray). Hue doesn't mind.
|
|
||||||
r = val;
|
|
||||||
g = val;
|
|
||||||
b = val;
|
|
||||||
} else {
|
|
||||||
base = ((255 - sat) * val) >> 8;
|
|
||||||
color = (val - base) * (hue % 60) / 60;
|
|
||||||
|
|
||||||
switch (hue / 60) {
|
|
||||||
case 0:
|
|
||||||
r = val;
|
|
||||||
g = base + color;
|
|
||||||
b = base;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
r = val - color;
|
|
||||||
g = val;
|
|
||||||
b = base;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
r = base;
|
|
||||||
g = val;
|
|
||||||
b = base + color;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
r = base;
|
|
||||||
g = val - color;
|
|
||||||
b = val;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
r = base + color;
|
|
||||||
g = base;
|
|
||||||
b = val;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
r = val;
|
|
||||||
g = base;
|
|
||||||
b = val - color;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
r = pgm_read_byte(&CIE1931_CURVE[r]);
|
|
||||||
g = pgm_read_byte(&CIE1931_CURVE[g]);
|
|
||||||
b = pgm_read_byte(&CIE1931_CURVE[b]);
|
|
||||||
|
|
||||||
setrgb(r, g, b, led1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) {
|
|
||||||
(*led1).r = r;
|
|
||||||
(*led1).g = g;
|
|
||||||
(*led1).b = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t eeconfig_read_rgblight(void) {
|
|
||||||
return eeprom_read_dword(EECONFIG_RGBLIGHT);
|
|
||||||
}
|
|
||||||
void eeconfig_update_rgblight(uint32_t val) {
|
|
||||||
eeprom_update_dword(EECONFIG_RGBLIGHT, val);
|
|
||||||
}
|
|
||||||
void eeconfig_update_rgblight_default(void) {
|
|
||||||
dprintf("eeconfig_update_rgblight_default\n");
|
|
||||||
rgblight_config.enable = 1;
|
|
||||||
rgblight_config.mode = 1;
|
|
||||||
rgblight_config.hue = 0;
|
|
||||||
rgblight_config.sat = 255;
|
|
||||||
rgblight_config.val = RGBLIGHT_LIMIT_VAL;
|
|
||||||
rgblight_config.speed = 0;
|
|
||||||
eeconfig_update_rgblight(rgblight_config.raw);
|
|
||||||
}
|
|
||||||
void eeconfig_debug_rgblight(void) {
|
|
||||||
dprintf("rgblight_config eprom\n");
|
|
||||||
dprintf("rgblight_config.enable = %d\n", rgblight_config.enable);
|
|
||||||
dprintf("rghlight_config.mode = %d\n", rgblight_config.mode);
|
|
||||||
dprintf("rgblight_config.hue = %d\n", rgblight_config.hue);
|
|
||||||
dprintf("rgblight_config.sat = %d\n", rgblight_config.sat);
|
|
||||||
dprintf("rgblight_config.val = %d\n", rgblight_config.val);
|
|
||||||
dprintf("rgblight_config.speed = %d\n", rgblight_config.speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_init(void) {
|
|
||||||
debug_enable = 1; // Debug ON!
|
|
||||||
dprintf("rgblight_init called.\n");
|
|
||||||
rgblight_inited = 1;
|
|
||||||
dprintf("rgblight_init start!\n");
|
|
||||||
if (!eeconfig_is_enabled()) {
|
|
||||||
dprintf("rgblight_init eeconfig is not enabled.\n");
|
|
||||||
eeconfig_init();
|
|
||||||
eeconfig_update_rgblight_default();
|
|
||||||
}
|
|
||||||
rgblight_config.raw = eeconfig_read_rgblight();
|
|
||||||
if (!rgblight_config.mode) {
|
|
||||||
dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n");
|
|
||||||
eeconfig_update_rgblight_default();
|
|
||||||
rgblight_config.raw = eeconfig_read_rgblight();
|
|
||||||
}
|
|
||||||
eeconfig_debug_rgblight(); // display current eeprom values
|
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
rgblight_timer_init(); // setup the timer
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rgblight_config.enable) {
|
|
||||||
rgblight_mode_noeeprom(rgblight_config.mode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_update_dword(uint32_t dword) {
|
|
||||||
rgblight_config.raw = dword;
|
|
||||||
eeconfig_update_rgblight(rgblight_config.raw);
|
|
||||||
if (rgblight_config.enable)
|
|
||||||
rgblight_mode(rgblight_config.mode);
|
|
||||||
else {
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
rgblight_timer_disable();
|
|
||||||
#endif
|
|
||||||
rgblight_set();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_increase(void) {
|
|
||||||
uint8_t mode = 0;
|
|
||||||
if (rgblight_config.mode < RGBLIGHT_MODES) {
|
|
||||||
mode = rgblight_config.mode + 1;
|
|
||||||
}
|
|
||||||
rgblight_mode(mode);
|
|
||||||
}
|
|
||||||
void rgblight_decrease(void) {
|
|
||||||
uint8_t mode = 0;
|
|
||||||
// Mode will never be < 1. If it ever is, eeprom needs to be initialized.
|
|
||||||
if (rgblight_config.mode > 1) {
|
|
||||||
mode = rgblight_config.mode - 1;
|
|
||||||
}
|
|
||||||
rgblight_mode(mode);
|
|
||||||
}
|
|
||||||
void rgblight_step(void) {
|
|
||||||
uint8_t mode = 0;
|
|
||||||
mode = rgblight_config.mode + 1;
|
|
||||||
if (mode > RGBLIGHT_MODES) {
|
|
||||||
mode = 1;
|
|
||||||
}
|
|
||||||
rgblight_mode(mode);
|
|
||||||
}
|
|
||||||
void rgblight_step_reverse(void) {
|
|
||||||
uint8_t mode = 0;
|
|
||||||
mode = rgblight_config.mode - 1;
|
|
||||||
if (mode < 1) {
|
|
||||||
mode = RGBLIGHT_MODES;
|
|
||||||
}
|
|
||||||
rgblight_mode(mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t rgblight_get_mode(void) {
|
|
||||||
if (!rgblight_config.enable) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rgblight_config.mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) {
|
|
||||||
if (!rgblight_config.enable) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mode < 1) {
|
|
||||||
rgblight_config.mode = 1;
|
|
||||||
} else if (mode > RGBLIGHT_MODES) {
|
|
||||||
rgblight_config.mode = RGBLIGHT_MODES;
|
|
||||||
} else {
|
|
||||||
rgblight_config.mode = mode;
|
|
||||||
}
|
|
||||||
if (write_to_eeprom) {
|
|
||||||
eeconfig_update_rgblight(rgblight_config.raw);
|
|
||||||
xprintf("rgblight mode [EEPROM]: %u\n", rgblight_config.mode);
|
|
||||||
} else {
|
|
||||||
xprintf("rgblight mode [NOEEPROM]: %u\n", rgblight_config.mode);
|
|
||||||
}
|
|
||||||
if (rgblight_config.mode == 1) {
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
rgblight_timer_disable();
|
|
||||||
#endif
|
|
||||||
} else if ((rgblight_config.mode >= 2 && rgblight_config.mode <= 24) ||
|
|
||||||
rgblight_config.mode == 35 ) {
|
|
||||||
// MODE 2-5, breathing
|
|
||||||
// MODE 6-8, rainbow mood
|
|
||||||
// MODE 9-14, rainbow swirl
|
|
||||||
// MODE 15-20, snake
|
|
||||||
// MODE 21-23, knight
|
|
||||||
// MODE 24, xmas
|
|
||||||
// MODE 25-34, static rainbow
|
|
||||||
// MODE 35 RGB cyclic
|
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
rgblight_timer_enable();
|
|
||||||
#endif
|
|
||||||
} else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) {
|
|
||||||
// MODE 25-34, static gradient
|
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
rgblight_timer_disable();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
rgblight_sethsv_noeeprom(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_mode(uint8_t mode) {
|
|
||||||
rgblight_mode_eeprom_helper(mode, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_mode_noeeprom(uint8_t mode) {
|
|
||||||
rgblight_mode_eeprom_helper(mode, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void rgblight_toggle(void) {
|
|
||||||
xprintf("rgblight toggle [EEPROM]: rgblight_config.enable = %u\n", !rgblight_config.enable);
|
|
||||||
if (rgblight_config.enable) {
|
|
||||||
rgblight_disable();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rgblight_enable();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_toggle_noeeprom(void) {
|
|
||||||
xprintf("rgblight toggle [NOEEPROM]: rgblight_config.enable = %u\n", !rgblight_config.enable);
|
|
||||||
if (rgblight_config.enable) {
|
|
||||||
rgblight_disable_noeeprom();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rgblight_enable_noeeprom();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_enable(void) {
|
|
||||||
rgblight_config.enable = 1;
|
|
||||||
// No need to update EEPROM here. rgblight_mode() will do that, actually
|
|
||||||
//eeconfig_update_rgblight(rgblight_config.raw);
|
|
||||||
xprintf("rgblight enable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable);
|
|
||||||
rgblight_mode(rgblight_config.mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_enable_noeeprom(void) {
|
|
||||||
rgblight_config.enable = 1;
|
|
||||||
xprintf("rgblight enable [NOEEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable);
|
|
||||||
rgblight_mode_noeeprom(rgblight_config.mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_disable(void) {
|
|
||||||
rgblight_config.enable = 0;
|
|
||||||
eeconfig_update_rgblight(rgblight_config.raw);
|
|
||||||
xprintf("rgblight disable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable);
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
rgblight_timer_disable();
|
|
||||||
#endif
|
|
||||||
_delay_ms(50);
|
|
||||||
rgblight_set();
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_disable_noeeprom(void) {
|
|
||||||
rgblight_config.enable = 0;
|
|
||||||
xprintf("rgblight disable [noEEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable);
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
rgblight_timer_disable();
|
|
||||||
#endif
|
|
||||||
_delay_ms(50);
|
|
||||||
rgblight_set();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Deals with the messy details of incrementing an integer
|
|
||||||
uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) {
|
|
||||||
int16_t new_value = value;
|
|
||||||
new_value += step;
|
|
||||||
return MIN( MAX( new_value, min ), max );
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) {
|
|
||||||
int16_t new_value = value;
|
|
||||||
new_value -= step;
|
|
||||||
return MIN( MAX( new_value, min ), max );
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_increase_hue(void) {
|
|
||||||
uint16_t hue;
|
|
||||||
hue = (rgblight_config.hue+RGBLIGHT_HUE_STEP) % 360;
|
|
||||||
rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val);
|
|
||||||
}
|
|
||||||
void rgblight_decrease_hue(void) {
|
|
||||||
uint16_t hue;
|
|
||||||
if (rgblight_config.hue-RGBLIGHT_HUE_STEP < 0) {
|
|
||||||
hue = (rgblight_config.hue + 360 - RGBLIGHT_HUE_STEP) % 360;
|
|
||||||
} else {
|
|
||||||
hue = (rgblight_config.hue - RGBLIGHT_HUE_STEP) % 360;
|
|
||||||
}
|
|
||||||
rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val);
|
|
||||||
}
|
|
||||||
void rgblight_increase_sat(void) {
|
|
||||||
uint8_t sat;
|
|
||||||
if (rgblight_config.sat + RGBLIGHT_SAT_STEP > 255) {
|
|
||||||
sat = 255;
|
|
||||||
} else {
|
|
||||||
sat = rgblight_config.sat + RGBLIGHT_SAT_STEP;
|
|
||||||
}
|
|
||||||
rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val);
|
|
||||||
}
|
|
||||||
void rgblight_decrease_sat(void) {
|
|
||||||
uint8_t sat;
|
|
||||||
if (rgblight_config.sat - RGBLIGHT_SAT_STEP < 0) {
|
|
||||||
sat = 0;
|
|
||||||
} else {
|
|
||||||
sat = rgblight_config.sat - RGBLIGHT_SAT_STEP;
|
|
||||||
}
|
|
||||||
rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val);
|
|
||||||
}
|
|
||||||
void rgblight_increase_val(void) {
|
|
||||||
uint8_t val;
|
|
||||||
if (rgblight_config.val + RGBLIGHT_VAL_STEP > RGBLIGHT_LIMIT_VAL) {
|
|
||||||
val = RGBLIGHT_LIMIT_VAL;
|
|
||||||
} else {
|
|
||||||
val = rgblight_config.val + RGBLIGHT_VAL_STEP;
|
|
||||||
}
|
|
||||||
rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val);
|
|
||||||
}
|
|
||||||
void rgblight_decrease_val(void) {
|
|
||||||
uint8_t val;
|
|
||||||
if (rgblight_config.val - RGBLIGHT_VAL_STEP < 0) {
|
|
||||||
val = 0;
|
|
||||||
} else {
|
|
||||||
val = rgblight_config.val - RGBLIGHT_VAL_STEP;
|
|
||||||
}
|
|
||||||
rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val);
|
|
||||||
}
|
|
||||||
void rgblight_increase_speed(void) {
|
|
||||||
rgblight_config.speed = increment( rgblight_config.speed, 1, 0, 3 );
|
|
||||||
eeconfig_update_rgblight(rgblight_config.raw);//EECONFIG needs to be increased to support this
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_decrease_speed(void) {
|
|
||||||
rgblight_config.speed = decrement( rgblight_config.speed, 1, 0, 3 );
|
|
||||||
eeconfig_update_rgblight(rgblight_config.raw);//EECONFIG needs to be increased to support this
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_sethsv_noeeprom_old(uint16_t hue, uint8_t sat, uint8_t val) {
|
|
||||||
if (rgblight_config.enable) {
|
|
||||||
LED_TYPE tmp_led;
|
|
||||||
sethsv(hue, sat, val, &tmp_led);
|
|
||||||
// dprintf("rgblight set hue [MEMORY]: %u,%u,%u\n", inmem_config.hue, inmem_config.sat, inmem_config.val);
|
|
||||||
rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom) {
|
|
||||||
if (rgblight_config.enable) {
|
|
||||||
if (rgblight_config.mode == 1) {
|
|
||||||
// same static color
|
|
||||||
LED_TYPE tmp_led;
|
|
||||||
sethsv(hue, sat, val, &tmp_led);
|
|
||||||
rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b);
|
|
||||||
} else {
|
|
||||||
// all LEDs in same color
|
|
||||||
if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) {
|
|
||||||
// breathing mode, ignore the change of val, use in memory value instead
|
|
||||||
val = rgblight_config.val;
|
|
||||||
} else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 14) {
|
|
||||||
// rainbow mood and rainbow swirl, ignore the change of hue
|
|
||||||
hue = rgblight_config.hue;
|
|
||||||
} else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) {
|
|
||||||
// static gradient
|
|
||||||
uint16_t _hue;
|
|
||||||
int8_t direction = ((rgblight_config.mode - 25) % 2) ? -1 : 1;
|
|
||||||
uint16_t range = pgm_read_word(&RGBLED_GRADIENT_RANGES[(rgblight_config.mode - 25) / 2]);
|
|
||||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
|
||||||
_hue = (range / RGBLED_NUM * i * direction + hue + 360) % 360;
|
|
||||||
dprintf("rgblight rainbow set hsv: %u,%u,%d,%u\n", i, _hue, direction, range);
|
|
||||||
sethsv(_hue, sat, val, (LED_TYPE *)&led[i]);
|
|
||||||
}
|
|
||||||
rgblight_set();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rgblight_config.hue = hue;
|
|
||||||
rgblight_config.sat = sat;
|
|
||||||
rgblight_config.val = val;
|
|
||||||
if (write_to_eeprom) {
|
|
||||||
eeconfig_update_rgblight(rgblight_config.raw);
|
|
||||||
xprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
|
|
||||||
} else {
|
|
||||||
xprintf("rgblight set hsv [NOEEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) {
|
|
||||||
rgblight_sethsv_eeprom_helper(hue, sat, val, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) {
|
|
||||||
rgblight_sethsv_eeprom_helper(hue, sat, val, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t rgblight_get_hue(void) {
|
|
||||||
return rgblight_config.hue;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t rgblight_get_sat(void) {
|
|
||||||
return rgblight_config.sat;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t rgblight_get_val(void) {
|
|
||||||
return rgblight_config.val;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
|
|
||||||
if (!rgblight_config.enable) { return; }
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
|
||||||
led[i].r = r;
|
|
||||||
led[i].g = g;
|
|
||||||
led[i].b = b;
|
|
||||||
}
|
|
||||||
rgblight_set();
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index) {
|
|
||||||
if (!rgblight_config.enable || index >= RGBLED_NUM) { return; }
|
|
||||||
|
|
||||||
led[index].r = r;
|
|
||||||
led[index].g = g;
|
|
||||||
led[index].b = b;
|
|
||||||
rgblight_set();
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_sethsv_at(uint16_t hue, uint8_t sat, uint8_t val, uint8_t index) {
|
|
||||||
if (!rgblight_config.enable) { return; }
|
|
||||||
|
|
||||||
LED_TYPE tmp_led;
|
|
||||||
sethsv(hue, sat, val, &tmp_led);
|
|
||||||
rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_CUSTOM_DRIVER
|
|
||||||
void rgblight_set(void) {
|
|
||||||
if (rgblight_config.enable) {
|
|
||||||
#ifdef RGBW
|
|
||||||
ws2812_setleds_rgbw(led, RGBLED_NUM);
|
|
||||||
#else
|
|
||||||
ws2812_setleds(led, RGBLED_NUM);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
|
|
||||||
led[i].r = 0;
|
|
||||||
led[i].g = 0;
|
|
||||||
led[i].b = 0;
|
|
||||||
}
|
|
||||||
#ifdef RGBW
|
|
||||||
ws2812_setleds_rgbw(led, RGBLED_NUM);
|
|
||||||
#else
|
|
||||||
ws2812_setleds(led, RGBLED_NUM);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
|
|
||||||
// Animation timer -- AVR Timer3
|
|
||||||
void rgblight_timer_init(void) {
|
|
||||||
// static uint8_t rgblight_timer_is_init = 0;
|
|
||||||
// if (rgblight_timer_is_init) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// rgblight_timer_is_init = 1;
|
|
||||||
// /* Timer 3 setup */
|
|
||||||
// TCCR3B = _BV(WGM32) // CTC mode OCR3A as TOP
|
|
||||||
// | _BV(CS30); // Clock selelct: clk/1
|
|
||||||
// /* Set TOP value */
|
|
||||||
// uint8_t sreg = SREG;
|
|
||||||
// cli();
|
|
||||||
// OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff;
|
|
||||||
// OCR3AL = RGBLED_TIMER_TOP & 0xff;
|
|
||||||
// SREG = sreg;
|
|
||||||
|
|
||||||
rgblight_timer_enabled = true;
|
|
||||||
}
|
|
||||||
void rgblight_timer_enable(void) {
|
|
||||||
rgblight_timer_enabled = true;
|
|
||||||
dprintf("TIMER3 enabled.\n");
|
|
||||||
}
|
|
||||||
void rgblight_timer_disable(void) {
|
|
||||||
rgblight_timer_enabled = false;
|
|
||||||
dprintf("TIMER3 disabled.\n");
|
|
||||||
}
|
|
||||||
void rgblight_timer_toggle(void) {
|
|
||||||
rgblight_timer_enabled ^= rgblight_timer_enabled;
|
|
||||||
dprintf("TIMER3 toggled.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b) {
|
|
||||||
rgblight_enable();
|
|
||||||
rgblight_mode(1);
|
|
||||||
rgblight_setrgb(r, g, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_task(void) {
|
|
||||||
if (rgblight_timer_enabled) {
|
|
||||||
// mode = 1, static light, do nothing here
|
|
||||||
if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) {
|
|
||||||
// mode = 2 to 5, breathing mode
|
|
||||||
rgblight_effect_breathing(rgblight_config.mode - 2);
|
|
||||||
} else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) {
|
|
||||||
// mode = 6 to 8, rainbow mood mod
|
|
||||||
rgblight_effect_rainbow_mood(rgblight_config.mode - 6);
|
|
||||||
} else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) {
|
|
||||||
// mode = 9 to 14, rainbow swirl mode
|
|
||||||
rgblight_effect_rainbow_swirl(rgblight_config.mode - 9);
|
|
||||||
} else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) {
|
|
||||||
// mode = 15 to 20, snake mode
|
|
||||||
rgblight_effect_snake(rgblight_config.mode - 15);
|
|
||||||
} else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) {
|
|
||||||
// mode = 21 to 23, knight mode
|
|
||||||
rgblight_effect_knight(rgblight_config.mode - 21);
|
|
||||||
} else if (rgblight_config.mode == 24) {
|
|
||||||
// mode = 24, christmas mode
|
|
||||||
rgblight_effect_christmas();
|
|
||||||
} else if (rgblight_config.mode == 35) {
|
|
||||||
// mode = 35, RGB cyclic
|
|
||||||
rgblight_effect_rgbcyclic();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Effects
|
|
||||||
void rgblight_effect_breathing(uint8_t interval) {
|
|
||||||
static uint8_t pos = 0;
|
|
||||||
static uint16_t last_timer = 0;
|
|
||||||
float val;
|
|
||||||
|
|
||||||
if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_BREATHING_INTERVALS[interval])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last_timer = timer_read();
|
|
||||||
|
|
||||||
|
|
||||||
// http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/
|
|
||||||
val = (exp(sin((pos/255.0)*M_PI)) - RGBLIGHT_EFFECT_BREATHE_CENTER/M_E)*(RGBLIGHT_EFFECT_BREATHE_MAX/(M_E-1/M_E));
|
|
||||||
rgblight_sethsv_noeeprom_old(rgblight_config.hue, rgblight_config.sat, val);
|
|
||||||
pos = (pos + 1) % 256;
|
|
||||||
}
|
|
||||||
void rgblight_effect_rainbow_mood(uint8_t interval) {
|
|
||||||
static uint16_t current_hue = 0;
|
|
||||||
static uint16_t last_timer = 0;
|
|
||||||
|
|
||||||
if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_MOOD_INTERVALS[interval])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last_timer = timer_read();
|
|
||||||
rgblight_sethsv_noeeprom_old(current_hue, rgblight_config.sat, rgblight_config.val);
|
|
||||||
current_hue = (current_hue + 1) % 360;
|
|
||||||
}
|
|
||||||
void rgblight_effect_rainbow_swirl(uint8_t interval) {
|
|
||||||
static uint16_t current_hue = 0;
|
|
||||||
static uint16_t last_timer = 0;
|
|
||||||
uint16_t hue;
|
|
||||||
uint8_t i;
|
|
||||||
if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_SWIRL_INTERVALS[interval / 2])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last_timer = timer_read();
|
|
||||||
for (i = 0; i < RGBLED_NUM; i++) {
|
|
||||||
hue = (360 / RGBLED_NUM * i + current_hue) % 360;
|
|
||||||
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]);
|
|
||||||
}
|
|
||||||
rgblight_set();
|
|
||||||
|
|
||||||
if (interval % 2) {
|
|
||||||
current_hue = (current_hue + 1) % 360;
|
|
||||||
} else {
|
|
||||||
if (current_hue - 1 < 0) {
|
|
||||||
current_hue = 359;
|
|
||||||
} else {
|
|
||||||
current_hue = current_hue - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void rgblight_effect_snake(uint8_t interval) {
|
|
||||||
static uint8_t pos = 0;
|
|
||||||
static uint16_t last_timer = 0;
|
|
||||||
uint8_t i, j;
|
|
||||||
int8_t k;
|
|
||||||
int8_t increment = 1;
|
|
||||||
if (interval % 2) {
|
|
||||||
increment = -1;
|
|
||||||
}
|
|
||||||
if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_SNAKE_INTERVALS[interval / 2])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last_timer = timer_read();
|
|
||||||
for (i = 0; i < RGBLED_NUM; i++) {
|
|
||||||
led[i].r = 0;
|
|
||||||
led[i].g = 0;
|
|
||||||
led[i].b = 0;
|
|
||||||
for (j = 0; j < RGBLIGHT_EFFECT_SNAKE_LENGTH; j++) {
|
|
||||||
k = pos + j * increment;
|
|
||||||
if (k < 0) {
|
|
||||||
k = k + RGBLED_NUM;
|
|
||||||
}
|
|
||||||
if (i == k) {
|
|
||||||
sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), (LED_TYPE *)&led[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rgblight_set();
|
|
||||||
if (increment == 1) {
|
|
||||||
if (pos - 1 < 0) {
|
|
||||||
pos = RGBLED_NUM - 1;
|
|
||||||
} else {
|
|
||||||
pos -= 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pos = (pos + 1) % RGBLED_NUM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void rgblight_effect_knight(uint8_t interval) {
|
|
||||||
static uint16_t last_timer = 0;
|
|
||||||
if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last_timer = timer_read();
|
|
||||||
|
|
||||||
static int8_t low_bound = 0;
|
|
||||||
static int8_t high_bound = RGBLIGHT_EFFECT_KNIGHT_LENGTH - 1;
|
|
||||||
static int8_t increment = 1;
|
|
||||||
uint8_t i, cur;
|
|
||||||
|
|
||||||
// Set all the LEDs to 0
|
|
||||||
for (i = 0; i < RGBLED_NUM; i++) {
|
|
||||||
led[i].r = 0;
|
|
||||||
led[i].g = 0;
|
|
||||||
led[i].b = 0;
|
|
||||||
}
|
|
||||||
// Determine which LEDs should be lit up
|
|
||||||
for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) {
|
|
||||||
cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % RGBLED_NUM;
|
|
||||||
|
|
||||||
if (i >= low_bound && i <= high_bound) {
|
|
||||||
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]);
|
|
||||||
} else {
|
|
||||||
led[cur].r = 0;
|
|
||||||
led[cur].g = 0;
|
|
||||||
led[cur].b = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rgblight_set();
|
|
||||||
|
|
||||||
// Move from low_bound to high_bound changing the direction we increment each
|
|
||||||
// time a boundary is hit.
|
|
||||||
low_bound += increment;
|
|
||||||
high_bound += increment;
|
|
||||||
|
|
||||||
if (high_bound <= 0 || low_bound >= RGBLIGHT_EFFECT_KNIGHT_LED_NUM - 1) {
|
|
||||||
increment = -increment;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void rgblight_effect_christmas(void) {
|
|
||||||
static uint16_t current_offset = 0;
|
|
||||||
static uint16_t last_timer = 0;
|
|
||||||
uint16_t hue;
|
|
||||||
uint8_t i;
|
|
||||||
if (timer_elapsed(last_timer) < RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last_timer = timer_read();
|
|
||||||
current_offset = (current_offset + 1) % 2;
|
|
||||||
for (i = 0; i < RGBLED_NUM; i++) {
|
|
||||||
hue = 0 + ((i/RGBLIGHT_EFFECT_CHRISTMAS_STEP + current_offset) % 2) * 120;
|
|
||||||
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]);
|
|
||||||
}
|
|
||||||
rgblight_set();
|
|
||||||
}
|
|
||||||
|
|
||||||
void rgblight_effect_rgbcyclic(void) {
|
|
||||||
static uint8_t pos = 0;
|
|
||||||
static uint16_t last_timer = 0;
|
|
||||||
uint8_t g; uint8_t r; uint8_t b;
|
|
||||||
|
|
||||||
if (timer_elapsed(last_timer) < pgm_read_word(&RGBLED_RGBCYCLIC_INTERVALS[0])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
last_timer = timer_read();
|
|
||||||
g = r = b = 0;
|
|
||||||
switch( pos ) {
|
|
||||||
case 0: r = RGBLIGHT_LIMIT_VAL; break;
|
|
||||||
case 1: g = RGBLIGHT_LIMIT_VAL; break;
|
|
||||||
case 2: b = RGBLIGHT_LIMIT_VAL; break;
|
|
||||||
}
|
|
||||||
rgblight_setrgb(r, g, b);
|
|
||||||
pos = (pos + 1) % 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* RGBLIGHT_ANIMATIONS */
|
|
||||||
@@ -1,166 +0,0 @@
|
|||||||
/* Copyright 2017 Yang Liu
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef RGBLIGHT_H
|
|
||||||
#define RGBLIGHT_H
|
|
||||||
|
|
||||||
#ifdef RGBLIGHT_ANIMATIONS
|
|
||||||
#define RGBLIGHT_MODES 35
|
|
||||||
#else
|
|
||||||
#define RGBLIGHT_MODES 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_BREATHE_CENTER
|
|
||||||
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1-2.7
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_BREATHE_MAX
|
|
||||||
#define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0-255
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH
|
|
||||||
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_KNIGHT_LENGTH
|
|
||||||
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET
|
|
||||||
#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM
|
|
||||||
#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM RGBLED_NUM
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
|
|
||||||
#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP
|
|
||||||
#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RGBLIGHT_HUE_STEP
|
|
||||||
#define RGBLIGHT_HUE_STEP 10
|
|
||||||
#endif
|
|
||||||
#ifndef RGBLIGHT_SAT_STEP
|
|
||||||
#define RGBLIGHT_SAT_STEP 17
|
|
||||||
#endif
|
|
||||||
#ifndef RGBLIGHT_VAL_STEP
|
|
||||||
#define RGBLIGHT_VAL_STEP 17
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RGBLED_TIMER_TOP F_CPU/(256*64)
|
|
||||||
// #define RGBLED_TIMER_TOP 0xFF10
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "eeconfig.h"
|
|
||||||
#ifndef RGBLIGHT_CUSTOM_DRIVER
|
|
||||||
#include "ws2812.h"
|
|
||||||
#endif
|
|
||||||
#include "rgblight_types.h"
|
|
||||||
#include "rgblight_list.h"
|
|
||||||
|
|
||||||
extern LED_TYPE led[RGBLED_NUM];
|
|
||||||
|
|
||||||
extern const uint8_t RGBLED_BREATHING_INTERVALS[4] PROGMEM;
|
|
||||||
extern const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[3] PROGMEM;
|
|
||||||
extern const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM;
|
|
||||||
extern const uint8_t RGBLED_SNAKE_INTERVALS[3] PROGMEM;
|
|
||||||
extern const uint8_t RGBLED_KNIGHT_INTERVALS[3] PROGMEM;
|
|
||||||
extern const uint16_t RGBLED_RGBCYCLIC_INTERVALS[1] PROGMEM;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
uint32_t raw;
|
|
||||||
struct {
|
|
||||||
bool enable :1;
|
|
||||||
uint8_t mode :6;
|
|
||||||
uint16_t hue :9;
|
|
||||||
uint8_t sat :8;
|
|
||||||
uint8_t val :8;
|
|
||||||
uint8_t speed :8;//EECONFIG needs to be increased to support this
|
|
||||||
};
|
|
||||||
} rgblight_config_t;
|
|
||||||
|
|
||||||
void rgblight_init(void);
|
|
||||||
void rgblight_increase(void);
|
|
||||||
void rgblight_decrease(void);
|
|
||||||
void rgblight_toggle(void);
|
|
||||||
void rgblight_enable(void);
|
|
||||||
void rgblight_disable(void);
|
|
||||||
void rgblight_step(void);
|
|
||||||
void rgblight_step_reverse(void);
|
|
||||||
uint32_t rgblight_get_mode(void);
|
|
||||||
void rgblight_mode(uint8_t mode);
|
|
||||||
void rgblight_set(void);
|
|
||||||
void rgblight_update_dword(uint32_t dword);
|
|
||||||
void rgblight_increase_hue(void);
|
|
||||||
void rgblight_decrease_hue(void);
|
|
||||||
void rgblight_increase_sat(void);
|
|
||||||
void rgblight_decrease_sat(void);
|
|
||||||
void rgblight_increase_val(void);
|
|
||||||
void rgblight_decrease_val(void);
|
|
||||||
void rgblight_increase_speed(void);
|
|
||||||
void rgblight_decrease_speed(void);
|
|
||||||
void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val);
|
|
||||||
uint16_t rgblight_get_hue(void);
|
|
||||||
uint8_t rgblight_get_sat(void);
|
|
||||||
uint8_t rgblight_get_val(void);
|
|
||||||
void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b);
|
|
||||||
void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index);
|
|
||||||
void rgblight_sethsv_at(uint16_t hue, uint8_t sat, uint8_t val, uint8_t index);
|
|
||||||
|
|
||||||
uint32_t eeconfig_read_rgblight(void);
|
|
||||||
void eeconfig_update_rgblight(uint32_t val);
|
|
||||||
void eeconfig_update_rgblight_default(void);
|
|
||||||
void eeconfig_debug_rgblight(void);
|
|
||||||
|
|
||||||
void rgb_matrix_increase(void);
|
|
||||||
void rgb_matrix_decrease(void);
|
|
||||||
|
|
||||||
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1);
|
|
||||||
void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1);
|
|
||||||
|
|
||||||
void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val);
|
|
||||||
void rgblight_mode_noeeprom(uint8_t mode);
|
|
||||||
void rgblight_toggle_noeeprom(void);
|
|
||||||
void rgblight_enable_noeeprom(void);
|
|
||||||
void rgblight_disable_noeeprom(void);
|
|
||||||
|
|
||||||
void rgblight_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom);
|
|
||||||
void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom);
|
|
||||||
|
|
||||||
|
|
||||||
#define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
|
|
||||||
void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b);
|
|
||||||
|
|
||||||
void rgblight_task(void);
|
|
||||||
|
|
||||||
void rgblight_timer_init(void);
|
|
||||||
void rgblight_timer_enable(void);
|
|
||||||
void rgblight_timer_disable(void);
|
|
||||||
void rgblight_timer_toggle(void);
|
|
||||||
void rgblight_effect_breathing(uint8_t interval);
|
|
||||||
void rgblight_effect_rainbow_mood(uint8_t interval);
|
|
||||||
void rgblight_effect_rainbow_swirl(uint8_t interval);
|
|
||||||
void rgblight_effect_snake(uint8_t interval);
|
|
||||||
void rgblight_effect_knight(uint8_t interval);
|
|
||||||
void rgblight_effect_christmas(void);
|
|
||||||
void rgblight_effect_rgbcyclic(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -110,6 +110,8 @@ ifeq ($(strip $(LOCAL_GLCDFONT)), yes)
|
|||||||
OPT_DEFS += -DLOCAL_GLCDFONT
|
OPT_DEFS += -DLOCAL_GLCDFONT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
SRC += led_test_init.c
|
||||||
|
|
||||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
{ R36, R30, R31, R32, R33, R34, R35 }, \
|
{ R36, R30, R31, R32, R33, R34, R35 }, \
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#elif HELIX_ROWS == 5
|
#else
|
||||||
#ifndef FLIP_HALF
|
#ifndef FLIP_HALF
|
||||||
// Standard Keymap
|
// Standard Keymap
|
||||||
// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left)
|
// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left)
|
||||||
@@ -108,8 +108,6 @@
|
|||||||
{ R46, R40, R41, R42, R43, R44, R45 } \
|
{ R46, R40, R41, R42, R43, R44, R45 } \
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
#error "expected HELIX_ROWS 4 or 5"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -139,7 +139,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
|
|||||||
if (edvorakjp_config.enable_kc_lang) {
|
if (edvorakjp_config.enable_kc_lang) {
|
||||||
SEND_STRING( SS_LCTRL(SS_LSFT(SS_TAP(X_POWER))) );
|
SEND_STRING( SS_LCTRL(SS_LSFT(SS_TAP(X_POWER))) );
|
||||||
} else {
|
} else {
|
||||||
SEND_STRING( SS_LGUI("L") );
|
SEND_STRING( SS_LGUI("l") );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# edvorakjp
|
# edvorakjp
|
||||||
|
|
||||||
Epaew's Enhanced Dvorak layout for Japanese Programmer
|
Epaew's Enhanced Dvorak layout for Japanese Programmer
|
||||||
see [here](../../../../users/edvorakjp) for more informations.
|
see [here](/users/edvorakjp) for more informations.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -41,20 +41,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// `----+----+----' `----+----+----'
|
// `----+----+----' `----+----+----'
|
||||||
|
|
||||||
[_QWERTY] = LAYOUT(
|
[_QWERTY] = LAYOUT(
|
||||||
KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,KC_BSPC,
|
KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,KC_BSPC,
|
||||||
KC_TAB , KC_Q , KC_W ,KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_MINS ,
|
KC_TAB , KC_Q , KC_W ,KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_MINS,
|
||||||
KC_LSFT, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L ,KC_SCLN,KC_QUOT,
|
KC_LSFT, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L ,KC_SCLN,KC_QUOT,
|
||||||
KC_LCTL, KC_Z , KC_X , KC_C , KC_V , KC_B ,KC_PLUS, KC_MOUS , KC_N , KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_BSLASH,
|
KC_LCTL, KC_Z , KC_X , KC_C , KC_V , KC_B ,KC_PLUS, KC_MOUS,KC_N , KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_BSLASH,
|
||||||
KC_LGUI,KC_RASE,KC_SPC , KC_ENT ,KC_LOWR,KC_LALT
|
KC_LGUI,KC_RASE,KC_SPC , KC_ENT ,KC_LOWR,KC_LALT
|
||||||
),
|
),
|
||||||
|
|
||||||
// LOWER Layer
|
// LOWER Layer
|
||||||
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
|
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
|
||||||
// TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC,
|
// TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC,
|
||||||
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
||||||
// , ,PGUP, , ,LBRC, RBRC, P7 , P8 , P9 ,PLUS, ,
|
// , , , , ,LBRC, RBRC, P7 , P8 , P9 , ,PLUS,
|
||||||
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
||||||
// ,HOME,PGDN,END, ,LPRN, RPRN, P4 , P5 , P6 ,MINS,PIPE,
|
// ,HOME,PGUP,PGDN,END,LPRN, RPRN, P4 , P5 , P6 ,MINS,PIPE,
|
||||||
//|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
|
//|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
|
||||||
// , , , , , , , , , P1 , P2 , P3 ,EQL ,UNDS ,
|
// , , , , , , , , , P1 , P2 , P3 ,EQL ,UNDS ,
|
||||||
//`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
|
//`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
|
||||||
@@ -62,19 +62,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// `----+----+----' `----+----+----'
|
// `----+----+----' `----+----+----'
|
||||||
|
|
||||||
[_LOWER] = LAYOUT(
|
[_LOWER] = LAYOUT(
|
||||||
KC_TILD,KC_EXLM, KC_AT ,KC_HASH,KC_DLR ,KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_BSPC,
|
KC_TILD,KC_EXLM, KC_AT ,KC_HASH,KC_DLR ,KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_DEL,
|
||||||
_______,_______,KC_PGUP,_______,_______,KC_LBRC, KC_RBRC, KC_P7 , KC_P8 , KC_P9 ,KC_PLUS,_______,
|
_______,_______,_______,_______,_______,KC_LBRC, KC_RBRC, KC_P7 , KC_P8 , KC_P9 ,_______,KC_PLUS,
|
||||||
_______ ,KC_HOME,KC_PGDN,KC_END,_______,KC_LPRN, KC_RPRN, KC_P4 , KC_P5 , KC_P6 ,KC_MINS,KC_PIPE,
|
_______,KC_HOME,KC_PGUP,KC_PGDN,KC_END ,KC_LPRN, KC_RPRN, KC_P4 , KC_P5 , KC_P6 ,KC_MINS,KC_PIPE,
|
||||||
_______,_______,_______,_______,_______,_______,_______, _______ ,_______, KC_P1 , KC_P2 , KC_P3 ,KC_EQL ,KC_UNDS ,
|
_______,_______,_______,_______,_______,_______,_______, _______,_______, KC_P1 , KC_P2 , KC_P3 ,KC_EQL ,KC_UNDS ,
|
||||||
_______ ,_______,KC_PSCR , KC_DEL ,_______, KC_P0
|
_______ ,_______,KC_PSCR , _______,_______, KC_P0
|
||||||
),
|
),
|
||||||
// RAISE LAYER
|
// RAISE LAYER
|
||||||
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
|
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
|
||||||
// F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,
|
// F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,
|
||||||
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
||||||
// , , UP , , ,LBRC, RBRC, ,NLCK,INS ,SLCK,MUTE,
|
// , , , , ,LBRC, RBRC, ,NLCK,INS ,SLCK,MUTE,
|
||||||
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
||||||
// ,LEFT,DOWN,RGHT, ,LPRN, RPRN,MPRV,MPLY,MNXT, ,VOLU,
|
// ,LEFT,UP ,DOWN,RGHT,LPRN, RPRN,MPRV,MPLY,MNXT, ,VOLU,
|
||||||
//|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
|
//|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
|
||||||
// , , , , , , , PLUS , , , , , ,VOLD,
|
// , , , , , , , PLUS , , , , , ,VOLD,
|
||||||
//`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
|
//`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
|
||||||
@@ -82,30 +82,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// `----+----+----' `----+----+----'
|
// `----+----+----' `----+----+----'
|
||||||
|
|
||||||
[_RAISE] = LAYOUT(
|
[_RAISE] = LAYOUT(
|
||||||
KC_F12 , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 ,KC_F10 ,KC_F11 ,
|
KC_F12 , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 ,KC_F10 ,KC_F11 ,
|
||||||
_______ ,_______, KC_UP ,_______,_______,KC_LBRC, KC_RBRC,_______,KC_NLCK,KC_INS ,KC_SLCK,KC_MUTE,
|
_______,_______,_______,_______,_______,KC_LBRC, KC_RBRC,_______,KC_NLCK,KC_INS ,KC_SLCK,KC_MUTE,
|
||||||
_______ ,KC_LEFT,KC_DOWN,KC_RGHT,_______,KC_LPRN, KC_RPRN,KC_MPRV,KC_MPLY,KC_MNXT,_______,KC_VOLU,
|
_______,KC_LEFT,KC_UP ,KC_DOWN,KC_RGHT,KC_LPRN, KC_RPRN,KC_MPRV,KC_MPLY,KC_MNXT,_______,KC_VOLU,
|
||||||
_______,_______,_______,_______,_______,_______,_______, KC_PLUS,_______,_______,_______,_______,_______,KC_VOLD,
|
_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,KC_VOLD,
|
||||||
_______ ,_______,_______, KC_EQL,_______,_______
|
_______ ,_______,_______, KC_EQL ,_______,_______
|
||||||
),
|
),
|
||||||
// MOUSE LAYER
|
// MOUSE LAYER
|
||||||
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
|
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
|
||||||
// , , , , , , , , , , , ,
|
// , , , , , , , , , , , ,
|
||||||
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
||||||
// , ,MS_UP, , , , MS_WH_UP, , , , , ,
|
// , , , , , , MS_WH_UP, , , , , ,
|
||||||
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
//|----+----+----+----+----+----| |----+----+----+----+----+----|
|
||||||
// ,MS_LEFT,MS_DOWN,MS_RGHT, ,, MS_WH_DN,MS_BT1,MS_BT2,MS_BT3, , ,
|
// MS_LEFT,MS_UP,MS_DOWN,MS_RGHT,,, MS_WH_DN,MS_BT1,MS_BT2,MS_BT3, , ,
|
||||||
//|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
|
//|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
|
||||||
// , , , , , , , , , , ,MS_ACC0,MS_ACC1MS_ACC2
|
// , , , , , , , , , , ,MS_ACC0,MS_ACC1MS_ACC2
|
||||||
//`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
|
//`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
|
||||||
// , , , , ,
|
// , , , , ,
|
||||||
// `----+----+----' `----+----+----'
|
// `----+----+----' `----+----+----'
|
||||||
[_MOUSE] = LAYOUT(
|
[_MOUSE] = LAYOUT(
|
||||||
_______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,_______ ,_______ ,
|
_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
|
||||||
_______ ,_______, KC_MS_UP ,_______,_______,_______, KC_MS_WH_UP,_______,_______,_______ ,_______,_______,
|
_______,_______,_______,_______,_______,_______, KC_MS_WH_UP,_______,_______,_______,_______,_______,
|
||||||
_______ ,KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT,_______,_______, KC_MS_WH_DOWN,KC_MS_BTN1,KC_MS_BTN2,KC_MS_BTN3,_______,_______,
|
KC_MS_LEFT,KC_MS_UP,KC_MS_DOWN,KC_MS_RIGHT,_______,_______, KC_MS_WH_DOWN,KC_MS_BTN1,KC_MS_BTN2,KC_MS_BTN3,_______,_______,
|
||||||
_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,KC_MS_ACCEL0,KC_MS_ACCEL1,KC_MS_ACCEL2,
|
_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,KC_MS_ACCEL0,KC_MS_ACCEL1,KC_MS_ACCEL2,
|
||||||
_______ ,_______,_______, _______,_______,_______
|
_______,_______,_______, _______,_______,_______
|
||||||
),
|
),
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -0,0 +1,183 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2017 Blake C. Lewis
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
/* USB Device descriptor parameter */
|
||||||
|
#define VENDOR_ID 0xFEED
|
||||||
|
#define PRODUCT_ID 0x0000
|
||||||
|
#define DEVICE_VER 0x0001
|
||||||
|
#define MANUFACTURER NPKC
|
||||||
|
#define PRODUCT kc60se
|
||||||
|
#define DESCRIPTION A custom 60% keyboard
|
||||||
|
|
||||||
|
/* key matrix size */
|
||||||
|
#define MATRIX_ROWS 5
|
||||||
|
#define MATRIX_COLS 14
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keyboard Matrix Assignments
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define UNUSED_PINS
|
||||||
|
#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 }
|
||||||
|
#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
|
||||||
|
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
|
||||||
|
#define DIODE_DIRECTION COL2ROW
|
||||||
|
|
||||||
|
#define BACKLIGHT_PIN F5
|
||||||
|
// #define BACKLIGHT_BREATHING
|
||||||
|
#define BACKLIGHT_LEVELS 6
|
||||||
|
|
||||||
|
|
||||||
|
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||||
|
#define DEBOUNCING_DELAY 5
|
||||||
|
|
||||||
|
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
||||||
|
//#define MATRIX_HAS_GHOST
|
||||||
|
|
||||||
|
/* number of backlight levels */
|
||||||
|
|
||||||
|
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||||
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
|
/* Locking resynchronize hack */
|
||||||
|
#define LOCKING_RESYNC_ENABLE
|
||||||
|
|
||||||
|
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
||||||
|
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
|
||||||
|
*/
|
||||||
|
// #define GRAVE_ESC_CTRL_OVERRIDE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Force NKRO
|
||||||
|
*
|
||||||
|
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
||||||
|
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
||||||
|
* makefile for this to work.)
|
||||||
|
*
|
||||||
|
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
||||||
|
* until the next keyboard reset.
|
||||||
|
*
|
||||||
|
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
||||||
|
* fully operational during normal computer usage.
|
||||||
|
*
|
||||||
|
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
||||||
|
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
||||||
|
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
||||||
|
* power-up.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//#define FORCE_NKRO
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Magic Key Options
|
||||||
|
*
|
||||||
|
* Magic keys are hotkey commands that allow control over firmware functions of
|
||||||
|
* the keyboard. They are best used in combination with the HID Listen program,
|
||||||
|
* found here: https://www.pjrc.com/teensy/hid_listen.html
|
||||||
|
*
|
||||||
|
* The options below allow the magic key functionality to be changed. This is
|
||||||
|
* useful if your keyboard/keypad is missing keys and you want magic key support.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* key combination for magic key command */
|
||||||
|
#define IS_COMMAND() ( \
|
||||||
|
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* control how magic key switches layers */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
|
||||||
|
|
||||||
|
/* override magic key keymap */
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
|
||||||
|
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
|
||||||
|
//#define MAGIC_KEY_HELP1 H
|
||||||
|
//#define MAGIC_KEY_HELP2 SLASH
|
||||||
|
//#define MAGIC_KEY_DEBUG D
|
||||||
|
//#define MAGIC_KEY_DEBUG_MATRIX X
|
||||||
|
//#define MAGIC_KEY_DEBUG_KBD K
|
||||||
|
//#define MAGIC_KEY_DEBUG_MOUSE M
|
||||||
|
//#define MAGIC_KEY_VERSION V
|
||||||
|
//#define MAGIC_KEY_STATUS S
|
||||||
|
//#define MAGIC_KEY_CONSOLE C
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT1 ESC
|
||||||
|
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
|
||||||
|
//#define MAGIC_KEY_LAYER0 0
|
||||||
|
//#define MAGIC_KEY_LAYER1 1
|
||||||
|
//#define MAGIC_KEY_LAYER2 2
|
||||||
|
//#define MAGIC_KEY_LAYER3 3
|
||||||
|
//#define MAGIC_KEY_LAYER4 4
|
||||||
|
//#define MAGIC_KEY_LAYER5 5
|
||||||
|
//#define MAGIC_KEY_LAYER6 6
|
||||||
|
//#define MAGIC_KEY_LAYER7 7
|
||||||
|
//#define MAGIC_KEY_LAYER8 8
|
||||||
|
//#define MAGIC_KEY_LAYER9 9
|
||||||
|
//#define MAGIC_KEY_BOOTLOADER PAUSE
|
||||||
|
//#define MAGIC_KEY_LOCK CAPS
|
||||||
|
//#define MAGIC_KEY_EEPROM E
|
||||||
|
//#define MAGIC_KEY_NKRO N
|
||||||
|
//#define MAGIC_KEY_SLEEP_LED Z
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
|
//#define NO_ACTION_MACRO
|
||||||
|
//#define NO_ACTION_FUNCTION
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MIDI options
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Prevent use of disabled MIDI features in the keymap */
|
||||||
|
//#define MIDI_ENABLE_STRICT 1
|
||||||
|
|
||||||
|
/* enable basic MIDI features:
|
||||||
|
- MIDI notes can be sent when in Music mode is on
|
||||||
|
*/
|
||||||
|
//#define MIDI_BASIC
|
||||||
|
|
||||||
|
/* enable advanced MIDI features:
|
||||||
|
- MIDI notes can be added to the keymap
|
||||||
|
- Octave shift and transpose
|
||||||
|
- Virtual sustain, portamento, and modulation wheel
|
||||||
|
- etc.
|
||||||
|
*/
|
||||||
|
//#define MIDI_ADVANCED
|
||||||
|
|
||||||
|
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
|
||||||
|
//#define MIDI_TONE_KEYCODE_OCTAVES 1
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "kc60se",
|
||||||
|
"url": "",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"width": 15,
|
||||||
|
"height": 5,
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
|
||||||
|
},
|
||||||
|
|
||||||
|
"LAYOUT_60_ansi_split_bs_rshift": {
|
||||||
|
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
|
||||||
|
},
|
||||||
|
|
||||||
|
"LAYOUT_60_ansi": {
|
||||||
|
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/* Copyright 2017 Blake C. Lewis
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "kc60se.h"
|
||||||
|
|
||||||
|
extern inline void kc60se_caps_led_on(void);
|
||||||
|
extern inline void kc60se_caps_led_off(void);
|
||||||
|
|
||||||
|
void led_set_kb(uint8_t usb_led) {
|
||||||
|
(usb_led & (1<<USB_LED_CAPS_LOCK))? kc60se_caps_led_on(): kc60se_caps_led_off();
|
||||||
|
led_set_user(usb_led);
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
/* Copyright 2017 Blake C. Lewis
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef KC60SE_H
|
||||||
|
#define KC60SE_H
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
inline void kc60se_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); }
|
||||||
|
inline void kc60se_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
|
||||||
|
|
||||||
|
/* kc60se keymap definition macro
|
||||||
|
* K2C, K31 and K3C are keys for ISO
|
||||||
|
* This is the row/column wiring, which different from the physical layout.
|
||||||
|
*/
|
||||||
|
// All pads defined in logical layout. The KC_NO in this section are padless.
|
||||||
|
#define LAYOUT( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||||
|
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
|
||||||
|
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
|
||||||
|
) { \
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
|
||||||
|
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
|
||||||
|
{ K40, K41, K42, KC_NO,KC_NO,K45,KC_NO,KC_NO,KC_NO,KC_NO,K4A,K4B,K4C,K4D } \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ANSI */
|
||||||
|
#define LAYOUT_60_ansi( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
|
||||||
|
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
|
||||||
|
) { \
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,KC_NO,K2D }, \
|
||||||
|
{ K30,KC_NO,K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,KC_NO,K3D }, \
|
||||||
|
{ K40, K41, K42, KC_NO,KC_NO,K45, KC_NO,KC_NO,KC_NO,K4A, K4B,K4C, K4D } \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HHKB
|
||||||
|
* K2C & K31 are represented as KC_NO, otherwise this is
|
||||||
|
* the best representation of the physical layout, (K49 on top right).
|
||||||
|
* The KC_NOs on the space row do not have pads
|
||||||
|
*/
|
||||||
|
#define LAYOUT_60_ansi_split_bs_rshift( \
|
||||||
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
|
||||||
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
|
||||||
|
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
|
||||||
|
) { \
|
||||||
|
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||||
|
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
||||||
|
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,KC_NO,K2D }, \
|
||||||
|
{ K30,KC_NO,K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
|
||||||
|
{ K40, K41,K42,KC_NO,KC_NO,K45,KC_NO,KC_NO,KC_NO,K49,K4A,K4B, K4C, K4D } \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/* Copyright 2018 REPLACE_WITH_YOUR_NAME
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONFIG_USER_H
|
||||||
|
#define CONFIG_USER_H
|
||||||
|
|
||||||
|
#include "config_common.h"
|
||||||
|
|
||||||
|
// place overrides here
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/* Copyright 2018 REPLACE_WITH_YOUR_NAME
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
#define _DEFAULT 0
|
||||||
|
#define _FN 1
|
||||||
|
|
||||||
|
#define xxxxxx KC_TRNS
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
/* hhkb - layer 0
|
||||||
|
* split_bs/split_rshift/+ctrl-caplock
|
||||||
|
*,--------------------------------------------------------------------------.
|
||||||
|
*| esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
*| tab | q | w | e | r | t | y | u | i | o | p | [ | ] | bksp |
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
*| ctrl | a | s | d | f | g | h | j | k | l | ; | ' | enter |
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
*| shift | z | x | c | v | b | n | m | , | . | / | rshift | fn1|
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
* |lalt| fn1 | space | rgui |ralt|
|
||||||
|
* `-----------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_DEFAULT] = LAYOUT_60_ansi_split_bs_rshift( /* Basic QWERTY */
|
||||||
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \
|
||||||
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
|
||||||
|
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
|
||||||
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), \
|
||||||
|
xxxxxx, KC_LALT, MO(_FN), KC_SPC, xxxxxx, KC_RGUI, KC_RALT, xxxxxx \
|
||||||
|
),
|
||||||
|
|
||||||
|
/* split_bs/split_rshift/+ctrl-caplock - Layer 1
|
||||||
|
*
|
||||||
|
*,--------------------------------------------------------------------------.
|
||||||
|
*| | f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10| f11| f12| | ins|
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
*| caps |blon|blup| | | | | | psc|slck|paus| up | | del |
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
*| |vol-|vol+|mute| | | * | / |home|pgup|left|rght| penter |
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
*| |prev|play|next| | | + | - |end |pgdn|down| | |
|
||||||
|
*|--------------------------------------------------------------------------+
|
||||||
|
* | | | | stop | |
|
||||||
|
* `----------------------------------------------------------'
|
||||||
|
*/
|
||||||
|
[_FN] = LAYOUT_60_ansi_split_bs_rshift( /* Layer 1 */
|
||||||
|
xxxxxx, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, xxxxxx,KC_INS, \
|
||||||
|
KC_CAPS, BL_ON, BL_STEP, xxxxxx, xxxxxx, xxxxxx, xxxxxx, xxxxxx, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, xxxxxx, KC_DEL, \
|
||||||
|
xxxxxx, KC_VOLD, KC_VOLU, KC_MUTE, xxxxxx, xxxxxx, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT,xxxxxx, \
|
||||||
|
xxxxxx, KC_MPRV, KC_MPLY, KC_MNXT, xxxxxx, xxxxxx, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, xxxxxx, xxxxxx, \
|
||||||
|
xxxxxx, xxxxxx, xxxxxx, xxxxxx, xxxxxx, KC_MSTP, xxxxxx, xxxxxx \
|
||||||
|
)
|
||||||
|
};
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# The default keymap for kc60se
|
||||||
|
|
||||||
|
# hhkb-qwerty-wkl
|
||||||
|
========================
|
||||||
|
### layer 0 - default
|
||||||
|
```
|
||||||
|
,--------------------------------------------------------------------------.
|
||||||
|
| esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
|
||||||
|
|--------------------------------------------------------------------------|
|
||||||
|
| tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | bksp |
|
||||||
|
|--------------------------------------------------------------------------|
|
||||||
|
| ctrl | A | S | D | F | G | H | J | K | L | ; | ' | enter |
|
||||||
|
|--------------------------------------------------------------------------|
|
||||||
|
| lshift | Z | X | C | V | B | N | M | , | . | / | rshift | fn0|
|
||||||
|
`--------------------------------------------------------------------------'
|
||||||
|
|lalt| fn0 | space | rgui |ralt|
|
||||||
|
`------------------------------------------------------------'
|
||||||
|
```
|
||||||
|
### layer 1 - Q/W backlight controls: BL_ON & BL_STEP
|
||||||
|
```
|
||||||
|
,--------------------------------------------------------------------------.
|
||||||
|
| | f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10| f11| f12| | ins|
|
||||||
|
|--------------------------------------------------------------------------|
|
||||||
|
| caps |blon|blup| | | | | | psc|slck|paus| up | | del |
|
||||||
|
|--------------------------------------------------------------------------|
|
||||||
|
| |vol-|vol+|mute| | | * | / |home|pgup|left|rght| penter |
|
||||||
|
|--------------------------------------------------------------------------|
|
||||||
|
| |mprv|mply|mnxt| | | + | - |end |pgdn|down| | |
|
||||||
|
`--------------------------------------------------------------------------'
|
||||||
|
| | | | mstop | |
|
||||||
|
`-----------------------------------------------------------'
|
||||||
|
```
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
# kc60se
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
A short description of the keyboard/project
|
||||||
|
|
||||||
|
Keyboard Maintainer: [Blake C. Lewis](https://github.com/BlakeCLewis), [MechMerlin](https://www.github.com/mechmerlin)
|
||||||
|
Hardware Supported: KC60 SE
|
||||||
|
Hardware Availability: [Aliexpress](https://www.aliexpress.com/store/product/Free-shipping-GH60-PCB-KC60-SE-Fully-Programmable-For-DIY-Mechanical-Keyboard-Poker-Faceu-HHKB-Support/429151_32799437588.html?spm=2114.12010608.0.0.2995e5c0hNRgMH)
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make kc60se:default
|
||||||
|
|
||||||
|
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# MCU name
|
||||||
|
#MCU = at90usb1286
|
||||||
|
MCU = atmega32u4
|
||||||
|
|
||||||
|
# Processor frequency.
|
||||||
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
|
# processor frequency in Hz. You can then use this symbol in your source code to
|
||||||
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
|
# automatically to create a 32-bit value in your source code.
|
||||||
|
#
|
||||||
|
# This will be an integer division of F_USB below, as it is sourced by
|
||||||
|
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||||
|
# does not *change* the processor frequency - it should merely be updated to
|
||||||
|
# reflect the processor speed set externally so that the code can use accurate
|
||||||
|
# software delays.
|
||||||
|
F_CPU = 16000000
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# LUFA specific
|
||||||
|
#
|
||||||
|
# Target architecture (see library "Board Types" documentation).
|
||||||
|
ARCH = AVR8
|
||||||
|
|
||||||
|
# Input clock frequency.
|
||||||
|
# This will define a symbol, F_USB, in all source code files equal to the
|
||||||
|
# input clock frequency (before any prescaling is performed) in Hz. This value may
|
||||||
|
# differ from F_CPU if prescaling is used on the latter, and is required as the
|
||||||
|
# raw input clock is fed directly to the PLL sections of the AVR for high speed
|
||||||
|
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
|
||||||
|
# at the end, this will be done automatically to create a 32-bit value in your
|
||||||
|
# source code.
|
||||||
|
#
|
||||||
|
# If no clock division is performed on the input clock inside the AVR (via the
|
||||||
|
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
|
||||||
|
F_USB = $(F_CPU)
|
||||||
|
|
||||||
|
# Interrupt driven control endpoint task(+60)
|
||||||
|
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
|
||||||
|
|
||||||
|
|
||||||
|
# Boot Section Size in *bytes*
|
||||||
|
# Teensy halfKay 512
|
||||||
|
# Teensy++ halfKay 1024
|
||||||
|
# Atmel DFU loader 4096
|
||||||
|
# LUFA bootloader 4096
|
||||||
|
# USBaspLoader 2048
|
||||||
|
BOOTLOADER = atmel-dfu
|
||||||
|
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||||
|
|
||||||
|
|
||||||
|
# Build Options
|
||||||
|
# change yes to no to disable
|
||||||
|
#
|
||||||
|
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||||
|
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
|
||||||
|
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||||
|
CONSOLE_ENABLE = yes # Console for debug(+400)
|
||||||
|
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||||
|
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||||
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
|
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||||
|
NKRO_ENABLE = no # USB Nkey Rollover
|
||||||
|
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||||
|
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||||
|
UNICODE_ENABLE = no # Unicode
|
||||||
|
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||||
|
AUDIO_ENABLE = no # Audio output on port C6
|
||||||
|
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||||
|
|
||||||
|
LAYOUTS = 60_ansi 60_ansi_split_bs_rshift
|
||||||
@@ -2,16 +2,19 @@
|
|||||||
|
|
||||||
extern keymap_config_t keymap_config;
|
extern keymap_config_t keymap_config;
|
||||||
|
|
||||||
#define _DV 0 // Dvorak layer
|
#define _DVORAK 0 // Dvorak layer
|
||||||
#define _QW 1 // Qwerty layer
|
#define _QWERTY 1 // Qwerty layer
|
||||||
#define _CM 2 // Colemak layer
|
#define _COLEMAK 2 // Colemak layer
|
||||||
#define _MD 3 // Media Layer
|
#define _MEDIA 3 // Media Layer
|
||||||
#define _KP 4 // Keypad Layer
|
#define _KEYPAD 4 // Keypad Layer
|
||||||
|
|
||||||
// Macro name shortcuts
|
enum custom_keycodes {
|
||||||
#define DVORAK M(_DV)
|
DVORAK = SAFE_RANGE,
|
||||||
#define QWERTY M(_QW)
|
QWERTY,
|
||||||
#define COLEMAK M(_CM)
|
COLEMAK,
|
||||||
|
MEDIA,
|
||||||
|
KEYPAD
|
||||||
|
};
|
||||||
|
|
||||||
// Fillers to make layering more clear
|
// Fillers to make layering more clear
|
||||||
#define _______ KC_TRNS
|
#define _______ KC_TRNS
|
||||||
@@ -130,7 +133,7 @@ extern keymap_config_t keymap_config;
|
|||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
[_DV] = LAYOUT (
|
[_DVORAK] = LAYOUT (
|
||||||
// Left Hand
|
// Left Hand
|
||||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
|
||||||
KC_RBRC, KC_1, KC_2, KC_3, KC_4, KC_5,
|
KC_RBRC, KC_1, KC_2, KC_3, KC_4, KC_5,
|
||||||
@@ -141,10 +144,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// Left Thumb
|
// Left Thumb
|
||||||
KC_LCTL, KC_LALT,
|
KC_LCTL, KC_LALT,
|
||||||
KC_HOME,
|
KC_HOME,
|
||||||
KC_BSPC, LT(_MD, KC_DEL), KC_END,
|
KC_BSPC, LT(_MEDIA, KC_DEL), KC_END,
|
||||||
|
|
||||||
// Right Hand
|
// Right Hand
|
||||||
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KP), RESET,
|
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KEYPAD), RESET,
|
||||||
KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC,
|
KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC,
|
||||||
KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS,
|
KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS,
|
||||||
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
|
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
|
||||||
@@ -153,10 +156,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// Right Thumb
|
// Right Thumb
|
||||||
KC_RGUI, KC_RCTL,
|
KC_RGUI, KC_RCTL,
|
||||||
KC_PGUP,
|
KC_PGUP,
|
||||||
KC_PGDN, LT(_KP, KC_ENT), KC_SPC
|
KC_PGDN, LT(_KEYPAD, KC_ENT), KC_SPC
|
||||||
),
|
),
|
||||||
|
|
||||||
[_QW] = LAYOUT (
|
[_QWERTY] = LAYOUT (
|
||||||
// Left Hand
|
// Left Hand
|
||||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
|
||||||
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5,
|
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5,
|
||||||
@@ -167,10 +170,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// Left Thumb
|
// Left Thumb
|
||||||
KC_LCTL, KC_LALT,
|
KC_LCTL, KC_LALT,
|
||||||
KC_HOME,
|
KC_HOME,
|
||||||
KC_BSPC, LT(_MD, KC_DEL), KC_END,
|
KC_BSPC, LT(_MEDIA, KC_DEL), KC_END,
|
||||||
|
|
||||||
// Right Hand
|
// Right Hand
|
||||||
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KP), RESET,
|
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KEYPAD), RESET,
|
||||||
KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
|
KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
|
||||||
KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL ,
|
KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL ,
|
||||||
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
|
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
|
||||||
@@ -179,10 +182,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// Right Thumb
|
// Right Thumb
|
||||||
KC_RGUI, KC_RCTL,
|
KC_RGUI, KC_RCTL,
|
||||||
KC_PGUP,
|
KC_PGUP,
|
||||||
KC_PGDN, LT(_KP, KC_ENT), KC_SPC
|
KC_PGDN, LT(_KEYPAD, KC_ENT), KC_SPC
|
||||||
),
|
),
|
||||||
|
|
||||||
[_CM] = LAYOUT (
|
[_COLEMAK] = LAYOUT (
|
||||||
// Left Hand
|
// Left Hand
|
||||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
|
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
|
||||||
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5,
|
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5,
|
||||||
@@ -193,10 +196,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// Left Thumb
|
// Left Thumb
|
||||||
KC_LCTL, KC_LALT,
|
KC_LCTL, KC_LALT,
|
||||||
KC_HOME,
|
KC_HOME,
|
||||||
KC_BSPC, LT(_MD, KC_DEL), KC_END,
|
KC_BSPC, LT(_MEDIA, KC_DEL), KC_END,
|
||||||
|
|
||||||
// Right Hand
|
// Right Hand
|
||||||
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KP), RESET,
|
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KEYPAD), RESET,
|
||||||
KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
|
KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
|
||||||
KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL,
|
KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL,
|
||||||
KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
|
KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
|
||||||
@@ -205,10 +208,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
// Right Thumb
|
// Right Thumb
|
||||||
KC_RGUI, KC_RCTL,
|
KC_RGUI, KC_RCTL,
|
||||||
KC_PGUP,
|
KC_PGUP,
|
||||||
KC_PGDN, LT(_KP, KC_ENT), KC_SPC
|
KC_PGDN, LT(_KEYPAD, KC_ENT), KC_SPC
|
||||||
),
|
),
|
||||||
|
|
||||||
[_MD] = LAYOUT (
|
[_MEDIA] = LAYOUT (
|
||||||
// Left Hand
|
// Left Hand
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,
|
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,
|
||||||
@@ -234,7 +237,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|||||||
_______, _______, _______
|
_______, _______, _______
|
||||||
),
|
),
|
||||||
|
|
||||||
[_KP] = LAYOUT (
|
[_KEYPAD] = LAYOUT (
|
||||||
// Left Hand
|
// Left Hand
|
||||||
_______, _______, _______, _______, _______, _______, _______, _______, _______,
|
_______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||||
KC_PWR, _______, _______, _______, _______, _______,
|
KC_PWR, _______, _______, _______, _______, _______,
|
||||||
@@ -272,28 +275,63 @@ void persistent_default_layer_set(uint16_t default_layer) {
|
|||||||
default_layer_set(default_layer);
|
default_layer_set(default_layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
{
|
switch (keycode) {
|
||||||
switch(id) {
|
case DVORAK:
|
||||||
case _DV:
|
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
persistent_default_layer_set(1UL<<_DV);
|
persistent_default_layer_set(1UL<<_DVORAK);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
break;
|
break;
|
||||||
case _QW:
|
case QWERTY:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
persistent_default_layer_set(1UL<<_QW);
|
persistent_default_layer_set(1UL<<_QWERTY);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
break;
|
break;
|
||||||
case _CM:
|
case COLEMAK:
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
persistent_default_layer_set(1UL<<_CM);
|
persistent_default_layer_set(1UL<<_COLEMAK);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return MACRO_NONE;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// getting the LEDs working...
|
||||||
|
void led_set_user(uint8_t usb_led) {
|
||||||
|
|
||||||
|
DDRF |= (1<<0); // Keypad LED
|
||||||
|
if (usb_led & (1<<USB_LED_COMPOSE)) {
|
||||||
|
PORTF |= (1<<0);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<0);
|
||||||
|
}
|
||||||
|
|
||||||
|
DDRF |= (1<<1); // ScrLock LED
|
||||||
|
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
|
||||||
|
PORTF |= (1<<1);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<1);
|
||||||
|
}
|
||||||
|
|
||||||
|
DDRF |= (1<<2); // NumLock LED
|
||||||
|
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
|
||||||
|
PORTF |= (1<<2);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<2);
|
||||||
|
}
|
||||||
|
|
||||||
|
DDRF |= (1<<3); // CapsLock LED
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
PORTF |= (1<<3);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<3);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Runs just one time when the keyboard initializes.
|
// Runs just one time when the keyboard initializes.
|
||||||
void matrix_init_user(void) {
|
void matrix_init_user(void) {
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,11 @@
|
|||||||
void matrix_init_kb(void) {
|
void matrix_init_kb(void) {
|
||||||
// put your keyboard start-up code here
|
// put your keyboard start-up code here
|
||||||
// runs once when the firmware starts up
|
// runs once when the firmware starts up
|
||||||
|
// * Set our LED pins as output
|
||||||
|
DDRF |= (1<<0); // Keypad LED
|
||||||
|
DDRF |= (1<<1); // ScrLock LED
|
||||||
|
DDRF |= (1<<2); // NumLock LED
|
||||||
|
DDRF |= (1<<3); // CapsLock LED
|
||||||
|
|
||||||
matrix_init_user();
|
matrix_init_user();
|
||||||
}
|
}
|
||||||
@@ -21,8 +26,42 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
|
|||||||
return process_record_user(keycode, record);
|
return process_record_user(keycode, record);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void led_init_ports() {
|
||||||
|
// * Set our LED pins as output
|
||||||
|
DDRF |= (1<<0); // Keypad LED
|
||||||
|
DDRF |= (1<<1); // ScrLock LED
|
||||||
|
DDRF |= (1<<2); // NumLock LED
|
||||||
|
DDRF |= (1<<3); // CapsLock LED
|
||||||
|
}
|
||||||
|
|
||||||
void led_set_kb(uint8_t usb_led) {
|
void led_set_kb(uint8_t usb_led) {
|
||||||
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
|
DDRF |= (1<<0); // Keypad LED
|
||||||
|
if (usb_led & (1<<USB_LED_COMPOSE)) {
|
||||||
|
PORTF |= (1<<0);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<0);
|
||||||
|
}
|
||||||
|
|
||||||
|
DDRF |= (1<<1); // ScrLock LED
|
||||||
|
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
|
||||||
|
PORTF |= (1<<1);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<1);
|
||||||
|
}
|
||||||
|
|
||||||
|
DDRF |= (1<<2); // NumLock LED
|
||||||
|
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
|
||||||
|
PORTF |= (1<<2);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<2);
|
||||||
|
}
|
||||||
|
|
||||||
|
DDRF |= (1<<3); // CapsLock LED
|
||||||
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
|
PORTF |= (1<<3);
|
||||||
|
} else {
|
||||||
|
PORTF &= ~(1<<3);
|
||||||
|
}
|
||||||
|
|
||||||
led_set_user(usb_led);
|
led_set_user(usb_led);
|
||||||
|
|
||||||
@@ -38,3 +77,15 @@ inline void kinesis_caps_led_off(void) { DDRF &= ~(1<<3); PORTF &= ~(1<<3); }
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This is the old code that has the port information in it.
|
||||||
|
inline void kinesis_keypad_led_on(void) { DDRF |= (1<<0); PORTF |= (1<<0); }
|
||||||
|
inline void kinesis_scroll_led_on(void) { DDRF |= (1<<1); PORTF |= (1<<1); }
|
||||||
|
inline void kinesis_num_led_on(void) { DDRF |= (1<<2); PORTF |= (1<<2); }
|
||||||
|
inline void kinesis_caps_led_on(void) { DDRF |= (1<<3); PORTF |= (1<<3); }
|
||||||
|
|
||||||
|
inline void kinesis_keypad_led_off(void) { DDRF &= ~(1<<0); PORTF &= ~(1<<0); }
|
||||||
|
inline void kinesis_scroll_led_off(void) { DDRF &= ~(1<<1); PORTF &= ~(1<<1); }
|
||||||
|
inline void kinesis_num_led_off(void) { DDRF &= ~(1<<2); PORTF &= ~(1<<2); }
|
||||||
|
inline void kinesis_caps_led_off(void) { DDRF &= ~(1<<3); PORTF &= ~(1<<3); }
|
||||||
|
*/
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "maxipad",
|
||||||
|
"url": "",
|
||||||
|
"maintainer": "qmk",
|
||||||
|
"width": 6,
|
||||||
|
"height": 5,
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
#include "maxipad.h"
|
#include "maxipad.h"
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[0] = KEYMAP( /* Base */
|
[0] = LAYOUT( /* Base */
|
||||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, \
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, \
|
||||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, \
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, \
|
||||||
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, \
|
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, \
|
||||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, \
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, \
|
||||||
KC_LCTL, KC_LALT, MO(1), KC_ENT,KC_GRV,KC_SPC \
|
KC_LCTL, KC_LALT, MO(1), KC_ENT,KC_GRV,KC_SPC \
|
||||||
),
|
),
|
||||||
[1] = KEYMAP(
|
[1] = LAYOUT(
|
||||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, \
|
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, \
|
||||||
KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, \
|
KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, \
|
||||||
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, \
|
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, \
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
// The following is an example using the Planck MIT layout
|
// The following is an example using the Planck MIT layout
|
||||||
// The first section contains all of the arguements
|
// The first section contains all of the arguements
|
||||||
// The second converts the arguments into a two-dimensional array
|
// The second converts the arguments into a two-dimensional array
|
||||||
#define KEYMAP( \
|
#define LAYOUT( \
|
||||||
k00, k01, k02, k03, k04, k05, \
|
k00, k01, k02, k03, k04, k05, \
|
||||||
k10, k11, k12, k13, k14, k15, \
|
k10, k11, k12, k13, k14, k15, \
|
||||||
k20, k21, k22, k23, k24, k25, \
|
k20, k21, k22, k23, k24, k25, \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Maxipad keyboard firmware
|
# Maxipad
|
||||||
|
|
||||||
## Quantum MK Firmware
|
## Quantum MK Firmware
|
||||||
|
|
||||||
@@ -7,23 +7,11 @@ For the full Quantum feature list, see [the parent readme.md](/readme.md).
|
|||||||
If you are using a pro micro then make sure to enable USE_PRO_MICRO in the makefile
|
If you are using a pro micro then make sure to enable USE_PRO_MICRO in the makefile
|
||||||
Change the config.h pinout to match your mcu!!
|
Change the config.h pinout to match your mcu!!
|
||||||
|
|
||||||
Download or clone the whole firmware and navigate to the keyboards/maxipad folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
|
|
||||||
|
|
||||||
Depending on which keymap you would like to use, you will have to compile slightly differently.
|
Depending on which keymap you would like to use, you will have to compile slightly differently.
|
||||||
|
|
||||||
### Default
|
### Default
|
||||||
|
|
||||||
To build with the default keymap, simply run `make`.
|
To build with the default keymap, simply run `make maxipad:default`.
|
||||||
|
|
||||||
|
|
||||||
### Other Keymaps
|
### Other Keymaps
|
||||||
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
|
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
|
||||||
|
|
||||||
|
|
||||||
To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ make [default|jack|<name>]
|
|
||||||
```
|
|
||||||
|
|
||||||
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
|
|
||||||
@@ -3,6 +3,11 @@
|
|||||||
|
|
||||||
#include "../../config.h"
|
#include "../../config.h"
|
||||||
|
|
||||||
|
#define QMK_ESC_OUTPUT F1
|
||||||
|
#define QMK_ESC_INPUT D5
|
||||||
|
#define QMK_LED E6
|
||||||
|
#define QMK_SPEAKER C6
|
||||||
|
|
||||||
#define _______ KC_TRNS
|
#define _______ KC_TRNS
|
||||||
#define XXXXXXX KC_NO
|
#define XXXXXXX KC_NO
|
||||||
#define PREVENT_STUCK_MODIFIERS
|
#define PREVENT_STUCK_MODIFIERS
|
||||||
|
|||||||
@@ -10,3 +10,4 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
|||||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||||
AUDIO_ENABLE = no
|
AUDIO_ENABLE = no
|
||||||
API_SYSEX_ENABLE = no
|
API_SYSEX_ENABLE = no
|
||||||
|
BOOTLOADER = qmk-dfu
|
||||||
@@ -1,32 +1,27 @@
|
|||||||
{
|
{
|
||||||
"keyboard_name": "pk60",
|
"keyboard_name": "pk60",
|
||||||
"url": "",
|
"url": "",
|
||||||
"maintainer": "qmk",
|
"maintainer": "qmk",
|
||||||
"width": 15,
|
"width": 15,
|
||||||
"height": 5,
|
"height": 5,
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"LAYOUT_ansi": {
|
"LAYOUT_60_ansi_split_bs_rshift": {
|
||||||
"layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Del", "x":13, "y":0}, {"label":"Bs", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
|
"layout": [{"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Del", "x": 13, "y": 0}, {"label": "Bs", "x": 14, "y": 0}, {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "Enter", "x": 12.75, "y": 2, "w": 2.25}, {"label": "Shift", "x": 0, "y": 3, "w": 2.25}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "?", "x": 11.25, "y": 3}, {"label": "Shift", "x": 12.25, "y": 3, "w": 1.75}, {"x": 14, "y": 3}, {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "x": 10, "y": 4, "w": 1.25}, {"label": "Win", "x": 11.25, "y": 4, "w": 1.25}, {"label": "Menu", "x": 12.5, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 13.75, "y": 4, "w": 1.25}]
|
||||||
},
|
},
|
||||||
|
"LAYOUT_iso": {
|
||||||
"LAYOUT_iso": {
|
"layout": [{"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Del", "x": 13, "y": 0}, {"label": "Bs", "x": 14, "y": 0}, {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "@", "x": 11.75, "y": 2}, {"label": "~", "x": 12.75, "y": 2}, {"label": "Enter", "x": 13.75, "y": 1, "w": 1.25, "h": 2}, {"label": "Shift", "x": 0, "y": 3, "w": 1.25}, {"label": "|", "x": 1.25, "y": 3}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "?", "x": 11.25, "y": 3}, {"label": "Shift", "x": 12.25, "y": 3, "w": 1.75}, {"x": 14, "y": 3}, {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "x": 10, "y": 4, "w": 1.25}, {"label": "Win", "x": 11.25, "y": 4, "w": 1.25}, {"label": "Menu", "x": 12.5, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 13.75, "y": 4, "w": 1.25}]
|
||||||
"layout": [{"label":"~", "x":0, "y":0.25}, {"label":"!", "x":1, "y":0.25}, {"label":"@", "x":2, "y":0.25}, {"label":"#", "x":3, "y":0.25}, {"label":"$", "x":4, "y":0.25}, {"label":"%", "x":5, "y":0.25}, {"label":"^", "x":6, "y":0.25}, {"label":"&", "x":7, "y":0.25}, {"label":"*", "x":8, "y":0.25}, {"label":"(", "x":9, "y":0.25}, {"label":")", "x":10, "y":0.25}, {"label":"_", "x":11, "y":0.25}, {"label":"+", "x":12, "y":0.25}, {"label":"Del", "x":13, "y":0.25}, {"label":"Bs", "x":14, "y":0.25}, {"label":"Tab", "x":0, "y":1.25, "w":1.5}, {"label":"Q", "x":1.5, "y":1.25}, {"label":"W", "x":2.5, "y":1.25}, {"label":"E", "x":3.5, "y":1.25}, {"label":"R", "x":4.5, "y":1.25}, {"label":"T", "x":5.5, "y":1.25}, {"label":"Y", "x":6.5, "y":1.25}, {"label":"U", "x":7.5, "y":1.25}, {"label":"I", "x":8.5, "y":1.25}, {"label":"O", "x":9.5, "y":1.25}, {"label":"P", "x":10.5, "y":1.25}, {"label":"{", "x":11.5, "y":1.25}, {"label":"}", "x":12.5, "y":1.25}, {"label":"Enter", "x":13.75, "y":1.25, "w":1.25, "h":2}, {"label":"Caps Lock", "x":0, "y":2.25, "w":1.75}, {"label":"A", "x":1.75, "y":2.25}, {"label":"S", "x":2.75, "y":2.25}, {"label":"D", "x":3.75, "y":2.25}, {"label":"F", "x":4.75, "y":2.25}, {"label":"G", "x":5.75, "y":2.25}, {"label":"H", "x":6.75, "y":2.25}, {"label":"J", "x":7.75, "y":2.25}, {"label":"K", "x":8.75, "y":2.25}, {"label":"L", "x":9.75, "y":2.25}, {"label":":", "x":10.75, "y":2.25}, {"label":"@", "x":11.75, "y":2.25}, {"label":"~", "x":12.75, "y":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":1.25}, {"label":"|", "x":1.25, "y":3.25}, {"label":"Z", "x":2.25, "y":3.25}, {"label":"X", "x":3.25, "y":3.25}, {"label":"C", "x":4.25, "y":3.25}, {"label":"V", "x":5.25, "y":3.25}, {"label":"B", "x":6.25, "y":3.25}, {"label":"N", "x":7.25, "y":3.25}, {"label":"M", "x":8.25, "y":3.25}, {"label":"<", "x":9.25, "y":3.25}, {"label":">", "x":10.25, "y":3.25}, {"label":"?", "x":11.25, "y":3.25}, {"label":"Shift", "x":12.25, "y":3.25, "w":1.75}, {"x":14, "y":3.25}, {"label":"Ctrl", "x":0, "y":4.25, "w":1.25}, {"label":"Win", "x":1.25, "y":4.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":4.25, "w":1.25}, {"x":3.75, "y":4.25, "w":6.25}, {"label":"Alt", "x":10, "y":4.25, "w":1.25}, {"label":"Win", "x":11.25, "y":4.25, "w":1.25}, {"label":"Menu", "x":12.5, "y":4.25, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4.25, "w":1.25}]
|
},
|
||||||
},
|
"LAYOUT_225u_arrow": {
|
||||||
|
"layout": [{"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Del", "x": 13, "y": 0}, {"label": "Bs", "x": 14, "y": 0}, {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "Enter", "x": 12.75, "y": 2, "w": 2.25}, {"label": "Shift", "x": 0, "y": 3, "w": 2.25}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "Shift", "x": 11.25, "y": 3, "w": 1.75}, {"label": "Up", "x": 13, "y": 3}, {"x": 14, "y": 3}, {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "x": 10, "y": 4}, {"label": "Ctrl", "x": 11, "y": 4}, {"label": "Left", "x": 12, "y": 4}, {"label": "Down", "x": 13, "y": 4}, {"label": "Right", "x": 14, "y": 4}]
|
||||||
"LAYOUT_225u_arrow": {
|
},
|
||||||
"layout": [{"label":"~", "x":0, "y":0.25}, {"label":"!", "x":1, "y":0.25}, {"label":"@", "x":2, "y":0.25}, {"label":"#", "x":3, "y":0.25}, {"label":"$", "x":4, "y":0.25}, {"label":"%", "x":5, "y":0.25}, {"label":"^", "x":6, "y":0.25}, {"label":"&", "x":7, "y":0.25}, {"label":"*", "x":8, "y":0.25}, {"label":"(", "x":9, "y":0.25}, {"label":")", "x":10, "y":0.25}, {"label":"_", "x":11, "y":0.25}, {"label":"+", "x":12, "y":0.25}, {"label":"Del", "x":13, "y":0.25}, {"label":"Bs", "x":14, "y":0.25}, {"label":"Tab", "x":0, "y":1.25, "w":1.5}, {"label":"Q", "x":1.5, "y":1.25}, {"label":"W", "x":2.5, "y":1.25}, {"label":"E", "x":3.5, "y":1.25}, {"label":"R", "x":4.5, "y":1.25}, {"label":"T", "x":5.5, "y":1.25}, {"label":"Y", "x":6.5, "y":1.25}, {"label":"U", "x":7.5, "y":1.25}, {"label":"I", "x":8.5, "y":1.25}, {"label":"O", "x":9.5, "y":1.25}, {"label":"P", "x":10.5, "y":1.25}, {"label":"{", "x":11.5, "y":1.25}, {"label":"}", "x":12.5, "y":1.25}, {"label":"|", "x":13.5, "y":1.25, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2.25, "w":1.75}, {"label":"A", "x":1.75, "y":2.25}, {"label":"S", "x":2.75, "y":2.25}, {"label":"D", "x":3.75, "y":2.25}, {"label":"F", "x":4.75, "y":2.25}, {"label":"G", "x":5.75, "y":2.25}, {"label":"H", "x":6.75, "y":2.25}, {"label":"J", "x":7.75, "y":2.25}, {"label":"K", "x":8.75, "y":2.25}, {"label":"L", "x":9.75, "y":2.25}, {"label":":", "x":10.75, "y":2.25}, {"label":"\"", "x":11.75, "y":2.25}, {"label":"Enter", "x":12.75, "y":2.25, "w":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":2.25}, {"label":"Z", "x":2.25, "y":3.25}, {"label":"X", "x":3.25, "y":3.25}, {"label":"C", "x":4.25, "y":3.25}, {"label":"V", "x":5.25, "y":3.25}, {"label":"B", "x":6.25, "y":3.25}, {"label":"N", "x":7.25, "y":3.25}, {"label":"M", "x":8.25, "y":3.25}, {"label":"<", "x":9.25, "y":3.25}, {"label":">", "x":10.25, "y":3.25}, {"label":"Shift", "x":11.25, "y":3.25, "w":1.75}, {"label":"Up", "x":13, "y":3.25}, {"x":14, "y":3.25}, {"label":"Ctrl", "x":0, "y":4.25, "w":1.25}, {"label":"Win", "x":1.25, "y":4.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":4.25, "w":1.25}, {"x":3.75, "y":4.25, "w":6.25}, {"label":"Alt", "x":10, "y":4.25}, {"label":"Ctrl", "x":11, "y":4.25}, {"label":"Left", "x":12, "y":4.25}, {"label":"Down", "x":13, "y":4.25}, {"label":"Right", "x":14, "y":4.25}]
|
"LAYOUT_2u_arrow": {
|
||||||
},
|
"layout": [{"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Del", "x": 13, "y": 0}, {"label": "Bs", "x": 14, "y": 0}, {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "Enter", "x": 12.75, "y": 2, "w": 2.25}, {"label": "Shift", "x": 0, "y": 3, "w": 2}, {"label": "Z", "x": 2, "y": 3}, {"label": "X", "x": 3, "y": 3}, {"label": "C", "x": 4, "y": 3}, {"label": "V", "x": 5, "y": 3}, {"label": "B", "x": 6, "y": 3}, {"label": "N", "x": 7, "y": 3}, {"label": "M", "x": 8, "y": 3}, {"label": "<", "x": 9, "y": 3}, {"label": ">", "x": 10, "y": 3}, {"label": "?", "x": 11, "y": 3}, {"label": "Shift", "x": 12, "y": 3}, {"label": "Up", "x": 13, "y": 3}, {"x": 14, "y": 3}, {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "x": 10, "y": 4}, {"label": "Ctrl", "x": 11, "y": 4}, {"label": "Left", "x": 12, "y": 4}, {"label": "Down", "x": 13, "y": 4}, {"label": "Right", "x": 14, "y": 4}]
|
||||||
|
},
|
||||||
"LAYOUT_2u_arrow": {
|
"LAYOUT_minila": {
|
||||||
"layout": [{"label":"~", "x":0, "y":0.25}, {"label":"!", "x":1, "y":0.25}, {"label":"@", "x":2, "y":0.25}, {"label":"#", "x":3, "y":0.25}, {"label":"$", "x":4, "y":0.25}, {"label":"%", "x":5, "y":0.25}, {"label":"^", "x":6, "y":0.25}, {"label":"&", "x":7, "y":0.25}, {"label":"*", "x":8, "y":0.25}, {"label":"(", "x":9, "y":0.25}, {"label":")", "x":10, "y":0.25}, {"label":"_", "x":11, "y":0.25}, {"label":"+", "x":12, "y":0.25}, {"label":"Del", "x":13, "y":0.25}, {"label":"Bs", "x":14, "y":0.25}, {"label":"Tab", "x":0, "y":1.25, "w":1.5}, {"label":"Q", "x":1.5, "y":1.25}, {"label":"W", "x":2.5, "y":1.25}, {"label":"E", "x":3.5, "y":1.25}, {"label":"R", "x":4.5, "y":1.25}, {"label":"T", "x":5.5, "y":1.25}, {"label":"Y", "x":6.5, "y":1.25}, {"label":"U", "x":7.5, "y":1.25}, {"label":"I", "x":8.5, "y":1.25}, {"label":"O", "x":9.5, "y":1.25}, {"label":"P", "x":10.5, "y":1.25}, {"label":"{", "x":11.5, "y":1.25}, {"label":"}", "x":12.5, "y":1.25}, {"label":"|", "x":13.5, "y":1.25, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2.25, "w":1.75}, {"label":"A", "x":1.75, "y":2.25}, {"label":"S", "x":2.75, "y":2.25}, {"label":"D", "x":3.75, "y":2.25}, {"label":"F", "x":4.75, "y":2.25}, {"label":"G", "x":5.75, "y":2.25}, {"label":"H", "x":6.75, "y":2.25}, {"label":"J", "x":7.75, "y":2.25}, {"label":"K", "x":8.75, "y":2.25}, {"label":"L", "x":9.75, "y":2.25}, {"label":":", "x":10.75, "y":2.25}, {"label":"\"", "x":11.75, "y":2.25}, {"label":"Enter", "x":12.75, "y":2.25, "w":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":2}, {"label":"Z", "x":2, "y":3.25}, {"label":"X", "x":3, "y":3.25}, {"label":"C", "x":4, "y":3.25}, {"label":"V", "x":5, "y":3.25}, {"label":"B", "x":6, "y":3.25}, {"label":"N", "x":7, "y":3.25}, {"label":"M", "x":8, "y":3.25}, {"label":"<", "x":9, "y":3.25}, {"label":">", "x":10, "y":3.25}, {"label":"?", "x":11, "y":3.25}, {"label":"Shift", "x":12, "y":3.25}, {"label":"Up", "x":13, "y":3.25}, {"x":14, "y":3.25}, {"label":"Ctrl", "x":0, "y":4.25, "w":1.25}, {"label":"Win", "x":1.25, "y":4.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":4.25, "w":1.25}, {"x":3.75, "y":4.25, "w":6.25}, {"label":"Alt", "x":10, "y":4.25}, {"label":"Ctrl", "x":11, "y":4.25}, {"label":"Left", "x":12, "y":4.25}, {"label":"Down", "x":13, "y":4.25}, {"label":"Right", "x":14, "y":4.25}]
|
"layout": [{"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Del", "x": 13, "y": 0}, {"label": "Bs", "x": 14, "y": 0}, {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "Enter", "x": 12.75, "y": 2, "w": 2.25}, {"label": "Shift", "x": 0, "y": 3, "w": 2}, {"label": "Z", "x": 2, "y": 3}, {"label": "X", "x": 3, "y": 3}, {"label": "C", "x": 4, "y": 3}, {"label": "V", "x": 5, "y": 3}, {"label": "B", "x": 6, "y": 3}, {"label": "N", "x": 7, "y": 3}, {"label": "M", "x": 8, "y": 3}, {"label": "<", "x": 9, "y": 3}, {"label": ">", "x": 10, "y": 3}, {"label": "?", "x": 11, "y": 3}, {"label": "Shift", "x": 12, "y": 3}, {"label": "Up", "x": 13, "y": 3}, {"x": 14, "y": 3}, {"label": "Ctrl", "x": 0, "y": 4, "w": 1.75}, {"label": "Win", "x": 1.75, "y": 4, "w": 1.25}, {"label": "Alt", "x": 3, "y": 4, "w": 1.25}, {"x": 4.25, "y": 4, "w": 1.25}, {"x": 5.5, "y": 4, "w": 3}, {"label": "Alt", "x": 8.5, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 9.75, "y": 4, "w": 1.25}, {"x": 11, "y": 4}, {"label": "Left", "x": 12, "y": 4}, {"label": "Down", "x": 13, "y": 4}, {"label": "Right", "x": 14, "y": 4}]
|
||||||
},
|
},
|
||||||
|
"LAYOUT_all": {
|
||||||
"LAYOUT_minila": {
|
"layout": [{"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Del", "x": 13, "y": 0}, {"label": "Bs", "x": 14, "y": 0}, {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "\"", "x": 12.75, "y": 2}, {"label": "Enter", "x": 13.75, "y": 2, "w": 1.25}, {"label": "Shift", "x": 0, "y": 3}, {"x": 1, "y": 3}, {"label": "Z", "x": 2, "y": 3}, {"label": "X", "x": 3, "y": 3}, {"label": "C", "x": 4, "y": 3}, {"label": "V", "x": 5, "y": 3}, {"label": "B", "x": 6, "y": 3}, {"label": "N", "x": 7, "y": 3}, {"label": "M", "x": 8, "y": 3}, {"label": "<", "x": 9, "y": 3}, {"label": ">", "x": 10, "y": 3}, {"label": "?", "x": 11, "y": 3}, {"label": "Shift", "x": 12, "y": 3}, {"label": "Up", "x": 13, "y": 3}, {"x": 14, "y": 3}, {"label": "Ctrl", "x": 0, "y": 4, "w": 1.75}, {"label": "Win", "x": 1.75, "y": 4, "w": 1.25}, {"label": "Alt", "x": 3, "y": 4, "w": 1.25}, {"x": 4.25, "y": 4, "w": 1.25}, {"x": 5.5, "y": 4, "w": 3}, {"x": 8.5, "y": 4, "w": 1.25}, {"label": "Alt", "x": 9.75, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 11, "y": 4}, {"label": "Left", "x": 12, "y": 4}, {"label": "Down", "x": 13, "y": 4}, {"label": "Right", "x": 14, "y": 4}]
|
||||||
"layout": [{"label":"~", "x":0, "y":0.25}, {"label":"!", "x":1, "y":0.25}, {"label":"@", "x":2, "y":0.25}, {"label":"#", "x":3, "y":0.25}, {"label":"$", "x":4, "y":0.25}, {"label":"%", "x":5, "y":0.25}, {"label":"^", "x":6, "y":0.25}, {"label":"&", "x":7, "y":0.25}, {"label":"*", "x":8, "y":0.25}, {"label":"(", "x":9, "y":0.25}, {"label":")", "x":10, "y":0.25}, {"label":"_", "x":11, "y":0.25}, {"label":"+", "x":12, "y":0.25}, {"label":"Del", "x":13, "y":0.25}, {"label":"Bs", "x":14, "y":0.25}, {"label":"Tab", "x":0, "y":1.25, "w":1.5}, {"label":"Q", "x":1.5, "y":1.25}, {"label":"W", "x":2.5, "y":1.25}, {"label":"E", "x":3.5, "y":1.25}, {"label":"R", "x":4.5, "y":1.25}, {"label":"T", "x":5.5, "y":1.25}, {"label":"Y", "x":6.5, "y":1.25}, {"label":"U", "x":7.5, "y":1.25}, {"label":"I", "x":8.5, "y":1.25}, {"label":"O", "x":9.5, "y":1.25}, {"label":"P", "x":10.5, "y":1.25}, {"label":"{", "x":11.5, "y":1.25}, {"label":"}", "x":12.5, "y":1.25}, {"label":"|", "x":13.5, "y":1.25, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2.25, "w":1.75}, {"label":"A", "x":1.75, "y":2.25}, {"label":"S", "x":2.75, "y":2.25}, {"label":"D", "x":3.75, "y":2.25}, {"label":"F", "x":4.75, "y":2.25}, {"label":"G", "x":5.75, "y":2.25}, {"label":"H", "x":6.75, "y":2.25}, {"label":"J", "x":7.75, "y":2.25}, {"label":"K", "x":8.75, "y":2.25}, {"label":"L", "x":9.75, "y":2.25}, {"label":":", "x":10.75, "y":2.25}, {"label":"\"", "x":11.75, "y":2.25}, {"label":"Enter", "x":12.75, "y":2.25, "w":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":2}, {"label":"Z", "x":2, "y":3.25}, {"label":"X", "x":3, "y":3.25}, {"label":"C", "x":4, "y":3.25}, {"label":"V", "x":5, "y":3.25}, {"label":"B", "x":6, "y":3.25}, {"label":"N", "x":7, "y":3.25}, {"label":"M", "x":8, "y":3.25}, {"label":"<", "x":9, "y":3.25}, {"label":">", "x":10, "y":3.25}, {"label":"?", "x":11, "y":3.25}, {"label":"Shift", "x":12, "y":3.25}, {"label":"Up", "x":13, "y":3.25}, {"x":14, "y":3.25}, {"label":"Ctrl", "x":0, "y":4.25, "w":1.75}, {"label":"Win", "x":1.75, "y":4.25, "w":1.25}, {"label":"Alt", "x":3, "y":4.25, "w":1.25}, {"x":4.25, "y":4.25, "w":1.25}, {"x":5.5, "y":4.25, "w":3}, {"label":"Alt", "x":8.5, "y":4.25, "w":1.25}, {"label":"Ctrl", "x":9.75, "y":4.25, "w":1.25}, {"x":11, "y":4.25}, {"label":"Left", "x":12, "y":4.25}, {"label":"Down", "x":13, "y":4.25}, {"label":"Right", "x":14, "y":4.25}]
|
|
||||||
},
|
|
||||||
|
|
||||||
"LAYOUT_all": {
|
|
||||||
"layout": [{"label":"~", "x":0, "y":0.25}, {"label":"!", "x":1, "y":0.25}, {"label":"@", "x":2, "y":0.25}, {"label":"#", "x":3, "y":0.25}, {"label":"$", "x":4, "y":0.25}, {"label":"%", "x":5, "y":0.25}, {"label":"^", "x":6, "y":0.25}, {"label":"&", "x":7, "y":0.25}, {"label":"*", "x":8, "y":0.25}, {"label":"(", "x":9, "y":0.25}, {"label":")", "x":10, "y":0.25}, {"label":"_", "x":11, "y":0.25}, {"label":"+", "x":12, "y":0.25}, {"label":"Del", "x":13, "y":0.25}, {"label":"Bs", "x":14, "y":0.25}, {"label":"Tab", "x":0, "y":1.25, "w":1.5}, {"label":"Q", "x":1.5, "y":1.25}, {"label":"W", "x":2.5, "y":1.25}, {"label":"E", "x":3.5, "y":1.25}, {"label":"R", "x":4.5, "y":1.25}, {"label":"T", "x":5.5, "y":1.25}, {"label":"Y", "x":6.5, "y":1.25}, {"label":"U", "x":7.5, "y":1.25}, {"label":"I", "x":8.5, "y":1.25}, {"label":"O", "x":9.5, "y":1.25}, {"label":"P", "x":10.5, "y":1.25}, {"label":"{", "x":11.5, "y":1.25}, {"label":"}", "x":12.5, "y":1.25}, {"label":"|", "x":13.5, "y":1.25, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2.25, "w":1.75}, {"label":"A", "x":1.75, "y":2.25}, {"label":"S", "x":2.75, "y":2.25}, {"label":"D", "x":3.75, "y":2.25}, {"label":"F", "x":4.75, "y":2.25}, {"label":"G", "x":5.75, "y":2.25}, {"label":"H", "x":6.75, "y":2.25}, {"label":"J", "x":7.75, "y":2.25}, {"label":"K", "x":8.75, "y":2.25}, {"label":"L", "x":9.75, "y":2.25}, {"label":":", "x":10.75, "y":2.25}, {"label":"\"", "x":11.75, "y":2.25}, {"label":"\"", "x":12.75, "y":2.25}, {"label":"Enter", "x":13.75, "y":2.25, "w":1.25}, {"label":"Shift", "x":0, "y":3.25}, {"x":1, "y":3.25}, {"label":"Z", "x":2, "y":3.25}, {"label":"X", "x":3, "y":3.25}, {"label":"C", "x":4, "y":3.25}, {"label":"V", "x":5, "y":3.25}, {"label":"B", "x":6, "y":3.25}, {"label":"N", "x":7, "y":3.25}, {"label":"M", "x":8, "y":3.25}, {"label":"<", "x":9, "y":3.25}, {"label":">", "x":10, "y":3.25}, {"label":"?", "x":11, "y":3.25}, {"label":"Shift", "x":12, "y":3.25}, {"label":"Up", "x":13, "y":3.25}, {"x":14, "y":3.25}, {"label":"Ctrl", "x":0, "y":4.25, "w":1.75}, {"label":"Win", "x":1.75, "y":4.25, "w":1.25}, {"label":"Alt", "x":3, "y":4.25, "w":1.25}, {"x":4.25, "y":4.25, "w":1.25}, {"x":5.5, "y":4.25, "w":3}, {"x":8.5, "y":4.25, "w":1.25}, {"label":"Alt", "x":9.75, "y":4.25, "w":1.25}, {"label":"Ctrl", "x":11, "y":4.25}, {"label":"Left", "x":12, "y":4.25}, {"label":"Down", "x":13, "y":4.25}, {"label":"Right", "x":14, "y":4.25}]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,20 +1,24 @@
|
|||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
#define _______ KC_TRNS
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
|
||||||
LAYOUT_all(
|
[0] = LAYOUT_all( \
|
||||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC,
|
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC, \
|
||||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
|
||||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT,
|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \
|
||||||
KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_RSFT, MO(1),
|
KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_RSFT, MO(1), \
|
||||||
KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, MO(1), KC_RALT, MO(1), KC_NO, KC_APP, KC_RCTL),
|
KC_LCTL, KC_LGUI, KC_LALT, MO(1), KC_SPC, MO(1), KC_RALT, MO(1), KC_NO, KC_APP, KC_RCTL \
|
||||||
|
),
|
||||||
|
|
||||||
LAYOUT_all(
|
[1] = LAYOUT_all( \
|
||||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL,
|
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, \
|
||||||
RESET, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_PSCR, KC_CALC,
|
RESET, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_PSCR, KC_CALC, \
|
||||||
KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_SLCK, KC_TRNS,
|
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_SLCK, _______, \
|
||||||
KC_TRNS, KC_TRNS, RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
_______, _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||||
|
),
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -26,34 +30,34 @@ void matrix_scan_user(void) {
|
|||||||
|
|
||||||
void led_set_user(uint8_t usb_led) {
|
void led_set_user(uint8_t usb_led) {
|
||||||
|
|
||||||
if (usb_led & (1 << USB_LED_NUM_LOCK)) {
|
if (usb_led & (1 << USB_LED_NUM_LOCK)) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
|
if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
|
||||||
DDRF |= (1 << 4); PORTF &= ~(1 << 4);
|
DDRF |= (1 << 4); PORTF &= ~(1 << 4);
|
||||||
} else {
|
} else {
|
||||||
DDRF &= ~(1 << 4); PORTF &= ~(1 << 4);
|
DDRF &= ~(1 << 4); PORTF &= ~(1 << 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
|
if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usb_led & (1 << USB_LED_COMPOSE)) {
|
if (usb_led & (1 << USB_LED_COMPOSE)) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usb_led & (1 << USB_LED_KANA)) {
|
if (usb_led & (1 << USB_LED_KANA)) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
#define LAYOUT_ansi( \
|
#define LAYOUT_60_ansi_split_bs_rshift( \
|
||||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
|
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
|
||||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
|
||||||
|
|||||||
Loaded 100 of 217 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user