diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java index 7527380f8..2c104c093 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java @@ -553,6 +553,13 @@ public class HuaweiPacket { default: return this; } + case Weather.id: + switch (this.commandId) { + case Weather.WeatherForecastData.id: + return new Weather.WeatherForecastData.OutgoingRequest(paramsProvider).fromPacket(this); + default: + return this; + } default: return this; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/Weather.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/Weather.java index 757e6e1df..e5031a1af 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/Weather.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/Weather.java @@ -16,6 +16,9 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Date; import java.util.List; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; @@ -204,13 +207,24 @@ public class Weather { } } - public static class WeatherForecastDataRequest extends HuaweiPacket { + public static class WeatherForecastData { public static final byte id = 0x08; public static class TimeData { public int timestamp; public byte icon; public byte temperature; + + @Override + public String toString() { + String timestampStr = new Date(timestamp * 1000L).toString(); + return "TimeData{" + + "timestamp=" + timestamp + + ", timestamp=" + timestampStr + + ", icon=" + icon + + ", temperature=" + temperature + + '}'; + } } public static class DayData { @@ -223,56 +237,112 @@ public class Weather { public int moonRiseTime; public int moonSetTime; public byte moonPhase; // TODO: probably enum + + @Override + public String toString() { + String timestampStr = new Date(timestamp * 1000L).toString(); + return "DayData{" + + "timestamp=" + timestamp + + ", timestamp=" + timestampStr + + ", icon=" + icon + + ", highTemperature=" + highTemperature + + ", lowTemperature=" + lowTemperature + + ", sunriseTime=" + sunriseTime + + ", sunsetTime=" + sunsetTime + + ", moonRiseTime=" + moonRiseTime + + ", moonSetTime=" + moonSetTime + + ", moonPhase=" + moonPhase + + '}'; + } } - public WeatherForecastDataRequest( - ParamsProvider paramsProvider, - List timeDataList, - List dayDataList - ) { - super(paramsProvider); + public static class Request extends HuaweiPacket { + public Request( + ParamsProvider paramsProvider, + List timeDataList, + List dayDataList + ) { + super(paramsProvider); - this.serviceId = Weather.id; - this.commandId = id; - this.tlv = new HuaweiTLV(); + this.serviceId = Weather.id; + this.commandId = id; + this.tlv = new HuaweiTLV(); - if (timeDataList != null && !timeDataList.isEmpty()) { - HuaweiTLV timeDataTlv = new HuaweiTLV(); - for (TimeData timeData : timeDataList) { - // TODO: NULLs? - timeDataTlv.put(0x82, new HuaweiTLV() - .put(0x03, timeData.timestamp) - .put(0x04, timeData.icon) - .put(0x05, timeData.temperature) - ); + if (timeDataList != null && !timeDataList.isEmpty()) { + HuaweiTLV timeDataTlv = new HuaweiTLV(); + for (TimeData timeData : timeDataList) { + // TODO: NULLs? + timeDataTlv.put(0x82, new HuaweiTLV() + .put(0x03, timeData.timestamp) + .put(0x04, timeData.icon) + .put(0x05, timeData.temperature) + ); + } + this.tlv.put(0x81, timeDataTlv); } - this.tlv.put(0x81, timeDataTlv); - } -// this.tlv.put(0x81); + // this.tlv.put(0x81); - if (dayDataList != null && !dayDataList.isEmpty()) { - HuaweiTLV dayDataTlv = new HuaweiTLV(); - for (DayData dayData : dayDataList) { - // TODO: NULLs? - dayDataTlv.put(0x91, new HuaweiTLV() - .put(0x12, dayData.timestamp) - .put(0x13, dayData.icon) - .put(0x14, dayData.highTemperature) - .put(0x15, dayData.lowTemperature) - .put(0x16, dayData.sunriseTime) - .put(0x17, dayData.sunsetTime) - .put(0x1a, dayData.moonRiseTime) - .put(0x1b, dayData.moonSetTime) - .put(0x1e, dayData.moonPhase) - ); + if (dayDataList != null && !dayDataList.isEmpty()) { + HuaweiTLV dayDataTlv = new HuaweiTLV(); + for (DayData dayData : dayDataList) { + // TODO: NULLs? + dayDataTlv.put(0x91, new HuaweiTLV() + .put(0x12, dayData.timestamp) + .put(0x13, dayData.icon) + .put(0x14, dayData.highTemperature) + .put(0x15, dayData.lowTemperature) + .put(0x16, dayData.sunriseTime) + .put(0x17, dayData.sunsetTime) + .put(0x1a, dayData.moonRiseTime) + .put(0x1b, dayData.moonSetTime) + .put(0x1e, dayData.moonPhase) + ); + } + this.tlv.put(0x90, dayDataTlv); } - this.tlv.put(0x90, dayDataTlv); - } -// this.tlv.put(0x90); + // this.tlv.put(0x90); - this.isEncrypted = true; - this.isSliced = true; - this.complete = true; + this.isEncrypted = true; + this.isSliced = true; + this.complete = true; + } + } + + public static class OutgoingRequest extends HuaweiPacket { + List timeDataList; + List dayDataList; + + public OutgoingRequest(ParamsProvider paramsProvider) { + super(paramsProvider); + this.complete = false; + } + + @Override + public void parseTlv() throws ParseException { + timeDataList = new ArrayList<>(this.tlv.getObject(0x81).getObjects(0x82).size()); + for (HuaweiTLV timeTlv : this.tlv.getObject(0x81).getObjects(0x82)) { + TimeData timeData = new TimeData(); + timeData.timestamp = timeTlv.getInteger(0x03); + timeData.icon = timeTlv.getByte(0x04); + timeData.temperature = timeTlv.getByte(0x05); + timeDataList.add(timeData); + } + + dayDataList = new ArrayList<>(this.tlv.getObject(0x90).getObjects(0x91).size()); + for (HuaweiTLV dayTlv : this.tlv.getObject(0x90).getObjects(0x91)) { + DayData dayData = new DayData(); + dayData.timestamp = dayTlv.getInteger(0x12); + dayData.icon = dayTlv.getByte(0x13); + dayData.highTemperature = dayTlv.getByte(0x14); + dayData.lowTemperature = dayTlv.getByte(0x15); + dayData.sunriseTime = dayTlv.getInteger(0x16); + dayData.sunsetTime = dayTlv.getInteger(0x17); + dayData.moonRiseTime = dayTlv.getInteger(0x1a); + dayData.moonSetTime = dayTlv.getInteger(0x1b); + dayData.moonPhase = dayTlv.getByte(0x1e); + dayDataList.add(dayData); + } + } } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendWeatherForecastRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendWeatherForecastRequest.java index fb58a373a..93dacca79 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendWeatherForecastRequest.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendWeatherForecastRequest.java @@ -23,7 +23,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Weather; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider; -import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Weather.WeatherForecastDataRequest; +import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Weather.WeatherForecastData; public class SendWeatherForecastRequest extends Request { WeatherSpec weatherSpec; @@ -31,23 +31,23 @@ public class SendWeatherForecastRequest extends Request { public SendWeatherForecastRequest(HuaweiSupportProvider support, WeatherSpec weatherSpec) { super(support); this.serviceId = Weather.id; - this.commandId = Weather.WeatherForecastDataRequest.id; + this.commandId = Weather.WeatherForecastData.id; this.weatherSpec = weatherSpec; } @Override protected List createRequest() throws RequestCreationException { // TODO: Weather settings - ArrayList timeDataArrayList = new ArrayList<>( + ArrayList timeDataArrayList = new ArrayList<>( this.weatherSpec.hourly.size() // TODO: wrong size ); - ArrayList dayDataArrayList = new ArrayList<>( + ArrayList dayDataArrayList = new ArrayList<>( this.weatherSpec.forecasts.size() // TODO: wrong size ); // for (WeatherSpec.Hourly hourly : weatherSpec.hourly) { - for (int i = 0; i < Math.min(weatherSpec.hourly.size(), 24); i++) { // TODO: min? + for (int i = Math.min(weatherSpec.hourly.size(), 24) - 1; i >= 0; i--) { // TODO: min? WeatherSpec.Hourly hourly = weatherSpec.hourly.get(i); - WeatherForecastDataRequest.TimeData timeData = new WeatherForecastDataRequest.TimeData(); + WeatherForecastData.TimeData timeData = new WeatherForecastData.TimeData(); timeData.timestamp = hourly.timestamp; timeData.icon = 1; // TODO: hourly.conditionCode conversion timeData.temperature = (byte) (hourly.temp - 273); @@ -55,7 +55,7 @@ public class SendWeatherForecastRequest extends Request { } // Add today as well - WeatherForecastDataRequest.DayData today = new WeatherForecastDataRequest.DayData(); + WeatherForecastData.DayData today = new WeatherForecastData.DayData(); today.timestamp = weatherSpec.sunRise; today.icon = 1; // TODO today.highTemperature = (byte) (weatherSpec.todayMaxTemp - 273); @@ -69,7 +69,7 @@ public class SendWeatherForecastRequest extends Request { for (int i = 0; i < Math.min(weatherSpec.forecasts.size(), 7); i++) { // TODO: min? WeatherSpec.Daily daily = weatherSpec.forecasts.get(i); - WeatherForecastDataRequest.DayData dayData = new WeatherForecastDataRequest.DayData(); + WeatherForecastData.DayData dayData = new WeatherForecastData.DayData(); dayData.timestamp = daily.sunRise; dayData.icon = 1; // TODO: daily.conditionCode conversion dayData.highTemperature = (byte) (daily.maxTemp - 273); @@ -82,7 +82,7 @@ public class SendWeatherForecastRequest extends Request { dayDataArrayList.add(dayData); } try { - return new WeatherForecastDataRequest( + return new WeatherForecastData.Request( this.paramsProvider, timeDataArrayList, dayDataArrayList