902aa402b3830b9c9aa26758390b6eb93b42a0f5
Stefan Schuermans added file headers

Stefan Schuermans authored 12 years ago

1) /* MIPS I system
Stefan Schuermans replace email address in he...

Stefan Schuermans authored 12 years ago

2)  * Copyright 2011-2012 Stefan Schuermans <stefan@blinkenarea.org>
Stefan Schuermans added file headers

Stefan Schuermans authored 12 years ago

3)  * Copyleft GNU public license V2 or later
4)  *          http://www.gnu.org/copyleft/gpl.html
5)  */
6) 
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

7) #include "config.h"
8) #include "eth.h"
Stefan Schuermans added debug output functions

Stefan Schuermans authored 12 years ago

9) #include "format.h"
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

10) #include "lcd.h"
11) #include "macros.h"
12) #include "menu.h"
13) #include "switches.h"
14) 
15) /// last value of rotary knob
Stefan Schuermans fixed menu

Stefan Schuermans authored 12 years ago

16) static int menu_cur_rot_cnt = 0;
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

17) 
18) /// current screen
19) static int menu_cur_screen = 0;
20) 
21) /// current content on screen
22) static char menu_cur_content[16];
23) 
24) /**
25)  * @brief update screen content
26)  * @param[in] str new content to display
27)  */
28) static void menu_update_content(const char *str)
29) {
30)   unsigned int i;
31) 
32)   // update only characters that changed (LCD is slow)
33)   for (i = 0; str[i] != 0 && i < 16; ++i) {
34)     if (menu_cur_content[i] != str[i]) {
35)       menu_cur_content[i] = str[i];
36)       lcd_chr(1, i, str[i]);
37)     }
38)   }
39)   // clear rest of line
40)   for (; i < 16; ++i) {
41)     if (menu_cur_content[i] != ' ') {
42)       menu_cur_content[i] = ' ';
43)       lcd_chr(1, i, ' ');
44)     }
45)   }
46) }
47) 
48) /// start screen
49) static void menu_screen_start(void)
50) {
51)   menu_update_content("turn knob...");
52) }
53) 
54) /// switches screen
55) static void menu_screen_switches(void)
56) {
Stefan Schuermans buffer overflow fix

Stefan Schuermans authored 12 years ago

57)   char buf[12];
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

58) 
59)   buf[0] = switches_get_state(sw_0) ? '0' : ' ';
60)   buf[1] = switches_get_state(sw_1) ? '1' : ' ';
61)   buf[2] = switches_get_state(sw_2) ? '2' : ' ';
62)   buf[3] = switches_get_state(sw_3) ? '3' : ' ';
63)   buf[4] = switches_get_state(sw_east) ? 'E' : ' ';
64)   buf[5] = switches_get_state(sw_north) ? 'N' : ' ';
65)   buf[6] = switches_get_state(sw_south) ? 'S' : ' ';
66)   buf[7] = switches_get_state(sw_west) ? 'W' : ' ';
67)   buf[8] = switches_get_state(sw_center) ? 'C' : ' ';
68)   buf[9] = switches_get_state(sw_rot_a) ? 'a' : ' ';
69)   buf[10] = switches_get_state(sw_rot_b) ? 'b' : ' ';
70)   buf[11] = 0;
71) 
72)   menu_update_content(buf);
73) }
74) 
75) /// ethernet screen
76) static void menu_screen_eth(void)
77) {
78)   char buf[] = "RX 0000 TX 0000";
79) 
Stefan Schuermans added debug output functions

Stefan Schuermans authored 12 years ago

80)   format_uint2dec(eth_rx_get_cnt(), 4, &buf[3]);
81)   format_uint2dec(eth_tx_get_cnt(), 4, &buf[11]);
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

82) 
83)   menu_update_content(buf);
84) }
85) 
86) /// MAC address screen
87) static void menu_screen_mac(void)
88) {
89)   unsigned int i;
90)   char buf[] = "000000000000";
91) 
92)   for (i = 0; i < 6; ++i)
Stefan Schuermans added debug output functions

Stefan Schuermans authored 12 years ago

93)     format_uint2hex(config_mac.mac[i], 2, &buf[i * 2]);
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

94) 
95)   menu_update_content(buf);
96) }
97) 
98) /// IP address screen
99) static void menu_screen_ip(void)
100) {
101)   unsigned int i;
102)   char buf[] = "000.000.000.000";
103) 
104)   for (i = 0; i < 4; ++i)
Stefan Schuermans added debug output functions

Stefan Schuermans authored 12 years ago

105)     format_uint2dec(config_ip.ip[i], 3, &buf[i * 4]);
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

106) 
107)   menu_update_content(buf);
108) }
109) 
110) /// subnet mask screen
111) static void menu_screen_netmask(void)
112) {
113)   unsigned int i;
114)   char buf[] = "000.000.000.000";
115) 
116)   for (i = 0; i < 4; ++i)
Stefan Schuermans added debug output functions

Stefan Schuermans authored 12 years ago

117)     format_uint2dec(config_ip.mask[i], 3, &buf[i * 4]);
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

118) 
119)   menu_update_content(buf);
120) }
121) 
122) /// gateway IP screen
123) static void menu_screen_gateway(void)
124) {
125)   unsigned int i;
126)   char buf[] = "000.000.000.000";
127) 
128)   for (i = 0; i < 4; ++i)
Stefan Schuermans added debug output functions

Stefan Schuermans authored 12 years ago

129)     format_uint2dec(config_ip.gw[i], 3, &buf[i * 4]);
Stefan Schuermans implement menu on LCD

Stefan Schuermans authored 12 years ago

130) 
131)   menu_update_content(buf);
132) }
133) 
134) /// available screens
135) static struct menu_screen {
136)   const char *title; ///< title of screen
137)   void (*update)(void); ///< function to update screen content
138) } menu_screens[] = {
139)   { "MIPS I", menu_screen_start },
140)   { "switches", menu_screen_switches },
141)   { "ethernet", menu_screen_eth },
142)   { "MAC address", menu_screen_mac },
143)   { "IP address", menu_screen_ip },
144)   { "subnet mask", menu_screen_netmask },
145)   { "gateway IP", menu_screen_gateway },
146) };
147) 
148) /// initialize
149) void menu_init(void)
150) {
151)   lcd_init();
152)   menu_cur_screen = 0;
153)   lcd_str(0, menu_screens[0].title);
154)   menu_screens[0].update();
155) }
156) 
157) /// task procedure - call as often as possible
158) void menu_task(void)
159) {
160)   // get new screen to show
Stefan Schuermans fixed menu

Stefan Schuermans authored 12 years ago

161)   int new_rot_cnt = switches_get_rot_cnt();
162)   int delta = (new_rot_cnt - menu_cur_rot_cnt) / 4; // 1 click is 4 steps
163)   menu_cur_rot_cnt += delta * 4;