Weather control switch for connected day. NXP LPC 1768 module. Ethernet connectivity.

Dependencies:   EthernetInterface mbed-rtos mbed nanoservice_client_1_12

Fork of Trenton_Switch_LPC1768_WIFLY by Demo Team

Committer:
andcor02
Date:
Wed Dec 03 09:03:29 2014 +0000
Revision:
25:cb16c5248769
Parent:
22:b361f7ae0508
Child:
26:3467812d5832
ETH CES

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 6:6eaae34586b8 1 /* mbed Microcontroller Library
Kojto 6:6eaae34586b8 2 * Copyright (c) 2006-2013 ARM Limited
Kojto 6:6eaae34586b8 3 *
Kojto 6:6eaae34586b8 4 * Licensed under the Apache License, Version 2.0 (the "License");
Kojto 6:6eaae34586b8 5 * you may not use this file except in compliance with the License.
Kojto 6:6eaae34586b8 6 * You may obtain a copy of the License at
Kojto 6:6eaae34586b8 7 *
Kojto 6:6eaae34586b8 8 * http://www.apache.org/licenses/LICENSE-2.0
Kojto 6:6eaae34586b8 9 *
Kojto 6:6eaae34586b8 10 * Unless required by applicable law or agreed to in writing, software
Kojto 6:6eaae34586b8 11 * distributed under the License is distributed on an "AS IS" BASIS,
Kojto 6:6eaae34586b8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Kojto 6:6eaae34586b8 13 * See the License for the specific language governing permissions and
Kojto 6:6eaae34586b8 14 * limitations under the License.
Kojto 6:6eaae34586b8 15 */
Kojto 6:6eaae34586b8 16 #include "mbed.h"
erigow01 22:b361f7ae0508 17 #include "EthernetInterface.h"
Kojto 6:6eaae34586b8 18 #include "main.h"
erigow01 16:3fb612af0dc5 19 #include "nsdl_support.h"
andcor02 25:cb16c5248769 20 #include "sensor_ctl.h"
erigow01 18:eb1a194d60d9 21 #include "switch.h"
Kojto 8:be68e827aa53 22
andcor02 25:cb16c5248769 23
erigow01 16:3fb612af0dc5 24 //Serial pc(USBTX, USBRX);
Kojto 6:6eaae34586b8 25
erigow01 22:b361f7ae0508 26 // ****************************************************************************
erigow01 22:b361f7ae0508 27 // Configuration section
erigow01 22:b361f7ae0508 28
erigow01 22:b361f7ae0508 29 // Ethernet configuration
erigow01 22:b361f7ae0508 30 /* Define this to enable DHCP, otherwise manual address configuration is used */
erigow01 22:b361f7ae0508 31 #define DHCP
erigow01 22:b361f7ae0508 32
erigow01 22:b361f7ae0508 33 /* Manual IP configurations, if DHCP not defined */
erigow01 22:b361f7ae0508 34 #define IP "10.45.0.206"
erigow01 22:b361f7ae0508 35 #define MASK "255.255.255.0"
erigow01 22:b361f7ae0508 36 #define GW "10.45.0.1"
erigow01 22:b361f7ae0508 37
erigow01 22:b361f7ae0508 38 // ****************************************************************************
erigow01 22:b361f7ae0508 39 // Ethernet initialization
erigow01 22:b361f7ae0508 40
erigow01 22:b361f7ae0508 41 EthernetInterface eth;
erigow01 22:b361f7ae0508 42
erigow01 22:b361f7ae0508 43 static void ethernet_init()
erigow01 22:b361f7ae0508 44 {
erigow01 22:b361f7ae0508 45 char mbed_uid[33]; // for creating unique name for the board
erigow01 22:b361f7ae0508 46
erigow01 22:b361f7ae0508 47 /* Initialize network */
erigow01 22:b361f7ae0508 48 #ifdef DHCP
erigow01 22:b361f7ae0508 49 printf("DHCP in use\r\n");
erigow01 22:b361f7ae0508 50 eth.init();
erigow01 22:b361f7ae0508 51 #else
erigow01 22:b361f7ae0508 52 eth.init(IP, MASK, GW);
erigow01 22:b361f7ae0508 53 #endif
erigow01 22:b361f7ae0508 54 if(eth.connect(30000) == 0)
erigow01 22:b361f7ae0508 55 printf("Connect OK\n\r");
erigow01 22:b361f7ae0508 56 /*
erigow01 22:b361f7ae0508 57 mbed_interface_uid(mbed_uid);
erigow01 22:b361f7ae0508 58 mbed_uid[32] = '\0';
erigow01 22:b361f7ae0508 59 strncat(endpoint_name, mbed_uid + 27, 15 - strlen(endpoint_name));
erigow01 22:b361f7ae0508 60
erigow01 22:b361f7ae0508 61 lcd.locate(0,11);
erigow01 22:b361f7ae0508 62 lcd.printf("IP:%s", eth.getIPAddress());
erigow01 16:3fb612af0dc5 63 */
erigow01 22:b361f7ae0508 64 printf("IP Address:%s ", eth.getIPAddress());
erigow01 22:b361f7ae0508 65 }
Kojto 6:6eaae34586b8 66
erigow01 15:59f4cee0da79 67 // NSP configuration
erigow01 15:59f4cee0da79 68 /* Change this IP address to that of your NanoService Platform installation */
erigow01 15:59f4cee0da79 69 Endpoint nsp;
erigow01 15:59f4cee0da79 70 UDPSocket server;
erigow01 22:b361f7ae0508 71
erigow01 16:3fb612af0dc5 72 //extern TCPSocketConnection server;
erigow01 18:eb1a194d60d9 73 char endpoint_name[] = {"switch"};
erigow01 18:eb1a194d60d9 74 uint8_t ep_type[] = {"mbed_LPC1768"};
erigow01 15:59f4cee0da79 75 uint8_t lifetime_ptr[] = {"86400"};
erigow01 15:59f4cee0da79 76
erigow01 16:3fb612af0dc5 77 static const char* NSP_ADDRESS = "192.168.1.10"; /* Trenton BBB NSP */
erigow01 16:3fb612af0dc5 78 static const int NSP_PORT = 5683;
Kojto 6:6eaae34586b8 79
erigow01 18:eb1a194d60d9 80 //Hard Fault Handler (Watchdog)
erigow01 18:eb1a194d60d9 81 extern "C" void HardFault_Handler() {
erigow01 18:eb1a194d60d9 82 printf("Hard Fault!\r\n");
erigow01 18:eb1a194d60d9 83 NVIC_SystemReset();
erigow01 18:eb1a194d60d9 84 }
Kojto 6:6eaae34586b8 85
erigow01 15:59f4cee0da79 86 // ****************************************************************************
erigow01 15:59f4cee0da79 87 // NSP initialization
erigow01 15:59f4cee0da79 88
erigow01 15:59f4cee0da79 89 static void nsp_connect()
erigow01 15:59f4cee0da79 90 {
erigow01 18:eb1a194d60d9 91 printf("EP Name: %s\r\n", endpoint_name);
erigow01 18:eb1a194d60d9 92 printf("NSP Location: coap://%s:%d\r\n", NSP_ADDRESS, NSP_PORT);
erigow01 15:59f4cee0da79 93
erigow01 15:59f4cee0da79 94 // Bind the port
erigow01 15:59f4cee0da79 95 //cellular->bind(EP_PORT);
erigow01 15:59f4cee0da79 96 server.init();
erigow01 16:3fb612af0dc5 97 //server.connect(NSP_ADDRESS, NSP_PORT);
erigow01 15:59f4cee0da79 98 server.bind(NSP_PORT);
erigow01 15:59f4cee0da79 99 nsp.set_address(NSP_ADDRESS, NSP_PORT);
erigow01 15:59f4cee0da79 100
erigow01 15:59f4cee0da79 101 printf("UDP connection to NSP successful.\r\n");
erigow01 15:59f4cee0da79 102 }
erigow01 15:59f4cee0da79 103
erigow01 15:59f4cee0da79 104 static int create_resources()
erigow01 15:59f4cee0da79 105 {
erigow01 15:59f4cee0da79 106 sn_nsdl_resource_info_s *resource_ptr = NULL;
erigow01 15:59f4cee0da79 107 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
erigow01 15:59f4cee0da79 108
erigow01 15:59f4cee0da79 109 printf("Creating resources\r\n");
erigow01 15:59f4cee0da79 110
erigow01 15:59f4cee0da79 111 /* Create resources */
erigow01 15:59f4cee0da79 112 resource_ptr = (sn_nsdl_resource_info_s*)nsdl_alloc(sizeof(sn_nsdl_resource_info_s));
erigow01 15:59f4cee0da79 113 if(!resource_ptr)
erigow01 15:59f4cee0da79 114 return 0;
erigow01 15:59f4cee0da79 115 memset(resource_ptr, 0, sizeof(sn_nsdl_resource_info_s));
erigow01 15:59f4cee0da79 116
erigow01 15:59f4cee0da79 117 resource_ptr->resource_parameters_ptr = (sn_nsdl_resource_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_resource_parameters_s));
erigow01 15:59f4cee0da79 118 if(!resource_ptr->resource_parameters_ptr)
erigow01 15:59f4cee0da79 119 {
erigow01 15:59f4cee0da79 120 nsdl_free(resource_ptr);
erigow01 15:59f4cee0da79 121 return 0;
erigow01 15:59f4cee0da79 122 }
erigow01 15:59f4cee0da79 123 memset(resource_ptr->resource_parameters_ptr, 0, sizeof(sn_nsdl_resource_parameters_s));
erigow01 15:59f4cee0da79 124
erigow01 15:59f4cee0da79 125 // Static resources
erigow01 18:eb1a194d60d9 126 nsdl_create_static_resource(resource_ptr, sizeof("detail/name")-1, (uint8_t*) "detail/name", 0, 0, (uint8_t*) "LPC1768 Switch", sizeof("LPC1768 Switch")-1);
erigow01 15:59f4cee0da79 127
erigow01 15:59f4cee0da79 128 // Dynamic resources
erigow01 18:eb1a194d60d9 129 create_switch_resource(resource_ptr);
erigow01 15:59f4cee0da79 130
erigow01 15:59f4cee0da79 131 /* Register with NSP */
erigow01 15:59f4cee0da79 132 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
erigow01 15:59f4cee0da79 133 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0) {
erigow01 15:59f4cee0da79 134 printf("NSP registering failed\r\n");
erigow01 15:59f4cee0da79 135 } else {
erigow01 15:59f4cee0da79 136 printf("NSP registering OK\r\n");
erigow01 15:59f4cee0da79 137 }
erigow01 15:59f4cee0da79 138 nsdl_clean_register_endpoint(&endpoint_ptr);
erigow01 15:59f4cee0da79 139
erigow01 15:59f4cee0da79 140 nsdl_free(resource_ptr->resource_parameters_ptr);
erigow01 15:59f4cee0da79 141 nsdl_free(resource_ptr);
erigow01 15:59f4cee0da79 142 return 1;
erigow01 15:59f4cee0da79 143 }
erigow01 15:59f4cee0da79 144
erigow01 17:8ca4a5801430 145 /* The number of seconds between NSDL Ticks*/
erigow01 17:8ca4a5801430 146 #define NSDL_TICK_PERIOD 1
erigow01 17:8ca4a5801430 147 /* The number of seconds between NSP registration messages */
erigow01 17:8ca4a5801430 148 #define RD_UPDATE_PERIOD 300
erigow01 17:8ca4a5801430 149
erigow01 17:8ca4a5801430 150 void nsdl_event_loop()
erigow01 17:8ca4a5801430 151 {
erigow01 17:8ca4a5801430 152 //Thread registration_thread(registration_update_thread);
erigow01 17:8ca4a5801430 153
erigow01 17:8ca4a5801430 154 //For timing control
erigow01 17:8ca4a5801430 155 Timer nsdlTickTimer;
erigow01 17:8ca4a5801430 156 Timer registrationTimer;
erigow01 17:8ca4a5801430 157
erigow01 17:8ca4a5801430 158 //Re-registration
erigow01 17:8ca4a5801430 159 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
erigow01 17:8ca4a5801430 160
erigow01 17:8ca4a5801430 161 //For recieving NSP messages
erigow01 17:8ca4a5801430 162 sn_nsdl_addr_s received_packet_address;
erigow01 17:8ca4a5801430 163 uint8_t received_address[4];
erigow01 17:8ca4a5801430 164 int8_t nsdl_result = 0;
erigow01 18:eb1a194d60d9 165 char buffer[256];
erigow01 17:8ca4a5801430 166 Endpoint from;
erigow01 17:8ca4a5801430 167 memset(&received_packet_address, 0, sizeof(sn_nsdl_addr_s));
erigow01 17:8ca4a5801430 168 received_packet_address.addr_ptr = received_address;
erigow01 17:8ca4a5801430 169 server.set_blocking(false, 1500);
erigow01 17:8ca4a5801430 170
erigow01 17:8ca4a5801430 171 //Check incoming socket...
erigow01 17:8ca4a5801430 172 int n = 0;
erigow01 17:8ca4a5801430 173 int32_t time = 0;
erigow01 17:8ca4a5801430 174 nsdlTickTimer.start();
erigow01 17:8ca4a5801430 175 registrationTimer.start();
erigow01 17:8ca4a5801430 176 while(true)
erigow01 17:8ca4a5801430 177 {
erigow01 17:8ca4a5801430 178 //Wifly UDP Packet Receive...
erigow01 17:8ca4a5801430 179 n = server.receiveFrom(from, buffer, sizeof(buffer));
erigow01 17:8ca4a5801430 180 if (n < 0)
erigow01 17:8ca4a5801430 181 {
erigow01 17:8ca4a5801430 182 //No Data
erigow01 17:8ca4a5801430 183 //printf("Socket error\n\r");
erigow01 17:8ca4a5801430 184 }
erigow01 17:8ca4a5801430 185 else
erigow01 17:8ca4a5801430 186 {
erigow01 17:8ca4a5801430 187 //UDP
erigow01 17:8ca4a5801430 188 //wait(0.25); //Waiting seems to increase reliability of comms...
erigow01 17:8ca4a5801430 189 printf("Received %d bytes\r\n", n);
erigow01 17:8ca4a5801430 190 nsdl_result = sn_nsdl_process_coap((uint8_t*)buffer, n, &received_packet_address);
erigow01 17:8ca4a5801430 191 printf("Processed COAP Packet: %d\r\n", nsdl_result);
erigow01 17:8ca4a5801430 192 n = 0;
erigow01 17:8ca4a5801430 193 }
erigow01 17:8ca4a5801430 194
andcor02 25:cb16c5248769 195
erigow01 17:8ca4a5801430 196 //Check if need to send pressure mat update...
andcor02 25:cb16c5248769 197 handle_microphone_sample_timer();
andcor02 25:cb16c5248769 198
erigow01 17:8ca4a5801430 199
erigow01 17:8ca4a5801430 200 //NSDL Tick
erigow01 17:8ca4a5801430 201 if(nsdlTickTimer.read() >= NSDL_TICK_PERIOD) {
erigow01 17:8ca4a5801430 202 sn_nsdl_exec(time);
erigow01 17:8ca4a5801430 203 nsdlTickTimer.reset();
erigow01 17:8ca4a5801430 204 }
erigow01 17:8ca4a5801430 205
erigow01 17:8ca4a5801430 206 //Registration Tick
erigow01 17:8ca4a5801430 207 if(registrationTimer.read() >= RD_UPDATE_PERIOD) {
erigow01 17:8ca4a5801430 208 printf("NSP attempt re-register...\r\n");
erigow01 17:8ca4a5801430 209 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
erigow01 17:8ca4a5801430 210 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
erigow01 17:8ca4a5801430 211 printf("NSP re-registering failed\r\n");
erigow01 17:8ca4a5801430 212 else
erigow01 17:8ca4a5801430 213 printf("NSP re-registering OK\r\n");
erigow01 17:8ca4a5801430 214 nsdl_clean_register_endpoint(&endpoint_ptr);
erigow01 17:8ca4a5801430 215 registrationTimer.reset();
erigow01 17:8ca4a5801430 216 }
erigow01 17:8ca4a5801430 217 }
erigow01 17:8ca4a5801430 218
erigow01 17:8ca4a5801430 219
erigow01 17:8ca4a5801430 220 }
erigow01 15:59f4cee0da79 221
erigow01 15:59f4cee0da79 222
andcor02 25:cb16c5248769 223
Kojto 8:be68e827aa53 224 /**
Kojto 7:afaa17c11965 225 * \param none
Kojto 6:6eaae34586b8 226 * \return int
Kojto 6:6eaae34586b8 227 */
Kojto 6:6eaae34586b8 228 int main() {
erigow01 22:b361f7ae0508 229 printf("Initialising Ethernet...\r\n");
erigow01 22:b361f7ae0508 230 // Initialize Ethernet interface first
erigow01 22:b361f7ae0508 231 ethernet_init();
erigow01 16:3fb612af0dc5 232
erigow01 15:59f4cee0da79 233 // Bind the socket and configure NSP settings
erigow01 15:59f4cee0da79 234 nsp_connect();
erigow01 15:59f4cee0da79 235
erigow01 15:59f4cee0da79 236 // Initalize NanoService library
erigow01 15:59f4cee0da79 237 nsdl_init();
Kojto 6:6eaae34586b8 238
erigow01 15:59f4cee0da79 239 // Create resources & register with NSP
erigow01 16:3fb612af0dc5 240 create_resources();
erigow01 16:3fb612af0dc5 241 // Run the NSDL event loop (never returns)
erigow01 16:3fb612af0dc5 242 nsdl_event_loop();
Kojto 6:6eaae34586b8 243 }