mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
move message functions, refactor into Abstract Protocol
This commit is contained in:
+33
@@ -1,5 +1,6 @@
|
|||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
|
||||||
@@ -38,4 +39,36 @@ public abstract class AbstractSoundcoreProtocol extends GBDeviceProtocol {
|
|||||||
else return 0x00;
|
else return 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected SoundcorePacket decodePacket(final byte[] responseData) {
|
||||||
|
return SoundcorePacket.decode(ByteBuffer.wrap(responseData));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] encodeRequest(final short command) {
|
||||||
|
return new SoundcorePacket(command).encode();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] encodeCommand(final short command, final byte[] payload) {
|
||||||
|
return new SoundcorePacket(command, payload).encode();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] encodeBooleanCommand(final short command, final boolean enabled) {
|
||||||
|
return encodeCommand(command, new byte[]{encodeBoolean(enabled)});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] encodeByteCommand(final short command, final byte value) {
|
||||||
|
return encodeCommand(command, new byte[]{value});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected byte[] encodeAutoPowerOff(final short command, final int duration, final byte disabledDuration) {
|
||||||
|
final byte[] payload;
|
||||||
|
|
||||||
|
if (duration > 0) {
|
||||||
|
payload = new byte[]{0x01, (byte) (duration - 1)};
|
||||||
|
} else {
|
||||||
|
payload = new byte[]{0x00, disabledDuration};
|
||||||
|
}
|
||||||
|
|
||||||
|
return encodeCommand(command, payload);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -105,7 +105,7 @@ public class SoundcoreAeroFitProtocol extends SoundcoreProtocolImplV1 {
|
|||||||
return encodeBooleanCommand(CMD_SET_GAMING_MODE, gamingMode);
|
return encodeBooleanCommand(CMD_SET_GAMING_MODE, gamingMode);
|
||||||
case PREF_SOUNDCORE_AUTO_POWER_OFF:
|
case PREF_SOUNDCORE_AUTO_POWER_OFF:
|
||||||
int duration = Integer.parseInt(prefs.getString(PREF_SOUNDCORE_AUTO_POWER_OFF, "3"));
|
int duration = Integer.parseInt(prefs.getString(PREF_SOUNDCORE_AUTO_POWER_OFF, "3"));
|
||||||
return encodeAutoPowerOff(duration, (byte) 0x03);
|
return encodeAutoPowerOff(CMD_SET_AUTO_POWER_OFF, duration, (byte) 0x03);
|
||||||
default:
|
default:
|
||||||
LOG.debug("Unsupported CONFIG: " + config);
|
LOG.debug("Unsupported CONFIG: " + config);
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-20
@@ -98,50 +98,50 @@ public class SoundcoreLibertyProtocol extends SoundcoreProtocolImplV1 {
|
|||||||
|
|
||||||
// Control
|
// Control
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_DISABLED:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_DISABLED:
|
||||||
return encodeControlTouchLockMessage(TapAction.SINGLE_TAP, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_DISABLED, false));
|
return encodeControlTouchLock(TapAction.SINGLE_TAP, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_DISABLED, false));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_DISABLED:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_DISABLED:
|
||||||
return encodeControlTouchLockMessage(TapAction.DOUBLE_TAP, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_DISABLED, false));
|
return encodeControlTouchLock(TapAction.DOUBLE_TAP, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_DISABLED, false));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_DISABLED:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_DISABLED:
|
||||||
return encodeControlTouchLockMessage(TapAction.TRIPLE_TAP, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_DISABLED, false));
|
return encodeControlTouchLock(TapAction.TRIPLE_TAP, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_DISABLED, false));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_DISABLED:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_DISABLED:
|
||||||
return encodeControlTouchLockMessage(TapAction.LONG_PRESS, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_DISABLED, false));
|
return encodeControlTouchLock(TapAction.LONG_PRESS, prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_DISABLED, false));
|
||||||
|
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.SINGLE_TAP, false, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.SINGLE_TAP, false, TapFunction.valueOf(pref_string));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.SINGLE_TAP, true, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.SINGLE_TAP, true, TapFunction.valueOf(pref_string));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.DOUBLE_TAP, false, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.DOUBLE_TAP, false, TapFunction.valueOf(pref_string));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.DOUBLE_TAP, true, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.DOUBLE_TAP, true, TapFunction.valueOf(pref_string));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_LEFT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_LEFT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_LEFT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_LEFT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.TRIPLE_TAP, false, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.TRIPLE_TAP, false, TapFunction.valueOf(pref_string));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_RIGHT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_RIGHT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_RIGHT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_TRIPLE_TAP_ACTION_RIGHT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.TRIPLE_TAP, true, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.TRIPLE_TAP, true, TapFunction.valueOf(pref_string));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.LONG_PRESS, false, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.LONG_PRESS, false, TapFunction.valueOf(pref_string));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT:
|
||||||
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT, "");
|
pref_string = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT, "");
|
||||||
return encodeControlFunctionMessage(TapAction.LONG_PRESS, true, TapFunction.valueOf(pref_string));
|
return encodeControlFunction(TapAction.LONG_PRESS, true, TapFunction.valueOf(pref_string));
|
||||||
|
|
||||||
case DeviceSettingsPreferenceConst.PREF_SONY_AMBIENT_SOUND_CONTROL_BUTTON_MODE:
|
case DeviceSettingsPreferenceConst.PREF_SONY_AMBIENT_SOUND_CONTROL_BUTTON_MODE:
|
||||||
AmbientSoundControlButtonMode modes = AmbientSoundControlButtonMode.fromPreferences(prefs.getPreferences());
|
AmbientSoundControlButtonMode modes = AmbientSoundControlButtonMode.fromPreferences(prefs.getPreferences());
|
||||||
switch (modes) {
|
switch (modes) {
|
||||||
case NC_AS_OFF:
|
case NC_AS_OFF:
|
||||||
return encodeControlAmbientModeMessage(true, true, true);
|
return encodeControlAmbientMode(true, true, true);
|
||||||
case NC_AS:
|
case NC_AS:
|
||||||
return encodeControlAmbientModeMessage(true, true, false);
|
return encodeControlAmbientMode(true, true, false);
|
||||||
case NC_OFF:
|
case NC_OFF:
|
||||||
return encodeControlAmbientModeMessage(true, false, true);
|
return encodeControlAmbientMode(true, false, true);
|
||||||
case AS_OFF:
|
case AS_OFF:
|
||||||
return encodeControlAmbientModeMessage(false, true, true);
|
return encodeControlAmbientMode(false, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Miscellaneous Settings
|
// Miscellaneous Settings
|
||||||
@@ -179,7 +179,7 @@ public class SoundcoreLibertyProtocol extends SoundcoreProtocolImplV1 {
|
|||||||
* @param disabled If the action should be enabled or disabled
|
* @param disabled If the action should be enabled or disabled
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private byte[] encodeControlTouchLockMessage(TapAction action, boolean disabled) {
|
private byte[] encodeControlTouchLock(TapAction action, boolean disabled) {
|
||||||
boolean enabled = !disabled;
|
boolean enabled = !disabled;
|
||||||
byte enabled_byte;
|
byte enabled_byte;
|
||||||
byte[] payload;
|
byte[] payload;
|
||||||
@@ -207,7 +207,7 @@ public class SoundcoreLibertyProtocol extends SoundcoreProtocolImplV1 {
|
|||||||
* @param function The byte that encodes the triggered function (eg play/pause)
|
* @param function The byte that encodes the triggered function (eg play/pause)
|
||||||
* @return The encoded message
|
* @return The encoded message
|
||||||
*/
|
*/
|
||||||
private byte[] encodeControlFunctionMessage(TapAction action, boolean right, TapFunction function) {
|
private byte[] encodeControlFunction(TapAction action, boolean right, TapFunction function) {
|
||||||
byte function_byte;
|
byte function_byte;
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case SINGLE_TAP:
|
case SINGLE_TAP:
|
||||||
@@ -224,14 +224,14 @@ public class SoundcoreLibertyProtocol extends SoundcoreProtocolImplV1 {
|
|||||||
LOG.error("Invalid Tap action");
|
LOG.error("Invalid Tap action");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return encodeControlFunctionMessage(right, action.getCode(), function_byte);
|
return encodeControlFunction(right, action.getCode(), function_byte);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encodes between which Audio Modes a tap should switch, if it is set to switch the Audio Mode.
|
* Encodes between which Audio Modes a tap should switch, if it is set to switch the Audio Mode.
|
||||||
* Zb ANC -> -> Transparency -> Normal -> ANC -> ....
|
* Zb ANC -> -> Transparency -> Normal -> ANC -> ....
|
||||||
*/
|
*/
|
||||||
private byte[] encodeControlAmbientModeMessage(boolean anc, boolean transparency, boolean normal) {
|
private byte[] encodeControlAmbientMode(boolean anc, boolean transparency, boolean normal) {
|
||||||
// Original app does not allow only one true flag. Unsure if Earbuds accept this state.
|
// Original app does not allow only one true flag. Unsure if Earbuds accept this state.
|
||||||
byte ambientModes = (byte) (4 * (normal?1:0) + 2 * (transparency?1:0) + (anc?1:0));
|
byte ambientModes = (byte) (4 * (normal?1:0) + 2 * (transparency?1:0) + (anc?1:0));
|
||||||
return encodeCommand(CMD_SET_AMBIENT_SOUND_CONTROL_BUTTON_MODE, new byte[] {ambientModes});
|
return encodeCommand(CMD_SET_AMBIENT_SOUND_CONTROL_BUTTON_MODE, new byte[] {ambientModes});
|
||||||
|
|||||||
+1
-1
@@ -41,7 +41,7 @@ public class SoundcoreMotion300DeviceSupport extends AbstractHeadphoneSerialDevi
|
|||||||
// Device requires a little delay to respond to commands
|
// Device requires a little delay to respond to commands
|
||||||
handler.postDelayed(() -> {
|
handler.postDelayed(() -> {
|
||||||
final TransactionBuilder builderDelayed = createTransactionBuilder("initialize delayed");
|
final TransactionBuilder builderDelayed = createTransactionBuilder("initialize delayed");
|
||||||
builderDelayed.write(mDeviceProtocol.encodeGetDeviceInfo());
|
builderDelayed.write(mDeviceProtocol.encodeDeviceInfoRequest());
|
||||||
builderDelayed.queue();
|
builderDelayed.queue();
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
|
|||||||
+20
-36
@@ -33,8 +33,8 @@ import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventUpdatePref
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.BatteryState;
|
import nodomain.freeyourgadget.gadgetbridge.model.BatteryState;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.AbstractSoundcoreProtocol;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.SoundcorePacket;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.SoundcorePacket;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
|
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.*;
|
import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.*;
|
||||||
@@ -43,7 +43,7 @@ import static nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.pro
|
|||||||
import static nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.protocol.impl.v1.SoundcoreProtocolImplV1.CMD_NOTIFY_CHARGING_INFO;
|
import static nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.protocol.impl.v1.SoundcoreProtocolImplV1.CMD_NOTIFY_CHARGING_INFO;
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.protocol.impl.v1.SoundcoreProtocolImplV1.CMD_SET_AUTO_POWER_OFF;
|
import static nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.protocol.impl.v1.SoundcoreProtocolImplV1.CMD_SET_AUTO_POWER_OFF;
|
||||||
|
|
||||||
public class SoundcoreMotion300Protocol extends GBDeviceProtocol {
|
public class SoundcoreMotion300Protocol extends AbstractSoundcoreProtocol {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(SoundcoreMotion300Protocol.class);
|
private static final Logger LOG = LoggerFactory.getLogger(SoundcoreMotion300Protocol.class);
|
||||||
|
|
||||||
// Some of these commands are not used right now, they serve as documentation
|
// Some of these commands are not used right now, they serve as documentation
|
||||||
@@ -97,8 +97,7 @@ public class SoundcoreMotion300Protocol extends GBDeviceProtocol {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GBDeviceEvent[] decodeResponse(byte[] data) {
|
public GBDeviceEvent[] decodeResponse(byte[] data) {
|
||||||
ByteBuffer buf = ByteBuffer.wrap(data);
|
final SoundcorePacket packet = decodePacket(data);
|
||||||
SoundcorePacket packet = SoundcorePacket.decode(buf);
|
|
||||||
|
|
||||||
if (packet == null)
|
if (packet == null)
|
||||||
return null;
|
return null;
|
||||||
@@ -262,17 +261,17 @@ public class SoundcoreMotion300Protocol extends GBDeviceProtocol {
|
|||||||
|
|
||||||
switch (config) {
|
switch (config) {
|
||||||
case PREF_SOUNDCORE_VOICE_PROMPTS:
|
case PREF_SOUNDCORE_VOICE_PROMPTS:
|
||||||
return encodeSetBoolean(prefs, PREF_SOUNDCORE_VOICE_PROMPTS, CMD_SET_VOICE_PROMPTS);
|
return encodeBooleanPreference(prefs, PREF_SOUNDCORE_VOICE_PROMPTS, CMD_SET_VOICE_PROMPTS);
|
||||||
case PREF_SOUNDCORE_BUTTON_BRIGHTNESS:
|
case PREF_SOUNDCORE_BUTTON_BRIGHTNESS:
|
||||||
return encodeSetByte(prefs, PREF_SOUNDCORE_BUTTON_BRIGHTNESS, CMD_SET_BUTTON_BRIGHTNESS);
|
return encodeBytePreference(prefs, PREF_SOUNDCORE_BUTTON_BRIGHTNESS, CMD_SET_BUTTON_BRIGHTNESS);
|
||||||
case PREF_SOUNDCORE_AUTO_POWER_OFF:
|
case PREF_SOUNDCORE_AUTO_POWER_OFF:
|
||||||
return encodeSetAutoPowerOff(prefs);
|
return encodeAutoPowerOffPreference(prefs);
|
||||||
case PREF_SOUNDCORE_LDAC_MODE:
|
case PREF_SOUNDCORE_LDAC_MODE:
|
||||||
return encodeSetBoolean(prefs, PREF_SOUNDCORE_LDAC_MODE, CMD_SET_LDAC_MODE);
|
return encodeBooleanPreference(prefs, PREF_SOUNDCORE_LDAC_MODE, CMD_SET_LDAC_MODE);
|
||||||
case PREF_SOUNDCORE_ADAPTIVE_DIRECTION:
|
case PREF_SOUNDCORE_ADAPTIVE_DIRECTION:
|
||||||
return encodeSetBoolean(prefs, PREF_SOUNDCORE_ADAPTIVE_DIRECTION, CMD_SET_ADAPTIVE_DIRECTION);
|
return encodeBooleanPreference(prefs, PREF_SOUNDCORE_ADAPTIVE_DIRECTION, CMD_SET_ADAPTIVE_DIRECTION);
|
||||||
case PREF_SOUNDCORE_EQUALIZER_PRESET:
|
case PREF_SOUNDCORE_EQUALIZER_PRESET:
|
||||||
return encodeSetByte(prefs, PREF_SOUNDCORE_EQUALIZER_PRESET, CMD_SET_EQUALIZER_PRESET);
|
return encodeBytePreference(prefs, PREF_SOUNDCORE_EQUALIZER_PRESET, CMD_SET_EQUALIZER_PRESET);
|
||||||
case PREF_SOUNDCORE_EQUALIZER_DIRECTION:
|
case PREF_SOUNDCORE_EQUALIZER_DIRECTION:
|
||||||
return encodeRequest(CMD_GET_EQUALIZER);
|
return encodeRequest(CMD_GET_EQUALIZER);
|
||||||
case PREF_SOUNDCORE_EQUALIZER_BAND1_FREQ:
|
case PREF_SOUNDCORE_EQUALIZER_BAND1_FREQ:
|
||||||
@@ -293,17 +292,13 @@ public class SoundcoreMotion300Protocol extends GBDeviceProtocol {
|
|||||||
case PREF_SOUNDCORE_EQUALIZER_BAND8_VALUE:
|
case PREF_SOUNDCORE_EQUALIZER_BAND8_VALUE:
|
||||||
case PREF_SOUNDCORE_EQUALIZER_BAND9_FREQ:
|
case PREF_SOUNDCORE_EQUALIZER_BAND9_FREQ:
|
||||||
case PREF_SOUNDCORE_EQUALIZER_BAND9_VALUE:
|
case PREF_SOUNDCORE_EQUALIZER_BAND9_VALUE:
|
||||||
return encodeSetEqualizerCustom(prefs);
|
return encodeCustomEqualizer(prefs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.encodeSendConfiguration(config);
|
return super.encodeSendConfiguration(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeRequest(short cmd) {
|
public byte[] encodeDeviceInfoRequest() {
|
||||||
return new SoundcorePacket(cmd).encode();
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] encodeGetDeviceInfo() {
|
|
||||||
return encodeRequest(CMD_GET_DEVICE_INFO);
|
return encodeRequest(CMD_GET_DEVICE_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,33 +307,22 @@ public class SoundcoreMotion300Protocol extends GBDeviceProtocol {
|
|||||||
return encodeRequest(CMD_POWER_OFF);
|
return encodeRequest(CMD_POWER_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeSetBoolean(Prefs prefs, String pref, short cmd) {
|
private byte[] encodeBooleanPreference(Prefs prefs, String pref, short cmd) {
|
||||||
boolean enabled = prefs.getBoolean(pref, true);
|
boolean enabled = prefs.getBoolean(pref, true);
|
||||||
byte[] payload = new byte[] { enabled ? (byte)0x01 : (byte)0x00 };
|
return encodeBooleanCommand(cmd, enabled);
|
||||||
|
|
||||||
return new SoundcorePacket(cmd, payload).encode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeSetByte(Prefs prefs, String pref, short cmd) {
|
private byte[] encodeBytePreference(Prefs prefs, String pref, short cmd) {
|
||||||
byte value = (byte)Integer.parseInt(prefs.getString(pref, "0"));
|
byte value = (byte)Integer.parseInt(prefs.getString(pref, "0"));
|
||||||
byte[] payload = new byte[] { value };
|
return encodeByteCommand(cmd, value);
|
||||||
|
|
||||||
return new SoundcorePacket(cmd, payload).encode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeSetAutoPowerOff(Prefs prefs) {
|
private byte[] encodeAutoPowerOffPreference(Prefs prefs) {
|
||||||
byte duration = (byte)Integer.parseInt(prefs.getString(PREF_SOUNDCORE_AUTO_POWER_OFF, "2"));
|
final int duration = Integer.parseInt(prefs.getString(PREF_SOUNDCORE_AUTO_POWER_OFF, "2"));
|
||||||
byte[] payload;
|
return encodeAutoPowerOff(CMD_SET_AUTO_POWER_OFF, duration, (byte)0x00);
|
||||||
|
|
||||||
if (duration > 0)
|
|
||||||
payload = new byte[] { (byte)0x01, (byte)(duration - 1) };
|
|
||||||
else
|
|
||||||
payload = new byte[] { (byte)0x00, (byte)0x00 };
|
|
||||||
|
|
||||||
return new SoundcorePacket(CMD_SET_AUTO_POWER_OFF, payload).encode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeSetEqualizerCustom(Prefs prefs) {
|
private byte[] encodeCustomEqualizer(Prefs prefs) {
|
||||||
ByteBuffer buf = ByteBuffer.allocate(21);
|
ByteBuffer buf = ByteBuffer.allocate(21);
|
||||||
int eqDirection = Integer.parseInt(prefs.getString(PREF_SOUNDCORE_EQUALIZER_DIRECTION, "0"));
|
int eqDirection = Integer.parseInt(prefs.getString(PREF_SOUNDCORE_EQUALIZER_DIRECTION, "0"));
|
||||||
byte[] equalizer = equalizerFromPrefs(prefs);
|
byte[] equalizer = equalizerFromPrefs(prefs);
|
||||||
@@ -349,7 +333,7 @@ public class SoundcoreMotion300Protocol extends GBDeviceProtocol {
|
|||||||
buf.put((byte)0xff);
|
buf.put((byte)0xff);
|
||||||
buf.put(equalizer);
|
buf.put(equalizer);
|
||||||
|
|
||||||
return new SoundcorePacket(CMD_SET_EQUALIZER_CUSTOM, buf.array()).encode();
|
return encodeCommand(CMD_SET_EQUALIZER_CUSTOM, buf.array());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, Object> equalizerToPrefs(byte[] equalizer) {
|
private Map<String, Object> equalizerToPrefs(byte[] equalizer) {
|
||||||
|
|||||||
+1
-31
@@ -2,13 +2,11 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.protocol.
|
|||||||
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
|
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.AbstractSoundcoreProtocol;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.AbstractSoundcoreProtocol;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.soundcore.SoundcorePacket;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
|
|
||||||
public abstract class SoundcoreProtocolImplV1 extends AbstractSoundcoreProtocol {
|
public abstract class SoundcoreProtocolImplV1 extends AbstractSoundcoreProtocol {
|
||||||
@@ -30,22 +28,6 @@ public abstract class SoundcoreProtocolImplV1 extends AbstractSoundcoreProtocol
|
|||||||
super(device);
|
super(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SoundcorePacket decodePacket(final byte[] responseData) {
|
|
||||||
return SoundcorePacket.decode(ByteBuffer.wrap(responseData));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected byte[] encodeRequest(final short command) {
|
|
||||||
return new SoundcorePacket(command).encode();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected byte[] encodeCommand(final short command, final byte[] payload) {
|
|
||||||
return new SoundcorePacket(command, payload).encode();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected byte[] encodeBooleanCommand(final short command, final boolean enabled) {
|
|
||||||
return encodeCommand(command, new byte[]{encodeBoolean(enabled)});
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] encodeDeviceInfoRequest() {
|
public byte[] encodeDeviceInfoRequest() {
|
||||||
return encodeRequest(CMD_GET_DEVICE_INFO);
|
return encodeRequest(CMD_GET_DEVICE_INFO);
|
||||||
}
|
}
|
||||||
@@ -63,19 +45,7 @@ public abstract class SoundcoreProtocolImplV1 extends AbstractSoundcoreProtocol
|
|||||||
return encodeCommand(CMD_ENABLE_PAIRING_MODE, new byte[]{0x00, (byte) 0x90});
|
return encodeCommand(CMD_ENABLE_PAIRING_MODE, new byte[]{0x00, (byte) 0x90});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected byte[] encodeAutoPowerOff(final int duration, final byte disabledDuration) {
|
protected byte[] encodeControlFunction(final boolean right, final byte action, final byte function) {
|
||||||
final byte[] payload;
|
|
||||||
|
|
||||||
if (duration > 0) {
|
|
||||||
payload = new byte[]{0x01, (byte) (duration - 1)};
|
|
||||||
} else {
|
|
||||||
payload = new byte[]{0x00, disabledDuration};
|
|
||||||
}
|
|
||||||
|
|
||||||
return encodeCommand(CMD_SET_AUTO_POWER_OFF, payload);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected byte[] encodeControlFunctionMessage(final boolean right, final byte action, final byte function) {
|
|
||||||
return encodeCommand(CMD_SET_CONTROL_FUNCTION, new byte[]{encodeBoolean(right), action, function});
|
return encodeCommand(CMD_SET_CONTROL_FUNCTION, new byte[]{encodeBoolean(right), action, function});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-20
@@ -84,28 +84,28 @@ public class SoundcoreSportX20Protocol extends SoundcoreLibertyProtocol {
|
|||||||
|
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT:
|
||||||
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT, "PLAYPAUSE");
|
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_LEFT, "PLAYPAUSE");
|
||||||
return encodeControlFunctionMessage(TapAction.SINGLE_TAP, false, TapFunction.valueOf(prefString));
|
return encodeControlFunction(TapAction.SINGLE_TAP, false, TapFunction.valueOf(prefString));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT:
|
||||||
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT, "PLAYPAUSE");
|
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_SINGLE_TAP_ACTION_RIGHT, "PLAYPAUSE");
|
||||||
return encodeControlFunctionMessage(TapAction.SINGLE_TAP, true, TapFunction.valueOf(prefString));
|
return encodeControlFunction(TapAction.SINGLE_TAP, true, TapFunction.valueOf(prefString));
|
||||||
|
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT:
|
||||||
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT, "MEDIA_PREV");
|
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_LEFT, "MEDIA_PREV");
|
||||||
return encodeControlFunctionMessage(TapAction.DOUBLE_TAP, false, TapFunction.valueOf(prefString));
|
return encodeControlFunction(TapAction.DOUBLE_TAP, false, TapFunction.valueOf(prefString));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT:
|
||||||
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT, "MEDIA_NEXT");
|
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_DOUBLE_TAP_ACTION_RIGHT, "MEDIA_NEXT");
|
||||||
return encodeControlFunctionMessage(TapAction.DOUBLE_TAP, true, TapFunction.valueOf(prefString));
|
return encodeControlFunction(TapAction.DOUBLE_TAP, true, TapFunction.valueOf(prefString));
|
||||||
|
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT:
|
||||||
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT, "AMBIENT_SOUND_CONTROL");
|
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_LEFT, "AMBIENT_SOUND_CONTROL");
|
||||||
return encodeControlFunctionMessage(TapAction.LONG_PRESS, false, TapFunction.valueOf(prefString));
|
return encodeControlFunction(TapAction.LONG_PRESS, false, TapFunction.valueOf(prefString));
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT:
|
||||||
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT, "AMBIENT_SOUND_CONTROL");
|
prefString = prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_CONTROL_LONG_PRESS_ACTION_RIGHT, "AMBIENT_SOUND_CONTROL");
|
||||||
return encodeControlFunctionMessage(TapAction.LONG_PRESS, true, TapFunction.valueOf(prefString));
|
return encodeControlFunction(TapAction.LONG_PRESS, true, TapFunction.valueOf(prefString));
|
||||||
|
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_AUTO_POWER_OFF:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_AUTO_POWER_OFF:
|
||||||
final int duration = Integer.parseInt(prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_AUTO_POWER_OFF, "3"));
|
final int duration = Integer.parseInt(prefs.getString(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_AUTO_POWER_OFF, "3"));
|
||||||
return encodeAutoPowerOff(duration);
|
return encodeAutoPowerOff(CMD_SET_AUTO_POWER_OFF, duration, (byte) 0x03);
|
||||||
|
|
||||||
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_TOUCH_TONE:
|
case DeviceSettingsPreferenceConst.PREF_SOUNDCORE_TOUCH_TONE:
|
||||||
final boolean pressAlert = prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_TOUCH_TONE, false);
|
final boolean pressAlert = prefs.getBoolean(DeviceSettingsPreferenceConst.PREF_SOUNDCORE_TOUCH_TONE, false);
|
||||||
@@ -134,7 +134,7 @@ public class SoundcoreSportX20Protocol extends SoundcoreLibertyProtocol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeControlFunctionMessage(final TapAction action, final boolean right, final TapFunction function) {
|
private byte[] encodeControlFunction(final TapAction action, final boolean right, final TapFunction function) {
|
||||||
final byte functionByte;
|
final byte functionByte;
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case SINGLE_TAP:
|
case SINGLE_TAP:
|
||||||
@@ -150,18 +150,7 @@ public class SoundcoreSportX20Protocol extends SoundcoreLibertyProtocol {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return encodeControlFunctionMessage(right, action.getCode(), functionByte);
|
return encodeControlFunction(right, action.getCode(), functionByte);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 0: No Auto Power off
|
|
||||||
* 1: Auto Power off 10 min
|
|
||||||
* 2: Auto Power off 20 min
|
|
||||||
* 3: Auto Power off 30 min
|
|
||||||
* 4: Auto Power off 60 min
|
|
||||||
*/
|
|
||||||
private byte[] encodeAutoPowerOff(final int duration) {
|
|
||||||
return encodeAutoPowerOff(duration, (byte) 0x03);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeEqualizer() {
|
private byte[] encodeEqualizer() {
|
||||||
|
|||||||
Reference in New Issue
Block a user