From ba9e5c8a7782d1b2b9a28a9d0335da6a41a9d8a0 Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Mon, 20 May 2024 18:15:12 +0200 Subject: [PATCH] Garmin: various minor changes remove message placeholders referring to legacy code, remove try-catch from the weather data message building method lower the frequency of music control messages --- .../service/devices/garmin/GarminSupport.java | 156 +++++++++--------- .../devices/garmin/messages/GFDIMessage.java | 10 -- 2 files changed, 76 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java index 8b783b430..89f8d78ed 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java @@ -350,86 +350,82 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni sendOutgoingMessage("send weather definitions", new nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.FitDefinitionMessage(weatherDefinitions)); - try { - RecordData today = new RecordData(recordDefinitionToday, recordDefinitionToday.getRecordHeader()); - today.setFieldByName("weather_report", 0); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast - today.setFieldByName("timestamp", weather.timestamp); - today.setFieldByName("observed_at_time", weather.timestamp); - today.setFieldByName("temperature", weather.currentTemp); - today.setFieldByName("low_temperature", weather.todayMinTemp); - today.setFieldByName("high_temperature", weather.todayMaxTemp); - today.setFieldByName("condition", weather.currentConditionCode); - today.setFieldByName("wind_direction", weather.windDirection); - today.setFieldByName("precipitation_probability", weather.precipProbability); - today.setFieldByName("wind_speed", Math.round(weather.windSpeed)); - today.setFieldByName("temperature_feels_like", weather.feelsLikeTemp); - today.setFieldByName("relative_humidity", weather.currentHumidity); - today.setFieldByName("observed_location_lat", weather.latitude); - today.setFieldByName("observed_location_long", weather.longitude); - today.setFieldByName("dew_point", weather.dewPoint); - if (null != weather.airQuality) { - today.setFieldByName("air_quality", weather.airQuality.aqi); - } - today.setFieldByName("location", weather.location); - weatherData.add(today); - - for (int hour = 0; hour <= 11; hour++) { - if (hour < weather.hourly.size()) { - WeatherSpec.Hourly hourly = weather.hourly.get(hour); - RecordData weatherHourlyForecast = new RecordData(recordDefinitionHourly, recordDefinitionHourly.getRecordHeader()); - weatherHourlyForecast.setFieldByName("weather_report", 1); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast - weatherHourlyForecast.setFieldByName("timestamp", hourly.timestamp); - weatherHourlyForecast.setFieldByName("temperature", hourly.temp); - weatherHourlyForecast.setFieldByName("condition", hourly.conditionCode); - weatherHourlyForecast.setFieldByName("temperature_feels_like", hourly.temp); //TODO: switch to actual feels like field once Hourly contains this information - weatherHourlyForecast.setFieldByName("wind_direction", hourly.windDirection); - weatherHourlyForecast.setFieldByName("wind_speed", Math.round(hourly.windSpeed)); - weatherHourlyForecast.setFieldByName("precipitation_probability", hourly.precipProbability); - weatherHourlyForecast.setFieldByName("relative_humidity", hourly.humidity); -// weatherHourlyForecast.setFieldByName("dew_point", 0); // TODO: add once Hourly contains this information - weatherHourlyForecast.setFieldByName("uv_index", hourly.uvIndex); -// weatherHourlyForecast.setFieldByName("air_quality", 0); // TODO: add once Hourly contains this information - weatherData.add(weatherHourlyForecast); - } - } -// - RecordData todayDailyForecast = new RecordData(recordDefinitionDaily, recordDefinitionDaily.getRecordHeader()); - todayDailyForecast.setFieldByName("weather_report", 2); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast - todayDailyForecast.setFieldByName("timestamp", weather.timestamp); - todayDailyForecast.setFieldByName("low_temperature", weather.todayMinTemp); - todayDailyForecast.setFieldByName("high_temperature", weather.todayMaxTemp); - todayDailyForecast.setFieldByName("condition", weather.currentConditionCode); - todayDailyForecast.setFieldByName("precipitation_probability", weather.precipProbability); - todayDailyForecast.setFieldByName("day_of_week", weather.timestamp); - if (null != weather.airQuality) { - todayDailyForecast.setFieldByName("air_quality", weather.airQuality.aqi); - } - weatherData.add(todayDailyForecast); - - - for (int day = 0; day < 4; day++) { - if (day < weather.forecasts.size()) { - WeatherSpec.Daily daily = weather.forecasts.get(day); - int ts = weather.timestamp + (day + 1) * 24 * 60 * 60; //TODO: is this needed? - RecordData weatherDailyForecast = new RecordData(recordDefinitionDaily, recordDefinitionDaily.getRecordHeader()); - weatherDailyForecast.setFieldByName("weather_report", 2); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast - weatherDailyForecast.setFieldByName("timestamp", weather.timestamp); - weatherDailyForecast.setFieldByName("low_temperature", daily.minTemp); - weatherDailyForecast.setFieldByName("high_temperature", daily.maxTemp); - weatherDailyForecast.setFieldByName("condition", daily.conditionCode); - weatherDailyForecast.setFieldByName("precipitation_probability", daily.precipProbability); - if (null != daily.airQuality) { - weatherDailyForecast.setFieldByName("air_quality", daily.airQuality.aqi); - } - weatherDailyForecast.setFieldByName("day_of_week", ts); - weatherData.add(weatherDailyForecast); - } - } - - sendOutgoingMessage("send weather data", new nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.FitDataMessage(weatherData)); - } catch (Exception e) { - LOG.error(e.getMessage()); + RecordData today = new RecordData(recordDefinitionToday, recordDefinitionToday.getRecordHeader()); + today.setFieldByName("weather_report", 0); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast + today.setFieldByName("timestamp", weather.timestamp); + today.setFieldByName("observed_at_time", weather.timestamp); + today.setFieldByName("temperature", weather.currentTemp); + today.setFieldByName("low_temperature", weather.todayMinTemp); + today.setFieldByName("high_temperature", weather.todayMaxTemp); + today.setFieldByName("condition", weather.currentConditionCode); + today.setFieldByName("wind_direction", weather.windDirection); + today.setFieldByName("precipitation_probability", weather.precipProbability); + today.setFieldByName("wind_speed", Math.round(weather.windSpeed)); + today.setFieldByName("temperature_feels_like", weather.feelsLikeTemp); + today.setFieldByName("relative_humidity", weather.currentHumidity); + today.setFieldByName("observed_location_lat", weather.latitude); + today.setFieldByName("observed_location_long", weather.longitude); + today.setFieldByName("dew_point", weather.dewPoint); + if (null != weather.airQuality) { + today.setFieldByName("air_quality", weather.airQuality.aqi); } + today.setFieldByName("location", weather.location); + weatherData.add(today); + + for (int hour = 0; hour <= 11; hour++) { + if (hour < weather.hourly.size()) { + WeatherSpec.Hourly hourly = weather.hourly.get(hour); + RecordData weatherHourlyForecast = new RecordData(recordDefinitionHourly, recordDefinitionHourly.getRecordHeader()); + weatherHourlyForecast.setFieldByName("weather_report", 1); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast + weatherHourlyForecast.setFieldByName("timestamp", hourly.timestamp); + weatherHourlyForecast.setFieldByName("temperature", hourly.temp); + weatherHourlyForecast.setFieldByName("condition", hourly.conditionCode); + weatherHourlyForecast.setFieldByName("temperature_feels_like", hourly.temp); //TODO: switch to actual feels like field once Hourly contains this information + weatherHourlyForecast.setFieldByName("wind_direction", hourly.windDirection); + weatherHourlyForecast.setFieldByName("wind_speed", Math.round(hourly.windSpeed)); + weatherHourlyForecast.setFieldByName("precipitation_probability", hourly.precipProbability); + weatherHourlyForecast.setFieldByName("relative_humidity", hourly.humidity); +// weatherHourlyForecast.setFieldByName("dew_point", 0); // TODO: add once Hourly contains this information + weatherHourlyForecast.setFieldByName("uv_index", hourly.uvIndex); +// weatherHourlyForecast.setFieldByName("air_quality", 0); // TODO: add once Hourly contains this information + weatherData.add(weatherHourlyForecast); + } + } +// + RecordData todayDailyForecast = new RecordData(recordDefinitionDaily, recordDefinitionDaily.getRecordHeader()); + todayDailyForecast.setFieldByName("weather_report", 2); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast + todayDailyForecast.setFieldByName("timestamp", weather.timestamp); + todayDailyForecast.setFieldByName("low_temperature", weather.todayMinTemp); + todayDailyForecast.setFieldByName("high_temperature", weather.todayMaxTemp); + todayDailyForecast.setFieldByName("condition", weather.currentConditionCode); + todayDailyForecast.setFieldByName("precipitation_probability", weather.precipProbability); + todayDailyForecast.setFieldByName("day_of_week", weather.timestamp); + if (null != weather.airQuality) { + todayDailyForecast.setFieldByName("air_quality", weather.airQuality.aqi); + } + weatherData.add(todayDailyForecast); + + + for (int day = 0; day < 4; day++) { + if (day < weather.forecasts.size()) { + WeatherSpec.Daily daily = weather.forecasts.get(day); + int ts = weather.timestamp + (day + 1) * 24 * 60 * 60; + RecordData weatherDailyForecast = new RecordData(recordDefinitionDaily, recordDefinitionDaily.getRecordHeader()); + weatherDailyForecast.setFieldByName("weather_report", 2); // 0 = current, 1 = hourly_forecast, 2 = daily_forecast + weatherDailyForecast.setFieldByName("timestamp", weather.timestamp); + weatherDailyForecast.setFieldByName("low_temperature", daily.minTemp); + weatherDailyForecast.setFieldByName("high_temperature", daily.maxTemp); + weatherDailyForecast.setFieldByName("condition", daily.conditionCode); + weatherDailyForecast.setFieldByName("precipitation_probability", daily.precipProbability); + if (null != daily.airQuality) { + weatherDailyForecast.setFieldByName("air_quality", daily.airQuality.aqi); + } + weatherDailyForecast.setFieldByName("day_of_week", ts); + weatherData.add(weatherDailyForecast); + } + } + + sendOutgoingMessage("send weather data", new nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.FitDataMessage(weatherData)); } @@ -620,7 +616,7 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni stopMusicTimer(); musicStateTimer = new Timer(); - int updatePeriod = 4000; //milliseconds + int updatePeriod = 29000; //milliseconds LOG.debug("onSetMusicState: {}", stateSpec.toString()); if (stateSpec.state == MusicStateSpec.STATE_PLAYING) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/messages/GFDIMessage.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/messages/GFDIMessage.java index 82e0c511f..7cb5a4240 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/messages/GFDIMessage.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/messages/GFDIMessage.java @@ -19,16 +19,6 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.stat import nodomain.freeyourgadget.gadgetbridge.util.GB; public abstract class GFDIMessage { - public static final int MESSAGE_REQUEST = 5001; - public static final int MESSAGE_DIRECTORY_FILE_FILTER_REQUEST = 5007; - public static final int MESSAGE_FILE_READY = 5009; - public static final int MESSAGE_BATTERY_STATUS = 5023; - public static final int MESSAGE_NOTIFICATION_SOURCE = 5033; - public static final int MESSAGE_GNCS_CONTROL_POINT_REQUEST = 5034; - public static final int MESSAGE_GNCS_DATA_SOURCE = 5035; - public static final int MESSAGE_NOTIFICATION_SERVICE_SUBSCRIPTION = 5036; - public static final int MESSAGE_SYNC_REQUEST = 5037; - public static final int MESSAGE_AUTH_NEGOTIATION = 5101; protected static final Logger LOG = LoggerFactory.getLogger(GFDIMessage.class); private static int maxPacketSize = 375; //safe default? protected final ByteBuffer response = ByteBuffer.allocate(1000);