Skip to content

Commit

Permalink
Added supportedSensors property to API and improvements to setOptions
Browse files Browse the repository at this point in the history
Fixes: blackberry#383

General fixes and improvements to code structure. Better validation of arguments passed to API

Reviewed By: Jeffrey Heifetz <jheifetz@rim.com>, Rosa Tse <rtse@rim.com>
Tested By: Tracy Li <tli@rim.com>
  • Loading branch information
Eric Pearson authored and Nukul Bhasin committed Dec 2, 2012
1 parent 66470c1 commit b2aa380
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 127 deletions.
15 changes: 12 additions & 3 deletions ext/sensors/client.js
Expand Up @@ -15,14 +15,23 @@
*/
var _self = {},
_ID = require("./manifest.json").namespace,
UNKNOWN = "unknown";
sensorArray = null;

Object.defineProperty(_self, "supportedSensors", {
get: function () {
if (sensorArray === null) {
sensorArray = window.webworks.execSync(_ID, "supportedSensors");
}
return sensorArray;
}
});

_self.setOptions = function (sensor, options) {
var args = { "options" : options };
args.options.sensor = sensor;
return window.webworks.execAsync(_ID, "setOptions", args);
return window.webworks.execSync(_ID, "setOptions", args);
};

window.webworks.execAsync(_ID, "registerEvents", null);
window.webworks.execSync(_ID, "registerEvents", null);

module.exports = _self;
36 changes: 34 additions & 2 deletions ext/sensors/index.js
Expand Up @@ -120,12 +120,44 @@ module.exports = {
if (args.options) {
args.options = JSON.parse(decodeURIComponent(args.options));

if (args.options.sensor === "") {
if (!args.options.sensor) {
fail(-1, "Must specify a sensor");
return;
}
success(sensors.getInstance().setOptions(args.options));

if (args.options.delay && typeof(args.options.delay) !== "number") {
fail(-1, "Delay must be a number");
return;
}

if (args.options.queue && typeof(args.options.queue) !== "boolean") {
fail(-1, "Queue must be a boolean value");
return;
}

if (args.options.batching && typeof(args.options.batching) !== "boolean") {
fail(-1, "Batching must be a boolean value");
return;
}

if (args.options.background && typeof(args.options.background) !== "boolean") {
fail(-1, "Background must be a booleani value");
return;
}

if (args.options.reducedReporting && typeof(args.options.reducedReporting) !== "boolean") {
fail(-1, "Reduced reporting must be a boolean value");
return;
}

sensors.getInstance().setOptions(args.options);
success();
} else {
fail(-1, "Need to specify arguments");
}
},

supportedSensors: function (success, fail, args) {
success(sensors.getInstance().supportedSensors());
}
};
45 changes: 5 additions & 40 deletions ext/sensors/native/sensors_js.cpp
Expand Up @@ -59,59 +59,24 @@ std::string Sensors::InvokeMethod(const std::string& command)
std::string arg = command.substr(index + 1, command.length());

if (strCommand == "setOptions") {
Json::Reader reader;
Json::Value obj;

bool parse = reader.parse(arg, obj);
bool parse = Json::Reader().parse(arg, obj);

if (!parse)
return "";

webworks::SensorConfig sensorConfig;
sensorConfig.sensor = obj["sensor"].asString();

if (obj.isMember("delay")) {
sensorConfig.delay = obj["delay"].asInt();
} else {
sensorConfig.delay = SENSOR_CONFIG_UNDEFINED;
}

if (obj.isMember("background")) {
sensorConfig.background = static_cast<bool>(obj["background"].asBool());
} else {
sensorConfig.background = SENSOR_CONFIG_UNDEFINED;
}

if (obj.isMember("queue")) {
sensorConfig.queue = obj["queue"].asInt();
} else {
sensorConfig.queue = SENSOR_CONFIG_UNDEFINED;
}

if (obj.isMember("reducedReporting")) {
sensorConfig.reducedReporting = obj["reducedReporting"].asBool();
} else {
sensorConfig.reducedReporting = SENSOR_CONFIG_UNDEFINED;
}

m_pSensorsController->SetSensorOptions(sensorConfig);
return "";
m_pSensorsController->SetSensorOptions(obj);
} else if (strCommand == "startSensor") {
m_pSensorsController->StartSensor(arg);
return "";
} else if (strCommand == "stopSensor") {
m_pSensorsController->StopSensor(arg);
return "";
} else if (strCommand == "startEvents") {
m_pSensorsController->StartEvents();
return "";
} else if (strCommand == "stopEvents") {
m_pSensorsController->StopEvents();
return "";
} else if (strCommand == "supportedSensors") {
return m_pSensorsController->SupportedSensors();
}
#endif
#ifndef __X86__
return NULL;
return "";
#else
return command;
#endif
Expand Down
125 changes: 73 additions & 52 deletions ext/sensors/native/sensors_ndk.cpp
Expand Up @@ -50,51 +50,34 @@ SensorsNDK::SensorsNDK(Sensors *parent) : m_pParent(parent)

