static int device_info_get(ambit_object_t *object, ambit_device_info_t *info) { uint8_t *reply_data = NULL; size_t replylen; int ret = -1; LOG_INFO("Reading device info"); if (libambit_protocol_command(object, ambit_command_device_info, komposti_version, sizeof(komposti_version), &reply_data, &replylen, 1) == 0) { if (info != NULL) { const char *p = (char *)reply_data; info->model = utf8memconv(p, LIBAMBIT_MODEL_LENGTH, NULL); p += LIBAMBIT_MODEL_LENGTH; info->serial = utf8memconv(p, LIBAMBIT_SERIAL_LENGTH, NULL); p += LIBAMBIT_SERIAL_LENGTH; memcpy(info->fw_version, p, 4); memcpy(info->hw_version, p + 4, 4); } ret = 0; } else { LOG_WARNING("Failed to device info"); } libambit_protocol_free(reply_data); return ret; }
static int parse_log_header(const uint8_t *data, ambit3_log_header_t *log_header) { struct tm tm; char *ptr; size_t offset = 0; // Start with parsing the time if ((ptr = libambit_strptime((const char *)data, "%Y-%m-%dT%H:%M:%S", &tm)) == NULL) { return -1; } log_header->header.date_time.year = 1900 + tm.tm_year; log_header->header.date_time.month = tm.tm_mon + 1; log_header->header.date_time.day = tm.tm_mday; log_header->header.date_time.hour = tm.tm_hour; log_header->header.date_time.minute = tm.tm_min; log_header->header.date_time.msec = tm.tm_sec*1000; offset += (size_t)ptr - (size_t)data + 1; log_header->synced = read8inc(data, &offset); log_header->address = read32inc(data, &offset); log_header->end_address = read32inc(data, &offset); offset += 8; // Unknown bytes log_header->header.heartrate_min = read8inc(data, &offset); log_header->header.heartrate_avg = read8inc(data, &offset); log_header->header.heartrate_max = read8inc(data, &offset); log_header->header.heartrate_max_time = read32inc(data, &offset); log_header->header.heartrate_min_time = read32inc(data, &offset); // temperature format is messed up, 1 byte is missing, just skip for now log_header->header.temperature_min = 0; log_header->header.temperature_max = 0; offset += 2; log_header->header.temperature_min_time = read32inc(data, &offset); log_header->header.temperature_max_time = read32inc(data, &offset); log_header->header.altitude_min = read16inc(data, &offset); log_header->header.altitude_max = read16inc(data, &offset); log_header->header.altitude_min_time = read32inc(data, &offset); log_header->header.altitude_max_time = read32inc(data, &offset); log_header->header.cadence_avg = read8inc(data, &offset); log_header->header.cadence_max = read8inc(data, &offset); log_header->header.cadence_max_time = read32inc(data, &offset); log_header->header.speed_avg = read16inc(data, &offset); // 10 m/h log_header->header.speed_max = read16inc(data, &offset); // 10 m/h log_header->header.speed_max_time = read32inc(data, &offset); offset += 4; // Unknown bytes log_header->header.duration = read32inc(data, &offset)*100; // seconds 0.1 log_header->header.ascent = read16inc(data, &offset); log_header->header.descent = read16inc(data, &offset); log_header->header.ascent_time = read32inc(data, &offset)*1000; log_header->header.descent_time = read32inc(data, &offset)*1000; log_header->header.recovery_time = read16inc(data, &offset)*60*1000; log_header->header.peak_training_effect = read8inc(data, &offset); if (log_header->header.activity_name) { free(log_header->header.activity_name); } log_header->header.activity_name = utf8memconv((const char*)(data + offset), 16, "ISO-8859-15"); log_header->header.distance = read32inc(data, &offset); log_header->header.energy_consumption = read16inc(data, &offset); return 0; }
char * utf8wcsconv(const wchar_t *src) { size_t len = wcslen(src) * sizeof(wchar_t); return utf8memconv((char *)src, len, "WCHAR_T"); }