reorder mailbox msg data; formatting
This commit is contained in:
parent
a144968807
commit
164a6c994b
4 changed files with 104 additions and 114 deletions
|
@ -12,7 +12,7 @@
|
||||||
#define _TILDE 4
|
#define _TILDE 4
|
||||||
|
|
||||||
//IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
|
//IS31 chip has 8 available led pages, using 0 for all leds and 7 for single toggles
|
||||||
#define max_pages 6
|
#define max_pages 6
|
||||||
|
|
||||||
enum ic60_keycodes {
|
enum ic60_keycodes {
|
||||||
NUMPAD,
|
NUMPAD,
|
||||||
|
@ -75,7 +75,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
[_FNAV] = KEYMAP( \
|
[_FNAV] = KEYMAP( \
|
||||||
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_NO,\
|
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_NO,\
|
||||||
KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
|
KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
|
||||||
_______,M(0),KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
|
_______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
|
||||||
_______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
|
_______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
|
||||||
_______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
|
_______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
|
||||||
),
|
),
|
||||||
|
@ -119,7 +119,7 @@ enum macro_id {
|
||||||
ACTION_LEDS_DIM,
|
ACTION_LEDS_DIM,
|
||||||
ACTION_LEDS_SINGLE,
|
ACTION_LEDS_SINGLE,
|
||||||
ACTION_LEDS_PAGE,
|
ACTION_LEDS_PAGE,
|
||||||
ACTION_LEDS_FLASH,
|
ACTION_LEDS_FLASH
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ==================================
|
/* ==================================
|
||||||
|
@ -137,9 +137,8 @@ enum macro_id {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//======== full page arrays =========
|
//======== full page arrays =========
|
||||||
//LED Page 1 - _Numpad
|
|
||||||
//any change in array size needs to be mirrored in matrix_init_user
|
//any change in array size needs to be mirrored in matrix_init_user
|
||||||
uint8_t led_numpad[16] = {
|
uint8_t led_numpad[16] = {
|
||||||
18,21,22,23,
|
18,21,22,23,
|
||||||
37,38,41,42,
|
37,38,41,42,
|
||||||
55,56,57,58,
|
55,56,57,58,
|
||||||
|
@ -186,7 +185,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
case ACTION_LEDS_ALL:
|
case ACTION_LEDS_ALL:
|
||||||
if(record->event.pressed) {
|
if(record->event.pressed) {
|
||||||
led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
|
led_mode_global = led_mode_global == ALL ? MODE_SINGLE : ALL;
|
||||||
msg=(TOGGLE_ALL << 8) | 0;
|
msg=TOGGLE_ALL;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -194,7 +193,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
case ACTION_LEDS_BACKLIGHT:
|
case ACTION_LEDS_BACKLIGHT:
|
||||||
if(record->event.pressed) {
|
if(record->event.pressed) {
|
||||||
backlight_status_global ^= 1;
|
backlight_status_global ^= 1;
|
||||||
msg=(TOGGLE_BACKLIGHT << 8) | (backlight_status_global);
|
msg=(backlight_status_global << 8) | TOGGLE_BACKLIGHT;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -203,21 +202,21 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||||
if(record->event.pressed) {
|
if(record->event.pressed) {
|
||||||
led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
|
led_mode_global = led_mode_global == GAME ? MODE_SINGLE : GAME;
|
||||||
|
|
||||||
msg=(DISPLAY_PAGE << 8) | 4;
|
msg=(4 << 8) | DISPLAY_PAGE;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACTION_LEDS_BRIGHT:
|
case ACTION_LEDS_BRIGHT:
|
||||||
if(record->event.pressed) {
|
if(record->event.pressed) {
|
||||||
msg=(STEP_BRIGHTNESS << 8) | 1;
|
msg=(1 << 8) | STEP_BRIGHTNESS;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACTION_LEDS_DIM:
|
case ACTION_LEDS_DIM:
|
||||||
if(record->event.pressed) {
|
if(record->event.pressed) {
|
||||||
msg=(STEP_BRIGHTNESS << 8) | 0;
|
msg=(0 << 8) | STEP_BRIGHTNESS;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -282,26 +281,25 @@ void matrix_scan_user(void) {
|
||||||
switch(led_mode_global) {
|
switch(led_mode_global) {
|
||||||
case MODE_FLASH: //flash preset page leds then single indicator
|
case MODE_FLASH: //flash preset page leds then single indicator
|
||||||
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
|
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
|
||||||
msg=(DISPLAY_PAGE << 8) | (page);
|
msg=(page << 8) | DISPLAY_PAGE;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
chThdSleepMilliseconds(500);
|
chThdSleepMilliseconds(500);
|
||||||
//flow to display single layer leds
|
//flow to display single layer leds
|
||||||
|
|
||||||
case MODE_SINGLE: //light layer indicators for all active layers
|
case MODE_SINGLE: //light layer indicators for all active layers
|
||||||
led_pin_byte = layer_state & 0xFF;
|
led_pin_byte = layer_state & 0xFF;
|
||||||
msg=(DISPLAY_PAGE << 8) | 7;
|
msg=(7 << 8) | DISPLAY_PAGE;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
msg=(1<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);
|
msg=(1<<16) | (led_pin_byte << 8) | SET_FULL_ROW;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MODE_PAGE: //display pre-defined led page
|
case MODE_PAGE: //display pre-defined led page
|
||||||
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
|
page = biton32(layer_state) > max_pages ? 7 : biton32(layer_state);
|
||||||
msg=(DISPLAY_PAGE << 8) | (page);
|
msg=(page << 8) | DISPLAY_PAGE;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
led_layer_state = layer_state;
|
led_layer_state = layer_state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,26 +16,24 @@ digits mean "row" and "col", i.e. 45 means pin 4, column 5 in the IS31 datasheet
|
||||||
```
|
```
|
||||||
*Unused in Alphabet Layout
|
*Unused in Alphabet Layout
|
||||||
|
|
||||||
The IS31 includes 8 pages (or frames) 0-7 and each page consists of 0xB4 (144) bytes
|
The IS31 includes 8 pages (or frames) 0-7 and each page consists of 144 bytes
|
||||||
- **0 - 17**
|
- **bytes 0 - 17** - LED control (on/off).
|
||||||
* LED control (on/off).
|
* 18 pins which alternate between A and B matrices (CA1, CB1, CA2, CB2, ..).
|
||||||
* 18 pins which alternate between A and B matrices (CA1, CB1, CA2, CB2, ..).
|
|
||||||
* Each byte controls the 8 leds on that pin with bits (8 to 1).
|
* Each byte controls the 8 leds on that pin with bits (8 to 1).
|
||||||
- **18 - 35**
|
- **bytes 8 - 35** - Blink control.
|
||||||
* Blink control.
|
|
||||||
* Same as LED control above, but sets blink on/off.
|
* Same as LED control above, but sets blink on/off.
|
||||||
- **36 - 143**
|
- **bytes 36 - 143** - PWM control.
|
||||||
* PWM control. One byte per LED, sets PWM from 0 to 255.
|
* One byte per LED, sets PWM from 0 to 255.
|
||||||
* Same as above, the register alternates, every 8 *bytes* (not bits) between the A & B matrices.
|
* Same as above, the register alternates, every 8 *bytes* (not bits) between the A & B matrices.
|
||||||
|
|
||||||
## Led Controller Code
|
## Led Controller Code
|
||||||
In the Infinity60 project folder, led_controller.c sets up ability to write led layers at startup or control leds on demand as part of fn_actions. By default led_controller.c assumes page 0 will be used for full on/off and page 7 for controlling individual leds. The remaining 6 pages (1-6) are free to preset led maps at init or on demand. Communication with the IS31 is primarily done through the led_mailbox using chMBPost described further below under "Sending messages in Keymap.c"
|
In the Infinity60 project folder, led_controller.c sets up ability to write led layers at startup or control leds on demand as part of fn_actions. By default led_controller.c assumes page 0 will be used for full on/off. The remaining 7 pages (1-7) are free for preset led maps or single led actions at init or on demand. Communication with the IS31 is primarily done through the led_mailbox using chMBPost described further below under "Sending messages in Keymap.c". This code is based on work matt3o and flabbergast did for tmk firmware on the [whitefox](https://github.com/tmk/whitefox).
|
||||||
|
|
||||||
One function is available to directly set leds without the mailbox:
|
One function is available to directly set leds without the mailbox:
|
||||||
```
|
```
|
||||||
write_led_page(page#, array of leds by address, # of leds in array)
|
write_led_page(page#, array of leds by address, # of leds in array)
|
||||||
```
|
```
|
||||||
This function saves a full page using a supplied array of led locations such as:
|
This function saves a full page to the controller using a supplied array of led locations such as:
|
||||||
```c
|
```c
|
||||||
uint8_t led_numpad[16] = {
|
uint8_t led_numpad[16] = {
|
||||||
18,21,22,23,
|
18,21,22,23,
|
||||||
|
@ -48,13 +46,9 @@ write_led_page(5, led_numpad, 16);
|
||||||
|
|
||||||
Remaining led control is done through the led mailbox using these message types:
|
Remaining led control is done through the led mailbox using these message types:
|
||||||
- **SET_FULL_ROW** (3 bytes) - row#, message type, 8-bit mask. Sets all leds on one pin per the bit mask.
|
- **SET_FULL_ROW** (3 bytes) - row#, message type, 8-bit mask. Sets all leds on one pin per the bit mask.
|
||||||
- **OFF_LED** (2 bytes) - message type, led address. Turn off specific led.
|
- **OFF_LED, ON_LED, TOGGLE_LED** (3 bytes) - message type, led address, and page#. Off/on/toggle specific led.
|
||||||
- **ON_LED** (2 bytes) - message type, led address. Turn on specific led.
|
- **BLINK_OFF_LED, BLINK_ON_LED, BLINK_OFF_LED** (3 bytes) - message type, led address, and page#. Set blink Off/on/toggle for specific led.
|
||||||
- **TOGGLE_LED** (2 bytes) - message type, led address. Toggle specific led on/off.
|
- **TOGGLE_ALL** (1 byte) - Turn on/off full backlight.
|
||||||
- **BLINK_OFF_LED** (2 bytes) - message type, led address. Set blink off for specific led.
|
|
||||||
- **BLINK_ON_LED** (2 bytes) - message type, led address. Set blink on for specific led.
|
|
||||||
- **BLINK_TOGGLE_LED** (2 bytes) - message type, led address. Toggle blink for specific led.
|
|
||||||
- **TOGGLE_ALL** (2 bytes) - message type, not used. Turn on/off full backlight.
|
|
||||||
- **TOGGLE_BACKLIGHT** (2 bytes) - message type, on/off. Sets backlight completely off, no leds will display.
|
- **TOGGLE_BACKLIGHT** (2 bytes) - message type, on/off. Sets backlight completely off, no leds will display.
|
||||||
- **DISPLAY_PAGE** (2 bytes) - message type, page to display. Switch to specific pre-set page.
|
- **DISPLAY_PAGE** (2 bytes) - message type, page to display. Switch to specific pre-set page.
|
||||||
- **RESET_PAGE** (2 bytes) - message type, page to reset. Reset/erase specific page.
|
- **RESET_PAGE** (2 bytes) - message type, page to reset. Reset/erase specific page.
|
||||||
|
@ -68,13 +62,13 @@ Sending an action to the led mailbox is done using chMBPost:
|
||||||
chMBPost(&led_mailbox, message, timeout);
|
chMBPost(&led_mailbox, message, timeout);
|
||||||
```
|
```
|
||||||
- &led_mailbox - pointer to led mailbox
|
- &led_mailbox - pointer to led mailbox
|
||||||
- message - up to 4 bytes but most messages use only 2. First byte (LSB) is the message to process, the second byte is type. The third is only used to pass row information in SET_FULL_ROW. The fourth byte is currently unused.
|
- message - up to 4 bytes but most messages use only 2. First byte (LSB) is the message type, the remaining three bytes are the message to process.
|
||||||
-timeout is usually TIME_IMMEDIATE
|
- timeout is TIME_IMMEDIATE
|
||||||
|
|
||||||
An example:
|
An example:
|
||||||
```c
|
```c
|
||||||
//set the message to be sent. First byte (LSB) is the led address, and second is the message type
|
//set the message to be sent. First byte (LSB) is the led address, and second is the message type
|
||||||
msg=(ON_LED << 8) | 42;
|
msg=(42 << 8) | ON_LED
|
||||||
|
|
||||||
//send msg to the led mailbox
|
//send msg to the led mailbox
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
@ -82,12 +76,12 @@ chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
|
|
||||||
Another:
|
Another:
|
||||||
```c
|
```c
|
||||||
msg=(BLINK_TOGGLE_LED << 8) | 46;
|
msg=(46 << 8) | BLINK_TOGGLE_LED
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
```
|
```
|
||||||
|
|
||||||
Finally, SET_FULL_ROW requires an extra byte with row information in the message so sending this message looks like:
|
Finally, SET_FULL_ROW requires an extra byte with row information in the message so sending this message looks like:
|
||||||
```c
|
```c
|
||||||
msg=(row<<16) | (SET_FULL_ROW << 8) | (led_pin_byte);
|
msg=(row<<16) | (led_pin_byte << 8) | SET_FULL_ROW;
|
||||||
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
chMBPost(&led_mailbox, msg, TIME_IMMEDIATE);
|
||||||
```
|
```
|
||||||
|
|
|
@ -30,23 +30,23 @@ void led_set(uint8_t usb_led) {
|
||||||
|
|
||||||
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
|
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
|
||||||
chSysUnconditionalLock();
|
chSysUnconditionalLock();
|
||||||
msg=(TOGGLE_NUM_LOCK << 8) | 1;
|
msg=(1 << 8) | TOGGLE_NUM_LOCK;
|
||||||
chMBPostI(&led_mailbox, msg);
|
chMBPostI(&led_mailbox, msg);
|
||||||
chSysUnconditionalUnlock();
|
chSysUnconditionalUnlock();
|
||||||
} else {
|
} else {
|
||||||
chSysUnconditionalLock();
|
chSysUnconditionalLock();
|
||||||
msg=(TOGGLE_NUM_LOCK << 8) | 0;
|
msg=(0 << 8) | TOGGLE_NUM_LOCK;
|
||||||
chMBPostI(&led_mailbox, msg);
|
chMBPostI(&led_mailbox, msg);
|
||||||
chSysUnconditionalUnlock();
|
chSysUnconditionalUnlock();
|
||||||
}
|
}
|
||||||
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||||
chSysUnconditionalLock();
|
chSysUnconditionalLock();
|
||||||
msg=(TOGGLE_CAPS_LOCK << 8) | 1;
|
msg=(1 << 8) | TOGGLE_CAPS_LOCK;
|
||||||
chMBPostI(&led_mailbox, msg);
|
chMBPostI(&led_mailbox, msg);
|
||||||
chSysUnconditionalUnlock();
|
chSysUnconditionalUnlock();
|
||||||
} else {
|
} else {
|
||||||
chSysUnconditionalLock();
|
chSysUnconditionalLock();
|
||||||
msg=(TOGGLE_CAPS_LOCK << 8) | 0;
|
msg=(0 << 8) | TOGGLE_CAPS_LOCK;
|
||||||
chMBPostI(&led_mailbox, msg);
|
chMBPostI(&led_mailbox, msg);
|
||||||
chSysUnconditionalUnlock();
|
chSysUnconditionalUnlock();
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,9 +143,6 @@ void is31_init(void) {
|
||||||
palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
|
palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
|
||||||
palSetPad(GPIOB, 16);
|
palSetPad(GPIOB, 16);
|
||||||
chThdSleepMilliseconds(10);
|
chThdSleepMilliseconds(10);
|
||||||
// software shutdown
|
|
||||||
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, 0);
|
|
||||||
chThdSleepMilliseconds(10);
|
|
||||||
// software shutdown disable (i.e. turn stuff on)
|
// software shutdown disable (i.e. turn stuff on)
|
||||||
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_SHUTDOWN, IS31_REG_SHUTDOWN_ON);
|
||||||
chThdSleepMilliseconds(10);
|
chThdSleepMilliseconds(10);
|
||||||
|
@ -153,7 +150,7 @@ void is31_init(void) {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for(i=0; i<8; i++) {
|
for(i=0; i<8; i++) {
|
||||||
is31_write_data(i, full_page, 0xB4 + 1);
|
is31_write_data(i, full_page, 0xB4 + 1);
|
||||||
chThdSleepMilliseconds(1);
|
chThdSleepMilliseconds(5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,64 +173,65 @@ static THD_FUNCTION(LEDthread, arg) {
|
||||||
uint8_t pwm_step_status, page_status;
|
uint8_t pwm_step_status, page_status;
|
||||||
|
|
||||||
//mailbox variables
|
//mailbox variables
|
||||||
uint8_t temp, msg_type, msg_pin, msg_col, msg_led;
|
uint8_t temp, msg_type;
|
||||||
|
uint8_t msg_args[3];
|
||||||
msg_t msg;
|
msg_t msg;
|
||||||
|
|
||||||
// initialize persistent variables
|
// initialize persistent variables
|
||||||
pwm_step_status = 4; //full brightness
|
pwm_step_status = 4; //full brightness
|
||||||
page_status = 0; //start frame 0 (all off/on)
|
page_status = 0; //start frame 0 (all off/on)
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
// wait for a message (asynchronous)
|
// wait for a message (asynchronous)
|
||||||
// (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't
|
// (messages are queued (up to LED_MAILBOX_NUM_MSGS) if they can't
|
||||||
// be processed right away
|
// be processed right away
|
||||||
chMBFetch(&led_mailbox, &msg, TIME_INFINITE);
|
chMBFetch(&led_mailbox, &msg, TIME_INFINITE);
|
||||||
msg_col = (msg >> 24) & 0xFF;//if needed
|
msg_type = msg & 0xFF; //first byte is action information
|
||||||
msg_pin = (msg >> 16) & 0XFF;//if needed (e.g. SET_FULL_ROW)
|
msg_args[0] = (msg >> 8) & 0xFF;
|
||||||
msg_type = (msg >> 8) & 0xFF; //second byte is msg type
|
msg_args[1] = (msg >> 16) & 0XFF;
|
||||||
msg_led = (msg) & 0xFF; //first byte is action information
|
msg_args[2] = (msg >> 24) & 0xFF;
|
||||||
|
|
||||||
switch (msg_type){
|
switch (msg_type){
|
||||||
case SET_FULL_ROW:
|
case SET_FULL_ROW:
|
||||||
//write full byte to pin address, msg_pin = pin #, msg_led = byte to write
|
//write full byte to pin address, msg_args[1] = pin #, msg_args[0] = 8 bits to write
|
||||||
//writes only to current page
|
//writes only to currently displayed page
|
||||||
write_led_byte(page_status,msg_pin,msg_led);
|
write_led_byte(page_status, msg_args[1], msg_args[0]);
|
||||||
break;
|
|
||||||
|
|
||||||
case OFF_LED:
|
|
||||||
//on/off/toggle single led, msg_led = row/col of led
|
|
||||||
set_led_bit(7, control_register_word, msg_led, 0);
|
|
||||||
is31_write_data (7, control_register_word, 0x02);
|
|
||||||
break;
|
|
||||||
case ON_LED:
|
|
||||||
set_led_bit(7, control_register_word, msg_led, 1);
|
|
||||||
is31_write_data (7, control_register_word, 0x02);
|
|
||||||
break;
|
|
||||||
case TOGGLE_LED:
|
|
||||||
set_led_bit(7, control_register_word, msg_led, 2);
|
|
||||||
is31_write_data (7, control_register_word, 0x02);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BLINK_OFF_LED:
|
case OFF_LED:
|
||||||
//on/off/toggle single led, msg_led = row/col of led
|
//on/off/toggle single led, msg_args[0] = row/col of led
|
||||||
set_led_bit(7, control_register_word, msg_led, 4);
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 0);
|
||||||
is31_write_data (7, control_register_word, 0x02);
|
is31_write_data (msg_args[1], control_register_word, 0x02);
|
||||||
break;
|
break;
|
||||||
case BLINK_ON_LED:
|
case ON_LED:
|
||||||
set_led_bit(7, control_register_word, msg_led, 5);
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 1);
|
||||||
is31_write_data (7, control_register_word, 0x02);
|
is31_write_data (msg_args[1], control_register_word, 0x02);
|
||||||
break;
|
break;
|
||||||
case BLINK_TOGGLE_LED:
|
case TOGGLE_LED:
|
||||||
set_led_bit(7, control_register_word, msg_led, 6);
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 2);
|
||||||
is31_write_data (7, control_register_word, 0x02);
|
is31_write_data (msg_args[1], control_register_word, 0x02);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BLINK_OFF_LED:
|
||||||
|
//on/off/toggle single led, msg_args[0] = row/col of led
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 4);
|
||||||
|
is31_write_data (msg_args[1], control_register_word, 0x02);
|
||||||
|
break;
|
||||||
|
case BLINK_ON_LED:
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 5);
|
||||||
|
is31_write_data (msg_args[1], control_register_word, 0x02);
|
||||||
|
break;
|
||||||
|
case BLINK_TOGGLE_LED:
|
||||||
|
set_led_bit(msg_args[1], control_register_word, msg_args[0], 6);
|
||||||
|
is31_write_data (msg_args[1], control_register_word, 0x02);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOGGLE_ALL:
|
case TOGGLE_ALL:
|
||||||
//msg_led = unused
|
//turn on/off all leds, msg_args = unused
|
||||||
is31_read_register(0, 0x00, &temp);
|
is31_read_register(0, 0x00, &temp);
|
||||||
led_control_reg[0] = 0;
|
led_control_reg[0] = 0;
|
||||||
|
|
||||||
//if first byte is on, then toggle frame 0 off
|
//if first leds are already on, toggle frame 0 off
|
||||||
if (temp==0 || page_status > 0) {
|
if (temp==0 || page_status > 0) {
|
||||||
__builtin_memcpy(led_control_reg+1, all_on_leds_mask, 0x12);
|
__builtin_memcpy(led_control_reg+1, all_on_leds_mask, 0x12);
|
||||||
} else {
|
} else {
|
||||||
|
@ -252,27 +250,27 @@ page_status = 0; //start frame 0 (all off/on)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOGGLE_BACKLIGHT:
|
case TOGGLE_BACKLIGHT:
|
||||||
//msg_led = on/off
|
//msg_args[0] = on/off
|
||||||
|
|
||||||
//populate the 9 byte rows to be written to each pin, first byte is register (pin) address
|
//populate 9 byte rows to be written to each pin, first byte is register (pin) address
|
||||||
if (msg_led == 1) {
|
if (msg_args[0] == 1) {
|
||||||
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
|
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
|
||||||
} else {
|
} else {
|
||||||
__builtin_memset(pwm_register_array+1, 0, 8);
|
__builtin_memset(pwm_register_array+1, 0, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0; i<8; i++) {
|
for(i=0; i<8; i++) {
|
||||||
//first byte is register address, every 0x10 9 bytes is A-register pwm pins
|
//first byte is register address, every 0x10 9 bytes is A-matrix pwm pins
|
||||||
pwm_register_array[0] = 0x24 + (i * 0x10);
|
pwm_register_array[0] = 0x24 + (i * 0x10);
|
||||||
is31_write_data(0,pwm_register_array,9);
|
is31_write_data(0,pwm_register_array,9);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DISPLAY_PAGE:
|
case DISPLAY_PAGE:
|
||||||
//msg_led = page to toggle on
|
//msg_args[0] = page to toggle on
|
||||||
if (page_status != msg_led) {
|
if (page_status != msg_args[0]) {
|
||||||
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, msg_led);
|
is31_write_register(IS31_FUNCTIONREG, IS31_REG_PICTDISP, msg_args[0]);
|
||||||
page_status = msg_led;
|
page_status = msg_args[0];
|
||||||
|
|
||||||
//maintain lock leds
|
//maintain lock leds
|
||||||
led_set(host_keyboard_leds());
|
led_set(host_keyboard_leds());
|
||||||
|
@ -280,24 +278,24 @@ page_status = 0; //start frame 0 (all off/on)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RESET_PAGE:
|
case RESET_PAGE:
|
||||||
//led_msg = page to reset
|
//led_args[0] = page to reset
|
||||||
led_control_reg[0] = 0;
|
led_control_reg[0] = 0;
|
||||||
__builtin_memset(led_control_reg+1, 0, 0x12);
|
__builtin_memset(led_control_reg+1, 0, 0x12);
|
||||||
is31_write_data(msg_led, led_control_reg, 0x13);
|
is31_write_data(msg_args[0], led_control_reg, 0x13);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TOGGLE_NUM_LOCK:
|
case TOGGLE_NUM_LOCK:
|
||||||
//msg_led = 0 or 1, off/on
|
//msg_args[0] = 0 or 1, off/on
|
||||||
set_lock_leds(NUM_LOCK_LED_ADDRESS, msg_led, page_status);
|
set_lock_leds(NUM_LOCK_LED_ADDRESS, msg_args[0], page_status);
|
||||||
break;
|
break;
|
||||||
case TOGGLE_CAPS_LOCK:
|
case TOGGLE_CAPS_LOCK:
|
||||||
//msg_led = 0 or 1, off/on
|
//msg_args[0] = 0 or 1, off/on
|
||||||
set_lock_leds(CAPS_LOCK_LED_ADDRESS, msg_led, page_status);
|
set_lock_leds(CAPS_LOCK_LED_ADDRESS, msg_args[0], page_status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STEP_BRIGHTNESS:
|
case STEP_BRIGHTNESS:
|
||||||
//led_msg = step pwm up or down
|
//led_args[0] = step up (1) or down (0)
|
||||||
switch (msg_led) {
|
switch (msg_args[0]) {
|
||||||
case 0:
|
case 0:
|
||||||
if (pwm_step_status == 0) {
|
if (pwm_step_status == 0) {
|
||||||
pwm_step_status = 4;
|
pwm_step_status = 4;
|
||||||
|
@ -305,7 +303,7 @@ page_status = 0; //start frame 0 (all off/on)
|
||||||
pwm_step_status--;
|
pwm_step_status--;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
if (pwm_step_status == 4) {
|
if (pwm_step_status == 4) {
|
||||||
pwm_step_status = 0;
|
pwm_step_status = 0;
|
||||||
|
@ -316,7 +314,7 @@ page_status = 0; //start frame 0 (all off/on)
|
||||||
}
|
}
|
||||||
|
|
||||||
//populate 8 byte arrays to write on each pin
|
//populate 8 byte arrays to write on each pin
|
||||||
//first byte is register address, every 0x10 9 bytes are A-register pwm pins
|
//first byte is register address, every 0x10 9 bytes are A-matrix pwm pins
|
||||||
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
|
__builtin_memset(pwm_register_array+1, pwm_levels[pwm_step_status], 8);
|
||||||
|
|
||||||
for(i=0; i<8; i++) {
|
for(i=0; i<8; i++) {
|
||||||
|
@ -334,9 +332,9 @@ page_status = 0; //start frame 0 (all off/on)
|
||||||
|
|
||||||
void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint8_t action) {
|
void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint8_t action) {
|
||||||
//returns 2 bytes: led control register address and byte to write
|
//returns 2 bytes: led control register address and byte to write
|
||||||
//0 - bit off, 1 - bit on, 2 - toggle bit
|
//action: 0 - off, 1 - on, 2 - toggle, 4 - blink on, 5 - blink off, 6 - toggle blink
|
||||||
|
|
||||||
uint8_t control_reg_addr, column_bit, column_byte, bit_temp, blink_on;
|
uint8_t control_reg_addr, column_bit, column_byte, temp, blink_bit;
|
||||||
|
|
||||||
//check for valid led address
|
//check for valid led address
|
||||||
if (led_addr < 0 || led_addr > 87 || led_addr % 10 > 8) {
|
if (led_addr < 0 || led_addr > 87 || led_addr % 10 > 8) {
|
||||||
|
@ -344,17 +342,17 @@ void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint
|
||||||
}
|
}
|
||||||
|
|
||||||
//check for blink bit
|
//check for blink bit
|
||||||
blink_on = action>>2;
|
blink_bit = action>>2;
|
||||||
action &= ~(1<<2); //strip blink bit
|
action &= ~(1<<2); //strip blink bit
|
||||||
|
|
||||||
//first byte is led control register address 0x00
|
//first byte is led control register address 0x00
|
||||||
//msg_led tens column is pin#, ones column is bit position in 8-bit mask
|
//led_addr tens column is pin#, ones column is bit position in 8-bit mask
|
||||||
control_reg_addr = ((led_addr / 10) % 10 - 1 ) * 0x02;// A-register is every other byte
|
control_reg_addr = ((led_addr / 10) % 10 - 1 ) * 0x02;// A-matrix is every other byte
|
||||||
control_reg_addr += blink_on == 1 ? 0x12 : 0x00;//shift 12 bytes to blink register
|
control_reg_addr += blink_bit == 1 ? 0x12 : 0x00;//if blink_bit, shift 12 bytes to blink register
|
||||||
|
|
||||||
is31_read_register(page, control_reg_addr, &bit_temp);//maintain status of leds on this byte
|
is31_read_register(page, control_reg_addr, &temp);//maintain status of leds on this byte
|
||||||
column_bit = 1<<(led_addr % 10 - 1);
|
column_bit = 1<<(led_addr % 10 - 1);
|
||||||
column_byte = bit_temp;
|
column_byte = temp;
|
||||||
|
|
||||||
switch(action) {
|
switch(action) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -376,7 +374,7 @@ void set_led_bit (uint8_t page, uint8_t *led_control_reg, uint8_t led_addr, uint
|
||||||
void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte) {
|
void write_led_byte (uint8_t page, uint8_t row, uint8_t led_byte) {
|
||||||
uint8_t led_control_word[2] = {0};//register address and on/off byte
|
uint8_t led_control_word[2] = {0};//register address and on/off byte
|
||||||
|
|
||||||
led_control_word[0] = (row - 1 ) * 0x02;// A-register is every other byte
|
led_control_word[0] = (row - 1 ) * 0x02;// A-matrix is every other byte
|
||||||
led_control_word[1] = led_byte;
|
led_control_word[1] = led_byte;
|
||||||
is31_write_data(page, led_control_word, 0x02);
|
is31_write_data(page, led_control_word, 0x02);
|
||||||
}
|
}
|
||||||
|
@ -389,7 +387,7 @@ void write_led_page (uint8_t page, uint8_t *user_led_array, uint8_t led_count) {
|
||||||
__builtin_memset(led_control_register,0,13);
|
__builtin_memset(led_control_register,0,13);
|
||||||
|
|
||||||
for(i=0;i<led_count;i++){
|
for(i=0;i<led_count;i++){
|
||||||
// 1 byte shift for led register 0x00 address
|
//shift pin by 1 for led register 0x00 address
|
||||||
pin = ((user_led_array[i] / 10) % 10 - 1 ) * 2 + 1;
|
pin = ((user_led_array[i] / 10) % 10 - 1 ) * 2 + 1;
|
||||||
col = user_led_array[i] % 10 - 1;
|
col = user_led_array[i] % 10 - 1;
|
||||||
led_control_register[pin] |= 1<<(col);
|
led_control_register[pin] |= 1<<(col);
|
||||||
|
@ -399,13 +397,13 @@ void write_led_page (uint8_t page, uint8_t *user_led_array, uint8_t led_count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_lock_leds(uint8_t led_addr, uint8_t led_action, uint8_t page) {
|
void set_lock_leds(uint8_t led_addr, uint8_t led_action, uint8_t page) {
|
||||||
uint8_t lock_temp;
|
uint8_t temp;
|
||||||
uint8_t led_control_word[2] = {0};
|
uint8_t led_control_word[2] = {0};
|
||||||
|
|
||||||
//blink if all leds are on
|
//blink if all leds are on
|
||||||
if (page == 0) {
|
if (page == 0) {
|
||||||
is31_read_register(0, 0x00, &lock_temp);
|
is31_read_register(0, 0x00, &temp);
|
||||||
if (lock_temp == 0xFF) {
|
if (temp == 0xFF) {
|
||||||
led_action |= (1<<2); //set blink bit
|
led_action |= (1<<2); //set blink bit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue