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 MBED_DEMOS

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers firmware.cpp Source File

firmware.cpp

00001 // Light resource implementation
00002 
00003 #include "mbed.h"
00004 #include "nsdl_support.h"
00005 #include "EthernetInterface.h"
00006 #include "firmware.h"
00007 #include "firmware_status.h"
00008 #include "firmware_result.h"
00009 #include "HTTPClient.h"
00010 #include "C12832_lcd.h"
00011 
00012 #define FIRMWARE_WRITE_RES_ID    "5/0/1"
00013 //5/0/1 should be used instead
00014 
00015 static C12832_LCD lcd;
00016 extern Serial pc;
00017 extern "C" void mbed_reset();
00018 
00019 LocalFileSystem local("local");
00020 HTTPClient client;
00021 
00022 char *remove_ext(char *dst, const char *filename) {
00023     size_t len = strlen(filename);
00024     memcpy(dst, filename, len-3);
00025     dst[len - 3] = 0;
00026     return dst;
00027 }
00028 
00029 /* Only PUT method allowed */
00030 static uint8_t firmware_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
00031 {
00032     sn_coap_hdr_s *coap_res_ptr = 0;
00033     pc.printf("Firmware updating\r\n");
00034     lcd.locate(0,0);
00035     lcd.printf("Firmware Upgrade...\n");
00036 
00037     if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT)
00038     {
00039         setResult(0);
00040         pc.printf("Firmware URL length: %d\r\n",received_coap_ptr->payload_len);
00041         char firmware_url[200];
00042         memcpy(firmware_url, (char *)received_coap_ptr->payload_ptr, received_coap_ptr->payload_len);
00043         firmware_url[received_coap_ptr->payload_len]='\0';
00044 
00045         pc.printf("Firmware URL: %s\r\n",firmware_url);
00046         lcd.locate(0,11);
00047         lcd.printf("Downloading new Firmware...\n");
00048         
00049         HTTPFile file("/local/out.b__");
00050         pc.printf("INFO: Getting from URL '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00051 
00052         coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
00053         sn_nsdl_send_coap_message(address, coap_res_ptr);
00054 
00055         int r = client.get(firmware_url, &file);
00056         if (r != HTTP_OK) {
00057             if (r == HTTP_PARSE)
00058                 pc.printf("ERR Parse URL: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00059             else if (r == HTTP_DNS)
00060                 pc.printf("ERR DNS: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00061             else if (r == HTTP_NOTFOUND)
00062                 pc.printf("ERR 404 Not Found: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00063             else if (r == HTTP_REFUSED)
00064                 pc.printf("ERR 403 Refused: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00065             else if (r == HTTP_ERROR)
00066                 pc.printf("ERR Other HTTP Error: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00067             else if (r == HTTP_TIMEOUT)
00068                 pc.printf("ERR Timeout: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00069             else if (r == HTTP_CONN)
00070                 pc.printf("ERR Connection: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00071             else if (r == HTTP_CLOSED)
00072                 pc.printf("ERR Connection Closed: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00073             else
00074                 pc.printf("ERR Other Error %d: Fetch '%s' to '%s'.\r\n", r, firmware_url, "/local/out.b__");
00075             pc.printf("ERR : Cleaning temp file.\r\n");
00076             remove("/local/out.b__");
00077             setResult(2);
00078  //           send_firmware_result_observation(2);
00079             lcd.locate(0,22);
00080             lcd.printf("Failed...\n");
00081             return 0;
00082         }
00083         pc.printf("INFO: Fetched '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
00084  
00085         send_firmware_result_observation(1);
00086         lcd.locate(0,22);
00087         lcd.printf("Success...\n");
00088     }
00089 
00090     sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
00091     return 0;
00092 }
00093 
00094 int create_firmware_resource(sn_nsdl_resource_info_s *resource_ptr)
00095 {
00096     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);
00097     return 0;
00098 }
00099