Libarary of sensor resources for mbed Device Service. Requires NSDL Support Libarary, etc.

Dependents:   mbed-IBooth-ETH

Committer:
erigow01
Date:
Wed Dec 10 14:08:28 2014 +0000
Revision:
0:fe416b02628b
Child:
4:bc54f10b3234
Initial Check-in

Who changed what in which revision?

UserRevisionLine numberNew contents of line
erigow01 0:fe416b02628b 1 // door_trip (from Sharpir) sensor resource implementation
erigow01 0:fe416b02628b 2
erigow01 0:fe416b02628b 3 #include "mbed.h"
erigow01 0:fe416b02628b 4 #include "nsdl_support.h"
erigow01 0:fe416b02628b 5 #include "sensor_ctl.h"
erigow01 0:fe416b02628b 6 #include "node_cfg.h"
erigow01 0:fe416b02628b 7
erigow01 0:fe416b02628b 8 #define DOOR_TRIP_RES_ID "/sen/door/trip"
erigow01 0:fe416b02628b 9 #define DOOR_TRIP_RES_RT "Door Trip"
erigow01 0:fe416b02628b 10
erigow01 0:fe416b02628b 11
erigow01 0:fe416b02628b 12 #if NODE_DOOR_TRIP_STATION
erigow01 0:fe416b02628b 13 extern bool current_door_trip_value;
erigow01 0:fe416b02628b 14 static char door_trip_val[2];
erigow01 0:fe416b02628b 15 static uint8_t max_age = 0;
erigow01 0:fe416b02628b 16 static uint8_t content_type = 50;
erigow01 0:fe416b02628b 17
erigow01 0:fe416b02628b 18 static uint8_t obs_number = 0;
erigow01 0:fe416b02628b 19 static uint8_t *obs_token_ptr = NULL;
erigow01 0:fe416b02628b 20 static uint8_t obs_token_len = 0;
erigow01 0:fe416b02628b 21
erigow01 0:fe416b02628b 22
erigow01 0:fe416b02628b 23 //This is to be called from main program loop... it only sends report if door tripped.
erigow01 0:fe416b02628b 24 void door_trip_report() {
erigow01 0:fe416b02628b 25 if(obs_number != 0){
erigow01 0:fe416b02628b 26 obs_number++;
erigow01 0:fe416b02628b 27 snprintf(door_trip_val,2,"%d" ,current_door_trip_value);
erigow01 0:fe416b02628b 28 if(sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t*)door_trip_val, 1, &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0) == 0) {
erigow01 0:fe416b02628b 29 printf("Door Trip Observation Sending Failed\r\n");
erigow01 0:fe416b02628b 30 } else {
erigow01 0:fe416b02628b 31 printf("Door Trip Observation Sent\r\n");
erigow01 0:fe416b02628b 32 }
erigow01 0:fe416b02628b 33 }
erigow01 0:fe416b02628b 34 }
erigow01 0:fe416b02628b 35
erigow01 0:fe416b02628b 36
erigow01 0:fe416b02628b 37
erigow01 0:fe416b02628b 38 /* Only GET method allowed */
erigow01 0:fe416b02628b 39 static uint8_t door_trip_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
erigow01 0:fe416b02628b 40 {
erigow01 0:fe416b02628b 41 sn_coap_hdr_s *coap_res_ptr = 0;
erigow01 0:fe416b02628b 42 snprintf(door_trip_val,2,"%d" ,current_door_trip_value);
erigow01 0:fe416b02628b 43 printf("door_trip callback\r\n");
erigow01 0:fe416b02628b 44 printf("door_trip: %s\r\n", door_trip_val);
erigow01 0:fe416b02628b 45
erigow01 0:fe416b02628b 46 if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET)
erigow01 0:fe416b02628b 47 {
erigow01 0:fe416b02628b 48 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
erigow01 0:fe416b02628b 49
erigow01 0:fe416b02628b 50 coap_res_ptr->payload_len = strlen(door_trip_val);
erigow01 0:fe416b02628b 51 coap_res_ptr->payload_ptr = (uint8_t*)door_trip_val;
erigow01 0:fe416b02628b 52
erigow01 0:fe416b02628b 53 coap_res_ptr->content_type_ptr = &content_type;
erigow01 0:fe416b02628b 54 coap_res_ptr->content_type_len = sizeof(content_type);
erigow01 0:fe416b02628b 55
erigow01 0:fe416b02628b 56
erigow01 0:fe416b02628b 57 if(received_coap_ptr->token_ptr){
erigow01 0:fe416b02628b 58 printf(" Token included\r\n");
erigow01 0:fe416b02628b 59 if(obs_token_ptr)
erigow01 0:fe416b02628b 60 {
erigow01 0:fe416b02628b 61 free(obs_token_ptr);
erigow01 0:fe416b02628b 62 obs_token_ptr = 0;
erigow01 0:fe416b02628b 63 }
erigow01 0:fe416b02628b 64 obs_token_ptr = (uint8_t*)malloc(received_coap_ptr->token_len);
erigow01 0:fe416b02628b 65 if(obs_token_ptr){
erigow01 0:fe416b02628b 66 memcpy(obs_token_ptr, received_coap_ptr->token_ptr, received_coap_ptr->token_len);
erigow01 0:fe416b02628b 67 obs_token_len = received_coap_ptr->token_len;
erigow01 0:fe416b02628b 68 }
erigow01 0:fe416b02628b 69 }
erigow01 0:fe416b02628b 70
erigow01 0:fe416b02628b 71 if(received_coap_ptr->options_list_ptr->observe){
erigow01 0:fe416b02628b 72 coap_res_ptr->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
erigow01 0:fe416b02628b 73 memset(coap_res_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
erigow01 0:fe416b02628b 74 coap_res_ptr->options_list_ptr->observe_ptr = &obs_number;
erigow01 0:fe416b02628b 75 coap_res_ptr->options_list_ptr->observe_len = 1;
erigow01 0:fe416b02628b 76 obs_number++;
erigow01 0:fe416b02628b 77 }
erigow01 0:fe416b02628b 78 printf(" Send observation %d... \r\n", obs_number);
erigow01 0:fe416b02628b 79
erigow01 0:fe416b02628b 80 sn_nsdl_send_coap_message(address, coap_res_ptr);
erigow01 0:fe416b02628b 81 nsdl_free(coap_res_ptr->options_list_ptr);
erigow01 0:fe416b02628b 82 coap_res_ptr->options_list_ptr = NULL;
erigow01 0:fe416b02628b 83 coap_res_ptr->content_type_ptr = NULL;// parser_release below tries to free this memory
erigow01 0:fe416b02628b 84
erigow01 0:fe416b02628b 85 }
erigow01 0:fe416b02628b 86
erigow01 0:fe416b02628b 87 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
erigow01 0:fe416b02628b 88
erigow01 0:fe416b02628b 89 return 0;
erigow01 0:fe416b02628b 90 }
erigow01 0:fe416b02628b 91
erigow01 0:fe416b02628b 92 int create_door_trip_resource(sn_nsdl_resource_info_s *resource_ptr)
erigow01 0:fe416b02628b 93 {
erigow01 0:fe416b02628b 94 obs_number++;
erigow01 0:fe416b02628b 95 nsdl_create_dynamic_resource(resource_ptr, sizeof(DOOR_TRIP_RES_ID)-1, (uint8_t*)DOOR_TRIP_RES_ID, sizeof(DOOR_TRIP_RES_RT)-1, (uint8_t*)DOOR_TRIP_RES_RT, 1, &door_trip_resource_cb, (SN_GRS_GET_ALLOWED));
erigow01 0:fe416b02628b 96 return 0;
erigow01 0:fe416b02628b 97 }
erigow01 0:fe416b02628b 98 #endif