SAKURA Internet
/
SakuraIO_FileDownload
sakura.io file download example for mbed LPC1768
main.cpp@1:b744d5683139, 2018-05-21 (annotated)
- Committer:
- misodengaku
- Date:
- Mon May 21 05:10:39 2018 +0000
- Revision:
- 1:b744d5683139
- Parent:
- 0:a5e8e3df9f1d
update libraries
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
misodengaku | 0:a5e8e3df9f1d | 1 | #include "mbed.h" |
misodengaku | 0:a5e8e3df9f1d | 2 | #include "SakuraIO.h" |
misodengaku | 0:a5e8e3df9f1d | 3 | |
misodengaku | 0:a5e8e3df9f1d | 4 | Serial pc(USBTX, USBRX); |
misodengaku | 0:a5e8e3df9f1d | 5 | DigitalOut myled(LED1); |
misodengaku | 0:a5e8e3df9f1d | 6 | LocalFileSystem local("local"); |
misodengaku | 0:a5e8e3df9f1d | 7 | |
misodengaku | 0:a5e8e3df9f1d | 8 | void rx_interrupt(); |
misodengaku | 0:a5e8e3df9f1d | 9 | void err2str(int err); |
misodengaku | 0:a5e8e3df9f1d | 10 | |
misodengaku | 0:a5e8e3df9f1d | 11 | int main() |
misodengaku | 0:a5e8e3df9f1d | 12 | { |
misodengaku | 0:a5e8e3df9f1d | 13 | FILE *fp ; |
misodengaku | 0:a5e8e3df9f1d | 14 | pc.baud(115200); |
misodengaku | 0:a5e8e3df9f1d | 15 | fp = fopen("/local/file.bin", "wb"); |
misodengaku | 0:a5e8e3df9f1d | 16 | if (fp == NULL) { |
misodengaku | 0:a5e8e3df9f1d | 17 | pc.printf("error: fp is null\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 18 | } |
misodengaku | 0:a5e8e3df9f1d | 19 | |
misodengaku | 0:a5e8e3df9f1d | 20 | I2C i2c(p9, p10); |
misodengaku | 0:a5e8e3df9f1d | 21 | SakuraIO_I2C sakuraio(i2c); |
misodengaku | 0:a5e8e3df9f1d | 22 | |
misodengaku | 0:a5e8e3df9f1d | 23 | pc.printf("waiting to come online"); |
misodengaku | 0:a5e8e3df9f1d | 24 | for (;;) { |
misodengaku | 0:a5e8e3df9f1d | 25 | if ((sakuraio.getConnectionStatus() & 0x80) == 0x80) |
misodengaku | 0:a5e8e3df9f1d | 26 | break; |
misodengaku | 0:a5e8e3df9f1d | 27 | pc.printf("."); |
misodengaku | 0:a5e8e3df9f1d | 28 | wait_ms(1000); |
misodengaku | 0:a5e8e3df9f1d | 29 | } |
misodengaku | 0:a5e8e3df9f1d | 30 | pc.printf("ok\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 31 | |
misodengaku | 0:a5e8e3df9f1d | 32 | uint8_t status = 0; |
misodengaku | 0:a5e8e3df9f1d | 33 | while (status != 1) { |
misodengaku | 0:a5e8e3df9f1d | 34 | status = sakuraio.startFileDownload(1); |
misodengaku | 0:a5e8e3df9f1d | 35 | pc.printf("file req result: %d\r\n", status); |
misodengaku | 0:a5e8e3df9f1d | 36 | if (status != CMD_ERROR_NONE) { |
misodengaku | 0:a5e8e3df9f1d | 37 | err2str(status); |
misodengaku | 0:a5e8e3df9f1d | 38 | pc.printf("\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 39 | } |
misodengaku | 0:a5e8e3df9f1d | 40 | wait_ms(100); |
misodengaku | 0:a5e8e3df9f1d | 41 | pc.printf("cancel\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 42 | uint8_t cancel_result = sakuraio.cancelFileDownload(); |
misodengaku | 0:a5e8e3df9f1d | 43 | err2str(cancel_result); |
misodengaku | 0:a5e8e3df9f1d | 44 | pc.printf("\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 45 | wait_ms(100); |
misodengaku | 0:a5e8e3df9f1d | 46 | } |
misodengaku | 0:a5e8e3df9f1d | 47 | |
misodengaku | 0:a5e8e3df9f1d | 48 | |
misodengaku | 0:a5e8e3df9f1d | 49 | |
misodengaku | 0:a5e8e3df9f1d | 50 | uint32_t received_size = 0; |
misodengaku | 0:a5e8e3df9f1d | 51 | |
misodengaku | 0:a5e8e3df9f1d | 52 | uint8_t file_status = 0; |
misodengaku | 0:a5e8e3df9f1d | 53 | uint32_t file_total_size = 0, file_crc32 = 0; |
misodengaku | 0:a5e8e3df9f1d | 54 | uint64_t file_timestamp = 0; |
misodengaku | 0:a5e8e3df9f1d | 55 | while(file_status == 0) { |
misodengaku | 0:a5e8e3df9f1d | 56 | |
misodengaku | 0:a5e8e3df9f1d | 57 | sakuraio.getFileMetaData(&file_status, &file_total_size, &file_timestamp, &file_crc32); |
misodengaku | 0:a5e8e3df9f1d | 58 | |
misodengaku | 0:a5e8e3df9f1d | 59 | pc.printf("metadata status: %d filesize: %d crc32: %08x\r\n", file_status, file_total_size, file_crc32); |
misodengaku | 0:a5e8e3df9f1d | 60 | |
misodengaku | 0:a5e8e3df9f1d | 61 | pc.printf("date "); |
misodengaku | 0:a5e8e3df9f1d | 62 | for (int i = 0; i < 8; i++) { |
misodengaku | 0:a5e8e3df9f1d | 63 | pc.printf("%02x ", ((uint8_t *)&file_timestamp)[i]); |
misodengaku | 0:a5e8e3df9f1d | 64 | } |
misodengaku | 0:a5e8e3df9f1d | 65 | pc.printf("\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 66 | wait(1); |
misodengaku | 0:a5e8e3df9f1d | 67 | } |
misodengaku | 0:a5e8e3df9f1d | 68 | |
misodengaku | 0:a5e8e3df9f1d | 69 | while (1) { |
misodengaku | 0:a5e8e3df9f1d | 70 | status = 0; |
misodengaku | 0:a5e8e3df9f1d | 71 | uint32_t s = 0; |
misodengaku | 0:a5e8e3df9f1d | 72 | uint8_t a = sakuraio.getFileDownloadStatus(&status, &s); |
misodengaku | 0:a5e8e3df9f1d | 73 | pc.printf("result: "); |
misodengaku | 0:a5e8e3df9f1d | 74 | err2str(a); |
misodengaku | 0:a5e8e3df9f1d | 75 | pc.printf("status %d size %d\r\n", status, s); |
misodengaku | 0:a5e8e3df9f1d | 76 | wait_ms(500); |
misodengaku | 0:a5e8e3df9f1d | 77 | |
misodengaku | 0:a5e8e3df9f1d | 78 | uint8_t buf[255] = {0}; |
misodengaku | 0:a5e8e3df9f1d | 79 | uint8_t len = 251; // request size |
misodengaku | 0:a5e8e3df9f1d | 80 | uint8_t fileget = sakuraio.getFileData(&len, buf); |
misodengaku | 0:a5e8e3df9f1d | 81 | // if (fileget != cmd_error_none) { |
misodengaku | 0:a5e8e3df9f1d | 82 | // pc.printf("download waiting...\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 83 | // wait_ms(1000); |
misodengaku | 0:a5e8e3df9f1d | 84 | // continue; |
misodengaku | 0:a5e8e3df9f1d | 85 | // //break; |
misodengaku | 0:a5e8e3df9f1d | 86 | // } |
misodengaku | 0:a5e8e3df9f1d | 87 | |
misodengaku | 0:a5e8e3df9f1d | 88 | pc.printf("file get "); |
misodengaku | 0:a5e8e3df9f1d | 89 | err2str(fileget); |
misodengaku | 0:a5e8e3df9f1d | 90 | if (fileget != 1) { |
misodengaku | 0:a5e8e3df9f1d | 91 | pc.printf("error: get_data returned invalid status\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 92 | while(1) { |
misodengaku | 0:a5e8e3df9f1d | 93 | wait(1); |
misodengaku | 0:a5e8e3df9f1d | 94 | } |
misodengaku | 0:a5e8e3df9f1d | 95 | } |
misodengaku | 0:a5e8e3df9f1d | 96 | pc.printf("len %d\r\n", len); |
misodengaku | 0:a5e8e3df9f1d | 97 | received_size += len; |
misodengaku | 0:a5e8e3df9f1d | 98 | pc.printf("received %08x\r\n", len); |
misodengaku | 0:a5e8e3df9f1d | 99 | for (int i = 0; i < len; i++) { |
misodengaku | 0:a5e8e3df9f1d | 100 | pc.printf("%02x ", buf[i]); |
misodengaku | 0:a5e8e3df9f1d | 101 | } |
misodengaku | 0:a5e8e3df9f1d | 102 | fwrite(buf, len, 1, fp); |
misodengaku | 0:a5e8e3df9f1d | 103 | pc.printf("\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 104 | pc.printf("%d / %d (%f%%)\r\n", received_size, file_total_size, ((double)received_size / file_total_size) * 100); |
misodengaku | 0:a5e8e3df9f1d | 105 | if (received_size >= file_total_size) { |
misodengaku | 0:a5e8e3df9f1d | 106 | break; |
misodengaku | 0:a5e8e3df9f1d | 107 | } |
misodengaku | 0:a5e8e3df9f1d | 108 | wait_ms(100); |
misodengaku | 0:a5e8e3df9f1d | 109 | } |
misodengaku | 0:a5e8e3df9f1d | 110 | fclose(fp); |
misodengaku | 0:a5e8e3df9f1d | 111 | pc.printf("download complete!\r\n"); |
misodengaku | 0:a5e8e3df9f1d | 112 | |
misodengaku | 0:a5e8e3df9f1d | 113 | // block |
misodengaku | 0:a5e8e3df9f1d | 114 | while (1) |
misodengaku | 0:a5e8e3df9f1d | 115 | ; |
misodengaku | 0:a5e8e3df9f1d | 116 | } |
misodengaku | 0:a5e8e3df9f1d | 117 | |
misodengaku | 0:a5e8e3df9f1d | 118 | void err2str(int err) |
misodengaku | 0:a5e8e3df9f1d | 119 | { |
misodengaku | 0:a5e8e3df9f1d | 120 | switch (err) { |
misodengaku | 0:a5e8e3df9f1d | 121 | case CMD_ERROR_NONE: |
misodengaku | 0:a5e8e3df9f1d | 122 | printf("no error."); |
misodengaku | 0:a5e8e3df9f1d | 123 | break; |
misodengaku | 0:a5e8e3df9f1d | 124 | case CMD_ERROR_PARITY: |
misodengaku | 0:a5e8e3df9f1d | 125 | printf("parity error."); |
misodengaku | 0:a5e8e3df9f1d | 126 | break; |
misodengaku | 0:a5e8e3df9f1d | 127 | case CMD_ERROR_MISSING: |
misodengaku | 0:a5e8e3df9f1d | 128 | printf("command missing."); |
misodengaku | 0:a5e8e3df9f1d | 129 | break; |
misodengaku | 0:a5e8e3df9f1d | 130 | case CMD_ERROR_INVALID_SYNTAX: |
misodengaku | 0:a5e8e3df9f1d | 131 | printf("invalid syntax."); |
misodengaku | 0:a5e8e3df9f1d | 132 | break; |
misodengaku | 0:a5e8e3df9f1d | 133 | case CMD_ERROR_RUNTIME: |
misodengaku | 0:a5e8e3df9f1d | 134 | printf("runtime error."); |
misodengaku | 0:a5e8e3df9f1d | 135 | break; |
misodengaku | 0:a5e8e3df9f1d | 136 | case CMD_ERROR_LOCKED: |
misodengaku | 0:a5e8e3df9f1d | 137 | printf("command locked."); |
misodengaku | 0:a5e8e3df9f1d | 138 | break; |
misodengaku | 0:a5e8e3df9f1d | 139 | case CMD_ERROR_BUSY: |
misodengaku | 0:a5e8e3df9f1d | 140 | printf("busy."); |
misodengaku | 0:a5e8e3df9f1d | 141 | break; |
misodengaku | 0:a5e8e3df9f1d | 142 | } |
misodengaku | 0:a5e8e3df9f1d | 143 | } |