-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathFileDownload.ino
More file actions
134 lines (118 loc) · 3.07 KB
/
FileDownload.ino
File metadata and controls
134 lines (118 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* sakura.io file distrobution (file download) example
*
* For detailed command information please see the datasheet.
* https://sakura.io/developer/pdf/sakura_module_datasheet_latest.pdf
*/
#include <SakuraIO.h>
#define FILE_ID 1
#define CHUNK_SIZE 16
//SakuraIO_SPI sakuraio(10);
SakuraIO_I2C sakuraio;
void setup()
{
Serial.begin(9600);
Serial.print("Waiting to come online");
for (;;)
{
if ((sakuraio.getConnectionStatus() & 0x80) == 0x80)
break;
Serial.print(".");
delay(1000);
}
Serial.println("");
}
void loop()
{
uint8_t file_status, result = 0;
uint32_t file_size, crc, received_size = 0;
uint64_t timestamp;
uint32_t unixtime = (uint32_t)(sakuraio.getUnixtime() / 1000UL);
Serial.print("Download start time ");
Serial.println(unixtime);
// File download request
while (result != CMD_ERROR_NONE)
{
result = sakuraio.startFileDownload(FILE_ID);
Serial.print("File request result=");
Serial.println(result);
delay(100);
if (result != CMD_ERROR_NONE)
{
// Cancel request
Serial.println("Error or download already started.");
sakuraio.cancelFileDownload();
Serial.println("Cancel requested. retrying...");
delay(1000);
continue;
}
delay(100);
}
delay(500);
// Get file metadata
do
{
result = sakuraio.getFileMetaData(&file_status, &file_size, ×tamp, &crc);
Serial.print("Get metadata result=");
Serial.print(result);
Serial.print(" status=");
Serial.print(file_status);
Serial.print(" total file size=");
Serial.print(file_size);
Serial.print(" timestamp=");
Serial.print((uint32_t)(timestamp / 1000));
Serial.print(" crc32=");
Serial.println(crc);
delay(500);
} while (result != CMD_ERROR_NONE);
delay(500);
// Get file body
while (received_size < file_size)
{
uint8_t status = 0;
uint32_t size = 0;
uint8_t buf[CHUNK_SIZE] = {0};
uint8_t len = CHUNK_SIZE;
// Get request
result = sakuraio.getFileData(&len, buf);
Serial.print("File get result=");
Serial.print(result);
Serial.print(" chunksize=");
Serial.println(len);
if (result != CMD_ERROR_NONE)
{
Serial.print("getFileData error=");
Serial.println(result);
delay(500);
continue;
}
// Chunk dump
Serial.print("Chunk=[ ");
for (int i = 0; i < len; i++)
{
char b[4];
sprintf(b, "%02X ", buf[i]);
Serial.print(b);
}
Serial.println("]");
delay(5);
// Get file download status
result = sakuraio.getFileDownloadStatus(&status, &size);
Serial.print("File download status result=");
Serial.print(result);
Serial.print(" status=");
Serial.print(status);
Serial.print(" transferred_size=");
Serial.println(size);
received_size += len;
Serial.print("Downloaded file size=");
Serial.println(received_size);
delay(5);
}
Serial.println("Download complete");
unixtime = (uint32_t)(sakuraio.getUnixtime() / 1000UL);
Serial.print("Download end time ");
Serial.println(unixtime);
while (1)
;
}