TcxTrackpoint * Edge305Device::getTrackPoint ( D303 * p) { TcxTrackpoint * singlePoint = new TcxTrackpoint(GpsFunctions::print_dtime(p->time)); if (( p->posn.lat != 0x7fffffff ) && ( p->posn.lon != 0x7fffffff )) { stringstream lat; lat.precision(10); // default 4 decimal chars which is not enough stringstream lon; lon.precision(10); // default 4 decimal chars which is not enough lat << SEMI2DEG(p->posn.lat); lon << SEMI2DEG(p->posn.lon); singlePoint->setPosition(lat.str(), lon.str()); } stringstream ss; if (p->alt < 1.0e24 ) { ss << p->alt; singlePoint->setAltitudeMeters(ss.str()); } if ( p->heart_rate != 0 ) { ss.str(""); ss << (unsigned int)(p->heart_rate); singlePoint->setHeartRateBpm(ss.str()); } return singlePoint; }
TcxTrackpoint * Edge305Device::getTrackPoint ( D304 * p) { TcxTrackpoint * singlePoint = new TcxTrackpoint(GpsFunctions::print_dtime(p->time)); if (( p->posn.lat != 0x7fffffff ) && ( p->posn.lon != 0x7fffffff )) { stringstream lat; lat.precision(10); // default 4 decimal chars which is not enough stringstream lon; lon.precision(10); // default 4 decimal chars which is not enough lat << SEMI2DEG(p->posn.lat); lon << SEMI2DEG(p->posn.lon); singlePoint->setPosition(lat.str(), lon.str()); } stringstream ss; if (p->alt < 1.0e24 ) { ss << p->alt; singlePoint->setAltitudeMeters(ss.str()); } if (p->distance < 1.0e24 ) { ss.str(""); ss << p->distance; singlePoint->setDistanceMeters(ss.str()); } if ( p->heart_rate != 0 ) { ss.str(""); ss << (unsigned int)(p->heart_rate); singlePoint->setHeartRateBpm(ss.str()); } if (this->runType == 0) { singlePoint->setCadenceSensorType(TrainingCenterDatabase::Bike); } else { singlePoint->setCadenceSensorType(TrainingCenterDatabase::Footpod); } if ( p->cadence != 0xff ) { ss.str(""); ss << (unsigned int)(p->cadence); singlePoint->setCadence(ss.str()); } if ( p->sensor != 0 ) { singlePoint->setSensorState(TrainingCenterDatabase::Present); } else { singlePoint->setSensorState(TrainingCenterDatabase::Absent); } return singlePoint; }
static PyObject* get_runs(PyObject* obj, PyObject* args) { garmin_unit garmin; if (!initialize_garmin(&garmin)) return NULL; garmin_data * data; if ( (data = garmin_get(&garmin, GET_RUNS)) == NULL ) { PyErr_SetString(PyExc_RuntimeError, "Unable to extract any data."); return NULL; } /* We should have a list with three elements: 1) The runs (which identify the track and lap indices) 2) The laps (which are related to the runs) 3) The tracks (which are related to the runs) */ garmin_data * tmpdata; garmin_list * runs = NULL; garmin_list * laps = NULL; garmin_list * tracks = NULL; tmpdata = garmin_list_data(data, 0); if ( tmpdata == NULL ) { PyErr_SetString(PyExc_RuntimeError, "Toplevel data missing element 0 (runs)"); return NULL; } runs = tmpdata->data; if ( runs == NULL ) { PyErr_SetString(PyExc_RuntimeError, "No runs extracted."); return NULL; } tmpdata = garmin_list_data(data, 1); if ( tmpdata == NULL ) { PyErr_SetString(PyExc_RuntimeError, "Toplevel data missing element 1 (laps)"); return NULL; } laps = tmpdata->data; if ( laps == NULL ) { PyErr_SetString(PyExc_RuntimeError, "No laps extracted."); return NULL; } tmpdata = garmin_list_data(data, 2); if ( tmpdata == NULL ) { PyErr_SetString(PyExc_RuntimeError, "Toplevel data missing element 2 (tracks)"); return NULL; } tracks = tmpdata->data; if ( tracks == NULL ) { PyErr_SetString(PyExc_RuntimeError, "No tracks extracted."); return NULL; } garmin_list_node * n; garmin_list_node * m; garmin_list_node * o; uint32 trk; uint32 f_lap; uint32 l_lap; uint32 l_idx; time_type start; /* Print some debug output if requested. */ if ( verbose != 0 ) { for ( m = laps->head; m != NULL; m = m->next ) { if ( get_lap_index(m->data,&l_idx) != 0 ) printf("[garmin] lap: index [%d]\n", l_idx); else printf("[garmin] lap: index [??]\n"); } } /* For each run, get its laps and track points. */ PyObject* dict = PyDict_New(); for ( n = runs->head; n != NULL; n = n->next ) { if ( get_run_track_lap_info(n->data, &trk, &f_lap, &l_lap) != 0 ) { time_type f_lap_start = 0; PyObject* run = PyDict_New(); PyObject* rlaps = PyDict_New(); PyDict_SetItem(run, PyString_FromString("track"), Py_BuildValue("i", trk)); PyDict_SetItem(run, PyString_FromString("first_lap"), Py_BuildValue("i", f_lap)); PyDict_SetItem(run, PyString_FromString("last_lap"), Py_BuildValue("i", l_lap)); PyDict_SetItem(run, PyString_FromString("type"), Py_BuildValue("i", (int)n->data->type)); /* TODO: Implement something similar for the other run types, D1000 and D1010 See src/run.c get_run_track_lap_info() for more information */ if (n->data->type == data_D1009) { D1009 * d1009; d1009 = n->data->data; PyDict_SetItem(run, PyString_FromString("multisport"), PyBool_FromLong(d1009->multisport)); switch (d1009->sport_type) { case D1000_running: PyDict_SetItem(run, PyString_FromString("sport"), PyString_FromString("running")); break; case D1000_biking: PyDict_SetItem(run, PyString_FromString("sport"), PyString_FromString("biking")); break; case D1000_other: PyDict_SetItem(run, PyString_FromString("sport"), PyString_FromString("other")); break; } } if (verbose != 0) printf("[garmin] run: track [%d], laps [%d:%d]\n",trk,f_lap,l_lap); for ( m = laps->head; m != NULL; m = m->next ) { if ( get_lap_index(m->data, &l_idx) != 0 ) { if ( l_idx >= f_lap && l_idx <= l_lap ) { PyObject* lap = PyDict_New(); if (verbose != 0) printf("[garmin] lap [%d] falls within laps [%d:%d]\n", l_idx,f_lap,l_lap); start = 0; get_lap_start_time(m->data, &start); if (start != 0) { if (l_idx == f_lap) f_lap_start = start; PyDict_SetItem(lap, PyString_FromString("start_time"), Py_BuildValue("i", (int)start)); PyDict_SetItem(lap, PyString_FromString("type"), Py_BuildValue("i", (int)m->data->type)); if (m->data->type == data_D1015) { D1015 * d1015; d1015 = m->data->data; PyDict_SetItem(lap, PyString_FromString("duration"), Py_BuildValue("i", d1015->total_time)); PyDict_SetItem(lap, PyString_FromString("distance"), Py_BuildValue("f", d1015->total_dist)); PyDict_SetItem(lap, PyString_FromString("max_speed"), Py_BuildValue("f", d1015->max_speed)); } PyObject * points = PyList_New(0); bool have_track = 0; bool done = 0; for ( o = tracks->head; o != NULL; o = o->next ) { if ( o->data != NULL ) { if (o->data->type == data_D311) { if ( ! have_track ) { D311 * d311; d311 = o->data->data; if ( d311->index == trk ) have_track = 1; } else /* We've reached the end of the track */ done = 1; } else if (o->data->type == data_D304 && have_track) { D304 * d304; d304 = o->data->data; PyObject* point = PyDict_New(); if (d304->posn.lat != 2147483647 && d304->posn.lon != 2147483647) { PyDict_SetItem(point, PyString_FromString("position"), Py_BuildValue("(ff)", SEMI2DEG(d304->posn.lat), SEMI2DEG(d304->posn.lon))); PyDict_SetItem(point, PyString_FromString("type"), Py_BuildValue("i", (int)o->data->type)); PyDict_SetItem(point, PyString_FromString("time"), Py_BuildValue("f", (float)(d304->time + TIME_OFFSET))); PyDict_SetItem(point, PyString_FromString("distance"), Py_BuildValue("f", d304->distance)); PyDict_SetItem(point, PyString_FromString("altitude"), Py_BuildValue("f", d304->alt)); PyDict_SetItem(point, PyString_FromString("heart_rate"), Py_BuildValue("i", d304->heart_rate)); if (d304->cadence != 255) PyDict_SetItem(point, PyString_FromString("cadence"), Py_BuildValue("i", d304->cadence)); PyList_Append(points, Py_BuildValue("N", point)); } } else if (have_track) printf("get_track: point type %d invalid!\n",o->data->type); } if ( done ) break; } PyDict_SetItem(lap, PyString_FromString("points"), Py_BuildValue("N", points)); } else PyErr_Warn(PyExc_Warning, "Start time of first lap not found."); PyDict_SetItem(rlaps, PyString_FromFormat("%d", (int)l_idx), Py_BuildValue("N", lap)); } } } PyDict_SetItem(run, PyString_FromString("laps"), Py_BuildValue("N", rlaps)); PyDict_SetItem(dict, PyString_FromFormat("%d", (int)f_lap_start), Py_BuildValue("N", run)); } } garmin_free_data(data); garmin_close(&garmin); return Py_BuildValue("N", dict); }
void print_record_data(void *data, struct fit_record_data *record, int nelms) { int i; uintptr_t ptr; for (i = 0; i < nelms; i++) { ptr = ((uintptr_t)data) + record[i].offset; switch(record[i].type) { case TYPE_STRING: { char *str = (char *)ptr;; printf("%20s = %s %s\n", record[i].label, str, record[i].units); break; } case TYPE_UINT8: { uint8_t value = *(uint8_t *)ptr;; if (value != UINT8_MAX) { printf("%20s = %.2f %s\n", record[i].label, value * record[i].scale, record[i].units); } else { printf("%20s = INVALID\n", record[i].label); } break; } case TYPE_UINT16: { uint16_t value = *(uint16_t *)ptr;; if (value != UINT16_MAX) { printf("%20s = %.2f %s\n", record[i].label, value * record[i].scale, record[i].units); } else { printf("%20s = INVALID\n", record[i].label); } break; } case TYPE_UINT32: { uint32_t value = *(uint32_t *)ptr;; if (value != UINT32_MAX) { printf("%20s = %.2f %s\n", record[i].label, value * record[i].scale, record[i].units); } else { printf("%20s = INVALID\n", record[i].label); } break; } case TYPE_INT8: { int8_t value = *(int8_t *)ptr;; if (value != INT8_MAX) { printf("%20s = %.2f %s\n", record[i].label, value * record[i].scale, record[i].units); } else { printf("%20s = INVALID\n", record[i].label); } break; } case TYPE_INT16: { int16_t value = *(int16_t *)ptr;; if (value != INT16_MAX) { printf("%20s = %.2f %s\n", record[i].label, value * record[i].scale, record[i].units); } else { printf("%20s = INVALID\n", record[i].label); } break; } case TYPE_INT32: { int32_t value = *(int32_t *)ptr;; if (value != INT32_MAX) { printf("%20s = %.2f %s\n", record[i].label, value * record[i].scale, record[i].units); } else { printf("%20s = INVALID\n", record[i].label); } break; } case TYPE_POS: { int32_t value = *(int32_t *)ptr;; if (value != INT32_MAX) { printf("%20s = %.6f %s\n", record[i].label, SEMI2DEG(value), record[i].units); } else { printf("%20s = INVALID\n", record[i].label); } break; } case TYPE_TIME: { uint32_t value = *(uint32_t *)ptr;; if (value != UINT32_MAX) { time_t tval; struct tm tmval; char buf[128]; tval = value + TIME_OFFSET; localtime_r(&tval,&tmval); strftime(buf,sizeof(buf)-1,"%FT%T%z",&tmval); printf("%20s = %s\n", record[i].label, buf); } else { printf("%20s = INVALID\n", record[i].label); } break; } default: printf("Unknwon type for field '%s'\n", record[i].label); } } }