2014-11-13 15:52:49

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 0/3] android/handsfree: Support multiply devices

With those patches multilpy handsfree devices supports should be completed.

Compile tested.

Lukasz Rymanowski (3):
android/handsfree: Send indicator notif to all connected devices
android/handsfree: Send phone state to all connected devices
android/handsfree: Remove find default device

android/handsfree.c | 81 ++++++++++++++++++++++++++++-------------------------
1 file changed, 43 insertions(+), 38 deletions(-)

--
1.8.4



2014-11-13 17:24:03

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH 1/3] android/handsfree: Send indicator notif to all connected devices

Hi,

On Thursday 13 of November 2014 18:14:46 Szymon Janc wrote:
> Hi Łukasz,
>
> On Thursday 13 of November 2014 16:52:50 Lukasz Rymanowski wrote:
> > ---
> > android/handsfree.c | 21 ++++++++++++++-------
> > 1 file changed, 14 insertions(+), 7 deletions(-)
> >
> > diff --git a/android/handsfree.c b/android/handsfree.c
> > index 9a2fdd0..0001eb6 100644
> > --- a/android/handsfree.c
> > +++ b/android/handsfree.c
> > @@ -2038,24 +2038,31 @@ static void update_indicator(struct hf_device *dev, int ind, uint8_t val)
> > hfp_gw_send_info(dev->gw, "+CIEV: %u,%u", ind + 1, val);
> > }
> >
> > +static void device_status_notif(void *data, void *user_data)
> > +{
> > + struct hf_device *dev = data;
> > + struct hal_cmd_handsfree_device_status_notif *cmd = user_data;
>
> I think we should send this only to devices with SLC established.

This is handled by Framework anyway so I've applied patches 1 and 2. Thanks.

>
> > +
> > + update_indicator(dev, IND_SERVICE, cmd->state);
> > + update_indicator(dev, IND_ROAM, cmd->type);
> > + update_indicator(dev, IND_SIGNAL, cmd->signal);
> > + update_indicator(dev, IND_BATTCHG, cmd->battery);
> > +}
> > +
> > static void handle_device_status_notif(const void *buf, uint16_t len)
> > {
> > const struct hal_cmd_handsfree_device_status_notif *cmd = buf;
> > - struct hf_device *dev;
> > uint8_t status;
> >
> > DBG("");
> >
> > - dev = find_default_device();
> > - if (!dev) {
> > + if (queue_isempty(devices)) {
> > status = HAL_STATUS_FAILED;
> > goto done;
> > }
> >
> > - update_indicator(dev, IND_SERVICE, cmd->state);
> > - update_indicator(dev, IND_ROAM, cmd->type);
> > - update_indicator(dev, IND_SIGNAL, cmd->signal);
> > - update_indicator(dev, IND_BATTCHG, cmd->battery);
> > + /* Cast cmd to void as queue api needs that */
> > + queue_foreach(devices, device_status_notif, (void *) cmd);
> >
> > status = HAL_STATUS_SUCCESS;
> >
> >
>
>

--
Best regards,
Szymon Janc

2014-11-13 17:14:46

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH 1/3] android/handsfree: Send indicator notif to all connected devices

Hi Łukasz,

On Thursday 13 of November 2014 16:52:50 Lukasz Rymanowski wrote:
> ---
> android/handsfree.c | 21 ++++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/android/handsfree.c b/android/handsfree.c
> index 9a2fdd0..0001eb6 100644
> --- a/android/handsfree.c
> +++ b/android/handsfree.c
> @@ -2038,24 +2038,31 @@ static void update_indicator(struct hf_device *dev, int ind, uint8_t val)
> hfp_gw_send_info(dev->gw, "+CIEV: %u,%u", ind + 1, val);
> }
>
> +static void device_status_notif(void *data, void *user_data)
> +{
> + struct hf_device *dev = data;
> + struct hal_cmd_handsfree_device_status_notif *cmd = user_data;

I think we should send this only to devices with SLC established.

> +
> + update_indicator(dev, IND_SERVICE, cmd->state);
> + update_indicator(dev, IND_ROAM, cmd->type);
> + update_indicator(dev, IND_SIGNAL, cmd->signal);
> + update_indicator(dev, IND_BATTCHG, cmd->battery);
> +}
> +
> static void handle_device_status_notif(const void *buf, uint16_t len)
> {
> const struct hal_cmd_handsfree_device_status_notif *cmd = buf;
> - struct hf_device *dev;
> uint8_t status;
>
> DBG("");
>
> - dev = find_default_device();
> - if (!dev) {
> + if (queue_isempty(devices)) {
> status = HAL_STATUS_FAILED;
> goto done;
> }
>
> - update_indicator(dev, IND_SERVICE, cmd->state);
> - update_indicator(dev, IND_ROAM, cmd->type);
> - update_indicator(dev, IND_SIGNAL, cmd->signal);
> - update_indicator(dev, IND_BATTCHG, cmd->battery);
> + /* Cast cmd to void as queue api needs that */
> + queue_foreach(devices, device_status_notif, (void *) cmd);
>
> status = HAL_STATUS_SUCCESS;
>
>

--
Best regards,
Szymon Janc

2014-11-13 15:58:09

by Lukasz Rymanowski

[permalink] [raw]
Subject: Re: [PATCH 3/3] android/handsfree: Remove find default device

Hi,

On 13 November 2014 16:52, Lukasz Rymanowski
<[email protected]> wrote:
> Now when Android provide bdaddr in all hfp calls we can remove
> find_defaul_device. We can use bdaddr to find device on the device
> queue.
> ---

Ignore this patch. Just realized that we need this for kitkat support

\Lukasz

> android/handsfree.c | 9 ---------
> 1 file changed, 9 deletions(-)
>
> diff --git a/android/handsfree.c b/android/handsfree.c
> index 9bb8f43..2c7d53d 100644
> --- a/android/handsfree.c
> +++ b/android/handsfree.c
> @@ -273,13 +273,6 @@ static void device_destroy(struct hf_device *dev)
> free(dev);
> }
>
> -static struct hf_device *find_default_device(void)
> -{
> - /* TODO should be replaced by find_device() eventually */
> -
> - return queue_peek_head(devices);
> -}
> -
> static bool match_by_bdaddr(const void *data, const void *match_data)
> {
> const struct hf_device *dev = data;
> @@ -290,8 +283,6 @@ static bool match_by_bdaddr(const void *data, const void *match_data)
>
> static struct hf_device *find_device(const bdaddr_t *bdaddr)
> {
> - if (!bacmp(bdaddr, BDADDR_ANY))
> - return find_default_device();
>
> return queue_find(devices, match_by_bdaddr, bdaddr);
> }
> --
> 1.8.4
>

2014-11-13 15:52:51

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 2/3] android/handsfree: Send phone state to all connected devices

---
android/handsfree.c | 51 +++++++++++++++++++++++++++++----------------------
1 file changed, 29 insertions(+), 22 deletions(-)

diff --git a/android/handsfree.c b/android/handsfree.c
index 0001eb6..9bb8f43 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -2485,27 +2485,10 @@ static void phone_state_idle(struct hf_device *dev, int num_active,
}
}

