OSDN Git Service

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