updated the todo file
[cerebrum.git] / cerebrum_firmware.c
blob69e9371161b23231a9f070bbb3c6e2457ac96fbe
1 /*
2 Copyright (C) 2012 jaseg <s@jaseg.de>
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 version 3 as published by the Free Software Foundation.
7 */
9 #include "config.h"
10 #include <avr/io.h>
11 #include <util/delay.h>
12 #include <avr/pgmspace.h>
13 #include <avr/interrupt.h>
14 #include "uart.h"
15 #include "util.h"
16 #include "r0ketbeam.h"
17 #include "7seg.h"
18 #include "led.h"
19 #include "pwm.h"
20 #include "input.h"
22 void setup(void);
23 void loop(void);
25 int main(void){
26 setup();
27 for(;;) loop();
30 void setup(){
31 uart_init(UART_BAUD_SELECT_DOUBLE_SPEED(57600, F_CPU));
32 DDRD |= 0x02;
33 pwm_setup();
34 l7seg_setup();
35 r0ketbeam_setup();
36 input_setup();
37 led_setup();
38 config_setup();
39 sei();
42 char nbuf;
43 char bpos;
44 int state = 0;
45 uint8_t somecycle = 0; //FIXME debug value
47 void loop(){ //one frame
48 static uint8_t escape_state = 0;
49 uint16_t receive_state = 1;
50 //primitive somewhat messy state machine of the uart interface
51 do{ //Always empty the receive buffer since there are _delay_xxs in the following code and thus this might not run all that often.
52 receive_state = uart_getc();
53 char c = receive_state&0xFF;
54 receive_state &= 0xFF00;
55 //escape code format:
56 // \\ - backslash
57 // \n - newline
58 // \[x] - x
59 //eats [n] commands: 's' (0x73) led value sets led number [led] to [value]
60 // 'b' (0x62) buffer buffer buffer buffer sets the whole frame buffer
61 // 'a' (0x61) meter value sets analog meter number [meter] to [value]
62 // 'r' (0x72) read the frame buffer
63 // 'd' (0x64) display digit digit digit digit sets the 7-segment display (CAUTION: "display" currently is ignored)
64 //this device will utter a "'c' (0x63) num state" when switch [num] changes state to [state]
65 //commands are terminated by \n
66 if(!receive_state){
67 if(!escape_state){
68 if(c == '\\'){
69 receive_state |= 0x02;
70 escape_state = 1;
71 }else if(c == '\n'){
72 receive_state |= 0x02;
73 state = 0;
75 }else{
76 receive_state = 0;
77 escape_state = 0;
78 switch(c){
79 case '\\':
80 break;
81 case 'n':
82 c = '\n';
83 break;
87 if(!receive_state){
88 switch(state){
89 case 0: //Do not assume anything about the variables used
90 //command char
91 switch(c){
92 #ifdef HAS_LED_SUPPORT
93 case 's':
94 state = 2;
95 break;
96 case 'b':
97 nbuf = 0;
98 state = 4;
99 break;
100 #endif//HAS_LED_SUPPORT
101 #ifdef HAS_PWM_SUPPORT
102 case 'a':
103 state = 5;
104 nbuf = 0;
105 break;
106 #endif//HAS_PWM_SUPPORT
107 #ifdef HAS_LED_SUPPORT
108 case 'r':
109 uart_putc('r');
110 for(uint8_t i=0; i<sizeof(frameBuffer); i++){
111 uart_puthex(frameBuffer[i]);
113 uart_putc('\n');
114 break;
115 #endif//HAS_LED_SUPPORT
116 #ifdef HAS_7SEG_SUPPORT
117 case 'd':
118 nbuf = 0;
119 bpos = 0;
120 state = 7;
121 #endif//HAS_7SEG_SUPPORT
123 break;
124 #ifdef HAS_LED_SUPPORT
125 case 2:
126 nbuf=c;
127 state = 3;
128 break;
129 case 3:
130 setLED(nbuf, c);
131 state = 0;
132 break;
133 case 4:
134 secondFrameBuffer[(uint8_t) nbuf] = c;
135 nbuf++;
136 if(nbuf == 7){
137 swapBuffers();
138 state = 0;
140 break;
141 #endif//HAS_LED_SUPPORT
142 #ifdef HAS_PWM_SUPPORT
143 case 5:
144 if(c > PWM_COUNT)
145 c = 0;
146 nbuf = c;
147 if(nbuf >= PWM_COUNT)
148 nbuf = 0;
149 state = 6;
150 break;
151 case 6:
152 pwm_val[(uint8_t) nbuf] = c;
153 uart_puts_p(PSTR("ACK\n"));
154 state = 0;
155 break;
156 #endif//HAS_PWM_SUPPORT
157 #ifdef HAS_7SEG_SUPPORT
158 case 7:
159 nbuf = c;
160 state = 8;
161 break;
162 case 8:
163 l7seg_buf[(uint8_t)bpos] = c;
164 bpos++;
165 if(bpos == 4){
166 state = 0;
168 break;
169 #endif//HAS_7SEG_SUPPORT
172 }while(!receive_state);
173 led_loop();
174 r0ketbeam_loop();
175 l7seg_loop();
176 input_loop();
177 pwm_loop();
178 _delay_ms(1);