/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 18:27:56 UTC
  • Revision ID: tim@ed.am-20121122182756-htn5j0b912tyx4w2
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
             LUFA Library
 
3
     Copyright (C) Dean Camera, 2012.
 
4
 
 
5
  dean [at] fourwalledcubicle [dot] com
 
6
           www.lufa-lib.org
 
7
*/
 
8
 
 
9
/*
 
10
  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
11
 
 
12
  Permission to use, copy, modify, distribute, and sell this
 
13
  software and its documentation for any purpose is hereby granted
 
14
  without fee, provided that the above copyright notice appear in
 
15
  all copies and that both that the copyright notice and this
 
16
  permission notice and warranty disclaimer appear in supporting
 
17
  documentation, and that the name of the author not be used in
 
18
  advertising or publicity pertaining to distribution of the
 
19
  software without specific, written prior permission.
 
20
 
 
21
  The author disclaim all warranties with regard to this
 
22
  software, including all implied warranties of merchantability
 
23
  and fitness.  In no event shall the author be liable for any
 
24
  special, indirect or consequential damages or any damages
 
25
  whatsoever resulting from loss of use, data or profits, whether
 
26
  in an action of contract, negligence or other tortious action,
 
27
  arising out of or in connection with the use or performance of
 
28
  this software.
 
29
*/
 
30
 
 
31
/** \file
 
32
 *
 
33
 *  Main source file for the VirtualSerial demo. This file contains the main tasks of
 
34
 *  the demo and is responsible for the initial application hardware configuration.
 
35
 */
 
36
 
 
37
#include "VirtualSerial.h"
 
38
 
 
39
/** LUFA CDC Class driver interface configuration and state information. This structure is
 
40
 *  passed to all CDC Class driver functions, so that multiple instances of the same class
 
41
 *  within a device can be differentiated from one another.
 
42
 */
 
43
USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
 
44
        {
 
45
                .Config =
 
46
                        {
 
47
                                .ControlInterfaceNumber   = 0,
 
48
                                .DataINEndpoint           =
 
49
                                        {
 
50
                                                .Address          = CDC_TX_EPADDR,
 
51
                                                .Size             = CDC_TXRX_EPSIZE,
 
52
                                                .Banks            = 1,
 
53
                                        },
 
54
                                .DataOUTEndpoint =
 
55
                                        {
 
56
                                                .Address          = CDC_RX_EPADDR,
 
57
                                                .Size             = CDC_TXRX_EPSIZE,
 
58
                                                .Banks            = 1,
 
59
                                        },
 
60
                                .NotificationEndpoint =
 
61
                                        {
 
62
                                                .Address          = CDC_NOTIFICATION_EPADDR,
 
63
                                                .Size             = CDC_NOTIFICATION_EPSIZE,
 
64
                                                .Banks            = 1,
 
65
                                        },
 
66
                        },
 
67
        };
 
68
 
 
69
/** Standard file stream for the CDC interface when set up, so that the virtual CDC COM port can be
 
70
 *  used like any regular character stream in the C APIs
 
71
 */
 
72
static FILE USBSerialStream;
 
73
 
 
74
 
 
75
#define BUTTON 0b10000000
 
76
#define LEDB 0b00100000
 
77
 
 
78
void init()
 
79
{
 
80
        // set PD7 (button) to input
 
81
        DDRD &= ~BUTTON;
 
82
 
 
83
        // enable pull-up on PD7 (button)
 
84
        PORTD |= BUTTON;
 
85
 
 
86
        // set PD5 (ledb) to output
 
87
        DDRD |= LEDB;
 
88
}
 
89
 
 
90
void loop()
 
91
{
 
92
        static bool sent = false;
 
93
 
 
94
        // if PD7 is low, we have a press!
 
95
        if( PIND & BUTTON )
 
96
        {
 
97
                if( !sent )
 
98
                {
 
99
                        sent = true;
 
100
                        fputs( "press\r\n", &USBSerialStream );
 
101
                }
 
102
 
 
103
                // set led
 
104
                PORTD |= LEDB;
 
105
        }
 
106
        else
 
107
        {
 
108
                sent = false;
 
109
 
 
110
                // set led
 
111
                PORTD &= ~LEDB;
 
112
        }
 
113
}
 