SensorsNDK::~SensorsNDK()
{
StopEvents();
stopEvents();

if (m_pActiveSensors) {
delete m_pActiveSensors;
}

pthread_mutex_destroy(&m_lock);
}

void SensorsNDK::StartEvents()
{
if (!m_thread) {
int error = pthread_create(&m_thread, NULL, SensorThread, static_cast<void *>(m_pParent));

if (error) {
m_thread = 0;
} else {
MUTEX_LOCK();
}
}
}

void SensorsNDK::StopEvents()
{
MsgSendPulse(m_coid, SIGEV_PULSE_PRIO_INHERIT, SENSOR_MSG_PULSE, 0);
if (m_thread) {
pthread_join(m_thread, NULL);
m_thread = 0;
m_sensorsEnabled = false;
}
}

void SensorsNDK::SetSensorOptions(const SensorConfig& config)
void SensorsNDK::SetSensorOptions(const Json::Value& config)
{
MUTEX_LOCK();
const SensorTypeMap::iterator findSensor = _sensorTypeMap.find(config.sensor);
const SensorTypeMap::iterator findSensor = _sensorTypeMap.find(config["sensor"].asString());
if (findSensor != _sensorTypeMap.end()) {
findSensor->second.second = config;
const ActiveSensorMap::iterator findActiveSensor = m_pActiveSensors->find(findSensor->second.first);
if (findActiveSensor != m_pActiveSensors->end()) {
applySensorOptions((*m_pActiveSensors)[findSensor->second.first], config);
} else {
findSensor->second.second = config;
}
}
MUTEX_UNLOCK();
}

void SensorsNDK::StartSensor(const std::string& sensorString)
{
if (!m_sensorsEnabled) {
StartEvents();
startEvents();
}

MUTEX_LOCK();
Expand All @@ -105,31 +88,11 @@ void SensorsNDK::StartSensor(const std::string& sensorString)
const ActiveSensorMap::iterator findActiveSensor = m_pActiveSensors->find(sensorType);
if (findActiveSensor == m_pActiveSensors->end()) {
sensor_t *sensor = NULL;
SensorConfig *config = &findSensor->second.second;
Json::Value config = *(&findSensor->second.second);
sensor = sensor_new(sensorType);
SIGEV_PULSE_INIT(&m_sigEvent, m_coid, SIGEV_PULSE_PRIO_INHERIT, SENSOR_BASE_PULSE + sensorType, sensor);
sensor_event_notify(sensor, &m_sigEvent);

if (config->delay != SENSOR_CONFIG_UNDEFINED) {
sensor_set_delay(sensor, config->delay);
}

if (config->queue != SENSOR_CONFIG_UNDEFINED) {
sensor_set_queue(sensor, config->queue);
}

if (config->batching != SENSOR_CONFIG_UNDEFINED) {
sensor_set_batching(sensor, config->batching);
}

if (config->background != SENSOR_CONFIG_UNDEFINED) {
sensor_set_background(sensor, config->background);
}

if (config->reducedReporting != SENSOR_CONFIG_UNDEFINED) {
sensor_set_reduced_reporting(sensor, config->reducedReporting);
}

applySensorOptions(sensor, config);
m_pActiveSensors->insert(std::make_pair(sensorType, sensor));
}
}
Expand All @@ -148,6 +111,19 @@ void SensorsNDK::StopSensor(const std::string& sensor)
MUTEX_UNLOCK();
}

std::string SensorsNDK::SupportedSensors()
{
Json::Value root;

for (SensorTypeMap::iterator sensor = _sensorTypeMap.begin(); sensor != _sensorTypeMap.end(); sensor++) {
if (sensor_exists(static_cast<sensor_type_e>(sensor->second.first))) {
root.append(sensor->first);
}
}

return Json::FastWriter().write(root);
}

