Project

General

Profile

Statistics
| Revision:

root / trunk / toolbox / main.c @ 154

History | View | Annotate | Download (8.25 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
/***** change ADDR ****/
43
#define ADDR 18
44
#define DELIM '^'
45
#define SERVER 1
46
#define TURNON 'O'
47

    
48
/***
49
 * TWAIT - minutes to wait before green button is pressed to kill power
50
 * TWARN - minutes until warning (blink yellow, allow more time with green button)
51
 * TMAX  - minutes until power is killed (unless tool is on)
52
 */
53
#define TWAIT   1
54
#define TWARN   1
55
#define TMAX    2
56

    
57
uint8_t sec;
58
uint8_t min;
59

    
60
typedef enum {
61
    sd,     // start delimitor
62
    src,    // src
63
    dest,   // destination
64
    data,   // data
65
    cs,     // checksum
66
    ack,    // send ack
67
    pwron,  // poweron
68
    idiot,  // user tried to hit green with the machine switch on
69
    toolon, // tool on
70
    warn,   // time warning
71
    off     // tool off
72
} state_t;
73

    
74
void init_pins(void) {
75
    DDRB = 0x00;
76
    DDRB = _BV(DDB0) | _BV(DDB1) | _BV(DDB2) | _BV(DDB5);
77
    DDRD = _BV(DDB4);
78
    PORTB = 0x00;
79
}
80

    
81
void toggle_led(uint8_t which, uint8_t state) {
82
    if (state == ON) {
83
        PORTB &= ~which;
84
    } else {
85
        PORTB |= which;
86
    }
87
}
88

    
89
void toggle_relay(uint8_t state) {
90
    if (state == ON) {
91
        PORTD |= RELAY;
92
    } else {
93
        PORTD &= ~RELAY;
94
    }
95
}
96

    
97
inline uint8_t read_vac(void) {
98
    return (!(PIND & VAC_SENSE));
99
}
100

    
101
inline uint8_t read_button(uint8_t which) {
102
    return (!(PINB & which));
103
}
104

    
105
void init_timer(void) {
106
    // Clear timmer on OCRA1 Compare match
107
    // No prescale
108
    TCCR1B |= _BV(WGM12) | _BV(CS12);
109
    
110
    // 1 second @ 8MHz clock
111
    OCR1AH =0x7A;
112
    OCR1AL =0x12;
113

    
114
    TIMSK = _BV(OCIE1A);
115

    
116
    sec = 0;
117
    min = 0;
118
}
119

    
120
void reset_timer(void) {
121
    sec = 0;
122
    min = 0;
123
}
124

    
125
ISR(TIMER1_COMPA_vect) {
126
    if (sec == 59) {
127
        sec = 0;
128
        min++;
129
    } else {
130
        sec++;
131
    }
132
}
133

    
134

    
135
int main(int argc, char **argv) {
136
    state_t state = sd;
137
    uint8_t packet[3];
138
    uint8_t ms_timer=0;
139

    
140
        /***** Start Start-up Sequence *****/
141
        sei();                                //Enable interrupts
142
        init_timer();                //Set registers for timer
143
        init_pins();                //Set pin directions
144
        init_uart(51);                //Set registers for uart
145
        /***** End Start-up Sequence *****/
146
    while(1) {
147
      PORTB |= _BV(PORTB1);
148
      _delay_ms(100);
149
      PORTB &= ~_BV(PORTB1);
150
      _delay_ms(100);
151
    }
152

    
153
    uint8_t r;
154
    
155
    packet[0] = 0x00;
156
    packet[1] = 0x00;
157
    packet[2] = 0x00;
158
   
159
        while(1) {
160
        /*
161
        usb_puti(min);
162
        uart_send_byte('m');
163
        usb_puti(sec);
164
        uart_send_byte('s');
165
        uart_send_byte('\r');
166
        uart_send_byte('\n');
167
        _delay_ms(500);
168
        */
169
        
170
        switch (state) {
171
            case sd:
172
                toggle_led(LED_RED, ON);
173
                toggle_led(LED_YELLOW, OFF);
174
                toggle_led(LED_GREEN, OFF);
175
                toggle_relay(OFF);
176
                while ((uart_get_byte(&r)) < 0);
177
                if (r == DELIM) {
178
                    state = src;
179
                }
180
                break;
181
            case src:
182
                while ((uart_get_byte(&r)) < 0);
183

    
184
                if (r == DELIM) {
185
                    state = src;
186
                } else {
187
                    packet[0] = r;
188
                    state = dest;
189
                }
190
                break;
191
            case dest:
192
                while ((uart_get_byte(&r)) < 0);
193

    
194
                if (r == DELIM) {
195
                    packet[0] = 0x00;
196
                    state = src;
197
                } else if (r == ADDR) {
198
                    packet[1] = r;
199
                    state = data;
200
                } else {
201
                    packet[0] = 0x00;
202
                    state = sd;
203
                }
204
                break;
205
            case data:
206
                while ((uart_get_byte(&r)) < 0);
207
                
208
                if (r == DELIM) {
209
                    packet[0] = 0x00;
210
                    packet[1] = 0x00;
211
                    state = src;
212
                } else {
213
                    packet[2] = r;
214
                    state = cs;
215
                }
216
                break;
217
            case cs:
218
                while ((uart_get_byte(&r)) < 0);
219

    
220
                if (r == (packet[0] ^ packet[1] ^ packet[2])) {
221

    
222
                    if (packet[2] == TURNON) {
223
                        state = ack;
224
                        break;
225
                    }
226
                }
227

    
228
                packet[0] = 0x00;
229
                packet[1] = 0x00;
230
                packet[2] = 0x00;
231
                state = sd;
232
                break;
233
            case ack:
234
                uart_send_byte(DELIM);
235
                uart_send_byte(ADDR);
236
                uart_send_byte(SERVER);
237
                uart_send_byte('A');
238
                uart_send_byte(ADDR ^ SERVER ^ 'A');
239

    
240
                toggle_led(LED_RED, OFF);
241
                toggle_led(LED_YELLOW, ON);
242

    
243
                state = pwron;
244
                reset_timer();
245
                break;
246
            case pwron:
247
              if (read_vac() == ON) {
248
                ms_timer = 0;
249
                state = idiot;
250
                break;
251
              }
252

    
253
                if (read_button(BUT_BLACK)) {
254
                    toggle_led(LED_YELLOW, OFF);
255
                    toggle_led(LED_GREEN, ON);
256
                    toggle_relay(ON);
257

    
258
                    reset_timer();
259
                    state = toolon;
260
                } else if ((read_button(BUT_RED)) || (min >= TWAIT)) {
261
                    state = off;
262
                }
263
                break;
264
            case idiot:
265
              if (read_vac() == OFF) {
266
                state = pwron;
267
                toggle_led(LED_RED, OFF);
268
                toggle_led(LED_YELLOW, ON);
269
                break;
270
              }
271

    
272
              if (read_button(BUT_RED)) {
273
                state = off;
274
                break;
275
              }
276

    
277
              if(ms_timer >= 100) {
278
                toggle_led(LED_YELLOW, ON);
279
                toggle_led(LED_RED, OFF);
280
                
281
                if(ms_timer >= 200) {
282
                  ms_timer = 0;
283
                }
284
              }
285
              else {
286
                toggle_led(LED_YELLOW, OFF);
287
                toggle_led(LED_RED, ON);
288
              }
289

    
290
              _delay_ms(2);
291
              ms_timer++;
292
              break;
293

    
294
            case toolon:
295
                
296
                if ((read_button(BUT_RED)) && (read_vac() == OFF)) {
297
                        state = off;
298
                        toggle_relay(OFF);
299
                } else if (min >= TWARN) {
300
                    toggle_led(LED_GREEN, OFF);
301
                    state = warn;
302
                }
303
                break;
304

    
305
            case warn:
306
                if(ms_timer >= 100) {
307
                  toggle_led(LED_YELLOW, ON);
308
                
309
                  if(ms_timer >= 200) {
310
                    ms_timer = 0;
311
                  }
312
                }
313
                else {
314
                  toggle_led(LED_YELLOW, OFF);
315
                }
316

    
317
                if (read_button(BUT_RED) && read_vac() == OFF) {
318
                    toggle_relay(OFF);
319
                    state = off;
320
                } else if (read_button(BUT_BLACK)) {
321
                    toggle_led(LED_GREEN, ON);
322
                    toggle_led(LED_YELLOW, OFF);
323
                    reset_timer();
324
                    state = toolon;
325
                } else if ((min >= TMAX) && (read_vac() == OFF)) {
326
                    toggle_relay(OFF);
327
                    state = off;
328
                }
329

    
330
                _delay_ms(2);
331
                ms_timer++;
332

    
333
                break;
334
            case off:
335
                toggle_led(LED_GREEN, OFF);
336
                toggle_led(LED_YELLOW, OFF);
337
                toggle_led(LED_RED, ON);
338
                state = sd;
339
                break;
340
            default: state = sd;
341
        }     
342
        
343
        }
344
        
345
        return 0;
346
}