mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-28 21:06:50 +01:00
Add outgoing parsing
This commit is contained in:
parent
2b1c5b5819
commit
0b64408b33
@ -553,6 +553,13 @@ public class HuaweiPacket {
|
|||||||
default:
|
default:
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
case Weather.id:
|
||||||
|
switch (this.commandId) {
|
||||||
|
case Weather.WeatherForecastData.id:
|
||||||
|
return new Weather.WeatherForecastData.OutgoingRequest(paramsProvider).fromPacket(this);
|
||||||
|
default:
|
||||||
|
return this;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,9 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets;
|
package nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
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 final byte id = 0x08;
|
||||||
|
|
||||||
public static class TimeData {
|
public static class TimeData {
|
||||||
public int timestamp;
|
public int timestamp;
|
||||||
public byte icon;
|
public byte icon;
|
||||||
public byte temperature;
|
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 {
|
public static class DayData {
|
||||||
@ -223,56 +237,112 @@ public class Weather {
|
|||||||
public int moonRiseTime;
|
public int moonRiseTime;
|
||||||
public int moonSetTime;
|
public int moonSetTime;
|
||||||
public byte moonPhase; // TODO: probably enum
|
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(
|
public static class Request extends HuaweiPacket {
|
||||||
ParamsProvider paramsProvider,
|
public Request(
|
||||||
List<TimeData> timeDataList,
|
ParamsProvider paramsProvider,
|
||||||
List<DayData> dayDataList
|
List<TimeData> timeDataList,
|
||||||
) {
|
List<DayData> dayDataList
|
||||||
super(paramsProvider);
|
) {
|
||||||
|
super(paramsProvider);
|
||||||
|
|
||||||
this.serviceId = Weather.id;
|
this.serviceId = Weather.id;
|
||||||
this.commandId = id;
|
this.commandId = id;
|
||||||
this.tlv = new HuaweiTLV();
|
this.tlv = new HuaweiTLV();
|
||||||
|
|
||||||
if (timeDataList != null && !timeDataList.isEmpty()) {
|
if (timeDataList != null && !timeDataList.isEmpty()) {
|
||||||
HuaweiTLV timeDataTlv = new HuaweiTLV();
|
HuaweiTLV timeDataTlv = new HuaweiTLV();
|
||||||
for (TimeData timeData : timeDataList) {
|
for (TimeData timeData : timeDataList) {
|
||||||
// TODO: NULLs?
|
// TODO: NULLs?
|
||||||
timeDataTlv.put(0x82, new HuaweiTLV()
|
timeDataTlv.put(0x82, new HuaweiTLV()
|
||||||
.put(0x03, timeData.timestamp)
|
.put(0x03, timeData.timestamp)
|
||||||
.put(0x04, timeData.icon)
|
.put(0x04, timeData.icon)
|
||||||
.put(0x05, timeData.temperature)
|
.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()) {
|
if (dayDataList != null && !dayDataList.isEmpty()) {
|
||||||
HuaweiTLV dayDataTlv = new HuaweiTLV();
|
HuaweiTLV dayDataTlv = new HuaweiTLV();
|
||||||
for (DayData dayData : dayDataList) {
|
for (DayData dayData : dayDataList) {
|
||||||
// TODO: NULLs?
|
// TODO: NULLs?
|
||||||
dayDataTlv.put(0x91, new HuaweiTLV()
|
dayDataTlv.put(0x91, new HuaweiTLV()
|
||||||
.put(0x12, dayData.timestamp)
|
.put(0x12, dayData.timestamp)
|
||||||
.put(0x13, dayData.icon)
|
.put(0x13, dayData.icon)
|
||||||
.put(0x14, dayData.highTemperature)
|
.put(0x14, dayData.highTemperature)
|
||||||
.put(0x15, dayData.lowTemperature)
|
.put(0x15, dayData.lowTemperature)
|
||||||
.put(0x16, dayData.sunriseTime)
|
.put(0x16, dayData.sunriseTime)
|
||||||
.put(0x17, dayData.sunsetTime)
|
.put(0x17, dayData.sunsetTime)
|
||||||
.put(0x1a, dayData.moonRiseTime)
|
.put(0x1a, dayData.moonRiseTime)
|
||||||
.put(0x1b, dayData.moonSetTime)
|
.put(0x1b, dayData.moonSetTime)
|
||||||
.put(0x1e, dayData.moonPhase)
|
.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.isEncrypted = true;
|
||||||
this.isSliced = true;
|
this.isSliced = true;
|
||||||
this.complete = true;
|
this.complete = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class OutgoingRequest extends HuaweiPacket {
|
||||||
|
List<TimeData> timeDataList;
|
||||||
|
List<DayData> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Weather;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Weather;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
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 {
|
public class SendWeatherForecastRequest extends Request {
|
||||||
WeatherSpec weatherSpec;
|
WeatherSpec weatherSpec;
|
||||||
@ -31,23 +31,23 @@ public class SendWeatherForecastRequest extends Request {
|
|||||||
public SendWeatherForecastRequest(HuaweiSupportProvider support, WeatherSpec weatherSpec) {
|
public SendWeatherForecastRequest(HuaweiSupportProvider support, WeatherSpec weatherSpec) {
|
||||||
super(support);
|
super(support);
|
||||||
this.serviceId = Weather.id;
|
this.serviceId = Weather.id;
|
||||||
this.commandId = Weather.WeatherForecastDataRequest.id;
|
this.commandId = Weather.WeatherForecastData.id;
|
||||||
this.weatherSpec = weatherSpec;
|
this.weatherSpec = weatherSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<byte[]> createRequest() throws RequestCreationException {
|
protected List<byte[]> createRequest() throws RequestCreationException {
|
||||||
// TODO: Weather settings
|
// TODO: Weather settings
|
||||||
ArrayList<WeatherForecastDataRequest.TimeData> timeDataArrayList = new ArrayList<>(
|
ArrayList<WeatherForecastData.TimeData> timeDataArrayList = new ArrayList<>(
|
||||||
this.weatherSpec.hourly.size() // TODO: wrong size
|
this.weatherSpec.hourly.size() // TODO: wrong size
|
||||||
);
|
);
|
||||||
ArrayList<WeatherForecastDataRequest.DayData> dayDataArrayList = new ArrayList<>(
|
ArrayList<WeatherForecastData.DayData> dayDataArrayList = new ArrayList<>(
|
||||||
this.weatherSpec.forecasts.size() // TODO: wrong size
|
this.weatherSpec.forecasts.size() // TODO: wrong size
|
||||||
);
|
);
|
||||||
// for (WeatherSpec.Hourly hourly : weatherSpec.hourly) {
|
// 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);
|
WeatherSpec.Hourly hourly = weatherSpec.hourly.get(i);
|
||||||
WeatherForecastDataRequest.TimeData timeData = new WeatherForecastDataRequest.TimeData();
|
WeatherForecastData.TimeData timeData = new WeatherForecastData.TimeData();
|
||||||
timeData.timestamp = hourly.timestamp;
|
timeData.timestamp = hourly.timestamp;
|
||||||
timeData.icon = 1; // TODO: hourly.conditionCode conversion
|
timeData.icon = 1; // TODO: hourly.conditionCode conversion
|
||||||
timeData.temperature = (byte) (hourly.temp - 273);
|
timeData.temperature = (byte) (hourly.temp - 273);
|
||||||
@ -55,7 +55,7 @@ public class SendWeatherForecastRequest extends Request {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add today as well
|
// Add today as well
|
||||||
WeatherForecastDataRequest.DayData today = new WeatherForecastDataRequest.DayData();
|
WeatherForecastData.DayData today = new WeatherForecastData.DayData();
|
||||||
today.timestamp = weatherSpec.sunRise;
|
today.timestamp = weatherSpec.sunRise;
|
||||||
today.icon = 1; // TODO
|
today.icon = 1; // TODO
|
||||||
today.highTemperature = (byte) (weatherSpec.todayMaxTemp - 273);
|
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?
|
for (int i = 0; i < Math.min(weatherSpec.forecasts.size(), 7); i++) { // TODO: min?
|
||||||
WeatherSpec.Daily daily = weatherSpec.forecasts.get(i);
|
WeatherSpec.Daily daily = weatherSpec.forecasts.get(i);
|
||||||
WeatherForecastDataRequest.DayData dayData = new WeatherForecastDataRequest.DayData();
|
WeatherForecastData.DayData dayData = new WeatherForecastData.DayData();
|
||||||
dayData.timestamp = daily.sunRise;
|
dayData.timestamp = daily.sunRise;
|
||||||
dayData.icon = 1; // TODO: daily.conditionCode conversion
|
dayData.icon = 1; // TODO: daily.conditionCode conversion
|
||||||
dayData.highTemperature = (byte) (daily.maxTemp - 273);
|
dayData.highTemperature = (byte) (daily.maxTemp - 273);
|
||||||
@ -82,7 +82,7 @@ public class SendWeatherForecastRequest extends Request {
|
|||||||
dayDataArrayList.add(dayData);
|
dayDataArrayList.add(dayData);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return new WeatherForecastDataRequest(
|
return new WeatherForecastData.Request(
|
||||||
this.paramsProvider,
|
this.paramsProvider,
|
||||||
timeDataArrayList,
|
timeDataArrayList,
|
||||||
dayDataArrayList
|
dayDataArrayList
|
||||||
|
Loading…
Reference in New Issue
Block a user