diff --git a/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocation.java b/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocation.java index 2d08061..f60d778 100644 --- a/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocation.java +++ b/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocation.java @@ -131,6 +131,8 @@ public float getAltitudeAccuracy() { private int _cadence = 0; private float _sensorSpeed = 0; private long _sensorSpeedTime = 0; + private int _power = 0; + private int _maxPower = 0; // debug levels public int debugLevel = 0; @@ -393,7 +395,7 @@ public void setSaveLocation(boolean saveLocation) { this._saveLocation = saveLocation; } - public int onLocationChanged(Location location, int heartRate, int cadence) { + public int onLocationChanged(Location location, int heartRate, int cadence, int power) { int returnValue = NORMAL; long deltaTime = 0; float deltaDistance = 0; @@ -440,6 +442,8 @@ public int onLocationChanged(Location location, int heartRate, int cadence) { } _hearRate = heartRate; _cadence = cadence; + _power = power; + _maxPower = Math.max(_power, _maxPower); if ((lastGoodLocation != null) && ((location.getTime() - lastGoodLocation.getTime()) < 500)) { // less than X ms, skip this location @@ -757,6 +761,11 @@ private void _saveLocation() { if (_cadence > 0) { values.put("loca_cad", _cadence); } + if (_power > 0) { + values.put("loca_power",_power); + } + values.put("loca_speed", this.getSpeed()); + values.put("loca_distance", this.getDistance()); //values.put("loca_comment", ""); long newRowId = db.insert( @@ -765,6 +774,64 @@ private void _saveLocation() { values); }; + public String getTCX(final String sportType) { + StringBuilder tcx = new StringBuilder(); + tcx.append("\n" + + "\n"); + + String selectQuery = "SELECT _ID, loca_time, loca_lat, loca_lon, loca_altitude, loca_accuracy, loca_comment, loca_ascent, loca_gps_altitude, loca_pressure_altitude, loca_hr, loca_cad, loca_power, loca_speed, loca_distance FROM " + AdvancedLocationDbHelper.Location.TABLE_NAME + " ORDER BY _ID ASC"; + Cursor cursor = db.rawQuery(selectQuery, null); + + long itemId = -1; + int trackNumber = 1; + if (cursor.moveToFirst()) { + String time = ""; + Date netDate = (new Date(Long.parseLong(cursor.getString(1)))); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + time = sdf.format(netDate); + time = time.substring(0, time.length() - 2) + ':' + time.substring(time.length() - 2); + tcx.append("\n\n"+time+"\n\n\n"); + long prevTime = -1; + + do { + time = ""; + netDate = (new Date(Long.parseLong(cursor.getString(1)))); + time = sdf.format(netDate); + time = time.substring(0, time.length() - 2) + ':' + time.substring(time.length() - 2); + tcx.append(" \n \n "); + tcx.append("\n "+cursor.getString(2)+"\n "); + tcx.append(""+cursor.getString(3)+"\n \n"); + tcx.append(" "+cursor.getString(4)+"\n"); + tcx.append(" "+cursor.getString(14)+"\n"); + + if (!cursor.isNull(10)) { + //HR + tcx.append(" "+cursor.getString(10)+"\n"); + } + if (!cursor.isNull(11)) { + //CAD + tcx.append(" "+cursor.getString(11)+"\n"); + } + tcx.append(" \n \n "+cursor.getString(13)+"\n"); + if (!cursor.isNull(12)) { + //POWER + tcx.append(" "+cursor.getString(12)+"\n"); + } + tcx.append(" \n \n"); + tcx.append(" \n"); + } while (cursor.moveToNext()); + tcx.append("\n\n\n\n"); + } + + tcx.append(""); + return tcx.toString(); + } + public String getGPX(boolean extended) { StringBuilder gpx = new StringBuilder(); String creator = "JayPS"; @@ -847,6 +914,7 @@ public String getGPX(boolean extended) { //Logger(gpx.toString()); return gpx.toString(); } + public String getRunkeeperJson(String type) { StringBuilder json = new StringBuilder(); StringBuilder hr = new StringBuilder(); @@ -939,4 +1007,53 @@ public void Logger(String s, int level, LoggerType type) { } } } + + public int getPower() { + return _power; + } + + public int getMaxPower() { + return _maxPower; + } + + public int getAvgPower(int seconds) { + Date date = new Date(); + long timeMilli = date.getTime() - (seconds * 1000); + String time = String.format("%d",timeMilli); + String selectQuery = "SELECT loca_power from "+AdvancedLocationDbHelper.Location.TABLE_NAME+" WHERE loca_time >= "+time; + Cursor cursor = db.rawQuery(selectQuery, null); + int count = 0; + int sum = 0; + double avg = 0.0; + if (cursor.moveToFirst()) { + do { + count++; + sum += Integer.parseInt(cursor.getString(1)); + } while (cursor.moveToNext()); + avg = sum / count; + } + Logger(String.format("avgdPower time $%d count %d",seconds, count)); + return (int) Math.round(avg); + } + + public int getNormalizedPower(int seconds) { + Date date = new Date(); + long timeMilli = date.getTime() - (seconds * 1000); + String time = String.format("%d",timeMilli); + String selectQuery = "SELECT loca_power from "+AdvancedLocationDbHelper.Location.TABLE_NAME+" WHERE loca_time >= "+time; + Cursor cursor = db.rawQuery(selectQuery, null); + int count = 0; + double sum = 0; + double avg = 0.0; + if (cursor.moveToFirst()) { + do { + count++; + sum += Math.pow(Integer.parseInt(cursor.getString(1)),4); + } while (cursor.moveToNext()); + avg = sum / count; + } + double np = Math.pow(avg, 1.0/4); + Logger(String.format("NormalizedPower time $%d count %d",seconds, count)); + return (int) Math.round(avg); + } } diff --git a/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocationDbHelper.java b/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocationDbHelper.java index 9f2cfa4..ee1637c 100644 --- a/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocationDbHelper.java +++ b/advancedlocation-library/src/main/java/fr/jayps/android/AdvancedLocationDbHelper.java @@ -10,7 +10,7 @@ public class AdvancedLocationDbHelper extends SQLiteOpenHelper { private static final String TAG = "PB-AdvLocDbHelper"; - public static final int DATABASE_VERSION = 3; + public static final int DATABASE_VERSION = 4; public static final String DATABASE_NAME = "AdvancedLocation.db"; private static AdvancedLocationDbHelper sInstance; @@ -34,6 +34,9 @@ public static abstract class Location implements BaseColumns { + ", loca_hr" + TEXT_TYPE + ", loca_cad" + TEXT_TYPE + ", loca_comment" + TEXT_TYPE + + ", loca_power" + TEXT_TYPE + + ", loca_speed" + TEXT_TYPE + + ", loca_distance" + TEXT_TYPE + " )"; private static final String SQL_DELETE_ENTRIES = @@ -73,6 +76,11 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { SQLExec(db, "ALTER TABLE location ADD COLUMN loca_hr TEXT"); SQLExec(db, "ALTER TABLE location ADD COLUMN loca_cad TEXT"); } + if (oldVersion < 4) { + SQLExec(db, "ALTER TABLE location ADD COLUMN loca_power TEXT"); + SQLExec(db, "ALTER TABLE location ADD COLUMN loca_speed TEXT"); + SQLExec(db, "ALTER TABLE location ADD COLUMN loca_distance TEXT"); + } } } private void SQLExec(SQLiteDatabase db, String sql) {