xref: /btstack/test/hfp/mock.c (revision 1238101111f87a8a0c8f0c7fd8086d0662e420ce)
1*12381011SMilanka Ringwald #include <stdint.h>
2*12381011SMilanka Ringwald #include <stdio.h>
3*12381011SMilanka Ringwald #include <stdlib.h>
4*12381011SMilanka Ringwald #include <string.h>
5*12381011SMilanka Ringwald 
6*12381011SMilanka Ringwald #include <btstack/btstack.h>
7*12381011SMilanka Ringwald // #include "att.h"
8*12381011SMilanka Ringwald #include "hci.h"
9*12381011SMilanka Ringwald #include "hci_dump.h"
10*12381011SMilanka Ringwald #include "sdp_query_rfcomm.h"
11*12381011SMilanka Ringwald #include "rfcomm.h"
12*12381011SMilanka Ringwald 
13*12381011SMilanka Ringwald static void *registered_sdp_app_context;
14*12381011SMilanka Ringwald static uint8_t sdp_rfcomm_channel_nr = 1;
15*12381011SMilanka Ringwald const char sdp_rfcomm_service_name[] = "BTstackMock";
16*12381011SMilanka Ringwald static rfcomm_channel_t rfcomm_channel;
17*12381011SMilanka Ringwald static uint16_t rfcomm_cid = 1;
18*12381011SMilanka Ringwald static uint8_t rfcomm_payload[200];
19*12381011SMilanka Ringwald static uint16_t rfcomm_payload_len;
20*12381011SMilanka Ringwald void * active_connection;
21*12381011SMilanka Ringwald 
22*12381011SMilanka Ringwald void (*registered_rfcomm_packet_handler)(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
23*12381011SMilanka Ringwald void (*registered_sdp_app_callback)(sdp_query_event_t * event, void * context);
24*12381011SMilanka Ringwald 
25*12381011SMilanka Ringwald uint8_t * get_rfcomm_payload(){
26*12381011SMilanka Ringwald 	return &rfcomm_payload[0];
27*12381011SMilanka Ringwald }
28*12381011SMilanka Ringwald 
29*12381011SMilanka Ringwald uint16_t get_rfcomm_payload_len(){
30*12381011SMilanka Ringwald 	return rfcomm_payload_len;
31*12381011SMilanka Ringwald }
32*12381011SMilanka Ringwald 
33*12381011SMilanka Ringwald void inject_rfcomm_command(uint8_t * data, int len){
34*12381011SMilanka Ringwald 	memset(&rfcomm_payload, 0, 200);
35*12381011SMilanka Ringwald 	rfcomm_payload_len = len;
36*12381011SMilanka Ringwald 	memcpy((char*)&rfcomm_payload[0], data, rfcomm_payload_len);
37*12381011SMilanka Ringwald 	(*registered_rfcomm_packet_handler)(active_connection, RFCOMM_DATA_PACKET, rfcomm_cid, (uint8_t *) &rfcomm_payload[0], rfcomm_payload_len);
38*12381011SMilanka Ringwald }
39*12381011SMilanka Ringwald 
40*12381011SMilanka Ringwald int  rfcomm_send_internal(uint16_t rfcomm_cid, uint8_t *data, uint16_t len){
41*12381011SMilanka Ringwald 	// printf("rfcomm_send_internal\n");
42*12381011SMilanka Ringwald 	memset(&rfcomm_payload, 0, 200);
43*12381011SMilanka Ringwald 	rfcomm_payload_len = len;
44*12381011SMilanka Ringwald 	memcpy((char*)&rfcomm_payload, data, rfcomm_payload_len);
45*12381011SMilanka Ringwald 
46*12381011SMilanka Ringwald 	return 0;
47*12381011SMilanka Ringwald }
48*12381011SMilanka Ringwald 
49*12381011SMilanka Ringwald int hci_send_cmd(const hci_cmd_t *cmd, ...){
50*12381011SMilanka Ringwald 	printf("hci_send_cmd opcode 0x%02x\n", cmd->opcode);
51*12381011SMilanka Ringwald 	return 0;
52*12381011SMilanka Ringwald }
53*12381011SMilanka Ringwald 
54*12381011SMilanka Ringwald 
55*12381011SMilanka Ringwald void sdp_query_rfcomm_register_callback(void(*sdp_app_callback)(sdp_query_event_t * event, void * context), void * context){
56*12381011SMilanka Ringwald 	registered_sdp_app_callback = sdp_app_callback;
57*12381011SMilanka Ringwald 	registered_sdp_app_context = context;
58*12381011SMilanka Ringwald }
59*12381011SMilanka Ringwald 
60*12381011SMilanka Ringwald static void sdp_query_complete_response(uint8_t status){
61*12381011SMilanka Ringwald     sdp_query_complete_event_t complete_event = {
62*12381011SMilanka Ringwald         SDP_QUERY_COMPLETE,
63*12381011SMilanka Ringwald         status
64*12381011SMilanka Ringwald     };
65*12381011SMilanka Ringwald     (*registered_sdp_app_callback)((sdp_query_event_t*)&complete_event, registered_sdp_app_context);
66*12381011SMilanka Ringwald }
67*12381011SMilanka Ringwald 
68*12381011SMilanka Ringwald static void sdp_query_rfcomm_service_response(uint8_t status){
69*12381011SMilanka Ringwald     sdp_query_rfcomm_service_event_t service_event = {
70*12381011SMilanka Ringwald         SDP_QUERY_RFCOMM_SERVICE,
71*12381011SMilanka Ringwald         sdp_rfcomm_channel_nr,
72*12381011SMilanka Ringwald         (uint8_t *)sdp_rfcomm_service_name
73*12381011SMilanka Ringwald     };
74*12381011SMilanka Ringwald     (*registered_sdp_app_callback)((sdp_query_event_t*)&service_event, registered_sdp_app_context);
75*12381011SMilanka Ringwald }
76*12381011SMilanka Ringwald 
77*12381011SMilanka Ringwald void sdp_query_rfcomm_channel_and_name_for_uuid(bd_addr_t remote, uint16_t uuid){
78*12381011SMilanka Ringwald 	// printf("sdp_query_rfcomm_channel_and_name_for_uuid %p\n", registered_sdp_app_callback);
79*12381011SMilanka Ringwald 	sdp_query_rfcomm_service_response(0);
80*12381011SMilanka Ringwald 	sdp_query_complete_response(0);
81*12381011SMilanka Ringwald }
82*12381011SMilanka Ringwald 
83*12381011SMilanka Ringwald void rfcomm_create_channel_internal(void * connection, bd_addr_t addr, uint8_t channel){
84*12381011SMilanka Ringwald 	// RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE
85*12381011SMilanka Ringwald 	// printf("rfcomm_create_channel_internal\n");
86*12381011SMilanka Ringwald 	active_connection = connection;
87*12381011SMilanka Ringwald     uint8_t event[16];
88*12381011SMilanka Ringwald     uint8_t pos = 0;
89*12381011SMilanka Ringwald     event[pos++] = RFCOMM_EVENT_OPEN_CHANNEL_COMPLETE;
90*12381011SMilanka Ringwald     event[pos++] = sizeof(event) - 2;
91*12381011SMilanka Ringwald     event[pos++] = 0;
92*12381011SMilanka Ringwald 
93*12381011SMilanka Ringwald     bt_flip_addr(&event[pos], addr); pos += 6;
94*12381011SMilanka Ringwald     bt_store_16(event,  pos, 1);   pos += 2;
95*12381011SMilanka Ringwald 	event[pos++] = 0;
96*12381011SMilanka Ringwald 
97*12381011SMilanka Ringwald 	bt_store_16(event, pos, rfcomm_cid); pos += 2;       // channel ID
98*12381011SMilanka Ringwald 	bt_store_16(event, pos, 200); pos += 2;   // max frame size
99*12381011SMilanka Ringwald     (*registered_rfcomm_packet_handler)(connection, HCI_EVENT_PACKET, 0, (uint8_t *) event, pos);
100*12381011SMilanka Ringwald }
101*12381011SMilanka Ringwald 
102*12381011SMilanka Ringwald 
103*12381011SMilanka Ringwald 
104*12381011SMilanka Ringwald void rfcomm_disconnect_internal(uint16_t rfcomm_cid){
105*12381011SMilanka Ringwald 	printf("rfcomm_disconnect_internal\n");
106*12381011SMilanka Ringwald }
107*12381011SMilanka Ringwald 
108*12381011SMilanka Ringwald void rfcomm_register_packet_handler(void (*handler)(void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)){
109*12381011SMilanka Ringwald 	registered_rfcomm_packet_handler = handler;
110*12381011SMilanka Ringwald }
111*12381011SMilanka Ringwald 
112*12381011SMilanka Ringwald void rfcomm_register_service_internal(void * connection, uint8_t channel, uint16_t max_frame_size){
113*12381011SMilanka Ringwald 	printf("rfcomm_register_service_internal\n");
114*12381011SMilanka Ringwald }
115*12381011SMilanka Ringwald 
116*12381011SMilanka Ringwald 
117*12381011SMilanka Ringwald void sdp_query_rfcomm_channel_and_name_for_search_pattern(bd_addr_t remote, uint8_t * des_serviceSearchPattern){
118*12381011SMilanka Ringwald 	printf("sdp_query_rfcomm_channel_and_name_for_search_pattern\n");
119*12381011SMilanka Ringwald }
120*12381011SMilanka Ringwald 
121*12381011SMilanka Ringwald 
122*12381011SMilanka Ringwald void rfcomm_accept_connection_internal(uint16_t rfcomm_cid){
123*12381011SMilanka Ringwald 	printf("rfcomm_accept_connection_internal \n");
124*12381011SMilanka Ringwald }
125*12381011SMilanka Ringwald 
126