OSDN Git Service

Removed DREQ check code.
[kozos-expbrd/kozos_expbrd.git] / firm / sample / sample1 / os / task_menu.c
1
2 #include "task_menu.h"
3 #include "task_audio.h"
4 #include "task_display.h"
5 #include "kozos.h"
6 #include "lib.h"
7
8 #define MENU_CMD_INPUT    'i'
9 #define MENU_CMD_REMOTE   'r'
10
11 int nx = 40, ny = 12;
12 int volume = 250;
13
14 int menu_input_from_isr(int left, int right, int sw)
15 {
16   char *p = kx_kmalloc(4);
17   p[0] = MENU_CMD_INPUT;
18   p[1] = left  ? 1 : 0;
19   p[2] = right ? 1 : 0;
20   p[3] = sw    ? 1 : 0;
21   kx_send(MSGBOX_ID_MENU, 4, p);
22   return 0;
23 }
24
25 int menu_remote_from_isr(char *signal, int siz)
26 {
27   char *p = kx_kmalloc(8);
28   p[0] = MENU_CMD_REMOTE;
29   p[1] = 0;
30   p[2] = 0;
31   p[3] = 0;
32   p[4] = signal[0];
33   p[5] = signal[1];
34   p[6] = signal[2];
35   p[7] = signal[3];
36   kx_send(MSGBOX_ID_MENU, 8, p);
37   return 0;
38 }
39
40 #define NIJIMASU_GO_LEFT() \
41     do { \
42         if (40 < nx) { \
43           nx--; \
44           display_draw_box(nx + 20, ny, nx + 20, ny + 16, 0); \
45           display_draw_logo(nx, ny, 0); \
46           display_led_write(1, 0); \
47           display_led_toggle(0); \
48         } \
49     } while (0)
50
51 #define NIJIMASU_GO_RIGHT() \
52     do { \
53         if (nx < 100) { \
54           nx++; \
55           display_draw_box(nx + 20, ny, nx + 20, ny + 16, 0); \
56           display_draw_logo(nx, ny, 0); \
57           display_led_write(0, 0); \
58           display_led_toggle(1); \
59         } \
60     } while (0)
61
62 static int menu_cmdproc(char *p)
63 {
64   int cmd = p[0];
65   switch (cmd) {
66   case MENU_CMD_INPUT:
67     if (p[1]) {
68         NIJIMASU_GO_LEFT();
69     }
70     if (p[2]) {
71         NIJIMASU_GO_RIGHT();
72     }
73     break;
74   case MENU_CMD_REMOTE:
75     {
76         uint32 n =
77             ((uint32)p[4] << 24) |
78             ((uint32)p[5] << 16) |
79             ((uint32)p[6] <<  8) |
80             ((uint32)p[7] <<  0);
81         switch (n) {
82             case 0xaa550af5:
83                 if (volume < 250) {
84                     volume++;
85                     audio_volume(volume, volume);
86                 }
87                 break;
88             case 0xaa550bf4:
89                 if (5 < volume) {
90                     volume--;
91                     audio_volume(volume, volume);
92                 }
93                 break;
94             case 0xaa5511ee:
95                 NIJIMASU_GO_LEFT();
96                 break;
97             case 0xaa5510ef:
98                 NIJIMASU_GO_RIGHT();
99                 break;
100             default:
101                 puts("Unknown: ");
102                 putxval(p[4], 2);
103                 putxval(p[5], 2);
104                 putxval(p[6], 2);
105                 putxval(p[7], 2);
106                 puts("\n");
107                 break;
108         }
109     }
110     break;
111   default:
112     break;
113   }
114   kz_kmfree(p);
115
116   return 0;
117 }
118
119 int task_menu(int argc, char *argv[])
120 {
121   display_clear();
122   display_draw_logo(  0, 0, 2);
123   display_draw_box(0, 0, 121, 31, 1);
124   display_draw_text(40, 4, "KOZOS EXPBRD #00");
125   display_draw_logo(nx, ny, 0);
126
127   audio_volume(volume, volume);
128
129   while (1) {
130       int size;
131       char *p;
132       kz_recv(MSGBOX_ID_MENU, &size, &p);
133       menu_cmdproc(p);
134   }
135
136   return 0;
137 }
138