RelayBoard.c 4.08 KB
Newer Older
1
2
3
4
5
6
7
8
9
/*
             LUFA Library
     Copyright (C) Dean Camera, 2010.

  dean [at] fourwalledcubicle [dot] com
      www.fourwalledcubicle.com
*/

/*
10
  Copyright 2010  OBinou (obconseil [at] gmail [dot] com)
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)

  Permission to use, copy, modify, distribute, and sell this
  software and its documentation for any purpose is hereby granted
  without fee, provided that the above copyright notice appear in
  all copies and that both that the copyright notice and this
  permission notice and warranty disclaimer appear in supporting
  documentation, and that the name of the author not be used in
  advertising or publicity pertaining to distribution of the
  software without specific, written prior permission.

  The author disclaim all warranties with regard to this
  software, including all implied warranties of merchantability
  and fitness.  In no event shall the author be liable for any
  special, indirect or consequential damages or any damages
  whatsoever resulting from loss of use, data or profits, whether
  in an action of contract, negligence or other tortious action,
  arising out of or in connection with the use or performance of
  this software.
*/

/** \file
 *
 *  Main source file for the RelayBoard program. This file contains the main tasks of
 *  the project and is responsible for the initial application hardware configuration.
 */

#include "RelayBoard.h"


/** Main program entry point. This routine contains the overall program flow, including initial
 *  setup of all components and the main program loop.
 */
int main(void)
{
	SetupHardware();

	for (;;)
	  USB_USBTask();
}

/** Configures the board hardware and chip peripherals for the project's functionality. */
void SetupHardware(void)
{
	/* Disable watchdog if enabled by bootloader/fuses */
	MCUSR &= ~(1 << WDRF);
	wdt_disable();

	/* Disable clock division */
	clock_prescale_set(clock_div_1);

	/* Hardware Initialization */
	USB_Init();

	/* Initialize Relays */
66
67
	DDRC  |=  ALL_RELAYS;
	PORTC &= ~ALL_RELAYS;
68
69
70
71
72
73
74
75
76
77
78
79
}


/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_Device_ConfigurationChanged(void)
{
	USB_Device_EnableSOFEvents();
}

/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_Device_UnhandledControlRequest(void)
{
80
81
    const uint8_t SerialNumber[5] = { 0, 0, 0, 0, 1 };
	uint8_t ControlData[2]        = { 0, 0 };
82
83
84
85
86
87
88
89
90
91

    switch (USB_ControlRequest.bRequest)
	{
		case 0x09:
			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
			{
				LEDs_ToggleLEDs(LEDS_LED1);

				Endpoint_ClearSETUP();

92
				Endpoint_Read_Control_Stream_LE(ControlData, sizeof(ControlData));
93
94
95
96
97
				Endpoint_ClearIN();

				switch (USB_ControlRequest.wValue)
				{
					case 0x303:
98
99
						if (ControlData[1]) PORTC &= ~RELAY1; else PORTC |= RELAY1;
						break;
100
					case 0x306:
101
102
						if (ControlData[1]) PORTC &= ~RELAY2; else PORTC |= RELAY2;
						break;
103
					case 0x309:
104
105
						if (ControlData[1]) PORTC &= ~RELAY3; else PORTC |= RELAY3;
						break;
106
					case 0x30c:
107
						if (ControlData[1]) PORTC &= ~RELAY4; else PORTC |= RELAY4;
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
						break;
				}
			}
			
			break;
		case 0x01:
			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
			{
				LEDs_ToggleLEDs(LEDS_LED1);

				Endpoint_ClearSETUP();

				switch (USB_ControlRequest.wValue)
				{
					case 0x301:
123
						Endpoint_Write_Control_Stream_LE(SerialNumber, sizeof(SerialNumber));
124
125
						break;
					case 0x303:
126
127
						ControlData[1] = (PORTC & RELAY1) ? 2 : 3;
						break;
128
					case 0x306:
129
130
						ControlData[1] = (PORTC & RELAY2) ? 2 : 3;
						break;
131
					case 0x309:
132
133
						ControlData[1] = (PORTC & RELAY3) ? 2 : 3;
						break;
134
					case 0x30c:
135
						ControlData[1] = (PORTC & RELAY4) ? 2 : 3;
136
137
138
						break;
				}
				
139
140
				if (ControlData[1])
				  Endpoint_Write_Control_Stream_LE(ControlData, sizeof(ControlData));
141
142
143
144
145
146
147

				Endpoint_ClearOUT();
			}

			break;
	}
}