blob: 44abe6e0d139f25ebcb26c295e2015027d504a01 [file] [log] [blame]
/*
* Compass.cpp
*
* Created on: Mar 25, 2011
* Author: Anis Kadri
*/
#include "../inc/Compass.h"
Compass::Compass(Web* pWeb) : PhoneGapCommand(pWeb) {
__sensorMgr.Construct();
started = false;
x = y = z = 0.0;
timestamp = 0;
}
Compass::~Compass() {
}
void
Compass::Run(const String& command) {
if (!command.IsEmpty()) {
String args;
String delim(L"/");
command.SubString(String(L"gap://").GetLength(), args);
StringTokenizer strTok(args, delim);
if(strTok.GetTokenCount() < 2) {
AppLogDebug("Not Enough Params");
return;
}
String method;
strTok.GetNextToken(method);
// Getting callbackId
strTok.GetNextToken(callbackId);
AppLogDebug("Method %S, callbackId: %S", method.GetPointer(), callbackId.GetPointer());
// used to determine callback ID
if(method == L"com.phonegap.Compass.watchHeading" && !callbackId.IsEmpty() && !IsStarted()) {
AppLogDebug("watching compass...");
StartSensor();
}
if(method == L"com.phonegap.Compass.clearWatch" && !callbackId.IsEmpty() && IsStarted()) {
AppLogDebug("stop watching compass...");
StopSensor();
}
if(method == L"com.phonegap.Compass.getCurrentHeading" && !callbackId.IsEmpty() && !IsStarted()) {
AppLogDebug("getting current compass...");
GetLastHeading();
}
AppLogDebug("Compass command %S completed", command.GetPointer());
} else {
AppLogDebug("Can't run empty command");
}
}
bool
Compass::StartSensor(void) {
result r = E_SUCCESS;
if(__sensorMgr.IsAvailable(SENSOR_TYPE_MAGNETIC)) {
r = __sensorMgr.AddSensorListener(*this, SENSOR_TYPE_MAGNETIC, 50, true);
if(IsFailed(r)) {
return false;
}
} else {
AppLogException("Compass sensor is not available");
String res;
res.Format(256, L"PhoneGap.callbacks['%S'].fail({message:'Magnetic sensor is not available',code:'001'});", callbackId.GetPointer());
pWeb->EvaluateJavascriptN(res);
return false;
}
started = true;
AppLogDebug("Start Watching Sensor");
return true;
}
bool
Compass::StopSensor(void) {
result r = E_SUCCESS;
r = __sensorMgr.RemoveSensorListener(*this, SENSOR_TYPE_MAGNETIC);
if(IsFailed(r)) {
return false;
}
started = false;
AppLogDebug("Stopped Watching Sensor");
return true;
}
bool
Compass::IsStarted() {
return started;
}
void
Compass::GetLastHeading() {
String res;
res.Format(256, L"PhoneGap.callbacks['%S'].success({x:%f,y:%f,z:%f,timestamp:%d});", callbackId.GetPointer(), x, y, z, timestamp);
pWeb->EvaluateJavascriptN(res);
}
void
Compass::OnDataReceived(SensorType sensorType, SensorData& sensorData, result r) {
sensorData.GetValue((SensorDataKey)MAGNETIC_DATA_KEY_TIMESTAMP, timestamp);
sensorData.GetValue((SensorDataKey)MAGNETIC_DATA_KEY_X, x);
sensorData.GetValue((SensorDataKey)MAGNETIC_DATA_KEY_Y, y);
sensorData.GetValue((SensorDataKey)MAGNETIC_DATA_KEY_Z, z);
AppLogDebug("x: %f, y: %f, z: %f timestamp: %d", x, y, z, timestamp);
String res;
res.Format(256, L"PhoneGap.callbacks['%S'].success({x:%f,y:%f,z:%f,timestamp:%d});", callbackId.GetPointer(), x, y, z, timestamp);
AppLogDebug("%S", res.GetPointer());
pWeb->EvaluateJavascriptN(res);
}