@RequiresApi(Build.VERSION_CODES.N) @Override protected void configureSensorSubscribeAndUnsubscribeBehaviors(FlowableEmitter<SensorRecord> subscriber) { final GnssNavigationMessage.Callback callback = initializeGnssNavigationCallbackFor(subscriber); startListeningGnssNavigationMessages(callback); addUnsubscribeCallbackFor(subscriber, callback); }
@RequiresApi(Build.VERSION_CODES.N) private GnssNavigationMessage.Callback initializeGnssNavigationCallbackFor(final FlowableEmitter<SensorRecord> subscriber) { return new GnssNavigationMessage.Callback() { @Override public void onGnssNavigationMessageReceived(GnssNavigationMessage event) { subscriber.onNext(new RawGPSNavigationRecord(event)); } }; }
@RequiresApi(Build.VERSION_CODES.N) private void startListeningGnssNavigationMessages(final GnssNavigationMessage.Callback callback) { // This is needed because location manager location updates need a looper Completable.create(new CompletableOnSubscribe() { @Override public void subscribe(CompletableEmitter e) throws Exception { checkRegistrationSuccess(locationManager.registerGnssNavigationMessageCallback(callback)); } }) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(); }
@RequiresApi(Build.VERSION_CODES.N) private void addUnsubscribeCallbackFor(FlowableEmitter<SensorRecord> subscriber, final GnssNavigationMessage.Callback callback) { subscriber.setCancellable(new Cancellable() { @Override public void cancel() throws Exception { locationManager.unregisterGnssNavigationMessageCallback(callback); } }); }
@Override public void onGnssNavigationMessageReceived(GnssNavigationMessage event) { if (mLogNavigationMessages) { for (GnssListener logger : mLoggers) { logger.onGnssNavigationMessageReceived(event); } } }
@Override public void onGnssNavigationMessageReceived(GnssNavigationMessage navigationMessage) { synchronized (mFileLock) { if (mFileWriter == null) { return; } StringBuilder builder = new StringBuilder("Nav"); builder.append(RECORD_DELIMITER); builder.append(navigationMessage.getSvid()); builder.append(RECORD_DELIMITER); builder.append(navigationMessage.getType()); builder.append(RECORD_DELIMITER); int status = navigationMessage.getStatus(); builder.append(status); builder.append(RECORD_DELIMITER); builder.append(navigationMessage.getMessageId()); builder.append(RECORD_DELIMITER); builder.append(navigationMessage.getSubmessageId()); byte[] data = navigationMessage.getData(); for (byte word : data) { builder.append(RECORD_DELIMITER); builder.append(word); } try { mFileWriter.write(builder.toString()); mFileWriter.newLine(); } catch (IOException e) { logException(ERROR_WRITING_FILE, e); } } }
private String getGnssNavigationMessageStatus(int status) { switch (status) { case GnssNavigationMessage.STATUS_UNKNOWN: return "Status Unknown"; case GnssNavigationMessage.STATUS_PARITY_PASSED: return "READY"; case GnssNavigationMessage.STATUS_PARITY_REBUILT: return "Status Parity Rebuilt"; default: return "<Unknown>"; } }
/** * Parses a string array containing an updates to the navigation message and return the most * recent {@link GpsNavMessageProto}. */ public void parseHwNavigationMessageUpdates(GnssNavigationMessage navigationMessage) { byte messagePrn = (byte) navigationMessage.getSvid(); byte messageType = (byte) (navigationMessage.getType() >> 8); int subMessageId = navigationMessage.getSubmessageId(); byte[] messageRawData = navigationMessage.getData(); // parse only GPS navigation messages for now if (messageType == 1) { mGpsNavigationMessageStore.onNavMessageReported( messagePrn, messageType, (short) subMessageId, messageRawData); mHardwareGpsNavMessageProto = mGpsNavigationMessageStore.createDecodedNavMessage(); } }
@RequiresApi(api = Build.VERSION_CODES.N) public RawGPSNavigationRecord(GnssNavigationMessage navigationMessage) { super(new RecordInfo(System.currentTimeMillis())); this.message = navigationMessage.toString().replace('\n', ','); }
@Override public void onGnssNavigationMessageReceived(GnssNavigationMessage event) {}
/** @see GnssNavigationMessage.Callback# onGnssNavigationMessageReceived(GnssNavigationMessage) */ void onGnssNavigationMessageReceived(GnssNavigationMessage event);
@Override public void onGnssNavigationMessageReceived(GnssNavigationMessage event) { logNavigationMessageEvent("onGnssNavigationMessageReceived: " + event); }
@Override public void onGnssNavigationMessageReceived(GnssNavigationMessage event) { if (event.getType() == GnssNavigationMessage.TYPE_GPS_L1CA) { mPseudorangePositionVelocityFromRealTimeEvents.parseHwNavigationMessageUpdates(event); } }