114
 
 
115
 
 
116
/** Main program entry point. This routine contains the overall program flow, including initial
 
117
 *  setup of all components and the main program loop.
 
118
 */
 
119
int main(void)
 
120
{
 
121
        SetupHardware();
 
122
 
 
123
        /* Create a regular character stream for the interface so that it can be used with the stdio.h functions */
 
124
        CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream);
 
125
 
 
126
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
 
127
        sei();
 
128
 
 
129
        for (;;)
 
130
        {
 
131
                loop();
 
132
 
 
133
                /* Must throw away unused bytes from the host, or it will lock up while waiting for the device */
 
134
                CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
 
135
 
 
136
                CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
 
137
                USB_USBTask();
 
138
        }
 
139
}
 
140
 
 
141
/** Configures the board hardware and chip peripherals for the demo's functionality. */
 
142
void SetupHardware(void)
 
143
{
 
144
        /* Disable watchdog if enabled by bootloader/fuses */
 
145
        MCUSR &= ~(1 << WDRF);
 
146
        wdt_disable();
 
147
 
 
148
        /* Disable clock division */
 
149
        clock_prescale_set(clock_div_1);
 
150
 
 
151
        /* Hardware Initialization */
 
152
        LEDs_Init();
 
153
        USB_Init();
 
154
 
 
155
        init(); 
 
156
}
 
157
 
 
158
/** Checks for changes in the position of the board joystick, sending strings to the host upon each change. */
 
159
#if 0
 
160
void CheckJoystickMovement(void)
 
161
{
 
162
        uint8_t     JoyStatus_LCL = Joystick_GetStatus();
 
163
        char*       ReportString  = NULL;
 
164
        static bool ActionSent    = false;
 
165
 
 
166
        if (JoyStatus_LCL & JOY_UP)
 
167
          ReportString = "Joystick Up\r\n";
 
168
        else if (JoyStatus_LCL & JOY_DOWN)
 
169
          ReportString = "Joystick Down\r\n";
 
170
        else if (JoyStatus_LCL & JOY_LEFT)
 
171
          ReportString = "Joystick Left\r\n";
 
172
        else if (JoyStatus_LCL & JOY_RIGHT)
 
173
          ReportString = "Joystick Right\r\n";
 
174
        else if (JoyStatus_LCL & JOY_PRESS)
 
175
          ReportString = "Joystick Pressed\r\n";
 
176
        else
 
177
          ActionSent = false;
 
178
 
 
179
        if ((ReportString != NULL) && (ActionSent == false))
 
180
        {
 
181
                ActionSent = true;
 
182
 
 
183
                /* Write the string to the virtual COM port via the created character stream */
 
184
                fputs(ReportString, &USBSerialStream);
 
185
 
 
186
                /* Alternatively, without the stream: */
 
187
                // CDC_Device_SendString(&VirtualSerial_CDC_Interface, ReportString);
 
188
        }
 
189
}
 
190
#endif
 
191
 
 
192
/** Event handler for the library USB Connection event. */
 
193
void EVENT_USB_Device_Connect(void)
 
194
{
 
195
        LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
 
196
}
 
197
 
 
198
/** Event handler for the library USB Disconnection event. */
 
199
void EVENT_USB_Device_Disconnect(void)
 
200
{
 
201
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
 
202
}
 
203
 
 
204
/** Event handler for the library USB Configuration Changed event. */
 
205
void EVENT_USB_Device_ConfigurationChanged(void)
 
206
{
 
207
        bool ConfigSuccess = true;
 
208
 
 
209
        ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
 
210
 
 
211
        LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
 
212
}
 
213
 
 
214
/** Event handler for the library USB Control Request reception event. */
 
215
void EVENT_USB_Device_ControlRequest(void)
 
216
{
 
217
        CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
 
218
}
 
219