mbed Sensor node for Instrumented Booth over ETH.

Dependencies:   EthernetInterface-1 MaxbotixDriver Presence HTU21D_TEMP_HUMID_SENSOR_SAMPLE Resources SHARPIR mbed-rtos mbed-src WDT_K64F nsdl_lib

Fork of Trenton_Switch_LPC1768_ETH by Demo Team

Committer:
andcor02
Date:
Fri Dec 05 16:45:56 2014 +0000
Revision:
30:b74aa0729b07
Parent:
29:9599a156f78b
Child:
32:c957a1948ac1
Working on height integration follow on

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"
erigow01 16:3fb612af0dc5 18 #include "nsdl_support.h"
erigow01 26:4cac6b346e4f 19 #include "node_cfg.h"
andcor02 25:cb16c5248769 20 #include "sensor_ctl.h"
erigow01 26:4cac6b346e4f 21
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 // Ethernet initialization
erigow01 22:b361f7ae0508 28
erigow01 22:b361f7ae0508 29 EthernetInterface eth;
erigow01 22:b361f7ae0508 30
erigow01 22:b361f7ae0508 31 static void ethernet_init()
erigow01 22:b361f7ae0508 32 {
erigow01 22:b361f7ae0508 33 /* Initialize network */
erigow01 22:b361f7ae0508 34 #ifdef DHCP
erigow01 22:b361f7ae0508 35 printf("DHCP in use\r\n");
erigow01 22:b361f7ae0508 36 eth.init();
erigow01 22:b361f7ae0508 37 #else
erigow01 22:b361f7ae0508 38 eth.init(IP, MASK, GW);
erigow01 22:b361f7ae0508 39 #endif
erigow01 22:b361f7ae0508 40 if(eth.connect(30000) == 0)
erigow01 22:b361f7ae0508 41 printf("Connect OK\n\r");
erigow01 22:b361f7ae0508 42 printf("IP Address:%s ", eth.getIPAddress());
erigow01 22:b361f7ae0508 43 }
Kojto 6:6eaae34586b8 44
Kojto 6:6eaae34586b8 45
erigow01 18:eb1a194d60d9 46 //Hard Fault Handler (Watchdog)
erigow01 18:eb1a194d60d9 47 extern "C" void HardFault_Handler() {
erigow01 18:eb1a194d60d9 48 printf("Hard Fault!\r\n");
erigow01 18:eb1a194d60d9 49 NVIC_SystemReset();
erigow01 18:eb1a194d60d9 50 }
Kojto 6:6eaae34586b8 51
erigow01 15:59f4cee0da79 52 // ****************************************************************************
erigow01 26:4cac6b346e4f 53 // Socket initialization
erigow01 26:4cac6b346e4f 54 UDPSocket server;
erigow01 26:4cac6b346e4f 55 Endpoint nsp;
erigow01 15:59f4cee0da79 56
erigow01 15:59f4cee0da79 57
erigow01 15:59f4cee0da79 58
erigow01 17:8ca4a5801430 59 /* The number of seconds between NSDL Ticks*/
erigow01 27:6017a643f386 60 #define NSDL_TICK_PERIOD_MS 1000
erigow01 17:8ca4a5801430 61
erigow01 26:4cac6b346e4f 62 void main_event_loop() {
erigow01 17:8ca4a5801430 63 //For timing control
erigow01 17:8ca4a5801430 64 Timer nsdlTickTimer;
erigow01 17:8ca4a5801430 65 Timer registrationTimer;
erigow01 17:8ca4a5801430 66
erigow01 26:4cac6b346e4f 67 //Sensor timers...
erigow01 27:6017a643f386 68 #if NODE_SENSOR_STATION
erigow01 26:4cac6b346e4f 69 Timer temperatureReportTimer;
erigow01 26:4cac6b346e4f 70 Timer microphoneSampleTimer;
erigow01 26:4cac6b346e4f 71 Timer microphoneReportTimer;
erigow01 27:6017a643f386 72 #if NODE_PIR_STATION
erigow01 26:4cac6b346e4f 73 Timer motionReportTimer;
erigow01 27:6017a643f386 74 #endif //NODE PIR STATION
erigow01 27:6017a643f386 75 #if NODE_KIOSK_STATION
erigow01 27:6017a643f386 76 Timer kioskReportTimer;
erigow01 27:6017a643f386 77 #endif //NODE KIOSK STATION
erigow01 27:6017a643f386 78 #if NODE_DOOR_TRIP_STATION
erigow01 27:6017a643f386 79 Timer doorTripReportTimer;
erigow01 27:6017a643f386 80 #endif //NODE TRIP STATION
erigow01 27:6017a643f386 81 #if NODE_HEIGHT_STATION
andcor02 30:b74aa0729b07 82 Timer heightReportTimer;
erigow01 27:6017a643f386 83 #endif //NODE HEIGHT STATION
erigow01 27:6017a643f386 84 #endif //NODE_SENSOR_STATION
erigow01 27:6017a643f386 85
erigow01 17:8ca4a5801430 86 //For recieving NSP messages
erigow01 17:8ca4a5801430 87 sn_nsdl_addr_s received_packet_address;
erigow01 17:8ca4a5801430 88 uint8_t received_address[4];
erigow01 17:8ca4a5801430 89 int8_t nsdl_result = 0;
erigow01 18:eb1a194d60d9 90 char buffer[256];
erigow01 17:8ca4a5801430 91 Endpoint from;
erigow01 17:8ca4a5801430 92 memset(&received_packet_address, 0, sizeof(sn_nsdl_addr_s));
erigow01 17:8ca4a5801430 93 received_packet_address.addr_ptr = received_address;
erigow01 17:8ca4a5801430 94 server.set_blocking(false, 1500);
erigow01 17:8ca4a5801430 95
erigow01 17:8ca4a5801430 96 //Check incoming socket...
erigow01 17:8ca4a5801430 97 int n = 0;
erigow01 17:8ca4a5801430 98 int32_t time = 0;
erigow01 26:4cac6b346e4f 99
erigow01 26:4cac6b346e4f 100 //Start Timers
erigow01 27:6017a643f386 101
erigow01 17:8ca4a5801430 102 nsdlTickTimer.start();
erigow01 17:8ca4a5801430 103 registrationTimer.start();
erigow01 27:6017a643f386 104 #if NODE_SENSOR_STATION
erigow01 26:4cac6b346e4f 105 temperatureReportTimer.start();
erigow01 26:4cac6b346e4f 106 microphoneSampleTimer.start();
erigow01 26:4cac6b346e4f 107 microphoneReportTimer.start();
erigow01 27:6017a643f386 108 #if NODE_PIR_STATION
erigow01 27:6017a643f386 109 motionReportTimer.start();
erigow01 27:6017a643f386 110 #endif //NODE PIR STATION
erigow01 27:6017a643f386 111 #if NODE_KIOSK_STATION
erigow01 27:6017a643f386 112 kioskReportTimer.start();
erigow01 27:6017a643f386 113 #endif //NODE KIOSK STATION
erigow01 27:6017a643f386 114 #if NODE_DOOR_TRIP_STATION
erigow01 26:4cac6b346e4f 115 doorTripReportTimer.start();
erigow01 27:6017a643f386 116 #endif //NODE TRIP STATION
erigow01 27:6017a643f386 117 #if NODE_HEIGHT_STATION
andcor02 30:b74aa0729b07 118 heightReportTimer.start();
erigow01 27:6017a643f386 119 #endif //NODE HEIGHT STATION
erigow01 27:6017a643f386 120 #endif //NODE_SENSOR_STATION
erigow01 27:6017a643f386 121
erigow01 26:4cac6b346e4f 122 while(true) {
erigow01 26:4cac6b346e4f 123 //UDP Packet Receive...
erigow01 17:8ca4a5801430 124 n = server.receiveFrom(from, buffer, sizeof(buffer));
erigow01 27:6017a643f386 125 if (n <= 0) {
erigow01 17:8ca4a5801430 126 //No Data
erigow01 26:4cac6b346e4f 127 } else {
erigow01 17:8ca4a5801430 128 //UDP
erigow01 17:8ca4a5801430 129 //wait(0.25); //Waiting seems to increase reliability of comms...
erigow01 17:8ca4a5801430 130 printf("Received %d bytes\r\n", n);
erigow01 17:8ca4a5801430 131 nsdl_result = sn_nsdl_process_coap((uint8_t*)buffer, n, &received_packet_address);
erigow01 17:8ca4a5801430 132 printf("Processed COAP Packet: %d\r\n", nsdl_result);
erigow01 17:8ca4a5801430 133 n = 0;
erigow01 17:8ca4a5801430 134 }
erigow01 17:8ca4a5801430 135
erigow01 17:8ca4a5801430 136 //NSDL Tick
erigow01 27:6017a643f386 137 if(nsdlTickTimer.read_ms() >= NSDL_TICK_PERIOD_MS) {
erigow01 17:8ca4a5801430 138 sn_nsdl_exec(time);
erigow01 17:8ca4a5801430 139 nsdlTickTimer.reset();
erigow01 17:8ca4a5801430 140 }
erigow01 17:8ca4a5801430 141
erigow01 17:8ca4a5801430 142 //Registration Tick
erigow01 27:6017a643f386 143 if(registrationTimer.read_ms() >= RD_UPDATE_PERIOD_MS) {
erigow01 26:4cac6b346e4f 144 printf("Time to register...\r\n");
erigow01 26:4cac6b346e4f 145 NSP_registration();
erigow01 17:8ca4a5801430 146 registrationTimer.reset();
erigow01 17:8ca4a5801430 147 }
erigow01 26:4cac6b346e4f 148
erigow01 26:4cac6b346e4f 149 #if NODE_SENSOR_STATION
erigow01 27:6017a643f386 150 if (temperatureReportTimer.read_ms() >= TEMPERATURE_REPORT_PERIOD_MS){
erigow01 26:4cac6b346e4f 151 //debug("Event: Temperature Report Timer\r\n");
erigow01 26:4cac6b346e4f 152 handle_temperature_report_timer();
erigow01 26:4cac6b346e4f 153 temperatureReportTimer.reset();
erigow01 26:4cac6b346e4f 154 }
erigow01 27:6017a643f386 155 if (microphoneSampleTimer.read_ms() >= SOUND_SAMPLE_PERIOD_MS){
erigow01 26:4cac6b346e4f 156 handle_microphone_sample_timer();
erigow01 26:4cac6b346e4f 157 microphoneSampleTimer.reset();
erigow01 26:4cac6b346e4f 158 }
erigow01 27:6017a643f386 159 if (microphoneReportTimer.read_ms() >= SOUND_REPORT_PERIOD_MS){
erigow01 26:4cac6b346e4f 160 //debug("Event: Sound Report Timer\r\n");
erigow01 26:4cac6b346e4f 161 handle_microphone_report_timer();
erigow01 26:4cac6b346e4f 162 microphoneReportTimer.reset();
erigow01 26:4cac6b346e4f 163 }
erigow01 26:4cac6b346e4f 164 #if NODE_PIR_STATION
erigow01 27:6017a643f386 165 if (motionReportTimer.read_ms() >= MOTION_REPORT_PERIOD_MS){
erigow01 26:4cac6b346e4f 166 //debug("Event: Motion Report Timer\r\n");
erigow01 26:4cac6b346e4f 167 handle_motion_report_timer();
erigow01 26:4cac6b346e4f 168 motionReportTimer.reset();
erigow01 26:4cac6b346e4f 169 }
erigow01 26:4cac6b346e4f 170 #endif //NODE PIR STATION
erigow01 26:4cac6b346e4f 171 #if NODE_KIOSK_STATION
erigow01 27:6017a643f386 172 if (kioskReportTimer.read_ms() >= KIOSK_REPORT_PERIOD_MS){
erigow01 27:6017a643f386 173 //debug("Event: Motion Report Timer\r\n");
erigow01 27:6017a643f386 174 handle_kiosk_report_timer();
erigow01 27:6017a643f386 175 kioskReportTimer.reset();
erigow01 27:6017a643f386 176 }
erigow01 26:4cac6b346e4f 177 #endif //NODE KIOSK STATION
erigow01 26:4cac6b346e4f 178 #if NODE_DOOR_TRIP_STATION
erigow01 27:6017a643f386 179 if (doorTripReportTimer.read_ms() >= DOOR_TRIP_REPORT_PERIOD_MS){
erigow01 26:4cac6b346e4f 180 //debug("Event: Door Trip Report Timer\r\n");
erigow01 26:4cac6b346e4f 181 handle_door_trip_report_timer();
erigow01 26:4cac6b346e4f 182 doorTripReportTimer.reset();
erigow01 26:4cac6b346e4f 183 }
erigow01 26:4cac6b346e4f 184 #endif //NODE TRIP STATION
erigow01 26:4cac6b346e4f 185 #if NODE_HEIGHT_STATION
andcor02 30:b74aa0729b07 186 if (heightReportTimer.read_ms() >= DOOR_HEIGHT_PERIOD_MS ){
andcor02 30:b74aa0729b07 187 handle_door_height_sample_timer();
andcor02 29:9599a156f78b 188 heightReportTimer.reset();
andcor02 29:9599a156f78b 189 }
erigow01 26:4cac6b346e4f 190 #endif //NODE HEIGHT STATION
erigow01 26:4cac6b346e4f 191 #endif //NODE_SENSOR_STATION
erigow01 17:8ca4a5801430 192 }
erigow01 17:8ca4a5801430 193
erigow01 17:8ca4a5801430 194
erigow01 17:8ca4a5801430 195 }
erigow01 15:59f4cee0da79 196
erigow01 15:59f4cee0da79 197
andcor02 25:cb16c5248769 198
Kojto 8:be68e827aa53 199 /**
Kojto 7:afaa17c11965 200 * \param none
Kojto 6:6eaae34586b8 201 * \return int
Kojto 6:6eaae34586b8 202 */
Kojto 6:6eaae34586b8 203 int main() {
erigow01 22:b361f7ae0508 204 printf("Initialising Ethernet...\r\n");
erigow01 22:b361f7ae0508 205 // Initialize Ethernet interface first
erigow01 22:b361f7ae0508 206 ethernet_init();
erigow01 26:4cac6b346e4f 207 printf("Initialising NSDL...\r\n");
erigow01 26:4cac6b346e4f 208 //Run NSDL...
erigow01 26:4cac6b346e4f 209 nsdl_run();
erigow01 26:4cac6b346e4f 210 //Init Sensors
erigow01 26:4cac6b346e4f 211 init_sensors();
Kojto 6:6eaae34586b8 212
erigow01 26:4cac6b346e4f 213 // Run the event loop (never returns)
erigow01 26:4cac6b346e4f 214 main_event_loop();
Kojto 6:6eaae34586b8 215 }