adding resources firmware and 1/0/8
Dependencies: Beep C12832_lcd EthernetInterface EthernetNetIf HTTPClient LM75B MMA7660 mbed-rtos mbed nsdl_lib
Fork of LWM2M_NanoService_Ethernet by
resources/firmware.cpp@21:978281bfb26e, 2015-10-27 (annotated)
- Committer:
- pnysten
- Date:
- Tue Oct 27 07:11:46 2015 +0000
- Revision:
- 21:978281bfb26e
1/0/8
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pnysten | 21:978281bfb26e | 1 | // Light resource implementation |
pnysten | 21:978281bfb26e | 2 | |
pnysten | 21:978281bfb26e | 3 | #include "mbed.h" |
pnysten | 21:978281bfb26e | 4 | #include "nsdl_support.h" |
pnysten | 21:978281bfb26e | 5 | #include "EthernetInterface.h" |
pnysten | 21:978281bfb26e | 6 | #include "firmware.h" |
pnysten | 21:978281bfb26e | 7 | #include "firmware_status.h" |
pnysten | 21:978281bfb26e | 8 | #include "firmware_result.h" |
pnysten | 21:978281bfb26e | 9 | #include "HTTPClient.h" |
pnysten | 21:978281bfb26e | 10 | #include "C12832_lcd.h" |
pnysten | 21:978281bfb26e | 11 | |
pnysten | 21:978281bfb26e | 12 | #define FIRMWARE_WRITE_RES_ID "5/0/1" |
pnysten | 21:978281bfb26e | 13 | //5/0/1 should be used instead |
pnysten | 21:978281bfb26e | 14 | |
pnysten | 21:978281bfb26e | 15 | static C12832_LCD lcd; |
pnysten | 21:978281bfb26e | 16 | extern Serial pc; |
pnysten | 21:978281bfb26e | 17 | extern "C" void mbed_reset(); |
pnysten | 21:978281bfb26e | 18 | |
pnysten | 21:978281bfb26e | 19 | LocalFileSystem local("local"); |
pnysten | 21:978281bfb26e | 20 | HTTPClient client; |
pnysten | 21:978281bfb26e | 21 | |
pnysten | 21:978281bfb26e | 22 | char *remove_ext(char *dst, const char *filename) { |
pnysten | 21:978281bfb26e | 23 | size_t len = strlen(filename); |
pnysten | 21:978281bfb26e | 24 | memcpy(dst, filename, len-3); |
pnysten | 21:978281bfb26e | 25 | dst[len - 3] = 0; |
pnysten | 21:978281bfb26e | 26 | return dst; |
pnysten | 21:978281bfb26e | 27 | } |
pnysten | 21:978281bfb26e | 28 | |
pnysten | 21:978281bfb26e | 29 | /* Only PUT method allowed */ |
pnysten | 21:978281bfb26e | 30 | static uint8_t firmware_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto) |
pnysten | 21:978281bfb26e | 31 | { |
pnysten | 21:978281bfb26e | 32 | sn_coap_hdr_s *coap_res_ptr = 0; |
pnysten | 21:978281bfb26e | 33 | pc.printf("Firmware updating\r\n"); |
pnysten | 21:978281bfb26e | 34 | lcd.locate(0,0); |
pnysten | 21:978281bfb26e | 35 | lcd.printf("Firmware Upgrade...\n"); |
pnysten | 21:978281bfb26e | 36 | |
pnysten | 21:978281bfb26e | 37 | if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT) |
pnysten | 21:978281bfb26e | 38 | { |
pnysten | 21:978281bfb26e | 39 | setResult(0); |
pnysten | 21:978281bfb26e | 40 | pc.printf("Firmware URL length: %d\r\n",received_coap_ptr->payload_len); |
pnysten | 21:978281bfb26e | 41 | char firmware_url[200]; |
pnysten | 21:978281bfb26e | 42 | memcpy(firmware_url, (char *)received_coap_ptr->payload_ptr, received_coap_ptr->payload_len); |
pnysten | 21:978281bfb26e | 43 | firmware_url[received_coap_ptr->payload_len]='\0'; |
pnysten | 21:978281bfb26e | 44 | |
pnysten | 21:978281bfb26e | 45 | pc.printf("Firmware URL: %s\r\n",firmware_url); |
pnysten | 21:978281bfb26e | 46 | lcd.locate(0,11); |
pnysten | 21:978281bfb26e | 47 | lcd.printf("Downloading new Firmware...\n"); |
pnysten | 21:978281bfb26e | 48 | |
pnysten | 21:978281bfb26e | 49 | HTTPFile file("/local/out.b__"); |
pnysten | 21:978281bfb26e | 50 | pc.printf("INFO: Getting from URL '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 51 | |
pnysten | 21:978281bfb26e | 52 | coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED); |
pnysten | 21:978281bfb26e | 53 | sn_nsdl_send_coap_message(address, coap_res_ptr); |
pnysten | 21:978281bfb26e | 54 | |
pnysten | 21:978281bfb26e | 55 | int r = client.get(firmware_url, &file); |
pnysten | 21:978281bfb26e | 56 | if (r != HTTP_OK) { |
pnysten | 21:978281bfb26e | 57 | if (r == HTTP_PARSE) |
pnysten | 21:978281bfb26e | 58 | pc.printf("ERR Parse URL: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 59 | else if (r == HTTP_DNS) |
pnysten | 21:978281bfb26e | 60 | pc.printf("ERR DNS: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 61 | else if (r == HTTP_NOTFOUND) |
pnysten | 21:978281bfb26e | 62 | pc.printf("ERR 404 Not Found: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 63 | else if (r == HTTP_REFUSED) |
pnysten | 21:978281bfb26e | 64 | pc.printf("ERR 403 Refused: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 65 | else if (r == HTTP_ERROR) |
pnysten | 21:978281bfb26e | 66 | pc.printf("ERR Other HTTP Error: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 67 | else if (r == HTTP_TIMEOUT) |
pnysten | 21:978281bfb26e | 68 | pc.printf("ERR Timeout: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 69 | else if (r == HTTP_CONN) |
pnysten | 21:978281bfb26e | 70 | pc.printf("ERR Connection: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 71 | else if (r == HTTP_CLOSED) |
pnysten | 21:978281bfb26e | 72 | pc.printf("ERR Connection Closed: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 73 | else |
pnysten | 21:978281bfb26e | 74 | pc.printf("ERR Other Error %d: Fetch '%s' to '%s'.\r\n", r, firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 75 | pc.printf("ERR : Cleaning temp file.\r\n"); |
pnysten | 21:978281bfb26e | 76 | remove("/local/out.b__"); |
pnysten | 21:978281bfb26e | 77 | setResult(2); |
pnysten | 21:978281bfb26e | 78 | // send_firmware_result_observation(2); |
pnysten | 21:978281bfb26e | 79 | lcd.locate(0,22); |
pnysten | 21:978281bfb26e | 80 | lcd.printf("Failed...\n"); |
pnysten | 21:978281bfb26e | 81 | return 0; |
pnysten | 21:978281bfb26e | 82 | } |
pnysten | 21:978281bfb26e | 83 | pc.printf("INFO: Fetched '%s' to '%s'.\r\n", firmware_url, "/local/out.b__"); |
pnysten | 21:978281bfb26e | 84 | |
pnysten | 21:978281bfb26e | 85 | send_firmware_result_observation(1); |
pnysten | 21:978281bfb26e | 86 | lcd.locate(0,22); |
pnysten | 21:978281bfb26e | 87 | lcd.printf("Success...\n"); |
pnysten | 21:978281bfb26e | 88 | } |
pnysten | 21:978281bfb26e | 89 | |
pnysten | 21:978281bfb26e | 90 | sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr); |
pnysten | 21:978281bfb26e | 91 | return 0; |
pnysten | 21:978281bfb26e | 92 | } |
pnysten | 21:978281bfb26e | 93 | |
pnysten | 21:978281bfb26e | 94 | int create_firmware_resource(sn_nsdl_resource_info_s *resource_ptr) |
pnysten | 21:978281bfb26e | 95 | { |
pnysten | 21:978281bfb26e | 96 | nsdl_create_dynamic_resource(resource_ptr, sizeof(FIRMWARE_WRITE_RES_ID)-1, (uint8_t*)FIRMWARE_WRITE_RES_ID, 0, 0, 0, &firmware_resource_cb, SN_GRS_PUT_ALLOWED); |
pnysten | 21:978281bfb26e | 97 | return 0; |
pnysten | 21:978281bfb26e | 98 | } |
pnysten | 21:978281bfb26e | 99 |