#ifdef BACKLIGHT_ENABLE
case ACT_BACKLIGHT:
if (!event.pressed) {
- switch (action.backlight.id) {
+ switch (action.backlight.opt) {
case BACKLIGHT_INCREASE:
backlight_increase();
break;
case BACKLIGHT_STEP:
backlight_step();
break;
+ case BACKLIGHT_LEVEL:
+ backlight_level(action.backlight.level);
+ break;
}
}
break;
* 1100|1111| id(8) Macro record?
*
* ACT_BACKLIGHT(1101):
- * 1101|xxxx| id(8) Backlight commands
+ * 1101|opt |level(8) Backlight commands
*
* ACT_COMMAND(1110):
* 1110|opt | id(8) Built-in Command exec
uint8_t kind :4;
} usage;
struct action_backlight {
- uint8_t id :8;
+ uint8_t level :8;
+ uint8_t opt :4;
+ uint8_t kind :4;
} backlight;
struct action_command {
uint8_t id :8;
/*
* Extensions
*/
-enum backlight_id {
+enum backlight_opt {
BACKLIGHT_INCREASE = 0,
BACKLIGHT_DECREASE = 1,
BACKLIGHT_TOGGLE = 2,
BACKLIGHT_STEP = 3,
+ BACKLIGHT_LEVEL = 4,
};
/* Macro */
#define ACTION_MACRO(id) ACTION(ACT_MACRO, (id))
#define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP<<8 | (id))
#define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt)<<8 | (id))
/* Backlight */
-#define ACTION_BACKLIGHT_INCREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE)
-#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE)
-#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE)
-#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP)
+#define ACTION_BACKLIGHT_INCREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_INCREASE << 8)
+#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8)
+#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8)
+#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8)
+#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | level)
/* Command */
#define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr))
/* Function */
dprintf("backlight step: %u\n", backlight_config.level);
backlight_set(backlight_config.level);
}
+
+void backlight_level(uint8_t level)
+{
+ backlight_config.level ^= level;
+ backlight_config.enable = !!backlight_config.level;
+ eeconfig_write_backlight(backlight_config.raw);
+ backlight_set(backlight_config.level);
+}
typedef union {
uint8_t raw;
struct {
- bool enable:1;
- uint8_t level:7;
+ bool enable :1;
+ uint8_t level :7;
};
} backlight_config_t;
void backlight_init(void);
-
void backlight_increase(void);
void backlight_decrease(void);
void backlight_toggle(void);
void backlight_step(void);
-
void backlight_set(uint8_t level);
+void backlight_level(uint8_t level);
#endif
ACTION_BACKLIGHT_STEP()
+Turn a specific backlight level on or off.
+
+ ACTION_BACKLIGHT_LEVEL(1)
+
#### 2.5.2 Turn on / off backlight
Turn the backlight on and off without changing level.
* Backside PD6 (high)
* TopRight PD7 (low)
* F-Row PE6 (high)
- *
*/
+
void backlight_set(uint8_t level)
{
// Set as output.
DDRD |= (1<<6) | (1<<7);
DDRE |= (1<<6);
- if(level & (1<<0))
+ if (level & BACKLIGHT_ALPHA)
{
- PORTB &= ~(1<<1);
- PORTB &= ~(1<<2);
- PORTB &= ~(1<<3);
- PORTD &= ~(1<<6);
- PORTD |= (1<<7);
- PORTE &= ~(1<<6);
+ PORTB |= (1<<1);
}
else
{
- PORTB |= (1<<1);
+ PORTB &= ~(1<<1);
+ }
+ if (level & BACKLIGHT_NUMERIC)
+ {
PORTB |= (1<<2);
+ }
+ else
+ {
+ PORTB &= ~(1<<2);
+ }
+ if (level & BACKLIGHT_MODNUM)
+ {
PORTB |= (1<<3);
+ }
+ else
+ {
+ PORTB &= ~(1<<3);
+ }
+ if (level & BACKLIGHT_BACKSIDE)
+ {
PORTD |= (1<<6);
+ }
+ else
+ {
+ PORTD &= ~(1<<6);
+ }
+ if (level & BACKLIGHT_TOPRIGHT)
+ {
PORTD &= ~(1<<7);
+ }
+ else
+ {
+ PORTD |= (1<<7);
+ }
+ if (level & BACKLIGHT_FROW)
+ {
PORTE |= (1<<6);
}
+ else
+ {
+ PORTE &= ~(1<<6);
+ }
}
--- /dev/null
+
+enum backlight_level {
+ BACKLIGHT_ALPHA = 0b0000001,
+ BACKLIGHT_NUMERIC = 0b0000010,
+ BACKLIGHT_MODNUM = 0b0000100,
+ BACKLIGHT_BACKSIDE = 0b0001000,
+ BACKLIGHT_TOPRIGHT = 0b0010000,
+ BACKLIGHT_FROW = 0b0100000,
+};
+#include "backlight.h"
+
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KEYMAP(\
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, PSCR, SLCK, BRK, \
LCTL,LGUI,LALT, SPC, NO, RALT,RGUI,RCTL, KP_0, NO, KP_DOT, NO), \
KEYMAP(\
CALC,MYCM,WSCH,WHOM,MAIL,MUTE,VOLD,VOLU,MSEL,MSTP,MPLY,MPRV,MNXT,TRNS, TRNS, WAKE, PWR, SLEP, \
- TRNS,TRNS,TRNS,TRNS,END ,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \
+ FN1, FN2, FN3, FN4, FN5, FN6, FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \
TRNS,TRNS,TRNS,TRNS,PGDN,TRNS,LEFT,DOWN,UP ,RGHT,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \
TRNS, TRNS,TRNS,TRNS,TRNS,PGUP,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS, \
- TRNS,TRNS,TRNS, FN1, TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS)
+ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS)
};
static const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1),
- [1] = ACTION_BACKLIGHT_STEP()
+ [1] = ACTION_BACKLIGHT_TOGGLE(),
+ [2] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_ALPHA),
+ [3] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_MODNUM),
+ [4] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_NUMERIC),
+ [5] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_FROW),
+ [6] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_BACKSIDE),
+ [7] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_TOPRIGHT)
};
.EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = KEYBOARD_EPSIZE,
- .PollingIntervalMS = 0x01
+ .PollingIntervalMS = 0x0A
},
/*
.EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = MOUSE_EPSIZE,
- .PollingIntervalMS = 0x01
+ .PollingIntervalMS = 0x0A
},
#endif
.EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM),
.Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
.EndpointSize = EXTRAKEY_EPSIZE,
- .PollingIntervalMS = 0x01
+ .PollingIntervalMS = 0x0A
},
#endif
static void send_keyboard(report_keyboard_t *report)
{
- uint8_t timeout = 0;
+ uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
#ifdef NKRO_ENABLE
if (keyboard_nkro) {
Endpoint_SelectEndpoint(NKRO_IN_EPNUM);
+
+ /* Check if write ready for a polling interval around 1ms */
+ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(4);
+ if (!Endpoint_IsReadWriteAllowed()) return;
}
else
#endif
{
Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
- }
- /* Check if Keyboard Endpoint Ready for Read/Write */
- while (--timeout && !Endpoint_IsReadWriteAllowed()) ;
+ /* Check if write ready for a polling interval around 10ms */
+ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
+ if (!Endpoint_IsReadWriteAllowed()) return;
+ }
/* Write Keyboard Report Data */
#ifdef NKRO_ENABLE
static void send_mouse(report_mouse_t *report)
{
#ifdef MOUSE_ENABLE
- uint8_t timeout = 0;
+ uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
/* Select the Mouse Report Endpoint */
Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
- /* Check if Mouse Endpoint Ready for Read/Write */
- while (--timeout && !Endpoint_IsReadWriteAllowed()) ;
+ /* Check if write ready for a polling interval around 10ms */
+ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
+ if (!Endpoint_IsReadWriteAllowed()) return;
/* Write Mouse Report Data */
Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL);
static void send_system(uint16_t data)
{
- uint8_t timeout = 0;
+ uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
.usage = data
};
Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM);
- while (--timeout && !Endpoint_IsReadWriteAllowed()) ;
+
+ /* Check if write ready for a polling interval around 10ms */
+ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
+ if (!Endpoint_IsReadWriteAllowed()) return;
+
Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
Endpoint_ClearIN();
}
static void send_consumer(uint16_t data)
{
- uint8_t timeout = 0;
+ uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
.usage = data
};
Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM);
- while (--timeout && !Endpoint_IsReadWriteAllowed()) ;
+
+ /* Check if write ready for a polling interval around 10ms */
+ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
+ if (!Endpoint_IsReadWriteAllowed()) return;
+
Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
Endpoint_ClearIN();
}