summaryrefslogtreecommitdiffstats
path: root/meta-audio-4a-framework
diff options
context:
space:
mode:
Diffstat (limited to 'meta-audio-4a-framework')
-rw-r--r--meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/agl-service-audio-4a_git.bb14
-rwxr-xr-xmeta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/files/4a_wait_bt.sh83
2 files changed, 97 insertions, 0 deletions
diff --git a/meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/agl-service-audio-4a_git.bb b/meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/agl-service-audio-4a_git.bb
index 63d2bdb5..78cb2e7f 100644
--- a/meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/agl-service-audio-4a_git.bb
+++ b/meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/agl-service-audio-4a_git.bb
@@ -37,8 +37,22 @@ sed -i -e 's|/usr/bin/afb-daemon\>|& --ldpath=/usr/libexec/agl/4a-alsa-core/lib:
# binder name matters: it must match "afbd-4a-*" => the config file (controller json file) that will be searched will be "policy-4a-*.json"
sed -i -e 's|--name afbd-agl-\(.*\)|--name afbd-4a-\1|' $svcfile
+# workaround for SPEC-1762
+sed -i -e 's|/usr/bin/afb-daemon\>|/usr/bin/4a_wait_bt.sh &|' $svcfile
+
echo "-- TMP 4A INSTALL FIX END"
EOF
chmod a+x ${D}/${sysconfdir}/agl-postinsts/99_4A_service_patch.sh
}
+
+##############################################
+# workaround for SPEC-1762/SPEC-1763
+RDEPENDS_${PN} += "bash"
+SRC_URI += "file://4a_wait_bt.sh"
+do_install_append() {
+ install -d ${D}${bindir}
+ install -m 0755 ${WORKDIR}/4a_wait_bt.sh ${D}${bindir}/
+}
+#
+##############################################
diff --git a/meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/files/4a_wait_bt.sh b/meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/files/4a_wait_bt.sh
new file mode 100755
index 00000000..a1df1ea0
--- /dev/null
+++ b/meta-audio-4a-framework/recipes-multimedia/agl-service-audio-4a/files/4a_wait_bt.sh
@@ -0,0 +1,83 @@
+#!/bin/bash
+
+###############################################################
+# This is a workaround for SPEC-1762/SPEC-1763
+#
+# THIS SCRIPT MUST BE REMOVED ONCE THE ABOVE ISSUES ARE SOLVED
+#
+# Source recipe is:
+#
+# meta-audio-4a-framework/
+# recipes-multimedia/
+# agl-service-audio-4a/
+# agl-service-audio-4a_git.bb
+#
+# Signed-off-by: Stephane Desneux <stephane.desneux@iot.bzh>
+###############################################################
+
+# time from script startup
+LIMIT=20
+ts0=0
+function ts() { echo $(( $(date +%s) - ts0 )); }
+ts0=$(ts)
+function havetime() { [[ $(ts) -le ${1:-$LIMIT} ]] || return 1; }
+
+function waitloop() {
+ # ensure bt modules are loaded (delay: 5s)
+ while havetime 4; do
+ [[ -d /sys/module/bluetooth ]] && {
+ echo "bluetooth kernel module detected"
+ break
+ }
+ echo "waiting for bluetooth kernel module to be up"
+ sleep 0.2
+ done
+ havetime 4 || { echo "TIMEOUT REACHED"; return 1; }
+
+ # check that we have at least one controller
+ HCIDEV=
+ while havetime 8; do
+ echo "detecting hci devices..."
+ for x in $(ls /sys/class/bluetooth/hci* 2>/dev/null); do
+ [[ -z "$HCIDEV" ]] && HCIDEV=$(basename $x)
+ done
+ [[ -n "$HCIDEV" ]] && {
+ echo "found HCI controller: $HCIDEV"
+ break
+ }
+ sleep 0.2
+ done
+ havetime 8 || { echo "TIMEOUT REACHED"; return 1; }
+
+ # wait for controller to be up and running
+ while havetime 15; do
+ state=$(hciconfig $HCIDEV | grep -A 2 ^hci0 | tail -1)
+ [[ $state =~ UP ]] && [[ $state =~ RUNNING ]] && {
+ echo "HCI controller $HCIDEV state: $state"
+ break
+ }
+ echo "HCI controller $HCIDEV state: $state ... waiting for UP RUNNING"
+ sleep 0.2
+ done
+ havetime 15 || { echo "TIMEOUT REACHED"; return 1; }
+ echo "HCI device up and running after $(ts) seconds"
+
+ # wait for bluetooth-service to return something
+ while havetime; do
+ res=$(afb-client-demo -d unix:/run/user/$UID/apis/ws/Bluetooth-Manager power true)
+ [[ "$res" =~ \"response\":(.*)}$ ]] && res=${BASH_REMATCH[1]}
+ [[ "$res" == '{"power":"on"}' ]] && {
+ echo "Bluetooth-Manager/power: $res"
+ break
+ }
+ echo "Bluetooth-Manager/power: not ready yet ($res)"
+ sleep 0.2
+ done
+ echo "Bluetooth-Manager ready after $(ts) seconds"
+
+ echo "4A now starting..."
+}
+
+waitloop 2>&1 | sed 's/^/4AWAITBT /' >&2
+exec "$@"
+
o */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
/*
 * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef WINDOWMANAGER_CLIENT_HPP
#define WINDOWMANAGER_CLIENT_HPP

#include <vector>
#include <string>
#include <unordered_map>
#include "util.hpp"
#include "wm_error.hpp"

extern "C"
{
#include <afb/afb-binding.h>
}

namespace wm
{

class WMClient
{
  public:
    WMClient();
    WMClient(const std::string &appid, unsigned layer,
            unsigned surface, const std::string &role);
    WMClient(const std::string &appid, const std::string &role);
    WMClient(const std::string &appid, unsigned layer, const std::string &role);
    WMClient(const std::string &appid, unsigned layer,
        const std::string& layer_name, unsigned surface, const std::string &role);
    ~WMClient() = default;

    std::string appID() const;
    std::string role() const;
    unsigned layerID() const;
    unsigned surfaceID() const;
    void registerSurface(unsigned surface);
    void activate();
    void deactivate();
    std::string area() const {return this->app_area;};
    void setArea(const std::string area) {this->app_area = area;}
    WMError addSurface(unsigned surface);
    bool isSourceSizeSet();
    void setSurfaceSizeCorrectly();
    bool isActive() { return this->is_active;}
    bool removeSurfaceIfExist(unsigned surface);

    bool subscribe(afb_req_t req, const std::string &event_name);
    void emitActive(bool active);
    void emitVisible(bool visible);
    void emitSyncDraw(const std::string& area, struct rect& r);
    void emitFlushDraw();
    void emitError(WMError error);

    void dumpInfo();

  private:
    std::string id;
    unsigned layer;
    bool is_source_set;
    bool is_active;
    std::string main_role;
    std::string app_area;
    unsigned surface; // currently, main application has only one surface.
    //std::vector<std::string> role_list;
    std::unordered_map<std::string, unsigned> role2surface;
#if GTEST_ENABLED
    // This is for unit test. afb_make_event occurs sig11 if call not in afb-binding
    std::unordered_map<std::string, std::string> evname2afb_event;
#else
    std::unordered_map<std::string, afb_event_t> evname2afb_event;
#endif
};
} // namespace wm

#endif