hc
2023-11-22 f743a7adbd6e230d66a6206fa115b59fec2d88eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#ifndef __BT_MANAGER_1S2_H__
#define __BT_MANAGER_1S2_H__
 
#include <stdbool.h>
#include <stdlib.h>
#include <stdint.h>
 
#if __cplusplus
extern "C" {
#endif
 
#define BTMGVERSION "Version:2.0.3.I161ca661"
 
#define BT_LAST_CONNECT_FILE "/data/lib/bluetooth/last_connected"
 
#ifndef  CONFIG_FILE_PATH
#define CONFIG_FILE_PATH "/etc/bluetooth/aw_bluetooth"
#endif
 
/*log devel in control of bt_manager*/
typedef enum btmg_log_level_t {
   BTMG_LOG_LEVEL_NONE = 0,
   BTMG_LOG_LEVEL_ERROR,
   BTMG_LOG_LEVEL_WARNG,
   BTMG_LOG_LEVEL_INFO,
   BTMG_LOG_LEVEL_DEBUG,
} btmg_log_level_t;
 
/*BT state*/
typedef enum {
   BTMG_STATE_OFF,
   BTMG_STATE_ON,
   BTMG_STATE_TURNING_ON,
   BTMG_STATE_TURNING_OFF,
} btmg_state_t;
 
/*BT discovery state*/
typedef enum {
   BTMG_DISC_STARTED,
   BTMG_DISC_STOPPED_AUTO,
   BTMG_DISC_START_FAILED,
   BTMG_DISC_STOPPED_BY_USER,
} btmg_discovery_state_t;
 
/*BT discovery mode*/
typedef enum {
   BTMG_SCAN_MODE_NONE,
   BTMG_SCAN_MODE_CONNECTABLE,
   BTMG_SCAN_MODE_CONNECTABLE_DISCOVERABLE,
} btmg_discovery_mode_t;
 
/*BT bond state*/
typedef enum {
   BTMG_BOND_STATE_NONE,
   BTMG_BOND_STATE_BONDING,
   BTMG_BOND_STATE_BONDED,
} btmg_bond_state_t;
 
/*AVRCP commands*/
typedef enum {
   BTMG_AVRCP_PLAY,
   BTMG_AVRCP_PAUSE,
   BTMG_AVRCP_STOP,
   BTMG_AVRCP_FORWARD,
   BTMG_AVRCP_BACKWARD,
} btmg_avrcp_command_t;
 
/*A2DP_SINK connection state for callback*/
typedef enum {
   BTMG_A2DP_SINK_DISCONNECTED,
   BTMG_A2DP_SINK_CONNECTING,
   BTMG_A2DP_SINK_CONNECTED,
   BTMG_A2DP_SINK_DISCONNECTING,
} btmg_a2dp_sink_connection_state_t;
 
/*A2DP_SINK audio state for callback*/
typedef enum {
   BTMG_A2DP_SINK_AUDIO_SUSPENDED,
   BTMG_A2DP_SINK_AUDIO_STOPPED,
   BTMG_A2DP_SINK_AUDIO_STARTED,
} btmg_a2dp_sink_audio_state_t;
 
/*AVRCP play state for callback*/
/*The A2DP_SINK audio state may not be updated in time due to the BT stack implementation
* of different smartphone, while the AVRCP play state is always updated in time. So it is
*recommended to take the reported ARVCP state to judge the playing status of BT music*/
typedef enum {
   BTMG_AVRCP_PLAYSTATE_STOPPED,
   BTMG_AVRCP_PLAYSTATE_PLAYING,
   BTMG_AVRCP_PLAYSTATE_PAUSED,
   BTMG_AVRCP_PLAYSTATE_ERROR,
} btmg_avrcp_play_state_t;
 
typedef struct btmg_track_info_t {
   char title[256];
   char artist[256];
   char album[256];
   char track_num[64];
   char num_tracks[64];
   char genre[256];
   char playing_time[256];
} btmg_track_info_t;
 
struct paired_dev {
   char *remote_address;
   char *remote_name;
   bool is_connected;
   struct paired_dev *next;
};
typedef struct paired_dev bt_paried_device;
 
#define MAX_BT_NAME_LEN 248
#define MAX_BT_ADDR_LEN 17
 
/*callback functions for GAP profile*/
typedef void (*bt_gap_status_cb)(btmg_state_t status);
typedef void (*bt_gap_bond_state_cb)(btmg_bond_state_t state,const char *bd_addr,const char *name);
typedef void (*bt_gap_discovery_status_cb)(btmg_discovery_state_t status);
typedef void (*bt_gap_dev_found_cb)(const char *address,const char *name, unsigned int bt_class, int rssi);
/*gap callback*/
typedef struct btmg_gap_callback_t {
   bt_gap_status_cb gap_status_cb; /*used for return results of bt_manager_enable and status of BT*/
   bt_gap_bond_state_cb gap_bond_state_cb; /*used for bond state event*/
   bt_gap_discovery_status_cb gap_disc_status_cb; /*used for return discovery status of BT*/
   bt_gap_dev_found_cb gap_dev_found_cb; /*used for device found event*/
} btmg_gap_callback_t;
 
/*callback functions for a2dp_sink profile*/
typedef void (*bt_a2dp_sink_connection_state_cb)(const char *bd_addr, btmg_a2dp_sink_connection_state_t state);
typedef void (*bt_a2dp_sink_audio_state_cb)(const char *bd_addr, btmg_a2dp_sink_audio_state_t state);
typedef void (*bt_a2dp_sink_audio_underrun_cb)(void);
 
/*a2dp_sink callback*/
typedef struct btmg_a2dp_sink_callback_t {
   bt_a2dp_sink_connection_state_cb a2dp_sink_connection_state_cb;/*used to report the a2dp_sink connection state*/
   bt_a2dp_sink_audio_state_cb a2dp_sink_audio_state_cb;/*used to report the a2dp_sink audio state, not recommended as mentioned before*/
   bt_a2dp_sink_audio_underrun_cb a2dp_sink_audio_underrun_cb;/*underrun callabck*/
} btmg_a2dp_sink_callback_t;
 
/*callback functions for avrcp profile*/
typedef void (*bt_avrcp_play_state_cb)(const char *bd_addr, btmg_avrcp_play_state_t state); /*used to report play state of avrcp, recommended*/
typedef void (*bt_avrcp_track_changed_cb)(const char *bd_addr, btmg_track_info_t track_info); /*used to report track information*/
typedef void (*bt_avrcp_play_position_cb)(const char *bd_addr, int song_len, int song_pos);/*used to report the progress of playing music*/
 
/*avrcp callback*/
typedef struct btmg_avrcp_callback_t {
   bt_avrcp_play_state_cb avrcp_play_state_cb;
   bt_avrcp_track_changed_cb avrcp_track_changed_cb;
   bt_avrcp_play_position_cb avrcp_play_position_cb;
} btmg_avrcp_callback_t;
 
/*bt_manager callback struct to be registered when calling bt_manager_init to report various event*/
typedef struct btmg_callback_t {
   btmg_gap_callback_t btmg_gap_cb;
   btmg_a2dp_sink_callback_t btmg_a2dp_sink_cb;
   btmg_avrcp_callback_t btmg_avrcp_cb;
}btmg_callback_t;
 
/*bt_manager APIs*/
/* set the bt_manager printing level*/
int bt_manager_set_loglevel(btmg_log_level_t log_level);
/* get the bt_manager printing level*/
btmg_log_level_t bt_manager_get_loglevel(void);
int bt_manager_debug_open_file(const char *path);
void bt_manager_debug_close_file(void);
void bt_manager_debug_open_syslog(void);
void bt_manager_debug_close_syslog(void);
 
/*preinit function, to allocate room for callback struct, which will be free by bt_manager_deinit*/
int bt_manager_preinit(btmg_callback_t **btmg_cb);
/*init function, the callback functions will be registered*/
int bt_manager_init(btmg_callback_t *btmg_cb);
/*deinit function, must be called before exit*/
int bt_manager_deinit(btmg_callback_t *btmg_cb);
 
/*GAP APIs*/
/*set BT discovery mode*/
int bt_manager_set_discovery_mode(btmg_discovery_mode_t mode);
/*enable BT*/
 
int bt_manager_enable(bool enable);
/*return BT state, is enabled or not*/
bool bt_manager_is_enabled(void);
/*start discovery, will return immediately*/
int bt_manager_start_discovery(unsigned int mseconds);
/*cancel discovery, will return immediately*/
int bt_manager_cancel_discovery(void);
/*judge the discovery is in process or not*/
bool bt_manager_is_discovering();
/*pair*/
int bt_manager_pair(char *addr);
/*unpair*/
int bt_manager_unpair(char *addr);
/*get bt state*/
btmg_state_t bt_manager_get_state();
/*get BT name*/
int bt_manager_get_name(char *name, int size);
/*set BT name*/
int bt_manager_set_name(const char *name);
/*get local device address*/
int bt_manager_get_address(char *addr, int size);
/*a2dp sink APIs*/
/*request a2dp_sink connection*/
int bt_manager_a2dp_sink_connect(char *addr);
/*request a2dp_sink disconnection*/
int bt_manager_a2dp_sink_disconnect(char *addr);
/*used to send avrcp command, refer to the struct btmg_avrcp_command_t for the supported commands*/
 
int bt_manager_disconnect(char *addr);
 
int bt_manager_avrcp_command(char *addr, btmg_avrcp_command_t command);
 
/* Get the paired device,need to call <bt_manager_free_paired_devices>    to free data*/
int bt_manager_get_paired_devices(bt_paried_device **dev_list,int *count);
 
/* free paird device data resource*/
int bt_manager_free_paired_devices(bt_paried_device *dev_list);
 
/*send GetPlayStatus cmd*/
int bt_manager_send_get_play_status(void);
 
/*if support avrcp EVENT_PLAYBACK_POS_CHANGED,*/
bool bt_manager_is_support_pos_changed();
 
int bt_manager_switch_throughput(bool sw_to_wlan);
#if __cplusplus
};    // extern "C"
#endif
 
#endif