This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
YASMIN/sensors/android/WiFiSensorAndroid.h
kazu 719a66937e fixed android setup
added missing c++11 methods
2016-07-15 15:49:58 +02:00

81 lines
1.7 KiB
C++

#ifndef WIFISENSORANDROID_H
#define WIFISENSORANDROID_H
#ifdef ANDROID
#include <QAndroidJniObject>
#include "../../misc/Debug.h"
#include "../WiFiSensor.h"
class WiFiSensorAndroid : public WiFiSensor {
private:
/** hidden ctor. use singleton! */
WiFiSensorAndroid() {;}
public:
/** singleton access */
static WiFiSensorAndroid& get() {
static WiFiSensorAndroid wifi;
return wifi;
}
void start() override {
// start scanning
int res = QAndroidJniObject::callStaticMethod<int>("indoor/java/WiFi", "start", "()I");
(void) res;
}
void stop() override {
throw "todo";
}
/** called from java. handle the given incoming scan result */
void handle(const std::string& data) {
// to-be-constructed sensor data
WiFiSensorData sensorData;
// parse each mac->rssi entry
for (int i = 0; i < (int)data.length(); i += 17+1+2) {
const std::string bssid = data.substr(i, 17);
const int8_t rssi = data[i+17];
const int8_t pad1 = data[i+18];
const int8_t pad2 = data[i+19];
if (pad1 != 0 || pad2 != 0) {Debug::error("padding error within WiFi scan result");}
sensorData.entries.push_back(WiFiSensorDataEntry(bssid, rssi));
}
// call listeners
informListeners(sensorData);
}
};
extern "C" {
/** called after each successful WiFi scan */
JNIEXPORT void JNICALL Java_indoor_java_WiFi_onScanComplete(JNIEnv* env, jobject jobj, jbyteArray arrayID) {
(void) env; (void) jobj;
jsize length = env->GetArrayLength(arrayID);
jboolean isCopy;
jbyte* data = env->GetByteArrayElements(arrayID, &isCopy);
std::string str((char*)data, length);
env->ReleaseByteArrayElements(arrayID, data, JNI_ABORT);
WiFiSensorAndroid::get().handle(str);
}
}
#endif
#endif // WIFISENSORANDROID_H