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

Committer:
pnysten
Date:
Tue Oct 27 07:18:16 2015 +0000
Revision:
22:2fab757f9c2a
Parent:
21:978281bfb26e
Firmware and 1/0/8 resource

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pnysten 21:978281bfb26e 1 // Firmware status resource implementation
pnysten 21:978281bfb26e 2
pnysten 21:978281bfb26e 3 #include "mbed.h"
pnysten 21:978281bfb26e 4 #include "rtos.h"
pnysten 21:978281bfb26e 5 #include "LM75B.h"
pnysten 21:978281bfb26e 6 #include "nsdl_support.h"
pnysten 21:978281bfb26e 7 #include "firmware_status.h"
pnysten 21:978281bfb26e 8 #include "firmware_result.h"
pnysten 21:978281bfb26e 9
pnysten 21:978281bfb26e 10 #define FIRMWARE_UPD_STATUS_RES_ID "5/0/2"
pnysten 21:978281bfb26e 11
pnysten 21:978281bfb26e 12 extern Serial pc;
pnysten 21:978281bfb26e 13 extern "C" void mbed_reset();
pnysten 21:978281bfb26e 14
pnysten 21:978281bfb26e 15 /**
pnysten 21:978281bfb26e 16 * Cleanup all bin files.
pnysten 21:978281bfb26e 17 */
pnysten 21:978281bfb26e 18 int cleanupAllBinFiles(void) {
pnysten 21:978281bfb26e 19 struct dirent *p;
pnysten 21:978281bfb26e 20 DIR *dir = opendir("/local");
pnysten 21:978281bfb26e 21 if (dir == NULL) {
pnysten 21:978281bfb26e 22 return -1;
pnysten 21:978281bfb26e 23 }
pnysten 21:978281bfb26e 24 while ((p = readdir(dir)) != NULL) {
pnysten 21:978281bfb26e 25 char *str = p->d_name;
pnysten 21:978281bfb26e 26
pnysten 21:978281bfb26e 27 if ((strstr(str, ".bin") != NULL) || (strstr(str, ".BIN") != NULL)) {
pnysten 21:978281bfb26e 28 char buf[BUFSIZ];
pnysten 21:978281bfb26e 29 snprintf(buf, sizeof(buf) - 1, "/local/%s", str);
pnysten 21:978281bfb26e 30 if (remove(buf) == 0) {
pnysten 21:978281bfb26e 31 pc.printf("INFO: Deleted '%s'.\r\n", buf);
pnysten 21:978281bfb26e 32 } else {
pnysten 21:978281bfb26e 33 pc.printf("ERR : Delete '%s' failed.\r\n", buf);
pnysten 21:978281bfb26e 34 }
pnysten 21:978281bfb26e 35 }
pnysten 21:978281bfb26e 36 }
pnysten 21:978281bfb26e 37 closedir(dir);
pnysten 21:978281bfb26e 38 return 0;
pnysten 21:978281bfb26e 39 }
pnysten 21:978281bfb26e 40
pnysten 21:978281bfb26e 41 /** fcopy: Copies a file
pnysten 21:978281bfb26e 42 * Checks to ensure destination file was created.
pnysten 21:978281bfb26e 43 * Returns -1 = error; 0 = success
pnysten 21:978281bfb26e 44 */
pnysten 21:978281bfb26e 45 int fcopy (const char *src, const char *dst) {
pnysten 21:978281bfb26e 46 FILE *fpsrc = fopen(src, "r");
pnysten 21:978281bfb26e 47
pnysten 21:978281bfb26e 48 if (fpsrc == NULL)
pnysten 21:978281bfb26e 49 return 0;
pnysten 21:978281bfb26e 50
pnysten 21:978281bfb26e 51 FILE *fpdst = fopen(dst, "w");
pnysten 21:978281bfb26e 52
pnysten 21:978281bfb26e 53 if (fpdst == NULL)
pnysten 21:978281bfb26e 54 return 0;
pnysten 21:978281bfb26e 55
pnysten 21:978281bfb26e 56 int ch = fgetc(fpsrc);
pnysten 21:978281bfb26e 57 while (ch != EOF) {
pnysten 21:978281bfb26e 58 fputc(ch, fpdst);
pnysten 21:978281bfb26e 59 ch = fgetc(fpsrc);
pnysten 21:978281bfb26e 60 }
pnysten 21:978281bfb26e 61 fclose(fpsrc);
pnysten 21:978281bfb26e 62 fclose(fpdst);
pnysten 21:978281bfb26e 63 int retval = 0;
pnysten 21:978281bfb26e 64 fpdst = fopen(dst, "r");
pnysten 21:978281bfb26e 65 if (fpdst == NULL) {
pnysten 21:978281bfb26e 66 retval = 0;
pnysten 21:978281bfb26e 67 } else {
pnysten 21:978281bfb26e 68 fclose(fpdst);
pnysten 21:978281bfb26e 69 retval = 1;
pnysten 21:978281bfb26e 70 }
pnysten 21:978281bfb26e 71 return retval;
pnysten 21:978281bfb26e 72 }
pnysten 21:978281bfb26e 73
pnysten 21:978281bfb26e 74 /* Only GET, POST method allowed */
pnysten 21:978281bfb26e 75 static uint8_t firmware_resource_status_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
pnysten 21:978281bfb26e 76 {
pnysten 21:978281bfb26e 77 sn_coap_hdr_s *coap_res_ptr = 0;
pnysten 21:978281bfb26e 78 char firmware_upd_status[16];
pnysten 21:978281bfb26e 79
pnysten 21:978281bfb26e 80 pc.printf("firmware status callback\r\n");
pnysten 21:978281bfb26e 81
pnysten 21:978281bfb26e 82 if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_POST)
pnysten 21:978281bfb26e 83 {
pnysten 21:978281bfb26e 84 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
pnysten 21:978281bfb26e 85 sn_nsdl_send_coap_message(address, coap_res_ptr);
pnysten 21:978281bfb26e 86 wait(2);
pnysten 21:978281bfb26e 87 FILE *fpsrc = fopen("/local/OUT.B__", "r");
pnysten 21:978281bfb26e 88
pnysten 21:978281bfb26e 89 if (fpsrc == NULL)
pnysten 21:978281bfb26e 90 {
pnysten 21:978281bfb26e 91 pc.printf("Tmp file not found...\r\n");
pnysten 21:978281bfb26e 92 setResult(7);
pnysten 21:978281bfb26e 93 send_firmware_result_observation(7);
pnysten 21:978281bfb26e 94 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
pnysten 21:978281bfb26e 95 return 0;
pnysten 21:978281bfb26e 96 }
pnysten 21:978281bfb26e 97
pnysten 21:978281bfb26e 98 if (cleanupAllBinFiles() == -1)
pnysten 21:978281bfb26e 99 {
pnysten 21:978281bfb26e 100 pc.printf("Cleaning files failed...\r\n");
pnysten 21:978281bfb26e 101 setResult(2);
pnysten 21:978281bfb26e 102 send_firmware_result_observation(2);
pnysten 21:978281bfb26e 103 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
pnysten 21:978281bfb26e 104 return 0;
pnysten 21:978281bfb26e 105 }
pnysten 21:978281bfb26e 106
pnysten 21:978281bfb26e 107 pc.printf("Copying NEW_FW...\r\n");
pnysten 21:978281bfb26e 108 if (fcopy("/local/OUT.B__","/local/NEW_FW.BIN") == 0)
pnysten 21:978281bfb26e 109 {
pnysten 21:978281bfb26e 110 setResult(2);
pnysten 21:978281bfb26e 111 send_firmware_result_observation(2);
pnysten 21:978281bfb26e 112 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
pnysten 21:978281bfb26e 113 return 0;
pnysten 21:978281bfb26e 114 }
pnysten 21:978281bfb26e 115 pc.printf("Deleting tmp file...\r\n");
pnysten 21:978281bfb26e 116 if (remove("/local/out.b__") != 0)
pnysten 21:978281bfb26e 117 {
pnysten 21:978281bfb26e 118 /*setResult(0);
pnysten 21:978281bfb26e 119 send_firmware_result_observation(0);
pnysten 21:978281bfb26e 120 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
pnysten 21:978281bfb26e 121 return 0;*/
pnysten 21:978281bfb26e 122 }
pnysten 21:978281bfb26e 123 pc.printf("Resetting...\r\n");
pnysten 21:978281bfb26e 124 wait(3);
pnysten 21:978281bfb26e 125 setResult(1);
pnysten 21:978281bfb26e 126 mbed_reset();
pnysten 21:978281bfb26e 127
pnysten 21:978281bfb26e 128 }
pnysten 21:978281bfb26e 129
pnysten 21:978281bfb26e 130 if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET)
pnysten 21:978281bfb26e 131 {
pnysten 21:978281bfb26e 132 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
pnysten 21:978281bfb26e 133
pnysten 21:978281bfb26e 134 sprintf(firmware_upd_status, "%d", 1);
pnysten 21:978281bfb26e 135
pnysten 21:978281bfb26e 136 coap_res_ptr->payload_len = strlen(firmware_upd_status);
pnysten 21:978281bfb26e 137 coap_res_ptr->payload_ptr = (uint8_t*)firmware_upd_status;
pnysten 21:978281bfb26e 138 sn_nsdl_send_coap_message(address, coap_res_ptr);
pnysten 21:978281bfb26e 139 }
pnysten 21:978281bfb26e 140
pnysten 21:978281bfb26e 141 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
pnysten 21:978281bfb26e 142 return 0;
pnysten 21:978281bfb26e 143 }
pnysten 21:978281bfb26e 144
pnysten 21:978281bfb26e 145 int create_firmware_status_resource(sn_nsdl_resource_info_s *resource_ptr)
pnysten 21:978281bfb26e 146 {
pnysten 21:978281bfb26e 147 nsdl_create_dynamic_resource(resource_ptr, sizeof(FIRMWARE_UPD_STATUS_RES_ID)-1, (uint8_t*) FIRMWARE_UPD_STATUS_RES_ID, 0, 0, 0, &firmware_resource_status_cb, SN_GRS_GET_ALLOWED | SN_GRS_POST_ALLOWED);
pnysten 21:978281bfb26e 148 return 0;
pnysten 21:978281bfb26e 149 }
pnysten 21:978281bfb26e 150
pnysten 21:978281bfb26e 151