diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2014-08-04 12:38:20 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2014-12-10 18:50:10 +0900 |
commit | 447b11fd1c1311a6c2619bc57b8b4b334c52fa4d (patch) | |
tree | 4a6d2e6525f81a5047d08f8d9dc10e0c93cd41d7 /example-fsm-55 | |
parent | f4f2afd0ad7e1162b4161a61b15e12eb55e969b7 (diff) |
Add Happy Hacking.
Diffstat (limited to 'example-fsm-55')
-rw-r--r-- | example-fsm-55/hacker-emblem.c | 86 | ||||
-rw-r--r-- | example-fsm-55/hh.txt | 22 |
2 files changed, 90 insertions, 18 deletions
diff --git a/example-fsm-55/hacker-emblem.c b/example-fsm-55/hacker-emblem.c index 0f6ccd9..b209ff9 100644 --- a/example-fsm-55/hacker-emblem.c +++ b/example-fsm-55/hacker-emblem.c @@ -56,6 +56,16 @@ set_led_display (uint32_t data) l_data[4] = (data >> 20) & 0x1f; } +static void +scroll_led_display (uint8_t row) +{ + l_data[0] = (l_data[0] << 1) | ((row >> 0) & 1); + l_data[1] = (l_data[1] << 1) | ((row >> 1) & 1); + l_data[2] = (l_data[2] << 1) | ((row >> 2) & 1); + l_data[3] = (l_data[3] << 1) | ((row >> 3) & 1); + l_data[4] = (l_data[4] << 1) | ((row >> 4) & 1); +} + static void wait_for (uint32_t usec) @@ -172,11 +182,71 @@ static uint32_t gnu[] = { DATA55 (0x00, 0x00, 0x00, 0x00, 0x00), }; +#define DATA55V(x0,x1,x2,x3,x4) (x0<<0)|(x1<<5)|(x2<<10)|(x3<< 15)|(x4<< 20) + +#define CHAR_SPC 0 +#define CHAR_H 1 +#define CHAR_A 2 +#define CHAR_P 3 +#define CHAR_Y 4 +#define CHAR_C 5 +#define CHAR_K 6 +#define CHAR_I 7 +#define CHAR_N 8 +#define CHAR_G 9 +#define CHAR_EXC 10 + +static uint8_t hh[] = { + CHAR_H, CHAR_A, CHAR_P, CHAR_P, CHAR_Y, + CHAR_SPC, + CHAR_H, CHAR_A, CHAR_C, CHAR_K, CHAR_I, CHAR_N, CHAR_G, + CHAR_EXC, + CHAR_SPC, CHAR_SPC, CHAR_SPC, +}; + +struct { uint8_t width; uint32_t data; } chargen[] = { + { 5, 0 }, /* SPACE */ + { 5, DATA55V (0x1f, 0x04, 0x04, 0x04, 0x1f) }, /* H */ + { 5, DATA55V (0x07, 0x0a, 0x12, 0x0a, 0x07) }, /* A */ + { 5, DATA55V (0x1f, 0x14, 0x14, 0x14, 0x18) }, /* P */ + { 5, DATA55V (0x18, 0x04, 0x07, 0x04, 0x18) }, /* Y */ + { 5, DATA55V (0x0e, 0x11, 0x11, 0x11, 0x02) }, /* C */ + { 5, DATA55V (0x1f, 0x04, 0x0c, 0x12, 0x01) }, /* K */ + { 3, DATA55V (0x11, 0x1f, 0x11, 0x00, 0x00) }, /* I */ + { 5, DATA55V (0x1f, 0x08, 0x04, 0x02, 0x1f) }, /* N */ + { 5, DATA55V (0x0e, 0x11, 0x11, 0x15, 0x06) }, /* G */ + { 2, DATA55V (0x1d, 0x1c, 0x00, 0x00, 0x00) }, /* ! */ +}; + +static uint8_t state = 0; + +#define CHECK_USER() if (user_button ()) state = 0 + +static void +happy_hacking (void) +{ + unsigned int i, j; + + set_led_display (0); + for (i = 0; i < sizeof (hh); i++) + { + for (j = 0; j < chargen[hh[i]].width; j++) + { + CHECK_USER (); + scroll_led_display ((chargen[hh[i]].data >> j * 5) & 0x1f); + wait_for (150*1000); + } + + CHECK_USER (); + scroll_led_display (0); + wait_for (200*1000); + } +} + + int main (int argc, const char *argv[]) { - uint8_t state = 0; - (void)argc; (void)argv; @@ -195,22 +265,24 @@ main (int argc, const char *argv[]) { unsigned int i; - if (state) + if (state == 0) for (i = 0; i < SIZE55 (l55); i++) { if (user_button ()) - state = 0; + state = 1; set_led_display (l55[i]); wait_for (500*1000); } - else + else if (state == 1) for (i = 0; i < SIZE55 (gnu); i++) { if (user_button ()) - state = 1; + state = 2; set_led_display (gnu[i]); - wait_for (200*1000); + wait_for (250*1000); } + else + happy_hacking (); } return 0; diff --git a/example-fsm-55/hh.txt b/example-fsm-55/hh.txt index 72f51e4..49493a5 100644 --- a/example-fsm-55/hh.txt +++ b/example-fsm-55/hh.txt @@ -40,17 +40,17 @@ ooo .o. ooo -o...o 11 -oo..o 19 -o.o.o 15 -o..oo 13 -o...o 11 - -.ooo. 0e -o.... 10 -o..oo 13 -o...o 11 -.ooo. 0e +o...o +oo..o +o.o.o +o..oo +o...o + +.ooo. +o.... +o..oo +o...o +.ooo. oo oo |