Pebble: Cleanup AppMessage handlers
This commit is contained in:
parent
a4a59f5df4
commit
d21b5e68b5
|
@ -0,0 +1,28 @@
|
|||
package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble;
|
||||
|
||||
|
||||
import android.util.Pair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.UUID;
|
||||
|
||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
|
||||
|
||||
public class AppMessageHandler {
|
||||
protected final PebbleProtocol mPebbleProtocol;
|
||||
protected final UUID mUUID;
|
||||
|
||||
AppMessageHandler(UUID uuid, PebbleProtocol pebbleProtocol) {
|
||||
mUUID = uuid;
|
||||
mPebbleProtocol = pebbleProtocol;
|
||||
}
|
||||
|
||||
public UUID getUUID() {
|
||||
return mUUID;
|
||||
}
|
||||
|
||||
public GBDeviceEvent[] handleMessage(ArrayList<Pair<Integer, Object>> pairs) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -19,20 +19,18 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
|
|||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes;
|
||||
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||
|
||||
public class GadgetbridgePblSupport {
|
||||
public class AppMessageHandlerGBPebble extends AppMessageHandler {
|
||||
|
||||
public static final int KEY_TIMESTAMP = 1;
|
||||
public static final int KEY_SAMPLES = 2;
|
||||
|
||||
public static final UUID uuid = UUID.fromString("61476764-7465-7262-6469-656775527a6c");
|
||||
private final PebbleProtocol mPebbleProtocol;
|
||||
private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerGBPebble.class);
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(GadgetbridgePblSupport.class);
|
||||
|
||||
public GadgetbridgePblSupport(PebbleProtocol pebbleProtocol) {
|
||||
mPebbleProtocol = pebbleProtocol;
|
||||
AppMessageHandlerGBPebble(UUID uuid, PebbleProtocol pebbleProtocol) {
|
||||
super(uuid, pebbleProtocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GBDeviceEvent[] handleMessage(ArrayList<Pair<Integer, Object>> pairs) {
|
||||
int timestamp = 0;
|
||||
for (Pair<Integer, Object> pair : pairs) {
|
||||
|
@ -74,7 +72,7 @@ public class GadgetbridgePblSupport {
|
|||
}
|
||||
}
|
||||
GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes();
|
||||
sendBytes.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(uuid, mPebbleProtocol.last_id);
|
||||
sendBytes.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id);
|
||||
return new GBDeviceEvent[]{sendBytes};
|
||||
}
|
||||
}
|
|
@ -19,7 +19,7 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSleepMonit
|
|||
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||
import nodomain.freeyourgadget.gadgetbridge.devices.pebble.MorpheuzSampleProvider;
|
||||
|
||||
public class MorpheuzSupport {
|
||||
public class AppMessageHandlerMorpheuz extends AppMessageHandler {
|
||||
|
||||
public static final int KEY_POINT = 1;
|
||||
public static final int KEY_CTRL = 2;
|
||||
|
@ -37,28 +37,26 @@ public class MorpheuzSupport {
|
|||
public static final int CTRL_DO_NEXT = 8;
|
||||
public static final int CTRL_SET_LAST_SENT = 16;
|
||||
|
||||
public static final UUID uuid = UUID.fromString("5be44f1d-d262-4ea6-aa30-ddbec1e3cab2");
|
||||
private final PebbleProtocol mPebbleProtocol;
|
||||
|
||||
// data received from Morpheuz in native format
|
||||
private int smartalarm_from = -1; // time in minutes relative from 0:00 for smart alarm (earliest)
|
||||
private int smartalarm_to = -1;// time in minutes relative from 0:00 for smart alarm (latest)
|
||||
private int recording_base_timestamp = -1; // timestamp for the first "point", all folowing are +10 minutes offset each
|
||||
private int alarm_gone_off = -1; // time in minutes relative from 0:00 when alarm gone off
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(MorpheuzSupport.class);
|
||||
private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerMorpheuz.class);
|
||||
|
||||
public MorpheuzSupport(PebbleProtocol pebbleProtocol) {
|
||||
mPebbleProtocol = pebbleProtocol;
|
||||
public AppMessageHandlerMorpheuz(UUID uuid, PebbleProtocol pebbleProtocol) {
|
||||
super(uuid, pebbleProtocol);
|
||||
}
|
||||
|
||||
private byte[] encodeMorpheuzMessage(int key, int value) {
|
||||
ArrayList<Pair<Integer, Object>> pairs = new ArrayList<>();
|
||||
pairs.add(new Pair<Integer, Object>(key, value));
|
||||
|
||||
return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, uuid, pairs);
|
||||
return mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GBDeviceEvent[] handleMessage(ArrayList<Pair<Integer, Object>> pairs) {
|
||||
int ctrl_message = 0;
|
||||
GBDeviceEventSleepMonitorResult sleepMonitorResult = null;
|
||||
|
@ -80,7 +78,7 @@ public class MorpheuzSupport {
|
|||
case KEY_POINT:
|
||||
if (recording_base_timestamp == -1) {
|
||||
// we have no base timestamp but received points, stop this
|
||||
ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_GONEOFF_DONE | MorpheuzSupport.CTRL_TRANSMIT_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT;
|
||||
ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_GONEOFF_DONE | AppMessageHandlerMorpheuz.CTRL_TRANSMIT_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT;
|
||||
} else {
|
||||
short index = (short) ((int) pair.second >> 16);
|
||||
short intensity = (short) ((int) pair.second & 0xffff);
|
||||
|
@ -105,32 +103,32 @@ public class MorpheuzSupport {
|
|||
}
|
||||
}
|
||||
|
||||
ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT;
|
||||
ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT;
|
||||
}
|
||||
break;
|
||||
case KEY_FROM:
|
||||
smartalarm_from = (int) pair.second;
|
||||
LOG.info("got from: " + smartalarm_from / 60 + ":" + smartalarm_from % 60);
|
||||
ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT;
|
||||
ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT;
|
||||
break;
|
||||
case KEY_TO:
|
||||
smartalarm_to = (int) pair.second;
|
||||
LOG.info("got from: " + smartalarm_to / 60 + ":" + smartalarm_to % 60);
|
||||
ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT;
|
||||
ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT;
|
||||
break;
|
||||
case KEY_VERSION:
|
||||
LOG.info("got version: " + ((float) ((int) pair.second) / 10.0f));
|
||||
ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT;
|
||||
ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT;
|
||||
break;
|
||||
case KEY_BASE:
|
||||
// fix timestamp
|
||||
TimeZone tz = SimpleTimeZone.getDefault();
|
||||
recording_base_timestamp = (int) pair.second - (tz.getOffset(System.currentTimeMillis())) / 1000;
|
||||
LOG.info("got base: " + recording_base_timestamp);
|
||||
ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT;
|
||||
ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT;
|
||||
break;
|
||||
case KEY_AUTO_RESET:
|
||||
ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT;
|
||||
ctrl_message = AppMessageHandlerMorpheuz.CTRL_VERSION_DONE | AppMessageHandlerMorpheuz.CTRL_SET_LAST_SENT | AppMessageHandlerMorpheuz.CTRL_DO_NEXT;
|
||||
break;
|
||||
default:
|
||||
LOG.info("unhandled key: " + pair.first);
|
||||
|
@ -140,13 +138,13 @@ public class MorpheuzSupport {
|
|||
|
||||
// always ack
|
||||
GBDeviceEventSendBytes sendBytesAck = new GBDeviceEventSendBytes();
|
||||
sendBytesAck.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(uuid, mPebbleProtocol.last_id);
|
||||
sendBytesAck.encodedBytes = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id);
|
||||
|
||||
// sometimes send control message
|
||||
GBDeviceEventSendBytes sendBytesCtrl = null;
|
||||
if (ctrl_message > 0) {
|
||||
sendBytesCtrl = new GBDeviceEventSendBytes();
|
||||
sendBytesCtrl.encodedBytes = encodeMorpheuzMessage(MorpheuzSupport.KEY_CTRL, ctrl_message);
|
||||
sendBytesCtrl.encodedBytes = encodeMorpheuzMessage(AppMessageHandlerMorpheuz.KEY_CTRL, ctrl_message);
|
||||
}
|
||||
|
||||
// ctrl and sleep monitor might be null, thats okay
|
|
@ -12,7 +12,7 @@ import java.util.UUID;
|
|||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
|
||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventSendBytes;
|
||||
|
||||
public class WeatherNeatSupport {
|
||||
public class AppMessageHandlerWeatherNeat extends AppMessageHandler {
|
||||
|
||||
public static final int KEY_REQUEST = 0;
|
||||
public static final int KEY_CITY = 1;
|
||||
|
@ -20,13 +20,10 @@ public class WeatherNeatSupport {
|
|||
public static final int KEY_CONDITION = 3;
|
||||
public static final int KEY_LIGHT_TIME = 5;
|
||||
|
||||
public static final UUID uuid = UUID.fromString("3684003b-a685-45f9-a713-abc6364ba051");
|
||||
private final PebbleProtocol mPebbleProtocol;
|
||||
private static final Logger LOG = LoggerFactory.getLogger(AppMessageHandlerWeatherNeat.class);
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(WeatherNeatSupport.class);
|
||||
|
||||
public WeatherNeatSupport(PebbleProtocol pebbleProtocol) {
|
||||
mPebbleProtocol = pebbleProtocol;
|
||||
public AppMessageHandlerWeatherNeat(UUID uuid, PebbleProtocol pebbleProtocol) {
|
||||
super(uuid, pebbleProtocol);
|
||||
}
|
||||
|
||||
private byte[] encodeWeatherNeatMessage(String city, String temperature, String condition, int light_time) {
|
||||
|
@ -36,8 +33,8 @@ public class WeatherNeatSupport {
|
|||
pairs.add(new Pair<>(3, (Object) condition));
|
||||
pairs.add(new Pair<>(5, (Object) light_time)); // seconds for backlight on shake
|
||||
|
||||
byte[] ackMessage = mPebbleProtocol.encodeApplicationMessageAck(uuid, mPebbleProtocol.last_id);
|
||||
byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, uuid, pairs);
|
||||
byte[] ackMessage = mPebbleProtocol.encodeApplicationMessageAck(mUUID, mPebbleProtocol.last_id);
|
||||
byte[] testMessage = mPebbleProtocol.encodeApplicationMessagePush(PebbleProtocol.ENDPOINT_APPLICATIONMESSAGE, mUUID, pairs);
|
||||
|
||||
ByteBuffer buf = ByteBuffer.allocate(ackMessage.length + testMessage.length);
|
||||
|
||||
|
@ -48,6 +45,7 @@ public class WeatherNeatSupport {
|
|||
return buf.array();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GBDeviceEvent[] handleMessage(ArrayList<Pair<Integer, Object>> pairs) {
|
||||
GBDeviceEventSendBytes sendBytes = new GBDeviceEventSendBytes();
|
||||
sendBytes.encodedBytes = encodeWeatherNeatMessage("Berlin", "22 C", "cloudy", 0);
|
|
@ -13,6 +13,8 @@ import java.nio.ByteBuffer;
|
|||
import java.nio.ByteOrder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.SimpleTimeZone;
|
||||
import java.util.UUID;
|
||||
|
@ -327,9 +329,19 @@ public class PebbleProtocol extends GBDeviceProtocol {
|
|||
byte last_id = -1;
|
||||
private ArrayList<UUID> tmpUUIDS = new ArrayList<>();
|
||||
|
||||
private MorpheuzSupport mMorpheuzSupport = new MorpheuzSupport(PebbleProtocol.this);
|
||||
private WeatherNeatSupport mWeatherNeatSupport = new WeatherNeatSupport(PebbleProtocol.this);
|
||||
private GadgetbridgePblSupport mGadgetbridgePblSupport = new GadgetbridgePblSupport(PebbleProtocol.this);
|
||||
private static final UUID UUID_GBPEBBLE = UUID.fromString("61476764-7465-7262-6469-656775527a6c");
|
||||
private static final UUID UUID_MORPHEUZ = UUID.fromString("5be44f1d-d262-4ea6-aa30-ddbec1e3cab2");
|
||||
private static final UUID UUID_WHETHERNEAT = UUID.fromString("3684003b-a685-45f9-a713-abc6364ba051");
|
||||
private static final UUID UUID_MISFIT = UUID.fromString("0b73b76a-cd65-4dc2-9585-aaa213320858");
|
||||
|
||||
private static Map<UUID, AppMessageHandler> mAppMessageHandlers = new HashMap<>();
|
||||
|
||||
{
|
||||
mAppMessageHandlers.put(UUID_GBPEBBLE, new AppMessageHandlerGBPebble(UUID_GBPEBBLE, PebbleProtocol.this));
|
||||
mAppMessageHandlers.put(UUID_MORPHEUZ, new AppMessageHandlerMorpheuz(UUID_MORPHEUZ, PebbleProtocol.this));
|
||||
mAppMessageHandlers.put(UUID_WHETHERNEAT, new AppMessageHandlerWeatherNeat(UUID_WHETHERNEAT, PebbleProtocol.this));
|
||||
//mAppMessageHandlers.put(UUID_MISFIT,new AppMessageHandlerMisfit(UUID_MISFIT,PebbleProtocol.this));
|
||||
}
|
||||
|
||||
private static byte[] encodeSimpleMessage(short endpoint, byte command) {
|
||||
ByteBuffer buf = ByteBuffer.allocate(LENGTH_PREFIX + LENGTH_SIMPLEMESSAGE);
|
||||
|
@ -1453,7 +1465,7 @@ public class PebbleProtocol extends GBDeviceProtocol {
|
|||
buf.order(ByteOrder.BIG_ENDIAN);
|
||||
long uuid_high = buf.getLong();
|
||||
long uuid_low = buf.getLong();
|
||||
int id = (int) (uuid_low & 0xffffffff);
|
||||
int id = (int) (uuid_low & 0xffffffffL);
|
||||
byte action = buf.get();
|
||||
if (action >= 0x01 && action <= 0x04) {
|
||||
GBDeviceEventNotificationControl dismissNotification = new GBDeviceEventNotificationControl();
|
||||
|
@ -1729,15 +1741,10 @@ public class PebbleProtocol extends GBDeviceProtocol {
|
|||
case APPLICATIONMESSAGE_PUSH:
|
||||
UUID uuid = new UUID(uuid_high, uuid_low);
|
||||
LOG.info("got APPLICATIONMESSAGE PUSH from UUID " + uuid);
|
||||
if (WeatherNeatSupport.uuid.equals(uuid)) {
|
||||
AppMessageHandler handler = mAppMessageHandlers.get(uuid);
|
||||
if (handler != null) {
|
||||
ArrayList<Pair<Integer, Object>> dict = decodeDict(buf);
|
||||
devEvts = mWeatherNeatSupport.handleMessage(dict);
|
||||
} else if (MorpheuzSupport.uuid.equals(uuid)) {
|
||||
ArrayList<Pair<Integer, Object>> dict = decodeDict(buf);
|
||||
devEvts = mMorpheuzSupport.handleMessage(dict);
|
||||
} else if (GadgetbridgePblSupport.uuid.equals(uuid)) {
|
||||
ArrayList<Pair<Integer, Object>> dict = decodeDict(buf);
|
||||
devEvts = mGadgetbridgePblSupport.handleMessage(dict);
|
||||
devEvts = handler.handleMessage(dict);
|
||||
} else {
|
||||
try {
|
||||
devEvts = decodeDictToJSONAppMessage(uuid, buf);
|
||||
|
|
Loading…
Reference in New Issue