4008-04-07 Release
[avr_bc100.git] / BaseMegaFirmware / GCC / main.c
1 /* Copyright (c) 2008 Martin Thomas\r
2    All rights reserved.\r
3 \r
4    Redistribution and use in source and binary forms, with or without\r
5    modification, are permitted provided that the following conditions are met:\r
6 \r
7    * Redistributions of source code must retain the above copyright\r
8      notice, this list of conditions and the following disclaimer.\r
9 \r
10    * Redistributions in binary form must reproduce the above copyright\r
11      notice, this list of conditions and the following disclaimer in\r
12      the documentation and/or other materials provided with the\r
13      distribution.\r
14 \r
15    * Neither the name of the copyright holders nor the names of\r
16      contributors may be used to endorse or promote products derived\r
17      from this software without specific prior written permission.\r
18 \r
19   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
20   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
21   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
22   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
23   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
24   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
25   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
26   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
27   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
28   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
29   POSSIBILITY OF SUCH DAMAGE.\r
30 */\r
31 \r
32 #define VERSION_STRING "V0.1 4/2008"\r
33 \r
34 #include <stdlib.h>\r
35 #include <stdio.h>\r
36 #include <stdint.h>\r
37 #include <avr/io.h>\r
38 #include <avr/interrupt.h>\r
39 #include <avr/pgmspace.h>\r
40 #include <util/delay.h>\r
41 \r
42 #include "uart.h"\r
43 #include "mystdio.h"\r
44 #include "bc100_slave.h"\r
45 #include "port_ext.h"\r
46 #include "timebase.h"\r
47 #include "key_io.h"\r
48 \r
49 #ifndef F_CPU\r
50 #warning "F_CPU not defined - will do now"\r
51 #define F_CPU 7372800UL\r
52 #endif\r
53 \r
54 #define UART_BAUD_RATE      115200\r
55 \r
56 static void fun_delay()\r
57 {\r
58         uint8_t i;\r
59         for (i=0;i<10;i++) _delay_ms(10);\r
60 }\r
61 \r
62 static void fun(void)\r
63 {\r
64         uint8_t i, j;\r
65 \r
66         for ( i=0; i<5; i++) {\r
67                 port_ext_set( 1, 0x0f );\r
68                 port_ext_update();\r
69                 fun_delay();\r
70                 port_ext_set( 1, 0xf0 );\r
71                 port_ext_update();\r
72                 fun_delay();\r
73         }\r
74         port_ext_set( 1, 0x00 );\r
75         port_ext_update();\r
76 \r
77         for ( i=0; i<2; i++) {\r
78                 for ( j=0; j<4; j++ ) {\r
79                         port_ext_bit_set( 1, j );\r
80                         port_ext_bit_set( 1, j+4 );\r
81                         port_ext_update();\r
82                         fun_delay();\r
83                 }\r
84                 for ( j=4; j>0; j-- ) {\r
85                         port_ext_bit_clear( 1, j-1 );\r
86                         port_ext_bit_clear( 1, j-1+4 );\r
87                         port_ext_update();\r
88                         fun_delay();\r
89                 }\r
90         }\r
91         port_ext_set( 1, 0x00 );\r
92         port_ext_update();\r
93 }\r
94 \r
95 static void slave_run(void)\r
96 {\r
97         port_ext_bit_set( 0, 0 );\r
98         port_ext_bit_set( 0, 1 );\r
99         port_ext_update();\r
100 }\r
101 \r
102 static void slave_stop(void)\r
103 {\r
104         port_ext_bit_clear( 0, 0 );\r
105         port_ext_bit_clear( 0, 1 );\r
106         port_ext_update();\r
107 }\r
108 \r
109 int main(void)\r
110 {\r
111         uint16_t ui_input, tick_local, tick_now;\r
112         uint8_t  c, show_menu;\r
113 \r
114         // wait for power-button release (paranoia?)\r
115         while ( !( PIND & ( 1 << PD5 ) ) )  { ; }\r
116         key_io_init();\r
117 \r
118         uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); \r
119         mystdio_init();\r
120 \r
121         timebase_init();\r
122 \r
123         sei();\r
124 \r
125         myprintf_P("\n\nBC100 Master Firmware, (C) Martin Thomas " VERSION_STRING "\n");\r
126         \r
127 \r
128         bc100_slave_init();\r
129 \r
130         port_ext_init();\r
131         fun();\r
132         slave_run();\r
133 \r
134         show_menu = 1;\r
135         tick_local = timebase_get_tick();\r
136 \r
137         while ( 1 ) {\r
138                 if ( show_menu ) {\r
139                         myprintf_P("(1) 0x55 to LEDs\n");\r
140                         myprintf_P("(2) 0xAA to LEDs\n");\r
141                         myprintf_P("(3) MASTER_INT low\n");\r
142                         myprintf_P("(4) MASTER_INT high\n");\r
143                         myprintf_P("(f) Power Off\n");\r
144                         myprintf_P("(t) Test Slave Comm\n");\r
145                         myprintf_P("(r) Reset Slave\n");\r
146                         myprintf_P("(h) Show this again\n");\r
147                         myprintf_P("Select > ");\r
148                         show_menu = 0;\r
149                 }\r
150 \r
151                 ui_input = uart_getc();\r
152                 if ( ui_input & UART_NO_DATA ) { \r
153                         /* not data */ \r
154                 }\r
155                 else {\r
156                         if ( ui_input & UART_FRAME_ERROR ) {\r
157                                 uart_puts_P("UART Frame Error: ");\r
158                         }\r
159                         if ( ui_input & UART_OVERRUN_ERROR ) {\r
160                                 uart_puts_P("UART Overrun Error: ");\r
161                         }\r
162                         if ( ui_input & UART_BUFFER_OVERFLOW ) {\r
163                                 uart_puts_P("Buffer overflow error: ");\r
164                         }\r
165 \r
166                         c = (uint8_t)ui_input;\r
167                         myprintf_P("%c\n", c);\r
168                         switch ( c ) {\r
169 #ifdef BC100_SLAVE_TEST\r
170                                 case 't' :\r
171                                         if (  ( PORTD & (1<<PD4) ) ||\r
172                                              !( DDRD  & (1<<PD4) ) ) {\r
173                                                 myprintf_P("MASTER_INT should be low\n");\r
174                                         }\r
175                                         bc100_slave_test();\r
176                                         break;\r
177 #endif\r
178                                 case '1' :\r
179                                         port_ext_set( 1, 0x55 );\r
180                                         port_ext_update();\r
181                                         break;\r
182                                 case '2' :\r
183                                         port_ext_set( 1, 0xAA );\r
184                                         port_ext_update();\r
185                                         break;\r
186                                 case '3' :\r
187                                         PORTD &= ~(1<<PD4);\r
188                                         DDRD  |= (1<<PD4);\r
189                                         break;\r
190                                 case '4' :\r
191                                         PORTD |= (1<<PD4);\r
192                                         DDRD  |= (1<<PD4);\r
193                                         break;\r
194                                 case 'f' :\r
195                                         myprintf_P("Byebye");\r
196                                         _delay_ms(5);\r
197                                         slave_stop();\r
198                                         port_ext_bit_clear( 0, 2 );\r
199                                         port_ext_update();\r
200                                         while (1) { ; }\r
201                                         break;\r
202                                 case 'r' :\r
203                                         slave_stop();\r
204                                         _delay_ms(5);\r
205                                         slave_run();\r
206                                         break;\r
207                                 case 'h' :\r
208                                         show_menu = 1;\r
209                                         break;\r
210                                 default :\r
211                                         break;\r
212                         } /* switch */\r
213                         if ( !show_menu ) {\r
214                                 myprintf_P("Select (h=help) > ");\r
215                         }\r
216                 } /* key detected */\r
217 \r
218                 tick_now = timebase_get_tick();\r
219                 if ( (uint16_t)( tick_now - tick_local ) > 200 ) {\r
220                         // myprintf_P("Keys: %02x", key_io_state_hardware() );\r
221                         tick_local = tick_now;\r
222                 }\r
223 \r
224                 if ( key_io_get_press( KEY_IO_KEY_SW0 ) ) {\r
225                         myprintf_P("SW0 press\n");\r
226                 }\r
227                 if( key_io_get_longpress( KEY_IO_KEY_SW1 ) ) {\r
228                         myprintf_P("SW1 long\n");\r
229                 }\r
230                 if( key_io_get_was_short( KEY_IO_KEY_SW2 ) ) {\r
231                         myprintf_P("SW2 was short\n");\r
232                 }\r
233                 if( key_io_get_rpt( KEY_IO_KEY_SW2 ) ) {\r
234                         myprintf_P("SW2 repeat/long\n");\r
235                 }\r
236                 if ( key_io_get_press( KEY_IO_KEY_SW3 ) ) {\r
237                         myprintf_P("SW3 pres\n");\r
238                 }\r
239 \r
240                 if( key_io_get_press( KEY_IO_KEY_POWER ) ) {\r
241                         myprintf_P("POWER Key hit -> Power off\n");\r
242                         while ( !( PIND & (1 << PD5) ) ) { ; }\r
243                         slave_stop();\r
244                         port_ext_bit_clear( 0, 2 );\r
245                         port_ext_update();\r
246                 }\r
247 \r
248 \r
249         } /* main-loop */\r
250 }\r