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

resources/firmware.cpp

Committer:
pnysten
Date:
2015-10-27
Revision:
22:2fab757f9c2a
Parent:
21:978281bfb26e

File content as of revision 22:2fab757f9c2a:

// Light resource implementation

#include "mbed.h"
#include "nsdl_support.h"
#include "EthernetInterface.h"
#include "firmware.h"
#include "firmware_status.h"
#include "firmware_result.h"
#include "HTTPClient.h"
#include "C12832_lcd.h"

#define FIRMWARE_WRITE_RES_ID    "5/0/1"
//5/0/1 should be used instead

static C12832_LCD lcd;
extern Serial pc;
extern "C" void mbed_reset();

LocalFileSystem local("local");
HTTPClient client;

char *remove_ext(char *dst, const char *filename) {
    size_t len = strlen(filename);
    memcpy(dst, filename, len-3);
    dst[len - 3] = 0;
    return dst;
}

/* Only PUT method allowed */
static uint8_t firmware_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
{
    sn_coap_hdr_s *coap_res_ptr = 0;
    pc.printf("Firmware updating\r\n");
    lcd.locate(0,0);
    lcd.printf("Firmware Upgrade...\n");

    if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT)
    {
        setResult(0);
        pc.printf("Firmware URL length: %d\r\n",received_coap_ptr->payload_len);
        char firmware_url[200];
        memcpy(firmware_url, (char *)received_coap_ptr->payload_ptr, received_coap_ptr->payload_len);
        firmware_url[received_coap_ptr->payload_len]='\0';

        pc.printf("Firmware URL: %s\r\n",firmware_url);
        lcd.locate(0,11);
        lcd.printf("Downloading new Firmware...\n");
        
        HTTPFile file("/local/out.b__");
        pc.printf("INFO: Getting from URL '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");

        coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
        sn_nsdl_send_coap_message(address, coap_res_ptr);

        int r = client.get(firmware_url, &file);
        if (r != HTTP_OK) {
            if (r == HTTP_PARSE)
                pc.printf("ERR Parse URL: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else if (r == HTTP_DNS)
                pc.printf("ERR DNS: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else if (r == HTTP_NOTFOUND)
                pc.printf("ERR 404 Not Found: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else if (r == HTTP_REFUSED)
                pc.printf("ERR 403 Refused: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else if (r == HTTP_ERROR)
                pc.printf("ERR Other HTTP Error: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else if (r == HTTP_TIMEOUT)
                pc.printf("ERR Timeout: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else if (r == HTTP_CONN)
                pc.printf("ERR Connection: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else if (r == HTTP_CLOSED)
                pc.printf("ERR Connection Closed: Fetch '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
            else
                pc.printf("ERR Other Error %d: Fetch '%s' to '%s'.\r\n", r, firmware_url, "/local/out.b__");
            pc.printf("ERR : Cleaning temp file.\r\n");
            remove("/local/out.b__");
            setResult(2);
 //           send_firmware_result_observation(2);
            lcd.locate(0,22);
            lcd.printf("Failed...\n");
            return 0;
        }
        pc.printf("INFO: Fetched '%s' to '%s'.\r\n", firmware_url, "/local/out.b__");
 
        send_firmware_result_observation(1);
        lcd.locate(0,22);
        lcd.printf("Success...\n");
    }

    sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
    return 0;
}

int create_firmware_resource(sn_nsdl_resource_info_s *resource_ptr)
{
    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);
    return 0;
}