OSDN Git Service

Changed the design for mp3 player application.
[kozos-expbrd/kozos_expbrd.git] / firm / sample / sample1 / os / task_menu.c
1
2 #include "lib.h"
3 #include "kozos.h"
4 #include "task_menu.h"
5 #include "task_display.h"
6 #include "task_audio.h"
7
8 #define MENU_CMD_FILEINFO   'f'
9 #define MENU_CMD_ROTARY     'r'
10 #define MENU_CMD_SWITCH     's'
11 #define MENU_CMD_REMOTE     'i'
12
13 int volume = 250;
14
15 int menu_file_info(const char *filename, int location)
16 {
17   int len = strlen(filename);
18   char *p = kz_kmalloc(2 + len + 1);
19   p[0] = MENU_CMD_FILEINFO;
20   p[1] = location;
21   strcpy(&p[2], filename);
22   p[2 + len] = '\0';
23   kz_send(MSGBOX_ID_MENU, 2 + len + 1, p);
24   return 0;
25 }
26
27 int menu_rotary_from_isr(int left, int right)
28 {
29   char *p = kx_kmalloc(4);
30   p[0] = MENU_CMD_ROTARY;
31   p[1] = left  ? 1 : 0;
32   p[2] = right ? 1 : 0;
33   p[3] = 0;
34   kx_send(MSGBOX_ID_MENU, 4, p);
35   return 0;
36 }
37
38 int menu_switch_from_isr(int sw1, int sw2, int swr)
39 {
40   char *p = kx_kmalloc(4);
41   p[0] = MENU_CMD_SWITCH;
42   p[1] = sw1;
43   p[2] = sw2;
44   p[3] = swr;
45   kx_send(MSGBOX_ID_MENU, 4, p);
46   return 0;
47 }
48
49 int menu_remote_from_isr(char *signal, int siz)
50 {
51   char *p = kx_kmalloc(8);
52   p[0] = MENU_CMD_REMOTE;
53   p[1] = 0;
54   p[2] = 0;
55   p[3] = 0;
56   p[4] = signal[0];
57   p[5] = signal[1];
58   p[6] = signal[2];
59   p[7] = signal[3];
60   kx_send(MSGBOX_ID_MENU, 8, p);
61   return 0;
62 }
63
64 #define LED_LEFT() \
65     do { \
66       display_led_write(1, 0); \
67       display_led_toggle(0); \
68     } while (0)
69
70 #define LED_RIGHT() \
71     do { \
72       display_led_write(0, 0); \
73       display_led_toggle(1); \
74     } while (0)
75
76 static int menu_cmdproc(char *p)
77 {
78   int cmd = p[0];
79   switch (cmd) {
80   case MENU_CMD_FILEINFO:
81     display_draw_progressbar(5, 20, 121 - 5, 25, 0, 100, p[1]);
82     display_draw_text(24, 2, &p[2]);
83     break;
84   case MENU_CMD_ROTARY:
85     if (p[1]) {
86         LED_LEFT();
87     }
88     if (p[2]) {
89         LED_RIGHT();
90     }
91     break;
92   case MENU_CMD_SWITCH:
93     if (p[1]) {
94         LED_LEFT();
95     }
96     if (p[2]) {
97         LED_RIGHT();
98     }
99     if (p[3]) {
100         // @todo
101     }
102     break;
103   case MENU_CMD_REMOTE:
104     {
105         uint32 n =
106             ((uint32)p[4] << 24) |
107             ((uint32)p[5] << 16) |
108             ((uint32)p[6] <<  8) |
109             ((uint32)p[7] <<  0);
110         /*
111          * \e$B%j%b%3%s$N%3!<%I$O!"%a!<%+$K$h$C$F0[$J$k!#\e(B
112          */
113         switch (n) {
114             case 0xaa550af5:
115                 if (volume < 250) {
116                     volume++;
117                     audio_volume(volume, volume);
118                 }
119                 break;
120             case 0xaa550bf4:
121                 if (5 < volume) {
122                     volume--;
123                     audio_volume(volume, volume);
124                 }
125                 break;
126             case 0xaa5511ee:
127                 LED_LEFT();
128                 break;
129             case 0xaa5510ef:
130                 LED_RIGHT();
131                 break;
132             default:
133                 puts("Unknown: ");
134                 putxval(p[4], 2);
135                 putxval(p[5], 2);
136                 putxval(p[6], 2);
137                 putxval(p[7], 2);
138                 puts("\n");
139                 break;
140         }
141     }
142     break;
143   default:
144     break;
145   }
146   kz_kmfree(p);
147
148   return 0;
149 }
150
151 int task_menu(int argc, char *argv[])
152 {
153   display_clear();
154   display_draw_box(0, 0, 121, 31, 1);
155   display_draw_logo(2, 2, 0);
156
157   audio_volume(volume, volume);
158
159   while (1) {
160       int size;
161       char *p;
162       kz_recv(MSGBOX_ID_MENU, &size, &p);
163       menu_cmdproc(p);
164   }
165
166   return 0;
167 }
168