The MCR20A Wireless UART application functions as an wireless UART bridge between two (one-to-one) or several (one to many) boards. The application can be used with both a TERM, or with software that is capable of opening a serial port and writing to or reading from it. The characters sent or received are not necessarily ASCII printable characters.

Dependencies:   fsl_phy_mcr20a fsl_smac mbed-rtos mbed

Fork of mcr20_wireless_uart by Freescale

By default, the application uses broadcast addresses for OTA communication. This way, the application can be directly downloaded and run without any user intervention. The following use case assumes no changes have been done to the project.

  • Two (or more) MCR20A platforms (plugged into the FRDM-K64F Freescale Freedom Development platform) have to be connected to the PC using the mini/micro-USB cables.
  • The code must be downloaded on the platforms via CMSIS-DAP (or other means).
  • After that, two or more TERM applications must be opened, and the serial ports must be configured with the same baud rate as the one in the project (default baud rate is 115200). Other necessary serial configurations are 8 bit, no parity, and 1 stop bit.
  • To start the setup, each platform must be reset, and one of the (user) push buttons found on the MCR20A platform must be pressed. The user can press any of the non-reset buttons on the FRDM-K64F Freescale Freedom Development platform as well. *This initiates the state machine of the application so user can start.

Documentation

SMAC Demo Applications User Guide