-static void handle_phone_state_change(const void *buf, uint16_t len)
+static void phone_state_change(void *data, void *user_data)
{
- const struct hal_cmd_handsfree_phone_state_change *cmd = buf;
- struct hf_device *dev;
- uint8_t status;
-
- if (len != sizeof(*cmd) + cmd->number_len || (cmd->number_len != 0 &&
- cmd->number[cmd->number_len - 1] != '\0')) {
- error("Invalid phone state change command, terminating");
- raise(SIGTERM);
- return;
- }
-
- DBG("active=%u hold=%u state=%u", cmd->num_active, cmd->num_held,
- cmd->state);
-
- dev = find_default_device();
- if (!dev) {
- status = HAL_STATUS_FAILED;
- goto failed;
- }
+ struct hf_device *dev = data;
+ struct hal_cmd_handsfree_phone_state_change *cmd = user_data;

switch (cmd->state) {
case HAL_HANDSFREE_CALL_STATE_DIALING:
@@ -2526,14 +2509,38 @@ static void handle_phone_state_change(const void *buf, uint16_t len)
DBG("unhandled new state %u (current state %u)", cmd->state,
dev->setup_state);

- status = HAL_STATUS_FAILED;
- goto failed;
+ return;
}

dev->num_active = cmd->num_active;
dev->num_held = cmd->num_held;
dev->setup_state = cmd->state;

+}
+
+static void handle_phone_state_change(const void *buf, uint16_t len)
+{
+ const struct hal_cmd_handsfree_phone_state_change *cmd = buf;
+ uint8_t status;
+
+ if (len != sizeof(*cmd) + cmd->number_len || (cmd->number_len != 0 &&
+ cmd->number[cmd->number_len - 1] != '\0')) {
+ error("Invalid phone state change command, terminating");
+ raise(SIGTERM);
+ return;
+ }
+
+ DBG("active=%u hold=%u state=%u", cmd->num_active, cmd->num_held,
+ cmd->state);
+
+ if (queue_isempty(devices)) {
+ status = HAL_STATUS_FAILED;
+ goto failed;
+ }
+
+ /* Cast cmd to void as queue api needs that */
+ queue_foreach(devices, phone_state_change, (void *) cmd);
+
status = HAL_STATUS_SUCCESS;

failed:
--
1.8.4


2014-11-13 15:52:52

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 3/3] android/handsfree: Remove find default device

