Project

General

Profile

Statistics
| Revision:

root / trunk / toolbox / main.c @ 114

History | View | Annotate | Download (3.5 KB)

1
/** @file main.c
2
 *  @brief Contains the main function for the toolbox code.
3
 *
4
 *  @author Suresh Nidhiry (snidhiry), Kevin Woo (kwoo)
5
 */
6

    
7
//Includes
8
#include <avr/io.h>
9
#include <avr/interrupt.h>
10
#include <stdint.h>
11
#include <util/delay.h>
12
#include "uart.h"
13

    
14
#define GREEN   _BV(PORTB2)
15
#define YELLOW  _BV(PORTB1)
16
#define RED     _BV(PORTB0)
17
#define ON      0x01
18
#define OFF     0x00
19

    
20
#define DELIM '^'
21
#define ADDR '2'
22
typedef enum {
23
    sd,     // start delimitor
24
    src,    // src
25
    dest,   // destination
26
    data,   // data
27
    cs,     // checksum
28
    pwron,  // poweron
29
} state_t;
30

    
31
void init_pins() {
32
    //DDRB = 0x00;
33
    DDRB = _BV(DDB0) | _BV(DDB1) | _BV(DDB2);
34

    
35
    PORTB = 0x00;
36
}
37

    
38
void toggle_pin(uint8_t which, uint8_t state) {
39
    if (state == ON) {
40
        PORTB &= ~which;
41
    } else {
42
        PORTB |= which;
43
    }
44
}
45

    
46
int main(int argc, char **argv) {
47
    state_t state = sd;
48
    uint8_t packet[3];
49

    
50
        /***** Start Start-up Sequence *****/
51
        sei();                                //Enable interrupts
52
        //init_timer();                //Set registers for timer
53
        init_pins();                //Set pin directions
54
        init_uart(51);                //Set registers for uart
55
        /***** End Start-up Sequence *****/
56

    
57
    // Debug lights to know we are sending or not
58
    DDRD |= _BV(DDD4) | _BV(DDD3);
59
    PORTD &= ~_BV(PORTD4) & ~_BV(PORTD3);
60
    _delay_ms(1000);
61

    
62
    uint8_t r;
63
    uint8_t s = 0;
64
    
65
    packet[0] = 0x00;
66
    packet[1] = 0x00;
67
    packet[2] = 0x00;
68

    
69
        while(1) {
70
        switch (state) {
71
            case sd:
72
                while ((uart_get_byte(&r)) < 0);
73

    
74
                if (r == DELIM) {
75
                    state = src;
76
                }
77
                break;
78
            case src:
79
                while ((uart_get_byte(&r)) < 0);
80

    
81
                if (r == DELIM) {
82
                    state = src;
83
                } else {
84
                    packet[0] = r;
85
                    state = dest;
86
                }
87
                break;
88
            case dest:
89
                while ((uart_get_byte(&r)) < 0);
90

    
91
                if (r == DELIM) {
92
                    packet[0] = 0x00;
93
                    state = src;
94
                } else if (r == ADDR) {
95
                    packet[1] = r;
96
                    state = data;
97
                } else {
98
                    packet[0] = 0x00;
99
                    state = sd;
100
                }
101
                break;
102
            case data:
103
                while ((uart_get_byte(&r)) < 0);
104
                
105
                if (r == DELIM) {
106
                    packet[0] = 0x00;
107
                    packet[1] = 0x00;
108
                    state = src;
109
                } else {
110
                    packet[2] = r;
111
                    state = pwron;
112
                }
113
                break;
114
            case cs:
115
                while ((uart_get_byte(&r)) < 0);
116

    
117
                if (r == (packet[0] ^ packet[1] ^ packet[2])) {
118
                    state = pwron;
119
                } else {
120
                    packet[0] = 0x00;
121
                    packet[1] = 0x00;
122
                    packet[2] = 0x00;
123
                    state = sd;
124
                }
125
                break;
126
            case pwron:
127
                uart_send_byte('A');
128

    
129
                if (s == 0) {
130
                    toggle_pin(YELLOW, OFF);
131
                    toggle_pin(GREEN, OFF);
132
                    toggle_pin(RED, OFF);
133
                    s = 1;
134
                } else {
135
                    toggle_pin(YELLOW, ON);
136
                    toggle_pin(GREEN, ON);
137
                    toggle_pin(RED, ON);
138
                    s = 0;
139
                }
140
                break;
141
        }        
142
        }
143
        
144
        return 0;
145
}