Changes to ADC API
[lpc82x] / apps / base / ledstrip / main.c
1 /****************************************************************************
2  *   apps/ledstrip/main.c
3  *
4  * WS2812 Chainable leds example using Adafruit les strip
5  *
6  * Copyright 2013-2015 Nathael Pajani <nathael.pajani@ed3l.fr>
7  *
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  *************************************************************************** */
25 #include "lib/stdint.h"
26 #include "core/system.h"
27 #include "core/systick.h"
28 #include "core/pio.h"
29 #include "lib/stdio.h"
30 #include "drivers/serial.h"
31 #include "drivers/gpio.h"
32 #include "drivers/adc.h"
34 #include "extdrv/ws2812.h"
36 #define MODULE_VERSION    0x01
37 #define MODULE_NAME "E-Xanh Gardener"
40 #define SELECTED_FREQ  FREQ_SEL_36MHz
42 #define APP_NB_LEDS    1
44 /***************************************************************************** */
45 /* Pins configuration */
46 /* pins blocks are passed to set_pins() for pins configuration.
47  * Unused pin blocks can be removed safely with the corresponding set_pins() call
48  * All pins blocks may be safelly merged in a single block for single set_pins() call..
49  */
50 const struct pio_config common_pins[] = {
51         /* UART 0 */
52         { LPC_GPIO_0_0, LPC_UART0_RX, 0 },
53         { LPC_GPIO_0_4, LPC_UART0_TX, 0 },
54         /* ADC */
55         { LPC_ADC_AD2_PIO_0_14, LPC_FIXED, 0 },
56         { LPC_ADC_AD9_PIO_0_17, LPC_FIXED, 0 },
57         { LPC_ADC_AD10_PIO_0_13, LPC_FIXED, 0 },
58         /* GPIO */
59         { LPC_GPIO_0_2, LPC_GPIO, 0 },
60         { LPC_GPIO_0_12, LPC_GPIO, 0 },
61         ARRAY_LAST_PIO,
62 };
65 const struct pio ws2812_data_out_pin = LPC_GPIO_0_2; /* Led control data pin */
68 /***************************************************************************** */
69 void system_init()
70 {
71         system_set_default_power_state();
72         clock_config(SELECTED_FREQ);
73         set_pins(common_pins);
74         gpio_on();
75         /* System tick timer MUST be configured and running in order to use the sleeping
76          * functions */
77         systick_timer_on(1); /* 1ms */
78         systick_start();
79 }
81 /* Define our fault handler. This one is not mandatory, the dummy fault handler
82  * will be used when it's not overridden here.
83  * Note : The default one does a simple infinite loop. If the watchdog is deactivated
84  * the system will hang.
85  */
86 void fault_info(const char* name, uint32_t len)
87 {
88         uprintf(UART0, name);
89         while (1);
90 }
94 /* This mode reads values from ADC2, ADC9 and ADC10 every 150ms and uses the values to set the leds.
95  * Pixels are updated when all pixel are set from ADC input.
96  */
97 void mode_adc_colors(void)
98 {
99         static uint8_t pixel = 0;
100         uint16_t red = 0, green = 0, blue = 0;
102         /* Get ADC values */
103         adc_get_value(&red, LPC_ADC(2));
104         adc_get_value(&green, LPC_ADC(9));
105         adc_get_value(&blue, LPC_ADC(10));
106         /* Set one pixel */
107         ws2812_set_pixel(pixel++, ((red >> 4) & 0xFF), ((green >> 4) & 0xFF), ((blue >> 4) & 0xFF));
108         msleep(5);
109         /* Buffer full, send it ! */
110         if ((pixel >= APP_NB_LEDS) || (pixel >= NB_LEDS)) {
111                 ws2812_send_frame(0);
112                 pixel = 0;
113         }
114         uprintf(UART0, "Color: %03d, %03d, %03d\n",
115                                 ((red >> 4) & 0xFF), ((green >> 4) & 0xFF), ((blue >> 4) & 0xFF));
120 /***************************************************************************** */
121 int main(void)
123         system_init();
124         uart_on(UART0, 115200, NULL);
126         /* ADC for potentiometer color settings */
127         adc_on(NULL);
128         adc_start_burst_conversion(ADC_MCH(2) | ADC_MCH(9) | ADC_MCH(10), LPC_ADC_SEQB);
130         /* Led strip configuration */
131         ws2812_config(&ws2812_data_out_pin);
133         uprintf(UART0, "Config OK\n");
135         while (1) {
136                 mode_adc_colors();
137         }
138         return 0;