parent
1d7962ba8a
commit
aad91a30a3
@ -0,0 +1,67 @@ |
||||
/*
|
||||
Copyright 2013 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/>.
|
||||
*/ |
||||
#include <util/delay.h> |
||||
#include "debug.h" |
||||
#include "action.h" |
||||
#include "action_macro.h" |
||||
|
||||
|
||||
#define MACRO_READ() (macro = pgm_read_byte(macro_p++)) |
||||
void action_macro_play(const prog_macro_t *macro_p) |
||||
{ |
||||
macro_t macro = END; |
||||
uint8_t interval = 0; |
||||
|
||||
if (!macro_p) return; |
||||
while (true) { |
||||
switch (MACRO_READ()) { |
||||
case INTERVAL: |
||||
interval = MACRO_READ(); |
||||
debug("INTERVAL("); debug_dec(interval); debug(")\n"); |
||||
break; |
||||
case WAIT: |
||||
MACRO_READ(); |
||||
debug("WAIT("); debug_dec(macro); debug(")\n"); |
||||
{ uint8_t ms = macro; while (ms--) _delay_ms(1); } |
||||
break; |
||||
case MODS_DOWN: |
||||
MACRO_READ(); |
||||
debug("MODS_DOWN("); debug_hex(macro); debug(")\n"); |
||||
debug("MODS_UP("); debug_hex(macro); debug(")\n"); |
||||
add_mods(macro); |
||||
break; |
||||
case MODS_UP: |
||||
MACRO_READ(); |
||||
debug("MODS_UP("); debug_hex(macro); debug(")\n"); |
||||
del_mods(macro); |
||||
break; |
||||
case 0x04 ... 0x73: |
||||
debug("DOWN("); debug_hex(macro); debug(")\n"); |
||||
register_code(macro); |
||||
break; |
||||
case 0x84 ... 0xF3: |
||||
debug("UP("); debug_hex(macro); debug(")\n"); |
||||
unregister_code(macro&0x7F); |
||||
break; |
||||
case END: |
||||
default: |
||||
return; |
||||
} |
||||
// interval
|
||||
{ uint8_t ms = interval; while (ms--) _delay_ms(1); } |
||||
} |
||||
} |
@ -0,0 +1,107 @@ |
||||
/*
|
||||
Copyright 2013 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 ACTION_MACRO_H |
||||
#define ACTION_MACRO_H |
||||
#include <stdint.h> |
||||
#include <avr/pgmspace.h> |
||||
|
||||
|
||||
typedef uint8_t macro_t; |
||||
typedef macro_t prog_macro_t PROGMEM; |
||||
|
||||
|
||||
void action_macro_play(const prog_macro_t *macro); |
||||
|
||||
|
||||
|
||||
/* TODO: NOT FINISHED
|
||||
normal mode command: |
||||
key(down): 0x04-7f/73(F24) |
||||
key(up): 0x84-ff |
||||
command: 0x00-03, 0x80-83(0x74-7f, 0xf4-ff) |
||||
mods down 0x00 |
||||
mods up 0x01 |
||||
wait 0x02 |
||||
interval 0x03 |
||||
extkey down 0x80 |
||||
extkey up 0x81 |
||||
ext commad 0x82 |
||||
ext mode 0x83 |
||||
end 0xff |
||||
|
||||
extension mode command: NOT IMPLEMENTED |
||||
key down 0x00 |
||||
key up 0x01 |
||||
key down + wait |
||||
key up + wait |
||||
mods push |
||||
mods pop |
||||
wait |
||||
interval |
||||
if |
||||
loop |
||||
push |
||||
pop |
||||
all up |
||||
end |
||||
*/ |
||||
enum macro_command_id{ |
||||
/* 0x00 - 0x03 */ |
||||
END = 0x00, |
||||
MODS_DOWN = 0x01, |
||||
MODS_UP = 0x02, |
||||
MODS_SET, |
||||
MODS_PUSH, |
||||
MODS_POP, |
||||
|
||||
WAIT = 0x74, |
||||
INTERVAL, |
||||
/* 0x74 - 0x7f */ |
||||
/* 0x80 - 0x84 */ |
||||
|
||||
EXT_DOWN, |
||||
EXT_UP, |
||||
EXT_WAIT, |
||||
EXT_INTERVAL, |
||||
COMPRESSION_MODE, |
||||
|
||||
EXTENSION_MODE = 0xff, |
||||
}; |
||||
|
||||
|
||||
/* normal mode */ |
||||
#define DOWN(key) (key) |
||||
#define UP(key) ((key) | 0x80) |
||||
#define TYPE(key) (key), (key | 0x80) |
||||
#define MODS_DOWN(mods) MODS_DOWN, (mods) |
||||
#define MODS_UP(mods) MODS_UP, (mods) |
||||
#define WAIT(ms) WAIT, (ms) |
||||
#define INTERVAL(ms) INTERVAL, (ms) |
||||
|
||||
#define D(key) DOWN(KC_##key) |
||||
#define U(key) UP(KC_##key) |
||||
#define T(key) TYPE(KC_##key) |
||||
#define MD(key) MODS_DOWN(MOD_BIT(KC_##key)) |
||||
#define MU(key) MODS_UP(MOD_BIT(KC_##key)) |
||||
#define W(ms) WAIT(ms) |
||||
#define I(ms) INTERVAL(ms) |
||||
|
||||
|
||||
/* extension mode */ |
||||
|
||||
|
||||
#endif /* ACTION_MACRO_H */ |
Loading…
Reference in new issue