1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-05 00:12:56 +01:00

Da Fit: Add weather sync

This commit is contained in:
krzys-h 2019-12-28 14:11:42 +01:00 committed by Arjan Schrijver
parent 72743d893b
commit f1337706b2
5 changed files with 162 additions and 2 deletions

View File

@ -332,4 +332,41 @@ public class DaFitConstants {
return NOTIFICATION_TYPE_MESSAGE_OTHER;
}
}
// Weather types
public static final byte WEATHER_CLOUDY = 0;
public static final byte WEATHER_FOGGY = 1;
public static final byte WEATHER_OVERCAST = 2;
public static final byte WEATHER_RAINY = 3;
public static final byte WEATHER_SNOWY = 4;
public static final byte WEATHER_SUNNY = 5;
public static final byte WEATHER_SANDSTORM = 6; // aka "wind", according to the image
public static final byte WEATHER_HAZE = 7; // it's basically very big fog :P
// NOTE: values > 7 give random glitchy crap as images :D
public static byte openWeatherConditionToDaFitConditionId(int openWeatherMapCondition) {
int openWeatherMapGroup = openWeatherMapCondition / 100;
switch (openWeatherMapGroup) {
case 2: // thunderstorm
case 3: // drizzle
case 5: // rain
return DaFitConstants.WEATHER_RAINY;
case 6: // snow
return DaFitConstants.WEATHER_SNOWY;
case 7: // fog
return DaFitConstants.WEATHER_FOGGY;
case 8: // clear / clouds
if (openWeatherMapCondition <= 801) // few clouds
return DaFitConstants.WEATHER_SUNNY;
if (openWeatherMapCondition >= 804) // overcast clouds
return DaFitConstants.WEATHER_CLOUDY;
return DaFitConstants.WEATHER_OVERCAST;
case 9: // extreme
default:
if (openWeatherMapCondition == 905) // windy
return DaFitConstants.WEATHER_SANDSTORM;
return DaFitConstants.WEATHER_HAZE;
}
}
}

View File

@ -150,7 +150,7 @@ public class DaFitDeviceCoordinator extends AbstractDeviceCoordinator {
@Override
public boolean supportsWeather() {
return false;
return true;
}
@Override

View File

@ -0,0 +1,38 @@
/* Copyright (C) 2019 krzys_h
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.devices.dafit;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
public class DaFitWeatherForecast {
public final byte conditionId;
public final byte minTemp;
public final byte maxTemp;
public DaFitWeatherForecast(byte conditionId, byte minTemp, byte maxTemp) {
this.conditionId = conditionId;
this.minTemp = minTemp;
this.maxTemp = maxTemp;
}
public DaFitWeatherForecast(WeatherSpec.Forecast forecast)
{
conditionId = DaFitConstants.openWeatherConditionToDaFitConditionId(forecast.conditionCode);
minTemp = (byte)(forecast.minTemp - 273); // Kelvin -> Celcius
maxTemp = (byte)(forecast.maxTemp - 273); // Kelvin -> Celcius
}
}

View File

@ -0,0 +1,52 @@
/* Copyright (C) 2019 krzys_h
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.devices.dafit;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
public class DaFitWeatherToday {
public final byte conditionId;
public final byte currentTemp;
public final Short pm25; // (*)
public final String lunar_or_festival; // (*)
public final String city; // (*)
public DaFitWeatherToday(byte conditionId, byte currentTemp, @Nullable Short pm25, @NonNull String lunar_or_festival, @NonNull String city) {
if (lunar_or_festival.length() != 4)
throw new IllegalArgumentException("lunar_or_festival");
if (city.length() != 4)
throw new IllegalArgumentException("city");
this.conditionId = conditionId;
this.currentTemp = currentTemp;
this.pm25 = pm25;
this.lunar_or_festival = lunar_or_festival;
this.city = city;
}
public DaFitWeatherToday(WeatherSpec weatherSpec)
{
conditionId = DaFitConstants.openWeatherConditionToDaFitConditionId(weatherSpec.currentConditionCode);
currentTemp = (byte)(weatherSpec.currentTemp - 273); // Kelvin -> Celcius
pm25 = null;
lunar_or_festival = StringUtils.pad("", 4);
city = StringUtils.pad(weatherSpec.location.substring(0, 4), 4);
}
}

View File

@ -47,6 +47,8 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCallContro
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
import nodomain.freeyourgadget.gadgetbridge.devices.dafit.DaFitConstants;
import nodomain.freeyourgadget.gadgetbridge.devices.dafit.DaFitWeatherForecast;
import nodomain.freeyourgadget.gadgetbridge.devices.dafit.DaFitWeatherToday;
import nodomain.freeyourgadget.gadgetbridge.devices.dafit.DaFitSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
import nodomain.freeyourgadget.gadgetbridge.entities.DaFitActivitySample;
@ -952,7 +954,38 @@ public class DaFitDeviceSupport extends AbstractBTLEDeviceSupport {
@Override
public void onSendWeather(WeatherSpec weatherSpec) {
// TODO
try {
TransactionBuilder builder = performInitialized("onSendWeather");
DaFitWeatherToday weatherToday = new DaFitWeatherToday(weatherSpec);
ByteBuffer packetWeatherToday = ByteBuffer.allocate(weatherToday.pm25 != null ? 21 : 19);
packetWeatherToday.put(weatherToday.pm25 != null ? (byte)1 : (byte)0);
packetWeatherToday.put(weatherToday.conditionId);
packetWeatherToday.put(weatherToday.currentTemp);
if (weatherToday.pm25 != null)
packetWeatherToday.putShort(weatherToday.pm25);
packetWeatherToday.put(weatherToday.lunar_or_festival.getBytes("unicodebigunmarked"));
packetWeatherToday.put(weatherToday.city.getBytes("unicodebigunmarked"));
sendPacket(builder, DaFitPacketOut.buildPacket(DaFitConstants.CMD_SET_WEATHER_TODAY, packetWeatherToday.array()));
ByteBuffer packetWeatherForecast = ByteBuffer.allocate(7 * 3);
for(int i = 0; i < 7; i++)
{
DaFitWeatherForecast forecast;
if (weatherSpec.forecasts.size() > i)
forecast = new DaFitWeatherForecast(weatherSpec.forecasts.get(i));
else
forecast = new DaFitWeatherForecast(DaFitConstants.WEATHER_HAZE, (byte)-100, (byte)-100); // I don't think there is a way to send less (my watch shows only tomorrow anyway...)
packetWeatherForecast.put(forecast.conditionId);
packetWeatherForecast.put(forecast.minTemp);
packetWeatherForecast.put(forecast.maxTemp);
}
sendPacket(builder, DaFitPacketOut.buildPacket(DaFitConstants.CMD_SET_WEATHER_FUTURE, packetWeatherForecast.array()));
builder.queue(getQueue());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override