diff --git a/Core/HLE/sceUsbGps.cpp b/Core/HLE/sceUsbGps.cpp index 6a04812309..c5c7f3d9d6 100644 --- a/Core/HLE/sceUsbGps.cpp +++ b/Core/HLE/sceUsbGps.cpp @@ -120,7 +120,7 @@ void GPS::init() { gpsData.bearing = 35.0f; satData.satellites_in_view = 6; - for (int i = 0; i < satData.satellites_in_view; i++) { + for (unsigned char i = 0; i < satData.satellites_in_view; i++) { satData.satInfo[i].id = i + 1; // 1 .. 32 satData.satInfo[i].elevation = i * 10; satData.satInfo[i].azimuth = i * 50; @@ -131,7 +131,7 @@ void GPS::init() { void GPS::setGpsTime(time_t *time) { struct tm *gpsTime; - gpsTime = localtime(time); + gpsTime = gmtime(time); gpsData.year = (short)(gpsTime->tm_year + 1900); gpsData.month = (short)(gpsTime->tm_mon + 1); @@ -151,6 +151,15 @@ void GPS::setGpsData(float latitude, float longitude, float altitude, float spee gpsData.bearing = bearing; } +void GPS::setSatInfo(short index, unsigned char id, unsigned char elevation, short azimuth, unsigned char snr, unsigned char good) { + satData.satInfo[index].id = id; + satData.satInfo[index].elevation = elevation; + satData.satInfo[index].azimuth = azimuth; + satData.satInfo[index].snr = snr; + satData.satInfo[index].good = good; + satData.satellites_in_view = index + 1; +} + GpsData* GPS::getGpsData() { return &gpsData; } diff --git a/Core/HLE/sceUsbGps.h b/Core/HLE/sceUsbGps.h index fa7059b146..a36f237918 100644 --- a/Core/HLE/sceUsbGps.h +++ b/Core/HLE/sceUsbGps.h @@ -17,6 +17,8 @@ #pragma once +#include "Core/HLE/FunctionWrappers.h" + void Register_sceUsbGps(); void __UsbGpsInit(); @@ -64,6 +66,7 @@ namespace GPS { void init(); void setGpsTime(time_t *time); void setGpsData(float latitude, float longitude, float altitude, float speed, float bearing, long long time); + void setSatInfo(short index, unsigned char id, unsigned char elevation, short azimuth, unsigned char snr, unsigned char good); GpsData *getGpsData(); SatData *getSatData(); } diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 43f237534b..2992291052 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1357,11 +1357,3 @@ void NativeShutdown() { // Previously we did exit() here on Android but that makes it hard to do things like restart on backend change. // I think we handle most globals correctly or correct-enough now. } - -void SetGpsData(float latitude, float longitude, float altitude, float speed, float bearing, long long time) { - GPS::setGpsData(latitude, longitude, altitude, speed, bearing, time); -} - -void PushCameraImage(long long length, unsigned char* image) { - Camera::pushCameraImage(length, image); -} diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index a464418405..78802e0689 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -46,6 +46,8 @@ #include "Core/ConfigValues.h" #include "Core/Loaders.h" #include "Core/System.h" +#include "Core/HLE/sceUsbCam.h" +#include "Core/HLE/sceUsbGps.h" #include "Common/CPUDetect.h" #include "Common/Log.h" #include "UI/GameInfoCache.h" @@ -951,7 +953,12 @@ extern "C" jint Java_org_ppsspp_ppsspp_NativeApp_getSelectedCamera(JNIEnv *, jcl extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_setGpsDataAndroid(JNIEnv *, jclass, jfloat latitude, jfloat longitude, jfloat altitude, jfloat speed, jfloat bearing, jlong time) { - SetGpsData(latitude, longitude, altitude, speed, bearing, time); + GPS::setGpsData(latitude, longitude, altitude, speed, bearing, time); +} + +extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_setSatInfoAndroid(JNIEnv *, jclass, + jshort index, jshort id, jshort elevation, jshort azimuth, jshort snr, jshort good) { + GPS::setSatInfo(index, id, elevation, azimuth, snr, good); } extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_pushCameraImageAndroid(JNIEnv *env, jclass, @@ -960,7 +967,7 @@ extern "C" void JNICALL Java_org_ppsspp_ppsspp_NativeApp_pushCameraImageAndroid( if (image != NULL) { jlong size = env->GetArrayLength(image); jbyte* buffer = env->GetByteArrayElements(image, NULL); - PushCameraImage(size, (unsigned char *)buffer); + Camera::pushCameraImage(size, (unsigned char *)buffer); env->ReleaseByteArrayElements(image, buffer, JNI_ABORT); } } diff --git a/android/src/org/ppsspp/ppsspp/LocationHelper.java b/android/src/org/ppsspp/ppsspp/LocationHelper.java index 73e9350f07..b4ccef1ef3 100644 --- a/android/src/org/ppsspp/ppsspp/LocationHelper.java +++ b/android/src/org/ppsspp/ppsspp/LocationHelper.java @@ -1,14 +1,19 @@ package org.ppsspp.ppsspp; + import android.content.Context; +import android.location.GpsSatellite; +import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; -class LocationHelper implements LocationListener { - private static final String TAG = "LocationHelper"; +import java.util.Iterator; + +class LocationHelper implements LocationListener, GpsStatus.Listener { + private static final String TAG = LocationHelper.class.getSimpleName(); private LocationManager mLocationManager; private boolean mLocationEnable; @@ -27,6 +32,7 @@ class LocationHelper implements LocationListener { isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this); mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this); + mLocationManager.addGpsStatusListener(this); mLocationEnable = true; } catch (SecurityException e) { Log.e(TAG, "Cannot start location updates: " + e.toString()); @@ -70,4 +76,38 @@ class LocationHelper implements LocationListener { @Override public void onProviderDisabled(String provider) { } + + + @Override + public void onGpsStatusChanged(int i) { + switch (i) { + case GpsStatus.GPS_EVENT_STARTED: + case GpsStatus.GPS_EVENT_STOPPED: + case GpsStatus.GPS_EVENT_FIRST_FIX: + break; + case GpsStatus.GPS_EVENT_SATELLITE_STATUS: { + try { + GpsStatus gpsStatus = mLocationManager.getGpsStatus(null); + Iterable satellites = gpsStatus.getSatellites(); + + short index = 0; + for (Iterator iterator = satellites.iterator(); iterator.hasNext(); ) { + GpsSatellite satellite = iterator.next(); + if (satellite.getPrn() > 37) { + continue; + } + NativeApp.setSatInfoAndroid(index, (short) satellite.getPrn(), (short) satellite.getElevation(), + (short) satellite.getAzimuth(), (short) satellite.getSnr(), satellite.usedInFix() ? (short) 1 : (short) 0); + index++; + if (index == 24) { + break; + } + } + } catch (SecurityException e) { + Log.e(TAG, e.toString()); + } + break; + } + } + } } diff --git a/android/src/org/ppsspp/ppsspp/NativeApp.java b/android/src/org/ppsspp/ppsspp/NativeApp.java index 5db8abdc6d..2af23dc867 100644 --- a/android/src/org/ppsspp/ppsspp/NativeApp.java +++ b/android/src/org/ppsspp/ppsspp/NativeApp.java @@ -53,5 +53,6 @@ public class NativeApp { public static native int getSelectedCamera(); public static native void setGpsDataAndroid(float latitude, float longitude, float altitude, float speed, float bearing, long time); + public static native void setSatInfoAndroid(short index, short id, short elevation, short azimuth, short snr, short good); public static native void pushCameraImageAndroid(byte[] image); } diff --git a/ext/native/base/NativeApp.h b/ext/native/base/NativeApp.h index d32353ccde..da2fba06ba 100644 --- a/ext/native/base/NativeApp.h +++ b/ext/native/base/NativeApp.h @@ -176,5 +176,3 @@ int System_GetPropertyInt(SystemProperty prop); bool System_GetPropertyBool(SystemProperty prop); std::vector __cameraGetDeviceList(); -void SetGpsData(float latitude, float longitude, float altitude, float speed, float bearing, long long time); -void PushCameraImage(long long length, unsigned char* image); diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 5eaea61c3a..b114aed731 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -27,6 +27,8 @@ #include "Core/Config.h" #include "Core/ConfigValues.h" #include "Core/System.h" +#include "Core/HLE/sceUsbCam.h" +#include "Core/HLE/sceUsbGps.h" #include "Common/GraphicsContext.h" #include @@ -684,7 +686,7 @@ void stopVideo() { } -(void) PushCameraImageIOS:(long long)len buffer:(unsigned char*)data { - PushCameraImage(len, data); + Camera::pushCameraImage(len, data); } void startLocation() { @@ -697,7 +699,7 @@ void stopLocation() { -(void) SetGpsDataIOS:(CLLocation *)newLocation { NSLog(@"SetGpsDataIOS: speed: %f", newLocation.speed); // m/s - SetGpsData(newLocation.coordinate.latitude, newLocation.coordinate.longitude, + GPS::setGpsData(newLocation.coordinate.latitude, newLocation.coordinate.longitude, newLocation.altitude, 0 /* speed */, 0 /* bearing */, (long long)newLocation.timestamp.timeIntervalSince1970); }