Subversion Repositories freemyipod

Rev

Rev 558 | Rev 652 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 558 Rev 559
Line 1... Line 1...
1
#include "emcoreapp.h"
1
#include "emcoreapp.h"
2
 
2
 
3
 
3
 
4
struct wakeup eventwakeup;
4
struct wakeup eventwakeup;
5
int pos = 64;
5
int pos = 64;
6
int state[65];
6
bool toggle[65];
7
 
7
 
8
void handler(void* user, enum button_event eventtype, int which, int value)
8
void handler(void* user, enum button_event eventtype, int which, int value)
9
{
9
{
10
    bool action = false;
10
    bool action = false;
11
    switch (eventtype)
11
    switch (eventtype)
12
    {
12
    {
13
    case BUTTON_PRESS:
13
    case BUTTON_PRESS:
14
        switch (which)
14
        switch (which)
15
        {
15
        {
16
        case 0:
16
        case 0:
17
            state[pos] = !state[pos];
17
            toggle[pos] = true;
18
            action = true;
18
            action = true;
19
            break;
19
            break;
20
        case 1:
20
        case 1:
21
            pos++;
21
            pos++;
22
            action = true;
22
            action = true;
Line 39... Line 39...
39
    while (pos < 0) pos += 65;
39
    while (pos < 0) pos += 65;
40
    while (pos > 65) pos -= 65;
40
    while (pos > 65) pos -= 65;
41
    if (action) wakeup_signal(&eventwakeup);
41
    if (action) wakeup_signal(&eventwakeup);
42
}
42
}
43
 
43
 
44
static void renderline(void* framebuf, int width, int fontwidth, int fontheight, int line)
44
static void renderline(void* framebuf, int width, int fontwidth,
-
 
45
                       int fontheight, int* state, int line)
45
{
46
{
46
    int i;
47
    int i;
47
    for (i = 0; i < 16; i++)
48
    for (i = 0; i < 16; i++)
48
        renderchar(framebuf, 2 + fontwidth * (i + i / 4), 2 + fontheight * (2 + line), width,
49
        renderchar(framebuf, 2 + fontwidth * (i + i / 4), 2 + fontheight * (2 + line), width,
49
                    pos == i + line * 16 ? 0xffffffff : 0xff000000,
50
                    pos == i + line * 16 ? 0xffffffff : 0xff000000,
Line 53... Line 54...
53
 
54
 
54
static void main()
55
static void main()
55
{
56
{
56
    int i, j;
57
    int i, j;
57
    char buf[9];
58
    char buf[9];
-
 
59
    int state[64];
-
 
60
    for (i = 0; i < 65; i++) toggle[i] = false;
58
    for (i = 0; i < 64; i++) state[i] = clockgate_get_state(i);
61
    for (i = 0; i < 64; i++) state[i] = clockgate_get_state(i);
59
    state[i] = false;
-
 
60
    uint32_t orig[2] = {0xffffffff, 0xffffffff};
62
    uint32_t orig[2] = {0xffffffff, 0xffffffff};
61
    uint32_t now[2];
63
    uint32_t now[2];
62
    for (i = 0; i < 2; i++)
64
    for (i = 0; i < 2; i++)
63
        for (j = 0; j < 32; j++)
65
        for (j = 0; j < 32; j++)
64
            if (state[i * 32 + j])
66
            if (state[i * 32 + j])
Line 83... Line 85...
83
    }
85
    }
84
    wakeup_init(&eventwakeup);
86
    wakeup_init(&eventwakeup);
85
    wakeup_signal(&eventwakeup);
87
    wakeup_signal(&eventwakeup);
86
    struct button_hook_entry* hook = button_register_handler(handler, NULL);
88
    struct button_hook_entry* hook = button_register_handler(handler, NULL);
87
    if (!hook) panicf(PANIC_KILLTHREAD, "Could not register button hook!");
89
    if (!hook) panicf(PANIC_KILLTHREAD, "Could not register button hook!");
88
    while (true)
90
    while (!toggle[64])
89
    {
91
    {
90
        wakeup_wait(&eventwakeup, TIMEOUT_BLOCK);
92
        wakeup_wait(&eventwakeup, 500000);
91
        now[0] = 0xffffffff;
93
        now[0] = 0xffffffff;
92
        now[1] = 0xffffffff;
94
        now[1] = 0xffffffff;
93
        for (i = 0; i < 2; i++)
95
        for (i = 0; i < 2; i++)
94
            for (j = 0; j < 32; j++)
96
            for (j = 0; j < 32; j++)
95
            {
97
            {
96
                bool oldstate = state[i * 32 + j];
-
 
97
                clockgate_enable(i * 32 + j, oldstate);
-
 
98
                state[i * 32 + j] = clockgate_get_state(i * 32 + j);
98
                state[i * 32 + j] = clockgate_get_state(i * 32 + j);
-
 
99
                if (toggle[i * 32 + j])
-
 
100
                {
-
 
101
                    toggle[i * 32 + j] = false;
-
 
102
                    bool newstate = !state[i * 32 + j];
-
 
103
                    clockgate_enable(i * 32 + j, newstate);
-
 
104
                    state[i * 32 + j] = clockgate_get_state(i * 32 + j);
99
                if (state[i * 32 + j] != oldstate) state[i * 32 + j] = 2;
105
                    if (state[i * 32 + j] != newstate) state[i * 32 + j] = 2;
-
 
106
                }
100
                if (state[i * 32 + j]) now[i] &= ~(1 << j);
107
                if (state[i * 32 + j]) now[i] &= ~(1 << j);
101
            }
108
            }
102
        for (i = 0; i < 4; i++) renderline(framebuf, width, fontwidth, fontheight, i);
109
        for (i = 0; i < 4; i++) renderline(framebuf, width, fontwidth, fontheight, state, i);
103
        renderchar(framebuf, 2 + fontwidth * 18, 2, width, pos == 64 ? 0xffffffff : 0xff000000,
110
        renderchar(framebuf, 2 + fontwidth * 18, 2, width, pos == 64 ? 0xffffffff : 0xff000000,
104
                   pos == 64 ? 0xff000000 : 0xffffffff, 'X');
111
                   pos == 64 ? 0xff000000 : 0xffffffff, 'X');
105
        snprintf(buf, sizeof(buf), "%08X", orig[0]);
112
        snprintf(buf, sizeof(buf), "%08X", orig[0]);
106
        rendertext(framebuf, 2, 2, width, 0xff000000, 0xffffffff, buf);
113
        rendertext(framebuf, 2, 2, width, 0xff000000, 0xffffffff, buf);
107
        snprintf(buf, sizeof(buf), "%08X", orig[1]);
114
        snprintf(buf, sizeof(buf), "%08X", orig[1]);
Line 110... Line 117...
110
        rendertext(framebuf, 2, 2 + fontheight, width, 0xff000000, 0xffffffff, buf);
117
        rendertext(framebuf, 2, 2 + fontheight, width, 0xff000000, 0xffffffff, buf);
111
        snprintf(buf, sizeof(buf), "%08X", now[1]);
118
        snprintf(buf, sizeof(buf), "%08X", now[1]);
112
        rendertext(framebuf, 2 + 9 * fontwidth, 2 + fontheight, width,
119
        rendertext(framebuf, 2 + 9 * fontwidth, 2 + fontheight, width,
113
                   0xff000000, 0xffffffff, buf);
120
                   0xff000000, 0xffffffff, buf);
114
        displaylcd(xoffs, yoffs, width, height, framebuf, 0, 0, width);
121
        displaylcd(xoffs, yoffs, width, height, framebuf, 0, 0, width);
115
        if (state[64]) break;
-
 
116
    }
122
    }
117
    button_unregister_handler(hook);
123
    button_unregister_handler(hook);
118
    cprintf(3, "Final state: %08X %08X\n", now[0], now[1]);
124
    cprintf(3, "Final state: %08X %08X\n", now[0], now[1]);
119
}
125
}
120
 
126