aboutsummaryrefslogtreecommitdiff
path: root/common/action_macro.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/action_macro.c')
-rw-r--r--common/action_macro.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/common/action_macro.c b/common/action_macro.c
new file mode 100644
index 000000000..72859c0dd
--- /dev/null
+++ b/common/action_macro.c
@@ -0,0 +1,67 @@
1/*
2Copyright 2013 Jun Wako <wakojun@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17#include <util/delay.h>
18#include "debug.h"
19#include "action.h"
20#include "action_macro.h"
21
22
23#define MACRO_READ() (macro = pgm_read_byte(macro_p++))
24void action_macro_play(const prog_macro_t *macro_p)
25{
26 macro_t macro = END;
27 uint8_t interval = 0;
28
29 if (!macro_p) return;
30 while (true) {
31 switch (MACRO_READ()) {
32 case INTERVAL:
33 interval = MACRO_READ();
34 debug("INTERVAL("); debug_dec(interval); debug(")\n");
35 break;
36 case WAIT:
37 MACRO_READ();
38 debug("WAIT("); debug_dec(macro); debug(")\n");
39 { uint8_t ms = macro; while (ms--) _delay_ms(1); }
40 break;
41 case MODS_DOWN:
42 MACRO_READ();
43 debug("MODS_DOWN("); debug_hex(macro); debug(")\n");
44 debug("MODS_UP("); debug_hex(macro); debug(")\n");
45 add_mods(macro);
46 break;
47 case MODS_UP:
48 MACRO_READ();
49 debug("MODS_UP("); debug_hex(macro); debug(")\n");
50 del_mods(macro);
51 break;
52 case 0x04 ... 0x73:
53 debug("DOWN("); debug_hex(macro); debug(")\n");
54 register_code(macro);
55 break;
56 case 0x84 ... 0xF3:
57 debug("UP("); debug_hex(macro); debug(")\n");
58 unregister_code(macro&0x7F);
59 break;
60 case END:
61 default:
62 return;
63 }
64 // interval
65 { uint8_t ms = interval; while (ms--) _delay_ms(1); }
66 }
67}