Skip to content

Instantly share code, notes, and snippets.

@bakueikozo
Last active April 29, 2025 13:45
Show Gist options
  • Save bakueikozo/7ffa24cab95850fba6d600025bc0aa25 to your computer and use it in GitHub Desktop.
Save bakueikozo/7ffa24cab95850fba6d600025bc0aa25 to your computer and use it in GitHub Desktop.
package jp.co.signal.pics.service;
import java.util.List;
import jp.co.signal.pics.model.Intersection;
import jp.co.signal.pics.model.PedestrianSignal;
/* loaded from: classes.dex */
public interface PICSService {
/* loaded from: classes.dex */
public enum ControlRequestResult {
None(0),
Received(1),
Receiving(2),
Failure(3),
RingNoReceived(4),
RingReceived(5);
private final int a;
ControlRequestResult(int i) {
this.a = i;
}
public static ControlRequestResult valueOf(int i) {
ControlRequestResult[] values;
for (ControlRequestResult controlRequestResult : values()) {
if (controlRequestResult.getValue() == i) {
return controlRequestResult;
}
}
return None;
}
public int getValue() {
return this.a;
}
}
/* loaded from: classes.dex */
public enum SecurityWarningLevel {
None(0),
Low(1),
Middle(2),
High(3);
private final int a;
SecurityWarningLevel(int i) {
this.a = i;
}
public static SecurityWarningLevel valueOf(int i) {
SecurityWarningLevel[] values;
for (SecurityWarningLevel securityWarningLevel : values()) {
if (securityWarningLevel.getValue() == i) {
return securityWarningLevel;
}
}
return None;
}
public int getValue() {
return this.a;
}
}
/* loaded from: classes.dex */
public enum SignalControlChannel {
Channel1(1),
Channel2(2),
Both(3);
private final int a;
SignalControlChannel(int i) {
this.a = i;
}
public static SignalControlChannel valueOf(int i) {
SignalControlChannel[] values;
for (SignalControlChannel signalControlChannel : values()) {
if (signalControlChannel.getValue() == i) {
return signalControlChannel;
}
}
return null;
}
public int getValue() {
return this.a;
}
}
/* loaded from: classes.dex */
public enum SignalControlType {
None(0),
Recall(1),
Extension(2),
RecallAndExtension(3),
RingExtension(4);
private final int a;
SignalControlType(int i) {
this.a = i;
}
public static SignalControlType valueOf(int i) {
SignalControlType[] values;
for (SignalControlType signalControlType : values()) {
if (signalControlType.getValue() == i) {
return signalControlType;
}
}
return null;
}
public int getValue() {
return this.a;
}
}
/* loaded from: classes.dex */
public enum SignalState {
NoSignal(0),
RedSignal(1),
BlinkGreenSignal(2),
GreenSignal(3),
None(4);
private final int a;
SignalState(int i) {
this.a = i;
}
public static SignalState valueOf(int i) {
SignalState[] values;
for (SignalState signalState : values()) {
if (signalState.getValue() == i) {
return signalState;
}
}
return null;
}
public int getValue() {
return this.a;
}
}
List<Intersection> getCurrentIntersections();
PICSServiceListener getListener();
SecurityWarningLevel getSecurityWarning();
ServiceAreaMonitor getServiceAreaMonitor();
boolean isSendingExtensionRequest();
boolean isServiceArea();
void sendExtensionRequest(Intersection intersection, PedestrianSignal pedestrianSignal, SignalControlChannel signalControlChannel, String str);
void setListener(PICSServiceListener pICSServiceListener);
void setServiceAreaMonitor(ServiceAreaMonitor serviceAreaMonitor);
void start();
void stop();
}
package jp.co.signal.pics.device;
import android.bluetooth.BluetoothDevice;
import android.util.Log;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Collections;
import java.util.Date;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import jp.blead.beacon.utilities.HexStringUtil;
import jp.blead.device.AdvertiseData;
import jp.blead.device.BLEDevice;
import jp.co.signal.pics.model.Intersection;
import jp.co.signal.pics.model.PedestrianSignal;
import jp.co.signal.pics.service.PICSService;
/* loaded from: classes.dex */
public class PICSBLEDevice extends BLEDevice {
private static final String x = "jp.co.signal.pics.device.PICSBLEDevice";
private int h;
private Intersection i;
private String j;
private byte k;
private long l;
private boolean m;
private Date n;
private Date o;
private Date p;
private long q;
private boolean u;
private Queue<Integer> v;
private byte r = 0;
private int[] s = {206, 1};
private int[] t = {88, 1};
private boolean w = false;
public PICSBLEDevice(BluetoothDevice bluetoothDevice, int i, AdvertiseData advertiseData, Intersection intersection, long j) {
super(bluetoothDevice, i, null);
this.q = 10000L;
this.i = intersection;
this.q = j;
setAdvertiseData(advertiseData);
}
private void a() {
boolean z;
PICSService.ControlRequestResult controlRequestResult;
Intersection intersection;
Intersection intersection2;
PICSService.ControlRequestResult controlRequestResult2;
PICSService.SignalControlType signalControlType;
PedestrianSignal pedestrianSignal;
PICSService.SignalControlType signalControlType2;
PedestrianSignal pedestrianSignal2;
try {
boolean z2 = false;
char c = 0;
if (getAdvertiseData() == null) {
this.h = 0;
this.j = null;
this.k = (byte) 0;
return;
}
ByteBuffer wrap = ByteBuffer.wrap(getAdvertiseData().getBytes(), 5, 26);
wrap.order(ByteOrder.BIG_ENDIAN);
this.s[0] = wrap.get() & 255;
this.s[1] = wrap.get() & 255;
this.t[0] = wrap.get() & 255;
this.t[1] = wrap.get() & 255;
byte b = wrap.get();
if (b == 0 || b == 1 || b == 2) {
int i = wrap.get() & 255;
byte b2 = 1;
while (true) {
if (b2 >= 64) {
z = false;
break;
} else if (i == ((this.h + b2) & 255)) {
z = true;
break;
} else {
b2 = (byte) (b2 + 1);
}
}
if (!z) {
this.w = true;
} else if (b == 0) {
this.w = false;
}
this.h = i;
if (this.w) {
String str = x;
Log.d(str, "メッセージID連番エラー msgId:" + this.h);
return;
}
wrap.get(new byte[2]);
byte[] bArr = new byte[4];
wrap.get(bArr);
this.j = HexStringUtil.bytesToHexString(bArr);
if (this.i != null) {
if (isActive()) {
this.i.setRssi(getAveRssi());
}
byte b3 = 8;
if (b == 0) {
byte[] bArr2 = {85, 84, 77, 83, 95, 80, 73, 67, 83, 48, 48, 48, 49, 0};
byte[] bArr3 = new byte[14];
wrap.get(bArr3);
int i2 = 0;
while (true) {
if (i2 >= 14) {
c = 1;
break;
} else if (bArr3[i2] != bArr2[i2]) {
break;
} else {
i2++;
}
}
if (c != 0) {
this.n = new Date();
}
} else if (b == 1) {
this.o = new Date();
if (isActive()) {
this.i.setLatitude((wrap.getInt() & (-1)) / 1000000.0d);
this.i.setLongitude((wrap.getInt() & (-1)) / 1000000.0d);
int i3 = wrap.get() & 255;
if (i3 == 255) {
this.i.setRadius(Integer.MAX_VALUE);
} else {
this.i.setRadius(i3);
}
int i4 = wrap.get() & 255;
PICSService.SignalControlType valueOf = PICSService.SignalControlType.valueOf((byte) (i4 >> 6));
for (int i5 = 0; i5 < 6; i5++) {
if (!(valueOf == null || ((i4 >> i5) & 1) == 0)) {
if (valueOf.equals(PICSService.SignalControlType.None)) {
pedestrianSignal2 = this.i.getPedestrianSignals().get(i5);
signalControlType2 = PICSService.SignalControlType.RingExtension;
pedestrianSignal2.setSignalControlChannel1(signalControlType2);
} else {
this.i.getPedestrianSignals().get(i5).setSignalControlChannel1(valueOf);
}
}
pedestrianSignal2 = this.i.getPedestrianSignals().get(i5);
signalControlType2 = PICSService.SignalControlType.None;
pedestrianSignal2.setSignalControlChannel1(signalControlType2);
}
int i6 = wrap.get() & 255;
PICSService.SignalControlType valueOf2 = PICSService.SignalControlType.valueOf((byte) (i6 >> 6));
for (int i7 = 0; i7 < 6; i7++) {
if (!(valueOf2 == null || ((i6 >> i7) & 1) == 0)) {
if (valueOf2.equals(PICSService.SignalControlType.None)) {
pedestrianSignal = this.i.getPedestrianSignals().get(i7);
signalControlType = PICSService.SignalControlType.RingExtension;
pedestrianSignal.setSignalControlChannel2(signalControlType);
} else {
this.i.getPedestrianSignals().get(i7).setSignalControlChannel2(valueOf2);
}
}
pedestrianSignal = this.i.getPedestrianSignals().get(i7);
signalControlType = PICSService.SignalControlType.None;
pedestrianSignal.setSignalControlChannel2(signalControlType);
}
wrap.get();
wrap.get();
byte b4 = wrap.get();
this.r = b4;
this.i.setGenerationNumber(b4);
}
} else if (b == 2) {
this.p = new Date();
this.m = getAdvertiseData().getBytes()[24] == 1;
if (isActive()) {
int i8 = 0;
boolean z3 = false;
boolean z4 = false;
while (i8 < 6) {
byte b5 = wrap.get();
byte b6 = (byte) ((b5 >> 4) & 15);
if (b6 >= b3) {
this.i.getPedestrianSignals().get(i8).setSignalRemainingTime(-1);
} else {
this.i.getPedestrianSignals().get(i8).setSignalRemainingTime(b6 + 1);
}
PICSService.SignalState valueOf3 = PICSService.SignalState.valueOf(b5 & 15);
PedestrianSignal pedestrianSignal3 = this.i.getPedestrianSignals().get(i8);
if (valueOf3 == null) {
valueOf3 = PICSService.SignalState.None;
}
pedestrianSignal3.setSignalState(valueOf3);
this.i.getPedestrianSignals().get(i8).setSpeakerEnable(false);
if (b5 == -1 && (this.i.getPedestrianSignals().get(i8).getSignalControlChannel1() == PICSService.SignalControlType.RingExtension || this.i.getPedestrianSignals().get(i8).getSignalControlChannel2() == PICSService.SignalControlType.RingExtension)) {
this.i.getPedestrianSignals().get(i8).setSpeakerEnable(true);
} else {
this.i.getPedestrianSignals().get(i8).setSpeakerEnable(false);
}
if (this.i.getPedestrianSignals().get(i8).getSignalControlChannel1() == PICSService.SignalControlType.RingExtension) {
z3 = true;
}
if (this.i.getPedestrianSignals().get(i8).getSignalControlChannel2() == PICSService.SignalControlType.RingExtension) {
z4 = true;
}
i8++;
b3 = 8;
}
byte b7 = wrap.get();
if (!z3) {
intersection = this.i;
controlRequestResult = PICSService.ControlRequestResult.valueOf(b7 & 3);
} else if (((b7 & 16) >> 4) == 0) {
intersection = this.i;
controlRequestResult = PICSService.ControlRequestResult.RingNoReceived;
} else {
intersection = this.i;
controlRequestResult = PICSService.ControlRequestResult.RingReceived;
}
intersection.setExtensionResult1(controlRequestResult);
if (!z4) {
intersection2 = this.i;
controlRequestResult2 = PICSService.ControlRequestResult.valueOf((b7 & 12) >> 2);
} else if (((b7 & 32) >> 5) == 0) {
intersection2 = this.i;
controlRequestResult2 = PICSService.ControlRequestResult.RingNoReceived;
} else {
intersection2 = this.i;
controlRequestResult2 = PICSService.ControlRequestResult.RingReceived;
}
intersection2.setExtensionResult2(controlRequestResult2);
if (wrap.get() == 1) {
z2 = true;
}
this.m = z2;
wrap.get();
wrap.get();
wrap.get();
wrap.get();
wrap.get();
wrap.get();
}
}
}
}
} catch (Exception e) {
Log.e(x, "advertising data 更新時のエラー", e);
}
}
public int getAveRssi() {
Queue<Integer> queue = this.v;
if (queue == null || queue.size() == 0) {
return -99;
}
return ((Integer) Collections.max(this.v)).intValue();
}
public int[] getCompanyId() {
return this.s;
}
public byte getExtensibleRequest() {
return this.k;
}
public byte getGenerationManagementNumber() {
return this.r;
}
public Intersection getIntersection() {
return this.i;
}
public String getIntersectionId() {
return this.j;
}
public long getInterval() {
return this.l;
}
public int getMessageId() {
return this.h;
}
public int[] getProductId() {
return this.t;
}
@Override // jp.blead.device.BLEDevice
public int getRssi() {
return super.getRssi();
}
public boolean isActive() {
return this.u;
}
public boolean isSecurityWarning() {
return this.m;
}
public boolean isValid() {
Date date;
return (this.o == null || this.p == null || (date = this.n) == null || Math.abs(date.getTime() - this.p.getTime()) >= this.q || Math.abs(this.o.getTime() - this.p.getTime()) >= this.q) ? false : true;
}
public void setActive(boolean z) {
this.u = z;
}
@Override // jp.blead.device.BLEDevice
public void setAdvertiseData(AdvertiseData advertiseData) {
if (getAdvertiseData() == null || !getAdvertiseData().equals(advertiseData)) {
super.setAdvertiseData(advertiseData);
a();
}
}
@Override // jp.blead.device.BLEDevice
public void setLastScanDate(Date date) {
this.l = (getLastScanDate() == null || date == null) ? -1L : date.getTime() - getLastScanDate().getTime();
if (this.i != null && isActive()) {
this.i.setLastUpdate(date);
}
super.setLastScanDate(date);
}
@Override // jp.blead.device.BLEDevice
public void setRssi(int i) {
if (i >= 127) {
i = -100;
}
if (this.v == null) {
this.v = new ConcurrentLinkedQueue();
}
if (this.v.size() >= 5) {
this.v.poll();
}
this.v.offer(Integer.valueOf(i));
super.setRssi(i);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment