45 #define _CRT_SECURE_NO_WARNINGS
49 #define Sleep(millis) sleep((millis) / 1000)
61 static FILE *ofp = NULL;
90 return &newDeviceInfo->
status;
106 static const char NAND_DEVICE_DONT_CARE[6] = {0x00};
107 static const char NAND_DEVICE_HY27UF084G2x[6] = { 0xAD, 0xDC, 0x00 };
109 static const char NAND_DEVICE_HY27UF084G2B[6] = { 0xAD, 0xDC, 0x10, 0x95, 0x54, 0x00 };
110 static const char NAND_DEVICE_HY27UF084G2M[6] = { 0xAD, 0xDC, 0x80, 0x95, 0xAD, 0x00 };
111 static const char NAND_DEVICE_MT29F8G08AAA[6] = { 0x2C, 0xD3, 0x90, 0x2E, 0x64, 0x00 };
112 static const char NAND_DEVICE_S34ML04G1[6] = { 0x01, 0xDC, 0x90, 0x95, 0x54, 0x00 };
113 static const char NAND_DEVICE_MT29F8G08ABADA[6] = { 0x2C, 0xDC, 0x90, 0x95, 0x56, 0x00 };
114 static const char NAND_DEVICE_AX6[6] = { 0xC2, 0xDC, 0x90, 0x95, 0x56, 0x00 };
117 static int OmGetNandId(
int deviceId,
unsigned char *
id,
int *present,
int *identified)
120 char response[256], *parts[16] = {0};
121 unsigned char localId[6] = {0};
129 if (sscanf(parts[1],
"%x:%x:%x:%x:%x:%x", &tempId[0], &tempId[1], &tempId[2], &tempId[3], &tempId[4], &tempId[5]) != 6) {
return OM_E_UNEXPECTED_RESPONSE; }
130 for (i = 0; i < 6; i++) { localId[i] = (
unsigned char)tempId[i]; }
131 if (
id != NULL) { memcpy(
id, localId, 6); }
132 if (identified != NULL)
135 if (memcmp(NAND_DEVICE_HY27UF084G2B, (
char *)localId, 6) == 0) { *identified = 1; }
136 else if (memcmp(NAND_DEVICE_HY27UF084G2M, (
char *)localId, 6) == 0) { *identified = 2; }
137 else if (memcmp(NAND_DEVICE_MT29F8G08AAA, (
char *)localId, 6) == 0) { *identified = 3; }
138 else if (memcmp(NAND_DEVICE_S34ML04G1, (
char *)localId, 6) == 0) { *identified = 4; }
139 else if (memcmp(NAND_DEVICE_MT29F8G08ABADA, (
char *)localId, 6) == 0) { *identified = 5; }
140 else if (memcmp(NAND_DEVICE_AX6, (
char *)localId, 6) == 0) { *identified = 6; }
145 *present = atoi(parts[2]);
151 static int onlySingleId = -1;
152 static int onlySingleIdReturn = -1;
158 return memcmp(serialBuffer,
"AX6", 3) == 0;
168 int firmwareVersion, hardwareVersion;
176 printf(
"RECORD #%d: Battery at %d%% (%s)\n", deviceId, battery, (battery >= 100) ?
"charged" :
"charging");
180 result =
OmGetVersion(deviceId, &firmwareVersion, &hardwareVersion);
182 printf(
"RECORD #%d: Firmware %d, Hardware %d\n", deviceId, firmwareVersion, hardwareVersion);
187 unsigned char nandId[6] = { 0 };
189 memset(nandId, 0,
sizeof(nandId));
190 result = OmGetNandId(deviceId, nandId, NULL, &nandType);
191 if (result ==
OM_E_NOT_IMPLEMENTED) { fprintf(stderr,
"NOTE: This firmware doesn't support NANDID command\n"); }
192 else if (result ==
OM_E_UNEXPECTED_RESPONSE) { fprintf(stderr,
"NOTE: Unexpected NANDID response (firmware probably doesn't support NANDID command)\n"); }
193 else if (
OM_FAILED(result)) { fprintf(stderr,
"ERROR: Problem running OmGetNandId() %s\n",
OmErrorString(result));
return 0; }
196 const char *nandDescription;
199 case 1: nandDescription =
"STANDARD (HY27UF084G2B)";
break;
200 case 2: nandDescription =
"ALTERNATE (HY27UF084G2M)";
break;
201 case 3: nandDescription =
"MICRON (MT29F8G08AAA)";
break;
202 case 4: nandDescription =
"SPANSION (S34ML04G1)";
break;
203 case 5: nandDescription =
"MICRON (MT29F4G08ABADA)";
break;
204 case 6: nandDescription =
"AX6";
break;
205 default: nandDescription =
"UNKNOWN!";
break;
208 fprintf(stderr,
"RECORD #%d: NAND type =%d %s [%02x:%02x:%02x:%02x:%02x:%02x]\n", deviceId, nandType, nandDescription, nandId[0], nandId[1], nandId[2], nandId[3], nandId[4], nandId[5]);
209 if (nandType <= 0) {
printf(
"ERROR: OmGetNandId() not known type (try again to be sure) [%02x:%02x:%02x:%02x:%02x:%02x].\n", nandId[0], nandId[1], nandId[2], nandId[3], nandId[4], nandId[5]);
return 0; }
216 int memoryHealth = 0;
218 if (
OM_FAILED(memoryHealth)) { fprintf(stderr,
"ERROR: OmGetMemoryHealth() %s\n",
OmErrorString(result));
return 0; }
220 fprintf(stderr,
"RECORD #%d: Memory health =%d\n", deviceId, memoryHealth);
221 if (memoryHealth == 0) {
printf(
"ERROR: OmGetMemoryHealth() no spare planes.\n");
return 0; }
228 tm = localtime(&
now);
229 nowTime =
OM_DATETIME_FROM_YMDHMS(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
230 sprintf(timeString,
"%04d-%02d-%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
232 fprintf(stderr,
"RECORD #%d: Synchronizing the time...\n", deviceId);
238 bool gyro = hasGyro(deviceId);
239 fprintf(stderr,
"RECORD #%d: Device has gyro: %s\n", deviceId, gyro ?
"true" :
"false");
245 fprintf(stderr,
"RECORD #%d: Setting accelerometer (+gyro) configuration...\n", deviceId);
246 if (
OM_FAILED(result)) { fprintf(stderr,
"ERROR: OmSetAccelConfig() %s\n",
OmErrorString(result));
return 0; }
250 fprintf(stderr,
"RECORD #%d: Setting session id: %u\n", deviceId, deviceId);
251 if (
OM_FAILED(result)) { fprintf(stderr,
"ERROR: OmSetSessionId() %s\n",
OmErrorString(result));
return 0; }
260 char debugCommand[128];
261 sprintf(debugCommand,
"\r\nDEBUG %d\r\n",
debugMode);
262 OmCommand(deviceId, debugCommand, NULL, 0,
"DEBUG=", 2000, NULL, 0);
277 tm = localtime(&
now);
281 startTime =
OM_DATETIME_FROM_YMDHMS(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
282 printf(
"RECORD #%d: START %04d-%02d-%02d %02d:%02d:%02d\n", deviceId, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
286 tm = localtime(&
now);
290 stopTime =
OM_DATETIME_FROM_YMDHMS(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
291 printf(
"RECORD #%d: STOP %04d-%02d-%02d %02d:%02d:%02d\n", deviceId, tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
293 result =
OmSetDelays(deviceId, startTime, stopTime);
299 fprintf(stderr,
"RECORD #%d: Setting start/stop: ZERO/INFINITY\n", deviceId);
305 fprintf(stderr,
"RECORD #%d: Committing new settings...\n", deviceId);
307 if (
OM_FAILED(result)) { fprintf(stderr,
"ERROR: OmEraseDataAndCommit() %s\n",
OmErrorString(result));
return 0; }
310 fprintf(stderr,
"RECORD,%u,%s,%d,%d\n", deviceId, timeString, battery, firmwareVersion);
311 printf(
"RECORD,%u,%s,%d,%d\n", deviceId, timeString, battery, firmwareVersion);
314 fprintf(ofp,
"RECORD,%u,%s,%d,%d\n", deviceId, timeString, battery, firmwareVersion);
323 static void record_DeviceCallback(
void *reference,
int deviceId,
OM_DEVICE_STATUS status)
327 fprintf(stderr,
"RECORD #%d: Device CONNECTED\n", deviceId);
333 fprintf(stderr,
"RECORD #%d: Device REMOVED\n", deviceId);
338 fprintf(stderr,
"RECORD #%d: Error, unexpected status %d\n", deviceId, status);
364 static int maxDevices = 0;
365 static int *deviceIds = NULL;
372 if (numDevices > maxDevices) { maxDevices = numDevices; deviceIds = (
int *)realloc(deviceIds,
sizeof(
int) * maxDevices); }
374 if (numDevices > maxDevices) { numDevices = maxDevices; }
375 fprintf(stderr,
"%d... ", numDevices);
376 for (i = 0; i < numDevices; i++)
378 int deviceId = deviceIds[i];
380 if (onlySingleId > 0 && deviceId != onlySingleId) {
continue; }
389 fprintf(stderr,
"[%d@%d%%];", deviceId, battery);
392 if (onlySingleId > 0 || battery >=
minBatt)
395 fprintf(stderr,
"\n");
401 onlySingleIdReturn = 0;
407 onlySingleIdReturn = 1;
409 }
else { numCharging++; }
413 fprintf(stderr,
"\n");
415 if (onlySingleId > 0) {
break; }
426 if (ofp != NULL) { fclose(ofp); }
428 if (onlySingleId > 0) {
return onlySingleIdReturn; }
436 printf(
"RECORD: batch sets clear and record fully-charged devices.\n");
443 for (i = 1; i < argc; i++)
445 if (strcmp(argv[i],
"-id") == 0)
447 onlySingleId = (int)strtoul(argv[++i], NULL, 10);
448 printf(
"*** SINGLE ID MODE FOR %d ***\n", onlySingleId);
450 else if (strcmp(argv[i],
"-startdays") == 0) {
startDays = atoi(argv[++i]);
printf(
"PARAM: startDays=%d\n",
startDays); }
451 else if (strcmp(argv[i],
"-starthour") == 0) {
startHour = atoi(argv[++i]);
printf(
"PARAM: startHour=%d\n",
startHour); }
453 else if (strcmp(argv[i],
"-endhour") == 0) {
endHour = atoi(argv[++i]);
printf(
"PARAM: endHour=%d\n",
endHour); }
454 else if (strcmp(argv[i],
"-minbatt") == 0) {
minBatt = atoi(argv[++i]);
printf(
"PARAM: minBatt=%d\n",
minBatt); }
455 else if (strcmp(argv[i],
"-debugmode") == 0) {
debugMode = atoi(argv[++i]);
printf(
"PARAM: debugmode=%d\n",
debugMode); }
456 else if (argv[i][0] ==
'-') {
printf(
"WARNING: Ignoring parameter: %s\n", argv[i]); }
467 printf(
"Usage: record <output-file>\n");
469 printf(
"Where: output-file: will receive the device ids\n");
471 printf(
"Example: deploy output.csv\n");