Committer:
cotigac
Date:
Wed Mar 18 18:52:47 2015 +0000
Revision:
17:52cfd7db8da3
Parent:
15:990a8b5664e1
Child:
18:b02fc0e53df8
fixed compiling issues

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:01fb291427ce 1 #include "mbed.h"
sam_grove 0:01fb291427ce 2
sam_grove 2:3e7685cfb2a7 3 #include "driverDebug.h"
cotigac 17:52cfd7db8da3 4 //#include "driverRFPhy.h"
cotigac 17:52cfd7db8da3 5 //#include "driverAtmelRFInterface.h"
cotigac 17:52cfd7db8da3 6
cotigac 17:52cfd7db8da3 7 #include "driverRFinterface.h"
cotigac 17:52cfd7db8da3 8
sam_grove 2:3e7685cfb2a7 9 #include "socket_api.h"
sam_grove 2:3e7685cfb2a7 10 #include "net_interface.h"
sam_grove 2:3e7685cfb2a7 11 #include "system_event.h"
sam_grove 2:3e7685cfb2a7 12 #include "string.h"
sam_grove 2:3e7685cfb2a7 13 #include "net_nwk_scan.h"
sam_grove 2:3e7685cfb2a7 14 #include "socket_security.h"
sam_grove 2:3e7685cfb2a7 15 #include "nwk_stats_api.h"
sam_grove 2:3e7685cfb2a7 16 #include "multicast_api.h"
sam_grove 2:3e7685cfb2a7 17 #include "nsdynmemLIB.h"
sam_grove 2:3e7685cfb2a7 18 #include "randLIB.h"
sam_grove 2:3e7685cfb2a7 19 #include "arm_hal_timer.h"
sam_grove 2:3e7685cfb2a7 20 #include "common_functions.h"
sam_grove 2:3e7685cfb2a7 21 #include "nsdl_support.h"
sam_grove 2:3e7685cfb2a7 22 #include "node_cfg.h"
sam_grove 2:3e7685cfb2a7 23
sam_grove 2:3e7685cfb2a7 24 /*** DEBUG ******/
sam_grove 2:3e7685cfb2a7 25 #define DEBUG 1
sam_grove 2:3e7685cfb2a7 26 #if DEBUG
sam_grove 2:3e7685cfb2a7 27 #define debug printf
sam_grove 2:3e7685cfb2a7 28 #else
sam_grove 2:3e7685cfb2a7 29 #define debug(...) ""
sam_grove 2:3e7685cfb2a7 30 #endif // DEBUG
sam_grove 2:3e7685cfb2a7 31
sam_grove 2:3e7685cfb2a7 32 /******* Hardware Definition **********/
sam_grove 2:3e7685cfb2a7 33 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 34 DigitalOut ledR(PTB22); // RGB - Red LED
sam_grove 2:3e7685cfb2a7 35 DigitalOut ledG(PTE26); // RGB - Green LED
sam_grove 2:3e7685cfb2a7 36 DigitalOut ledB(PTB21); // RGB - Blue LED
sam_grove 2:3e7685cfb2a7 37 InterruptIn TAP_INT(PTC6); // INT1 from FXOS8700Q
sam_grove 2:3e7685cfb2a7 38 #endif
sam_grove 2:3e7685cfb2a7 39
sam_grove 2:3e7685cfb2a7 40 /******* Timers Definitions ************/
sam_grove 2:3e7685cfb2a7 41 #define RETRY_TIMER 1
sam_grove 2:3e7685cfb2a7 42 #define NSP_REGISTRATION_TIMER 2
sam_grove 2:3e7685cfb2a7 43 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 44 #define ACCELEROMETER_TIMER 3
sam_grove 2:3e7685cfb2a7 45 #endif
sam_grove 2:3e7685cfb2a7 46 #if NODE_HOME
sam_grove 2:3e7685cfb2a7 47 #define DOOR_CHECK_TIMER 4
sam_grove 2:3e7685cfb2a7 48 #endif
sam_grove 2:3e7685cfb2a7 49
sam_grove 2:3e7685cfb2a7 50 void app_heap_error_handler(heap_fail_t event);
sam_grove 2:3e7685cfb2a7 51 void tasklet_main(arm_event_s *event);
sam_grove 2:3e7685cfb2a7 52 void button_main(arm_event_s *event);
sam_grove 2:3e7685cfb2a7 53
sam_grove 2:3e7685cfb2a7 54 #define APP_DEV_HEAP_SIZE 6000
sam_grove 2:3e7685cfb2a7 55 static uint8_t app_defined_stack_heap[APP_DEV_HEAP_SIZE];
sam_grove 2:3e7685cfb2a7 56 static int8_t main_tasklet_id = -1;
sam_grove 2:3e7685cfb2a7 57
sam_grove 2:3e7685cfb2a7 58 static const uint8_t app_MAC_address[8] = NODE_MAC_ADDRESS;
sam_grove 2:3e7685cfb2a7 59 static int8_t rf_phy_device_register_id = -1;
sam_grove 2:3e7685cfb2a7 60 static int8_t net_6lowpan_id = -1;
sam_grove 2:3e7685cfb2a7 61 static uint32_t channel_list = 0x07FFF800; // All channels
sam_grove 2:3e7685cfb2a7 62
sam_grove 2:3e7685cfb2a7 63 int8_t coap_udp_socket = -1;
sam_grove 2:3e7685cfb2a7 64
sam_grove 3:a38ad504a18c 65 #define AUDP_SOCKET_PORT 61630
sam_grove 2:3e7685cfb2a7 66 #define RECV_CTRL_UDP_PORT 1050 // receive
sam_grove 2:3e7685cfb2a7 67 #define SEND_CTRL_UDP_PORT 1060 // send
sam_grove 2:3e7685cfb2a7 68
sam_grove 2:3e7685cfb2a7 69 /** Used for Receive Data source Address store*/
sam_grove 3:a38ad504a18c 70 static ns_address_t app_src;
sam_grove 2:3e7685cfb2a7 71 static sn_nsdl_addr_s sn_addr_s;
sam_grove 2:3e7685cfb2a7 72
sam_grove 2:3e7685cfb2a7 73 static int access_point_status = 0;
sam_grove 2:3e7685cfb2a7 74
sam_grove 2:3e7685cfb2a7 75 link_layer_setups_s app_link_info;
sam_grove 2:3e7685cfb2a7 76 link_layer_address_s app_link_address_info;
sam_grove 2:3e7685cfb2a7 77 network_layer_address_s app_nd_address_info;
sam_grove 2:3e7685cfb2a7 78
sam_grove 2:3e7685cfb2a7 79 /* Prototype functions */
sam_grove 2:3e7685cfb2a7 80 void NSDL_receive_socket(void *cb);
sam_grove 2:3e7685cfb2a7 81 void NSP_registration(void);
sam_grove 2:3e7685cfb2a7 82
sam_grove 2:3e7685cfb2a7 83 extern void create_lqi_resource(uint8_t);
sam_grove 2:3e7685cfb2a7 84 void* own_alloc(uint16_t size);
sam_grove 2:3e7685cfb2a7 85 void own_free(void *ptr);
sam_grove 2:3e7685cfb2a7 86
sam_grove 2:3e7685cfb2a7 87 /*************** Application variables ***********************/
sam_grove 2:3e7685cfb2a7 88 uint8_t batteryLevel = 100;
sam_grove 2:3e7685cfb2a7 89 enum LED {NONE, RED, GREEN, BLUE};
sam_grove 2:3e7685cfb2a7 90 int ledState = NONE;
sam_grove 2:3e7685cfb2a7 91
sam_grove 2:3e7685cfb2a7 92
sam_grove 2:3e7685cfb2a7 93 /* #defines, definitions and declarations according node profile */
sam_grove 2:3e7685cfb2a7 94
sam_grove 2:3e7685cfb2a7 95 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 96 int8_t ctrl_udp_socket = -1;
sam_grove 2:3e7685cfb2a7 97 void empty_udp_receive(void * cb);
sam_grove 2:3e7685cfb2a7 98 void ctrl_udp_send(uint8_t cmd);
sam_grove 2:3e7685cfb2a7 99
sam_grove 2:3e7685cfb2a7 100 #include "FXOS8700Q_TD.h"
sam_grove 2:3e7685cfb2a7 101
sam_grove 2:3e7685cfb2a7 102 #define ACCEL_SAMPLE_TIME 200
sam_grove 2:3e7685cfb2a7 103 FXOS8700Q accel( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board
sam_grove 2:3e7685cfb2a7 104 bool accel_enable = 1;
sam_grove 2:3e7685cfb2a7 105
sam_grove 2:3e7685cfb2a7 106 void tap_detector_handler(void) {
sam_grove 2:3e7685cfb2a7 107 printf("Tap Detected!\r\n");
sam_grove 2:3e7685cfb2a7 108
sam_grove 2:3e7685cfb2a7 109 switch(ledState) {
sam_grove 2:3e7685cfb2a7 110 case NONE:
sam_grove 2:3e7685cfb2a7 111 break;
sam_grove 2:3e7685cfb2a7 112 case RED:
sam_grove 2:3e7685cfb2a7 113 ctrl_udp_send('R');
sam_grove 2:3e7685cfb2a7 114 break;
sam_grove 2:3e7685cfb2a7 115 case GREEN:
sam_grove 2:3e7685cfb2a7 116 ctrl_udp_send('G');
sam_grove 2:3e7685cfb2a7 117 break;
sam_grove 2:3e7685cfb2a7 118 case BLUE:
sam_grove 2:3e7685cfb2a7 119 ctrl_udp_send('B');
sam_grove 2:3e7685cfb2a7 120 break;
sam_grove 2:3e7685cfb2a7 121 }
sam_grove 2:3e7685cfb2a7 122 }
sam_grove 2:3e7685cfb2a7 123
sam_grove 2:3e7685cfb2a7 124 void update_LED(void) {
sam_grove 2:3e7685cfb2a7 125
sam_grove 2:3e7685cfb2a7 126 switch(ledState) {
sam_grove 2:3e7685cfb2a7 127 case NONE:
sam_grove 2:3e7685cfb2a7 128 ledState = GREEN;
sam_grove 2:3e7685cfb2a7 129 ledR = 1;
sam_grove 2:3e7685cfb2a7 130 ledG = 0;
sam_grove 2:3e7685cfb2a7 131 ledB = 1;
sam_grove 2:3e7685cfb2a7 132 break;
sam_grove 2:3e7685cfb2a7 133
sam_grove 2:3e7685cfb2a7 134 case GREEN:
sam_grove 2:3e7685cfb2a7 135 ledState = RED;
sam_grove 2:3e7685cfb2a7 136 ledR = 0;
sam_grove 2:3e7685cfb2a7 137 ledG = 1;
sam_grove 2:3e7685cfb2a7 138 ledB = 1;
sam_grove 2:3e7685cfb2a7 139 break;
sam_grove 2:3e7685cfb2a7 140
sam_grove 2:3e7685cfb2a7 141 case RED:
sam_grove 2:3e7685cfb2a7 142 ledState = BLUE;
sam_grove 2:3e7685cfb2a7 143 ledR = 1;
sam_grove 2:3e7685cfb2a7 144 ledG = 1;
sam_grove 2:3e7685cfb2a7 145 ledB = 0;
sam_grove 2:3e7685cfb2a7 146 break;
sam_grove 2:3e7685cfb2a7 147
sam_grove 2:3e7685cfb2a7 148 case BLUE:
sam_grove 2:3e7685cfb2a7 149 ledState = NONE;
sam_grove 2:3e7685cfb2a7 150 ledR = 1;
sam_grove 2:3e7685cfb2a7 151 ledG = 1;
sam_grove 2:3e7685cfb2a7 152 ledB = 1;
sam_grove 2:3e7685cfb2a7 153 break;
sam_grove 2:3e7685cfb2a7 154 }
sam_grove 2:3e7685cfb2a7 155 }
sam_grove 2:3e7685cfb2a7 156
sam_grove 2:3e7685cfb2a7 157 #endif
sam_grove 0:01fb291427ce 158
sam_grove 2:3e7685cfb2a7 159 #if 1
sam_grove 2:3e7685cfb2a7 160 void printf_array(uint8_t *ptr , uint16_t len)
sam_grove 2:3e7685cfb2a7 161 {
sam_grove 2:3e7685cfb2a7 162 uint16_t i;
sam_grove 2:3e7685cfb2a7 163 for(i=0; i<len; i++)
sam_grove 2:3e7685cfb2a7 164 {
sam_grove 2:3e7685cfb2a7 165 if(i)
sam_grove 2:3e7685cfb2a7 166 {
sam_grove 2:3e7685cfb2a7 167 if(i%16== 0)
sam_grove 2:3e7685cfb2a7 168 {
sam_grove 2:3e7685cfb2a7 169 debug("\r\n");
sam_grove 2:3e7685cfb2a7 170 if(len > 64)
sam_grove 2:3e7685cfb2a7 171 {
sam_grove 2:3e7685cfb2a7 172 uint8_t x =254;
sam_grove 2:3e7685cfb2a7 173 while(x--);
sam_grove 2:3e7685cfb2a7 174 }
sam_grove 2:3e7685cfb2a7 175 }
sam_grove 2:3e7685cfb2a7 176 else
sam_grove 2:3e7685cfb2a7 177 {
sam_grove 2:3e7685cfb2a7 178 debug(":");
sam_grove 2:3e7685cfb2a7 179 }
sam_grove 2:3e7685cfb2a7 180 }
sam_grove 2:3e7685cfb2a7 181 debug_hex(*ptr++);
sam_grove 2:3e7685cfb2a7 182 }
sam_grove 2:3e7685cfb2a7 183 debug("\r\n");
sam_grove 2:3e7685cfb2a7 184 }
sam_grove 2:3e7685cfb2a7 185
sam_grove 2:3e7685cfb2a7 186
sam_grove 2:3e7685cfb2a7 187
sam_grove 2:3e7685cfb2a7 188 void debug_integer(uint8_t width, uint8_t base, int16_t n)
sam_grove 2:3e7685cfb2a7 189 {
sam_grove 2:3e7685cfb2a7 190 uint8_t bfr[8];
sam_grove 2:3e7685cfb2a7 191 uint8_t *ptr = bfr;
sam_grove 2:3e7685cfb2a7 192 uint8_t ctr = 0;
sam_grove 2:3e7685cfb2a7 193
sam_grove 2:3e7685cfb2a7 194 if (width > 7) width = 7;
sam_grove 2:3e7685cfb2a7 195
sam_grove 2:3e7685cfb2a7 196 ptr += width;
sam_grove 2:3e7685cfb2a7 197 *ptr-- = 0;
sam_grove 2:3e7685cfb2a7 198
sam_grove 2:3e7685cfb2a7 199 if (base == 16)
sam_grove 2:3e7685cfb2a7 200 {
sam_grove 2:3e7685cfb2a7 201 do
sam_grove 2:3e7685cfb2a7 202 {
sam_grove 2:3e7685cfb2a7 203 *ptr = n & 0x0F;
sam_grove 2:3e7685cfb2a7 204 if (*ptr < 10) *ptr += '0';
sam_grove 2:3e7685cfb2a7 205 else *ptr += ('A'-10);
sam_grove 2:3e7685cfb2a7 206 ptr--;
sam_grove 2:3e7685cfb2a7 207 n >>= 4;
sam_grove 2:3e7685cfb2a7 208 ctr++;
sam_grove 2:3e7685cfb2a7 209 }while((ctr & 1) || (ctr < width));
sam_grove 2:3e7685cfb2a7 210 }
sam_grove 2:3e7685cfb2a7 211 else
sam_grove 2:3e7685cfb2a7 212 {
sam_grove 2:3e7685cfb2a7 213 uint8_t negative = 0;
sam_grove 2:3e7685cfb2a7 214 if (n < 0)
sam_grove 2:3e7685cfb2a7 215 { negative = 1;
sam_grove 2:3e7685cfb2a7 216 n = -n;
sam_grove 2:3e7685cfb2a7 217 }
sam_grove 2:3e7685cfb2a7 218 ctr++;
sam_grove 2:3e7685cfb2a7 219 do
sam_grove 2:3e7685cfb2a7 220 {
sam_grove 2:3e7685cfb2a7 221 *ptr-- = (n % 10) + '0';
sam_grove 2:3e7685cfb2a7 222 n /= 10;
sam_grove 2:3e7685cfb2a7 223 ctr++;
sam_grove 2:3e7685cfb2a7 224 }while ((ctr < width) && n);
sam_grove 2:3e7685cfb2a7 225 if (negative)
sam_grove 2:3e7685cfb2a7 226 {
sam_grove 2:3e7685cfb2a7 227 *ptr-- = '-';
sam_grove 2:3e7685cfb2a7 228 }
sam_grove 2:3e7685cfb2a7 229 else
sam_grove 2:3e7685cfb2a7 230 {
sam_grove 2:3e7685cfb2a7 231 *ptr-- = ' ';
sam_grove 2:3e7685cfb2a7 232 }
sam_grove 2:3e7685cfb2a7 233 }
sam_grove 2:3e7685cfb2a7 234 ptr++;
sam_grove 2:3e7685cfb2a7 235 //debug_send(ptr);
sam_grove 2:3e7685cfb2a7 236 debug((const char *)ptr);
sam_grove 2:3e7685cfb2a7 237 }
sam_grove 2:3e7685cfb2a7 238
sam_grove 2:3e7685cfb2a7 239
sam_grove 2:3e7685cfb2a7 240 void printf_ipv6_address(uint8_t *addr_ptr)
sam_grove 0:01fb291427ce 241 {
sam_grove 2:3e7685cfb2a7 242 if(addr_ptr)
sam_grove 2:3e7685cfb2a7 243 {
sam_grove 2:3e7685cfb2a7 244 uint8_t i, d_colon = 0;
sam_grove 2:3e7685cfb2a7 245 uint16_t current_value = 0, last_value = 0;
sam_grove 2:3e7685cfb2a7 246
sam_grove 2:3e7685cfb2a7 247 for(i=0; i< 16;i += 2)
sam_grove 2:3e7685cfb2a7 248 {
sam_grove 2:3e7685cfb2a7 249 current_value = (*addr_ptr++ << 8);
sam_grove 2:3e7685cfb2a7 250 current_value += *addr_ptr++;
sam_grove 2:3e7685cfb2a7 251
sam_grove 2:3e7685cfb2a7 252 if(i == 0)
sam_grove 2:3e7685cfb2a7 253 {
sam_grove 2:3e7685cfb2a7 254 last_value = current_value;
sam_grove 2:3e7685cfb2a7 255 debug_hex(current_value >> 8);
sam_grove 2:3e7685cfb2a7 256 debug_hex(current_value );
sam_grove 2:3e7685cfb2a7 257 debug(":");
sam_grove 2:3e7685cfb2a7 258 }
sam_grove 2:3e7685cfb2a7 259 else
sam_grove 2:3e7685cfb2a7 260 {
sam_grove 2:3e7685cfb2a7 261 if(current_value == 0)
sam_grove 2:3e7685cfb2a7 262 {
sam_grove 2:3e7685cfb2a7 263 if(i== 14)
sam_grove 2:3e7685cfb2a7 264 {
sam_grove 2:3e7685cfb2a7 265 debug(":");
sam_grove 2:3e7685cfb2a7 266 //debug_put('0');
sam_grove 2:3e7685cfb2a7 267 debug("0");
sam_grove 2:3e7685cfb2a7 268 }
sam_grove 2:3e7685cfb2a7 269 else
sam_grove 2:3e7685cfb2a7 270 {
sam_grove 2:3e7685cfb2a7 271 if(last_value == 0)
sam_grove 2:3e7685cfb2a7 272 {
sam_grove 2:3e7685cfb2a7 273 if(d_colon == 0)
sam_grove 2:3e7685cfb2a7 274 {
sam_grove 2:3e7685cfb2a7 275 d_colon=1;
sam_grove 2:3e7685cfb2a7 276 }
sam_grove 2:3e7685cfb2a7 277 }
sam_grove 2:3e7685cfb2a7 278 else
sam_grove 2:3e7685cfb2a7 279 {
sam_grove 2:3e7685cfb2a7 280 if(d_colon == 2)
sam_grove 2:3e7685cfb2a7 281 {
sam_grove 2:3e7685cfb2a7 282 //debug_put('0');
sam_grove 2:3e7685cfb2a7 283 debug("0");
sam_grove 2:3e7685cfb2a7 284 debug(":");
sam_grove 2:3e7685cfb2a7 285 }
sam_grove 2:3e7685cfb2a7 286 }
sam_grove 2:3e7685cfb2a7 287 }
sam_grove 2:3e7685cfb2a7 288 }
sam_grove 2:3e7685cfb2a7 289 else
sam_grove 2:3e7685cfb2a7 290 {
sam_grove 2:3e7685cfb2a7 291 if(last_value == 0)
sam_grove 2:3e7685cfb2a7 292 {
sam_grove 2:3e7685cfb2a7 293 if(d_colon == 1)
sam_grove 2:3e7685cfb2a7 294 {
sam_grove 2:3e7685cfb2a7 295 debug(":");
sam_grove 2:3e7685cfb2a7 296 d_colon = 2;
sam_grove 2:3e7685cfb2a7 297 }
sam_grove 2:3e7685cfb2a7 298 else
sam_grove 2:3e7685cfb2a7 299 {
sam_grove 2:3e7685cfb2a7 300 //debug_put('0');
sam_grove 2:3e7685cfb2a7 301 debug("0");
sam_grove 2:3e7685cfb2a7 302 debug(":");
sam_grove 2:3e7685cfb2a7 303 }
sam_grove 2:3e7685cfb2a7 304 }
sam_grove 2:3e7685cfb2a7 305 if(current_value > 0x00ff)
sam_grove 2:3e7685cfb2a7 306 {
sam_grove 2:3e7685cfb2a7 307 debug_hex(current_value >> 8);
sam_grove 2:3e7685cfb2a7 308 }
sam_grove 2:3e7685cfb2a7 309 debug_hex(current_value );
sam_grove 2:3e7685cfb2a7 310 if(i< 14)
sam_grove 2:3e7685cfb2a7 311 {
sam_grove 2:3e7685cfb2a7 312 debug(":");
sam_grove 2:3e7685cfb2a7 313 }
sam_grove 2:3e7685cfb2a7 314 }
sam_grove 2:3e7685cfb2a7 315 last_value = current_value;
sam_grove 2:3e7685cfb2a7 316 }
sam_grove 2:3e7685cfb2a7 317 }
sam_grove 2:3e7685cfb2a7 318 }
sam_grove 2:3e7685cfb2a7 319 else
sam_grove 2:3e7685cfb2a7 320 {
sam_grove 2:3e7685cfb2a7 321 debug("Address Print: pointer NULL");
sam_grove 2:3e7685cfb2a7 322 }
sam_grove 2:3e7685cfb2a7 323 debug("\r\n");
sam_grove 2:3e7685cfb2a7 324 }
sam_grove 2:3e7685cfb2a7 325 #endif
sam_grove 2:3e7685cfb2a7 326
sam_grove 2:3e7685cfb2a7 327 int main()
sam_grove 2:3e7685cfb2a7 328 {
sam_grove 2:3e7685cfb2a7 329 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 330 ledR = 1;
sam_grove 2:3e7685cfb2a7 331 ledG = 1;
sam_grove 2:3e7685cfb2a7 332 ledB = 1;
sam_grove 2:3e7685cfb2a7 333 TAP_INT.rise(&tap_detector_handler);
sam_grove 2:3e7685cfb2a7 334 #endif
sam_grove 2:3e7685cfb2a7 335
sam_grove 2:3e7685cfb2a7 336 debug("\r\nApplication Start\r\n");
sam_grove 2:3e7685cfb2a7 337 ns_dyn_mem_init(app_defined_stack_heap, APP_DEV_HEAP_SIZE, app_heap_error_handler,0);
sam_grove 2:3e7685cfb2a7 338 rf_set_mac_address(app_MAC_address);
FSL\B36402 15:990a8b5664e1 339
sam_grove 2:3e7685cfb2a7 340 // init RF interface
sam_grove 2:3e7685cfb2a7 341 debug("Init RF Interface...\r\n");
sam_grove 2:3e7685cfb2a7 342 rf_phy_device_register_id = rf_device_register();
FSL\B36402 15:990a8b5664e1 343
sam_grove 2:3e7685cfb2a7 344 randLIB_seed_random();
sam_grove 0:01fb291427ce 345
sam_grove 2:3e7685cfb2a7 346 debug("Init ARM Timer...\r\n");
sam_grove 2:3e7685cfb2a7 347 arm_timer_init();//Init Timer
FSL\B36402 15:990a8b5664e1 348
sam_grove 2:3e7685cfb2a7 349 //Init nanostack & Event OS
sam_grove 2:3e7685cfb2a7 350 debug("Init Net Core...\r\n");
sam_grove 2:3e7685cfb2a7 351 net_init_core();
sam_grove 2:3e7685cfb2a7 352 debug("Create Tasklets...\r\n");
sam_grove 2:3e7685cfb2a7 353 main_tasklet_id = arm_ns_tasklet_create(&tasklet_main);
sam_grove 2:3e7685cfb2a7 354 if(main_tasklet_id < 0)
sam_grove 2:3e7685cfb2a7 355 {
sam_grove 2:3e7685cfb2a7 356 //Tasklet cerate fail
sam_grove 2:3e7685cfb2a7 357 error("Tasklet create fail..");
sam_grove 2:3e7685cfb2a7 358 while(1);
sam_grove 2:3e7685cfb2a7 359 }
FSL\B36402 15:990a8b5664e1 360
sam_grove 2:3e7685cfb2a7 361 debug("Event Dispatch\r\n");
sam_grove 2:3e7685cfb2a7 362 event_dispatch();
sam_grove 2:3e7685cfb2a7 363 }
sam_grove 2:3e7685cfb2a7 364
sam_grove 2:3e7685cfb2a7 365 /**
sam_grove 2:3e7685cfb2a7 366 * @brief This function handles Hard Fault exception.
sam_grove 2:3e7685cfb2a7 367 * @param None
sam_grove 2:3e7685cfb2a7 368 * @retval None
sam_grove 2:3e7685cfb2a7 369 */
sam_grove 2:3e7685cfb2a7 370 void HardFault_Handler(void)
sam_grove 2:3e7685cfb2a7 371 {
sam_grove 2:3e7685cfb2a7 372 /* Go to infinite loop when Hard Fault exception occurs */
sam_grove 2:3e7685cfb2a7 373 while (1)
sam_grove 2:3e7685cfb2a7 374 {
sam_grove 2:3e7685cfb2a7 375 }
sam_grove 2:3e7685cfb2a7 376 }
sam_grove 2:3e7685cfb2a7 377 void app_heap_error_handler(heap_fail_t event)
sam_grove 2:3e7685cfb2a7 378 {
sam_grove 2:3e7685cfb2a7 379 switch (event)
sam_grove 2:3e7685cfb2a7 380 {
sam_grove 2:3e7685cfb2a7 381 case NS_DYN_MEM_NULL_FREE:
sam_grove 2:3e7685cfb2a7 382 break;
sam_grove 2:3e7685cfb2a7 383 case NS_DYN_MEM_DOUBLE_FREE:
sam_grove 2:3e7685cfb2a7 384 break;
sam_grove 2:3e7685cfb2a7 385
sam_grove 2:3e7685cfb2a7 386 case NS_DYN_MEM_ALLOCATE_SIZE_NOT_VALID:
sam_grove 2:3e7685cfb2a7 387 break;
sam_grove 2:3e7685cfb2a7 388 case NS_DYN_MEM_POINTER_NOT_VALID:
sam_grove 2:3e7685cfb2a7 389 break;
sam_grove 2:3e7685cfb2a7 390
sam_grove 2:3e7685cfb2a7 391 case NS_DYN_MEM_HEAP_SECTOR_CORRUPTED:
sam_grove 2:3e7685cfb2a7 392 break;
sam_grove 2:3e7685cfb2a7 393
sam_grove 2:3e7685cfb2a7 394 case NS_DYN_MEM_HEAP_SECTOR_UNITIALIZED:
sam_grove 2:3e7685cfb2a7 395 break;
sam_grove 2:3e7685cfb2a7 396
sam_grove 2:3e7685cfb2a7 397 default:
sam_grove 2:3e7685cfb2a7 398
sam_grove 2:3e7685cfb2a7 399 break;
sam_grove 2:3e7685cfb2a7 400 }
sam_grove 2:3e7685cfb2a7 401 while(1);
sam_grove 2:3e7685cfb2a7 402 }
sam_grove 2:3e7685cfb2a7 403
sam_grove 2:3e7685cfb2a7 404
sam_grove 2:3e7685cfb2a7 405 /**
sam_grove 2:3e7685cfb2a7 406 * \brief Network state event handler.
sam_grove 2:3e7685cfb2a7 407 * \param event show network start response or current network state.
sam_grove 2:3e7685cfb2a7 408 *
sam_grove 2:3e7685cfb2a7 409 * - NET_READY: Save NVK peristant data to NVM and Net role
sam_grove 2:3e7685cfb2a7 410 * - NET_NO_BEACON: Link Layer Active Scan Fail, Stack is Already at Idle state
sam_grove 2:3e7685cfb2a7 411 * - NET_NO_ND_ROUTER: No ND Router at current Channel Stack is Already at Idle state
sam_grove 2:3e7685cfb2a7 412 * - NET_BORDER_ROUTER_LOST: Connection to Access point is lost wait for Scan Result
sam_grove 2:3e7685cfb2a7 413 * - NET_PARENT_POLL_FAIL: Host should run net start without any PAN-id filter and all channels
sam_grove 2:3e7685cfb2a7 414 * - NET_PANA_SERVER_AUTH_FAIL: Pana Authentication fail, Stack is Already at Idle state
sam_grove 2:3e7685cfb2a7 415 */
sam_grove 2:3e7685cfb2a7 416 void app_parse_network_event(arm_event_s *event )
sam_grove 2:3e7685cfb2a7 417 {
sam_grove 2:3e7685cfb2a7 418 arm_nwk_interface_status_type_e status = (arm_nwk_interface_status_type_e)event->event_data;
sam_grove 2:3e7685cfb2a7 419 switch (status)
sam_grove 2:3e7685cfb2a7 420 {
sam_grove 2:3e7685cfb2a7 421 case ARM_NWK_BOOTSTRAP_READY:
sam_grove 2:3e7685cfb2a7 422 /* NEtwork is ready and node is connected to Access Point */
sam_grove 2:3e7685cfb2a7 423 if(access_point_status==0)
sam_grove 2:3e7685cfb2a7 424 {
sam_grove 2:3e7685cfb2a7 425 uint8_t temp_ipv6[16];
sam_grove 2:3e7685cfb2a7 426 debug("Network Connection Ready\r\n");
sam_grove 2:3e7685cfb2a7 427 access_point_status=1;
sam_grove 2:3e7685cfb2a7 428 //Read Address
sam_grove 2:3e7685cfb2a7 429
sam_grove 2:3e7685cfb2a7 430 if( arm_nwk_nd_address_read(net_6lowpan_id,&app_nd_address_info) != 0)
sam_grove 2:3e7685cfb2a7 431 {
sam_grove 2:3e7685cfb2a7 432 debug("ND Address read fail\r\n");
sam_grove 2:3e7685cfb2a7 433 }
sam_grove 2:3e7685cfb2a7 434 else
sam_grove 2:3e7685cfb2a7 435 {
sam_grove 2:3e7685cfb2a7 436 debug("ND Access Point: ");
sam_grove 2:3e7685cfb2a7 437 printf_ipv6_address(app_nd_address_info.border_router); //REVIEW
sam_grove 2:3e7685cfb2a7 438
sam_grove 2:3e7685cfb2a7 439 debug("ND Prefix 64: ");
sam_grove 2:3e7685cfb2a7 440 printf_array(app_nd_address_info.prefix, 8); //REVIEW
sam_grove 2:3e7685cfb2a7 441
sam_grove 2:3e7685cfb2a7 442 if(arm_net_address_get(net_6lowpan_id,ADDR_IPV6_GP,temp_ipv6) == 0)
sam_grove 2:3e7685cfb2a7 443 {
sam_grove 2:3e7685cfb2a7 444 debug("GP IPv6: ");
sam_grove 2:3e7685cfb2a7 445 printf_ipv6_address(temp_ipv6); //REVIEW
sam_grove 2:3e7685cfb2a7 446 }
sam_grove 2:3e7685cfb2a7 447 }
sam_grove 2:3e7685cfb2a7 448
sam_grove 2:3e7685cfb2a7 449 if( arm_nwk_mac_address_read(net_6lowpan_id,&app_link_address_info) != 0)
sam_grove 2:3e7685cfb2a7 450 {
sam_grove 2:3e7685cfb2a7 451 debug("MAC Address read fail\r\n");
sam_grove 2:3e7685cfb2a7 452 }
sam_grove 2:3e7685cfb2a7 453 else
sam_grove 2:3e7685cfb2a7 454 {
sam_grove 2:3e7685cfb2a7 455 uint8_t temp[2];
sam_grove 2:3e7685cfb2a7 456 common_write_16_bit(app_link_address_info.mac_short,temp);
sam_grove 2:3e7685cfb2a7 457 debug("MAC 16-bit: ");
sam_grove 2:3e7685cfb2a7 458 printf_array(temp, 2); //REVIEW
sam_grove 2:3e7685cfb2a7 459 common_write_16_bit(app_link_address_info.PANId,temp);
sam_grove 2:3e7685cfb2a7 460 debug("PAN-ID: ");
sam_grove 2:3e7685cfb2a7 461 printf_array(temp, 2); //REVIEW
sam_grove 2:3e7685cfb2a7 462 debug("MAC 64-bit: ");
sam_grove 2:3e7685cfb2a7 463 printf_array(app_link_address_info.long_euid64, 8); //REVIEW
sam_grove 2:3e7685cfb2a7 464 debug("EUID64(Based on MAC 64-bit address): ");
sam_grove 2:3e7685cfb2a7 465 printf_array(app_link_address_info.euid64, 8); //REVIEW
sam_grove 2:3e7685cfb2a7 466 }
sam_grove 2:3e7685cfb2a7 467 }
sam_grove 2:3e7685cfb2a7 468 break;
sam_grove 2:3e7685cfb2a7 469
sam_grove 2:3e7685cfb2a7 470 case ARM_NWK_NWK_SCAN_FAIL:
sam_grove 2:3e7685cfb2a7 471 /* Link Layer Active Scan Fail, Stack is Already at Idle state */
sam_grove 2:3e7685cfb2a7 472 debug("Link Layer Scan Fail: No Beacons\r\n");
sam_grove 2:3e7685cfb2a7 473 access_point_status=0;
sam_grove 2:3e7685cfb2a7 474 //dnssd_disable(1);
sam_grove 2:3e7685cfb2a7 475 break;
sam_grove 2:3e7685cfb2a7 476
sam_grove 2:3e7685cfb2a7 477 case ARM_NWK_IP_ADDRESS_ALLOCATION_FAIL:
sam_grove 2:3e7685cfb2a7 478 /* No ND Router at current Channel Stack is Already at Idle state */
sam_grove 2:3e7685cfb2a7 479 debug("ND Scan/ GP REG fail\r\n");
sam_grove 2:3e7685cfb2a7 480 access_point_status=0;
sam_grove 2:3e7685cfb2a7 481 //dnssd_disable(1);
sam_grove 2:3e7685cfb2a7 482 break;
sam_grove 2:3e7685cfb2a7 483
sam_grove 2:3e7685cfb2a7 484 case ARM_NWK_NWK_CONNECTION_DOWN:
sam_grove 2:3e7685cfb2a7 485 /* Connection to Access point is lost wait for Scan Result */
sam_grove 2:3e7685cfb2a7 486 debug("ND/RPL scan new network\r\n");
sam_grove 2:3e7685cfb2a7 487 access_point_status=0;
sam_grove 2:3e7685cfb2a7 488 break;
sam_grove 2:3e7685cfb2a7 489
sam_grove 2:3e7685cfb2a7 490 case ARM_NWK_NWK_PARENT_POLL_FAIL:
sam_grove 2:3e7685cfb2a7 491 access_point_status=0;
sam_grove 2:3e7685cfb2a7 492 break;
sam_grove 2:3e7685cfb2a7 493
sam_grove 2:3e7685cfb2a7 494 case ARM_NWK_AUHTENTICATION_FAIL:
sam_grove 2:3e7685cfb2a7 495 debug("Network authentication fail\r\n");
sam_grove 2:3e7685cfb2a7 496 access_point_status=0;
sam_grove 2:3e7685cfb2a7 497 break;
sam_grove 2:3e7685cfb2a7 498
sam_grove 2:3e7685cfb2a7 499 default:
sam_grove 2:3e7685cfb2a7 500 debug_hex(status); //REVIEW
sam_grove 2:3e7685cfb2a7 501 debug("Unknow event");
sam_grove 2:3e7685cfb2a7 502 break;
sam_grove 2:3e7685cfb2a7 503 }
sam_grove 2:3e7685cfb2a7 504
sam_grove 2:3e7685cfb2a7 505 if(access_point_status == 0)
sam_grove 2:3e7685cfb2a7 506 {
sam_grove 2:3e7685cfb2a7 507 //Set Timer for new Trig
sam_grove 2:3e7685cfb2a7 508 timer_sys_event(RETRY_TIMER, 10000);
sam_grove 2:3e7685cfb2a7 509 }
sam_grove 2:3e7685cfb2a7 510 }
sam_grove 2:3e7685cfb2a7 511
sam_grove 2:3e7685cfb2a7 512
sam_grove 2:3e7685cfb2a7 513 /**
sam_grove 2:3e7685cfb2a7 514 * \brief Handler for events sent to the application.
sam_grove 2:3e7685cfb2a7 515 * \param event received event.
sam_grove 2:3e7685cfb2a7 516 *
sam_grove 2:3e7685cfb2a7 517 * - EV_NETWORK event, Network Event state event handler
sam_grove 2:3e7685cfb2a7 518 * - EV_INIT, Set Certificate Chain list, init multicast, Start net start if NVM have session
sam_grove 2:3e7685cfb2a7 519 * - EV_DEBUG, Terminal handler
sam_grove 2:3e7685cfb2a7 520 */
sam_grove 2:3e7685cfb2a7 521 void tasklet_main(arm_event_s *event)
sam_grove 2:3e7685cfb2a7 522 {
sam_grove 2:3e7685cfb2a7 523 if(event->sender == 0)
sam_grove 2:3e7685cfb2a7 524 {
sam_grove 2:3e7685cfb2a7 525 arm_library_event_type_e event_type;
sam_grove 2:3e7685cfb2a7 526 event_type = (arm_library_event_type_e)event->event_type;
sam_grove 2:3e7685cfb2a7 527
sam_grove 2:3e7685cfb2a7 528 switch(event_type)
sam_grove 2:3e7685cfb2a7 529 {
sam_grove 2:3e7685cfb2a7 530 case ARM_LIB_NWK_INTERFACE_EVENT:
sam_grove 2:3e7685cfb2a7 531 /* Network Event state event handler */
sam_grove 2:3e7685cfb2a7 532 debug("Event: ARM_LIB_NWK_INTERFACE\r\n");
sam_grove 2:3e7685cfb2a7 533 app_parse_network_event(event);
sam_grove 2:3e7685cfb2a7 534 break;
sam_grove 2:3e7685cfb2a7 535
sam_grove 2:3e7685cfb2a7 536 case ARM_LIB_TASKLET_INIT_EVENT:
sam_grove 2:3e7685cfb2a7 537 /*Init event from stack at start-up*/
sam_grove 2:3e7685cfb2a7 538 debug("Event: ARM_LIB_TASKLET_INIT\r\n");
sam_grove 2:3e7685cfb2a7 539 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 540 timer_sys_event(ACCELEROMETER_TIMER, ACCEL_SAMPLE_TIME);
sam_grove 2:3e7685cfb2a7 541 #endif
sam_grove 2:3e7685cfb2a7 542 multicast_set_parameters(10,0,20,3,75 );
sam_grove 2:3e7685cfb2a7 543
sam_grove 2:3e7685cfb2a7 544 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 545 /* open a socket to support control for REMOTE_NODE */
sam_grove 2:3e7685cfb2a7 546 ctrl_udp_socket = socket_open(SOCKET_UDP, SEND_CTRL_UDP_PORT, empty_udp_receive);
sam_grove 2:3e7685cfb2a7 547 #endif
sam_grove 2:3e7685cfb2a7 548
sam_grove 2:3e7685cfb2a7 549 net_6lowpan_id = arm_nwk_interface_init(NET_INTERFACE_RF_6LOWPAN, rf_phy_device_register_id, "6LoWPAN_BORDER_ROUTER");
sam_grove 2:3e7685cfb2a7 550 if(net_6lowpan_id < 0)
sam_grove 2:3e7685cfb2a7 551 {
sam_grove 2:3e7685cfb2a7 552 debug("Interface Generate Fail\r\n");
sam_grove 2:3e7685cfb2a7 553 while(1);
sam_grove 2:3e7685cfb2a7 554 }
sam_grove 2:3e7685cfb2a7 555 else
sam_grove 2:3e7685cfb2a7 556 {
sam_grove 2:3e7685cfb2a7 557 //SET Bootsrap
sam_grove 2:3e7685cfb2a7 558 if(arm_nwk_interface_configure_6lowpan_bootstrap_set(net_6lowpan_id, NET_6LOWPAN_HOST, 1) != 0) // Last parameter enables MLE protocol
sam_grove 2:3e7685cfb2a7 559 {
sam_grove 2:3e7685cfb2a7 560 //Bootsrap SET fail
sam_grove 2:3e7685cfb2a7 561 debug("Bootstrap Fail\r\n");
sam_grove 2:3e7685cfb2a7 562 while(1);
sam_grove 2:3e7685cfb2a7 563 }
sam_grove 2:3e7685cfb2a7 564 else
sam_grove 2:3e7685cfb2a7 565 {
sam_grove 2:3e7685cfb2a7 566 int8_t retval = -1;
sam_grove 2:3e7685cfb2a7 567 arm_nwk_6lowpan_gp_address_mode(net_6lowpan_id, NET_6LOWPAN_GP16_ADDRESS, NODE_SHORT_ADDRESS, 1); // 5 = short address for link-layer // 1 = generate automatically if duplicate address is encountered
sam_grove 2:3e7685cfb2a7 568 arm_nwk_link_layer_security_mode(net_6lowpan_id, NET_SEC_MODE_NO_LINK_SECURITY, 0, 0);
sam_grove 2:3e7685cfb2a7 569 arm_nwk_6lowpan_link_scan_paramameter_set(rf_phy_device_register_id, channel_list, 5);
sam_grove 2:3e7685cfb2a7 570 retval = arm_nwk_interface_up(net_6lowpan_id);
sam_grove 2:3e7685cfb2a7 571 if(retval != 0)
sam_grove 2:3e7685cfb2a7 572 {
sam_grove 2:3e7685cfb2a7 573 //6Lowpan Bootsrap start fail
sam_grove 2:3e7685cfb2a7 574 debug("6LowPAN Bootstrap start Fail\r\n");
sam_grove 2:3e7685cfb2a7 575 while(1);
sam_grove 2:3e7685cfb2a7 576 }
sam_grove 2:3e7685cfb2a7 577 else
sam_grove 2:3e7685cfb2a7 578 {
sam_grove 2:3e7685cfb2a7 579 //6Lowpan Bootsrap start OK
sam_grove 2:3e7685cfb2a7 580 debug("6LowPAN Bootstrap Start OK\r\n");
sam_grove 2:3e7685cfb2a7 581 }
sam_grove 2:3e7685cfb2a7 582 // open sockets
sam_grove 2:3e7685cfb2a7 583 coap_udp_socket = socket_open(SOCKET_UDP, AUDP_SOCKET_PORT, NSDL_receive_socket);
sam_grove 2:3e7685cfb2a7 584 // Start NSDL
sam_grove 2:3e7685cfb2a7 585 nsdl_run();
sam_grove 2:3e7685cfb2a7 586 }
sam_grove 2:3e7685cfb2a7 587 timer_sys_event(NSP_REGISTRATION_TIMER, RD_UPDATE_PERIOD);
sam_grove 0:01fb291427ce 588 }
sam_grove 2:3e7685cfb2a7 589 break;
sam_grove 2:3e7685cfb2a7 590
sam_grove 2:3e7685cfb2a7 591 case ARM_LIB_SYSTEM_TIMER_EVENT:
sam_grove 2:3e7685cfb2a7 592 timer_sys_event_cancel(event->event_id);
sam_grove 2:3e7685cfb2a7 593 if (event->event_id == NSP_REGISTRATION_TIMER)
sam_grove 2:3e7685cfb2a7 594 {
sam_grove 2:3e7685cfb2a7 595 printf("Time to register...\r\n");
sam_grove 2:3e7685cfb2a7 596 NSP_registration();
sam_grove 2:3e7685cfb2a7 597 #if BATTERY
sam_grove 2:3e7685cfb2a7 598 batteryLevel -= 10;
sam_grove 2:3e7685cfb2a7 599 if (batteryLevel == 0)
sam_grove 2:3e7685cfb2a7 600 batteryLevel = 100;
sam_grove 2:3e7685cfb2a7 601 #endif
sam_grove 2:3e7685cfb2a7 602 timer_sys_event(NSP_REGISTRATION_TIMER, RD_UPDATE_PERIOD);
sam_grove 2:3e7685cfb2a7 603 }
sam_grove 2:3e7685cfb2a7 604 else if (event->event_id == RETRY_TIMER)
sam_grove 2:3e7685cfb2a7 605 {
sam_grove 2:3e7685cfb2a7 606 debug("Event: ARM_LIB_SYSTEM_TIMER (event_id = 1)\r\n");
sam_grove 2:3e7685cfb2a7 607 int8_t retval = -1;
sam_grove 2:3e7685cfb2a7 608 retval = arm_nwk_interface_up(net_6lowpan_id);
sam_grove 2:3e7685cfb2a7 609 if(retval != 0)
sam_grove 2:3e7685cfb2a7 610 {
sam_grove 2:3e7685cfb2a7 611 //6Lowpan Bootsrap start fail
sam_grove 2:3e7685cfb2a7 612 debug("6LowPAN Bootstrap Start Failure\r\n");
sam_grove 2:3e7685cfb2a7 613 while(1);
sam_grove 2:3e7685cfb2a7 614 }
sam_grove 2:3e7685cfb2a7 615 else
sam_grove 2:3e7685cfb2a7 616 {
sam_grove 2:3e7685cfb2a7 617 //6Lowpan Bootsrap start OK
sam_grove 2:3e7685cfb2a7 618 debug("6LowPAN Bootstrap Start OK\r\n");
sam_grove 2:3e7685cfb2a7 619 }
sam_grove 2:3e7685cfb2a7 620 }
sam_grove 2:3e7685cfb2a7 621 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 622 else if (event->event_id == ACCELEROMETER_TIMER)
sam_grove 2:3e7685cfb2a7 623 {
sam_grove 2:3e7685cfb2a7 624 if (accel.getAccX() < -0.85f && accel_enable)
sam_grove 2:3e7685cfb2a7 625 {
sam_grove 2:3e7685cfb2a7 626 accel_enable = 0;
sam_grove 2:3e7685cfb2a7 627 update_LED();
sam_grove 2:3e7685cfb2a7 628 }
sam_grove 2:3e7685cfb2a7 629 if (accel.getAccX() > -0.35f)
sam_grove 2:3e7685cfb2a7 630 accel_enable = 1;
sam_grove 2:3e7685cfb2a7 631
sam_grove 2:3e7685cfb2a7 632 timer_sys_event(ACCELEROMETER_TIMER, ACCEL_SAMPLE_TIME);
sam_grove 2:3e7685cfb2a7 633 }
sam_grove 2:3e7685cfb2a7 634 #endif
sam_grove 3:a38ad504a18c 635
sam_grove 2:3e7685cfb2a7 636 break;
sam_grove 2:3e7685cfb2a7 637
sam_grove 2:3e7685cfb2a7 638 default:
sam_grove 2:3e7685cfb2a7 639 break;
sam_grove 2:3e7685cfb2a7 640 }
sam_grove 2:3e7685cfb2a7 641 }
sam_grove 2:3e7685cfb2a7 642 }
sam_grove 2:3e7685cfb2a7 643
sam_grove 2:3e7685cfb2a7 644 void NSDL_receive_socket(void * cb)
sam_grove 2:3e7685cfb2a7 645 {
sam_grove 2:3e7685cfb2a7 646 socket_callback_t * cb_res =0;
sam_grove 2:3e7685cfb2a7 647 int16_t length;
sam_grove 2:3e7685cfb2a7 648 cb_res = (socket_callback_t *) cb;
sam_grove 2:3e7685cfb2a7 649 uint8_t *payload;
sam_grove 2:3e7685cfb2a7 650
sam_grove 2:3e7685cfb2a7 651 if(cb_res->event_type == SOCKET_DATA)
sam_grove 2:3e7685cfb2a7 652 {
sam_grove 2:3e7685cfb2a7 653 debug("LINK LQI:");
sam_grove 2:3e7685cfb2a7 654 debug_hex(cb_res->LINK_LQI);
sam_grove 2:3e7685cfb2a7 655 create_lqi_resource(cb_res->LINK_LQI);
sam_grove 2:3e7685cfb2a7 656 debug("\r\n");
sam_grove 2:3e7685cfb2a7 657
sam_grove 2:3e7685cfb2a7 658 if ( cb_res->d_len > 0)
sam_grove 2:3e7685cfb2a7 659 {
sam_grove 2:3e7685cfb2a7 660 payload = (uint8_t *) own_alloc(cb_res->d_len);
sam_grove 2:3e7685cfb2a7 661 if(payload)
sam_grove 2:3e7685cfb2a7 662 {
sam_grove 2:3e7685cfb2a7 663 //Read data to the RX buffer
sam_grove 2:3e7685cfb2a7 664 length = socket_read(cb_res->socket_id, &app_src, payload, cb_res->d_len); //replace rx_buffer payload
sam_grove 2:3e7685cfb2a7 665 if(length)
sam_grove 2:3e7685cfb2a7 666 {
sam_grove 2:3e7685cfb2a7 667 if(cb_res->socket_id == coap_udp_socket)
sam_grove 2:3e7685cfb2a7 668 {
sam_grove 2:3e7685cfb2a7 669 // Handles data received in UDP socket
sam_grove 2:3e7685cfb2a7 670 // Call application protocol parser.
sam_grove 2:3e7685cfb2a7 671 sn_addr_s.type = SN_NSDL_ADDRESS_TYPE_IPV6;
sam_grove 2:3e7685cfb2a7 672 sn_addr_s.addr_len = 16;
sam_grove 2:3e7685cfb2a7 673 sn_addr_s.port = app_src.identifier;
sam_grove 2:3e7685cfb2a7 674 sn_addr_s.addr_ptr = app_src.address;
sam_grove 2:3e7685cfb2a7 675 printf("Data 1\r\n");
sam_grove 2:3e7685cfb2a7 676 if(sn_nsdl_process_coap(payload, length, &sn_addr_s)) // 0= ok, -1=failure
sam_grove 2:3e7685cfb2a7 677 {
sam_grove 2:3e7685cfb2a7 678 debug("Error processing CoAP packet\r\n");
sam_grove 2:3e7685cfb2a7 679 }
sam_grove 2:3e7685cfb2a7 680 printf("Data 4\r\n");
sam_grove 2:3e7685cfb2a7 681 }
sam_grove 2:3e7685cfb2a7 682 }
sam_grove 2:3e7685cfb2a7 683 own_free(payload);
sam_grove 2:3e7685cfb2a7 684 }
sam_grove 2:3e7685cfb2a7 685 }
sam_grove 2:3e7685cfb2a7 686 }
sam_grove 2:3e7685cfb2a7 687 #if 1 // enabled for debug
sam_grove 2:3e7685cfb2a7 688 else if(cb_res->event_type == SOCKET_TX_DONE)
sam_grove 2:3e7685cfb2a7 689 {
sam_grove 2:3e7685cfb2a7 690 //debug("*");
sam_grove 2:3e7685cfb2a7 691 }
sam_grove 2:3e7685cfb2a7 692 else if(cb_res->event_type == SOCKET_NO_ROUTE)
sam_grove 2:3e7685cfb2a7 693 {
sam_grove 2:3e7685cfb2a7 694 debug("SOCKET_NO_ROUTE\r\n");
sam_grove 2:3e7685cfb2a7 695 }
sam_grove 2:3e7685cfb2a7 696 else if(cb_res->event_type == SOCKET_TX_FAIL)
sam_grove 2:3e7685cfb2a7 697 {
sam_grove 2:3e7685cfb2a7 698 debug("SOCKET_TX_FAIL\r\n");
sam_grove 2:3e7685cfb2a7 699 }
sam_grove 2:3e7685cfb2a7 700 #endif
sam_grove 2:3e7685cfb2a7 701 }
sam_grove 2:3e7685cfb2a7 702
sam_grove 2:3e7685cfb2a7 703 #if NODE_CONTROLLER
sam_grove 2:3e7685cfb2a7 704 void ctrl_udp_send(uint8_t cmd)
sam_grove 2:3e7685cfb2a7 705 {
sam_grove 2:3e7685cfb2a7 706 uint8_t * payload = 0;
sam_grove 2:3e7685cfb2a7 707 ns_address_t address;
sam_grove 2:3e7685cfb2a7 708 /*SET UDP echo Port*/
sam_grove 2:3e7685cfb2a7 709 address.identifier = RECV_CTRL_UDP_PORT;
sam_grove 2:3e7685cfb2a7 710
sam_grove 2:3e7685cfb2a7 711 uint8_t node_address[16] = REMOTE_NODE;
sam_grove 2:3e7685cfb2a7 712
sam_grove 2:3e7685cfb2a7 713 payload = (uint8_t *) ns_dyn_mem_alloc(1);
sam_grove 2:3e7685cfb2a7 714 if(payload)
sam_grove 2:3e7685cfb2a7 715 {
sam_grove 2:3e7685cfb2a7 716 uint8_t *ptr = payload;
sam_grove 2:3e7685cfb2a7 717
sam_grove 2:3e7685cfb2a7 718 memcpy(address.address,node_address,16);
sam_grove 2:3e7685cfb2a7 719 address.type = ADDRESS_IPV6;
sam_grove 2:3e7685cfb2a7 720 *ptr = cmd;
sam_grove 2:3e7685cfb2a7 721 if(socket_sendto(ctrl_udp_socket, &address, payload, (1)) != 0)
sam_grove 2:3e7685cfb2a7 722 {
sam_grove 2:3e7685cfb2a7 723 debug("Ctrl UDP Failed\r\n");
sam_grove 2:3e7685cfb2a7 724 }
sam_grove 2:3e7685cfb2a7 725 else
sam_grove 2:3e7685cfb2a7 726 {
sam_grove 2:3e7685cfb2a7 727 debug("Ctrl UDP Ok\r\n");
sam_grove 2:3e7685cfb2a7 728 }
sam_grove 2:3e7685cfb2a7 729 ns_dyn_mem_free(payload);
sam_grove 2:3e7685cfb2a7 730 }
sam_grove 2:3e7685cfb2a7 731 else
sam_grove 2:3e7685cfb2a7 732 {
sam_grove 2:3e7685cfb2a7 733 debug("No Heap for Ctrl UDP\r\n");
sam_grove 2:3e7685cfb2a7 734 }
sam_grove 2:3e7685cfb2a7 735 }
sam_grove 2:3e7685cfb2a7 736 // we don't expect to receive data
sam_grove 2:3e7685cfb2a7 737 void empty_udp_receive(void * cb) {
sam_grove 2:3e7685cfb2a7 738
sam_grove 2:3e7685cfb2a7 739 }
sam_grove 2:3e7685cfb2a7 740 #endif
sam_grove 2:3e7685cfb2a7 741