Initial commit

Dependencies:   Chainable_RGB_LED EthernetInterface LED_Bar mbed-rtos mbed nsdl_lib

Committer:
michaeljkoster
Date:
Thu Oct 30 21:44:12 2014 +0000
Revision:
0:950566b0e099
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
michaeljkoster 0:950566b0e099 1 // Light resource implementation
michaeljkoster 0:950566b0e099 2
michaeljkoster 0:950566b0e099 3 #include "mbed.h"
michaeljkoster 0:950566b0e099 4 #include "nsdl_support.h"
michaeljkoster 0:950566b0e099 5 #include "ChainableLED.h"
michaeljkoster 0:950566b0e099 6 #include "LED_array.h"
michaeljkoster 0:950566b0e099 7
michaeljkoster 0:950566b0e099 8 #define LED_ARRAY_RES_ID "11100/0/5900"
michaeljkoster 0:950566b0e099 9 #define LED_ARRAY_RES_RT "urn:X-mbed:LEDarray"
michaeljkoster 0:950566b0e099 10
michaeljkoster 0:950566b0e099 11 extern Serial pc;
michaeljkoster 0:950566b0e099 12 char led_value[] = {"0000000"}; //RRGGBBII
michaeljkoster 0:950566b0e099 13
michaeljkoster 0:950566b0e099 14 #define LED_COUNT 1
michaeljkoster 0:950566b0e099 15
michaeljkoster 0:950566b0e099 16 ChainableLED led_chain(P0_0, P0_1, LED_COUNT);
michaeljkoster 0:950566b0e099 17
michaeljkoster 0:950566b0e099 18 uint8_t LED_array_max_age = 0;
michaeljkoster 0:950566b0e099 19 uint8_t LED_array_content_type = 0;
michaeljkoster 0:950566b0e099 20
michaeljkoster 0:950566b0e099 21 void set_led_array(char *color_string)
michaeljkoster 0:950566b0e099 22 {
michaeljkoster 0:950566b0e099 23 static uint8_t red, green, blue, index;
michaeljkoster 0:950566b0e099 24 int color_int;
michaeljkoster 0:950566b0e099 25
michaeljkoster 0:950566b0e099 26 sscanf(color_string, "%X", &color_int);
michaeljkoster 0:950566b0e099 27
michaeljkoster 0:950566b0e099 28 index = color_int & 255;
michaeljkoster 0:950566b0e099 29 blue = color_int >> 8 & 255;
michaeljkoster 0:950566b0e099 30 green = color_int >> 16 & 255;
michaeljkoster 0:950566b0e099 31 red = color_int >> 24 & 255;
michaeljkoster 0:950566b0e099 32
michaeljkoster 0:950566b0e099 33 if(index > 0 and index <= LED_COUNT)
michaeljkoster 0:950566b0e099 34 {
michaeljkoster 0:950566b0e099 35 led_chain.setColorRGB(index-1, red, green, blue);
michaeljkoster 0:950566b0e099 36 }
michaeljkoster 0:950566b0e099 37 else if(index == 0)
michaeljkoster 0:950566b0e099 38 {
michaeljkoster 0:950566b0e099 39 for(int i = 0; i < LED_COUNT; i++)
michaeljkoster 0:950566b0e099 40 {
michaeljkoster 0:950566b0e099 41 led_chain.setColorRGB(i, red, green, blue);
michaeljkoster 0:950566b0e099 42 }
michaeljkoster 0:950566b0e099 43 }
michaeljkoster 0:950566b0e099 44 }
michaeljkoster 0:950566b0e099 45
michaeljkoster 0:950566b0e099 46
michaeljkoster 0:950566b0e099 47 /* Only GET and PUT method allowed */
michaeljkoster 0:950566b0e099 48 static uint8_t LED_array_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
michaeljkoster 0:950566b0e099 49 {
michaeljkoster 0:950566b0e099 50 sn_coap_hdr_s *coap_res_ptr = 0;
michaeljkoster 0:950566b0e099 51
michaeljkoster 0:950566b0e099 52 //pc.printf("LED array callback\r\n");
michaeljkoster 0:950566b0e099 53
michaeljkoster 0:950566b0e099 54 if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET)
michaeljkoster 0:950566b0e099 55 {
michaeljkoster 0:950566b0e099 56 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
michaeljkoster 0:950566b0e099 57
michaeljkoster 0:950566b0e099 58 coap_res_ptr->payload_len = strlen(led_value);
michaeljkoster 0:950566b0e099 59 coap_res_ptr->payload_ptr = (uint8_t*)led_value;
michaeljkoster 0:950566b0e099 60
michaeljkoster 0:950566b0e099 61 coap_res_ptr->content_type_ptr = &LED_array_content_type;
michaeljkoster 0:950566b0e099 62 coap_res_ptr->content_type_len = sizeof(LED_array_content_type);
michaeljkoster 0:950566b0e099 63
michaeljkoster 0:950566b0e099 64 coap_res_ptr->options_list_ptr = (sn_coap_options_list_s*)nsdl_alloc(sizeof(sn_coap_options_list_s));
michaeljkoster 0:950566b0e099 65 if(!coap_res_ptr->options_list_ptr)
michaeljkoster 0:950566b0e099 66 {
michaeljkoster 0:950566b0e099 67 pc.printf("cant alloc option list for max-age\r\n");
michaeljkoster 0:950566b0e099 68 coap_res_ptr->options_list_ptr = NULL; //FIXME report error and recover
michaeljkoster 0:950566b0e099 69 }
michaeljkoster 0:950566b0e099 70 memset(coap_res_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
michaeljkoster 0:950566b0e099 71 coap_res_ptr->options_list_ptr->max_age_ptr = &LED_array_max_age;
michaeljkoster 0:950566b0e099 72 coap_res_ptr->options_list_ptr->max_age_len = sizeof(LED_array_max_age);
michaeljkoster 0:950566b0e099 73
michaeljkoster 0:950566b0e099 74 sn_nsdl_send_coap_message(address, coap_res_ptr);
michaeljkoster 0:950566b0e099 75 nsdl_free(coap_res_ptr->options_list_ptr);
michaeljkoster 0:950566b0e099 76 coap_res_ptr->options_list_ptr = NULL;
michaeljkoster 0:950566b0e099 77 coap_res_ptr->content_type_ptr = NULL;// parser_release below tries to free this memory
michaeljkoster 0:950566b0e099 78
michaeljkoster 0:950566b0e099 79 }
michaeljkoster 0:950566b0e099 80 else if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT)
michaeljkoster 0:950566b0e099 81 {
michaeljkoster 0:950566b0e099 82 //pc.printf("PUT: %d bytes\r\n", received_coap_ptr->payload_len);
michaeljkoster 0:950566b0e099 83 if(received_coap_ptr->payload_len == 8)
michaeljkoster 0:950566b0e099 84 {
michaeljkoster 0:950566b0e099 85 memcpy(led_value, (char *)received_coap_ptr->payload_ptr, received_coap_ptr->payload_len);
michaeljkoster 0:950566b0e099 86
michaeljkoster 0:950566b0e099 87 led_value[received_coap_ptr->payload_len] = '\0';
michaeljkoster 0:950566b0e099 88 pc.printf("PUT: %s\r\n",led_value);
michaeljkoster 0:950566b0e099 89
michaeljkoster 0:950566b0e099 90 //call LED array update function here
michaeljkoster 0:950566b0e099 91 set_led_array(led_value);
michaeljkoster 0:950566b0e099 92
michaeljkoster 0:950566b0e099 93 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
michaeljkoster 0:950566b0e099 94 sn_nsdl_send_coap_message(address, coap_res_ptr);
michaeljkoster 0:950566b0e099 95 }
michaeljkoster 0:950566b0e099 96 }
michaeljkoster 0:950566b0e099 97
michaeljkoster 0:950566b0e099 98 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
michaeljkoster 0:950566b0e099 99 return 0;
michaeljkoster 0:950566b0e099 100 }
michaeljkoster 0:950566b0e099 101
michaeljkoster 0:950566b0e099 102 int create_LED_array_resource(sn_nsdl_resource_info_s *resource_ptr)
michaeljkoster 0:950566b0e099 103 {
michaeljkoster 0:950566b0e099 104 nsdl_create_dynamic_resource(resource_ptr, sizeof(LED_ARRAY_RES_ID)-1, (uint8_t*)LED_ARRAY_RES_ID, sizeof(LED_ARRAY_RES_RT)-1, (uint8_t*)LED_ARRAY_RES_RT, 0, &LED_array_resource_cb, (SN_GRS_GET_ALLOWED | SN_GRS_PUT_ALLOWED));
michaeljkoster 0:950566b0e099 105 set_led_array("FF000000");
michaeljkoster 0:950566b0e099 106 wait(0.5);
michaeljkoster 0:950566b0e099 107 set_led_array("00FF0000");
michaeljkoster 0:950566b0e099 108 wait(0.5);
michaeljkoster 0:950566b0e099 109 set_led_array("0000FF00");
michaeljkoster 0:950566b0e099 110 wait(0.5);
michaeljkoster 0:950566b0e099 111 set_led_array("00000000");
michaeljkoster 0:950566b0e099 112
michaeljkoster 0:950566b0e099 113
michaeljkoster 0:950566b0e099 114 return 0;
michaeljkoster 0:950566b0e099 115 }