summaryrefslogtreecommitdiff
path: root/android/health.c
diff options
context:
space:
mode:
authorAndrei Emeltchenko <andrei.emeltchenko@intel.com>2014-06-27 18:16:06 +0300
committerSzymon Janc <szymon.janc@tieto.com>2014-06-29 14:17:19 +0200
commit352a275e53f811018da9eed172bd688cb9a3b880 (patch)
treeea6227b8d6a5cc3ee7b5a0b9f87184a7bfa19522 /android/health.c
parent3a7ee97b14a29286672fe893a8b149aa783e3dd6 (diff)
downloadbluez-352a275e53f811018da9eed172bd688cb9a3b880.tar.gz
android/health: Add channel connect
Connect channel on incoming connection callback
Diffstat (limited to 'android/health.c')
-rw-r--r--android/health.c194
1 files changed, 113 insertions, 81 deletions
diff --git a/android/health.c b/android/health.c
index fdbc73172..de71aa750 100644
--- a/android/health.c
+++ b/android/health.c
@@ -1107,14 +1107,127 @@ static void mcap_mdl_aborted_cb(struct mcap_mdl *mdl, void *data)
DBG("Not Implemeneted");
}
+static struct health_device *create_device(struct health_app *app,
+ const uint8_t *addr)
+{
+ struct health_device *dev;
+
+ if (!app)
+ return NULL;
+
+ /* create device and push it to devices queue */
+ dev = new0(struct health_device, 1);
+ if (!dev)
+ return NULL;
+
+ android2bdaddr(addr, &dev->dst);
+ dev->channels = queue_new();
+ if (!dev->channels) {
+ free_health_device(dev);
+ return NULL;
+ }
+
+ if (!queue_push_tail(app->devices, dev)) {
+ free_health_device(dev);
+ return NULL;
+ }
+
+ dev->app_id = app->id;
+
+ return dev;
+}
+
+static struct health_device *get_device(struct health_app *app,
+ const uint8_t *addr)
+{
+ struct health_device *dev;
+ bdaddr_t bdaddr;
+
+ android2bdaddr(addr, &bdaddr);
+ dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
+ if (dev)
+ return dev;
+
+ return create_device(app, addr);
+}
+
+static struct health_channel *create_channel(struct health_app *app,
+ uint8_t mdep_index,
+ struct health_device *dev)
+{
+ struct mdep_cfg *mdep;
+ struct health_channel *channel;
+ uint8_t index;
+ static unsigned int channel_id = 1;
+
+ DBG("mdep %u", mdep_index);
+
+ if (!dev || !app)
+ return NULL;
+
+ index = mdep_index + 1;
+ mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
+ if (!mdep)
+ return NULL;
+
+ /* create channel and push it to device */
+ channel = new0(struct health_channel, 1);
+ if (!channel)
+ return NULL;
+
+ channel->mdep_id = mdep->id;
+ channel->type = mdep->channel_type;
+ channel->id = channel_id++;
+ channel->dev = dev;
+
+ if (!queue_push_tail(dev->channels, channel)) {
+ free_health_channel(channel);
+ return NULL;
+ }
+
+ return channel;
+}
+
+static struct health_channel *connect_channel(struct mcap_mcl *mcl,
+ uint8_t mdepid)
+{
+ struct health_app *app;
+ struct health_device *device;
+ struct health_channel *channel = NULL;
+ bdaddr_t addr;
+
+ mcap_mcl_get_addr(mcl, &addr);
+
+ /* TODO: Search app for mdepid */
+
+ if (mdepid == MDEP_ECHO) {
+ /* For echo service take last app */
+ app = queue_peek_tail(apps);
+ if (!app)
+ return NULL;
+
+ device = get_device(app, (uint8_t *) &addr);
+ if (!device)
+ return NULL;
+
+ channel = create_channel(app, mdepid, device);
+ }
+
+ return channel;
+}
+
static uint8_t mcap_mdl_conn_req_cb(struct mcap_mcl *mcl, uint8_t mdepid,
uint16_t mdlid, uint8_t *conf, void *data)
{
GError *gerr = NULL;
+ struct health_channel *channel;
DBG("Data channel request: mdepid %u mdlid %u", mdepid, mdlid);
/* TODO: find / create device */
+ channel = connect_channel(mcl, mdepid);
+ if (!channel)
+ return MCAP_MDL_BUSY;
if (mdepid == MDEP_ECHO) {
switch (*conf) {
@@ -1514,92 +1627,11 @@ static int connect_mcl(struct health_channel *channel)
search_cb, channel, NULL, 0);
}
-static struct health_device *create_device(struct health_app *app,
- const uint8_t *addr)
-{
- struct health_device *dev;
-
- if (!app)
- return NULL;
-
- /* create device and push it to devices queue */
- dev = new0(struct health_device, 1);
- if (!dev)
- return NULL;
-
- android2bdaddr(addr, &dev->dst);
- dev->channels = queue_new();
- if (!dev->channels) {
- free_health_device(dev);
- return NULL;
- }
-
- if (!queue_push_tail(app->devices, dev)) {
- free_health_device(dev);
- return NULL;
- }
-
- dev->app_id = app->id;
-
- return dev;
-}
-
static struct health_app *get_app(uint16_t app_id)
{
return queue_find(apps, match_app_by_id, INT_TO_PTR(app_id));
}
-static struct health_device *get_device(struct health_app *app,
- const uint8_t *addr)
-{
- struct health_device *dev;
- bdaddr_t bdaddr;
-
- android2bdaddr(addr, &bdaddr);
- dev = queue_find(app->devices, match_dev_by_addr, &bdaddr);
- if (dev)
- return dev;
-
- return create_device(app, addr);
-}
-
-static struct health_channel *create_channel(struct health_app *app,
- uint8_t mdep_index,
- struct health_device *dev)
-{
- struct mdep_cfg *mdep;
- struct health_channel *channel;
- uint8_t index;
- static unsigned int channel_id = 1;
-
- DBG("mdep %u", mdep_index);
-
- if (!dev || !app)
- return NULL;
-
- index = mdep_index + 1;
- mdep = queue_find(app->mdeps, match_mdep_by_id, INT_TO_PTR(index));
- if (!mdep)
- return NULL;
-
- /* create channel and push it to device */
- channel = new0(struct health_channel, 1);
- if (!channel)
- return NULL;
-
- channel->mdep_id = mdep->id;
- channel->type = mdep->channel_type;
- channel->id = channel_id++;
- channel->dev = dev;
-
- if (!queue_push_tail(dev->channels, channel)) {
- free_health_channel(channel);
- return NULL;
- }
-
- return channel;
-}
-
static struct health_channel *get_channel(struct health_app *app,
uint8_t mdep_index,
struct health_device *dev)