Now when Android provide bdaddr in all hfp calls we can remove
find_defaul_device. We can use bdaddr to find device on the device
queue.
---
android/handsfree.c | 9 ---------
1 file changed, 9 deletions(-)

diff --git a/android/handsfree.c b/android/handsfree.c
index 9bb8f43..2c7d53d 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -273,13 +273,6 @@ static void device_destroy(struct hf_device *dev)
free(dev);
}

-static struct hf_device *find_default_device(void)
-{
- /* TODO should be replaced by find_device() eventually */
-
- return queue_peek_head(devices);
-}
-
static bool match_by_bdaddr(const void *data, const void *match_data)
{
const struct hf_device *dev = data;
@@ -290,8 +283,6 @@ static bool match_by_bdaddr(const void *data, const void *match_data)

static struct hf_device *find_device(const bdaddr_t *bdaddr)
{
- if (!bacmp(bdaddr, BDADDR_ANY))
- return find_default_device();

return queue_find(devices, match_by_bdaddr, bdaddr);
}
--
1.8.4


2014-11-13 15:52:50

by Lukasz Rymanowski

[permalink] [raw]
Subject: [PATCH 1/3] android/handsfree: Send indicator notif to all connected devices

---
android/handsfree.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/android/handsfree.c b/android/handsfree.c
index 9a2fdd0..0001eb6 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -2038,24 +2038,31 @@ static void update_indicator(struct hf_device *dev, int ind, uint8_t val)
hfp_gw_send_info(dev->gw, "+CIEV: %u,%u", ind + 1, val);
}

+static void device_status_notif(void *data, void *user_data)
+{
+ struct hf_device *dev = data;
+ struct hal_cmd_handsfree_device_status_notif *cmd = user_data;
+
+ update_indicator(dev, IND_SERVICE, cmd->state);
+ update_indicator(dev, IND_ROAM, cmd->type);
+ update_indicator(dev, IND_SIGNAL, cmd->signal);
+ update_indicator(dev, IND_BATTCHG, cmd->battery);
+}
+
static void handle_device_status_notif(const void *buf, uint16_t len)
{
const struct hal_cmd_handsfree_device_status_notif *cmd = buf;
- struct hf_device *dev;
uint8_t status;

DBG("");

- dev = find_default_device();
- if (!dev) {
+ if (queue_isempty(devices)) {
status = HAL_STATUS_FAILED;
goto done;
}

- update_indicator(dev, IND_SERVICE, cmd->state);
- update_indicator(dev, IND_ROAM, cmd->type);
- update_indicator(dev, IND_SIGNAL, cmd->signal);
- update_indicator(dev, IND_BATTCHG, cmd->battery);
+ /* Cast cmd to void as queue api needs that */
+ queue_foreach(devices, device_status_notif, (void *) cmd);

status = HAL_STATUS_SUCCESS;

--
1.8.4