void *SensorsNDK::SensorThread(void *args)
{
Sensors *parent = reinterpret_cast<Sensors *>(args);
Expand Down Expand Up @@ -295,8 +271,53 @@ void *SensorsNDK::SensorThread(void *args)
return NULL;
}

void SensorsNDK::startEvents()
{
if (!m_thread) {
int error = pthread_create(&m_thread, NULL, SensorThread, static_cast<void *>(m_pParent));

if (error) {
m_thread = 0;
} else {
MUTEX_LOCK();
}
}
}

void SensorsNDK::stopEvents()
{
MsgSendPulse(m_coid, SIGEV_PULSE_PRIO_INHERIT, SENSOR_MSG_PULSE, 0);
if (m_thread) {
pthread_join(m_thread, NULL);
m_thread = 0;
m_sensorsEnabled = false;
}
}

void SensorsNDK::applySensorOptions(sensor_t *sensor, const Json::Value &config)
{
if (config.isMember("delay")) {
sensor_set_delay(sensor, config["delay"].asInt());
}

if (config.isMember("queue")) {
sensor_set_queue(sensor, config["queue"].asInt());
}

if (config.isMember("batching")) {
sensor_set_batching(sensor, config["batching"].asInt());
}

if (config.isMember("background")) {
sensor_set_background(sensor, config["background"].asInt());
}

if (config.isMember("reducedReporting")) {
sensor_set_reduced_reporting(sensor, config["reducedReporting"].asInt());
}
}

void SensorsNDK::stopActiveSensor(sensor_type_e sensorType)
void SensorsNDK::stopActiveSensor(const sensor_type_e sensorType)
{
const ActiveSensorMap::iterator findActiveSensor = m_pActiveSensors->find(sensorType);
if (findActiveSensor != m_pActiveSensors->end()) {
Expand All @@ -308,7 +329,7 @@ void SensorsNDK::stopActiveSensor(sensor_type_e sensorType)

void SensorsNDK::createSensorMap()
{
SensorConfig config;
Json::Value config;
_sensorTypeMap["deviceaccelerometer"] = std::make_pair(SENSOR_TYPE_ACCELEROMETER, config);
_sensorTypeMap["devicemagnetometer"] = std::make_pair(SENSOR_TYPE_MAGNETOMETER, config);
_sensorTypeMap["devicegyroscope"] = std::make_pair(SENSOR_TYPE_GYROSCOPE, config);
Expand Down
21 changes: 7 additions & 14 deletions ext/sensors/native/sensors_ndk.hpp
Expand Up @@ -28,27 +28,17 @@ class Sensors;

namespace webworks {

struct SensorConfig {
std::string sensor;
int delay;
char background;
char batching;
char queue;
char reducedReporting;
};

typedef std::map<std::string, std::pair<int, SensorConfig> > SensorTypeMap;
typedef std::map<std::string, std::pair<int, Json::Value> > SensorTypeMap;
typedef std::map<int, sensor_t*> ActiveSensorMap;

class SensorsNDK {
public:
explicit SensorsNDK(Sensors *parent = NULL);
~SensorsNDK();
void StartEvents();
void StopEvents();
void SetSensorOptions(const SensorConfig& config);
void SetSensorOptions(const Json::Value& config);
void StartSensor(const std::string& sensor);
void StopSensor(const std::string& sensor);
std::string SupportedSensors();
static void* SensorThread(void *args);
private:
Sensors *m_pParent;
Expand All @@ -60,7 +50,10 @@ class SensorsNDK {
static int m_coid;
static bool m_sensorsEnabled;
static pthread_mutex_t m_lock;
static void stopActiveSensor(sensor_type_e sensorType);
static void stopActiveSensor(const sensor_type_e sensorType);
void startEvents();
void stopEvents();
void applySensorOptions(sensor_t *sensor, const Json::Value& config);
void createSensorMap();
};

Expand Down
4 changes: 4 additions & 0 deletions ext/sensors/sensorsJNEXT.js
Expand Up @@ -39,6 +39,10 @@ JNEXT.Sensors = function () {
JNEXT.invoke(self.m_id, "setOptions " + JSON.stringify(options));
};

self.supportedSensors = function () {
return JNEXT.invoke(self.m_id, "supportedSensors");
};

self.onEvent = function (strData) {
var arData = strData.split(" "),
strEventDesc = arData[0],
Expand Down

0 comments on commit b2aa380

Please sign in to comment.