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:
Mon Apr 07 09:29:11 2014 +0000
Revision:
17:8ca4a5801430
Child:
18:c1a2c0c738b2
Working w/o Rtos;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
erigow01 17:8ca4a5801430 1 // Pressure Mat resource implementation
erigow01 17:8ca4a5801430 2
erigow01 17:8ca4a5801430 3 #include "mbed.h"
erigow01 17:8ca4a5801430 4 #include "nsdl_support.h"
erigow01 17:8ca4a5801430 5 #include "pressure_mat.h"
erigow01 17:8ca4a5801430 6
erigow01 17:8ca4a5801430 7 #define PRESSURE_MAT_RES_ID "sen/pressure_mat"
erigow01 17:8ca4a5801430 8
erigow01 17:8ca4a5801430 9 //DigitalIn pressure_mat_in(PTD3);
erigow01 17:8ca4a5801430 10 InterruptIn pressure_mat_in(PTD3);
erigow01 17:8ca4a5801430 11 DigitalOut led1(LED1);
erigow01 17:8ca4a5801430 12 Timer debounce;
erigow01 17:8ca4a5801430 13 /* stored data for observable resource */
erigow01 17:8ca4a5801430 14 static uint8_t obs_number = 0;
erigow01 17:8ca4a5801430 15 static uint8_t *obs_token_ptr = NULL;
erigow01 17:8ca4a5801430 16 static uint8_t obs_token_len = 0;
erigow01 17:8ca4a5801430 17 static uint8_t current_pressure_mat = 0;
erigow01 17:8ca4a5801430 18 static uint8_t last_reported_pressure_mat = 99;
erigow01 17:8ca4a5801430 19 static char pressure_mat_val[2];
erigow01 17:8ca4a5801430 20
erigow01 17:8ca4a5801430 21
erigow01 17:8ca4a5801430 22 /* Interrupt handler for pressure mat pin */
erigow01 17:8ca4a5801430 23 /* Handles Interrupt, sets state for main polling thread to send update message. */
erigow01 17:8ca4a5801430 24 void pressure_mat_interrupt(){
erigow01 17:8ca4a5801430 25 if(debounce.read_ms() > 200) {
erigow01 17:8ca4a5801430 26 led1 = pressure_mat_in;
erigow01 17:8ca4a5801430 27 current_pressure_mat = pressure_mat_in;
erigow01 17:8ca4a5801430 28 debounce.reset();
erigow01 17:8ca4a5801430 29 }
erigow01 17:8ca4a5801430 30 }
erigow01 17:8ca4a5801430 31
erigow01 17:8ca4a5801430 32 //This is to be called from main program loop... it only sends report if the pressure mat has changed.
erigow01 17:8ca4a5801430 33 void pressure_mat_report() {
erigow01 17:8ca4a5801430 34 if(last_reported_pressure_mat != current_pressure_mat) {
erigow01 17:8ca4a5801430 35 if(obs_number != 0){// && obs_token_ptr != NULL){
erigow01 17:8ca4a5801430 36 obs_number++;
erigow01 17:8ca4a5801430 37 snprintf(pressure_mat_val,2,"%d" ,current_pressure_mat);
erigow01 17:8ca4a5801430 38 if(sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t*)pressure_mat_val, 1, &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0) == 0)
erigow01 17:8ca4a5801430 39 printf("Pressure Observation Sending Failed\r\n");
erigow01 17:8ca4a5801430 40 else
erigow01 17:8ca4a5801430 41 printf("Pressure Observation Sent\r\n");
erigow01 17:8ca4a5801430 42
erigow01 17:8ca4a5801430 43 //Set last reported to current regardless...
erigow01 17:8ca4a5801430 44 last_reported_pressure_mat = current_pressure_mat;
erigow01 17:8ca4a5801430 45 }
erigow01 17:8ca4a5801430 46 }
erigow01 17:8ca4a5801430 47 }
erigow01 17:8ca4a5801430 48
erigow01 17:8ca4a5801430 49 /* Only GET method allowed */
erigow01 17:8ca4a5801430 50 /* Observable resource */
erigow01 17:8ca4a5801430 51 static uint8_t pressure_mat_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
erigow01 17:8ca4a5801430 52 {
erigow01 17:8ca4a5801430 53 uint8_t pressure_mat_reading = pressure_mat_in;
erigow01 17:8ca4a5801430 54 snprintf(pressure_mat_val,2,"%d" ,pressure_mat_reading);
erigow01 17:8ca4a5801430 55 sn_coap_hdr_s *coap_res_ptr = 0;
erigow01 17:8ca4a5801430 56
erigow01 17:8ca4a5801430 57 printf("pressure mat callback\r\n");
erigow01 17:8ca4a5801430 58 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
erigow01 17:8ca4a5801430 59
erigow01 17:8ca4a5801430 60 coap_res_ptr->payload_len = 1;
erigow01 17:8ca4a5801430 61 coap_res_ptr->payload_ptr = (uint8_t*)pressure_mat_val;
erigow01 17:8ca4a5801430 62
erigow01 17:8ca4a5801430 63 if(received_coap_ptr->token_ptr)
erigow01 17:8ca4a5801430 64 {
erigow01 17:8ca4a5801430 65 printf(" Token included\r\n");
erigow01 17:8ca4a5801430 66 if(obs_token_ptr)
erigow01 17:8ca4a5801430 67 {
erigow01 17:8ca4a5801430 68 free(obs_token_ptr);
erigow01 17:8ca4a5801430 69 obs_token_ptr = 0;
erigow01 17:8ca4a5801430 70 }
erigow01 17:8ca4a5801430 71 obs_token_ptr = (uint8_t*)malloc(received_coap_ptr->token_len);
erigow01 17:8ca4a5801430 72 if(obs_token_ptr)
erigow01 17:8ca4a5801430 73 {
erigow01 17:8ca4a5801430 74 memcpy(obs_token_ptr, received_coap_ptr->token_ptr, received_coap_ptr->token_len);
erigow01 17:8ca4a5801430 75 obs_token_len = received_coap_ptr->token_len;
erigow01 17:8ca4a5801430 76 }
erigow01 17:8ca4a5801430 77 }
erigow01 17:8ca4a5801430 78
erigow01 17:8ca4a5801430 79 if(received_coap_ptr->options_list_ptr->observe)
erigow01 17:8ca4a5801430 80 {
erigow01 17:8ca4a5801430 81 coap_res_ptr->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
erigow01 17:8ca4a5801430 82 memset(coap_res_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
erigow01 17:8ca4a5801430 83 coap_res_ptr->options_list_ptr->observe_ptr = &obs_number;
erigow01 17:8ca4a5801430 84 coap_res_ptr->options_list_ptr->observe_len = 1;
erigow01 17:8ca4a5801430 85 obs_number++;
erigow01 17:8ca4a5801430 86 }
erigow01 17:8ca4a5801430 87 printf(" Send observation %d... \r\n", obs_number);
erigow01 17:8ca4a5801430 88 sn_nsdl_send_coap_message(address, coap_res_ptr);
erigow01 17:8ca4a5801430 89
erigow01 17:8ca4a5801430 90 coap_res_ptr->options_list_ptr->observe_ptr = 0;
erigow01 17:8ca4a5801430 91 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
erigow01 17:8ca4a5801430 92 return 0;
erigow01 17:8ca4a5801430 93 }
erigow01 17:8ca4a5801430 94
erigow01 17:8ca4a5801430 95 int create_pressure_mat_resource(sn_nsdl_resource_info_s *resource_ptr)
erigow01 17:8ca4a5801430 96 {
erigow01 17:8ca4a5801430 97 nsdl_create_dynamic_resource(resource_ptr, sizeof(PRESSURE_MAT_RES_ID)-1, (uint8_t*)PRESSURE_MAT_RES_ID, 0, 0, 1, &pressure_mat_resource_cb, SN_GRS_GET_ALLOWED);
erigow01 17:8ca4a5801430 98 obs_number++;
erigow01 17:8ca4a5801430 99
erigow01 17:8ca4a5801430 100 //Attach interrupt handler and start debounce...
erigow01 17:8ca4a5801430 101 debounce.start();
erigow01 17:8ca4a5801430 102 pressure_mat_in.rise(&pressure_mat_interrupt);
erigow01 17:8ca4a5801430 103 pressure_mat_in.fall(&pressure_mat_interrupt);
erigow01 17:8ca4a5801430 104
erigow01 17:8ca4a5801430 105 return 0;
erigow01 17:8ca4a5801430 106 }