aboutsummaryrefslogtreecommitdiff
path: root/users
diff options
context:
space:
mode:
authorRyo Maeda <epaew@users.noreply.github.com>2021-04-10 09:37:49 +0900
committerGitHub <noreply@github.com>2021-04-09 17:37:49 -0700
commit3dbb7f261dab573a3b55390394444ac3ceb3d257 (patch)
treee1b7e20933766622f974ac40a3d9aaddf239625c /users
parent93e8a401df09df910b2caad7fc5ecb13fe2142ac (diff)
downloadqmk_firmware-3dbb7f261dab573a3b55390394444ac3ceb3d257.tar.gz
qmk_firmware-3dbb7f261dab573a3b55390394444ac3ceb3d257.zip
[Keymap] Remove LAYOUT_kc macros from edvorakjp keymaps (#12217)
Diffstat (limited to 'users')
-rw-r--r--users/edvorakjp/edvorakjp.c28
-rw-r--r--users/edvorakjp/edvorakjp.h86
-rw-r--r--users/edvorakjp/edvorakjp_process_record.c122
-rw-r--r--users/edvorakjp/edvorakjp_status.c58
-rw-r--r--users/edvorakjp/edvorakjp_tap_dance.c90
5 files changed, 191 insertions, 193 deletions
diff --git a/users/edvorakjp/edvorakjp.c b/users/edvorakjp/edvorakjp.c
index 892ce4be3..d0cd106ff 100644
--- a/users/edvorakjp/edvorakjp.c
+++ b/users/edvorakjp/edvorakjp.c
@@ -1,32 +1,22 @@
1#include "edvorakjp.h" 1#include "edvorakjp.h"
2 2
3void matrix_init_user(void) { 3void matrix_init_user(void) {
4 edvorakjp_status_init(); 4 edvorakjp_status_init();
5 matrix_init_keymap(); 5 matrix_init_keymap();
6} 6}
7 7
8__attribute__ ((weak)) 8__attribute__((weak)) void matrix_init_keymap() {}
9void matrix_init_keymap() {}
10 9
11uint32_t layer_state_set_user(uint32_t state) { 10uint32_t layer_state_set_user(uint32_t state) {
12 state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); 11 state = update_tri_layer_state(state, L_EDVORAKJP_LOWER, L_EDVORAKJP_RAISE, L_EDVORAKJP_ADJUST);
13 return layer_state_set_keymap(state); 12 return layer_state_set_keymap(state);
14} 13}
15 14
16__attribute__ ((weak)) 15__attribute__((weak)) uint32_t layer_state_set_keymap(uint32_t state) { return state; }
17uint32_t layer_state_set_keymap(uint32_t state) {
18 return state;
19}
20 16
21bool process_record_user(uint16_t keycode, keyrecord_t *record) { 17bool process_record_user(uint16_t keycode, keyrecord_t *record) {
22 return process_record_keymap(keycode, record) &&\ 18 bool process_record_user_result = process_record_keymap(keycode, record) && process_record_edvorakjp_swap_scln(keycode, record) && process_record_edvorakjp_config(keycode, record) && process_record_layer(keycode, record) && process_record_ime(keycode, record);
23 process_record_edvorakjp_swap_scln(keycode, record) &&\ 19 return process_record_user_result;
24 process_record_edvorakjp_config(keycode, record) &&\
25 process_record_layer(keycode, record) &&\
26 process_record_ime(keycode, record);
27} 20}
28 21
29__attribute__ ((weak)) 22__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; }
30bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
31 return true;
32}
diff --git a/users/edvorakjp/edvorakjp.h b/users/edvorakjp/edvorakjp.h
index 688cdeffb..5f20762c6 100644
--- a/users/edvorakjp/edvorakjp.h
+++ b/users/edvorakjp/edvorakjp.h
@@ -1,54 +1,76 @@
1#ifndef EDVORAKJP 1#pragma once
2#define EDVORAKJP
3 2
4#include "quantum.h" 3#include "quantum.h"
5#include "action_layer.h" 4#include "action_layer.h"
6 5
7#define EECONFIG_EDVORAK (uint8_t *)20 6#define EECONFIG_EDVORAK (uint8_t *)20
8 7
8// clang-format off
9#define __EDVORAKJP_BASE_L1__ KC_QUOTE, KC_COMMA, KC_DOT, KC_Y, KC_Q
10#define __EDVORAKJP_BASE_L2__ KC_A, LALT_T(KC_O), LGUI_T(KC_E), LCTL_T(KC_I), KC_U
11#define __EDVORAKJP_BASE_L3__ KC_SCOLON, KC_X, KC_C, KC_V, KC_Z
12
13#define __EDVORAKJP_BASE_R1__ KC_F, KC_G, KC_R, KC_W, KC_P
14#define __EDVORAKJP_BASE_R2__ KC_D, RSFT_T(KC_T), RGUI_T(KC_N), RALT_T(KC_S), KC_M
15#define __EDVORAKJP_BASE_R3__ KC_H, KC_J, KC_K, KC_L, KC_B
16
17#define __EDVORAKJP_NUMBER_L__ KC_1, LALT_T(KC_2), LGUI_T(KC_3), LCTL_T(KC_4), KC_5
18#define __EDVORAKJP_NUMBER_R__ KC_6, RSFT_T(KC_7), RGUI_T(KC_8), RALT_T(KC_9), KC_0
19
20#define __EDVORAKJP_FUNCTION_L__ KC_F1, KC_F2, LALT_T(KC_F3), LGUI_T(KC_F4), LCTL_T(KC_F5), KC_F6
21#define __EDVORAKJP_FUNCTION_R__ KC_F7, RSFT_T(KC_F8), RGUI_T(KC_F9), RALT_T(KC_F10), KC_F11, KC_F12
22
23#define __EDVORAKJP_SYMBOL_L__ KC_EXCLAIM, KC_AT, KC_HASH, KC_DOLLAR
24#define __EDVORAKJP_SYMBOL_R__ KC_PERCENT, KC_CIRCUMFLEX, KC_AMPERSAND, KC_ASTERISK
25
26#define __EDVORAKJP_BRACKET_L__ KC_LEFT_CURLY_BRACE, KC_LBRACKET, KC_LEFT_PAREN
27#define __EDVORAKJP_BRACKET_R__ KC_RIGHT_PAREN, KC_RBRACKET, KC_RIGHT_CURLY_BRACE
28
29#define __EDVORAKJP_PAGE__ KC_HOME, KC_PGDOWN, KC_PGUP, KC_END
30#define __EDVORAKJP_CURSOR__ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
31
32#define LA_TAB LALT_T(KC_TAB)
33#define LS_SPC LSFT_T(KC_SPACE)
34#define RC_BSPC RCTL_T(KC_BSPACE)
35#define RC_DEL RCTL_T(KC_DELETE)
36#define RG_ENT RGUI_T(KC_ENTER)
37
38#define LOWER_TD TD(TD_EDVORAKJP_LOWER)
39#define RAISE_TD TD(TD_EDVORAKJP_RAISE)
40// clang-format on
41
9extern keymap_config_t keymap_config; 42extern keymap_config_t keymap_config;
10 43
11enum edvorakjp_layers { 44enum edvorakjp_layers {
12 _EDVORAK = 0, 45 L_EDVORAKJP_BASE = 0,
13 _LOWER, 46 L_EDVORAKJP_LOWER,
14 _RAISE, 47 L_EDVORAKJP_RAISE,
15 _ADJUST, 48 L_EDVORAKJP_ADJUST,
16 _EXTRA, 49 L_EDVORAKJP_EXTRA,
17}; 50};
18 51
19enum edvorakjp_keycodes { 52enum edvorakjp_keycodes {
20 EDVORAK = SAFE_RANGE, 53 KC_EDVORAKJP_LOWER = SAFE_RANGE,
21 LOWER, 54 KC_EDVORAKJP_RAISE,
22 RAISE, 55 KC_MAC,
23 KC_MAC, 56 KC_WIN,
24 KC_WIN, 57 KC_JPN,
25 KC_JPN, 58 KC_ENG,
26 KC_ENG, 59 NEW_SAFE_RANGE,
27 NEW_SAFE_RANGE
28}; 60};
29 61
30#define KC_LC(k) LCTL_T(KC_##k)
31#define KC_LS(k) LSFT_T(KC_##k)
32#define KC_LA(k) LALT_T(KC_##k)
33#define KC_LG(k) LGUI_T(KC_##k)
34#define KC_RC(k) RCTL_T(KC_##k)
35#define KC_RS(k) RSFT_T(KC_##k)
36#define KC_RG(k) RGUI_T(KC_##k)
37#define KC_RA(k) RALT_T(KC_##k)
38
39enum tap_dance_code { 62enum tap_dance_code {
40 TD_LOWER = 0, 63 TD_EDVORAKJP_LOWER = 0,
41 TD_RAISE 64 TD_EDVORAKJP_RAISE,
42}; 65};
43 66
44// base 67// base
45void dvorakj_layer_off(void); 68void matrix_init_user(void);
46void matrix_init_user(void); 69void matrix_init_keymap(void);
47void matrix_init_keymap(void);
48uint32_t layer_state_set_user(uint32_t state); 70uint32_t layer_state_set_user(uint32_t state);
49uint32_t layer_state_set_keymap(uint32_t state); 71uint32_t layer_state_set_keymap(uint32_t state);
50bool process_record_user(uint16_t keycode, keyrecord_t *record); 72bool process_record_user(uint16_t keycode, keyrecord_t *record);
51bool process_record_keymap(uint16_t keycode, keyrecord_t *record); 73bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
52 74
53// status 75// status
54void edvorakjp_status_init(void); 76void edvorakjp_status_init(void);
@@ -66,5 +88,3 @@ bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record);
66bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record); 88bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record);
67bool process_record_layer(uint16_t keycode, keyrecord_t *record); 89bool process_record_layer(uint16_t keycode, keyrecord_t *record);
68bool process_record_ime(uint16_t keycode, keyrecord_t *record); 90bool process_record_ime(uint16_t keycode, keyrecord_t *record);
69
70#endif // EDVORAKJP
diff --git a/users/edvorakjp/edvorakjp_process_record.c b/users/edvorakjp/edvorakjp_process_record.c
index ecc8db936..ac821c393 100644
--- a/users/edvorakjp/edvorakjp_process_record.c
+++ b/users/edvorakjp/edvorakjp_process_record.c
@@ -9,81 +9,81 @@ static uint16_t time_on_pressed;
9 */ 9 */
10bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) { 10bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) {
11#ifdef SWAP_SCLN 11#ifdef SWAP_SCLN
12 static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT); 12 static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT);
13 static uint8_t last_mods_status; 13 static uint8_t last_mods_status;
14 if (keycode == KC_SCLN) { 14 if (keycode == KC_SCLN) {
15 if (record->event.pressed) { 15 if (record->event.pressed) {
16 last_mods_status = get_mods(); 16 last_mods_status = get_mods();
17 17
18 // invert shift_bits 18 // invert shift_bits
19 if (last_mods_status & shift_bits) { 19 if (last_mods_status & shift_bits) {
20 set_mods(last_mods_status & ~shift_bits); 20 set_mods(last_mods_status & ~shift_bits);
21 } else { 21 } else {
22 set_mods(last_mods_status | MOD_BIT(KC_LSFT)); 22 set_mods(last_mods_status | MOD_BIT(KC_LSFT));
23 } 23 }
24 } else { 24 } else {
25 set_mods(last_mods_status); 25 set_mods(last_mods_status);
26 last_mods_status = 0; 26 last_mods_status = 0;
27 }
27 } 28 }
28 }
29#endif 29#endif
30 return true; 30 return true;
31} 31}
32 32
33bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) { 33bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) {
34 switch (keycode) { 34 switch (keycode) {
35 case KC_MAC: 35 case KC_MAC:
36 case KC_WIN: 36 case KC_WIN:
37 if (record->event.pressed) { 37 if (record->event.pressed) {
38 set_enable_kc_lang(keycode == KC_MAC); 38 set_enable_kc_lang(keycode == KC_MAC);
39 } 39 }
40 return false; 40 return false;
41 } 41 }
42 return true; 42 return true;
43} 43}
44 44
45bool process_record_layer(uint16_t keycode, keyrecord_t *record) { 45bool process_record_layer(uint16_t keycode, keyrecord_t *record) {
46#if TAP_DANCE_ENABLE != yes 46#if TAP_DANCE_ENABLE != yes
47 switch (keycode) { 47 switch (keycode) {
48 case LOWER: 48 case KC_EDVORAKJP_LOWER:
49 if (record->event.pressed) { 49 if (record->event.pressed) {
50 layer_on(_LOWER); 50 layer_on(L_EDVORAKJP_LOWER);
51 time_on_pressed = record->event.time; 51 time_on_pressed = record->event.time;
52 } else { 52 } else {
53 layer_off(_LOWER); 53 layer_off(L_EDVORAKJP_LOWER);
54 54
55 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { 55 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
56 set_japanese_mode(false); 56 set_japanese_mode(false);
57 } 57 }
58 time_on_pressed = 0; 58 time_on_pressed = 0;
59 } 59 }
60 return false; 60 return false;
61 case RAISE: 61 case KC_EDVORAKJP_RAISE:
62 if (record->event.pressed) { 62 if (record->event.pressed) {
63 layer_on(_RAISE); 63 layer_on(L_EDVORAKJP_RAISE);
64 time_on_pressed = record->event.time; 64 time_on_pressed = record->event.time;
65 } else { 65 } else {
66 layer_off(_RAISE); 66 layer_off(L_EDVORAKJP_RAISE);
67 67
68 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { 68 if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) {
69 set_japanese_mode(true); 69 set_japanese_mode(true);
70 } 70 }
71 time_on_pressed = 0; 71 time_on_pressed = 0;
72 } 72 }
73 return false; 73 return false;
74 } 74 }
75#endif 75#endif
76 return true; 76 return true;
77} 77}
78 78
79bool process_record_ime(uint16_t keycode, keyrecord_t *record) { 79bool process_record_ime(uint16_t keycode, keyrecord_t *record) {
80 switch (keycode) { 80 switch (keycode) {
81 case KC_JPN: 81 case KC_JPN:
82 case KC_ENG: 82 case KC_ENG:
83 if (record->event.pressed) { 83 if (record->event.pressed) {
84 set_japanese_mode(keycode == KC_JPN); 84 set_japanese_mode(keycode == KC_JPN);
85 } 85 }
86 return false; 86 return false;
87 } 87 }
88 return true; 88 return true;
89} 89}
diff --git a/users/edvorakjp/edvorakjp_status.c b/users/edvorakjp/edvorakjp_status.c
index 128fc3bd2..c8a06c225 100644
--- a/users/edvorakjp/edvorakjp_status.c
+++ b/users/edvorakjp/edvorakjp_status.c
@@ -2,63 +2,55 @@
2#include "edvorakjp.h" 2#include "edvorakjp.h"
3 3
4typedef union { 4typedef union {
5 uint8_t raw; 5 uint8_t raw;
6 struct { 6 struct {
7 bool enable_kc_lang; // for macOS 7 bool enable_kc_lang; // for macOS
8 }; 8 };
9} edvorakjp_config_t; 9} edvorakjp_config_t;
10static edvorakjp_config_t edvorakjp_config; 10static edvorakjp_config_t edvorakjp_config;
11 11
12typedef struct { 12typedef struct {
13 bool japanese_mode; 13 bool japanese_mode;
14} edvorakjp_state_t; 14} edvorakjp_state_t;
15static edvorakjp_state_t edvorakjp_state; 15static edvorakjp_state_t edvorakjp_state;
16 16
17/* 17/*
18 * private methods 18 * private methods
19 */ 19 */
20uint8_t eeconfig_read_edvorakjp(void) { 20uint8_t eeconfig_read_edvorakjp(void) { return eeprom_read_byte(EECONFIG_EDVORAK); }
21 return eeprom_read_byte(EECONFIG_EDVORAK);
22}
23 21
24void eeconfig_update_edvorakjp(uint8_t val) { 22void eeconfig_update_edvorakjp(uint8_t val) { eeprom_update_byte(EECONFIG_EDVORAK, val); }
25 eeprom_update_byte(EECONFIG_EDVORAK, val);
26}
27 23
28/* 24/*
29 * public methods 25 * public methods
30 */ 26 */
31void edvorakjp_status_init(void) { 27void edvorakjp_status_init(void) {
32 edvorakjp_state.japanese_mode = false; 28 edvorakjp_state.japanese_mode = false;
33 edvorakjp_config.raw = eeconfig_read_edvorakjp(); 29 edvorakjp_config.raw = eeconfig_read_edvorakjp();
34} 30}
35 31
36bool get_enable_kc_lang(void) { 32bool get_enable_kc_lang(void) { return edvorakjp_config.enable_kc_lang; }
37 return edvorakjp_config.enable_kc_lang;
38}
39 33
40void set_enable_kc_lang(bool new_state) { 34void set_enable_kc_lang(bool new_state) {
41 edvorakjp_config.enable_kc_lang = new_state; 35 edvorakjp_config.enable_kc_lang = new_state;
42 eeconfig_update_edvorakjp(edvorakjp_config.raw); 36 eeconfig_update_edvorakjp(edvorakjp_config.raw);
43} 37}
44 38
45bool get_japanese_mode(void) { 39bool get_japanese_mode(void) { return edvorakjp_state.japanese_mode; }
46 return edvorakjp_state.japanese_mode;
47}
48 40
49void set_japanese_mode(bool new_state) { 41void set_japanese_mode(bool new_state) {
50 edvorakjp_state.japanese_mode = new_state; 42 edvorakjp_state.japanese_mode = new_state;
51 if (edvorakjp_state.japanese_mode) { 43 if (edvorakjp_state.japanese_mode) {
52 if (edvorakjp_config.enable_kc_lang) { 44 if (edvorakjp_config.enable_kc_lang) {
53 SEND_STRING(SS_TAP(X_LANG1)); 45 SEND_STRING(SS_TAP(X_LANG1));
54 } else { 46 } else {
55 SEND_STRING(SS_LALT("`")); 47 SEND_STRING(SS_LALT("`"));
56 } 48 }
57 } else {
58 if (edvorakjp_config.enable_kc_lang) {
59 SEND_STRING(SS_TAP(X_LANG2));
60 } else { 49 } else {
61 SEND_STRING(SS_LALT("`")); 50 if (edvorakjp_config.enable_kc_lang) {
51 SEND_STRING(SS_TAP(X_LANG2));
52 } else {
53 SEND_STRING(SS_LALT("`"));
54 }
62 } 55 }
63 }
64} 56}
diff --git a/users/edvorakjp/edvorakjp_tap_dance.c b/users/edvorakjp/edvorakjp_tap_dance.c
index d5369f926..cee10de69 100644
--- a/users/edvorakjp/edvorakjp_tap_dance.c
+++ b/users/edvorakjp/edvorakjp_tap_dance.c
@@ -2,72 +2,68 @@
2#include "process_keycode/process_tap_dance.h" 2#include "process_keycode/process_tap_dance.h"
3 3
4enum tap_state { 4enum tap_state {
5 NONE = 0, 5 NONE = 0,
6 SINGLE_TAP = 1, 6 SINGLE_TAP = 1,
7 DOUBLE_TAP = 2, 7 DOUBLE_TAP = 2,
8 HOLD 8 HOLD,
9}; 9};
10 10
11typedef struct { 11typedef struct {
12 uint8_t lower; 12 uint8_t lower;
13 uint8_t raise; 13 uint8_t raise;
14} td_status_t; 14} td_status_t;
15static td_status_t td_status = {NONE, NONE}; 15static td_status_t td_status = {NONE, NONE};
16 16
17int cur_dance(qk_tap_dance_state_t *state) { 17uint8_t cur_dance(qk_tap_dance_state_t *state) {
18 if (state->interrupted || !state->pressed) { 18 if (state->interrupted || !state->pressed) {
19 return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP; 19 return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP;
20 } else { 20 } else {
21 return HOLD; 21 return HOLD;
22 } 22 }
23} 23}
24 24
25void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) { 25void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) {
26 td_status.lower = cur_dance(state); 26 td_status.lower = cur_dance(state);
27 switch(td_status.lower) { 27 switch (td_status.lower) {
28 case SINGLE_TAP: 28 case SINGLE_TAP:
29 set_japanese_mode(false); 29 set_japanese_mode(false);
30 break; 30 break;
31 case DOUBLE_TAP: 31 case DOUBLE_TAP:
32 set_japanese_mode(false); 32 set_japanese_mode(false);
33 register_code(KC_ESC); 33 register_code(KC_ESC);
34 break; 34 break;
35 case HOLD: 35 }
36 break; 36 layer_on(L_EDVORAKJP_LOWER);
37 }
38 layer_on(_LOWER);
39} 37}
40 38
41void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) { 39void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) {
42 if (td_status.lower == DOUBLE_TAP) { 40 switch (td_status.lower) {
43 unregister_code(KC_ESC); 41 case DOUBLE_TAP:
44 } 42 unregister_code(KC_ESC);
45 layer_off(_LOWER); 43 break;
46 td_status.lower = NONE; 44 }
45 layer_off(L_EDVORAKJP_LOWER);
46 td_status.lower = NONE;
47} 47}
48 48
49void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) { 49void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) {
50 td_status.raise = cur_dance(state); 50 td_status.raise = cur_dance(state);
51 switch(td_status.raise) { 51 switch (td_status.raise) {
52 case DOUBLE_TAP: 52 case DOUBLE_TAP:
53 // same as single 53 // same as single
54 case SINGLE_TAP: 54 case SINGLE_TAP:
55 set_japanese_mode(true); 55 set_japanese_mode(true);
56 break; 56 break;
57 case HOLD: 57 }
58 break; 58 layer_on(L_EDVORAKJP_RAISE);
59 }
60 layer_on(_RAISE);
61} 59}
62 60
63void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) { 61void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) {
64 layer_off(_RAISE); 62 layer_off(L_EDVORAKJP_RAISE);
65 td_status.raise = NONE; 63 td_status.raise = NONE;
66} 64}
67 65
68qk_tap_dance_action_t tap_dance_actions[] = { 66qk_tap_dance_action_t tap_dance_actions[] = {
69 [TD_LOWER] = 67 [TD_EDVORAKJP_LOWER] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_lower_finished, td_lower_reset, 150),
70 ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_lower_finished, td_lower_reset, 100), 68 [TD_EDVORAKJP_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_raise_finished, td_raise_reset, 150),
71 [TD_RAISE] =
72 ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_raise_finished, td_raise_reset, 100)
73}; 69};