Fork of KL46Z Wifi version. Moved to KL25Z as umbrella stand now requires 2 SPIs, thus requires 46z.

Dependencies:   WIZnet_Library_ASE mbed nanoservice_client_1_12

Fork of Trenton_Doormat_FRDM-KL25Z_ETH by Eric Gowland

Committer:
erigow01
Date:
Tue Sep 09 14:31:24 2014 +0000
Revision:
24:ad4d74ed0e4b
Parent:
23:7304a998959b
Updates - working version for Analyst day.

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 23:7304a998959b 17 #include "WIZnetInterface.h"
Kojto 6:6eaae34586b8 18 #include "main.h"
erigow01 16:3fb612af0dc5 19
erigow01 16:3fb612af0dc5 20 #include "nsdl_support.h"
Kojto 6:6eaae34586b8 21
erigow01 17:8ca4a5801430 22 #include "pressure_mat.h"
Kojto 8:be68e827aa53 23
erigow01 23:7304a998959b 24 // Freescale FRDM KL25Z
erigow01 23:7304a998959b 25 SPI spi(PTD2, PTD3, PTD1); // mosi, miso, sclk
erigow01 23:7304a998959b 26 WIZnetInterface eth(&spi, PTD0, PTD5); // spi, cs, reset
Kojto 6:6eaae34586b8 27
erigow01 15:59f4cee0da79 28 // NSP configuration
erigow01 15:59f4cee0da79 29 /* Change this IP address to that of your NanoService Platform installation */
erigow01 15:59f4cee0da79 30 Endpoint nsp;
erigow01 15:59f4cee0da79 31 UDPSocket server;
erigow01 16:3fb612af0dc5 32 //extern TCPSocketConnection server;
erigow01 16:3fb612af0dc5 33 char endpoint_name[] = {"welcomemat"};
erigow01 24:ad4d74ed0e4b 34 uint8_t ep_type[] = {"mbed_KL25Z"};
erigow01 15:59f4cee0da79 35 uint8_t lifetime_ptr[] = {"86400"};
erigow01 15:59f4cee0da79 36
erigow01 16:3fb612af0dc5 37 static const char* NSP_ADDRESS = "192.168.1.10"; /* Trenton BBB NSP */
erigow01 16:3fb612af0dc5 38 static const int NSP_PORT = 5683;
Kojto 6:6eaae34586b8 39
erigow01 18:c1a2c0c738b2 40 //Hard Fault Handler (Watchdog)
erigow01 18:c1a2c0c738b2 41 extern "C" void HardFault_Handler() {
erigow01 18:c1a2c0c738b2 42 printf("Hard Fault!\r\n");
erigow01 18:c1a2c0c738b2 43 NVIC_SystemReset();
erigow01 18:c1a2c0c738b2 44 }
Kojto 6:6eaae34586b8 45
erigow01 15:59f4cee0da79 46 // ****************************************************************************
erigow01 15:59f4cee0da79 47 // NSP initialization
erigow01 15:59f4cee0da79 48
erigow01 15:59f4cee0da79 49 static void nsp_connect()
erigow01 15:59f4cee0da79 50 {
erigow01 15:59f4cee0da79 51 printf("EP Name: %s", endpoint_name);
erigow01 15:59f4cee0da79 52 printf("NSP Location: coap://%s:%d\n", NSP_ADDRESS, NSP_PORT);
erigow01 15:59f4cee0da79 53
erigow01 15:59f4cee0da79 54 // Bind the port
erigow01 15:59f4cee0da79 55 //cellular->bind(EP_PORT);
erigow01 15:59f4cee0da79 56 server.init();
erigow01 16:3fb612af0dc5 57 //server.connect(NSP_ADDRESS, NSP_PORT);
erigow01 15:59f4cee0da79 58 server.bind(NSP_PORT);
erigow01 15:59f4cee0da79 59 nsp.set_address(NSP_ADDRESS, NSP_PORT);
erigow01 15:59f4cee0da79 60
erigow01 15:59f4cee0da79 61 printf("UDP connection to NSP successful.\r\n");
erigow01 15:59f4cee0da79 62 }
erigow01 15:59f4cee0da79 63
erigow01 15:59f4cee0da79 64 static int create_resources()
erigow01 15:59f4cee0da79 65 {
erigow01 15:59f4cee0da79 66 sn_nsdl_resource_info_s *resource_ptr = NULL;
erigow01 15:59f4cee0da79 67 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
erigow01 15:59f4cee0da79 68
erigow01 15:59f4cee0da79 69 printf("Creating resources\r\n");
erigow01 15:59f4cee0da79 70
erigow01 15:59f4cee0da79 71 /* Create resources */
erigow01 15:59f4cee0da79 72 resource_ptr = (sn_nsdl_resource_info_s*)nsdl_alloc(sizeof(sn_nsdl_resource_info_s));
erigow01 15:59f4cee0da79 73 if(!resource_ptr)
erigow01 15:59f4cee0da79 74 return 0;
erigow01 15:59f4cee0da79 75 memset(resource_ptr, 0, sizeof(sn_nsdl_resource_info_s));
erigow01 15:59f4cee0da79 76
erigow01 15:59f4cee0da79 77 resource_ptr->resource_parameters_ptr = (sn_nsdl_resource_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_resource_parameters_s));
erigow01 15:59f4cee0da79 78 if(!resource_ptr->resource_parameters_ptr)
erigow01 15:59f4cee0da79 79 {
erigow01 15:59f4cee0da79 80 nsdl_free(resource_ptr);
erigow01 15:59f4cee0da79 81 return 0;
erigow01 15:59f4cee0da79 82 }
erigow01 15:59f4cee0da79 83 memset(resource_ptr->resource_parameters_ptr, 0, sizeof(sn_nsdl_resource_parameters_s));
erigow01 15:59f4cee0da79 84
erigow01 15:59f4cee0da79 85 // Static resources
erigow01 24:ad4d74ed0e4b 86 nsdl_create_static_resource(resource_ptr, sizeof("detail/name")-1, (uint8_t*) "detail/name", 0, 0, (uint8_t*) "KL25Z Welcome Mat", sizeof("KL25Z Welcome Mat")-1);
erigow01 15:59f4cee0da79 87
erigow01 15:59f4cee0da79 88 // Dynamic resources
erigow01 17:8ca4a5801430 89 create_pressure_mat_resource(resource_ptr);
erigow01 15:59f4cee0da79 90
erigow01 15:59f4cee0da79 91 /* Register with NSP */
erigow01 15:59f4cee0da79 92 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
erigow01 15:59f4cee0da79 93 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0) {
erigow01 15:59f4cee0da79 94 printf("NSP registering failed\r\n");
erigow01 15:59f4cee0da79 95 } else {
erigow01 15:59f4cee0da79 96 printf("NSP registering OK\r\n");
erigow01 15:59f4cee0da79 97 }
erigow01 15:59f4cee0da79 98 nsdl_clean_register_endpoint(&endpoint_ptr);
erigow01 15:59f4cee0da79 99
erigow01 15:59f4cee0da79 100 nsdl_free(resource_ptr->resource_parameters_ptr);
erigow01 15:59f4cee0da79 101 nsdl_free(resource_ptr);
erigow01 15:59f4cee0da79 102 return 1;
erigow01 15:59f4cee0da79 103 }
erigow01 15:59f4cee0da79 104
erigow01 17:8ca4a5801430 105 /* The number of seconds between NSDL Ticks*/
erigow01 17:8ca4a5801430 106 #define NSDL_TICK_PERIOD 1
erigow01 17:8ca4a5801430 107 /* The number of seconds between NSP registration messages */
erigow01 17:8ca4a5801430 108 #define RD_UPDATE_PERIOD 300
erigow01 17:8ca4a5801430 109
erigow01 17:8ca4a5801430 110
erigow01 17:8ca4a5801430 111 void nsdl_event_loop()
erigow01 17:8ca4a5801430 112 {
erigow01 17:8ca4a5801430 113 //Thread registration_thread(registration_update_thread);
erigow01 17:8ca4a5801430 114
erigow01 17:8ca4a5801430 115 //For timing control
erigow01 17:8ca4a5801430 116 Timer nsdlTickTimer;
erigow01 17:8ca4a5801430 117 Timer registrationTimer;
erigow01 17:8ca4a5801430 118
erigow01 17:8ca4a5801430 119 //Re-registration
erigow01 17:8ca4a5801430 120 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
erigow01 17:8ca4a5801430 121
erigow01 17:8ca4a5801430 122 //For recieving NSP messages
erigow01 17:8ca4a5801430 123 sn_nsdl_addr_s received_packet_address;
erigow01 17:8ca4a5801430 124 uint8_t received_address[4];
erigow01 17:8ca4a5801430 125 int8_t nsdl_result = 0;
erigow01 18:c1a2c0c738b2 126 char buffer[256];
erigow01 17:8ca4a5801430 127 Endpoint from;
erigow01 17:8ca4a5801430 128 memset(&received_packet_address, 0, sizeof(sn_nsdl_addr_s));
erigow01 17:8ca4a5801430 129 received_packet_address.addr_ptr = received_address;
erigow01 17:8ca4a5801430 130 server.set_blocking(false, 1500);
erigow01 17:8ca4a5801430 131
erigow01 17:8ca4a5801430 132 //Check incoming socket...
erigow01 17:8ca4a5801430 133 int n = 0;
erigow01 17:8ca4a5801430 134 int32_t time = 0;
erigow01 17:8ca4a5801430 135 nsdlTickTimer.start();
erigow01 17:8ca4a5801430 136 registrationTimer.start();
erigow01 17:8ca4a5801430 137 while(true)
erigow01 17:8ca4a5801430 138 {
erigow01 17:8ca4a5801430 139 //Wifly UDP Packet Receive...
erigow01 17:8ca4a5801430 140 n = server.receiveFrom(from, buffer, sizeof(buffer));
erigow01 17:8ca4a5801430 141 if (n < 0)
erigow01 17:8ca4a5801430 142 {
erigow01 17:8ca4a5801430 143 //No Data
erigow01 17:8ca4a5801430 144 //printf("Socket error\n\r");
erigow01 17:8ca4a5801430 145 }
erigow01 17:8ca4a5801430 146 else
erigow01 17:8ca4a5801430 147 {
erigow01 17:8ca4a5801430 148 //UDP
erigow01 17:8ca4a5801430 149 //wait(0.25); //Waiting seems to increase reliability of comms...
erigow01 17:8ca4a5801430 150 printf("Received %d bytes\r\n", n);
erigow01 17:8ca4a5801430 151 nsdl_result = sn_nsdl_process_coap((uint8_t*)buffer, n, &received_packet_address);
erigow01 17:8ca4a5801430 152 printf("Processed COAP Packet: %d\r\n", nsdl_result);
erigow01 17:8ca4a5801430 153 n = 0;
erigow01 17:8ca4a5801430 154 }
erigow01 17:8ca4a5801430 155
erigow01 17:8ca4a5801430 156 //Check if need to send pressure mat update...
erigow01 17:8ca4a5801430 157 pressure_mat_report();
erigow01 17:8ca4a5801430 158
erigow01 17:8ca4a5801430 159 //NSDL Tick
erigow01 17:8ca4a5801430 160 if(nsdlTickTimer.read() >= NSDL_TICK_PERIOD) {
erigow01 17:8ca4a5801430 161 sn_nsdl_exec(time);
erigow01 17:8ca4a5801430 162 nsdlTickTimer.reset();
erigow01 17:8ca4a5801430 163 }
erigow01 17:8ca4a5801430 164
erigow01 17:8ca4a5801430 165 //Registration Tick
erigow01 17:8ca4a5801430 166 if(registrationTimer.read() >= RD_UPDATE_PERIOD) {
erigow01 17:8ca4a5801430 167 printf("NSP attempt re-register...\r\n");
erigow01 17:8ca4a5801430 168 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
erigow01 17:8ca4a5801430 169 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
erigow01 17:8ca4a5801430 170 printf("NSP re-registering failed\r\n");
erigow01 17:8ca4a5801430 171 else
erigow01 17:8ca4a5801430 172 printf("NSP re-registering OK\r\n");
erigow01 17:8ca4a5801430 173 nsdl_clean_register_endpoint(&endpoint_ptr);
erigow01 18:c1a2c0c738b2 174 pressure_mat_resetTokens();
erigow01 17:8ca4a5801430 175 registrationTimer.reset();
erigow01 17:8ca4a5801430 176 }
erigow01 17:8ca4a5801430 177 }
erigow01 17:8ca4a5801430 178
erigow01 17:8ca4a5801430 179
erigow01 17:8ca4a5801430 180 }
erigow01 15:59f4cee0da79 181
erigow01 15:59f4cee0da79 182
Kojto 8:be68e827aa53 183 /**
Kojto 7:afaa17c11965 184 * \param none
Kojto 6:6eaae34586b8 185 * \return int
Kojto 6:6eaae34586b8 186 */
Kojto 6:6eaae34586b8 187 int main() {
erigow01 23:7304a998959b 188 uint8_t mac[6];
erigow01 23:7304a998959b 189
erigow01 23:7304a998959b 190 //mbed_mac_address((char *)mac); // using the MAC address in LPC11U24 or LPC1178
erigow01 23:7304a998959b 191 // mac[0] = 0x00; mac[1] = 0x08; mac[2] = 0xDC; mac[3] = 0x00; mac[4] = 0x00; mac[5] = 0x00;
erigow01 23:7304a998959b 192 // you can alo use WIZ550io's MAC address by enabling "USE_WIZ550IO_MAC" in wiznet.h
erigow01 23:7304a998959b 193
erigow01 23:7304a998959b 194 printf("Start\n");
erigow01 23:7304a998959b 195 #ifdef USE_DHCP
erigow01 24:ad4d74ed0e4b 196 printf("Using DHCP...");
erigow01 23:7304a998959b 197 int ret = eth.init(mac); //Use DHCP
erigow01 23:7304a998959b 198 #else
erigow01 23:7304a998959b 199 int ret = eth.init(mac, IP, MASK, GW); // static
erigow01 23:7304a998959b 200 #endif
erigow01 23:7304a998959b 201
erigow01 23:7304a998959b 202 if (!ret) {
erigow01 23:7304a998959b 203 printf("Initialized, MAC: %s\n", eth.getMACAddress());
erigow01 23:7304a998959b 204 } else {
erigow01 23:7304a998959b 205 printf("Error eth.init() - ret = %d\n", ret);
erigow01 23:7304a998959b 206 return -1;
erigow01 23:7304a998959b 207 }
erigow01 23:7304a998959b 208
erigow01 23:7304a998959b 209 ret = eth.connect();
erigow01 23:7304a998959b 210 if (!ret) {
erigow01 23:7304a998959b 211 printf("IP: %s, MASK: %s, GW: %s\n",
erigow01 23:7304a998959b 212 eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
erigow01 23:7304a998959b 213 } else {
erigow01 23:7304a998959b 214 printf("Error eth.connect() - ret = %d\n", ret);
erigow01 23:7304a998959b 215 return -1;
erigow01 23:7304a998959b 216 }
erigow01 15:59f4cee0da79 217 // Bind the socket and configure NSP settings
erigow01 15:59f4cee0da79 218 nsp_connect();
erigow01 15:59f4cee0da79 219
erigow01 15:59f4cee0da79 220 // Initalize NanoService library
erigow01 15:59f4cee0da79 221 nsdl_init();
Kojto 6:6eaae34586b8 222
erigow01 15:59f4cee0da79 223 // Create resources & register with NSP
erigow01 16:3fb612af0dc5 224 create_resources();
erigow01 16:3fb612af0dc5 225 // Run the NSDL event loop (never returns)
erigow01 16:3fb612af0dc5 226 nsdl_event_loop();
Kojto 6:6eaae34586b8 227 }