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_status.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 | // 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 |