示例#1
0
hci_controller_t hci_open_controller(bt_address_t *mac, char *name) {
	hci_controller_t res = {0};
	res.state = HCI_STATE_CLOSED;
	struct hci_dev_info info;
	hci_socket_t hci_socket = open_hci_socket(mac);
	char real_name[8] = "UNKNOWN";

	if (hci_socket.sock < 0) {
		return res;
	}
	list_push(&(res.sockets_list), &hci_socket, sizeof(hci_socket_t));

	if (hci_devinfo(hci_socket.dev_id, &info) >= 0) {
		strncpy(real_name, info.name, 8);
		if (!mac) {
			*mac = info.bdaddr;
		}
	}
	res.device = bt_device_create(*mac, PUBLIC_DEVICE_ADDRESS, real_name, name);
	res.state = HCI_STATE_OPEN;
	res.interrupted = 0;

	return res;
}
示例#2
0
int main(int arc, char**argv) {


	if (arc != 2) {
		print_trace(TRACE_ERROR, "Veuillez indiquer un fichier où stocker la matrice de calibration.\n");
		return EXIT_FAILURE;
	} 
	
	struct Matrix *matrice = create_matrix(NB_LIGNES,NB_COLONNES, NUM_CAPTORS);
	pthread_mutex_init(&mutexMatrice, NULL);

	for (uint8_t i = 0; i < NUM_CAPTORS; i++) {
		mesures[i] = calloc(200, sizeof(char));
	}

	bdaddr_t controllerAdd, server1Mac, server2Mac, server3Mac, sensorMac;
	str2ba(btControllerAdd, &controllerAdd); 
	str2ba(server1Add, &server1Mac); 
	str2ba(server2Add, &server2Mac); 
	str2ba(server3Add, &server3Mac); 
	str2ba(sensorAdd, &sensorMac);

	hci_controller_t hci_controller = hci_open_controller(&controllerAdd, "MAIN_SERVER");
	sensor = bt_device_create(sensorMac, PUBLIC_DEVICE_ADDRESS, NULL, "SENSOR_TAG");
	server1 = bt_device_create(server1Mac, PUBLIC_DEVICE_ADDRESS, NULL, "SERVER_1");
	server2 = bt_device_create(server2Mac, PUBLIC_DEVICE_ADDRESS, NULL, "SERVER_2");
	server3 = bt_device_create(server3Mac, PUBLIC_DEVICE_ADDRESS, NULL, "SERVER_3");

	hci_LE_clear_white_list(NULL, &hci_controller);
	hci_LE_add_white_list(NULL, &hci_controller, sensor);
	
	// Création des trois clients :
	l2cap_client_t clients[NUM_CAPTORS-1] = {0};
	l2cap_client_create(&clients[0], &server1Mac, 0x1001, 500, NULL, &(send_req_func));
	l2cap_client_create(&clients[1], &server2Mac, 0x1001, 500, NULL, &(send_req_func)); 
	l2cap_client_create(&clients[2], &server3Mac, 0x1001, 500, NULL, &(send_req_func));


	if (l2cap_client_connect(&clients[0]) != 0) {	
		perror("client_connect : unable to connect client 1");
		return EXIT_FAILURE;
	}
	if (l2cap_client_connect(&clients[1]) != 0) {	
		perror("client_connect : unable to connect client 2");
		return EXIT_FAILURE;
	}
	if (l2cap_client_connect(&clients[2]) != 0) {	
		perror("client_connect : unable to connect client 3");
		return EXIT_FAILURE;
	}

	fprintf(stderr, "\n-------------------\n");
	fprintf(stderr, "----Calibration----\n");
	fprintf(stderr, "-------------------\n");

	pthread_t clients_threads[NUM_CAPTORS];
	struct routine_data_t routine_data[NUM_CAPTORS];
	for (uint8_t k = 0; k < NUM_CAPTORS; k++) {
		routine_data[k].timeout = 4500;
		routine_data[k].num_captor = k;
		routine_data[k].hci_controller = &hci_controller;
		routine_data[k].sensor = sensor;
		if (k < NUM_CAPTORS-1) {
			routine_data[k].client = &(clients[k]);
		} else {
			routine_data[k].client = NULL;
		}
		routine_data[k].matrice = matrice;
	}
	char command[20] = {0};
	char *status;
	char retry = 0;
	for (uint8_t i = 0; i < NB_LIGNES; i++) {
		for (uint8_t j = 0; j < NB_COLONNES; j++) {
			scan:
			retry = 0;
			fprintf(stdout, "Position courante : %i, %i\n", i, j); 
			scanf("%s", command);
			for (uint8_t k = 0; k < NUM_CAPTORS; k++) {
				routine_data[k].num_row = i;
				routine_data[k].num_col = j;
				pthread_create(&(clients_threads[k]), NULL, 
					       &(get_rssi_thread_routine),
					       (void *)&routine_data[k]);
			}
			for (uint8_t k = 0; k < 4; k ++) {
				pthread_join(clients_threads[k], (void **)&status);
				retry = retry || *status;
			}
			if (retry) {
				print_trace(TRACE_WARNING, "Attention : impossible d'acquérir les mesures pour cette case, veuillez réessayer.\n");
				goto scan;
			}
		}
	}

	// Fermeture des clients :
	// Envoie des demandes de fin de connexion :
	l2cap_client_send(&clients[0], 3000, CLIENT_CLOSE_CONNECTION);
	l2cap_client_send(&clients[1], 3000, CLIENT_CLOSE_CONNECTION);
	l2cap_client_send(&clients[2], 3000, CLIENT_CLOSE_CONNECTION);

	// Destruction des clients :
	l2cap_client_close(&clients[0]);
	l2cap_client_close(&clients[1]);
	l2cap_client_close(&clients[2]);

	display_matrix(matrice);
	save_matrix(argv[1], *matrice);
	pthread_mutex_destroy(&mutexMatrice);

	hci_close_controller(&hci_controller);
	display_hci_socket_list(hci_controller.sockets_list);
	bt_destroy_device_table();

}