return true;
}
+
+API bool sensord_flush(int handle)
+{
+ sensor_id_t sensor_id;
+ command_channel *cmd_channel;
+ int sensor_state;
+ int client_id;
+
+ AUTOLOCK(lock);
+
+ if (!sensor_client_info::get_instance().get_sensor_state(handle, sensor_state) ||
+ !sensor_client_info::get_instance().get_sensor_id(handle, sensor_id)) {
+ _E("client %s failed to get handle information", get_client_name());
+ return false;
+ }
+
+ if (!sensor_client_info::get_instance().get_command_channel(sensor_id, &cmd_channel)) {
+ _E("client %s failed to get command channel for %s", get_client_name(), get_sensor_name(sensor_id));
+ return false;
+ }
+
+ client_id = sensor_client_info::get_instance().get_client_id();
+ retvm_if ((client_id < 0), false, "Invalid client id : %d, handle: %d, %s, %s", client_id, handle, get_sensor_name(sensor_id), get_client_name());
+
+ if (sensor_state != SENSOR_STATE_STARTED) {
+ _E("Sensor %s is not started for client %s with handle: %d, sensor_state: %d", get_sensor_name(sensor_id), get_client_name(), handle, sensor_state);
+ return false;
+ }
+
+ if (!cmd_channel->cmd_flush()) {
+ _E("cmd_flush() failed for %s", get_client_name());
+ return false;
+ }
+
+ return true;
+}
\ No newline at end of file
delete packet;
return true;
}
+
+bool command_channel::cmd_flush(void)
+{
+ cpacket *packet;
+ cmd_done_t *cmd_done;
+
+ packet = new(std::nothrow) cpacket(sizeof(cmd_flush_t));
+ retvm_if(!packet, false, "Failed to allocate memory");
+
+ packet->set_cmd(CMD_FLUSH);
+
+ _I("%s send cmd_flush(client_id=%d)", get_client_name(), m_client_id);
+
+ if (!command_handler(packet, (void **)&cmd_done)) {
+ _E("%s failed to send flush with client_id [%d]",
+ get_client_name(), m_client_id);
+ delete packet;
+ return false;
+ }
+
+ if (cmd_done->value < 0) {
+ _E("%s got error[%d] from server with client_id [%d]",
+ get_client_name(), cmd_done->value, m_client_id);
+
+ delete [] (char *)cmd_done;
+ delete packet;
+ return false;
+ }
+
+ delete [] (char *)cmd_done;
+ delete packet;
+ return true;
+}
bool cmd_get_data(unsigned int type, sensor_data_t *values);
bool cmd_set_attribute_int(int attribute, int value);
bool cmd_set_attribute_str(int attribute, const char *value, int value_len);
+ bool cmd_flush(void);
+
private:
csocket m_command_socket;
int m_client_id;
bool sensord_get_data(int handle, unsigned int data_id, sensor_data_t* sensor_data);
/**
+ * @brief flush sensor data from a connected sensor
+ *
+ * @param[in] handle a handle represensting a connected context sensor.
+ * @return true on success, otherwise false.
+ */
+bool sensord_flush(int handle);
+
+typedef void (*sensor_external_command_cb_t)(int handle, const char* data, int data_cnt, void *user_data);
+
+int sensord_external_connect(const char *key, sensor_external_command_cb_t cb, void *user_data);
+bool sensord_external_disconnect(int handle);
+bool sensord_external_post(int handle, unsigned long long timestamp, const float* data, int data_cnt);
+
+/**
* @}
*/
m_cmd_handlers[CMD_GET_DATA] = &command_worker::cmd_get_data;
m_cmd_handlers[CMD_SET_ATTRIBUTE_INT] = &command_worker::cmd_set_attribute_int;
m_cmd_handlers[CMD_SET_ATTRIBUTE_STR] = &command_worker::cmd_set_attribute_str;
+ m_cmd_handlers[CMD_FLUSH] = &command_worker::cmd_flush;
}
void command_worker::get_sensor_list(int permissions, cpacket &sensor_list)
return true;
}
+bool command_worker::cmd_flush(void *payload)
+{
+ long ret_value = OP_ERROR;
+
+ _D("CMD_FLUSH Handler invoked");
+
+ if (!is_permission_allowed()) {
+ _E("Permission denied to flush sensor data for client [%d], for sensor [0x%llx]",
+ m_client_id, m_sensor_id);
+ ret_value = OP_ERROR;
+ goto out;
+ }
+
+ if (!m_module->flush()) {
+ _E("Failed to flush sensor_data [%d]", m_client_id);
+ ret_value = OP_ERROR;
+ goto out;
+ }
+
+ ret_value = OP_SUCCESS;
+
+out:
+ if (!send_cmd_done(ret_value))
+ _E("Failed to send cmd_done to a client");
+
+ return true;
+}
+
void command_worker::get_info(string &info)
{
const char *client_info = NULL;
bool cmd_get_data(void *payload);
bool cmd_set_attribute_int(void *payload);
bool cmd_set_attribute_str(void *payload);
+ bool cmd_flush(void *payload);
void get_info(std::string &info);
CMD_GET_DATA,
CMD_SET_ATTRIBUTE_INT,
CMD_SET_ATTRIBUTE_STR,
+ CMD_FLUSH,
CMD_CNT,
};
char value[0];
} cmd_set_attribute_str_t;
+typedef struct {
+} cmd_flush_t;
+
#define CHANNEL_MAGIC_NUM 0xCAFECAFE
typedef struct {