MQTT subscriber example
[lpc1224] / apps / base / mqtt_sub / main.c
1 /****************************************************************************
2  *   apps/base/mqtt_sub/main.c
3  *
4  * MQTT client example using data from onboard TMP101 I2C temperature sensor
5  *
6  * Copyright 2013-2014 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 3 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 "core/system.h"
26 #include "core/systick.h"
27 #include "core/pio.h"
29 #include "lib/stdio.h"
30 #include "lib/errno.h"
31 #include "lib/utils.h"
32 #include "lib/protocols/mqtt.h"
34 #include "drivers/i2c.h"
35 #include "drivers/serial.h"
36 #include "drivers/gpio.h"
38 #include "extdrv/status_led.h"
39 #include "extdrv/tmp101_temp_sensor.h"
41 #include "mqtt_comm.h"
43 #define MODULE_VERSION    0x04
44 #define MODULE_NAME "GPIO Demo Module"
47 #define SELECTED_FREQ  FREQ_SEL_48MHz
49 /***************************************************************************** */
50 /* Pins configuration */
51 /* pins blocks are passed to set_pins() for pins configuration.
52  * Unused pin blocks can be removed safely with the corresponding set_pins() call
53  * All pins blocks may be safelly merged in a single block for single set_pins() call..
54  */
55 const struct pio_config common_pins[] = {
56         /* UART 0 */
57         { LPC_UART0_RX_PIO_0_1,  LPC_IO_DIGITAL },
58         { LPC_UART0_TX_PIO_0_2,  LPC_IO_DIGITAL },
59         /* UART 1 */
60         { LPC_UART1_RX_PIO_0_8,  LPC_IO_DIGITAL },
61         { LPC_UART1_TX_PIO_0_9,  LPC_IO_DIGITAL },
62         /* I2C 0 */
63         { LPC_I2C0_SCL_PIO_0_10, (LPC_IO_DIGITAL | LPC_IO_OPEN_DRAIN_ENABLE) },
64         { LPC_I2C0_SDA_PIO_0_11, (LPC_IO_DIGITAL | LPC_IO_OPEN_DRAIN_ENABLE) },
65         ARRAY_LAST_PIO,
66 };
68 const struct pio status_led_green = LPC_GPIO_1_4;
69 const struct pio status_led_red = LPC_GPIO_1_5;
72 uint8_t rx_packets[2][MQTT_BUFF_SIZE];
73 volatile uint8_t* rxbuf = rx_packets[0];
74 volatile uint8_t* packet_ok = NULL;
75 void data_rx(uint8_t c)
76 {
77         static uint8_t idx = 0;
78         static uint8_t sum = 0;
79         /* Not receiving a packet yet, wait for FIRST_PACKET_CHAR, drop */
80         if ((idx == 0) && (c != FIRST_PACKET_CHAR)) {
81                 return;
82         }
83         rxbuf[idx++] = c;
84         sum += c;
85         /* If header received, make sure checksum is OK */
86         if (idx == HEADER_SIZE) {
87                 uint8_t start = 1;
88                 if (sum == 0) {
89                         /* Header received and checksum OK */
90                         return;
91                 }
92                 /* Shift buffer content if buffer holds a FIRST_PACKET_CHAR */
93                 while ((rxbuf[start] != FIRST_PACKET_CHAR) && (start <= HEADER_SIZE)) {
94                         start++;
95                 }
96                 idx = 0; /* Restart at 0 (and if no FIRST_PACKET_CHAR found, this drops everything */
97                 sum = 0;
98                 /* FIRST_PACKET_CHAR found ? */
99                 while (start < HEADER_SIZE) {
100                         rxbuf[idx] = rxbuf[start++];
101                         sum += rxbuf[idx];
102                         idx++;
103                 }
104         } else if (idx > HEADER_SIZE) {
105                 struct app_header* header = (struct app_header*)rxbuf;
106                 /* Header received, check for data part */
107                 if (idx == (HEADER_SIZE + header->data_len)) {
108                         /* Full packet received, move to next packet */
109                         if (sum == header->data_cksum) {
110                                 packet_ok = rxbuf;
111                                 if (rxbuf == rx_packets[0]) {
112                                         rxbuf = rx_packets[1];
113                                 } else {
114                                         rxbuf = rx_packets[0];
115                                 }
116                         }
117                         idx = 0;
118                         sum = 0;
119                 }
120         }
123 /***************************************************************************** */
124 void system_init()
126         /* Stop the watchdog */
127         startup_watchdog_disable(); /* Do it right now, before it gets a chance to break in */
128         system_brown_out_detection_config(0); /* No ADC used */
129         system_set_default_power_state();
130         clock_config(SELECTED_FREQ);
131         set_pins(common_pins);
132         gpio_on();
133         status_led_config(&status_led_green, &status_led_red);
134         /* System tick timer MUST be configured and running in order to use the sleeping
135          * functions */
136         systick_timer_on(1); /* 1ms */
137         systick_start();
141 /***************************************************************************** */
142 #define DEBUG_UART UART0
143 int main(void)
145         system_init();
146         uart_on(UART0, 115200, data_rx);
147         uart_on(UART1, 115200, NULL);
149         /* Connect to brocker and start MQTT protocol handling */
150         mqtt_init(UART0, DEBUG_UART);
152         while (1) {
153                 /* Check for received packet on serial line and handle them */
154                 if (packet_ok != NULL) {
155                         int ret = mqtt_handle_packet((char*)packet_ok, UART0, DEBUG_UART);
156                         if (ret != 0) {
157                                 uprintf(DEBUG_UART, "Packet handling returned error %d\n", ret);
158                         } else {
159                                 uprintf(DEBUG_UART, "Packet handled\n");
160                         }
161                         packet_ok = NULL;
162                 }
163                 chenillard(250);
164         }
165         return 0;