15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Filename:      bluedroidtest.c
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Description:   Bluedroid Test application
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***********************************************************************************/
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <dlfcn.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h>
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <ctype.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/prctl.h>
37034f08687a46f26c72a0cac8a14314ce446d17e3Nick Kralevich#include <sys/capability.h>
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <arpa/inet.h>
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <netinet/in.h>
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <netdb.h>
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <private/android_filesystem_config.h>
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <android/log.h>
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/hardware.h>
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h>
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants & Macros
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define PID_FILE "/data/.bdt_pid"
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef MAX
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAX(x, y) ((x) > (y) ? (x) : (y))
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define CASE_RETURN_STR(const) case const: return #const;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local type definitions
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static variables
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic unsigned char main_done = 0;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t status;
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Main API */
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bluetooth_device_t* bt_device;
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst bt_interface_t* sBtInterface = NULL;
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic gid_t groups[] = { AID_NET_BT, AID_INET, AID_NET_BT_ADMIN,
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          AID_SYSTEM, AID_MISC, AID_SDCARD_RW,
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          AID_NET_ADMIN, AID_VPN};
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Set to 1 when the Bluedroid stack is enabled */
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic unsigned char bt_enabled = 0;
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static functions
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void process_cmd(char *p, unsigned char is_job);
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void job_handler(void *param);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bdt_log(const char *fmt_str, ...);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Externs
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Functions
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************************
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Shutdown helper functions
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project************************************************************************************/
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bdt_shutdown(void)
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("shutdown bdroid test app\n");
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    main_done = 1;
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Android's init.rc does not yet support applying linux capabilities
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void config_permissions(void)
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct __user_cap_header_struct header;
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct __user_cap_data_struct cap;
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("set_aid_and_cap : pid %d, uid %d gid %d", getpid(), getuid(), getgid());
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    header.pid = 0;
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    setuid(AID_BLUETOOTH);
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    setgid(AID_BLUETOOTH);
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    header.version = _LINUX_CAPABILITY_VERSION;
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cap.effective = cap.permitted =  cap.inheritable =
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    1 << CAP_NET_RAW |
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    1 << CAP_NET_ADMIN |
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    1 << CAP_NET_BIND_SERVICE |
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    1 << CAP_SYS_RAWIO |
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    1 << CAP_SYS_NICE |
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    1 << CAP_SETGID;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    capset(&header, &cap);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    setgroups(sizeof(groups)/sizeof(groups[0]), groups);
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**   Logger API
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_log(const char *fmt_str, ...)
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static char buffer[1024];
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    va_list ap;
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    va_start(ap, fmt_str);
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    vsnprintf(buffer, 1024, fmt_str, ap);
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    va_end(ap);
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    fprintf(stdout, "%s\n", buffer);
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Misc helper functions
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* dump_bt_status(bt_status_t status)
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(status)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BT_STATUS_SUCCESS)
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BT_STATUS_FAIL)
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BT_STATUS_NOT_READY)
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BT_STATUS_NOMEM)
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BT_STATUS_BUSY)
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BT_STATUS_UNSUPPORTED)
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "unknown status code";
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void hex_dump(char *msg, void *data, int size, int trunc)
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    unsigned char *p = data;
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    unsigned char c;
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int n;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char bytestr[4] = {0};
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char addrstr[10] = {0};
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char hexstr[ 16*3 + 5] = {0};
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char charstr[16*1 + 5] = {0};
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("%s  \n", msg);
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* truncate */
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(trunc && (size>32))
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        size = 32;
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(n=1;n<=size;n++) {
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (n%16 == 1) {
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store address for this line */
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            snprintf(addrstr, sizeof(addrstr), "%.4x",
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               ((unsigned int)p-(unsigned int)data) );
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        c = *p;
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (isalnum(c) == 0) {
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            c = '.';
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* store hex str (for left side) */
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        snprintf(bytestr, sizeof(bytestr), "%02X ", *p);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        strncat(hexstr, bytestr, sizeof(hexstr)-strlen(hexstr)-1);
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* store char str (for right side) */
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        snprintf(bytestr, sizeof(bytestr), "%c", c);
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        strncat(charstr, bytestr, sizeof(charstr)-strlen(charstr)-1);
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(n%16 == 0) {
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* line completed */
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bdt_log("[%4.4s]   %-50.50s  %s\n", addrstr, hexstr, charstr);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            hexstr[0] = 0;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            charstr[0] = 0;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        } else if(n%8 == 0) {
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* half line: add whitespaces */
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            strncat(hexstr, "  ", sizeof(hexstr)-strlen(hexstr)-1);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            strncat(charstr, " ", sizeof(charstr)-strlen(charstr)-1);
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p++; /* next byte */
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (strlen(hexstr) > 0) {
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* print rest of buffer if not empty */
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("[%4.4s]   %-50.50s  %s\n", addrstr, hexstr, charstr);
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Console helper functions
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid skip_blanks(char **p)
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  while (**p == ' ')
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*p)++;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectuint32_t get_int(char **p, int DefaultValue)
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  uint32_t Value = 0;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  unsigned char   UseDefault;
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  UseDefault = 1;
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  skip_blanks(p);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  while ( ((**p)<= '9' && (**p)>= '0') )
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      Value = Value * 10 + (**p) - '0';
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      UseDefault = 0;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      (*p)++;
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  if (UseDefault)
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return DefaultValue;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  else
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return Value;
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint get_signed_int(char **p, int DefaultValue)
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  int    Value = 0;
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  unsigned char   UseDefault;
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  unsigned char  NegativeNum = 0;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  UseDefault = 1;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  skip_blanks(p);
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  if ( (**p) == '-')
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      NegativeNum = 1;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      (*p)++;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  while ( ((**p)<= '9' && (**p)>= '0') )
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      Value = Value * 10 + (**p) - '0';
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      UseDefault = 0;
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      (*p)++;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  if (UseDefault)
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return DefaultValue;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  else
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ((NegativeNum == 0)? Value : -Value);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid get_str(char **p, char *Buffer)
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  skip_blanks(p);
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  while (**p != 0 && **p != ' ')
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      *Buffer = **p;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      (*p)++;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      Buffer++;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  *Buffer = 0;
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectuint32_t get_hex(char **p, int DefaultValue)
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  uint32_t Value = 0;
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  unsigned char   UseDefault;
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  UseDefault = 1;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  skip_blanks(p);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  while ( ((**p)<= '9' && (**p)>= '0') ||
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          ((**p)<= 'f' && (**p)>= 'a') ||
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          ((**p)<= 'F' && (**p)>= 'A') )
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      if (**p >= 'a')
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Value = Value * 16 + (**p) - 'a' + 10;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      else if (**p >= 'A')
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Value = Value * 16 + (**p) - 'A' + 10;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      else
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Value = Value * 16 + (**p) - '0';
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      UseDefault = 0;
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      (*p)++;
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  if (UseDefault)
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return DefaultValue;
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project  else
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return Value;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid get_bdaddr(const char *str, bt_bdaddr_t *bd) {
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *d = ((char *)bd), *endp;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i = 0; i < 6; i++) {
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *d++ = strtol(str, &endp, 16);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*endp != ':' && i != 5) {
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(bd, 0, sizeof(bt_bdaddr_t));
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        str = endp + 1;
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define is_cmd(str) ((strlen(str) == strlen(cmd)) && strncmp((const char *)&cmd, str, strlen(str)) == 0)
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define if_cmd(str)  if (is_cmd(str))
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef void (t_console_cmd_handler) (char *p);
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct {
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *name;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    t_console_cmd_handler *handler;
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *help;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    unsigned char is_job;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} t_cmd;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst t_cmd console_cmd_list[];
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int console_cmd_maxlen = 0;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void cmdjob_handler(void *param)
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *job_cmd = (char*)param;
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("cmdjob starting (%s)", job_cmd);
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    process_cmd(job_cmd, 1);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("cmdjob terminating");
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    free(job_cmd);
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int create_cmdjob(char *cmd)
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pthread_t thread_id;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *job_cmd;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    job_cmd = malloc(strlen(cmd)+1); /* freed in job handler */
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    strcpy(job_cmd, cmd);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pthread_create(&thread_id, NULL,
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       (void*)cmdjob_handler, (void*)job_cmd)!=0)
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      perror("pthread_create");
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Load stack lib
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint HAL_load(void)
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int err = 0;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hw_module_t* module;
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    hw_device_t* device;
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("Loading HAL lib + extensions");
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    err = hw_get_module(BT_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (err == 0)
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err = module->methods->open(module, BT_HARDWARE_MODULE_ID, &device);
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (err == 0) {
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bt_device = (bluetooth_device_t *)device;
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sBtInterface = bt_device->get_bluetooth_interface();
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("HAL library loaded (%s)", strerror(err));
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint HAL_unload(void)
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int err = 0;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("Unloading HAL lib");
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sBtInterface = NULL;
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("HAL library unloaded (%s)", strerror(err));
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return err;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** HAL test functions & callbacks
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid setup_test_env(void)
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i = 0;
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (console_cmd_list[i].name != NULL)
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        console_cmd_maxlen = MAX(console_cmd_maxlen, (int)strlen(console_cmd_list[i].name));
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i++;
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid check_return_status(bt_status_t status)
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BT_STATUS_SUCCESS)
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("HAL REQUEST FAILED status : %d (%s)", status, dump_bt_status(status));
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("HAL REQUEST SUCCESS");
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void adapter_state_changed(bt_state_t state)
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("ADAPTER STATE UPDATED : %s", (state == BT_STATE_OFF)?"OFF":"ON");
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (state == BT_STATE_ON) {
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bt_enabled = 1;
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } else {
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bt_enabled = 0;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void dut_mode_recv(uint16_t opcode, uint8_t *buf, uint8_t len)
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("DUT MODE RECV : NOT IMPLEMENTED");
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void le_test_mode(bt_status_t status, uint16_t packet_count)
478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bdt_log("LE TEST MODE END status:%s number_of_packets:%d", dump_bt_status(status), packet_count);
480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_callbacks_t bt_callbacks = {
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sizeof(bt_callbacks_t),
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    adapter_state_changed,
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /*adapter_properties_cb */
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /* remote_device_properties_cb */
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /* device_found_cb */
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /* discovery_state_changed_cb */
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /* pin_request_cb  */
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /* ssp_request_cb  */
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /*bond_state_changed_cb */
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /* acl_state_changed_cb */
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    NULL, /* thread_evt_cb */
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dut_mode_recv, /*dut_mode_recv_cb */
495fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie//    NULL, /*authorize_request_cb */
496fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#if BLE_INCLUDED == TRUE
497ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    le_test_mode /* le_test_mode_cb */
498fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#else
499fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie    NULL
500fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#endif
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_init(void)
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("INIT BT ");
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = sBtInterface->init(&bt_callbacks);
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    check_return_status(status);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_enable(void)
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("ENABLE BT");
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bt_enabled) {
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("Bluetooth is already enabled");
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = sBtInterface->enable();
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    check_return_status(status);
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_disable(void)
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("DISABLE BT");
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bt_enabled) {
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("Bluetooth is already disabled");
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = sBtInterface->disable();
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    check_return_status(status);
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_dut_mode_configure(char *p)
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int32_t mode = -1;
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("BT DUT MODE CONFIGURE");
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!bt_enabled) {
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("Bluetooth must be enabled for test_mode to work.");
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    mode = get_signed_int(&p, mode);
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((mode != 0) && (mode != 1)) {
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("Please specify mode: 1 to enter, 0 to exit");
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = sBtInterface->dut_mode_configure(mode);
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    check_return_status(status);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_RECEIVER_TEST_OPCODE 0x201D
553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_TRANSMITTER_TEST_OPCODE 0x201E
554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define HCI_LE_END_TEST_OPCODE 0x201F
555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bdt_le_test_mode(char *p)
557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    int cmd;
559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    unsigned char buf[3];
560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    int arg1, arg2, arg3;
561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bdt_log("BT LE TEST MODE");
563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (!bt_enabled) {
564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bdt_log("Bluetooth must be enabled for le_test to work.");
565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memset(buf, 0, sizeof(buf));
569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    cmd = get_int(&p, 0);
570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    switch (cmd)
571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        case 0x1: /* RX TEST */
573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta           arg1 = get_int(&p, -1);
574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta           if (arg1 < 0) bdt_log("%s Invalid arguments", __FUNCTION__);
575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta           buf[0] = arg1;
576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta           status = sBtInterface->le_test_mode(HCI_LE_RECEIVER_TEST_OPCODE, buf, 1);
577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta           break;
578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        case 0x2: /* TX TEST */
579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            arg1 = get_int(&p, -1);
580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            arg2 = get_int(&p, -1);
581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            arg3 = get_int(&p, -1);
582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if ((arg1 < 0) || (arg2 < 0) || (arg3 < 0))
583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                bdt_log("%s Invalid arguments", __FUNCTION__);
584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            buf[0] = arg1;
585ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            buf[1] = arg2;
586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            buf[2] = arg3;
587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            status = sBtInterface->le_test_mode(HCI_LE_TRANSMITTER_TEST_OPCODE, buf, 3);
588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta           break;
589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        case 0x3: /* END TEST */
590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            status = sBtInterface->le_test_mode(HCI_LE_END_TEST_OPCODE, buf, 0);
591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta           break;
592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        default:
593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            bdt_log("Unsupported command");
594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            return;
595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            break;
596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (status != BT_STATUS_SUCCESS)
598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        bdt_log("%s Test 0x%x Failed with status:0x%x", __FUNCTION__, cmd, status);
600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return;
602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bdt_cleanup(void)
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("CLEANUP");
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sBtInterface->cleanup();
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Console commands
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_help(char *p)
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i = 0;
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int max = 0;
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char line[128];
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int pos = 0;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (console_cmd_list[i].name != NULL)
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pos = sprintf(line, "%s", (char*)console_cmd_list[i].name);
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdt_log("%s %s\n", (char*)line, (char*)console_cmd_list[i].help);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i++;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_quit(char *p)
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_shutdown();
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  BT TEST  CONSOLE COMMANDS
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Parses argument lists and passes to API test function
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_init(char *p)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_init();
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_enable(char *p)
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_enable();
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_disable(char *p)
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_disable();
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_dut_mode_configure(char *p)
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_dut_mode_configure(p);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid do_le_test_mode(char *p)
662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
663ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    bdt_le_test_mode(p);
664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid do_cleanup(char *p)
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_cleanup();
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  CONSOLE COMMAND TABLE
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst t_cmd console_cmd_list[] =
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * INTERNAL
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     */
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "help", do_help, "lists all available console commands", 0 },
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "quit", do_quit, "", 0},
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * API CONSOLE COMMANDS
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     */
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     /* Init and Cleanup shall be called automatically */
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "enable", do_enable, ":: enables bluetooth", 0 },
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "disable", do_disable, ":: disables bluetooth", 0 },
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "dut_mode_configure", do_dut_mode_configure, ":: DUT mode - 1 to enter,0 to exit", 0 },
694ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    { "le_test_mode", do_le_test_mode, ":: LE Test Mode - RxTest - 1 <rx_freq>, \n\t \
695ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                      TxTest - 2 <tx_freq> <test_data_len> <payload_pattern>, \n\t \
696ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                      End Test - 3 <no_args>", 0 },
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* add here */
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* last entry */
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {NULL, NULL, "", 0},
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Main console command handler
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void process_cmd(char *p, unsigned char is_job)
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char cmd[64];
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i = 0;
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *p_saved = p;
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    get_str(&p, cmd);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* table commands */
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (console_cmd_list[i].name != NULL)
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_cmd(console_cmd_list[i].name))
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!is_job && console_cmd_list[i].is_job)
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                create_cmdjob(p_saved);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                console_cmd_list[i].handler(p);
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i++;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("%s : unknown command\n", p_saved);
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    do_help(NULL);
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint main (int argc, char * argv[])
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int opt;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char cmd[128];
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int args_processed = 0;
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int pid = -1;
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    config_permissions();
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log("\n:::::::::::::::::::::::::::::::::::::::::::::::::::");
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log(":: Bluedroid test app starting");
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( HAL_load() < 0 ) {
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        perror("HAL failed to initialize, exit\n");
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        unlink(PID_FILE);
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        exit(0);
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    setup_test_env();
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Automatically perform the init */
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_init();
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(!main_done)
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        char line[128];
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* command prompt */
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        printf( ">" );
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fflush(stdout);
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fgets (line, 128, stdin);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (line[0]!= '\0')
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* remove linefeed */
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            line[strlen(line)-1] = 0;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            process_cmd(line, 0);
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(line, '\0', 128);
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* FIXME: Commenting this out as for some reason, the application does not exit otherwise*/
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //bdt_cleanup();
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    HAL_unload();
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bdt_log(":: Bluedroid test app terminating");
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
785