/elec/audio-switcher

To get this branch, use:
bzr branch http://bzr.ed.am/elec/audio-switcher

« back to all changes in this revision

Viewing changes to src/VirtualSerial.c

  • Committer: Tim Marston
  • Date: 2012-11-22 22:01:52 UTC
  • Revision ID: tim@ed.am-20121122220152-paremcsc2gbccrjw
added timer utilities (wiring.c) from arduino library

Show diffs side-by-side

added added

removed removed

38
38
 
39
39
/** \file
40
40
 *
41
 
 *  Main source file for the VirtualSerial demo. This file contains the main
42
 
 *  tasks of the demo and is responsible for the initial application hardware
43
 
 *  configuration.
 
41
 *  Main source file for the VirtualSerial demo. This file contains the main tasks of
 
42
 *  the demo and is responsible for the initial application hardware configuration.
44
43
 */
45
44
 
46
45
#include "VirtualSerial.h"
47
46
#include "wiring.h"
48
47
 
49
 
/** LUFA CDC Class driver interface configuration and state information. This
50
 
 *  structure is passed to all CDC Class driver functions, so that multiple
51
 
 *  instances of the same class within a device can be differentiated from one
52
 
 *  another.
 
48
/** LUFA CDC Class driver interface configuration and state information. This structure is
 
49
 *  passed to all CDC Class driver functions, so that multiple instances of the same class
 
50
 *  within a device can be differentiated from one another.
53
51
 */
54
52
USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
55
53
        {
77
75
                        },
78
76
        };
79
77
 
80
 
/** Standard file stream for the CDC interface when set up, so that the virtual
81
 
 *  CDC COM port can be used like any regular character stream in the C APIs
 
78
/** Standard file stream for the CDC interface when set up, so that the virtual CDC COM port can be
 
79
 *  used like any regular character stream in the C APIs
82
80
 */
83
81
static FILE USBSerialStream;
84
82
 
85
83
 
86
84
#define BUTTON 0b10000000
87
85
#define LEDB 0b00100000
88
 
#define RELAY 0b00000010
89
86
 
90
87
void init()
91
88
{
92
 
        // set PD7 (button) to input and enable pull-up
 
89
        // set PD7 (button) to input
93
90
        DDRD &= ~BUTTON;
 
91
 
 
92
        // enable pull-up on PD7 (button)
94
93
        PORTD |= BUTTON;
95
94
 
96
95
        // set PD5 (ledb) to output
97
96
        DDRD |= LEDB;
98
 
 
99
 
        // set PB1 (relay) to output
100
 
        DDRB |= RELAY;
101
97
}
102
98
 
103
99
void loop()
104
100
{
105
 
        // debounce button (PD7)
106
 
        static int button_state = 0;
107
 
        static int saved_button_state = 0;
108
 
        static int saved_since = 0;
109
 
        unsigned long now = millis();
110
 
        unsigned long real_button_state = PIND & BUTTON;
111
 
        if( saved_button_state != real_button_state ) {
112
 
                saved_button_state = real_button_state;
113
 
                saved_since = now;
114
 
        }
115
 
        else if( saved_button_state != button_state &&
116
 
                         now - saved_since > 25 )
117
 
        {
118
 
                button_state = saved_button_state;
119
 
        }
120
 
 
121
 
        // on rising edge of press, set toggle
122
 
        static int last_button_state = 0;
123
 
        bool toggle = false;
124
 
        if( last_button_state != button_state )
125
 
        {
126
 
                last_button_state = button_state;
127
 
                if( !button_state ) toggle = true;
128
 
        }
129
 
 
130
 
 
131
 
        // toggle the relay
132
 
        static bool relay_state = false;
133
 
        if( toggle )
134
 
        {
135
 
                relay_state = !relay_state;
136
 
 
137
 
                // switch relay
138
 
                if( relay_state )
139
 
                        PORTB |= RELAY;
140
 
                else
141
 
                        PORTB &= ~RELAY;
142
 
 
143
 
                // switch LED
144
 
                if( relay_state )
145
 
                        PORTD &= ~LEDB;
146
 
                else
147
 
                        PORTD |= LEDB;
 
101
        static bool sent = false;
 
102
 
 
103
        // if PD7 is low, we have a press!
 
104
        if( PIND & BUTTON )
 
105
        {
 
106
                if( !sent )
 
107
                {
 
108
                        sent = true;
 
109
                        fprintf( &USBSerialStream, "%lu\r\n", millis() );
 
110
//                      fputs( "press\r\n", &USBSerialStream );
 
111
                }
 
112
 
 
113
                // set led
 
114
                PORTD |= LEDB;
 
115
        }
 
116
        else
 
117
        {
 
118
                sent = false;
 
119
 
 
120
                // set led
 
121
                PORTD &= ~LEDB;
148
122
        }
149
123
}
150
124
 
151
125
 
152
 
/** Main program entry point. This routine contains the overall program flow,
153
 
 *  including initial setup of all components and the main program loop.
 
126
/** Main program entry point. This routine contains the overall program flow, including initial
 
127
 *  setup of all components and the main program loop.
154
128
 */
155
129
int main(void)
156
130
{
157
131
        SetupHardware();
158
132
 
159
 
        /* Create a regular character stream for the interface so that it can be
160
 
         * used with the stdio.h functions */
 
133
        /* Create a regular character stream for the interface so that it can be used with the stdio.h functions */
161
134
        CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream);
162
135
 
163
136
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
167
140
        {
168
141
                loop();
169
142
 
170
 
                /* Must throw away unused bytes from the host, or it will lock up while
171
 
                 * waiting for the device */
 
143
                /* Must throw away unused bytes from the host, or it will lock up while waiting for the device */
172
144
                CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
173
145
 
174
146
                CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
176
148
        }
177
149
}
178
150
 
179
 
/** Configures the board hardware and chip peripherals for the demo's
180
 
 * functionality. */
 
151
/** Configures the board hardware and chip peripherals for the demo's functionality. */
181
152
void SetupHardware(void)
182
153
{
183
154
        /* Disable watchdog if enabled by bootloader/fuses */