diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/WeatherSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/WeatherSpec.java index c2f6ffb69..b35a51a57 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/WeatherSpec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/WeatherSpec.java @@ -22,6 +22,7 @@ import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; +import java.util.Arrays; // FIXME: document me and my fields, including units public class WeatherSpec implements Parcelable { @@ -54,6 +55,19 @@ public class WeatherSpec implements Parcelable { } + // Lower bounds of beaufort regions 1 to 12 + // Values from https://en.wikipedia.org/wiki/Beaufort_scale + static final float[] beaufort = new float[] { 2, 6, 12, 20, 29, 39, 50, 62, 75, 89, 103, 118 }; + // level: 0 1 2 3 4 5 6 7 8 9 10 11 12 + + public int windSpeedAsBeaufort() { + int l = 0; + while (l < beaufort.length && beaufort[l] < this.windSpeed) { + l++; + } + return l; + } + protected WeatherSpec(Parcel in) { int version = in.readInt(); if (version == VERSION) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index 3bc0b78c7..2332d77e7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -264,6 +264,20 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { return false; } + /** + * Return the wind speed as sting in a format that is supported by the device. + * + * A lot of devices only support "levels", in GB we send the Beaufort speed. + * Override this in the device specific support class if other, more clear, + * formats are supported. + * + * @param weatherSpec + * @return + */ + public String windSpeedString(WeatherSpec weatherSpec){ + return weatherSpec.windSpeedAsBeaufort() + ""; // cast to string + } + /** * Returns the given date/time (calendar) as a byte sequence, suitable for sending to the * Mi Band 2 (or derivative). The band appears to not handle DST offsets, so we simply add this @@ -2217,7 +2231,7 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { TransactionBuilder builder; builder = performInitialized("Sending wind/humidity"); - String windString = weatherSpec.windSpeed + "km/h"; + String windString = this.windSpeedString(weatherSpec); String humidityString = weatherSpec.currentHumidity + "%"; int length = 8 + windString.getBytes().length + humidityString.getBytes().length; @@ -2237,34 +2251,32 @@ public class HuamiSupport extends AbstractBTLEDeviceSupport { LOG.error("Error sending wind/humidity", ex); } - if (GBApplication.getPrefs().getBoolean("send_sunrise_sunset", false)) { - float[] longlat = GBApplication.getGBPrefs().getLongLat(getContext()); - float longitude = longlat[0]; - float latitude = longlat[1]; - if (longitude != 0 && latitude != 0) { - final GregorianCalendar dateTimeToday = new GregorianCalendar(); + float[] longlat = GBApplication.getGBPrefs().getLongLat(getContext()); + float longitude = longlat[0]; + float latitude = longlat[1]; + if (longitude != 0 && latitude != 0) { + final GregorianCalendar dateTimeToday = new GregorianCalendar(); - GregorianCalendar[] sunriseTransitSet = SPA.calculateSunriseTransitSet(dateTimeToday, latitude, longitude, DeltaT.estimate(dateTimeToday)); + GregorianCalendar[] sunriseTransitSet = SPA.calculateSunriseTransitSet(dateTimeToday, latitude, longitude, DeltaT.estimate(dateTimeToday)); - try { - TransactionBuilder builder; - builder = performInitialized("Sending sunrise/sunset"); + try { + TransactionBuilder builder; + builder = performInitialized("Sending sunrise/sunset"); - ByteBuffer buf = ByteBuffer.allocate(10); - buf.order(ByteOrder.LITTLE_ENDIAN); - buf.put((byte) 16); - buf.putInt(weatherSpec.timestamp); - buf.put((byte) (tz_offset_hours * 4)); - buf.put((byte) sunriseTransitSet[0].get(GregorianCalendar.HOUR_OF_DAY)); - buf.put((byte) sunriseTransitSet[0].get(GregorianCalendar.MINUTE)); - buf.put((byte) sunriseTransitSet[2].get(GregorianCalendar.HOUR_OF_DAY)); - buf.put((byte) sunriseTransitSet[2].get(GregorianCalendar.MINUTE)); + ByteBuffer buf = ByteBuffer.allocate(10); + buf.order(ByteOrder.LITTLE_ENDIAN); + buf.put((byte) 16); + buf.putInt(weatherSpec.timestamp); + buf.put((byte) (tz_offset_hours * 4)); + buf.put((byte) sunriseTransitSet[0].get(GregorianCalendar.HOUR_OF_DAY)); + buf.put((byte) sunriseTransitSet[0].get(GregorianCalendar.MINUTE)); + buf.put((byte) sunriseTransitSet[2].get(GregorianCalendar.HOUR_OF_DAY)); + buf.put((byte) sunriseTransitSet[2].get(GregorianCalendar.MINUTE)); - writeToChunked(builder, 1, buf.array()); - builder.queue(getQueue()); - } catch (Exception ex) { - LOG.error("Error sending sunset/sunrise", ex); - } + writeToChunked(builder, 1, buf.array()); + builder.queue(getQueue()); + } catch (Exception ex) { + LOG.error("Error sending sunset/sunrise", ex); } } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbips/AmazfitBipSSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbips/AmazfitBipSSupport.java index bd7528d23..578645d2f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbips/AmazfitBipSSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/amazfitbips/AmazfitBipSSupport.java @@ -29,6 +29,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.huami.amazfitbips.AmazfitBipSFWHelper; import nodomain.freeyourgadget.gadgetbridge.model.CallSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; +import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.amazfitbip.AmazfitBipSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.operations.UpdateFirmwareOperation; @@ -61,6 +62,11 @@ public class AmazfitBipSSupport extends AmazfitBipSupport { return (!isDTH(version) && (version.compareTo(new Version("2.1.1.50")) >= 0) || (version.compareTo(new Version("4.1.5.55")) >= 0)); } + @Override + public String windSpeedString(WeatherSpec weatherSpec){ + return weatherSpec.windSpeed + "km/h"; + } + @Override public void onSetCallState(CallSpec callSpec) { onSetCallStateNew(callSpec); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband5/MiBand5Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband5/MiBand5Support.java index 1cdaee46b..79dbeb075 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband5/MiBand5Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/miband5/MiBand5Support.java @@ -50,6 +50,12 @@ public class MiBand5Support extends MiBand4Support { return new MiBand5FWHelper(uri, context); } + + @Override + public boolean supportsSunriseSunsetWindHumidity() { + return true; + } + @Override public int getActivitySampleSize() { return 8;