Project

General

Profile

Statistics
| Revision:

root / trunk / toolbox / main.c @ 139

History | View | Annotate | Download (7.71 KB)

1
/********
2
 * This file is part of Tooltron.
3
 *
4
 * Tooltron is free software: you can redistribute it and/or modify
5
 * it under the terms of the Lesser GNU General Public License as published by
6
 * the Free Software Foundation, either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * Tooltron is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * Lesser GNU General Public License for more details.
13
 * You should have received a copy of the Lesser GNU General Public License
14
 * along with Tooltron.  If not, see <http://www.gnu.org/licenses/>.
15
 *
16
 * Copyright 2009 Kevin Woo <kwoo@2ndt.com>
17
 *
18
 ********/
19
/** @file main.c
20
 *  @brief Contains the main function for the toolbox code.
21
 *
22
 *  @author Suresh Nidhiry (snidhiry), Kevin Woo (kwoo)
23
 */
24

    
25
//Includes
26
#include <avr/io.h>
27
#include <avr/interrupt.h>
28
#include <stdint.h>
29
#include <util/delay.h>
30
#include "uart.h"
31

    
32
#define RELAY       _BV(PORTD4)
33
#define VAC_SENSE   _BV(PIND3)
34
#define BUT_RED     _BV(PINB4)
35
#define BUT_BLACK   _BV(PINB3)
36
#define LED_GREEN   _BV(PORTB2)
37
#define LED_YELLOW  _BV(PORTB1)
38
#define LED_RED     _BV(PORTB0)
39
#define ON      0x01
40
#define OFF     0x00
41

    
42
#define DELIM '^'
43
#define ADDR 2
44
#define SERVER 1
45
#define TURNON 'O'
46

    
47
#define TWAIT   1
48
#define TWARN   1
49
#define TMAX    2
50

    
51
uint8_t sec;
52
uint8_t min;
53

    
54
typedef enum {
55
    sd,     // start delimitor
56
    src,    // src
57
    dest,   // destination
58
    data,   // data
59
    cs,     // checksum
60
    ack,    // send ack
61
    pwron,  // poweron
62
    toolon, // tool on
63
    warn,   // time warning
64
    off     // tool off
65
} state_t;
66

    
67
void init_pins(void) {
68
    DDRB = 0x00;
69
    DDRB = _BV(DDB0) | _BV(DDB1) | _BV(DDB2) | _BV(DDB5);
70
    DDRD = _BV(DDB4);
71
    PORTB = 0x00;
72
}
73

    
74
void toggle_led(uint8_t which, uint8_t state) {
75
    if (state == ON) {
76
        PORTB &= ~which;
77
    } else {
78
        PORTB |= which;
79
    }
80
}
81

    
82
void toggle_relay(uint8_t state) {
83
    if (state == ON) {
84
        PORTD |= RELAY;
85
    } else {
86
        PORTD &= ~RELAY;
87
    }
88
}
89

    
90
inline uint8_t read_vac(void) {
91
    return (!(PIND & VAC_SENSE));
92
}
93

    
94
inline uint8_t read_button(uint8_t which) {
95
    return (!(PINB & which));
96
}
97

    
98
void init_timer(void) {
99
    // Clear timmer on OCRA1 Compare match
100
    // No prescale
101
    TCCR1B |= _BV(WGM12) | _BV(CS12);
102
    
103
    // 1 second @ 8MHz clock
104
    OCR1AH =0x7A;
105
    OCR1AL =0x12;
106

    
107
    TIMSK = _BV(OCIE1A);
108

    
109
    sec = 0;
110
    min = 0;
111
}
112

    
113
void reset_timer(void) {
114
    sec = 0;
115
    min = 0;
116
}
117

    
118
ISR(TIMER1_COMPA_vect) {
119
    if (sec == 59) {
120
        sec = 0;
121
        min++;
122
    } else {
123
        sec++;
124
    }
125
}
126

    
127

    
128
int main(int argc, char **argv) {
129
    state_t state = sd;
130
    uint8_t packet[3];
131
    uint8_t prev_sec;
132
    uint8_t prev_min;
133
    uint8_t prev_state;
134

    
135
        /***** Start Start-up Sequence *****/
136
        sei();                                //Enable interrupts
137
        init_timer();                //Set registers for timer
138
        init_pins();                //Set pin directions
139
        init_uart(51);                //Set registers for uart
140
        /***** End Start-up Sequence *****/
141

    
142
    uint8_t r;
143
    uint8_t s = 0;
144
    
145
    packet[0] = 0x00;
146
    packet[1] = 0x00;
147
    packet[2] = 0x00;
148
   
149
        while(1) {
150
        /*
151
        usb_puti(min);
152
        uart_send_byte('m');
153
        usb_puti(sec);
154
        uart_send_byte('s');
155
        uart_send_byte('\r');
156
        uart_send_byte('\n');
157
        _delay_ms(500);
158
        */
159
        
160
        switch (state) {
161
            case sd:
162
                toggle_led(LED_RED, OFF);
163
                toggle_led(LED_YELLOW, OFF);
164
                toggle_led(LED_GREEN, OFF);
165
                toggle_relay(OFF);
166
                while ((uart_get_byte(&r)) < 0);
167
                if (r == DELIM) {
168
                    state = src;
169
                }
170
                break;
171
            case src:
172
                while ((uart_get_byte(&r)) < 0);
173

    
174
                if (r == DELIM) {
175
                    state = src;
176
                } else {
177
                    packet[0] = r;
178
                    state = dest;
179
                }
180
                break;
181
            case dest:
182
                while ((uart_get_byte(&r)) < 0);
183

    
184
                if (r == DELIM) {
185
                    packet[0] = 0x00;
186
                    state = src;
187
                } else if (r == ADDR) {
188
                    packet[1] = r;
189
                    state = data;
190
                } else {
191
                    packet[0] = 0x00;
192
                    state = sd;
193
                }
194
                break;
195
            case data:
196
                while ((uart_get_byte(&r)) < 0);
197
                
198
                if (r == DELIM) {
199
                    packet[0] = 0x00;
200
                    packet[1] = 0x00;
201
                    state = src;
202
                } else {
203
                    packet[2] = r;
204
                    state = cs;
205
                }
206
                break;
207
            case cs:
208
                while ((uart_get_byte(&r)) < 0);
209

    
210
                if (r == (packet[0] ^ packet[1] ^ packet[2])) {
211

    
212
                    if (packet[2] == TURNON) {
213
                        state = ack;
214
                        break;
215
                    }
216
                }
217

    
218
                packet[0] = 0x00;
219
                packet[1] = 0x00;
220
                packet[2] = 0x00;
221
                state = sd;
222
                break;
223
            case ack:
224
                uart_send_byte(DELIM);
225
                uart_send_byte(ADDR);
226
                uart_send_byte(SERVER);
227
                uart_send_byte('A');
228
                uart_send_byte(ADDR ^ SERVER ^ 'A');
229

    
230
                toggle_led(LED_RED, OFF);
231
                toggle_led(LED_YELLOW, ON);
232

    
233
                state = pwron;
234
                reset_timer();
235
                break;
236
            case pwron:
237
                if (read_button(BUT_BLACK)) {
238
                    toggle_led(LED_YELLOW, OFF);
239
                    toggle_led(LED_GREEN, ON);
240
                    toggle_relay(ON);
241

    
242
                    reset_timer();
243
                    state = toolon;
244
                } else if ((read_button(BUT_RED)) || (min >= TWAIT)) {
245
                    state = off;
246
                }
247
                break;
248
            case toolon:
249
                
250
                if ((read_button(BUT_RED)) && (read_vac() == OFF)) {
251
                        state = off;
252
                        toggle_relay(OFF);
253
                } else if (min >= TWARN) {
254
                    toggle_led(LED_GREEN, OFF);
255
                    prev_state = 1;
256
                    prev_sec = sec;
257
                    prev_min = min;
258
                    state = warn;
259
                }
260
                break;
261

    
262
            case warn:
263
                if ((sec > prev_sec) || (min > prev_min)) {
264
                    if (prev_state == 1) {
265
                        toggle_led(LED_YELLOW, ON);
266
                        prev_state = 0;
267
                    } else {
268
                        toggle_led(LED_YELLOW, OFF);
269
                        prev_state = 1;
270
                    }
271

    
272
                    prev_sec = sec;
273
                    prev_min = min;
274
                }
275

    
276

    
277
                if (read_button(BUT_RED)) {
278
                    toggle_relay(OFF);
279
                    state = off;
280
                } else if (read_button(BUT_BLACK)) {
281
                    toggle_led(LED_GREEN, ON);
282
                    toggle_led(LED_YELLOW, OFF);
283
                    reset_timer();
284
                    state = toolon;
285
                } else if ((min >= TMAX) && (read_vac() == OFF)) {
286
                    toggle_relay(OFF);
287
                    state = off;
288
                }
289
                break;
290
            case off:
291
                toggle_led(LED_GREEN, OFF);
292
                toggle_led(LED_YELLOW, OFF);
293
                toggle_led(LED_RED, ON);
294
                _delay_ms(2000);
295
                toggle_led(LED_RED, OFF);
296
                state = sd;
297
                break;
298
            default: state = sd;
299
        }     
300
        
301
        }
302
        
303
        return 0;
304
}